用到的工具

  • jieba
    jieba分词,最好用的开源中文分词工具。他最主要的两个功能是分词和关键词的抽取。在这里我们需要用他的分词功能来提取文本中的人名。
  • gephi
    gephi是一个开源的复杂网络数据可视化软件,可用于探索数据分析、链路分析、社交网络分析、生物网络分析等。我们需要把数据处理成gephi可接受的csv格式,然后再进行绘制。

实现流程

代码实现分为三步,1. 人物出场次数统计。2. 人物关系统计。3. 格式化输出。

准备工作

准备两份字典,用于分词。

  • 文本人物字典
    文本人物字典包含了文本中的大部分人名,或者说是我们关心的人物的人名。

人物别称映射字典

民国时期的散文,势必每个人会有多个称呼,在文化人中甚多。蕊生、我、兰成、胡先生指代的都是胡兰成。因此需要一个映射字典,将不同的称呼都映射到同一个人名当中。

定义文件路径常量和初始化全局变量

TEXT_PATH = '../jsjs.txt'  # 文本路径
DICT_PATH = 'person.txt'  # 人物字典路径
SYNONYMOUS_DICT_PATH = 'synonymous_dict.txt'  # 同义词路径
SAVE_NODE_PATH = 'node.csv'
SAVE_EDGE_PATH = 'edge.csv''''
person_counter是一个计数器,用来统计人物出现的次数。{'a':1,'b':2}
person_per_paragraph每段文字中出现的人物[['a','b'],[]]
relationships保存的是人物间的关系。key为人物A,value为字典,包含人物B和权值。
'''
person_counter = defaultdict(int)  # 人物出场次数计数器
person_per_paragraph = []
relationships = {}
synonymous_dict = {}

人物出场次数统计

def count_person(self):'''统计人物出场次数,添加每段的人物:return:'''paragraphs = self.get_clean_paragraphs()synonymous = self.synonymous_names()print('start process node')with codecs.open(self._dict_path, 'r', 'utf-8') as f:name_list = f.read().split(' 10 nrrn')  # 获取干净的name_listfor p in paragraphs:jieba.load_userdict(self._dict_path)# 分词,为每一段初始化新字典poss = jieba.cut(p)self._person_per_paragraph.append([])for w in poss:# 判断是否在姓名字典以及同义词区分if w not in name_list:continueif synonymous.get(w):w = synonymous[w]# 往每段中添加人物self._person_per_paragraph[-1].append(w)# 初始化人物关系,计数if self._person_counter.get(w) is None:self._relationships[w] = {}self._person_counter[w] += 1return self._person_counter

人物关系统计

def calc_relationship(self):'''统计人物关系权值:return:'''print("start to process edge")# 遍历每一段落,笛卡尔积形式,统计人物关系for p in self._person_per_paragraph:for name1 in p:for name2 in p:if name1 == name2:continueif self._relationships[name1].get(name2) is None:self._relationships[name1][name2] = 1else:self._relationships[name1][name2] += 1return self._relationships

格式化输出

def save_node_and_edge(self):'''根据dephi格式保存为csv:return:'''with codecs.open(SAVE_NODE_PATH, "a+", "utf-8") as f:f.write("Id,Label,Weightrn")for name, times in self._person_counter.items():f.write(name + "," + name + "," + str(times) + "rn")with codecs.open(SAVE_EDGE_PATH, "a+", "utf-8") as f:f.write("Source,Target,Weightrn")for name, edges in self._relationships.items():for v, w in edges.items():if w > 3:f.write(name + "," + v + "," + str(w) + "rn")print('save file successful!')

转为csv文件后

得到结果如下所示

接下来就可以把数据导入到gephi中生成人物关系网图了。

gephi的使用

假如gephi下载失败,可以参考下面这个链接

Gephi 入门使用_java_飞羽的博客-CSDN博客​blog.csdn.net

打开如下所示

1. 新建工程,导入数据

  1. 新建工程
  2. 选择数据资料tab,点击输入数字表格,添加节点和边的csv数据。

2.调整相关的样式

点击概览调整相关样式。可以通过度,权重等信息修改相关的样式。

3. 修改字体,显示相应的标签

4. 选择一个自动化布局的方式,预览,再调整相关参数

5. 最终点击左下角导出图片

参考了:

黄宇鹏:介绍用Gephi进行数据可视化​zhuanlan.zhihu.com

三国演义人物出场统计代码含义_用python分析小说人物关系(二)——实战篇相关推荐

  1. 三国演义人物出场统计代码含义_实例2之《三国演义》人物出场统计

    大家好,我是人间富贵花下的贫穷草,简称人间富贵草. jieba(结巴)作为一个优秀的第三方中文分词函数库,今天我们就把它拉出来溜溜. <三国演义>txt文本下载地址: https://ww ...

  2. python人物关系抽取小说_用python分析小说人物关系(一)——理论篇

    1.工具介绍 jieba jieba分词,最好用的开源中文分词工具.他最主要的两个功能是分词和关键词的抽取.在这里,我们需要用他的分词功能来提取文本中的人名. gephi gephi是一个开源的复杂网 ...

  3. python 小说人物分析_用python分析小说人物关系(二)——实战篇

    用到的工具jieba jieba分词,最好用的开源中文分词工具.他最主要的两个功能是分词和关键词的抽取.在这里我们需要用他的分词功能来提取文本中的人名. gephi gephi是一个开源的复杂网络数据 ...

  4. 三国演义人物出场统计代码含义_Python分析《三国演义》人物出场次数,孔明第二,赵云第五...

    本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. import jieba excludes = {"将军", ...

  5. 《三国演义》人物出场统计

    人物出场统计涉及对词汇的统计.中文文章需要分词才能进行词频统计.这就需要用到jieba库. 实现代码1: #三国演义 人物出场统计 import jieba txt=open("threek ...

  6. 三国演义人物出场统计

    #Hamlet词频统计(含Hamlet原文文本)#CalHamletV1.py def getText():txt = open("hamlet.txt", "r&quo ...

  7. 红楼梦人物出场统计python_Python程序设计习题3——红楼梦人物出场次数统计

    统计<红楼梦>中前20位出场最多的人物 使用Python编写程序,统计书籍<红楼梦>中前20位出场次数最多的人物 #红楼梦人物出场统计 import jieba txt=ope ...

  8. 三国演义python分析系统_用python分析四大名著之三国演义

    点击上方"程序人生",选择"置顶公众号" 第一时间关注程序猿(媛)身边的故事 项目起因及意义 起初在浏览知乎时看见一篇文章觉得很有意思(用 Python 分析& ...

  9. python三国演义人物出场统计ppt_Python学习之四大名著人物出场次数Python代码-Go语言中文社区...

    <三国演义>,<水浒传>,<西游记>的人物出场次数Python代码: 经过代码运行的结果可以看出三国作者对曹操和孔明比较喜爱:水浒作者对宋江和武松比较喜爱:西游作者 ...

  10. 《三国演义》之人物出场统计

    版权声明:该文是博主个人的学习笔记,如有错误,恳请看官在评论区指出,在下不胜感激-如要转载注明出处即可- 人物出场设计对词汇的统计.中文文章需要分词才能进行词频统计,这需要用到jieba库. < ...

最新文章

  1. java类安卓app 简介_android.app.Activity 的介绍
  2. 查缺补漏 | Python控制结构
  3. Machine Learning | (8) Scikit-learn的分类器算法-随机森林(Random Forest)
  4. 10 款 VS Code 插件神器,第 7 款超级实用!
  5. 洛谷 T61816 代数式的最值
  6. Oracle包和包体以及与非包体定义函数、过程的区别
  7. 设计模式(九)--注册树模式
  8. Facebook 竟然把服务 27 亿人的 AI 硬件系统开源了?!
  9. Spring中利用java注解声明切面
  10. ganglia metric extended by gmetric command line tool
  11. 软工网络15团队作业4——Alpha阶段敏捷冲刺-3
  12. etf基金代码大全_再谈深得我心的指数基金:纳指ETF
  13. AUTOCAD——新建或修改尺寸样式
  14. ASP.NET Repeater控件使用方法
  15. 【UVA 1589 --- Xiangqi】
  16. 前端开发:报错Error in... ”SyntaxError:Unexpected token u in JSON at position 0”…解决方法
  17. agx上搭建ros2
  18. 人脸解锁手机与电影阿丽塔背后的3D原理:云从科技的技术突破
  19. iOS 开关-UISwitch
  20. 上传大文件解决方案方法

热门文章

  1. Linux中sudo的用法和sudoers配置详解
  2. bash算术求值和errexit陷阱
  3. 堆叠顺序的误区和z-index
  4. 变压器的分类_变压器的作用
  5. Starling滤镜合集2(新增7种滤镜)
  6. 斐波那契数列PHP非递归数组实现
  7. [转载] C#面向对象设计模式纵横谈——11. Facede外观模式
  8. hdu 5038 (2014北京网络赛G 排序水题)
  9. div section article区分--20150227
  10. 深入浅出插入类排序算法(直接插入, 折半插入, 希尔排序)