python调用gephi_利用Python和Gephi制作人物关系网络图

写在前面:本文是学习实验楼《Python 基于共现提取人物关系》这一课后的总结,博主仅做了一些微小的改动,大家可以点击这里跳转学习。

开门见山,先亮结果。我用这种方法制作了《龙族3·黑月之潮(下)》的人物关系网络图,如下图所示:

这个图是用Gephi生成的,关于Gephi使用的教程有很多,大家去这里学习。

图形可以由软件自动生成,但是数据得需要我们自己准备。要画出这种关系图,我们需要给Gephi输入两种格式的文件,即节点文件和边文件。

节点文件(node.txt),有Id, Label, Weight(节点出现的次数)三个变量,如图所示:

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

因此,实现这个需求需要两步:

第一步:用Python对文本中的关系进行提取,生成这两个格式的文件。

第二步:将这两个文件输入Gephi,生成图片。

下面我们逐步讲讲解。

第一步:Python提取

准备

1、安装jieba库,可以在命令行输入以下命令:1pip install jieba

2、准备待处理的文本,这里以《龙族3·黑月之潮(下)》为例,点击下载。

3、准备姓名字典,可以直接从百度百科上复制粘贴,以下是《龙族》主要角色的姓名字典:

导入相关库1import jieba, codecs

为什么要用codecs打开文件,而不直接用open打开文件,请看这里。

创建字典使用字典类型names保存人物,该字典的键为人物名称,值为该人物在全文中出现的次数;

使用字典类型relationships保存人物关系的有向边,该字典的键为有向边的起点,值为一个字典edge,edge的键是有向边的终点,值是有向边的权值,代表两个人物之间联系的紧密程度。

lineNames是一个缓存变量,保存对每一段分词得到当前段中出现的人物名称,lineName[i]是一个列表,列表中存储第i段中出现过的人物。

1

2

3names = {}

relationships = {} # 关系字典

lineNames = [] # 每段内人物关系

生成节点文件(node.txt)1

2

3

4

5

6

7

8

9

10

11

12

13

14

15jieba.load_userdict("resource\dict.txt") # 加载字典

with open("resource\dict.txt","r",encoding="utf8") as f:

nameList = f.readlines() # 将角色姓名存入列表nameList

with codecs.open("resource\龙族3·黑月之潮·下.txt", "r", "utf8") as f:

for line in f.readlines():

wordList = jieba.lcut(line) # 分词并返回一个列表

lineNames.append([]) # 为新读入的一段添加该段的人物名称列表

for w in wordList: # 遍历列表

if w+"rn" not in nameList:

continue # 当分词不在姓名列表nameList时认为该词不是人名

lineNames[-1].append(w) # 为当前段的环境增加一个人物

if names.get(w) is None: # 如果该人名在姓名字典中对应的权值为空(还没有这个键值对)

names[w] = 0 # 则创建该键值对,参考实例test1.py

relationships[w] = {}

names[w] += 1 # 该人物出现次数加 1

生成边文件(edge.txt)1

2

3

4

5

6

7

8

9for line in lineNames: # 对于每一段

for name1 in line:

for name2 in line: # 每段中的任意两个人

if name1 == name2:

continue

if relationships[name1].get(name2) is None: # 若两人尚未同时出现则新建项

relationships[name1][name2]= 1

else: # 两人共同出现次数加 1

relationships[name1][name2] = relationships[name1][name2]+ 1

存储节点文件(node.txt)1

2

3

4with codecs.open("longzu_node.txt", "w", "utf8") as f:

f.write("Id Label Weightrn")

for name, times in names.items():

f.write(name + " " + name + " " + str(times) + "rn")

存储边文件(edge.txt)1

2

3

4

5

6with codecs.open("longzu_edge.txt", "w", "utf8") as f:

f.write("Source Target Weightrn")

for name, edges in relationships.items():

for v, w in edges.items():

if w > 3:

f.write(name + " " + v + " " + str(w) + "rn")

运行代码

最后,运行代码,就可以在工作目录生成节点文件(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
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
抱歉,我并不具备绘制图形的能力,但我可以提供一些思路和工具。 要画人物关系图,首先需要有人物关系数据。可以从小说、电视剧等作品中搜集得到。这里以《人民的名义》为例,假设已经有了以下人物关系数据: ``` 赵德汉,李达康 赵德汉,李书记 李达康,李书记 李达康,白岩松 李书记,吕同芳 吕同芳,侯亮平 侯亮平,高育良 高育良,陆亦可 陆亦可,祁同伟 祁同伟,高小琴 高小琴,孙连城 孙连城,赵立春 ``` 接下来可以使用 Python 处理这些数据,生成 Gephi 软件可以识别的格式。 ```python import networkx as nx # 读取人物关系数据 data = [] with open('data.txt', 'r') as f: for line in f.readlines(): nodes = line.strip().split(',') data.append((nodes[0], nodes[1])) # 创建有向图 G = nx.DiGraph() # 添加人物节点和边 for d in data: G.add_edge(d[0], d[1]) # 输出为 Gephi 格式 nx.write_gexf(G, 'out.gexf') ``` 上述代码使用了 `networkx` 库,可以方便地创建有向图,并将结果输出为 Gephi 格式。要使用 Gephi 软件来绘制图形,可以按照以下步骤: 1. 下载并安装 Gephi 软件; 2. 打开 Gephi 软件,选择“Open a File”菜单,打开上述 Python 代码生成的 `out.gexf` 文件; 3. 在左侧的“Overview”窗格中,可以看到节点和边的信息。可以使用“Layout”菜单来对节点进行布局,如使用“Force Atlas”布局; 4. 在右侧的“Preview”窗格中预览图形,并按需调整颜色、大小等参数; 5. 将结果保存为图片或 PDF 等格式。 希望这些思路和工具能够帮助你绘制出理想的人物关系图。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值