朱淑媛 羅 軍
(重慶大學計算機學院 重慶 400044)
隨著信息時代技術的發展,人們越來越習慣在互聯網上獲取各種各樣的信息。傳統的搜索引擎,用戶只能基于關鍵詞進行檢索,這并不能充分表達用戶的搜索意圖;對不熟悉專業領域的業余人員在詢問他們感興趣的領域問題時,往往也很難精準描述領域專業術語導致關鍵詞匹配失敗?;陉P鍵詞匹配檢索返回的候選結果也難做到問題和答案的相關度吻合。用戶要從大量的候選結果中定位目標結果,這種方式的準確率和召回率往往很低,用戶體驗較差。因此,自動問答系統應運而生。自動問答系統(Automatic Question and Answering System),簡稱問答系統(QA),是指接受用戶以自然語言形式描述的提問,并從大量的異構數據中查找出能回答該提問的準確、簡潔答案,并非相關文檔的信息檢索系統[1]。
目前,研究問答系統的文獻有很多。已被廣泛使用的問答系統大部分基于FAQ(常見問題及答案庫),采用基于字符串匹配的方法[2-4],這種方法一般不考慮語義因素。針對語義的問答系統(SQA)[5-7],運用自然語言處理技術(NLP),借助信息檢索(IR)從網絡中檢索答案成為了研究熱點。基于語義的問答彌補了關鍵詞匹配不到的不足,通過運用關鍵詞的語義相識度模型(如wordnet等)進行語義相識度查詢擴展,大大提高了問答回答的召回率,使得用戶可以從掌握他們想要查詢領域的特定詞匯的需求中解放出來。
不幸的是,隨著開發數據鏈接(linked open data)的發展,互聯網散落了大量異構的知識元數據沒有得到高效的組織管理,鏈接的數據云已經從Web上構建了數十億個事實。如此龐大的數據量使要訪問給定的所需信息變得復雜,導致SQA問答的研究受知識庫表達的限制。本體是一種能在語義和知識層次上描述知識信息的概念模型,通過概念和關系的抽取,把互聯網文本內容組織成為結構化的以實體為基本語義單元的圖結構,圖上的邊表示實體之間語義關系[8]。近年來,本體在概念的抽取、表示、融合、推理、問答等關鍵問題上得到了一定的解決和突破。通過構建領域本體知識庫來管理互聯網上的語義元元素,不僅保證了查詢的語義關聯,同時利用本體的一致性原則對領域知識做明確規范,可以避免Web知識庫中大量冗余的原始數據,優化查詢的時間消耗。因此我們可以通過研究自然語言問題到本體知識庫的映射,實現面向結構化網絡的問答系統。但由于自然語言問題文法結構的復雜性,要完成問題在知識本體上的查詢、匹配、推理等操作還面臨很多挑戰。需要解決的有兩個核心問題。第一個是如何理解問題語義,并用計算機可以接受的形式進行表示。問題詞匯和概念之間存在“詞匯鴻溝”,一個概念可有多個描述詞,例如,hypertension和高血壓有著相同的語義,同一語義的問題也存在多種提問句式。這些都給問題的理解帶來困難。第二個是如何在理解問題的基礎上把問題轉化為結構化的查詢語句SWRL、SPARQL等。目前主流的基于深度學習的QA系統可以把傳統的問句語義解析、文本檢索、答案抽取與生成的復雜步驟轉變為一個可學習的過程[9-10]。這種學習生成的方式雖然取得了一定的效果,但由于方法依賴大量的訓練語料,且多是針對語義層次單一的問題設計的,對于復雜問題的回答能力尚且不足。目前,針對語義層次復雜的問題,另外一種主流方法是通過語義分析,運用范疇語法(Category CompositionalGrammar,CCG)以及依存組合語法(Dependency-based Compositional Semantics,DCS)等將用戶的自然語言問句轉化成結構化的語義表示[11-12]。針對中文的漢語框架網(Chinese FrameNet,CFN)[13]就是山西大學運用根據漢語語法規則在Fillmore的框架語義學理論基礎上參照加州大學伯克利的FrameNet構建的漢語詞匯語義框架知識庫。該框架由框架元素、詞元和句子三部分組成。框架元素用來標識語義角色;詞元記錄框架涉及的相關詞語;句子記錄用框架標注好語義信息的句子。受李茹等[14]用CFN來解析旅游領域問題語義結構的啟發,本文在此基礎上進行改進,結合CFN漢語框架網,給出從領域知識本體直接生成能理解問題語義的QFN問題框架本體的映射算法用來解析問題語義。
由于近幾年人工智能及精準醫療、智慧醫療的提出,醫學知識本體應用正受到國內外企業、學界的廣泛關注,目前的醫學知識本體庫有:醫學概念知識庫LinkBase、TAMBIS本體庫(TaO)等。人工構建的醫學知識庫本體如包括臨床醫學知識庫、SNOMED-CT、ICD-10以及用CHV和SNOMED-CT兩個醫學詞典自動構建醫學知識庫的典型例子一體化醫學語言系統UMLS也得到了不錯的實驗結果[15]。利用這些醫學知識本體進行自動問答,有望帶來更廉價、高效、精準的醫療建議和診斷。因此,本研究將以醫療領域作為實例,通過重構已有的醫學知識本體,分析基于醫療領域的本體自動問答系統來論證方法的有效性。
問題到本體映射的最終目的是通過重構原始問題來理解問題的語義。由于本體知識庫的知識組織是由基本元素(包括類、實例、對象屬性、數據屬性)組成,而自然語言描述體系的語法結構是由詞進行表達的。因此,問題到本體的映射需要各種各樣的自然語言處理技術。本文采用的映射過程大致可分為命名實體標注和QFN語義解析兩部分。圖1是問題映射到本體的命名實體標注過程。對輸入的自然語言問題首先通過分詞,詞性識別,關鍵詞抽取等NLP技術獲得一系列的詞(Word)。然后對詞的語義屬性添加實體(Entity)標注信息,如開放域屬性人名、地名、數字、日期,領域屬性疾病名、藥品名、治療方式等,以及利用本體的語義結構擴展的同義詞,等價詞,父子概念等標注信息。接下來再對重構問題進行問題在語義層次的理解。

圖1 問句命名實體標注過程
用命名實體的識別通常運用詞林的規則匹配,如英文詞林WordNet,中文的哈工大同義詞詞林等。但詞林詞典的結構往往龐大且缺乏針對特定領域的專業術語詞匯[16],在限定領域內進行實體識別顯然是不合適的。本文在進行命名實體識別的過程中在傳統基于詞林的實體識別上引入本體自身天然的對領域內相關概念和概念之間關系具有描述特性,在醫學本體中,加入如圖2所示的實體匹配詞典。

圖2 醫學本體內實體匹配詞典
實體匹配詞典從領域本體中挖掘所有的概念(實體)作為最小語義單位,生成概念庫。每個概念對應一個描述該概念的術語集合。例如,高血壓是領域本體里一個概念,它可以用術語集合高血壓、high blood pressure和hypertension表示。
考慮術語集合中的元素通常由一個詞或多個詞組成,單個詞就是自然的索引詞,而術語中的一些知識成分,如大部分屬性的術語集合通常是一個比較完整的自然語言片段。本文通過在問題的自然語言描述詞、領域本體的術語集合、術語對應的概念之間建立索引,構建如圖3所示的問題到實體映射的鏈式數據結構,用于標注問題中領域命名實體。

圖3 實體映射的鏈式數據結構
算法1具體描述了從自然語言問句中標注領域命名實體的方法。
算法1問句標注領域命名實體的方法
輸入:醫學本體,自然語言問題。
輸出:已標注領域命名實體的問題。
1) 借助Jena解析醫學本體。
(1) 提取類概念,屬性概念,實例概念加入到領域本體圖2中的“概念”類。
(2) 將“概念”類中的每個概念的實例的同義詞,等價詞生成領域本體圖2中的“術語”類。
(3) 添加屬性關系<有對應術語>連接概念類和術語類中的實例。
2) 對術語類下的每個實例:根據命名規則,采用中科院的分詞工具(ICTCLAS)分詞生成索引圖(3)所示的索引詞Indexword。
3) 同2)中規則,將自然語言問句分詞生成一系列詞序列Q(Q-word1,Q-word2,…,Q-wordn)。通過索引詞在Question→Index word→Term table→Concept table流動。將問句的關鍵詞標注為本體知識庫中醫學領域命名實體。
CFN語義網絡解析問題框架結構[14]的思路是對一個問題,獲取RDF三元組,即提取問題的語義謂詞以及對應的主體和客體。例如文獻[14]提到的用“[到達/Arriving框架]”來解析例句“駕車從太原到五臺山怎樣走最近?”,給出如圖4所示的到達框架結構。根據CFN標注結果為:“

架名到達定義指轉移體朝目的地方向的移動。目的地可直接表達出來,或從上下文中得到理解,動詞本身隱含目標之義核心框架元素:目的地[Goal]目的地表現的是轉移體運動終止之地,或行將終止之地轉移體[Thm]轉移體指移動的物體非核心框架元素:并行轉移體[Thm_c]并行轉移體指除轉移體以外的其他移動的物體形容[Dep]形容指用來描寫轉移體到達的狀態目的地狀態[G_c]轉移體到達目的地時目的地所呈現出的狀態修飾[Manr]表現修飾的話語用于對動作特性的描述,用來描述運動的速度、姿態以及其他情況方法[Mns]用于表現轉移體到達的方式傳送模式[MoT]傳送模式指作用于主體的運動模式,通過傳送主體的主體身體或交通工具而實現軌道[Path]軌道指運動的軌道,既非源點,也非目的地源點[Src]源點即明確表達運動的出發點,該框架中出現表達源點的用語是可能的,但出現的頻率卻相對不高時間[Time]該框架元素表現到達這一動作出現的時間詞元到達v,來到v,進入v,抵達v,返回v,走到v,走進v,趕到v,回來v,歸來v,到v,回到v
圖4 CFN中“到達”框架結構
本文提出的QFN是在傳統的CFN上,把領域本體的語義結構提取出來,構建的一個帶有語義關聯的問題框架網,這個框架網絡又是利用本體來管理和維護的。圖5是根據CFN框架網絡和本體元素的語義關聯構建的一個QFN本體模型。

圖5 問題框架本體結構
框架名類定義的查詢問題的框架,詞元類是和該框架相關的字、詞表達,用來作為特征識別問題對應的框架。Slot類是CFN中‘框架元素’的等價類,Value類是CFN中‘詞元’的等價類。Type類存放實例、屬性、類三個實例,關聯領域本體知識庫對應元素即Value值所屬的類別。句子庫類描述從領域本體知識庫中抽取的與框架相關的RDF三元組關系。QFN本體的映射可以用圖6描述。

圖6 領域本體到框架元素的映射算法
圖6左邊是傳統CFN框架網絡的結構,右邊是領域本體的結構。從領域本體到傳統CFN框架的映射算法具體描述如算法2。通過該映射算法,可以根據領域知識庫自動生成該領域下的QFN框架結構用于問題結構的解析。當領域本體信息更新的同時,系統可以自動檢測并更新QFN框架。
算法2領域本體到框架元素的映射算法
輸入:領域本體,傳統CFN框架結構。
輸出:圖6所示的框架名和Slot槽之間的關聯關系。
算法步驟:
Begin
1:For each Individual框架名屬于Class框架名do
2:根據框架名的實例在領域本體中映射到對應的知識類元素。完成Individual框架名到本體類元素的映射,得到映射類C1~Ck
3:For類Ci在領域本體中已存在的屬性P1~Pk do
4:識別屬性pj關聯的主體Sij和客體Oij。作為實例加入到Slot類。
5:在框架名和Slot槽之間添加對應的has slot關聯:
6:將領域本體Sij類和Oij類的下的所有Individual添加到Value類。
7:For Ik in Sij添加對應的has Value關聯
8:end for
9:For Ik in Sij添加對應的has Value關聯
10:end For
11:end For
12:在句子庫中加入模式(
13:end For
End
表1以“診斷”框架為例,描述了從領域知識本體中自動生成的QFN框架的框架內容的過程。

表1 診斷的QFN框架本體的框架結構
如問句“繼發性高血壓/去/醫院/要做/哪些/檢查/?”經過命名實體識別可以得到(繼發性高血壓,疾病類,實例)/(醫院類,類)/(實驗室檢查,物理檢查,病癥檢查,類)。根據QFN進行標注,計算框架語義相似得到如下結果:
dis_top1:診斷框架
涉及相關RDF句子庫topk:<[solt=疾病value=繼發性高血壓 type=實例],[患病實驗室檢查 type=屬性],[slot=實驗室檢查 value=null type=實例]>
<[solt=疾病 value=繼發性高血壓 type=實例],[患病病癥檢查 type=屬性],[slot=病癥檢查 value=null type=實例]>
<[solt=疾病 value=繼發性高血壓 type=實例],[患病物理檢查 type=屬性],[slot=物理檢查 value=null type=實例]>
……
SPARQL是為RDF數據模型定義的查詢語言和數據獲取協議[17]。對產生單一關系的問句,基于QFN框架,在解析出的RDF三元組上,只要分析出這個問句中所有已知和未知的成分信息,構建簡單SPARQL查詢語句,并且這些信息能夠在領域本體知識庫中做出相應的解釋,那么就可以認為這個領域問句被理解了。
對包含多個關系的復雜問句,本文分解RDF查詢語義圖,分別構建SPARQL查詢語句。這里分為兩種情況:(1) 并列關系:提取關系之間是并列的關系,即屬性節點位于查詢語義圖同一層次。此時,分別輸出各關系的查詢語句。(2) 嵌套關系:關系與關系分別處于查詢語義圖的不同層次。此時,從低層次到高層次根據屬性的層次關系,依次組裝SPARQL查詢語句。
對于一個復雜的SPARQL查詢Q(G,S,F):本文給出如下定義:
Q(G,S,F)表示一組簡單SPARQL查詢的集合。其中G={G1,G2,…,Gn}是基礎RDF三元組生成的語義查詢圖。S={S1,S2,…,Sn}是一組SELECT或者ASK頭集合。F={f1,f2,…,fn}是一組過濾表達式。輸入一個復雜查詢Q,此時,從圖G的葉子結點開始遍歷,遇到非NULL的節點,用filter表達式把節點的值作SPARQL查詢的限制條件;遇到NULL節點,加入SELECT頭作為SPARQL查詢的查詢返回信息。通過在語義查詢圖上對路徑上所有節點的遍歷,我們可以構造一個等價的SPARQL查詢語句。
算法3給出由查詢語義圖生成SPARQL語句的程序流程。
算法3查詢語義圖生成SPARQL語句
輸入:<[solt=* value=* type=*],[relation type=*],[slot=* value=* type=*]>
輸出:對應RDF結構的SPARQL查詢語句。
拼裝SPARQL語句
1) 組合Select語句
queryStry="Select";
for(遍歷所有未知信息實例節點){
queryStr.append(?variable)
}
2) 組合查詢條件語句
queryStr.append("Where{"};
for(遍歷QFN解析出的該問題的RDF屬性節點Relation){
queryStr.append(?Domain)
queryStr.append(Relation)
queryStr.append(?Ranage)
}
3) Filter過濾語句
queryStr.append("filter(");
for(遍歷所有實例變量){
queryStr.append(?Domain=′value′)
queryStr.append(?Ranage=′value′)
}
queryStr.append(")}")
表2分別列舉了陳述型和布爾型問題自動生成SPATQL語句的流程。

表2 醫療問題分析-例子
為驗證本文提出系統的可行性,根據上述設計方案,采用Eclipse+Protégé+Jena實現了一個基于醫療領域本體的自動問答實驗系統。系統主要模塊包括問題預處理、命名實體識別、QFN解析、SPARQL語句生成以及答案抽取。系統架構如圖7所示。

圖7 基于本體的自動問答系統架構
實驗領域本體抽取SNOMED-CT[18]醫學本體的部分信息,運用斯坦福大學提出的本體構建七步法[19],從領域本體的概念出發,在MeSH醫學主題詞表首先抽取醫學領域中以疾病、個體、藥品、醫院四個概念的層次概念和實例,并確定領域本體中概念間的等級關系。再根據醫學中的關鍵要素從個體屬性、疾病屬性、藥品屬性、醫院屬性四個核心屬性抽取關于疾病、醫院、藥品、個體之間的醫學聯系,添加概念與概念的關系。在已經重構好的本體結構上,再從A醫藥網用Scrapy框架與正則表達式結合爬取相關概念的實例豐富本體知識庫。重構的醫學本體核心結構如圖8所示。

圖8 醫學領域本體部分結構
測試問題數據來自A+醫藥網中篩選的400個涵蓋不同類別的問題。對比圖9從本系統得到的問題回答效果和圖10從百度知道問答中檢索出的答案可以看出:本系統是從理解問題語義的角度給出的針對問題問點的相對準確的答案。

圖9 本系統給出的問題答案

圖10 百度知道檢索結果
為了定量分析系統的效果,實驗用召回率、準確率和F值三個指標進行系統性能的分析。性能指標定義如下:
P=(Pnum×100% )/Rnum
(1)
R=(Pnum×100% )/Anum
(2)
F=2×P×R/(P+R)
(3)
式中:P表示準確率,R表示召回率,Pnum是給出回答的問題中準確回答的問題數,Rnum是測試問題中給出答案的問題數,Anum是用來測試的問題數。
實驗一問題語義解析的情況分析。表3是用QFN對醫學領域4個主要類別的問題解析情況的結果。
實驗二問題回答結果的準確率分析。和實驗一采用相同的數據,為了避免QFN解析問題結構失敗導致實驗結果的偏差,實驗二在實驗一的基礎上,用已經解析出QFN框架結構的問題,分析問題回答的準確性。實驗結果如表4所示。

表4 問題集測試結果
從實驗數據分析,對問題集中的所有問題,sparql語句的生成率達到了90.07%,說明該方法能夠準確識別問題中的命名實體,并生成相關SPARQL語句。但平均F值和開放領域TREC[20]的結果相比沒有很大的提升。進一步分析實驗中找不到答案和錯誤回答的問題,影響實驗一QFN識別的原因主要是實驗系統構建的領域本體知識的缺失,在進一步的實驗中已驗證通過豐富本體知識可以提高系統的可用性。實驗二中對QFN正確解析的問題生成sparql查詢語句的平均準確率達到90%以上,說明通過QFN解析問題產生的RDF三元組是可以高效地把問題轉化成SPARQL語句的。但答案回答的R值較低,原因是系統尚未加入推理機制,導致召回率低。利用本體自身的語義推理特性,系統引入兩層推理機制。第一層在框架識別層根據識別的框架語義推理多個符合問題的結構,生成多條SPARQL查詢,提高系統的召回率。第二層推理在SPARQL查詢執行失敗時,利用領域知識本體查找規則庫中的規則,執行推理查詢。如:問題問點是詢問高血壓病情時,通過以下規則可以推測高血壓的病情。
[rule:(?x medical:患有medical:高血壓)(?x medical:收縮壓血壓值?y), lessThan(?y,159), greaterThan(?y,140)->(?x medical:所患疾病等級 medical:1級高血壓)]
這條規則表達了x是患有高血壓病的病人。y是收縮壓血壓值,且y的值被判斷在140~159之間,可以推斷出x是屬于1級高血壓的病人。
實驗進一步用100個醫療領域問題,啟動推理機制,分8個批次,每次擴充100個與實驗問題相關的實例到領域知識本體后,系統F值的變化趨勢如圖6所示。
圖11橫坐標表示加入新的領域本體知識的數量,縱坐標是回答的F值。可以看出,開啟推理機制后,系統初始F值從75.27%提升到80.6%。同時沒隨著新加入本體知識數量的增加,F值呈現上升趨勢??梢?,系統能夠隨著領域本體知識庫知識的豐富不斷提升回答的效果。

圖11 引入推理機制的系統F值隨本體知識擴充后變化趨勢
大多數傳統的基于Web的QA系統是通過在Web知識庫下檢索識別到的命名實體和相似度的度量來呈現候選答案。本文利用本體在知識管理上帶有語義的特性,將問題的命名實體和本體語義結構聯系起來,通過QFN問題框架網解析問題語義結構,抽取RDF三元組自動生成SPAQRQL語句從領域本體中之間查詢、推理出問題的一系列更具有語義針對性的答案。基于本體的自動問答系統在加入本體和推理之后,能夠發掘檢索詞與其相關領域的顯示和隱式聯系,使檢索具有語義性,答案抽取更加全面且準確,輕松解決了傳統搜索引擎無法解決的問題。此外,通過QFN問題框架本體自動更新機制,實現了問題框架的增量式更新。確保了系統的性能在使用中可以不斷提高,優化用戶體驗。實驗表明,本文的所有研究對實際應用具有一定的意義,但是仍然有很多需要改進和完善的地方:
1) 基于領域本體庫進行概念擴展階段,擴展的深度在一定程度上會導致問題的意圖的偏移。如何控制擴展的深度是今后研究的方向。
2) 自然語言問題的復雜結構,如問題“吃阿莫西林一直肚子疼是怎么回事?”(藥品的副作用)這類很難抽取RDF三元組的問題,系統還需引入語料學習的機制,提升回答的準確性。