金季豪 黃越祈 劉旭利 高大啟
(華東理工大學信息科學與工程學院 上海 200237)
隨著醫療信息系統的廣泛應用,諸多大型醫療機構已經積累了大量的電子病歷(Electronic Health Record,HER)數據。通過對這些電子病歷數據進行醫療統計分析,可以幫助臨床醫生進行臨床研究。對此,本文提出了基于依存關系的醫療自然語言統計問答,臨床醫生能夠直接使用自然語言提問,得到相應的統計結果。
目前,對于自然語言統計型問答的研究仍相對較少,醫療統計問題也需要用到復雜的邏輯限制,如“服用百令膠囊和冬凌草片且沒有患有冠心病的肺癌患者的疾病分布是怎樣的?”,包含了與、非等邏輯限制。目前基于知識庫的問答工作,大量集中在類三元組的簡單問題上,不涉及復雜邏輯關系與數學計算。ESWC 2016針對統計型問答舉辦了基于RDF數據立方(RDF Data Cube)的評測競賽。該競賽的RDF數據使用3個維度來刻畫數據,數據結構相對簡單,對應的評測問題也不需要復雜的邏輯限制。最近流行的自然語言查詢(NL2SQL)研究工作[1-3],由于SQL本身固有的特點,目前的任務大多都集中在單表查詢上,而本文的統計必定會涉及到概念之間的多對多關系。在本文作者之前的工作中[4],利用上下文無關文法進行自然語言問題到圖數據庫查詢語言(Cypher)的轉換,并返回對應的查詢結果,可以表達豐富的業務需求。但由于自然語言表達非常豐富,文法規則越來越多,給從文法到Cypher的正確轉換帶來了困難。
為解決上述問題,本文通過基于轉移的依存關系生成方式(Transition-Based Parsing),并且利用基于Blending的融合模型,將自然語言問題轉換成對應的依存關系樹,并將解析結果映射成語義表達式,然后翻譯得到Cypher查詢語句,最后返回查詢的結果。實驗表明,模型的UAS(Unlabeled Attachment Score)達到了96.45%,LAS(Labeled Attachment Score)達到了96.01%,系統的問題覆蓋率達到了81.61%。相較于端對端利用seq2seq的方式直接翻譯成查詢語言來講,本文的方法能夠更好地處理包含復雜邏輯結構和時間先后關系的問題,而且在翻譯成查詢語言步驟時,可解釋性更強,并且可以對應地改進翻譯策略,提高系統精度。同時,本文在文獻[4]的基礎上,能夠處理的問題句式更為靈活,具體本文共有以下幾點貢獻點:
(1) 本文針對醫療領域定義了電子病歷語義模型以及對應的依存關系,能夠清晰完整地表述實體之間的語義關系,且可擴充性強,能處理的問題句式也更為靈活。
(2) 論文提出了基于神經網絡與XGBoost的依存關系融合模型。實驗證明,本文所提出的模型,在UAS以及LAS這兩個評價指標上,都比單模型的結果有了一定的提升。
(3) 本文通過基于轉換的方法,利用融合模型預測得到自然語言問題的依存關系樹,并將其映射至語義表達式上,接著通過啟發式規則將語義表達式翻譯成對應的Cypher查詢語句。實驗證明本文的查詢正確率比現有方法有了一定的提升。
自然語言問答一直是自然語言處理研究的熱點之一。本文從早期的自然語言問答技術到基于知識庫的問答系統(KB-Based QA),再到面向統計關聯數據的問答系統再到面向自然語言的SQL轉化。
基于知識庫問答系統的傳統做法是語義解析[5-12]先將自然語言問題解析成邏輯表達式,再將邏輯表達式轉換為結構化查詢語言,再通過查詢語言從知識庫查詢得到答案并返回其結果。文獻[11]利用整型線性規劃的方法來進行聯合消歧。文獻[12]為了更好地表示問題,提出了語義查詢圖概念,將問題簡化為子圖匹配查詢。利用這種方法,解決了歧義的問題,但是這種方法的搜索空間往往是指數級的,響應速度緩慢。Joseph等[13]提出了一個系統,可以輸入英文語句,然后將它們翻譯成XQuery表達式。Bais等[14]介紹了基于關系數據庫的機器學習方法在通用自然語言接口上的實現。
另一種基于知識庫的問答方法是將問題和答案轉換成向量表示,并比較兩個向量的相似度。隨著詞向量學習的普及,知識表示任務也隨之變得更加容易。早期如文獻[15-16]簡單地把問題用詞袋模型進行編碼,而在最近的工作中,利用了更多的結構化信息。文獻[17]利用多層卷積神經網絡從答案的路徑、答案的上下文和答案的類型三個方面來表示問題。
在面向統計關聯數據的問答系統方面,比較知名的是ESWC舉辦的QALD評測。QALD-6有一個任務是基于統計關聯數據的問答[18],該應用場景與本文任務十分相似。但是,QALD-6任務中的查詢是基于RDF數據立方(RDF Data Cube),僅使用3個維度來刻畫數據,數據結構相對簡單,對應的評測問題也不需要復雜的邏輯限制。對此,文獻[18]設計了CubeQA算法,在文獻[19]的基礎上,基于模板規則,在QALD6T3-test評測中得到了0.43的全局F1值。
在自然語言轉換為結構查詢語言(SQL)方面,文獻[1]提出了一種將深度學習技術與傳統查詢解析技術平滑結合的新方法——編碼器-解碼器框架。文獻[2]提出了通過結合自然語言處理,程序綜合和自動程序修復來實現從自然語言自動合成SQL查詢的方法。文獻[3]提出了一種新穎的方法TYPESQL,將自然語言轉化為SQL視為插槽填充任務。
目前的統計型問答系統,數據結構相對簡單,不能解決復雜的邏輯限制關系和時間限制關系,更不能理解復雜問句中的隱藏語義。因此,本文提出了基于醫療領域的電子病歷語義模型,以及對應的依存關系。同時利用Blending的方式訓練了依存關系融合模型。對于輸入的自然語言,首先會利用模型預測其依存關系樹,并結合定義好的語義模型將其映射至語義表達式中,接著轉換成Neo4j查詢語句Cypher,最后以圖表形式將查詢結果返回給用戶。
本文方法的總體流程如圖1所示。首先本文分析發現醫生所提出的醫療統計需求均是以“病人”這個主體進行提問的,問題中的各成分會對“病人”進行語義上的約束。因此,本文構建了面向醫療統計型問答的電子病歷語義模型以及對應的依存關系。

圖1 本文方法總體流程
在系統實際運行時,對于醫生提出的自然語言問題,系統首先利用jieba分詞工具對問句進行分詞及預處理。在刪除出現的停用詞和標點后,對每個詞賦予其詞性,同時將其作為特征輸入到依存關系模型中,預測得到該問句對應的依存關系樹,并將其映射到對應的語義邏輯表達式中,再翻譯成Cypher語句,最后以圖表形式返回結果。
對于電子病歷語義模型的定義,本文分析臨床醫生的需求,發現這些需求均圍繞著“病人”展開,而問題中的其他部分則對其進行了語義上的約束,具體可以利用語義邏輯表達式的形式將這些需求問題的語義表示出來。因此本文在歸納總結后,構建了一個電子病歷語義模型,能夠覆蓋本文醫療統計分析問題任務語境下的所有語義,一共有以下7種語義。其中,本文的語義表達式中用到的變量如表1所示。

表1 變量符號表
(1) 醫療事件約束。指對曾發生過某條具體醫療事件記錄的“病人”進行約束,其語義表達式為λx.?y.MedEvent(x,y)∧EventName(y,e)。例如“得了高血壓的病人”,表達式為λx.?y.DiseaseEvent(x,y)∧DiseaseName(y,″高血壓″)。
(2) 病人屬性約束。指對病人的某項屬性進行約束,其語義表達式為λx.Value(x,e)。例如“男性病人”,表達式為λx.Gender(x,″男性″)。
(3) 邏輯運算約束。共有與、或、非三種不同的邏輯操作計算,其對應的語義表達式為∧、∨、。
(4) 時間先后約束。常常用于約束不同醫療事件之間的時間先后關系,其語義表達式為λx.?y1.?y2.MedEvent1(x,y1)∧MedEvent2(x,y2)∧EventName1(y1,e1)∧EventName2(y2,e2)∧TimeRelation(y1,y2)。例如“得了糖尿病后用了胰島素的病人”,表達式為λx.?y1.?y2.DiseaseEvent(x,y1)∧DrugEvent(x,y2)∧DiseaseName(y1,″糖尿病″)∧DrugName(y2,″胰島素″)∧Before(y1,y2)。
(5) 數值范圍約束。用于約束病人的數值型屬性,λx.Value(x,e)。例如“70歲的病人”,其語義表達式為λx.Age(x,70)。
(6) 對比關系約束。在醫療統計問題中會常常出現需要對比兩者的語義的情況,其語義表達式為λx1.λx2.Compare(x1,x2),其中x2表示另一個病人。
(7) 統計目的約束。用于約束問句最終的分析目的,例如“男性病人的總數”其語義表達式為Count(λx.″男性″))。
同時本文還根據上述的電子病歷語義模型,定義了對應的醫療領域依存關系。依存句法的本質是提取詞與詞之間的依存關系、在通用領域中一般使用語法關系,例如主謂關系,動賓關系。但在醫療領域的文本中,存在一部分能夠明確表示語義的關系,例如病人屬性關系、醫療事件關系。但如果完全使用此類關系,無法完整表示所有的文本,因此需要使用語法關系進行補充。在閱讀了大量醫療領域文本的基礎上,本文總結出一套針對醫療領域的依存關系,與語法關系一起訓練,最終得到了不錯的結果,具體定義可見表2。

表2 醫療領域的依存關系定義
本文利用基于轉移的方法來訓練依存關系。首先對于每個輸入的問句,初始化其結構C=(s,b,a)。其中s表示堆棧(stack),初始化后s=[ROOT],s1代表棧頂詞,s2代表棧頂第二個詞。b表示緩沖區(buffer),初始化后b=[w1,w2,…,wn],wj表示問句中的第j個詞匯。a表示依存關系(Dependency Arcs),初始化后a=?。終止條件為當結構C中堆棧s僅有一個[ROOT],且緩沖區b=?。基于轉移的依存解析目標就是將問句從初始結構到終止結構,預測每次的轉移動作。轉移動作包括以下3個。
(1)shift:將緩沖區b中的棧底元素b1移到堆棧s的棧頂,前提條件是len(b)≥1。
(2)left_arc(l):向依存關系a中加入關系邊s1→s2,及其邊上的標簽l,并把s2移出堆棧s,前提條件是len(s)≥2。
(3)right_arc(l):向依存關系a中加入關系邊s2→s1,及其邊上的標簽l,并把s1移出堆棧s,前提條件是len(s)≥2。
因為本文定義了一共21種依存關系,所以神經網絡的輸出為2T+1=43維的向量(其中T為依存關系個數)。具體的操作流程如表3所示。

表3 轉移序列表
通過表3的Step13將“對比服用地諾帕明、卡托普利病人再入院率”這句句子用本文的方法進行了依存關系生成,生成后的對應圖形如圖2所示。

圖2 “對比服用…病人再入院率”的依存關系圖
本文提出了一種依存關系的融合模型,其融合方式是基于Blending的方式。其中第一層分類器包括神經網絡模型以及XGBoost模型,第二層分類器則使用了隨機森林。具體地,本文Blending模型結構如圖3所示。

圖3 Blending模型示意圖
對于基于神經網絡的模型,本文利用了文獻[20]中的訓練方法,并進行了部分改進,具體描述如下:輸入的特征包括詞特征、詞性特征和依存關系特征三類特征。本文使用Word2vec來訓練對應的詞向量。因為在語料中會存在大量的數字,訓練這些數字的詞向量意義并不大,因此本文對數字都做預處理,用“num”來替代數字,即所有數字共用一個詞向量。訓練好的詞向量、詞性向量和依存關系向量均為200維,后兩者分別以方差為0.1的正態分布來進行初始化。
本文的神經網絡模型結構分為輸入層、兩層全連接層以及輸出層。其中第一層全連接層包括300個神經元,第二層全連接層包括200個神經元,輸出層為一個43維的向量,且激活函數為Cube函數y(x)=x3。本文一共使用了48個特征,每個特征用對應的200維向量來表示。圖4展示了模型的部分特征,其中s表示stack,b表示buffer,下標數字i(i=1,2)表示棧中第i個詞,lc(si)表示與棧中第i個詞完成最近一次左移操作的詞匯,反之,rc(si)表示與棧中第i個詞完成最近一次右移操作的詞匯。每個詞匯又都包括對應的詞、詞性和依存關系3個粒度上的特征。如果不存在對應特征,則賦值NULL。本文所使用的所有特征可詳見表4所示。

表4 特征模板

圖4 模型部分特征示意圖
同時本文還使用了XGBoost作為融合模型第一層中的另一個單模型。XGBoost作為一種高效的分布式Boosting模型,因為其算法學習速度快以及出色的訓練效果,而被廣泛使用。但是其本質上屬于梯度提升決策樹算法,在列抽樣時會破壞詞向量原有的信息。因此本文中XGBoost模型的輸入特征為詞匯在字典中的序號。在訓練模型完成之后,本文還輸出了特征重要性,在48維特征中,stack棧中詞匯的詞向量以及詞性向量對訓練是非常重要的。
首先對于醫生輸入的問題Q,利用jieba分詞后,將會生成一個詞序列wordList=[w1,w2,…,wn]。特別地,對于詞序列中的所有數字,均用“num”來替換。生成詞序列時,同樣調用jieba生成對應的詞性序列posList=[p1,p2,…,pn],其中數字“num”的詞性均為數詞m。然后將問題Q的詞序列和詞性序列作為模型的輸入,輸入到融合模型中進行預測。因為本文的任務是對病人信息及診斷療效進行統計,所有的問句均是以病人為中心展開提問,所以最終會得到一棵由“病人”為根節點連出的依存關系樹。例如問題為“未服用地諾帕明和卡托普利,入院次數小于6次的男性高血糖病人的人數?”,會生成表5所示的以CoNLL格式表示的依存關系樹。

表5 依存關系樹示例
首先對于依存樹中的依存關系,會將其映射到語義邏輯表達式上。依存關系與語義之間往往存在一對一或多對一的映射關系。下面將介紹本文的映射方法:
(1) 對于醫療事件約束,MedEvent_Mod關系與之直接構成映射關系。例如上例中“高血糖病人”,將會映射到λx.?y.DiseaseEvent(x,y)∧DiseaseName(y,″高血糖″)語義表達式上。
(2) 對于病人屬性約束,PatProperty_Mod關系與之直接構成映射關系。例如中的“男性病人”其語義表達式為λx.Gender(x,″男性″)。
(3) 對于邏輯運算約束,一共有與或非三種不同的約束,一般出現在醫療事件之間來表示對應的邏輯關系。
(4) 對于時間先后約束,用于約束醫療事件之間的時間先后關系。例如“患有高血壓前患有高血糖的患者”,將會映射到λx.?y1.?y2.DiseaseEvent(x,y1)∧DiseaseEvent(x,y2)∧DiseaseName(y1,″高血壓″)∧DiseaseName(y2,″高血糖″)∧Before(y2,y1)。
(5) 對于數值范圍約束,一般出現在病人屬性項中,限制病人的某個數值屬性,例如“入院次數小于6次”,會映射到語義表達式λx.λy.HospitalizationFrequency(x,y)∧Less(y,6)上。
(6) 對于統計目的約束,Query_rel依存關系與該語義直接構成映射關系,例如上述例子中的“高血糖病人人數”會映射到Count(λx.?y.DiseaseEvent(x,y)∧DiseaseName(y,″高血糖″))語義表達式上。
(7) 對于對比關系約束,用于約束“病人”,即比較的對象一定為不同類型的病人。
最終問句映射到對應的語義邏輯表達式后,則再需要將其翻譯成對應的Neo4j查詢語言Cypher。其中Cypher可以分為三類查詢子句,分別是:(1) match子句,用于匹配子圖,一般以MATCH(p)-[r]->(n)的格式出現,其中:p和n分別代表圖中的連接節點,r則表示節點之間的關系邊。(2) where子句,與SQL中where語句相似,用于條件限制。(3) return子句,則是用于返回最終的查詢目標。
本文利用啟發式規則的方法,最終會將表5例子中的語義邏輯表達式Count(λx.?y1.?y2.?y3.?n.(DrugEvent1(x,y1)∧DrugEvent2(x,y2)∧DrugName1(y1,″地諾帕明″)∧DrugName2(y2,″卡托普利″)).HospitalizationFrequency(x,n)∧Less(n,6).Gender(x,″男性″).DiseaseEvent(x,y3)∧DiseaseName(y3,″高血糖″)),翻譯為以下的Cypher查詢語句:MATCH(x)-[r1:HaveTaken]->y1),(x)-[r2:HaveTaken]->(y2),(x)-[r3:SufferFrom]->(y3)WHERENOT(y1.DrugName=″地諾帕明″ANDy2.DrugName=″卡托普利″)ANDy3.DiseaseName=″高血糖″ANDx.Gender=″男″ANDx.HospitalizationFrequency<6RETURNcount(x)。
本文用于測試系統性能和準確性的EHR數據來自上海中醫藥大學附屬曙光醫院,其中病人的診療信息都有詳細的記錄和時間戳,并將這些關系型數據庫中的數據存入圖數據庫Neo4j中。Neo4j庫中一共有204條病人記錄,324條疾病記錄,49條手術記錄,300條化驗記錄,182條藥品記錄,992條住院記錄,992條住院信息邊連接住院記錄和病人,4 838條醫囑信息邊連接藥品記錄和病人,2 792條診斷信息邊連接疾病記錄和病人,157條手術信息邊連接手術記錄和病人,117 771條化驗信息邊連接化驗記錄和病人。
本文的測試集(Test Set)共有261個醫療問題,具體由以下兩部分構成:(1) 本文經過德爾菲法(Delphi Method)向臨床醫生收集了144個自然語言問題,將其加入到測試問題集中。(2) 同時本文在萬方數據庫中,使用關鍵字檢索“電子病歷/電子健康病歷”、“統計/數據分析”和“流行病調查/臨床科研”三種不同條件組合下的文獻。在相關度排序前50篇的論文中,將16篇帶有臨床科研統計型問題的文獻加入到測試問題集中。同時也從Caliber Research Projects[21]中選取2016年-2017年發表的所有與醫療統計相關的12篇文獻中,對應的醫療統計問題也整合出來,共計117個問題。其中英語文獻中的問題由上海中醫藥大學附屬曙光醫院臨床醫生翻譯整理成中文問題。
因為目前仍缺乏大量且高質量的依存關系標注語料用于模型訓練。本文通過醫療文獻中收集的共86個醫療統計分析問題。同時歸納這些問題對應的句式模板,通過模板填充塊的方法,結合自定義的問句多樣性策略以及合法性策略,自動生成8 000條醫療統計分析問題的依存關系訓練語料,以及對應的依存關系CoNLL格式。其中6 000條作為訓練數據來訓練神經網絡以及XGBoost,2 000條數據作為驗證集,并根據Blending模型中第一層的模型生成新的特征,同時按照7∶3的比例劃分新的訓練集和驗證集,用于訓練第二層的隨機森林模型。最后本文為保證所生成語料的質量,隨機抽取了400個問題交給上海曙光醫院醫生進行打分,具體評分如表6所示。

表6 部分問句評分展示
在本文的神經網絡模型中,第一層全連接層均設為300維,第二層全連接層均設為200維。本文使用Word2vec方法進行詞向量和特征向量的預訓練,并將其作為嵌入層的初始化向量。訓練過程采用小批量梯度下降法,學習率設置為0.01,并選用了L2正則化,lam值設置為1e-8。為了防止梯度爆炸,本文使用了梯度裁剪的方法。對于XGBoost模型,其學習器個數為100,隨機列抽樣和行抽樣系數均設置為0.8。
同時本文選用了UAS和LAS作為模型的評測指標,具體定義如下:
(1) 無標記依存正確率(UAS):中心詞預測正確的詞匯數占總詞數的百分比,即:
(1)
(2) 帶依存標記正確率(LAS):中心詞預測正確并且中心詞的依存關系也正確的詞匯數占總詞數的百分比,即:
(2)
對于與文獻[4]中基于上下文無關文法的統計式問答系統的實驗對比,本文使用了如下評價指標查詢正確率,具體描述如下:

(3)
為了驗證模型的有效性,本文在4個方面做了對比實驗,如表7所示。首先,本文比較了Cube激活函數與其他三種常見的非線性激活函數,分別是Sigmod、Tanh和ReLU函數。可以明顯看出cube激活函數較其他三種函數有著更好的結果,相比較于Sigmod函數在LAS指標上提高了32.4百分點,UAS指標上提高了25.52百分點。這是因為本文的Cube函數h=(WwXw+WpXp+WdXd)3,相當于對詞、詞性、依存關系三個維度上進行了特征組合,故而取得了較好的效果。

表7 本文對比實驗的結果(%)
其次,本文依據XGBoost輸出的特征重要性進行特征篩選。本文剔除了重要性小于100的23維特征,在剔除的特征中,共有9維是屬于依存關系維度的。據此,本文為了比較不同特征對神經網絡模型性能的影響,可以看到48維特征相較于特征未篩選前25模型在UAS和LAS這兩個評價指標上分別高了1.20百分點和1.91百分點,這說明依存維度對于模型的訓練依舊非常重要。這是因為在上述提到的Cube函數中會對其和詞、詞性維度上的特征進行特征組合,而組合后會有助于模型的訓練。
本文使用的是基于Blending方法的融合模型,在Blending的第一層中使用的是神經網絡和XGBoost,第二層使用的則是隨機森林。為了驗證融合模型的效果,本文在261個測試問題集上,對兩個單模型以及融合模型做了性能比較。如表7所示,可以看到本文所使用的融合模型在UAS與LAS兩個評價指標上相比于神經網絡模型分別提升了0.99百分點、1.43百分點,而相比較于XGBoost模型上則分別提升了3.10百分點、2.98百分點。這證明了本文的融合模型在性能上有著較強的優勢。
同時本文還對依存關系模型和問答系統的性能與現有方法進行了比較。在依存關系模型方面,本文和目前市面最流行的依存關系分析工具LTP以及最經典的由Chen等[20]提出的基于神經網絡依存關系模型進行了對比。可以從表7看到本文提出的基于Blending方法的神經網絡和XGBoost的融合模型在性能上較前兩者均有提升。在UAS與LAS兩個評價指標上,相比于LTP分別提升了14.77百分點、20.07百分點,同時相比于Chen等[20]的模型則分別提升了1.35百分點、2.58百分點。
目前在醫療自然語言統計問答方面,只有文獻[4]與本文的研究目標一致。文獻[4]基于CFGs的解析正確率為68.97%,而本文基于依存關系方法的解析正確率為81.61%。本文方法能取得更好效果的原因是在文獻[4]中的上下文無關文法是利用規則遞歸生成問句中相鄰詞匯間的關系,很難將模板覆蓋全面,導致能正確解析出的句式有限。如對于問句“對比a病和b病患者的用藥分布”,文獻[4]中因為沒有制定相應的處理規則,無法生成對應的文法樹。而本文提出的依存關系樹是通過基于Blending的融合模型對醫療統計問題進行依存關系解析,能處理的句式相對自由,并將解析結果映射成語義表達式,翻譯成Cypher查詢語句后,從Neo4j中查詢得到結果,故而取得了比文獻[4]更好的效果,相較于文獻[4]在查詢結果正確率上提升了12.64百分點。
針對面向電子病歷的醫療自然語言統計問題,本文利用依存關系分析的方法來理解自然語言問題的語義。具體而言,本文定義了面向醫療統計問題的依存關系,并通過基于Blending的融合模型進行依存分析,將自然語言問題轉換成依存關系樹。先將依存關系樹映射至語義表達式,再根據表達式翻譯成對應的Cypher查詢語句,最終將查詢結果以圖表的形式返回給用戶。本文的工作還存在一些不足,當然也是未來準備完善的部分。像“年增長率”的問題,現在的圖譜還不支持,但未來只需要將其標注到正確的標簽中,根據規則查詢前一年的數據,結合本年數據后,保存查詢中間值來解決該問題。還會出現一些頭標簽、關系標簽的預測問題,以后可以根據先驗知識制定一些規則來限制預測的輸出,進一步提高精度。接下來會將圖譜進一步完善,使其能更好地支持醫療自然語言統計問答。