hanlp自然語言處理包的人名識別程式碼解析

adnb34g發表於2019-08-02


HanLP發射矩陣詞典nr.txt中收錄單字姓氏393個。袁義達在《中國的三大姓氏是如何統計出來的》文獻中指出:當代中國100個常見姓氏中,集中了全國人口的87%,根據這一資料我們只保留nr.txt中的100個常見詞語的姓氏角色,其他詞語去掉其姓氏角色狀態。過濾後,nr.txt中具有姓氏角色的單字共計97個。列於下表:

 

實驗效果

姓氏過濾前,各命名實體識別準確率

nr 33%

ns 83%

nt 43%

姓氏過濾後,各命名實體識別準確率

nr 36%

ns 83%

nt 81%

這裡沒有開層疊隱馬預測機構名和地名, nt上升原因估計是由於很多不是人名的詞語沒被標為人名,那麼nt的模式匹配規則匹配不上了,所以機構名準確率上來了。錯誤識別的人名,100個常用姓氏的不多,很多恐怕是HanLP裡其他詞表干預進來的。

隱馬一般用於分詞和詞性標註是比較好的,為什麼通常的序列標註方法也就是 BIEO方法直接用到實體識別不合適呢。用詞性標註為例,每一個詞它所對應的詞性標記子集是有限的,而這個子集相對於詞性標記全集來說是小的。但是到了實體識別則不一定,拿人名來說,除了姓氏以外,名字詞語部分可以填充的詞語是任意的,也就是說任何詞語都有可能出現在中間位置,此時發射矩陣中的某些詞實際上就沒有太大意義了,因為它可能等可能的由BIEO標記發出,而如果指利用四種標記之間的轉移機率資訊來確定最優的標記序列勢必就影響效果。因此,我們透過引入角色標記,實際上這就引入了先驗知識,比如某些字只能由姓氏標記產生,某些字一般情況都充當名字首字,某些字一般情況都充當名字末字,透過給這些不同情況下的字集按照其出現的位置的分佈和其語法意義做角色定義,可以縮小每種角色標記可發出的詞語集合,也就是每種詞語(字)所對應的標記集的大小,相當於使發射機率分佈不是均勻分佈,那麼預測的準確性肯定就得到提高了。

下邊介紹一下 HanLP人名識別的主要流程

1. 使用使用匹配法求出各種分詞路徑用變數 wordNetAll儲存

2. viterbi方法找到一條最優的分詞路徑,這裡主要使用使用者自定義詞典以及核心詞典,用序列變數vertexList儲存。

3. 角色觀察,也就是根據發射機率矩陣列出 vertexList中每個詞語可能對應的角色標記。roleObserve(...)方法實現。

4. 角色標註,利用 viterbi方法求出最優角色標記序列。viterbiComputeSimply(...)方法實現。

5. 對角色序列進行模式匹配得到人名。模式匹配定義在 NRPattern類中。

 

在精度要求比較高且時間緊的情況下,最好的提高準確率的方法為,只保留常用姓氏,只保留最可能的 2gram角色標記模式。在做人名識別時還有一個注意的點,如果你的預測語料和訓練語料完全在文體上差別很大,或者說你就是在公開的訓練語料上訓練而不在預測語料上訓練的話,基本上上下文資訊是沒有用處的,甚至有可能上下文資訊會給實體邊界標註帶來干擾,我想任何機器學習包括深度學習,不管是文字分類領域還是實體識別領域都會有這種泛化能力的問題,這種問題恐怕透過演算法是沒法解決的,如果可以解決那麼任何語種任何領域都可以使用一種模型,一勞永逸了。

 


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31524777/viewspace-2652539/,如需轉載,請註明出處,否則將追究法律責任。

相關文章