賽題介紹:
我接下來主要講提取實體這一部分,用的是crf模型,訓練直接使用crf++工具(似乎被牆了?)。
通過訓練集【含ner與詞性標註的文字】通過crf++訓練處乙個特徵模型為了確保最後的機構實體識別準確度,使用bmewo標註集,各個標註的意義如下:將測試文字的輸入進crf訓練好的特徵模型裡
b:實體的開頭比如下面這個句子(已做分詞處理):m:實體的中間部分
e:實體的結束
w:單獨成實體
o:句子的其它成分
山西 相立 山泉 飲品 開發 **** 生產 的桶裝 飲用水 檢出 銅綠 假 單胞菌背後的標註為:
山西/b 相立/m 山泉/m 飲品/m 開發/m ****/e 生產/o 的/o 桶裝/o 飲用水/o 檢出/o 銅綠/o 假/o 單胞菌/o對訓練文字進行中文分詞、去除停用詞的處理,並根據上述的標註集進行標註。同時,除了詞本身,還引入了4個特徵:
特徵①:【詞性】,用jieba分詞識別出來的詞性
特徵②:【是否是特徵詞】,該詞是特徵詞,標記1;不是特徵詞,標記0。這裡的特徵詞是指「實體通常的結尾詞」,比如「****」,「藥監局」,「超市」等等,這些特徵詞**於兩個地方:
從訓練集中分詞得到。
從開源中文分詞工具hanlp的機構名詞典中整理得到。
特徵③:【是否是地點】,該詞是地點,標記為isloc;該詞不是地點,標記為notloc。這裡的地點資訊我們是從jieba的分詞詞性標註功能中得到的,詞性標註為ns的一般是地點。
特徵④:【是否是句子結束】,該詞是這個句子的結束詞,標記為isend;否則標記為notend。
訓練文字在經過預處理之後,格式如下:
寧夏ns 0 isloc notend b物美nz 0 notloc notend m超市v 1 notloc notend m****n 1 notloc notend m森林公園n 0 notloc notend m其中,第一列為詞本身,第二列為特徵①,第三列為特徵②,第四列為特徵③,第五列為特徵④,第六列列為正確標註。店n 1 notloc isend e
測試文字的預處理和上面的基本一樣,區別在於,測試文字沒有正確的實體標註,所以測試文字的預處理檔案只有五列。最後我們要用crf模型**的是第六列—標註。
crf模型的訓練,需要乙個特徵模板,以便能夠自動在訓練文字中提取特徵函式,特徵模板的定義直接決定了最後的識別效果。
針對此次的機構實體,我們定義了幾種特徵模板,最終選擇了以下模板:
# unigram
u01:%x[-2,0]
u02:%x[-1,0]
u03:%x[0,0]
u04:%x[1,0]
u05:%x[2,0]
u06:%x[-2,0]/%x[-1,0]/%x[0,0]
u07:%x[-1,0]/%x[0,0]/%x[1,0]
u08:%x[0,0]/%x[1,0]/%x[2,0]
u09:%x[-1,0]/%x[0,0]
u10:%x[0,0]/%x[1,0]
u11:%x[-1,1]/%x[0,1]/%x[1,1]
u12:%x[-1,1]/%x[0,1]
u13:%x[0,1]/%x[1,1]
u14:%x[0,1]/%x[0,2]
u15:%x[-1,1]/%x[0,2]
u16:%x[-2,1]/%x[-1,1]/%x[0,2]
u17:%x[-1,1]/%x[0,2]/%x[1,1]
u18:%x[0,2]/%x[1,1]/%x[2,1]
u19:%x[0,0]/%x[0,2]
u20:%x[-1,0]/%x[0,2]
u21:%x[-2,0]/%x[-1,0]/%x[0,2]
u22:%x[-1,0]/%x[0,2]/%x[1,0]
u23:%x[0,2]/%x[1,0]/%x[2,0]
# bigram
b
下面解釋一下上述特徵模板:
①unigram型別
每一行%x[#,#]生成乙個crfs中的點(state)函式: f(s, o), 其中s為t時刻的標籤(output),o為t時刻的上下文以及特徵資訊。
比如:u06:%x[-2,0]/%x[-1,0]/%x[0,0]
u06是指這個特徵模板的編號,對於%x[-2,0]而言,%x是指找到的字元;[-2,0]是定位資訊,其中中括號裡面的-2是指當前詞的前兩個詞,0是指第0列。後面用/連線的是多個特徵的組合。
對於以下的訓練文字:
寧夏ns 0 isloc notend b物美nz 0 notloc notend m超市v 1 notloc notend m****n 1 notloc notend m森林公園n 0 notloc notend m假如當前識別到第三行,則u06:%x[-2,0]/%x[-1,0]/%x[0,0]對應識別出來的文字為寧夏/物美/超市。這就相當於我們在文字中找到的一條特徵。店n 1 notloc isend e
②bigram型別
每一行%x[#,#]生成乙個crfs中的邊(edge)函式:f(s』, s, o), 其中s』為t – 1時刻的標籤.也就是說,bigram型別與unigram大致機同,只是還要考慮到t – 1時刻的標籤.這裡只寫乙個b,預設生成f(s』, s).
有了特徵模板以及訓練文字檔案,就可以進行crf模型訓練了,我們採用了crf++這個開源工具包進行訓練,使用預設引數,最終模型識別出來的特徵有11616755條。
有了上述預處理測試文字和訓練生成的crf模型,我們可以進行測試文字的標籤**,生成crf_test_output.txt
。
由於crf_test_output.txt
裡面**的是每個詞背後的標註,我們還要做乙個後處理工作才能把真正的實體提取出來。
用正規表示式b+m*e+
或者w
匹配文字,然後將其背後的文字提取出來,就是識別出來的機構實體。
在使用crf模型之後,我們得到了不錯的效果。線下訓練文字的實體召回率可以達到91.3%,另外,識別出來的無效實體也少了很多。
和基於規則的實體識別相比,它有著以下優點:
當然,這個模型也不是完美的,比如,我們訓練的這個模型就比較「看重」機構特徵詞。舉個例子,如果「下屬公司」單獨出現,則它也可能會被識別為機構名,需要我們人工定義一些規則將其去除。
crf++工具的使用就沒有介紹了,訓練的過程只需要預處理語料以及模板檔案,預處理語料格式和模板檔案,在上文已經體現出來了,感興趣的朋友,缺少語料或者工具,可以找我要。
ai命名實體識別模型 命名實體識別
crf中有兩類特徵函式,分別是狀態特徵和轉移特徵,狀態特徵用當前節點 某個輸出位置可能的狀態中的某個狀態稱為乙個節點 的狀態分數表示,轉移特徵用上乙個節點到當前節點的轉移分數表示。其損失函式定義如下 crf損失函式的計算,需要用到真實路徑分數 包括狀態分數和轉移分數 其他所有可能的路徑的分數 包括狀...
命名實體識別
簡單的分詞器 如二元分詞器 無法識別oov,所以需要運用一些規定的規則來輔助識別 如 在識別音譯人名時,可以設定規則 一旦發現某詞是人名,而該詞後面跟隨人名詞時,將他們合併 針對不同情況,需要設計相應的標註集 拿人名識別舉例 輸入資料集進行訓練後,會將人名拆分為碎片,模擬人名的錯誤切分.接著,檢查拆...
命名實體 中文命名實體識別簡介
一切具有特定屬性集合的物體都可以稱為實體。一般包括三大類 實體類 時間類 數字類 七小類 人名 機構名 地名 時間 日期 貨幣和百分比 1 確定實體的邊界,即確定哪些詞屬於實體。2 確定實體的類別,即確定實體屬於人名或者機構名等。1 各類命名實體沒有嚴格的命名規範 2 中文命名實體沒有類似英文明確的...