Python数据挖掘-使用sklearn包

Posted 我不要被你记住

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python数据挖掘-使用sklearn包相关的知识,希望对你有一定的参考价值。

使用sklearn包

CountVectorizer是通过fit_transform函数将文本中的词语转换为词频矩阵

  • get_feature_names()可看到所有文本的关键字
  • vocabulary_可看到所有文本关键字和其位置
  • toarray()可以看到词频矩阵的结果

TfidfTransformer是统计CountVectorizer中每个词语的tf-idf权值

 

TfidfVectorizer可以把CountVectorizer、TfidfTransformer合并起来,直接生成tfidf值

其关键参数:

  • max_df:这个给定特征可以应用在tf-idf矩阵中,泳衣描述单词在文档中的最高出现率,假设一个词(term)在80%的文档汇总都出现过了,那它也许(在句型简介的语境里)只携带非常少信息
  • min_df:可以是一个整数。意味着单词必须在5个以上的文档中出现才会被纳入考虑。设置为0.2,记单词至少在20%的文档中出现
  • ngram_range:这个参数将用来观察一元模型(unigrams),二元模型(bigrams)和三元模型(trigrams)

转载:https://blog.csdn.net/qq_30868235/article/details/80389180

 

1、首先给定一段内容

contents = [
    我 是 中国 人。,
    你 是 美国 人。,
    他 叫 什么 名字?,
    她 是 谁 啊?
]

2、CountVectorizer类的使用

首先调用CountVectorizer类,然后使用它的fit_transfomr方法对contents转换为一个词频矩阵,也可以说得到一个向量化矩阵;

然后使用对该向量化矩阵使用toarray()方法,获取这个矩阵;

最后通过vocabulary_来获取文本关键字及其位置

from sklearn.feature_extraction.text import CountVectorizer

countVectorizer=CountVectorizer()
textVector=countVectorizer.fit_transform(contents)  #得到一个文档向量化的矩阵

textVector.todense()   #获取这个矩阵
countVectorizer.vocabulary_   #获取每个列对应的属性

 

设置最小长度和正则表达式

由于通过上述两个步骤只能获取长度为2以上的文字,汉字中单子也具有意义,对CountVectorizer进行设置,因此使用min_df和token_pattren

1 countVectorizer=CountVectorizer(
2         min_df=0,
3         token_pattern=r"w+")
4 textVector=countVectorizer.fit_transform(contents)
5 
6 textVector.todense()
7 countVectorizer.vocabulary_

 

3、TF-IDF运算,调用TfidfTransformer

从sklearn.feature_extraction.text 调用TfidfTransformer类;

传入字符串数组,由于fit_transform 后并不是一个单纯一个矩阵,要提取出关键字,还需要将其变为矩阵形式

 1 #调用tf-idf包,运算tfidf
 2 
 3 from sklearn.feature_extraction.text import TfidfTransformer
 4 
 5 transformer=TfidfTransformer()
 6 tfidf=transformer.fit_transform(textVector)   #传入字符串数组
 7 
 8 import pandas
 9 TFIDFDataFrame=pandas.DataFrame(tfidf.toarray())
10 TFIDFDataFrame.columns=countVectorizer.get_feature_names()   #把列名设置为单词

 

4、提取关键字

使用numpy中的argsort(a,axis=1):将矩阵a按照axis排序,并返回排序后的下标;

axis=0,沿着行向下(每列)的元素进行排序,axis=1,沿着列向右(每行)的元素进行排序

根据位置索引可以提取对应的分词

import numpy
TFIDFSorted=numpy.argsort(tfidf.toarray(),axis=1)[:,-2:]
TFIDFDataFrame.columns[TFIDFSorted].values

 

5、实战演练

1、语料库的搭建

 1 import os;
 2 import os.path;
 3 import codecs;
 4 
 5 filePaths = [];
 6 fileContents = [];
 7 for root, dirs, files in os.walk(
 8     "D:\PDM\2.8\SogouC.mini\Sample"
 9 ):
10     for name in files:
11         filePath = os.path.join(root, name);
12         filePaths.append(filePath);
13         f = codecs.open(filePath, r, utf-8)
14         fileContent = f.read()
15         f.close()
16         fileContents.append(fileContent)
17 
18 import pandas;
19 corpos = pandas.DataFrame({
20     filePath: filePaths, 
21     fileContent: fileContents
22 });

2、分词(中文分词)

 1 import re
 2 zhPattern=re.compile(u[u4e00-u9fa5]+)
 3 
 4 import jieba
 5 segments=[]
 6 filePaths=[]
 7 
 8 for index,row in corpos.iterrows():
 9     segments=[]
10     filePath=row["filePath"]
11     fileContent=row["fileContent"]
12     segs=jieba.cut(fileContent)
13     for seg in segs:
14         if zhPattern.search(seg):
15             segments.append(seg)
16     filePaths.append(filePath)
17     row["fileContent"]=" ".join(segments)    #为了满足sklearn包的使用

 

3、调用停用词、tfidf计算

 1 from sklearn.feature_extraction.text import CountVectorizer
 2 from sklearn.feature_extraction.text import TfidfTransformer
 3 
 4 stopwords = pandas.read_csv(
 5     "D:\PDM\2.8\StopwordsCN.txt",
 6     encoding=utf8, 
 7     index_col=False,
 8     quoting=3,
 9     sep="	"
10 )
11 
12 countVectorizer = CountVectorizer(
13     stop_words=list(stopwords[stopword].values),   #与之前的CountVectorizer不一样,增加了停用词,去除了停用词的统计
14     min_df=0, token_pattern=r"w+"
15 )
16 textVector = countVectorizer.fit_transform(
17     corpos[fileContent]
18 )
19 
20 transformer = TfidfTransformer()
21 tfidf = transformer.fit_transform(textVector)

4、提取关键字

 1 import numpy;
 2 sort = numpy.argsort(tfidf.toarray(), axis=1)[:, -5:]
 3 names = countVectorizer.get_feature_names();
 4 
 5 keywords = pandas.Index(names)[sort].values
 6 
 7 tagDF = pandas.DataFrame({
 8     filePath:corpos.filePath, 
 9     fileContent:corpos.fileContent, 
10     tag1:keywords[:, 0], 
11     tag2:keywords[:, 1], 
12     tag3:keywords[:, 2], 
13     tag4:keywords[:, 3], 
14     tag5:keywords[:, 4]
15 })

 

 

相关文章推荐

在构建语料库、完成分词等任务后,获得了向量化矩阵textVector

 

 1 from sklearn.metrics import pairwise_distances
 2 
 3 distance_matrix=pairwise_distances(
 4         textVector,
 5         metric="cosine")   #向量化矩阵与计算公式
 6 
 7 m=1-pandas.DataFrame(distance_matrix)
 8 m.columns=filePaths
 9 m.index=filePaths
10 
11 sort=numpy.argsort(distance_matrix,axis=1)[:,1:6]
12 similarity5=pandas.Index(filePaths)[sort].values
13 
14 similarityDF=pandas.DataFrame({
15     filePath:corpos.filePath, 
16     s1: similarity5[:, 0], 
17     s2: similarity5[:, 1], 
18     s3: similarity5[:, 2], 
19     s4: similarity5[:, 3], 
20     s5: similarity5[:, 4]})

 

 

 

自动摘要

算法步骤:

获取到需要摘要的文章;

对改文章进行词频统计

对改文章进行分局(根据中文的标点符号,一般我们采用。、?等进行分句)

计算分句与文章之间的余弦相似度

取相似度最高的分句,作为文章的摘要

 

首先构建语料库、停用词、countVectorizer

建立子语料库及向量化矩阵

 1 contents=[]
 2 summarys=[]
 3 filePahts=[]
 4 
 5 
 6 for index,row in corpos.iterrows():
 7     filePath=row["filePath"]
 8     fileContent=row["fileContent"]
 9     #建立子语料库,以该文档和该文档的分组组成
10     subCorpos=[fileContent]+re.split(
11         r[。?!
]s*,
12         fileContent
13     )
14     
15     segments=[]
16     suitCorpos=[]
17     for content in subCorpos:
18         segs=jieba.cut(content)
19         segment=" ".join(segs)
20         if len(segment.strip())>10:
21             segments.append(segment)
22             suitCorpos.append(content)
23     
24     textVector=countVectorizer.fit_transform(segments)
25     
26     distance_metrix=pairwise_distances(
27         textVector,
28         metric="cosine")
29     
30     sort=numpy.argsort(distance_metrix,axis=1)
31     
32     summary=pandas.Index(suitCorpos)[sort[0]].values[1]
33 
34     summarys.append(summary)
35     filePahts.append(filePath)
36     contents.append(fileContent)

 

以上是关于Python数据挖掘-使用sklearn包的主要内容,如果未能解决你的问题,请参考以下文章

在 Python 中使用简单线性回归包的不同结果:statsmodel.api vs sklearn

Python使用sklearn和statsmodels构建多元线性回归模型(Multiple Linear Regression)并解读

用于 R 的可训练 sklearn StandardScaler

带有 SKLEARN、PANDAS 和 NUMPY 问题的 Python 部署包?

安装Python的机器学习包Sklearn 出错解决方法

在R中使用带有网格包的Python - 找不到Numpy