馬莉,劉靜海,肖楠樺,張妮
(桂林醫(yī)學(xué)院,廣西桂林 541004)
為了使網(wǎng)絡(luò)中的數(shù)據(jù)與信息具備“語(yǔ)義化”特征而方便機(jī)器理解,知識(shí)工程經(jīng)歷了“語(yǔ)義網(wǎng)”“本體”“知識(shí)圖譜”三個(gè)載體。知識(shí)圖譜由百度公司2012 年提出,當(dāng)時(shí)的目標(biāo)是為了優(yōu)化引擎搜索質(zhì)量,提供用戶高查詢體驗(yàn)質(zhì)量。隨著智能化時(shí)代的到來(lái),知識(shí)圖譜逐漸成為人工智能的最高階段——認(rèn)知智能的一個(gè)必備工具,在人工智能(AI)中扮演著大腦的角色。有關(guān)知識(shí)圖譜的應(yīng)用也層出不窮,其中問(wèn)答系統(tǒng)目前最流行的應(yīng)用?;谥R(shí)圖譜的問(wèn)答系統(tǒng)能夠理解用戶輸入的自然語(yǔ)言問(wèn)句,再通過(guò)知識(shí)圖譜中的實(shí)體、關(guān)系等查找準(zhǔn)確的答案返回給用戶,從而提高信息搜索的效率。
現(xiàn)如今,越來(lái)越多的學(xué)者開(kāi)始構(gòu)建知識(shí)圖譜,面向疾病、醫(yī)藥等方向的知識(shí)圖譜層出不窮,比如,美國(guó)國(guó)立醫(yī)學(xué)院開(kāi)發(fā)的一個(gè)較完整的醫(yī)學(xué)知識(shí)庫(kù)UMLS[1],它為醫(yī)學(xué)領(lǐng)域的發(fā)展帶來(lái)極大的便利。阮彤[2]等人通過(guò)對(duì)現(xiàn)有醫(yī)療知識(shí)圖譜的分析和探索,構(gòu)建了中醫(yī)藥知識(shí)圖譜。昝紅英[3]等人構(gòu)建了涵蓋了8772種癥狀的中文癥狀知識(shí)庫(kù),李俊卓[4]等人構(gòu)建了兒科疾病及保健知識(shí)的知識(shí)圖譜,但關(guān)于食療養(yǎng)生知識(shí)這一領(lǐng)域的知識(shí)圖譜并不多。近年來(lái),人們對(duì)健康的意識(shí)日益增長(zhǎng),對(duì)食療養(yǎng)生知識(shí)的需求也越來(lái)越強(qiáng)烈。本文將研究食療養(yǎng)生領(lǐng)域知識(shí)圖譜構(gòu)建,并實(shí)現(xiàn)基于該知識(shí)圖譜的問(wèn)答系統(tǒng),滿足人們對(duì)養(yǎng)生知識(shí)的獲取的需求。
國(guó)外問(wèn)答系統(tǒng)的研究比較早,最早出現(xiàn)的問(wèn)答系統(tǒng)是Weizenbaum 在1966 年設(shè)計(jì)的問(wèn)答機(jī)器人ELIZA,它能扮演心理專家的角色,幫助精神病患者進(jìn)行心理治療;IBM 的Waston 系統(tǒng)在2011 年的Jeopardy 問(wèn)答競(jìng)賽中擊敗了人類最優(yōu)秀選手獲得冠軍引起了業(yè)界的大量關(guān)注,在Waston系統(tǒng)設(shè)想的框架中用到了幾乎所有的自然語(yǔ)言處理技術(shù)來(lái)幫助知識(shí)獲取以及自動(dòng)問(wèn)答;Minsuklee等人研發(fā)的MedQA[5]系統(tǒng)是一個(gè)面向醫(yī)生的醫(yī)療問(wèn)答系統(tǒng);MEANS[6]系統(tǒng)是一種基于語(yǔ)義技術(shù)的問(wèn)答系統(tǒng),但只能回答幾類問(wèn)題的范圍十分有限,十類問(wèn)題只能回到其中四類。AskCuebee[7]是專門針對(duì)寄生蟲(chóng)知識(shí)的問(wèn)答系統(tǒng),它不把問(wèn)題局限于特定的集合或模板。除此之外,蘋果公司Siri、Google Now、微軟Cortana移動(dòng)生活助手也是基于問(wèn)答系統(tǒng)技術(shù)開(kāi)發(fā)的軟件。
問(wèn)答系統(tǒng)按照領(lǐng)域可分為開(kāi)放領(lǐng)域和限定領(lǐng)域兩大類?;陂_(kāi)放領(lǐng)域的能夠問(wèn)答用戶的各種各樣問(wèn)題,一般要用到信息檢索、信息抽取和自然語(yǔ)言處理等技術(shù),目前已有一些常用的數(shù)據(jù)集如SQuAD、TriviaQA、CuratedTREC、WebQuestions 等。在國(guó)內(nèi),曹明宇[8]等從醫(yī)學(xué)指南及SemMedDB 知識(shí)庫(kù)中抽取出三元組,構(gòu)建原發(fā)性肝癌知識(shí)圖譜,再在此基礎(chǔ)上,利用模板匹配的問(wèn)句處理方法開(kāi)發(fā)了原發(fā)性肝癌問(wèn)答系統(tǒng)。賈李蓉[9]等人構(gòu)建了一個(gè)基于中醫(yī)藥學(xué)語(yǔ)言系統(tǒng)的知識(shí)問(wèn)答系統(tǒng),該系統(tǒng)可以通過(guò)信息搜索功能找出相似度高的病案從而為用戶提供輔助診療建議。醫(yī)療健康一直是研究的熱點(diǎn),在這方面不少學(xué)者已經(jīng)取得一些成果。但目前國(guó)內(nèi)對(duì)食療養(yǎng)生的問(wèn)答系統(tǒng)研究還比較少,因此,本文設(shè)計(jì)基于知識(shí)圖譜的養(yǎng)生知識(shí)問(wèn)答系統(tǒng)具有較強(qiáng)的實(shí)用性,能夠幫助用戶迅速查找食療養(yǎng)生知識(shí)。
目前廣泛運(yùn)用的知識(shí)圖譜的構(gòu)建方法主要有兩種:自底而上的構(gòu)建方法和自頂而下的構(gòu)建方法。自底向上指的是從數(shù)據(jù)源中取出實(shí)體,然后經(jīng)過(guò)選擇加入到知識(shí)圖譜,再構(gòu)建本體層的模式,一般通用領(lǐng)域的知識(shí)圖譜采用此種方式。自頂向下是指先定義好知識(shí)圖譜的本體數(shù)據(jù)模式,再將實(shí)體加入知識(shí)圖譜中,特定領(lǐng)域知識(shí)圖譜的構(gòu)建對(duì)領(lǐng)域知識(shí)的深度和精度有很高的要求,需要先構(gòu)建本體層[10]。本文的知識(shí)圖譜是面向特定領(lǐng)域,所以采用自頂而下的構(gòu)建方法進(jìn)行構(gòu)建。即從擁有半結(jié)構(gòu)化的數(shù)據(jù)網(wǎng)站上獲取數(shù)據(jù)源,隨后進(jìn)行知識(shí)抽取、本體構(gòu)建等操作,得到健康養(yǎng)生的知識(shí)圖譜。知識(shí)圖譜構(gòu)建的流程圖如圖1所示。
圖1 養(yǎng)生知識(shí)圖譜構(gòu)建的流程
模式層是知識(shí)圖譜的頂層設(shè)計(jì),也可以說(shuō)是知識(shí)圖譜的骨架,在工業(yè)領(lǐng)域稱之為schema,包含了這個(gè)領(lǐng)域中有意義的實(shí)體以及這些實(shí)體的關(guān)系。本文采用自頂向下的方式構(gòu)建知識(shí)圖譜,選定“尋醫(yī)問(wèn)藥網(wǎng)”的食療養(yǎng)生模塊為數(shù)據(jù)獲取的來(lái)源,最后確定了食療養(yǎng)生知識(shí)圖譜的模式層所需要實(shí)體、實(shí)體屬性和關(guān)系類型。
實(shí)體的六大類別為:疾病、功效、料理、人群、季節(jié)、食材,如表1所示。
表1 實(shí)體表
實(shí)體之間的關(guān)系如表2所示。
表2 關(guān)系類型表
1)數(shù)據(jù)來(lái)源
問(wèn)答系統(tǒng)的質(zhì)量與知識(shí)圖譜的質(zhì)量息息相關(guān),知識(shí)圖譜質(zhì)量最重要的影響因素就是數(shù)據(jù)源的質(zhì)量,因此在選擇數(shù)據(jù)源時(shí)要尤為慎重,綜上所述,通過(guò)對(duì)多種數(shù)據(jù)源的對(duì)比,本研究主要選擇了尋醫(yī)問(wèn)藥網(wǎng)(https://www.xywy.com/)中的食療養(yǎng)生模塊作為本知識(shí)圖譜的數(shù)據(jù)來(lái)源,除此之外還選擇了其他具有相關(guān)數(shù)據(jù)的半結(jié)構(gòu)化的網(wǎng)站,半結(jié)構(gòu)化數(shù)據(jù)能在一定程度上節(jié)省構(gòu)建知識(shí)圖譜時(shí)數(shù)據(jù)處理的時(shí)間。
確定數(shù)據(jù)源后,首先對(duì)尋醫(yī)問(wèn)藥網(wǎng)中食療養(yǎng)生模塊中的網(wǎng)頁(yè)內(nèi)容結(jié)構(gòu)進(jìn)行解析,本文主要采用lxml對(duì)網(wǎng)站進(jìn)行解析,它能夠提供一些函數(shù)用來(lái)處理導(dǎo)航、搜索、修改分析書等功能。它能將復(fù)雜的HTML 文檔轉(zhuǎn)換成一個(gè)復(fù)雜的樹(shù)形結(jié)構(gòu),每個(gè)結(jié)點(diǎn)都是Python 對(duì)象。從網(wǎng)站頁(yè)面下div 模塊下獲取數(shù)據(jù),利用Python 編寫爬蟲(chóng)腳本對(duì)“尋醫(yī)問(wèn)藥網(wǎng)”下的“食療健康”網(wǎng)頁(yè)進(jìn)行數(shù)據(jù)爬取,最后將爬取下來(lái)的信息以Json字符串格式插入到MongoDB數(shù)據(jù)中[11]。
爬取下來(lái)的數(shù)據(jù)不是完全滿足知識(shí)圖譜的數(shù)據(jù),還要對(duì)信息進(jìn)行清理,為圖譜構(gòu)建做準(zhǔn)備。比如一些錯(cuò)誤信息要進(jìn)行過(guò)濾,還有一些混合信息要進(jìn)行拆分,有一些信息要進(jìn)行提取。比如料理的推薦食用時(shí)間一般都是幾個(gè)時(shí)間的組合,中間用豎線隔開(kāi),需要對(duì)字符串進(jìn)行處理,提取出具體的時(shí)間再存儲(chǔ)到Neo4j知識(shí)圖譜當(dāng)中。除此之外本文還使用正則表達(dá)式與split函數(shù)對(duì)原始數(shù)據(jù)進(jìn)行清理。
2)知識(shí)融合
多樣性的數(shù)據(jù)來(lái)源能豐富了知識(shí)圖譜的數(shù)據(jù)量,但也帶來(lái)了數(shù)據(jù)信息冗余、知識(shí)間關(guān)聯(lián)不夠明確等問(wèn)題。如從不同的網(wǎng)站抓取的數(shù)據(jù)源存在一些相同的信息,這是信息冗余;一種疾病名稱有簡(jiǎn)寫和詳細(xì)的表達(dá)方式,這是知識(shí)間的關(guān)聯(lián)不明確。為了保證融合的有效性,需要結(jié)合知識(shí)融合技術(shù)對(duì)數(shù)據(jù)進(jìn)行處理,即合并兩個(gè)知識(shí)圖譜。本文利用規(guī)則和實(shí)體對(duì)齊方法構(gòu)建了一套疾病別名實(shí)體庫(kù),并在此基礎(chǔ)上通過(guò)實(shí)體映射融合多源數(shù)據(jù)。
3)圖譜的存儲(chǔ)與可視化
目前常用的存儲(chǔ)知識(shí)的方式有三種,三元組形式的RDF存儲(chǔ)、關(guān)系型數(shù)據(jù)庫(kù)存儲(chǔ)和圖數(shù)據(jù)庫(kù)存儲(chǔ)。本項(xiàng)目結(jié)合實(shí)際情況,使用目前主流的Neo4j 圖數(shù)據(jù)庫(kù)作為知識(shí)圖譜數(shù)據(jù)的存儲(chǔ)數(shù)據(jù)庫(kù),Neo4j 擁有圖數(shù)據(jù)的高性能、高可靠性、高可擴(kuò)展性等優(yōu)勢(shì)。
將數(shù)據(jù)導(dǎo)入后即可獲得如圖2所示的知識(shí)圖譜,該知識(shí)圖譜一共擁有29293個(gè)實(shí)體節(jié)點(diǎn),121112條關(guān)系。
從圖2可以看出,知識(shí)圖譜中的實(shí)體擁有不同的顏色代表不同的含義,例如標(biāo)注a的代表功效,標(biāo)注b的代表食物,標(biāo)注c的代表疾病,實(shí)體之間通過(guò)關(guān)系線連接在一起,這樣的界面更能讓用戶理解實(shí)體間的關(guān)系。
圖2 養(yǎng)生知識(shí)圖譜展示
本問(wèn)答系統(tǒng)主要滿足用戶對(duì)于食療養(yǎng)生知識(shí)的問(wèn)答需求,即用戶用自然語(yǔ)言輸入有關(guān)食療養(yǎng)生的問(wèn)句,系統(tǒng)通過(guò)分析處理后將該問(wèn)題的準(zhǔn)確答案反饋給用戶。問(wèn)答系統(tǒng)的構(gòu)建主要包括以下6 個(gè)流程:?jiǎn)柧漭斎搿?wèn)句預(yù)處理、問(wèn)句分類、圖數(shù)據(jù)庫(kù)查詢、答案模板匹配及答案生成。如圖3所示。
圖3 問(wèn)答系統(tǒng)構(gòu)建流程圖
問(wèn)句預(yù)處理是對(duì)輸入的問(wèn)句進(jìn)行清洗、分詞、詞性標(biāo)注以及去停用詞。本文采用Python提供的Jieba包對(duì)問(wèn)句進(jìn)行分詞處理,將問(wèn)句分解為一個(gè)個(gè)符合邏輯的詞語(yǔ)。
根據(jù)用戶對(duì)養(yǎng)生方面的需求,以及對(duì)如“百度知道”問(wèn)答平臺(tái)中一些用戶對(duì)養(yǎng)生咨詢所提問(wèn)題進(jìn)行整理分析,最終整理出十四類問(wèn)題,具體問(wèn)題類型如表3所示:
在構(gòu)建知識(shí)圖譜的過(guò)程中的預(yù)處理過(guò)程中已經(jīng)構(gòu)造好食療養(yǎng)生特征詞庫(kù),通過(guò)actree 算法進(jìn)行匹配后的特征詞傳入問(wèn)句類型字典,得到與特征詞相匹配的詞類型,然后再根據(jù)提前構(gòu)建的問(wèn)句類型庫(kù),找到特征詞對(duì)應(yīng)的詞類型問(wèn)句分類集合,判斷問(wèn)句屬于哪種類型。
問(wèn)句解析部分是根據(jù)問(wèn)句分類得到的問(wèn)句類型,編寫出對(duì)應(yīng)的cypher查詢語(yǔ)句模板到知識(shí)圖譜中進(jìn)行查詢,查詢到結(jié)果時(shí)將答案集合輸出給用戶。cypher是描述性的圖形查詢語(yǔ)言,擁有語(yǔ)法簡(jiǎn)單、功能強(qiáng)大的特點(diǎn),類似于關(guān)系型數(shù)據(jù)庫(kù)的SQL。
如針對(duì)關(guān)于問(wèn)句類型為“由疾病推薦食物”的查詢語(yǔ)句模板如下所示:
針對(duì)關(guān)于問(wèn)句類型為“食物適用人群”的查詢語(yǔ)句模板如下所示:
針對(duì)關(guān)于問(wèn)句類型為“食物相克”的查詢語(yǔ)句模板如下所示:
答案生成部分是將獲取到的cypher查詢語(yǔ)句放到Neo4j圖數(shù)據(jù)庫(kù)中運(yùn)行,然后將查詢到的答案存入[‘a(chǎn)nswer’]數(shù)組里,根據(jù)[‘question_type’]的類型不同使用對(duì)應(yīng)的答案模板,最后將查詢到的結(jié)果與答案模板結(jié)合起來(lái)。如在返回關(guān)于疾病宜吃食物的問(wèn)題答案時(shí),應(yīng)該返回該疾病的名稱、食物名稱,實(shí)現(xiàn)語(yǔ)句為:
若問(wèn)答系統(tǒng)遇到了識(shí)別不了的問(wèn)題或是沒(méi)有查詢到答案,則返回固定的模板"對(duì)不起沒(méi)有找到答案,知識(shí)庫(kù)有待完善",實(shí)現(xiàn)語(yǔ)句如下:
為了方便用戶操作,最后本問(wèn)答系統(tǒng)用Flask 框架搭建了一個(gè)前端交互界面,界面簡(jiǎn)潔操作簡(jiǎn)單。
1)知識(shí)圖譜的實(shí)現(xiàn)與展示
首先,可以將構(gòu)建的養(yǎng)生知識(shí)圖譜以可視化的形式展現(xiàn),知識(shí)圖譜中展示了知識(shí)圖譜的實(shí)體數(shù)量、實(shí)體關(guān)系類別以及屬性值。
2)問(wèn)答系統(tǒng)的實(shí)現(xiàn)與展示
在系統(tǒng)的前端界面中,用戶通過(guò)在輸入框輸入自然語(yǔ)言問(wèn)句,點(diǎn)擊發(fā)送或者按下回車提交問(wèn)題,成功提交問(wèn)題之后,系統(tǒng)后臺(tái)通過(guò)處理后會(huì)以自然語(yǔ)言的形式返回給用戶答案。例如,用戶輸入“糖尿病適合吃什么”,系統(tǒng)首先會(huì)對(duì)問(wèn)句根據(jù)疾病數(shù)據(jù)集進(jìn)行匹配,用戶輸入的問(wèn)題當(dāng)中存在著“糖尿病”“適合”,問(wèn)句將被分類為“disease_food”類,并構(gòu)建出疾病的拼接Cypher語(yǔ)句:“m.name='糖尿病'”。下一步到問(wèn)句解析,通過(guò)問(wèn)句分類匹配到相應(yīng)的查詢語(yǔ)句:MATCH(m:disease)-[r:disease_eat]-(n:eat)where m.name='糖尿病'return m.name,n.name。最后將查詢到的答案集合匹配到問(wèn)題的答案模板。若在圖譜中沒(méi)有查詢到相關(guān)問(wèn)題的答案,則返回固定的模板。具體展示圖如下圖:
圖4 “疾病忌吃食物”問(wèn)答展示
圖5 “由疾病推薦菜”問(wèn)答展示
圖6 “食物相克”問(wèn)答展示
本文設(shè)計(jì)并開(kāi)發(fā)了基于知識(shí)圖譜的食療養(yǎng)生知識(shí)問(wèn)答系統(tǒng),將知識(shí)圖譜運(yùn)用于健康養(yǎng)生領(lǐng)域,結(jié)合知識(shí)圖譜的問(wèn)答系統(tǒng),使得人機(jī)交互更加快捷和人性化。目前該基于知識(shí)圖譜的問(wèn)答系統(tǒng)已經(jīng)具有一定的數(shù)據(jù)量,能對(duì)用戶簡(jiǎn)單的問(wèn)句進(jìn)行處理并返回相關(guān)信息值。但同時(shí)由于數(shù)據(jù)來(lái)源有限,目前系統(tǒng)對(duì)健康食療養(yǎng)生領(lǐng)域的問(wèn)答還不夠全面,在語(yǔ)義處理和詞義聯(lián)想等方面還處于基礎(chǔ)階段,還無(wú)法對(duì)用戶的一些復(fù)雜的提問(wèn)方式提取出重點(diǎn)有效的信息進(jìn)行處理。如何在用戶的各種提問(wèn)下準(zhǔn)確地提取用戶提問(wèn)的有效信息和對(duì)相關(guān)語(yǔ)義的推理是我們下一步研究的主要方向。