/* 版权声明:可以任意转载,转载时请标明文章原始出处和作者信息 .*/

author: 张俊林

在我看到第一篇Encoder-Decoder模型的论文的时候,我就觉得用这个来作对联自动生成是再合适不过的了,做诗词应该也是比较适合的,但是相对诗词,用它来做对联肯定更合适。今天的文章就讲讲这方面的内容。这篇文章主体内容是2015年底形成的,本来我的打算是收集些训练数据,让Encoder-Decoder+Attention生成些对联把这篇文章补充些例子再发出去,不过因为精力原因,迟迟没有做这个实验,短期内可能也没时间做,所以干脆就现在分享出来,哪位有精力和兴趣可以实际做一下试试,这看上去没啥实际用处,但是还是挺好玩的一件事。不过我确信用这个模型做对联生成一定可以做好。

为什么说Encoder-Decoder模型适合作对联呢?因为相对诗词等任务来说,对联要求严格的上下联对仗,老话不是说了吗,以前儿童诗词启蒙时都要学一些对仗规则,比如:天对地,雨对风,大陆对长空,王八对绿豆,八戒对悟空(后面两句是本文作者诗才大发胡诌的,请未成年儿童切勿模仿或者在有大人监督场景下模仿@^^@)。这种严格的对仗关系意味着极强的映射规律性,而这个用RNN和Encoder-Decoder来说正好是能够发挥它们长处的地方,所以说Encoder-Decoder加上RNN配置是非常适合用来做对联的。

对联的严格对仗性可以给个小故事,大家直观感受下:

相传解缙少时家贫,其家有片对着地主家的一片竹林,于是他作了副对联:“门对千杆竹,家藏万卷书”。地主心说:我幼儿园肄业文凭,你在我面前你这么装有文化好吗?于是不爽,命人把竹子砍短,解缙灵机一动把对联加了一个字,改成:“门对千杆竹短,家藏万卷书长”。地主气不打一处来,放出功夫熊猫把竹子全吃了,解缙又改对联:“门对千杆竹短无,家藏万卷书长有”。气得地主直跳脚骂娘。

从这个故事我们可以归纳出中心思想就是:从古至今,有钱就是大爷,可以随便砍伐树木破坏生态而不被法律制裁@^^@…..不对,跑偏了,中心思想应该是:肄业的同学都容易创业成功,成为新时达的地主老财,而好好上学的大都免不了家贫的结局…..也不对,你看我这三观都歪到引力波都达不到的宇宙之外了,中心思想是:对联是有极强的对仗性的。而这种对仗性代表了什么?代表了语言单元之间极强的规律性,而这是非常适合通过机器来学习并容易做好的事情,这是为何我坚信用Encoder-Decoder做对联一定能够做好的原因。

|Encoder-Decoder模型

Encoder-Decoder框架可以看作是一种文本处理领域的研究模式,应用场景异常广泛。下图是文本处理领域里常用的Encoder-Decoder框架最抽象的一种表示:

图1. 抽象的Encoder-Decoder框架

Encoder-Decoder框架可以这么直观地去理解:可以把它看作适合处理由一个句子(或篇章)生成另外一个句子(或篇章)的通用处理模型。对于句子对<X,Y>,我们的目标是给定输入句子X,期待通过Encoder-Decoder框架来生成目标句子Y。X和Y可以是同一种语言,也可以是两种不同的语言。而X和Y分别由各自的单词序列构成:

Encoder顾名思义就是对输入句子X进行编码,将输入句子通过非线性变换转化为中间语义表示C:

对于解码器Decoder来说,其任务是根据句子X的中间语义表示C和之前已经生成的历史信息y1,y2….yi-1来生成i时刻要生成的单词yi

每个yi都依次这么产生,那么看起来就是整个系统根据输入句子X生成了目标句子Y。

|Encoder-Decoder自动生成对联

机器自动生成对联这个事情,可以分成两种情况,一种情形是:假设对联的上联是已经知道的,比如人自己想的,任务是由机器来自动产生下联;第二种情况是:假设要求上下联全部都由机器自动生成。明显第一种情况要求较低,相对简单,第二种情况要求较高,相对复杂。下面我们分述两者的可能解决思路。

情形一:已知上联,机器自动生成下联

假设我们已经拿到了上联,例如:“风云三尺剑”(注:这是我比较喜欢的一副对联的上联,作者左光斗先生,如果是你的话会对什么下联?),如何让机器自动生成下联?

很明显,这个问题直接可以由Encoder-Decoder框架来进行下联自动生成。这种场景是典型的Encoder-Decoder框架应用问题。我们所需要做的就是配置好Encoder-Decoder框架的具体模型,比如Encoder和Decoder都采用RNN模型来做,图2展示了用Encoder-Decoder框架做对联下联自动生成的架构图。

图2. Encoder-Decoder生成下联

只需要找到大量的对联数据对这个模型进行训练,那么即可利用这个模型,输入上联,机器自动产生下联了。

值得提的一点是,很明显,对于做对联这个事情来说,Encoder-Decoder框架加上Attention应该会显著提升产生下联的质量,原因还是因为它是要求严格对仗的,所以在生成下联某个字的时候,找到对应上联相应字作为生成的重点参考信息无疑是非常重要的。比如看到上联的“三”字,Attention模型使得下联产生对应字“一”的时候重点参考上联的“三”这个字,应该知道对应的应该是一个数字型汉字。图3是加上Attention模型的示意图。

图3. Attention模型

这里再插上一句,作为对联下联生成任务来说,使用Encoder-Decoder来做这个事情,我相信汉字之间的对仗关系应该能够很好地被学会,但是如何保证生成下联语义能够一致其实并不一定能够很好地解决。这是什么意思呢?意思是可能机器看到上联“风云三尺剑”,极有可能对出下面的内容:“雨风万丈刀”,单看每个字对仗的都很工整,但是作为一个整体,语义看上去不那么协调。(注:其实如果真对出这个下联,想想其实还是挺豪情万丈的,是吧?这其实跟人在意识上会把连续出现的字通过想象组合出一种合理语境有关。)

当然如果训练数据够大的话,这个问题应该不会太大,因为本质上Encoder-Decoder在解码阶段是能够学会语言模型的,而很明显语言模型的引入对于生成下联的可读性和语言一致性是很有帮助的。但是如果训练数据不是那么大,我相信通过使用大量古诗来训练一个诗词语言模型,在Decoder生成阶段,每个时间节点t生成很多可能的候选汉字,然后利用这个语言模型+Beam Search应该能够使得生成的对联保证一定的语义一致性。

到此为止,作为对联生成其实还有个问题,就是上下联对应汉字的平厌问题,这个也可以类似语言模型一样作为后处理的步骤进行筛选过滤。不过我觉得Encoder-Decoder也极有可能会学会这种平厌关系,因为这个规律还是很明显的,这点不确定,得通过实验来证明这一点。

情形二:对联由机器完全自动生成

上面讲的是如果上联是人给出的,机器如何自动产生和顺的下联。那么如果问题难度增加一下,如果上联也不知道,机器能够完全自动生成完整的一幅对联吗?

很明显,情形一是情形二的子问题,假设我们分两步来完全自动地生成对联,第一步是不论用什么方法,先生成一句上联。第二步根据上联自动生成下联。第二步明显可以使用情形一训练出的模型来做。所以情形二的关键问题转换为:如何在一无所知情况下生成一句上联?

我觉得这个子问题可以通过如下方式解决:使用RNN构建一个古诗词的语言模型,然后上联通过这个RNN语言模型自动生成,这从道理上是讲得通的。也就是说,整体架构如图4所示。

图4  完全自动生成对联

此外,对于对联来说,还遗留一个小问题,就是对联的横批如何生成的问题。因为一般对联还需要配上一个横批来归纳上下联的主旨。这个其实思路也是类似的,可以把上下联看做一个整体作为Encoder的输入,Decoder用来生成横批即可,这个类似于用Encoder-Decoder+Attention做摘要的思路。关键是有没有那么多训练数据是带横批的,我觉得这个挺悬的。

好了,通过以上方式,我相信能够构建一个看上去还不错的对联自动生成系统。

扫一扫关注微信号:“布洛卡区” ,深度学习在自然语言处理等智能应用的技术研讨与科普公众号

使用Encoder-Decoder模型自动生成对联的思路相关推荐

  1. Encoder-Decoder自动生成对联,要试试么?

    后台回复"20180717" 下载数据和代码 编程环境: Tensorflow Python 3.6 (实现了一份基于seq2seq的自动对联的代码,感兴趣的小伙伴可以下载学习) ...

  2. encoder decoder 模型理解

    encoder decoder 模型是比较难理解的,理解这个模型需要清楚lstm 的整个源码细节,坦率的说这个模型我看了近十天,不敢说完全明白. 我把细胞的有丝分裂的图片放在开头,我的直觉细胞的有丝分 ...

  3. [RNN实战]自动生成对联、古诗

    循环神经网络 1. LSTM模型 LSTM是一种RNN模型,LSTM 由Hochreiter & Schmidhuber (1997)提出,并在近期被Alex Graves进行了改良和推广.在 ...

  4. encoder decoder模型_3分钟|聊一聊 Decoder 模块

    微信公众号:NLP从入门到放弃 本文大概需要阅读 4.1 分钟 聊一下对 Decoder 的个人总结和理解,我保证里面大部分内容你没在别人那看过,绝对原创. 我先说一个很小的细节点,当时花了点时间才琢 ...

  5. NLP教程:教你如何自动生成对联

    桃符早易朱红纸,杨柳轻摇翡翠群 --FlyAI Couplets 体验对对联Demo: https://www.flyai.com/couplets 循环神经网络最重要的特点就是可以将序列作为输入和输 ...

  6. Transformer再下一城!DeepMind新模型自动生成CAD草图,网友:建筑设计要起飞了

    本文转载自:机器之心  |  作者:力元 深度学习的灵活性恰好适合于复杂的 CAD 设计,DeepMind 的研究者基于 CAD 草图与自然语言建模的相似性,提出了自动生成 CAD 草图的机器学习模型 ...

  7. 借助Transformer,DeepMind新模型自动生成CAD草图,网友:建筑设计要起飞了

    来源:机器之心 作者:力元 深度学习的灵活性恰好适合于复杂的 CAD 设计,DeepMind 的研究者基于 CAD 草图与自然语言建模的相似性,提出了自动生成 CAD 草图的机器学习模型. 在制造业中 ...

  8. 分享自动生成对联小工具的Python开发过程

    前段时间用Python写了个生成对联的小程序,程序主要功能就是可以生成对联图片,用指定的背景根据输入的对联内容在程序目录中生成对联图片.生成的图片文件如下所示: 打开一幅生成的图片可以看到如下效果: ...

  9. encoder decoder模型_如何突破Decoder性能瓶颈?揭秘FasterTransformer的原理与应用

    位来 发自 凹非寺 量子位 报道 | 公众号 QbitAI 4月9日,英伟达x量子位分享了一期nlp线上课程,来自NVIDIA的GPU计算专家.FasterTransformer 2.0开发者之一的薛 ...

最新文章

  1. Objective-C:MRC(引用计数器)获得对象所有权的方式(init、retain、copy等)
  2. 【Linux 内核】进程管理 task_struct 结构体 ③ ( real_parent 字段 | parent 字段 | group_leader 字段 | real_cred、cred字段 )
  3. 在阿里云里申请免费Https证书SSL
  4. Spark Streaming 实战案例(二) Transformation操作
  5. 如何快速正确的安装 Ruby, Rails 运行环境
  6. linux切换任务命令,Linux top详解之交互命令、命令行选项
  7. Android开发环境搭建与入门Hello World
  8. DelayedProduce分析
  9. 【Flink】Flink 的输出 Output CountingOutput
  10. 【亲测有效】vs2017无法断点
  11. hillstone debug 抓包
  12. eigen 在线手册
  13. 冷血格斗场和热血格斗场
  14. php redis 传递闭包,有向图传递闭包 - osc_wff1160a的个人空间 - OSCHINA - 中文开源技术交流社区...
  15. 算法模型评价详解:confusion matrix Accuracy Precision Recall F1 调和平均 加权F1 Micro-F1 Macro-F1 PRC ROC AUC
  16. 电子信息(非全)考研分析——大连理工VS哈工程
  17. 《汇编语言》王爽(第四版) 第十六章 实验16
  18. python玩王者荣耀皮肤_爬取王者荣耀皮肤图片
  19. 交通事故自助系统小程序
  20. awk file1 file2问题总结

热门文章

  1. dva是什么游戏_Dva爱你哟 她原来就是韩国少女宋哈娜原型
  2. 计算机一级如何启动ie浏览器,ie,详细教您怎么解决ie浏览器打不开的问题
  3. 如何创建一个不确定长度的数组
  4. XCODE - Failed to create provisioning profile
  5. 3d模型多怎么优化_高德地图又出逆天黑科技!全国各大城市模型直接获取
  6. 计算机网络教程第五版|微课版 - 第四章 网络层 - 习题【补充】
  7. Vue3的vue-router超详细使用
  8. 自学计算机键盘基础知识,刘坚强办公学《新手学五笔打字》1-2 功能键区,电脑键盘功能基础知识按键详解...
  9. 搬家后计算机总重启,电脑老是开机后不久(几分钟)自动重启,重启一两遍后就可以正常运行...
  10. mysql 修改字段值语句_mysql修改字段语句