1
條件隨機(jī)場(chǎng)-CRF
CRF,英文全稱為Conditional Random Field, 中文名為條件隨機(jī)場(chǎng),是給定一組輸入隨機(jī)變量條件下另一組輸出隨機(jī)變量的條件概率分布模型,其特點(diǎn)是假設(shè)輸出隨機(jī)變量構(gòu)成馬爾可夫(Markov)隨機(jī)場(chǎng)。
較為簡(jiǎn)單的條件隨機(jī)場(chǎng)是定義在線性鏈上的條件隨機(jī)場(chǎng),稱為線性鏈條件隨機(jī)場(chǎng)(linear chain conditional random field)。
線性鏈條件隨機(jī)場(chǎng)可以用于序列標(biāo)注等問(wèn)題,需要解決的命名實(shí)體識(shí)別(NER)任務(wù)正好可通過(guò)序列標(biāo)注方法解決。

在條件概率模型P(Y|X)中,Y是輸出變量,表示標(biāo)記序列(或狀態(tài)序列),X是輸入變量,表示需要標(biāo)注的觀測(cè)序列。
訓(xùn)練時(shí),利用訓(xùn)練數(shù)據(jù)集通過(guò)極大似然估計(jì)或正則化的極大似然估計(jì)得到條件概率模型p(Y|X); 預(yù)測(cè)時(shí),對(duì)于給定的輸入序列x,求出條件概率p(y|x)最大的輸出序列y
利用線性鏈CRF來(lái)做實(shí)體識(shí)別的時(shí)候,需要假設(shè)每個(gè)標(biāo)簽 的預(yù)測(cè)同時(shí)依賴于先前預(yù)測(cè)的標(biāo)簽 和 的詞語(yǔ)輸入序列,如下圖所示
每個(gè) NER標(biāo)簽僅依賴于其直接前前繼和后繼標(biāo)簽以及 x
CRF是一種選擇因子的特定方式,換句話說(shuō),就是特征函數(shù)。定義因子的 CRF 方法是采用實(shí)值特征函數(shù) 與參數(shù) 和 的線性組合的指數(shù),下面是特征函數(shù)與權(quán)重參數(shù)在時(shí)間步上是對(duì)應(yīng)的:
關(guān)于Linear-chain CRF的訓(xùn)練推導(dǎo),可以查看文章:條件隨機(jī)場(chǎng)CRF(一)從隨機(jī)場(chǎng)到線性鏈條件隨機(jī)場(chǎng)
2
實(shí)踐1:基于CRF++實(shí)現(xiàn)NER
CRF++簡(jiǎn)介
CRF++是著名的條件隨機(jī)場(chǎng)的開(kāi)源工具,也是目前綜合性能最佳的CRF工具,采用C++語(yǔ)言編寫(xiě)而成。其最重要的功能我認(rèn)為是采用了特征模板。這樣就可以自動(dòng)生成一系列的特征函數(shù),而不用我們自己生成特征函數(shù),我們要做的就是尋找特征,比如詞性等。
官網(wǎng)地址:http://taku910.github.io/crfpp/
安裝
CRF++的安裝可分為Windows環(huán)境和Linux環(huán)境下的安裝。關(guān)于Linux環(huán)境下的安裝,可以參考文章:CRFPP/CRF++編譯安裝與部署 。在Windows中CRF++不需要安裝,下載解壓CRF++0.58文件即可以使用

訓(xùn)練語(yǔ)料創(chuàng)建
在訓(xùn)練之前需要將標(biāo)注數(shù)據(jù)轉(zhuǎn)化為CRF++訓(xùn)練格式文件:
分兩列,第一列是字符,第二例是對(duì)應(yīng)的標(biāo)簽,中間用 分割。
比如標(biāo)注方案采用BISO,效果如下:

模板
模板是使用CRF++的關(guān)鍵,它能幫助我們自動(dòng)生成一系列的特征函數(shù),而不用我們自己生成特征函數(shù),而特征函數(shù)正是CRF算法的核心概念之一。一個(gè)簡(jiǎn)單的模板文件如下:
在這里,我們需要好好理解下模板文件的規(guī)則。T**:%x[#,#]中的T表示模板類(lèi)型,兩個(gè)"#"分別表示相對(duì)的行偏移與列偏移。一共有兩種模板:
訓(xùn)練
crf_learn-f3-c4.0-m100templatetrain.datacrf_model>train.rst
其中,template為模板文件,train.data為訓(xùn)練語(yǔ)料,-t表示可以得到一個(gè)model文件和一個(gè)model.txt文件,其他可選參數(shù)說(shuō)明如下:
-f,–freq=INT使用屬性的出現(xiàn)次數(shù)不少于INT(默認(rèn)為1) -m,–maxiter=INT設(shè)置INT為L(zhǎng)BFGS的最大迭代次數(shù)(默認(rèn)10k) -c,–cost=FLOAT設(shè)置FLOAT為代價(jià)參數(shù),過(guò)大會(huì)過(guò)度擬合(默認(rèn)1.0) -e,–eta=FLOAT設(shè)置終止標(biāo)準(zhǔn)FLOAT(默認(rèn)0.0001) -C,–convert將文本模式轉(zhuǎn)為二進(jìn)制模式 -t,–textmodel為調(diào)試建立文本模型文件 -a,–algorithm=(CRF|MIRA)選擇訓(xùn)練算法,默認(rèn)為CRF-L2 -p,–thread=INT線程數(shù)(默認(rèn)1),利用多個(gè)CPU減少訓(xùn)練時(shí)間 -H,–shrinking-size=INT設(shè)置INT為最適宜的跌代變量次數(shù)(默認(rèn)20) -v,–version顯示版本號(hào)并退出 -h,–help顯示幫助并退出
輸出信息
iter:迭代次數(shù)。當(dāng)?shù)螖?shù)達(dá)到maxiter時(shí),迭代終止 terr:標(biāo)記錯(cuò)誤率 serr:句子錯(cuò)誤率 obj:當(dāng)前對(duì)象的值。當(dāng)這個(gè)值收斂到一個(gè)確定值的時(shí)候,訓(xùn)練完成 diff:與上一個(gè)對(duì)象值之間的相對(duì)差。當(dāng)此值低于eta時(shí),訓(xùn)練完成
預(yù)測(cè)
在訓(xùn)練完模型后,我們可以使用訓(xùn)練好的模型對(duì)新數(shù)據(jù)進(jìn)行預(yù)測(cè),預(yù)測(cè)命令格式如下:
crf_test-mcrf_modeltest.data>test.rstt
-m model表示使用我們剛剛訓(xùn)練好的model模型,預(yù)測(cè)的數(shù)據(jù)文件為test.data> test.rstt 表示將預(yù)測(cè)后的數(shù)據(jù)寫(xiě)入到test.rstt 中。
3
實(shí)踐2:基于sklearn_crfsuite實(shí)現(xiàn)NER
sklearn_crfsuite簡(jiǎn)介
sklearn-crfsuite是基于CRFsuite庫(kù)的一款輕量級(jí)的CRF庫(kù)。該庫(kù)兼容sklearn的算法,因此可以結(jié)合sklearn庫(kù)的算法設(shè)計(jì)實(shí)體識(shí)別系統(tǒng)。sklearn-crfsuite不僅提供了條件隨機(jī)場(chǎng)的訓(xùn)練和預(yù)測(cè)方法還提供了評(píng)測(cè)方法。
https://sklearn-crfsuite.readthedocs.io/en/latest/#

安裝:pip install sklearn-crfsuite
特征與模型創(chuàng)建
特征構(gòu)造:
模型初始化
crf_model=sklearn_crfsuite.CRF(algorithm='lbfgs',c1=0.25,c2=0.018,max_iterations=100, all_possible_transitions=True,verbose=True) crf_model.fit(X_train,y_train)
完整代碼如下:
importre
importsklearn_crfsuite
fromsklearn_crfsuiteimportmetrics
importjoblib
importyaml
importwarnings
warnings.filterwarnings('ignore')
defload_data(data_path):
data=list()
data_sent_with_label=list()
withopen(data_path,mode='r',encoding="utf-8")asf:
forlineinf:
ifline.strip()=="":
data.append(data_sent_with_label.copy())
data_sent_with_label.clear()
else:
data_sent_with_label.append(tuple(line.strip().split("")))
returndata
defword2features(sent,i):
word=sent[i][0]
features={
'bias':1.0,
'word':word,
'word.isdigit()':word.isdigit(),
}
ifi>0:
word1=sent[i-1][0]
words=word1+word
features.update({
'-1:word':word1,
'-1:words':words,
'-1:word.isdigit()':word1.isdigit(),
})
else:
features['BOS']=True
ifi>1:
word2=sent[i-2][0]
word1=sent[i-1][0]
words=word1+word2+word
features.update({
'-2:word':word2,
'-2:words':words,
'-3:word.isdigit()':word1.isdigit(),
})
ifi>2:
word3=sent[i-3][0]
word2=sent[i-2][0]
word1=sent[i-1][0]
words=word1+word2+word3+word
features.update({
'-3:word':word3,
'-3:words':words,
'-3:word.isdigit()':word1.isdigit(),
})
ifi
訓(xùn)練效果如下:
labels=list(crf_model.classes_)
labels.remove("O")
y_pred=crf_model.predict(X_dev)
metrics.flat_f1_score(y_dev,y_pred,
average='weighted',labels=labels)
sorted_labels=sorted(labels,key=lambdaname:(name[1:],name[0]))
print(metrics.flat_classification_report(
y_dev,y_pred,labels=sorted_labels,digits=3
))

完整代碼 https://www.heywhale.com/home/competition/6216f74572960d0017d5e691/content/
審核編輯 :李倩
-
模型
+關(guān)注
關(guān)注
1文章
3618瀏覽量
51538 -
變量
+關(guān)注
關(guān)注
0文章
615瀏覽量
29326
原文標(biāo)題:命名實(shí)體識(shí)別實(shí)踐 - CRF
文章出處:【微信號(hào):zenRRan,微信公眾號(hào):深度學(xué)習(xí)自然語(yǔ)言處理】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
自然語(yǔ)言基礎(chǔ)技術(shù)之命名實(shí)體識(shí)別相對(duì)全面的介紹
HanLP分詞命名實(shí)體提取詳解
Hanlp分詞之CRF中文詞法分析詳解
基于結(jié)構(gòu)化感知機(jī)的詞性標(biāo)注與命名實(shí)體識(shí)別框架
HanLP-命名實(shí)體識(shí)別總結(jié)
基于神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu)在命名實(shí)體識(shí)別中應(yīng)用的分析與總結(jié)
思必馳中文命名實(shí)體識(shí)別任務(wù)助力AI落地應(yīng)用
新型中文旅游文本命名實(shí)體識(shí)別設(shè)計(jì)方案
命名實(shí)體識(shí)別的遷移學(xué)習(xí)相關(guān)研究分析
基于字語(yǔ)言模型的中文命名實(shí)體識(shí)別系統(tǒng)

命名實(shí)體識(shí)別實(shí)踐 - CRF
評(píng)論