您的位置:首页 > 侦探小说

恒峰娱乐用Python来看金庸先生的小说这一生向大侠致敬

日期:2018-11-04 15:57:05 点击:0 来自:本站 作者:

  听完射雕英雄传,我们来看一下我比较喜欢的天龙八部,天龙八部是一部多主角小说,萧峰、虚竹、段誉三兄弟各有际遇,曾经还因谁才是第一主角的问题引发过一阵争论。

  现在我们已经懂得用数据思维来考虑问题,看看怎样对中文小说进行数据分析吧。出场率是评价一个小说人物的重要指标,我们就先来对《天龙八部》中人物的出场情况进行一下统计分析吧。

  中文分词是中文信息处理的基础,但是由于汉语的博大精深,中文分词的难度比英文要高出一大截,好在python有很多用于中文分词的库,jieba就是其中受欢迎程度比较高的一款,下面我们就来体会一下它的妙用。

  jieba用起来非常简单,短短几行代码就完成了分词工作(下图),可是...仔细一看发现哪里不对了“段誉”作为一个姓名没有被单独分出来,而是和其他一些动词连在一起,另外也有一些角色名字被拆分成了两个甚至更多的单词,例如“神仙姊姊”被分成了“神仙”和“姊姊”两个词。不过这也难怪,中文的灵活性太强,一个词往往有多层含义和多种用法,看来直接使用jieba分词还是会有不小的误差,我们得想办法来解决这个问题,不然会对分析结果造成干扰。

  jieba本身带有词库,而且具备很强大新词识别的功能,但是为了获得更高的准确率我们必须载入自定义词库。

  因为这次的目的是对人物姓名进行分析,我们先从网上找一份热心网友整理的《天龙八部》人物大全,然后参照“jieba/dict.txt”的格式(一个词占一行,每一行分三部分:词语、词频(可省略)、词性(可省略),用空格隔开,顺序不可颠倒)做成词典文件my_dict.txt。

  使用jieba.load_userdict()函数加载到程序中。如果在程序运行过程中发现其他问题,还可以使用add_word()、suggest_freq()等函数对词典和词频进行动态调整。用load_userdict导入自定义字典,file_name为文件类对象或自定义词典的路径add_word()可在程序中动态增加词典del_word()可在程序中动态删减词典suggest_freq()可调节单个词语的词频,使其能(或不能)被分出来现在我们已经成功解决了人名被意外分割的问题,而对于“段誉听”、“段誉见”这类包含姓名但分割不彻底的单词,我们可以使用suggest_freq函数调整词频进行强制分割。

  不过我感觉这样做毕竟麻烦,还是决定用正则表达式的方法把我们需要的人名单独取出来,同时将我们不需要的信息(不包含人名的单词)过滤掉。

  经过上面两步操作获得了一份仅包含《天龙八部》人名的文本,我们可以很轻易地将它读取并转换为list格式,

  现在是不是有一种“我为刀俎,它为鱼肉”的感觉了。经过简单的数据处理,我们得到了每个人物的名字在小说中出现的频次,由于萧峰和乔峰是同一个人,为了方便统计将两个名字的出场次合并。

  虽然在很多人心中萧峰的形象更适合本书主角,但从分析结果来看,“段誉”这个名字在小说中的出场频率是最高的。

  萧峰(乔峰)紧随其后,难怪有人为谁是第一主角的事发起过争论。不过人物的重要性也不能只看戏份多少,像慕容博,萧远山,玄慈,段正淳这些人的出场率虽然不是特别高。

  但正是这几个人上一代的宿命恩怨,引发了萧峰虚竹段誉三兄弟的江湖故事,实实在在是另一条暗线的主角。

  关于主角的问题我们就不展开讨论了,从图中还可以看到其他一些角色的出场频率,仔细琢磨一下还是蛮有意思的。

  段誉不想学武功却练成了绝世神通一心追求王语嫣最终美人对慕容复不离不弃萧峰立志保卫大宋没想到自己居然是契丹人决定与阿朱塞外牧马,然而造化弄人,心爱的人却死在自己手上世间种种往往难以掌控,所以我们平时阅读、学习的过程中也不必过于心浮气躁、急功近利,还是要平心静气、踏实苦练,即使目标无法完全实现也可能遇到“有心栽花花不开、无心插柳柳成荫”的境遇。

  金庸先生博古通今,历史、政治、杂学信手拈来,武侠小说部部经典,语言文字蕴意厚重,我们不妨先来分析一下《鹿鼎记》的文字特点。

  要分析用词习惯首先要对小说文字进行词语提取,考虑到“说”、“走”、“开始”、“平常”等简单词语使用频率通常很高且难以体现写作风格,我们仅提取词长度不小于4的成语、俗语和短语进行分析。恒峰娱乐

  同时,考虑到某些专有名词(例如:四十二章经等)会对分析结果造成干扰,可以使用jieba.suggest_freq方法在分词取词的时候进行过滤,最终得到这样一份词语文件:

  因为对用词习惯的分析更倾向于定性分析,所以我们使用词云图来作展示,以下面这幅韦小宝的Q图作为底板来进行绘制。

  我们可以看到在这篇小说中“哈哈大笑”、“大吃一惊”、“原来如此”、“又惊又喜”、“胡说八道”等词语使用频率非常高,这都非常符合武侠小说的剧情设置。除此之外,从图中我们可以看到小说中的用词非常丰富,通篇成语和俗语的用量超过1.2万个,想必这也是金庸小说引人入胜的一个重要原因吧。

  刚才我们对《鹿鼎记》这部作品的用词特点进行了分析,现在我们试试从机器的视角出发来分析语言,看看计算机程序是如何看待这部小说的。

  要将自然语言交给机器学习中的算法来处理,通常需要先将语言数学化,将自然语言中的词语进行数学化的一种常用方法就是词向量。

  词向量的作用是将自然语言中的字词转为计算机可以理解的稠密向量,我个人对词向量的理解就是能够对词与词之间的关系进行分析,寻找在特定环境下各个词之间的相关程度。

  虽然词向量的理论虽然有些复杂,但是使用起来还是很方便的,使用word2vec可以通过训练文本语料库来生成词向量,而python下word2vec的使用也非常容易,安装gensim包即可直接调用。

  刚才我们提到了语料库,经过多方查询,发现语料库其实是一个包含了大量词语的txt文件,词与词之间以空格间隔,其作用是作为word2vec的输入来生成词向量。既然如此我们就先对小说进行分词处理,得到基础语料库:

  接下来我们利用词向量分析一下小说中的人物关系,看看能不能发现一些有意思的规律。首先加载上面生成的语料库,之后调用相关函数进行模型训练,并获取与目标词的相关性(在《鹿鼎记》这部书中我们最感兴趣的当然是主角韦小宝了)。

  下面我就来看看,在计算机眼中哪些人物跟韦小宝的关联最为紧密,核心代码如下:

  阿珂是韦小宝最难追的女人,书中花了不少篇幅描写她和韦小宝共处的场景;陈近南是一个悲情英雄,在整部书中具有举足轻重的作用;其后几个也都是书中的重要人物,与主人公韦小宝有着千丝万缕的联系。

  有意思的是韦小宝的七个夫人中只有曾柔没有上榜,看来计算机也认为这个姑娘没什么存在感啊~

  此次分析结果与我们的认知基本相同,但是需要注意,词向量是一个比较复杂的概念,在实际应用中需要做大量的前期准备工作,特别是对语料库的需求通常比较大,由于此次分析仅针对小说人物,所以对语料库的量要求不是很高,但如果分析其他词语可能准确性无法保证。

  金庸的作品承载了几代人的回忆、几代人的武侠梦。在金庸眼里,任何时候学习都不算晚,永远保持谦卑的态度去探索人生中的未知,自尊而不自负,骄傲而不自满,感谢金老的文字陪伴我们成长,一路走好。

分页:
相关链接 Correlation Link
最新OA界面 New Article
  • 06-08
ASP
ASP
ASP
栏目热门 Class Hot
栏目推荐 Class Commend
版权所有:恒峰娱乐g22 2016-2018 未经授权禁止复制或建立镜像 AG