hanlp自然語言處理包的人名識別程式碼解析
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角色標記模式。在做人名識別時還有一個注意的點,如果你的預測語料和訓練語料完全在文體上差別很大,或者說你就是在公開的訓練語料上訓練而不在預測語料上訓練的話,基本上上下文資訊是沒有用處的,甚至有可能上下文資訊會給實體邊界標註帶來干擾,我想任何機器學習包括深度學習,不管是文字分類領域還是實體識別領域都會有這種泛化能力的問題,這種問題恐怕透過演算法是沒法解決的,如果可以解決那麼任何語種任何領域都可以使用一種模型,一勞永逸了。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31524777/viewspace-2652539/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- hanlp自然語言處理包的基本使用--pythonHanLP自然語言處理Python
- 如何編譯執行HanLP自然語言處理包編譯HanLP自然語言處理
- HanLP 自然語言處理 for nodejsHanLP自然語言處理NodeJS
- 配置Hanlp自然語言處理進階HanLP自然語言處理
- 自然語言處理工具包HanLP的Python介面自然語言處理HanLPPython
- 自然語言處理工具python呼叫hanlp中文實體識別自然語言處理PythonHanLP
- Pyhanlp自然語言處理中的新詞識別HanLP自然語言處理
- Hanlp自然語言處理中的詞典格式說明HanLP自然語言處理
- NLP自然語言處理中的hanlp分詞例項自然語言處理HanLP分詞
- 自然語言處理工具HanLP-基於層疊HMM地名識別自然語言處理HanLPHMM地名識別
- HanLP中人名識別分析詳解HanLP
- 自然語言處理之:搭建基於HanLP的開發環境自然語言處理HanLP開發環境
- Hanlp自然語言處理工具的使用演練HanLP自然語言處理
- 深度解析自然語言處理之篇章分析自然語言處理
- HanLP中的人名識別分析詳解HanLP
- 自然語言處理工具包 HanLP在 Spring Boot中的應用自然語言處理HanLPSpring Boot
- 自然語言處理(NLP)自然語言處理
- Spring Boot中對自然語言處理工具包hanlp的呼叫詳解Spring Boot自然語言處理HanLP
- 自然語言處理(NLP)系列(一)——自然語言理解(NLU)自然語言處理
- python呼叫自然語言處理工具hanlp記錄Python自然語言處理HanLP
- 自然語言處理入門基礎之hanlp詳解自然語言處理HanLP
- 自然語言處理(NLP)概述自然語言處理
- 自然語言處理NLP(四)自然語言處理
- Python自然語言處理Python自然語言處理
- 自然語言處理工具python呼叫hanlp的方法步驟自然語言處理PythonHanLP
- 【自然語言處理篇】--以NLTK為基礎講解自然語⾔處理的原理和基礎知識自然語言處理
- Hanlp自然語言處理工具之詞法分析器HanLP自然語言處理詞法分析
- 自然語言處理工具hanlp自定義詞彙新增圖解自然語言處理HanLP圖解
- Python自然語言處理 1 語言處理與PythonPython自然語言處理
- 自然語言處理的最佳實踐自然語言處理
- 開源自然語言處理工具包hanlp中CRF分詞實現詳解自然語言處理HanLPCRF分詞
- 精通Python自然語言處理 4 :詞性標註--單詞識別Python自然語言處理詞性標註
- [譯] 自然語言處理真是有趣!自然語言處理
- 自然語言處理:分詞方法自然語言處理分詞
- 自然語言處理與分析(one)自然語言處理
- 自然語言處理工具hanlp定製使用者詞條自然語言處理HanLP
- 自然語言處理工具HanLP-N最短路徑分詞自然語言處理HanLP分詞
- 中國語文(自然語言處理)作業自然語言處理