用Python來理一理紅樓夢裡的這些關係

2021-09-26 04:26:31 字數 3194 閱讀 6734

最近把紅樓夢又抽空看了一遍,古典中的經典,我真無法用言辭讚美她。今天,想跟大家一起用 python 來理一理紅樓夢中的的那些關係

不要問我為啥是紅樓夢,而不是水滸三國或西遊,都是經典,但我個人還是更喜歡偏古典的書,紅樓夢也是我多次反覆品讀的為數不多的**,對它的感情也是最深的。

好了好了這些都不重要,重要的是我們今天要用python來理紅樓夢的關係!

寶玉 nr

黛玉 nr

寶釵 nr

湘雲 nr

鳳姐 nr

李紈 nr

元春 nr

迎春 nr

探春 nr

惜春 nr

妙玉 nr

巧姐 nr

秦氏 nr

這份列表,同時也是為了做分詞時使用,後面的 nr 就是人名的意思。

讀取資料並載入詞典

with open("紅樓夢.txt", encoding='gb18030') as f:

honglou = f.readlines()

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()]

這樣,我們就把紅樓夢讀取到了 honglou 這個變數當中,同時也通過 load_userdict 將我們自定義的詞典載入到了 jieba 庫中。

對文字進行分詞處理並提取

tmpnames = 

names = {}

relationships = {}

for h in honglou:

h.replace("賈妃", "元春")

h.replace("李宮裁", "李紈")

poss = pseg.cut(h)

for w in poss:

if w.flag != 'nr' or len(w.word) != 2 or w.word not in mylist:

continue

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,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]/3

links =

for link in relationship_data_list:

g = (

graph()

.add("", nodes, links, repulsion=8000)

.set_global_opts(title_opts=opts.titleopts(title="紅樓人物關係"))

) return g

首先把兩個檔案讀取成列表形式

對於「寶玉」,由於其佔比過大,如果統一進行縮放,會導致其他人物的 node 過小,展示不美觀,所以這裡先做了一次縮放

最後得出的關係圖:

靜下心來,把思緒理一理。

我首先要在這裡感謝浩龍哥以及感謝浩龍哥組織的這次聚會。浩龍哥一直都很努力,努力讓自己不斷地改進,不斷的在實踐中增加自己的能力,成為一名實幹家是你的追求,呵呵,繼續加油吧,我們相信你。聽海龍哥講解在湖北那段時間的奮鬥 拼搏,外加一些刻骨銘心的冒險經歷,我的心緒就在那裡起伏不定,呵呵,我看到了海龍哥的變...

用Python讀紅樓夢之 二 詞云美化

原文連線 咱們書接上回,講到我們使用python把紅樓夢中的核心詞彙給繪畫出來了,但是,紅樓夢這麼唯美的書,給我們烏漆麻黑的搞了一張詞云,寶寶們肯定接受不了。我們先來找 這張 不錯,不過還是要處理一下,把背景處理稱為白色,這個時候,ps工具可以簡單地達到這個效果。接著,我們就要來寫程式了,老規矩,我...

企業組織形態發展呈現哪些新趨勢?我們來理一理

企業組織形態是指企業的組織形式,存在狀態和執行機制。具體是由組織中縱向的等級關係及其溝通關係,橫向的分工協作關係及其溝通關係而形成的一種無形的 相對穩定的企業構架。它反映組織成員之間分工協作關係,體現了一種分工和協作框架。1 組織結構的扁平化 在資訊科技和網路技術的推動下,企業資訊可以在不同層級傳遞...