NLP之關係抽取(信息抽取、三元組抽取)(附pytorch代碼)

1、什麼是關係抽取

關係抽取的主要任務就是,給定一段句子文本,抽取句子中的兩個實體以及實體之間的關係,以次來構成一個三元組(s,p,o),s是subject表示主實體,o爲object表示客實體,p爲predicate表示兩實體間的關係。總的來說,(s, p, o)可以理解的“s的p是o”。 當然一個句子中可能不止兩個實體,從而也不止一種關係,所以你要做的就是儘可能多的、且正確的抽取句子中的關係實體對。以中文句子爲例,如下圖:
在這裏插入圖片描述
上圖中的抽取結果就是我們後面提供的代碼的抽取結果。可能你會問實體是什麼,實體一般指名詞性詞,如人名、地點名、時間、組織名等。這個關係種類也是由我們事先根據訓練集定義好了的,本文采用的訓練集共有49+1種關係,1代表沒有關係的關係。

那麼這種技術的實際應用在哪呢?在知識圖譜的構建過程中,一般會用到實體抽取、關係抽取技術,知識圖譜的就是由許多節點和邊構成的,一個節點就代表一個實體、一條邊就代表連接兩個實體之間的關係。然後我們可以利用構建好了的知識圖譜爲基礎搭建上層應用,如問答系統、推薦系統等。

2、關係抽取實現

關係抽取的具體實現方式,據我現在瞭解,有pipeline方法和end2end方法。

2.1.pipeline方法

管道式方法,這種方法就是將關係抽取拆成兩個步驟,實體抽取->關係識別,因爲這個過程是串聯起來的,所以稱爲pipline方法。整個過程大致是這樣的,輸入一條句子文本,先用實體抽取器識別出其中的各個實體,然後對抽取出來的實體每兩個進行組合在加上原文本句子作爲關係識別器的輸入進行兩輸入實體間的關係識別。 此種具體實現方法本文暫且不述。

2.2.end2end方法

端到端的抽取方法,也稱爲聯合抽取方法。只輸入一條句子即可,然後從中抽取出實體關係三元組。正如本文上面第一張圖展示的那樣。下面對本文提供的代碼進行講解,代碼來源爲github上的某開源代碼,數據集爲百度2019三元組抽取大賽的數據集(關係種類共50種)。本文主要講解此代碼整個模型架構以及前向傳播過程。
代碼地址: kg2019-baseline-pytorch

首先是數據集的預處理構建:
對文本數據進行輸入的格式還不清楚的,可看看這個文章(句子文本數據如何作爲機器學習(深度學習)模型的輸入(pytorch))。數據集中有多條句子,同時給出了每條句子的多個三元組關係對。對於每條句子以及其中的所有關係對我們要將它們構造成如下格式:
在這裏插入圖片描述
上面只是每條句子的數據構建過程,在訓練時我們都是一批批(batch)進行的,所以我們要將所有句子對應的數據分別構造成一個列表放在一起,如下:

T, S1, S2, K1, K2, O1, O2, = [], [], [], [], [], [], []
.....
......
T.append(t)
S1.append(s1)
S2.append(s2)
K1.append([k1])
K2.append([k2-1])
O1.append(o1)
O2.append(o2)

接着是整個模型的前向傳播過程示意圖:
在這裏插入圖片描述
整個過程在代碼實現時,分爲兩個子模型s_model和po_model,s_model爲預測主實體的過程,po_model爲預測客實體和關係的過程。但這兩個模型都共用了同一個序列編碼層(也就是兩層Bi-Lstm後的輸出編碼)。此圖也是根據模型代碼中相應的forward函數流程進行構建的。此模型總的思路在於,先預測主實體,讓後根據預測的主實體預測對應的客實體和關係。並且爲了預測出多個主實體,在模型s_model的最後一層採用了sigmoid激活函數。

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