后台回复“20180717”

下载数据和代码

编程环境:

  • Tensorflow

  • Python 3.6

(实现了一份基于seq2seq的自动对联的代码,感兴趣的小伙伴可以下载学习)

另外,点击阅读原文尝试微软的自动对联系统(http://duilian.msra.cn/app/couplet.aspx)


为什么说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模型自动生成对联的思路

    /* 版权声明:可以任意转载,转载时请标明文章原始出处和作者信息 .*/ author: 张俊林 在我看到第一篇Encoder-Decoder模型的论文的时候,我就觉得用这个来作对联自动生成是再合适不 ...

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

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

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

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

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

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

  5. 鼠年春节,用 GPT-2 自动写对联和对对联

    鼠年春节临近,来试试新的基于 GPT2-Chinese 自动对联系统:自动写对联(输入开头进行对联自动生成)和自动对对联(输入上联自动写下联).老的自动对联功能是去年基于深度学习机器翻译模型上线的一个 ...

  6. 输入关键字生成对联_对联生成器

    详情 对联生成器app是一款非常专业的手机对联生成神器.对联生成器app可以根据用户输入的关键字一键生成对联.对联生成器app还收藏了海量的精美对联内容,用户如果没有关键字要输入,可以在里面寻找自己喜 ...

  7. 基于深度学习的对联自动生成系统

    对联自动生成系统 1.项目目标 设计一个基于深度学习的对联生成系统.最终结果可以是一个简单的界面,在界面中,我输入一句上联,通过点击相应按钮,系统生成相应下联并显示出来. 2.国内外相关工作 对联是属 ...

  8. 微软对联服务器关闭了吗,不只对联,现在微软还能自动生成绝句

    " 日出江花红胜火 " 是白居易回忆江南美景的词作<忆江南>中的句子,如果你还记得这首词,应该知道下一句是 " 春来江水绿如蓝 ".对仗工整,意境也 ...

  9. 基于深度学习的春联自动生成系统 实验记录

    基于深度学习的春联自动生成系统主要分成两个方面: 1.数据集构造 2.模型搭建 本文将主要从这两个方面展开,之后将介绍实验结果和结果分析. 目录 一.[数据集构造] 1.分词方面 2.编码方面 3.数 ...

最新文章

  1. 用C语言解“求整数段和”题
  2. 宇宙中至少有两种方式能灭绝人类,第一种仅需两秒
  3. 30岁二刷博士,17个月发6篇一作获顶会最佳!现实版人生重开模拟器
  4. Android 读取assets文件下的txt文件
  5. 字符串扩展_JAVA
  6. PowerShell脚本遇到的问题汇总
  7. 【转】深入了解CPU两大架构ARM与X86
  8. 微信公众号消息模板开发
  9. 注解之RetentionPolicy,ElementType
  10. (C# TCP异步)客户端异常断开,服务器利用KeepAlive监测
  11. JavaWeb—优化JDBC代码
  12. Opencv图像显示
  13. 64位java_java64位
  14. python+java家庭理财个人理财管理系统记账系统
  15. 微软商店下载的python 的 pip 不能修改 config 的解决方法
  16. 计算机的开机自检由什么程序完成,开机自检,教您怎么取消电脑上的开机自检...
  17. jdk7下载、安装与测试
  18. 微信分享 无法获取到分享状态的问题-微信分享功能调整
  19. 浅谈零知识证明之二:简短无交互证明(SNARK)
  20. C++笔记 蒙特卡罗计算π值

热门文章

  1. linux求两个文件的交集,并集,差集
  2. 《每天演好一个情绪稳定的成年人》摘录
  3. matlab如何打开flt文件,FIT文件格式解析及MATLAB读取程序
  4. 使用JavaScript DOM制作简单留言板
  5. 程序员是否可以在家办公——在家办公的利与弊
  6. php redis 群发邮件,redis的简单使用 异步发送邮件
  7. 质量品质征文《质 量 是 一 种 态 度》
  8. 忠金融惠生活缺陷报告
  9. json 转 csv python
  10. adobe air linux centos,Ubuntu 11.10 安装Adobe Air 和卸载Air中的软件