谜语网

数据挖掘实操|用文本挖掘剖析近5万首《全唐诗》

      编辑:北慕城南       来源:谜语网
 
6 诗歌生成:用深度循环神经网络自动写唐诗

与上面情绪分析模型采用的内部原理一致,这里采用的还是LSTM,2层网络。

上图是文本生成的简要原理图,是基于字符(字母和标点符号等单个字符串,以下统称为字符)进行语言模型构建,也就是说我们的输入和输出都是字符。举个栗子,假如我们有一个一句诗“胸中稳处即吾乡”,我们想要基于这句诗来构建LSTM,那么希望的到的结果是,输入“胸”,预测下一个字符为“中”;输入“中”时,预测下一个字符为“稳”…输入“吾”,预测下一个字符为“乡”,等等。

由于其中的原理过于繁复,涉及大量的code和数学公式,故笔者仅展示生成的结果,训练的语料即经过预处理的《全唐诗》。

以“春雨”打头,生成500字的诗词,结果如下:

可以看见,其中的诗词学习到了格律诗的句子结构,且围绕着“春雨”来展开,也就是打头的两个字引导了后续结果的生成,这多亏了LSTM超强的“记忆能力” 记住了诗歌文本序列中的时空依赖关系。

在生成的诗句中,某些诗句还是蛮有意思的,上下联间的意象有很强的相关性。

下面是多次生成中产生的较优秀的诗句(当然,这是笔者认为的),其中有些学习到了高阶的对仗技巧,如下:

笔者最喜欢的是这两句:

白鹭惊孤岛,朱旗出晚流。

笔者最喜欢的是这两句,它们对仗工整:“白鹭”-“朱旗”,“孤岛”-“晚流”,“惊”-“出”。这里体现出《人间词话》中的“无我之境”: “无我之境,以物观物,故不知何者为我,何者为物”,也就是意境交融、物我一体的优美境界,其中的 “惊”、“出”堪称字眼,极具动感,炼字绝妙!

7 相似文本检索:用WMD查找相似诗词

最后,我们来看看诗歌的信息检索问题,也就是笔者随意输入一句诗词,然后机器会按照语义相似度在全唐诗中检索出符合要求的若干句诗词。

谈到这里,笔者不由得想起一个词 “射覆”,射覆游戏早期的耍法主要是制谜猜谜和用盆盂碗等把某物件事先隐藏遮盖起来,让人猜度。这两种耍法都是比较直接的。后来,在此基础上又产生了一种间接曲折的语言文字形式的射覆游戏,其法是用相连字句隐寓事物,令人猜度,若射者猜不出或猜错以及覆者误判射者的猜度时,都要罚酒。唐浩明的长篇小说《张之洞》中对“射覆”有一段精彩的描写:

宝竹坡突然对大家说,我有一覆,诸位谁可射中。不带大家做声,他立刻说,《左传》曰:“伯姬归于宋。射唐人诗一句。”说完,大家就都低头想,久久不出声

忽然,只见张之洞不慌不忙地念着:“白居易诗曰 老大嫁作商人妇”。

如果对古文生疏,大家可能很难将这两句联想起来,但《张之洞》里接下来就有关于解谜的描述:

杨锐道:“伯、仲、叔、季,这是中国兄弟姊妹得排行序列。伯姬是鲁国的长公主,排行老大。周公平定武庚叛乱后,把商旧都周围地区封给商纣王的庶子启,定国名为宋,故宋国为商人后裔聚族之地。伯姬嫁到宋国,不正是 老大嫁作商人妇 吗?”

大家可能会想,如果是自己来思索的话,不仅需要自己具备渊博的学识,更要有疾如闪电的反应能力,这个非极顶聪明之人不可!

试想,机器来做,可以做好吗?能的话,又会是如何操作?

这里,笔者介绍基于WMD(Earth Mover’s Distance)的语义相似度算法,与上面的情绪分析类似,还有用到之前训练得到的字向量模型,借助外部语义信息来应对同义不同字的情形。

WMD(EarthMover’s Distance)是一种能使机器以有意义的方式(结合文本的语义特征)评估两个文本之间的“距离(也就是文本间的相似度)”的方法,即使它们没有包含共同的词汇。它使用基于Word2vec的词向量。它已被证明超越了k-近邻分类中的许多现有技术方法。以下是“射覆”的机器解:

上面两个句子没有共同的词汇,但通过匹配相关单词,WMD能够准确地测量两个句子之间的(非)相似性。该方法还使用了基于词袋模型的文本表示方法(简单地说,就是词汇在文本中的频率),如下图所示。该方法的直觉是最小化2段文本间的“旅行距离(Traveling Distance)”,换句话说,该方法是将文档A的分布“移动”到文档B分布的最有效方式。

简要的解释了相关原理,笔者接下来展现最后的分析结果,由于对《妖猫传》中的那句线索诗句 《清平乐》印象深刻,为了检验效果,在《全唐诗》+《全宋词》中查找与它相关性最大的TOP9诗词。结果如下:

查找的结果排行第一的是原句,但有一个字不同(其实古语中“花”、“华”互通,华字的繁体是会意字,本意是“花”),略微差异导致相似度不为1.0。第二相似的是一首宋词,林正大的《括酹江月(七)》,其实这整首词可以作为李白《清平乐》的注解,因为全篇都是对它的化用:即将《清平乐》中的句、段化解开来,增加了新的联想,重新组合,灵活运用,对原诗的表达进行了情感上的升华。随后的两句诗词也是类似的情况,只是相似度上略有差异罢了。

紧接着,是刚才机器生成的诗句,看看与它内涵相近的诗句有哪些:

再看看笔者较为欣赏的2句名句,机器很好的捕捉到了它们之间的相似语义关系,即使词汇不尽相同,但仍能从语义上检索相似诗句。

写到这里,关于《全唐诗》单独的文本挖掘已经完成,但笔者又想到一个有趣的分析维度 从文本挖掘的角度来比较《全唐诗》、《全宋词》和《全元曲》之间用字的差异,借助字这种基本符号来分析各自的文学艺术特征。

8 文本对比:用Semiotic Squares比较《全唐诗》、《全宋词》和《全元曲》

因为分析的对象涉及3个,常规的二元对比分析方法难以得出有效的结论。因此,笔者在这里跨界采用了来自符号学领域的研究成果 Semiotic Squares。

“Semiotic Squares(笔者译作‘符号方块’)”,是由知名符号学大师Greimas和Rastier发明,是一种提炼式的对比分析(Oppositional Analyses)方法,通过将给定的两个相反的概念/事例(如 “生命(Life)”和“死亡(Death)”)的分析类型拓展到4类(如“生命(Life)”、“死亡(Death)”、“生死相间(也就是活死人,The Living Dead)”、“非生非死(天使,Angels)”,有时还可以拓展到8个或10个分析维度。以下是符号方块的结构示意图:

说明:“+”符号将2个词项组合成一个“元词项(Metaterm)”,也称“复合词(Compound Term)”,例如,5是1和2的复合结果。

Semiotic Squares的构成要素

Semiotic Squares主要包含以下2种元素(笔者正在避开方块的组成关系:对立,矛盾、互补或包含):

(1)词项(Terms)

Semiotic Square 由4个词项组成::

位置1 (Term 1):词项A(Term A)位置 2(Term 2):词项B(Term B)位置 3 (Term Not-2):非B词项(Term Not-B)位置 4 (Term Not-1):非A词项(Term Not-A)

Term A和TermB是相反的两个概念,二者是对立关系,这是“符号方块”的基础,另外两项是通过对Term A和Term B取反而获得。

(2)元词项 (Metaterms)

Semiotic Square囊括6个元词项。这些元词项由上面的4个基础词项组合而成,其中的绝大部分元词项已被命名。

位置5 (Term 1 + Term 2):复合词项(Complex Term)位置6 (Term 3 + Term 4):中立词项(Neutral Term)位置7 (Term 1 + Term 3):正向系(Positive Deixis)位置8 (Term 2 + Term 4):负向系(Negative Deixis)位置9(Term 1 + Term 4):未命名(Unnamed)位置10(Term 2 + Term 3):未命名(Unnamed)

下面以“男性”和“女性”这两个相对的概念来举个例子,注意其中错综复杂的逻辑关系/类型。

说完了分析的大致原理,笔者这里就来实战一番,与上述原始模型不同的是,笔者在这里除了基本的二元对立分析外,还新增了一个分析维度,总体是关于《全唐诗》、《全宋词》和《全元曲》的三元文本对比分析。

预处理前的文本是这样的:

预处理后是这样的形式:

用Semiotic Squares进行分析的结果如下图所示(点击即可放大显示):

从上面呈现的TOP10高频字和象限区块(左上角“唐诗”、右上角“宋词”和正下方“元曲”)来看,唐诗、宋词、元曲中出现的独有高频字依次是:

唐诗:唯、馀、始、鸟、含、尔、昔、兹、忽、栖、川、旌、戎、秦…

宋词:阑、沈、匆、帘、浓、约、淡、觞、蕊、屏、凝、笙、瑶、柔…

元曲:哥、俺、咱、孩、姐、吃、哩、科、厮、拿、你、叫、呀、呵…

从上面的关键字来看,唐诗、宋词和元曲各自的文学艺术特征很鲜明:

唐诗:用字清澹高华、含蓄,诗味较浓,寄情山水和金戈铁马的特征明显,可以联想到唐诗流派中典型的山水田园派和盛唐边塞诗,它们大都反映大唐诗人志趣高远、投效报国的情怀。

宋词:所用的字体现出婉约、宛转柔美,表现的多是儿女情长,生活点滴,这也难怪,由于长期以来词多趋于宛转柔美,人们便形成了以婉约为正宗的观念。

元曲:所用的字生活气息浓重,通俗易懂、接地气、诙谐、洒脱和率真,充分反映了其民间戏曲的特征,这与蒙元治下的汉族知识分子被打压,很多文人郁郁不得志、转入到民间戏曲的创作中来有关。

此外,正上方的“复合”中,表征的是三者皆常用的字,即共性特征,主要涉及写景(如 “晴”、“幽”、 “溪”、“洲”、“霜”、“浦”、“露”、 “碧”、“帆”、“峰”等)和抒情(等“怅”、“忆”、“寂”、“悠”等)。

下方的两个象限,“Not 唐诗”和“Not 宋词”分别代表的“宋词+元曲”、“唐诗+元曲”,三者之二的共性高频字,中的两项也以此类推,笔者在这里就不赘述了,请读者朋友们亲自去挖掘里面的玄妙吧。

笔者非专业的诗歌研究者,上面的分析也未必准确,如果有分析不恰当的地方,还请斧正。但是,笔者是想通过分析唐诗,来说下自己对于文本(数据)挖掘的看法:

 在数据分析中,得出的数据结果只是“引子”和“线索”,最重要的还是要靠人脑去分析结果,借助所掌握的背景/业务知识和分析模型,从文本的表层钻取到其深层,去发现那些不能为浅层阅读所把握的深层意义,挖掘其价值。

参考资料:数据来源:《全唐诗》、《全宋词》、《全元曲》使用工具:Excel、python及其相关库(Gensim、Tensorflow、Keras、Jieba)、Gephi维基百科“唐诗”词条,https://zh.wikipedia.org/wiki/%E5%94%90%E8%AF%97维基百科“意象”词条,https://zh.wikipedia.org/wiki/%E6%84%8F%E8%B1%A1汉语中字与词的关系?,知乎,https://www.zhihu.com/question/23593755王国维,《人间词话》The Unreasonable Effectiveness of Recurrent Neural Networks,Andrej Karpathy blog, http://karpathy.github.io.Understanding LSTM Networks,Colah,http://colah.github.io/posts/2015-08-Understanding-LSTMs长篇小说《张之洞》,唐浩明Semiotic-Square ,http://www.signosemio.com/greimas/semiotic-square.asp#专栏作家

苏格兰折耳喵(微信公众号:Social Listening与文本挖掘),人人都是产品经理专栏作家,数据PM一只,擅长数据分析和可视化表达,热衷于用数据发现洞察,指导实践。

本文原创发布于人人都是产品经理。未经许可,禁止转载。

题图来源于网络

您可能还会对下面的文章感兴趣:

相关文章