用機器學習的方法鑒別紅樓夢作者
在學界一般認為,《紅樓夢》后 40 回并非曹雪芹所著。本文嘗試應用機器學習的方法來分析原著文本中作者的用詞習慣,從技術角度去說明《紅樓夢》前 80 回和后 40 回的寫作風格差別,繼而可以確認后 40 回非原作者所寫。
項目存放在 reality-of-Dream-of-Red-Mansions 。
主要原理
每個作者寫作都有自己的用詞習慣和風格,即使是故意模仿也會留下很多痕跡。
在文言文中,文言虛詞分布均勻,書中每個回目都會出現很多文言虛詞,差別在于出現頻率不同,我們把文言虛詞的出現頻率作為特征。
不只文言虛詞,還有其他的詞在所有回目中出現頻率很多。比如對第 80 回進行詞頻統計,得到
了 172 的 142 我 70 寶玉 65 你 61 道 54 他 51 也 50 著 48 是 40 說 38
這些高頻詞匯也可以作為特征向量。
本文將 20~29 回(詩詞曲比較均衡)作為類別 1 的學習樣本,將 110~119 回作為類別 2 的學習樣本。
將兩個類別的特征向量輸入到 SVM(支持向量機) 進行訓練得出一個分類模型。再對剩余回目進行分類,看它們分別偏向于哪個類別。
SVM 相關原理參見 NG 的公開課 Machine Learning 和 scikit-learn 庫
相關學術論文參見
施建軍. (2011). 基于支持向量機技術的《 紅樓夢》 作者研究. 紅樓夢學刊, (5), 35-52.
李賢平. (1978).《紅樓夢》成書新說. 復旦學報(社會科學版).
特征選取
[ '之', '其', '或', '亦', '方', '于', '即', '皆', '因', '仍', '故', '尚', '呢', '了', '的', '著', '一', '不', '乃', '呀', '嗎', '咧', '啊', '把', '讓', '向', '往', '是', '在', '越', '再', '更', '比', '很', '偏', '別', '好', '可', '便', '就', '但', '兒', # 42 個文言虛詞 '又', '也', '都', '要', # 高頻副詞 '這', '那', '你', '我', '他' # 高頻代詞 '來', '去', '道', '笑', '說' #高頻動詞 ]
選取常用的 42 個文言虛詞和通過詞頻統計得到的高頻使用的詞作為特征,分別計算它們在各個回目中出現的頻率作為特征向量。
在源碼中由 modelBuilder.py 中的 build_feature_vector 函數實現。
目錄結構
. ├── README.md ├── textProcesser.py # 文本處理 ├── modelBuilder.py # 模型建立 ├── decisionMaker.py # 作出判斷 ├── neg_trainset.npy # 正例訓練集 ├── pos_trainset.npy # 負例訓練集 ├── trainset.npy # 訓練集 ├── testset.npy # 測試集 ├── text │ ├── redmansions.txt # 原著文本 │ ├── chapter-1 # 按章分開,第一章 │ ├── chapter-n │ ├── chapter-words-1 # 第一章分詞結果 │ ├── chapter-words-n │ ├── chapter-wordcount-1 # 第一章詞頻統計結果 │ └── chapter-wordcount-n
使用步驟
- 運行 textProcesser.py ,將原著文本分為章節,分詞,詞頻統計
- 運行 modelBuilder.py ,對文本章節提取特征向量,建立分類模型
- 運行 decisionMaker.py ,對文本進行分類
結論
1~80 [ 1. 1. 1. 1. 1. 2. 2. 1. 1. 2.
- 1.]
81~120 [ 1. 1. 2. 1. 1. 2. 2. 1. 1. 2.
- 2.]</pre>
1 指該回目屬于類別 1,2 指該回目屬于類別 2。
可以得出結論
- 前 80 回屬于一類,后 40 回屬于一類
- 80 回左右是分界點
- 后 40 回風格不同于前 80 回
81~120 回中有一些被分成了 1 類,這與特征選取有關,還與使用的原著版本有關。這里的版本是網上下的電子版,版本不明,建議使用人民文學出版社 1982 年出版的《紅樓夢》作為研究對象。
1~80 回有一些被分成了 2 類,可能是后 40 回作者在續寫過程中對部分章節進行了修改。
參考