返回 登录
2

撩一撩作诗机器人

作诗姬——这个“姬”的叫法应该是从那部著名的烧脑电影《机械姬》中延伸过来的。下图是《机械姬》这部电影的海报,虽然当时有不少看过这部剧的朋友跟我说看完后整个人都不好了,感觉世界有一天会被机器人玩坏,但我一直很乐观,我觉得这一天……估计我的有生之年看不到。好了,开个小玩笑我们来看作诗姬究竟是个什么玩意儿。

图片描述

作诗机器人作为一个玩具也好一个科学研究的领域课题也罢,很早就有人开始研究了。就但从数学模型角度来说,作诗姬应该属于隐马尔可夫模型的变种。

所谓隐马尔可夫模型HMM就是从时间序列的随机事件中去统计前后状态的转化概率。这种模型在NLP领域应用是非常广泛的,在作诗姬这种玩具中也少不了它抛头露面。
遇到这种命题,首先应该想到的是使用RNN模型(LSTM)来进行训练。因为RNN具有一种天生就最适合拟合隐马尔可夫模型的构造,所以这个大的思路应该是没有什么问题的。可是,中文有中文的特点,而且中文当中有一些令我们中国人最自豪的,最优美的韵律感,同时也是我们自己在尝试写诗的过程中最不好把握的东西——平仄和韵脚。隐马尔可夫模型可以统计出来在一个字后面出现另一个字是多大概率,而且可以有一定自由度地选择其中的一个字作为下一个接续字——可以选择概率最大的那个字,这种情况下一旦第一个字确定后,后面整个诗文理论上就是全部确定的;也可以按照概率从大到小排列,用概率的比例去生成一个 “不均匀的骰子”,使得下一个字的产生有一定变化。

图片描述

用隐马尔可夫模型生成字的时候,选择概率较大的字出现的目的是为了让语句更为通畅,因为两个字有较大概率紧邻出现的话大多是因为它们是一个词,或者在单字词盛行的古诗文中至少是词组或者常用短语。例如“红颜”、“春光”、“山河”、“相送”等。而概率小的邻接字含义很可能表示的是这两个字从来没有前后脚出现过,或者偶尔出现过那么一两次还是一个属于前面的词尾一个属于后面的词头的情况,那如果采用的话自然是狗屁不通。

图片描述

光是用隐马尔可夫模型去统计还是不够的,要生成一个有一定“含义”的诗文是需要有一定的意境和惯用词汇的。为此,有这样一本书作为辞典备用,叫做《诗学含英》,不过别找了京东上没有,这么偏门小众的书求助万能的淘宝吧。由于在五绝和七绝这样的诗律中是讲究押韵和平仄工整的,所以第二三四句实际上是根据第一句来生成的,它们的生成要在规则上与第一句呼应。那么就要先重点生成第一句,再一句一句按照规则去生成其余的句子。

图片描述

先给定一些Keywords,也就是关键词,作为这首诗的梗概、要义、主题,再到《诗学含英》中去寻找相关语汇。这样会找到一些备选词(Candidate lines),根据这些词汇生成所有可能的排列,并且挑选一个最为合适的充当第一句。就是满足下面的这个等式最大化。

图片描述

看上去又挺吓人,其实又是那个的连乘形式,是一系列概率的连乘形式,最大化的意思就是这些挑出来的备选词在我们统计的隐马尔可夫模型里究竟是怎么排列最顺溜,也就是一句话组成的最大似然度的白话解释。

图片描述

下面要出场的是这么个听着很高科技其实内容很普通的东西,一个叫CSM(Convolutional Sentence Model,卷积句子模型),一个叫RCM(Recurrent Context Model,卷积内容模型),还有一个叫RGM(Recurrent Generation Model,循环生成模型)。

图片描述

图片描述

图片描述

图片描述

图片描述

图片描述

由于内容片段都是从《诗学含英》中挑选出来的,又经过了若干次调整顺溜的过程,这样生成的内容就会相对比较通顺。这里还是有一些不好克服的问题,比如平仄和韵律。平仄就不用说了,把平仄规则做进去的话,就需要建立相应的限制条件,在生成的语句中进行过滤,只留下那些符合的,当然后果就是可能那些尚且通顺的句子被滤掉了,却留下了一些不大通顺的例子;而韵律方面也是做了一个Trick——就是只让二、四两句押韵,在生成的过程中会生成不止一个第二句,不止一个第四句,让它们充当候选集,然后过滤掉那些不押韵的而只输出押韵的。

图片描述

这篇论文的位置在:http://aclweb.org/anthology/D/D14/D14-1074.pdf,也有对应的代码,位置在:https://github.com/XingxingZhang/rnnpg。比较遗憾的是这套代码不是TensorFlow的,代码里有C++,有Java,有Python,混搭得很齐全,你会觉得前面谈了这么多RNN相关的理论概念然后突然在这里用了一个“假网络”。嗯,好吧,如果大家觉得它做得还比较LOW的话(事实上我也觉得它做得确实比较LOW),那么就试着自己把它改成一个TensorFlow版本的玩玩吧。大家请注意,这个工程是需要下载一个叫做MISC.tar.bz2的文件的,这里有所有的平仄和韵脚的相关文字,用来做过滤用的。

网上现在也有一些其他的产品可以生成类似的结果,比如稻香居作诗机,虽然笔者不确定它百分之百是使用RNN抑或其变种来制作的。当然,作诗机本来也可以不用RNN来做,就用基于统计的隐马尔可夫模型加“查字典”过滤的方式一样能够生成。

图片描述

图片描述

如果你在想给妹子写个有她名字的藏头诗而搜肠刮肚难以思考的时候,估计它……嗯,也帮不上什么忙,你需要重新写一个有藏头功能的作诗姬。反正算法的本质在基本理解之后,自由发挥的空间就有了。

图片描述

我想可能你也发现了,这些诗文虽然听起来文绉绉的,而且用词比较雅致。但是叙事的连贯性、意境这些东西跟人作的诗还是远没法比。所以,这些东西当做玩具应该还是比较称职的,真的指望它帮你搞定妹子……嗯,后果自负吧。所以我们还是撩机器人吧……

推荐图书:

白话深度学习与Tensorflow
ISBN:978-7-111-57457-6
作者:高扬
定价:69.00元
技术畅销书《白话大数据与机器学习》姊妹篇。以插图、类比和大量示例趣说深度学习网络的关键理念、算法与TensoeFlow实践,涵盖BP网络、CNN、RNN、深度残差网络、受限玻尔兹曼机、强化学习、对抗学习,以及多个有趣应用。YY大数据专家撰写,李学凌、朱频频、王庆法、王海龙联袂推荐。

图片描述

另外CSDN公众号(ID:csdnnews)还提供此本书籍的赠书,欢迎前往参与。

评论