中文文本關鍵詞抽取的三種方法(TF-IDF、TextRank、word2vec)

鏈接地址:https://github.com/AimeeLee77/keyword_extraction

1、基於TF-IDF的文本關鍵詞抽取方法 

詞頻(Term Frequency,TF)

指某一給定詞語在當前文件中出現的頻率。由於同一個詞語在長文件中可能比短文件有更高的詞頻,因此根據文件的長度,需要對給定詞語進行歸一化,即用給定詞語的次數除以當前文件的總詞數。

逆向文件頻率(Inverse Document Frequency,IDF)

是一個詞語普遍重要性的度量。即如果一個詞語只在很少的文件中出現,表示更能代表文件的主旨,它的權重也就越大;如果一個詞在大量文件中都出現,表示不清楚代表什麼內容,它的權重就應該小。

TF-IDF的主要思想是,

如果某個詞語在一篇文章中出現的頻率高,並且在其他文章中較少出現,則認爲該詞語能較好的代表當前文章的含義。即一個詞語的重要性與它在文檔中出現的次數成正比,與它在語料庫中文檔出現的頻率成反比。

 

1.1TF-IDF文本關鍵詞抽取方法流程

由以上可知,TF-IDF是對文本所有候選關鍵詞進行加權處理,根據權值對關鍵詞進行排序。假設Dn爲測試語料的大小,該算法的關鍵詞抽取步驟如下所示:

(1) 對於給定的文本D進行分詞、詞性標註和去除停用詞等數據預處理操作。本分採用結巴分詞,保留'n','nz','v','vd','vn','l','a','d'這幾個詞性的詞語,最終得到n個候選關鍵詞,即D=[t1,t2,…,tn] ;

(2) 計算詞語ti 在文本D中的詞頻;

(3) 計算詞語ti 在整個語料的IDF=log (Dn /(Dt +1)),Dt 爲語料庫中詞語ti 出現的文檔個數;

(4) 計算得到詞語ti 的TF-IDF=TF*IDF,並重復(2)—(4)得到所有候選關鍵詞的TF-IDF數值;

(5) 對候選關鍵詞計算結果進行倒序排列,得到排名前TopN個詞彙作爲文本關鍵詞。

1.2代碼實現: 

Python第三方工具包Scikit-learn提供了TFIDF算法的相關函數,本文主要用到了sklearn.feature_extraction.text下的TfidfTransformer和CountVectorizer函數。其中,CountVectorizer函數用來構建語料庫的中的詞頻矩陣,TfidfTransformer函數用來計算詞語的tfidf權值。

注:TfidfTransformer()函數有一個參數smooth_idf,默認值是True,若設置爲False,則IDF的計算公式爲idf=log(Dn /Dt ) + 1。

基於TF-IDF方法實現文本關鍵詞抽取的代碼執行步驟如下:

(1)讀取樣本源文件sample_data.csv;

(2)獲取每行記錄的標題和摘要字段,並拼接這兩個字段;

(3)加載自定義停用詞表stopWord.txt,並對拼接的文本進行數據預處理操作,包括分詞、篩選出符合詞性的詞語、去停用詞,用空格分隔拼接成文本;

(4)遍歷文本記錄,將預處理完成的文本放入文檔集corpus中;

(5)使用CountVectorizer()函數得到詞頻矩陣,a[j][i]表示第j個詞在第i篇文檔中的詞頻;

(6)使用TfidfTransformer()函數計算每個詞的tf-idf權值;

(7)得到詞袋模型中的關鍵詞以及對應的tf-idf矩陣;

(8)遍歷tf-idf矩陣,打印每篇文檔的詞彙以及對應的權重;

(9)對每篇文檔,按照詞語權重值降序排列,選取排名前topN個詞最爲文本關鍵詞,並寫入數據框中;

(10)將最終結果寫入文件keys_TFIDF.csv中。

 

2 基於TextRank的文本關鍵詞抽取方法

2.1 PageRank算法思想

TextRank算法是基於PageRank算法的,因此,在介紹TextRank前不得不瞭解一下PageRank算法。

PageRank算法是Google的創始人拉里·佩奇和謝爾蓋·布林於1998年在斯坦福大學讀研究生期間發明的,是用於根據網頁間相互的超鏈接來計算網頁重要性的技術。該算法借鑑了學術界評判學術論文重要性的方法,即查看論文的被引用次數。基於以上想法,PageRank算法的核心思想是,認爲網頁重要性由兩部分組成:

① 如果一個網頁被大量其他網頁鏈接到說明這個網頁比較重要,即被鏈接網頁的數量;

② 如果一個網頁被排名很高的網頁鏈接說明這個網頁比較重要,即被鏈接網頁的權重。

2.2 TextRank算法

把文本拆分成詞彙作爲網絡節點,組成詞彙網絡圖模型,將詞語間的相似關係看成是一種推薦或投票關係,使其可以計算每一個詞語的重要性。

基於TextRank的文本關鍵詞抽取是利用局部詞彙關係,即共現窗口,對候選關鍵詞進行排序,該方法的步驟如下:

(1) 對文本D進行分詞、詞性標註和去除停用詞等數據預處理操作。本分採用結巴分詞,保留'n','nz','v','vd','vn','l','a','d'這幾個詞性的詞語,最終得到n個候選關鍵詞,即D=[t1,t2,…,tn] ;

(2) 構建候選關鍵詞圖G=(V,E),其中V爲節點集(由候選關鍵詞組成),並採用共現關係構造任兩點之間的邊,兩個節點之間僅當它們對應的詞彙在長度爲K的窗口中共現則存在邊,K表示窗口大小即最多共現K個詞彙;

(3) 根據公式迭代計算各節點的權重,直至收斂;

(4) 對節點權重進行倒序排列,得到排名前TopN個詞彙作爲文本關鍵詞。

說明:Jieba庫中包含jieba.analyse.textrank函數可直接實現TextRank算法,本文采用該函數進行實驗。

2.3 代碼實現:

基於TextRank方法實現文本關鍵詞抽取的代碼執行步驟如下:

(1)讀取樣本源文件sample_data.csv;

(2)獲取每行記錄的標題和摘要字段,並拼接這兩個字段;

(3)加載自定義停用詞表stopWord.txt;

(4)遍歷文本記錄,採用jieba.analyse.textrank函數篩選出指定詞性,以及topN個文本關鍵詞,並將結果存入數據框中;

(5)將最終結果寫入文件keys_TextRank.csv中。

 

 

3 基於Word2Vec詞聚類的文本關鍵詞抽取方法

3.1 Word2Vec詞向量表示

利用淺層神經網絡模型自動學習詞語在語料庫中的出現情況,把詞語嵌入到一個高維的空間中,通常在100-500維,在新的高維空間中詞語被表示爲詞向量的形式。

特徵詞向量的抽取是基於已經訓練好的詞向量模型,詞向量模型的訓練需要海量的語料才能達到較好的效果,而wiki中文語料是公認的大型中文語料。

3.2 K-means聚類算法

聚類算法旨在數據中發現數據對象之間的關係,將數據進行分組,使得組內的相似性儘可能的大,組間的相似性儘可能的小。

算法思想是:首先隨機選擇K個點作爲初始質心,K爲用戶指定的所期望的簇的個數,通過計算每個點到各個質心的距離,將每個點指派到最近的質心形成K個簇,然後根據指派到簇的點重新計算每個簇的質心,重複指派和更新質心的操作,直到簇不發生變化或達到最大的迭代次數則停止。 

3.3 Word2Vec詞聚類文本關鍵詞抽取方法

主要思路是對於用詞向量表示的文本詞語,通過K-Means算法對文章中的詞進行聚類,選擇聚類中心作爲文章的一個主要關鍵詞,計算其他詞與聚類中心的距離即相似度,選擇topN個距離聚類中心最近的詞作爲文本關鍵詞,而這個詞間相似度可用Word2Vec生成的向量計算得到。

假設Dn爲測試語料的大小,使用該方法進行文本關鍵詞抽取的步驟如下所示:

(1) 對Wiki中文語料進行Word2vec模型訓練,參考我的文章“利用Python實現wiki中文語料的word2vec模型構建”( http://www.jianshu.com/p/ec27062bd453 ),得到詞向量文件“wiki.zh.text.vector”;

(2) 對於給定的文本D進行分詞、詞性標註、去重和去除停用詞等數據預處理操作。本分採用結巴分詞,保留'n','nz','v','vd','vn','l','a','d'這幾個詞性的詞語,最終得到n個候選關鍵詞,即D=[t1,t2,…,tn] ;

(3) 遍歷候選關鍵詞,從詞向量文件中抽取候選關鍵詞的詞向量表示,即WV=[v1,v2,…,vm];

(4) 對候選關鍵詞進行K-Means聚類,得到各個類別的聚類中心;

(5) 計算各類別下,組內詞語與聚類中心的距離(歐幾里得距離),按聚類大小進行升序排序;

(6) 對候選關鍵詞計算結果得到排名前TopN個詞彙作爲文本關鍵詞。

步驟(4)中需要人爲給定聚類的個數,本文測試語料是新聞文本,因此只需聚爲1類,各位可根據自己的數據情況進行調整;步驟(5)中計算各詞語與聚類中心的距離,常見的方法有歐式距離和曼哈頓距離,本文采用的是歐式距離,計算公式如下:

3.4 代碼實現

第三方工具包Scikit-learn提供了K-Means聚類算法的相關函數,本文用到了sklearn.cluster.KMeans()函數執行K-Means算法,sklearn.decomposition.PCA()函數用於數據降維以便繪製圖形。

基於Word2Vec詞聚類方法實現文本關鍵詞抽取的代碼執行步驟如下:

(1)讀取樣本源文件sample_data.csv;

(2)獲取每行記錄的標題和摘要字段,並拼接這兩個字段;

(3)加載自定義停用詞表stopWord.txt,並對拼接的文本進行數據預處理操作,包括分詞、篩選出符合詞性的詞語、去重、去停用詞,形成列表存儲;

(4)讀取詞向量模型文件'wiki.zh.text.vector',從中抽取出所有候選關鍵詞的詞向量表示,存入文件中;

(5)讀取文本的詞向量表示文件,使用KMeans()函數得到聚類結果以及聚類中心的向量表示;

(6)採用歐式距離計算方法,計算得到每個詞語與聚類中心的距離;

(7)按照得到的距離升序排列,選取排名前topN個詞作爲文本關鍵詞,並寫入數據框中;

(8)將最終結果寫入文件keys_word2vec.csv中。

三種算法對比圖:

 4 結語

本文總結了三種常用的抽取文本關鍵詞的方法:TF-IDF、TextRank和Word2Vec詞向量聚類,並做了原理、流程以及代碼的詳細描述。因本文使用的測試語料較爲特殊且數量較少,未做相應的結果分析,根據觀察可以發現,得到的十個文本關鍵詞都包含有文本的主旨信息,其中TF-IDF和TextRank方法的結果較好,Word2Vec詞向量聚類方法的效果不佳,這與文獻[8]中的結論是一致的。文獻[8]中提到,對單文檔直接應用Word2Vec詞向量聚類方法時,選擇聚類中心作爲文本的關鍵詞本身就是不準確的,因此與其距離最近的N個詞語也不一定是關鍵詞,因此用這種方法得到的結果效果不佳;而TextRank方法是基於圖模型的排序算法,在單文檔關鍵詞抽取方面有較爲穩定的效果,因此較多的論文是在TextRank的方法上進行改進而提升關鍵詞抽取的準確率。

另外,本文的實驗目的主要在於講解三種方法的思路和流程,實驗過程中的某些細節仍然可以改進。例如Word2Vec模型訓練的原始語料可加入相應的專業性文本語料;標題文本往往包含文檔的重要信息,可對標題文本包含的詞語給予一定的初始權重;測試數據集可採集多個分類的長文本,與之對應的聚類算法KMeans()函數中的n_clusters參數就應當設置成分類的個數;根據文檔的分詞結果,去除掉所有文檔中都包含某一出現頻次超過指定閾值的詞語。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章