基於BERT的數據庫的問答系統

一. 知識圖譜的介紹

詳情請參考 知乎專欄

1. 知識庫與三元組

“奧巴馬出生在火奴魯魯。”, “姚明是中國人。”,“謝霆鋒的爸爸是謝賢。”

這些就是一條條知識,而把大量的知識匯聚起來就成爲了知識庫。我們可以在wiki百科,百度百科等百科全書查閱到大量的知識。然而,這些百科全書的知識組建形式是非結構化的自然語言,這樣的組織方式很適合人們閱讀但並不適合計算機去處理。爲了方便計算機的處理和理解,我們需要更加形式化、簡潔化的方式去表示知識,那就是三元組(triple)。

“奧巴馬出生在火奴魯魯。” 可以用三元組表示爲 (BarackObama, PlaceOfBirth, Honolulu)。

這裏我們可以簡單的把三元組理解爲 (實體entity,實體關係relation,實體entity),進一步的,如果我們把實體看作是結點,把實體關係(包括屬性,類別等等)看作是一條邊,那麼包含了大量三元組的知識庫就成爲了一個龐大的知識圖。

Extracted KBs 知識庫涉及到的兩大關鍵技術是

  • 實體鏈指(Entity linking) ,即將文檔中的實體名字鏈接到知識庫中特定的實體上。它主要涉及自然語言處理領域的兩個經典問題實體識別 (Entity Recognition) 與實體消歧 (Entity Disambiguation),簡單地來說,就是要從文檔中識別出人名、地名、機構名、電影等命名實體。並且,在不同環境下同一實體名稱可能存在歧義,如蘋果,我們需要根據上下文環境進行消歧。
  • 關係抽取 (Relation extraction),即將文檔中的實體關係抽取出來,主要涉及到的技術有詞性標註 (Part-of-Speech tagging, POS),語法分析,依存關係樹 (dependency tree) 以及構建SVM、最大熵模型等分類器進行關係分類等。

2. 知識庫問答

知識庫問答(knowledge base question answering,KB-QA)即給定自然語言問題,通過對問題進行語義理解和解析,進而利用知識庫進行查詢、推理得出答案.
在這裏插入圖片描述
與對話系統、對話機器人的交互式對話不同,KB-QA具有以下特點:

  • 答案:回答的答案是知識庫中的實體或實體關係,或者no-answer(即該問題在KB中找不到答案),當然這裏答案不一定唯一,比如 中國的城市有哪些 。而對話系統則回覆的是自然語言句子,有時甚至需要考慮上下文語境。
  • 評價標準:回召率 (Recall),精確率 (Precision) ,F1-Score。而對話系統的評價標準以人工評價爲主,以及BLEU和Perplexity。

當我們在百度詢問 2016年奧斯卡最佳男主角 時,百度會根據知識庫進行查詢和推理,返回答案,這其實就是KB-QA的一個應用。

3. 知識庫問答的主流方法

關於KB-QA的方法,傳統的主流方法可以分爲三類:

  • 語義解析(Semantic Parsing):該方法是一種偏linguistic的方法,主體思想是將自然語言轉化爲一系列形式化的邏輯形式(logic form),通過對邏輯形式進行自底向上的解析,得到一種可以表達整個問題語義的邏輯形式,通過相應的查詢語句(類似lambda-Caculus)在知識庫中進行查詢,從而得出答案。下圖紅色部分即邏輯形式,綠色部分where was Obama born 爲自然語言問題,藍色部分爲語義解析進行的相關操作,而形成的語義解析樹的根節點則是最終的語義解析結果,可以通過查詢語句直接在知識庫中查詢最終答案。
  • 信息抽取(Information Extraction):該類方法通過提取問題中的實體,通過在知識庫中查詢該實體可以得到以該實體節點爲中心的知識庫子圖,子圖中的每一個節點或邊都可以作爲候選答案,通過觀察問題依據某些規則或模板進行信息抽取,得到問題特徵向量,建立分類器通過輸入問題特徵向量對候選答案進行篩選,從而得出最終答案。信息抽取的代表論文Yao X, Van Durme B. Information Extraction over Structured Data: Question Answering with Freebase[C]//ACL (1). 2014: 956-966.
  • 向量建模(Vector Modeling): 該方法思想和信息抽取的思想比較接近,根據問題得出候選答案,把問題和候選答案都映射爲分佈式表達(Distributed Embedding),通過訓練數據對該分佈式表達進行訓練,使得問題和正確答案的向量表達的得分(通常以點乘爲形式)儘量高,如下圖所示。模型訓練完成後則可根據候選答案的向量表達和問題表達的得分進行篩選,得出最終答案。

4. 基於深度學習的KQ問答

隨着深度學習(Deep Learning)在⾃然語⾔處理領域的⻜速發展,從15年開始,開始湧現出⼀系列基 於深度學習的KB-QA⽂章,通過深度學習對傳統的⽅法進⾏提升,取得了較好的效果。
使⽤卷積神經⽹絡對向量建模⽅法進⾏提升,使⽤卷積神經⽹絡對語義解析⽅法進⾏提升,使⽤⻓短時記憶⽹絡(LSTM),卷積神經⽹絡共同進⾏實體關係分類,使⽤記憶⽹絡(Memory Networks),注意⼒機制(Attention Mechanism)進⾏KB-QA。
直到2018年底,BERT對NLP的巨⼤突破,使得⽤BERT進⾏KB-QA也取得了較好的效果。本項⽬基於BERT模型實現。

二. 本項目介紹

本項目的主要目標是,構建一個知識庫問答系統,從用戶所提出的問題,對知識庫進行檢索,返回一個確定的答案,如果沒有答案的 返回 無答案。

1. 項目數據集

NLPCC全稱⾃然語⾔處理與中⽂計算會議(The Conference on Natural Language Processing and Chinese Computing),它是由中國計算機學會(CCF)主辦的 CCF 中⽂信息技術專業委員會年度學術會議,專注於⾃然語⾔處理及中⽂計算領域的學術和應⽤創新。
本項目的數據集採用的是NLPCC2017的Task5:Open Domain Question Answering;其包含 14,609 個問答對的訓練集和包含 9870 個問答對的測試集。並提供一個知識庫,包含 6,502,738 個實體、 587,875 個屬性以及 43,063,796 個三元組。
NLPCC2017_task5

數據集格式如下:

2. 處理數據集

請參考文件 preProcessData/createTrainingData.py
裏面包含2 步, 1) 構建命名實體識別數據集, 2) 構建相似度訓練數據集

2.1 構造命名實體識別數據集

構造命名實體識別NER數據集, 需要根據三元組-Enitity反向標註問題,給Question 打標籤, 這裏只需要識別實體,使用[’“O”, “B-LOC”, “I-LOC”]來做標記,其中O 表示其他非實體,B-LOC 實體開始,I-LOC 實體 非首字母。

生成結果放到 NERData 文件夾下面, 點開 train.txt 可以看到NERdata 結構如下:
在這裏插入圖片描述在這裏插入圖片描述

2.2 構造知識庫數據集

構造知識庫,主要提取原始數據集中的 作爲知識庫,傳進database 裏面,用於當檢索。

2.3 構建屬性相似的數據

構造正負樣本,用於問題和屬性相似度的訓練。當用戶輸入問題時,第一個通過命名實體識別提取出實體, 進行數據庫查詢,有可能得到多條信息,因爲一個實體會對應很多屬性。 此時通過問題和屬性相似度訓練模型進行屬性選擇,選擇一個與用戶輸入問題 最相近的屬性,將答案返回。

構造的數據集如下: 一個正樣本,五個負樣本。
其中問題和屬性 作爲 seq1 和 seq2 輸入BertForSequenceClassification 進行訓練。
在這裏插入圖片描述

4. 構建數據庫數據

Ubuntu mysql 安裝 請參考 鏈接: Ubuntu mysql 安裝
使用請參考 Ubuntu mysql使用方法
python 操作mysqlubuntu python mysql

5. 模型構建

5.1 BertCRF

本項目用的是 hunggingface的Transformers版本的BERT .
思路:

  1. BertModel得到output 即最後一層的hidden_state(shape: batch_size, seq_len, hidden_size)
  2. 通過線性變換,將hidden_state 由 hidden_size 轉成 num_labels, 此處num_labels = 3 即命名實體識別的3種類型[‘O’, ‘B-LOC’. ‘I-LOC’]. 此時輸出shape (batch_size, seq_len, num_label), 我們將這裏的輸出作爲CRF的輸入.
  3. 將上一步的輸出,作爲CRF的輸入.

transformers 自帶的BertForTokenClassification 正好滿足第一步和第二步的需求. 因爲這裏我們只需要獲取輸出的hidden,不需要計算損失,所以BERT的輸入中不需要輸入target label, 當沒有label輸入時, BertForTokenClassification的輸出 第一項就是我們想要的結果 emission(batch_size, seq_len, num_labels=3). 請見代碼:

emissions = self.bertModel(input_ids = input_ids,attention_mask = attention_mask, token_type_ids=token_type_ids)[0]

5.2 BertForSequenceClassification

該模型是用來從問題中提取屬性的。
當一個問題來的時候,我們第一步通過命名實體識別提取實體名,第二步要確認問題的屬性。關於屬性的確認就是通過分類模型來得到。
該模式輸入是序列如下:[CLS] 問題 [SEP] 屬性[SEP].
數據集就是上面構造的similarity 數據集,每一個正樣本,對應有五個負樣本。
通過二分類模型,進行 ‘問題’ 和 ‘屬性’ 的相似度訓練。

這裏採用的是transformers 自帶的BertForSequenceClassification. 這是一個在BERT基礎上 添加一個序列分類 用於微調的模型。 大題步驟: 1. BertModel得到output 即最後一層的hidden_state(shape: batch_size, seq_len, hidden_size),取最後一層hidden_state的第一個token用於分類(batch_size, hidden_size) 2. 通過線性變換,將分類token 由 hidden_size 轉成 num_labels, 此處num_labels = 2 即正負樣本(0,1),與真實label計算交叉熵損失。

6. 模型運行效果

在這裏插入圖片描述

參考:
基於知識圖譜的問答系統入門—NLPCC2016KBQA數據集
知乎專欄
問答QA(二)基於BERT的知識庫問答實戰
基於BERT模型的知識庫問答(KBQA)系統

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