使用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)