编辑导语:诗词的创作需要遵循很多的规矩,因此诗歌是有规律的。本文作者运用多种文本挖掘方法,对手头的诗歌语料库进行了深入的挖掘和分析,让我们一起来看看作者是如何完成文本数据的探索任务。

楔子:
许多年之后,面对书桌上的两句残词,贬居黄州的东坡居士将会回想起,他在故乡眉山见到朱姓老尼的那个遥远的下午。彼时的东坡还不是东坡,还只是一个七岁孩童。有一天,他在家附近偶遇一位年约九十的朱姓老尼。
老尼看到苏轼天资聪颖,就跟他聊起自己年轻时的经历。她曾跟随师父进入后蜀主孟昶的宫中。一日,天酷热,孟昶和他的妃子花蕊夫人深夜纳凉于摩诃池上。面对此情此景,蜀主即兴赋词一首,老尼将她印象中仅存的打头两句告诉了苏轼.
四十年后,苏轼贬居于黄州,想起这段往事,遗憾于孟昶的词只余两句,突发奇想要将这两句词续写完整。他先猜测出这首词的词牌名——“洞仙歌令”,但要还原整首词作,必须深刻结合写词人当时之心情以及伴随而来的意境。
苏轼因而循着仅存的两句词,根据老尼给他的描述,竭力在脑海中还原蜀主当时的创作场景和心境,最终将词续完,成就名作《洞仙歌》:
冰肌玉骨,自清凉无汗。水殿风来暗香满。绣帘开,一点明月窥人,人未寝,倚枕钗横鬓乱。
起来携素手,庭户无声,时见疏星渡河汉。试问夜如何,夜已三更,金波淡,玉绳低转。但屈指西风几时来,又不道流年暗中偷换。
以上就是文学史上有名的“东坡续词”,虽说是文学史上的一段佳话,但笔者从中隐约看到了数理思维的影子。
诗词的创作过程有如在求解一个“**化问题”:在一定的约束条件下,如诗词要遵守的平仄、押韵、对仗/对偶、五七变式、词谱、情境等,诗词创作者用文字将自己内心的真实感动用语言文字表达出来;在“戴着镣铐在跳舞”的情况下,竭力达到音韵美、精炼美、言辞美、朦胧美、情感美、绘画美和形式美的至臻境界。
此时,诗词之精美和数理之严密是可以完美结合的。
既然诗歌的创作是有规律的,那么,通过一定的数据挖掘手段,我们是能够从中发现一些insight的。
在本文中,笔者循着这个思路,将运用若干文本挖掘方法对手头的诗歌语料库(该诗歌原始语料库地址为https://github.com/Werneror/Poetry)进行深入挖掘和分析,该诗歌语料库的基本统计数据如下:

从上表可以看到,该诗歌语料库中共计近85万余首诗歌,诗歌作者数量达29377位之多;其中,字段包括“题目”、“朝代”、“作者”和“内容(诗歌)”。
为了方便后续的分析,笔者仅取其中的律诗和绝句,且仅取其中的五言和七言,排律(如《春江花月夜》、《长恨歌》等)、杂言(如李白的将进酒)等就不在本文的分析范围之内。
经过数据清洗后,最终得诗544,443,占到原数据库的59.1%,以下分别是清洗后的诗歌数据统计结果和部分样例:


针对上述数据,笔者在本文中主要有两个大目标:
- 构建一个包含热门题材标签的诗歌语料库,用于后续的诗歌题材分类和诗歌生成任务;
- 基于上述诗歌语料库的各类文本挖掘和语义分析,以期得到有趣味的发现。
针对上述目标,本文的实现路线图,同时也是本文的行文脉络,如下所示(点击图片可放大查看):

值得注意的是,上述实现路径中,涉及到自然语言处理的两大组成部分,即自然语言理解(分词、语义建模、语义相似度、聚类和分类等)和自然语言生成(诗歌生成和诗歌翻译),看完也会对自然语言处理有一定的了解。
信息量大,请耐心享用。
1. 诗歌分词和热词发现
给定一首诗歌文本,在其中随机取一个片段,如何判断这个片段是否是一个有意义的词汇呢?
如果这个片段左右的搭配变化较多、很丰富,同时片段内部的成分搭配很固定。那么,我们可以认为这个片段是一个词汇,比如下图中所示的“摩诘”就是符合这个定义,那么它就是一个词汇。

在具体实施的算法中,衡量片段外部左右搭配的丰富程度的指标叫“自由度”,可以用(左右)信息熵来度量;而片段内部搭配的固定程度叫“凝固度”,可以用子序列的互信息来度量。
在这里,笔者利用Jiayan(甲言)对这54余万首诗歌进行自动分词,在结果中按照词汇出现频率从高到低进行排序,最终从语料库中抽取若干有意义的高频词。其中,词汇的长度从1到4。
抽取结果如下(点击图片可放大查看):

笔者观察其中部分结果,发现一字词、二字词才能算得上一般意义上的词汇,如“不”、“烁”、“岁寒”、“留滞”等 。
三字词和四字词一般是多类词性词汇的组合,严格上讲,应该算作短语或者固定表达,如“随流水”、”云深处”、“人间万事”、“江湖万里”等。
但本文为了表述方便,笔者将它们统一称之为词。
下面,笔者分别展示词长从1到4的TOP100的高频词词云(点击图片可放大查看)。

一字高频词中,除去“不”、“无”、“有”这类“虚词”,单看“人山风日天云春花年月水”这11个高频字,暗合了中国天人合一哲学传统,作诗如作画,作诗者是把人放到自然环境、天地岁月这个时空大画卷中,七情六欲、天人感应,诗情画意就由感而生,诗意盎然了!
“诗画本一律”,古人诚不我欺!

二字高频词中,较为显眼的是“万里”、“千里”,它们描绘出巨大的空间感,在诗歌中经常跟“宏景”“贬谪”、“思乡”、“闺怨”等主题捆绑在一起。
此外,“明月”、“故人”、“白云”、“功名”、“人间”、“平生”和“相逢”等词汇也是横亘古今的热门用语。

三字高频词中,数字的使用很是常见,如“二三子”、“二十四”、“一樽酒”、“二千石”等。其中,最值得一提的是诗人们用数词对时空的描绘:表达时间跨度的,如“二十年”、“四十年”、“五百年”、“十年前”、“千载后”等。
表达空间距离的,如“千里外”、“三百里”、“百尺楼”……古人总是喜欢把自己置身于浩瀚渺茫的时空之中,去思考自己匆匆的人生。
正如东坡在《赤壁赋》的感慨:“寄蜉蝣于天地,渺沧海之一粟。哀吾生之须臾,羡长江之无穷!”

在四字高频词中,空间方位的词汇较多,如“南北东西”、“江南江北”、“东西南北”等词。
因四字词词长较长,像“人间万事”、“千岩万壑”、“明月清风”、“白云深处”、“相逢一笑”等词就拥有较高的信息量,能够还原大部分的诗歌意境了。
2. 训练含纳诗歌词汇语义关联性的词嵌入模型
词嵌入模型可以从海量的诗歌文本中自动学习到字词之间的关联关系,据此可实现字词关联度分析、字词相似度分析、聚类分析等任务。
然而,计算机程序不能直接处理字符串形式的文本数据,所以笔者首当其冲的一个步骤就是将诗歌文本数据分词,之后再“翻译”为计算机可以处理的数据形式,这由一个名为“文本向量化”的操作来实现。
先谈分词,它跟前面的高频词挖掘有联系,是后续所有分析任务的起始点。
结合前面积累的词库,再基于有向无环词图、句子**概率路径和动态规划算法对这54万首诗歌进行分词操作。现试举一例:
分词前:“万物生芸芸,与我本同气。氤氲随所感,形体偶然异。丘岳孰为高,尘粒孰为细。忘物亦忘我,优游何所觊。”
分词后:[‘万物’, ‘生’, ‘芸芸’, ‘,’, ‘与’, ‘我’, ‘本’, ‘同’, ‘气’, ‘。’,’氤氲’, ‘随’, ‘所’, ‘感’, ‘,’,’形体’, ‘偶然’, ‘异’, ‘。’, ‘丘岳’, ‘孰’, ‘为’, ‘高’, ‘,’, ‘尘’, ‘粒’, ‘孰’, ‘为’, ‘细’, ‘。’,’忘’, ‘物’, ‘亦’, ‘忘我’, ‘,’, ‘优游’, ‘何’, ‘所’, ‘觊’, ‘。’]
分词之后再做适当处理就可以“喂给”词嵌入模型(这里是Word2vec)进行训练了。
基于Word2vec词嵌入模型能从大量未标注的文本数据中“学习”到字、词向量,而且这些字、词向量包含了字词之间的语义关联关系(可以是语义相关或句法相关),正如现实世界中的“物以类聚,类以群分”一样,字词可以由它们身边的字(上下文语境)来定义,而Word2vec词嵌入模型恰恰能学习到这种词汇和语境之间的关联性。
其基本原理如下图所示(点击图片可放大查看):

训练完该模型后,将其训练结果投射到三维空间,则是如下景象(点击图片可放大查看):

在训练Word2vec的过程中,模型会从大量的诗歌文本数据中学习到词汇之间的2类关联关系,即聚合关系和组合关系。
聚合关系:如果词汇A和词汇B可以互相替换,则它们具有聚合关系。
换言之,如果词汇A和词汇B含有聚合关系,在相同的语义或者句法类别中可以利用其中一个来替换另一个,但不影响对整个句子的理解。
例如,“萧萧”、“潇潇”都是象声词,多用于描述雨声,具有聚合关系,那么“山下兰芽短浸溪,松间沙路净无泥,萧萧暮雨子规啼”中的“萧萧”可以换做“潇潇”。
组合关系:如果词汇A和词汇B可以在句法关系上相互结合,那么它们具有组合关系。
例如,“雨打梨花深闭门,忘了青春,误了青春。赏心乐事共谁论?”中的“忘了”和“误了”都和“青春”存在组合关系,都是“动词+名词”的动宾结构。
现在来寻找与“兵燓”存在语义关联性的若干词汇:

结果大都是跟“战争”、“创伤”相关的词汇,语义关联关系捕获能力较强,后续的热门诗歌体裁挖掘任务也会用到词嵌入模型的这个特性。
闽ICP备13000641号-4