文本摘要生成的评估指标
ROUGE-N
这里的N就是指的n-gram,n=1时叫ROUGE-1(也叫Unigrams);n=2时,叫ROUGE-2(也叫Bigrams);n=3时,叫ROUGE-3(Trigrams)。
`长路漫漫,唯剑作伴`
NLG
采样策略上篇文章中学习了NLG
的解码策略,主要包括greedy search、beam search,如果不太记得了可以再去温习一下,然后接下来我们来看看这些解码策略会存在哪些问题,是否还可以从其他角度来提高文本的生成效果。
这幅图展示了每个时间步,生成某个单词的可能性,我们发现beam search在每一步的概率值都是比较大的,但是如果是真实人类的话,其实是比较随机的(人说话的内容比较随机,富有多样性)。这主要是因为beam search本身就是在根据最大概率去生成句子,但是最大概率不等于最好,上篇文章中我们有提到
此外因为模型生成时,一定程度上依赖于已经生成的句子,所以一味的选取概率最大的,可能会使句子的生成陷入不断地重复循环中,所以针对beam search这些特点,为了可以生成更多样化的句子(引入一定的随机性)又不偏离主题,以下几种采样策略被研究者提出。
NLG
解码策略自然语言生成(Natural Language Generation,简称NLG
),是自然语言处理领域的一个重要分支,在文本摘要生成任务中,另一个重要的分支是自然语言理解(Natural Language Understanding,简称NLU
)。前面我们已经学习了seq2seq
模型结构,其主要分为Encoder和Decoder两大组件,其实正是对应了NLU
和NLG
两大分支,seq2seq
模型最后经过一个softmax
层,在每个时间步均得到一个词表大小的概率分布,如何利用这些概率分布得到最终的预测句子就是本节学习的解码策略。
上篇构建文本摘要baseline时,我们就有提到过解码方法,当时采用的Teacher forcing的技巧,使用了真实标签,避免前面的步骤预测出错被无限放大的问题,但是在实际预测时因为没有真实标签,往往实际预测效果不一定好,所以寻找可行的解码策略是一项重点工作。
上篇文章记录了seq2seq和attention机制的基本原理,这篇文章趁热打铁看看如何自己写代码实现。
推荐一个学习tensorflow的教程:https://github.com/lyhue1991/eat_tensorflow2_in_30_days
1 | import tensorflow as tf |
连接操作(tf.concat)
1 | t1 = [[1, 2, 3], [4, 5, 6]] # 2, 3 |
Seq2Seq
Seq2Seq
结构用于多个输入和多个输出的模型,但是输入和输出的大小可能并不一致,其本质上也是RNN
网络的一个扩展,常见的应用场景包括:机器翻译、语音识别、文本摘要等。
常见的seq2seq
的输出的计算方法包括以下两种:
注意这里C到y1、y2、y3
的计算,虽然有两种方式,但是C本质上是前半部分的最终输出状态,并非每个时间步的输出,这里搞清楚对于后续的注意力机制的理解也有帮助。
在seq2seq
结构中,通常将整个模型分为encoder和decoder两个核心组件,连接两个组件的就是context vector,即Encoder组件生成的上下文向量。
之前有一篇文章已经初步介绍过RNN
的原理,里面其实已经介绍的比较清晰易懂了,这篇文章再来回顾和拓展一下:https://forchenxi.github.io/2021/04/23/nlp-rnn/
首先要知道RNN
是一个带有内部环的神经网络,上面的这篇文章中的图描述的更形象,这里再来简单回顾下,使用tensorflow
来实现(实际也是用keras
来实现的)。
这里的Word2Vec借助 gensim 库实现,首先安装pip install gensim==3.8.3
1 | from gensim.models.word2vec import Word2Vec |
参数说明: