蔡宇翔,王佳斌,鄭天華
(華僑大學(xué)工學(xué)院,福建 泉州 362021)
隨著信息時代的繁榮發(fā)展,足不出戶的網(wǎng)絡(luò)問診已經(jīng)成為了許多人的診療首選。但是,現(xiàn)如今的網(wǎng)絡(luò)問診還存在著一些問題,如大部分的網(wǎng)絡(luò)診療都是醫(yī)生利用業(yè)余時間作答,并不能保證回答的實時性等。針對這些問題,本文設(shè)計了一個基于知識圖譜的醫(yī)療領(lǐng)域問答系統(tǒng),并對其相關(guān)工作進(jìn)行了研究。
知識圖譜以<實體,關(guān)系,實體>的結(jié)構(gòu)來進(jìn)行表示,相較于傳統(tǒng)的關(guān)系模型,在知識表示與檢索方面具有十分明顯的優(yōu)勢[1]。醫(yī)學(xué)領(lǐng)域是知識圖譜使用最廣泛、最成功的領(lǐng)域之一,在診斷、預(yù)防等方面都可以發(fā)揮巨大的作用。任燕春等[2]構(gòu)建了一個新冠肺炎的知識圖譜,用于進(jìn)行新冠肺炎的智能問答。知識圖譜作為一種新型的知識表示方式,為問答系統(tǒng)提供了有力的數(shù)據(jù)支撐。
構(gòu)建知識圖譜方式有2 種,分為自頂向下與自底向上。而構(gòu)建封閉領(lǐng)域的知識圖譜一般采用自頂向下的方式[3]。主要步驟是知識的采集度、處理與存儲。
醫(yī)學(xué)領(lǐng)域的數(shù)據(jù)要求較高的專業(yè)性,所以經(jīng)過認(rèn)真的對比之后,本文使用爬蟲技術(shù)對醫(yī)學(xué)類專業(yè)網(wǎng)站進(jìn)行知識的采集。這類數(shù)據(jù)屬于未經(jīng)處理過的非結(jié)構(gòu)化數(shù)據(jù),需要對數(shù)據(jù)進(jìn)行清理。
通過使用python 中的urlib 模塊進(jìn)行網(wǎng)頁的爬取,并使用正則表達(dá)式對網(wǎng)頁數(shù)據(jù)中的網(wǎng)頁結(jié)構(gòu)等無關(guān)數(shù)據(jù)進(jìn)行過濾,再以<字段名:值>的鍵值對形式進(jìn)行存儲。其中鍵值對中的字段名是根據(jù)網(wǎng)頁數(shù)據(jù)的結(jié)構(gòu)提前設(shè)計好的關(guān)系類型與屬性類型。采集的每條數(shù)據(jù)以疾病實體為主體,采集疾病的屬性。共有7 種實體,分別為疾病、別名、癥狀、發(fā)病部位、科室、并發(fā)癥和藥品。共有6 種實體關(guān)系,分別為疾病實體與其他各個實體的關(guān)系。疾病實體共有8 種屬性,分別為發(fā)病人群、是否醫(yī)保、傳染性、檢查項目、治療方法、治療周期、治愈概率以及治療費用。
Neo4j 是使用最為廣泛的NoSQL 圖形數(shù)據(jù)庫,Neo4j 的最基本單位是實體、關(guān)系和屬性,可以直觀地表示知識圖譜。在數(shù)據(jù)的查詢方面,Neo4j 的Cypher查詢語句簡單易用、查詢效率高。將之前處理好的數(shù)據(jù)使用python 語言通過py2neo 接口導(dǎo)入Neo4j 數(shù)據(jù)庫中,以完成知識圖譜的存儲。
Spark 是一種分布式計算框架,相比于基于磁盤的MapReduce,Spark 基于內(nèi)存,支持將需要重復(fù)使用的數(shù)據(jù)保存在內(nèi)存之中,不需要反復(fù)對磁盤進(jìn)行讀取、存儲操作,減少了數(shù)據(jù)加載耗時,可以有效提高迭代計算的能力,保證了計算的實時性。RDD(Resilient Distributed Dataset,彈性分布式數(shù)據(jù)集)是Spark 的核心概念,是一種分布式的數(shù)據(jù)結(jié)構(gòu),主要使用它來進(jìn)行數(shù)據(jù)的分布式存儲與計算。
問答系統(tǒng)通常有語義解析和模板匹配2 種方法,語義解析是將輸入的問題轉(zhuǎn)換為讓知識庫可以讀懂的邏輯形式,再進(jìn)行查詢。模板匹配方法較為常用,通過實體抽取等自然語言處理技術(shù)將問句轉(zhuǎn)化為三元組,與對應(yīng)的查詢語句模板進(jìn)行匹配,再使用知識圖譜進(jìn)行查詢[4]。對于用戶輸入的問句,先進(jìn)行過濾停用詞等預(yù)處理,通過相似度計算來抽取問句中的實體,再使用文本分類方法來進(jìn)行問句的意圖識別,最后匹配到預(yù)先設(shè)置好的查詢模板中,在知識圖譜中搜索并返回答案。
為了更好地抽取問句中的實體,本文結(jié)合Spark計算框架,設(shè)計了基于相似度的實體匹配算法。Spark計算框架是基于內(nèi)存計算,極大地減小了磁盤IO 開銷,可以大幅度提高處理效率。該算法利用相似度的計算,將問句中的實體與醫(yī)療實體庫中的實體進(jìn)行匹配。相似度的計算主要使用最小編輯距離和詞向量的余弦相似度進(jìn)行度量。最小編輯距離是指將字符串A改寫為字符串B 時至少需要多少次的編輯操作。單詞的插入、替換和刪除字符操作即為編輯操作。編輯距離的相似度計算公式為:
式(1)中:SED為字符串A 轉(zhuǎn)換為字符串B 需要經(jīng)過的編輯次數(shù);MAX(LA,LB)為字符串A 和B 中較長的字符串的字符數(shù)。
該方法便于理解,易于實現(xiàn),同時也可以很好地在字符層面度量相似度。但是基于編輯距離的相似度計算方法對于2 個同義詞,例如“開心”和“快樂”,并不會有很好的效果,所以在該方法的使用上結(jié)合Word2Ⅴec 詞向量。Word2Ⅴec 是MIKOLOⅤ提出的一種基于神經(jīng)網(wǎng)絡(luò)的概率模型[5],對比傳統(tǒng)的高維向量,可以簡化計算,且不會引起維度災(zāi)難。
Word2Ⅴec 分為skip-gram 和CBOW 兩種方式,在本文的詞向量訓(xùn)練中使用的是skip-gram 模型。CBOW模型是通過前后的n個詞來預(yù)測中心詞出現(xiàn)的概率,而skip-gram 模型則是通過中心詞來預(yù)測前后的n個詞。詞向量的余弦值可以反映詞語在語義層面的相似度,計算公式為:
式(2)中:a、b為字符串A、B 的詞向量組;ai與bi為其中的第i個向量。
將最小編輯距離和詞向量的余弦相似度相加求平均,作為實體間的相似度。本文使用Spark ML 機(jī)器學(xué)習(xí)算法庫進(jìn)行Word2Ⅴec 詞向量的訓(xùn)練,并在Spark 上實現(xiàn)了相似度算法的并行化。
首先分別生成問句實體與醫(yī)療實體庫中實體的Word2Ⅴec 詞向量的RDD,并將其進(jìn)行JOIN 操作,逐一計算相似度,進(jìn)行排序,最后輸出相似度最高的醫(yī)療實體。經(jīng)過測試,該方法相較于分別使用最小編輯距離與詞向量的余弦相似度,擁有更好的效果。
對于用戶輸入的問題,經(jīng)過實體抽取模塊后,還需要判斷問句的意圖。本文設(shè)計了7 種問句類型,通過意圖識別分類器將問句匹配到相應(yīng)的問句類型中。7種問句類型包括查詢疾病、查詢癥狀、查詢治療方法、查詢檢查項目、查詢所屬科室、查詢治愈率以及查詢治愈周期。在分類任務(wù)常用的機(jī)器學(xué)習(xí)算法有支持向量機(jī)、樸素貝葉斯等。其中支持向量機(jī)具有健壯性好、正確率高等優(yōu)點,被廣泛運用在文本分類、語音識別等分類任務(wù)中[6]。因此,本文使用Spark ML 機(jī)器學(xué)習(xí)庫的支持向量機(jī)方法進(jìn)行分類,利用并行化技術(shù)提高計算效率。在得到問句的實體信息與意圖后,使用提前設(shè)置好的模板,將問句轉(zhuǎn)換為查詢語句,在Neo4j數(shù)據(jù)庫中進(jìn)行查詢,得到答案。
本文使用精確率、召回率和F1 值作為評價指標(biāo)。這些也是自然語言處理任務(wù)中被廣泛運用的指標(biāo)。
在實體抽取中,在中文醫(yī)學(xué)問答數(shù)據(jù)集cMedQA中任意選擇了300 條問句,對其中的實體進(jìn)行手工標(biāo)注。分別對基于編輯距離、基于詞向量和兩者相結(jié)合的方法進(jìn)行對比測試,得到的結(jié)果如表1 所示??梢钥闯?,兩種方法結(jié)合可以提高實體抽取算法的準(zhǔn)確度。
表1 實體抽取效果對比(單位:%)
對于意圖識別問題,本文先使用Spark ML 庫中的Word2Ⅴec 詞向量工具將問句轉(zhuǎn)化為向量形式,再訓(xùn)練分類器對其進(jìn)行分類。在中文醫(yī)學(xué)問答數(shù)據(jù)集cMedQA 選擇了符合本文問句類型的1 400 條問句,其中每個類別為200 條,訓(xùn)練集與測試集比例為4∶1。對2 種算法分別進(jìn)行測試,結(jié)果如表2 所示。可以看出,支持向量機(jī)的F1 值要高于樸素貝葉斯,所以在意圖識別模塊中,本文使用支持向量機(jī)進(jìn)行分類。
表2 分類效果對比(單位:%)
為了驗證本系統(tǒng)的效果,需要進(jìn)行問答功能的測試。本文在中文醫(yī)學(xué)意圖數(shù)據(jù)集CMID 中選擇了300條適合該問答系統(tǒng)回答范圍的問句進(jìn)行測試。每次從數(shù)據(jù)集中隨機(jī)選擇100 條問句進(jìn)行測試,共進(jìn)行3 組測試。在測試結(jié)果中,每組平均返回了83.3 個回答,其中74 個回答正確結(jié)果,得到了74%的準(zhǔn)確率與88.8%的精確率,說明該系統(tǒng)具有一定的實用價值,可以回答一些簡單的醫(yī)療問題。
本文通過知識采集、處理、存儲等步驟,構(gòu)建了一個專業(yè)的醫(yī)學(xué)類知識圖譜,并使用了結(jié)合編輯距離和詞向量的相似度算法進(jìn)行實體抽取,同時使用支持向量機(jī)分類器識別問句的意圖。并結(jié)合Spark 分布式計算框架,實現(xiàn)問句解析算法的并行化。但是該問答系統(tǒng)還存在著一些缺陷,例如無法進(jìn)行復(fù)雜關(guān)系問題的問答以及知識圖譜的規(guī)模需要擴(kuò)大。