相信很多人都知道,《红楼梦》就是中国古典小说的巅峰之作,太多人沉迷其中,而红学也经久不衰。当然今天我们不是来探究小说的,而是通过 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()

人物关系

数据处理

我们先将读取到内存中的小说内容进行 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:人物比重表,包含该人物总体出现次数,出现次数越多,认为所占比重越大

数据分析

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

这里我们还是使用 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编程学习圈,每日干货分享,发送“J”还可领取大量学习资料,内容覆盖Python电子书、教程、数据库编程、Django,爬虫,云计算等等。或是前往编程学习网,了解更多编程技术知识。

用Python探索《红楼梦》的人物关系相关推荐

  1. python 知识图谱 红楼_毕业设计:基于知识图谱的《红楼梦》人物关系可视化(运行篇)...

    知识图谱是个非常有趣的方向,在公司业务应用方面也非常广泛.比如对搜索推荐的优化,让推荐的内容更加丰富,甚至给用户以意外之喜.比如在智能问答方面,避免多轮对话,从用户的一个简单的问句,给用户丰富的答案, ...

  2. 【知识图谱】实践篇——基于知识图谱的《红楼梦》人物关系可视化及问答系统实践:part6基于图谱的问答实现

    前序文章: [知识图谱]实践篇--基于知识图谱的<红楼梦>人物关系可视化及问答系统实践:part1项目介绍与环境准备 [知识图谱]实践篇--基于知识图谱的<红楼梦>人物关系可视 ...

  3. 【知识图谱】实践篇——基于知识图谱的《红楼梦》人物关系可视化及问答系统实践:part7项目优化与打包

    前序文章: [知识图谱]实践篇--基于知识图谱的<红楼梦>人物关系可视化及问答系统实践:part1项目介绍与环境准备 [知识图谱]实践篇--基于知识图谱的<红楼梦>人物关系可视 ...

  4. 思维导图解析——《红楼梦》人物关系

    <红楼梦>,中国古达四大名著之首,清代作家曹雪芹创作的章回体长篇小说.举世公认的中国古典小说巅峰之作,中国封建社会的百科全书,传统文化的集大成者. <红楼梦>是一部具有世界影响 ...

  5. 基于pyecharts的《红楼梦》人物关系可视化

    <红楼梦>人物关系可视化 <红楼梦>是我国四大名著之一,也是高中生必读书目之一.同学们在阅读红楼梦的时候,是否有以下困惑?人物太多?人物关系太复杂? 我们今天尝试着用信息技术中 ...

  6. 【知识图谱】实践篇——基于知识图谱的《红楼梦》人物关系可视化及问答系统实践:part4检索人物关系实现

    前序文章: [知识图谱]实践篇--基于知识图谱的<红楼梦>人物关系可视化及问答系统实践:part1项目介绍与环境准备 [知识图谱]实践篇--基于知识图谱的<红楼梦>人物关系可视 ...

  7. 【知识图谱】实践篇——基于知识图谱的《红楼梦》人物关系可视化及问答系统实践:part2知识获取与图谱构建、服务搭建

    前序文章: [知识图谱]实践篇--基于知识图谱的<红楼梦>人物关系可视化及问答系统实践:part1项目介绍与环境准备 知识获取与图谱构建 其中原项目提供了关系数据如下: 其中五列数据表示: ...

  8. 《红楼梦》人物关系有多复杂?一张图帮你理清楚!

    <红楼梦>可以说是四大名著中最晦涩难懂的一部作品了,但这也成就了它"中国古典小说巅峰之作"的美誉,可以说是中国封建社会的百科全书.此外,<红楼梦>小说也衍生 ...

  9. python《红楼梦》人物统计

    编写程序统计<红楼梦>中前20位出场最多的人物. # a6.6CalRedChamber import jiebajieba.add_word("二姑娘") jieba ...

  10. 基于知识图谱的《红楼梦》人物关系可视化及问答系统的实现

    源码:https://github.com/chizhu/KGQA_HLM 在实现这个问答系统的过程中,遇到了很多坑,在这里分享下自己的经验. 以下是github中给出的步骤. 0.安装所需的库 执行 ...

最新文章

  1. SQL SERVER 2000写存储过程出现列名无效的解决方法
  2. 使用docker-compose进行多节点部署
  3. Linux系统备份树莓派,全平台备份树莓派的方法
  4. AAAI第二届“AI诺奖”出炉,百万美元奖金颁给批判黑箱、推广可解释AI的杜克大学女教授...
  5. 用python画皮卡丘源代码-实现童年宝可梦,教你用Python画一只属于自己的皮卡丘...
  6. 大数据算法:排位问题(2)
  7. spring核心功能包中已经包含了cglib功能
  8. Angular Component input字段传递值的几种变式 variant
  9. springboot 实现机器学习_SpringBoot架构浅谈
  10. 别把机器学习和人工智能搞混了! 1
  11. RS报表从按月图表追溯到按日报表
  12. thinkPHP 表单自动验证功能
  13. webpack-dev-server是什么
  14. 互联网络彻底瘫痪的可能性研究
  15. openwrtx86安装docker_群晖Docker安装openwrt简易流程
  16. Excel:某一列前面统一加上相同的内容
  17. 设定PCB的区域(AD18)
  18. SQL Server辅助插件——SQL Prompt
  19. BI Publisher rtf模板页眉页脚
  20. JDK1.6的ConcurrentHashMap

热门文章

  1. CNC加工中心操作经验汇集,这次总结全了!
  2. SpringBoot项目打包成war包并部署到服务器上
  3. 测试常用Linux命令
  4. vsocde 乱码的解决方法和原理
  5. 【原创】JavaScript幻灯片小实例及教程(JsBox v1.2)
  6. 腾讯云网站备案咨询:网站命名基本要求
  7. 随机生成中文姓名c++
  8. 2023和鲸夏令营创作活动【黄金价格分析预测】
  9. 嵌入式Linux驱动开发 02:将驱动程序添加到内核中
  10. iPhone 12怎么用5G网络