seq2seq和attention如何应用到文档自动摘要

文本自动摘要(Automatic Text Summarization)就是说在不改变文档原意的情况下,利用计算机程序自动地总结出文档的主要内容。自动摘要的应用场景非常多,例如新闻标题生成、科技文献摘要生成、搜索结果片段(snippets)生成、商品评论摘要等。在信息爆炸的互联网大数据时代,如果能用简短的文本来表达信息的主要内涵,无疑将有利于缓解信息过载问题。



概述

自动摘要可以从很多角度进行分类,例如单文档摘要/多文档摘要、单语言摘要/跨语言摘要等。从技术上说,普遍可以分为三类:

  • 抽取式摘要(extractive)

直接从原文中抽取一些句子组成摘要。本质上就是个排序问题,给每个句子打分,将高分句子摘出来,再做一些去冗余(方法是MMR)等。这种方式应用最广泛,因为比较简单。经典方法有LexRank和整数线性规划(ILP)。

LexRank是将文档中的每个句子都看作节点,句子之间的相似度看作节点之间的边的权重,构建一个graph;然后再计算每个节点的分数,这个打分的计算方式可以是度中心度(Degree centrality)、PageRank中心度等(论文里说这两种计算方式其实效果没有太大差别,文中用的ROUGE-1作为指标);这个方法的要点在于:不能每两个句子之间都有边,要设定一个阈值,只有相似度大于这个阈值才能有边,阈值太大则丢失太多信息,阈值太小则又引入了太多噪声。

  • 压缩式摘要(compressive)

有两种方式:一种是pipeline,先抽取出句子,再做句子压缩,或者先做句子压缩,再抽句子。另一种是jointly的方式,抽句子和压缩句子这两个过程是同时进行的。

句子压缩(Sentence compression)的经典方法是ILP:句子中的每个词都对应一个二值变量表示该词是否保留,并且每个词都有一个打分(比如tf-idf),目标函数就是最大化句子中的词的打分;既然是规划那当然要给出限制,最简单的限制比如说至少保留一个词,再比如说当形容词被保留时其修饰的词也要保留(根据parse tree)。

  • 理解式摘要(abstractive)

也叫产生式摘要,试图理解原文的意思,然后生成摘要,也就是像我们人做摘要那样来完成任务。

从是否有用户查询的角度来说,可以分为通用型摘要(generic)和基于用户查询的摘要(query-oriented),其中后者不仅要求生成的摘要应概括原文关键信息,还要尽可能与用户查询具有很高的相关性。

评价指标

首先可以是人工评价。目前来说,自动评价指标采用的是ROUGE,R是recall的意思,换句话说,这个指标基于摘要系统生成的摘要与参考摘要的n元短语重叠度:

摘要这个任务要求用短序列概括长序列,用召回率这样的计算思路可以反映出人工给出的参考摘要所列出的要点中有多少被包含在了机器生成的摘要中。这个指标用来应付抽取式摘要可能问题不大,但是由于其无法评价所生成摘要的语法和语义,而且倾向于长摘要,所以其实还应该继续探索更合理的指标来评价理解式摘要。此外,当然也可以计算基于precision的ROUGE,而且ROUGE还有ROUGE-L等多种版本;最常使用的是ROUGE-N的N取2的方式(也就是ROUGE-2)。评测工具的链接是这里(https://github.com/RxNLP/ROUGE-2.0)。

生成理解式摘要

前面简略介绍了一些概念(还差语料没介绍,后面实验中讲)。下面就开始介绍我精读的前两篇文章:

[1] A Neural Attention Model for Abstractive Sentence Summarization,2015EMNLP

[2] Abstractive Sentence Summarization with Attentive Recurrent Neural Networks,2016NAACL

第二篇文章是第一篇文章所做工作的延续。它们所试图解决的是句子级别摘要问题:输入新闻的第一句话,试图生成新闻标题。至于为什么是一句话,主要还是因为就目前来看神经网络还不能很好地处理太长的序列。

由于自动摘要和机器翻译都属于“序列到序列”这个类型(输入的是序列,输出也是序列;但必须注意翻译和摘要这两个问题是非常不同的),因此这两篇文章将神经机器翻译中广泛使用的encoder-decoder框架attention mechanism(注意力机制)引入到自动摘要问题,试图用这样一种fully data-driven的方式,端到端地训练出自动摘要模型。


首先简要介绍一些概念。

1. Sequence to sequence learning 与 encoder-decoder框架

如果只说“序列到序列”的话,那么词性标注(POS)其实也是这样的过程。但是它跟翻译、摘要显著不同的地方在于:在POS问题中,输入和输出是一一对应的,而翻译、摘要的输出序列与输入序列则没有显著的对应关系。所以如下图所示,POS问题可以用最右边的那个RNN结构来建模,每个时刻的输入与输出就是词与词性。相比之下,翻译、摘要这种则可以通过倒数第二张图那样的结构来解决,这个结构可以看作是encoder和decoder都是RNN的encoder-decoder框架。

图片来源:http://karpathy.github.io/2015/05/21/rnn-effectiveness/


encoder-decoder框架的工作机制是:先使用encoder,将输入编码到语义空间,得到一个固定维数的向量,这个向量就表示输入的语义;然后再使用decoder,将这个语义向量解码,获得所需要的输出,如果输出是文本的话,那么decoder通常就是语言模型。

这种机制的优缺点都很明显,优点:非常灵活,并不限制encoder、decoder使用何种神经网络,也不限制输入和输出的模态(例如image caption任务,输入是图像,输出是文本);而且这是一个端到端(end-to-end)的过程,将语义理解和语言生成合在了一起,而不是分开处理。缺点的话就是由于无论输入如何变化,encoder给出的都是一个固定维数的向量,存在信息损失;在生成文本时,生成每个词所用到的语义向量都是一样的,这显然有些过于简单。

2. attention mechanism 注意力机制

为了解决上面提到的问题,一种可行的方案是引入attention mechanism。所谓注意力机制,就是说在生成每个词的时候,对不同的输入词给予不同的关注权重。谷歌博客里介绍神经机器翻译系统时所给出的动图形象地展示了attention:

 

图片来源:https://research.googleblog.com/2016/09/a-neural-network-for-machine.html


[1] 中的一张图也展示了这一点:右侧序列是输入序列,上方序列是输出序列。输出序列的每个词都对应一个概率分布,这个概率分布决定了在生成这个词的时候,对于输入序列的各个词的关注程度。如图所示,看蓝色框起来的那一列,就是模型在生成joint这个词时的概率分布,颜色最深的地方对应的是输入的joint,说明模型在生成joint这个词时最为关注的输入词是joint。所谓attention,就是说生成每个词时都为这个词得到这个概率分布,进而可以使生成的词“更好”。

 

这种机制具体的实现方式将在讲论文的过程中介绍。概括来说就是一个data-driven的过程,从大规模的训练语料中学习出来.

实现

下面主要介绍文章[2] 。刚才已经说过,文章解决的是句子级别的摘要问题,输入是一个词序列:

每个词都是词表中的一个(记词表大小为 v,低频词将被标为UNK);输出也是一个词序列:

要求长度要短于输入。模型的目标就是下式:

y是随机变量,每个可能取值都是一个词序列。给定输入序列,生成某个输出序列的概率可以用下式建模:

所以现在的问题就变成了如何估计给定上文词时生成当前词yt的条件概率

换句话说,就是个训练语言模型的问题。模型训练没什么好说的,就是使用大规模的训练语料,语料的每个样本都是句子-摘要对儿:

训练方式就是用SGD来最小化负对数似然:

模型训练完成后,给定一个句子来生成摘要:由于每个词都有v种可能,如果每个长度为N个词的序列都计算一个概率再从中挑出最大的那个的话,代价太大。所以在生成摘要时采用的是beam search的方法:生成第一个词时只保留概率最大的K个词,然后生成第二个词时,从Kv个可能的二元短语里只保留概率最大的 k个;依次类推,每生成一个词时都只保留k个。可以看出这种剪枝操作大大缩小了搜索空间,如果 k = 1  ,就相当于是一种贪心的策略。beam search原先是统计机器翻译里缩小短语对译时的搜索空间的一种策略,这里把其中的思路借用了过来。

下面就介绍如何建模条件概率。

(1) decoder:RNN-based

这里建模条件概率时使用的是RNNLM。与传统的基于n-gram假设的语言模型不同,RNNLM最大的优势就是在t时刻生成一个词时可以利用到此前全部的上文信息,而不是只能利用此前n-1个时刻的信息。

d是隐层神经元个数,Ct就是当前时刻encoder的输出,decoder在每个时刻进行解码都将编码向量 Ct作为输入,而不是只在首个时刻引入。一个值得注意的地方是,本文给出的模型在计算Pt时,并没有显式输入yt-1,而只在计算隐状态 ht时输入了yt-1

由于attention机制的存在,每个时刻生成词时对输入序列各个词的关注程度是不一样的,所以encoder在每个时刻给出的输出Ct是不一样的,具体如何计算将在下面马上介绍。


另外,论文中也使用了带LSTM单元的RNN,但是实验部分中介绍道效果并不如最基本的RNN,可能的原因是复杂的模型招致了过拟合。

(note:在 [1] 中,decoder部分用的是2003年Bengio的那个NPLM模型。)

(2) encoder:CNN-based + attention



这篇文章使用下面的方式求取:



使用attention机制

用attention机制,生成基于用户查询的抽取式摘要:同时处理句子显著性与查询相关性。

下面介绍一篇抽取式摘要的文章,生成的是基于用户查询的摘要。

[3] AttSum: Joint Learning of Focusing and Summarization with Neural Attention,2016COLING


从这篇文章主要可以看到,attention不仅可以用在encoder-decoder的场景,只要是想把具有一定“对齐”关系(比如机器翻译里的源语言单词和目标语言单词的“对齐”)的两个东西联系起来的场景其实都可以用。

传统的方案是先对句子的显著性进行打分,再对句子和查询的相关性进行打分,二者组合得到最终打分。在计算句子和查询的相关性时,通常使用人工特征表示并计算相似度,实际上相似度不能度量相关性。

而这篇文章的核心idea是将两个打分合并在一起:首先将句子、查询都用CNN表示成向量,然后使用attention给出文档中的句子权重(这个权重反映的是句子向量和查询向量的相关性,用attention的方式来计算:用句子向量和查询向量中间夹一个矩阵的方式),然后基于此将句子向量加权得到文档向量,再计算文档向量和句子向量的相似度,给出句子打分。最后用MMR去冗余。此外,训练时采用了pairwise的方式(将正负样本结对,使这对样本的分差尽可能大),并且用的是hinge loss。如果去掉句子权重,也就是说用句子向量的平均值得到文档向量,那这个过程就相当于只对句子显著性进行了打分。

这篇文章说“相关性”不是“相似度”,然后用attention(从下面可以看到是双线性变换,就是两个向量中间夹一个矩阵把维度对齐)来计算“相关性”。但是我们回到双线性变换当作attention函数的一篇文章《A Thorough Examination of the CNN/Daily Mail Reading Comprehension Task》,人家在介绍双线性变换的部分明明说的是“which allows us to compute a similarity between q and p more flexibly than with just a dot product”,还是当做相似度的一种计算方式啊。

 

结论

总的来说,[1] [2] 用encoder-decoder做自动摘要主要沿袭了神经机器翻译的“模样”,是开创性的工作。但这两个任务其实有显著的不同:例如翻译是要尽可能不损失信息,而摘要是只保留最关键信息;翻译的输出序列长度正比于输入序列长度,而摘要的输出序列长度要短于输入序列长度;从遇到的问题来说,翻译中存在过翻、漏翻,而摘要则面临生成的词在语料中是罕见词等问题。因此,用于这两个任务的辅助机制既有共同点(如最小风险训练),更有区别(翻译有Coverage机制,摘要有CopyNet机制)。另外,做文摘的方法是五花八门的,比如强化学习。

参考资料: 

[1] A Neural Attention Model for Abstractive Sentence Summarization,2015EMNLP

[2] Abstractive Sentence Summarization with Attentive Recurrent Neural Networks,2016NAACL

[3] AttSum: Joint Learning of Focusing and Summarization with Neural Attention,2016COLING

[4] 《统计自然语言处理》

[5] http://rsarxiv.github.io/tags/自动文摘/

[6] https://github.com/lipiji/app-dl

[7] LexRank: Graph-based Lexical Centrality as Salience in Text Summarization,2004JAIR

如需转载请注明出处http://www.cnblogs.com/Determined22/

 近期热文

Tomas Mikolov论文简评:从Word2Vec到FastText

推荐 | 中文文本标注工具Chinese-Annotator

资源 | 2017年GitHub中Top 30开源机器学习项目

自然语言对话引擎(技术类)

分享 | 由0到1走入Kaggle-入门指导 (长文、干货)

常见文本相似度量方法总结

干货|免费文本语料训练数据集


佛系二维码

千千万万的公众号中

能被你识别就是缘分


长按识别二维码关注我们

  • 2
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值