車東宇,李新靚,王心如,吳宇航
(1. 華北理工大學理學院,河北 唐山 063210;2. 華北理工大學以升創新教育基地,河北 唐山 063210; 3. 華北理工大學數學建模創新實驗室,河北 唐山 063210;4. 河北省數據科學與應用重點實驗室,河北 唐山 063210)
首先,對每一章節進行分詞,建立詞頻矩陣;接著使用非參數檢驗剔除顯著性不大的人稱代詞;然后篩選出所有在每一章回出現大于6 次的字;最后將頻繁出現的字創建指示特征,利用紅、玉等125 個特征,訓練樸素葉貝斯分類器,成功預測出作者的不同,預測正確率高達97%。
針對詞的判斷,首先引入紅樓夢詞語等細胞詞庫,使章回分詞更加精確;接著,篩選出與文章情節關聯不大的詞語,計算詞在每一章出現的頻率的標準差,選擇標準差小于0.9 的詞語作為特征;最后利用“寶玉”,“咱們”等256 個詞語作為特征訓練建立的樸素葉貝斯分類器,成功預測出作者的不同,正確率高達95%。
紅樓夢后40 回原作散失,至今作者歸屬仍是謎團。1920 年,胡適先生“大膽假設”,認為后四十回并非曹雪芹所著,而是高鶚續書。在學界一般認為,《紅樓夢》后40 回并非曹雪芹所著。本文嘗試應用機器學習的方法來分析原著文本中作者的用字與用詞習慣,從機器學習與數據判斷角度去說明《紅樓夢》前80 回和后40 回寫作風格的差異,繼而可以確認后40 回為高鶚續寫而并非曹雪芹所寫。
通過分析作品的字詞,判斷《紅樓夢》前八十回與后四十回的作者問題,可通過文本分類實現,樸素貝葉斯是常見的應用方法,即使在現在這種分類器層出不窮的年代,在文本分類場景中,樸素貝葉斯依舊堅挺地占據著一席之地,文檔的分詞可利用R 語言實現[1]。
樸素貝葉斯分類器是一系列以假設特征之間強(樸素)獨立下運用貝葉斯定理為基礎的簡單概率分類器[2]。該分類器模型會給問題實例分配用特征值表示的類標簽,類標簽取自有限集合。它不是訓練這種分類器的單一算法,而是一系列基于相同原理的算法:所有樸素貝葉斯分類器都假定樣本每個特征與其他特征都不相關。
(1)假設文本數據分布相互獨立;
(2)假設《紅樓夢》前八十回由同一人所著,后四十回由同一人所著;
(3)假設拉普拉斯估計增加的數值為1,保證每一項特征的概率值非零;
2.1.1 可視化文本數據——詞云
詞云是一個可視化的描繪字詞出現在文本數據中頻率的方式。詞云是由隨機分布在詞云圖中的字詞構成的,經常出現在文本中的單詞會以較大的字體呈現,而不太常見的單詞將會以較小的字體呈現。最近,這種類型的圖已經變得越來越流行,因為它提供了一種觀察社交媒體網站上熱門話題的方式[3]。
Wordcloud 添加包提供了一個簡單的R 函數來創建這種類型的圖形,應用這個函數使文本中的字詞可視化。比較前八十回和后四十回的詞云有助于了解樸素貝葉斯過濾器是否有可能成功。
利用命令從tm 語料庫對象直接創建詞云。該詞云將會以非隨機的順序排列,而且出現頻率越高的字詞越靠近中心。
通過對詞云的對比發現兩部分高頻詞差別不大,仍然需對數據繼續進行篩選。
2.1.2 樸素貝葉斯主要公式:


圖1 前80 回字的詞云 Fig.1 Word cloud for the first 80 words

圖2 后40 回字的詞云 Fig.2 The word cloud of the next 40 words

圖3 前80 回詞的詞云 Fig.3 Word cloud of the first 80 returns

圖4 后40 回詞的詞云 Fig.4 The word cloud of the next 40 returns
從公式中可知,如果要計算X 條件下Y 發生的概率,只需要計算出后面等式的三個部分,X 事件的概率(P(X)),是X 的先驗概率、Y 屬于某類的概率(P(Y)),是Y 的先驗概率、以及已知Y 的某個分類下,事件X 的概率(P(X|Y)),是后驗概率[4]。
將曹雪芹與高鶚視為兩類,要判斷《紅樓夢》的前八十回與后四十回的作者分別屬于哪一類,則需要計算出歸屬不同類的概率,再從中挑選出最大的概率。
將貝葉斯公式寫為:

由公式可知,要計算最大的后驗概率,只需計算出分子的最大值,而不同水平的概率P(C)非常容易獲得,故難點就在于P(X|C)的概率計算。由于貝葉斯假設變量X 間是條件獨立的,故而P(X|C)的概率就可以計算為:

在此問題中,X 為《紅樓夢》前80 回作者為曹雪芹,Y 為后四十回作者不是曹雪芹。在第一問中,Ci 表示某字屬于某類,Xi 為特征屬于該類。在第二問中,Ci 表示某詞屬于某類,Xi 為特征屬于該類[5]。
2.2.1 將數據導入R
將附件中的文檔按章回分開,對每一章回附上作者的標簽。
2.2.2 清洗數據
文本中包含著數字、縮略的短語和標點符號等干擾信息,因此要在建模之前對數據進行清洗。
(1)創建語料庫
文本是由字、詞、數學和標點符號等符號組成的文本字符串。處理這種復雜的數據需要大量的思考和工作,一方面需要考慮如何去除數字和標點符號,如何處理沒有意義的詞,以及如何將句子分解成單個的單詞。此利用R 語言文本挖掘添加包tm 實現。通過命令安裝tm 文本挖掘添加包,并應用命令進行加載。
①創建字的語料庫
創建語料庫即創建一個文本文件的集合,即《紅樓夢》文本文檔。在將文本內容分解成單詞之前,需要進行一些清理步驟去除標點符號和可能會影響結果的其他字符,分詞之后統計詞頻,挑出詞頻大于100 的“紅”“玉”等字,并進行清理。
②創建詞的語料庫
利用R 語言中的rJava 與Rwordseg 進行分詞。因為紅樓夢的敘述為半文半白,分詞較為困難,為了得到更好的分詞結果,引用細胞詞庫。細胞詞庫的好處是使分詞更為規范,更符合漢語的語義與語句結構。如對“一年三百六十日,風刀霜劍嚴相逼。”進行分詞,得到“一年”“三百”“六十”“日”“風”“刀”“霜”“劍”“嚴”“相逼”但引入了細胞詞庫后進行同樣的分詞,得到“一年”“三百六十日”“風刀霜劍”“嚴相逼”。因此對于本題引進“紅樓夢詞庫”“紅樓夢群成員名字詞庫”“紅樓詞語”“常用文言文詞庫”等細胞詞庫,以更好的進行分詞。
(2)清理語料庫
①清理字的語料庫
在文言文中虛詞數量較多,對于一些在語句中承擔重要成分且用法復雜的字,不同作者通常因性格、寫作方式的不同有不同的運用,這些字在前后的分布也有著顯著差異,因此分析過程中要予以考慮。而對于一些不在語句中承擔角色、用法相對簡單的“乎”、“焉”等,使用量不因作者不同而產生較大的變化,這些字在前八十回與后四十回中的分布差異不顯著,為最終求得結果的合理準確,將這些字剔除[6]。

表1 虛詞剔除 Tab.1 function word elimination
對于“你”、“我”、“他”等稱謂用詞,擁有較為固定的用法,且后四十回作者續寫能力比較強,在同一題材的敘述過程中,即使由不同作者續寫也不會有較大的差別,因此對這些字進行剔除。

表2 人稱代詞剔除 Tab.2 personal pronouns removed
②清理詞的語料庫
在《紅樓夢》中有一些人名的出現次數是隨情節而變化的。如小說剛開始不久,林黛玉的母親賈敏就已經去世了,那么后文這一人物名字出現的次數就會大大減少。因此人名并不能作為判斷是否為同一作者的有效依據,那么剔除人名將減少較大的干擾,得到更為準確的判斷[7]。
利用R 中的Rwordseg 進行分詞,把分詞結果用向量表示,在將章節的詞與詞頻生成文檔——詞頻矩陣。
統計每一回詞語出現的詞頻,計算該詞語在每一回出現頻率的標準差,選取標準差較低的詞作為特征詞。
按照這個標準,與情節最無關的20 個詞是:

表3 與情節無關的20 詞 Tab.3 20 words unrelated to the circumstances
詞頻變化最大的詞:

表4 詞頻變化最大詞 Tab.4 most frequently changed words
有趣的是,處在排名末尾的詞,也就是詞頻變化最大的詞,大部分都是人名,這與我們之前的假設吻合。可見這個篩選方法確實能去掉我們不想要的特征詞。
最終,選擇了詞頻變化最小的256 個詞作為特征詞,每個詞的修正后標準方差都小于0.9。
以前五十個為例如下:

表5 例詞 Tab.5 words
2.2.3 標記化
將文本分解成由單個單詞組成的組。一個標記就是一個文本字符串的單個元素,tm 添加包提供了標記語料庫的功能。將一個語料庫作為輸入,并建立一個稱為稀疏矩陣的數據結構,其中矩陣的行表示文檔,即《紅樓夢》文本內容,矩陣的列表示字詞。將語料庫標記化,并返回另一個稀疏矩陣中,便可以對包括詞頻在內的信息進行分析[8]。
(1)數據準備——建立訓練數據集和測試數據集
將一百二十回隨機打亂,把它們分為兩部分,取50 回作為訓練集,剩余70 回作為預測集。訓練集已知作者與章節對應關系,作為判斷的標準。預測集未知作者與章節對應關系,運用樸素貝葉斯分類器依據訓練集給出作者與章節的對對應關系。
(2)數據準備——為頻繁出現的字詞創建指示特征
數據準備過程中的最后一步就是把稀疏矩陣轉換成可用于訓練樸素貝葉斯分類器的數據結構。目前,該稀疏矩陣包含數量超過320 個的特征,即至少出現100 次的字詞特征,這些特征不可能都對分類發揮作用。
選取特征字時,為減少特征的數量,共選出“紅”“玉”等125 個特征字,即125 個特征,樸素貝葉斯分類器通常是訓練具有明確特征的數據。
由于一些人名、詞組隨著情節的變化而變化,因此這些詞組并不能作為依據來判斷是否為同一作者[9]。統計每一回詞語出現的詞頻,計算該詞語在每一回出現頻率的標準差,選取標準差較低的詞作為特征詞共256 個。
為了評估分類器,我們需要基于測試數據中未知作者的文本來檢驗分類器的預測值。利用已經訓練過的分類器來產生預測值,并將預測值與真實值相比較。利用函數進行預測,并將這些預測值存儲在一個向量中。為了比較預測值和真實值,使用添加包中的函數,增加一些額外的參數來消除不必要的元素的比例,并使用參數dnn 來重新標記行和列。通過代碼產生如下表格:
從表中可以看出30 回屬于高鶚的作品中有1 回被錯誤歸為曹雪芹的作品,比例為3%,而20 回屬于曹雪芹的作品中有1 回錯判為高鶚的作品,比例為95%,表現水平比較好。
從表中可以看出39 回屬于高鶚的作品中有1 回被錯誤歸為曹雪芹的作品,比例為2%,表現水平比 較好。

表6 真實值與預測值比較 Tab.6 comparison of true and predicted values
通過采用樸素貝葉斯進行《紅樓夢》的作者分析,可證明其有效性。結合專門的R 添加包用于準備需要分析的文本數據、預處理文本以及文本的可視化。
樸素貝葉斯分類器可推廣用于文本分類,簡單易懂、學習效率高。對待預測樣本進行預測,過程簡單速度快,對于多分類問題也同樣很有效,復雜度也不會有大程度上升。
2.2.4 基于數據訓練模型 原始《紅樓夢》文本文檔已經轉換成為可以用
一個統計模型代表的形式,此時應用樸素貝葉斯算法,根據字詞在相對應標簽下的存在與否來估計對應文本作者屬于曹雪芹的概率。且此算法速度較快,準確率較高[10]。

表7 真實值與預測值比較 Tab.7 comparison of true and predicted values
通過采用樸素貝葉斯進行《紅樓夢》的作者分析,可證明其有效性。結合專門的R 添加包用于準備需要分析的文本數據、預處理文本以及文本的可視化。
樸素貝葉斯分類器可推廣用于文本分類,簡單易懂、學習效率高。對待預測樣本進行預測,過程簡單速度快,對于多分類問題也同樣很有效,復雜度也不會有大程度上升。