基于Python分析金庸小說里的主角,原來他才是真正的主角!
粉絲獨(dú)白
說起武俠小說,不得不提中國武俠小說三大宗師——金庸、梁羽生、古龍,從上世紀(jì)七八十年代開始,大量的武俠經(jīng)典出現(xiàn)在熒幕之中。三位大師的文字作品幾乎都讀過,在學(xué)習(xí)Python和數(shù)據(jù)分析后又發(fā)現(xiàn)了很多好玩的東西,今天就用數(shù)據(jù)分析來探索一下武俠小說。
要點(diǎn):
- 誰是主角(金庸)
- 用詞習(xí)慣(梁羽生)
一:誰是金庸小說的主角
天龍八部是一部多主角小說,蕭峰、虛竹、段譽(yù)三兄弟各有際遇,曾經(jīng)還因誰才是第一主角的問題引發(fā)過一陣爭論。
現(xiàn)在我們已經(jīng)懂得用數(shù)據(jù)思維來考慮問題,看看怎樣對中文小說進(jìn)行數(shù)據(jù)分析吧。出場率是評價一個小說人物的重要指標(biāo),我們就先來對《天龍八部》中人物的出場情況進(jìn)行一下統(tǒng)計分析吧。
1.分詞
中文分詞是中文信息處理的基礎(chǔ),但是由于漢語的博大精深,中文分詞的難度比英文要高出一大截,好在python有很多用于中文分詞的庫,jieba就是其中受歡迎程度比較高的一款,下面我們就來體會一下它的妙用。
因為文件太大,每次只讀取固定長度的字符串
- jieba用起來非常簡單,短短幾行代碼就完成了分詞工作(下圖),可是...仔細(xì)一看發(fā)現(xiàn)哪里不對了
- “段譽(yù)”作為一個姓名沒有被單獨(dú)分出來,而是和其他一些動詞連在一起,另外也有一些角色名字被拆分成了兩個甚至更多的單詞,例如“神仙姊姊”被分成了“神仙”和“姊姊”兩個詞。
- 不過這也難怪,中文的靈活性太強(qiáng),一個詞往往有多層含義和多種用法,看來直接使用jieba分詞還是會有不小的誤差,我們得想辦法來解決這個問題,不然會對分析結(jié)果造成干擾。
2.優(yōu)化
jieba本身帶有詞庫,而且具備很強(qiáng)大新詞識別的功能,但是為了獲得更高的準(zhǔn)確率我們必須載入自定義詞庫。
因為這次的目的是對人物姓名進(jìn)行分析,我們先從網(wǎng)上找一份熱心網(wǎng)友整理的《天龍八部》人物大全,然后參照“jieba/dict.txt”的格式(一個詞占一行,每一行分三部分:詞語、詞頻(可省略)、詞性(可省略),用空格隔開,順序不可顛倒)做成詞典文件my_dict.txt。
使用 jieba.load_userdict()函數(shù)加載到程序中。如果在程序運(yùn)行過程中發(fā)現(xiàn)其他問題,還可以使用add_word()、suggest_freq()等函數(shù)對詞典和詞頻進(jìn)行動態(tài)調(diào)整。
- 用load_userdict導(dǎo)入自定義字典,file_name 為文件類對象或自定義詞典的路徑
- add_word()可在程序中動態(tài)增加詞典
- del_word()可在程序中動態(tài)刪減詞典
- suggest_freq()可調(diào)節(jié)單個詞語的詞頻,使其能(或不能)被分出來
現(xiàn)在我們已經(jīng)成功解決了人名被意外分割的問題,而對于“段譽(yù)聽”、“段譽(yù)見”這類包含姓名但分割不徹底的單詞,我們可以使用suggest_freq函數(shù)調(diào)整詞頻進(jìn)行強(qiáng)制分割
不過我感覺這樣做畢竟麻煩,還是決定用正則表達(dá)式的方法把我們需要的人名單獨(dú)取出來,同時將我們不需要的信息(不包含人名的單詞)過濾掉。
3.制圖
經(jīng)過上面兩步操作獲得了一份僅包含《天龍八部》人名的文本,我們可以很輕易地將它讀取并轉(zhuǎn)換為list格式,
現(xiàn)在是不是有一種“我為刀俎,它為魚肉”的感覺了。經(jīng)過簡單的數(shù)據(jù)處理,我們得到了每個人物的名字在小說中出現(xiàn)的頻次,由于蕭峰和喬峰是同一個人,為了方便統(tǒng)計將兩個名字的出場次合并。
然后取出場率排名前30位的角色數(shù)據(jù),用圖表的形式展示出來。
雖然在很多人心中蕭峰的形象更適合本書主角,但從分析結(jié)果來看,“段譽(yù)”這個名字在小說中的出場頻率是最高的。
蕭峰(喬峰)緊隨其后,難怪有人為誰是第一主角的事發(fā)起過爭論。不過人物的重要性也不能只看戲份多少,像慕容博,蕭遠(yuǎn)山,玄慈,段正淳這些人的出場率雖然不是特別高。
但正是這幾個人上一代的宿命恩怨,引發(fā)了蕭峰虛竹段譽(yù)三兄弟的江湖故事,實(shí)實(shí)在在是另一條暗線的主角。
關(guān)于主角的問題我們就不展開討論了,從圖中還可以看到其他一些角色的出場頻率,仔細(xì)琢磨一下還是蠻有意思的。
其實(shí)《天龍八部》的中心思想就是“求不得”:
- 段譽(yù)不想學(xué)武功卻練成了絕世神通
- 一心追求王語嫣最終美人對慕容復(fù)不離不棄
- 蕭峰立志保衛(wèi)大宋沒想到自己居然是契丹人
- 決定與阿朱塞外牧馬,然而造化弄人,心愛的人卻死在自己手上
世間種種往往難以掌控,所以我們平時閱讀、學(xué)習(xí)的過程中也不必過于心浮氣躁、急功近利,還是要平心靜氣、踏實(shí)苦練,即使目標(biāo)無法完全實(shí)現(xiàn)也可能遇到“有心栽花花不開、無心插柳柳成蔭”的境遇。
二:小說里的用詞習(xí)慣
每個人寫作都會有自己的風(fēng)格,而寫作風(fēng)格很大程度上可以在用詞習(xí)慣上體現(xiàn)出來,剛才我們分析了金老的作品, 這次我們來看下被譽(yù)為新派武俠小說開山祖師梁羽生的兩部部代表作品——《萍蹤俠影錄》和《云海玉弓緣》。
1.取詞
既然是中文語言分析那第一步當(dāng)然還是分詞了,考慮到“說”、“走”、“開始”、“平常”等簡單詞語使用頻率通常很高且難以體現(xiàn)寫作風(fēng)格。
這里我們僅提取詞長度不小于4的成語、俗語和短語進(jìn)行分析。同時,考慮到某些人名(例如:上官婉兒、澹臺滅明)等專有名詞會對分析結(jié)果造成干擾,在分詞取詞的時候可以一并過濾掉,最終得到這樣一份詞語文件:
2.云圖
對用詞習(xí)慣的分析更傾向于定性分析,我們這里使用詞云圖來作展示,首先繪制《萍蹤俠影錄》的詞云圖。
我們可以看到在這篇小說中“微微一笑”、“哈哈大笑”、“大吃一驚”、“非同小可”等詞語使用頻率非常高,再來看另一部作品《女帝奇英傳》,詞云圖如下:
我們很容易就發(fā)現(xiàn),這部小說中使用頻率最高的還是“微微一笑”、“哈哈大笑”、“大吃一驚”、“非同小可”這幾個詞, 繼續(xù)查看其他一些使用頻率較高的詞也會發(fā)現(xiàn)類似的規(guī)律。
看來梁老先生寫作的用詞習(xí)慣還是有跡可循的,有興趣的朋友也可以拿其他大師的文學(xué)作品或者網(wǎng)絡(luò)小說來進(jìn)行分析,說不定會發(fā)現(xiàn)很有趣的規(guī)律哈。
中文分詞其實(shí)是一個非常有意思的事情,特別是對這些武俠小說的探索!我自己也是一個武俠迷,超級喜歡金庸的小說。飛雪連天射白鹿 笑書神俠倚碧鴛,每一本書都是非常經(jīng)典。除了上面兩個維度,我們還有一個人物關(guān)系的分析文章,正在創(chuàng)作中,大家敬請期待。
如果對于本篇有啥建議,歡迎留言交流!對于中文分詞和語言分析,筆者也是初學(xué)乍道,對于文中涉及的技術(shù)理解和小說見解,如有不當(dāng)之處歡迎大家批評指正。