基於知識圖譜的問答系統簡單流程理解(開放型知識圖譜、實體類型較多的圖譜)

寫在前面

雖然網上代碼一大堆,論文一大堆,但是我連一篇實實在在介紹基於知識庫的問答系統實現邏輯簡單介紹的都找不到。
當然,基於對模板匹配的博客我倒是找到了一篇,見:
https://blog.csdn.net/xyz1584172808/article/details/89319129(寫的非常好,整個問答系統的搭建流程都說明白了。)
但是他這篇文章相較於基於知識庫的問答來說少了很多東西,我首先總結一下他這篇簡單的實現流程,然後再引申到基於知識庫的問答系統。

基於模板匹配的問答系統:

先說明一下:基於模板和基於知識庫其實非常相似

階段主要有:

  • 實體識別
  • 將用戶的問題進行多分類,進而實現“用戶自然語言問題→形式化問題模板”
  • 將實體識別作爲問題模板的實參,去圖數據庫中查詢問題的答案。

實體識別階段:

例如:“劉德華演過哪些電影呀?”
對其進行命名實體識別,就可以得到:“劉德華”,且也能將它標註爲“nnt”,nnt實際上就是“人”的詞性,這個實體識別過程就相當於一個分詞+詞性標註過程。(這個過程可以用bert來做,就不會產生用jieba分詞把詞分錯的問題了。比如臥虎藏龍 分成了 臥虎 藏龍兩個詞)
注意,電影在此處不是個實體,它應該包含在“演過哪些電影”這個問題之中(更簡單的理解就是“演過的電影”是一個關係)

用戶自然語言問題向模板的映射:

例如某dict中保存有如下的模板(nm代表電影,nnt代表人物,ng代表電影類型,nnr我也不知道是啥):
0:nm 評分
1:nm 上映時間
2:nm 類型
3:nm 簡介
4:nm 演員列表
5:nnt 介紹
6:nnt ng 電影作品
7:nnt 電影作品
8:nnt 參演評分 大於 x
9:nnt 參演評分 小於 x
10:nnt 電影類型
11:nnt nnr 合作 電影列表
12:nnt 電影數量
13:nnt 出生日期
訓練階段:
對於“劉德華演過哪些電影呀?”這個問題,他可以轉化成模板7,也就是nnt 電影作品。我們把這個轉化成一個多分類問題,具體流程爲:首先可以用cnn(或lstm啥的都行)對“劉德華演過哪些電影呀?”提取特徵,接一個全連接層,用這14個分類做一個loss,反向傳播。同樣的,輸入另一段訓練語料,比如“劉德華的出生日期”,也可以做訓練語料。這樣就能訓練一個模型,這個模型的作用是:輸入一句話,比如“臥虎藏龍的電影類型是什麼?”,然後他就會將這句話映射到模板10(也就是nnt 電影類型)上

測試階段:
此處共有14個問題模板
那麼,比如“劉德華演過哪些電影呀?”這個問題,我們將它輸入到我們剛剛訓練好的模型裏,就可以得到這句話對應的模板類型,也就是7了。(當然,預測結果甚至有可能是2、3這類主語是nm而不是nt的,這時我們就可以做一個限制。由於我們通過ner能得到“劉德華演過哪些電影呀?”中劉德華這個實體,同時也能知道“劉德華”所對應的實體類型爲nnt,那麼我們就可以只在帶有nnt的模板中,選擇預測概率最高的)

將實體傳入模板中,用圖數據庫查詢語句查答案:

例如“劉德華演過哪些電影呀?”,通過上面的步驟,我們可以得到模板“nnt 電影作品”,也可以得到“劉德華演過哪些電影呀?”這句話中的實體劉德華(nnt),於是可以將nnt所對應的“劉德華”填入到模板“nnt 電影作品”中,就可以得到一條查詢語句“劉德華 電影作品”了,用圖數據庫查詢語句就是

     SELECT ?x WHERE
     {
        <劉德華>    <參演電影>    ?x
    }

非常像一條sql語句。
然後就可以查到劉德華參演的所有電影了

至此,已經將這套簡單的方案完全介紹完成

上面那套方案的缺點:

  • 如果模板庫中模板很多的話,那麼分類的類別數量會非常大,而模型在大量分類種類數的情況下表現一般都不會好
  • 模板庫中如果新添加了模板,那麼就需要重新訓練一遍問題-模板映射模型,可擴展性非常差
  • 實體種類特別多,且實體種類不能單單用詞性標註的情況下,上面這套方案的“詞性標註”就沒辦法用了。比如我要做計算機領域的答疑,那麼“二叉樹”肯定不能簡單隻用一個詞性“n”來指代。

新方案

下面的方案將解決上面提到的那幾個問題

工業環境下真實場景分析:

  • 開放領域的圖譜一般都非常大,實體類型非常多,比如PKUBASE知識庫,包含了包含130萬以上實體,涉及的實體類型有各方各面(軍人、工人、電影、電視劇……),至現在還沒有一個統一的實體標準(就比如上面提到的詞性標註)來對實體有一個大的分類,比如一個電影:我們可以知道電影有名字、誰參演了、評分之類的通用屬性,但是萬一有個電影有“好的社會影響”呢?那你還得把好的社會影響再添到“電影”的屬性中去,那麼再來個其他的屬性或者關係呢?(這些都是我自己叨叨的,大家能看懂就看懂吧)。最好的方法就是單個實體單獨拿來說事:比如“姚明的成就是啥啥啥”,而不要用“nr的成就是啥啥啥”
  • 但是!!!!,還有很多情況,比如:①“北京大學”和“北大”都可以代指“北京大學” ②“小蘋果”既可以代指“小蘋果_歌曲”,也可以代指“小蘋果_水果”
    像這種情況,就最好將一個詞B的各種代稱,都指向B,且這個指向一定要非常明確,比如“北大”,就明確的指向“北京大學_(北京最厲害的高校之一)”,而不單單只是指向“北京大學”,這就涉及到 “實體鏈接”(及指代消解) 的問題了

解決方案

實體識別(此時未實體鏈接):

繼續使用bert-ner,例如“阿根廷國家的政策是什麼?”,可以抽取到“阿根廷國家”這個實體

實體鏈接:

現在,網絡上實際上是有實體鏈接詞典去解決那種“別名的問題了”

  • 阿根廷 阿根廷_(國家)
  • 阿根廷 阿根廷_(足球國家隊)
  • 阿根廷 阿根廷_(籃球國家隊)
  • 阿根廷 阿根廷_(貿易組織成員)
  • 阿根廷國家隊 阿根廷_(足球國家隊)
  • 阿根廷國家隊 阿根廷_(籃球國家隊)
  • 阿根廷國家隊 阿根廷_(貿易組織成員)

說明一下:
第一列是實體名稱,第二列是實體名稱可能指向的具體(具體到類型)的實體。這樣實際上我們就可以解決“別名”(指代消解)問題,但是實體鏈接問題我們實際上還是沒有解決。比如“阿根廷踢了一場好球”,用bert進行ner後拿到了阿根廷,我們人工來看的話很容易就知道這句話裏阿根廷代表“阿根廷_(足球國家隊)”,但是機器直接看這句話的話是不知道應該從

  • 阿根廷 阿根廷_(國家)
  • 阿根廷 阿根廷_(足球國家隊)
  • 阿根廷 阿根廷_(籃球國家隊)
  • 阿根廷 阿根廷_(貿易組織成員)
    中選哪一個的。
    這就需要我們進行實體鏈接了:首先我們能拿到“阿根廷踢了一場好球”這句話中的“阿根廷”,然後我們能從實體鏈接庫中將實體名爲“阿根廷”的指代全部拿到,就是這個
  • 阿根廷 阿根廷_(國家)
  • 阿根廷 阿根廷_(足球國家隊)
  • 阿根廷 阿根廷_(籃球國家隊)
  • 阿根廷 阿根廷_(貿易組織成員)

接下來,我們可以選擇
深度文本匹配模型:首先用cnn去分別掃描“阿根廷紅場之役在哪一年踢的?”及“阿根廷_(國家)”這幾個字,做一個pairwise(模型),輸出一下相似度。
然後再分別掃描“阿根廷踢了一場好球”及“阿根廷_(足球國家隊)”,輸出相似度,依次類推(關於訓練過程的設計我就不說了,可以用esim等模型)
lgb,也是做文本相似度模型,做特徵,詳細的特徵需要看論文(lgb在論文裏是最優的,高於pairwise)
取相似度最高的top-n個實體作爲候選實體

屬性抽取並鏈接

論文中採用的是規則+模板匹配的方式,比如1997年八月,用規則將其轉成知識庫中規範的格式,比如1997年8月,然後對知識庫中的所有屬性進行匹配(具體看論文吧)

使用文本相似度匹配模型去選擇候選查詢路徑

通過實體識別以及實體鏈接,我們可以分析“徐崢出演的電影有哪些?”,得到“徐崢_(演員)”這個具體的實體,然後我們就可以從知識庫中將帶有“徐崢_(演員)”的所有的三元組都拿到,例如
(徐崢_(演員),出演,股票的顏色_(電影))
(徐崢_(演員),出演,春光燦爛豬八戒_(電影))
(徐崢_(演員),出演,愛情呼叫轉移_(電影))
(徐崢_(演員),出演,夜店_(電影))
(徐崢_(演員),獲得獎項,電影頻道傳媒大獎_(獎項))
(徐崢_(演員),獲得獎項,電影金馬獎最佳男主角_(獎項))
(徐崢_(演員),導演,我和我的祖國_(電影))
只將"徐崢_(演員)"對應的所有關係拿出來
徐崢_(演員),出演;獲得獎項;導演
然後可以用esim(pairwise模型)去將"徐崢出演的電影有哪些"與“徐崢出演了”進行比對**(此處請注意,深度模型的輸入一般都是自然語言,像(徐崢,出演)是不可以直接輸入進模型的,需要將(徐崢,出演)轉換爲自然語言,即“徐崢出演了”)**,輸出相似度。
接下來依次將(徐崢,獲得獎項)、(徐崢、導演)轉化爲自然語言後和“徐崢出演的電影有哪些”進行比對,輸出相似度值,取相似度最高的做爲我們的“問題模板”。然後按第一套方案,用數據庫查詢語言進行查詢就可以了。

總結:

第二套方案解決了實體鏈接、指代消解的問題,並且其選擇問題模板的方式由多分類換爲了相似度比對去選擇模板。
但是第二套方案總體來說還是有很多優化的地方,比如實體鏈接部分可以嘗試更多元化的方法(多去尋找特徵、試驗不同的深度學習模型,嘗試ensemble)。還有就是根據文本相似度進行問題模板的選擇那裏也可以做如上改進,還有將元組轉換爲自然語言的方法我認爲不是100%完美的。

還有的話,對於多跳問題(例如“俄羅斯的首都有多少人口?”,首先需要查俄羅斯的首都是哪個城市,然後還得查這個城市有多少人口)以及實體的屬性問題,例如(q610:北京大學出了哪些哲學家
select ?x where { ?x <職業> <哲學家_(基礎含義)> . ?x <畢業院校> <北京大學> . })我還沒總結,留個坑以後來填~

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章