TensorFlow文本摘要生成 - 基于注意力的序列到序列模型

Posted 黄文坚

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了TensorFlow文本摘要生成 - 基于注意力的序列到序列模型相关的知识,希望对你有一定的参考价值。

1 相关背景

维基百科对自动摘要生成的定义是, “使用计算机程序对一段文本进行处理, 生成一段长度被压缩的摘要, 并且这个摘要能保留原始文本的大部分重要信息”. 摘要生成算法主要分为抽取型(Extraction-based)和概括型(Abstraction-based)两类. 传统的摘要生成系统大部分都是抽取型的, 这类方法从给定的文章中, 抽取关键的句子或者短语, 并重新拼接成一小段摘要, 而不对原本的内容做创造性的修改. 这类抽取型算法工程上已经有很多开源的解决办法了, 例如Github上的项目sumy, pytextrank, textteaser等. 本文重点讲概括型摘要生成系统的算法思想和tensorflow实战, 算法思想源于A Neural Attention Model for Abstractive Sentence Summarization这篇论文. 本文希望帮助读者详细的解析算法的原理, 再结合github上相关的开源项目textsum讲解工程上的实际应用.本文由PPmoney大数据算法团队撰写,PPmoney是国内领先的互联网金融公司,旗下PPmoney理财总交易额超过700亿元。此外,若对TensorFlow的使用技巧和方法感兴趣,欢迎阅读本团队负责人黄文坚所著的《TensorFlow实战》

2 算法原理

下面对A Neural Attention Model for Abstractive Sentence Summarization这篇文章, 的算法原理进行讲解. 我们将这个模型简称为NAM. 主要分为模型训练(train)和生成摘要(decode)两部分讲解.

2.1 模型训练(train)

NAM这个模型是纯数据驱动, 我们喂给它的训练集数据是由一系列正文: 摘要对组成. 假设正文是 x=[x1,...,xM] , M 是正文词符的数量, 对应的摘要为y=[y1,...,yN], N 是摘要单词的数量.
对于给定的数据, 我们希望给定x生成摘要为 y 的概率最大, 即 maxθlogp(y|x;θ) , θ 是模型的参数. 但这个很难求解, 实际中我们用序列化的方式实例化这个目标, 原来的目标函数变为:

maxθi=0N1logp(yi+1|x,yc;θ)
这里 yi+1 是要预测的下一个词, ycy[iC+1,...,i] 是已知的序列, C 是已知序列窗口的长度. 后面会提到, 这个窗口的位置也是注意力关注的位置, 在后面的训练过程中会根据学习到的权重调整不同位置注意力的概率大小. 这个窗口是随着i的迭代来滑动的.
参数说明:
y : 参考摘要所有单词向量组成的序列
x : 正文的所以单词向量组成的序列
i : 当前评估函数所对应的位置
yc: 当前训练的窗口对应的局部摘要序列
yi+1 : 模型要预测的下一个单词

下面我们举一个例子来说明训练的过程:

我们希望根据, 当前局部摘要序列 yc 和全部的正文信息 x , 来预测下一个单词 yi+1 . 我们希望模型预测下一个单词为 yi+1 的概率最大, 并且希望所有单词都尽可能的预测准确, 在公式上表现为 N1i=0logp(yi+1|x,yc;θ) 最大. 窗口 C 会从摘要的起始位置滑动到终止位置, 当i<C时, yc 超出摘要的部分用起始符号<s>来补全.
我们感兴趣的分布 p(yi+1|x,yc;θ) 是基于输入语句 x 的条件语言模型. 这里我们直接将原始的分布, 参数化为一个神经网络. 这个神经网络既包括了一个神经概率语言模型(neural probabilistic language model), 也包括了一个编码器(这个编码器就是一个条件摘要模型).
通过包含编码器并且联合训练这两个组块, 我们根据当前yc x 的不同内容投入不同的关注度, 进而的到更好的结果. 模型结构如下图所示: