【揭祕】紅樓夢後四十回到底是誰寫的?機器學習告訴你

七月線上實驗室發表於2018-04-18

流傳到今天的《紅樓夢》共有120回,很多人認為是曹雪芹寫了前八十回,後四十回是高鶚續寫。後來隨著新材料的發現,紅學界經過慎重考察,認為後四十回並不是高鶚所寫,高鶚和程偉元只是整理出版了《紅樓夢》。這究竟是怎麼回事?曹雪芹到底有沒有寫完《紅樓夢》?今天小七試試從機器學習的角度破解這個懸案。

原理

1. 每個人的寫作都有些小習慣,雖然文章前後說的內容會有差別,但是這些用詞的小習慣不容易改變;

2. 將紅樓夢120回通過統計方法轉換為向量,並打上是否為前八十回的標籤,之後從中抽取一小部分作為訓練集,剩下大部分為測試集;

3. 訓練集送入分類演算法進行學習,然後用此演算法放在測試集上檢驗;

4. 如果精度較高則表明前八十回和後四十回的寫作風格的確有所不同那麼就說明很可能是兩個人寫的。

本文選擇了“之”、“其”、“亦”等五十多個文言虛詞,加上紅樓夢中在所有120回中均有出現的部分詞語共同組成特徵值,這樣算下來一共有一百餘個詞,採用這些詞的出現頻率來作為特徵,最大程度地排除了情節的影響,某種程度上體現了寫作者的寫作風格。

選擇了常用的SVM演算法,用的語言是Python 3.5。

具體操作分成四步進行:

一、引入模組

開頭部分沒什麼過多可以說的,就是引入需要的模組,以scikit-learn的內容為主。HC這個模組裡面是自己寫的一些常用函式。

640?wx_fmt=png&wxfrom=5&wx_lazy=1

二、向量化

首先是讀取紅樓夢的文字,這個文字是在網上抓取的一個無脂批的紅樓夢120回版本,經過了一定預處理然後儲存下來的檔案。

之後呼叫了張華平博士開發的NLPIR漢語分詞系統,將所有文字進行分詞,然後收整合一個詞典。

下一步,將每一回均出現的詞加上五十餘個文言虛詞合併起來,作為特徵值。程式執行結果顯示最後作為特徵值的詞有138個。

將文字向量化的時候使用了最簡單粗暴的詞頻統計方法,一開始也試過tf-idf等方法將文字向量化,但是執行之後發現在本次應用裡其結果還沒有簡單的詞頻方法好。

640?wx_fmt=png

三、分類演算法

將120回隨機分成了兩部分,比例是0.8,也就是訓練集佔20%,24回,剩下的96回作為測試集。由於是文字分類任務,就直接把SVM的核定為線性核,然後用gridsearch搜尋一下引數C,得到一個最優化的引數。最後在測試集上驗證演算法。

640?wx_fmt=png

四、視覺化

為了有個直觀一些的印象,將138維的文字向量壓縮成2維並畫出來,降維過程採用的是PCA的方法。

640?wx_fmt=png

執行程式後,在測試集上得到了如下的驗證結果:


Precision

Recall

F1-score

Support

0

0.97

0.88

0.92

34

1

0.94

0.98

0.96

62

Avg

0.95

0.95

0.95

96

在驗證集上得到了0.95的平均f1值,效果還是不錯的。這也可以表明,前八十回和後四十回至少在寫作用詞習慣上是有所區別的,使用演算法可以很清楚地區分開。光看f1值有些抽象,可以考慮將高維的文字向量降維,然後畫出來,雖然會損失很多資訊,但是也可能有一些直觀的東西呈現出來。

將138維向量壓縮到2維之後得到的影象如下:

640?wx_fmt=png
其中藍色星形為前八十回,紅色十字為後四十回。可以看到,雖然經過了從138維到2維的劇烈壓縮,損失了大量資訊,但是仍然可以發現前八十回和後四十回沒完全重合,分佈有所區別。

依照如上方式,如果將紅樓夢分為三部分畫出來,可以得到:

640?wx_fmt=png
其中綠色圓形為前四十回,藍色星形為四十一至八十回,紅色十字為後四十回。同理,可以發現前四十回與四十一至八十回分佈基本上重合,也就是前八十回內部是比較均勻和相似的,而後四十回則是另一種分佈。


本文用機器學習的方法選取了一個很小的方面來對紅樓夢前八十回和後四十回的區別做了些探究,演算法並不複雜,結果還是比較明顯。由於用詞風格上存在明顯差異,我們有理由相信,《紅樓夢》後四十回,極有可能是他人假託曹雪芹之名的偽作!


老鐵們,你們用機器學習做過哪些有意思的實驗,快來留個言吧!


推薦閱讀

如何利用深度學習寫詩歌

用Python實現圖片的清晰掃描

用“深度學習”寫個老闆探測器(附原始碼)

書單 | 深度學習修煉祕籍 (文末贈書)

使用 Python 實現資料視覺化(完整程式碼)

640?wx_fmt=png

相關文章