ner(命名實體識別)一般是詞典和模型方式結合,詞典負責已有詞識別,模型負責未知詞識別。
在不需發現未知詞的情況下基於詞典的實體識別已足夠
基於字典的ner也有兩種做法:字串多模匹配 和 切詞(詞典加入自定義詞庫)
多模匹配有兩種基本演算法:trie樹 和 記錄長度集合的最長匹配
trie樹匹配效率更高,但占用記憶體更多
而記錄長度集合的最長匹配,計算時間效率相比trie稍低(但比切詞高很多),記憶體空間比較省,這裡重點介紹一下
記錄長度集合的最長匹配方式不依賴分詞,會儲存以字典中每個詞開頭兩個字的長度集合,並對字典中每個字做hashmap。
舉個例子,劉德華的歌曲 ,先查 劉德 開頭的詞的長度有 5 3 兩個長度,然後再取5個長度的「劉德華的歌」,字典裡沒有,則再取3個長度「劉德華」,字典裡有,則命中
採用該種方式相比切詞更容易出現錯誤匹配,比如 「研究生命科學「 ,假如「研究生「在字典裡,就會錯誤識別為「命科學「,因為該方式不考慮上下文,而切詞會考慮
實驗:採用該最長匹配方式測試700萬資料,實體字典佔600m
4000問句平均每個耗時16微秒,而切詞方式平均每個耗時300微秒;
最長匹配相比之下效率有20倍提公升:
將字典加入切詞工具的自定義詞庫,便可正常識別,這也是業界通用做法
但經測試,700萬資料,python版記憶體占用7g,c++版記憶體占用11g
切詞內部的詞庫使用trie樹實現,會占用較多記憶體
總結:最長匹配方式,時間空間相比切詞都更好,但是準確率低不少;切詞準確率高,但時空效率低,召回率低(一些特殊詞加入自定詞典無效,比如「新疆天業(集團)****「,"st德棉」)
兩種方式各有千秋,這裡考慮將兩種方式結合使用:先最長匹配,然後將取出的實體放回切詞結果看是否「完整」,注意不用再將詞典放入切詞工具的自定義詞庫。
怎麼判斷「完整」:如果最長匹配得到的詞開始位置的字在切詞結果中不與前乙個字組成詞 且 結束位置的字在切詞結果中不與後乙個字組成詞,則認為「完整」
舉例:最長匹配得到「國航」,切詞上下文「中國 航展「,說明」國航「不「完整」;最長匹配得到「南國置業」,切詞上下文「昨天 南國 置業 發布」,說明「南國置業」 「完整」
另外,當最長匹配提取的詞較長時,無匹配的情況極少了,對這種長詞可以不用放回切詞結果驗證。
注:實驗用的切詞工具主要是jieba python版,
pyltp最初也有使用,但發現有兩個問題:
命名實體識別實踐(詞典匹配)
任務場景 實體識別任務中,如果有乙份可靠的詞典,並且詞典和普通的文字間差異比較大的時候,其實可以用磁帶你匹配的方式進行實體識別。本文中實現了一種詞典匹配的實體識別方式,採用的是正向最大匹配 檢索樹 樹尾標籤列表的方式實現的。也就是其支援單實體可以對應多標籤的情形。public static void...
實體詞典 情感詞典 基於詞典的情感分析 簡單例項
import re import jieba pip install jieba 0.39 class dictbasedsentanal def init self self.root dir dict self.sent dict self.read dict self.root dir bos...
命名實體識別(一) 基於規則的命名實體識別
一 命名實體識別 首先,我們來認識一下命名實體識別的概念。命名實體識別 named entities recognition,ner 研究的命名實體一般分為3大類 實體類 時間類和數字類 和7小類 人名 地名 組織機構名 時間 日期 貨幣和百分比 研究的目的是將語料中的這些命名實體識別出來。主要有三...