1. 程式人生 > >基於Python分析金庸小說裏的主角,原來他才是真正的主角!

基於Python分析金庸小說裏的主角,原來他才是真正的主角!

python 爬蟲 web開發 編程 入門

粉絲獨白

說起武俠小說,不得不提中國武俠小說三大宗師——金庸、梁羽生、古龍,從上世紀七八十年×××始,大量的武俠經典出現在熒幕之中。三位大師的文字作品幾乎都讀過,在學習Python和數據分析後又發現了很多好玩的東西,今天就用數據分析來探索一下武俠小說。

要點:

- 誰是主角(金庸)

- 用詞習慣(梁羽生)

一:誰是金庸小說的主角

天龍八部是一部多主角小說,蕭峰、虛竹、段譽三兄弟各有際遇,曾經還因誰才是第一主角的問題引發過一陣爭論。

現在我們已經懂得用數據思維來考慮問題,看看怎樣對中文小說進行數據分析吧。出場率是評價一個小說人物的重要指標,我們就先來對《天龍八部》中人物的出場情況進行一下統計分析吧。

1.分詞

中文分詞是中文信息處理的基礎,但是由於漢語的博大精深,中文分詞的難度比英文要高出一大截,好在python有很多用於中文分詞的庫,jieba就是其中受歡迎程度比較高的一款

,下面我們就來體會一下它的妙用。

因為文件太大,每次只讀取固定長度的字符串

技術分享圖片


  • jieba用起來非常簡單,短短幾行代碼就完成了分詞工作(下圖),可是...仔細一看發現哪裏不對了

  • “段譽”作為一個姓名沒有被單獨分出來,而是和其他一些動詞連在一起,另外也有一些角色名字被拆分成了兩個甚至更多的單詞,例如“神仙姊姊”被分成了“神仙”和“姊姊”兩個詞

  • 不過這也難怪,中文的靈活性太強,一個詞往往有多層含義和多種用法,看來直接使用jieba分詞還是會有不小的誤差,我們得想辦法來解決這個問題,不然會對分析結果造成幹擾。

技術分享圖片


2.優化

jieba本身帶有詞庫,而且具備很強大新詞識別的功能,但是為了獲得更高的準確率我們必須載入自定義詞庫。

因為這次的目的是對人物姓名進行分析,我們先從網上找一份熱心網友整理的《天龍八部》人物大全,然後參照“jieba/dict.txt”的格式(一個詞占一行,每一行分三部分:詞語、詞頻(可省略)、詞性(可省略),用空格隔開,順序不可顛倒)做成詞典文件my_dict.txt。

技術分享圖片


使用 jieba.load_userdict()函數加載到程序中。如果在程序運行過程中發現其他問題,還可以使用add_word()、suggest_freq()等函數對詞典和詞頻進行動態調整。

  • 用load_userdict導入自定義字典,?le_name 為文件類對象或自定義詞典的路徑

  • add_word()可在程序中動態增加詞典

  • del_word()可在程序中動態刪減詞典

  • suggest_freq()可調節單個詞語的詞頻,使其能(或不能)被分出來

現在我們已經成功解決了人名被意外分割的問題,而對於“段譽聽”、“段譽見”這類包含姓名但分割不徹底的單詞,我們可以使用suggest_freq函數調整詞頻進行強制分割

不過我感覺這樣做畢竟麻煩,還是決定用正則表達式的方法把我們需要的人名單獨取出來,同時將我們不需要的信息(不包含人名的單詞)過濾掉。

3.制圖

經過上面兩步操作獲得了一份僅包含《天龍八部》人名的文本,我們可以很輕易地將它讀取並轉換為list格式,

現在是不是有一種“我為刀俎,它為魚肉”的感覺了。經過簡單的數據處理,我們得到了每個人物的名字在小說中出現的頻次,由於蕭峰和喬峰是同一個人,為了方便統計將兩個名字的出場次合並。

然後取出場率排名前30位的角色數據,用圖表的形式展示出來。

技術分享圖片


雖然在很多人心中蕭峰的形象更適合本書主角,但從分析結果來看,“段譽”這個名字在小說中的出場頻率是最高的。

蕭峰(喬峰)緊隨其後,難怪有人為誰是第一主角的事發起過爭論。不過人物的重要性也不能只看戲份多少,像慕容博,蕭遠山,玄慈,段正淳這些人的出場率雖然不是特別高。

但正是這幾個人上一代的宿命恩怨,引發了蕭峰虛竹段譽三兄弟的江湖故事,實實在在是另一條暗線的主角。

關於主角的問題我們就不展開討論了,從圖中還可以看到其他一些角色的出場頻率,仔細琢磨一下還是蠻有意思的。

其實《天龍八部》的中心思想就是“求不得”:

  • 段譽不想學武功卻練成了絕世神通

  • 一心追求王語嫣最終美人對慕容復不離不棄

  • 蕭峰立誌保衛大宋沒想到自己居然是契丹人

  • 決定與阿朱塞外牧馬,然而造化弄人,心愛的人卻死在自己手上

世間種種往往難以掌控,所以我們平時閱讀、學習的過程中也不必過於心浮氣躁、急功近利,還是要平心靜氣、踏實苦練,即使目標無法完全實現也可能遇到“有心栽花花不開、無心插柳柳成蔭”的境遇。

二:小說裏的用詞習慣

每個人寫作都會有自己的風格,而寫作風格很大程度上可以在用詞習慣上體現出來,剛才我們分析了金老的作品, 這次我們來看下被譽為新派武俠小說開山祖師梁羽生的兩部部代表作品——《萍蹤俠影錄》和《雲海玉弓緣》。

1.取詞

既然是中文語言分析那第一步當然還是分詞了,考慮到“說”、“走”、“開始”、“平常”等簡單詞語使用頻率通常很高且難以體現寫作風格。

這裏我們僅提取詞長度不小於4的成語、俗語和短語進行分析。同時,考慮到某些人名(例如:上官婉兒、淡臺滅明)等專有名詞會對分析結果造成幹擾,在分詞取詞的時候可以一並過濾掉,最終得到這樣一份詞語文件:

技術分享圖片


2.雲圖

對用詞習慣的分析更傾向於定性分析,我們這裏使用詞雲圖來作展示,首先繪制《萍蹤俠影錄》的詞雲圖。

技術分享圖片


我們可以看到在這篇小說中“微微一笑”、“哈哈大笑”、“大吃一驚”、“非同小可”等詞語使用頻率非常高,再來看另一部作品《女帝奇英傳》,詞雲圖如下:

技術分享圖片


我們很容易就發現,這部小說中使用頻率最高的還是“微微一笑”、“哈哈大笑”、“大吃一驚”、“非同小可”這幾個詞, 繼續查看其他一些使用頻率較高的詞也會發現類似的規律。

看來梁老先生寫作的用詞習慣還是有跡可循的,有興趣的朋友也可以拿其他大師的文學作品或者網絡小說來進行分析,說不定會發現很有趣的規律哈。

中文分詞其實是一個非常有意思的事情,特別是對這些武俠小說的探索!我自己也是一個武俠迷,超級喜歡金庸的小說。飛雪連天射白鹿 笑書神俠倚碧鴛,每一本書都是非常經典。除了上面兩個維度,我們還有一個人物關系的分析文章,正在創作中,大家敬請期待。


如果對於本篇有啥建議,歡迎留言交流!對於中文分詞和語言分析,筆者也是初學乍道,對於文中涉及的技術理解和小說見解,如有不當之處歡迎大家批評指正。

寫文章不易,我會堅持更新(雖然多是轉載),希望大家多多關註點贊,如果有什麽想法,或者想我出什麽類型什麽內容的文章,可以在文章下方評論,我會盡我所能滿足大家的要求,另外大家如果想要學習python,我也給大家推薦一個q-un,719-139-688。

基於Python分析金庸小說裏的主角,原來他才是真正的主角!