一种外部知识增强的幽默文本生成方法
阅读说明:本技术 一种外部知识增强的幽默文本生成方法 (Humor text generation method with enhanced external knowledge ) 是由 吕建成 张航 杨可心 彭德中 彭玺 孙亚楠 贺喆南 于 2020-03-11 设计创作,主要内容包括:本发明公开了一种外部知识增强的幽默文本生成方法,该方法包括对短笑话数据集预处理得到主体句-背景知识-妙语句对齐的数据,构建幽默文本生成模型,利用幽默文本生成模型生成幽默文本。本发明提出利用图注意力网络来聚合一个笑话主体句的背景知识图,增强节点表达,并提出将背景知识图融合到妙语句解码器中,从而实现给定主体句及相关的背景知识,能够生成富含幽默感的妙语句。(The invention discloses an external knowledge enhanced humorous text generation method, which comprises the steps of preprocessing a short joke data set to obtain data with aligned main sentence-background knowledge-musicial sentence, constructing a humorous text generation model, and generating a humorous text by using the humorous text generation model. The invention provides a background knowledge graph for aggregating a joke subject sentence by utilizing a graph attention network, enhances node expression, and fuses the background knowledge graph into a smart sentence decoder, thereby realizing the given subject sentence and related background knowledge and generating a smart sentence rich in humorous sense.)
技术领域
本发明属于文本生成技术领域,具体涉及一种外部知识增强的幽默文本生成方法。
背景技术
幽默,描述一种有趣,可笑,蕴含深意的语句表达。它具有鲜明的文化特征,用诙谐、轻松或是讽刺的语言形式表现说话人想要表达的事物。随着人工智能技术迅猛成长,人们对计算机能力的期望也日益增高。“微软小冰”,“小爱同学”,“天猫精灵”等智能助手大火的重要原因之一,就是它们良好的交互能力。我们希望智能助手在交流中更具有情感和温度,也就是具有更高的情商。幽默被认为是交流中情商,“温度”的重要表现,在智能助手,对话生成等应用领域有着重要的意义。目前,智能助手中的对话生成技术大多是用检索,匹配式,虽然能够给出幽默的应答,但是并不能分析,理解,只是根据人们的聊天数据进行复制回应。根据乖讹论,幽默的语言,即笑话一般由主体(set-up)与(punchline,也称妙语)两部分构成,例如,“希特勒早上都吃什么?吃犹太人!”中,主体句“希特勒早上都吃什么?”,提供笑话的背景,包含读者的预期。妙语句“吃犹太人!”通常在笑话的结尾,产生出其不意的效果,令人发笑。
近年来,幽默的可计算生成得到越来越多的注意,这些工作主要对固定的模板进行填充,或者进行词语替换来产生幽默。但是,目前很少有研究人员对更加开放形式的幽默生成进行研究。此外,对于人来说,了解背景知识在理解,生成笑话中是至关重要的。例如上述例子中,如果要从这句话中感受到幽默,就必须了解到有关希特勒的背景,这些必须通过通用的外部知识进行导入。但是据我们所知,在目前的计算幽默研究中,笑话的背景知识并未被引入。
文章“迈向创造性语言生成:汉语幽默自动生成的探索”中,首次使用深度学习的方式进行妙语句生成,他们采用了Seq2Seq网络以及生成对抗网络,取得了一定的效果。但是在他们的算法中,并没有考虑到笑话背景知识的因素,会导致模型对主体句感知不足,无法生成关联性强的笑点句,从而使幽默的效果大打折扣。
发明内容
针对目前幽默生成方法形式固定和背景知识缺乏等问题,本发明提供了一种外部知识增强的幽默文本生成方法。
为了达到上述发明目的,本发明采用的技术方案为:
一种外部知识增强的幽默文本生成方法,包括以下步骤:
S1、获取短笑话数据集并进行预处理,得到主体句-背景知识-妙语句对齐的数据;
S2、构建包含背景知识编码器、主体句编码器和背景知识融合的妙语句解码器的幽默文本生成模型;
S3、利用步骤S2构建的幽默文本生成模型对步骤S1得到的主体句-背景知识-妙语句对齐的数据进行处理,生成幽默文本。
进一步地,所述步骤S1具体包括以下分步骤:
S1-1、获取短笑话数据集,并进行笑话过滤、笑点分割和笑话去重复处理;
S1-2、将短笑话数据中的最后一个句子作为妙语句,其它句子作为主体句;
S1-3、使用实体链接工具TagMe将主体句中的实体链接到维基百科网站,获得实体的维基百科标题;
S1-4、使用SPARQL将实体链接到Wikidata并获得与实体相关的三元组,得到主体句-背景知识-妙语句对齐的数据。
进一步地,所述步骤S2具体包括以下分步骤:
S2-1、根据背景知识三元组构建背景知识图;
S2-2、采用背景知识编码器将背景知识图的邻近节点的特征进行融合,获取背景知识的隐藏特征;
S2-3、采用主体句编码器对主体句进行编码处理;
S2-4、将步骤S2-2获取的背景知识的隐藏特征和S2-3获取的主体句的隐藏特征整合到妙语句解码器的当前状态中,采用背景知识融合的妙语句解码器对妙语句进行解码处理。
进一步地,所述步骤S2-1具体包括以下分步骤:
S2-1-1、将背景知识三元组中的共引用实体折叠成单个实体节点,并将关系映射到关系节点;
S2-1-2、添加一个反向关系节点;
S2-1-3、采用双向长-短期记忆网络对实体和关系节点中的文本信息进行编码,采用最后的隐藏状态作为节点的初始特征。
进一步地,所述步骤S2-2具体为:
设定背景知识图为G=(V,E,Hl),V={v1,v2,...,vI},节点vi的初始化特征为每个节点通过一种多头注意力的机制融合邻居的信息来更新特性,表示为:
在第l层,节点vi的特征是M是多头注意力运算中的头数,||表示M头注意力的运算结果进行拼接,表示节点vi的一跳的邻居节点,σ为激活函数,将和映射到第m头子空间。
进一步地,所述步骤S2-3具体为:
将经过词汇嵌入和位置编码的主体句序列设为{x1,x2,...,xp},然后输入到编码器模块的多个子层中进行处理。
进一步地,所述子层的处理步骤具体为:
A1、输入的序列{x1,x2,...,xp}经过多头自注意力运算,得到各元素的全局信息表达{x′1,x′2,...,x′p};
A2、进行残差连接并进行层规划化,表示为:
{l1,l2,...,ln}=LayNorm({x1+x′1,x2+x′2,...,xp+x′p})#
A3、经过前馈神经网络得到序列{f1,f2,...,fn};
A4、进行残差连接并进行层规划化,表示为:
{f′1,f′2,...,f′n}=LayNorm({l1+f1,l2+f2,...,ln+fn})#
A5、将{f′1,f′2,...,f′n}传递给下一个子层,重复N遍子层操作;
A6、得到最终主体句编码表达{q1,q2,...,qp}。
进一步地,所述步骤S2-4具体包括以下分步骤:
S2-4-1、设定知识编码器获得的节点特征为H={h1,h2,...,hI},主体句编码器获得的编码序列为Qp={q1,q2,...,qp},此时解码器的输入序列为Yt={y1,y2,...,yI}。使用多个相同的包含自注意力层、主体注意力层、知识融合层和线性层的模块计算解码端词汇表示;
S2-4-2、在第n块中,目标句Yt={y1,y2,...,yI}在经历多头掩码自注意力计算、与主体句表达Qp={q1,q2,...,qp}进行过多头注意力计算后,隐藏状态表示为
S2-4-3、将知识特征整合到当前状态,表示为:
An=MultiHead(Sn,H,H)
S2-4-4、引入门控机制,表示为:
Gate(Sn)=λnSn+(1-λn)An
S2-4-5、将特征输入到Transformer的前馈层,在N块操作之后,得到最终状态{e1,e2,...,et};
S2-4-6、生成下一个目标词yt+1的概率分布,表示为:
P(yt+1|X,K,y<=t;θ)∝exp(Woet),
其中是模型参数,|vy|是目标的词汇表大小。
本发明具有以下有益效果:本发明提出利用图注意力网络来聚合一个笑话主体句的背景知识图,增强节点表达,并提出将背景知识图融合到妙语句解码器中,从而实现给定主体句及相关的背景知识,能够生成富含幽默感的妙语句。
附图说明
图1是本发明的外部知识增强的幽默文本生成方法流程示意图;
图2是本发明实施例中幽默文本生成模型架构示意图;
图3是本发明实施例中集束搜索示意图。
具体实施方式
为了使本发明的目的、技术方案及优点更加清楚明白,以下结合附图及实施例,对本发明进行进一步详细说明。应当理解,此处所描述的具体实施例仅用以解释本发明,并不用于限定本发明。
如图1所示,本发明实施例提供了一种外部知识增强的幽默文本生成方法,包括以下步骤S1至S3:
一种外部知识增强的幽默文本生成方法,包括以下步骤:
S1、获取短笑话数据集并进行预处理,得到主体句-背景知识-妙语句对齐的数据;
在本实施例中,步骤S1具体包括以下分步骤:
S1-1、获取短笑话数据集,并进行笑话过滤、笑点分割和笑话去重复处理;
本发明选择短笑话数据集和Reddit-Joke数据集作为原始数据,这两个数据集在Kaggle网站上上是公开的。然后执行笑话过滤、笑点分割和笑话去重复。首先删除包含特殊字符的数据,只保留至少有两句话,每句话至少15个单词的笑话。
为了消除重复,我们使用BOW(bag of words)和余弦距离来检测句子相似性,被过滤相似度大于0.93的笑话。
S1-2、将短笑话数据中的最后一个句子作为妙语句,其它句子作为主体句;
S1-3、使用实体链接工具TagMe将主体句中的实体链接到维基百科网站,获得实体的维基百科标题;
为了获得背景知识,我们使用实体链接工具TagMe,它将出现在主体句中的实体链接到维基百科网站上。为了保证实体链接的可信度,我们只保留可信度大于0.1的实体。
S1-4、使用SPARQL将实体链接到Wikidata并获得与实体相关的三元组,得到主体句-背景知识-妙语句对齐的数据。
获得实体的维基百科标题之后,使用SPARQL将实体链接到Wikidata并获得与实体相关的三元组。最终得到了约10700对主体句-背景知识-笑点句对齐的数据。
S2、构建包含背景知识编码器、主体句编码器和背景知识融合的妙语句解码器的幽默文本生成模型;
在本实施例中,幽默文本生成模型架构如图2所示,步骤S2具体包括以下分步骤:
S2-1、根据背景知识三元组构建背景知识图,具体包括以下分步骤:
S2-1-1、将背景知识三元组中的共引用实体折叠成单个实体节点,并将关系映射到关系节点;一个三元组中的主题、关系和对象节点依次连接。
S2-1-2、为了允许对象的信息流入主题节点,添加一个反向关系节点;反向关系节点的内容是源和<rev>符号的连接。例如,(苹果,是一种,水果)这个三元组,本发明会构建四个节点,即苹果,是一种,水果,是一种<rev>。
S2-1-3、采用双向长-短期记忆网络对实体和关系节点中的文本信息进行编码,采用最后的隐藏状态作为节点的初始特征。
由于Wikidata中的实体和关系通常是多字表达式,本发明用双向长-短期记忆网络(Bi-LSTM)对这些词进行编码。本发明采用最后的隐藏状态作为节点的初始特征。最后得到一个连通图G=(V,E,H0),其中V是节点集合,E是边集合,H0是V的初始特性集合。
S2-2、采用背景知识编码器将背景知识图的邻近节点的特征进行融合,获取背景知识的隐藏特征,具体为:
设定背景知识图为G=(V,E,Hl),V={v1,v2,...,vI},节点vi的初始化特征为每个节点通过一种多头注意力的机制融合邻居的信息来更新特性,表示为:
在第l层,节点vi的特征是M是多头注意力运算中的头数,||表示M头注意力的运算结果进行拼接,表示节点vi的一跳的邻居节点,σ为激活函数,将和映射到第m头子空间。
本发明通过等式2来计算每条边的连接权重这种计算方式也可表达为Hl+1=MultiHead(Hl,Hl,Hl)。
本发明通过图注意力网络的方式,在每一层计算每个节点与其相邻节点的注意力权重,并根据注意力权重加权求和更新自身特征,通过这种方式,每个节点能够聚合周围节点的信息,具有更好地表达能力。
S2-3、采用主体句编码器对主体句进行编码处理,具体为:
将经过词汇嵌入和位置编码的主体句序列设为{x1,x2,...,xp},然后输入到编码器模块的多个子层中进行处理。
所述子层的处理步骤具体为:
A1、输入的序列{x1,x2,...,xp}经过多头自注意力运算,得到各元素的全局信息表达{x′1,x′2,...,x′p};
A2、进行残差连接并进行层规划化,表示为:
{l1,l2,...,ln}=LayNorm({x1+x′1,x2+x′2,...,xp+x′p})#
A3、经过前馈神经网络得到序列{f1,f2,...,fn};
A4、进行残差连接并进行层规划化,表示为:
{f′1,f′2,...,f′n}=LayNorm({l1+f1,l2+f2,...,ln+fn})#
A5、将{f′1,f′2,...,f′n}传递给下一个子层,重复N遍子层操作;
A6、得到最终主体句编码表达(q1,q2,...,qp}。
S2-4、将步骤S2-2获取的背景知识的隐藏特征和S2-3获取的主体句的隐藏特征整合到妙语句解码器的当前状态中,采用背景知识融合的妙语句解码器对妙语句进行解码处理,具体包括以下分步骤:
S2-4-1、设定知识编码器获得的节点特征为H={h1,h2,...,hI},主体句编码器获得的编码序列为Qp={q1,q2,...,qp},此时解码器的输入序列为Yt={y1,y2,...,yI}。使用多个相同的包含自注意力层、主体注意力层、知识融合层和线性层的模块计算解码端词汇表示;
S2-4-2、在第n块中,目标句Yt={y1,y2,...,yI}在经历多头掩码自注意力计算、与主体句表达Qp={q1,q2,...,qp}进行过多头注意力计算后,隐藏状态表示为
S2-4-3、知识融合层包括一个多头注意力层和一个受Highway Network启发的门控机制,本发明将知识特征整合到当前状态,表示为:
An=MultiHead(Sn,H,H)
S2-4-4、由于实体链接工具的不准确性,背景知识图中的节点信息可能包含噪声。为了解决这个问题,本发明引入门控机制,可以在背景知识的影响和来自设置编码器的信息之间更好地权衡,表示为:
Gate(Sn)=λnSn+(1-λn)An
其中λn表示门控权重,由下列式子计算得到
其中为网络参数。
S2-4-5、将特征输入到Transformer的前馈层,在N块操作之后,得到最终状态{e1,e2,...,et};
S2-4-6、生成下一个目标词yt+1的概率分布,表示为:
P(yt+1|X,K,y<=t;θ)∝exp(Woet),
其中是模型参数,|vy|是目标的词汇表大小。
S3、利用步骤S2构建的幽默文本生成模型对步骤S1得到的主体句-背景知识-妙语句对齐的数据进行处理,生成幽默文本。
在本实施例中,本发明采用常用的训练方式对幽默文本生成模型进行训练,训练过程为:
输入:训练数据集D={(X1,Y1),(X2,Y2),...,(Xn,Yn)}
超参数:网络参数,学习率η、最大迭代轮数epoch、批处理数据大小batch_size.等
过程:
1:初始化网络参数
2:while迭代次数<epoch
3:while迭代次数<((D的大小)/batch_size+1)
4:获取数据大小为batch_size的数据
5:前向传播,计算loss
6:反向传播,更新网络参数
7:保存网络参数
8:打印训练集,测试集loss
输出:
训练后的序列到序列网络模型
模型在训练集,测试集上Loss随迭代次数的变化曲线
在模型上的测试结果
在测试阶段,模型目标是取概率最高的一个句子作为输出。每一个时间步的输出就是之前时间步的输入。每一个时间步网络的输出都是离散概率的分布,我们需要从中进行采样,作为下一个时间步的输入。在这个采样过程中,通常有两种方法,一种是贪婪搜索,一种是集束搜索。贪婪搜索算法的思想很简单,即采取从网络的输出中采样最大概率的词语,作为下一个时间步的输入。但是这样就会出现一个问题,每一步的最大概率并不代表最终生成的文本序列概率最高,会有很大的几率忽略掉潜藏的高概率序列。因此集束搜索更加符合需求。
集束搜索作用在每一个时间步的输出采样阶段,该算法只留存下可能性大的几个结点。即在网络每一步输出中,挑选k个概率较高的节点保存下来,最终生成的序列就会避免贪婪搜索的局部最优问题,如图3所示。
在该示意图中,假设字典只有五个字,解码器每一个时间步输出字的离散概率分布,集束搜索每一步保存两个概率最高的节点。目标是获取可能性最大的一句话。如果采用贪心搜索,每一步都选择概率最大的,结果就会是“你爱国</s>”,但是该句子的概率并没有“我爱国</s>”的可能性高,产生了忽略潜在最高概率的句子。而集束搜索每一步选择可能性最高的两个节点,就能很大程度地选取最高概率的句子。
本领域的普通技术人员将会意识到,这里所述的实施例是为了帮助读者理解本发明的原理,应被理解为本发明的保护范围并不局限于这样的特别陈述和实施例。本领域的普通技术人员可以根据本发明公开的这些技术启示做出各种不脱离本发明实质的其它各种具体变形和组合,这些变形和组合仍然在本发明的保护范围内。
- 上一篇:一种医用注射器针头装配设备
- 下一篇:一种基于机器学习的文章断句方法