張芳容,楊 青
武漢理工大學(xué) 計(jì)算機(jī)科學(xué)與技術(shù)學(xué)院,武漢430063
隨著信息技術(shù)的飛速發(fā)展,出現(xiàn)了以搜索引擎為代表的信息過濾機(jī)制。傳統(tǒng)的搜索引擎基于關(guān)鍵字檢索,難以理解問句的語義信息。知識(shí)庫問答(Knowledge-Based Question Answering,KBQA)系統(tǒng)以自然語言問句為輸入,對(duì)問句進(jìn)行分析理解后檢索知識(shí)庫,輸出簡潔、準(zhǔn)確的自然語言答案。知識(shí)庫(Knowledge Base,KB)是一個(gè)存儲(chǔ)事實(shí)類信息的結(jié)構(gòu)化系統(tǒng),典型的知識(shí)庫用三元組(主體,謂詞,對(duì)象)來存儲(chǔ)事實(shí)。常見的知識(shí)庫問答包括單一關(guān)系問答和多關(guān)系問答,前者指的是答案只涉及一條三元組,后者則涉及多條三元組。
現(xiàn)有的知識(shí)庫問答方法主要分為三類:(1)基于語義分析的方法。該類方法將問句轉(zhuǎn)換為可在知識(shí)庫中進(jìn)行檢索的邏輯表達(dá)式,如謂詞邏輯(λ)表達(dá)式[1]、依存組合語義(DCS)表達(dá)式[2]、λ-DCS表達(dá)式[3]等。該類方法可用于多關(guān)系問答,但是邏輯符號(hào)與自然語言之間存在語義鴻溝。(2)基于信息檢索的方法。該類方法首先從問句中抽取實(shí)體和關(guān)系,然后檢索知識(shí)庫。如Yao 等人[4]從問句中抽取主題詞,構(gòu)建問句的關(guān)系圖,與知識(shí)庫匹配;Bast等人[5]提出基于排序模型的自動(dòng)問答方法;王玥等人[6]提出基于動(dòng)態(tài)規(guī)劃的問答方案。該類方法可以實(shí)現(xiàn)多關(guān)系問答,但是不能借助實(shí)體的上下文信息對(duì)實(shí)體消除歧義。(3)基于深度學(xué)習(xí)的方法。該類方法將問句和知識(shí)庫映射到同一向量空間,將問答過程轉(zhuǎn)換為問句向量與知識(shí)庫向量進(jìn)行相似度計(jì)算的過程[7]。如Bao等人[8]提出一種基于機(jī)器學(xué)習(xí)的類翻譯模型;Hao等人[9]利用TransE[10]模型訓(xùn)練實(shí)體和關(guān)系的向量表示。該類方法只能獲得一條與問句最相似的三元組,僅適用于單一關(guān)系問答。
在英文知識(shí)庫問答領(lǐng)域,多關(guān)系問答已經(jīng)取得了很好的成就,但在中文領(lǐng)域,大部分研究都是針對(duì)單一關(guān)系問答[11-13]。因此,本文基于NLPCC-ICCPOL 2016 年提供的知識(shí)庫,對(duì)中文開放領(lǐng)域知識(shí)庫問答做進(jìn)一步探索。上述三種方法各有優(yōu)劣,本文擬采用深度學(xué)習(xí)、信息檢索和語義分析相結(jié)合的方法,對(duì)多關(guān)系問答進(jìn)行探索。本文提出將知識(shí)庫問答分為實(shí)體識(shí)別、實(shí)體關(guān)系抽取和答案檢索三個(gè)子任務(wù)。在實(shí)體識(shí)別階段,獲取問句中的實(shí)體并將其與知識(shí)庫中的術(shù)語對(duì)應(yīng),得到實(shí)體集合。在實(shí)體關(guān)系抽取階段,抽取問句中的關(guān)系詞,將關(guān)系詞與知識(shí)庫中的謂詞對(duì)應(yīng),得到關(guān)系集合,然后將問句對(duì)應(yīng)的實(shí)體集合和關(guān)系集合轉(zhuǎn)換為具有語義信息的三元組集合。在答案檢索階段,將三元組轉(zhuǎn)換為查詢語句,然后應(yīng)用查詢語句在知識(shí)庫中檢索。本文重點(diǎn)討論實(shí)體關(guān)系抽取的實(shí)現(xiàn)方法。
考慮到自然語言問句理解的復(fù)雜性,本文對(duì)問句q進(jìn)行了以下限定:
(1)限定問句q 中只包含一個(gè)疑問句,如問句“姚明的妻子是誰?”。
(2)限定問句q 中不包含代詞作為主語的成分,如問句“姚明的妻子是誰,她有多高?”。
本文的知識(shí)庫問答系統(tǒng)包括兩大模塊,一是知識(shí)庫的整理與存儲(chǔ);二是自然語言問句理解與答案檢索。前者為知識(shí)庫問答提供數(shù)據(jù)基礎(chǔ),后者為問答的具體過程。整體流程如圖1所示。
圖1 KBQA系統(tǒng)整體結(jié)構(gòu)圖
圖1 中,知識(shí)庫的整理與存儲(chǔ)的目的是對(duì)知識(shí)庫進(jìn)行降噪處理,然后將三元組形式的知識(shí)庫存儲(chǔ)在圖形數(shù)據(jù)庫Neo4j中,為答案檢索提供支持。術(shù)語集為知識(shí)庫中獨(dú)立存在的主體和對(duì)象構(gòu)成的集合;實(shí)體映射表中存儲(chǔ)的是術(shù)語別名與術(shù)語之間的對(duì)應(yīng)關(guān)系。
自然語言問句理解與答案檢索的目的是分析理解自然語言問句并檢索知識(shí)庫得到候選答案,主要包括以下三個(gè)步驟:
(1)實(shí)體識(shí)別。引入BI-LSTM-CRF(Bi-direction Long Short-Term Memory Conditional Random Field,雙向長短時(shí)記憶網(wǎng)絡(luò)-條件隨機(jī)場)序列標(biāo)注模型[14]對(duì)問句q進(jìn)行標(biāo)注,通過對(duì)標(biāo)注序列進(jìn)行進(jìn)一步解析,產(chǎn)生實(shí)體集合TE={te1,te2,…,tek} 和非實(shí)體集合OTHER={o1,o2,…,on},tei和oi中保存了實(shí)體或非實(shí)體的字符串和位置索引。針對(duì)每個(gè)實(shí)體tei,在知識(shí)庫中找到若干術(shù)語與其鏈接,為了減少冗余,將問句與候選實(shí)體進(jìn)行相似度計(jì)算,取得分最高的3個(gè)術(shù)語作為最終的候選實(shí)體集合Ei={e1,e2,…,em}( )m ≤3 。最后,實(shí)體識(shí)別步驟的輸出為問句中與知識(shí)庫術(shù)語對(duì)應(yīng)的實(shí)體集合E={E1,E2,…,Ek},以及非實(shí)體集合OTHER={o1,o2,…,on}。
(2)實(shí)體關(guān)系抽取。引入確定有窮自動(dòng)機(jī)(DFA)算法,對(duì)非實(shí)體集合OTHER進(jìn)行降噪處理,找到OTHER中描述關(guān)系的詞語P={p1,p2,…,pd}。針對(duì)每個(gè)詞語pi,在知識(shí)庫中找到與pi相似度最高的謂詞ri作為最終的關(guān)系,從而得到關(guān)系集合R={r1,r2,…,rc}。然后結(jié)合集合E 和R 生成實(shí)體關(guān)系三元組集合T 。
(3)答案檢索。根據(jù)實(shí)體關(guān)系三元組集合T 中三元組之間的關(guān)系或者三元組內(nèi)部元素之間的關(guān)系,將三元組轉(zhuǎn)換為結(jié)構(gòu)化查詢語句,應(yīng)用查詢語句檢索知識(shí)庫,得到候選答案。
在實(shí)體識(shí)別步驟中,獲取了問句中的實(shí)體集合E和非實(shí)體集合OTHER。實(shí)體關(guān)系抽取指的是從集合E 和OTHER 中抽取實(shí)體之間的關(guān)系,是支持多關(guān)系問答的關(guān)鍵步驟。本文將實(shí)體關(guān)系抽取分為關(guān)系詞提取、關(guān)系映射和生成三元組三個(gè)主要步驟,具體流程如圖2所示。
圖2 實(shí)體關(guān)系抽取流程
為了避免與用戶意圖無關(guān)的詞語對(duì)關(guān)系詞提取造成影響,首先采用DFA 算法對(duì)OTHER 進(jìn)行噪音詞過濾;然后對(duì)剩余部分進(jìn)行分詞、詞性標(biāo)注和去停用詞處理;最后,根據(jù)詞性特征提取關(guān)系詞。
本文采用哈工大語言云平臺(tái)LTP[15]進(jìn)行分詞和詞性標(biāo)注,LTP使用的是863詞性標(biāo)注集。一般而言,問句中的關(guān)系詞多為名詞和動(dòng)詞,因此,本文在進(jìn)行詞性標(biāo)注后,保留名詞(如詞性為n,nd,nh,ni,nl,ns,nt 等)、動(dòng)詞(如詞性為v)、其他詞語(如詞性為ws,i,j,a,q,d,m,z,b 等)以及疑問代詞作為候選關(guān)系詞。
在自然語言問句中,既可以用一個(gè)詞語表達(dá)查詢意圖,也可以通過由多個(gè)詞語構(gòu)成的短語表達(dá)查詢意圖。即關(guān)系詞可能只包含一個(gè)詞語,也可能包含多個(gè)詞語。因此,本文定義了關(guān)系詞合并規(guī)則,如表1所示,將提取出來的關(guān)系詞進(jìn)行合并,在合并過程中同時(shí)更新關(guān)系詞的索引,如果合并的關(guān)系詞包含疑問代詞,則將疑問代詞的索引更新為關(guān)系詞后面的索引。最終得到關(guān)系詞序列P={p1,p2,…,pd}。
表1 關(guān)系詞合并規(guī)則
上述步驟得到了一組關(guān)系詞序列P={p1,p2,…,pd}。關(guān)系詞與知識(shí)庫中的謂詞在字符串上可能不完全匹配。因此,需要將關(guān)系詞pi(pi∈P)與知識(shí)庫中的謂詞進(jìn)行映射,得到最終的關(guān)系ri,對(duì)ri進(jìn)行篩選,獲取關(guān)系集合R={r1,r2,…,rc},稱為“關(guān)系映射”。
問句中的關(guān)系詞與知識(shí)庫中的謂詞通常在字符串或者語義上高度匹配。因此,關(guān)系映射中的相似度得分采用字符串相似度和語義相似度相結(jié)合的度量方式。字符串相似度采用編輯距離相似度[16]實(shí)現(xiàn),如公式(1):
其中,x 和y 分別表示關(guān)系詞和候選謂詞字符串,t 表示x 經(jīng)過刪除、替換、增加后轉(zhuǎn)換為y 所需要的步數(shù),len(?)表示字符串的長度,max(?)表示求最大值。
語義相似度采用歸一化后的余弦距離相似度實(shí)現(xiàn)[17],如公式(2):
其中,x 表示關(guān)系詞的向量表示,y 表示候選謂詞的向量表示。
最后,結(jié)合編輯距離相似度和語義相似度,度量關(guān)系詞與謂詞之間的相似度,如公式(3):
其中,x 和y 分別表示關(guān)系詞和候選謂詞。為了防止在提取關(guān)系詞的過程中提取了與查詢意圖無關(guān)的關(guān)系詞,設(shè)置閾值δ,當(dāng)相似度小于δ 時(shí),直接將二者的相似度值設(shè)為0。最終的相似度計(jì)算公式如式(4):
由于自然語言問句的復(fù)雜性,多個(gè)連續(xù)關(guān)系詞可能同時(shí)表達(dá)一個(gè)查詢語義。為此定義“舍棄與保留”規(guī)則。即對(duì)于關(guān)系映射得到的關(guān)系r ,如果r 與關(guān)系集合R 中的最后一個(gè)關(guān)系相等,并且在問句中二者連續(xù)出現(xiàn)時(shí),舍棄r;否則,保留r。
關(guān)系映射的具體過程如算法1。
算法1 關(guān)系映射算法
輸入:實(shí)體E={E1,E2,…,Et},關(guān)系詞P={p1,p2,…,pd}
輸出:映射后的關(guān)系詞集合R={r1,r2,…,rc}
1. E 在知識(shí)庫中前后|P|步范圍內(nèi)的關(guān)系集合S={s1,s2,…,sk}
2. last=null #(pos,old,new)
3. for each a ∈P do:#(value,index,tag)
4. max=(‘’,0) #(value,score)
5. for each s ∈S do: #S 為知識(shí)庫中的謂詞
6. temp=simPre(s,a.value)#計(jì)算關(guān)系詞與謂詞的相似度
7. if temp >max.score then:
8. max=(s,temp)
9. end if
10. end for
11. if max.score ≠0 then:
12. if last==null then:
13. R ←R ?{(max.value,a.pos)}
14. else if max.value!=last.new or last.pos+len(last.old)!=a.pos
15. then:
16.R ←R ?{(max.value,a.pos)}
17. end if
18. last=(a.pos,a.value,max.value)
19. end if
20. end for
21. return R
中文開放領(lǐng)域問答中,根據(jù)問句中包含的實(shí)體和關(guān)系的個(gè)數(shù)分為單一關(guān)系問句和多關(guān)系問句。其中,單一關(guān)系問句中包含一個(gè)實(shí)體和一個(gè)關(guān)系(SS)。多關(guān)系問句分為三種情況:包含一個(gè)實(shí)體和多個(gè)關(guān)系(SM)、包含多個(gè)實(shí)體和一個(gè)關(guān)系(MS)、包含多個(gè)實(shí)體和多個(gè)關(guān)系(MM)。結(jié)合實(shí)體集合E 和關(guān)系集合R,針對(duì)這四種類型定義生成三元組的規(guī)則,三元組中未知元素用'X'、'Y'等符號(hào)表示。
(1)SS生成三元組
問句中僅出現(xiàn)一個(gè)實(shí)體和一個(gè)關(guān)系,即實(shí)體集合為E={ E1} ,關(guān)系集合為R={r1} ,對(duì)于實(shí)體e(e ∈E1,根據(jù)e、r1和疑問代詞的相對(duì)位置生成三元組。若r1出現(xiàn)在e 之后,則生成三元組(e,r1,'X');否則生成三元組('X',r1,e)。
(2)SM生成三元組
問句中包含一個(gè)實(shí)體和多個(gè)關(guān)系,即實(shí)體集合為E={ E1} ,關(guān)系集合為R={r1,r2,…,rc} 。此時(shí)實(shí)體與候選答案之間可能存在級(jí)聯(lián)關(guān)系或者并列關(guān)系。對(duì)于實(shí)體e(e ∈E1,針對(duì)這兩種情況生成三元組集合{(e,r1,'A'),…,(e,rc,'A'+c-1)}和{(e,r1,'A'),('A',
r2,'B'),…,('A'+c-2,rc,'A'+c-1)}。
(3)MS生成三元組
問句中包含一個(gè)實(shí)體和多個(gè)關(guān)系,即實(shí)體集合為E={E1,E2,…,Em} ,關(guān)系集合為R={r1} 。對(duì)E 中元素進(jìn)行組合,得到集合TS,即對(duì)于U ∈TS,U 中的每個(gè)元素ei,分別來自于Ei。將U 中的每個(gè)實(shí)體e(e ∈U分別與r1組合生成三元組,得到一組三元組集合,每個(gè)三元組的形式為(e,r1,'A')。
(4)MM生成三元組
問句中包含多個(gè)實(shí)體和多個(gè)關(guān)系,即實(shí)體集合為E={E1,E2,…,Em} ,關(guān)系集合為R={r1,r2,…,rc} 。對(duì)E中元素進(jìn)行組合,得到集合TS,對(duì)于集合U(U ∈TS),根據(jù)U 和R 的長度關(guān)系,可以分為以下三種情況:
① ||U =2, ||R =0,表示查詢兩個(gè)實(shí)體之間的關(guān)系,生成三元組(e1,'X',e2)。
② ||U =2, ||R =3,表示兩組實(shí)體關(guān)系確定一個(gè)中間實(shí)體,候選答案與中間實(shí)體的關(guān)系已知,生成三元組{(e1,r1,'M'),(e2,r2,'M'),('M',r3,'X')}。
③ ||U >1, ||R >1,表示查詢每個(gè)實(shí)體的|R|個(gè)關(guān)系,生成三元組集合{(e1,r1,'A'),…,(e1,rc,'X')},…,{(en,r1,'A'),…,(en,rc,'X')}。
本文使用的數(shù)據(jù)集為NLPCC-ICCPOL 2016KBQA子任務(wù)發(fā)布的知識(shí)庫和問答對(duì)(NLPCC[18])和多關(guān)系問答對(duì)(NLPCC_MH[6])。根據(jù)問答對(duì)反向查找對(duì)應(yīng)的三元組,構(gòu)造知識(shí)庫問答的數(shù)據(jù)集。去掉未找到三元組的問答對(duì),將剩余數(shù)據(jù)集劃分為訓(xùn)練集、驗(yàn)證集和測試集,如表2所示。
表2 數(shù)據(jù)集劃分
本文的實(shí)驗(yàn)平臺(tái)運(yùn)行在配置3.5 GHz、八核處理器、12 GB 運(yùn)行內(nèi)存的筆記本上,編譯環(huán)境為PyCharm Community Edition 2018,操作系統(tǒng)為64 位的Windows 10。知識(shí)庫采用Neo4j 3.4.0進(jìn)行存儲(chǔ)。采用Google提供的word2vec工具利用中文維基百科語料庫訓(xùn)練詞向量,詞向量的維度為300,窗口大小設(shè)置為5,最小出現(xiàn)次數(shù)為5。
在關(guān)系映射階段,公式(3)中的編輯距離相似度和語義相似度的權(quán)重均為0.5,在此基礎(chǔ)上選擇閾值δ 。若δ 設(shè)置過小,則引入了與查詢意圖無關(guān)的關(guān)系;設(shè)置過大,則遺漏了用戶的查詢意圖。首先,根據(jù)實(shí)際情況為δ 估計(jì)一個(gè)合理的區(qū)間[a,b],然后在區(qū)間[a,b]內(nèi)進(jìn)行實(shí)驗(yàn)??紤]到極端情況下,公式(3)中編輯距離相似度為0,但是語義相似度接近1,綜合相似度得分接近0.5。因此,設(shè)置區(qū)間上限b 為0.5,區(qū)間下限a 為0。將δ 在區(qū)間[0,0.5]上取值,然后進(jìn)行實(shí)驗(yàn),計(jì)算訓(xùn)練集、驗(yàn)證集和測試集上進(jìn)行關(guān)系映射的準(zhǔn)確率。實(shí)驗(yàn)結(jié)果如圖3所示。
圖3 不同閾值下的關(guān)系映射的準(zhǔn)確率
由圖3 可知,當(dāng)δ ∈[0.25,0.35]時(shí),關(guān)系映射的準(zhǔn)確率較高。因此,本文將δ 取值為0.3,δ=0.3 時(shí),在NLPCC 測試集和NLPCC_MH 測試集上的準(zhǔn)確率分別為91.17%和87.4%。
將以上結(jié)果應(yīng)用于知識(shí)庫問答系統(tǒng)。在答案檢索階段,將實(shí)體關(guān)系抽取中獲得的三元組集合,根據(jù)三元組之間的關(guān)系,或者三元組內(nèi)部元素之間的關(guān)系,以及三元組中的已知元素和未知元素,生成Cypher 查詢語句。如問句“我想知道王思聰?shù)陌职钟惺裁闯删??”?jīng)過上述步驟生成的部分三元組集合T={{(王思聰,父親,'A'),('A',主要成就,'B')}}。首先根據(jù)三元組中主體、謂詞和對(duì)象的個(gè)數(shù),生成的MATCH子句,其中包含3個(gè)實(shí)體和2 個(gè)關(guān)系,即“MATCH(a:entity),(b:entity),(answer:entity),(a)-[r1]->(b),(b)-[r2]->(answer)”;根據(jù)三元組中的已知元素,生成的WHERE 子句,其中包含1 個(gè)實(shí)體和2 個(gè)關(guān)系,即“WHERE a.name='王思聰'and r1.relation='父親' and r2.relation='主要成就'”;最后,返回查詢的內(nèi)容,即“RETURN answer.name;”。將查詢語句在知識(shí)庫中執(zhí)行,得到候選答案。
問答結(jié)果的評(píng)測標(biāo)準(zhǔn)為NLPCC-ICCPOL 2016 指定的平均F1值(Averaged F1),即所有問句的F1值之和的平均值。每個(gè)問句的F1值可以通過精確率和召回率計(jì)算得到。精確率和召回率的計(jì)算公式分別如下:
其中,A 為給定的答案集合,C 為知識(shí)庫問答系統(tǒng)檢索得到的答案集合,|A| 和|C| 分別表示集合的大小,|A ?C|表示兩個(gè)集合的交集的大小。F1 值由公式(5)和(6)計(jì)算可得,如公式(7):
最后,平均F1值的計(jì)算公式如式(8),其中,Q 表示問句集合,|Q|為問句的總個(gè)數(shù)。
知識(shí)庫問答系統(tǒng)在NLPCC 和NLPCC_MH 測試集上的評(píng)測結(jié)果如表3所示。
表3 知識(shí)庫問答Averaged F1 %
表3 中,PKU[11]是NLPCC-ICCPOL 2016 年評(píng)測結(jié)果最佳的系統(tǒng)。InsunKBQA[13]是周博通等人在相同數(shù)據(jù)集下進(jìn)行探索的系統(tǒng)。DPQA[6]是王玥等人在2018年的全國知識(shí)圖譜與語義計(jì)算大會(huì)(CCKS)上使用與前者相同數(shù)據(jù)集對(duì)知識(shí)庫問答進(jìn)行探索的系統(tǒng),王玥等人還構(gòu)建了多關(guān)系問答對(duì)數(shù)據(jù)集,研究了中文領(lǐng)域的多關(guān)系知識(shí)庫問答。
本文的知識(shí)庫問答方案與PKU 相比,達(dá)到了與其相近的效果,但是PKU專注于單一關(guān)系問答,在多關(guān)系問答中則不具備有效性。同樣,InsunKBQA 系統(tǒng)也專注于單一關(guān)系問答,并且無法識(shí)別選擇型疑問句的關(guān)系,如“TCL 是國企還是私企呀”這一類問句,本文的方案在此有所提升。雖然DPQA可以支持多關(guān)系問答,但存在一定的局限性,該系統(tǒng)只適用于實(shí)體出現(xiàn)在所有關(guān)系之前,且候選答案與已知實(shí)體具有級(jí)聯(lián)關(guān)系的問句。而對(duì)具有并列關(guān)系的問句并不適應(yīng),如“姚明和葉莉的身高分別是多少?”這一類問句。本文提出的方案在多關(guān)系問答方面與其相比有所提升。
本文提出將知識(shí)庫問答分為實(shí)體識(shí)別、實(shí)體關(guān)系抽取和答案檢索三個(gè)主要步驟,重點(diǎn)討論了實(shí)體關(guān)系抽取的實(shí)現(xiàn)方法。在實(shí)體關(guān)系抽取步驟中,引入DFA 算法對(duì)非實(shí)體部分進(jìn)行降噪,提出基于規(guī)則的方法從問句中提取關(guān)系詞序列,然后利用相似度得分將關(guān)系詞與知識(shí)庫中的謂詞進(jìn)行映射,得到關(guān)系集合,最后將問句中的實(shí)體集合和關(guān)系集合轉(zhuǎn)換為具有語義信息的三元組集合。實(shí)驗(yàn)結(jié)果表明,本文提出的方法支持多關(guān)系問答,在NLPCC 和NLPCC_MH 測試集上具有較高的平均F1值。
本文的方法雖然解決了多關(guān)系問答,但是在實(shí)體關(guān)系抽取過程中,關(guān)系映射的準(zhǔn)確率較低,對(duì)問答結(jié)果產(chǎn)生了影響。因此,下一步的研究重點(diǎn)是結(jié)合深度學(xué)習(xí)的方法構(gòu)建一個(gè)端到端的實(shí)體關(guān)系抽取模型,以提高問答的準(zhǔn)確率,從而提升問答結(jié)果。