原文首发在wx公众号上:
生成模型一直是我认为的非常有意思的东西,记得以前同事搞过一个生成藏头诗的模型,可以根据输入的名字来生成藏头诗,当时就感觉非常有趣。
前两天又和朋友聊起来生成模型,朋友说他做了个诗词生成的实验,效果还蛮不错的,于是自己也想实验一下试试。
先来看下生成效果,感觉还不错:
1. 训练语料准备
github上有很多整理好的开源的诗词资源,这里选择了 chinese-poetry 这个开源的库,里面的诗词非常多,足以用作生成模型的训练语料了。
json格式的语料,解析起来很方便。其中部分诗词的内容截图如下:
2. 模型设计
模型就使用经典的 sequence to sequence 模型Bi-LSTM+attention。
模型的结构图如下:
3. 模型训练
loss 可视化展示:
从下降的loss可以看出来模型有在逐渐收敛。
loss降到 31~32之间的时候模型基本收敛了,生成的诗句看起来也比较通顺。
loss之所以会偏高,我理解主要是诗词的自由度比较高,模型生成的句子很难与原句一模一样。另外,我们也并不需要生成和原句一样的模型,更需要的是模型通过对诗词的学习,来进行它自己的创作。
4. 效果展示和分析
训练好模型之后,我们从对仗、平仄、情感三个角度来看看这个AI生成的诗句效果如何。
(1)对仗分析:
对仗又称队仗、排偶。它是把同类或对立概念的词语放在相对应的位置上使之出现相互映衬的状态,使语句更具韵味,增加词语表现力。
比如我们小学的时候就背过的 “天对地,雨对风。大陆对长空”,正是经典的对仗思想。
对仗是诗词的一种常见结构,我们就先来分析一下生成诗句的对仗是否工整:
可以看出,模型可以生成一些对仗工整的下句,有些句子甚至可以说是比较优美的。
(2)平仄分析:
平仄是中国诗词中用字的声调。“平”指平直,“仄”指曲折。
对应到普通话的四声中,我们可以简单理解成,第一声、第二声是平声;第三声、第四声是仄声。
那么我们姑且按照这个规律,简单分析一下生成诗句的平仄是否对应。
可以看出从平仄的角度来说,模型获得的下句有一部分诗句是基本符合平仄规整的,读起来可以也算是朗朗上口。
(平仄分析纯属我百度之后的个人理解,如有不当,欢迎指出)
(3)情感分析:
很多诗词通常都是作者表情达意的工具,因此如果只符合对仗和平仄这两个规律,诗句难免显得没有灵魂,所以我们来看看生成诗句里会不会有一些升华的情感表达。
比如下面几句看起来就照猫画虎地学到了一些神奇的情感:
看起来模型最喜欢回答的就是 “不知道”了。。。
当然啦,也有奇奇怪怪狗屁不通的,比如这些——
所以模型还需要更多的先验知识来帮助学习。
5. 总结
从生成的结果可以看出来,模型可以成功地学习到词语结构上的对仗,甚至可以学习到一些平仄特点,有些生成的下句,细读来甚至有点引人深思的味道。
其实这特点都包含在诗词的文字使用的规律中,只要有规律,模型就可以学习到。
另外,一般像是叙事类的诗词,一整首诗才是一个完整的故事,只看其中上句来对下句,很显然无法生成情节完整情感连贯的故事。
但是仍然可以看到,生成的诗句还是可以给出一些惊喜的,甚至有些句子还能读出一些莫名其妙的哲理来,也是非常有意思。