先說一下自動文摘的方法。自動文摘(Automatic Summarization)的方法主要有兩種:Extraction和Abstraction。其中Extraction是抽取式自動文摘方法,經過提取文檔中已存在的關鍵詞,句子造成摘要;Abstraction是生成式自動文摘方法,經過創建抽象的語意表示,使用天然語言生成技術,造成摘要。因爲生成式自動摘要方法須要複雜的天然語言理解和生成技術支持,應用領域受限。因此本人學習的也是抽取式的自動文摘方法。css
目前主要方法有:python
textrank算法web
TextRank算法基於PageRank,用於爲文本生成關鍵字和摘要。算法
PageRank最開始用來計算網頁的重要性。整個www能夠看做一張有向圖圖,節點是網頁。若是網頁A存在到網頁B的連接,那麼有一條從網頁A指向網頁B的有向邊。shell
構造完圖後,使用下面的公式:
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。
根據公式,須要將每一豎欄歸一化(每一個元素/元素之和),歸一化的結果是:
ui
結束\起始 | A | B | C |
A | 0 | 1 | 1 |
B | 0 | 0 | 0 |
C | 0 | 0 | 0 |
上面的結果構成矩陣M。咱們用matlab迭代100次看看最後每一個網頁的重要性:lua
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
運行結果(省略部分):
spa
......
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。
若是把上面的有向邊看做無向的(其實就是雙向的),那麼:
3d
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