点击上方“菜学Python”,选择“星标”公众号

超级无敌干货,第一时间送达!!!

大家好,我是菜鸟哥。

相信很多人都知道,《红楼梦》就是中国古典小说的巅峰之作,太多人沉迷其中,而红学也经久不衰。当然今天我们不是来探究小说的,而是通过 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的问题  | 零基础学了8个月的Python  | 实战项目 |学Python就是这条捷径
干货:爬取豆瓣短评,电影《后来的我们》 | 38年NBA最佳球员分析 |   从万众期待到口碑扑街!唐探3令人失望  | 笑看新倚天屠龙记 | 灯谜答题王 |用Python做个海量小姐姐素描图 |碟中谍这么火,我用机器学习做个迷你推荐系统电影
趣味:弹球游戏  | 九宫格  | 漂亮的花 | 两百行Python《天天酷跑》游戏!
AI: 会做诗的机器人 | 给图片上色 | 预测收入 | 碟中谍这么火,我用机器学习做个迷你推荐系统电影
小工具: Pdf转Word,轻松搞定表格和水印! | 一键把html网页保存为pdf!|  再见PDF提取收费! | 用90行代码打造最强PDF转换器,word、PPT、excel、markdown、html一键转换 | 制作一款钉钉低价机票提示器! |60行代码做了一个语音壁纸切换器天天看小姐姐!|

年度爆款文案

  • 1).卧槽!Pdf转Word用Python轻松搞定!

  • 2).学Python真香!我用100行代码做了个网站,帮人PS旅行图片,赚个鸡腿吃

  • 3).首播过亿,火爆全网,我分析了《乘风破浪的姐姐》,发现了这些秘密

  • 4).80行代码!用Python做一个哆来A梦分身

  • 5).你必须掌握的20个python代码,短小精悍,用处无穷

  • 6).30个Python奇淫技巧集

  • 7).我总结的80页《菜鸟学Python精选干货.pdf》,都是干货

  • 8).再见Python!我要学Go了!2500字深度分析!

  • 9).发现一个舔狗福利!这个Python爬虫神器太爽了,自动下载妹子图片

点阅读原文,看B站我的视频!

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

最新文章

  1. 各小组对于自己产品的预期“软件下载/用户人数”
  2. 全链路压测自动化实践
  3. 问题记录:如何比较两个字符串的相似度
  4. js时间搓化为今天明天_秋冬国产搓背神器!360°无死角,让你搓背不求人,太舒服了...
  5. linux登录指令 pgsql_命令行方式登录PostgreSQL
  6. Fiddler抓包工具版面认识(一)
  7. 印象笔记 还回快捷_搭配这9款实用的第三方工具,小白也可以玩转印象笔记
  8. Charles抓包微信小程序数据
  9. DFS POJ 1321 棋盘问题
  10. 手把手教你用Execel计算两个矩阵的乘法
  11. python数学公式编辑工具_也许是目前最好的数学公式编辑神器——Mathpix Snipping Tool...
  12. 悉尼大学计算机一年制硕士,悉尼大学一年制硕士
  13. react native使用echarts图表
  14. canva画图 图片居中裁剪_html5 canvas 自定义画图裁剪图片
  15. 《Understanding WiFi Signal Frequency Features for Position-Independent Gesture Sensing》论文总结
  16. rust纯黑_《黑色沙漠》极致颜艺 黑丝美腿蠢萌搞怪任你捏
  17. el upload ajax,Upload 上传 el-upload 上传配置请求头为Content-Type: multipart/form-data
  18. CTFHUB-技能树-WEB通关
  19. python-18-正则表达式
  20. FileExplorer for iPhone

热门文章

  1. typora和搜狗输入法ctrl+shift+K快捷键冲突
  2. BSI TR-03110
  3. 南京廖华计算机二级考试答案,计算机二级MSOFFICE模拟考试题及答案题目
  4. 隐私计算头条周刊(9.4-9.10)
  5. 软件工程概论第十二周学习进度表
  6. 全球与中国环氧乙烷(ETO)灭菌设备市场深度研究分析报告
  7. 廊坊特色农业 国稻种芯·中国水稻节:河北复合农业促增收
  8. 中文论文评论(1)基于生成对抗网络的人脸铅笔画算法【吉林大学学报】
  9. Android studio3.0对于百度地图api开发(4)——百度地图地图覆盖物制作
  10. python ubantu 飞机大战 显示pygame.error: Unsupported image format