TextRank 文本摘要抽取

TextRank是受到Google的PageRank的啓發,通過把文本分割成若干組成單元(單詞、句子)並建立圖模型, 利用投票機制對文本中的重要成分進行排序, 僅利用單篇文檔本身的信息即可實現關鍵詞提取、文本摘要抽取。

PageRank

PageRank是用來標識網頁的等級、 重要性的一種方法, 是衡量一個網頁的重要指標。PageRank 算法提出之前, 已經有人提出使用網頁的入鏈數量進行鏈接分析, 但是PageRank算法除了考慮入鏈數量之外, 還參考了網頁質量因素, 通過組合入鏈數量和網頁質量因素兩個指標, 使得網頁重要性的評價更加準確。

PageRank計算公式


S(V_{i})是網頁i的中重要性(PR值)。d是阻尼係數,一般設置爲0.85。In(V_{i})是存在指向網頁i的鏈接的網頁集合。Out(V_{j})是網頁j中的鏈接存在的鏈接指向的網頁的集合。|Out(V_{j})|是集合中元素的個數。

TextRank

TextRank 提取關鍵字

將原文本拆分爲句子,在每個句子中過濾掉停用詞(可選),並只保留指定詞性的單詞(可選)。由此可以得到句子的集合和單詞的集合。

每個單詞作爲pagerank中的一個節點。設定窗口大小爲kk,假設一個句子依次由下面的單詞組成:w_{1}, w_{2}, w_{3},...,w_{m} 。

[w_{1},w_{2},...,w_{k}], [w_{2},w_{3},...,w_{k+1}], [w_{3},w_{4},...,w_{k+2}]  等都是一個窗口。在一個窗口中的任兩個單詞對應的節點之間存在一個無向無權的邊。

基於上面構成圖,可以計算出每個單詞節點的重要性。最重要的若干單詞可以作爲關鍵詞。

 

TextRank 提取摘要

  • 句子節點的權值更新公式:

  • 句子相似度:

等式左邊表示一個句子的權重(WS 是 weight_sum 的縮寫),右側的求和表示每個相鄰句子對本句子的貢獻程度。與提取關鍵字的時候不同,一般認爲全部句子都是相鄰的,不再通過窗口提取。

邊的權值 w_{ij} 代表句子 S_{i}S_{j}的相似度,既可以使用上面介紹過的基於句子間內容覆蓋率的方法計算,也可以使用基於編輯距離,基於語義詞典,餘弦相似度,BM25 算法等等。

因爲我們是要抽取關鍵句,因而是以句子爲基本單位。使用 TextRank 提取摘要的整個過程如下:

  1. 預處理:將文本分割成句子S_{1}, S_{2},...,S_{m}以句子爲節點構建圖。
  2. 計算句子相似度:對句子進行分詞、取停用詞等處理,以便於計算任意兩個句子之間的相似度。將計算好的句子相似度作爲兩個句子構成的邊的權值。
  3. 句子權重:根據公式,迭代傳播權重計算各句子的得分。
  4. 抽取文摘句:得到的句子得分進行倒序排序,抽取重要度最高的 N 個句子作爲候選文摘句。
  5. 形成文摘:根據字數或句子數要求,從候選文摘句中抽取句子組成文摘。

Python實現TextRank

# -*- 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 '關鍵詞:'
# 20個關鍵詞且每個的長度最小爲1
print '/'.join(tr4w.get_keywords(20, word_min_len=1))  

print '關鍵短語:'
# 20個關鍵詞去構造短語,短語在原文本中出現次數最少爲2
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)) # 重要性最高的三個句子

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章