用python分析《三国演义》中的社交网络

Python与机器学习 徐 自远 674℃

作者介绍:blmoistawinde, 西南某高校学生一枚,喜欢有意思的数据挖掘分析。希望给世界带来些清新空气~

个人博客地址:https://blog.csdn.net/blmoistawinde。

本文首发于:https://blog.csdn.net/blmoistawinde

前言

一直以来对自然语言处理和社交网络分析都很感兴趣,前者能帮助我们从文本中获得很多发现,而后者能够让我们对人们和各个事物之间普遍存在的网络般的联系有更多认识。当二者结合,又会有怎样的魔力呢?

作为一个三国迷,我就有了这样的想法:能不能用文本处理的方法,得到《三国演义》中的人物社交网络,再进行分析呢?Python 中有很多好工具能够帮助我实践我好奇的想法,现在就开始动手吧。

准备工作

获得《三国演义》的文本。

《三国演义》并不是很容易处理的文本,它接近古文,我们会面对古人的字号等一系列别名。比如电脑怎么知道“玄德”指的就是“刘备”呢?那就要我们给它一些知识。我们人通过学习知道“玄德”是刘备的字,电脑也可以用类似的方法完成这个概念的连接。我们需要告诉电脑,“刘备”是实体(类似于一个对象的标准名),而“玄德”则是“刘备”的一个指称,告诉的方式,就是提供电脑一个知识库。

除了人的实体和指称以外,我们也能够包括三国势力等别的类型的指称,比如“蜀”又可以叫“蜀汉”,所以知识库里还可以包括实体的类型信息来加以区分。

有了这些知识,理论上我们就可以编程联系起实体的各个绰号啦。不过若是要从头做起的话,其中还会有不少的工作量。而 HarvestText[注1] 是一个封装了这些步骤的文本处理库,可以帮助我们轻松完成这个任务。

社交网络建立

成功地把指称统一到标准的实体名以后,我们就可以着手挖掘三国的社交网络了。具体的建立方式是利用邻近共现关系。每当一对实体在两句话内同时出现,就给它们加一条边。那么建立网络的整个流程就如同下图所示:

我们可以使用 HarvestText 提供的函数直接完成这个流程,让我们先在第一章的小文本上实践一下:

他们之间具体有什么关系呢?我们可以利用文本摘要得到本章的具体内容:

本章的主要内容,看来就是刘关张桃园三结义,并且共抗黄巾贼的故事。

三国全网络绘制

有了小范围实践的基础,我们就可以用同样的方法,整合每个章节的内容,画出一张横跨三国各代的大图。

整个社交网络有 1290 个人那么多,还有上万条边!那么我们要把它画出来几乎是不可能的,那么我们就挑选其中的关键人物来画出一个子集吧。

用 pyecharts 进行可视化

博客上不能显示交互式图表,这里就给出截图:显示了刘备的邻接结点

整个网络错综复杂,背后是三国故事中无数的南征北伐、尔虞我诈。不过有了计算机的强大算力,我们依然可以从中梳理出某些关键线索,比如:

人物排名-重要性

对这个问题,我们可以用网络中的排序算法解决。PageRank 就是这样的一个典型方法,它本来是搜索引擎利用网站之间的联系对搜索结果进行排序的方法,不过对人物之间的联系也是同理。让我们获得最重要的 20 大人物:

《三国演义》当仁不让的主角就是他们了,哪怕你对三国不熟悉,也一定会对这些人物耳熟能详。

人物排名-权力值

这个问题看上去跟上面一个问题很像,但其实还是有区别的。就像人缘最好的人未必是领导一样,能在团队中心起到凝聚作用,使各个成员相互联系合作的人才是最有权力的人。中心度就是这样的一个指标,看看三国中最有权力的人是哪些吧?

结果的确和上面的排序有所不同,我们看到刘备、曹操、孙权、袁绍等主公都名列前茅。而另一个有趣的发现是,司马懿、司马昭、司马师父子三人同样榜上有名,而曹氏的其他后裔则不见其名,可见司马氏之权倾朝野。司马氏之心,似乎就这样被大数据揭示了出来!

社群发现

人物关系有亲疏远近,因此往往会形成一些集团。社交网络分析里的社区发现算法就能够让我们发现这些集团,让我使用 community [注2] 库中的提供的算法来揭示这些关系吧。

在下面 3 个社区里,我们看到的主要是魏蜀吴三国重臣们。(只有一些小“问题”,有趣的是,电脑并不知道他们的所属势力,只是使用算法。)

community 3: 孙权 孙策 周瑜 陆逊 吕蒙 丁奉 周泰 程普 韩当 徐盛 张昭[吴] 马相 黄盖[吴] 潘璋 甘宁 鲁肃 凌统 太史慈 诸葛瑾 韩吴郡 蒋钦 黄祖 阚泽 朱桓 陈武 吕范

还有一些其他社区。比如在这里,我们看到三国前期,孙坚、袁绍、董卓等主公们群雄逐鹿,好不热闹。

这个社区是三国后期的主要人物了。这个网络背后的故事,是司马氏两代三人打败姜维率领的蜀汉群雄,又扫除了曹魏内部的曹家势力,终于登上权力的顶峰。

动态网络

研究社交网络随时间的变化,是个很有意思的任务。而《三国演义》大致按照时间线叙述,且有着极长的时间跨度,顺着故事线往下走,社交网络会发生什么样的变化呢?

这里,我取 10章 的文本作为跨度,每 5 章记录一次当前跨度中的社交网络,就相当于留下一张快照,把这些快照连接起来,我们就能够看到一个社交网络变化的动画。快照还是用 networkx 得到,而制作动画,我们可以用 moviepy。

江山代有才人出,让我们看看在故事发展的各个阶段,都是哪一群人活跃在舞台中央呢?

美观起见,动画中省略了网络中的边。

随着时间的变化,曾经站在历史舞台中央的人们也渐渐地会渐渐离开,让人不禁唏嘘感叹。正如《三国演义》开篇所言:

古今多少事,都付笑谈中。

今日,小辈利用 python 做的一番笑谈也就到此结束吧……

源码地址:https://github.com/blmoistawinde/hello_world/tree/master/sanguo_network

注:

[1] harvesttext 是本人的作品~(*__*) ~,已在 Github 上开源并可通过 pip 直接安装,旨在帮助使用者更轻易地完成像本文这样的文本数据分析。除了本文涉及的功能以外,还有情感分析、新词发现等功能。大家觉得有用的话,不妨亲身尝试下,看看能不能在自己感兴趣的文本上有更多有趣有用的发现呢?

[2] commutity 库的本名是python-louvain,使用了和 Gephi 内置相同的Louvain 算法进行社区发现

[3] 由于处理古文的困难性,本文中依然有一些比较明显的错误,希望大家不要介意~

 

 

用python分析《三国演义》中的社交网络http://t.zijieimg.com/9fPpBW/

转载请注明:徐自远的乱七八糟小站 » 用python分析《三国演义》中的社交网络

喜欢 (0)

苏ICP备18041234号-1 bei_an 苏公网安备 32021402001397号