史沛卓 陳凱天 鐘葉珂 雷向欣
(華東理工大學 上海市 200000)
“渭城朝雨浥輕塵,客舍青青柳色新”——清晨的細雨潤濕了塵土,楊柳也顯得青翠清新。如此明朗清新的詩句,一眼看去好像十分明快,但實際上這卻是詩人王維以樂景抒悲情的手法。正是因為美妙的景色無法與朋友一起欣賞,王維才寫出來以反襯自己對友人的惜別之情,這就是中國古詩文婉轉曲折、含蓄蘊藉之處。一直以來,對中國古詩文進行風格分析都是一個有趣但困難的課題。僅僅憑借人的主觀判斷,很有可能對古詩句產生錯誤的理解,而機器學習在分類上具有優良的應用效果。計算機學界在這一領域也已經有一些相關的研究,我們能否嘗試用機器學習和深度學習的方法,構建一個專門針對中國古詩文進行分類的模型呢?這正是本文進行探究的出發點。
當前,機器學習領域內對文本分類的應用大多數針對的是現代文本,而對古詩文領域進行研究的相關工作并不密集,這是因為針對古詩文構建分類模型具有更多的困難,有相關文獻提到:文言文的字數少、語句精練,分類特征不顯著,并且在經過數據預處理后得到的特征向量更少[1]。
在這一研究領域,文獻[2]使用了樸素貝葉斯方法針對宋詞進行風格判別,且使用信息增益和遺傳算法進行特征選擇,最高準確率達到88.5%,不過該研究的語料庫和參數設置比較有限,并且樸素貝葉斯方法也屬于比較老的方法。文獻[3]應用了Scikit‐learn 工具包提供的多種機器學習方法實現了對宋詞的豪放、婉約風格二分類,并進行了比較和回溯分析,但在數據集的選擇上仍有缺陷:該文獻提到,在他們進行數據處理時將公認為豪放派作家的作品視為“豪放”類,同樣“婉約”類數據也是如此,但實際上豪放派作家也有少量作品是婉約風格,該文獻的結語認為這樣的數據處理方法引入了噪聲。
文獻[4]分別使用了基于卷積神經網絡的TextCNN 方法、基于循環神經網絡的TextRNN 方法和基于注意力機制的Bi‐LSTM+Attention 模型進行特征選擇,能夠對文本的局部關聯特征進行捕捉,也可以很好地掌握上下文信息,提高了特征提取的質量以及分類器的精度。文獻[5]提出的TextRCNN‐TextCNN 混合模型在英文數據集下能夠很好地解決文本分類問題。我們可以看到,相比傳統的機器學習方法,一些專用于文本分類的深度學習方法也具有良好的效果。
利用深度學習的方法,文獻[6]使用TextCNN 構建模型,將古典詩詞分為“愛國”和“其他”兩類,并將其與經典的機器學習方法SVM 構建的分類模型進行比較,確定TextCNN 方法具有更好的效果,但是該文獻僅僅進行了二分類。本文認為探討多分類可能會具有更高的應用價值。
本文認為,我們旨在構建一個古詩文多分類模型,將上文提到的情感或風格作為有監督學習的標簽會帶來數據集構建的困難。情感或風格是主觀性較強的標簽,經過檢索,我們無法找到數據量大到可以避免過擬合的以情感為分類標簽的詩句,文獻[1]甚至在數據處理階段對950 首唐詩采用人工手動標注,而我們不具有這樣的能力。基于以上的考慮,我們在kaggle 等社區檢索后,決定選用GitHub 的chinese‐poetry 數據集,其已有的主要分類標簽包括唐詩、宋詞、花間集等。我們選用五種詩文出處作為分類標簽,包括唐詩、宋詞、論語、詩經和四書五經,基于比較新興的TextCNN 方法構建分類模型。
卷積神經網絡早期是主要應用在計算機視覺的一個算法,近年在各個新領域都涌現出研究成果,其中就包括本文的文本分析領域,這將在下文提到。典型的卷積神經網絡由輸入層、卷積層、池化層(下采樣層)、全連接層、輸出層組成[7],它們的原理如下。
卷積層利用卷積核對圖陣列進行特征提取,通過卷積核與圖像對應像素相乘求和得到神經元的輸出值;在算力不充足的情況下可以進行池化下采樣,池化層對特征進行選擇、進行信息過濾,常用的是maxpooling 和average pooling,即最大值池化和平均值池化(值得一提的是,采用池化下采樣的操作已經越來越少,因為池化濾除的信息過多,可能包括有用的信息,更好的方法是卷積下采樣);全連接層類似于傳統前饋神經網絡的隱含層,將特征圖展開為向量并通過激勵函數,即對特征進行非線性組合。卷積神經網絡的優勢就在于其能夠良好地捕捉局部特征。
而文本也是可以被表現為類似于圖片像素陣列的形式的(例如詞語在字典中的位置以及詞語在句子中的位置形成的矩陣),因此文本分類理論上也是能由卷積神經網絡完成的。
2014年Yoon Kim 提出的TextCNN 首次運用卷積神經網絡進行文本分類:
輸入層的形式是一個句子中的單詞以及單詞對應的詞向量形成的n*k 矩陣,其中n 為句子的單詞數,k 為詞向量維度。因此輸入層的每一行都是一個單詞對應的k 維詞向量,并且為了保證詞向量長度一致,矩陣會進行padding 操作(即邊界填充)。
卷積層與傳統CNN 的卷積層原理一致,但是卷積核的寬度一定等于詞向量大小(即上文提到的k),因此卷積核只會進行高度方向的移動,每次步進都會劃過完整的單詞,保證了詞語作為語言中的最小粒度(粒度如果需要降低還需其他操作)。

表1:sklearn 打印的分類報告結果
池化層與傳統CNN 的池化層也基本一致,方法包括1‐MAX池化、K‐MAX 池化(選出每個特征向量中最大的K 個特征)和上文提到過的平均值池化等。
在實驗之前進行比較常規的數據預處理。實驗數據集來自上文提到的Chinese‐Poetry 庫,庫內收錄了從從先秦到現代的共計85 萬余首古詩詞。其中供本次訓練使用的有唐代詩詞281378 首,宋代詩詞270066 首,論語文本31116 段,詩經詩詞78606 首,四書五經文本56925 段。我們建立數據集中五種類型的映射,讀取json 文件后進行dataframe 的拼接。古詩詞中有一些生僻字,這些生僻字屬于 utf8mb4 字符,在許多設備中無法顯示,故而使用“?”來替代,鑒于該類生僻字在古詩詞中所占比例極小(在詞袋中,含有“?”的詞僅占總詞數的2.9456e‐03%),因此在此次訓練中忽略其影響。
隨后,使用sklearn 提供的split 方法將古詩詞按0.25 的比例生成訓練集和測試集,并通過使用word2vec 方法,將古詩文進行分詞后轉化成詞向量。在分詞過程中,我們認為,數據集內已經比較干凈,不需要去除停頓詞之類的操作,以免發生有些繁體字取掉后識別會不精準的情況。
在textCNN 網絡結構上,我們在經典的一層卷積的卷積神經網絡上添加了兩層卷積層和一層全連接層,其中兩個全連接層分別采用relu 和softmax 激活函數,以進行五分類。隨后參考文獻[8]中的方法進行參數調整。在多次實驗和比較后,根據結果選定filter 大小為[3,4,5],每層卷積核個數均為128,dropout rate 為0.4,池化策略為GlobalMaxPooling,激活函數為relu 和softmax,達到取得較高準確率的五分類結果的目的。
使用sklearn 打印分類報告,在訓練集和測試集上得到的結果如圖1 和圖2所示。

圖1:本文采用的模型訓練原理

圖2:隨迭代次數增加loss 的變化
可以看到loss 不斷下降直到趨于穩定,accuracy 不斷上升直到趨于穩定,訓練過程符合深度學習的迭代規律。最終sklearn 打印的報告給出了0.94 的macrof1 分數和0.87 的weightedf1 分數。

圖3:隨迭代次數增加accuracy 的變化
本文提出了一個基于TextCNN 構建的中國古詩詞文本分類模型,并在在GitHub 的chinese‐poetry 數據集上進行五分類。最終加權后的f1 得分為0.87 表明該模型可以有效應用于中國古詩文的文本分類。
運用該模型,我們已能在基本的古詩文出處分類上獲得較高的準確度,例如“孔子之去魯,曰:‘遲遲吾行也,去父母國之道也。’”這樣的句子被神經網絡劃為了“四書五經”類。如果僅憑人的主觀判斷,可能會認為其出自《論語》(備注:數據集中“四書五經”類不包含《論語》,兩者是分開的類,現實中《論語》是四書五經的一部分),因為《論語》內包含大量的孔子所說的話,但實際上這個句子的確是出自四書五經中的《孟子》。其實神經網絡將這個句子劃為“四書五經”類,也并不違反直覺,因為熟悉《論語》和《孟子》的人也會很快地辨認出來:《論語》中常用的句式是“子曰”,但《孟子》常用的句式是簡單的“曰”,并且《孟子》中也時常會在引用人物的語言之前交代一些背景,比如“孔子之去魯,曰:……”“莊暴見孟子,曰:……”,但《論語》中往往直接由“子曰”開頭。
上述的例子是本文的模型對古詩文文本在朝代、出處上進行分類的應用,針對佚名詩文和來源模糊的詩文可以進行出處上的參考。不過,我們認為進行情感和風格上的分類或許會有更高的應用價值,這也正是本文的不足之處。但是正如引言中提到的,我們缺少足夠的數據集,也沒有能力進行大量的人工手動標注,不過使用本文的思路,如果配合足夠良好的數據集和特征工程,相信也能構建出在情感、風格以及其他方面效果良好的分類模型。