楊 澤 ,顧 磊
(南京郵電大學 計算機學院,江蘇 南京 210023)
自從2012年谷歌提出知識圖譜(Knowledge Graph)[1]的概念后,越來越多的研究圍繞知識圖譜構建展開。目前對知識圖譜的研究應用主要包含通用知識圖譜和垂直領域知識圖譜。典型的通用知識圖譜包括用于研究領域的DBpedia[2]、YAGO[3]、Freebase[4]等以及用于工程領域的谷歌“Knowledge Graph”、百度“知心”、搜狗“知立方”等。典型的領域知識圖譜包括醫學病理領域知識圖譜CMeKG[5]、地理信息領域知識圖譜Geonames、企業領域知識圖譜“天眼查”等。知識圖譜構建的首要關鍵步驟就是知識抽取,根據數據來源包含非結構化、半結構化以及結構化數據。通常非結構化數據的處理是難點,以文本為代表的非結構化數據需要進行預處理,如先進行分詞與詞性標注[6]。古典文學文本的圖譜構建就屬于非結構化的,由于中古典文學的知識圖譜相關研究較少,通常需要大量的人工標注工作。特別是以中國古典文學為代表的古文面臨更多的困難,因為古文注重典故、駢驪對仗、音律工整,語法和用詞方面相對于現代文更加復雜和講究,使得計算機很難識別有意義的詞語的邊界。
通常已有的古文方面的知識圖譜構建大都基于規則抽取。文獻[7]以農業古籍本體的構建為例,從專業文本及專業詞典中抽取關鍵詞,得到本體概念集合,利用軟件工具Protégé進行本體構建,并采用Jena實現了對該本體的可視化瀏覽及檢索。文獻[8]以《二十四史》為資源基礎,利用基于詞典的技術和規則模式匹配技術來標注與獲取文本中的命名實體及關系,并開發“中華基本史籍分析系統”提供檢索。也有少量將規則抽取與機器學習相結合的方式。文獻[9]以《左傳》語料為基礎(該語料進行了人工分詞與詞性標注),利用條件隨機場進行BIO角色標注,并在BIO識別的基礎上,根據規則,利用觸發詞獲取屬性關系,從先秦典籍中抽取本體實例。總體而言,想要利用自然語言處理技術進行自動抽取需要一些預處理工作,其中一個必要的步驟是對古文進行分詞與詞性標注。文獻[10]利用條件隨機場模型,主要對詞性、語音特征構建模板,對《詩經》進行分詞。文獻[11]利用條件隨機場模型,通過字詞結構、詞語拼音和字詞長度等特征信息構建組合特征模板,對先秦典籍進行詞性標注。條件隨機場模型依賴于根據語言特點所人工編寫的特征模板,雖然也取得了較好的結果,但是結果性能過于依賴特征模板的簡單或復雜程度。
該文提出了針對中國古典文學文本的知識圖譜構建方法。與傳統的方法相比,其主要特點在于:一是利用聯合模型對古文進行分詞與詞性標注,并在此基礎上進行知識圖譜構建。利用深度學習方法對古文進行分詞與詞性標注[12]的研究相對較少,該文采用深度神經網絡模型進行聯合分詞與詞性標注,來獲得更長距離的上下文關系進行分詞與詞性標注。二是根據詞性標簽進行實體抽取,根據豐富的詞性標簽抽取相應實體。該文主要介紹以《三國演義》為例的中國古典文學文本知識圖譜構建的流程步驟,首先根據語料庫的網頁標簽匹配整理生成分詞與詞性標注數據集,其次訓練出更加適用于古典文學文本的聯合分詞與詞性標注模型,并將最佳模型應用于《三國演義》。最終,在分詞與詞性標注結果的基礎上進行實體與關系抽取,并以圖數據庫作為知識存儲,進行《三國演義》知識圖譜可視化查詢。
為了從非結構化的中國古典文學文本中構建知識圖譜,定義了圖1所示的構建步驟。主要分為三個部分:文本及語料庫的加工整理、聯合分詞與詞性標注、圖譜及可視化查詢系統的構建。

圖1 知識圖譜構建步驟
(1)文本及語料庫的加工整理。
首先,從網上獲得公開的Sheffield Corpus of Chinese (SCC)語料庫[13],進行加工整理后,生成分詞與詞性標注數據集。關于SCC的介紹放在3.1節。
其次,從網上獲得古典文學的電子文本,例如整本《三國演義》,并對其加工整理,去除其中的錯誤,使其可以作為測試樣本輸入深度神經網絡模型。
(2)聯合分詞與詞性標注。
使用《四庫全書》預訓練詞向量[14],并將由SCC語料庫得來的古文分詞與詞性標注數據集作為訓練樣本輸入深度神經網絡模型進行訓練,然后對古典文學的電子文本(例如《三國演義》)進行分詞與詞性標注。
(3)圖譜及可視化查詢系統的構建。
首先,對《三國演義》分詞與詞性標注結果進行處理,即刪除停用詞,停用詞包含虛詞等無意義的詞,得到具有意義的內容詞,并進行人工修改錯誤的分詞與詞性標簽,并且對人名進行匹配替換,將人名的簡稱詞語替換為完整的人名。
其次,根據詞性標簽進行匹配抽取實體,依據詞性標簽定義幾種實體,如人物、地點實體,并以動詞詞頻信息為基礎,人工定義幾組關系,作為實體之間的關系。
最后,參照維基百科人工進行實體關系補充,將實體和關系分別作為圖的節點和邊,構建圖譜與可視化查詢系統。
長短期記憶(long-short term memory,LSTM)[15]引入了輸入門(input gate)、遺忘門(forget gate)、輸出門(output gate)的概念,以及與隱藏狀態相似的記憶細胞,從而記錄額外信息。
t時刻的隱藏狀態ht是關于當前時間的輸出門ot和當前時間的記憶細胞ct的乘積,定義如下:
ht=ottanh(ct)
(1)
當輸出門的值接近于1時,記憶細胞信息被傳遞到隱藏狀態供輸出門使用,當值接近于0時,記憶細胞信息只自己保留。其中,輸出門定義如下:
ot=σ(Woxt+Uoht-1+Voct)
(2)
其中,σ為sigmoid函數,可以將值變換為0和1之間,Vo是對角矩陣。

(3)
(4)
遺忘門ft調節遺忘現有記憶細胞的程度,輸入門it調節新的記憶細胞被添加到記憶單元的程度。遺忘門、輸入門定義如下:
ft=σ(Wfxt+Ufht-1+Vfct-1)
(5)
it=σ(Wixt+Uiht-1+Vict-1)
(6)
其中,Vf和Vi為對角矩陣。
門控循環單元(gated recurrent units,GRU)[16]被提出來使每個循環單元自適應地捕獲不同時間序列的依存關系。通過引入重置門(reset gate)和更新門(update gate)的概念,修改循環網絡中隱藏狀態的計算方式。

(7)
其中更新門zt決定需要從上一時間的隱藏狀態中遺忘多少信息,需要加入多少候選隱藏狀態信息。更新門的定義如下:
zt=σ(Wzxt+Uzht-1)
(8)
在現有狀態和新計算狀態之間進行線性求和的過程類似于LSTM,但是GRU沒用單元來控制其狀態顯示的程度,但是每次都會顯示整個狀態。
(9)
其中,rt是重置門,⊙是逐元素乘法,當重置門的值接近于0時,那么就會丟棄上一時間的隱藏狀態,當值接近于1時,那么就會保留上一時間的隱藏狀態。
重置門rt的計算與更新門類似,定義如下:
rt=σ(Wrxt+Urht-1)
(10)
該文采用的神經網絡結構為BiGRU-CRF(bidirectional gated recurrent units using conditional random fields),如圖2所示,漢字作為向量表示,被送入雙向循環層。對于循環層,使用GRU作為基本循環單元,因為它具有相似的功能,但與LSTM相比,參數更少[17]。將Dropout[18]應用到雙向循環層的輸出,接著將輸出進行串聯并傳遞到一階鏈CRF(conditional random fields)[19]層,最后預測組合標簽的最佳順序。

圖2 BiGRU-CRF神經網絡結構
根據相關工作,單詞邊界采用的標簽為B、M、E、S,分別代表單詞的開頭、內部、結尾或單個字符。在給定輸入字符的情況下,CRF層對所有可能的組合標簽上的條件得分建模。結合連續標簽之間的轉換分數,可以通過Viterbi算法有效地獲取最優時序。
Viterbi算法的時間復雜度O(k2n)相對于句子長度n是線性的,其中k為常數,等于組合標簽的總數。對于某些POS(part-of-speech)標簽,將它們與完整的邊界標簽結合起來是多余的。例如,功能詞“的”可以標記為FMI,由于它是一個單字,因此B-FMI、M-FMI和E-FMI的組合標簽永遠不會出現在實驗數據中,因此應該進行修剪以減少搜索空間。同時,如果在訓練數據中給定的POS標簽下的最大單詞長度為2,就會進行修剪相應的標簽。
通常,普遍的基于字符的神經網絡模型假定,比如單詞和n-grams形式的較大范圍的文本,可以由它們所組成的字符序列來表示。例如,通過字符ci的向量表示vi傳遞給函數f來獲得生成子空間cm,n的向量表示Vm,n。其中f通常是RNN或CNN神經網絡。
Vm,n=f(vm,vm+1,…,vn)
(11)
在文中,不完全依賴使用BiGRU從無上下文的字符表示中提取上下文特征,如圖3所示,通過使用增量式的級聯n-gram模型對字符向量中豐富的本地信息進行編碼。例如,給定上下文中的中心字“甚”的向量表示是上下文無關的字“甚”本身的向量表示Vi,i和二元bigram“此甚”的向量表示Vi-1,i,以及同理的三元trigram“此甚好”的向量表示Vi-1,i+1三者的級聯。
不同于公式(11)中的字符表示來構造n-gram模型中cm,n的向量表示Vm,n,可以使用不同順序來表示Vm,n,例如對Vi,i、Vi-1,i、Vi-1,i+1分別進行隨機初始化。使用一個特殊的向量來表示每個序列中未知的n-grams,然后將不同順序的n-grams進行增量式的級聯來形成給定上下文的中文的向量表示,接著進一步傳遞給循環層。如圖3所示,中心字兩邊相鄰的字也都被考慮了進去。

圖3 給定上下文的中文字符的向量表示
基于圖1描述的框架來構建古典文學知識圖譜,本節主要以《三國演義》為例,介紹和展示每個步驟中產生的重要結果。
SCC語料庫(SCC語料庫網址:https://www.dhi.ac.uk/scc/db/scc/index.jsp)選擇的文本代表了不同時期發現的多種文本,時間段主要分為先秦、秦漢、魏晉南北朝、隋唐五代、宋元、明清,文本的類型根據不同的主題又可以分為文學類的戲劇、小說、民俗和詩歌,非文學類的傳記、政府、歷史、法律、醫學、戰爭、哲學、宗教、科學和游記。文學類型的文本包含200 040個字符(46.2%),非文學類的文本包含232 630個字符(53.8%)。SCC語料庫使用自然章節來對文學文本進行采樣,因此采樣文本的長度有所不同。例如,選取《三國志》魏書中的一章包含13 000多個字符,《三國志》蜀書中的兩章包含9 000多個字符,《三國志》吳書中的兩章包含13 000多個字符。整個SCC語料庫中共包含40個文本樣本超過42萬個字符。詞性標注包含18個基本詞性類別及82個分類,共112個不同的標記標簽。如名詞又細分為朝代名、人名、地名、年份等等,分別使用詞性標簽“NNK”、“NNL”、“NNM”、“NNO”來表示。將網頁顯示的語料庫通過加工整理,使用Xpath進行網頁標簽匹配,并使用OpenCC將繁體轉化為簡體,得到分詞與詞性標注數據集。
該文采用BiGRU-CRF神經網絡模型,使用古文詞向量作為預訓練嵌入,這和傳統的使用條件隨機場模型不同。神經網絡模型結構已在2.3節進行了詳細的介紹。為了進一步說明使用聯合模型的優點,進行了如下實驗。對分詞與詞性標注數據集進行劃分,將數據集的70%劃為訓練集,15%劃為開發集,15%劃分為測試集,最終,訓練集的句子長度為45 070,開發集的長度為9 780,測試集的長度為10 208。對于深度神經網絡模型,使用《四庫全書》詞向量(中文詞向量下載地址:https://github.com/Embedding/Chinese-Word-Vectors)作為預訓練嵌入,對不在預訓練詞匯表中的采用隨機初始化的向量,使用誤差反向傳播算法對網絡進行訓練,在訓練期間,所有的詞向量都可以通過反向傳播梯度進行微調。使用Adagrad[20]算法進行模型參數優化,初始學習率設置為0.1,衰減率為0.05,Dropout為0.5。使用準確率(precision)、召回率(recall)和F1值(F1-score)作為評估標準,Seg表示分詞評估結果,Pos tagging表示詞性標注評估結果,以詞性標注結果作為最終的評估結果。最后,將訓練的最佳模型運用于測試集,結果如表1所示。

表1 分詞與詞性標注結果 %
將BiGRU-CRF模型與CRF++、Bi-LSTM進行了對比,CRF++得到的最終F1值為74.97%,Bi-LSTM模型得到的最終F1值為82.70%,該文使用的BiGRU-CRF聯合模型獲得了最佳結果,最終F1值為84.21%。由于聯合模型取得較好的結果,把它應用于一百二十回《三國演義》中,得到《三國演義》分詞與詞性標注結果。
通常在非結構化文本中,可以將句子劃分為具有模糊意義的內容詞和功能詞,內容詞所代表的實體是文本中的主要成分,但是功能詞構成的句子也占據很大的成分,因此需要在《三國演義》分詞與詞性標注的結果中將虛詞、功能詞和標點符號構成的停用詞進行刪除,通常可以使用匹配的方式來刪除。同時,由于分詞與詞性標注結果中仍然存在錯誤的分詞與詞性標簽,需要人工進行修正,并且對于人名的簡稱,需要根據上下文進行匹配替換成完整的人名。該文采用詞性標簽匹配的方式進行實體抽取。根據古典文學的特點,使用了豐富的詞性標簽,對于朝代、人名、地名、年份等名詞分別對應了不同的詞性標簽,例如將詞性標簽“NNL”、“NNM”分別作為人物實體、地點實體。
以第三十回為例,根據詞性標簽抽取出人物實體、地點實體,并以詞云的方式進行展示,如圖4所示。同時,參考高質量的數據源,如維基百科,根據維基百科進行實體補充,如添加“陣營”、“事件”、“時間”實體。

圖4 人物、地點實體詞云
對于實體之間的關系,主要根據人工進行定義。對詞性標簽帶有“V”開頭的動詞類詞語進行統計來確定主要關系基調,并以詞云的方式進行展示,如圖5所示,可以看出主要關系都是圍繞戰爭主題。同樣,根據維基百科人工進行關系定義,作為實體之間的關系。

圖5 動詞詞云
最終,以第三十回為例,主要的實體關系類型如表2所示,根據“實體-關系-實體”的形式構建知識圖譜,并以Neo4j[21]圖數據庫作為知識存儲,如圖6所示。

表2 實體關系類型
內容詞是中國古典文學信息和知識的載體,由內容詞派生的關鍵節點和鏈接代表了古典文學文本的知識信息。知識圖譜的可視化[22]展示清晰地描述了關鍵內容詞之間的關系,《三國演義》知識圖譜可視化查詢系統實體包含人物、地點、時間、事件和陣營,為了完整地描述《三國演義》知識結構,使用維基百科數據進行知識補充,如添加人物的簡介、官職作為人物實體的屬性等。其中人物實體共1 191個,地點實體175個,時間實體135個,事件實體83個,陣營實體43個。
《三國演義》知識圖譜可視化查詢系統使用圖數據庫Neo4j作為數據存儲,使用Flask框架作為后端,使用D3.js框架作為前端可視化展示。前端頁面通過jQuery發送查詢請求,后端根據不同請求參數對應的視圖函數進行處理,根據查詢內容的類型,調用與之對應的cypher查詢語句,并以json類型返回查詢結果給前端。如圖7所示,對于查詢的實體,會顯示該實體的所有屬性,以及一跳距離內的相關實體,最后的整體效果為以查詢實體為中心,展示出具有語義關系的相關實體形成網狀結構。

圖7 《三國演義》知識圖譜可視化查詢系統
在這項研究中,采用了自然語言處理技術和知識圖譜來抽取和可視化中國古典文學文本中的知識信息。這項工作對非結構化中國古典文學文本進行知識圖譜構建提供了新的角度。主要結論:語料庫生成的數據集提高了聯合分詞與詞性標注的性能。根據詞性標簽抽取實體及詞云顯示了內容詞在章節中的分布和比重情況,有助于抽取關鍵知識信息。知識圖譜的可視化展示可以顯示非結構化文本的隱藏知識信息。由于古文比較復雜而且相應語料庫較少,所有目前這種基于聯合模型的方法僅僅只能做到半自動化的構建圖譜,一些實體抽取中的錯誤還需要人為修正。
未來的工作:知識圖譜和原始古典文學文本之間的知識檢索,知識圖譜僅顯示了關鍵節點和它們之間的關系,需要定向查詢功能,來將原始文本中的詳細描述鏈接到知識圖譜的節點以進行檢索。可以進行實體鏈接、指代消歧,抽取出更多的實體與關系,豐富知識圖譜的知識結構。