1. 程式人生 > >pyhanlp 提取關鍵詞、自動摘要、新詞識別

pyhanlp 提取關鍵詞、自動摘要、新詞識別

關鍵詞提取

  • 說明
    • 內部採用TextRankKeyword實現,使用者可以直接呼叫TextRankKeyword.getKeywordList(document, size)

部分內容如下

談起自動摘要演算法,常見的並且最易實現的當屬TF-IDF,但是感覺TF-IDF效果一般,不如TextRank好。

TextRank是在Google的PageRank演算法啟發下,針對文本里的句子設計的權重演算法,目標是自動摘要。它利用投票的原理,讓每一個單詞給它的鄰居(術語稱視窗)投贊成票,票的權重取決於自己的票數。這是一個“先有雞還是先有蛋”的悖論,PageRank採用矩陣迭代收斂的方式解決了這個悖論。TextRank也不例外:

PageRank的計算公式:

pagerank

正規的TextRank公式

正規的TextRank公式在PageRank的公式的基礎上,引入了邊的權值的概念,代表兩個句子的相似度:

textrank

但是很明顯我只想計算關鍵字,如果把一個單詞視為一個句子的話,那麼所有句子(單詞)構成的邊的權重都是0(沒有交集,沒有相似性),所以分子分母的權值w約掉了,演算法退化為PageRank。所以說,這裡稱關鍵字提取演算法為PageRank也不為過。

另外,如果你想提取關鍵句(自動摘要)的話,請參考姊妹篇《TextRank演算法自動摘要的Java實現》。

pyhanlp中的使用方法如下

from pyhanlp import *# 關鍵詞提取
content = ( "程式設計師(英文Programmer)是從事程式開發、維護的專業人員。" "一般將程式設計師分為程式設計人員和程式編碼人員," "但兩者的界限並不非常清楚,特別是在中國。" "軟體從業人員分為初級程式設計師、高階程式設計師、系統" "分析員和專案經理四大類。") TextRankKeyword = JClass("com.hankcs.hanlp.summary.TextRankKeyword") keyword_list = HanLP.extractKeyword(content, 5) print(keyword_list)
# 新詞識別,此處沒什麼用,文字太短。之後會在案例中使用 # newword_list = HanLP.extractWords(content, 5) # print(newword_list)
[程式設計師, 人員, 程式, 分為, 開發]

自動摘要

  • 說明
    • 內部採用TextRankSentence實現,使用者可以直接呼叫TextRankSentence.getTopSentenceList(document, size)

原文部分內容

所謂自動摘要,就是從文章中自動抽取關鍵句。何謂關鍵句?人類的理解是能夠概括文章中心的句子,機器的理解只能模擬人類的理解,即擬定一個權重的評分標準,給每個句子打分,之後給出排名靠前的幾個句子。

TextRank公式

TextRank的打分思想依然是從PageRank的迭代思想衍生過來的,如下公式所示:

textrank

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

求和的分母wji表示兩個句子的相似程度,分母又是一個weight_sum,而WS(Vj)代表上次迭代j的權重。整個公式是一個迭代的過程。

相似程度的計算

而相似程度wji的計算,推薦使用BM25

BM25演算法,通常用來作搜尋相關性平分。一句話概況其主要思想:對Query進行語素解析,生成語素qi;然後,對於每個搜尋結果D,計算每個語素qi與D的相關性得分,最後,將qi相對於D的相關性得分進行加權求和,從而得到Query與D的相關性得分。

pyhanlp中使用自動摘要

# 自動摘要

document = '''水利部水資源司司長陳明忠9月29日在國務院新聞辦舉行的新聞釋出會上透露,
    根據剛剛完成了水資源管理制度的考核,有部分省接近了紅線的指標,
    有部分省超過紅線的指標。對一些超過紅線的地方,陳明忠表示,對一些取用水專案進行區域的限批,
    嚴格地進行水資源論證和取水許可的批准。
     '''

TextRankSentence = JClass("com.hankcs.hanlp.summary.TextRankSentence")
sentence_list = HanLP.extractSummary(document, 3)
print(sentence_list)

sentence_list = HanLP.extractSummary(document, 2)
print(sentence_list)

sentence_list = HanLP.extractSummary(document, 1)
print(sentence_list)

sentence_list = HanLP.getSummary(document, 50)
print(sentence_list)

sentence_list = HanLP.getSummary(document, 30)
print(sentence_list)

sentence_list = HanLP.getSummary(document, 20)
print(sentence_list)
[嚴格地進行水資源論證和取水許可的批准, 有部分省超過紅線的指標, 水利部水資源司司長陳明忠9月29日在國務院新聞辦舉行的新聞釋出會上透露]
[嚴格地進行水資源論證和取水許可的批准, 有部分省超過紅線的指標]
[嚴格地進行水資源論證和取水許可的批准]
水利部水資源司司長陳明忠9月29日在國務院新聞辦舉行的新聞釋出會上透露。有部分省超過紅線的指標。
有部分省超過紅線的指標。嚴格地進行水資源論證和取水許可的批准。
有部分省超過紅線的指標。