1500字范文,内容丰富有趣,写作好帮手!
1500字范文 > python红楼梦人物统计_基于共现使用Python来分析《红楼梦》中贾宝玉与金陵十二钗的关系...

python红楼梦人物统计_基于共现使用Python来分析《红楼梦》中贾宝玉与金陵十二钗的关系...

时间:2021-07-17 12:16:39

相关推荐

python红楼梦人物统计_基于共现使用Python来分析《红楼梦》中贾宝玉与金陵十二钗的关系...

上一篇,我们使用Python分析了《三国演义》中人物出现次数(罗贯中的《三国演义》中到底谁是主角?我们使用Python来分析一下),文中我们仅仅从人物出现次数,来推断出这部作品中的主角,当然,这样计算不太准确,我们不能从作品中人物出现次数多少来简单的断定这部作品的主角。但是我们通过这个小案例学习使用了Python的数据分析的常用方法。

数据分析很有用哦

今天,我们利用Python来分析一下《红楼梦》中贾宝玉和金陵十二钗的关系如何。不要跟我说你不知道金陵十二钗是谁,你肯定听说过金陵十三钗吧?但是金陵十三钗跟这十二钗是不一样的。千万别走开,下面的内容很精彩哦……

电视剧《红楼梦》剧照

【原理分析】

人类是个很神奇的动物,在网络中有这么一句话:“遇见一个人要一秒钟的时间,认识一个人要一分钟的时间,喜欢一个人要一小时的时间,爱上一个人要一天的时间,忘记一个人却要用一辈子的时间。”从相识、相知、相爱、相忘这整个过程,似乎就是人们之间关系由生疏到熟悉的过程。在这个过程中,少不了人与人之间的沟通、交流。在古代,比如,作品《红楼梦》诞生的那个年代,社交网络没有今天这么发达,人们之间沟通、交流(由生疏到熟悉),只能是面对面进行(没有网线哦)。

社交网络改变了我们交流渠道

大家知道,作为一种文学艺术表现形式,小说不可能像今天的电影这样,给人一种直观的视觉印象。小说不一样,小说中的场景是作者及小说的读者通过写作或者阅读在脑海中构造的场景,因此,这类再现的情景在不同的人脑海中存在的印象也可能不同。

读者通过文字感知小说的内容

我们如何理解小说作者想要表达的人物之间的感情及关系演进过程呢?我们只能透过文字,通过人物面对面沟通、交流(《红楼梦》中可能涉及较少)的场景,来分析人物之间的关系,这种关系,我们不论好坏,反映在小说当中,就是二者之间有无交集。准确的表达就是在小说同一个段落当中,如果两人或者两人以上同时出现,则这些人就产生一次交集。我们一般通过这种基于共现的方式来分析小说中的人物关系。

作者跟读者脑海的印象是不同的

社交网络中,有一个很出名的六度分割理论,简单来讲就是:”你和任何一个陌生人之间所间隔的人不会超过六个,也就是说,最多通过六个人你就能够认识任何一个陌生人。“千万别走开,今天的分析结果中你可以验证这个六度分割理论,虽然古代没有网络,但是六度分割理论貌似也能适用。

【材料准备】

我们准备好Python编译环境,提前安装好jieba库、matplotlib库、networkx库,然后,自己下载一个《红楼梦》的txt文件。下面我们对这些库做一个简单的介绍。

jieba:常用分词库,安装好jieba库后,我们找到位置:E:\Python34\Lib\site-packages\jieba(我的Python是安装在E盘下的),这个目录下我们打开一个‘dict.txt’的文件,该文件是jieba定义的默认分词字典,然后使用文本编辑软件(最好不是记事本)打开该文件,在末尾加上下面几行:

宝玉 3 nr黛玉 3 nr宝钗 3 nr元春 3 nr探春 3 nr湘云 3 nr妙玉 3 nr迎春 3 nr惜春 3 nr熙凤 3 nr巧姐 3 nr李纨 3 nr可卿 3 nr

这样做的目的是提高分词效率,这样做比使用jieba库的load_userdict()更快,当数据量大时,这样做能节省几分钟时间哦,结论亲测……

matplotlib:这个不用多说了,绘图库,我们使用matplotlib实现关系图的可视化。

networkx:这个类库用于调用各种图算法的数据结构,在networkx中,图以对象的形式提供接口。简单来讲就是使用这个来创建我们的关系图,对于networkx的使用这里就不做赘述了,感兴趣的朋友们网上搜索,有很多资源可供学习。

【编码实现】

我们按照获取数据、清洗数据、数据分析、结果展示这四个步骤,对问题进行编码实现。定义四个函数,实现相应的功能,具体过程如下:

在开始之前,我们将《红楼梦》中的别称摘录下来存放在字典中,如下图所示。

贾宝玉和金陵十二钗的别称汇总

我们将人物名称做了规范,里面出现一次别称全部用二个字符的名字来代替。

第一步:获取数据

这一步相对来说较为简单,打开《红楼梦》文件,将文本结果返回即可。代码如下图所示。

打开《红楼梦》文件获取文本内容

这个简单,不解释了。

第二步:清洗数据

这一步,我们实现这么几个功能,将文本中人物别称用人物名字代替,然后去除文本中的标点符号,这样做便于后续分析时使用文本数据,提高分析效率。这一步中我们返回这么三个数据,提供给下一步分析使用。

nameNode:提供统计名字节点的数据

tempNames:将每一段中出现的所有名字作为列表添加到这个列表中

relationshipDic:存放人物之间关系权重的字典

具体代码如下图所示。

清洗文本并返回需要的数据

第三步:数据分析

我们将清洗数据获得的返回值传入函数中,得到每一个主角的关系权重,如下图所示。

进行分析后获得人物关系数据

下面我们对人物关系进行展示,这时候,我们要用到networkx库。第四步:结果展示

我们使用networkx绘制人物关系图,并通过matplotlib库进行展示。具体代码如下图所示。

生成关系图并展示结果

代码展示完毕,下面我们来看下结果,并进行分析。

【小说人物关系分析】

贾宝玉和金陵十二钗的关系图生成了,下面我们来看下结果,如下图所示。

贾宝玉和金陵十二钗关系图展示

从图中我们发现这么一些规律,越在图中央位置的人物,他与其他人物的联系越紧密,这种联系我们是通过每个人物之间的连线来展示的,在中间的话,他跟其他人的联系也越容易。显然,这个人物就是贾宝玉。我们再来看下位于图关系边缘的人物,秦可卿、妙玉、贾元春、巧姐、湘云、探春,这些人物处于边缘位置,与主人公的联系也不是很紧密。从结局我们知道,秦可卿最后病逝(也有说法是自缢),妙玉下落不明,元春失宠后死于宫斗,巧姐被刘姥姥赎出后嫁给板儿,湘云守寡,探春远嫁”和藩“,貌似结局都不是很好(当然,我们不是在分析结局)。而与主人公”见面“次数比较多的是黛玉、熙凤、宝钗这些人,而这些人也是我们所说的主角,这与作品描写的内容也是不谋而合的。

贾宝玉是《红楼梦》中主角

【总结】

好了,今天的内容就到这里了,感兴趣的朋友们亲自敲代码试一试哦,说不定你能分析出一些惊天的秘密呢?欢迎大家留言加关注,后续会推出使用Python分析关于四大名著的精彩内容,不要错过哦,文中分析不对的地方,欢迎大家留言指正。

转载请注明出处,百家号:Python高手养成

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。