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被錯誤分類), 資料集中存在噪聲。