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

大量文本下,關鍵詞/熱點詞的提取都有哪些方案。

我知道的有 tf*idf、topic model,還有別的嗎?

topic model具體是怎麼樣的?


我博士階段的研究課題就是關鍵詞抽取,歡迎下載閱讀我的論文「基於文檔主題結構的關鍵詞抽取方法研究」。以我做關鍵詞抽取的經驗,建議如下:

1. TFIDF是很強的baseline,具有較強的普適性,如果沒有太多經驗的話,可以實現該演算法基本能應付大部分關鍵詞抽取的場景了。

2. 對於中文而言,中文分詞和詞性標註的性能對關鍵詞抽取的效果至關重要。

3. 較複雜的演算法各自有些問題,如Topic Model,它的主要問題是抽取的關鍵詞一般過於寬泛,不能較好反映文章主題。這在我的博士論文中有專門實驗和論述;TextRank實際應用效果並不比TFIDF有明顯優勢,而且由於涉及網路構建和隨機遊走的迭代演算法,效率極低。這些複雜演算法集中想要解決的問題,是如何利用更豐富的文檔外部和內部信息進行抽取。如果有興趣嘗試更複雜的演算法,我認為我們提出的基於SMT(統計機器翻譯)的模型,可以較好地兼顧效率和效果。

4. 以上都是無監督演算法,即沒有事先標註好的數據集合。而如果我們有事先標註好的數據集合的話,就可以將關鍵詞抽取問題轉換為有監督的分類問題。這在我博士論文中的相關工作介紹中均有提到。從性能上來講,利用有監督模型的效果普遍要優於無監督模型,對關鍵詞抽取來講亦是如此。在Web 2.0時代的社會標籤推薦問題,就是典型的有監督的關鍵詞推薦問題,也是典型的多分類、多標籤的分類問題,有很多高效演算法可以使用。


1.TF-IDF和關鍵詞提取

作為提取關鍵詞的最基本、最簡單易懂的方法,首先介紹下TF-IDF。

判斷一個詞在一篇文章中是否重要,一個容易想到的衡量指標就是詞頻,重要的詞往往會在文章中多次出現。但另一方面,不是出現次數多的詞就一定重要,因為有些詞在各種文章中都頻繁出現,那它的重要性肯定不如那些只在某篇文章中頻繁出現的詞重要性強。從統計學的角度,就是給予那些不常見的詞以較大的權重,而減少常見詞的權重。IDF(逆文檔頻率)就是這個權重,TF則指的是詞頻。

TF=(詞語在文章中出現次數)/ (文章總詞數)

IDF=log (語料庫文檔總數/(包含該詞的文檔數+1))

TF - IDF = TF * IDF

摘取一個博客中的一個例子[1]

「中國」在文章中的頻率並不比「蜜蜂「和」養殖「低,但因其在各種文章中都會頻繁出現,因此其逆文檔頻率較低,不會被識別成本文的關鍵詞。

TF-IDF雖然非常簡單,但卻很經典有效,而且速度很快,有的場景中會提升第一段和最後一段的文本權重,因為文章的關鍵詞往往會在開頭和結尾段頻繁出現。但TF-IDF只是僅從詞頻角度挖掘信息,並不能體現文本的深層語義信息。

2.topic-model和關鍵詞提取

如果說TF-IDF只能從詞頻角度挖掘信息,那麼如何挖掘更深層次的信息呢?這就是topic-model想要完成的任務。

舉個例子,以下四個句子:


1.I
ate a banana and spinach smoothie for breakfast


2.I
like to eat broccoli and bananas.


3.Chinchillas
and kittens are cute.


4.My
sister adopted a kitten yesterday.

僅從詞語角度分析,1.2句banana是重複出現的,3.4句kitten是重複出現的。但其實可以發現1.2句主要跟食物有關,3.4句主要跟動物有關,而food、animal兩個詞在四句話里均未出現,有沒有可能判斷出四句話中所包含的兩個主題呢?或者當兩篇文章共有的高頻詞很少,如一篇講banana,一篇講orange,是否可以判斷兩篇文章都包含food這個主題呢?如何生成主題、如何分析文章的主題,這就是topic-model所研究的內容。對文本進行LSA(隱形語義分析)。

在直接對詞頻進行分析的研究中,可以認為通過詞語來描述文章,即一層的傳遞關係。

而topic-model則認為文章是由主題組成,文章中的詞,是以一定概率從主題中選取的。不同的主題下,詞語出現的概率分布是不同的。比如」魚雷「一詞,在」軍事「主題下出現的概率遠大於在」食品」主題下出現的概率。即topic-model認為文檔和詞語之間還有一層關係。

首先假設每篇文章只有一個主題z,則對於文章中的詞w,是根據在z主題下的概率分布p(w|z)生成的。則在已經選定主題的前提下,整篇文檔產生的概率是prod_{w}p(wvee z)

而這種對每篇文章只有一個主題的假設顯然是不合理的,事實上每篇文章可能有多個主題,即主題的選擇也是服從某概率分布p(t)的因此根據LDA模型,所有變數的聯合分布為

varphi 表示topic下詞的分布,	heta 表示文檔下topic的分布。N_{m} 是第m個文檔的單詞總數。alpha eta 表示詞語和topic的概率分布先驗參數。而學習LDA的過程,就是通過觀察到的文檔集合,學習varphi,	heta ,z的過程。學習過程參見論文[2]。

下圖為一個LDA學習結果的例子

取自[3]

可以看出,topic-model的目的就是從文本中發現隱含的語義維度,在詞語和文檔之間加入更概括的信息。

3.textrank關鍵詞提取

textrank的則從圖模型的角度找文章的關鍵詞,好處在於不用事先基於大量數據進行訓練。

其基本思想來自於pagerank演算法,pagerank的兩條基本思想是,如果一個網頁被很多其他網頁鏈接到,說明這個網頁比較重要;如果一個網頁被一個權值很高的網頁鏈接到,則其重要性也會相應增加。

判斷兩個網頁之間是否有邊相連,根據網頁中出現的鏈接,而在textrank中判斷兩個詞間是否存在相關關係,則根據詞語的共現關係。實際處理時,取一定長度的窗,在窗內的共現關係則視為有效。

修改的textrank演算法

4.rake關鍵詞提取

rake演算法提取的並不是單一的單詞,而是由單片語成的短語。短語的分割由標點符號

每個短語的得分由組成短語的詞累加得到,而詞的得分與詞的度與詞頻有關

Score=frac{degree}{frequency}

當與一個詞共現的詞語越多,該詞的度就越大。


演算法本身很簡單也很好理解,也有可直接供使用的python代碼:

GitHub - aneesha/RAKE: A python implementation of the Rapid Automatic Keyword Extraction

參考文獻

[1]
TF-IDF與餘弦相似性的應用(一):自動提取關鍵詞

[2]
Blei D M, Ng A Y, Jordan M I. Latent dirichlet allocation[J]. Journal
of machine Learning research, 2003, 3(Jan): 993-1022.

[3]
Blei D M. Probabilistic topic models[J]. Communications of the ACM,
2012, 55(4): 77-84.

[4]
Rose S, Engel D, Cramer N, et al. Automatic keyword extraction from
individual documents[J]. Text Mining, 2010: 1-20.


講兩個灰常牛逼的演算法。這才是大數據好伐。

能夠識別一個query裡面哪些是關鍵term,哪些是比較弱的term。

假如來了一個query,那麼我們要判斷裡面的哪個詞是關鍵詞,我們會給每一個term都打一個分(term weight),分高的就是關鍵詞,分低的就是垃圾詞。那麼這個分怎麼來打比較合理呢?下面講兩個演算法,都是基於海量數據統計的(query數目大約60億);

第一個:上下文無關的weight演算法

一個term單獨出現的頻次越高,而且和其他term搭配出現的機會越少,那麼我們可以肯定,這個term表達意圖的能力越強,越重要。

所以有公式:

一看就知道是一個迭代的公式。初始化的時候,每一個query的所有term權重之和等於1,所以每一個term的權重就是1/m;m是當前query的term數目。

第二個:上下文有關的weight演算法

繼續上班。

晚上來寫哈。

---------------------------------------------------------------------

第二個:上下文有關的weight演算法。

這個演算法寫出來感覺不太好,就刪了哈。繼續working


關於關鍵詞提取,寫了一些自己的感想,參考鏈接:關鍵詞提取 A Quick Review


看你主要提取什麼文本的關鍵詞,曾經在微博上試過TF-IDF,LDA 和TextRank,感覺LDA在短文本上完全不靠譜,在文檔級應用上應該可以(沒試過,這方面的論文應該很多)。


我們所說的關鍵詞通常由一個或多個 term 組成,即可以是分詞後的 term,如「鮮花」、「快遞」,也可以是多個 term 組成的 phrase,如「鮮花快遞」、「鮮花快遞公司」,英文常見叫法是 keyword,keyphrase。

至於什麼是關鍵詞呢?至少必須滿足兩個關鍵條件:邊界合法和有行業區分度。甚至還可以結合具體應用場景增加限制條件,如在計算廣告中,還要考慮商業價值。

我們的做法是分兩步走:

  1. 候選詞匹配:基於關鍵詞詞庫的多模式匹配得到候選,這裡最重要的工作是詞庫構建,往往會融合多種方法:垂直站點專有名詞,百科詞條,輸入法細胞詞庫,廣告主購買詞,基於大規模語料庫的自動詞庫挖掘(推薦韓家煒團隊的 shangjingbo1226/SegPhrase ,shangjingbo1226/AutoPhrase 方法)等。這裡會涉及大量的數據清洗工作,甚至還可以有一個質量分類器決定哪些詞條可以進入詞庫。
  2. 候選詞相關性排序:包括無監督和有監督方法,如下:
  • 無監督方法:常見的有 TFIDF(需要統計 phrase 級別的 DF), textrank(優勢不明顯,計算量大,慎用),topic 相似度(參見 baidu/Familia),embedding 相似度(需要訓練或計算 keyword 和 doc embedding),TWE 相似度(參見 baidu/Familia)
  • 有監督方法:常見的有基於統計機器翻譯 SMT 的方法(轉換成翻譯問題,可以採用 IBM Model 1),基於序列標註模型的方法(轉換成核心成分識別問題,類似 NER,狀態只有0和1,即是否是核心成分,較適用於短文本),基於排序學習LTR的方法(轉換成候選詞排序問題,採用 pairwise 方法,或者深度語義匹配方法,如 DSSM),基於傳統機器學習分類方法(轉換成二元或多元分類問題)。
  • 有監督方法依賴一定規模的標註數據,效果通常會顯著好於無監督方法。

上面的方法僅能抽取文本字面出現的詞,會有 Vocabuary Gap 問題,大部分情況下是足夠的,還有一種做法可以基於生成模型的方法,自動「抽取」生成一些字面上未出現的詞條,如 ACL 2017 Deep Keyphrase Generation(http://memray.me/uploads/acl17-keyphrase-generation.pdf ,memray/seq2seq-keyphrase)。另外,也可以考慮基於字面抽取的 keyword,擴展出一些語義相似的詞條作為候選詞,通過打分排序選出合適的保留下來。

特別的,對於一些存在規律性描述模式的特殊類型文本,如 query log,還可以採用基於 bootstrapping 的軟模式匹配方法,通常準確率很高,召回率一般。


更新下:後來嘗試了用NER(命名實體識別)的框架來做關鍵詞抽取,其實就是典型的序列標註問題,用lstm,每個時間步都輸出,是關鍵詞輸出1,非關鍵詞輸出0。至少是能跑,但這個精度上好像不是很理想,這可能和數據集有關,數據集太少了才1000條。。

----------------------------------------------------------------

看了各位前輩的回答,發現關鍵詞抽取要麼是無監督的tfidf,textrank等,要麼有監督都是基於特徵的傳統機器學習分類演算法。

現在深度學習這麼熱,怎麼沒見過用深度學習做關鍵詞抽取的?比如把文本詞向量化,然後用lstm去一個詞一個詞識別,是的話輸出1,不是的話輸出0. 各位前輩有這方面的相關內容推薦給我看看,謝啦


facebookresearch/fastText 這個也不錯,用起來挺好,也是基於 topic 來打標籤

思路:term 詞向量求和取平均 -&> logistic regression,只不過由於標籤過多,所以用層次 softmax 或者 negative sampling 來優化性能。


其實抽取關鍵詞這種看用在什麼場景,textRank感覺挺不錯的,LDA主題模型抽取關鍵詞效果並不是很好,看你用來幹嘛,什麼語料庫。


多謝劉博士、李博士的解答。我明天用apache Lucene試試。Lucene模糊搜索sloppy phrase match好用嗎?


推薦閱讀:

《Deep Recurrent Generative Decoder for Abstractive Text Summarization》閱讀筆記
揭開知識庫問答KB-QA的面紗6·深度學習中篇
《Exploring the E?ffectiveness of Convolutional Neural Networks for Answer Selection ...》閱讀筆記
揭開知識庫問答KB-QA的面紗5·深度學習上篇
REASONING ABOUT ENTAILMENT WITH NEURAL ATTENTION

TAG:自然語言處理 |