红楼梦人物分析系统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;才能让手机信号放大器更稳定的运行。下面佛山红岸谷通讯教大家怎么选适合自己的手机信号放大器配件。主要有以下几点。…

Java代码风格:最终决定

所谓的最不起眼的事情如何导致争议性的讨论&#xff0c;有时甚至导致激烈的辩论激烈&#xff0c;这不是很有趣吗&#xff1f; 例如&#xff0c;我目睹了几次场合&#xff0c;如何使用关键字final引发了非常激烈的争论。 对于一个外部观察者来说&#xff0c;这看起来似乎是对邪恶…

有感软件安装称呼的变化

上学的时候&#xff0c;揣着一盒磁盘到处跑“拷贝”新软件&#xff08;现在我还有几张5寸低密和高密盘作纪念&#xff09;。这盒磁盘也成了我的工具箱&#xff0c;用的时候拷上&#xff0c;不用的时候“删除”&#xff0c;COPY、DEL以及DELTREE是我经常用到的命令。从来不用担心…

手机端调试console.log,直接引入一个js文件

http://files.cnblogs.com/files/lwwen/mConsole.js 这是我写的一个原生js文件 直接引入即可&#xff0c;可以把html上面的需要打印的东西打印出来 <!DOCTYPE html> <html> <head><meta charset"UTF-8"><meta name"Viewport"…

独木舟贪心算法c语言,算法:(贪心算法)-独木舟问题

独木舟上的旅行Description进行一次独木舟的旅行活动&#xff0c;独木舟可以在港口租到&#xff0c;并且之间没有区别。一条独木舟最多只能乘坐两个人&#xff0c;且乘客的总重量不能超过独木舟的最大承载量。我们要尽量减少这次活动中的花销&#xff0c;所以要找出可以安置所有…

2019.01.01 bzoj3625:小朋友和二叉树(生成函数+多项式求逆+多项式开方)

传送门codeforces传送门codeforces传送门codeforces传送门 生成函数好题。 卡场差评至今未过 题意简述&#xff1a;nnn个点的二叉树&#xff0c;每个点的权值KaTeX parse error: Expected EOF, got \inC at position 4: v_i\̲i̲n̲C̲\{a_1,a_2,...a…&#xff0c;定义一棵树…

Python 全局变量

报错信息&#xff1a;UnboundLocalError: local variable referenced before assignment 在函数内部修改全局变量时报错。 因为&#xff1a;在python里&#xff0c;如果在函数内部试图去修改一个全局变量&#xff0c;那么实际上的操作是 Python会创建一个新的名字一模一样的局部…

斑能不能彻底去掉_用茶树精油祛痘时,千万不能做这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的解决方案中的低…

这个夏天,感动我的歌,感动我的你

七里香 词&#xff1a;方文山 曲&#xff1a;周杰伦 JAY 窗外的麻雀 在电线杆上多嘴你说这一句 很有夏天的感觉手中的铅笔 在纸上来来回回我用几行字形容你是我的谁 秋刀鱼的滋味 猫跟你都想了解初恋的香味就这样被我们寻回那温暖的阳光 像刚摘的鲜艳草莓你说你…

构造函数模式

function student(props){this.nameprops.name || 匿名;//默认是匿名this.gradeprops.grade || 1;}student.prototype.hellofunction(){console.log(hello this.name);}function createStudent(props){return new student(props||{})}var xiaomingcreateStudent({name:xiaomin…

android 获取应用内存大小,如何在Android中获取当前内存使用量?

这取决于您要获得的内存查询的定义。通常&#xff0c;您想知道堆内存的状态&#xff0c;因为如果它占用了太多内存&#xff0c;您就会得到OOM并使应用程序崩溃。为此&#xff0c;您可以检查下一个值&#xff1a;final Runtime runtime Runtime.getRuntime();final long usedMe…

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

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

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

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

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

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

Java 8中的新BigInteger方法

对JDK 8中的新功能的关注理所当然地主要集中在新的语言功能和语法上。 但是&#xff0c;对库和API进行了一些不错的添加&#xff0c;在本文中&#xff0c;我介绍了BigInteger类中添加的四个新方法&#xff1a; longValueExact&#xff08;&#xff09; &#xff0c; intValueEx…

巴顿又吃回头草

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

打印发现function toUpperCase() { [native code] }

var shello undefined s.toUpperCase function toUpperCase() { [native code] } s.toUpperCase() "HELLO" 咦 然后我就发现了 要是这本来是一个方法 然后你没有用一个方法的方式去调用&#xff0c;就会出现function toUpperCase() { [native code] } 类似于这一句 …

android 静态方法 构造方法,android基础-Java篇02:类和对象、构造方法、访问权限控制、重载、this关键字、static关键字...

一、类和构造方法(类和对象在百度百科已经有详细的介绍&#xff0c;这里只做简单的描述以及帮助理解&#xff1b;百度百科&#xff1a;类和对象&#xff0c;需要注意的是&#xff0c;百度百科类和对象的举例中都是C&#xff0c;书写格式不要和Java混淆&#xff01;)什么是类&am…