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:

或该词词性不为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)

,

。这种方法将产生很多的冗余边,这些冗余边将在最后处理。

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

# 创建一个workbook 设置编码

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

# 数据存储

excel_write(names,workbook)

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

python 绘制三国人物关系图的更多相关文章

  1. java+数据库+D3.js 实时查询人物关系图

    先看下 效果 某个用户,邀请了自己的朋友 ,自己的朋友邀请了其他朋友,1 展示邀请关系,2 点击头像显示邀请人和被邀请人的关系.(网上这种资料很少, 另外很多都是从JSON文件取 数据, 这里是从数据 ...

  2. 红楼梦人物关系图,一代大师成绝响,下回分解待何人,kindle读书摘要

      人物关系图: https://www.cnblogs.com/images/cnblogs_com/elesos/1120632/o_2033091006.jpg 红楼梦 (古典名著普及文库) ( ...

  3. 【 D3.js 高级系列 — 2.0 】 机械图 + 人物关系图

    机械图(力路线图)结合老百姓的关系图中的生活,这是更有趣. 本文将以此为证据,所列的如何图插入外部的图像和文字的力学. 在[第 9.2 章]中制作了一个最简单的力学图.其后有非常多朋友有疑问,基本的问 ...

  4. Python绘制wav文件音频图(静态)[matplotlib/wave]

    #!/usr/bin/env python # -*- coding: utf-8 -*- """ 绘制波形图 plottingWaveform.py "&qu ...

  5. react中使用echarts(人物关系图)

    项目中有时会用到echarts,可能不同的框架中语法稍有变通,前几天在react项目中遇到,写此篇以作记录. 不同的charts语法跟支持不同,本篇"echarts": " ...

  6. D3.js+Es6+webpack构建人物关系图(力导向图)

    功能列表:1. 增加下载SVG转PNG功能,图片尺寸超出可视区域也能够下载全部显示出来2. 增加图谱放大缩小平移功能3. 增加图谱初始化加载时自动缩放功能4. 增加导出excel功能,配合后台工具类达 ...

  7. D3.js+Es6+webpack构建人物关系图(力导向图),动态更新数据,点击增加节点,拖拽增加连线...

    觉得不错的麻烦加个Star:https://github.com/zhangzn3/D3-Es6 在线预览地址:https://zhangzn3.github.io/D3-Es6 功能列表:1. 增加 ...

  8. [wx]雪落香杉树人物关系图

    雪落香杉树 开始的时候场面比较宏大,出场的人比较多.加上外国人名字没辨识度,所以容易乱 被告人: 宫本天道 9 10 11 12月被关77天(谋杀罪,9.16日早谋杀卡尔.海因)--妻子:初枝 白色衬 ...

  9. python实例 三国人物出场次序 jieba库

    #Cal3kingdoms.py import jieba txt = open("threekingdoms.txt", "r", encoding=&quo ...

随机推荐

  1. Solr基本命令

    启动Solr 安装Solr后,进入到Solr主目录中的bin文件夹,并使用以下命令启动Solr. [Hadoop@localhost ~]$ cd [Hadoop@localhost ~]$ cd S ...

  2. 如何实现全屏遮罩(附Vue.extend和el-message源码学习)

    [Vue]如何实现全屏遮罩(附Vue.extend和el-message源码学习) 在做个人项目的时候需要做一个类似于电子相册浏览的控件,实现过程中首先要实现全局遮罩,结合自己的思路并阅读了(饿了么) ...

  3. PHP-操作json

    输出 json 文件中文处理 <?php $json_array = array(); // 1.转换为json字符串(不自动转换为unicode编码) if (version_compare( ...

  4. Java常用工具——java包装类

    一.包装类和基本数据类型 装箱:基本数据类型——包装类 拆箱:包装类——基本数据类型 package com.imooc.wrap; public class WrapTestOne { public ...

  5. [转]Hook executed successfully but returned HTTP 403

    原文地址:https://www.cnblogs.com/chenglc/p/11174530.html jenkins配置gitlab的webhook,完成配置,测试结果显示 Hook execut ...

  6. PHP防采集方法代码

    <?php /** * FileName:test.php * Summary: 防采集 */ $HTTP_REFERER = $_SERVER["HTTP_REFERER" ...

  7. HTML5移动应用——小心代码注入风险

    近日在加州举行的移动安全技术大会上,Syracuse大学的研究者的研究报告显示HTML5移动应用可能会给企业带来新的安全风险.开发者的错误可能导致HTML5应用自动执行攻击者通过Wifi蓝牙或短信发送 ...

  8. 模拟赛T5 : domino ——深搜+剪枝+位运算优化

    这道题涉及的知识点有点多... 所以还是比较有意思的. domino 描述 迈克生日那天收到一张 N*N 的表格(1 ≤ N ≤ 2000),每个格子里有一个非 负整数(整数范围 0~1000),迈克 ...

  9. JavaScript 高级程序设计(第3版)第二章 (在html中使用js)

    1.script元素的属性(6个):①async(异步脚本),只对外部脚本有效 ②defer(延迟脚本),只对外部脚本有效 ③charset,src(可跨域),type,language 2.尽可能使 ...

  10. JavaWeb防止用户的重复请求提交

    这里实现这个重复提交的防止,是通过在一个FIlter过滤器中生成一个令牌token,保存在Session域中,然后在对这个token加密得到ciphertext(密文),将密文保存在request域中 ...