APP下载

基于神经网络的集句诗自动生成

2019-04-17梁健楠孙茂松矣晓沅陈慧敏刘正皓

中文信息学报 2019年3期
关键词:诗句语义向量

梁健楠,孙茂松,矣晓沅,杨 成,陈慧敏,刘正皓

(1. 清华大学 计算机科学与技术系,北京,100084; 2. 清华大学 人工智能研究院,北京,100084 3. 清华大学 智能技术与系统国家重点实验室,北京,100084)

0 引言

随着中华文化的复兴,越来越多的人开始关注、学习中国古典文化。而古诗词作为中国优秀古典文化的结晶,在数千年的历史长河中对中华民族的发展有着深远影响。

近年来,中国古典诗歌自动生成的研究逐渐成为热点,吸引了国内外越来越多研究者的注意。研究者们对中国古典绝句[1-2]和宋词[3-4]的自动生成任务提出了很多不同的模型和方法。这些研究大都集中在绝句和宋词的自动生成。本文着重关注一种特殊的中国古典诗歌形式——集句诗。集句诗作为一种别出机杼的诗歌再创造方式,是对不同时期、不同诗人创作的不同诗篇中已有句子进行选取,并重新组合形成的新诗。诗句虽然是前人所写且各有其出处,但过渡流畅,具备完整的内容和新颖的主旨意境,浑然天成且无强拼硬凑之感。图1给出了一首明代著名文学家汤显祖所作的集句诗示例。

图1 汤显祖《牡丹亭》中所作七言集句诗

集句诗的历史可以上溯到西晋,而兴盛于宋代。集句创作需要创作者博闻强识,有大量的诗歌储备作为再创作素材。同时要求创作者有很强的诗词理解和鉴赏能力,只有充分理解前人不同作品中每一诗句表达的内容与意境,才能在对诗句进行有机的重新组合的同时而不破坏集成的整首诗的连贯完整性。在中国古代众多诗人中,只有王安石、苏轼、辛弃疾等诗文大家才有能力创作出高质量的集句诗。

随着硬件技术的发展,现代计算机具备了海量存储和快速检索能力,计算机能够“记忆”的诗作数量远远高于人类。近年来神经网络,尤其是基于循环神经网络(Recurrent Neural Network,RNN)的模型得到了极大的发展,且在图像识别、语音识别、机器翻译等任务上取得了显著突破。RNN能够自动从大规模语料库中,学习到质量较高的句子语义表示。前人的工作已经表明,RNN能够用于英文诗歌[5-6]和中国古典诗歌[2,4,7]的自动生成,且能取得不错的效果。

本文提出了一种新颖的结合计算机索引能力和神经网络语义表示能力的自动集句诗生成模型。模型采取逐句生成的方式,根据用户输入的一句首句,依次选取古诗库中上下文语义、意境关联性最强的诗句作为当前生成句,并将生成句作为输入诗句。以此类推,逐步生成一首完整的集句诗。首先,我们设计了一套格律和韵脚检测方法,剔除诗库中不符合格律押韵要求的诗句,从而减小模型的搜索空间。然后,基于整个古诗库,根据上下文的大小不同,我们训练了两个带Attention机制的Neural Sequence-to-Sequence[8]模型,用以生成诗句的向量表示,通过句向量来衡量集句质量最重要的标准是整首诗的上下文连贯性和关联性。基于此,我们设计了三种不同的方法来计算一句诗句和已生成的上文多个诗句之间的关联性,用于当前候选诗句的选取。我们采用信息检索中常用的MRR(Mean Reciprocal Rank)指标用于评价集句诗生成模型。实验结果表明,我们的模型相对基于统计互信息的自动集句生成模型有较大提升。

综上,本文的贡献如下:

(1) 我们首先提出集句诗的自动生成任务,并设计了相应的自动评价指标;

(2) 我们设计了一种基于Sequence-to-Sequence神经网络的自动生成集句诗模型。模型利用句向量自动学习诗句语义,测量语义相似性;

(3) 自动评测和人工评测结果都表明,给定一句用户输入的首句,我们的模型能生成质量较高的集句诗。相对于基于统计互信息的自动集句诗生成模型有很大提升。

1 相关工作

诗歌生成是研究计算机自动分析、理解和使用人类语言的一个重要切入点。国内外在这一领域的研究已经持续了数十年。从方法上,相关的研究工作可以分为三个阶段:

早期的诗歌生成模型都是基于规则和模板。例如,ASPERA 诗歌生成系统[9]和日文俳句生成系统[10]。

第二个阶段大约从上世纪90年代开始。在这一阶段,统计机器学习方法陆续被用到诗歌生成上。Levy[11]和Manurung[12]先后探索利用遗传算法来进行诗歌生成。与此同时,一些研究者也开始利用其他类型的文本生成模型。Yan 等人提出利用自动文本摘要的方式进行诗歌生成,将诗歌的生成过程看作是从整个古诗库进行摘要的过程[13]。另一个,在诗歌生成任务上提升显著的模型是统计机器翻译(Statistical Machine Translation,SMT)模型。Jiang 和 Zhou 首先将SMT模型用于中文对联的生成[14],取得了良好的效果。随后,He进一步将此模型应用于中文绝句的生成[14]。

随着人工神经网络的发展,这一领域迈进了第三个阶段——基于神经网络的诗歌生成。大部分研究者都采用RNN或者其变体进行诗歌生成。Zhang 和 Lapata 最早将RNN应用到了中文绝句生成任务上[2]。他们使用一个卷积语句模型将生成的每句诗向量化然后压缩到一个上下文向量中,用以捕捉诗歌的上下文信息。但是,他们的模型较为简单。为了提升诗歌的连贯性和通顺性,他们的模型还需要和两个额外的SMT特征以及一个基于n-gram的语言模型相结合。随后,Yan 提出了polish模型[15],使用RNN进行绝句的生成。不同之处在于,Yan的模型会对一首诗进行多次生成。每次生成时,会考虑上一次生成的诗歌,以模拟人类在创作诗歌时,不断修改润色的过程,从而提升诗歌的质量。Yi 等人第一次提出用结合了注意力机制的Sequence-to-Sequence模型[7]来进行诗歌生成[8]。他们针对绝句中不同的位置训练了不同的模型,以此来提升诗歌的上下文关联性。随后,在绝句生成任务上,Wang等人提出了Planning模型[16],该模型预先规划一首绝句里四个句子每一句对应的关键词,然后用对应的模型生成每一句。以往的模型生成的诗歌大多缺乏新颖性,故Zhang等人提出了利用记忆网络来进行诗歌生成[17]。为了提升生成诗歌的新颖性,他们将数百首古人创作的诗歌存入一个外部的Memory,以提供更丰富的外部知识来引导模型生成。同时,通过控制Memory中存储的诗歌风格,他们的模型也能实现对生成的诗歌风格的简单控制。Yi 等人同样提出利用Memory模型[18]。他们使用三个不同的Memory来模拟人类进行诗歌创作时的写作和记忆习惯。同时,他们提出了一种体裁向量,能够将诗歌的格律和结构信息与诗歌内容在一定程度上分离。从而,使一个训练好的模型能生成不同体裁的诗歌。如绝句、宋词、现代诗等等。神经信息检索也为我们提供了另外的思路用以诗句相关程度的评判[19]。

上述模型的诗歌生成都集中在绝句和宋词这两种体裁上。这些模型由于要同时考虑诗歌的通顺性、上下文关联性、语义丰富性等等,难以做到兼顾所有方面,往往会顾此失彼。在这篇论文中,我们提出了一种全新的诗歌生成任务——集句诗自动生成。由于诗句是诗库中古人创作的现有句子,这些句子本身有较好的通顺性和语义丰富度。因此,集句诗自动生成模型可以忽略这些方面,而专注于把握不同语句之间的上下文语义、主题、内容的连贯性和一致性,这也是对诗歌这种的文学性文本最为关键的评价指标之一。

2 模型设计

2.1 任务及模型概述

我们首先将集句诗自动生成的任务形式化描述如图2所示。

图2 模型结构图注: “+”为句子相加,即两个句子首尾相连拼接起来。

我们定义一个评分函数R(L1:i-1,Sn),用以计算诗库中的每一候选句和上文的连贯性得分。则集句诗的第i句选取为:

(1)

从上述过程可以看出,平仄和韵脚可以通过规则限制进行筛选,一首集句诗的好坏取决于式(1)中定义的评分函数的效果。我们希望找到合适的评分函数,使得生成的集句效果最佳。

以下将介绍本文设计的三种评分函数。

2.2 基于生成结果语义相似性的评分函数

不同于其他体裁(如绝句、宋词等)的生成,集句诗生成要求选取与上文连贯的古人诗句,而非依靠模型生成全新的诗句。前人的工作表明,带注意力机制的序列到序列模型(Sequence-to-Sequence with attention mechanism)[8]生成的诗句有不错的上下文关联性[7,16]。因此,我们的第一种评分函数的思路是,第一步使用神经网络生成模型根据上文生成一句全新的当前诗句。第二步使用特定的方法从诗库中检索一句与该生成句语义最相似的古人诗句。

具体地,我们使用基于双向长短时记忆(Long Short-Term Memory,LSTM)[20-21],带Attention的编码-解码器(Encoder-Decoder)。定义X为输入到Encoder的序列,X=x1x2…xTx;Y为Decoder端生成的序列,Y=y1y2…yTy。其中,Tx和Ty分别为Encoder和Decoder端的序列长度。给定L1:i-1,则Decoder端生成的诗句Gi计算如式(3)~式(5)所示。

其中,st和ht分别为第t个时间步的Encoder和Decoder端的隐状态向量,e(yt-1)为对应的word embedding,f为线性变换层。ct为Attention机制中的attention向量,具体计算参考文献[8]。

值得关注的是,式(2)中,我们把L1:i-1拼接为一个长序列输入到Encoder中。参照文献[7]中的方法,当上文包含不同数目的诗句时,我们分别训练不同的生成模型来进行生成。通常,我们使用1句生成1句来产生诗歌的第二句,2句生成1句来生成集句的诗歌的其他句子。

得到Sequence-to-Sequence模型生成的句子Gi之后,我们使用两种方法来度量诗库中的古人诗句Sn和Gi的语义相似性。

基于最大公共子序列(LongestCommonSubsequence,LCS)的相似性度量。第一种方法,我们假设两个句子之间匹配的子序列越大,两个句子的语义相似性就越高。即:

R(L1:i-1,Sn)=LCS(Gi,Sn)

(6)

在这里,我们考虑了实字和虚字对语义贡献度的不同。在匹配过程中,虚字匹配给予比实字低的分数。

R(L1:i-1,Sn)=cos(v(Gi),v(Sn))

(7)

2.3 基于上下文生成概率的评分函数

2.2节中的方法采取了先生成新诗句Gi,然后再和古人诗句匹配的方式。在实际中,式(5)的概率最大值很难取到,因无法遍历整个搜索空间。通常采用greedy search或者beam search进行搜索,但这无法保证生成的诗句Gi是在给定上下文的情况下最优的。因此,我们可以利用Sequence-to-Sequence模型直接对古人诗句和上文诗句的关联性进行建模。具体如式(8)所示。

(8)

其中,Tn为Sn的长度,ct为Sn中的每个字。

式(8)中,我们实际度量的是,给定上文L1:i-1,神经网络模型生成某句古人诗句Sn的概率。对训练充分的Sequence-to-Sequence模型,我们在一定程度上可以认为,有更大概率生成的句子,其与上文的语义关联就更紧密。

2.4 多方法结合的评分函数

在实际实验中,即使预先根据格律对诗库进行筛选,初步得到的候选句的规模N非常大,通常在数万的量级。使用式(8)计算时,由于LSTM隐状态的计算以及Softmax等操作耗时极大,在实际应用中难以接受。基于生成结果的语义相似性评分的方法计算速度较快,LCS和句向量的余弦值的计算耗时较少,但是上下文关联性上表现欠佳。

图3 多方法结合评分结构图

因此,我们结合2.2和2.3的两种方法,先使用生成结果的语义相似性评分作为初步筛选,从古诗库中筛选出评分较高的候选子集。在候选子集中,再使用基于上下文生成概率的评分函数进行重排序,然后选取得分最高的一句。在第3节我们的实验结果表明,这种结合能取得生成速度和生成效果二者很好的平衡。

2.5 格律和押韵控制

在集句诗自动生成中,对古诗库诗句的格律和韵脚识别是非常重要的一部分工作,识别错误将导致集句效果大打折扣。难点在于一句诗句格律不明显和一字多韵的情况。

格律的识别是以整首诗的格律来确定诗中某一句的格律,这样可以一定程度上容错,但不影响集句效果。对于一字多韵的情况,同样根据一整首诗的整体确定一句话的韵脚。此外,我们做了单句的韵脚识别器,使用句尾词统计方法来确定一句诗的韵脚——考虑句尾两个字或三个字的情况下,在古诗库中的出现次数,选取出现次数较多的韵作为韵脚。

3 实验

3.1 实验数据和设置

本次实验数据收集了唐代到近现代的五言和七言诗,共389 857首诗,2 537 168句诗句。

从中随机选择5 000首诗歌作为验证集,五言和七言各占2 500首。除去测试集(测试集构造在3.2.2中详述)和验证集,其余诗歌作为训练集,用于训练神经网络模型。

本文的实验代码使用python和tensorflow1.4实现。在带Attention的Sequence to Sequence模型网络中,hidden size为512,word embedding size为256,激活函数为tanh。采用的优化算法是Adam,初始学习率为0.001,训练过程中使用的batch size为64。当模型在验证集上的损失函数收敛时停止训练。在我们的数据集上,约训练10个epoch左右能收敛。

3.2 实验与分析

3.2.1 评分函数的相关性分析

本文在生成句选取最佳匹配句的时候,使用了基于LCS和基于句向量的两种评分函数,以下将对两种评分函数的结果求Spearman相关系数。

这里选取了20个生成句,对生成句取基于LCS评分函数排序后的Top100候选句和基于句向量评分函数的Top100候选句,取这200句候选句并集求Spearman相关系数。实验得Spearman相关系数为-0.104。由此可见,使用基于LCS数和基于句向量评分函数的结果相关性并不大。

3.2.2 MRR评测

MRR(Mean Reciprocal Rank),即把标准答案在被评价系统给出结果中的名次取倒数后作为该答案的准确度,对所有标准答案的准确度取均值,以此来衡量评价系统的准确度。如式(9)所示。

(9)

将在古人创作的绝句中,我们分别选用第一句、第一和第二句、第一至三句作为输入, 第二、第三和第四句作为对应的标准答案。另外,以三种不同的筛选方法分别在数据集中选择999句同言数的诗句,给每个标准答案匹配对应的三组非标准答案集合。然后,通过计算标准答案在1 000句诗句中的准确度来评价不同的评分函数的效果。

所使用的三种筛选非标准答案的方法分别为:

1. 在数据集中随机选取同言数的诗句,记为测试集1;

2. 在数据集中随机选取句同言数、同格律、同韵脚(若押韵)的诗句,记为测试集2;

3. 在数据集中随机选取同言数、同格律、同韵律、与标准答案匹配两个字以上的诗句,记为测试集3。

在基于句向量的评分函数中,我们设计了基于1句生成1句的Sequence-to-Sequence模型和基于2句生成1句的Sequence-to-Sequence模型生成,分别用这两个模型的Encoder生成诗句向量。基于1句生成1句的Sequence-to-Sequence模型是以古诗库中连续的两句诗句分为作为输入和目标训练得到的模型。基于2句生成1句的Sequence-to-Sequence模型是以古诗库中连续的两句作为输入,紧接的第三句作为目标训练得到的模型。下面我们对以上两个模型使用测试集1进行MRR评测。原则上,2生1模型需要输入2句得到句向量,这里我们使用向2生1模型Encoder端输入一句话和同一句话输入两次的方法,求得两种不同的句向量。

从表1中可以看出,使用1生1模型的Encoder得到句向量和2生1模型(重复输入)的Encoder得到句向量能有比较好的MRR值。

我们对基于句向量的集句模型和基于生成概率的集句模型进行MMR评测。此外,我们引入了基于互信息的集句模型作为基线。对于上文L和候选句Sn,计算它们之间的互信息作为排序的依据。互信息的计算公式如式(10)所示。

(10)

其中,l和s分别为上文以及候选句中的单字,p(l,s)为古诗库中l,s同时出现在同一首诗的概率,p(l)为古诗库中l出现的概率。

由于基于LCS的集句模型的评分函数是非连续的,计算时无法得到一个准确的名次,故在本实验中并没有讨论。

表格1 基于句向量的评分函数 MRR评测结果

由表格2可见,基于生成概率(Prob)的集句模型计算得到的MRR值明显高于其他模型。基于生成概率(Prob)的集句模型和基于句向量(Vec)的集句模型在五言中的得分明显好于在七言中的得分。而在生成第三句时,我们的两个模型MRR值明显有降低。分析原因,是由于在绝句中,一般第三句都是起转折的地方,因此神经网络模型学习的效果会比其他位置的句子稍差。

表格2 MRR评测结果

3.2.3 集句效率分析

为了提高集句诗的生成效率,我们对古诗库的诗歌根据格律和韵进行划分建表,以便快速查找。对于LCS的计算,我们引入了倒排索引来大规模快速计算LCS。对于句向量的计算,我们预先计算每个句子对应的句向量并保存到内存中以提升计算速度,但由此也带来存储空间占用大的问题。以句向量是由1 024维的32位浮点数组成为例,存储250万句诗句对应的句向量存储空间将达到9.6GB。

根据实验统计,基于生成概率的集句模型平均集一首诗需要2 105.14秒,基于LCS的集句模型平均集一首诗需要62.83秒,基于LCS和生成概率相结合的模型平均集一首诗需要93.74秒,基于句向量的集句模型平均集一首诗需要4.91秒,基于句向量和生成概率结合的模型平均集一首诗需要5.99秒。

3.2.4 人工评测

我们收集了50首古人创作的集句诗。其中,五言绝句25首,七言绝句25首。对于每一首人创作的集句诗,我们以同样的首句作为输入,分别使用Jiju(LCS)、Jiju(LCS&Prob)、Jiju(Vec)、Jiju(Vec&Prob)四种集句模型进行集句生成,得出四首机器自动生成的集句诗。将古人创作的集句诗和自动生成的诗歌放在一起,组成50组,每组包含5首集句诗(组内顺序随机打乱)的人工测试集。

我们请了5位中国古典诗词的专家对该人工测试集进行打分。根据集句的上下文语义的连贯性、主题和意境是否鲜明进行打分,每首诗最高分5分,最低分1分。每位专家独立评分,相互之间不允许交流。同时,我们要求每位专家在打分时集中在诗歌质量上,忽略“诗歌是机器还是人类创作”这一因素。

由表3可见,使用联合生成概率的集句模型平均比非联合生成概率的集句模型得分明显要高。而基于句向量的集句模型会比基于LCS的集句模型略好,但无显著差距。

表格3 人工评测结果,平均评价得分

3.2.5 个例分析

我们随机选取了一些不同模型生成的集句诗(表格4)。对生成的七言集句诗, LCS生成的结果中,上下文有明显的矛盾。第三句“春在江山无限好”写春景, 第四句却写秋色,从而造成了季节上的矛盾。这是因为LCS仅仅考虑了句子局部子序列的匹配。如第四句,生成模型生成的原句是“夜深风雨不胜愁”,此句与上文并无矛盾之处。LCS进行匹配时,匹配了“夜深风雨”四个字,又因仅仅考虑本句的局部,忽略了上文,所以匹配句中带来了“秋”这一矛盾。

表格4 集句实例

对比之下,通过句向量相似度生成的集句诗整体质量上提升明显。第二句“不识花前人醉否”,点明了季节为春季。同时,第三句中“东风”紧扣“春”,“零落”也很好地承接了前一句的“花前”。第四句“拟于何处说来由”在语义上收束前三句,写出了诗人心中愁苦,于春花前借酒浇愁,但是这份苦痛却不知应该从何道起。

LCS&Prob模型对诗句整体的一致性和连贯性有所提升。第二句“芳草青青”点明春季,第四句“对花”也紧扣“春”。因生成概率本身对上下文关联性起到了约束作用,故模型在基于LCS考虑局部语义相似时,也能在一定程度上避免上下文矛盾。此外,Vec&Prob模型生成的集句诗比起单纯用句向量求近似的Vec模型,在整体意境上也有所提升。第一句描写闲适的春日景色。在这样的景致中,第二句里诗人却感叹,春风是不能理解自己的愁绪的。第三句借落花凋零,流水匆匆形象地展现了自己内心的愁苦,第四句借用王粲的典故,收束全篇,点出自己愁苦的原因——怀才不遇。这首诗完整描述了一个郁郁不得志的诗人形象,比起Vec模型的结果,Vec&Prob模型选择的句子意境更丰富,整首诗句子间的过渡也更好。

对生成的五言诗, Vec模型的结果中,前三句关联性较好,但是第四句“唯寻相鹤经”和上文内容无关。Vec&Prob模型则在上下文一致性上有明显提升。“花”、“蝶”、“柳”、“鸟啼”、“晓霞”, 整首诗描绘了一副微寒的春晨,静谧野外的景致。使用LCS模型的结果中,前两句写景,后两句抒情,但景和情之间缺少联系,转折过于突兀,从而破坏了连贯性。LCS&Prob的结果和Vec&Prob的结果类似,都是描绘了春季景色。区别在于,Vec&Prob的结果中,第四句“晓霞”点明了时间是清晨,很好地映照了第一句“花寒”的“寒”字,交代了花寒的原因。但是LCS&Prob的结果没有体现出这一点,因此稍逊一筹。

从上述分析可以较为直观地看出,生成模型概率能紧密约束上下文关联性,对局部字串匹配带来的信息丢失也能起到一定的缓解作用。

4 结论与未来工作

本文探究了深度神经网络在集句任务中的应用。基于神经网络自动学习诗句的语义表示,我们设计了一种结合生成结果语义和上下文生成概率的评分方法,提出了一种高效率、高质量的自动集句生成模型。

试验结果表明,将生成模型计算候选诗句的生成概率作为集句候选的标准,可以有效地自动选择出效果比较好的集句。计算句向量近似可以在保证质量的前提下,提高集句的生成效率。

我们将继续探究诗句相似性的评价算法。当前神经信息检索方法通过核函数计算句对之间的相似度,我们在今后的工作希望能够使用相关方法更好的计算诗句之间的相似度。

猜你喜欢

诗句语义向量
真实场景水下语义分割方法及数据集
向量的分解
聚焦“向量与三角”创新题
可以“吃”的诗句,你见过吗
读诗句,写成语
语言与语义
向量垂直在解析几何中的应用
“吃+NP”的语义生成机制研究
向量五种“变身” 玩转圆锥曲线
汉语依凭介词的语义范畴