用CRF做命名實體識別(三)
標簽: CRF
作者:煉己者
歡迎大家訪問我的簡書以及我的博客
本博客所有內(nèi)容以學(xué)習捌年、研究和分享為主,如需轉(zhuǎn)載渤涌,請聯(lián)系本人,標明作者和出處绽昏,并且是非商業(yè)用途扬霜,謝謝!
命名實體識別系列
用CRF做命名實體識別(一)
用CRF做命名實體識別(二)
用BILSTM-CRF做命名實體識別
摘要
本文主要是對近期做的命名實體識別做一個總結(jié)而涉,會給出構(gòu)造一個特征的大概思路著瓶,以及對比所有構(gòu)造的特征對結(jié)構(gòu)的影響。先給出我最近做出來的特征對比:
特征 | F1值 | 精度 | 召回率 |
---|---|---|---|
字 | 0.8399 | 0.8472 | 0.8327 |
字+詞性+邊界 | 0.8711 | 0.8839 | 0.8589 |
字+詞性+邊界+實體指示詞 | 0.8856 | 0.9076 | 0.8649 |
字+詞性+邊界+特征詞 | 0.8847 | 0.8990 | 0.8709 |
字+詞性+邊界+實體指示詞 +特征詞 | 0.8853 | 0.8994 | 0.8718 |
字+詞性+邊界+常用詞 | 0.928 | 0.9382 | 0.9182 |
字+詞性+邊界+特征詞+常用詞 | 0.9293 | 0.9381 | 0.9207 |
字+詞性+邊界+實體指示詞+特征詞+常用詞 | 0.9261 | 0.9334 | 0.9191 |
目錄
- 整體操作流程
- 特征的構(gòu)造思路
- 用CRF++訓(xùn)練模型
- 用CRF++測試模型并計算F1值
正文
1.整體操作流程
- 構(gòu)造特征啼县,然后合并材原,格式要符合CRF++訓(xùn)練的格式
- 撰寫對應(yīng)的特征模板
- 用CRF++訓(xùn)練模型
- 用CRF++測試模型并計算F1值
2.特征的構(gòu)造思路
- 構(gòu)造詞性
用jieba標注分詞即可,直接調(diào)用jieba
2)構(gòu)造詞語邊界特征
邁 B
向 E
充 B
滿 M
希 M
望 E
的 W
新 B
世 M
紀 E
思路:
我們把句子先用jieba進行分詞季眷,然后遍歷所有的詞余蟹,用len函數(shù)判斷這個詞的長度,如果長度是1子刮,那么標記為W威酒,否則首部(word[0])標記為B,中間(word[1:-1])標記為M挺峡,尾部(word[-1])標記為E
- 構(gòu)造實體指示詞特征
首先肯定會問什么是實體指示詞呢葵孤?
在中文中,有些詞的出現(xiàn)通常標志著該詞周圍很可能出現(xiàn)相應(yīng)的命名實體橱赠,這樣的詞尤仍,我們稱之為命名實體指示詞。命名實體指示詞是文本中非常有意義的上下文信息狭姨,可以有效的幫助識別命名實體宰啦。通常可以分為人名指示詞饼拍、地名指示詞和組織名指示詞赡模。
比如:溫家寶總理主持了政府工作報告。這句話中“總理”這個詞很大程度上指示著人名實體溫家寶的出現(xiàn) 师抄。
我用人民日報標注語料提取了人名漓柑,地名,組織名指示詞司澎。先給大家看一下地名指示詞大概長什么樣子
['向/p',
'同胞/n',
'和/c',
'是/v',
'發(fā)展/vn',
'歷史/n',
'年/q',
'人民/n',
'建設(shè)/v',
'有/v',
'特色/n',
'社會主義/n',
'恢復(fù)/v',
'對/p',
'主權(quán)/n',
......]
建立一個實體指示詞表的思路:
(1)從人民日報標記語料庫中按順序讀取一個詞 欺缘;
(2)如果這個詞是一個標記了的命名實體則轉(zhuǎn)(3)栋豫,否則轉(zhuǎn)(1)挤安;
(3)讀取當前詞左邊的 2 個詞和右邊的 2 個詞,組成上下文詞匯集合word_text丧鸯,若當前詞左邊或者右邊的詞數(shù)少于 2 個蛤铜,則取盡可能多個;
(4)如果當前詞的標記為地名,則在備選地名指示詞集合 Indication_l 中查找 word_text中的詞围肥,如果找到了剿干,則相應(yīng)詞的頻度加 1;否則穆刻,將此詞加入到 Indication_l 集合 中置尔,該詞頻度設(shè)為 1;
(5)如果當前詞是語料中的最后一個詞氢伟,轉(zhuǎn)(6)榜轿,否則轉(zhuǎn)(1);
(6)統(tǒng)計備選備選地名指示詞集合 Indication_l中所有詞匯在單位語料中出現(xiàn)的頻度 f朵锣;
(7)如果頻度 f 小于閾值(我設(shè)置的是20) 谬盐,刪除該詞;
建立好實體指示詞表之后就該構(gòu)建實體指示詞這個特征了
a) 先對每句話進行jieba分詞诚些,注意是不帶標注的jieba分詞
b) 遍歷每個詞飞傀,判斷這個詞是否在我們的實體指示詞表里,在的話我們就做個標記是Y诬烹,不在的話就標記為N
c) 然后用len函數(shù)判斷這個詞的長度砸烦,依次寫入我們的標記即可
- 構(gòu)造特征詞
什么是特征詞呢?
比如人名都是以姓氏開頭的绞吁,所以它的特征詞就是姓氏外冀;組織名基本都是以特定的詞匯結(jié)尾,比如公司掀泳,學(xué)校雪隧,集團等等;地名都是以省员舵,市脑沿,國等特定的詞結(jié)尾。這些都是特征詞马僻。這些特征詞都可以從百度中查到庄拇,我們下載下來,這樣就有三個文件韭邓。
思路
關(guān)于姓氏這個特征詞的構(gòu)造比較簡單措近,因為它只有一個字,我們只需遍歷每個字女淑,然后判斷這個字是不是在我們的姓氏表里瞭郑,在的話標記為Y,不在的話標記為N鸭你。
中 N
共 N
中 N
央 N
總 N
書 N
記 N
屈张、 N
國 N
家 N
主 N
席 N
江 Y
澤 N
民 N
關(guān)于地名和組織名的特征詞構(gòu)造有點麻煩擒权,因為它是多個字。不過和上面構(gòu)建實體指示詞特征的思路一樣
a) 先對每句話進行jieba分詞阁谆,注意是不帶標注的jieba分詞
b) 遍歷每個詞碳抄,判斷這個詞是否在我們的特征詞表里,在的話我們就做個標記是Y场绿,不在的話就標記為N
c) 然后用len函數(shù)判斷這個詞的長度剖效,依次寫入我們的標記即可
5)構(gòu)造常用詞
什么是常用詞呢?
比如常見的人名王偉焰盗,張偉等贱鄙,常見的地名其實就是中國的所有地名,包括各種村什么的姨谷,還有常用的組織名逗宁,這些都可以從網(wǎng)上找到。這樣就可以得到三個文件梦湘。
比如組織名"中共中央"就被找到瞎颗,并標記為Y
中 Y
共 Y
中 Y
央 Y
總 N
書 N
記 N
、 N
國 N
家 N
主 N
席 N
江 N
澤 N
民 N
和上面構(gòu)建實體指示詞特征的思路一樣
a) 先對每句話進行jieba分詞捌议,注意是不帶標注的jieba分詞
b) 遍歷每個詞哼拔,判斷這個詞是否在我們的常用詞表里,在的話我們就做個標記是Y瓣颅,不在的話就標記為N
c) 然后用len函數(shù)判斷這個詞的長度倦逐,依次寫入我們的標記即可
6)構(gòu)造標簽
對文本進行jieba標注分詞后,我們會得到每個詞的詞性宫补,然后觀察發(fā)現(xiàn)檬姥,人名標注詞性為/nr,組織名是/nt,地名是/ns粉怕。這樣我們就可以遍歷所有的詞健民,先判斷詞性,再結(jié)合前面構(gòu)造邊界的方法便可以構(gòu)造了贫贝。
邁 O
向 O
充 O
滿 O
希 O
望 O
的 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
7)構(gòu)造好特征就是合并特征了秉犹,我用的是dataframe操作的
下面的特征順序依次是
(字+詞性+邊界+地方指示詞+組織名指示詞+人名指示詞+姓氏+地名特征詞+組織名特征詞+標簽)
邁 v B N N N N N N O
向 v E N N N N N N O
充 nz B N N N N N N O
滿 nz M N N N N N N O
希 nz M N N N N N N O
望 nz E N N N N N N O
的 uj W Y Y Y N N N O
新 nz B N N N N N N O
世 nz M N N N N N N O
紀 nz E N N N N N N O
— x W N N N N N N O
— x W N N N N N N O
一 m B N N N N N N B_TIME
九 m M N N N N N N M_TIME
九 m M N N N N N N M_TIME
八 m M N N N N N N M_TIME
年 m E N N N N N N E_TIME
新 t B Y N N N N N B_TIME
年 t E Y N N N N N E_TIME
講 n B N N Y N N N O
話 n E N N Y N N N O
( x W N N N N N N O
附 n B N N N N N N O
圖 n M N N N N N N O
片 n E N N N N N N O
1 m W Y N N N N N O
張 nr W N N N Y N N O
) x W N N N N N N O
合并好所有的特征之后這就是劃分我們的數(shù)據(jù)集了,為了計算F1值我們還要把它們劃分為訓(xùn)練集(70%)和測試集(30%)稚晚。
3.特征模板
比如下面的特征模板就是針對
(字+詞性+邊界+地方指示詞+組織名指示詞+人名指示詞+姓氏+地名特征詞+組織名特征詞)這幾個特征寫的
# Unigram
U00:%x[-2,0]
U01:%x[-1,0]
U02:%x[0,0]
U03:%x[1,0]
U04:%x[2,0]
U05:%x[-2,1]
U06:%x[-1,1]
U07:%x[0,1]
U08:%x[1,1]
U09:%x[2,1]
U10:%x[0,0]/%x[0,1]
U11:%x[0,0]/%x[1,0]
U12:%x[0,0]/%x[-1,0]
U13:%x[-1,0]/%x[0,1]
U14:%x[0,0]/%x[1,1]
U15:%x[-1,0]/%x[-1,1]
U16:%x[-1,0]/%x[-2,0]
U17:%x[-2,0]/%x[-2,1]
U18:%x[1,0]/%x[2,0]
U19:%x[-1,1]/%x[1,0]
U20:%x[0,1]/%x[1,0]
U21:%x[-2,1]/%x[-1,1]
U22:%x[0,1]/%x[-2,1]
U23:%x[-1,1]/%x[0,1]
U24:%x[-1,1]/%x[1,1]
U25:%x[0,1]/%x[1,1]
U26:%x[0,1]/%x[2,1]
U27:%x[1,1]/%x[2,1]
U28:%x[-1,2]
U29:%x[-2,2]
U30:%x[-1,2]/%x[-2,2]
U31:%x[0,1]/%x[-1,2]
U32:%x[0,1]/%x[-2,2]
U33:%x[0,1]/%x[1,2]
U34:%x[0,0]/%x[-1,2]
U35:%x[0,0]/%x[-2,2]
U36:%x[0,0]/%x[1,2]
U37:%x[0,1]/%x[-1,2]/%x[-2,2]
U38:%x[-1,2]/%x[0,1]/%x[1,1]
U39:%x[-1,2]/%x[-1,1]/%x[0,1]
U40:%x[-1,2]/%x[0,1]/%x[0,0]
U41:%x[-2,2]/%x[-1,2]/%x[0,1]
U42:%x[-2,3]/%x[-1,3]/%x[1,3]/%x[2,3]
U43:%x[-2,4]/%x[-1,4]/%x[1,4]/%x[2,4]
U44:%x[-2,5]/%x[-1,5]/%x[1,5]/%x[2,5]
U45:%x[0,6]
U46:%x[0,7]
U47:%x[0,8]
U48:%x[1,8]
U49:%x[2,8]
U50:%x[-2,5]/%x[-1,5]/%x[0,6]/%x[1,5]/%x[2,5]
U51:%x[-2,3]/%x[-1,3]/%x[0,7]
U52:%x[-2,4]/%x[-1,4]/%x[0,8]
# Bigram
B
寫特征模板首先是要把所有的特征都要羅列進去崇堵,然后特征模板里面比如說
“U50:%x[-2,5]/%x[-1,5]/%x[0,6]/%x[1,5]%x[2,5]”這句話的意思就是
當前字是否為姓氏,且它的左邊和右邊兩個字是否為人名指示詞
%x[-1,5]里面表示[-1行客燕,5列]鸳劳。0代表的是當前這個字,那么-1不就是代表前一個字么幸逆,而那個第五列指的就是第五個特征(注意我構(gòu)造的特征的順序棍辕,前面有說到)暮现,也就是對應(yīng)的人名指示詞這個特征了
4.用CRF++訓(xùn)練模型
具體操作就看我的簡書里關(guān)于CRF++訓(xùn)練的操作还绘,那里有詳細的介紹楚昭。
5.用CRF++測試模型并計算F1值
調(diào)用sklearn庫即可,非常簡單
很重要的一點計算F1值一定記住把預(yù)測值和真實值都是O的全部刪掉拍顷。比如說下面抚太,倒數(shù)第二列是真實值,最后一列是預(yù)測值昔案。為什么要刪掉兩列都是O的呢尿贫?因為整個數(shù)據(jù)集這樣的太多了,會導(dǎo)致F1值偏高踏揣,我之前就把這部分算進去了庆亡,結(jié)果F1值為0.98,還沾沾自喜捞稿,以為自己好厲害
談 v B N N N N N N O O
到 v E N N N N N N O O
亞 ns B N N N N N N B_LOCATION B_LOCATION
洲 ns E N N N N N N E_LOCATION E_LOCATION
金 n B Y N N Y N N O O
融 n E Y N N N N N O O
風 n B N N N N N N O O
波 n E N N N N N N O O
, x W N N N N N N O O
董 nr B N N N Y N N B_PERSON B_PERSON
建 nr M N N N N N N M_PERSON M_PERSON
華 nr E N N N N N N E_PERSON E_PERSON
說 v W Y Y Y N N N O O
: x W N N N N N N O O
“ x W N N N N N N O O
香 ns B N N N N N N B_LOCATION B_LOCATION
港 ns E N N N N N N E_LOCATION E_LOCATION
將 d W Y Y Y N N N O O
堅 i B N N N N N N O O
定 i M N N N N N N O O
不 i M N N N N N N O O
移 i E N N N N N N O O
地 uv W Y N Y N N N O O
6.展望
用CRF做命名實體識別基本就做到這里了又谋,我們發(fā)現(xiàn)(字+詞性+邊界+特征詞+常用詞)這幾個特征可以達到比較好的效果,F(xiàn)1值為0.9293娱局。再加入特征效果就會下降了彰亥,而且訓(xùn)練時間也會加長。后面打算用神經(jīng)網(wǎng)絡(luò)來做命名實體識別衰齐,目前主流方法是BILSTM-CRF任斋,據(jù)說效果是很好的,網(wǎng)上有可以直接用的代碼耻涛,回來操作一下废酷。希望這篇博文會對大家有所幫助,至少可以幫大家入門命名實體識別抹缕。
以下是我所有文章的目錄锦积,大家如果感興趣,也可以前往查看
??戳右邊:打開它歉嗓,也許會看到很多對你有幫助的文章