先說一下自動文摘的方法。自動文摘(Automatic Summarization)的方法主要有兩種:Extraction和Abstraction。其中Extraction是抽取式自動文摘方法,通過提取文檔中已存在的關鍵詞,句子形成摘要;Abstraction是生成式自動文摘方法,通過建立抽象的語意表示,使用自然語言生成技術,形成摘要。由於生成式自動摘要方法需要復雜的自然語言理解和生成技術支持,應用領域受限。所以本人學習的也是抽取式的自動文摘方法。
目前主要方法有:
- 基於統計:統計詞頻,位置等信息,計算句子權值,再簡選取權值高的句子作為文摘,特點:簡單易用,但對詞句的使用大多僅停留在表面信息。
- 基於圖模型:構建拓撲結構圖,對詞句進行排序。例如,TextRank/LexRank
- 基於潛在語義:使用主題模型,挖掘詞句隱藏信息。例如,采用LDA,HMM
- 基於整數規划:將文摘問題轉為整數線性規划,求全局最優解。
textrank算法
TextRank算法基於PageRank,用於為文本生成關鍵字和摘要。
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最重要。可以得到下面的表:
結束\起始 | A | B | C |
A | 0 | 1 | 1 |
B | 0 | 0 | 0 |
C | 0 | 0 | 0 |
橫欄代表其實的節點,縱欄代表結束的節點。若兩個節點間有鏈接關系,對應的值為1。
根據公式,需要將每一豎欄歸一化(每個元素/元素之和),歸一化的結果是:
結束\起始 | A | B | C |
A | 0 | 1 | 1 |
B | 0 | 0 | 0 |
C | 0 | 0 | 0 |
上面的結果構成矩陣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的重要性。
TextRank
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。
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源碼解析
1.讀入文本,並切詞,對切詞結果統計共現關系,窗口默認為5,保存大cm中
cm = defaultdict(int) #切詞 words = tuple(self.tokenizer.cut(sentence)) for i, wp in enumerate(words): #(enumerate枚舉的方式進行) #過濾詞性,停用詞等 if self.pairfilter(wp): for j in xrange(i + 1, i + self.span): if j >= len(words): break if not self.pairfilter(words[j]):#過濾 continue #保存到字典中 if allowPOS and withFlag: cm[(wp, words[j])] += 1 else: cm[(wp.word, words[j].word)] += 1