通過數據挖掘能分析《紅樓夢》各回的真偽嗎?


紅樓夢沒有真偽的問題,主要是研究各章節是不是同一作者所寫。

據說早在二三十年前就有人用基於詞頻分析,指出前半部分和後半部分的用詞習慣相差很大,從一定程度上佐證後半部分是別人續寫。這個工作最早似乎日本人做過,不過在網上查一下可以看到一些國內近年研究這個問題的結果。如果有曹雪芹其它可靠的文本來源,還可以分析一下紅樓夢前半部分的用詞習慣是否和曹雪芹一致。

數據分析結果並不是一個充分的證據。如果前半部分和後半部分是同一作者所寫,但寫作時間相差幾十年,也有可能出現用詞習慣不一致的情況。


可以的。小智最近就嘗試通過用機器學習的方法,分析了一下紅樓夢後四十回的真偽。
以下內容引自小智的微信公眾號,轉載需申請授權。

----------------------------------------------------------------------------------------------------------------------

說到《紅樓夢》後四十回的真偽

文學界各位大佬爭論了兩百多年,有共識,卻沒有定論

小智也想班門弄斧一下

試試從理科的角度破解這個糾纏兩個多世紀的懸案

一般來說,每一段語言、文字都或多或少帶著對應人物形象的烙印

比如聽到「我想死你們了」,大概知道是馮鞏來了

「抽煙喝酒燙頭」那是于謙老師的標配

甚至有時候,一個群體也會有著固定的口頭禪或者說話習慣

(?_?) 圖文無關 (?_?)


基於這個理由,我們相信,如果紅樓夢前八十回與後四十回

由同一個作者書寫

那麼,他的用詞習慣,行文風格必然是統一的

反之,如果用詞存在明顯差異,就證明後四十回存在偽造嫌疑

小智的大致思路是將紅樓夢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.95的平均f1值,效果還是不錯的。這也可以表明,前八十回和後四十回至少在寫作用詞習慣上是有所區別的,使用演算法可以很清楚地區分開。光看f1值有些抽象,可以考慮將高維的文本向量降維,然後畫出來,雖然會損失很多信息,但是也可能有一些直觀的東西呈現出來。


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

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

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

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

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

想想紅學研究馬上又要多一顆冉冉升起的新星,

簡直是忍不住給自己點個 zan

Mu Hahaha~

http://weixin.qq.com/r/bzizq0vE7haRrQ-I9219 (二維碼自動識別)


前八十回和後四十回常用助詞的詞頻分析對比很早就有人做過了,呈現出有顯著差異的情況。這還是我小時候——約二十多年前——在《少年科學》上看到的。


可以。我嘗試做了下。

本文思路,(1),提取每一章關鍵詞權重並向量化。(2)K均值聚類。

首先,詞頻統計的方法有失偏頗,故用TF-IDF方法計算關鍵詞的權重。其次,分類的方法預設了標籤,是一種有監督學習模式,聚類是無監督學習模式,是根據數據自身特性進行「自動站隊」。私以為,區分《紅樓夢》前後不同用聚類的方法更有直觀且具有說服力。參見:

聚類與分類有什麼區別? - 徐凱的回答

TF-IDF:一種統計方法,用以評估一字詞對於一個文件集或一個語料庫中的其中一份文件的重要程度。字詞的重要性隨著它在文件中出現的次數成正比增加,但同時會隨著它在語料庫中出現的頻率成反比下降。(百科)


K-means演算法:是很典型的基於距離的聚類演算法,採用距離作為相似性的評價指標,即認為兩個對象的距離越近,其相似度就越大。該演算法認為簇是由距離靠近的對象組成的,因此把得到緊湊且獨立的簇作為最終目標。(百科)

運用工具:Python 2.7,Weka 3.8

1 特徵提取

1.1運用jieba進行分詞,提取每一章中的助詞,虛詞,形容詞和介詞,並計算此類詞在每一章中的TF_IDF權重。Jieba分詞是Python中文分片語件,可以對中文文本進行分詞,關鍵詞提取和詞性標註。

首先我想到的是,對全文進行分詞,再提取每個詞的TF-IDF權重。但這樣做有兩個缺點,一是數據太大,雜訊太多。這樣矢量化的文本有2萬多維,且有許多垃圾數據,比如,「寶玉」和「寶」,「玉」劃分成了三個詞。二是有些名詞,代詞的出現的確影響結果。例如,黛玉,這個詞,無論後四十回是不是續作,其出現的頻率也應該是比較低的。

不同作者所用助詞,虛詞,形容詞和介詞的用法多不同, 在jieba分詞中能對詞性進行標註,故我提取了文章中所有的上述詞型,並計算TF-IDF權重。得到1536個詞,組成120*1536的向量。

程序分兩部分,第一部分提取文章中上述詞型,組成詞庫。

第二部分計算每章中上述詞的TF-IDF權重。

PS:上述兩部分可寫在一起,但我沒這麼干,因為我比較懶···第二部分代碼借鑒於Python TF-IDF計算100份文檔關鍵詞權重

2,利用Weka進行K均值聚類。

WEKA:作為一個公開的數據挖掘工作平台,集合了大量能承擔數據挖掘任務的機器學習演算法,包括對數據進行預處理,分類,回歸、聚類、關聯規則以及在新的互動式界面上的可視化。(百科)

Weka的打開格式為arff,將得到的向量處理為arff格式。再進行k均值聚類。操作過程為,載入數據,選擇k均值聚類,聚類數設置為2類,選擇合適的seed(隨機種子),使均方差最小。下面是均方差較小時的聚類結果。

圖1 Numclusters=2, Seed=38,Sum of squared errors=3483時的聚類結果

聚類佔比為:

Clustered Instances

0 42 ( 35%)

1 78 ( 65%)

為了證明聚類結果的有效性,取聚類數為3時:

圖2 Numclusters=3,Seed=38,Sum of squared errors=3448時的聚類結果

聚類佔比為:

Clustered Instances

0 37 ( 31%)

1 74 ( 62%)

2 9 ( 8%)

3 結果分析

上兩圖橫軸代表回數,顯而易見,前八十回和後四十回屬於不同的類別,也就是《紅樓夢》後十四回很有可能是續作。在聚類數為3時,僅有8%被歸到第三類,這說明其餘兩類內部特徵相似性比較強,分為兩類是合適的。

4 不足及改進

由於分詞的不精確性,僅用抽取的部分特徵代替全局。

沒有對劉師傅續寫的進行分析····那樣結果應該更明顯。。


方法1:製造曹老師的人格模型。
方法2:語義單元切割習慣分析。(語言模型抽取)
也許是沒有價值的工作。不應該研究一個虛構的世界。作者完全可以隨意謀殺自己的角色。


反對所有認為數據分析能分出紅樓真偽的答案。

用電腦來數據分析文本真偽,好比通過測謊儀來分分析一個人是否講真話一樣不靠譜,說實話,測謊儀的有效性還比數據分析來得高,原因是,文本創作是包含極多維度的量子水平上的數據體現,它被壓縮成文字,給人造成一種可分析的錯覺,事實上,數據分析,最多只能分析詞頻多寡,由此來認定文本真偽,好比用電腦分析兩個人穿的服裝相似與否,來判斷這兩人是否屬於同一種族一樣不靠譜。


對某些領域的人早就不是新鮮東西了,不過可能演算法在一直持續改進,再把我了解的思路給大家解釋一下吧。
我們對某種具體的東西的文字描述(形容性的),比如一個蘋果,一朵花,在同一文化教育環境情況下成長的人,可能主要區別不是很大。但無關緊要的虛詞,標點,句子的長短等等,可能個人的習慣就差別很大,這種分析就是看文章在這些方面的表現是否接近,來判斷是否同一作者所寫。


關於紅樓夢作者的定量分析國內外都有人做過。
主要是根據作者的寫作風格(虛詞出現的頻率)來判斷每回的差異情況。
國外影響力較大的有:陳炳藻,從辭彙上的統計論《紅樓夢》的作者問題,「首屆國際《紅樓夢》研討會」(1980,美國威斯康星大學)
國內較為認可的版本是:李賢平,《紅樓夢》成書新說,復旦大學學報社科版,5(1987),3-16.
得出的結論各有千秋。


五六年前印象中有義大利學者做過這種分析,因為他們用這種工具分析過《聖經》的成文歷史,數學模型還是很有效的~~~~


推薦閱讀:

紅樓夢裡面,算不算是寶玉害死金釧的?

TAG:數據挖掘 | 紅樓夢小說 |