金季豪,阮 彤,高大啟,葉 琪,劉旭利,薛 魁
(華東理工大學 信息科學與工程學院,上海 200237)
自然語言問答是一種便捷的人機交互模式,機器將自然語言問句解析成計算機所能理解和執(zhí)行的語言,并將答案返回。其中,基于知識庫的問答(Knowledge Base Question Answering,KBQA)是給定一個自然語言的問題,生成知識庫所能支持的查詢語言,最后通過知識庫查詢出問題答案的過程。
傳統(tǒng)的KBQA是基于互聯(lián)網(wǎng)知識圖譜的,特點是集中于事實性問題,表達相對比較簡單,而知識庫規(guī)模大且數(shù)據(jù)模式不確定。然而,隨著知識圖譜的普及,醫(yī)療領域也發(fā)布了大量的圖譜數(shù)據(jù)。面向行業(yè)數(shù)據(jù)的KBQA的特點是數(shù)據(jù)規(guī)模和術語相對受限,但問題的復雜度會高很多,會有較多關聯(lián)關系和統(tǒng)計需求。
知識庫問答的主流方法可以分為四類: ①基于模板的方法[1-3],早期通過將問句解析成三元組,并與知識庫中三元組進行相似度計算來得到答案。②基于語義解析的方法[4-7],將自然語言問句轉(zhuǎn)化為邏輯形式,通過對邏輯形式進行自下而上的解析,得到一種可以表達整個句子含義的邏輯形式,并通過查詢語句在知識庫中查詢得到答案。③基于信息抽取的方法[8],先在知識庫中查詢實體從而得到以實體節(jié)點為中心的知識庫子圖,子圖中的點和邊作為候選答案,通過規(guī)則和模板進行信息抽取,建立分類器對候選答案進行篩選從而得到答案。④基于端到端的方法[9-10],通過深度學習的方法,將自然語言問答看作一個序列到序列的任務,通過減少中間環(huán)節(jié)來提高最終準確率。
傳統(tǒng)的方法大多面向比較簡單的事實性問句,對于復雜的問句處理并不適用。然而,醫(yī)療領域中有大量復雜句式需要解析,諸如“被診斷為2型糖尿病后服用了瑞格列奈治療的病人有哪些?”,句中隱含著2個醫(yī)療事件“診斷事件”“用藥事件”及其時序關系。這樣的復雜句比比皆是。對于基于模板的方法[11],當問題允許的復雜度變高時,可能的句式也會增多,模板構造數(shù)量太大。而對于語義解析的方法,當將原始語義改寫為組合范疇文法時,對于語句不規(guī)范、不標準的情況,需要各種額外處理。而對于端到端的方法,由于可解釋性比較弱,出現(xiàn)異常時修正會比較困難。
為此,本文面向復雜邏輯關系的自然語言問題,定義了語義圖(Semantic Graph,SG)的表示形式,該形式可以看作是一種獨立于語言的中間語義表示。在此基礎上,形成了語義圖驅(qū)動的自然語言問答框架(Semantic Graph Driven Question Answering,SGDQA),通過實體識別(Entity Recognition,ER)、實體對齊(Entity Alignment,EA),利用序列到序列(Sequence to Sequence,SS)模型得到語義圖線性序列,最后通過槽填充(Slot Filing,SF)后在知識庫中查詢得到問題答案。此外,面向OpenKg公開的醫(yī)療領域圖譜數(shù)據(jù)集(1)http://www.openkg.cn/dataset/peg,通過初始模板、基于語義圖的擴充方法、在醫(yī)療知識圖譜中查詢得到實體與屬性,構建了3 000個具有復雜邏輯關系的自然語言問題與答案。抽取1 800個問題進行訓練,600個進行驗證,600個測試,其中,基于注意力機制的序列到序列模型達到了97.67%準確率,啟發(fā)式規(guī)則的槽填充達到了94.88%準確率,系統(tǒng)整體性能達到91.5%。
本文的貢獻點如下: ①首先,面向領域中經(jīng)常出現(xiàn)的事件以及事件之間的邏輯關系,構造了語義圖中間表示方式,定義了主鏈、支鏈、環(huán)結構等各種圖形化的結構以及結構的拼接。本文的語義圖可以稱為結構化語義圖,與通用的圖形化的語義表達方式有顯著區(qū)別。②本文面向公開的醫(yī)療領域圖譜數(shù)據(jù)集合,通過模板提取、語義擴充等方法,構建了3 000個具有復雜邏輯關系的自然語言問題與答案。③對于復雜自然語言問題,利用路徑生成模型將自然語言問題翻譯成語義圖的線性序列。其中,基于注意力機制的序列到序列模型達到了97.67%的準確率。④提出了語義圖驅(qū)動的問答框架并在醫(yī)療數(shù)據(jù)集上驗證了框架和算法的有效性。框架包括實體識別、實體對齊、語義圖線性序列生成等步驟,最后通過槽填充并查詢出問題答案。啟發(fā)式規(guī)則的槽填充達到了94.88%的準確率,系統(tǒng)整體性能達到91.5%。
早期的知識庫問答主要是采用模板匹配的方法。文獻[1-3]通過把問句解析為三元組,用相似度計算的方法和知識庫中的三元組進行匹配,進而得到答案。該方法的缺點是無法捕捉句子的完整語義,故而文獻[12]提出了一種可以將問句映射到SPARQL[13]模板上的方法,該方法依賴句法語法信息,在映射句子內(nèi)部含義的同時使用了統(tǒng)計的方法進行實體識別以實例化SPARQL模板。針對手工構建模板較困難的問題,文獻[14]提出了模板自動生成的方法,使用變量來替換問句中的實體,再用問答語料有監(jiān)督地訓練問句-模板的映射模型[15]。
由于模板匹配的方法局限性較大,過份依賴模板,后來就有了基于語義解析的方法。通過定義簡單的可再生的組合規(guī)則[4],通過組合范疇文法(Combinatory categorial grammar,CCG)產(chǎn)生邏輯表達式,并使用橋接提高語料的覆蓋度。文獻[16]通過重述問句并打分,獲得與原問句最相匹配重述,然后建立原句、重述問句、答案的條件概率模型。
此外,還有基于信息抽取的方法,利用子圖匹配的圖搜索算法[17],將自然語言短語映射到知識庫的前K謂詞并生成短語詞典,然后提出語義查詢圖來表達用戶意圖,并在知識庫中找匹配子圖。
近年來,有了基于端到端的方法,將自然語言問題看作是一個序列到序列的任務。文獻[18-20]將知識庫問答任務拆分為實體對齊、路徑生成和答案生成三部分。為了優(yōu)化路徑生成從而提升系統(tǒng)整體性能,文獻[9]補充了路徑生成的驗證過程。文獻[10]將句子到邏輯表達式的轉(zhuǎn)化問題看作機器翻譯的過程,先定義問句的語義圖與構建的動作序列,最后提出基于循環(huán)神經(jīng)網(wǎng)絡的序列到動作的解析模型。
面對復雜邏輯關系的自然語言問題,本文首先設計了一個SGDQA的流程框架,如圖1所示。首先定義了語義圖的表現(xiàn)形式,并給出了語義圖的線性編碼算法,也就是圖1中的offline過程,這部分在2.1節(jié)中將展開詳細描述。圖1中的自然語言問句由面向OpenKG公開的醫(yī)療領域圖譜數(shù)據(jù)集合通過半自動構建的方法得到,一共構造了3 000條具有復雜邏輯關系的醫(yī)療自然語言問句,這部分在2.2節(jié)中進行描述。自然語言問句經(jīng)過圖1中的步驟3進行實體識別,得到移除實體信息的字符序列和預測的實體兩部分,將預測的實體送去知識庫中實體對齊,將字符序列通過路徑生成模型得到語義圖線性序列,這部分將在2.3節(jié)中闡述。最后,通過啟發(fā)式的槽填充,查詢得到問題的答案,圖1中剩下的第6步和第7步在2.4節(jié)中進行說明。
圖1 基于語義驅(qū)動的面向復雜邏輯關系的自然語言問答流程
在知識庫的問答中,表述不同但是語義相同的句子最終會被解析為相同的結構化查詢語言,如基于RDF[13]的圖數(shù)據(jù)庫Jena的SPARQL查詢語言。所以,語義圖可以轉(zhuǎn)化為等價的圖查詢語言SPARQL。
2.1.1 語義圖定義
設G=(N,E),其中,G為語義圖;N={n1,…,ni,…,nk}(0
任一語義圖都可以用SPARQL語句來對應。本文通過對主鏈、支鏈、環(huán)結構的定義來實現(xiàn)語義圖的拼接與擴展。圖2展示了一個語義圖到SPARQL轉(zhuǎn)換的例子,自然語言問句是“哪些男性病人在診斷了高血壓之后服用了硝苯地平控釋片?”。其中,圖2左半部分的“?診斷事件”、“?x”、“?治療事件”代表變量;關系“參與主體”說明事件的參與對象是病人,“參與客體”則表示醫(yī)療事件的參與者是藥品、手術等非生命實體。而圖2的右半部分就是與左邊語義圖相對應的SPARQL語句偽代碼。
本文的語義圖比其他的語義圖的設計元素多了事件的概念以及時序關系,并支持拼接擴展語義圖。本文先通過語義圖可拼接擴展的方式,在原有的初始集上面推薦擴展更為復雜的問句,生成醫(yī)療自然語言數(shù)據(jù)集。處理的句子包含多個事件與時序關系,用其他論文中語義圖的方法無法解決本文的復雜邏輯關系的自然語言問答。
圖2 語義圖示例和對應的SPARQL查詢語句
通過與其他文獻中類似圖結構的對比可以發(fā)現(xiàn),本文能處理更為復雜的問句,并且通過拼接擴展豐富了數(shù)據(jù)集。文獻[10]通過Seq2Act的方法來構造語義圖,使用該文的方法構造本文的問句時會出現(xiàn)在類“疾病”與“藥品”上無法構造時序邊的問題,因為兩個類型之間不可能存在時序關系,只有兩件事才存在先后關系。文獻[11]通過定義問句模板的方法,通過問句到模板的映射來進行構造語義圖,局限性較大,由于本文的醫(yī)療問句包含事件、時序關系,以及存在多事件拼接,所以一旦問句超出模板的范圍或者模式,用該方法則無法構造。
2.1.2 語義圖線性編碼
一個問句會唯一對應一個語義圖,一個語義圖可以表示相同語義的多個不同形式的問句??紤]到直接保存圖所需空間較大,本文提出了一種在約束條件下將語義圖編碼為線性序列的方法。N包括實體節(jié)點、類節(jié)點、事件節(jié)點和常量節(jié)點,E包括屬性與關系。如圖3所示,其中Constant1、Constant2和Constant3是常量節(jié)點, Drug與Disease是實體節(jié)點,“?e”“?e1”是事件變量節(jié)點,“?x”是實體變量節(jié)點。
圖3 語義圖結構示例
語義圖包含主鏈、支鏈與環(huán)結構三部分,對其編碼定義如下:
(1) 主鏈結構。主鏈用Ga表示,Ga=
圖4 主鏈、支鏈和環(huán)結構
(2) 支鏈結構。設支鏈用Gb表示,Gb=
(3) 環(huán)結構。設環(huán)用Gc表示,Gc=
本文之前已經(jīng)定義了語義圖形式及其三種圖形化結構,這節(jié)重點描述利用語義圖來將已經(jīng)收集的句式模板進行擴充,并通過在Jena圖數(shù)據(jù)庫中查詢實體、屬性值、事件之間的時序關系來豐富問答數(shù)據(jù)集,最后對半自動化構建的問句進行人工校驗與重述。
2.2.1 句式模板收集與映射
句式模板是指將自然語言問句中的實體替換成實體類型、屬性值替換成屬性名稱后的句子。就如上述問句“哪些男性病人在診斷了高血壓之后服用了硝苯地平控釋片?”對應的句式模板是“哪些[性別]病人在診斷了[疾病]之后服用了[藥品]?”。其中,不同的句式模板可能會擁有相同的語義圖和相同SPARQL語句模板。
算法1 語義圖線性序列的構造算法
本文從臨床科研需求里收集了122個基于電子病歷數(shù)據(jù)的高頻統(tǒng)計查詢問句作為初始集,并按照“臨床科研”“醫(yī)學統(tǒng)計”和“醫(yī)學科研”等中英文關鍵詞檢索醫(yī)學文獻,并且從文獻里提取出了83個有效的統(tǒng)計查詢需求,并對以上205個問句進行人工實體、屬性替換,獲得了197個句式模板。同時對基于電子病歷數(shù)據(jù)的潛在查詢場景分析,額外補充了66個模板,總計得到了263個句式模板。最后為以上263個句式模板標注SPARQL語句模板,去重后剩余247個句式模板和相對應的SPARQL模板。
2.2.2 句式模板擴充與實例化
經(jīng)過上一步驟得到了247個句式模板和與之相對應的SPARQL語句模板。本文通過語義圖中邊的個數(shù)來定義一個句子的復雜程度,也就是跳數(shù)。為了使最后的問句更加復雜與多樣化,本文利用語義圖可拼接可擴充的性質(zhì),對原有的句式模板進行推薦擴展,在節(jié)點上增加支鏈個數(shù)以加大跳數(shù)。最后將以上句式的SPARQL語句在醫(yī)療事件圖譜中查詢得到實體、屬性等信息并填回句式匯總,從而得到一個完整的醫(yī)療自然語言問句,最終獲得3 083條自然語言問句和SPARQL查詢語句。具體的構造算法2的流程如下。
算法2 半自動構造醫(yī)療數(shù)據(jù)集及其SPARQL模板算法
2.2.3 人工校驗與重述
相同語義的句子可以擁有不同的表述方式,體現(xiàn)在句式的不同和謂詞的多樣性上面。如“哪些男性病人在診斷了高血壓之后服用了硝苯地平控釋片?”可以表述為“患有高血壓后服用了硝苯地平控釋片的病人有哪些?”“患有高血壓的患者有多少”和“高血壓患者總數(shù)是多少”這兩個句子表達著同樣的語義。對于成環(huán)的句子,可能會存在事件之間邏輯關系不正確或者時序關系出錯的情況,所以人工校驗的時候是一個重點。此外,上述的步驟獲得的問句一方面可能存在一些不符合語法規(guī)則的情況,另一方面也難以體現(xiàn)自然語言的豐富性和多樣性,因此需要進行人工校驗和重述。針對以上問題,本文將上述步驟獲得的3 083條句子交付給5名臨床數(shù)據(jù)標注者進行校驗和重述,以保證問句的準確性、多樣性和豐富性,最終得到3 000條自然語言問句。表1列出了5條人工校驗和重述前后的自然語言問句樣例。
表1 人工校驗和重述前后的自然語言問句樣例
本文路徑生成任務的輸入是字符序列構成的自然語言問句,輸出是語義圖的線性結構,采用了基于注意力機制的編碼-解碼模型。該任務與序列到序列生成的模式相符,其中源序列為自然語言問句,譬如“哪些患者患有高血壓?”,將“高血壓”這個實體移除后替換為“Variable”這一中間變量進行占位,則目標序列為結構化語言,如“DISEASE !sem:hasObject Variable sem:hasActor AnswerVariable sem:actorType peg-o:PERSON”。
圖5為基于注意力機制的路徑生成模型。其中,編碼器負責源序列特征的提取,而解碼器是將編碼的特征信息生成為目標序列,注意力機制的作用是在解碼過程中計算編碼信息和輸出序列的參數(shù)權重。
圖5 編碼-解碼過程
2.3.1 編碼器與編碼過程
模型用了RNN的變體——門控循環(huán)單元網(wǎng)絡(Gate Recurrent Unit,GRU)來組成編碼器,圖6是其內(nèi)部結構。GRU與LSTM的不同是,直接用隱藏狀態(tài)來傳遞特征信息,去除了細胞特征。GRU包含更新門和重置門,其中更新門決定特征信息的新增與移除,重置門計算移除歷史特征信息的程度。
圖6 GRU網(wǎng)絡內(nèi)部結構
2.3.2 解碼器與含注意力機制的解碼過程
設X表示源序列,X=
(1)
解碼器使用單向門控循環(huán)網(wǎng)絡,預測t時刻概率分布依賴于t時刻之前的字符信息特征與編碼器對源序列的編碼。解碼過程由以下4個步驟組成。
(1) 解碼器初始化通過q個時間步的編碼向量特征來進行初始化,并得到初始隱狀態(tài)向量,如式(2)所示。
(2)
其中,fi是第i個編碼特征向量,h0是解碼器在t=0時刻的隱狀態(tài)向量,W是線性變換矩陣。
(2) 計算特征分數(shù)用解碼器隱狀態(tài)和編碼特征向量計算貢獻度,高貢獻的特性向量賦予高權重,如式(3)所示。
scoret=W1·tanh(W2·F+W3·ht -1)
(3)
(3) 歸一化,計算上下文向量。將注意力分數(shù)進行歸一化后獲得其概率分布,在編碼特征向量序列上應用概率分布,從而得到含注意力的上下文向量表示,如式(4)、式(5)所示。
(4) 遞歸解碼。根據(jù)上一時刻的解碼器隱狀態(tài)及輸出字符表示向量,更新門控循環(huán)單元網(wǎng)絡隱狀態(tài),并計算當前時間步字符的概率分布,如式(6)~式(8)所示。
inputt=concat(yt,contextt)
(6)
ht=gru(inputt,ht -1)
(7)
yt +1=softmax(W·ht)
(8)
其中,inputt表示t時刻輸出字符向量和上下文特征向量的拼接。yt+1是t+1時刻輸出字符的概率分布。
將輸入的自然語言問句經(jīng)過路徑生成模型后得到了語義圖的線性序列,然后將線性序列轉(zhuǎn)化為SPARQL語句,其中建立實體與占位符之間的映射關系叫作槽填充。根據(jù)槽填充方法不同,可以將占位符分為3類,分別為中間變量占位符、答案變量占位符和實體占位符。
(1) “Variable”屬于中間變量占位符。填充方法是給每個變量定義唯一符合SPARQL語法的名稱,如“?var1”“?var2”等。
(2) “AnswerVariable”屬于答案變量占位符。因為答案變量占位符在語義圖中是唯一存在的,所以直接添加“?”使其符合語法即可。
(3) 除上述中間變量占位符和答案變量占位符以外的都屬于實體占位符。對于實體占位符,采用啟發(fā)式規(guī)則建立與實體之間的映射。規(guī)則一: 實體占位符的表示類型與實體類型必須一致;規(guī)則二: 如果一個實體占位符對應多個同類型的實體,那么應保證實體占位符在語義圖線性序列中的順序與實體本身在自然語言問句中的順序一致。
在之前的工作中,已經(jīng)使用上海市三家三甲醫(yī)院的數(shù)據(jù)構建了3個專科、173 395個醫(yī)療事件和501 335個時序關系的醫(yī)療數(shù)據(jù)集并進行公開。為了評估本文的方法,本文通過半自動化構建、人工重述與專家審核構造了面向臨床科研的問答數(shù)據(jù)集共3 000條問句,隨機按3∶1∶1劃分為1 800條訓練集、600條驗證集、600條測試集,其中自然語言問句的字符長度集中在10~40之間。
3.1.1 實驗設置
模型使用Pytorch建立,編碼器和解碼器采用了GRU,訓練采用隨機梯度優(yōu)化器(Stochastic Gradient Descent,SGD)來最小化交叉熵損失函數(shù)(Cross Entropy Loss Function),迭代次數(shù)為20次。
3.1.2 評測指標
對于路徑生成任務里的語義圖線性序列生成,模型性能的衡量指標采用全局準確率(Global Accuracy,GA),衡量模型預測序列和標準序列在n元短語上的相似性采用BLEU (Bilingual Evaluation understudy)值。全局準確率是模型預測正確的序列占全部序列的比例。全局準確率的計算如式(9)、式(10)所示。
(9)
(10)
BLEU值的計算如式(11)、式(12)所示。
其中,Pn是預測序列的n元組和標準序列的精確度,BP是長度懲罰因子,避免BLEU傾向于較短的序列。
3.1.3 實驗結果
本模型中,編碼器采用雙向GRU,解碼器采用單個GRU并用注意力機制來提高模型性能。實驗結果從實體信息對模型性能的影響、單雙向編碼器對模型的影響、向量維度對模型的影響、注意力機制對模型的影響以及LSTM與GRU的對比來進行分析。
(1) 實體信息對模型性能的影響
通常來說,實體包括命名實體、時間、數(shù)字等。從表2中可以看出,包含實體信息的問句對于目標序列的生成有負面影響,因為在解碼的過程中,實體較多會影響注意力機制的發(fā)揮,導致關鍵特征的注意力分數(shù)下降,從而在驗證集上準確率較低,實驗表明實體信息對模型準確率的影響在0.3%左右。
(2) 單向雙向編碼器對模型性能的影響
單向編碼器顧名思義就是對于輸入序列進行編碼時,GRU網(wǎng)絡只能進行單向計算,但是序列從右到左與從左到右一樣包含著信息與特征。從表2可以看出,雙向GRU網(wǎng)絡在訓練收斂后的模型準確率更高,有效地證明了雙向GRU能更好地表示自然語言問句信息。
表2 基于注意力機制的路徑生成模型評測結果 (單位: %)
(3) 向量維度對模型性能的影響
GRU網(wǎng)絡有內(nèi)部向量參數(shù),通過設置不同的參數(shù)來映射GRU網(wǎng)絡對特征信息的容納能力。由表2可知,隨著向量維度的增加,模型準確率增益減少。
(4) 注意力機制對模型性能的影響
當自然語言問句較長時,訓練時容易丟失句子的信息,引入注意力機制有助于增強對句子有選擇的記憶。由表2可知,含有注意力機制的序列到序列模型能比不含注意力機制的準確率高0.5%,有效證明了含有注意力機制時能有效增加對句子有益特征的權重。
(5) GRU與LSTM、Transformer對比
通常情況下,GRU與LSTM在很多任務上不相上下。不過GRU的參數(shù)較少,更容易收斂,但是在大數(shù)據(jù)集的任務上,LSTM的表達能力會好一些,如果在Transformer上面的表現(xiàn)不如GRU好的話,可能是因為本文的臨床科研的問答數(shù)據(jù)集較少,所以通過表2選擇了基于注意力機制的雙向GRU作為本文模型。
3.2.1 評測指標
語義圖驅(qū)動的面向復雜邏輯的自然語言問答是將實體識別、路徑生成、知識庫查詢等幾個過程串聯(lián)的整體過程。本文使用準確率作為評測指標,系統(tǒng)總體準確率由路徑生成準確率和答案準確率組成,如式(13)所示。
總體準確率=路徑生成準確率×答案準確率
(13)
其中,路徑生成準確率上文已經(jīng)分析,答案準確率代表醫(yī)療事件知識庫中查詢到的答案與標準答案的比例。
3.2.2 實驗結果與錯誤分析
由于序列的輸出存在亂序的可能,所以這序列和答案的比較是通過人工一一比較進行的。路徑生成模型在7次訓練后收斂,在驗證集上效果較好,將最優(yōu)模型用于600條測試集后得到語義圖線性序列,雙向GRU與標準序列一致的最多,達586個,占比97.67%。將預測正確的序列通過槽填充后得到586條SPARQL語句,其中正確的語句有556條,占比94.88%。在知識庫中進行查詢并與標準答案進行對比,其中一致的有549個,占比93.69%。
根據(jù)評測公式得到基于深度神經(jīng)網(wǎng)絡和語義圖的問答的總體準確率為91.5%。在測試集上存在51條與標答不符的錯誤解析,其中,7條屬于實識別與實體對齊錯誤,14條屬于路徑生成錯誤,30條屬于基于啟發(fā)式規(guī)則的槽填充錯誤。
本文針對領域中經(jīng)常出現(xiàn)的事件及其邏輯關系,定義構造了語義圖中間表示來解決。本文針對醫(yī)療語料稀缺的問題,半自動化地構建了3 000個具有復雜邏輯關系的問句,并且用路徑生成模型將自然語言問題翻譯成語義圖的線性序列,提出了SGDQA的流程框架。但是文章也存在不足,語料不夠多可能會引起訓練結果的誤差,未來還可以嘗試用聯(lián)合學習的方法來簡化流程,并嘗試更多的模型來進行實驗對比。