用機器學習證明紅樓夢後40回是不是曹雪芹寫的

前言:前段時間看到了紅學家朱建軍老師對於紅樓夢後四十回的發言


對大多數不關心作者是誰的人來說,《紅樓夢》的作者是誰,這個問題的答案好清楚,不就是曹雪芹嗎。當然,如果更細心的話,也可以回答說,是曹雪芹和高鶚。《紅樓夢》前 80 回是曹雪芹寫的,後面 40 回是高鶚續的。


平常人一旦相信了什麼,一般也就不會再去費力驗證它。因為他們覺得這不需要驗證了,《紅樓夢》的作者當然是曹雪芹——在他們心中,這已經是個事實了。越熟悉,就越覺得天經地義。


前一段時間,我做了個演講,說《紅樓夢》的作者不是曹雪芹。然後有位先生在微博中罵我,我很好奇就問他:「你為什麼覺得我說錯了?你的依據是什麼呢?」他的回答相當的簡單,他說:「我不管你怎麼說,但是你一定是錯的,理由就是《紅樓夢》明明是曹雪芹寫的,這個小學生都知道。」我聽了他的話很有收穫,懂得了他的道理——他的推理的大前提就建立在《紅樓夢》作者是曹雪芹,所以結論也就不用說了。但是,大家都相信了,就對嗎?未必。我高度懷疑,《紅樓夢》的作者並非曹雪芹。


用機器學習證明紅樓夢後40回是不是曹雪芹寫的


所以今天就把Andrew Ng和紅樓夢結合一下看看能爆發出什麼火花!計算機是一個很強調learning by doing的學科,於是我也來「學以致用」,用剛學到的SVM算法來分析下雪芹老師到底有沒有寫後面的40回。在1980年首屆國際紅學研討會上,威斯康星大學陳炳藻利用計算機對前八十回和後四十回的用字進行測定,他得出的結論是120回的作者是一個人,即曹雪芹。深圳大學研製出《紅樓夢》電腦多功能檢索系統,結論稱:前八十回和後四十回在用詞和描寫等方面有很大差異;


全書所有的生僻字都出現在前八十回,後四十回一個也沒有;


全書描寫亭臺樓閣265次,絕大部分都在前八十回,後四十回共有五處。那麼到底孰對孰錯呢今天我就通過我的方法來證實一下!


Part 1


作為一個從沒看過紅樓夢的人,我的大致思路是這樣的:


  • 檢查用詞的小習慣;

  • 用開源的分詞工具把全書分詞,然後統計詞頻。把出現頻次超過100次的詞語找出來,人工去掉前後出現不一致的人名、地名;

  • 然後每一章按照2中的詞頻表,看這一章中出現這些詞語的頻次;

  • 前80回、後40回各選15回作為機器學習的數據,讓機器學習這些章節的用詞特點,然後推算其他章節的用詞特點是屬於前80回呢、還是後40回;

  • 如果機器根據這些用詞特徵推算的是否屬於後40回的結果跟實際的結果吻合,那麼就說明後40回的寫作風格跟前80回有很大不同,很可能是兩個人寫的;


Part 2


下面正式開始!
生成全書的詞頻表

用機器學習證明紅樓夢後40回是不是曹雪芹寫的


我截取了其中一段的詞頻表。可能前面戲份多、後面戲份少,所以就不選它們作為用詞習慣的特徵,而像忽然、故、只要、可不是這種承接性質的碎詞,就不太容易會受情節的影響,所以適合選出來作為用詞習慣的特徵。
最終,我按照出現從多到少排序,選擇了278個詞作為機器學習的用詞習慣。


Part 3

將120回的詞頻進行統計

接下來我把每一回出現這278個詞的頻次統計出來,我們得到機器學習的樣本大概是這樣的:


用機器學習證明紅樓夢後40回是不是曹雪芹寫的


比如以B行2列舉例,說明在第一回裡面「道」這個動詞,出現了36次。


Part 4

嘗試在圖上把前80回與後40回習慣用詞出現的頻次畫出來。以第一回為例,x1座標代表「道」出現多少次,x2座標代表「說」出現多少次,x3座標代表「也」出現多少次......x280座標代表「則」出現多少次。什麼?超過三維了,那人類的大腦可是沒辦法理解的啊。沒關係,當我們用燈光照射一個立體的圖時,平面會有它的影子。這個影子雖然沒有立體圖的信息這麼豐富,不過我們看影子還是可以猜出來大致的樣子。對於高緯度的問題,我們也可以用投影的方式來降低緯度。雖然信息損失了不少,不過能給我們一個直觀的感受。


用機器學習證明紅樓夢後40回是不是曹雪芹寫的


這個是120個章節的用詞習慣從278緯降到3維以後的圖,紅色+的點是前80回,藍色o的點是後40回。
從這個圖可以直觀地看到,確實在用詞習慣上有明顯的區別。就算我們沒有機器學習工具的幫忙,也可以大膽猜測後40回是出自於另外一個人了。下面我們用機器學習來看精確一點的判斷。


Part 5

機器學習通過課程我大致瞭解了SVM的原理和簡化版問題的算法實現,不過對於複雜問題我還是沒這個編碼能力的。於是用python的scikit庫來幫助我來完成這個預測。算法的步驟很簡單,前80回、後40回各選15個來餵給機器學習它們的特點,然後把剩下的章節輸入給機器,問它們屬於前80還是後40。

用機器學習證明紅樓夢後40回是不是曹雪芹寫的
看out[44]的結果,代表了機器預測這120回的用詞習慣到底屬不屬於後40回(0為不屬於,1為屬於)。


Part 6

情節不同會造成用詞習慣多大的差別?
好吧,那我再來做一個旁證。我把另外一部四大名著「三國演義」拿來分析,看看上部跟下部的用詞習慣會不會有比較明顯的差別。

用機器學習證明紅樓夢後40回是不是曹雪芹寫的


這個是三國演義的用詞習慣縮到三維以後的圖,紅色+代表前60部的用詞習慣,藍色o代表後60部的用詞習慣。
你可能會說,雖然中間交叉的地方比較多,但是還是可以看出來是有區分的。可如果你比對一下跟紅樓夢的圖,你就會發現紅樓夢的差別會明顯得多。


用機器學習證明紅樓夢後40回是不是曹雪芹寫的
(紅色+為紅樓夢前80回/三國前60回,藍色o紅樓夢後40回/三國後60回)


Part 7

最後,用機器學習的方式來說,如果我把三國演義隨便一章的用詞習慣告訴它、但不告訴它到底是前60回還是後60回,那麼機器有7成的把握猜對,這個準確度已經遠遠低於紅樓夢的95%的預測水平。

所以,我們用「三國演義」這個旁證來分析,即便是因為情節需要導致的用詞習慣差別也不應該這麼大。
所以,我們就更有信心說曹老先生沒有寫後40回了。


老師指正


一、首先犯了一個初學者常犯的錯誤,即作者特徵的選取並不是完全獨立於隨後的分類的。實際上,作者特徵的選取方式對前八十回的著作是有bias的,因為前八十回比後四十回多出四十回,導致抽取出的高頻詞更有可能出現在前八十回中。一個更為合理的做法是,從一個獨立的詞庫中選取若干常用的詞作為特徵;或者,從前八十回中隨機抽出十回,從後四十回中也隨機抽出十回,用這一共二十回做且僅作特徵選取之用。其次作者在計算預測的準確率時犯了一個嚴重錯誤,就是把訓練集和測試集混在一起計算正確率了,這樣很明顯會高估實際的準確率。最後,和另外一部著作比較這部分分析沒有寫清楚,所用的特徵是基於這部著作重新選取的特徵還是原先基於紅樓夢的特徵?如果是基於紅樓夢的特徵,那麼另一部著作的預測準確率顯著低於紅樓夢的預測準確率是完全可以預期的,因為這種做法明顯對紅樓夢的預測準確率有bias。

二、


1. feature太少。曹雪芹用詞如此繁複華麗,最終提取features居然只有278個,還是按照“詞頻表”從高到低排列的,這對於“分析寫作風格”而言遠遠不夠——要知道我寫的一個大作業,自己爬Scopes來的,不提什麼“寫作風格”,只判斷真假,都要一萬多個dimension。


2. 沒有移除stop word。本來維度就不夠,裡面還夾雜著“於”,“也”這種類似於the, an, at這種stop words,這也是NLP裡一個不可忽視的錯誤;


3. “SVM最後給出了正確的label---> 寫作風格迥異--->label 1和label 0是兩個人寫的”這個邏輯鏈有嚴重問題,是對模型的過度解讀。


結果看上去不錯,我寧可相信有一些“關鍵詞”起到了特別重要的作用,比如前80回常出現而後面沒有的“秦可卿”,後40回常出現而前面不涉及的“抄家”,這種例子還有很多。


因為隨著故事情節推動,自然前80回與後40回的主要“事件”和“關鍵詞”都有所不同,很容易通過這些“關鍵詞”將前後標記出來,比如我們簡化到一維 :


y =1 - x1


其中x1是“抄家”是否出現,那麼這個一維的簡單模型很容易就把前80回和後40回分開了——但這遠遠不夠說明“語言風格”的區別,更無法證明“是否是一個作者”。


再試想一下,如果將《巴黎聖母院》的其它敘事章節,和第三卷“聖母院”和“巴黎鳥瞰”分別截取部分標記,或者《悲慘世界》的第四卷大革命和其它卷分別標記訓練,也很容易用SVM,decision tree等方法訓練出來,但你並不能說“巴黎鳥瞰”或者“大革命”不是雨果寫的——你只能說這一章節的內容和用詞和前後有很大的不同。



分享到:


相關文章: