馬莉,劉靜海,肖楠樺,張妮
(桂林醫學院,廣西桂林 541004)
為了使網絡中的數據與信息具備“語義化”特征而方便機器理解,知識工程經歷了“語義網”“本體”“知識圖譜”三個載體。知識圖譜由百度公司2012 年提出,當時的目標是為了優化引擎搜索質量,提供用戶高查詢體驗質量。隨著智能化時代的到來,知識圖譜逐漸成為人工智能的最高階段——認知智能的一個必備工具,在人工智能(AI)中扮演著大腦的角色。有關知識圖譜的應用也層出不窮,其中問答系統目前最流行的應用。基于知識圖譜的問答系統能夠理解用戶輸入的自然語言問句,再通過知識圖譜中的實體、關系等查找準確的答案返回給用戶,從而提高信息搜索的效率。
現如今,越來越多的學者開始構建知識圖譜,面向疾病、醫藥等方向的知識圖譜層出不窮,比如,美國國立醫學院開發的一個較完整的醫學知識庫UMLS[1],它為醫學領域的發展帶來極大的便利。阮彤[2]等人通過對現有醫療知識圖譜的分析和探索,構建了中醫藥知識圖譜。昝紅英[3]等人構建了涵蓋了8772種癥狀的中文癥狀知識庫,李俊卓[4]等人構建了兒科疾病及保健知識的知識圖譜,但關于食療養生知識這一領域的知識圖譜并不多。近年來,人們對健康的意識日益增長,對食療養生知識的需求也越來越強烈。本文將研究食療養生領域知識圖譜構建,并實現基于該知識圖譜的問答系統,滿足人們對養生知識的獲取的需求。
國外問答系統的研究比較早,最早出現的問答系統是Weizenbaum 在1966 年設計的問答機器人ELIZA,它能扮演心理專家的角色,幫助精神病患者進行心理治療;IBM 的Waston 系統在2011 年的Jeopardy 問答競賽中擊敗了人類最優秀選手獲得冠軍引起了業界的大量關注,在Waston系統設想的框架中用到了幾乎所有的自然語言處理技術來幫助知識獲取以及自動問答;Minsuklee等人研發的MedQA[5]系統是一個面向醫生的醫療問答系統;MEANS[6]系統是一種基于語義技術的問答系統,但只能回答幾類問題的范圍十分有限,十類問題只能回到其中四類。AskCuebee[7]是專門針對寄生蟲知識的問答系統,它不把問題局限于特定的集合或模板。除此之外,蘋果公司Siri、Google Now、微軟Cortana移動生活助手也是基于問答系統技術開發的軟件。
問答系統按照領域可分為開放領域和限定領域兩大類。基于開放領域的能夠問答用戶的各種各樣問題,一般要用到信息檢索、信息抽取和自然語言處理等技術,目前已有一些常用的數據集如SQuAD、TriviaQA、CuratedTREC、WebQuestions 等。在國內,曹明宇[8]等從醫學指南及SemMedDB 知識庫中抽取出三元組,構建原發性肝癌知識圖譜,再在此基礎上,利用模板匹配的問句處理方法開發了原發性肝癌問答系統。賈李蓉[9]等人構建了一個基于中醫藥學語言系統的知識問答系統,該系統可以通過信息搜索功能找出相似度高的病案從而為用戶提供輔助診療建議。醫療健康一直是研究的熱點,在這方面不少學者已經取得一些成果。但目前國內對食療養生的問答系統研究還比較少,因此,本文設計基于知識圖譜的養生知識問答系統具有較強的實用性,能夠幫助用戶迅速查找食療養生知識。
目前廣泛運用的知識圖譜的構建方法主要有兩種:自底而上的構建方法和自頂而下的構建方法。自底向上指的是從數據源中取出實體,然后經過選擇加入到知識圖譜,再構建本體層的模式,一般通用領域的知識圖譜采用此種方式。自頂向下是指先定義好知識圖譜的本體數據模式,再將實體加入知識圖譜中,特定領域知識圖譜的構建對領域知識的深度和精度有很高的要求,需要先構建本體層[10]。本文的知識圖譜是面向特定領域,所以采用自頂而下的構建方法進行構建。即從擁有半結構化的數據網站上獲取數據源,隨后進行知識抽取、本體構建等操作,得到健康養生的知識圖譜。知識圖譜構建的流程圖如圖1所示。

圖1 養生知識圖譜構建的流程
模式層是知識圖譜的頂層設計,也可以說是知識圖譜的骨架,在工業領域稱之為schema,包含了這個領域中有意義的實體以及這些實體的關系。本文采用自頂向下的方式構建知識圖譜,選定“尋醫問藥網”的食療養生模塊為數據獲取的來源,最后確定了食療養生知識圖譜的模式層所需要實體、實體屬性和關系類型。
實體的六大類別為:疾病、功效、料理、人群、季節、食材,如表1所示。

表1 實體表
實體之間的關系如表2所示。

表2 關系類型表
1)數據來源
問答系統的質量與知識圖譜的質量息息相關,知識圖譜質量最重要的影響因素就是數據源的質量,因此在選擇數據源時要尤為慎重,綜上所述,通過對多種數據源的對比,本研究主要選擇了尋醫問藥網(https://www.xywy.com/)中的食療養生模塊作為本知識圖譜的數據來源,除此之外還選擇了其他具有相關數據的半結構化的網站,半結構化數據能在一定程度上節省構建知識圖譜時數據處理的時間。
確定數據源后,首先對尋醫問藥網中食療養生模塊中的網頁內容結構進行解析,本文主要采用lxml對網站進行解析,它能夠提供一些函數用來處理導航、搜索、修改分析書等功能。它能將復雜的HTML 文檔轉換成一個復雜的樹形結構,每個結點都是Python 對象。從網站頁面下div 模塊下獲取數據,利用Python 編寫爬蟲腳本對“尋醫問藥網”下的“食療健康”網頁進行數據爬取,最后將爬取下來的信息以Json字符串格式插入到MongoDB數據中[11]。
爬取下來的數據不是完全滿足知識圖譜的數據,還要對信息進行清理,為圖譜構建做準備。比如一些錯誤信息要進行過濾,還有一些混合信息要進行拆分,有一些信息要進行提取。比如料理的推薦食用時間一般都是幾個時間的組合,中間用豎線隔開,需要對字符串進行處理,提取出具體的時間再存儲到Neo4j知識圖譜當中。除此之外本文還使用正則表達式與split函數對原始數據進行清理。
2)知識融合
多樣性的數據來源能豐富了知識圖譜的數據量,但也帶來了數據信息冗余、知識間關聯不夠明確等問題。如從不同的網站抓取的數據源存在一些相同的信息,這是信息冗余;一種疾病名稱有簡寫和詳細的表達方式,這是知識間的關聯不明確。為了保證融合的有效性,需要結合知識融合技術對數據進行處理,即合并兩個知識圖譜。本文利用規則和實體對齊方法構建了一套疾病別名實體庫,并在此基礎上通過實體映射融合多源數據。
3)圖譜的存儲與可視化
目前常用的存儲知識的方式有三種,三元組形式的RDF存儲、關系型數據庫存儲和圖數據庫存儲。本項目結合實際情況,使用目前主流的Neo4j 圖數據庫作為知識圖譜數據的存儲數據庫,Neo4j 擁有圖數據的高性能、高可靠性、高可擴展性等優勢。
將數據導入后即可獲得如圖2所示的知識圖譜,該知識圖譜一共擁有29293個實體節點,121112條關系。
從圖2可以看出,知識圖譜中的實體擁有不同的顏色代表不同的含義,例如標注a的代表功效,標注b的代表食物,標注c的代表疾病,實體之間通過關系線連接在一起,這樣的界面更能讓用戶理解實體間的關系。

圖2 養生知識圖譜展示
本問答系統主要滿足用戶對于食療養生知識的問答需求,即用戶用自然語言輸入有關食療養生的問句,系統通過分析處理后將該問題的準確答案反饋給用戶。問答系統的構建主要包括以下6 個流程:問句輸入、問句預處理、問句分類、圖數據庫查詢、答案模板匹配及答案生成。如圖3所示。

圖3 問答系統構建流程圖
問句預處理是對輸入的問句進行清洗、分詞、詞性標注以及去停用詞。本文采用Python提供的Jieba包對問句進行分詞處理,將問句分解為一個個符合邏輯的詞語。
根據用戶對養生方面的需求,以及對如“百度知道”問答平臺中一些用戶對養生咨詢所提問題進行整理分析,最終整理出十四類問題,具體問題類型如表3所示:
在構建知識圖譜的過程中的預處理過程中已經構造好食療養生特征詞庫,通過actree 算法進行匹配后的特征詞傳入問句類型字典,得到與特征詞相匹配的詞類型,然后再根據提前構建的問句類型庫,找到特征詞對應的詞類型問句分類集合,判斷問句屬于哪種類型。
問句解析部分是根據問句分類得到的問句類型,編寫出對應的cypher查詢語句模板到知識圖譜中進行查詢,查詢到結果時將答案集合輸出給用戶。cypher是描述性的圖形查詢語言,擁有語法簡單、功能強大的特點,類似于關系型數據庫的SQL。
如針對關于問句類型為“由疾病推薦食物”的查詢語句模板如下所示:


針對關于問句類型為“食物適用人群”的查詢語句模板如下所示:

針對關于問句類型為“食物相克”的查詢語句模板如下所示:

答案生成部分是將獲取到的cypher查詢語句放到Neo4j圖數據庫中運行,然后將查詢到的答案存入[‘answer’]數組里,根據[‘question_type’]的類型不同使用對應的答案模板,最后將查詢到的結果與答案模板結合起來。如在返回關于疾病宜吃食物的問題答案時,應該返回該疾病的名稱、食物名稱,實現語句為:

若問答系統遇到了識別不了的問題或是沒有查詢到答案,則返回固定的模板"對不起沒有找到答案,知識庫有待完善",實現語句如下:

為了方便用戶操作,最后本問答系統用Flask 框架搭建了一個前端交互界面,界面簡潔操作簡單。
1)知識圖譜的實現與展示
首先,可以將構建的養生知識圖譜以可視化的形式展現,知識圖譜中展示了知識圖譜的實體數量、實體關系類別以及屬性值。
2)問答系統的實現與展示
在系統的前端界面中,用戶通過在輸入框輸入自然語言問句,點擊發送或者按下回車提交問題,成功提交問題之后,系統后臺通過處理后會以自然語言的形式返回給用戶答案。例如,用戶輸入“糖尿病適合吃什么”,系統首先會對問句根據疾病數據集進行匹配,用戶輸入的問題當中存在著“糖尿病”“適合”,問句將被分類為“disease_food”類,并構建出疾病的拼接Cypher語句:“m.name='糖尿病'”。下一步到問句解析,通過問句分類匹配到相應的查詢語句:MATCH(m:disease)-[r:disease_eat]-(n:eat)where m.name='糖尿病'return m.name,n.name。最后將查詢到的答案集合匹配到問題的答案模板。若在圖譜中沒有查詢到相關問題的答案,則返回固定的模板。具體展示圖如下圖:

圖4 “疾病忌吃食物”問答展示

圖5 “由疾病推薦菜”問答展示

圖6 “食物相克”問答展示
本文設計并開發了基于知識圖譜的食療養生知識問答系統,將知識圖譜運用于健康養生領域,結合知識圖譜的問答系統,使得人機交互更加快捷和人性化。目前該基于知識圖譜的問答系統已經具有一定的數據量,能對用戶簡單的問句進行處理并返回相關信息值。但同時由于數據來源有限,目前系統對健康食療養生領域的問答還不夠全面,在語義處理和詞義聯想等方面還處于基礎階段,還無法對用戶的一些復雜的提問方式提取出重點有效的信息進行處理。如何在用戶的各種提問下準確地提取用戶提問的有效信息和對相關語義的推理是我們下一步研究的主要方向。