三国演义人物出场统计代码含义_用python分析小说人物关系(二)——实战篇
用到的工具
- 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. 新建工程,导入数据
- 新建工程
- 选择
数据资料
tab,点击输入数字表格
,添加节点和边的csv
数据。
2.调整相关的样式
点击概览调整相关样式。可以通过度,权重等信息修改相关的样式。
3. 修改字体,显示相应的标签
4. 选择一个自动化布局的方式,预览,再调整相关参数
5. 最终点击左下角导出图片
参考了:
黄宇鹏:介绍用Gephi进行数据可视化zhuanlan.zhihu.com
三国演义人物出场统计代码含义_用python分析小说人物关系(二)——实战篇相关推荐
- 三国演义人物出场统计代码含义_实例2之《三国演义》人物出场统计
大家好,我是人间富贵花下的贫穷草,简称人间富贵草. jieba(结巴)作为一个优秀的第三方中文分词函数库,今天我们就把它拉出来溜溜. <三国演义>txt文本下载地址: https://ww ...
- python人物关系抽取小说_用python分析小说人物关系(一)——理论篇
1.工具介绍 jieba jieba分词,最好用的开源中文分词工具.他最主要的两个功能是分词和关键词的抽取.在这里,我们需要用他的分词功能来提取文本中的人名. gephi gephi是一个开源的复杂网 ...
- python 小说人物分析_用python分析小说人物关系(二)——实战篇
用到的工具jieba jieba分词,最好用的开源中文分词工具.他最主要的两个功能是分词和关键词的抽取.在这里我们需要用他的分词功能来提取文本中的人名. gephi gephi是一个开源的复杂网络数据 ...
- 三国演义人物出场统计代码含义_Python分析《三国演义》人物出场次数,孔明第二,赵云第五...
本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. import jieba excludes = {"将军", ...
- 《三国演义》人物出场统计
人物出场统计涉及对词汇的统计.中文文章需要分词才能进行词频统计.这就需要用到jieba库. 实现代码1: #三国演义 人物出场统计 import jieba txt=open("threek ...
- 三国演义人物出场统计
#Hamlet词频统计(含Hamlet原文文本)#CalHamletV1.py def getText():txt = open("hamlet.txt", "r&quo ...
- 红楼梦人物出场统计python_Python程序设计习题3——红楼梦人物出场次数统计
统计<红楼梦>中前20位出场最多的人物 使用Python编写程序,统计书籍<红楼梦>中前20位出场次数最多的人物 #红楼梦人物出场统计 import jieba txt=ope ...
- 三国演义python分析系统_用python分析四大名著之三国演义
点击上方"程序人生",选择"置顶公众号" 第一时间关注程序猿(媛)身边的故事 项目起因及意义 起初在浏览知乎时看见一篇文章觉得很有意思(用 Python 分析& ...
- python三国演义人物出场统计ppt_Python学习之四大名著人物出场次数Python代码-Go语言中文社区...
<三国演义>,<水浒传>,<西游记>的人物出场次数Python代码: 经过代码运行的结果可以看出三国作者对曹操和孔明比较喜爱:水浒作者对宋江和武松比较喜爱:西游作者 ...
- 《三国演义》之人物出场统计
版权声明:该文是博主个人的学习笔记,如有错误,恳请看官在评论区指出,在下不胜感激-如要转载注明出处即可- 人物出场设计对词汇的统计.中文文章需要分词才能进行词频统计,这需要用到jieba库. < ...
最新文章
- java类安卓app 简介_android.app.Activity 的介绍
- 查缺补漏 | Python控制结构
- Machine Learning | (8) Scikit-learn的分类器算法-随机森林(Random Forest)
- 10 款 VS Code 插件神器,第 7 款超级实用!
- 洛谷 T61816 代数式的最值
- Oracle包和包体以及与非包体定义函数、过程的区别
- 设计模式(九)--注册树模式
- Facebook 竟然把服务 27 亿人的 AI 硬件系统开源了?!
- Spring中利用java注解声明切面
- ganglia metric extended by gmetric command line tool
- 软工网络15团队作业4——Alpha阶段敏捷冲刺-3
- etf基金代码大全_再谈深得我心的指数基金:纳指ETF
- AUTOCAD——新建或修改尺寸样式
- ASP.NET Repeater控件使用方法
- 【UVA 1589 --- Xiangqi】
- 前端开发:报错Error in... ”SyntaxError:Unexpected token u in JSON at position 0”…解决方法
- agx上搭建ros2
- 人脸解锁手机与电影阿丽塔背后的3D原理:云从科技的技术突破
- iOS 开关-UISwitch
- 上传大文件解决方案方法