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角色標記模式。在作人名識別時還有一個注意的點,若是你的預測語料和訓練語料徹底在文體上差異很大,或者說你就是在公開的訓練語料上訓練而不在預測語料上訓練的話,基本上上下文信息是沒有用處的,甚至有可能上下文信息會給實體邊界標註帶來干擾,我想任何機器學習包括深度學習,不論是文本分類領域仍是實體識別領域都會有這種泛化能力的問題,這種問題恐怕經過算法是無法解決的,若是能夠解決那麼任何語種任何領域均可以使用一種模型,一勞永逸了。ide