使用TextRank演算法為文字生成關鍵字和摘要

2021-08-01 12:02:43 字數 3944 閱讀 1546

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最重要。可以得到下面的表:

結束\起始ab

ca01

1b00

0c00

0 橫欄代表起始的節點,縱欄代表結束的節點。若兩個節點間有鏈結關係,對應的值為1。 

根據公式,需要將每一豎欄歸一化(每個元素/元素之和),歸一化的結果是: 

結束\起始ab

ca01

1b00

0c00

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

執行結果(省略部分):
......

950.4050

0.1500

0.1500

960.4050

0.1500

0.1500

970.4050

0.1500

0.1500

980.4050

0.1500

0.1500

990.4050

0.1500

0.1500

1000.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

執行結果(省略部分):
.....

981.4595

0.7703

0.7703

991.4595

0.7703

0.7703

1001.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等都是乙個視窗。在乙個視窗中的任兩個單詞對應的節點之間存在乙個無向無權的邊。

將每個句子看成圖中的乙個節點,若兩個句子之間有相似性,認為對應的兩個節點之間有乙個無向有權邊,權值是相似度。

通過pagerank演算法計算得到的重要性最高的若干句子可以當作摘要。

**中使用下面的公式計算兩個句子si和sj的相似度:

分子是在兩個句子中都出現的單詞的數量。|si|是句子i的單詞數。

由於是有權圖,pagerank公式略做修改:

因為要用測試多種情況,所以自己實現了乙個基於python 2.7的textrank針對中文文字的庫textrank4zh。位於:

下面是乙個例子:

#-*- encoding:utf-8 -*-

import codecs

from textrank4zh import textrank4keyword, textrank4sentence

text = codecs.open('./text/01.txt', 'r', 'utf-8').read()

tr4w = textrank4keyword(stop_words_file='./stopword.data') # 匯入停止詞

#使用詞性過濾,文字小寫,視窗為2

tr4w.train(text=text, speech_tag_filter=true, lower=true, window=2)

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')

# 使用詞性過濾,文字小寫,使用words_all_filters生成句子之間的相似性

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

snownlp

使用TextRank演算法為文字生成關鍵字和摘要

使用textrank演算法為文字生成關鍵字和摘要 textrank演算法基於pagerank,用於為文字生成關鍵字和摘要。其 是 mihalcea r,tarau p.textrank bringing order into texts c association for computational...

hanlp關鍵詞提取演算法TextRank

長句子 string content 程式設計師 英文programmer 是從事程式開發 維護的專業人員。一般將程式設計師分為程式設計人員和程式編碼人員,但兩者的界限並不非常清楚,特別是在中國。軟體從業人員分為初級程式設計師 高階程式設計師 系統 分析員和專案經理四大類。把content 通過乙個...

基於TextRank的關鍵詞提取演算法

pagerank是用來計算網頁重要性的,將每乙個網頁看作乙個節點,將網頁之間的鏈結看作是節點之間的有向邊,網頁的重要性取決於鏈結到它的網頁數量以及這些網頁的重要性。衡量網頁重要性的公式說明如下 什麼是共現關係呢?將文字進行分詞,去除停用詞或詞性篩選等之後,設定視窗長度為k,即最多只能出現k個詞,進行...