1. 程式人生 > >用CRF做命名實體識別

用CRF做命名實體識別

裏的 以及 命名 語料庫 images AD 之前 .dll alt

摘要

本文主要講述了關於人民日報標註語料的預處理,利用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做命名實體識別