hadoop小學生
精靈王
精靈王
  • 注冊日期2018-09-13
  • 發帖數160
  • QQ3234520070
  • 火幣360枚
  • 粉絲0
  • 關注0
閱讀:19138回復:1

hanlp自然語言處理包的人名識別代碼解析

樓主#
更多 發布于:2019-08-02 10:00
用戶自定義詞典8發射矩陣詞典nr.txt中收錄單字姓氏393個。袁義達在《中國的三大姓氏是如何統計出來的》文獻中指出:當代中國100個常見姓氏中,集中了全國人口的87%,根據這一數據我們只保留nr.txt中的100個常見詞語的姓氏角色,其他詞語去掉其姓氏角色狀態。過濾后,nr.txt中具有姓氏角色的單字共計97個。列于下表:






圖片:封面.jpg


實驗效果
姓氏過濾前,各命名實體識別準確率
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角色標記模式。在做人名識別時還有一個注意的點,如果你的預測語料和訓練語料完全在文體上差別很大,或者說你就是在公開的訓練語料上訓練而不在預測語料上訓練的話,基本上上下文信息是沒有用處的,甚至有可能上下文信息會給實體邊界標注帶來干擾,我想任何機器學習包括深度學習,不管是文本分類領域還是實體識別領域都會有這種泛化能力的問題,這種問題恐怕通過算法是沒法解決的,如果可以解決那么任何語種任何領域都可以使用一種模型,一勞永逸了。

喜歡0 評分0
DKHadoop用著還不錯!
安卓問號
俠客
俠客
  • 注冊日期2019-07-16
  • 發帖數25
  • QQ1305621067
  • 火幣59枚
  • 粉絲0
  • 關注0
沙發#
發布于:2019-09-07 11:37
感覺好高大尚

回復(0) 喜歡(0)     評分
游客

返回頂部
摩卡网址是多少