西游记著名桥段“我叫你一声你敢答应吗?”想必大家都有非常深刻的印象,甚至还会浮出这个画面:
不对,是这个图:
但是,大家还记得,孙悟空回答了什么名字被葫芦吸了进去了吗?孙悟空被叫的最多的名字是悟空还是大圣?带着这些问题,我们用科学的方法对西游记进行分词分析,竟然获得了出人意料的结果。
分词工具
我们知道,中文分词指的是将一个汉字序列切分成一个一个单独的词。之前,在红楼梦文本分析的时候用过一个非常著名的分词工具:jieba分词。
jieba 是一个python实现的中文分词组件,在中文分词界非常出名,支持简、繁体中文,高级用户还可以加入自定义词典以提高分词的准确率。
jieba分词是一种基于统计语言模型分词的:
摘自 吴军《数学之美》
从图中可以看出来,jieba分词是一种基于词典的统计分词方法,而这里的词典是来源主要有两个,一个是网上能下载到的1998人民日报的切分语料还有一个msr的切分语料。另一个是我自己收集的一些txt小说,用ictclas把他们切分(可能有一定误差)。然后用python脚本统计词频。总结起来就是基于现代语料而获得的词典。
但是,西游记作为一个传统小说,文风为半白半文,词典的加入在理论上可能影响分词的准确率。但是jieba对于词典中没有的词使用了采用了基于汉字成词能力的HMM模型,使用了Viterbi算法。用简单的话就是说jieba分词也考虑到了词典中没有出现的词。
为了严谨起见,我们在jieba分词之外再使用另外一种无词典的分词方法。这个方法在分析红楼梦的时候用到过。这个方法的主要基于信息熵的无字典分词算法。简单来说,就是不借助其他文本,从西游记小说本身入手,通过统计方法猜出来西游记文本哪些是词的可能性。
所以这里的无词典的意思不是说不用词典,而是词典是来自于文本本身。当基于文本本身的词典建立好了之后,我们再采用Viterbi算法去解基于汉字成词能力的HMM模型最终获得分词结果。
在最终结果出来之前,我们不对上面两个方法的好坏做出判断。
分词结果
我们先展示jieba分词中出现频率最高的十大词:
出乎意料的是,前十名竟然没有“悟空”,反而给八戒,三藏,还有沙僧这几位足够的牌面。还有第一名的“行者”又是什么呢?我们不禁要问是不是分词结果出错了呢?
我们进一步给出分词词云图,这张图我们选取前五十名:
我们发现了悟空,大圣这些词,但是出现频率相对较低。
为了验证jieba分词的准确性,我们再给出无词典分词结果:
从结果可以看出来,这里分词并没有把“xx道”分好。不过也能看出来,西游记在描写某个人物的时候,有大约一半的场景是这位人物在说话。其中“三藏道”甚至超过了第13名的“三藏”,难道这就是大话西游里面唐僧很爱说话的验证?
我们将“xx道”和“xx”合并一下,重新画出频率统计图:
对比jieba分词结果,发现差距没有那么大,行者依然排名第一,其他人物的排名有细微差别。
总结下来,jieba分词的结果可信度比较高。
文本分析
基于分词工具给出来结果是“行者”出现的次数远远高于我们习惯中的“悟空”,这是怎么回事呢?要想回答这个问题,我们必须回到文本当中。
将手中宝珠净瓶往海心里扑的一掼,唬得那行者毛骨竦然。
行者仔细看那驮瓶的怪物,怎生模样:根源出处号帮泥
行者见了,暗笑道:“原来是看瓶的,想是不见瓶,就问他要
行者即忙敛袖,将左手伸出。菩萨拔杨柳枝,蘸甘露
行者合掌道:“是弟子不知。”
行者不敢推辞,舍命往上跳。
我们随机摘取了包含行者的几个片段。不难发现,西游记作为一个第三人称视角的小说,在描述孙悟空的时候,用的是“行者”,而不是“悟空”。
我们再摘抄有悟空的片段:
菩萨道:“悟空休言语,跟我来也。”
唐三藏心中害怕,兜住马不能前进,急回头道:悟空,是那里这等响振?
三藏勒马道:“悟空,你怎么来打听个响声
玉帝闻奏:“着孙悟空挑选几员天将,下界擒魔去也。”
魔王大怒道:“你想是孙悟空请来的。我就是那圣僧的魔头哩
那行者正然点看山景,忽听得有人叫道:“孙悟空,从那里来?往何处去?
可以看出来,在对话里面,悟空出现了很多次。因此我们发现西游记的影视作品当中,大家都用“悟空”这个名字是有道理的。而“行者”是出于第三人称的描写视角而导致了出现次数非常之多。
参考资料
jieba分词原理介绍:
https://www.cnblogs.com/echo-cheng/p/7967221.html
jieba分词字典来源:
https://github.com/fxsjy/jieba/issues/7
无词典分词代码:
https://github.com/LouYu2015/analysis_on_the_story_of_a_stone
无词典分词原理:
https://www.cnblogs.com/bigdatafly/p/5014597.html
无词典分词原理:
https://zhuanlan.zhihu.com/p/29209681