1. 程式人生 > 其它 >Distant-Supervised-Chinese-Relation-Extraction 程式碼詳解

Distant-Supervised-Chinese-Relation-Extraction 程式碼詳解

原始資料:

1. 資料來源:

原始資料採用了中文通用百科知識圖譜(CN-DBpedia)公開的部分資料, 包含900萬+的百科實體以及6600萬+的三元組關係。其中摘要資訊400萬+, 標籤資訊1980萬+, infobox資訊4100萬+。

2. 資料格式

 

構建實體字典:

原始資料的每行第一個元素為實體, 根據正則表示式篩選全部為中文字元的實體, 轉換為字典格式。

1. 將資料按行讀入,並且存入data

2. 保留元素全為中文的三元組:

3. 構造實體字典

構造的資料格式如下:

將實體字典儲存到 entities.pkl 檔案中

將實體名稱entities.keys(),去重,存入到entities.txt 檔案中

 

獲取句子集合、句子預處理:

實體的BaiduCard屬性為實體的百度百科簡介, 通常為多個句子。根據實體字典獲取句子集合, 存為列表格式。

對所有句子進行預處理去除所有中文字元、中文常用標點之外的所有字元, 並對多個句子進行拆分, 存為列表格式。

1. 

 

2.

3. 處理後的資料格式如下:

4. 並且儲存到sentences 檔案下

 

句子匹配實體:

對每一個句子, 遍歷實體集合, 根據字串匹配儲存所有出現在句子中的實體。過濾掉沒有實體或僅有一個實體出現的句子, 資料處理為[[sentence, [entity1,...]], ...]的格式。

1. 將實體名稱去重,並且儲存在self.entities 中

將所有儲存句子的檔名儲存在 self.sentence_files 中

2. 使用程序池

3. 進入match 函式,過濾掉沒有實體或僅有一個實體出現的句子

由於data的資料格式如下,採用data[0] 的方式進行取值

資料格式如下

 

句子分詞:

使用Python的jieba庫進行中文分詞, 對中文句子進行分詞。將資料處理為[[sentence, [entity1,...], [sentence_seg]], ...]的格式。

收集所有分詞後的句子, 作為語料庫使用Python的word2vec庫訓練詞向量。

1.對句子d[0]進行分詞,並且將分詞新增到 pkl 檔案中

 

處理後的資料格式如下:

 

定義使用者字典:

為防止實體被錯誤分詞, 將所有實體(實體字典的鍵集合)寫入到檔案dict.txt作為使用者字典

 

定義停用詞:

定義檔案stop_word.txt, 在分詞過程中對句子去除中文停用詞。(網上資源較多)

對分詞後的句子重新對實體進行篩選, 對每一個句子的實體列表中的實體, 若其沒有在分詞後的句子中出現, 則去除該實體。  --  進一步縮小實體的範圍

 

句子、實體對篩選:

對篩選後的實體集合兩兩組合, 資料處理為[[sentence, entity_head, entity_tail, [sentence_seg]]]的格式。(一個句子可能被用於多個樣本。)

這裡的匹配不存在順序反的情況

資料格式如下

注:

此處先對句子匹配實體, 去除不符合條件的句子後然後分詞, 再用分詞後的句子匹配實體的主要原因是:

某些實體名稱可能是另一實體的子集, 如“北京”和“北京大學”。在句子“北京大學是中國的著名大學。”中, 出現的實體應僅為“北京大學”。

分詞時間較長, 不對句子進行初步篩選, 直接對所有句子先分詞再匹配實體, 這樣效率較低。

處理後資料格式如下:

 

新增關係標籤:

根據對原始資料集的分析, 人工預定義了23種出現頻率較高關係, 見附錄1, 其中'NA'表示兩實體沒有關係或存在其他關係。同時, 原始資料中的關係/屬性並沒有對齊(如妻子、夫人對應同一種關係), 人工編寫規則對關係對齊、聚合。

1. 資料的標註

其中entities[can[1]] 為第二個大括號裡面的內容

如果存在和尾實體相等的情況

如果尾實體存在於config當中,則對其key值進行拆分,使用tgs[tp[0]] 的方式判斷tag 是否在句子當中,如果tgs[tp[1]]在句子當中,將name 的關係新增進來;如果tgs[tp[1]]不在句子當中,將name 的other關係新增進來

Name 屬性值 如下

Config 的資料內容如下

資料格式如下:

 

資料集格式轉換:

對資料進行格式轉化, 並新增'id'、'type'或其它等等屬性。資料處理為:

資料的格式如下:

 

劃分訓練集、測試集:

每種標籤按照3:1的比例劃分訓練集、測試集。

 

 

一些問題:

1.句子較多, 匹配實體、分詞、訓練詞向量時間較長(400W句子匹配8W實體, 使用8個執行緒約需1~2小時?), 建議先使用較少資料預測下執行時間, 使用多執行緒或者資料子集進行操作。

2. 部分資料清洗工作較為簡單粗暴, 存在改進空間。

3. 關係種類較少, 關係對齊規則較為簡單, 且原始資料中存在部分噪聲(如BaiduTAG被錯誤分類), 資料集中存在噪聲。