NLP文字摘要-TextRank演算法簡介

語言: CN / TW / HK

在NLP中有一類任務是根據文章內容來生成摘要。這類任務到目前為止主要分為兩類:

  • 抽取型摘要:這種方法依賴於從文字中提取幾個部分,例如短語、句子,把它們堆疊起來建立摘要。因此,這種抽取型的方法最重要的是識別出適合總結文字的句子。
  • 抽樣型摘要:這種方法應用先進的NLP技術生成一篇全新的總結。可能總結中的文字甚至沒有在原文中出現。

而TextRank是一種從PageRank發展而來的抽取型摘要演算法。PageRank是一種圖演算法,主要用於對線上搜尋結果中的網頁進行排序,他根據是否有連結從其他網頁指向當前網頁來計算PageRank分數,並遵循以下兩點核心思想:

  • 如果一個網頁被很多其他網頁連結到的話說明這個網頁比較重要,也就是PageRank值會相對較高
  • 如果一個PageRank值很高的網頁連結到一個其他的網頁,那麼被連結到的網頁的PageRank值會相應地因此而提高

1. PageRank原理

在下面的公式中vjv_j表示連結到viv_i這個頁面的連結,In(vi)In(v_i)表示網頁viv_i所有入鏈的集合,Out(vj)Out(v_j)表示到頁面vjv_j指向其他網頁的集合,dd表示阻尼係數,用來克服後面公式的固有缺陷用,一般取0.85。所以S(vi)S(v_i)來表示當前頁面的PR(PageRank)值為:

S(vi)=(1d)+djIn(vi))1Out(vj)S(vj)S(v_i)=(1-d)+d\ast \sum_{j\in In(v_i))}^{}\frac{1}{\left | Out(v_j) \right |}S(v_j)

在所有的網頁都得到PR值之後進行排序就可以呈現在網頁內容的推薦上了。

2. TextRank原理

而根據PageRank而得來的TextRank值表示為:

WS(vi)=(1d)+dvjIn(vi))wjivkOut(vj)wjkWS(vj)WS(v_i)=(1-d)+d\ast \sum_{v_j\in In(v_i))}^{}\frac{w_ji}{\sum_{v_k\in Out(v_j)}^{}w_{jk}}WS(v_j)

如果用TextRank來進行關鍵詞提取的演算法為:

  1. 首先也是文字拆分和分詞和詞性標註處理。
  2. 構建候選關鍵詞圖G=(V,E)G=(V,E),其中VV為節點集,由候選管檢測組成,然後用共現關係構造任兩點之間的邊,兩個節點之間存在邊僅當它們對應的詞彙在長度為KK的視窗中共現,KK表示視窗短小,即最多共現KK個單詞。
  3. 根據上面公式,迭代傳播各節點的權重,只至收斂。
  4. 對節點權重進行倒序排序,從而得到最重要的TT個單詞,作為候選關鍵詞。
  5. 由上一步得到的最重要的TT個單詞,在原始文字中進行標記,若形成相鄰片語,則組合衝多詞關鍵詞。

而TextRank的生成摘要演算法在PageRank的基礎上,用句子代替網頁,把每個句子分別看做一個節點,如果兩個句子有相似性,那麼認為這兩個句子對應的節點之間存在一條無向有權邊,而句子的相似性方法是根據如下公式:

Similarity(Si,Sj)=wkwkSiwkSjlog(Si)+log(Sj)Similarity(S_i,S_j)=\frac{\left | {w_k |w_k\in S_i \cap w_k\in S_j} \right |}{\log(\left | S_i \right |)+\log(\left | S_j \right |)}

其中SiSjS_{i}S_{j}分別表示兩個句子,wkw_k表示句子中的詞,那麼分子部分的意思是同時出現在兩個句子中的同一個詞的個數,分母是對句子中詞的個輸球對數和。墳墓這樣的設計可以抑制較長的句子在相似度計算上的優勢。不過通常在構造完句子詞向量之後用餘弦相似度就可以計算。

其主要的流程如下圖。

textrank

  1. 首先把文章合成文字資料。
  2. 把文字分割成單個句子。
  3. 為每個句子找到詞向量表示。
  4. 計算句子向量間的相似性。
  5. 將相似性矩陣轉換為以句子為節點,相似性得分為邊的圖結構,用於句子TextRank計算。
  6. 最後一定數量的排名最高的句子構成最後的摘要。

3. TextRank的呼叫

python中有jieba以及textrank4zh這兩個庫可以來呼叫TextRank演算法,其中textrank4zh庫用法如下:

  • 尋找關鍵詞:

    from textrank4zh import TextRank4Keyword
      
    tr4w = TextRank4Keyword()
    tr4w.analyze(text=text, lower=True, window=3)
    print('關鍵詞:')
    for item in tr4w.get_keywords(20, word_min_len=2):
        # weight表示權重
        print(item.word, item.weight)
    複製程式碼

    其中analyze()中的text接受需要分析的文章,window表示單詞的最長界數,然後用.get_keywords()來計算排序後的關鍵詞,第一個引數表示最終輸出的關鍵詞個數,word_min_len表示關鍵詞的最短長度。

  • 尋找關鍵句(用於生成抽取型摘要):

    from textrank4zh import TextRank4Sentence
      
    tr4s = TextRank4Sentence()
    tr4s.analyze(text=text, lower=True, source='all_filters')
    print('摘要:')
    for item in tr4s.get_key_sentences(num=3):
    	# index是語句在文字中位置,weight表示權重
        print(item.index, item.weight, item.sentence)
    複製程式碼

    其中analyze()中的text接受需要分析的文章,source生成句子之間相似度得方法,然後用.get_key_sentences()來計算排序後的句子,nums表示最終輸出的關鍵句子個數。

參考資料