Text Summarization
英文原文
公众号【深度学习视觉】整理
自动文本摘要是在保持关键信息内容和整体含义的同时,生成简洁流畅的摘要的任务。
文本摘要目前大致可以分为两种类型:
Seq2Seq模型可以处理一切连续型信息,包括情感分类,机器翻译,命名实体识别等。
机器翻译任务中,输入是连续文本序列,输出也是连续文本序列。
命名实体识别中,输入是连续文本序列,输出是连续的标签信息。
所以,我们可以利用Seq2Seq模型,通过输入一段长文本,输出短的摘要,实现文本摘要功能。
下图是典型的Seq2Seq模型架构:
通常我们可以选择RNNs网络的变体GRU或者LSTM,这是因为它们能够通过克服梯度消失的问题来捕获长期依赖性。
LSTM中的Encoder读取整个输入序列,其中每个时间step上,都会有一个字输入编码器。然后,他在每个时间step上处理信息,并捕获输入序列中存在的上下文信息。
上一个时间step的隐藏层h1与记忆单元层c1将会用来初始化Decoder。
Decoder是LSTM结构的另一部分。它逐字读取整个目标序列,并以一个时间步长预测相同的序列偏移量。
解码器可以在给定前一个单词的情况下预测序列中的下一个单词。解码器的初始输入是编码器最后一步的结果。
在将整个目标序列放入解码器前,还需将[start] 与 [end]这两个特殊的tokens加入序列中,告知模型的开始与结束。模型通过输入的[start]开始预测第一个词,而[end]则表示整个句子的结束。
假设输入序列为[x1,x2,x3,x4],将其编码成内部固定长度的向量。
下图显示了每一个time step下Decoder是如何工作的。
下图是整个Encoder-Decode的结构。通过上面的理解,我觉得这个图非常清晰。
Encoder将整个输入序列转为固定的长度,但是当序列很长的时候,Encoder将会很难记住整个序列的内容,无法将所有必要信息准确的编码到固定长度。但是,我们需要关注序列中所有的内容么,不需要。
为了解决长句子的问题,注意力机制出现在人们的视野。注意力机制为对结果重要的部分添加高的权重,以保留主要信息。举个例子:
我们可以判断,y1[I]与x4[you]有关,而y2[love]则与x5[like]有关。所以,相比记住序列中的所有单词,不如增加对目标序列重要部分的权重,忽视低权重的部分。
编码器的隐藏层中,所有部分都参与attention的计算上下文。
编码器的隐藏层中,仅有部分参与attention的计算上下文。
本文最终采用全局注意力机制。(只是添加了注意力机制,编码的固定长度依然需要固定。所以实战中需要通过数据确定一个合适的长度数值。短了无法表达文本内容,长了会造成计算资源浪费。)
我们的目标是为亚马逊美食评论生成文本摘要。(这里我只提取了我觉得有用的部分)
这些评论通常很长而且具有可描述性。数据集下载:kaggleData。
数据涵盖了超过10年的时间,包括截至2012年10月的所有〜500,000条评论。这些评论包括产品,用户信息,评级,纯文本评论和摘要。它还包括来自所有其他亚马逊类别的评论。
由于评论文本和摘要中涉及的预处理步骤略有不同,因此我们需要定义两个不同的函数来预处理评论和摘要。
为摘要文本添加[start]和[end]。
通过数据统计,可以看到摘要与文本数据的长度分布。通过数据可视化,我们可以将评论文本的长度限定在80,而摘要的长度限定在10。
通过分词器生成词汇表,并将单词文本序列转为数值序列,方便计算机计算。
编码器为源文本序列每一个时间步j都生成了一个隐藏状态值hj。
相似的工作,解码器为目标文本每一个时间步i都生成了隐藏状态值si。
alignment score: e i j e_{ij} eij。用这个分数表示源文本中的第j步单词与目标文本中第i步单词的关联度。可以用hj与si来计算这个分数值 e i j = s c o r e ( s i , h j ) e_{ij} = score(s_i,h_j) eij=score(si,hj)
根据所使用的得分函数的类型,有不同类型的注意力机制。这里列举一些流行的注意力机制:
使用softmax函数对注意力参数的值进行归一化。 a i j = e i j ∑ k = 1 T e i k a_{ij}=\frac{e_{ij}}{\sum^{T}_{k=1}e_{ik}} aij=∑k=1Teikeij
计算注意力权重 a i j a_{ij} aij与编码器hj的隐藏状态乘积的线性总和,以产生注意力上下文向量Ci。 C i = ∑ j = 1 T a i j h i j C_{i} = \sum^T_{j=1}a_{ij}h_{ij} Ci=∑j=1Taijhij
将注意力上一下文向量Ci与目标隐藏层向量si级联以产生新的注意力隐藏层向量Si。 S i = c o n c a t e n a t e ( [ s i ; C i ] ) S_i=concatenate([s_{i};C_{i}]) Si=concatenate([si;Ci])
将注意力隐藏层向量传入密集层产生yi。 y i = d e n s e ( S i ) y_{i}=dense(S_{i}) yi=dense(Si)
本文由公众号【深度学习视觉】整理。