author:weizhendong

data:2019.12.19

func:绘制三国演义人物关系图

"""

import codecs

import jieba.posseg as pseg

import xlwt

def excel_write(names,workbook):

# 创建一个worksheet

worksheet = workbook.add_sheet('node')

worksheet.write(0, 0, label='ID')

worksheet.write(0, 1, label='Label')

worksheet.write(0, 2, label='Weight')

i=1

for name, times in names.items():

if times > 10:

worksheet.write(i, 0, label=str(name))

worksheet.write(i, 1, label=str(name))

worksheet.write(i, 2, label=str(times))

i = i+1

# 创建一个worksheet

worksheet1 = workbook.add_sheet('edge')

worksheet1.write(0, 0, label='Source')

worksheet1.write(0, 1, label='Target')

worksheet1.write(0, 2, label='Weight')

i=1

for name, edges in relationships.items():

for v, w in edges.items():

if w > 10:

worksheet1.write(i, 0, label=name)

worksheet1.write(i, 1, label=v)

worksheet1.write(i, 2, label=str(w))

i = i+1

workbook.save('People_node.xls')

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

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

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

excludes = {'将军', '却说', '令人', '赶来', '徐州', '不见', '下马', '喊声', '因此', '未知', '大败', '百姓', '大事', '一军', '之后', '接应', '起兵',

'成都', '原来', '江东', '正是', '忽然', '原来', '大叫', '上马', '天子', '一面', '太守', '不如', '忽报', '后人', '背后', '先主', '此人',

'城中', '然后', '大军', '何不', '先生', '何故', '夫人', '不如', '先锋', '二人', '不可', '如何', '荆州', '不能', '如此', '主公', '军士',

'商议', '引兵', '次日', '大喜', '魏兵', '军马', '于是', '东吴', '今日', '左右', '天下', '不敢', '陛下', '人马', '不知', '都督', '汉中',

'一人', '众将', '后主', '只见', '蜀兵','马军','黄巾','立功','白发','大吉','红旗','士卒','钱粮','于汉','郎舅', '龙凤', '古之', '白虎',

'古人云', '尔乃', '马飞报', '轩昂', '史官', '侍臣', '列阵','玉玺','车驾','老夫','伏兵','都尉','侍中','西凉','安民','张曰','文武','白旗',

'祖宗','寻思'}  # 排除的词汇

with codecs.open("111111.txt",'r',encoding='utf-8',errors='ignore') as f:

for line in f.readlines():

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

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

for w in poss:

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

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

elif w.word == '孔明' or w.word == '孔明曰' or w.word == '卧龙先生':

real_word = '诸葛亮'

elif w.word == '云长' or w.word == '关公曰' or w.word == '关公':

real_word = '关羽'

elif w.word == '玄德' or w.word == '玄德曰' or w.word == '玄德甚' or w.word == '玄德遂' or w.word == '玄德兵' or w.word == '玄德领' \

or w.word == '玄德同' or w.word == '刘豫州' or w.word == '刘玄德':

real_word = '刘备'

elif w.word == '孟德' or w.word == '丞相' or w.word == '曹贼' or w.word == '阿瞒' or w.word == '曹丞相' or w.word == '曹将军':

real_word = '曹操'

elif w.word == '高祖':

real_word = '刘邦'

elif w.word == '光武':

real_word = '刘秀'

elif w.word == '桓帝':

real_word = '刘志'

elif w.word == '灵帝':

real_word = '刘宏'

elif w.word == '公瑾':

real_word = '周瑜'

elif w.word == '伯符':

real_word = '孙策'

elif w.word == '吕奉先' or w.word == '布乃' or w.word == '布大怒' or w.word == '吕布之':

real_word = '吕布'

elif w.word == '赵子龙' or w.word == '子龙':

real_word = '赵云'

elif w.word == '卓大喜' or w.word == '卓大怒':

real_word = '董卓'

else:

real_word = w.word

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

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

names[real_word] = 0

relationships[real_word] = {}

names[real_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次以上则认为不是冗余

# 创建一个workbook 设置编码

workbook = xlwt.Workbook(encoding = 'utf-8')

# 数据存储

excel_write(names,workbook)

原文链接:https://blog.csdn.net/wei_zhen_dong/article/details/103586780

标签:real,elif,三国,python,worksheet,label,write,word,绘制

来源: https://www.cnblogs.com/benming/p/12072367.html

python关系图谱_python 绘制三国人物关系图相关推荐

  1. python人像绘制_python 绘制三国人物关系图

    author:weizhendong data:2019.12.19 func:绘制三国演义人物关系图 """ import codecs import jieba.po ...

  2. 使用Vue-neo4j绘制三国人物图谱关系

    前言 发现一个很有用的Vue插件:https://www.npmjs.com/package/vue-neo4j 这个能在前端直连neo4j服务器啦,下图就是测试效果绘制三国人物图谱关系 演示地址 版 ...

  3. 创新教育实例之“三国人物关系模型”

    最近与一位从事高校软件工程教育的同仁(挚友)聊天,谈到如何提高学生的创新性思维,两人不免大肆吐槽一番,有谈到过目前高校教育体制.学校的培养方案等等等等,但是这些东东无论是作为我们老师还是学生,只有微不 ...

  4. 【程序员股民系列】如何用python, pandas, numpy, matplotlib绘制每日个股成交额图

    上次分享了一段代码用于绘制每日行业交易额的图: [程序员股民系列]如何用python, pandas, numpy, matplotlib绘制每日行业成交额图 分析粒度略粗,只到行业这一层,把代码稍微 ...

  5. Python 三国演义文本可视化(词云,人物关系图,主要人物出场次数,章回字数)

    文章目录 效果展示 介绍 软件架构 使用说明 导入需要的库 执行main.py 这里以三国演义为例 三国演义.txt alice_mask.png 效果展示 介绍 Python读取小说文本,绘制词云图 ...

  6. 一、概述(知识图谱构建射雕人物关系)

    如何快速梳理<射雕三部曲>中的人物关系,或者查看哪些人会什么武功?通常的思路是通过原著和网络上的解读分析,将人物,武功,门派等信息提取出来,并构建一个模型存储,提问时通过查询这个模型来获得 ...

  7. 三、Cypher的使用(知识图谱构建射雕人物关系)

    本文主要介绍Cypher 查询语言,并对知识图谱进行增删查改操作. 目录 1. 概述 2. 数据类型 2.1数值,布尔,字符串 2.2 节点和关系 2.3 列表 3. 语法 3.1 匹配语句 3.2  ...

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

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

  9. 如何快速理清并绘制复杂人物关系图

    两个主要方法:分类法.代际法(两种方法经常会结合着使用),基本能够把每个故事里的复杂人物关系厘清. 01 分类法 简单来说,就是把相同阵营/家庭/组织的人物归类到一起.这么说可能还是有点抽象,下面以题 ...

最新文章

  1. 根据不同的操作系统读取配置文件/java读取属性文件代码
  2. Web安装项目创建桌面快捷方式
  3. 浙江省计算机网络技术比赛,[2018年最新整理]0509浙江省三级计算机网络技术历年真题(含答桉).doc...
  4. ELK日志系统的写入优化
  5. Codeforces 1005D Polycarp and Div 3
  6. 世界冠军之路:菜鸟车辆路径规划求解引擎研发历程
  7. 江苏高中计算机考试成绩查询系统,江苏2018普通高中信息技术学业水平测试成绩查询系统已开通...
  8. php ftp a站到b站,phpcmsv9在做推送中将a站文章内容完美的推送b站点下
  9. 微软 SQL Server 2016 迁移技术培训实验营
  10. RStudio 的使用
  11. 手机端输入键盘导致 position fixed
  12. Mac x 10.12.4 如何安装sshfs
  13. 什么是 Hash 冲突?如何解决 Hash 冲突?
  14. excel 多行 取消隐藏_如何在Excel 2013中隐藏和取消隐藏行和列
  15. 使用dns-over-https 手动测试域名解析
  16. Kotlin实战 | 语法糖,总有一颗甜到你(持续更新)
  17. 动态内存的分配与释放
  18. 计算机应用基础主要按键,计算机应用基础教案第一讲:键盘与鼠标(中职教育)...
  19. 计算机看不了pdf,电脑桌面变成pdf打不开怎么办
  20. (集成电路卡)ID卡

热门文章

  1. 提升认知能力 | 塑造大脑,重新认识你自己
  2. OC版本的Moya插件网络架构
  3. 2的负x次幂图像_函数y=2的x次方与y=x的2次方的图象的 – 手机爱问
  4. 深入探讨企业服务器虚拟化,部署服务器虚拟化的安全风险
  5. Axure RP9中继器的可做用途之一,类似于购物界面的展示
  6. 基于51单片机的贪吃蛇小程序(8*8LED点阵实现)by_jy
  7. Programming OpenGL in Linux: GLX and Xlib
  8. 滨州智能dcs系统推荐_几种主流DCS系统对比分析
  9. mysql jdbc关闭连接_【B站Java两分钟】JDBC数据库简单使用,封装连接,关闭
  10. Python之旅计算机基础篇