你也可以是大文豪,利用人工智能在线写唐诗宋词
人物由来造化工
工夫元自有英雄
智中富贵皆无用
能得文章第一功
我来一笑浑忘却
是处逢人欲问谁
智慧于今何所用
能将心事付吾儿
原文地址:
你也可以是大文豪,利用人工智能在线写唐诗宋词 | 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,比较之下,我们的规则写诗做到了:指定格式、押韵、平仄、藏头、藏尾、藏字、自定义格式等等。
而机器学习写诗做到了指定格式、押韵、藏头、藏字、模仿诗人、以及更高级的语义理解、联想作诗还有更复杂文本的生成等。