嗨,大哥们,我来了!

《红楼梦》作为我国四大名著之一,古典小说的巅峰之作,粉丝量极其庞大,而红学也经久不衰。所以我们今天通过 Python 来捋一下红楼梦里那错综复杂的人物关系,话不多说,开始整活!

一、准备工作

  • 红楼梦txt格式电子书一份
  • 金陵十二钗+贾宝玉人物名称列表
宝玉 nr
黛玉 nr
宝钗 nr
湘云 nr
凤姐 nr
李纨 nr
元春 nr
迎春 nr
探春 nr
惜春 nr
妙玉 nr
巧姐 nr
秦氏 nr

该分列表是为了做分词时使用,后面的 nr 就是人名的意思。

二、人物出镜次数

首先读取小说

with open("红楼梦.txt", encoding="gb18030") as f:honglou = f.read()

接下来进行出场次数数据整理

honglou = honglou.replace("\n", " ")
honglou_new = honglou.split(" ")
renwu_list = ['宝玉', '黛玉', '宝钗', '湘云', '凤姐', '李纨', '元春', '迎春', '探春', '惜春', '妙玉', '巧姐', '秦氏']
renwu = pd.DataFrame(data=renwu_list, columns=['姓名'])
renwu['出现次数'] = renwu.apply(lambda x: len([k for k in honglou_new if x[u'姓名'] in k]), axis=1)
renwu.to_csv('renwu.csv', index=False, sep=',')
renwu.sort_values('出现次数', ascending=False, inplace=True)
attr = renwu['姓名'][0:12]
v1 = renwu['出现次数'][0:12]

这样我们就得到了 attr 和 v1 两个数据,内容如下


下面就可以通过 pyecharts 来绘制柱状图了

bar = (Bar().add_xaxis(attr.tolist()).add_yaxis("上镜次数", v1.tolist()).set_global_opts(title_opts=opts.TitleOpts(title="红楼梦上镜13人"))
)
bar.render_notebook()

三、人物关系

1、数据处理

我们先将读取到内存中的小说内容进行 jieba 分词处理

import jieba
jieba.load_userdict("renwu_forcut")
renwu_data = pd.read_csv("renwu_forcut", header=-1)
mylist = [k[0].split(" ")[0] for k in renwu_data.values.tolist()]

通过 load_userdict 将我们上面自定义的词典加载到了 jieba 库中

分词处理

tmpNames = []
names = {}
relationships = {}
for h in honglou:h.replace("贾妃", "元春")h.replace("李宫裁", "李纨")poss = pseg.cut(h)tmpNames.append([])for w in poss:if w.flag != 'nr' or len(w.word) != 2 or w.word not in mylist:continuetmpNames[-1].append(w.word)if names.get(w.word) is None:names[w.word] = 0relationships[w.word] = {}names[w.word] += 1

因为文中"贾妃", “元春”,“李宫裁”, “李纨” 等人物名字混用严重,所以这里做替换处理。

然后使用 jieba 库提供的 pseg 工具来做分词处理,会返回每个分词的词性。

之后做判断,只有符合要求且在我们提供的字典列表里的分词,才会保留。

一个人每出现一次,就会增加一,方便后面画关系图时,人物 node 大小的确定。

对于存在于我们自定义词典的人名,保存到一个临时变量当中 tmpNames

处理每个段落中的人物关系

for name in tmpNames:for name1 in name:for name2 in name:if name1 == name2:continueif relationships[name1].get(name2) is None:relationships[name1][name2] = 1else:relationships[name1][name2] += 1

对于出现在同一个段落中的人物,我们认为他们是关系紧密的,同时每出现一次,关系增加1 。

可以把相关信息保存到文件当中

with open("relationship.csv", "w", encoding='utf-8') as f:f.write("Source,Target,Weight\n")for name, edges in relationships.items():for v, w in edges.items():f.write(name + "," + v + "," + str(w) + "\n")
with open("NameNode.csv", "w", encoding='utf-8') as f:f.write("ID,Label,Weight\n")for name, times in names.items():f.write(name + "," + name + "," + str(times) + "\n")

文件1:人物关系表,包含首先出现的人物、之后出现的人物和一同出现次数。

文件2:人物比重表,包含该人物总体出现次数,出现次数越多,认为所占比重越大。

2、数据分析

下面我们可以做一些简单的人物关系分析

这里我们还是使用 pyecharts 绘制图表

def deal_graph():relationship_data = pd.read_csv('relationship.csv')namenode_data = pd.read_csv('NameNode.csv')relationship_data_list = relationship_data.values.tolist()namenode_data_list = namenode_data.values.tolist()nodes = []for node in namenode_data_list:if node[0] == "宝玉":node[2] = node[2]/3nodes.append({"name": node[0], "symbolSize": node[2]/30})links = []for link in relationship_data_list:links.append({"source": link[0], "target": link[1], "value": link[2]})g = (Graph().add("", nodes, links, repulsion=8000).set_global_opts(title_opts=opts.TitleOpts(title="红楼人物关系")))return g

首先把两个文件通过 pandas 读取到内存当中

对于“宝玉”,由于其占比过大,如果统一进行缩放,会导致其他人物的 node 过小,展示不美观,所以这里先做了一次缩放

最后我们得到的人物关系图如下


铁子们,今天的分享就到这, 如果感觉文章内容不错的话,记得关注+收藏让更多的人看到!

给大家分享一套视频,非常全面!

Python爬虫入门到实战100例

使用Python探索四大名著【红楼梦】人物之间的关系,简直帅呆了相关推荐

  1. Mark!用 Python 探索《红楼梦》的人物关系

    作者 | 周萝卜 来源 | Python 技术(ID: pythonall) 相信很多人都知道,<红楼梦>就是中国古典小说的巅峰之作,太多人沉迷其中,而红学也经久不衰.当然今天我们不是来探 ...

  2. 震惊!用Python探索《红楼梦》的人物关系!

    点击上方"菜学Python",选择"星标"公众号 超级无敌干货,第一时间送达!!! 大家好,我是菜鸟哥. 相信很多人都知道,<红楼梦>就是中国古典小 ...

  3. 用Python探索《红楼梦》的人物关系

    相信很多人都知道,<红楼梦>就是中国古典小说的巅峰之作,太多人沉迷其中,而红学也经久不衰.当然今天我们不是来探究小说的,而是通过 Python 来探索下红楼梦里那千丝万缕的人物关系 开干~ ...

  4. 看过来——用Python探索《红楼梦》的人物关系

    数据准备 红楼梦 txt 文件一份 金陵十二钗 + 贾宝玉 人物名称列表. 宝玉 nr 黛玉 nr 宝钗 nr 湘云 nr 凤姐 nr 李纨 nr 元春 nr 迎春 nr 探春 nr 惜春 nr 妙玉 ...

  5. python红楼梦人物统计_基于共现使用Python来分析《红楼梦》中贾宝玉与金陵十二钗的关系...

    上一篇,我们使用Python分析了<三国演义>中人物出现次数(罗贯中的<三国演义>中到底谁是主角?我们使用Python来分析一下),文中我们仅仅从人物出现次数,来推断出这部作品 ...

  6. python红楼梦人物统计_Python分析红楼梦,宝玉和十二钗的人物关系

    红楼梦出场人物很多,人物关系极其复杂,这次我们用Python来分析主人公贾宝玉和他的姐妹们,金陵十二钗之间的关系,做一个简要的分析. 出场率 由于我们只统计宝玉和十二钗(正册)这些人物,因此我们需要实 ...

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

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

  8. 红楼梦人物关系 python_如何用Python来理一理红楼梦里的那些关系

    前言 今天,一起用 Python 来理一理红楼梦里的那些关系 不要问我为啥是红楼梦,而不是水浒三国或西游,因为我也鉴定的认为,红楼才是无可争议的中国古典小说只巅峰,且不接受反驳!而红楼梦也是我多次反复 ...

  9. python统计红楼梦人物出场次数_《红楼梦》人数统计,人物,出场,次数

    这个也是学习过程中的一个成果吧,希望大家能批评指正. 红楼梦人物出场次数统计.亮点在于,考虑了人物的别称,以及有较为丰富的排除词库.如凤姐的称谓就有许多,凤辣子,凤姐,王熙凤等等,还有黛玉,有林黛玉, ...

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

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

最新文章

  1. Collections.addAll() 的使用 以及和list.addAll() 的区别
  2. 分形之闵可夫斯基(Minkowski)
  3. css/js压缩工具
  4. 案例研究设计与方法-罗伯_旭进口重新设计-用户体验案例研究
  5. 教你玩转CSS 轮廓(outline)属性
  6. java setquality_Java-在不损失质量的情况下调整图像大小
  7. ccd相机好修吗_CCD到底值不值得买,CCD相机入坑全过程
  8. C++ 结构体字节对齐
  9. 贪吃蛇程序设计报告python_C某贪吃蛇程序设计报告.doc
  10. SSD目标检测网络模型详细介绍
  11. linux-巴斯勒相机 GigE通信配置步骤
  12. 联想入选恒生指数成分股
  13. Vector CANoe修改Panel的名字
  14. 电子工程师必备的调试神器—H7-TOOL
  15. c语言编程 人造卫星的高度,C语言实验教学教案2008
  16. 同源策略 - 学习/实践
  17. AltiumDesigner覆铜挖空技巧总结
  18. 其实软件测试工程师也是程序员,很多人不知道
  19. 基于深度学习的全色图像锐化(Pansharpening)论文及代码整理
  20. 模块电路选型(5)----电机驱动模块

热门文章

  1. 【Emacs】之 Org-mode
  2. 【Canvas】JavaScript用Canvas制作美丽的对称图案
  3. Android 仿京东商品分类(简单实现 仅供参考)
  4. java8 joda_Joda Time和Java8时差
  5. Dev-cpp 配置新编译器
  6. Doxbox更改窗口大小
  7. 2022年全国职业院校技能大赛赛项正式赛卷
  8. 【机器学习算法】隐马尔可夫模型HMM(一)
  9. WinSCP(SFTP客户端) v5.13.3中文版
  10. 南方人和北方人的区别?如何区分南方人和北方人?