(纯属为了记录自己学习的点滴过程,引用资料都附在参考列表)
1 基本概念
关键句提取
在一些场合,关键词或关键短语依然显得碎片化,不足以表达完整的主题。这时通常提取中心句子作为文章的简短摘要。
2 问题
关键句提取;
3 解决思路
基本思想:
由于一篇文章中几乎不可能出现相同的两个句子,所以朴素的 PageRank 在句子颗粒度上行不通。为了将 PageRank 利用到句子颗粒度上去,我们引人 BM25 算法衡量句子的相似度,改进链接的权重计算。这样窗口的中心句与相邻的句子间的链接变得有强有弱,相似的句子将得到更高的投票。而文章的中心句往往与其他解释说明的句子存在较高的相似性,这恰好为算法提供了落脚点。
BM25:
BM25(D,Q)=∑i=1nIDF(qi)⋅TF(qi,D)⋅(k1+1)TF(qi,D)+k1⋅(1−b+b⋅∣D∣avgDL)BM25(D, Q)=\sum_{i=1}^n IDF(q_i) \cdot \frac{TF(q_i,D) \cdot (k_1+1)}{TF(q_i,D)+k_1 \cdot (1 - b + b \cdot \frac{|D|}{avgDL})}BM25(D,Q)=∑i=1nIDF(qi)⋅TF(qi,D)+k1⋅(1−b+b⋅avgDL∣D∣)TF(qi,D)⋅(k1+1)
有了BM25算法之后,将一个句子视作查询语句,相邻的句子视作待查询的文档,就能得到它们之间的相似度。以此相似度作为 PageRank 中的链接的权重,于是得到一种改进算法,称为TextRank。它的形式化计算方法如下:
WS(Vi)=(1−d)+d×∑Vj∈In(Vj)BM25(Vi,Vj)∑Vk∈Out(Vj)BM25(Vk,Vj)WS(Vj)WS(V_i)=(1-d)+d \times \sum_{V_j \in In(V_j)} \frac{BM25(V_i, V_j)}{\sum_{V_k \in Out(V_j)} BM25(V_k, V_j)} WS(V_j)WS(Vi)=(1−d)+d×∑Vj∈In(Vj)∑Vk∈Out(Vj)BM25(Vk,Vj)BM25(Vi,Vj)WS(Vj)
其中,WS(Vi) 就是文档中第 i 个句子的得分,重复迭代该表达式若干次之后得到最终的分值,排序后输出前 N 个即得到关键句。另外,由于文档中句子的数量远远小于单词的数量,并且句子几乎不重复,所以通常不再取窗口,而认为所有的句子都是相邻的。
4 实现
from pyhanlp import *"""自动摘要"""
document = '''水利部水资源司司长陈明忠9月29日在国务院新闻办举行的新闻发布会上透露,
根据刚刚完成了水资源管理制度的考核,有部分省接近了红线的指标,
有部分省超过红线的指标。对一些超过红线的地方,陈明忠表示,对一些取用水项目进行区域的限批,
严格地进行水资源论证和取水许可的批准。'''TextRankSentence = JClass("com.hankcs.hanlp.summary.TextRankSentence")
sentence_list = HanLP.extractSummary(document, 3)
print(sentence_list)
运行结果:
[严格地进行水资源论证和取水许可的批准,水利部水资源司司长陈明忠9月29日在国务院新闻办举行的新闻发布会上透露,有部分省超过红线的指标]
5 参考文献
- 何晗《自然语言处理入门》;
- 宗成庆《统计自然语言处理》;
- 李航《统计学习方法》;
6 需要解决的问题
- 理解PageRank算法本身及系列变形的数学细节;