Part I:簡介

Part II:TF-IDF關鍵詞提取

Part III:TextRank關鍵詞提取

Part IV:演算法實現

Part V:總結


背景:最近正在做的實驗室項目需要對文本進行關鍵詞提取,於是對關鍵詞提取演算法做了一定的調研,在這裡總結一下。這篇文章首先會對關鍵詞提取演算法進行概括,介紹常用的TF-IDF演算法和TextRank演算法,最後結合Python jieba庫的源碼講解演算法的實現。


Part I:簡介

關鍵詞提取是文本挖掘領域一個很重要的部分,通過對文本提取的關鍵詞可以窺探整個文本的主題思想,進一步應用於文本的推薦或文本的搜索。

文本關鍵詞提取演算法大致分為有監督和無監督兩種:

有監督演算法將關鍵詞抽取問題轉換為判斷每個候選關鍵詞是否為關鍵詞的二分類問題,它需要一個已經標註關鍵詞的文檔集合訓練分類模型。然而標註訓練集非常費時費力,所以無監督演算法更為常用。

無監督演算法不需要人工標註的訓練集,利用某些方法發現文本中比較重要的詞作為關鍵詞,進行關鍵詞抽取。詞重要性的衡量有多種方式:基於文本統計特徵、基於詞圖模型和基於主題模型,TF-IDF、TextRank和LDA分別是這幾種不同方式的代表。無監督的文本關鍵詞抽取流程如下:


Part II:TF-IDF關鍵詞提取

TF-IDF是關鍵詞提取最基本、最簡單易懂的方法。判斷一個詞再一篇文章中是否重要,一個容易想到的衡量指標就是詞頻,重要的詞往往在文章中出現的頻率也非常高;但另一方面,不是出現次數越多的詞就一定重要,因為有些詞在各種文章中都頻繁出現,那它的重要性肯定不如哪些只在某篇文章中頻繁出現的詞重要性強。從統計學的角度,就是給予那些不常見的詞以較大的權重,而減少常見詞的權重。IDF(逆文檔頻率)就是這樣一個權重,TF則指的是詞頻。TF和IDF計算公式如下:

詞頻(TF)=frac{某個詞在文章中出現的次數}{文章的總詞數}

逆文檔頻率(IDF)=log(frac{語料庫的文檔總數}{包含該詞的文檔數+1})

一個詞IDF值的計算是根據語料庫得出的,如果一個詞在語料庫中越常見,那麼分母就越大,IDF就越小越接近0。分母之所以要加1,是為了避免分母為0(即所有文檔都不包含該詞)。

最終得到TF-IDF值:

TF-IDF=詞頻(TF)	imes 逆文檔頻率(IDF)

可以看出TF-IDF與一個詞在文檔中的出現次數成正比,與該詞在整個語料庫中出現次數成反比。一個詞的TF-IDF值非常高,說明這個詞比較少見,但是它在這篇文章中多次出現,那麼這個詞就非常可能是我們需要的關鍵詞。

引用阮一峯前輩的文章TF-IDF與餘弦相似性的應用(一):自動提取關鍵詞 - 阮一峯的網路日誌中的例子:

以文章《中國的蜜蜂養殖》為例,「蜜蜂」和「養殖」兩個詞的TF-IDF值都非常高,作為這篇文章的關鍵詞實際上看也是非常合適的。另外「中國」這個詞雖然在文章中的詞頻並不低「蜜蜂」和「養殖」低,但因為它在整個語料庫中經常出現,導致IDF值非常低,所以不會作為文章的關鍵詞。


Part III:TextRank關鍵詞抽取

TextRank從詞圖模型的角度尋找文章的關鍵詞,它的基本思想來源於大名鼎鼎的PageRank演算法,PageRank演算法是整個Google搜索的核心演算法,通過網頁之間的鏈接計算網頁的重要性。首先介紹一下PageRank演算法:

PageRank演算法將整個互聯網看作一張有向圖,網頁是圖中的節點,而網頁之間的鏈接就是途中的邊。根據重要性傳遞的思想,如果一個網頁A含有一個指向網頁B的鏈接,那麼網頁B的重要性排名會根據A的重要行來提升。網頁重要性傳遞思想如下圖:

PageRank簡單描述(來自PageRank論文)

在PageRank演算法中,對於網頁初始重要值(PR值)的計算非常關鍵,但是這個值無法預知,於是PageRank論文中給出了一種迭代演算法求出這個PR值:為每個網頁隨機給一個初始值,然後迭代得到收斂值,作為網頁重要性的度量。

PageRank求網頁i的PR值的計算公式如下:

(S(V_i)=(1-d)+d	imes sum_{jin In(V_i) }^{ }frac{1}{|Out(V_j)|}S(V_j))

其中,d為阻尼係數,通常為0.85, (In(V_i)) 是指向網頁i的網頁集合, (Out(V_j)) 是指網頁j中的鏈接指向的集合, (|Out(V_j)|) 指集合中元素的個數。

TextRank在構建圖的時候將節點由網頁改成了詞,網頁之間的鏈接改為詞之間的共現關係,實際處理時,取一定長度的窗,在窗內的共現關係則視為有效。計算公式修改如下:

(WS(V_i)=(1-d)+d	imes sum_{jin In(V_i) }^{ }frac{w_{ji}}{sum_{V_kin Out(V_j) }{ }w_{jk}}WS(V_j))

迭代得到所有詞的PR值之後,就可以根據PR值的高低對詞進行排序,得到文本的關鍵詞集合。


Part IV:演算法實現

中文分詞中非常常用的Python jieba庫fxsjy/jieba中提供了基於TF-IDF演算法和TextRank演算法的關鍵詞提取,jieba庫的源碼明瞭易懂,所以這一章通過分析jieba庫的源碼介紹關鍵詞提取演算法的實現。

首先來看看jieba庫的關鍵詞提取的效果:

1、jieba.analyse.extract_tags(text)

完整代碼位於jieba/analyse/tfidf.py

我們看一下關鍵代碼:

def extract_tags(self, sentence, topK=20, withWeight=False, allowPOS=(), withFlag=False):
# (1)中文分詞
if allowPOS:
allowPOS = frozenset(allowPOS)
words = self.postokenizer.cut(sentence)
else:
words = self.tokenizer.cut(sentence)

# (2)計算詞頻TF
freq = {}
for w in words:
if allowPOS:
if w.flag not in allowPOS:
continue
elif not withFlag:
w = w.word
wc = w.word if allowPOS and withFlag else w
if len(wc.strip()) < 2 or wc.lower() in self.stop_words:
continue
freq[w] = freq.get(w, 0.0) + 1.0
total = sum(freq.values())

# (3)計算IDF
for k in freq:
kw = k.word if allowPOS and withFlag else k
freq[k] *= self.idf_freq.get(kw, self.median_idf) / total

# (4)排序得到關鍵詞集合
if withWeight:
tags = sorted(freq.items(), key=itemgetter(1), reverse=True)
else:
tags = sorted(freq, key=freq.__getitem__, reverse=True)
if topK:
return tags[:topK]
else:
return tags

extract_tags()函數將原始文本作為輸入,輸出文本的關鍵詞集合,代碼大致分為四個部分:(1)中文分詞 (2)計算詞頻TF (3)計算IDF (4)將所有詞排序得到關鍵詞集合。重點關注一下詞頻TF和IDF的計算,(2)部分代碼簡歷一個字典freq,記錄文本中所有詞的出現次數。(3)部分代碼計算IDF,前文提到IDF需要通過語料庫計算,jieba.analyse中包含一個idf.txt:

idf.txt中記錄了所有詞的IDF值:

當然你可以使用自己的語料庫idf.txt,詳見fxsjy/jieba文檔。

2、jieba.analyse.textrank(text)

完整代碼位於jieba/analyse/textrank.py

關鍵代碼如下:

def textrank(self, sentence, topK=20, withWeight=False, allowPOS=(ns, n, vn, v), withFlag=False):
# (1)構建詞圖
g = UndirectWeightedGraph()
words = tuple(self.tokenizer.cut(sentence))
for terms, w in cm.items():
g.addEdge(terms[0], terms[1], w)

# (2)迭代計算所有詞的PR值
nodes_rank = g.rank()

# (3)排序得到關鍵詞集合
if topK:
return tags[:topK]
else:
return tags

textrank()函數同樣將原始文本作為輸入,輸出文本的關鍵詞集合,代碼大致分為三個部分:(1)構建詞圖:UndirectWeightedGraph()類 (2)調用UndirectWeightedGraph()類的rank()方法迭代計算所有詞的PR值(3)排序得到關鍵詞集合

實現的更多細節可以直接閱讀jieba庫關鍵詞提取部分的源碼,代碼量很少,清晰易懂~


Part V:總結

關鍵詞提取在文本挖掘領域有著非常廣泛的應用,因為文本領域的不同,長文本和短文本的文本類型的不同,每種關鍵詞提取方法的效果也不盡相同,實際應用中需要對多種方法進行嘗試挑選最合適效果最好的方法。

參考文獻:

TF-IDF與餘弦相似性的應用(一):自動提取關鍵詞 - 阮一峯的網路日誌

如何做好文本關鍵詞提取?從達觀數據應用的三種演算法說起

「關鍵詞」提取都有哪些方案?

劉知遠 《基於文檔主題結構的關鍵詞抽取方法研究》

fxsjy/jieba

推薦閱讀:

相關文章