1. 程式人生 > >【命名實體識別】HMM-Viterbi角色標註中國人名識別

【命名實體識別】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