第一、理論準備
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
});