用到的工具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 nr\r\n') # 获取干净的name_list

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

continue

if 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] += 1

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

continue

if self._relationships[name1].get(name2) is None:

self._relationships[name1][name2] = 1

else:

self._relationships[name1][name2] += 1

return 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,Weight\r\n")

for name, times in self._person_counter.items():

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

with codecs.open(SAVE_EDGE_PATH, "a+", "utf-8") as f:

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

for name, edges in self._relationships.items():

for v, w in edges.items():

if w > 3:

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

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 小说人物分析_用python分析小说人物关系(二)——实战篇相关推荐

  1. maya python教程下载_[转载]技术教程-MayaPython教程四之实战篇

    其实作为一个设置或者技术指导,学习到一定程度必须要接触编程,比如Mel.Python.C++ Api等程序语言,这些教程主要是转载胡泳滨的Maya Python学习教程,现在开始第一章-MayaPyt ...

  2. 用python进行营销分析_用python进行covid 19分析

    用python进行营销分析 Python is a highly powerful general purpose programming language which can be easily l ...

  3. anaconda中的python如何进行关联分析_浅析python,PyCharm,Anaconda三者之间的关系

    一.它们是什么? Python是一种跨平台的计算机程序设计语言,简单来说,python就是类似于C,Java,C++等,一种编程语言. 2.Anaconda Anaconda指的是一个开源的Pytho ...

  4. python做股票分析_利用Python进行股票投资组合分析(调试)

    pythonsp500-robo-advisor-edition Python for Financial Analyses 需要的镜像文件和数据--Robo Advisor edition. 小结 ...

  5. python枪战项目计划书_用python分析了20万场吃鸡数据

    首先,神枪镇楼 背景 最近老板爱上了吃鸡(手游:全军出击),经常拉着我们开黑,只能放弃午休的时间,陪老板在沙漠里奔波. 上周在在微信游戏频道看战绩的时候突发奇想,是不是可以通过这个方式抓取到很多战斗数 ...

  6. python与cad交互_与命令行进行交互_Python数据分析实战应用_数据挖掘与分析视频-51CTO学院...

    为什么学Python: 重要:数据分析是职业技能必备,Python是大数据分析** 趋势:Python是目前非常火的编程语言,使用人多 好学:学习简单,容易上手,使用灵活,可扩展强 **:会Pytho ...

  7. python微博评论情感分析_基于Python的微博情感分析系统设计

    2019 年第 6 期 信息与电脑 China Computer & Communication 软件开发与应用 基于 Python 的微博情感分析系统设计 王 欣 周文龙 (武汉工程大学邮电 ...

  8. python日本 老龄化分析_基于Python关于世界自杀率影响因素的分析以及机器学习预测...

    基于Python关于世界自杀率影响因素的分析以及机器学习 预测 文/刘子桦 马若炎 [摘 要]摘 要 [期刊名称]<电子技术与软件工程> [年(卷),期]2019(000)017 [总页数 ...

  9. python微博文本分析_基于Python的微博情感分析系统设计

    基于 Python 的微博情感分析系统设计 王欣 ; 周文龙 [期刊名称] < <信息与电脑> > [年 ( 卷 ), 期] 2019(000)006 [摘要] 微博是当今公众 ...

最新文章

  1. 状态管理框架开发不完全指南
  2. hdu 1298 字典树 + DFS (模拟T9文本输入)
  3. /etc/fstab 文件配置项简单介绍
  4. 如果程序员想从事网络营虚拟光驱
  5. Windows Server_2008下搭建个人下载服务器(FTP)
  6. 组件的data属性 (有别于Vue实例的data属性)
  7. iphone7无服务_iPhone 7 系列被召回?设计缺陷...
  8. insert rows into heap/clustered table
  9. js日期格式化的两种方法
  10. 电脑没安装游戏使用Excel时如何将隐藏的赛车游戏调出来
  11. 个人八股文集合一、C/C++语言
  12. 微信小程序笔记 -- 数据库
  13. 金融资产收益率计算中百分比收益率和对数收益率有什么区别?
  14. Python 缩写月份单词
  15. 树莓派之火焰传感器模块
  16. 算法总结——大整数加法
  17. 数字图像处理论文解读- 双边滤波效果 - Bilateral Filtering for Gray and Color Image
  18. linux jenkins部署脚本,使用Jenkins 自动部署发布
  19. Java Web项目中HTML文件中的汉字在浏览器中显示乱码的解决方案
  20. 个人春招记录贴,从年初的简历海投到现在的美团offer,我想告诉你的是这些......

热门文章

  1. Ivar Jacobson 先生简介
  2. 定时器(setTimeout()和setInterval())的清除问题
  3. 如何在Total Commander中使用命令行
  4. OCA,OCP,OCM傻傻分不清?
  5. 几种主流快速开发平台选择
  6. SQL SERVER 2000 企业管理器免安装方法
  7. php生成二维码图片
  8. 怎么将CAD图纸转换成高清晰度PNG格式怎么操作?
  9. 聊一聊Java中的悲观锁和乐观锁
  10. 公网IP TCP服务器调试