《紅樓夢》的作者有多少個,數據分析帶你來探索
十多年前吧,我們幾個小夥伴還是一起組隊參賽「挑戰杯」的時候,我們隊裡面有個統計系的前輩跟我們分享了一個關於統計學應用在文學中的一個案例。
這個是關於通過統計學判斷《紅樓夢》的兩個作者是誰的事情。
我們都在讀書的時候學過《紅樓夢》的作者有兩個!曹雪芹寫了前80回,高鶚續寫了後40回。不過我讀書那會兒從來就沒懷疑過,因為老師說的都是權威的嘛。然而,紅學上關於《紅樓夢》的作者爭議一直很大,存在著很多種版本。這裡俺就不去像紅學家們做很深入的研究了,畢竟俺是數據分析師,不是漢語言文學的研究者。
話說回來,我相信讀過《紅樓夢》的人可能都感覺的出,前80回和後40回從文筆上是有些差距的,但這種差距也不至於是狗尾續貂。而我在寫本文而收集素材的時候,不停的複製+粘貼電子版的紅樓夢各章節時,也發覺越到後面的章節,詩詞越少甚至沒有了。因此,直觀上也感覺有那麼一點意思。
統計學家則不是依靠直覺做判斷。曾經有統計學家試圖從一個作家的虛詞使用分布上去做甄別《紅樓夢》的作者。首先,統計學家通過虛詞的分布,證明了前80回和後40回是存在顯著性差異的,說明確實是來自於兩個不同的作者。然後,再通過曹雪芹和高鶚在出版《紅樓夢》相關章節之前和之後的文章的虛詞分布做比對,發現最終在統計上能說明《紅樓夢》是曹雪芹和高鶚兩個作者。
但是前輩和我們說,從後40回的詳細分析來看,統計學家還發現可能還不止高鶚一個人寫的,或許存在第3個作者!
前輩的這個案例的分享,在當時無疑對我增添對統計學的興趣愛好之熊熊烈火火,又加了一把乾柴。
時光荏苒,時隔多年我在知乎上又看到了這個老話題。
不過知乎上涉及的內容,得益於現在數據分析方法工具的日益豐富,有好多人用更多的新方法例如主成分分析法,用SVM,用聚類分析都做了相似的研究。
看到大家都那麼有熱情用數據分析的工具來搞搞小研究,正好撓到我的癢處!我也打算嘗試過下小癮,我也來試試看,《紅樓夢》的作者通過數據分析的方法能不能用識別出來到底是多少個人。
首先第一步,你得有一個電子版的,可用於分析的《紅樓夢》。於是我就上網從電子書下載的網站上,找一篇下載量比較靠前的TXT格式的《紅樓夢》。這個電子版紅樓夢我試著讀了幾個章節,沒有那種劣質讀本錯別字、漏字語句不順的現象。而且和1982年經典版本的《紅樓夢》總字數非常接近。算是沒有糟蹋這次的研究吧。
接下來要做的事情並不是說馬上去做分析研究,而是要認真想一想前人他們做研究時的一個假設,到底是不是有道理。什麼假設呢?那就是「作家的作品中,虛詞分布有其獨特性,是相當難模仿出來的,因此可以作為分辨作者身份的參照物(或者說文學指紋)」。
我發現在知乎裡面,這個假設幾乎是所有分析的人都默認的,然而就是沒有人能夠站出來說這個假設是合理的。
那虛詞是啥,就是區別於實詞的。搜了一下資料,大眾對虛詞的認識有2個共同點:一是虛詞必須依附於實詞或語句,來表達或豐富語法意義;二是虛詞不能單獨成句,不能單獨作句法成分。
由於我不是學語言文學的,所以我也沒辦法從漢語言文學的理論角度上去證明這個假設。不過我就想嘗試著從邏輯上,從現實的感知上看能不能說得過去。因為「每個作家作品中虛詞使用是有其獨特性」的這個假設,那麼多的人都認為它有道理,我想必然有他合理的地方。我歸納了一下,大致原因有3個:
1. 每個作家都是生長在一個獨特的環境的,這種環境對作家語言的影響是非常的深遠,因此形成的虛詞使用習慣也非常獨特。
最具典型的特點就是方言環境,讓虛詞對語句的影響最明顯。舉個例子,普通話裡面「看完報紙後他挺難過的」, 「挺」這個時候就是虛詞,作為副詞用,表示「非常地」。要是這句話換成東北小品的作品的話,就會變成「看完報紙後他老難過了」,這個時候東北方言「老」代替了「挺」;而要是作者是個廣西人,那麼可能這句話就變成了「看完報紙後他蠻難過的」,此時「蠻」代替了「挺」;若作者是個廣東人,那麼就會變成「看完報紙後他幾難過」,此時「幾」就替代了「挺」……,例子太多了。
而且,同一個作家即便寫作對象變了,虛詞的使用習慣和很難改變。例如還是剛才的例子,那個廣西的作家即便是將句子換成「看完報紙後他蠻高興的」,或者「看完電影后他蠻多牢騷的」,「看完廣告後他蠻……的」,「蠻」這個虛詞是很難從他的用詞習慣中甩掉的。
虛詞除了選擇有獨特性外,虛詞在句子中使用的位置每個人都不一樣。比方說, 「他時不時用手擦擦汗」和「他用手時不時擦擦汗」,意思就是一樣的,但「時不時」的位置就不一樣。不同人寫作習慣不同,對虛詞的位置使用習慣也是不同的。
除去剛才所說的作家生長語言環境的獨特性外,再加上每個作家所處的時代、本身的閱歷、受教育程度、人生重要事件經歷又各自不同,因此其使用虛詞的習慣必然是獨特的,也是很難模仿的。
2.虛詞不受情節的影響,這點是和實詞相比最大的優勢。寫一本小說,如果我們統計實詞的話,很容易被情節所干擾,因為實詞構成了情節。比方說《水滸傳》裡面,武松因為打過老虎,因此在寫關於他在景陽岡的那段情節中,「大蟲」這個實詞就會出現的比較多;但如果寫到其他情節時,甚至些其他章節時,因為情節沒有打虎的需要了,「大蟲」這個實詞又不見了,或者很少出現。頂多被「母大蟲」這個綽號中的「大蟲」給統計進去。
這樣一來,在某些實詞構成的情節中,其頻率就會高發,反之就幾乎統計不到,容易產生一個窘境:同一個作家,因為不同的章節和不同的小說情節差異大,相同的實詞分布也就會差異很大。這樣一來非常難判斷出這篇文章到底是不是這個作者寫的。
而虛詞則不同,無論情節如何發展,作者都必然的要用他習慣的虛詞來表述或補充人物或事件的一些行為、思想和事件的發展。而虛詞又只是補充或修飾實詞的,它們如果丟失或取消掉,對情節的事實或主幹影響很小,有時候微乎其微。
舉個最簡單的例子,佛教禪宗六祖慧能在評價2個和尚「風動還是幡動」爭論時,說的「既不是風動,也不是幡動,而是你們的心動罷了」這句話中,我們去掉「而」、「罷了」這2個虛詞,原句的意思沒受半點影響。
3.虛詞數比實詞數量少很多,統計起來工作量小。在文言文中,虛詞常用的有18-20個,常用實詞超過120個;現代漢語中(算上白話文這個近親吧),根據1998年上海辭書出版社出版的《現代漢語虛詞詞典》來統計的話,約800多個。而實詞如果我們做個不太精確的估算,按商務印書館2012年出版的《現代漢語詞典 第六版》收錄6.9萬個詞來算,減去800多個虛詞,也就是說實詞就超過6.8萬個!因此,虛詞的分布對統計計算而言,大大減少了計算量。
以上虛詞的3個特點,也被前人用來做過對照實驗,發現對於甄別作者來說效果不錯。比方說李賢平就試過將《兒女英雄傳》的某些章節混進《紅樓夢》的部分章節中,結果一統計虛詞的分布,就分析出這些章節不是同一個作者。
好,剛才我們分析完了「每個作家作品中虛詞使用是有其獨特性」的這個假設,發現從邏輯上和實際感知上都是很合理的,或者說沒有很大的反對意見的話,接下來我們就要選擇要分析的虛詞了。
《紅樓夢》是誕生於雍正時期,從文風上來看算不上很文言文,初中生都能讀的了。但和現代漢語的小說比起來,又沒那麼「現代化」,也有很多之乎者也。因此,我們姑且先把其當成一個白話文來對待,先按文言文常用的虛詞外加白話文中常見的虛詞來做下嘗試。
常用的文言虛詞包括:於、也、而、乎、以、所、與、者、何、為、因、乃、則、其、若、之、焉、然、矣。
而白話文中常用的虛詞有或、亦、方、即、皆、仍、故、尚、呀、嗎、咧、罷、么、呢、讓、向、往、就、但、越、再、更、很、偏等等。
確定了要分析對象後,接下來,從「簡書」網站上下載了一個可以統計字、詞的小工具軟體,然後老老實實的將電子版的《紅樓夢》按照120回進行切割,切割成了120個獨立的txt文檔。然後將這120回分別用這個小工具統計了這些虛詞在每個章節出現的頻率。
接下來,就是數據分析師的角色登場了。
一、基礎統計的分析
剛剛把這些虛詞統計完的時候,我粗略的瀏覽了下,有個比較極端的情況出現了:「嗎」和「咧」這2個做句尾修飾語氣的虛詞,居然幾乎只出現在80回之後!
當然啦,極端不代表全貌嘛!我先將全文分成2類,前80回和後40回;以及前40回、中40回、後40回兩種場景。由於這些虛詞我用正態性檢驗檢查過,1/3的虛詞在全文的分布都不是正態總體,因此用均值和標準差來做分析不適合,於是我通過非參數檢驗來做一下探索。
對於第一種分類場景,採用Mann-whiney U 檢驗,對於第二種分類場景,採用Kruskal-Wallis檢驗和Mann-whiney U 檢驗,分析的結果如下
非參數檢驗的結果我們看到,後40回無論是和前80回做比較,還是和1-40回,41至80回做比較,只有30%不到的虛詞分布差異不顯著,而更多虛詞都指向了差異顯著的結論。所以在這裡可以推斷,最後的40回應該是一個獨立的作者。
那前80回分拆成2部分來看,1-40和41-80回並沒有多少虛詞支持差異顯著。可以說明前80回是另一個作者完整寫完的。因此《紅樓夢》由2個作者寫成的結論,從非參數檢驗來看是可以成立的。
二、聚類分析
聚類分析我用的純探索式聚類。因為我也不知道最終哪些章節會明顯的聚集在一起。
原理思路簡介如下:
44個不同虛詞,可以作為識別各個章節是否屬於某一個作者的44個判斷維度;
而不同虛詞在每個章節的頻數,就成為每個章節的各個特徵指標。
因此,我的數據表的列向量,表示的是每個虛詞在120個章節的出現頻數,故我採用的是聚類分析中是對各個章節為個案的「個案」聚類。或者叫做Q型聚類。
我按照歐式距離、歐式距離平方、夾角餘弦三種聚類法來試試,同時也對原數據按不處理、以及0-1歸一化處理分別來嘗試。因為譜系圖太大了,不好全部都粘貼過來,因此我總結一下分析的結果。
總的來說呢,一百個人看莎士比亞,就會有100個哈姆雷特。從這些譜系圖來看,你可以按照先入為主的觀點來解讀,也可以按一些新的觀點來解讀。但我發現都能說得過去。
首先,我實在是沒辦法不按既有觀點來看這個分析結果,因為在腦海里都20年的灌輸結果,不這麼想還真感覺不太自然哩,呵呵。因此,三種聚類法顯示1-80回和81-120回之間確實有比較清晰的界限。也就是說前80回的章節會比較少地和後40回的章節聚成一類。往往都是前80回的章節聚成幾個小類,後40回的章節聚成幾個小類。
無論是原始數據還是做0-1歸一化處理,結論和上面差不多。唯一的差別就是用0-1歸一化後,聚類的效果更明顯,聚類的層次要少一些;用原始數據聚類,更多的先聚成很多小類,然後才慢慢匯聚成大類,聚類的層次要多一些。某些章節的聚類歸屬也有些許差異。
其次,讓我說說新的觀點,就是《紅樓夢》可能是若干作者共同修改或編纂的。這個觀點其實是參考李賢平的觀點。
因為從譜系圖來看,並沒有展現出我們想看到的那種,前80回的章節呼的一聲像聽到哨子立刻就集合在了一起,後40回也在聽到哨聲後馬上站成一堆。而是若干不同的章節先匯聚成一些小類,然後這些小類再匯聚成中等的類簇。這個過程還比較長,至少在第8次聚類的時候才明顯看出某些類簇比較集中。
到了第20次的時候,這些聚類才彙集成少數幾個大類。李賢平的觀點是說,正因為作者很多,所以才會出現這樣的層次聚類過程。當然了,他還列舉了其他考證的證據來支持他的觀點。
但儘管如此,不知道是否湊巧,偏偏前80回的章節和後40回的章節,他們確實比較少有交集。
下面我就隨便選一個夾角餘弦做聚類的方法,0-1歸一化的譜系圖給大家解解饞。其中圖中的C119,代表的是章節119。大家看看,自己心中的「哈姆雷特」是長啥樣吧!
三、主成分分析
說到主成分分析法在這方面的應用,其實一開始我看到前人有人拿來用,我內心還是有些犯嘀咕的。因為用主成分的原理,是各個章節的虛詞的出現頻率有相關性。這樣,才有可能將有相關關係的幾個章節變成一個主成分。
但是前面已經說過了,虛詞有個優勢就是它的出現和情節無關,那麼隨著小說情節的變化,它的出現頻率應該是比較穩定的或變化小的。這樣一來,不同章節之間的虛詞出現的頻率不就是沒啥相關性了嗎?
可我看到知乎和一些論文裡面,強調說主成分分析法分析到不同作者之間的虛詞差異,那到底他們是如何辦到的呢?於是我就用這些虛詞在各章節的出現頻率使用了一把。
同樣還是探索式的分析,我把所有章節作為變數進行主成分分析來看,信息比較集中在2-3個主成分上。前2個主成分能解釋86%以上的信息;為了進一步分析主成分,我將主成分的軸進行旋轉後,發現3個主成分,能解釋88%的信息,並且每個主成分的特徵值突變的沒那麼嚴重了。
從以上的計算來說,《紅樓夢》所有章節,大致可以分成2大類和3大類,換句話是說作者可能是2個或3個。那這些作者是寫了那些章節呢,當我們打開各主成分來看,得到的結論和聚類分析還是有比較大的差異。
PS: 我採用的旋轉法是Kaiser 標準化的正交旋轉法。每個主成分裡面各個變數(章節)之間的荷載,我按照 >0.6 才認為是顯著荷載,並將之進行歸類。
具體的計算結果如下:
從上面的分析來看:如果按未旋轉前的主成分來看,前2個類的章節,只有少數幾個屬前80回的章節屬於於第二類外,絕大部分章節屬於第一類。
而觀察旋轉了主成分軸之後,第2類和第3類的章節,都在前80回里,而第一類的章節涵蓋了全文幾乎70%。
這麼說來,推論得到《紅樓夢》應該還是有一個主要的作者,其他的作者要麼補充,要麼改編、修訂、增補。
這個結論倒是和高鶚自己在《蘭墅序跋》和《新鐫全部繡像紅樓夢》萃文書屋乾隆辛亥刊本卷首中所說的那樣有些能說得通:
「予聞《紅樓夢》膾炙人口者,幾廿余年,然無全璧,無定本。……書中前八十回鈔本,各家互異;今廣集核勘,准情酌理,補遺訂訛。」
……書中後四十回,系就歷年所得,集腋成裘,更無它本可考。惟按其前後關照者,略為修輯,使其有應接而無矛盾。
那這個主要的作者是誰呢?應該還是曹雪芹,但高鶚,他(或許是他召集眾人)對全文做了收集、校勘、整理。後面對負責編纂時自己又對部分的章節做了修訂。才會有《紅樓夢》的全文面世
呵呵,是不是我自己又多刻畫了一個「哈姆雷特」呢?!
四、神經網路分析
上面幾個方法,都是傳統的偏統計領域的方法,都還是可以解釋的。但是神經網路則沒那麼容易被解釋。不過在很多非線性的模擬來看,效果又比較好。
所以本次我還是嘗試使用了一下。我採用的是多層感知器來做分析,也就是通過神經網路對各個章節進行訓練,看看能否在既定的分類基礎上,支持2個作者分別撰寫前80回和後40回的猜想。因為分類這種分析方法用於做探索分析不太合適,或者說做不了。
多層感知器的參數設計簡單介紹下:
1、將前80回的章節標記為1,後40回章章節標記為2
2、然後將80回和後40回的章節順序打亂,同步的這些虛詞在這些章節裡面的頻數也跟著走,並且對虛詞頻數進行標準化。
3、抽取70%的章節做訓練,30%的章節做測試,目的就是要看測試的那部分章節判斷,和已有認識是否相同。比方說測試集那部分的章節的既定分類,和訓練出的結果一致的話,那麼說明這前80回和後40回的觀點,還是真的能成立。
4、激活函數,隱藏層和輸出層我分別採用雙曲正切,softmax,以及sigmoid函數,反正都嘗試了一下;
5、分別誤差平方和,交叉熵作分別為監督學習的原則
6、訓練方法採用批處理法;
7、分別嘗試採用梯度下降法和共軛梯度下降來處理梯度優化;
8、初始學習率為0.1,0.2……0.6都嘗試一下;
然後,機器就開始訓練了……,不停的調參也開始了
最終訓練的結果最好的情況下,參數如下:
隱藏層數為1層,隱藏層中有3個神經元;隱藏層的激活函數是雙曲正切;
輸出層的激活函數是softmax,採用交叉熵最小原則。
不過,神經網路訓練的結果有個特點,就是不穩定。例如,隱藏層的神經元的權值只要達到閾值就可以往下傳遞,那麼這個「達到閾值」可不是每次的情況都一樣的。比方說這次比閾值高5%,下次比閾值高3%,都能往後傳遞。因此同樣參數設定下,每次的結果都不能重複。只能說穩定保持在某個水平左右。
那麼在我保持上面參數不變的情況,多層感知器訓練結果就是穩定在93%-98%之間,最終朝著97%-98%左右收斂。
同時,我還是好奇的做了3個作者的假設驗證,看看多層感知器能否通過學習,進行識別。我假設前40回、中40回和後40回為3個作者,然後將數據表的章節順序打亂,同樣的按照2個作者的訓練方式設計參數,於是機器通過學習之後,得到的訓練測試精度,一開始在75%-87%左右震蕩,慢慢的一度達到了91%。但是這些訓練穩定性沒有2個作者驗證時那麼高,後來又陸續掉到60%-80%。總的來看,測試精度不算高,差不多在80%左右。
所以,按照97%-98%左右這個測試精度來看的話,看來前80回和後40回作者是2個人的猜想還是很能站得住。這個和文章第一種方法的基礎統計分析還是一致的。
下圖是包含1層隱藏層的網路圖。
五、SVM分析
支持向量機技術和神經網路的多層感知器一樣,本身做分類研究的話比較難有探索性的收穫。畢竟你訓練出一個超平面,只能將已有的樣本進行既定類別的分類,而不能去發現樣本以外的類別。
因此我還是用來對其做前80回和後40回作者是否一個人的驗證。
我用MATLAB裡面自帶的SVM工具包來做的實驗,簡單介紹下操作的思路:
首先在MATLAB中要把待測試的虛詞的各章節出現的頻數、每個章節預先設定好的類別設定好變數,我命名是sample和type;
其次編寫代碼
>>
train=[(sample(1:50,:));(sample(81:100,:))];%將sample中的1-50章節,81-100章節設定為訓練集
>> test=[( sample (51:80,:));( sample
(101:120,:))];% 將sample中的51-80章節,101-120章節設定為測試集
>> group=[(type(1:50,:));( type
(81:100,:))];% 將type中的1-50章節,51-80章節設定為訓練集的預定類別(前80回為1,後40回為2)
>>
svmMODEL=svmtrain(train,group,kernel_function,linear);%運用svmtrain命令包訓練超平面;
>>
classfication=svmclassify(svmMODEL,test)% 用svmclassify對測試集的樣本進行分類。
不過分析的結果發現,測試集的50個章節中,只有3個章節的分類和既定分類不一致,精度達到了94%!
由此看來,前80回和後40回作者是2個人的猜想也還是很能站得住滴。
由於44個虛詞代表了44個維度,這裡就沒辦法畫出圖來了。
小結:
基礎統計分析、神經網路、SVM技術的分析結果,是支持《紅樓夢》的作者為2個人的;
「聚類分析」的結果比較開放,關鍵看你怎麼解讀。它既可以支持2個作者,也可以支持多個作者,所以想用這種分析工具來做研究的話,還是得鑽研下原著才行滴。
「主成分分析法」,對作者人數的判定,介於2人至3人之間。和聚類分析一樣,想用這種分析工具來做研究的話,還是得鑽研下原著才行滴。
後面的花絮:
說實話,如果要認真的用虛詞來做技術分析,識別《紅樓夢》的作者的話,還真缺少一個重要的環節。那就是曹雪芹的其他作品。也只有通過他的其他作品的虛詞使用情況,來對比《紅樓夢》的虛詞使用情況,才能夠確定紅樓夢是否曹雪芹的作品。
然而,據說曹雪芹一生中流傳下來的作品,除了《紅樓夢》之外,還有就是《廢藝齋集稿》。但是這個手稿現在找不到了,被一個金田的日本古董商人從前清的禮親王府重金購走了,並且也在民國時期吧,幾個學者費了很大的勁兒謄抄了其中一個部分做風箏的章節。結果後來那個叫金田的古董商人在日本消失了,找到找不到。
屋漏偏逢連夜雨,後來那個做風箏的章節據說在謄抄的時候由於時間很趕,後來發現有很多地方抄的不太准。所以,想要靠虛詞分布的數據分析技術來鑒別曹雪芹是否原作者,還真的有很大的難題要攻克。
( 「金田」是不是「金田一耕助」的親戚啊?我禁不住暗暗思量,「金田一耕助」這哥們兒偵查的案子幾乎都會有人失蹤或狗帶的,嘿嘿嘿)
末了,這次我作分析的過程,時間關係吧,感覺還是有些小瑕疵待完善:
首先,就是電子版的《紅樓夢》和經典的1982版到底有多一致,這個我還真沒來得及細讀;
其次,就是統計虛詞時,有些虛詞可能存在實詞化的場景。例如「於」可能是人名,那個時候就是實詞了;「之」有可能是代詞時……等。這些只有人讀的時候才能夠識別的。但是我用的是一個詞頻統計工具軟體,它可分不出哪個是實詞哪個是虛詞,我就一股腦全當成虛詞了。
假以時日,如果有足夠的時間和資源,或許這篇文章能夠寫得再細緻些。
末了,我就不去找高鶚的其他文章來跟《紅樓夢》的後40回做對比了,因為我發現真的做理工男更適合我,搞文學研究真的很燒腦。
推薦閱讀:
※Kaggle Titanic 生存預測(Top1.4%)完整代碼分享
※從懵逼到菜逼------菜逼來談數據挖掘
※用時間序列的方法處理數據
※iPIN網的大數據來源及數據分析處理方式?
※推薦系統日常與工作-PPT