我要把人生變成科學的夢,然後再把夢變成現實。——居裡夫人
概述
關鍵詞是代表文章重要内容的一組詞,在文獻檢索、自動文摘、文本聚類/分類等方面有着重要的應用。現實中大量的文本不包含關鍵詞,這使得便捷擷取文本資訊更困難,是以自動提取關鍵詞技術具有重要的價值和意義。
關鍵詞提取分類
- 有監督
- 無監督
有監督雖然精度高,但需要維護一個内容豐富的詞表,需要大量的标注資料,人工成本過高。
無監督不需要标注資料,是以這類算法在關鍵詞提取領域應用更多。比如TF-IDF算法、TextRank算法和主題模型LDA算法等。
TF-IDF算法
TF-IDF(Term Frequency - Inverse Document Frequency)是一種基于統計的計算方法,常用于反映一個詞對于語料中某篇文檔的重要性。
TF是詞頻(Term Frequency),IDF是逆文本頻率指數(Inverse Document Frequency)。TF-IDF 的主要思想就是:如果某個詞在一篇文檔中出現的頻率高,也即 TF 高;并且在語料庫中其他文檔中很少出現,即DF低,也即IDF高,則認為這個詞具有很好的類别區分能力。
TF 為詞頻(Term Frequency),表示詞 t 在文檔 d 中出現的頻率,計算公式:
其中,分子是該詞在檔案中的出現次數,而分母則是在檔案中所有字詞的出現次數之和。
IDF 為逆文檔頻率(Inverse Document Frequency),表示語料庫中包含詞 t 的文檔的數目的倒數,計算公式:
其中,|D|:語料庫中的檔案總數,|{j:ti∈dj}| 包含詞 ti 的檔案數目,如果該詞語不在語料庫中,就會導緻被除數為零,是以一般情況下使用 1+|{j:ti∈dj}|。
然後再計算TF與IDF的乘積:
是以,TF-IDF傾向于過濾掉常見的詞語,保留重要的詞語。比如:有些詞“的”,“了”,“地”等出現在每篇文章中都比較多,但是不具有區分文章類别的能力。
TextRank算法
TextRank算法脫離語料庫,僅對單篇文檔進行分析就可以提取該文檔的關鍵詞,此算法最早應用于文檔的自動摘要,基于句子次元的分析,利用TextRank對每個句子進行打分,挑選出分數最高的n個句子作為文檔的關鍵句,以達到自動摘要的效果。
TextRank基本思想來源于Google創始人拉裡·佩奇和謝爾蓋·布林1997年建構的PageRank算法。核心思想将文本中的詞看作圖中的節點,通過邊互相連接配接,這裡就形成了圖,不同的節點會有不同的權重,權重高的節點可以作為關鍵詞。
PageRank思想:
- 連結數量。一個網頁被越多的其他網頁連結,說明這個網頁越重要。
- 連結品質。一個網頁被一個越高權重的網頁連結,也能表明這個網頁越重要。
TextRank用PageRank的思想來解釋它:
- 一個單詞被很多單詞指向的話,則說明這個單詞比較重要。
- 一個單詞被很高TextRank值的單詞指向,則這個單詞的TextRank值會相應地提高。
公式如下:
TextRank中一個單詞i的權重取決于在i相連的各個點j組成的(j,i)這條邊的權重,以及j這個點到其他邊的權重之和,阻尼系數 d 一般取 0.85。
TextRank關鍵詞提取步驟:
- 把給定的文本按照完整句子進行分割。
- 對每個句子,進行分詞和詞性标注處理,并過濾掉停用詞,隻保留指定詞性的單詞,如名詞、動詞等。
- 建構關鍵詞圖 G = (V,E),其中V 為節點集,由步驟2中生成的候選關鍵詞組成,然後采用共現關系構造任兩點之間的邊,兩個節點之間存在邊僅當它們對應的詞彙在長度為 K 的視窗中共現,K 表示視窗大小。
- 根據TextRank公式,疊代收斂,選出權重topK個詞為關鍵詞。
- 由步驟4得到最重要的k個單詞,在原始文本中進行标記,若形成相鄰詞組,則組合成多詞關鍵詞。
基于 LDA 主題模型進行關鍵詞提取
大多數情況,TF-IDF算法和TextRank算法就能滿足,但某些場景不能從字面意思提取出關鍵詞,比如:一篇講健康飲食的,裡面介紹了各種水果、蔬菜等對身體的好處,但全篇未顯式的出現健康二字,這種情況前面的兩種算法顯然不能提取出健康這個隐含的主題資訊,這時候主題模型就派上用場了。
LDA(隐含狄利克雷分布)是由David Blei等人在2003年提出的,理論基礎為貝葉斯理論,LDA根據詞的共現資訊的分析,拟合出詞——文檔——主題的分布,進而将詞、文本都映射到一個語義空間中。
實戰
- jieba 已經實作了基于 TF-IDF 算法的關鍵詞抽取,如下:
import jieba.analyse
text = '城市綠化是栽種植物以改善城市環境的活動。 城市綠化作為城市生态系統中的還原組織 城市生态系統具有受到外來幹擾和破壞而恢複原狀的能力,就是通常所說的城市生态系統的還原功能。'
#擷取關鍵詞
tags = jieba.analyse.extract_tags(text, topK=3)
print(u"關鍵詞:")
print(" ".join(tags))
複制
執行結果:
關鍵詞:
生态系統 城市綠化 城市
複制
- jieba也已經實作了基于 TextRank算法的關鍵詞抽取,如下:
import jieba.analyse
text = '城市綠化是栽種植物以改善城市環境的活動。 城市綠化作為城市生态系統中的還原組織 城市生态系統具有受到外來幹擾和破壞而恢複原狀的能力,就是通常所說的城市生态系統的還原功能。'
result = " ".join(jieba.analyse.textrank(text, topK=3, withWeight=False, allowPOS=('ns', 'n', 'vn', 'v')))
print(u"關鍵詞:")
print(result)
複制
執行結果:
關鍵詞:
城市 破壞 還原
複制
- 通過 Gensim 庫完成基于 LDA 的關鍵字提取,如下:
import jieba
import jieba.analyse as analyse
import gensim
from gensim import corpora, models, similarities
text = '城市綠化是栽種植物以改善城市環境的活動。 城市綠化作為城市生态系統中的還原組織 城市生态系統具有受到外來幹擾和破壞而恢複原狀的能力,就是通常所說的城市生态系統的還原功能。'
# 停用詞
stop_word = ['的', '。', '是', ' ']
# 分詞
sentences=[]
segs=jieba.lcut(text)
segs = list(filter(lambda x:x not in stop_word, segs))
sentences.append(segs)
# 建構詞袋模型
dictionary = corpora.Dictionary(sentences)
corpus = [dictionary.doc2bow(sentence) for sentence in sentences]
# lda模型,num_topics是主題的個數
lda = gensim.models.ldamodel.LdaModel(corpus=corpus, id2word=dictionary, num_topics=8)
print(lda.print_topic(1, topn=3))
複制
執行結果:
0.037*"城市" + 0.037*"城市綠化" + 0.037*"生态系統"
複制