抽取式文本摘要的提取

  • 一、基于词频统计实现本文自动文本摘要
  • (一)介绍
  • (二)实现步骤
  • (三)句子打分原理
  • (四)代码实现
  • 二、word2vec+textrank 提取文本摘要
  • (一)介绍
  • (二)word2vec参考
  • (三)TextRank算法
  • (四)word2vec+TextRank基本流程


一、基于词频统计实现本文自动文本摘要

(一)介绍

1、依据就是词频统计实现本文自动文本摘要提取
2、文章是由句子组成的,文章的信息都包含在句子中,有些句子包含的信息多,有些句子包含的信息少。
3、句子的信息量用"关键词"来衡量。如果包含的关键词越多,就说明这个句子越重要。
4、"自动摘要"就是要找出那些包含信息最多的句子,也就是包含关键字最多的句子
5、而通过统计句子中关键字的频率的大小,进而进行排序,通过对排序的词频列表对文档中句子逐个进行打分,进而把打分高的句子找出来,就是我们要的摘要。

(二)实现步骤

1、加载停用词
2、将文档拆分成句子列表
3、将句子列表分词
4、统计词频,取出100个最高的关键字
5、根据词频对句子列表进行打分
6、取出打分较高的前5个句子

(三)句子打分原理

这种方法最早出自1958年的IBM公司科学家H.P. Luhn的论文《The Automatic Creation of Literature Abstracts》。Luhn提出用"簇"(cluster)表示关键词的聚集。所谓"簇"就是包含多个关键词的句子片段。

NLPRI摘要提取 文本摘要提取_相似度


上图就是Luhn原始论文的插图,被框起来的部分就是一个"簇"。只要关键词之间的距离小于"门槛值",它们就被认为处于同一个簇之中。Luhn建议的门槛值是4或5。

也就是说,如果两个关键词之间有5个以上的其他词,就可以把这两个关键词分在两个簇。

簇重要性分值计算公式:

NLPRI摘要提取 文本摘要提取_相似度_02


以前图为例,其中的簇一共有7个词,其中4个是关键词。因此,它的重要性分值等于 ( 4 x 4 ) / 7 = 2.3。

然后,找出包含分值最高的簇的句子(比如前5句),把它们合在一起,就构成了这篇文章的自动摘要

(四)代码实现

参考:

二、word2vec+textrank 提取文本摘要

(一)介绍

刚刚提到用word2vec+textrank的方法生成文本摘要,首先需要了解word2vec这个深度学习的框架。简单的说word2vec的意思是word to vector,中文翻译过来把它叫做词向量,指的是用空间中的向量用来表示单词,它最初是由Tomas Mikolv提出的,具体请移步Tomas Mikolov, Kai Chen, Greg Corrado, and Jeffrey Dean. Efficient Estimation of Word Representations in Vector Space. In Proceedings of Workshop at ICLR, 2013.
后来google完成了这个项目,并将其开源。在NLP(Nature Language Processing)中,为了方便处理单词,需要将单词进行编码,也就是讲文字数字化,比较常用也比较令人容易接受的方法就是把一个单词表示成一个向量的形式。比如这里有十个单词:she,he,I,her,his,my…要将这十个单词表示成向量的形式很简单,比如说she可以用[1,0,0,0,0,0,0,0,0,0]来表示,he可以用[0,1,0,0,0,0,0,0,0,0]来表示。可是如果数量达到了一定程度,以亿计的单词用这种表示方法那肯定是极大的臃肿与恐怖。word2vec在此基础上用低维的向量来表示单词,一般为50维或100维,这种向量被表示成这个样子[0.11212,0.116545,0.878789,0.5644659,…]
常用的训练word2vec的模型有CBOW和Skip-Gram。具体模型介绍请看这里模型介绍,关于模型的原理和框架请移步这里模型原理。简单的说word2vec通过训练大量的数据集,这些数据集最好经过查重,去停用词处理,得到关于这些词的向量,并且这些向量存在某种联系,比如说词性相同,同义词,反义词都会被记录在这个模型中。笔者这里使用的是gensim的word2vec库,当然读者可以选择其他语言的,Python的操作会相对简单,

(二)word2vec参考

参考:

(三)TextRank算法

(四)word2vec+TextRank基本流程

(1)将article分句,装成一个链表。

(2)再将上述的链表中的每一句(sentence)分词,这里推荐jieba分词,当然最好去掉标点符号,以及一些停用词。得到一个二维的list。

(3)然后将每一个句子中的单词,分别于其它句子进行两两相似性计算。这里以向量的方式计算相似度:

这里提供一种计算句子相似性的方法:很多文献中有很多不同的方法,笔者还没有一一去试验。如计算句子A=[‘word’,‘you’,‘me’],与句子B=[‘sentence’,‘google’,‘python’]计算相似性,从word2vec模型中分别得到A中三个单词的词向量v1,v2,v3取其平均值Va(avg)=(v1+v2+v3)/3。对句子B做同样的处理得到Vb(avg),然后计算Va(avg)与Vb(avg)连个向量的夹角余弦值,Cosine Similarity视为句子A与B的相似度值。

NLPRI摘要提取 文本摘要提取_NLPRI摘要提取_03


(4)然后计算每一句的相对于另一句的分数,具体方式在上述的pagerank的算法中。

(5)迭代计算每一句的分数,重复迭代,直到分数的差值在0.0001下。

(6)排序上述得到的句子,取分数最高的topN。便是想要得到的句子。笔者在学习textrank算法时,有幸看到了下列文章,他们介绍这个算法更为详细,文章一: 文章二: