【Keras教程】用Encoder-Decoder模型自动撰写文本摘要

【导读】这篇博文介绍了如何在深度学习框架Keras上实现文本摘要问题,探讨了如何使用编码器-解码器递归神经网络体系结构来解决文本摘要问题,如何实现文本摘要问题的不同的编码器和解码器,博文通俗易懂,专知内容组整理出来,希望大家喜欢。

Encoder-DecoderModels for Text Summarization in Keras

用Keras实现基于Encoder-Decoder的文本自动摘要

作者:Jason Brownlee

译者:专知内容组

▌文本摘要概述


文本摘要是从一个源文档中创建出一个的简短、准确和流畅的摘要问题。

针对机器翻译而开发的编码器-解码器递归神经网络架构在文本摘要的问题中证明是非常有效的。

在Keras深度学习库中应用这种结构可能会很困难,因为为了保持Keras库的整洁、简单和易于使用而牺牲了一些灵活性。

在本教程中,您将了解如何在Keras中实现用于文本摘要的编码器-解码器网络结构。

完成本教程之后,您将知道:

  • 如何使用编码器-解码器递归神经网络体系结构来解决文本摘要问题;
  • 如何实现文本摘要问题的不同的编码器和解码器;
  • 您可以使用三种模型来实现Keras中文本摘要的结构。

▌详细内容


接下来我们开始吧:

在Keras文本摘要的编码器-解码器模型。

照片由Diogo Freire提供,保留版权。

▌教程概述:


该教程分为5部分,包括:

  1. 编码器-解码器结构
  2. 文本摘要编码器
  3. 文本摘要解码器
  4. 读取源文本
  5. 实现模型

▌1. 编码器-解码器结构


编码器-解码器结构是一种组织循环神经网络用于序列预测问题的方法,其具有输入、输出或输入和输出变量。

该结构涉及两个组件:一个编码器和一个解码器。

编码器:编码器读取整个输入序列并将其编码为内部表示,通常一个固定长度的向量称为上下文向量。

解码器:解码器从编码器读取编码的输入序列并生成输出序列。

想要了解更多的编码器-解码器结构,请看下面的帖子:

Encoder-DecoderLong Short-Term Memory Networks(编码器-解码器长期短期记忆网络)

https://machinelearningmastery.com/encoder-decoder-long-short-term-memory-networks/

编码器和解码器子模型都是共同训练的,也就是说同时进行训练。

这在传统意义上是一个很大的壮举,挑战自然语言问题需要开发单独的模型,这些模型后来被串联起来,允许在序列生成过程中积累错误。

整个编码输入被用作输出中每个步骤的上下文。虽然这是有效的,但输入的固定长度编码限制了可以生成的输出序列的长度。

编码器-解码器结构的扩展提供的更具表现性的形式是编码输入序列,并且允许解码器在生成输出序列的每个步骤时学习在何处关注编码输入。

这个架构的扩展被称为注意力。

想要了解编码器-解码器结构的注意力概念,请参看下面帖子:

Attention in LongShort-Term Memory Recurrent Neural Networks(长期短期记忆循环神经网络的注意力)

https://machinelearningmastery.com/attention-long-short-term-memory-recurrent-neural-networks/

有注意力的编码器-解码器结构对于产生可变长度输出序列(例如文本摘要)的一系列自然语言处理问题而言是受欢迎的。

该体系结构在文本摘要中的应用如下:

编码器:编码器负责读取源文档并将其编码为内部表示。

解码器:解码器是一种语言模型,负责使用源文档的编码表示在输出摘要时生成每个单词。

▌2. 文本摘要编码器


编码器是模型的复杂性所在,因为它负责捕获源文档的含义。

可以使用不同类型的编码器,但是更常用的是双向递归神经网络,例如LSTM。在编码器中使用递归神经网络时,使用单词嵌入(word embedding)来提供单词的分布式表示。

Alexander Rush, etal.使用一个简单的词袋编码器,丢弃词序和卷积编码器,尝试捕获n-gram信息。

引用:我们最基本的模型只是简单地使用输入语句的字符串嵌入到H尺寸,而忽略原始顺序的属性或相邻字词之间的关系。 [...]为了解决一些建模问题,我们还考虑在输入语句中使用深度卷积编码器。——关于抽象句摘要的神经注意模型, 2015。(A NeuralAttention Model for Abstractive Sentence Summarization,2015.)

Konstantin Lopyrev使用4个LSTM递归神经网络堆叠起来作为编码器。

引用:编码器作为输入提供一篇新闻文章的文字。每个单词首先通过一个嵌入层,将单词转换为分布式表示。该分布式表示然后用多层神经网络进行组合。——使用递归神经网络生成新闻头条,2015。(Generating NewsHeadlines with Recurrent Neural Networks, 2015.)

Abigail See, et al.使用单层双向LSTM作为编码器。

引用:将文章w(i)的tokens一个接一个地送入编码器(单层双向LSTM),产生一系列编码器隐藏状态h(i)。——指出要点:用指针-生成器器网络生成摘要,2017。(Get To ThePoint: Summarization with Pointer-Generator Networks, 2017.)

Ramesh Nallapati等,在其编码器中使用双向GRU递归神经网络,并在输入序列中包含了有关每个单词的附加信息。

引用:编码器由一个双向GRU-RNN组成。——使用序列-to-序列RNNs的抽象文本摘要,2016。(Abstractive Text Summarization Using Sequence-to-Sequence RNNs andBeyond, 2016.)

▌3. 文本摘要解码器


解码器必须在给定两个信息源的输出序列中生成每个词:

上下文向量:编码器提供的源文档的编码表示形式。

生成序列:已经作为摘要生成的单词或单词序列。

上下文向量可以是简单的编码器-解码器体系结构中的固定长度编码,或者可以是由注意力机制过滤的更具表现力的形式。

为生成的序列提供了准备,例如通过词嵌入来分配每个生成的词的表示。

引用:在每个步骤t,解码器(单层单向LSTM)接收前一个词的嵌入(训练时,这是参考摘要的前一个词;在测试时,它是解码器发出的前一个词)——指出要点:用指针-生成器器网络生成摘要,2017。(Get To ThePoint: Summarization with Pointer-Generator Networks, 2017.)

Alexander Rush, et al.在x是源文档的图中清楚地显示了这一点,enc是提供源文档的内部表示的编码器,yc是先前生成的词的序列。

用于文本摘要的解码器的输入示例。

Taken from “A Neural Attention Model forAbstractive Sentence Summarization”, 2015.

每次生成一个单词需要运行该模型,直到生成最大数量的单词或者达到一个特殊的结束标记。

该过程必须通过为模型提供一个特殊的开始序列标记来生成第一个单词。

引用:解码器将输入文本的最后一个词后的隐藏层作为输入。首先,序列结束符号作为输入,再次使用嵌入层将符号变换为分布式表示。生成下一个单词时,用该单词的同一个单词(生成的单词)作为输入。——使用递归神经网络生成新闻头条,2015。(Generating NewsHeadlines with Recurrent Neural Networks, 2015.)

Ramesh Nallapati等人使用GRU递归神经网络来生成输出序列。

引用...解码器由一个单向的GRU-RNN组成,它的隐藏状态大小与编码器的相同。——

▌4. 读取源文本


这种体系结构的应用具有灵活性,这取决于所处理的特定文本摘要问题。

大多数研究都集中在编码器中的一个或几个源语句,但事实并非如此。

例如,编码器可以被配置为以不同大小的块读取和编码源文档:

  • 句子
  • 段落
  • 文档

同样地,解码器可以被配置为汇总每个块或者汇集编码的块并且输出更广泛的概要。

沿着这个方向已经做了一些工作,Alexander Rush等人在词汇和句子层面都使用分层编码器模型。

引用:这个模型旨在使用两个层面的两个双向RNN来捕获这个两个重要级别的概念,一个在单词级别,另一个在句子级别。注意力机制同时在两个层面上运作。——抽象句摘要的神经注意力模型,2015。(A NeuralAttention Model for Abstractive Sentence Summarization, 2015.)

▌5. 读取源文本实现模型


在本节中,我们将看看如何在Keras深度学习库中实现用于文本摘要的编码器-解码器结构。

一般模型:模型的一个简单的实现包括一个Embedding输入编码器,后面跟着一个LSTM隐藏层,它产生一个固定长度的源文档表示。

解码器读取最后生成的词的表示和嵌入,并使用这些输入生成输出摘要中的每个词。

在Keras中的文本摘要生成模型

有一个问题:

Keras不允许递归循环,模型的输出自动作为输入,输入到模型中。这意味着如上所述的模型不能直接在Keras中实现(但也许可以在更灵活的平台如TensorFlow中实现)。相反,我们可以看看我们可以在Keras中实现的模型的三种变体。

备选1:一次性模型(One-Shot Model)

第一个替代模型是以一次性方式生成整个输出序列。也就是说,解码器仅使用上下文向量来生成输出序列。

备选1:One-Shot文本描述生成模型。

以下是Keras中使用API实现这种方法的一些示例代码。

这个模型给解码器带来了沉重的负担。

解码器可能没有足够的上下文来产生相干的输出序列,因为它必须选择单词和它们的顺序。

备选2:递归模型A.

第二种可供选择的模型是开发一个生成单个单词预测并递归调用它的模型。

也就是说,解码器使用上下文向量以及到输入为止产生的所有单词的分布式表示,以便产生下一个单词。

可以使用语言模型来解释到目前为止产生的单词序列,以提供第二个上下文向量与源文档的表示组合,以便产生序列中的下一个单词。

通过递归地调用具有之前生成单词的模型(或者更具体地,在训练期间预期的前一个词)来建立摘要。

上下文向量可以集中或添加在一起,为解码器提供更广泛的上下文来解释和输出下一个单词。

备选2:递归文本摘要模型A

以下是Keras中API实现这种方法的一些示例代码。

该模型是更好的,因为解码器有机会使用先前生成的单词和源文档作为生成下一个单词的上下文。

结合操作和解码器解释(以便解释生成输出序列的位置)确实带来了一定的负担。

备用3:递归模型B

在第三个替代方案中,编码器生成源文档的上下文向量。该文档在生成的输出序列的每一步被送到解码器。这允许解码器建立与生成输出序列中的单词相同的内部状态,以便在序列中生成下一个单词。

然后通过对输出序列中的每个单词迭代地调用模型来重复该过程,直到生成最大长度或序列结束标记。

备选3-递归文本摘要模型B

以下是Keras中API实现这种方法的一些示例代码。

考虑一下,你还有其他的替代实现的想法吗?

▌延伸阅读:


如果您想要深入了解,本节将提供更多相关主题的资源。

文章:

  • A Neural Attention Model for Abstractive Sentence Summarization, 2015.
  • Generating News Headlines with Recurrent Neural Networks, 2015.
  • Abstractive Text Summarization Using Sequence-to-Sequence RNNs and Beyond, 2016.
  • Get To The Point: Summarization with Pointer-Generator Networks, 2017.

相关:

  • Encoder-Decoder Long Short-Term Memory Networks(编码器-解码器LSTM网络)
  • Attention in Long Short-Term Memory Recurrent Neural Networks(LSTM递归神经网络中的注意力机制)

概要:

在本教程中,您了解了如何在Keras深度学习库中实现文本摘要的编码器-解码器结构。

具体地,你学到了:

  • 如何使用编码器-解码器递归神经网络结构来解决文本摘要问题。
  • 在文本摘要问题中实现不同的编码器和解码器。
  • 您可以使用三种模型来实现Keras中文本摘要的结构。

参考链接:

https://machinelearningmastery.com/encoder-decoder-models-text-summarization-keras/

原文发布于微信公众号 - 专知(Quan_Zhuanzhi)

原文发表时间:2017-12-12

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏灯塔大数据

每周学点大数据 | No.7大数据规模的算法分析

No.7期 大数据规模的算法分析 Mr. 王:这样的时间界限记为O(1),我们称之为常数时间算法,这样的算法一般来说是最快的,因为它与输入规模完全无关,不论输...

2024
来自专栏ArrayZoneYour的专栏

如何用Python将时间序列转换为监督学习问题

像深度学习这样的机器学习方法可以用于时间序列预测。

2K11
来自专栏机器之心

入门 | 十分钟搞定Keras序列到序列学习(附代码实现)

31612
来自专栏ATYUN订阅号

如何在Python和numpy中生成随机数

随机性的使用是机器学习算法配置和评估的重要部分。从神经网络中的权重的随机初始化,到将数据分成随机的训练和测试集,再到随机梯度下降中的训练数据集的随机混洗(ran...

3063
来自专栏决胜机器学习

从机器学习学python(四) ——numpy矩阵基础

从机器学习学python(四)——numpy矩阵基础 (原创内容,转载请注明来源,谢谢) 一、numpy中matrix 和 array的区别 ...

4707
来自专栏数据结构与算法

学大伟业 国庆Day2

期望得分:30+100+0=130 实际得分:30+100+20=150 忍者钩爪 (ninja.pas/c/cpp) 【问题描述】 小Q是一名酷爱钩爪的忍者,...

4974
来自专栏视觉求索无尽也

【Python】Numpy使用指南

Numpy是用来存储和处理大型矩阵,比Python自身的嵌套列表结构要高效的多,本身是由C语言开发。这个是很基础的扩展,其余的扩展都是以此为基础。

1662
来自专栏各种机器学习基础算法

NLTK学习笔记(一)

len(text)  #单词个数 set(text)  #去重 sorted(text) #排序 text.count('a') #数给定的单词的个数 text...

2876
来自专栏深度学习自然语言处理

基于attention的seq2seq机器翻译实践详解

理理思路 文本处理,这里我是以eng_fra的文本为例,每行是english[tab]french,以tab键分割。获取文本,清洗。 分别建立字典,一个engl...

5516
来自专栏AI研习社

从 Encoder 到 Decoder 实现 Seq2Seq 模型

前言 好久没有更新专栏,今天我们来看一个简单的Seq2Seq实现,我们将使用TensorFlow来实现一个基础版本的Seq2Seq,主要帮助理解Seq2Se...

61313

扫码关注云+社区

领取腾讯云代金券