使用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爬取往期股票数据,分析中奖规律!

    快过年了,手头有点紧,但是作为一个男人,身上怎么能够没有大把钞票呢? 于是我决定用Python来分析一波股票,赢了会所嫩*,输了下海干活! 好了,上面是我吹牛逼的,不过确实有小伙伴看了爬股票数据进行分析的教程中过,但是我还是不建议各位去碰这玩意,今天咱们就是纯纯的分享技术哈~ 准备工作 既然要去赚马内,咱们首先要获取往期的数据来进行分析,通过往期的规律来对当…

    Python开发 2023年3月31日
    00
  • Python爬取安居客房源信息,轻松获取优质房源!

    又到了所谓的金山银四就业季,那找工作的小伙伴宿舍住不惯的话,就会去租房子住,当然也不一定有宿舍,那么自己找房子的话,肯定是不知道哪哪好。 所以今天教大家用Python来采集本地房源数据,帮助大家筛选好房。 本文涉及知识点 爬虫基本流程 requests 发送请求 parsel 解析数据 csv 保存数据 开发环境 Python 3.8 Pycharm   本…

    Python开发 2023年3月31日
    00
  • 用Python实现简单的验证码识别

    我们在做采集数据的时候,过快或者访问频繁,或者一访问就给弹出验证码,然后就蚌珠了~      今天就给大家来一个简单处理验证码的方法 环境模块 本文使用的是 Python和pycharm   这里需要用到一个 ddddocr 模块 ,这是别人开源写好的一个东西,简单又好用,但是精确度差一点点,但是还是非常好用的。 如果你追求精确度的话,可以调用别人写好的一些…

    2023年4月2日
    00
  • 8条非常实用的python代码案例,初学者必备知识点!

    给大家推荐八个非常实用的Python案例,希望大家看过后能够有所收获! 1、合并两个字典 Python3.5之后,合并字典变得容易起来,我们可以通过**符号解压字典,并将多个字典传入{}中,实现合并。 def Merge(dict1,dict2): res = {**dict1,**dict2} return res # 两个字典 # Python学习交流1…

    Python开发 2023年4月2日
    00
  • 关于pycharm打开时很卡,一直加载中的解决办法~

    相信很多刚开始使用pycharm不太熟练的小伙伴,每天一开机打开pycharm总是卡半天,不知道的还以为是电脑卡了或者啥问题的。 莫慌,其实并不是… 今天我们就来解决一下这个问题 大致总结了以下这几种方法 1、exclude不必要文件 依次打开 file(文件) → project:administrator(project:administrator 项目…

    Python开发 2023年4月2日
    00
  • 我用Python做了个动图生成器,把一千个MM生成了GIF设置桌面,只为每天愉悦心情

    现在的年轻人都开始每天保温杯里泡枸杞,这怎么能行呢? 想要每天过的好,美女必然少不了,每天看美女,只为了愉悦心情,心情好了,才长寿。 于是怀揣着愉悦心情的想法,我开始制作GIF动图生成器,想要用Python来做成美女壁纸,行动起来。 这个小工具制作的目的是为了将多张图片组合后生成一张动态的GIF图片。设置界面化的操作,只需要将选中的图片导入最后直接生成动态图…

    Python开发 2023年3月31日
    00
  • Python实现人脸识别

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

    Python开发 2023年4月2日
    00
  • 将表格内不一样的数据,用Python自动发送给不同的人,实现高效摸鱼

    事情是这样的,罪恶的资本家老板,快下班了给我发一个压缩包,让我把数据发给客户微信,搞完就可以下班了,我心想这么好,一个文件不是让我直接就提前下班吗,万万没想到… 我就知道,万恶的资本家怎么可能放弃剥削我的机会,我打开一看,一个压缩包里面放了几百个表格,一个表格里面N个人,几十万条数据,三个微信好友一万多人,我真的会谢…都特么四点了,这不是搞我吗?换别的同事,…

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