理一下画关系图的步骤:

首先,要找到《人民的名义》的台词(或剧本),可以使用UTF8编码的txt文件。

其次,要提取剧中的角色,这里我们使用jieba分词模块来提取文本中的角色名,得到图的“节点”

然后,为再剧本中每一段中出现的若干个角色,两两之间建立一条“边”,根据两两角色一同出现频度,来决定边的“权值”

最后,根据上面的信息,使用Gephi来图

可以先定义三个变量

# names : 保存人物,键为人物名称,值为该人物在全文中出现的次数

# relationship : 保存人物关系的有向边,键为有向边的起点,值为一个字典 edge ,edge 的键为有向边的终点,值是有向边的权值,

# 代表两个人物之间联系的紧密程度

# lineNames : 缓存变量,保存对每一段分词得到当前段中出现的人物名称

names = {}

relationships = {}

lineNames = []

1.提取角色(节点)

jieba分词中对人名的识别不够准确,比如,可能会把“明白”、“文明”这样的词识别为人名,针对这个问题,可以建立用户自定义字典,以提高《人民的名义》中人名的识别准确率。

可以在网上查找角色表,写入一个txt文件。如下是一个自定义字典的示例,每行第一个代表字典中的词,第二个代表频数,第三个代表词性。

侯亮平 100 nr

沙瑞金 100 nr

李达康 100 nr

高育良 100 nr

祁同伟 100 nr

陆亦可 100 nr

高小琴 100 nr

吴慧芬 100 nr

刘新建 100 nr

陈岩石 100 nr

季昌明 100 nr

赵瑞龙 100 nr

郑西坡 100 nr

钟小艾 100 nr

赵东来 100 nr

蔡成功 100 nr

欧阳菁 100 nr

丁义珍 100 nr

程度 100 nr

陈海 100 nr

郑胜利 100 nr

王文革 100 nr

田国富 100 nr

赵德汉 100 nr

易学习 100 nr

梁璐 100 nr

孙连成 100 nr

肖钢玉 100 nr

林华华 100 nr

jieba.load_userdict("RoleTable.txt")

在分词后判断一个词是否为人名,可以用下面两个条件筛选,满足条件的可以人为不是人名

1) 该词词性不为 “nr” 2) 该词长度小于2

with codecs.open("人民的名义.txt", 'r', 'utf8') as f:

for line in f.readlines(): # 注意是 readlines 要加s 不加s 只读取一行

poss = pseg.cut(line) # 分词,返回词性

lineNames.append([]) # 为本段增加一个人物列表

for w in poss:

if w.flag != 'nr' or len(w.word) < 2:

continue # 当分词长度小于2或该词词性不为nr(人名)时认为该词不为人名

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

if names.get(w.word) is None: # 如果某人物(w.word)不在人物字典中

names[w.word] = 0

relationships[w.word] = {}

names[w.word] += 1

可以查看一下结果:

# 输出人物出现次数统计结果

for name, times in names.items():

print(name, times)

2.创建角色关系(边)

# 对于 lineNames 中每一行,我们为该行中出现的所有人物两两相连。如果两个人物之间尚未有边建立,则将新建的边权值设为 1,

# 否则将已存在的边的权值加 1。这种方法将产生很多的冗余边,这些冗余边将在最后处理。

for 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:

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

3.输出图的信息

# 由于分词的不准确会出现很多不是人名的“人名”,从而导致出现很多冗余边,为此可设置阈值为10,即当边出现10次以上则认为不是冗余

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

f.write("ID Label Weight\r\n")

for name, times in names.items():

if times > 10:

f.write(name + " " + name + " " + str(times) + "\r\n")

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

f.write("Source Target Weight\r\n")

for name, edges in relationships.items():

for v, w in edges.items():

if w > 10:

f.write(name + " " + v + " " + str(w) + "\r\n")

节点:

边:

至此工作已完成一大半。

4.使用Gephi画图

笔者是在Windows环境下使用Gephi,为了能将图的信息导入Gephi,需要对上面的People_node.txt与People_edge.txt文件进行预处理。Linux环境可以跳过此步骤。

我们借助Office的Excel将txt文件转换为csv文件(一种逗号分隔的文件)

打开Excel -> 数据 -> 自文本 -> 选择要转换的txt文件

选择下一步

注意选择分隔符号为空格

然后就可以将txt文本导入,最后选择另存为csv文件即可。

打开Gephi -> 文件 -> 导入电子表格 -> 选择刚刚生成的csv文件

注意:先导入节点后导入边,两个文件导入到同一个工作区域内

若出现乱码重选字符集(如GBK)

注意:导入节点文件时可以是新建一个工作空间,但记得导入边文件时要加入同一个工作空间

在 概况 -> 工作区 -> 外观 中选择你想要的外观

在 概况 -> 工作区 -> 布局 中选择你想要的布局,记得点运行

在 预览 -> 预览设置 -> 节点 中勾选 显示标签,选择合适的字体字号

在 预览 -> 预览设置 -> 边 中勾选 重新调整权重

为了美观可以将边箭头尺寸调为零,最后选择刷新

可以通过 文件 -> 输出 来输出图文件,下面是笔者做出来的示例:

全部代码:

# -*- conding: utf-8 -*-

import codecs

import jieba.posseg as pseg

import jieba

# names : 保存人物,键为人物名称,值为该人物在全文中出现的次数

# relationship : 保存人物关系的有向边,键为有向边的起点,值为一个字典 edge ,edge 的键为有向边的终点,值是有向边的权值,

# 代表两个人物之间联系的紧密程度

# lineNames : 缓存变量,保存对每一段分词得到当前段中出现的人物名称

names = {}

relationships = {}

lineNames = []

jieba.load_userdict("RoleTable.txt")

with codecs.open("人民的名义.txt", 'r', 'utf8') as f:

for line in f.readlines(): # 注意是 readlines 要加s 不加s 只读取一行

poss = pseg.cut(line) # 分词,返回词性

lineNames.append([]) # 为本段增加一个人物列表

for w in poss:

if w.flag != 'nr' or len(w.word) < 2:

continue # 当分词长度小于2或该词词性不为nr(人名)时认为该词不为人名

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

if names.get(w.word) is None: # 如果某人物(w.word)不在人物字典中

names[w.word] = 0

relationships[w.word] = {}

names[w.word] += 1

# 输出人物出现次数统计结果

# for name, times in names.items():

# print(name, times)

# 对于 lineNames 中每一行,我们为该行中出现的所有人物两两相连。如果两个人物之间尚未有边建立,则将新建的边权值设为 1,

# 否则将已存在的边的权值加 1。这种方法将产生很多的冗余边,这些冗余边将在最后处理。

for 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:

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

# 由于分词的不准确会出现很多不是人名的“人名”,从而导致出现很多冗余边,为此可设置阈值为10,即当边出现10次以上则认为不是冗余

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

f.write("ID Label Weight\r\n")

for name, times in names.items():

if times > 10:

f.write(name + " " + name + " " + str(times) + "\r\n")

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

f.write("Source Target Weight\r\n")

for name, edges in relationships.items():

for v, w in edges.items():

if w > 10:

f.write(name + " " + v + " " + str(w) + "\r\n")

python代码画人物_用Python+Gephi画《人民的名义》人物关系图相关推荐

  1. python代码去马赛克_十行python代码教你如何去除万恶的,如s一样的马赛克

    世界上有一种东西,叫作马赛克,不知道困扰了多少痴男怨女.小编新get到一个技能,忍不住拿出来秀一秀. 小编这几天的了解其实水印和马赛克的原理是一样的,都是覆盖.一般是去不了的,那么这个技术来了,请看~ ...

  2. python代码加密解密_在python中加密 – 在Javascript中解密

    您的Python代码和CryptoJS代码存在许多问题: >您使用随机IV加密Python中的一些明文.如果要检索该明文,则需要在解密期间使用相同的IV.没有IV,明文就无法恢复.通常,IV只是 ...

  3. 什么叫python代码的优化_优化Python代码

    如果你的问题是关于优化python代码(我认为应该是这样),那么你可以做各种各样的intesting的事情,但是首先: 你可能不应该痴迷于优化python代码!如果您正在使用最快的算法来解决问题,并且 ...

  4. python代码风格指南_记录Python代码:完整指南

    python代码风格指南 Welcome to your complete guide to documenting Python code. Whether you're documenting a ...

  5. python代码颜色搭配_修改Python IDLE代码配色及语法高亮主题

    文章1 原出处:http://wangye.org/blog/archives/634/ 文章2 原出处:http://huacnlee.com/blog/share-someting-python- ...

  6. python代码阅读器_用Python代码实现的RSS阅读器示例

    玩蛇网python之家这篇文章是关于如何使用Python代码实现RSS阅读器示例,如何用Tkinter等模块方法实现RSS订阅器的编写,参考学习过下面的正试代码后就会明白. 简单的说下RSS阅读器是什 ...

  7. python代码写名字_【python】【名字】是什么?,Pythonname

    前言 在我们浏览一下 python 文件或者自己写 python 代码的时候,时常会在代码的最后加上这样的一行代码 if __name__ == '__main__': func_name() 那么这 ...

  8. python代码设计测试用例_(appium+python)UI自动化_08_unittest编写测试用例

    前言 unittest是python自带的单元测试框架,类似于Junit(Java单元测试框架).支持自动化测试,可编写测试前置&后置条件,并且可批量运行测试用例并生成测试报告. 使用unit ...

  9. python代码写入方式_【Python 1-17】Python手把手教程之——文件的读写以及I/O操作...

    作者 | 弗拉德 来源 | 弗拉德(公众号:fulade_me) 从文件中读取数据 文本文件可存储的数据量很多,每当需要分析或修改存储在文件中的信息时,读取文件都很有用,对数据分析应用程序来说尤其 如 ...

  10. 搜索python代码的软件_用python编写一个高效搜索代码工具

    用python编写一个高效搜索代码工具 大多码农在linux环境下使用grep+关键词的命令搜索自己想要的代码或者log文件.今天介绍用python如何编写一个更强大的搜索工具,windows下也适用 ...

最新文章

  1. 洪小文: 今天的AI只是一个黑盒,仍需与HI密切配合
  2. secureCRT连接问题
  3. 【读书】正则指引-3-括号
  4. 新版“峡谷第一美”妲己尾巴毛发制作分享
  5. 记crontab脚本未执行问题排查
  6. poxtfix+dovecot+saslauthd+courier-authlib +mysql + extmail 完整虚拟邮箱系统部署
  7. 2021年京东小魔方年中新品消费趋势报告
  8. 软件测试行业前景,人才稀缺
  9. 基于matlab的锁相环频率合成器,基于simulink的电荷泵锁相环频率合成器建模与仿真.pdf...
  10. win7鼠标指针主题包_MouseInc 小巧好用的鼠标手势软件
  11. 思维导图的绘制要点及使用GitMind工具快速制作思维导图
  12. 智能快递柜解决方案及整套源代码
  13. 【5G核心网】 NGAP 消息
  14. 【概率论与数理统计】1.5 独立性
  15. BEVFormer论文解析
  16. Android源码目录结构,以Android2.1为例
  17. 如何将已有图片做成透明水印_如何批量给图片添加属于自己的全屏透明水印?其实方法很简单...
  18. Webots平台下NAO机器人仿真环境的搭建
  19. 百度云的高速下载技巧系列2---多线程文件下载工具idm v6.28.1绿色免注册版(PC)
  20. 实现Ubuntu同时安装open_jdk 和 oracle_jdk

热门文章

  1. Coded UI Test 常见问题总结
  2. linux gpio管脚功能配置API
  3. WIN7护眼颜色设置
  4. python-random模块详解
  5. perl脚本基础总结(转)
  6. 2020计算机校友会大学排名,2020年校友会大学排名:一个世界一流大学,一个中国一流大学...
  7. 计算机磁盘怎么清理,电脑磁盘已满怎么清理_电脑磁盘不足怎么清理
  8. 测试过程中印象最深刻的bug?| 万能回答必杀技
  9. vue使用Swiper页面中有滚动条,为什么鼠标滚轮不起作用呢?
  10. 新零售智慧供应链架构