写在前面:本文是学习实验楼《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格式,再转为图片格式。

最终图片

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

  1. python调用msf_MSF利用python反弹shell-Bypass AV

    本文主要介绍两种利用msf生成python版 payload,并利用Py2exe或PyInstaller将python文件转为exe文件,可成功bypass某些AV反弹shell msf-python ...

  2. 【Python例】利用 python 进行图片文字信息的提取 --- OCR-EasyOCR

    [Python例]利用 python 进行图片文字信息的提取 - OCR-EasyOCR 本文主要用于记录,并使用 python 脚本进行图片文字信息的生成. 什么是 OCR? OCR OCR(Opt ...

  3. 【Python例】利用 python 进行用户画像词云图的生成 --- wordcloud

    [Python例]利用 python 进行用户画像词云图的生成 - wordcloud 本文主要用于记录,并使用 python 脚本进行用户画像的词云图的生成. 前言 对于词云图来说,是一个用户画像数 ...

  4. boxplot用法 python,[Python画图笔记]利用Python画箱型图boxplot

    [Python画图笔记]利用Python画箱型图boxplot [Python画图笔记]利用Python画箱型图boxplot 最近在学习使用Python画图,想用subplot画两幅箱型图,分别用来 ...

  5. 如何利用pyecharts绘制炫酷的关系网络图?

    如何利用pyecharts绘制炫酷的关系网络图 这是本学期在大数据哲学与社会科学实验室做的第六次分享了. 第一次分享的是: 如何利用"wordcloud+jieba"制作中文词云? ...

  6. python拼图_利用python制作拼图小游戏的全过程

    开发工具 Python版本:3.6.4 相关模块: pygame模块: 以及一些Python自带的模块 关注公众号:Python学习指南,回复"拼图"即可获取源码 环境搭建 安装P ...

  7. python英文发音-利用Python制作查单词小程序(二):下载音频并播放单词读音

    上篇文章中,我们要使用"execjs"这个模块来执行JS代码,这个模块在Anaconda中没有预先安装好,我们需要单独安装它.那么,我们如何安装新的模块呢? 以Anaconda为例 ...

  8. 【深度相机D435i】Windows+Ubuntu下调用D435i利用Python读取、保存RGB、Depth图片

    目录 前言 一.D435i深度相机介绍 二.Windows下安装D435i 1.安装Intel® RealSense™ SDK 2.0 2.使用Intel® RealSense™ Viewer查看D4 ...

  9. python调用lib_基于python调用libvirt API

    基于python调用libvirt API 1.程序代码 #!/usr/bin/python import libvirt import sys def createConnection(): con ...

  10. python控制autocad_利用python控制Autocad:pyautocad方式

    发现pyautocad模块:可以用python控制autocad的包.今天把文档中的重点内容摘录出来,以后绘图.计算大工程量.或者识别施工图的时候时候也许可以用到. 一.连接cad pyautocad ...

最新文章

  1. 模板:使用文件作为输入
  2. 服务管理--systemctl命令
  3. STM32 备份寄存器操作
  4. smartgwt_高级SmartGWT教程,第1部分
  5. 计算机应用基础2010版知识点,2010计算机应用基础选择题(含答案版)重点.doc
  6. 玩转Nacos参数配置!多图勿点
  7. HDOJ 1274 展开字符串
  8. SQOOP——MySQL 和 HDFS 的桥梁
  9. HDU 5976 2016ICPC大连 F: Detachment(找规律)
  10. Editor GUI 的 Gamma Correction
  11. fseek函数、ftell函数、rewind函数详解
  12. web用css做网页实验报告,Web实验报告网页设计与制作
  13. 参考文献中英文人名_参考文献英文名字应该怎么写?
  14. 结对项目--黄金点游戏(邓乐曾亮)
  15. opencv 入门笔记五 padding(图像加边框)
  16. sketch制作Android动画,Sketch制作GIF动画——基础篇(改良版)
  17. 怎样查看服务器操作系统密码,IIS提示:您未被授权查看该页 并弹出输入用户名密码Windows服务器操作系统 -电脑资料...
  18. 常用前端技术有哪些?
  19. Java体系知识学习——Java怎么学?
  20. C#实现ODBC驱动代码连接Sql Server数据库

热门文章

  1. Java 应用结构规范
  2. hardfault常见原因_STM32如何查找hardfault原因
  3. mysql safe file priv_解决MySQL导入数据时遇到secure-file-priv的问题
  4. 怎么样添加桌面我的计算机,怎么样把我的电脑添加到桌面上
  5. 大型Web网站优化总结一
  6. 动态表情与超链接制作
  7. 协同办公笔记软件综合评测:飞书、语雀、Notion、FlowUs、Wolai
  8. 编写代码的「八荣八耻」(上篇)
  9. SDN相关组织之ODL(opendaylight)
  10. FineCMS-v5.0.1漏洞审计