引言
瞭解知識圖譜的基本概念,也做過一些demo的實踐,畢竟是做問答方向的,所以就比較關注基於知識圖譜的問答。其實構建知識圖譜的核心在於命名實體識別和關係抽取,圍繞這兩個方面也有很多細緻的工作,比如如何解決實體的歧義,進行實體消歧;如何進行多關係的抽取等。從最近各大公司舉行的比賽,我們也可以看出來,今年的主要工作就在這上面,這也是技術落地的一個重要標誌。最近也在搗鼓BERT,想着就將基於KB的QA流程擼一遍,於是就有了這個demo。
項目地址:
數據集介紹[1]
NLPCC全稱自然語言處理與中文計算會議(The Conference on Natural Language Processing and Chinese Computing),它是由中國計算機學會(CCF)主辦的 CCF 中文信息技術專業委員會年度學術會議,專注於自然語言處理及中文計算領域的學術和應用創新。
此次使用的數據集來自NLPCC ICCPOL 2016 KBQA 任務集,其包含 14 609 個問答對的訓練集和包含 9 870 個問答對的測試集。 並提供一個知識庫,包含 6 502 738 個實體、 587 875 個屬性以及 43 063 796 個 三元組。知識庫文件中每行存儲一個事實( fact) ,即三元組 ( 實體、屬性、屬性值) 。各文件統計如下:
訓練集:14609
開發集:9870
知識庫:43063796
知識庫樣例如下所示:
"希望之星"英語風采大賽|||中文名|||“希望之星”英語風采大賽
"希望之星"英語風采大賽|||主辦方|||中央電視臺科教節目中心
"希望之星"英語風采大賽|||別名|||"希望之星"英語風采大賽
"希望之星"英語風采大賽|||外文名|||Star of Outlook English Talent Competition
"希望之星"英語風采大賽|||開始時間|||1998
"希望之星"英語風采大賽|||比賽形式|||全國選拔
"希望之星"英語風采大賽|||節目類型|||英語比賽
原數據中本只有問答對(question-answer),並無標註三元組(triple),本人所用問答對數據來自該比賽第一名的預處理https://github.com/huangxiangzhou/NLPCC2016KBQA。構造Triple的方法爲從知識庫中反向查找答案,根據問題過濾實體,最終篩選得到,也會存在少量噪音數據。該Triple之後用於構建實體識別和屬性選擇等任務的數據集。
問答對樣例如下所示:
<question id=1> 《機械設計基礎》這本書的作者是誰?
<triple id=1> 機械設計基礎 ||| 作者 ||| 楊可楨,程光蘊,李仲生
<answer id=1> 楊可楨,程光蘊,李仲生
==================================================
<question id=2> 《高等數學》是哪個出版社出版的?
<triple id=2> 高等數學 ||| 出版社 ||| 武漢大學出版社
<answer id=2> 武漢大學出版社
==================================================
<question id=3> 《線性代數》這本書的出版時間是什麼?
<triple id=3> 線性代數 ||| 出版時間 ||| 2013-12-30
<answer id=3> 2013-12-30
==================================================
技術方案[2]
基於知識圖譜的自動問答拆分爲2 個主要步驟:命名實體識別步驟和屬性映射步驟。其中,實體識別步驟的目的是找到問句中詢問的實體名稱,而屬性映射步驟的目的在於找到問句中詢問的相關屬性。
- 命名實體識別步驟,採用BERT+BiLSTM+CRF方法(另外加上一些規則映射,可以提高覆蓋度)
- 屬性映射步驟,轉換成文本相似度問題,採用BERT作二分類訓練模型
技術細節
- 命名實體識別
構造NER的數據集,需要根據三元組-Enitity 反向標註問題,給數據集中的Question 打標籤。我們這裏採用BIO的標註方式,因爲識別人名,地名,機構名的任務不是主要的,我們只要識別出實體就可以了,因此,我們用B-LOC, I-LOC代替其他的標註類型。
Figure1. BIO標註圖
- 屬性映射
構造測試集的整體關係集合,提取+去重,獲得 4373 個關係 RelationList;
一個 sample 由“問題+關係+Label”構成,原始數據中的關係值置爲 1;
從 RelationList 中隨機抽取五個屬性作爲 Negative Samples;
Figure2. question-triple相似度訓練集
- 模型總體架構
1、 實體檢索:輸入問題,ner得出實體集合,在數據庫中檢索出與輸入實體相關的所有三元組
2、 屬性映射:bert分類/文本相似度
+ 非語義匹配:如果所得三元組的關係(attribute)屬性是輸入問題字符串的子集(相當於字符串匹配),將所得三元組的答案(answer)屬性與正確答案匹配,correct +1
+ 語義匹配:利用bert計算輸入問題(input question)與所得三元組的關係(attribute)屬性的相似度,將最相似的三元組的答案作爲答案,並與正確的答案進行匹配,correct +1
目前這2個是一起做的,更注重的是測試性能,所以並沒有像Retrieval QA那樣做召回+排序,其實修改一下很簡單,也就那回事。
總結
- 目前不足
- 在命名實體識別的時候,進行eval,最後的結果是nan,如下:
INFO:tensorflow:evaluation_loop marked as finished
INFO:tensorflow:***** Eval results *****
INFO:tensorflow: eval_f = nan
INFO:tensorflow: eval_precision = nan
INFO:tensorflow: eval_recall = nan
INFO:tensorflow: global_step = 1
當然,predict是沒有什麼問題的。
- 反思
- 其實用question和attribute進行一個相似度計算做排序我還是有點疑惑的,感覺更像是個強行匹配,question的句子明顯更長,語義明顯比attribute更豐富,單拿attribute進行匹配有種斷章取義的感覺,所以不提倡。
- 在用BERT online做命名實體識別的時候,速度有點慢,如何提高線上速度是個問題。
Figure3. NER online測試
Figure2. question-triple相似度訓練集
目前bert之跑了一個epoch,就是test下而已,如果多跑幾個epoch,效果會更好!
3. 目前的測試效果很一般,可能是訓練的時間比較短有關.
Figure4. KB_QA outline測試
Results:
total: 9870, recall: 9088, correct:7698,
accuracy: 84.70510563380282%, ambiguity (屬性匹配正確但是答案不正確):681
4. 這個demo並不是真正意義上的KB_QA,我還是把它看成Retrieval QA,但是第一步的非語義匹配是用數據庫做的,相比於TF-idf,BM25之類的,有何優劣呢?希望實驗過的同學能告知一下!
- TO DO
- 完成KB_QA的online模式
- 完成排序+召回模式
Reference:
暫時就想到這些,後續如果被蘋果砸了一下腦袋就更新一下,最後,嗯,如果覺得對您有幫助就點個贊或者給個star鼓勵一下吧!