03.03 TF-IDF關鍵詞提取算法的Python實現

關鍵詞提取是詞語顆粒度的信息抽取的一種重要的需求,即提取文章中重要的詞語。

關鍵詞提取的常用方法包括詞頻統計、TF-IDF和TextRank等。

其中,詞頻和TextRank屬於單文檔算法,即只需一篇文章即可提取出其中的關鍵詞;而TF-IDF則屬於多文檔宣發,需要其他文檔的輔助來提取當前文章的關鍵詞。


TF-IDF原理

因為如果一個詞在越多的文檔裡出現,則越說明這個詞不能體現出文檔的特色。

相較於詞頻統計的方法,TF-IDF(term frequency–inverse document frequency)在考慮文檔中詞語出現頻率的同時,還考慮了詞語相較於其他文檔的稀有程度,即還有多少其他的文檔包含這個詞語。

TF-IDF的計算方法如下:

TF-IDF關鍵詞提取算法的Python實現

TF-IDF計算公式

其中t表示單詞,d表示文檔,TF(t,d)表示單詞t在文檔d中的出現頻次,DF(t)表示包含單詞t的文檔數量,IDF表示DF的倒數。

例如,我們統計1000篇與古風相關的文章的關鍵詞。已知其中有800篇文章都包含“古風”這個詞,而只有50篇文章包含“七言律詩”這個詞。在文章A中,出現了20次“古風”,10次“七言律詩”。

如果使用詞頻統計提取關鍵詞,文章A中的關鍵詞,“古風”的權重應為“七言律詩”的2倍;但是如果使用TF-IDF提取關鍵詞,“古風”的權重應為25,而“七言律詩”的權重為200。可見,TF-IDF可以更有效地突出文章的個性。

基於HanLP實現的TF-IDF

我們參考HanLP在Github中的案例進行嘗試:

<code>from pyhanlp import *

TfIdfCounter = JClass('com.hankcs.hanlp.mining.word.TfIdfCounter')

if __name__ == '__main__':
counter = TfIdfCounter()
counter.add("《女排奪冠》", "女排北京奧運會奪冠") # 輸入多篇文檔
counter.add("《羽毛球男單》", "北京奧運會的羽毛球男單決賽")
counter.add("《女排》", "中國隊女排奪北京奧運會金牌重返巔峰,觀眾歡呼女排女排女排!")

counter.compute() # 輸入完畢
for id in counter.documents():
print(id + " : " + counter.getKeywordsOf(id, 3).toString()) # 根據每篇文檔的TF-IDF提取關鍵詞/<code>

運行結果

<code>《女排》 : [女排=5.150728289807123, 重返=1.6931471805599454, 巔峰=1.6931471805599454]
《女排奪冠》 : [奪冠=1.6931471805599454, 女排=1.2876820724517808, 奧運會=1.0]
《羽毛球男單》 : [決賽=1.6931471805599454, 羽毛球=1.6931471805599454, 男單=1.6931471805599454]/<code>

根據結果可以看到,文檔中有效避免了“奧運會”這個在各個句子中都頻繁出現的詞擁有過高的權重。

學習參考文獻:《自然語言處理入門》(何晗):9.2.2


分享到:


相關文章: