©NLP論文解讀 原創•作者 | 小欣
論文標題:PRGC: Potential Relation and Global Correspondence Based Joint Relational Triple Extraction
論文鏈接:https://arxiv.org/pdf/2106.09895.pdf
代碼:https://github.com/hy-struggle/PRGC
1、前言
1. 論文的相關背景
關系抽取是信息抽取和知識圖譜構建的關鍵任務之一,它的目標是從非結構化的文本中抽取形如<頭實體,關系,尾實體>的三元組數據。通常使用Pipeline方法進行抽取:先對句子進行實體識別,然后對識別出的實體兩兩組合進行關系分類,最后把存在關系的實體對輸出為三元組。但這樣的做法存在以下缺點:1. 誤差積累,實體識別模塊的錯誤會影響下面的關系分類性能。2. 實體冗余:沒有關系的實體對會帶來多余信息,提升錯誤率,同時降低整個抽取流程的效率。3. 信息利用不充分:Pipeline方法中兩個子任務相對獨立,無法有效利用兩個子任務的內在聯系和依賴關系。為了緩解Pipeline方法存在的一些問題,聯合關系抽取模型應運而生。聯合關系抽取模型的設計目的是希望進一步利用兩個任務之間的潛在信息,加強實體識別模型和關系分類模型之間的交互。早期的聯合關系抽取模型通過模型參數共享、多任務和關系信息融入序列標注等方法進行聯合抽取,但取得的效果並不盡如人意。隨着CasRel、TPLinker等一系列聯合解碼模型的提出,聯合關系抽取模型開始取得SOTA的效果。
2. 論文主要解決的問題
CasRel、TPLinker等基於聯合解碼的關系抽取模型在抽取效率上的問題
3. 論文的主要創新和貢獻
- 通過將關系抽取拆解為關系判斷、實體提取和主客實體對⻬三個子任務,定義了一種新的關系抽取模型方法
- 有助於緩解CasRel、TPLinker等模型存在的關系冗余、主客實體對齊效率低等問題
2、論文摘要
實體關系聯合抽取是信息抽取中的⼀項重要任務。⽬前的聯合抽取⽅法已有了相當可觀的表現,但仍存在冗余關系預測能⼒差、Span提取泛化不⾜和效率低等問題。本⽂將聯合抽取任務分為三個⼦任務:關系判斷、實體提取和主客實體體對⻬,進⽽提出了⼀種新的聯合抽取模型PRGC。該模型設計了⼀個模塊預測潛在的關系,從⽽限制預測規模;使⽤基於關系的序列標注解決實體重疊問題;最后設計⼀個全局通信模塊將主體和客體整合成三元組。
3、論文模型
PRGC將關系抽取分解成三個任務:關系判斷、實體抽取和主客體對齊。首先通過關系判斷模塊獲取文本中蘊含的關系,過濾掉不可能存在的關系。接着,將關系信息加入到實體抽取模塊,每種關系都抽取出相應的主客實體。最后,使用主客體對齊模塊獲取的全局實體相關矩陣將主客實體進行對齊,從而抽取出文本所對應的三元組。

PRGC整體架構圖
3.1 Relation Judgement
關系判斷可以建模為文本多標簽問題,即定義為給定一段文本,輸出這段文本可能包含的所有關系標簽。如下式所示,作者使用BERT編碼器將句子轉化為向量形式,並通過平均池化獲取句子的向量表征,進而實現關系判斷。

假設一個句子對應N個關系標簽,則PRGC在訓練階段會將一個句子樣本拆分成N個句子樣本,每個句子樣本中僅包含一個關系標簽。例如,"九玄珠是在縱橫中文網連載的一部小說,作者是龍馬"這個句子中存在"連載網站"和"作者"兩個關系,則在訓練階段該句子會被分別以<"九玄珠是在縱橫中文網連載的一部小說,作者是龍馬","連載網站">和<"九玄珠是在縱橫中文網連載的一部小說,作者是龍馬","作者">輸入模型進行關系判斷。此時關系判斷模型便是常規的多分類模型,使用交叉熵計算損失即可。
# (bs, h)
h_k_avg = self.masked_avgpool(sequence_output, attention_mask)
# (bs, rel_num)
rel_pred = self.rel_judgement(h_k_avg)
loss_func = nn.BCEWithLogitsLoss(reduction='mean')
loss_rel = loss_func(rel_pred, rel_tags.float())
在預測階段,通過sigmoid函數獲取句子對應的所有關系標簽的概率,並結合預先設定的概率閾值獲取句子蘊含的關系標簽。
# (bs, rel_num)
rel_pred_onehot = torch.where(
torch.sigmoid(rel_pred) > rel_threshold,
torch.ones(rel_pred.size(), device=rel_pred.device),
torch.zeros(rel_pred.size(), device=rel_pred.device)
)
3.2 Entity Extraction
實體抽取模塊與一般的序列標注任務的不同在於:輸入的向量是融合了關系信息的句子向量。作者提供了兩種融合方式,一種是直接拼接兩個向量,另一種是通過向量相加進行融合。此外,實體抽取模塊會將主體實體抽取和客體實體抽取分開進行抽取
if ex_params['emb_fusion'] == 'concat':
decode_input = torch.cat([sequence_output, rel_emb], dim=-1)
# sequence_tagging_sub就是個普通的序列標注模塊
output_sub = self.sequence_tagging_sub(decode_input)
output_obj = self.sequence_tagging_obj(decode_input)
elif ex_params['emb_fusion'] == 'sum':
decode_input = sequence_output + rel_emb
# sequence_tagging_sum里面主客實體抽取也是分開進行的
output_sub, output_obj = self.sequence_tagging_sum(decode_input)
3.3 Subject-object Alignment
主客實體對齊模塊本質上就是生成字符與字符的相關矩陣。
代碼實現
# batch x seq_len x seq_len x 2*hidden
corres_pred = torch.cat([sub_extend, obj_extend], 3)
# (bs, seq_len, seq_len)
corres_pred = self.global_corres(corres_pred).squeeze(-1)
# global_corres的類代碼
class MultiNonLinearClassifier(nn.Module):
def __init__(self, hidden_size, tag_size, dropout_rate):
super(MultiNonLinearClassifier, self).__init__()
self.tag_size = tag_size
self.linear = nn.Linear(hidden_size, int(hidden_size / 2))
self.hidden2tag = nn.Linear(int(hidden_size / 2), self.tag_size)
self.dropout = nn.Dropout(dropout_rate)
def forward(self, input_features):
features_tmp = self.linear(input_features)
features_tmp = nn.ReLU()(features_tmp)
features_tmp = self.dropout(features_tmp)
features_output = self.hidden2tag(features_tmp)
return features_output
由於采用了拼接向量后通過全連接生成對齊矩陣,故而會占用較多的顯存。筆者在這部分嘗試了使用biffine機制進行向量的交叉融合,可以在不降低性能的情況下有效地節約顯存。
3.4 Loss Function
PRGC的損失采用了三個子任務加權的形式,本質上都是交叉熵,只是針對不同維度進行了處理。作者在論文中並未詳細討論不同的加權方式對模型的影響,在代碼實現中也是采用了常規的三個損失直接相加的結構。筆者認為由於三個損失的收斂情況不同,可以嘗試根據訓練輪數動態調整三個損失之間的加權關系。

4、論文實驗
PRGC主要在NYT和WebNLG上進行實驗,NYT和WebNLG都有兩個版本,一個版本是標注出整個實體,另一個版本是僅標注出實體的最后一個字符,作者將僅標注出實體的最后一個字符的版本記為NYT*和WebNLG*。如下例中實體North Carolina在NYT中是整體標出的,而在NYT*中則是僅標出Carolina。
- NYT的數據格式:
{
"text": "North Carolina EASTERN MUSIC FESTIVAL Greensboro , June 25-July 30 .",
"triple_list": [
[
"North Carolina",
"/location/location/contains",
"Greensboro"
]
]
}
- NYT*的數據格式:
{
"text": "North Carolina EASTERN MUSIC FESTIVAL Greensboro , June 25-July 30 .",
"triple_list": [
[
"Carolina",
"/location/location/contains",
"Greensboro"
]
]
}
- WebNLG的數據格式:
{
"text": "Alan Bean , who graduated in 1955 from UT Austin with a B.S . and was selected by NASA in 1963 , spent 100305.0 minutes in space .",
"triple_list": [
[
"Alan Bean",
"was selected by NASA",
"1963"
]
]
}
- WebNLG*的數據格式:
{
"text": "Alan Bean , who graduated in 1955 from UT Austin with a B.S . and was selected by NASA in 1963 , spent 100305.0 minutes in space .",
"triple_list": [
[
"Bean",
"was selected by NASA",
"1963"
]
]
}
評價指標采用了常見的精准率(Prec.)、 召回率(Rec.)和F1-score。實驗結果如下圖,可以看出PRGC在四個數據上都取得了不錯的效果。
此外,作者還對PRGC的效率進行了實驗,得益於PRGC可以通過關系判斷去除掉句子中不包含的關系標簽和整個模型不存在過於復雜的解碼方式,PRGC在復雜度和推理速度上相比於CasRel和TPLinker都有明顯的優勢:

