[机器学习] --- 红楼梦后四十回到底是谁写的?机器学习分析法
流傳到今天的《紅樓夢》共有120回,很多人認為是曹雪芹寫了前八十回,后四十回是高鶚續寫。后來隨著新材料的發現,紅學界經過慎重考察,認為后四十回并不是高鶚所寫,高鶚和程偉元只是整理出版了《紅樓夢》。這究竟是怎么回事?曹雪芹到底有沒有寫完《紅樓夢》?今天小七試試從機器學習的角度破解這個懸案。
原理
每個人的寫作都有些小習慣,雖然文章前后說的內容會有差別,但是這些用詞的小習慣不容易改變;
將紅樓夢120回通過統計方法轉換為向量,并打上是否為前八十回的標簽,之后從中抽取一小部分作為訓練集,剩下大部分為測試集;
訓練集送入分類算法進行學習,然后用此算法放在測試集上檢驗;
如果精度較高則表明前八十回和后四十回的寫作風格的確有所不同,那么就說明很可能是兩個人寫的。
本文選擇了“之”、“其”、“亦”等五十多個文言虛詞,加上紅樓夢中在所有120回中均有出現的部分詞語共同組成特征值,這樣算下來一共有一百余個詞,采用這些詞的出現頻率來作為特征,最大程度地排除了情節的影響,某種程度上體現了寫作者的寫作風格。
選擇了常用的SVM算法,用的語言是Python 3.5。
具體操作分成四步進行:
一、引入模塊
開頭部分沒什么過多可以說的,就是引入需要的模塊,以scikit-learn的內容為主。HC這個模塊里面是自己寫的一些常用函數。
二、向量化
首先是讀取紅樓夢的文本,這個文本是在網上抓取的一個無脂批的紅樓夢120回版本,經過了一定預處理然后保存下來的文件。
之后調用了張華平博士開發的NLPIR漢語分詞系統,將所有文本進行分詞,然后收集成一個詞典。
下一步,將每一回均出現的詞加上五十余個文言虛詞合并起來,作為特征值。程序運行結果顯示最后作為特征值的詞有138個。
將文本向量化的時候使用了最簡單粗暴的詞頻統計方法,一開始也試過tf-idf等方法將文本向量化,但是運行之后發現在本次應用里其結果還沒有簡單的詞頻方法好。
三、分類算法
將120回隨機分成了兩部分,比例是0.8,也就是訓練集占20%,24回,剩下的96回作為測試集。由于是文本分類任務,就直接把SVM的核定為線性核,然后用gridsearch搜索一下參數C,得到一個最優化的參數。最后在測試集上驗證算法。
四、可視化
為了有個直觀一些的印象,將138維的文本向量壓縮成2維并畫出來,降維過程采用的是PCA的方法。
運行程序后,在測試集上得到了如下的驗證結果:
| 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維的劇烈壓縮,損失了大量信息,但是仍然可以發現前八十回和后四十回沒完全重合,分布有所區別。
依照如上方式,如果將紅樓夢分為三部分畫出來,可以得到:
其中綠色圓形為前四十回,藍色星形為四十一至八十回,紅色十字為后四十回。同理,可以發現前四十回與四十一至八十回分布基本上重合,也就是前八十回內部是比較均勻和相似的,而后四十回則是另一種分布。
小結
本文用機器學習的方法選取了一個很小的方面來對紅樓夢前八十回和后四十回的區別做了些探究,算法并不復雜,結果還是比較明顯。由于用詞風格上存在明顯差異,我們有理由相信,《紅樓夢》后四十回,極有可能是他人假托曹雪芹之名的偽作!
總結
以上是生活随笔為你收集整理的[机器学习] --- 红楼梦后四十回到底是谁写的?机器学习分析法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Unity 之 手把手教你实现自己Uni
- 下一篇: 【Excel】excel使用VLOOKU