【揭祕】紅樓夢後四十回到底是誰寫的?機器學習告訴你
流傳到今天的《紅樓夢》共有120回,很多人認為是曹雪芹寫了前八十回,後四十回是高鶚續寫。後來隨著新材料的發現,紅學界經過慎重考察,認為後四十回並不是高鶚所寫,高鶚和程偉元只是整理出版了《紅樓夢》。這究竟是怎麼回事?曹雪芹到底有沒有寫完《紅樓夢》?今天小七試試從機器學習的角度破解這個懸案。
本文選擇了“之”、“其”、“亦”等五十多個文言虛詞,加上紅樓夢中在所有120回中均有出現的部分詞語共同組成特徵值,這樣算下來一共有一百餘個詞,採用這些詞的出現頻率來作為特徵,最大程度地排除了情節的影響,某種程度上體現了寫作者的寫作風格。原理
1. 每個人的寫作都有些小習慣,雖然文章前後說的內容會有差別,但是這些用詞的小習慣不容易改變;
2. 將紅樓夢120回通過統計方法轉換為向量,並打上是否為前八十回的標籤,之後從中抽取一小部分作為訓練集,剩下大部分為測試集;
3. 訓練集送入分類演算法進行學習,然後用此演算法放在測試集上檢驗;
4. 如果精度較高則表明前八十回和後四十回的寫作風格的確有所不同,那麼就說明很可能是兩個人寫的。
選擇了常用的SVM演算法,用的語言是Python 3.5。
具體操作分成四步進行:
一、引入模組
開頭部分沒什麼過多可以說的,就是引入需要的模組,以scikit-learn的內容為主。HC這個模組裡面是自己寫的一些常用函式。
二、向量化
首先是讀取紅樓夢的文字,這個文字是在網上抓取的一個無脂批的紅樓夢120回版本,經過了一定預處理然後儲存下來的檔案。
之後呼叫了張華平博士開發的NLPIR漢語分詞系統,將所有文字進行分詞,然後收整合一個詞典。
下一步,將每一回均出現的詞加上五十餘個文言虛詞合併起來,作為特徵值。程式執行結果顯示最後作為特徵值的詞有138個。
將文字向量化的時候使用了最簡單粗暴的詞頻統計方法,一開始也試過tf-idf等方法將文字向量化,但是執行之後發現在本次應用裡其結果還沒有簡單的詞頻方法好。
三、分類演算法
將120回隨機分成了兩部分,比例是0.8,也就是訓練集佔20%,24回,剩下的96回作為測試集。由於是文字分類任務,就直接把SVM的核定為線性核,然後用gridsearch搜尋一下引數C,得到一個最優化的引數。最後在測試集上驗證演算法。
四、視覺化
為了有個直觀一些的印象,將138維的文字向量壓縮成2維並畫出來,降維過程採用的是PCA的方法。
執行程式後,在測試集上得到了如下的驗證結果:
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維之後得到的影象如下:
其中藍色星形為前八十回,紅色十字為後四十回。可以看到,雖然經過了從138維到2維的劇烈壓縮,損失了大量資訊,但是仍然可以發現前八十回和後四十回沒完全重合,分佈有所區別。
依照如上方式,如果將紅樓夢分為三部分畫出來,可以得到:
其中綠色圓形為前四十回,藍色星形為四十一至八十回,紅色十字為後四十回。同理,可以發現前四十回與四十一至八十回分佈基本上重合,也就是前八十回內部是比較均勻和相似的,而後四十回則是另一種分佈。
本文用機器學習的方法選取了一個很小的方面來對紅樓夢前八十回和後四十回的區別做了些探究,演算法並不複雜,結果還是比較明顯。由於用詞風格上存在明顯差異,我們有理由相信,《紅樓夢》後四十回,極有可能是他人假託曹雪芹之名的偽作!
老鐵們,你們用機器學習做過哪些有意思的實驗,快來留個言吧!
★推薦閱讀★
相關文章
- 用大白話告訴你 :Java 後端到底是在做什麼?Java後端
- 讓機器學習告訴你,你的siri在想什麼!機器學習
- 用大白話告訴你,Java到底是什麼Java
- 誰告訴你 Flutter 會幹掉原生開發?Flutter
- 揭祕FACEBOOK未來的機器學習平臺機器學習
- 為你揭祕小程式音視訊背後的故事......
- 大資料教父Micheal Stonebraker告訴你大資料的祕密大資料
- 揭祕Stripe欺詐檢測系統背後的機器學習演算法 - quastor機器學習演算法AST
- Azure帶你揭祕出海爆款遊戲後面的雲科技遊戲
- 悄悄告訴你:React18文件裡寫錯的地方React
- 大資料告訴你:下一代汽車的忠粉是誰大資料
- 機器學習中特徵選擇怎麼做?這篇文章告訴你機器學習特徵
- 實在RPA告訴你一個處理金融工作的小祕密。
- 你該知道的《css揭祕》--形狀篇CSS
- 上半年誰是利潤大戶?誰是虧損王?這份60+遊戲公司財報為你揭祕遊戲
- 集合:安卓開發中怎麼注意細節?一文告訴你四十個安卓
- 大資料教父Michael Stonebraker告訴你大資料的祕密(附下載)大資料
- 揭祕.NET Core剪裁器背後的技術
- Google塗鴉幕後團隊揭祕Go
- java中的NIO和IO到底是什麼區別?20個問題告訴你答案Java
- 不敢閱讀 npm 包原始碼?帶你揭祕 taro init 背後的哲學NPM原始碼
- java面試官:程式設計師,請你告訴我是誰把公司面試題洩露給你的?Java程式設計師面試題
- 噓!這有幾條沒人會告訴你的資料科學求職祕密資料科學求職
- 從零開始的Android新專案(3):誰告訴你MVP和MVVM是互斥的AndroidMVPMVVM
- 揭祕電子遊戲背後音效製作的故事遊戲
- 你該知道的《css揭祕》--背景與邊框篇CSS
- 資料告訴你,胡歌的微世界
- 誰能告訴我spring中bean的裝載過程,SpringBean
- 使用祕笈大公開 揭祕你不知道的瑞星安全隨身WiFiWiFi
- 快取與庫先寫哪個,這十幾張圖告訴你快取
- 漲知識了!Wi-Fi背後的原理揭祕!
- 揭祕 · 外賣系統背後的AI人工智慧AI人工智慧
- 揭祕全球最大網站Facebook背後的那些軟體網站
- 揭祕大資料玩家eBay:猜出你的購買慾大資料
- 你真的瞭解你的團隊嗎? ONA告訴你真相
- 揭祕 Netflix 後端工程師面試後端工程師面試
- 鮮為人知的開源系統Contiki,告訴你誰是物聯網時代的先驅
- Adam E McCann:大資料揭祕《權力的遊戲》裡誰的戲份最多大資料遊戲