上一篇,我們使用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高手養成