中文自动摘要textrank算法

yahoo以3000万美元的价格收购了summly的消息传出来之后,貌似大家都比变的对自动摘要产生了极大的兴趣,关于自导摘要wiki这里有很详细的介绍,一般自动摘要比较常用的一个是摘取文章中的关键词,另一个则是摘取文章中的关键的句子,在这里我主要是介绍用textrank算法来搞句子的摘取。
相对于textrank,摘取关键句子还有一些比较简单的算法,比如这篇,我们可以把句子分别和整篇文章做比较,相似性最大的就是关键的句子。而textrank其实就是pagerank算法扩展到句子上,来的到一些全局的信息。textrank的论文在这里。

首先我们看pagerank算法,就是google用的那个网页排序的pagerank算法,首先网页之间都是有超链接链接的,如果某个网站A有指向B的超链接,说明A网站认为B网站是有价值的,于是相应的我们可以给B来提升权重,但是就像现实中,一般人的意见和专家的意见的权重是不一样的,所以如果网站A的权重比较高,那么就可以贡献更多的权重给B,反之则贡献更少的权重,然后算法经过一轮轮的迭代,所有结点的权重会收敛,就得到了最终的权重了。然后我们有pagerank的计算公式,其中d是阻尼系数。

score(Vi)=(1−d)+d∗∑1∣∣out(Vj)∣∣∗score(Vj)

换到textrank,对于pagerank而言,边是没有权值的,而textrank的边是有权值的,表示两个句子的相似性,这个权值可以用Jaccard similarity coefficient就是交集数目除以并集数目,或者cosine的余弦夹角,或者是bm25一类的算法。在边有了权值之后,textrank的公式变为这个样子。

score(Vi)=(1−d)+d∗∑weight(j,i)∑weight(j,k)∗score(Vj)

论文里显示带了权重之后收敛会慢一些,在经过若干轮的迭代之后,我们就可以得到每个句子的权重了,然后我们取出权重最大的几个就认为是文章的关键句子了。

自己实现了一份以bm25为相似性的textrank算法,代码在github上,具体可以看代码,test.py展示了摘要的提取。同时这个项目实现了一些常用的操作,比如繁体转简体,中文的分词和词性标注等,欢迎试用提pull requests啊!

 

参考文章:

http://en.wikipedia.org/wiki/Automatic_summarization

Build your own summary tool!

http://acl.ldc.upenn.edu/acl2004/emnlp/pdf/Mihalcea.pdf

原文:https://github.com/isnowfy/snownlp

Leave a Reply