用隐马尔可夫模型(HMM)做命名实体识别——NER系列(二)
上一篇文章里《用規(guī)則做命名實(shí)體識(shí)別——NER系列(一)》,介紹了最簡(jiǎn)單的做命名實(shí)體識(shí)別的方法–規(guī)則。這一篇,我們循序漸進(jìn),繼續(xù)介紹下一個(gè)模型——隱馬爾可夫模型。
隱馬爾可夫模型,看上去,和序列標(biāo)注問題是天然適配的,所以自然而然的,早期很多做命名實(shí)體識(shí)別和詞性標(biāo)注的算法,都采用了這個(gè)模型。
這篇文章我將基于碼農(nóng)場(chǎng)的這篇文章《層疊HMM-Viterbi角色標(biāo)注模型下的機(jī)構(gòu)名識(shí)別》,來做解讀。但原文中的這個(gè)算法實(shí)現(xiàn)是融入在HanLP里面的。不過他也有相應(yīng)的訓(xùn)練詞典,所以我在這篇文章里面也給出一個(gè)python實(shí)現(xiàn),做一個(gè)簡(jiǎn)單的單層HMM模型,來識(shí)別機(jī)構(gòu)名。
代碼地址:https://github.com/lipengfei-558/hmm_ner_organization
1.隱馬爾可夫模型(HMM)
隱馬爾可夫模型(Hidden Markov Model,HMM),是一個(gè)統(tǒng)計(jì)模型。
關(guān)于這個(gè)模型,這里有一系列很好的介紹文章:http://www.52nlp.cn/category/hidden-markov-model
隱馬爾可夫模型有三種應(yīng)用場(chǎng)景,我們做命名實(shí)體識(shí)別只用到其中的一種——求觀察序列的背后最可能的標(biāo)注序列。
即根據(jù)輸入的一系列單詞,去生成其背后的標(biāo)注,從而得到實(shí)體。
2.在序列標(biāo)注中應(yīng)用隱馬爾可夫模型
HMM中,有5個(gè)基本元素:{N,M,A,B,π},我結(jié)合序列標(biāo)志任務(wù)對(duì)這5個(gè)基本元素做一個(gè)介紹:
- N:狀態(tài)的有限集合。在這里,是指每一個(gè)詞語背后的標(biāo)注。
- M:觀察值的有限集合。在這里,是指每一個(gè)詞語本身。
- A:狀態(tài)轉(zhuǎn)移概率矩陣。在這里,是指某一個(gè)標(biāo)注轉(zhuǎn)移到下一個(gè)標(biāo)注的概率。
- B:觀測(cè)概率矩陣,也就是發(fā)射概率矩陣。在這里,是指在某個(gè)標(biāo)注下,生成某個(gè)詞的概率。
- π:初始概率矩陣。在這里,是指每一個(gè)標(biāo)注的初始化概率。
而以上的這些元素,都是可以從訓(xùn)練語料集中統(tǒng)計(jì)出來的。最后,我們根據(jù)這些統(tǒng)計(jì)值,應(yīng)用維特比(viterbi)算法,就可以算出詞語序列背后的標(biāo)注序列了。
命名實(shí)體識(shí)別本質(zhì)上就是序列標(biāo)注,只需要自己定義好對(duì)應(yīng)的標(biāo)簽以及模式串,就可以從標(biāo)注序列中提取出實(shí)體塊了。
3.實(shí)戰(zhàn):用HMM實(shí)現(xiàn)中文地名識(shí)別
3.1 參考論文以及網(wǎng)站
- 張華平, 劉群. 基于角色標(biāo)注的中國(guó)人名自動(dòng)識(shí)別研究[J]. 計(jì)算機(jī)學(xué)報(bào), 2004, 27(1):85-91.
- 俞鴻魁, 張華平, 劉群. 基于角色標(biāo)注的中文機(jī)構(gòu)名識(shí)別[C]// Advances in Computation of Oriental Languages–Proceedings of the, International Conference on Computer Processing of Oriental Languages. 2003.
- 俞鴻魁, 張華平, 劉群,等. 基于層疊隱馬爾可夫模型的中文命名實(shí)體識(shí)別[J]. 通信學(xué)報(bào), 2006, 27(2):87-94.
-
碼農(nóng)場(chǎng):層疊HMM-Viterbi角色標(biāo)注模型下的機(jī)構(gòu)名識(shí)別
3.2 任務(wù)
命名實(shí)體識(shí)別之中文機(jī)構(gòu)名的識(shí)別。
3.3 語料
HanLP(https://github.com/hankcs/HanLP/releases)提供的語料:
我用的是data-for-1.3.3.zip,百度網(wǎng)盤下載地址:
https://pan.baidu.com/s/1o8Rri0y
下載后解壓,我們要用的語料路徑如下:
\data-for-1.3.3\data\dictionary\organization
其中,里面有兩個(gè)我們要用到的語料文件,nt.txt和nt.tr.txt。這兩個(gè)文件的數(shù)據(jù)統(tǒng)計(jì)自人民日?qǐng)?bào)語料庫。
① nt.txt:
詞語標(biāo)注統(tǒng)計(jì)詞典,比如里面有一行是這樣的:
會(huì)議 B 163 C 107 A 10
意思是,會(huì)議這個(gè)詞作為B標(biāo)簽出現(xiàn)了163次,作為C標(biāo)簽出現(xiàn)了107次,作為A標(biāo)簽出現(xiàn)了10次.
② nt.tr.txt:
標(biāo)簽轉(zhuǎn)移矩陣。如下圖:
即,每一個(gè)標(biāo)簽轉(zhuǎn)移到另一個(gè)標(biāo)簽的次數(shù)。比如第二行第四列的19945,代表著【A標(biāo)簽后面接著是C標(biāo)簽】出現(xiàn)了19945次。
以上語料我都提取出來放到代碼目錄的./data下了。
3.4 代碼實(shí)現(xiàn)
代碼的思路很直觀,只要按照上面第2部分所說的,準(zhǔn)備好5元組數(shù)據(jù),然后用viterbi算法解碼即可。
3.4.1?N:狀態(tài)的有限集合
在機(jī)構(gòu)名識(shí)別的這個(gè)任務(wù)中,論文《基于角色標(biāo)注的中文機(jī)構(gòu)名識(shí)別》把狀態(tài)(角色)定義為以下集合:
然而在HanLP的語料中,只有以下的標(biāo)簽,有多出來的,又不一樣的:
A,B,C,D,F,G,I,J,K,L,M,P,S,W,X,Z
經(jīng)過我的整理,完整的狀態(tài)(角色)集合如下:
| 角色 | 意義 | 例子 |
| A | 上文 | 參與亞太經(jīng)合組織的活動(dòng) |
| B | 下文 | 中央電視臺(tái)報(bào)道 |
| X | 連接詞 | 北京電視臺(tái)和天津電視臺(tái) |
| C | 特征詞的一般性前綴 | 北京電影學(xué)院 |
| F | 特征詞的人名前綴 | 何鏡堂紀(jì)念館 |
| G | 特征詞的地名性前綴 | 交通銀行北京分行 |
| K | 特征詞的機(jī)構(gòu)名、品牌名前綴 | 中共中央顧問委員會(huì) ? ? 美國(guó)摩托羅拉公司 |
| I | 特征詞的特殊性前綴 | 中央電視臺(tái) ? ? 中海油集團(tuán) |
| J | 特征詞的簡(jiǎn)稱性前綴 | 巴政府 |
| D | 機(jī)構(gòu)名的特征詞 | 國(guó)務(wù)院僑務(wù)辦公室 |
| Z | 非機(jī)構(gòu)成分 | ? |
| L | 方位詞 | 上游 ? ? 東 |
| M | 數(shù)量詞 | 36 |
| P | 數(shù)量+單位(名詞) | 三維 ? ? 兩國(guó) |
| W | 特殊符號(hào),如括號(hào),中括號(hào) | () ? ? 【】 |
| S | 開始標(biāo)志 | 始##始 |
本程序以上面我整理的這個(gè)表格的狀態(tài)角色為準(zhǔn)(因?yàn)镠anLP的語料詞典里面就是這樣定義的)。
3.4.2 M:觀察值的有限集合
在這里,觀察值就是我們看到的每個(gè)詞。
不過有一個(gè)地方要注意一下,在語料詞典nt.txt中,除了所有詞語之外,還有下面8個(gè)特殊詞語:
- 始##始
- 末##末
- 未##串
- 未##人
- 未##團(tuán)
- 未##地
- 未##數(shù)
- 未##時(shí)
這些詞語可以在層疊HMM中發(fā)揮作用,加進(jìn)去可以提高識(shí)別精度,因?yàn)楹芏鄼C(jī)構(gòu)名里面都有人名和地名。
在使用我的這份代碼之前,你可以用分詞工具先識(shí)別出相關(guān)的詞性,然后將對(duì)應(yīng)命中的詞語替換為上面的8個(gè)特殊詞語,再調(diào)用函數(shù),精確率會(huì)大大提高。
3.4.3 A:狀態(tài)轉(zhuǎn)移概率矩陣
在這里,它是指某一個(gè)標(biāo)注轉(zhuǎn)移到下一個(gè)標(biāo)注的概率。
generate_data.py的generate_transition_probability()函數(shù)就是干這事的,它會(huì)生成一個(gè)transition_probability.txt,即轉(zhuǎn)移概率矩陣。
3.4.4 B:觀測(cè)概率矩陣(發(fā)射概率矩陣)
在這里,他是指在某個(gè)標(biāo)注下,生成某個(gè)詞的概率。
generate_data.py的generate_emit_probability()函數(shù)就是干這事的,它會(huì)生成一個(gè)emit_probability.txt,即觀測(cè)概率矩陣(發(fā)射概率矩陣)。
3.4.5 π:初始概率矩陣
在這里,它是指每一個(gè)標(biāo)注的初始化概率。
generate_data.py的genertate_initial_vector()函數(shù)就是干這事的,它會(huì)生成一個(gè)initial_vector.txt,即初始概率矩陣。
3.4.6 維特比(viterbi)算法解碼
這部分代碼是參考《統(tǒng)計(jì)方法》里面的實(shí)現(xiàn)寫的,做了些調(diào)整,使之可以適用于這個(gè)機(jī)構(gòu)名識(shí)別的任務(wù)。函數(shù)為viterbi() ,位于OrgRecognize.py里面。
使用這個(gè)函數(shù),就能獲得最佳標(biāo)注序列。
3.4.7 匹配標(biāo)注序列,得到機(jī)構(gòu)名
在3.4.6里面,我們可以得到一個(gè)標(biāo)注序列,哪些標(biāo)注代表著實(shí)體呢?
HanLP作者整理了一個(gè)nt.pattern.txt(我也放置在./data/nt.pattern.txt下了),里面是所有可能是機(jī)構(gòu)名的序列模式串(有點(diǎn)粗暴,哈哈),然后用Aho-Corasick算法來進(jìn)行匹配。
為了簡(jiǎn)單起見突出重點(diǎn),我的代碼實(shí)現(xiàn)里,用的是循環(huán)遍歷匹配,具體的實(shí)現(xiàn)在OrgRecognize.py里面的get_organization,函數(shù)的作用是,輸入原詞語序列、識(shí)別出來的標(biāo)注序列和序列模式串,輸出識(shí)別出來的機(jī)構(gòu)名實(shí)體。
3.4.8 使用程序
代碼地址:https://github.com/lipengfei-558/hmm_ner_organization
環(huán)境以及依賴:
- python2.7
- jieba分詞(可選)
首先,運(yùn)行以下腳本,生成transition_probability.txt,emit_probability.txt以及initial_vector.txt:
| 1 | python generate_data.py |
然后,運(yùn)行
| 1 | python OrgRecognize.py |
就可以了,不出意外,“中海油集團(tuán)在哪里”這句話,會(huì)識(shí)別出“中海油集團(tuán)”這個(gè)機(jī)構(gòu)實(shí)體。
具體輸入的句子邏輯,可以在main函數(shù)里面靈活修改,也可以結(jié)合jieba一起用。另外,python2.7的中文編碼問題要注意了,如果你的輸出序列很奇怪,很有可能是編碼問題。
4.總結(jié)、待改進(jìn)
用HMM來實(shí)現(xiàn)的命名實(shí)體識(shí)別算法,關(guān)鍵在于標(biāo)簽的自定義,你需要人工定義盡可能多的標(biāo)簽,然后在訓(xùn)練語料集里面自動(dòng)標(biāo)注這些標(biāo)簽,這也是最麻煩的地方。標(biāo)注完語料集,生成HMM中的轉(zhuǎn)移概率、初始概率、發(fā)射概率就很簡(jiǎn)單了,就是純粹的統(tǒng)計(jì)。
整個(gè)模型也沒什么參數(shù),用這些統(tǒng)計(jì)的數(shù)字即可計(jì)算。
算法可能可以改進(jìn)的點(diǎn)如下:
HMM算法默認(rèn)只考慮前一個(gè)狀態(tài)(詞)的影響,忽略了更多上下文信息(特征)。后來的MEMM、CRF,都是循序漸進(jìn)的改進(jìn)方法。傳統(tǒng)機(jī)器學(xué)習(xí)方法里面,CRF是主流,下一篇我會(huì)繼續(xù)介紹CRF在命名實(shí)體識(shí)別任務(wù)上的應(yīng)用。
代碼和語料:
https://www.lookfor404.com/命名實(shí)體識(shí)別的語料和代碼/
https://www.lookfor404.com/%e7%94%a8%e9%9a%90%e9%a9%ac%e5%b0%94%e5%8f%af%e5%a4%ab%e6%a8%a1%e5%9e%8bhmm%e5%81%9a%e5%91%bd%e5%90%8d%e5%ae%9e%e4%bd%93%e8%af%86%e5%88%ab-ner%e7%b3%bb%e5%88%97%e4%ba%8c/
總結(jié)
以上是生活随笔為你收集整理的用隐马尔可夫模型(HMM)做命名实体识别——NER系列(二)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Java基础知识融合(Arraylist
- 下一篇: 用CRF做命名实体识别——NER系列(三