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"\b\w+\b")
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="\t"
10 )
11 
12 countVectorizer = CountVectorizer(
13     stop_words=list(stopwords['stopword'].values),   #與之前的CountVectorizer不一樣,增加了停用詞,去除了停用詞的統計
14     min_df=0, token_pattern=r"\b\w+\b"
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'[。?!\n]\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)

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM