1. 程式人生 > >textrank演算法原理與提取關鍵詞、自動提取摘要PYTHON

textrank演算法原理與提取關鍵詞、自動提取摘要PYTHON

首先介紹原理與概念

TextRank 演算法是一種用於文字的基於圖的排序演算法。其基本思想來源於谷歌的 PageRank演算法(其原理在本文在下面), 通過把文字分割成若干組成單元(單詞、句子)並建立圖模型, 利用投票機制對文字中的重要成分進行排序, 僅利用單篇文件本身的資訊即可實現關鍵詞提取、文摘。和 LDA、HMM 等模型不同, TextRank不需要事先對多篇文件進行學習訓練, 因其簡潔有效而得到廣泛應用。

TextRank 一般模型可以表示為一個有向有權圖 G =(V, E), 由點集合 V和邊集合 E 組成, E 是V ×V的子集。圖中任兩點 Vi , Vj 之間邊的權重為 wji , 對於一個給定的點 Vi, In(Vi) 為 指 向 該 點 的 點 集 合 , Out(Vi) 為點 Vi 指向的點集合。點 Vi 的得分定義如下:

 這裡寫圖片描述

  其中, d 為阻尼係數, 取值範圍為 0 到 1, 代表從圖中某一特定點指向其他任意點的概率, 一般取值為 0.85。使用TextRank 演算法計算圖中各點的得分時, 需要給圖中的點指定任意的初值, 並遞迴計算直到收斂, 即圖中任意一點的誤差率小於給定的極限值時就可以達到收斂, 一般該極限值取 0.0001。
  舉個例子:
  這裡寫圖片描述
  上圖表示了三張網頁之間的連結關係,直覺上網頁A最重要。可以得到下面的表:這裡寫圖片描述
  橫欄代表其實的節點,縱欄代表結束的節點。若兩個節點間有連結關係,對應的值為1。根據公式,需要將每一豎欄歸一化(每個元素/元素之和),歸一化的結果是:
這裡寫圖片描述
上面的結果構成矩陣M。我們用matlab迭代100次看看最後每個網頁的重要性:

M = [0 1 1 
     0 0 0
     0 0 0];
PR = [1; 1 ; 1];
for iter = 1:100
    PR = 0.15 + 0.85*M*PR;
    disp(iter);
    disp(PR);
end

執行結果(省略部分

   97---
    0.4050
    0.1500
    0.1500
    98---
    0.4050
    0.1500
    0.1500
    99---
    0.4050
    0.1500
    0.1500
    100---
    0.4050
    0.1500
    0.1500

最終A的PR值為0.4050,B和C的PR值為0.1500
如果把上面的有向邊看作無向的(其實就是雙向的),那麼:

M = [0 1 1 
    0.5 0 0
    0.5 0 0];

PR = [1; 1 ; 1];

for iter = 1:100
    PR = 0.15 + 0.85*M*PR;
    disp(iter);
    disp(PR);
end

執行結果(省略部分):

.....
    98
    1.4595
    0.7703
    0.7703
    99
    1.4595
    0.7703
    0.7703
   100
    1.4595
    0.7703
    0.7703

依然能判斷出A、B、C的重要性。

  1. 基於TextRank的關鍵詞提取

      關鍵詞抽取的任務就是從一段給定的文字中自動抽取出若干有意義的詞語或片語。TextRank演算法是利用區域性詞彙之間關係(共現視窗)對後續關鍵詞進行排序,直接從文字本身抽取。其主要步驟如下:

      (1)把給定的文字T按照完整句子進行分割,即

      (2)對於每個句子,進行分詞和詞性標註處理,並過濾掉停用詞,只保留指定詞性的單詞,如名詞、動詞、形容詞,即,其中是保留後的候選關鍵詞。

      (3)構建候選關鍵詞圖G = (V,E),其中V為節點集,由(2)生成的候選關鍵片語成,然後採用共現關係(co-occurrence)構造任兩點之間的邊,兩個節點之間存在邊僅當它們對應的詞彙在長度為K的視窗中共現,K表示視窗大小,即最多共現K個單詞。

      (4)根據上面公式,迭代傳播各節點的權重,直至收斂。

      (5)對節點權重進行倒序排序,從而得到最重要的T個單詞,作為候選關鍵詞。

      (6)由(5)得到最重要的T個單詞,在原始文字中進行標記,若形成相鄰片語,則組合成多詞關鍵詞。例如,文字中有句子“Matlab code for plotting ambiguity function”,如果“Matlab”和“code”均屬於候選關鍵詞,則組合成“Matlab code”加入關鍵詞序列。
    TextRank的Java實現

原理思路整理:

程式設計師(英文Programmer)是從事程式開發、維護的專業人員。一般將程式設計師分為程式設計人員和程式編碼人員,但兩者的界限並不非常清楚,特別是在中國。軟體從業人員分為初級程式設計師、高階程式設計師、系統分析員和專案經理四大類。
我取出了百度百科關於“程式設計師”的定義作為測試用例,很明顯,這段定義的關鍵字應當是“程式設計師”並且“程式設計師”的得分應當最高。

首先對這句話分詞,這裡可以藉助各種分詞專案,比如HanLP分詞,得出分詞結果:

[程式設計師/n, (, 英文/nz, programmer/en, ), 是/v, 從事/v, 程式/n, 開發/v, 、/w, 維護/v, 的/uj, 專業/n, 人員/n, 。/w, 一般/a, 將/d, 程式設計師/n, 分為/v, 程式/n, 設計/vn, 人員/n, 和/c, 程式/n, 編碼/n, 人員/n, ,/w, 但/c, 兩者/r, 的/uj, 界限/n, 並/c, 不/d, 非常/d, 清楚/a, ,/w, 特別/d, 是/v, 在/p, 中國/ns, 。/w, 軟體/n, 從業/b, 人員/n, 分為/v, 初級/b, 程式設計師/n, 、/w, 高階/a, 程式設計師/n, 、/w, 系統/n, 分析員/n, 和/c, 專案/n, 經理/n, 四/m, 大/a, 類/q, 。/w]
然後去掉裡面的停用詞,這裡我去掉了標點符號、常用詞、以及“名詞、動詞、形容詞、副詞之外的詞”。得出實際有用的詞語:

[程式設計師, 英文, 程式, 開發, 維護, 專業, 人員, 程式設計師, 分為, 程式, 設計, 人員, 程式, 編碼, 人員, 界限, 特別, 中國, 軟體, 人員, 分為, 程式設計師, 高階, 程式設計師, 系統, 分析員, 專案, 經理]
之後建立兩個大小為5的視窗,每個單詞將票投給它身前身後距離5以內的單詞:

{開發=[專業, 程式設計師, 維護, 英文, 程式, 人員],
 軟體=[程式設計師, 分為, 界限, 高階, 中國, 特別, 人員],
 程式設計師=[開發, 軟體, 分析員, 維護, 系統, 專案, 經理, 分為, 英文, 程式, 專業, 設計, 高階, 人員, 中國],
 分析員=[程式設計師, 系統, 專案, 經理, 高階],
 維護=[專業, 開發, 程式設計師, 分為, 英文, 程式, 人員],
 系統=[程式設計師, 分析員, 專案, 經理, 分為, 高階],
 專案=[程式設計師, 分析員, 系統, 經理, 高階],
 經理=[程式設計師, 分析員, 系統, 專案],
 分為=[專業, 軟體, 設計, 程式設計師, 維護, 系統, 高階, 程式, 中國, 特別, 人員],
 英文=[專業, 開發, 程式設計師, 維護, 程式],
 程式=[專業, 開發, 設計, 程式設計師, 編碼, 維護, 界限, 分為, 英文, 特別, 人員],
 特別=[軟體, 編碼, 分為, 界限, 程式, 中國, 人員],
 專業=[開發, 程式設計師, 維護, 分為, 英文, 程式, 人員],
 設計=[程式設計師, 編碼, 分為, 程式, 人員],
 編碼=[設計, 界限, 程式, 中國, 特別, 人員],
 界限=[軟體, 編碼, 程式, 中國, 特別, 人員],
 高階=[程式設計師, 軟體, 分析員, 系統, 專案, 分為, 人員],
 中國=[程式設計師, 軟體, 編碼, 分為, 界限, 特別, 人員],
 人員=[開發, 程式設計師, 軟體, 維護, 分為, 程式, 特別, 專業, 設計, 編碼, 界限, 高階, 中國]}

2. 基於TextRank的自動文摘

  基於TextRank的自動文摘屬於自動摘錄,通過選取文字中重要度較高的句子形成文摘,其主要步驟如下:

  (1)預處理:將輸入的文字或文字集的內容分割成句子得這裡寫圖片描述,構建圖G =(V,E),其中V為句子集,對句子進行分詞、去除停止詞,得這裡寫圖片描述,其中這裡寫圖片描述是保留後的候選關鍵詞。

  (2)句子相似度計算:構建圖G中的邊集E,基於句子間的內容覆蓋率,給定兩個句子這裡寫圖片描述,採用如下公式進行計算:
這裡寫圖片描述
  若兩個句子之間的相似度大於給定的閾值,就認為這兩個句子語義相關並將它們連線起來,即邊的權值;這裡寫圖片描述

  (3)句子權重計算:根據公式,迭代傳播權重計算各句子的得分;

  (4)抽取文摘句:將(3)得到的句子得分進行倒序排序,抽取重要度最高的T個句子作為候選文摘句。

  (5)形成文摘:根據字數或句子數要求,從候選文摘句中抽取句子組成文摘。
三. 其它

  分析研究可知,相似度的計算方法好壞,決定了關鍵詞和句子的重要度排序,如果在相似度計算問題上有更好的解決方案,那麼結果也會更加有效。其它計算相似度的方法有:基於編輯距離,基於語義詞典,餘弦相似度等。這裡不一一描述。

最後附錄:pagerank演算法原理
這裡寫圖片描述