Hanlp實戰HMM-Viterbi角色標註中國人名識別

adnb34g發表於2018-10-22


這幾天寫完了人名識別模組,與分詞放到一起形成了兩層隱馬模型。雖然在演算法或模型上沒有什麼新意,但是勝在訓練語料比較新,對質量把關比較嚴,實測效果很滿意。比如這句真實的新聞 “簽約儀式前,秦光榮、李紀恆、仇和等一同會見了參加簽約的企業家。”,分詞結果: [ 簽約 /v, 儀式 /n, /f, /w, 秦光榮 /nr, /w, 李紀恆 /nr, /w, 仇和 /nr, /u, 一同 /d, 會見 /v, /ul, 參加 /v, 簽約 /v, /uj, 企業家 /n, /w] ,三個人名“秦光榮”“李紀恆”“仇和”一個不漏。一些比較變態的例子也能從容應對,比如下面:

 

這是 hankcs 將自己的分詞與 ansj 作比較得出的結果,由於自己可以隨時調整演算法,所以主場佔了很大便宜。但是第一句絕對沒有放水,說實話能識別出“仇和”這麼冷僻的名字著實讓 驚喜了一下。

 

開源專案

本文程式碼已整合到 HanLP 中開源:  

原理

推薦仔細閱讀《基於角色標註的中國人名自動識別研究 .doc 》這篇論文,該論文詳細地描述了演算法原理和實現。從語料庫的整理、標註到最後的模式匹配都講得清清楚楚。 hankcs 在這篇論文的基礎上做了改進,主要步驟總結如下:

1 對熟語料庫自動標註,將原來的標註轉化為角色標註。角色標註一共有如下幾種:

 

hankcs 在此基礎上擴充了一個 S ,代表句子的開始。

2 、統計標籤的出現頻次,標籤的轉移矩陣。

3 、對粗分結果角色標註,模式匹配。

hankcs 對論文中的幾個模式串做了拓充,並且採用了 AC 模式匹配演算法。

體會

論文中將三字名稱拆分為 BCD ,實測在 2-gram 模型下, C 很容易被識別為 E ,導致人名缺一半。

人民日報 2014 中的人名並不能覆蓋所有常用字,所以 hankcs 去別的地方找了個人名庫,拆成 BCD BE 補充了進去。

人民日報 2014 語料庫中有很多錯誤,比如

/vf 年老 /vi 張中秋 /nr /vf /w 泡茶 /vi /w /w 送禮 /vi 遭到 /v /ule 拒絕 /v /w 老張 /nz 擔心 /v 金額 /n 不夠 /a

中秋很明顯不是人名的組成部分,這個必須手工剔除。

“中秋安全”會識別出“中 秋安全”來,因為 2-gram 詞典中沒有“中秋 @ 安全”這種接續,而有“中 @ ## 人”這種接續。初步的解決方法是手工往 2-gram 詞典裡面加一條“中秋 @ 安全”。這反映了這種方法的侷限性,另一方面也說明詞典的重要性。

 


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

相關文章