红楼梦人物分析系统c语言,Gephi分析红楼梦

前言

上一周赶了好久的社会网络计算,貌似是第四周还是第五周的时候,那时候我们就把题目定下来了吧,然后一直拖着没有做。其中的原因多种多样 ,其实也可以说没有什么原因,就是不想做而已,然后就假装忘记23333.

不过,因为我的机智,最后还是把红楼梦的人物关系网络图给画出来了。其中的好多东西害怕忘记了,所以写一下记录一下。

# -*- conding: utf-8 -*-

import codecs

import jieba.posseg as pseg

import jieba

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

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

# 代表两个人物之间联系的紧密程度

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

names = {}

relationships = {}

lineNames = []

jieba.load_userdict("RoleTable.txt")

with codecs.open("人民的名义.txt", 'rb', 'utf8') as f:

for line in f.readlines(): # 注意是 readlines 要加s 不加s 只读取一行

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

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

for w in poss:

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

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

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

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

names[w.word] = 0

relationships[w.word] = {}

names[w.word] += 1

# # 输出人物出现次数统计结果

for name, times in names.items():

print(name, times)

# print(lineNames[-1]);

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

with codecs.open("People_node.txt", "w", "utf8") as f:

f.write("ID Label Weight\r\n")

for name, times in names.items():

if times > 10:

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

#

with codecs.open("People_edge.txt", "w", "utf8") as f:

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

for name, edges in relationships.items():

for v, w in edges.items():

if w > 10:

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

#

#

以上就是原来博客的代码了。(虽然我还有好多东西都没看懂)

这个时候会生成两个txt文件,一个是人物权重的,一个是人物边之间的关系的。

用excel加载数据,然后另存为csv文件格式(这里要注意的是,csv文件生成之后,不能在里面修改,不然就....会导致一个很意外的bug)

效果其实还是很不错的(所以我特意打开gephi重新画了一下)

(

6b1ba9f78b77?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

人物关系.png

分割线,上次写完之后没有及时更新,接着写

其实我既然可以画出人民的名义的社会网络图,那么,红楼梦的网络图也就会比较简单了。

原理依然是jieba分词,不过这次打开的是红楼梦的文本文件,然后人物字典是我从网上找的。

这里在写代码的时候遇到了很多问题,虽然大部分代码可以复用(其实大部分代码我都没看懂)为此还特意了解了一下jieba这个包是如何用的

# -*- conding: utf-8 -*-

import codecs

import jieba.posseg as pseg

import jieba

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

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

# 代表两个人物之间联系的紧密程度

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

names = {}

relationships = {}

lineNames = []

dict = {}

with codecs.open("RoleTable.txt", "rb", "utf8") as f:

#怎么把f的内容加入到一个字典中

#dict[] =

for line in f.readlines():

#print(line)

Word = ""

for word in line:

if word == ",":

break

else:

Word = Word+word

Word = Word[:]

dict[Word] = "nr"

# jieba.load_userdict("RoleTable.txt")

# with codecs.open("11.txt", 'rb', 'utf8') as f:

# for line in f.readlines(): # 注意是 readlines 要加s 不加s 只读取一行

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

#

# for word, flag in poss:

# print((word, flag))

jieba.load_userdict("RoleTable.txt")

jieba.suggest_freq("宝钗", True)

with codecs.open("StoneStory.txt", 'rb', 'utf8') as f:

for line in f.readlines(): # 注意是 readlines 要加s 不加s 只读取一行

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

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

for w in poss:

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

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

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

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

names[w.word] = 0

relationships[w.word] = {}

names[w.word] += 1

# # # 输出人物出现次数统计结果

# for name, times in names.items():

# print(name, times)

# print(lineNames[-1])

#if dict.has_key(key)为假,就可以直接在列表中删除这个元素

# for word, flag in poss:

# print(word, flag)

temp = []

#下面这段代码经过了数次的修改,主要问题集中在如果你修改了line这个列表,它是会实时更新的

#所以你下一次循环就会出问题,这个问题在C语言里面还是很难碰到的

#但是在python这种弱类型的语言里面,要像C语言那样写

i = 0

for line in lineNames:

temp = []

for name in line:

if name in dict.keys():

temp.append(name)

line = temp

print(line)

lineNames[i] = line

i = i+1

for line in lineNames:

print(line)

#要想办法过滤掉一些词语

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

with codecs.open("My_People_node.txt", "w", "utf8") as f:

f.write("ID Label Weight\r\n")

for name, times in names.items():

if times > 10:

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

#

with codecs.open("My_People_edge.txt", "w", "utf8") as f:

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

for name, edges in relationships.items():

for v, w in edges.items():

if w > 10:

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

#

老规矩还是放一波代码

其中有一部分过滤的代码是我自己加上去的

dict = {}

with codecs.open("RoleTable.txt", "rb", "utf8") as f:

#怎么把f的内容加入到一个字典中

#dict[] =

for line in f.readlines():

#print(line)

Word = ""

for word in line:

if word == ",":

break

else:

Word = Word+word

Word = Word[:]

dict[Word] = "nr"

写完这段代码,给我最大的启示就是,python很强大,但是写起来好痛苦。

代码详解:

我基本的思路就是想把人物角色那个文件打开之后,用dict数据结构把它给存起来。

首先是打开文件,调用f对象的readlines方法,对于读到的每一行,再做一次循环,对于行中的每一个字符,拼接起来(这个字符串的处理好麻烦,不过好像我只想到了这个办法)

Word = Word[:]

妈耶,这段代码我现在自己看不懂了23333

还有一段过滤的代码

temp = []

#下面这段代码经过了数次的修改,主要问题集中在如果你修改了line这个列表,它是会实时更新的

#所以你下一次循环就会出问题,这个问题在C语言里面还是很难碰到的

#但是在python这种弱类型的语言里面,要像C语言那样写

i = 0

for line in lineNames:

temp = []

for name in line:

if name in dict.keys():

temp.append(name)

line = temp

print(line)

lineNames[i] = line

i = i+1

for line in lineNames:

print(line)

写完这段代码我都快自闭了,注释我已经写上去了

之后的步骤其实差不多,但是由于jieba分词在某些地方不是特别准确,加上古文里面,一个人有多个称呼,所以最后经过了漫长的excel筛选和剔除重复的,合并相同的过程,才得到了红楼梦的人物关系网络

这里有一个问题强调一下

csv格式的文件最好不要乱动,尤其是不要用excel打开之后进行操作,因为这样操作之后,你再打开就会发现,原来不在同一个单元格里面的文字,全部挤到一起去了。

所以最好用xlsx后缀打开,之后再另存为csv文件格式

来放一张图

6b1ba9f78b77?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

红楼梦人物关系网.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/364459.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

二、MyBatis-HelloWorld

环境准备 1.创建数据库表 create table tbl_employee (id int(11) primary key AUTO_INCREMENT comment "ID",last_name varchar(20) default null comment "姓名",email varchar(20) default null comment "邮件",gender varchar(1) default nu…

洪水同频率放大的方法_我们应该怎么选择放大器配件?

在市面上&#xff0c;手机信号放大器高达百种型号与品牌&#xff0c;每种手机信号放大器所需的配件也不相同&#xff0c;我们需要选择合适的配件&#xff0c;才能让手机信号放大器更稳定的运行。下面佛山红岸谷通讯教大家怎么选适合自己的手机信号放大器配件。主要有以下几点。…

斑能不能彻底去掉_用茶树精油祛痘时,千万不能做这5件事!!!

祛痘注意事项~用茶树精油祛痘时&#xff0c;千万不能做这5件事&#xff01;&#xff01;&#xff01;长痘痘虽然是令人很头疼的事&#xff0c;但是茶树精油祛痘、去痘印功效可谓是无敌的&#xff01;茶树精油是自然界中的抗菌大师&#xff0c;能净化皮肤、平衡皮肤油脂分泌&…

JAX-RS 2.0:自定义内容处理

我试图想到一个更好的标题&#xff0c;但未能拿出一个&#xff01; 请多多包涵……。 JAX-RS 2.0规范允许我们无缝地将JAXB对象编组到HTTP请求/响应主体/从HTTP请求/响应主体中解组。 简而言之&#xff0c;我们可以使用域对象&#xff0c;而不必担心基于JAX-RS的解决方案中的低…

Waymo在美国推出自动驾驶汽车共享服务

导读经过数月的测试和数百万英里的无人驾驶汽车技术开发&#xff0c;Waymo 正式在美国推出了具有商业性质的自动驾驶汽车的共享服务。该公司的 Waymo One 项目将为客户提供 24 小时自动驾驶汽车服务。最初&#xff0c;这项服务将仅限于菲尼克斯周边城市&#xff0c;包括坦佩 (T…

2019春第一次课程设计实验报告

一、实验项目名称&#xff1a; 飞机游戏简化的编写 二、实验项目功能描述&#xff1a; 这个实验主要是实现游戏的正常运行&#xff0c;实现控制飞机的移动功能&#xff0c;增加其实用度&#xff0c; 同时还实现发射子弹和出现敌机的操作&#xff0c;利用函数封装重构飞机游戏&a…

区别和联系_动机与主题的区别与联系

今天我算是彻底弄明白了动机与主题的区别与联系&#xff08;暴论&#xff09;。当前些天我开始尝试写简单的奏鸣曲时&#xff0c;主题是什么&#xff0c;这个问题卡住了我&#xff0c;因为之前写的练习曲都是基于简单动机的。所以我求助于维基百科。主题是什么&#xff1f;参考…

巴顿又吃回头草

巴顿是一名好车手&#xff0c;一个会给shumi以及kimi造成威胁的家伙&#xff0c;我并不在意他在哪个车队&#xff0c;只希望他跑得比kimi慢才好。from新浪&#xff1a;宛如平地一声雷&#xff0c;巴顿重返威廉姆斯的消息不仅让车迷感到错愕&#xff0c;英美车队的老板理查兹更是…

尝试将WCF映射到Java术语

通过写这篇文章&#xff0c;我冒着被.NET和Java社区拒绝的巨大风险。 试图解释Java术语WCF &#xff08;代表Windows Communication Foundation&#xff09;是什么。 从WCF到Java的映射并不是很简单。 我缺乏对WFC使用者应该了解的与服务通信类型的了解&#xff1a;请求/响应或…

android fragment界面滑动切换效果,Android App中使用ViewPager+Fragment实现滑动切换效果...

在android应用中&#xff0c;多屏滑动是一种很常见的风格&#xff0c;没有采用viewpager的代码实现会很长&#xff0c;如果采用ViewPager&#xff0c;代码就会短很多&#xff0c;但是使用ViewPager也有弊端&#xff1a;需要导入android-support-v4.jar、细节无法控制。不过现在…

相对路径./与../区别

一、基本概念 1、相对路径-顾名思义&#xff0c;相对路径就是相对于当前文件的路径。网页中一般表示路径使用这个方法。 2、绝对路径-绝对路径就是你的主页上的文件或目录在硬盘上真正的路径。绝对路径就是你的主页上的文件或目录在硬盘上真正的路径&#xff0c;比如&#xff0…

shouji android输入法,安卓手机主流输入法对比

什么是合格的输入法&#xff1f;1. 按键布局合理2. 词库丰富且云识别准确3. 文字编辑4. 符号快捷输入5. 翻译功能6. 语音识别转文字对比五款主流输入法&#xff1a;触宝、百度、搜狗、讯飞、QQ均为默认皮肤和设置。1. 按键布局从哪进从哪出&#xff0c;这应该是一个输入法最基本…

DS博客作业06--图

1.本周学习总结 1.思维导图 2.谈谈你对图结构的认识及学习体会。 原本以为树已经够难的了&#xff0c;结果发现觉得太早了。图好难&#xff0c;看不懂。图是由两个集合V和E组成&#xff0c;V指的是顶点的有限集合&#xff0c;E代表两个不同顶点的边的有限集合&#xff0c;图也分…

c 给定字符串中查找_面试 | 查找类算法精析

点击上方蓝字设为星标每周一、三、五上午 8:30 准时推送下面开始今天的学习&#xff5e;前言查找&#xff0c;是使用计算机处理问题时的一个最基本的任务&#xff0c;因此也是算法面试中非常常见的一类问题。很多算法问题的本质&#xff0c;就是要能够高效使用查找。LeetCode 中…

LInux安装MySQL5.7.24详情

安装包下载 MySQL 的官网下载地址&#xff1a;http://www.mysql.com/downloads/ 我安装的是5.7版本 第二步&#xff1a; 选择&#xff1a;TAR (mysql-5.7.24-el7-x86_64.tar) 点击下载 然后点击 No thanks, just start my download. 进行下载。 检查是否安装过mysql [rootmas…

正确设置JUnit测试名称

寻找好名字是手工软件的挑战之一。 您需要随时随地找到它们-类&#xff0c;方法&#xff0c;变量&#xff0c;仅举几例。 但是&#xff0c;什么使名字成为好名字呢&#xff1f; 引用Oncle Bob的话&#xff1a;“三件事&#xff1a;可读性&#xff0c;可读性和可读性&#xff01…

html5储存类型特点,避免踩雷!你不得不知的 HTML5 “新”特性

什么是 HTML5HTML的发展历程如下&#xff1a;产生于1990年1997年 HTML4 出现&#xff0c;成为互联网开发的标准2008年&#xff0c;HTML5正式出现&#xff0c;2002年趋于稳定HTML在发展过程中&#xff0c;HTML4.01 版本维持了长达十年的时间&#xff0c;之后 HTML5 标准才出现&a…

How to show out three rows from the same databand On A4?

How to show out three rows from the same databand On A4? QuotePost by DoraHuang Tue Mar 13, 2018 4:13 am Hello, there are few questions to ask,1. How to present a report from one DataBand to show out three info?My questions like the picture:it is A4 pag…

rds基于什么开发_IaaS、PaaS、SaaS、DaaS都是什么?现在怎么样了?终于有人讲明白了...

导读&#xff1a;本文将详细科普云计算的概念、云服务的发展现状&#xff0c;并逐一介绍各种云服务模式&#xff08;IaaS、PaaS、SaaS、DaaS&#xff09;&#xff0c;建议收藏&#xff01;01 云计算的概念云是一种服务&#xff0c;可以像使用水、电、煤那样按需使用、灵活付费&…

[转]css实现左侧宽度自适应,右侧固定宽度

原文地址:https://segmentfault.com/a/1190000008411418 页面布局中经常用会遇到左侧宽度自适应&#xff0c;右侧固定宽度&#xff0c;或者左侧宽度固定&#xff0c;右侧自适应。总之就是一边固定宽度&#xff0c;一边自适应宽度。 一般固定宽度是导航栏&#xff0c;自适应宽度…