Lesson 11 關(guān)鍵詞提取實(shí)現(xiàn)
TF-IDF原理
決定當(dāng)兩個分詞的詞頻一樣,哪個更適合做關(guān)鍵詞
在詞頻的基礎(chǔ)上猛铅,對每個詞分配一個權(quán)重,較少見的詞分配較大的權(quán)重
詞頻(Term Frequency) 指的是某一個給定的詞在該文檔中出現(xiàn)的次數(shù)
逆文檔頻率(Inverse Document Frequency)IDF就是每個詞的權(quán)重麸折,它的大小與一個詞的常見程度成反比
TF-IDF(Term Frequency-Inverse Document Frequency)權(quán)衡某個分詞是否是關(guān)鍵詞的指標(biāo)忧勿,該值越大,是關(guān)鍵詞的可能性就越大
TF計算公式
TF = 該詞在文檔中出現(xiàn)的次數(shù)
IDF計算公式
IDF = log(文檔總數(shù)/(包含該詞的文檔數(shù) +1))
文檔向量化
假設(shè)有m篇文檔d1, d2, d3, ... dm對它們進(jìn)行分詞贰剥,得到n個分詞w1, w2, w3...wn倾剿,那么f(i,j)代表第i篇文章中,分詞j出現(xiàn)的次數(shù)蚌成,可以用矩陣表示前痘。
那么第i篇文章,可以使用第i行數(shù)據(jù)進(jìn)行表示担忧。
TF-IDF實(shí)現(xiàn)
Step 1: 按照中文分詞和文件的關(guān)系創(chuàng)建DataFrame
import re
#匹配中文的分詞
zhPattern = re.compile(u'[\u4e00-\u9fa5]+')
import jieba
segments = []
filePaths = []
for index, 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({
'filePath':filePaths,
'segment':segments
})
Step 2: 移除停用詞(該步驟和之前的語料庫準(zhǔn)備步驟一致)
stopwords = pandas.read_csv(
"StopwordsCN.txt",
encoding='utf8',
index_col=False,
quoting=3,
sep="\t"
)
segmentDF = segmentDF[
~segmentDF.segment.isin(
stopwords.stopword
)
]
Step 3: 按文章進(jìn)行詞頻統(tǒng)計, sample中用的order()函數(shù)已經(jīng)過期芹缔,需替換成sort_values()
segStat = segmentDF.groupby(
by=["filePath", "segment"]
)["segment"].agg({
"計數(shù)":numpy.size
}).reset_index().sort_values(
"計數(shù)",
ascending=False
);
Step 4: 把小部分的數(shù)據(jù)刪除掉
segStat = segStat[segStat.計數(shù)>1]
Step 5: 進(jìn)行文本向量計算
#將DataFrame轉(zhuǎn)成pivot table,進(jìn)行文件與分詞的交叉分析
TF = segStat.pivot_table(
index='filePath',
columns='segment',
values='計數(shù)',
fill_value=0
)
#套用公式瓶盛,計算IDF值
def hanlder(x):
return (numpy.log2(len(corpos)/(numpy.sum(x>0)+1)))
IDF = TF.apply(hanlder)
#將TF*IDF得到TF_IDF值
TF_IDF = pandas.DataFrame(TF*IDF)
tag1s = []
tag2s = []
tag3s = []
tag4s = []
tag5s = []
#計算Top 5 分詞最欠,此處可以和前一課進(jìn)行比較:tags = jieba.analyse.extract_tags(content, topK=5)
for filePath in TF_IDF.index:
tagis = TF_IDF.loc[filePath].sort_values(
ascending=False
)[:5].index
tag1s.append(tagis[0])
tag2s.append(tagis[1])
tag3s.append(tagis[2])
tag4s.append(tagis[3])
tag5s.append(tagis[4])
tagDF = pandas.DataFrame({
'filePath':corpos.filePath,
'fileContent':corpos.fileContent,
'tag1':tag1s,
'tag2':tag2s,
'tag3':tag3s,
'tag4':tag4s,
'tag5':tag5s
})