最近把紅樓夢又抽空看了一遍,古典中的經典,我真無法用言辭讚美她。今天,想跟大家一起用 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 組織結構的扁平化 在資訊科技和網路技術的推動下,企業資訊可以在不同層級傳遞...