這幾天寫完了人名識別模塊,與分詞放到一塊兒造成了兩層隱馬模型。雖然在算法或模型上沒有什麼新意,可是勝在訓練語料比較新,對質量把關比較嚴,實測效果很滿意。好比這句真實的新聞「簽約儀式前,秦光榮、李紀恆、仇和等一同會見了參加簽約的企業家。」,分詞結果:[簽約/v, 儀式/n, 前/f, ,/w, 秦光榮/nr, 、/w, 李紀恆/nr, 、/w, 仇和/nr, 等/u, 一同/d, 會見/v, 了/ul, 參加/v, 簽約/v, 的/uj, 企業家/n, 。/w],三我的名「秦光榮」「李紀恆」「仇和」一個不漏。一些比較變態的例子也能從容應對,好比下面:git
這是hankcs將本身的分詞與ansj做比較得出的結果,因爲本身能夠隨時調整算法,因此主場佔了很大便宜。可是第一句絕對沒有放水,說實話能識別出「仇和」這麼冷僻的名字着實讓人驚喜了一下。github
開源項目算法
本文代碼已集成到HanLP中開源:https://github.com/hankcs/HanLP 安全
原理spa
推薦仔細閱讀《基於角色標註的中國人名自動識別研究.doc》這篇論文,該論文詳細地描述了算法原理和實現。從語料庫的整理、標註到最後的模式匹配都講得清清楚楚。hankcs在這篇論文的基礎上作了改進,主要步驟總結以下:3d
一、對熟語料庫自動標註,將原來的標註轉化爲角色標註。角色標註一共有以下幾種:blog
hankcs在此基礎上拓展了一個S,表明句子的開始。get
二、統計標籤的出現頻次,標籤的轉移矩陣。博客
三、對粗分結果角色標註,模式匹配。it
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詞典裏面加一條「中秋@安全」。這反映了這種方法的侷限性,另外一方面也說明詞典的重要性。
文章轉載自hankcs的博客!