命名實體識別 NER CRFPP

2021-08-30 17:25:49 字數 4778 閱讀 8278

賽題介紹:

我接下來主要講提取實體這一部分,用的是crf模型,訓練直接使用crf++工具(似乎被牆了?)。

通過訓練集【含ner與詞性標註的文字】通過crf++訓練處乙個特徵模型

將測試文字的輸入進crf訓練好的特徵模型裡

為了確保最後的機構實體識別準確度,使用bmewo標註集,各個標註的意義如下:

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

n     1     notloc  isend    e

假如當前識別到第三行,則u06:%x[-2,0]/%x[-1,0]/%x[0,0]對應識別出來的文字為寧夏/物美/超市。這就相當於我們在文字中找到的一條特徵。

②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 中文命名實體沒有類似英文明確的...