今年春节,推荐三个 AI 工具为你写春联

6 年前

头条

推荐列表

资讯

Dao Wei

特色图像

by 超神经

—-

盼望着,盼望着,春节就要来了,今年春节有什么值得期待的事情么?不如趁着爸妈还没来得及催婚催生之前,先好好在家里表现一番。

比如给家里写写春联,或者再原创定制几个送给亲友,那我这里有三个机器人,能够帮你对对联,了解一下。

会对对联的 AI

这都 9012 年了,突然脑子一热打算找个 AI 来写个对联,借助万能的互联网,还真找到了三个 AI 工具。

微软的对联 AI ,是微软亚洲研究院的一个网页产品。 它最早要追溯到 2004 年关于自动对联的设想。

经过了这些年的变更,最新的版本由 15 年推出,它能快速的完成对对联的任务。

而且会提供多个选项,如果还不满意,会在每个对应的字上给你几种选择 。最人性化的在于可以按需要嵌入你喜欢的字。

这是一个简洁的网页对联系统,据说这是一位深藏不露的工程师的「练手项目」。

它于 2017 年 10 月发布,面世后意外的受到了广大吃瓜群众的喜爱,因为据说可以是一天的快乐源泉,还有网友专门录制了测试视频,上传到 bilibili 上。

而它使用的方式也很简单,给上联,立马回复你下联,毫无商量的余地,干净利落。

作者在网上抓取了几百万组对联数据,用 seq2seq 模型悬链除了现在的工具,完成后也将自己的数据集和模型都开源在了 Github 上。

它算是 AI 对联界的一位萌新,于一周前诞生,是一个接入公众号的 AI 模型。作者是在看到了一份对联的语料库之后,技痒难耐创作出来的。

使用的方法是在公众号的后台回复「上联 输入上联内容」,会得到下联,当然也有它对不出来的时候。

如果你忘记了输入上联,那后台就是一个聊天机器人。

是骡子是马,拉出来对对联

为了比较一下这三个 AI 工具的效果,我们进行了几轮测试,输出的顺序依次是微软对联、王斌对对联、 AINLP 对联的结果。

  • Round 1 :上联 谁是李飞飞

这一轮,除了微信机器人有些读不懂之外,另外两位选手都还算正常

  • Round 2 :上联 王思聪吃热狗

对于校长这个行为, AINIP 的机器人无法给出结果,直接开始卖萌了,哈哈哈哈,看来果然 AI 不知思聪富。

  • Round 3 :上联 人工智能写春联

这一轮三者各有特色,微软给出的「三叉神经」是要笑死我么,AINLP 的「鬼斧神工」也是有些莫名,第二位「自由自在」显得平淡了几分。

  • Round 4 :上联 落霞与孤鹜齐飞

对于这个经典的句子,王斌对对联给的结果也太调皮了吧。(事实上微软在选项里也提供了标准答案)

  • Round 5 :上联 爆竹声声辞旧岁

言归正传,还是要写春联。

可最后这一轮,结果上来看,都可以拿来挂门前了哇。

如何训练 AI 写春联?

看完了这些小工具,基本上能看出中国传统文化里,不仅古诗词、对子、对联,这些语言单元之间有着极强的规律性,非常适合通过机器来学习并容易自动化完成的事情。

  1. 使用 Encoder-Decoder 模型

Encoder-Decoder 框架可以看作是一种文本处理领域的研究模式,应用场景异常广泛。

抽象的 Encoder-Decoder 框架

Encoder-Decoder 框架可以这么直观地去理解:可以把它看作适合处理由一个句子(或篇章)生成另外一个句子(或篇章)的通用处理模型。对于句子对,目标是给定输入句子 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 都采用 RNN 模型来做。

Encoder-Decoder 生成下联

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

Encoder-Decoder 框架加上 Attention 应该会显著提升产生下联的质量,原因还是因为它是要求严格对仗的,所以在生成下联某个字的时候,找到对应上联相应字作为生成的重点参考信息无疑是非常重要的。

比如看到上联的「三」字,Attention 模型使得下联产生对应字「一」的时候重点参考上联的「三」这个字,应该知道对应的应该是一个数字型汉字。

Attention 模型

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

本质上 Encoder-Decoder 在解码阶段是能够学会语言模型的,而很明显语言模型的引入对于生成下联的可读性和语言一致性是很有帮助的。

但是如果训练数据不是那么大,相信通过使用大量古诗来训练一个诗词语言模型,在 Decoder 生成阶段,每个时间节点 t 生成很多可能的候选汉字,然后利用这个语言模型+Beam Search 应该能够使得生成的对联保证一定的语义一致性。

作为对联生成其实还有上下联对应汉字的平仄问题,也可以类似语言模型一样作为后处理的步骤进行筛选过滤。

  • 2. 使用 RNN 完成

使用 RNN 构建一个古诗词的语言模型,然后上联通过这个 RNN 语言模型自动生成。

图完全自动生成对联

此外,对于对联来说,还遗留一个小问题,就是对联的横批如何生成的问题。因为一般对联还需要配上一个横批来归纳上下联的主旨。

这个其实思路也是类似的,可以把上下联看做一个整体作为 Encoder 的输入,Decoder 用来生成横批即可,这个类似于用 Encoder-Decoder+Attention 做摘要的思路。

参考文献:

  • 1.https://blog.csdn.net/malefactor/article/details/51124732
  • 《使用 Encoder-Decoder 模型自动生成对联的思路》by 张俊林
  • 2.https://mp.weixin.qq.com/s/ettmrvz0SMpdBd5HU1xhnw
  • 《第一届人工智能对对联大赛》by 公众号:想当然
  • 3.https://duilian.msra.cn/app/couplet.aspx
  • 微软对联工具
  • 4.https://ai.binwang.me/couplet/
  • 王斌自动对对联系统
  • 5. 微信公众号对联工具:AINLP