當我寫下這篇文章的時候,個人心裏是激動的,這是由於,自從去年6月份寫了文章利用關係抽取構建知識圖譜的一次嘗試 後,我就一直在試圖尋找一種在開放領域可以進行三元組抽取的辦法,也有不少讀者問過我這方面的問題,今天,筆者將給出答覆,雖然不是正確答案(如今也沒有正確答案),但至少,我寫下了本身的答案。
離我想出這個抽取系統雖然纔過去不久,但個人心情,已經由開始的激動狂喜,轉化爲後來的平淡,直到如今的不滿。事實證實,開放領域的三元組抽取實在太難,以筆者我的的努力和智商,實在無法給出完美的答案,因此,文章的題目是嘗試,僅僅做爲嘗試,並不能解決好這個問題。但,我仍是想寫些什麼,但願可以對筆者有一點點啓發,同時,也是對本身近半年的探尋作一個總結。
關於三元組抽取的基本介紹和經常使用辦法,筆者以前已經在很多文章中描述過,這裏再也不過多介紹,有興趣的讀者能夠參考文章利用關係抽取構建知識圖譜的一次嘗試 和 NLP(二十六)限定領域的三元組抽取的一次嘗試 。本文將會介紹筆者在開放領域作三元組抽取的一次嘗試。
本項目已經開源至Github,文章最後會給出相應的網址。本項目的項目結構以下:
本項目一共分爲四部分,主要模塊介紹以下:html
本項目的抽取系統流程圖以下:
接下來筆者將逐一介紹。git
筆者用tornado搭建了簡易的標註平臺,在標註頁面中,標註人員須要輸入標註的句子(句子級別的抽取)以及subject,predicate,object,點擊「顯示SPO」,將有效的三元組標註爲1,無效的三元組標註爲0。之因此採起這種標註方法,是由於咱們能夠在句子中標註subject,predicate,object,這些標註的實體就會造成可能的三元組組合,再利用0,1來標註這種三元組是否有效,這樣就能作到在開放領域進行三元組抽取。
一個簡單的標註例子以下:
再對以上的標註結果作一些說明,咱們的標註是以句子爲單位,進行句子級別的標註,不一樣要素在標註的時候加#區分,標註了兩個subject,1個predicate(共用)和2個object,其中predidate是這些subject和object公用的,因此只須要標註一次。這樣,點擊「顯示SPO」,一共會顯示4個三元組,s,p,o用#隔開,0,1表示是不是有效三元組,默認爲0。
筆者利用空餘時間,一共標註了3200多個樣本,對於序列標註來講,就是3200多個樣本,對於文本分類來講,就是9000多個樣本了。github
對於上述的標註例子,會造成以下的標註序列:算法
美 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 衛 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
將數據集分爲訓練集和測試集,比例爲8:2.採用經典的深度學習模型ALBERT+Bi-LSTM+CRF進行實體識別,設置最大文本長度爲128,訓練100個epoch。關於該模型的介紹,能夠參考文章NLP(二十五)實現ALBERT+Bi-LSTM+CRF模型 。
在測試集上的訓練結果以下:微信
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%。tornado
關於文本分類,須要多作一些說明。
雖然本文的題目是關於在開發領域的三元組抽取的嘗試,但實際我在標註的時候,仍是更多地標註人物頭銜,人物關係,公司與人的關係,影視劇主演、導演信息等。造成的有效的文本分類的樣本爲9000多個,一共有關係1365個,數量最多的前20個關係以下圖:
以上述的標註數據爲例,造成的標註數據以下:學習
美國疾控中心#主任#雷德菲爾德#1#美國疾控中心主任雷德菲爾德(左圈)和美國國立衛生研究院過敏和傳染病研究所主任福西(右圈) 美國疾控中心#主任#福西#0#美國疾控中心主任雷德菲爾德(左圈)和美國國立衛生研究院過敏和傳染病研究所主任福西(右圈) 美國國立衛生研究院過敏和傳染病研究所#主任#雷德菲爾德#0#美國疾控中心主任雷德菲爾德(左圈)和美國國立衛生研究院過敏和傳染病研究所主任福西(右圈) 美國國立衛生研究院過敏和傳染病研究所#主任#福西#1#美國疾控中心主任雷德菲爾德(左圈)和美國國立衛生研究院過敏和傳染病研究所主任福西(右圈)
在實際模型訓練的時候,會將原文中的subject用S*len(subject)代替,predicate用P,object用O。
將數據集分爲訓練集和測試集,比例爲8:2。採用經典的深度學習模型ALBERT+Bi-GRU+ATT+FC,設置文本的最大長度爲爲128,訓練30個epoch,採用early stopping機制,訓練過程的loss和acc圖像以下:
最終在測試集上的accuracy約爲96%。測試
上述的模型訓練完畢後,咱們就能夠將其封裝成HTTP服務。對於新輸入的句子,咱們先利用序列標註模型預測出其中的subject,predicate和object,組合成三元組與句子的拼接,輸入到文本分類模型,判別該三元組是否有效,0爲無效,1爲有效。
從網上找幾個例子,預測的結果以下:
extract_example
目錄中爲抽取的效果,包括幾本小說和一些新聞上的效果,關於這方面的演示,能夠參考另外一個項目:https://github.com/percent4/knowledge_graph_demo 。也能夠參考文章知識圖譜構建舉例 中給出的幾個知識圖譜的建構的例子。spa
本文寫的過程較爲簡單,也沒有代碼,這是由於筆者在以前的文章中作了大量的鋪墊,主要是集中在模型方面。何況,這個項目比較大,也不適合在這裏詳細講述,筆者只在這裏給出思路和大概的處理流程,具體的實現代碼能夠參考下方的Github地址。
在實際的抽取過程當中,一些句子也存在抽取出大量無用的三元組的狀況,致使召回率高,這是由於本項目針對的是開放領域的三元組抽取,所以效果比不會有想象中的那麼好,提高抽取效果的辦法以下:.net
本項目做爲筆者在開放領域的三元組抽取的一次嘗試,在此以前關於這方面的文章或者項目還不多,所以能夠說是探索階段。
源碼和數據已經在Github項目中給出,網址爲 https://github.com/percent4/spo_extract_platform 。
本人的微信公衆號爲Python爬蟲與算法
,歡迎關注~