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

使用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()

# 更多视频教程、电子书、源码加君羊:279199867

 

 

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

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 两个数据,内容如下

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

 

 

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

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

 

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

 

 

三、人物关系

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:
            continue
        tmpNames[-1].append(w.word)
        if names.get(w.word) is None:
            names[w.word] = 0
        relationships[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:
                    continue
                if relationships[name1].get(name2) is None:
                    relationships[name1][name2] = 1
                else:
                    relationships[name1][name2] += 1

 

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

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

with open("relationship.csv", "w", encoding='utf-8') as f:
        f.write("Source,Target,Weightn")
        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,Weightn")
    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]/3
        nodes.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探索四大名著【红楼梦】人物之间的关系,简直帅呆了

 

 

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

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:使用Python探索四大名著【红楼梦】人物之间的关系,简直帅呆了 - Python技术站

(0)
上一篇 2023年4月2日
下一篇 2023年4月2日

相关文章

  • QQ发生大规模账号泄露事件,二十行Python代码,带你了解前因后果

    六月,秋秋发生大规模盗号事件,众说纷纭,也有说因为某习通买卖个人信息导致的,有说是因为点了图片中的网站导致中毒被盗的,还有说企鹅数据库被攻击导致账号被盗的,反正公说公有理婆说婆有理。     但是吧,人呐,一般都喜欢凑热闹,于是乎,我直接用Python把围脖爬了一遍,看他们争论的不亦乐乎,我开心极了~       兄弟们学习python,有时候不知道怎么学,…

    2023年4月2日
    00
  • 【Python】Flask + MySQL 实现用户注册,登录和登出

    今天用Flask + MySQL 实现用户注册,登录和登出。 一、实战场景 Flask 框架实现用户的注册,登录和登出。 二、主要知识点 flask_login 插件使用 SQLAlchemy 基础操作 用户基础类设计 Flask 读取配置文件 蓝图注册与使用 wtforms 表单提交数据 wtforms 表单验证 Bootstrap 集成 Jinjia2 …

    Python开发 2023年4月2日
    00
  • Python批量爬取大众点评数据

    众所周知,某点评是一直有JS加密的,所以关于它的外包一直都很贵,有些公司甚至用来面试,可见他的难度。 但是吧,最近他好像没有加密了,这~ 不值钱了啊! 那当时就忍不住了,就得用Python开始整活了!     话不多说,让我们上代码! 全部代码 今天就没那么多步骤了,直接上代码! import requests import parsel url = ‘ht…

    2023年4月2日
    00
  • Python实现视频自动打码功能

    我们在观看视频的时候,有时候会出现一些奇怪的马赛克,影响我们的观影体验,那么这些马赛克是如何精确的加上去的呢? 本次我们就来用Python实现对视频自动打码! 准备工作 环境咱们还是使用 Python3.8 和 pycharm2021 即可 实现原理 将视频分为音频和画面; 画面中出现人脸和目标比对,相应人脸进行打码; 处理后的视频添加声音; 模块 手动安装…

    Python开发 2023年4月2日
    00
  • 圣诞节快到了,教大家用Python画一个简单的圣诞树和烟花,送给那个她

    这不是圣诞节快到了,准备让让女朋友开心开心,也算是亲手做的,稍稍花了点心思。 话不多说,咱们直接来展示吧,学会了赶紧画给你的那个她吧! 本文分为两个大块,我们先来试试画圣诞树。 圣诞树 效果展示 代码展示 导入模块 import turtle as t from turtle import * import random as r import time  …

    Python开发 2023年4月2日
    00
  • 重温python基础:列表相加的方法(两个list [] 加法)

    哈喽兄弟么,今天咱们来复习一下列表相加的两个方法。 利用操作符+ +操作符 对象是list a = [1,2,3] b = [4,5,6] c = a+b print(c) #c的结果:[1,2,3,4,5,6]   利用extend extend 操作对象是list a = [1,2,3] b = [4,5,6] a.extend(b) print(a) …

    Python开发 2023年4月2日
    00
  • Python批量处理Excel表格,将多个表格内容合并到一个,提升工作效率!

    老板最近越来越过分了,快下班了发给我几百个表格让我把内容合并到一个表格内去。还好我会Python,分分钟就搞定了,这要是换个不会Python的,不得加班到第二天天亮去了~ 这么好用的技能,必须分享给大家,话不多说,咱们直接开始! 准备工作 咱们需要先准备表格数据,会爬虫的兄弟可以自己爬一点,不会的,可以找我直接拿数据。 表格内数据     我这里只做展示,所…

    Python开发 2023年4月2日
    00
  • 这个Python读取文件的方法,堪称天花板级别…

    序言 哈喽兄弟们,今天咱们来了解一下 fileinput 。 说到fileinput,可能90%的码农表示没用过,甚至没有听说过。 这不奇怪,因为在python界,既然open可以走天下,何必要fileinput呢? 但是,今天我还是要介绍fileinput这个方法,因为太奈斯了。 不止是香。是真香! 接下来,就跟着我,一起fileinput,对,就是这个f…

    Python开发 2023年4月2日
    00
合作推广
合作推广
分享本页
返回顶部