【天然语言处理】Text Summarization文本摘要与注意力机制

Text Summarization
英文原文
公众号【深度学习视觉】整理html

什么是NLP中的文本摘要

自动文本摘要是在保持关键信息内容和总体含义的同时,生成简洁流畅的摘要的任务。
文本摘要目前大体能够分为两种类型:python

  1. Extractive Summarization:重要内容、语句提取。
  2. Abstractive Summarization:文本总结。

Extractive Summarization

由图能够看出,这种方法提取的内容语句来自于原文。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LHghTQ9m-1584188586036)(images/ExtractiveSummarization.jpg)]web

Abstractive Summarization

由图能够看出,这种方法提取的内容语句可能不存在于原文。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7p1MFbCb-1584188586038)(images/AbstractiveSummarization.jpg)]网络

Seq2Seq模型

Seq2Seq模型能够处理一切连续型信息,包括情感分类,机器翻译,命名实体识别等。
机器翻译任务中,输入是连续文本序列,输出也是连续文本序列。
命名实体识别中,输入是连续文本序列,输出是连续的标签信息。
因此,咱们能够利用Seq2Seq模型,经过输入一段长文本,输出短的摘要,实现文本摘要功能。
下图是典型的Seq2Seq模型架构:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-a3IPXmII-1584188586043)(images/Seq2Seq_EncoderDecoder.jpg)]
一般咱们能够选择RNNs网络的变体GRU或者LSTM,这是由于它们可以经过克服梯度消失的问题来捕获长期依赖性。架构

Encoder编码器

LSTM中的Encoder读取整个输入序列,其中每一个时间step上,都会有一个字输入编码器。而后,他在每一个时间step上处理信息,并捕获输入序列中存在的上下文信息。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SAhvnaSo-1584188586044)(images/LSTM_Encoder.jpg)]
上一个时间step的隐藏层h1与记忆单元层c1将会用来初始化Decoder。app

Decoder解码器

Decoder是LSTM结构的另外一部分。它逐字读取整个目标序列,并以一个时间步长预测相同的序列偏移量。
解码器能够在给定前一个单词的状况下预测序列中的下一个单词。解码器的初始输入是编码器最后一步的结果。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-QwMhgT9a-1584188586044)(images/LSTM_Decoder.jpg)]
在将整个目标序列放入解码器前,还需将[start] 与 [end]这两个特殊的tokens加入序列中,告知模型的开始与结束。模型经过输入的[start]开始预测第一个词,而[end]则表示整个句子的结束。ide

Deocder的工做流程

假设输入序列为[x1,x2,x3,x4],将其编码成内部固定长度的向量。
下图显示了每个time step下Decoder是如何工做的。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-sUF5Xb64-1584188586045)(images/Decoder_Timestep0.jpg)]svg

推理部分

下图是整个Encoder-Decode的结构。经过上面的理解,我以为这个图很是清晰。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vqYc4Asz-1584188586046)(images/LSTM_Inference.jpg)]函数

  1. Encoder整个输入序列,而且用Encoder最后一个状态结果来初始化Decoder。
  2. 将[start]做为输入传递给解码器Decoder。
  3. 使用经过Encoder初始化过的Decoder运行一个time stpe。
  4. 输出将是下一个单词的几率,将选择几率最大的单词。
  5. 这个预测的单词将会在下一时间Step中做为输入。而且经过当前状态更新内部参数。
  6. 重复步骤3-5,直到生成[end]或达到目标序列的最大长度。

Encoder-Decoder结构的局限性

Encoder将整个输入序列转为固定的长度,可是当序列很长的时候,Encoder将会很难记住整个序列的内容,没法将全部必要信息准确的编码到固定长度。可是,咱们须要关注序列中全部的内容么,不须要。性能

注意力机制

为了解决长句子的问题,注意力机制出如今人们的视野。注意力机制为对结果重要的部分添加高的权重,以保留主要信息。举个例子:

  1. 须要编码的序列[x1,x2,x3,x4,x5,x6,x7]
    Source sequence: “Which sport do you like the most?
  2. 须要解码的序列[y1,y2,y3]
    Target sequence: I love cricket.

咱们能够判断,y1[I]与x4[you]有关,而y2[love]则与x5[like]有关。因此,相比记住序列中的全部单词,不如增长对目标序列重要部分的权重,忽视低权重的部分。

Global Attention and Local Attention

编码器的隐藏层中,全部部分都参与attention的计算上下文。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kKSnMrVL-1584188586048)(images/Sqe2Sqe_GlobalAttention.jpg)]
编码器的隐藏层中,仅有部分参与attention的计算上下文。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-c5abpy2u-1584188586048)(images/Sqe2Sqe_GlobalAttention.jpg)]
本文最终采用全局注意力机制。(只是添加了注意力机制,编码的固定长度依然须要固定。因此实战中须要经过数据肯定一个合适的长度数值。短了没法表达文本内容,长了会形成计算资源浪费。)

实战

咱们的目标是为亚马逊美食评论生成文本摘要。(这里我只提取了我以为有用的部分)

数据表述

这些评论一般很长并且具备可描述性。数据集下载:kaggleData
数据涵盖了超过10年的时间,包括截至2012年10月的全部〜500,000条评论。这些评论包括产品,用户信息,评级,纯文本评论和摘要。它还包括来自全部其余亚马逊类别的评论。

数据处理

因为评论文本和摘要中涉及的预处理步骤略有不一样,所以咱们须要定义两个不一样的函数来预处理评论和摘要。

评论文本处理

  1. 将全部字母小写;
  2. 移除HTML标签;
  3. Contraction mapping;
  4. 移除(‘s);
  5. 删除括号内的内容(以为括号里面的内容解释说明不重要);
  6. 消除标点符号和特殊字符;
  7. 删除停用词;
  8. 删除低频词;

摘要文本处理

为摘要文本添加[start]和[end]。

数据分布

经过数据统计,能够看到摘要与文本数据的长度分布。经过数据可视化,咱们能够将评论文本的长度限定在80,而摘要的长度限定在10。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WjCiF1Cw-1584188586049)(images/SummayText_Length.jpg)]

创建Tokenizer

经过分词器生成词汇表,并将单词文本序列转为数值序列,方便计算机计算。

模型创建

  1. 咱们能够选择是否让LSTM在每一个时间步都会生成隐藏状态h和记忆单元状态c。
  2. 选择LSTM是否仅生成最后一个时间步的隐藏状态h和记忆单元状态c。
  3. 选择LSTM相互堆叠提升模型效果。
  4. 选择双向LSTM,能够双向处理文本数据,获取更加丰富的上下文信息。
  5. 使用beam search strategy代替贪婪方法argmax。
  6. 根据BLEU分数评估模型的性能。
  7. 能够选择指针生成网络,
  8. 由于整数序列采用独热编码的方式,因此损失函数采用了稀疏交叉熵,对内存友好。

数学理解注意力机制

  1. 编码器为源文本序列每个时间步j都生成了一个隐藏状态值hj。

  2. 类似的工做,解码器为目标文本每个时间步i都生成了隐藏状态值si。

  3. alignment score: e i j e_{ij} 。用这个分数表示源文本中的第j步单词与目标文本中第i步单词的关联度。能够用hj与si来计算这个分数值 e i j = s c o r e ( s i , h j ) e_{ij} = score(s_i,h_j)
    根据所使用的得分函数的类型,有不一样类型的注意力机制。这里列举一些流行的注意力机制:
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3EG1G8WU-1584188586050)(images/LSTM_Attention_ScoreFunction.jpg)]

  4. 使用softmax函数对注意力参数的值进行归一化。 a i j = e i j k = 1 T e i k a_{ij}=\frac{e_{ij}}{\sum^{T}_{k=1}e_{ik}}

  5. 计算注意力权重 a i j a_{ij} 与编码器hj的隐藏状态乘积的线性总和,以产生注意力上下文向量Ci。 C i = j = 1 T a i j h i j C_{i} = \sum^T_{j=1}a_{ij}h_{ij}
    在这里插入图片描述

  6. 将注意力上一下文向量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}])

  7. 将注意力隐藏层向量传入密集层产生yi。 y i = d e n s e ( S i ) y_{i}=dense(S_{i})

本文由公众号【深度学习视觉】整理。