2、 python文字關鍵詞提取實現(案例)
阿新 • • 發佈:2018-12-11
第一、理論準備
1交叉計數函式
pivot_table(value,index,columns,aggfunc,fill_value)
# 引數說明
values:資料透視表中的值
index:資料透視表中的行(索引)
columns;資料透視表中的列
aggfunc:統計函式
fill_value:NA值的統一替換。
# 返回只說明:
資料透視表的結果
2 IDF 公式的實現程式:
IDF=log(文件總數/(包含該詞的文件數)+1)
程式碼實現:
def hanlder(x):
return(numpy.log2(len(corpos)/(numpy.sum(x>0)+1)))
IDF=TF.apply(hanlder)
# 詞頻 TF
# 逆文件頻率 IDF 是一個詞的權重,它的大小與一個詞的常見程度成反比
IDF=log(文件總數/(包含該詞的文件數)+1)
# TF-IDF 權衡某個分詞是否是關鍵詞的指標,該值越大,是關鍵詞的可能性也就越大。
TF-IDF=TF*IDF
第二、案例程式碼實踐
# 搭建語料庫 import os import os.path import codecs filepaths = []; filecontents = []; for root, dirs, files in os.walk( "D:\\database\\python\\2.7\\mini\\Sample" ): for name in files: filepath = os.path.join(root,name); filepaths.append(filepath); f = codecs.open(filepath,'r','utf-8'); filecontent = f.read() f.close() filecontents.append(filecontent) import pandas; corpos = pandas.DataFrame({ 'filepath':filepaths, 'filecontent':filecontents }); #詞頻分詞 import re # 匹配中文的分詞 zhPattern = re.compile(u'[\u4e00-\u9fa5]+') import jieba segments = [] filepaths = [] for root, row in corpos.iterrows(): filepath = row['filepath'] filecontent =row['filecontent'] segs = jieba.cut(filecontent) for seg in segs: if zhPattern.search(seg): segments.append(seg); filepaths.append(filepath); segmentDF=pandas.DataFrame({ 'segment':segments, 'filepath':filepaths}); # 移除停用詞 stopwords= pandas.read_csv( 'D:\\database\\python\\2.7\\StopwordsCN.txt', encoding='utf-8', index_col=False, quoting=3, sep="\t") segmentDF=segmentDF[ ~segmentDF.segment.isin(stopwords.stopword)] # 詞頻統計 import numpy; segstat = segmentDF.groupby( by=["segment","filepath"])["segment"].agg({ "計數":numpy.size }).reset_index().sort_values( '計數', ascending=False) #刪除小部分資料 segstat=segstat[segstat.計數>1] # 進行文字向量統計 TF=segstat.pivot_table( values='計數', index='filepath', columns='segment', fill_value=0 ) TF.index TF.columns def hanlder(x): return(numpy.log2(len(corpos)/(numpy.sum(x>0)+1))) IDF=TF.apply(hanlder) TF_IDF=pandas.DataFrame(TF*IDF) tag1s=[] tag2s=[] tag3s=[] tag4s=[] tag5s=[] for filepath in TF_IDF.index: tags=TF_IDF.loc[filepath].sort_values( ascending=False )[:5].index tag1s.append(tags[0]) tag2s.append(tags[1]) tag3s.append(tags[2]) tag4s.append(tags[3]) tag5s.append(tags[4]) tagDF = pandas.DataFrame({ 'filepath':corpos.filepath, 'filecontent':corpos.filecontent, #### 注意這塊必須鎖定是corops裡邊的資料 ###否則,因為調取長度導致錯誤 'tag1':tag1s, 'tag2':tag2s, 'tag3':tag3s, 'tag4':tag4s, 'tag5':tag5s });