TextRank算法基於PageRank,用於為文本生成關鍵字和摘要。其論文是:
Mihalcea R, Tarau P. TextRank: Bringing order into texts[C]. Association for Computational Linguistics, 2004.
在淺入淺出:PageRank算法這篇博客中我做過簡要的介紹,這裡再補充一下。
PageRank最開始用來計算網頁的重要性。整個www可以看作一張有向圖圖,節點是網頁。如果網頁A存在到網頁B的連結,那麼有一條從網頁A指向網頁B的有向邊。
構造完圖後,使用下面的公式:
S(Vi)是網頁i的中重要性(PR值)。d是阻尼係數,一般設置為0.85。In(Vi)是存在指向網頁i的連結的網頁集合。Out(Vj)是網頁j中的連結存在的連結指向的網頁的集合。|Out(Vj)|是集合中元素的個數。
PageRank需要使用上面的公式多次迭代才能得到結果。初始時,可以設置每個網頁的重要性為1。上面公式等號左邊計算的結果是迭代後網頁i的PR值,等號右邊用到的PR值全是迭代前的。
舉個例子:
上圖表示了三張網頁之間的連結關係,直覺上網頁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
運行結果(省略部分):
. 95 0.4050 0.1500 0.1500 96 0.4050 0.1500 0.1500 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的重要性。
將原文本拆分為句子,在每個句子中過濾掉停用詞(可選),並只保留指定詞性的單詞(可選)。由此可以得到句子的集合和單詞的集合。
每個單詞作為pagerank中的一個節點。設定窗口大小為k,假設一個句子依次由下面的單詞組成:
w1,w2,w3,w4,w5,...,wn
[w1,w2,...,wk]、[w2,w3,...,wk+1]、[w3,w4,...,wk+2]等都是一個窗口。在一個窗口中的任兩個單詞對應的節點之間存在一個無向無權的邊。
基於上面構成圖,可以計算出每個單詞節點的重要性。最重要的若干單詞可以作為關鍵詞。
參照「使用TextRank提取關鍵詞」提取出若干關鍵詞。若原文本中存在若干個關鍵詞相鄰的情況,那麼這些關鍵詞可以構成一個關鍵短語。
例如,在一篇介紹「支持向量機」的文章中,可以找到三個關鍵詞支持、向量、機,通過關鍵短語提取,可以得到支持向量機。
使用TextRank提取摘要
將每個句子看成圖中的一個節點,若兩個句子之間有相似性,認為對應的兩個節點之間有一個無向有權邊,權值是相似度。
通過pagerank算法計算得到的重要性最高的若干句子可以當作摘要。
論文中使用下面的公式計算兩個句子Si和Sj的相似度:
分子是在兩個句子中都出現的單詞的數量。|Si|是句子i的單詞數。
由於是有權圖,PageRank公式略做修改:
因為要用測試多種情況,所以自己實現了一個基於Python 2.7的TextRank針對中文文本的庫TextRank4ZH。位於:
https://github.com/someus/TextRank4ZH
下面是一個例子:
import codecs from textrank4zh import TextRank4Keyword, TextRank4Sentencetext = codecs.open('./text/01.txt', 'r', 'utf-8').read() tr4w = TextRank4Keyword(stop_words_file='./stopword.data') tr4w.train(text=text, speech_tag_filter=True, lower=True, window=2) print '關鍵詞:' print '/'.join(tr4w.get_keywords(20, word_min_len=1)) print '關鍵短語:' print '/'.join(tr4w.get_keyphrases(keywords_num=20, min_occur_num= 2)) tr4s = TextRank4Sentence(stop_words_file='./stopword.data')tr4s.train(text=text, speech_tag_filter=True, lower=True, source = 'all_filters')print '摘要:' print '\n'.join(tr4s.get_key_sentences(num=3))
運行結果如下:
關鍵詞:媒體/高圓圓/微/賓客/趙又廷/答謝/謝娜/現身/記者/新人/北京/博/展示/捧場/禮物/張杰/當晚/戴/酒店/外套關鍵短語:微博摘要:中新網北京12月1日電(記者 張曦) 30日晚,高圓圓和趙又廷在京舉行答謝宴,諸多明星現身捧場,其中包括張杰(微博)、謝娜(微博)夫婦、何炅(微博)、蔡康永(微博)、徐克、張凱麗、黃軒(微博)等高圓圓身穿粉色外套,看到大批記者在場露出嬌羞神色,趙又廷則戴著鴨舌帽,十分淡定,兩人快步走進電梯,未接受媒體採訪記者了解到,出席高圓圓、趙又廷答謝宴的賓客近百人,其中不少都是女方的高中同學
另外, jieba分詞提供的基於TextRank的關鍵詞提取工具。 snownlp也實現了關鍵詞提取和摘要生成。
文章出處:http://www.letiantian.me/2014-12-01-text-rank/
—————————————————
數盟網站:www.dataunion.org
數盟微博:@數盟社區
數盟微信:DataScientistUnion
數盟【大數據群】272089418
數盟【數據可視化群】 179287077
數盟【數據分析群】 110875722
—————————————————
點擊閱讀原文,更多精彩技術、資訊內容~