写在前面:本文是学习实验楼《Python 基于共现提取<釜山行>人物关系》这一课后的总结,博主仅做了一些微小的改动,大家可以点击这里跳转学习。
开门见山,先亮结果。我用这种方法制作了《龙族3·黑月之潮(下)》的人物关系网络图,如下图所示:

这个图是用Gephi生成的,关于Gephi使用的教程有很多,大家去这里学习。
图形可以由软件自动生成,但是数据得需要我们自己准备。要画出这种关系图,我们需要给Gephi输入两种格式的文件,即节点文件和边文件。
节点文件(node.txt),有Id, Label, Weight(节点出现的次数)三个变量,如图所示:

边文件(edge.txt),有Source(起点),Target(终端),Weight(该起点-终点的出现次数)三个变量,如图所示:

因此,实现这个需求需要两步:
- 第一步:用Python对文本中的关系进行提取,生成这两个格式的文件。
- 第二步:将这两个文件输入Gephi,生成图片。
下面我们逐步讲讲解。
第一步:Python提取
准备
1、安装jieba库,可以在命令行输入以下命令:1
pip install jieba
2、准备待处理的文本,这里以《龙族3·黑月之潮(下)》为例,点击下载。
3、准备姓名字典,可以直接从百度百科上复制粘贴,以下是《龙族》主要角色的姓名字典:

导入相关库
1 | import jieba, codecs |
为什么要用codecs打开文件,而不直接用open打开文件,请看这里。
创建字典
- 使用字典类型names保存人物,该字典的键为人物名称,值为该人物在全文中出现的次数;
- 使用字典类型relationships保存人物关系的有向边,该字典的键为有向边的起点,值为一个字典edge,edge的键是有向边的终点,值是有向边的权值,代表两个人物之间联系的紧密程度。
- lineNames是一个缓存变量,保存对每一段分词得到当前段中出现的人物名称,lineName[i]是一个列表,列表中存储第i段中出现过的人物。
1 | names = {} # 姓名字典 |
生成节点文件(node.txt)
1 | jieba.load_userdict("resource\\dict.txt") # 加载字典 |
生成边文件(edge.txt)
1 | for line in lineNames: # 对于每一段 |
存储节点文件(node.txt)
1 | with codecs.open("longzu_node.txt", "w", "utf8") as f: |
存储边文件(edge.txt)
1 | with codecs.open("longzu_edge.txt", "w", "utf8") as f: |
运行代码
最后,运行代码,就可以在工作目录生成节点文件(longzu_node.txt)和边文件(longzu_edge.txt)了,程序运行时间长短跟文本长度相关。
最后,你可以访问我的GitHub直接下载源代码和相关文本。
第二步:Gephi生成
安装软件
安装Gephi,可以点击这里下载Gephi-0.9.1-windows。
导入数据
1、打开软件-新建工程-文件-import spreadsheet
2、上传节点文件(longzu_node.txt)

3、上传边文件(longzu_edge.txt)
导入后 gephi 将显示所有节点。此时节点没有合适的布局,可以在最上方的数据资料选项卡中查看图中所有的边和节点,对于分词不准确导致的噪音,可以手动删除。

设置参数
1、分别点击右侧统计栏中平均度和模块化运行计算。模块化运算时Resolution值填写0.5 。

2、击左上角外观中节点第一个选项卡,选择数值设定,选择Modularity Class。

3、选中第二个选项卡,选择数值设定,选择连入度,最小尺寸填10,最大尺寸填40,点击应用为节点染色、放大。

4、选择左下角布局中的Force Atlas,斥力强度填写20000.0,吸引强度填写1.0。点击运行,稍后点击停止。

5、点击最上方的预览按钮,选中左侧节点标签中显示标签选项,并选择一种字体和字号,这里选择7号楷体,点击刷新即可看到最终的网络图。

导出图片
点击文件-输出,即可输出图片。png格式的图片较小,放大后不清晰,建议存储为PDF格式,再转为图片格式。

最终图片

参考资料:
【1】Python 基于共现提取《釜山行》人物关系
【2】python 文件读写时用open还是codecs.open