【命名實體識別】HMM-Viterbi角色標註中國人名識別
這幾天寫完了人名識別模組,與分詞放到一起形成了兩層隱馬模型。雖然在演算法或模型上沒有什麼新意,但是勝在訓練語料比較新,對質量把關比較嚴,實測效果很滿意。比如這句真實的新聞“簽約儀式前,秦光榮、李紀恆、仇和等一同會見了參加簽約的企業家。”,分詞結果:[簽約/v, 儀式/n, 前/f, ,/w, 秦光榮/nr, 、/w, 李紀恆/nr, 、/w, 仇和/nr, 等/u, 一同/d, 會見/v, 了/ul, 參加/v, 簽約/v, 的/uj, 企業家/n, 。/w],三個人名“秦光榮”“李紀恆”“仇和”一個不漏。一些比較變態的例子也能從容應對,比如下面:
原始句子 | HanLP | ansj分詞 |
簽約儀式前,秦光榮、李紀恆、仇和等一同會見了參加簽約的企業家。 |
[簽約/v, 儀式/n, 前/f, ,/w, 秦光榮/nr, 、/w, 李紀恆/nr, 、/w, 仇和/nr, 等/u, 一同/d, 會見/v, 了/ul, 參加/v, 簽約/v, 的/uj, 企業家/n, 。/w] | [簽約/v, 儀式/n, 前/f, ,/w, 秦/nr, 光榮/a, 、/w, 李紀恆/nr, 、/w, 仇/nr, 和/c, 等/u, 一同/d, 會見/v, 了/ul, 參加/v, 簽約/v, 的/uj, 企業家/n, 。/w] |
王國強、高峰、汪洋、張朝陽、韓寒、小四 | [王國強/nr, 、/w, 高峰/n, 、/w, 汪洋/n, 、/w, 張朝陽/nr, 、/w, 韓寒/nr, 、/w, 小/a, 四/m] | [王國/n, 強/a, 、/w, 高峰/n, 、/w, 汪洋/n, 、/w, 張/q, 朝陽/ns, 、/w, 韓寒/nr, 、/w, 小/a, 四/m] |
張浩和胡健康復員了 | [張浩/nr, 和/c, 胡健康/nr, 復員/vn, 了/ul] | [張浩/nr, 和/c, 胡/nr, 健康/a, 復員/vn, 了/ul] |
王總和小麗結婚了 | [王總/nr, 和/c, 小麗/nr, 結婚/v, 了/ul] | [王/nr, 總和/n, 小麗/nr, 結婚/v, 了/ul] |
編劇邵鈞林和稽道青說 | [編劇/n, 邵鈞林/nr, 和/c, 稽道青/nr, 說/v] | [編劇/n, 邵鈞林/nr, 和/c, 稽/nr, 道青/nr, 說/v] |
這裡有關天培的壯烈 | [這裡/r, 有/v, 關天培/nr, 的/uj, 壯烈/a] | [這裡/r, 有關/vn, 天培/nr, 的/uj, 壯烈/a] |
龔學平等領導,鄧穎超生前 | [龔學平/nr, 等/u, 領導/n, ,/w, 鄧穎超/nr, 生前/t] |
[龔學平/nr, 等/nw, 領導/n, ,, 鄧穎超/nr, 生前/t] |
這是我將自己的分詞與ansj作比較得出的結果,由於自己可以隨時調整演算法,所以主場佔了很大便宜。但是第一句絕對沒有放水,說實話能識別出“仇和”這麼冷僻的名字著實讓我驚喜了一下。
開源專案
原理
推薦仔細閱讀《基於角色標註的中國人名自動識別研究》這篇論文,該論文詳細地描述了演算法原理和實現。從語料庫的整理、標註到最後的模式匹配都講得清清楚楚。我在這篇論文的基礎上做了改進,主要步驟我總結如下:
1、對語料庫自動標註,將原來的標註轉化為角色標註。角色標註一共有如下幾種:
編碼 |
程式碼 |
意義 |
例子 |
B |
Pf |
姓氏 |
張華平先生 |
C |
Pm |
雙名的首字 |
張華平先生 |
D |
Pt |
雙名的末字 |
張華平先生 |
E |
Ps |
單名 |
張浩說:“我是一個好人” |
F |
Ppf |
字首 |
老劉、小李 |
G |
Plf |
字尾 |
王總、劉老、肖氏、吳媽、葉帥 |
K |
Pp |
人名的上文 |
又來到於洪洋的家。 |
L |
Pn |
人名的下文 |
新華社記者黃文攝 |
M |
Ppn |
兩個中國人名之間的成分 |
編劇邵鈞林和稽道青說 |
U |
Ppf |
人名的上文和姓成詞 |
這裡有關天培的壯烈 |
V |
Pnw |
人名的末字和下文成詞 |
龔學平等領導, 鄧穎超生前 |
X |
Pfm |
姓與雙名的首字成詞 |
王國維、 |
Y |
Pfs |
姓與單名成詞 |
高峰、汪洋 |
Z |
Pmt |
雙名本身成詞 |
張朝陽 |
A |
Po |
以上之外其他的角色 |
表1 中國人名的構成角色表
我在此基礎上拓展了一個S,代表句子的開始。
2、統計標籤的出現頻次,標籤的轉移矩陣。
3、對粗分結果角色標註,模式匹配。
我對論文中的幾個模式串做了拓充,並且採用了AC模式匹配演算法。
體會
論文中將三字名稱拆分為BCD,我實測在2-gram模型下,C很容易被識別為E,導致人名缺一半。
人民日報2014中的人名並不能覆蓋所有常用字,所以我去別的地方找了個人名庫,拆成BCD或BE補充了進去。
人民日報2014語料庫中有很多錯誤,比如
去/vf 年老/vi 張中秋/nr 去/vf “/w 泡茶/vi ”/w ,/w 送禮/vi 遭到/v 了/ule 拒絕/v ,/w 老張/nz 擔心/v 金額/n 不夠/a
中秋很明顯不是人名的組成部分,這個必須手工剔除。
“中秋安全”會識別出“中 秋安全”來,因為2-gram詞典中沒有“中秋@安全”這種接續,而有“中@未##人”這種接續。初步的解決方法是手工往2-gram詞典裡面加一條“中秋@安全”。這反映了這種方法的侷限性,另一方面也說明詞典的重要性。
轉載自:http://www.hankcs.com/nlp/chinese-name-recognition-in-actual-hmm-viterbi-role-labeling.html