前言
看到用機器學習方法分析紅樓夢的文章不少,也有好幾種方法,大觀是因爲純文字的分析成本低吧,比較適合初學者練手,先轉載一兩篇文章過來學習。所謂機器學習也是一些數學統計的方法,通過習慣用詞來做判斷, 也並不是很難。這裏判定的維度越多越精準,下面判定僅供參考,僅供娛樂學習!
判定整體思路
主要從以下幾個方面可以進行粗略進行判定:
1.寫作習慣
每個人寫作都有一些與種不同的小習慣,這些小習慣並不會輕易就會發生改變;萬分之一的例外情況不考慮!
2.詞頻統計
就像每次領導人開會一樣,媒體或政客們都會去統計領導人講話中出現的高頻詞彙,來判斷領導人政策的下一步走向!
用開源的分詞工具把全書分詞,然後統計詞頻。把出現頻次超過100次的詞語找出來,人工去掉一些可能因爲文章內容造成前後出現不一致的人名、地名;
3.分別統計章節中的詞頻
然後每一章按照下列表中的詞頻表,看這一章中出現這些詞語的頻次;
4.進行推斷
前80回、後40回各選15回作爲機器學習的數據,讓機器學習這些章節的用詞特點,然後推算其他章節的用詞特點是屬於前80回呢、還是後40回;
5.得出結論
如果機器根據這些用詞特徵推算的是否屬於後40回的結果跟實際的結果吻合,那麼就說明後40回的寫作風格跟前80回有很大不同,很可能是兩個人寫的;
下面就對上面的判斷依據進行一一實現,所謂編程其實就是一個自我假設,自我實現論證,改進的過程!
生成全書的詞彙表
截詞說明
這只是截取了其中一段的詞頻表。
像寶二爺、黛玉笑這種涉及人物的詞語,可能前面戲份多、後面戲份少,所以就不選它們作爲用詞習慣的特徵,而像忽然、故、只要、可不是這種承接性質的碎詞,就不太容易會受情節的影響,所以適合選出來作爲用詞習慣的特徵。
處理
最終,我按照出現從多到少排序,選擇了278個詞作爲機器學習的用詞習慣。
接下來對整本書120回的詞頻進行一個有效統計
全書詞頻統計
接下來我把每一回出現這278個詞的頻次統計出來,得到我們給機器學習的樣本。這個樣本的樣子大概是這樣的:
通常我們在進行復雜的事情前,喜歡先簡化問題,或者給自己一些直觀的圖表,以便了解問題。機器學習也是一樣的。
我嘗試着在圖上把前80回和後40回習慣用詞出現的頻次畫出來。以第一回爲例,x1座標代表「道」出現多少次,x2座標代表「說」出現多少次,x3座標代表「也」出現多少次……x280座標代表「則」出現多少次。
這個是120個章節的用詞習慣從278緯降到3維以後的圖,紅色+的點是前80回,藍色o的點是後40回。
結論
從這個圖可以直觀地看到,確實在用詞習慣上有明顯的區別。就算我們沒有機器學習工具的幫忙,也可以大膽猜測後40回是出自於另外一個人了。
機器學習判定
下面我們用機器學習來看精確一點的判斷。
通過課程我大致瞭解了SVM的原理和簡化版問題的算法實現,這裏用python的scikit庫來幫助我來完成這個預測。
算法的步驟很簡單,前80回、後40回各選15個來餵給機器學習它們的特點,然後把剩下的章節輸入給機器,問它們屬於前80還是後40。
結論
看out[44]的結果,代表了機器預測這120回的用詞習慣到底屬不屬於後40回(0爲不屬於,1爲屬於)。
機器在學習以後告訴我,如果我把隨便一章的用詞習慣告訴它、但不告訴它到底是前80回還是後40回,那麼機器有95%的把握能猜出它是不是後40回。
至此,我們可以很有信心地判斷它們的寫作風格不同。
情節不同會造成用詞習慣多大的差別?
好吧,那我再來做一個旁證。我把另外一部四大名著「三國演義」拿來分析,看看上部跟下部的用詞習慣會不會有比較明顯的差別。
結論
這個是三國演義的用詞習慣縮到三維以後的圖,紅色+代表前60部的用詞習慣,藍色o代表後60部的用詞習慣。
你可能會說,雖然中間交叉的地方比較多,但是還是可以看出來是有區分的。
可如果你比對一下跟紅樓夢的圖,你就會發現紅樓夢的差別會明顯得多。
大結論
最後,用機器學習的方式來說,如果我把三國演義隨便一章的用詞習慣告訴它、但不告訴它到底是前60回還是後60回,那麼機器有7成的把握猜對,這個準確度已經遠遠低於紅樓夢的95%的預測水平。
所以,我們用「三國演義」這個旁證來分析,即便是因爲情節需要導致的用詞習慣差別也不應該這麼大。
所以,我們就更有信心說曹老先生沒有寫後40回了。