使用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日

相关文章

  • 为了快速了解原神,我用Python爬取了原神所有角色信息!

    原神是由米哈游制作发行的一款开放世界冒险游戏,号称全球玩家5600W,可以说是非常热门了,朋友都说好玩,哎,但我就是不玩,就是皮…       但是,今天我就要用python来打开“原神世界”的大门!探索一下游戏角色! 话不多说直接开整! 准备工作 这是本次需要使用到 的工具 nodejs pyexecjs requests 编辑器:pycharm环境:Py…

    Python开发 2023年3月31日
    00
  • Python骚操作!实现自动制作各种证件照,这不比PS快多了!

    事情是这样的 晚上我正在聚精会神写代码(打游戏~) 突然,收到学妹给我发来的消息 还有一张自拍照 而且是可以放在结婚证上的那种哦 就是 之前帮过她几次忙 难道要以身相许 去一起办证 原来是照片尺寸不合适 让我帮她修图。还要什么蓝底、红底各种背景的 虽然有些失落 还是,默默的撸出了我39米长的python大刀 先上效果 1、尺寸长宽调整为:295×413 2、…

    Python开发 2023年4月2日
    00
  • jupyter使用虚拟环境

    为了在jupyter中使用pyTorch的虚拟环境,来记录一下怎么操作一、conda命令的使用因为使用的是jupyter,所有就使用Anaconda Prompt来创建虚拟环境(也可使用virtualenv,不过没试过) conda create -n 环境名 # 创建的环境在默认路径下,C盘位置不够使用下面命令 # 指定创建路径 conda create …

    Python开发 2023年4月2日
    00
  • 【Python基础教程】类的定义和使用

    哈喽兄弟们,今天咱们分享一下类的定义和使用。   在Python中,类表示具有相同属性和方法的对象的集合。在使用类时,需要先定义类,然后再创建类的实例,通过类的实例就可以访问类中的属性和方法了。 1、定义类 在Python中,类的定义使用class关键字来实现,语法如下: class ClassName: “”“类的帮助信息”“” # 类文本字符串 stat…

    Python开发 2023年4月2日
    00
  • Python采集疫情数据,绘制可视化动态地图,实时查询疫情数据!

    疫情尚未结束,我们需要做好自己,时刻防范,不给别人添麻烦。 今天我们来尝试用Python抓取世界疫情,实现可视化地图展示。 话不多说直接开搞! 采集数据 1、数据来源 数据来源于TX新闻,链接展示不了,就只贴图了。     2、模块 import requests import csv # Python学习交流君羊:279199867   requests …

    2023年4月2日
    00
  • 发现一个舔狗神器,Python真的太厉害了,自动下载妹子视频…

    兄弟们,现在短视频主播好看的妹子太多了,有时候遇到自己喜欢的,虽然点了赞或者收藏了,但是万一主播把视频隐藏下架了呢? 所以今天咱们就用Python来把这些好看的视频统统保存下来…     涉及知识点 1、动态数据抓包演示2、json数据解析方法3、视频数据保存 环境介绍 python 3.6 pycharm requests   案例实现步骤 找数据对应的地…

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

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

    Python开发 2023年4月2日
    00
  • Python实现人脸识别

    哈喽兄弟们,今天实现一下人脸识别。 先问大家一个问题什么是百度Aip模块? 百度AI平台提供了很多的API接口供开发者快速的调用运用在项目中本文写的是使用百度AI的在线接口SDK模块(baidu-aip)进行实现人脸识别 除了人脸识别,其他api功能的调用也同理。 准备工作 本机环境 系统:win11Python版本:3.9.7编辑器:VS2022 安装ba…

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