iT邦幫忙

4

轉:《紅樓夢》後40回到底是不是曹雪芹寫的?

很有趣的一篇文章,算是以iT的角度做分析驗證。

原文

數位時代繁體版

什麼是SVM

前幾天燈神給我發了一篇文章,講的是用機器學習的方式來判定紅樓夢後40回到底是不是曹雪芹寫的。

圖說明
黛玉重建桃花社
黛玉重建桃花社。畫家孫溫。圖片來自:Wikipedia

我這段時間也在自學Andrew Ng的機器學習課程,還差4週就能完成課程了。

電腦是一個很強調learning by doing的學科,於是我也來「學以致用」,用剛學到的SVM演算法來分析下雪芹老師到底有沒有寫後面的40回。

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

受到《獵人》裡蟻王破解會長無敵招數的啟發,每個人的寫作都有些小習慣,雖然文章前後說的內容會有差別,但是這些用詞的小習慣不容易改變;

用開源的分詞工具把全書分詞(python的jieba分詞),然後統計詞頻。把出現頻率超過100次的詞語找出來,人工去掉一些可能因為文章內容造成前後出現不一致的人名、地名;

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

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

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

好了,下面我儘量少涉及數學跟程式設計的知識,來一步步解讀機器學習是怎麼完成這個問題的。

生成全書的詞頻表
圖說明

我截取了其中一段的詞頻表。像寶二爺、黛玉笑這種涉及人物的詞語,可能前面戲份多、後面戲份少,所以就不選它們作為用詞習慣的特徵,而像忽然、故、只要、可不是這種承接性質的碎詞,就不太容易會受情節的影響,所以適合選出來作為用詞習慣的特徵。

最終,我按照出現從多到少排序,選擇了278個詞作為機器學習的用詞習慣。

將120回的詞頻進行統計
接下來我把每一回出現這278個詞的頻率統計出來,得到我們給機器學習的樣本。這個樣本的樣子大概是這樣的:

圖說明

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

通常我們在進行複雜的事情前,喜歡先簡化問題,或者給自己一些直觀的圖表,以便瞭解問題。機器學習也是一樣的。

我嘗試著在圖上把前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部的用詞習慣。

你可能會說,雖然中間交叉的地方比較多,但是還是可以看出來是有區分的。

可如果你比對一下跟紅樓夢的圖,你就會發現紅樓夢的差別會明顯得多。

圖說明

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

所以,我們用「三國演義」這個旁證來分析,即便是因為情節需要導致的用詞習慣差別也不應該這麼大。

所以,我們就更有信心說曹老先生沒有寫後40回了。

更多的機器學習有趣的玩法,我會在學習的過程中慢慢嘗試的。以上。


0
darkslayer
iT邦好手 1 級 ‧ 2016-07-13 11:47:11

個人覺得少做了一個習慣用辭的變化分析.
人會隨著年紀或者生活經歷而改變一些習慣, 用詞也是如此.
今天很用後四十章作切點的原因為和我並不清楚, 但如果作者在後五十章開始因為某些原因而逐漸改變習慣用辭的話, 那用後四十章作為切點就會有很明顯的差異. 所以要做一個用詞變化的分析, 如果是漸變那就不能證明是換個作者, 如果是在第後四十章就劇變那還可以懷疑(僅能懷疑或推論)是換了個作者...

自從讀了研究所以後, 看到此類的東東疑心病都重了起來, 原因是為了畢業, 很多paper的結論都迎合刊登期刊而做調整. 以特定的研究區間做為調整是最簡單的方式之一, 同一種分析方式對應到不同的區間, 結果是差很大的...

0
danielp2
iT邦新手 4 級 ‧ 2016-07-13 17:01:21

其實有沒有機會是三國演義不是本人寫, 三國演義是歷史為主, 文筆比較公式化。

如果紅樓夢不是本人寫, 三國演義又是否本人寫呢?

要更多資料先知個圖形是否正確。

而且, 我個人單單睇圖, 發現左中右都有點, 後40話比較偏右, 但1-120話也不是一面倒偏左, 反而好像慢慢由左變向右, 一個人慢慢變化的感覺

0
danielp2
iT邦新手 4 級 ‧ 2016-07-13 17:01:22

其實有沒有機會是三國演義不是本人寫, 三國演義是歷史為主, 文筆比較公式化。

如果紅樓夢不是本人寫, 三國演義又是否本人寫呢?

要更多資料先知個圖形是否正確。

而且, 我個人單單睇圖, 發現左中右都有點, 後40話比較偏右, 但1-120話也不是一面倒偏左, 反而好像慢慢由左變向右, 一個人慢慢變化的感覺

0
kk8606
iT邦新手 5 級 ‧ 2016-07-19 09:15:49

能寫程式用數學理論演算小說的某些真意, 本身就值得敬佩!

這也算是大數據吧!

我要留言

立即登入留言