黃詩怡, 李繼云
(東華大學 計算機科學與技術學院, 上海 201620)
目前中國心血管病(CVD,cardiovascular disease)病人數量高達2.9億。隨著城市化進程的加速,人口老齡化問題突出,及吸煙、身體活動不足、不合理膳食等不良生活習慣的盛行,心血管病患病率持續居高不下,并呈現出上升趨勢。心血管病死亡率占據首位,2018年心血管病死亡分別占農村、城市居民疾病死因的46.66%、43.80%[1]。心血管病住院總費用快速增長,國家心血管病的負擔逐漸加重,心血管病已經成為重大的公共衛生問題。雖然國內已經展開一系列心血管病社區防治工作并取得一定的成效,心血管病醫療質量也在不斷提高,但是隨著國民心血管病多個危險因素的流行趨勢明顯,防治工作仍然面臨著嚴峻的挑戰[2]。
自動問答系統作為互聯網時代信息獲取的一種有效途徑,為心血管病的防治帶來了新的機遇,成為進一步加強心血管病知識普及的一種手段。自動問答系統與書籍、海報、雜志等傳統的信息獲取方式不同,與傳統的搜索引擎也有所區別,目的在于提高信息獲取的效率,可以根據用戶提出的問句,直接返回精準而簡潔的答案。本文以現有的心血管病知識圖譜為數據支持,構建一個基于KV-MemNN(key-value memory network)模型的心血管病自動問答系統,通過挖掘知識圖譜中有價值的信息,加速心血管病知識的普及。
本文使用的心血管病知識圖譜共包含1 173個實體,2 381組實體關系和實體屬性。實體包括心血管病、癥狀以及藥物;實體關系包括疾病與癥狀之間的關系、疾病與藥物之間的關系,在此分別定義為相關癥狀、常用藥物關系。一個以心肌梗塞為中心的知識圖譜示例,如圖1所示??芍环N疾病往往對應多個相關癥狀關系、多個常用藥物關系。
為了確保知識圖譜的可用性,對其中的數據進行檢查與修正。
(1)數據存儲于5個.csv文件中,存在個別疾病名稱不一致的情況,需要統一修改為正確的名稱;
(2)個別疾病名稱與數據來源中的名稱不同,需要修正為數據來源中的名稱;
(3)該知識圖譜主要抽取自39健康網的疾病百科,又有部分其他來源的補充信息,存在少量表述方式的不一致,個別疾病與癥狀重名,但數量極少,影響不大,不作處理。此外,疾病的別名內容比較復雜,除了包含傳統意義上的別稱,還可能包含疾病的父類、某種子類、某種特征等等,導致疾病的一些別名可能與其他疾病或癥狀重名,需要對冗余的別名進行清理。為了完全避免部分別名與其他疾病或癥狀的重名問題,將一種疾病的所有別名作為一個整體看待。
處理后的知識圖譜以SPO三元組(subject, predicate, object)的形式統一存儲,并用實體表保存疾病、藥物、癥狀三種實體。

圖1 以心肌梗塞為中心的知識圖譜示例
本文運用Facebook AI研究院的Miller等人提出的KV-MemNN模型實現基于心血管病知識圖譜的自動問答,這個過程主要分為兩部分:問答數據集構建和自動問答實現。問答數據集構建為自動問答提供了數據支撐,自動問答實現則包含了最為關鍵的數據處理和模型計算過程。
問答數據集依賴于知識圖譜構建。針對知識圖譜中的關系和屬性,設計不同類型的問句模板。已知知識圖譜中包含疾病與藥物之間的常用藥物關系、疾病與癥狀之間相關癥狀關系、疾病的別名屬
性,以此設計根據疾病查詢常用藥物、相關癥狀、別名三種類型的問句模板。為了進一步豐富問句類型,對常用藥物、相關癥狀兩種關系進行逆向拓展,得到藥物與疾病之間的依存關系、癥狀與疾病之間的依存關系,以此設計根據藥物查詢可治療疾病、根據多個癥狀排查疾病兩種類型的問句模板。問句模板通過39健康網、百度知道以及使用搜索引擎檢索到的相關網頁信息搜集整理所得,與知識圖譜中對應的三元組進行整合。
整合過程分為兩種情況:其一是問句模板與單個實體整合,以相關癥狀關系為例,由于一種疾病對應多種癥狀,問句模板與同一種疾病的若干三元組進行整合,得到的問句以多個癥狀為答案;其二是問句模板與多個實體整合,只應用于相關癥狀的逆向關系,找到多個癥狀所對應的共同疾病,將問句模板與這些癥狀進行整合,得到的問句以共同疾病為答案。
問答數據集由五種問答數據整合,最終得到13 062組問答數據,每種問答數據以大約8∶1∶1的比例分別作為訓練集、驗證集、測試集。訓練集中包含所有問答模板。
自動問答基于KV-MemNN模型來實現。KV-MemNN模型建立于Weston等人的記憶網絡和Sukhbaatar等人的端對端記憶網絡的基礎之上,其體系結構如圖2所示。模型將數據源中的內容存儲于結構為(鍵,值)的記憶中,從而為知識源的編碼提供了更大的靈活性,使得模型能通過鍵來尋找與問題相關的記憶,并得到這些記憶相對應的值。因此,鍵的設計應該包含與問題匹配的特征,值的設計應該包含與答案匹配的特征。

圖2 模型的體系結構
本文以心血管病知識圖譜作為模型的數據源,自動問答實現的步驟如下:
步驟1對問句進行預處理,包括問句分詞和去停用詞。問句分詞以實體表為輔助,在預先完成實體匹配的基礎上進行。因為疾病、藥物、癥狀3種實體名稱中專有名詞比較多,并且長短不一,直接分詞可能造成混亂,從而導致問句原意完全改變,而這種方法可以避免這些名詞對分詞的干擾,保證準確識別出問句中的所有實體。本文選用哈工大LTP進行分詞,所得結果可以滿足分詞的需求。問句的停用詞包括標點符號、語氣詞、以及“請問”、“目前”等對問答過程不造成影響的短語。
步驟2數據的向量表示。首先,構建一個詞匯表,本文的詞匯表由知識圖譜以及訓練集中的詞匯組成,以詞匯的出現頻數倒序排列,預留空字符處于排列首位;其次,以各個詞匯在詞匯表中的位置作為索引id,將知識圖譜和訓練集、驗證集、測試集中的文本信息轉換為數值形式,使得知識圖譜的三元組、問答數據集的問句與答案,均能夠使用向量形式來表達。知識圖譜中的三元組轉換為鍵-值對形式,即向量(k1,v1),…,(kM,vM),作為模型的記憶。鍵由SPO三元組中的subject和predicate組成,值用object來表示,使得鍵與值分別包含與問句、答案匹配的特征。
步驟3Key hashing,也就是找出所有與問句有關的記憶。首先,借助知識圖譜,構建實體與其相關記憶之間的哈希表;其次,以問句中的實體為媒介,找出與各個實體相關的記憶(kh1,vh1),…,(khN,vhN)。
步驟4訓練部分。首先是Key addressing和Value reading的迭代過程。在尋址階段計算問句與相關記憶中每個鍵的相關性評分,公式(1):
phi=Softmax(A?X(x)·A?K(khi)).
(1)
其中,?.表示D維特征映射,A是一個d×D的特征矩陣。在讀取階段,以相關性評分為權重,對值加權求和,得到一個輸出向量o,公式(2):
o=∑iphiA?V(vhi).
(2)
假定q=A?X(x),使用輸出向量o對其更新,本文采用的是qj+1=Rj(qj+o)+bj,其中R、b分別為d×d、d×1的矩陣,則尋址階段的公式修改為公式(3):
(3)
然后是結果預測。經過H輪迭代后得到的預測結果為式(4):
(4)
其中,yi代表所有候選輸出,本文中B的取值與A保持一致。
模型通過Adam優化算法來最小化交叉熵損失,從而實現模型中矩陣A、B、R1,…,RH以及b1,…,bH的更新。訓練過程使用若干個epoch,每個epoch對訓練集中的問答數據進行一輪訓練,如果一個問答數據中包含多個答案,則問答數據分為多個訓練數據依次進行訓練。驗證集中的問答數據用于評估最佳模型,即準確率最高的模型,準確率的評估標準是所有候選答案中排名首位的預測答案是否正確。
最終模型在d=230,Hops=5時取得,對測試集的評估結果見表1。從評估結果可知,對于大多數問答數據排名首位的預測結果是準確的,并且無論是單個或是多個答案的問答數據,各個答案的相關排名都是比較靠前的。

表1 評估結果
對測試集中的五種問答數據進行分類評估,其結果見表2。已知前四種為多個答案的問答數據,最后一種為單個答案的問答數據,兩種數據都能得到較好的結果。此外,經過對訓練集、驗證集、測試集多次數據分配可知,不同的數據分配會影響五種問答數據各自的結果,但是測試集的整體結果差異不大。

表2 五種問答數據評估結果
本文以面向心血管領域的知識圖譜為基礎,構建了心血管病問答數據集,實現了基于KV-MemNN模型的自動問答系統,使得心血管病知識圖譜能夠以更容易接受的方式服務于非醫學專業人員,對心血管病知識的傳播具有一定的意義。同時也存在一些不足之處需要優化,其一是需要醫學專家的指導對知識圖譜進行更加全面的檢查與錯誤糾正;其二是知識圖譜的內容不夠豐富,有待進一步擴充;其三是問答數據集的模板庫還不夠廣泛,需要進一步搜集;此處可以將預訓練的詞向量應用于模型,進一步提高準確率。