TensorFlow文本摘要生成
来源:互联网 发布:hexo 知乎 编辑:程序博客网 时间:2024/06/05 15:37
转自: 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这个模型是纯数据驱动, 我们喂给它的训练集数据是由一系列{正文: 摘要}对组成. 假设正文是
对于给定的数据, 我们希望给定
这里
参数说明:
下面我们举一个例子来说明训练的过程:
我们希望根据, 当前局部摘要序列<s>
来补全.
我们感兴趣的分布
通过包含编码器并且联合训练这两个组块, 我们根据当前
模型整体的网络结构图(具有一个额外的编码器单元):
右侧分支: 仅根据当前的序列yc 预测下一个单词是yi+1 的概率,E 是词嵌入,y~′c ->h 包括加权和激活函数的操作.
左侧分支: 使用yc 和x 生成隐层的下一个输出,yc 会对encoder产生影响, 让encoder更多的关注x 中与yc 有关的内容.
联合输出: 最终结合右侧的神经语言模型和左侧attention-based编码器的输出, 求下一个词是yi+1 的概率.基于注意力模型的编码器enc31的网络结构图:
左侧分支:F 是词嵌入矩阵,x~ ->x¯ 是做了一下平滑处理.
右侧分支:G 是词嵌入矩阵, 根据当前的y′c , 对x~ 的不同位置投入不同的注意力, 并形成一个加权向量.
联合输出: 此时p 已经携带了注意力的信息, 用p 对平滑后的x¯ 再做加权, 得到encoder的输出.
下面两幅图分别是对整体结构和编码器结构的展开:
感兴趣的同学可以结合原文中的公式理解:
上图(a)中对应的公式:
参数是:
上图(b)中对应的公式:
这里
Mini-batch训练
这个模型是纯数据驱动的, 只要给它{正文: 摘要}训练集就能完成训练. 一旦我们已经定义了局部条件模型
我们通过使用mini-batch和随机梯度下降最小化NLL.
2.2 Beam Search生成摘要(decode)
我们现在回到生成摘要的问题. 回顾前面, 我们的目标是找到:
使用维特比译码需要
在精确解和贪婪解方法之间取一个折中, 就是beam-search束搜索解码器(Algorithm1), 它在保持全量字典
参数说明:
Beam search案例
下面举一个简单的例子来说明beam search算法的运行过程. 在这个例子里, 摘要长度
Step1: 预测前
Step2: 预测第2个词的时候, 我们选出新的K个词符, 对应K条备选路径. 前一阶段概率低的路径和词符, 被抛弃掉.
Step3: 重复前面的过程.
Step4: 每次beam search不一定能选出不同的K个词, 但是每次beam search都找到最优的前K个路径, 路径可以有重叠.
Step5: 迭代N次, 最终选出可能性最大的一条词序列路径
下面是对Beam Search算法的详细分析, 对原文的Algorithm 1逐条进行解释.
Beam Search算法分析
π[0] 是可以用规定好的起始符号<s>
来初始化. 在训练和生成摘要时, 窗口Q 和C 沿着文本滑动如果超出范围, 用起始符号<s>
做padding.- 如果模型是abstraction-based, 输出
y 的备选集合是整个字典, 如果希望摘要的单词全部从原文中抽取, 那么词典由输入正文x 的所有单词构成. - 我们会设定一个最大输出长度
N , 算法会进行N 轮迭代.- 现已有
K 个假设, 每一个假设都对应一条路径; 对每一个假设, 我们从字典S (有V 个单词)中选出K 个单词作为备选. - 在字典中寻找, 搜索其他单词, 如果计算的到的state值比当前集合中的任意一个大, 就把它保留下来.
- 当每一个假设都遍历完整个字典
S , 就会产生K×K 条路径, 我们在这些路径中选择概率最大的K 个路径作为下一次迭代的基础.(每一条路径都保留了之前i−1 个节点对应的单词)
- 现已有
- 当
N 次迭代进行完后, 我们只剩下了K 条路径, 最后在从这其中选出1条概率最大的即可. - 路径所经历的所有节点即为摘要的单词. 如果这中间遇到了停止符
<e>
, 摘要就是从<s>
到<e>
, 如果没有<e>
出现, 摘要的最大长度就是N .
Beam Search的运算复杂度从
3 TensorFlow程序实战
NAM模型的程序最早是由facebook开源的torch版本的程序. 最近谷歌开源了TensorFlow版本的摘要生成程序textsum, Github上的项目. textsum的核心模型就是基于注意力的seq2seq(sequence-to-sequence)模型, textsum使用了LSTM和深度双向RNN.
Github上的textsum首页给出了此项目在Bazel环境下的运行方式. 如果你不想通过Bazel运行, 你可以直接在seq2seq_attention.py中设定运行参数. 设定完参数后, 直接运行Python seq2seq_attention.py即可. 参数设定如下图所示:
除了上述项目运行时所需的必要参数, 模型参数也在seq2seq_attention.py中设定, 如下图所示, 包括学习率, 最小学习率(学习率会衰减但不会低于最小学习率), batch size, train模式encoder的RNN层数, 输入正文词汇数上限, 输出摘要词汇数上限, 最小长度限制, 隐层节点数, word embedding维度, 梯度截取比例, 每一个batch随机分类采样的数量.
Git项目textsum给的toy数据集太小, vocab也几乎不可用(一些常见的单词都没有覆盖到). 如果希望获得好的效果, 需要自己整理可用的数据集.
主要文件说明:
- seq2seq_attention.py: 主程序, 选择程序的运行模式, 设定参数, 建立模型, 启动tensorflow
- seq2seq_attention_model.py: 建立attention-based seq2seq model, 包括算法的encoder, decoder和attention模块, 都在Seq2SeqAttentionModel中完成.
- seq2seq_attention_decode.py: 读取数据, 调用beam_search解码
beam_search.py: beam search算法的核心程序
textsum程序解析
Google开源的textsum项目的具体算法是基于Hinton 2014年的Grammar as a Foreign Language这篇论文, 下面给出textsum工程中attention-based seq2seq模型的整体结构图, 图中所使用的名字与程序中的变量名一致, Seq2SeqAttentionModel是一个类, 定义在seq2seq_attention_model.py中; attention_decoder是一个函数, 定义在/tensorflow/contrib/legacy_seq2seq/python/ops/seq2seq.py中.
为了方便理解, 简单解释一下图中出现的符号,
第一个符号表示从x1,x2到y的线性变换, 红色变量是训练过程要学习出来的.
attention机制比较复杂也比较重要, 我们对这部分细化一下来看. attention decoder结构图如下:
下图是对attention模块的细化:
符号说明:
为什么attention这个模块会起到效果呢? 因为attention模块会根据decoder当前时刻的LSTM单元的状态, 来调整对attention_states(encoder输出)的注意力. Attention_states不同位置获得的关注不一样. 这样我们就更大程度地, 关注了原文中, 对当前输出更为有用的信息, 输出结果也就更准确了. Attention模块输出结果和decoder模块原本的输出联合起来, 得到最终的输出结果.
相关链接:
- 算法原理部分的论文:
https://arxiv.org/abs/1509.00685 - textsum开源程序链接:
https://github.com/tensorflow/models/tree/master/textsum - textsum中使用的算法原理论文:
https://arxiv.org/abs/1412.7449
- Rush在他的论文中提到了Bag-of-Words, Convolutional和Attention-Based三种编码器, 这里重在强调第三种. ↩
- TensorFlow文本摘要生成
- TensorFlow文本摘要生成
- TensorFlow文本摘要生成
- TensorFlow文本摘要生成
- TensorFlow文本摘要生成
- TensorFlow 自动文本摘要生成模型,2016
- 如何自动生成文本摘要
- 使用TextRank生成文本摘要
- 生成式文本摘要分析实践
- 深度学习之文本摘要自动生成
- 文本摘要
- 使用TextRank算法为文本生成关键字和摘要
- 使用TextRank算法为文本生成关键字和摘要
- 使用TextRank算法为文本生成关键字和摘要
- TextRank算法为文本生成关键字和摘要
- 使用TextRank算法为文本生成关键字和摘要
- 使用TextRank算法为文本生成关键字和摘要
- TensorFlow练习27: 验证码生成器-从文本生成图像
- 算法提高 11-1实现strcmp函数
- hibernate通过HibernateCallback()调用底层session
- sscanf基本用法
- 用 config drive 配置网络
- support-v4、support-v7 的依赖关系及 Getting java.util.zip.ZipException: duplicate entry exception 的处理
- TensorFlow文本摘要生成
- MFC画图
- 剑指offer34:丑数
- python内置字符串处理函数
- 2017-04-06日记:ORA-01403异常
- Cloud Computing(7)_Graph Algorithms
- 常用cheat sheet 整理(正则、git、jquery、机器学习等等)
- 《现代操作系统》第5章 输入输出
- JAVA 编程思想之面向对象 生活实例理解