这篇博客提供能够输出小说人物关系的完整python代码。

代码的原作者是Qingyu Mao,十分感谢!!

以下是Mao的github链接和博客教程链接:
@source: https://github.com/maoqyhz/TextCharactervVisualization
@tutorial: https://www.cnblogs.com/Sinte-Beuve/p/7679392.html

获得小说中人物关系数据和对关系进行可视化的具体理论思路、操作方法、数据准备请参考Qingyu Mao的博客,ta已经讲得非常清楚详细了!

Mao的代码可能存在输出只有表头的空csv的问题,我对代码稍作修改后得到了正常输出。我也添加了两个简单的checkpoint,供有需要的朋友检查代码不能运行的原因。修正后的所有代码如下:

"""
Created on 2017/10/15 19:24
Modified on 2022/05/03 14:06
@author: Qingyu Mao
@source: https://github.com/maoqyhz/TextCharactervVisualization
@tutorial: https://www.cnblogs.com/Sinte-Beuve/p/7679392.html
@co-author: 农魔饼饼
"""import jieba
import codecs
from collections import Counter
from collections import defaultdict
from __future__ import print_functionTEXT_PATH = './Desktop/text.txt'  # 小说全文路径
DICT_PATH = './Desktop/dict.txt'  # 人物字典路径
SYNONYMOUS_DICT_PATH = './Desktop/synonymous_dict.txt'  # 同义词路径
SAVE_NODE_PATH = './Desktop/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 = {}class RelationshipView:def __init__(self, text_path, dict_path, synonymous_dict_path):self._text_path = text_pathself._dict_path = dict_pathself._synonymous_dict_path = synonymous_dict_path'''person_counter是一个计数器,用来统计人物出现的次数。{'a':1,'b':2}person_per_paragraph每段文字中出现的人物[['a','b'],[]]relationships保存的是人物间的关系。key为人物A,value为字典,包含人物B和权值。'''self._person_counter = defaultdict(int)self._person_per_paragraph = []self._relationships = {}self._synonymous_dict = {}def generate(self):self.count_person()self.calc_relationship()self.save_node_and_edge()def synonymous_names(self):'''获取同义名字典:return:'''with codecs.open(self._synonymous_dict_path, 'r', 'utf-8') as f:lines = f.read().split('\r\n')for l in lines:self._synonymous_dict[l.split(' ')[0]] = l.split(' ')[1]return self._synonymous_dictdef get_clean_paragraphs(self):'''以段为单位分割全文:return:'''with codecs.open(self._text_path, 'r', 'utf-8') as f:paragraphs = f.read().split('\r\n\r\n')print(paragraphs[1:10]) #这一句是checkpoint,如果没问题,run之后应该会输出分割好的前十段文本return paragraphsdef 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('\r\n')  # 获取干净的name_listprint(name_list[1:10]) #这一句是checkpoint,如果没问题,run之后应该会输出分割好的前十个人名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: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_counterdef 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._relationshipsdef 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!')if __name__ == '__main__':v = RelationshipView(TEXT_PATH, DICT_PATH, SYNONYMOUS_DICT_PATH)v.generate()

Python实现小说人物关系输出(完整+修正)相关推荐

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

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

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

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

  3. 【用matplotlib,wordcloud和pyecharts分析三国的分词,词频,词性,小说人物出场次数排序小说人物关系】

    前言 为了顺利完成作业,经过几天的网上查阅完成了[根据第1部分自然语言处理教学内容,请选择一本你喜欢的小说,利用上课讲的但不限于授课内容,对该小说进行分析.比如分析该小说的分词,词频,词性,小说人物出 ...

  4. 利用python语言分析小说的词频、词性、词云、小说人物出场次数排序以及小说人物关系

    1.需要准备的文件 bird.png:云底图片 sgyy.txt:三国演义原文 tingyong.txt:停用词文件 2.源代码 1.统计词频词性并写入文件中 # 贾高亮 # 时间:2023/3/21 ...

  5. python统计小说人物_Python数据分析之基情的择天记

    人一生都可能无法逆天改命,但你却是要去奋斗一把 本文章主要通过最简单的共线性关系,利用gephi工具绘制择天记的人物关系图. 准备工作在网上下载<择天记>小说以及创建小说人物的txt. j ...

  6. python 红楼梦 人物关系_用Python来理一理红楼梦里的这些关系

    原标题:用Python来理一理红楼梦里的这些关系 最近把红楼梦又抽空看了一遍,古典中的经典,我真无法用言辞赞美她.今天,想跟大家一起用 Python 来理一理红楼梦中的的那些关系 不要问我为啥是红楼梦 ...

  7. 社会网络分析(四) | 快速上手Gephi,绘制小说人物关系网络

    本次是社会网络分析专辑的第四篇文章,往期文章请查阅-- 社会网络分析(一) | python的Networkx库基础知识 社会网络分析(二) | 论文阅读:中国与国际媒体互引的社会网络分析 社会网络分 ...

  8. python代码电影人物关系_Python基于network模块制作电影人物关系图

    Python基于network模块制作电影人物关系图,节点,值为,模块,关系,算法 Python基于network模块制作电影人物关系图 易采站长站,站长之家为您整理了Python基于network模 ...

  9. NLP分析小说人物关系,找找主人公的真爱。

    思路 基于共现来挖掘人物之间的关系. 准备好三个存储器 names 存放的是人物出现次数,用来后面刻画节点的大小.names类似'叶三姐': 8, '马鞍': 6, relationships 存放人 ...

最新文章

  1. Tensorflow实现MNIST数据自编码(2)
  2. Android 软键盘的全面解析,让你不再怕控件被遮盖
  3. linux系统分析工具续-SystemTap和火焰图(Flame Graph)
  4. IE9 Preview 4的CSS3支持。
  5. python 统计单词个数---从文件读取版本---不去重
  6. mysql timestamp 默认值是什么#039;_MYSQL中TIMESTAMP类型的默认值
  7. panzer 电力项目十一--hibernate操作大文本字段Blob和Clob
  8. [Prism框架实用分享]如何在主程序中合理的弹出子窗体
  9. 关于浏览器的兼容性问题
  10. 2021-2027全球与中国创建和销售在线课程平台市场现状及未来发展趋势
  11. 电梯远程监控系统方案
  12. 初次软件开发(总结篇 之二)_-Chaz-_新浪博客
  13. 介绍ping中的TTL是什么意思
  14. Android push到/system/app下,导致找不到so文件,抛出java.lang.UnsatisfiedLinkError的原因分析和解决方案
  15. python中shelf对象_shelve -- 用来持久化任意的Python对象
  16. linux空间可用的iusered,从Linux小白到大牛——与狼共舞的日子7
  17. AI人工智能外呼机器人
  18. 使用python进行视频截取
  19. 原油CFD是什么?国内投资者如何交易原油CFD期货?
  20. 【迅为推荐】适合新手学习的arm开发板-iTOP-4412开发板

热门文章

  1. 试用炎黄盈动Sam业务流程梳理工具
  2. Generative Modeling by Estimating Gradients of the Data Distribution
  3. php微信分享文章怎么做的,微信开发使用 JSSDK 自定义分享内容 - 文章教程
  4. [置顶]第二弹:升级原创日语汉字转假名小工具1.02
  5. strcmp/strncmp
  6. python str和repr的区别_python中str和repr的区别是什么
  7. Unity3D入门学习——火箭小游戏
  8. Eclipse转idea教程超级无敌大全
  9. 永和高中2021年高考成绩查询,http://www.lfzkw.cn 2021永和中考成绩查询网站入口
  10. Linux 常见解决思路