国学与传统文化

你也可以是大文豪,利用人工智能在线写唐诗宋词

2019-05-13  本文已影响4人  Keylong

物由来造化工

夫元自有英雄

中富贵皆无用

得文章第一功

来一笑浑忘却

处逢人欲问谁

慧于今何所用

将心事付吾儿

原文地址:

你也可以是大文豪,利用人工智能在线写唐诗宋词 | PopMars-专注共享资源​www.popmars.com

AI诗人概述

你也可以是大文豪,利用人工智能在线写唐诗宋词 | PopMars-专注共享资源AI诗人概述

AI诗人–Totoro,她才华横溢,学富五车,能唐诗,善宋词,会元曲,可诗经,能模仿指定诗人,现代诗更是信手拈来,平仄押韵不在话下,更能情感识别、语义联想。

除却诗歌,满腹经纶的她一挥墨宝便是一曲媲美林夕的绝世歌词。

数据抓取

(1)网易云音乐—歌词

数据包括:网易云音乐所有华语歌手、乐队组合的共6945位歌手的全部总计大约23.4万首歌的歌词(也即网易云音乐几乎所有中文专辑的含有歌词的歌曲的歌词),并且分为男、女和乐队组合三类。

数据大小:歌词234870首,爬取数据309MB

(2)中国诗歌网–现代诗 http://www.zgshige.com/

数据包括:中国诗歌网几乎全部现代诗,约22.4万首。

数据大小:现代诗224332首,总计3755249行,爬取数据116.5MB

(3)古诗文网–古诗词 https://www.gushiwen.org/

数据包括:古诗词网推荐栏的全部总计10000首诗,以及诗文栏的全部”猜你喜欢”部分包含的所有总计7593首最富盛名的诗篇。

数据大小:推荐栏10000首,诗文栏7593首,合并后一共14551首诗歌,数据处理后4647KB。

规则写诗

poetize.py

只需双击运行即可根据提示生成诗歌

输入:序号用来选择语料库、格式要求等

也可以自定义格式:输入词性对应的简码,自动生成古诗、词、诗经和现代诗,详见代码以及自由创作时根据提示输入h获取的帮助。

输出:符合要求的唐诗、宋词、宋诗、诗经、现代诗

poetize_plus.py

在之前的基础上加入了平仄和押韵,平仄每个字都严格遵守古诗平仄要求,押韵严格遵守十三辙要求,并且符合根据首句是否押韵而平仄不同的古诗音韵和谐的要求。

还自定义韵脚,方式为输入一串字符,程序将自动识别最后一个字的韵脚在十三辙中属于第几辙,生成押这个辙的古诗。

接入了自然语言处理库snowNLP,用于情感倾向分析。

Demo:

机器学习写诗

(1)chinese_poem

根据输入的诗人,读模仿其风格创作诗词

输入:python main.py -m train/test/head -p 李白/杜甫/苏轼/白居易……

输出:模仿该诗人风格的诗词

创作前首先进行train训练,250个epoch左右就基本拟合了。理论上可以模仿任何产量不是太低的诗人,只需简单修改dataset内的“提取诗人.py“文件,即可提取其诗歌,然后按照上述输入格式运行训练即可,不用更改main.py文件。

(2)lyrics_writer

输入语料库类型和开头,自动写歌词/现代诗

输入:python main.py 0/1 -cd 华语男歌手/华语女歌手/modern/华语乐队与组合

输出:给定开头的歌词/现代诗

0表示训练,1表示创作,-cd传入训练的内容,无需更改文件。

(3)poet_master

机器学习创作自由诗、押韵诗、藏头诗、藏字诗

输入:

自由诗: python main.py 1

押韵诗: python main.py 2

藏头诗: python main.py 3 四个汉字

藏字诗: python main.py 4 随意数量汉字,将尽可能全部覆盖

更改自github上star上百的在网页上写诗的”小诗姬”,改成了命令行版本。

数据分析

数据集词云分析

现代诗词云:可见一开头的双字词最为现代诗人所喜爱,生命、落叶等表面现代诗的哲思性,以及思念、温暖、温柔展现了诗歌抒情的一面。

诗经词云:君子、四方、我心在意料之内,这个”上帝”出乎意料,查阅资料发现,诗经中绝大部分”上帝”都是指至高神。有几处“上帝“被汉儒解释为“君主“,也是借至高神上帝之地位、权势喻指君主。可以对古代的神学与宗教管窥蠡测一般。

以上分别是歌词、唐诗、宋词的词云。

云音乐数据处理与分析

对网易云爬取的全部诗歌进行了清洗、繁简替换、去重并按照歌手类型整合、分词,接下来进行数据分析,由于生成的是html格式图片,并且有动画效果和详尽标签,下面仅展示截图。

我们可以看到不论男女歌手还是乐队,前5高频字大致相同,很有趣的是男女歌手使用”爱”字频率较高,然而乐队组合使用”爱”字频率却大幅下降,难道人多了就不好意思谈情说爱了吗?

再来看词频分析:

男歌手词云:

女歌手词云:

乐队组合词云:

2.2唐宋诗词文本挖掘

由于图表比较多,均为html文件,可以点击文件查看获取详尽数据。这里受制于篇幅,仅分析其中一部分。可以运行文件目录下的.py文件,生成图表,同时打印出对应的数据。

(1)作家产量分析-谁是产量之王

唐诗而言,”七分剑气,三分月光,秀口一吐,半个盛唐”,我们的李杜诗篇万口传,但白居易写诗,产量之高,在唐代诗人中无人能敌。

再看宋诗,陆游一生笔耕不辍,作诗达万余首,自称”六十年间万首诗”,存世的诗仍有九千三百余首,是历史上存诗数量最多的诗人,当之无愧的榜首。但经查阅资料,发现一位英雄被我的数据所”埋没”了:历史上写诗数量最多的诗人—杨万里,屈居第三,杨万里一生极为勤奋,写诗达两万余首,为史上之最!可惜的是,其诗作传世的仅有四千余首,所有我得到的数据中他的诗也就没那么多了,相比之下反而让陆游拔得头筹!

最后看宋词,山东诗人辛弃疾的传世作品共有800多首,堪称词作高产作家,而苏轼也不甘落后,位居第三。

(2)单字词字频分析-古代诗人最爱用的字眼

从词云中看到,不论唐诗、宋词还是宋诗,最常用的单字词都是”人”、”月”、”风”、”云”、”梦”等,“人“字排行第一,这体现了《说文解字》里所讲的“人,天地之性最贵者也“,说明唐诗很好的秉承了“以人为本“的中华文化。而后续的“山“”风“”月“”日“”天“”云“”春“等都是在写景的诗句里经常出现的意象。

(3)多字词字频分析-诗人最爱用的词

可以看到,关于”风”的词是唐宋诗词人最爱用的,”东风”、”西风”、”春风”、”秋风”、”风月”、”风雨”甚至还有”风流”,看来诗人们对这些自然景物情有独钟,诸如”白云”、”梅花”、”芳草”等等。

(4)宋词最受欢迎的词牌

《浣溪沙》受到宋代婉约、豪放两派的共同青睐,

高居榜首,同时《水调歌头》、《鹧鸪天》、《满江红》等也是我们耳熟能详的。

(5)诗人最爱用的动词

我们很明显看到,诗人更偏爱”不”字系的词语,而此人更爱用”归”字系的词词,这可能受到了宋代婉约词派的影响。

从”相思”、”相逢”、”回首”、”别离”来看,表现了诗词的”人本”情怀,还是以抒发情感为主。

(6)诗人最爱用的形容词

毋庸置疑,诗人最爱用的形容词是”寂寞”,诗人们还真都挺孤独的。

对比唐诗两朝诗词,很明显的发现宋代诗词中”富贵”一词的频率相比之下极高,为什么呢?根据时代背景推测,唐朝太平盛世,而宋朝战乱纷纷,黎民饥寒,饿殍遍野,尤其南宋更是迁都临安,几近灭亡,如此纷乱之世,自然激起了诗人们的同情,宋代诗词人们一方面描绘”凄凉”、”萧条”之现世,一方面也揭露王孙子弟的”富贵”背后的丑恶,也盼望庶民在乱世饥寒中能够”富贵”起来。(一本正经地扯蛋…)

(7)诗中最常见的地名

宋词人还是偏爱”江南”的,不禁让人想起小学的宋词:忆江南:

江南好,风景旧曾谙。日出江花红胜火,春来江水绿如蓝。能不忆江南?

(8)诗中的四季

自古逢秋悲寂寥,我言秋日胜春朝。在古诗词里,伤春、惜春是常见的春诗题材,而萧瑟凄凉的秋日更是引起诗人”诗兴大发”的季节,它们占比如此之高也不足为奇,而对于炎热的夏天和寒冷的冬天,诗人似乎没有那么多情怀了,并且随着时代推移,”冬” 和”夏”的使用频率也越来越少,或许是诗人们更喜欢用”接天莲叶无穷碧,映日荷花别样红”这样的意象来描绘这两个季节吧!

算法比较

规则写诗

规则写诗用到了jieba的关键词提取算法textrank和extract_tags,将每种词性的词分别提取出来,然后采用一种词性模式匹配的算法,比如词性序列”aannv, vdsss”,最大长度地匹配相同字符长度,从”aa“开始,在语料库中随机匹配2个字长度的形容词,然后到继续匹配后面的序列,这样就可生成诗歌。

词性对应如右图。每个词性都是一类词的全体集合。

采用这种”万能的”写诗方法,还可以在内部内置词牌的格式,如下图。用户也可以自由输入模式,自动生成诗歌。

押韵部分采用了严格的”十三辙”分类要求,如下图所示。

押韵也分为首句押和首句不押,对应的平仄不同,严格遵守了音韵学的要求,但是受制于语料库只提取了1000词左右,有些韵脚可能会无法匹配,我设置了超过一定匹配次数,就停止匹配。

对于平仄部分,同样完美符合古诗词平仄的要求。算法也是采用了模式匹配的办法。

以从语料库中匹配到的词为单位,这样算法复杂度更低。利用如下函数判断:

输入为词和对应的平仄要求,依次判断每个字是否满足要求。

另外由于诗个平仄音韵的要求根据首句是否押韵也不同,这个程序也用很有技巧的简单办法实现了,代码有详尽注释,在此不再赘述。

简要流程图如下:

机器学习写诗

由于我使用的模型较多,在此选择几个做简单分析。代码中我加有注释。

chinese_poem

使用了LSTM神经网络,基于tensorflow的机器学习写诗模型。我利用它来做了”诗人模仿”功能。

首先利用一个简单的筛选判断,自动把需要模仿的诗人的数据提取出来:

只需修改poets列表内容,即可提取任何你想要的诗人数据。

使用的数据是我之前处理过的干净数据。

然后是训练模型,用[]标志诗位置,喂给搭建好的模型。

250个epoch即可基本拟合。

如上,按照字频来选择,这样概率大的输出概率也更加大。添加随机性的同时保证了诗歌质量。

自由写诗生成generateNum这么多首诗,每首诗以左中括号开始,以右中括号或空格结束,每次生成的prob用probsToWord方法转成字。

生成完整诗歌后使用output来使输出更美观:

藏头诗也很简单,根据标点符号指点诗歌开头为用户输入的字,在模型输出后面的字即可。

流程图如下:

lyrics_writer

训练数据使用的是爬取并处理后的歌词和现代诗。

使用的了sequence-to-sequence模型以及RNN网络进行歌词语义的学习以及建模,和之前的模型相似。

参数设置:

关于生成诗歌模块:

引入随机长度,增加诗歌和歌词的随机性,然后采用了正态分布的概率来生成每个字。

结果分析

规则写诗结果分析

1.选择五言绝句、从头到尾每个字都符合平仄的唐诗:

2.自定义韵脚、每个字都严格符合平仄要求的宋诗:

3.指定词牌名作的宋词:

4.指定行数的诗经:

指定句数的现代诗:

6.自定义模式的唐诗、宋词、宋诗、诗经和现代诗:

自定义格式藏头、藏尾、藏字诗:

7.自定义格式的宋词:

8.自定义格式的诗经:

9.自定义格式的现代诗:

4.2机器学习写诗结果分析

(1)Chinese_poem –模仿诗人

模仿李白风格:

的确从遣词造句上有一股诗仙的侠气和酒气。

李白的藏头词:

再来学习杜甫:

能够明显读出忧国忧民、感时伤事的情怀。

程序默认诗人为李白,传入 -p 参数即可指定其他诗人。

lyrics_writer –作词家

Ta分类学习了网易云所有男歌手、女歌手和乐队组合的歌曲,也可以进行现代诗创作。

歌词风格华语男歌手:

女歌手:

0表示训练,1表示写歌词。cd参数传入语料库名称。

因为歌词里面关于爱情的字眼非常多,所以这个模型训练出来最喜欢”谈情说爱”,也就显得有那么一点”人工智障”的意味。而我训练次数还不多,生成歌词的长度还比较短。

poet_master

机器学习创作自由诗、押韵诗、藏头诗、藏字诗。

自由创作:

上面这首诗读起来颇有一番韵味,似乎在感叹嫦娥的身世浮沉。

押韵诗:

藏头押韵诗:

上面这首诗也颇有几分年老体病的诗人,在人生弥留之际,回忆往事纷扰,感慨人生飞逝、世殊时异的伤怀意味。

藏字押韵诗:

可以看到,算法最大化的将输入的句子嵌入了诗中。

生成的诗歌不具有深刻语义、且上下文联系不紧密。

总结

综合这上面的demo,比较之下,我们的规则写诗做到了:指定格式、押韵、平仄、藏头、藏尾、藏字、自定义格式等等。

而机器学习写诗做到了指定格式、押韵、藏头、藏字、模仿诗人、以及更高级的语义理解、联想作诗还有更复杂文本的生成等。

项目地址:https://github.com/ZubinGou/AI_Poet_Totoro/

上一篇下一篇

猜你喜欢

热点阅读