天天看點

Hanlp-地名識别調試方法詳解HanLP命名實體識别

HanLP收詞特别是實體比較多,是以特别容易造成誤識别。下邊舉幾個地名誤識别的例子,需要指出的是,後邊的機構名識别也以地名識别為基礎,是以,如果地名識别不準确,也會導緻機構名識别不準确。

Hanlp-地名識别調試方法詳解HanLP命名實體識别

類型1 數字+地名

[1] 暗訪哈爾濱網約車:下10單來7輛“黑車” 1輛套牌

[2] 房天下每日成交5月12日海甯商品房銷售備案43套

[3] 廣西近視手術專家-黃明漢院長9月9日百色見面會

類型2 前詞+地名首詞成詞或地名尾詞+後詞成詞

[1] 西安國企4000元工資相當于私企多少錢?

[2] 七月份從標頭到山東,十五天左右,有自駕遊路線推薦嗎?

[3] 最受考研人歡迎的城市,有你報考高校所在的城市嗎?

類型3 地名本身成詞

[1] 滴滴司機接跨省天價訂單 乘客半路改道至今未付款

[2] 上聯:山水不曾随我老,如何對下聯?

[3] 上聯:柳着金妝閑釣水,如何對下聯?

Badcase分析及修正

下邊介紹一下排查誤判原因以及修正的方法

首先需要明确以下幾點注意事項:

1.實體識别受分詞精度影響。

2.實體識别同樣涉及消歧的問題。

3.HanLP收錄了一些不常見的實體詞,會造成錯誤率升高。

4.HanLP基于隐馬的命名實體識召回率沒有特别要求的話,不需要再去訓練。

這裡我們以下邊這個badcase的分析過程為例來說明

[5] 上聯:山水不曾随我老,如何對下聯?

打開提示模式 HanLP.Config.enableDebug()

運作人名識别代碼

HanLP命名實體識别

def hanlp_ner(text, ner_type):

global segment
ner_li = []
for term in segment.seg(text):
    if str(term.nature) == ner_type:
        ner_li.append(str(term.word))           

return ner_li

這裡ner_type為你要識别的實體類型,如果是人名則ner_type='nr',地名ner_type='ns',機構名ner_type='nt'。text為要抽取實體的文本。

識别結果,這裡為了清晰,隻截取了部分輸出:

粗分結果[上聯/n, :/w, 山水/n, 不/d, 曾随/ns, 我/rr, 老/a, ,/w, 如何/ryv, 對/p, 下聯/n, ?/w]

地名角色觀察: S 1163565 : A 2701 B 439 X 11 不 B 214 A 3 C 3

我 A 47 B 26 , A 40525 B 10497 X 418 對 A 2896 B 454 X 215 ? B 82

地名角色标注:[ /S ,上聯/Z ,:/B ,山水/A ,不/C ,曾随/H ,我/B ,老/B ,,/A ,如何/B ,對/A ,下聯/Z ,?/B , /S]

識别出地名:不曾随 CH

hanlp_ns ['不曾随']

顯然,曾随被認為是地名了,而且粗分結果表示的是未經地名識别子產品分詞和詞性标注的結果,顯然這是由于詞表導緻的。由于沒有經過地名識别子產品,是以不需要去地名的發射詞表ns.txt中去找詞語,隻需要看核心詞表CoreNatureDictionary.txt中去找

Hanlp-地名識别調試方法詳解HanLP命名實體識别

顯然,在核心詞表中“曾随“被标記為一個地名,把”曾随“從詞表中删除掉,并删除詞表檔案CoreNatureDictionary.txt.bin,之後再次運作程式得到下邊的輸出結果

hanlp_ns []

從這個執行個體,我們也可以看出一些不常見地名如果做成地名詞表,就有導緻錯誤識别實體。是以,我們應該保留一份評測語料,每當修改了實體詞表後,需要跑一下測試語料檢視準确率,如果降低的太多,則表示這樣加進來是不可行的。同時填加的實體名也有可能會造成分詞錯誤。

下邊說明一下HanLP中有關實體的詞表檔案名:

1.CoreNatureDictionary.mini.txt

2.CoreNatureDictionary.txt

3.CustomDictionary.txt

4.機構名詞典.txt

5.全國地名大全.txt

6.人名詞典.txt

7.上海地名.txt

8.現代漢語補充詞庫.txt

9.ns.txt

10.nr.txt

11.nt.txt

當然這裡列出的是通常最有可能導緻誤識别的詞表,如果這些詞表都沒有找到,還需要在HanLP其他詞典檔案中尋找。

希望今天的内容對使用HanLP并對隐馬情有獨鐘的小夥伴有幫助。這兩天的一點小體會是,實體識别其實跟分詞是密不可分的,兩者都有共同的處理難點,比如詞義消歧(邊界的确定),詞法分析其實才是真正的NLP的内容之一,而詞法分析跟機器學習其實沒有太大關系。上邊的badcase解決方法不是根本方法,直接去除掉某些詞,會導緻一些生僻實體識别不出來。我們是否可以考慮左右資訊熵之類的測度函數來解決這種詞是否需要拆開與其前後構成詞。針對詞法分析推薦大家使用深度學習的方法,畢竟了解這些方法也是必須的,雖然你可以在實際種不用,但是不代表你可以偷懶而不去學習。

繼續閱讀