用CRF做命名實體識別
摘要
本文主要講述了關於人民日報標註語料的預處理,利用CRF++工具包對模型進行訓練以及測試
目錄
- 明確我們的標註任務
- 語料和工具
- 數據預處理
1.數據說明
2.數據預處理 - 模型訓練及測試
1.流程
2.標註集
3.特征模板
4.CRF++包的使用說明 總結與展望
正文
1.明確我們的標註任務
這篇文章主要是介紹用CRF模型去提取人民日報語料的時間、人物、地點及組織機構名,也就是提取TIME、PERSON、LOCATION、ORGANIZATION四種實體。訓練我們直接使用CRF++工具包。
2.語料和工具
人民日報1998中文標註語料庫
CRF++安裝包
3.數據預處理
3.1 數據說明
- 首先打開下載的人民日報標註語料的文件,要轉為utf-8格式。我們需要提取的實體是時間、人名、地名、組織機構名,根據語料庫的詞性標記說明,對應的詞性分別為/t、/nr、/ns、/nt。
3.2 數據預處理
語料庫裏的姓名標註是將姓和名分開標註的,因此需要合並姓名
合並姓名前: ‘19980101-01-001-002/m中共中央/nt總書記/n、/w國家/n主席/n江/nr某某/nr‘ 合並姓名後: ‘19980101-01-001-002/m中共中央/nt總書記/n、/w國家/n主席/n江某某/nr‘
需要將中括號裏的內容合並
合並中括號前: ‘[中國/ns 政府/n]nt 順利/ad 恢復/v 對/p 香港/ns 行使/v 主權/n ,/w ‘ 合並中括號後: ‘中國政府nt順利/ad恢復/v對/p香港/ns行使/v主權/n,/w‘
時間合並
合並時間前: ‘1999年/t 12月/t 澳門/ns 的/u 回歸/vn 一定/d 能夠/v 順利/ad 實現/v 。/w‘ 合並時間後: ‘1999年12月/t澳門/ns的/u回歸/vn一定/d能夠/v順利/ad實現/v。/w‘
- 全角字符統一轉為半角字符
人民日報語料有些地方不是兩個空格的,例如11042行 ‘副教授/n 嘆/Vg 道/v ,/w 成/v‘, 中的“嘆/Vg” 和“道/v”之間是單空格,需要變成雙空格。否則代碼運行會報錯
4.模型訓練及測試
流程
4.2 標註集**
用的是BMEWO做標註體系
B代表實體的首部,M代表實體的中部,E代表實體的尾部,W代表單個的實體,O代表非實體
新 O 世 O 紀 O — O — O 一 B_TIME 九 M_TIME 九 M_TIME 八 M_TIME 年 E_TIME 新 B_TIME 年 E_TIME 講 O 話 O ( O 附 O 圖 O 片 O 1 O 張 O ) O 中 B_ORGANIZATION 共 M_ORGANIZATION 中 M_ORGANIZATION 央 E_ORGANIZATION 總 O 書 O 記 O
CRF++訓練的數據格式如上圖所示
4.3 特征模板
特征模板template如下
# Unigram
U00:%x[-2,0]
U01:%x[-1,0]
U02:%x[0,0]
U03:%x[1,0]
U04:%x[2,0]
U05:%x[-2,0]/%x[-1,0]/%x[0,0]
U06:%x[-1,0]/%x[0,0]/%x[1,0]
U07:%x[0,0]/%x[1,0]/%x[2,0]
U08:%x[-1,0]/%x[0,0]
U09:%x[0,0]/%x[1,0]
# Bigram
B
4.4 CRF++包的使用說明
下載工具包之後,打開文件夾
1.在此處新建一個文件夾chinese
2.我們復制crf_learn.exe,crf_test.exe和libcrfpp.dll這三個文件到我們新建的chinese文件夾裏面,然後再把之前生成的CRF++數據格式的數據文件train.data放到chinese裏面,再把我們自己定義的特征模板文件放到chinese文件夾裏面(一共五個文件)
3.在chinese裏面打開cmd
敲入以下代碼,這便是開始訓練模型
crf_learn -a MIRA template train.data model
template就是我們上面定義的特征模板
訓練好之後會產生一個model文件
4.自己寫幾個測試文本,並將其轉為CRF++的數據格式,註意標簽要全部一樣,如下圖所示
揚 B
帆 B
遠 B
東 B
做 B
與 B
中 B
國 B
合 B
作 B
的 B
先 B
行 B
希 B
臘 B
的 B
經 B
濟 B
結 B
構 B
較 B
特 B
殊 B
。 B
同樣把這個測試數據的文件test.data放到chinese文件夾裏面
5.在chinese裏面打開cmd
敲入以下代碼,這便是開始模型預測
crf_test -m model test.data >> output.txt
打開output.txt文件你就會看到預測的結果
揚 B O
帆 B O
遠 B O
東 B O
做 B O
與 B O
中 B B_LOCATION
國 B E_LOCATION
合 B O
作 B O
的 B O
先 B O
行 B O
希 B B_LOCATION
臘 B E_LOCATION
的 B O
經 B O
濟 B O
結 B O
構 B O
較 B O
特 B O
殊 B O
。 B O
5.總結與展望
現在僅僅只是粗暴的把這個流程實現了一遍,測試的效果並不是很好,有部分的人名沒有識別出來,還需要再添加特征,以及更改template特征模板,這些還在學習。CRF的原理也不是很懂,也需要去完整的學習一下。後續還會更新
也歡迎大家看看我的簡書[https://www.jianshu.com/p/12f2cdd86679]
用CRF做命名實體識別