NLP(二十七)開放領(lǐng)域的三元組抽取的一次嘗試

??當(dāng)我寫下這篇文章的時候,我的內(nèi)心是激動的,這是因為,自從去年6月份寫了文章利用關(guān)系抽取構(gòu)建知識圖譜的一次嘗試 后,我就一直在試圖尋找一種在開放領(lǐng)域能夠進(jìn)行三元組抽取的辦法,也有很多讀者問過我這方面的問題,今天,筆者將給出答復(fù),雖然不是正確答案(現(xiàn)在也沒有正確答案),但至少,我寫下了自己的答案。
??離我想出這個抽取系統(tǒng)雖然才過去不久,但我的心情,已經(jīng)由開始的激動狂喜,轉(zhuǎn)化為后來的平淡,直到現(xiàn)在的不滿。事實證明,開放領(lǐng)域的三元組抽取實在太難,以筆者個人的努力和智商,實在沒法給出完美的答案,所以,文章的題目是嘗試,僅僅作為嘗試,并不能解決好這個問題。但,我還是想寫些什么,希望能夠?qū)P者有一點點啟發(fā),同時,也是對自己近半年的探尋做一個總結(jié)。
??關(guān)于三元組抽取的基本介紹和常用辦法,筆者之前已經(jīng)在不少文章中描述過,這里不再過多介紹,有興趣的讀者可以參考文章利用關(guān)系抽取構(gòu)建知識圖譜的一次嘗試NLP(二十六)限定領(lǐng)域的三元組抽取的一次嘗試 。本文將會介紹筆者在開放領(lǐng)域做三元組抽取的一次嘗試。
?? 本項目已經(jīng)開源至Github,文章最后會給出相應(yīng)的網(wǎng)址。本項目的項目結(jié)構(gòu)如下:

項目結(jié)構(gòu)

本項目一共分為四部分,主要模塊介紹如下:

  • extract_example: 利用訓(xùn)練好的模型對基本小說和新聞進(jìn)行三元組抽取,形成知識圖譜例子;
  • sequence_labeling:訓(xùn)練標(biāo)注,對標(biāo)注的實體數(shù)據(jù)進(jìn)行序列標(biāo)注算法訓(xùn)練;
  • spo_tagging_platform:標(biāo)注平臺,標(biāo)注subject,predicate和object以及三元組是否有效;
  • text_classification:文本分類,用于判別抽取的三元組是否有效。

??本項目的抽取系統(tǒng)流程圖如下:


抽取系統(tǒng)流程圖

??接下來筆者將逐一介紹。

標(biāo)注平臺

??筆者用tornado搭建了簡易的標(biāo)注平臺,在標(biāo)注頁面中,標(biāo)注人員需要輸入標(biāo)注的句子(句子級別的抽取)以及subject,predicate,object,點擊“顯示SPO”,將有效的三元組標(biāo)注為1,無效的三元組標(biāo)注為0。之所以采取這種標(biāo)注方法,是因為我們可以在句子中標(biāo)注subject,predicate,object,這些標(biāo)注的實體就會形成可能的三元組組合,再利用0,1來標(biāo)注這種三元組是否有效,這樣就能做到在開放領(lǐng)域進(jìn)行三元組抽取。
??一個簡單的標(biāo)注例子如下:


標(biāo)注例子

再對以上的標(biāo)注結(jié)果做一些說明,我們的標(biāo)注是以句子為單位,進(jìn)行句子級別的標(biāo)注,不同要素在標(biāo)注的時候加#區(qū)分,標(biāo)注了兩個subject,1個predicate(共用)和2個object,其中predidate是這些subject和object公用的,所以只需要標(biāo)注一次。這樣,點擊“顯示SPO”,一共會顯示4個三元組,s,p,o用#隔開,0,1表示是否是有效三元組,默認(rèn)為0。
??筆者利用空余時間,一共標(biāo)注了3200多個樣本,對于序列標(biāo)注來說,就是3200多個樣本,對于文本分類來說,就是9000多個樣本了。

序列標(biāo)注

??對于上述的標(biāo)注例子,會形成如下的標(biāo)注序列:

美   B-SUBJ
國   I-SUBJ
疾   I-SUBJ
控   I-SUBJ
中   I-SUBJ
心   I-SUBJ
主   B-PRED
任   I-PRED
雷   B-OBJ
德   I-OBJ
菲   I-OBJ
爾   I-OBJ
德   I-OBJ
(   O
左   O
圈   O
)   O
和   O
美   B-SUBJ
國   I-SUBJ
國   I-SUBJ
立   I-SUBJ
衛(wèi)   I-SUBJ
生   I-SUBJ
研   I-SUBJ
究   I-SUBJ
院   I-SUBJ
過   I-SUBJ
敏   I-SUBJ
和   I-SUBJ
傳   I-SUBJ
染   I-SUBJ
病   I-SUBJ
研   I-SUBJ
究   I-SUBJ
所   I-SUBJ
主   B-PRED
任   I-PRED
福   B-OBJ
西   I-OBJ
(   O
右   O
圈   O
)   O

??將數(shù)據(jù)集分為訓(xùn)練集和測試集,比例為8:2.采用經(jīng)典的深度學(xué)習(xí)模型ALBERT+Bi-LSTM+CRF進(jìn)行實體識別,設(shè)置最大文本長度為128,訓(xùn)練100個epoch。關(guān)于該模型的介紹,可以參考文章NLP(二十五)實現(xiàn)ALBERT+Bi-LSTM+CRF模型 。
??在測試集上的訓(xùn)練結(jié)果如下:

accuracy:  93.69%; precision:  76.26%; recall:  82.33%; FB1:  79.18
OBJ: precision:  80.47%; recall:  88.81%; FB1:  84.44  927
PRED: precision:  76.89%; recall:  83.69%; FB1:  80.14  1021
SUBJ: precision:  71.72%; recall:  75.32%; FB1:  73.48  983

在測試集上的總體F1值接近80%。

文本分類

??關(guān)于文本分類,需要多做一些說明。
??雖然本文的題目是關(guān)于在開發(fā)領(lǐng)域的三元組抽取的嘗試,但實際我在標(biāo)注的時候,還是更多地標(biāo)注人物頭銜,人物關(guān)系,公司與人的關(guān)系,影視劇主演、導(dǎo)演信息等。形成的有效的文本分類的樣本為9000多個,一共有關(guān)系1365個,數(shù)量最多的前20個關(guān)系如下圖:


數(shù)量最多的20個關(guān)系

??以上述的標(biāo)注數(shù)據(jù)為例,形成的標(biāo)注數(shù)據(jù)如下:

美國疾控中心#主任#雷德菲爾德#1#美國疾控中心主任雷德菲爾德(左圈)和美國國立衛(wèi)生研究院過敏和傳染病研究所主任福西(右圈)
美國疾控中心#主任#福西#0#美國疾控中心主任雷德菲爾德(左圈)和美國國立衛(wèi)生研究院過敏和傳染病研究所主任福西(右圈)
美國國立衛(wèi)生研究院過敏和傳染病研究所#主任#雷德菲爾德#0#美國疾控中心主任雷德菲爾德(左圈)和美國國立衛(wèi)生研究院過敏和傳染病研究所主任福西(右圈)
美國國立衛(wèi)生研究院過敏和傳染病研究所#主任#福西#1#美國疾控中心主任雷德菲爾德(左圈)和美國國立衛(wèi)生研究院過敏和傳染病研究所主任福西(右圈)

在實際模型訓(xùn)練的時候,會將原文中的subject用S*len(subject)代替,predicate用P,object用O。
??將數(shù)據(jù)集分為訓(xùn)練集和測試集,比例為8:2。采用經(jīng)典的深度學(xué)習(xí)模型ALBERT+Bi-GRU+ATT+FC,設(shè)置文本的最大長度為為128,訓(xùn)練30個epoch,采用early stopping機(jī)制,訓(xùn)練過程的loss和acc圖像如下:


訓(xùn)練過程的loss和acc圖像

最終在測試集上的accuracy約為96%。

新數(shù)據(jù)進(jìn)行三元組抽取

??上述的模型訓(xùn)練完畢后,我們就可以將其封裝成HTTP服務(wù)。對于新輸入的句子,我們先利用序列標(biāo)注模型預(yù)測出其中的subject,predicate和object,組合成三元組與句子的拼接,輸入到文本分類模型,判別該三元組是否有效,0為無效,1為有效。
??從網(wǎng)上找?guī)讉€例子,預(yù)測的結(jié)果如下:

例子1

例子2

例子3

??extract_example目錄中為抽取的效果,包括幾本小說和一些新聞上的效果,關(guān)于這方面的演示,可以參考另一個項目:https://github.com/percent4/knowledge_graph_demo 。也可以參考文章知識圖譜構(gòu)建舉例 中給出的幾個知識圖譜的建構(gòu)的例子。

總結(jié)

??本文寫的過程較為簡單,也沒有代碼,這是因為筆者在之前的文章中做了大量的鋪墊,主要是集中在模型方面。況且,這個項目比較大,也不適合在這里詳細(xì)講述,筆者只在這里給出思路和大概的處理流程,具體的實現(xiàn)代碼可以參考下方的Github地址。
??在實際的抽取過程中,一些句子也存在抽取出大量無用的三元組的情況,導(dǎo)致召回率高,這是因為本項目針對的是開放領(lǐng)域的三元組抽取,因此效果比不會有想象中的那么好,提升抽取效果的辦法如下:

  • 增加數(shù)據(jù)標(biāo)注量,目前序列標(biāo)注算法的樣本僅3200多個;
  • 模型方面:現(xiàn)在是pipeline形式,各自的效果還行,但總體上不如Joint形式好;
  • 對于自己想抽的其他三元組的情形,建議增加這方面的標(biāo)注;
  • 文本預(yù)測耗時長(該問題已經(jīng)解決)。

??本項目作為筆者在開放領(lǐng)域的三元組抽取的一次嘗試,在此之前關(guān)于這方面的文章或者項目還很少,因此可以說是探索階段。

??源碼和數(shù)據(jù)已經(jīng)在Github項目中給出,網(wǎng)址為 https://github.com/percent4/spo_extract_platform 。

??本人的微信公眾號為Python爬蟲與算法,歡迎關(guān)注~

參考文獻(xiàn)

  1. 利用關(guān)系抽取構(gòu)建知識圖譜的一次嘗試: https://www.cnblogs.com/jclian91/p/11107323.html
  2. NLP(二十六)限定領(lǐng)域的三元組抽取的一次嘗試: https://blog.csdn.net/jclian91/article/details/104874488
  3. NLP(二十五)實現(xiàn)ALBERT+Bi-LSTM+CRF模型: https://blog.csdn.net/jclian91/article/details/104826655
  4. 知識圖譜構(gòu)建舉例: https://blog.csdn.net/jclian91/article/details/104685424
  5. NLP(二十一)人物關(guān)系抽取的一次實戰(zhàn):https://blog.csdn.net/jclian91/article/details/104380371
  6. 《知識圖譜 方法、實踐與應(yīng)用》 王昊奮、漆桂林、陳華鈞著,中國工信出版集團(tuán)、電子工業(yè)出版社出版。
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容