1
條件隨機場-CRF
CRF,英文全稱為Conditional Random Field, 中文名為條件隨機場,是給定一組輸入隨機變量條件下另一組輸出隨機變量的條件概率分布模型,其特點是假設輸出隨機變量構成馬爾可夫(Markov)隨機場。
較為簡單的條件隨機場是定義在線性鏈上的條件隨機場,稱為線性鏈條件隨機場(linear chain conditional random field)。
線性鏈條件隨機場可以用于序列標注等問題,需要解決的命名實體識別(NER)任務正好可通過序列標注方法解決。
在條件概率模型P(Y|X)中,Y是輸出變量,表示標記序列(或狀態序列),X是輸入變量,表示需要標注的觀測序列。
訓練時,利用訓練數據集通過極大似然估計或正則化的極大似然估計得到條件概率模型p(Y|X); 預測時,對于給定的輸入序列x,求出條件概率p(y|x)最大的輸出序列y
利用線性鏈CRF來做實體識別的時候,需要假設每個標簽 的預測同時依賴于先前預測的標簽 和 的詞語輸入序列,如下圖所示每個 NER標簽僅依賴于其直接前前繼和后繼標簽以及 x
CRF是一種選擇因子的特定方式,換句話說,就是特征函數。定義因子的 CRF 方法是采用實值特征函數 與參數 和 的線性組合的指數,下面是特征函數與權重參數在時間步上是對應的:
關于Linear-chain CRF的訓練推導,可以查看文章:條件隨機場CRF(一)從隨機場到線性鏈條件隨機場
2
實踐1:基于CRF++實現NER
CRF++簡介
CRF++是著名的條件隨機場的開源工具,也是目前綜合性能最佳的CRF工具,采用C++語言編寫而成。其最重要的功能我認為是采用了特征模板。這樣就可以自動生成一系列的特征函數,而不用我們自己生成特征函數,我們要做的就是尋找特征,比如詞性等。官網地址:http://taku910.github.io/crfpp/
安裝
CRF++的安裝可分為Windows環境和Linux環境下的安裝。關于Linux環境下的安裝,可以參考文章:CRFPP/CRF++編譯安裝與部署 。在Windows中CRF++不需要安裝,下載解壓CRF++0.58文件即可以使用
訓練語料創建
在訓練之前需要將標注數據轉化為CRF++訓練格式文件:
分兩列,第一列是字符,第二例是對應的標簽,中間用 分割。
比如標注方案采用BISO,效果如下:
模板
模板是使用CRF++的關鍵,它能幫助我們自動生成一系列的特征函數,而不用我們自己生成特征函數,而特征函數正是CRF算法的核心概念之一。一個簡單的模板文件如下:在這里,我們需要好好理解下模板文件的規則。T**:%x[#,#]中的T表示模板類型,兩個"#"分別表示相對的行偏移與列偏移。一共有兩種模板:
訓練
crf_learn-f3-c4.0-m100templatetrain.datacrf_model>train.rst
其中,template為模板文件,train.data為訓練語料,-t表示可以得到一個model文件和一個model.txt文件,其他可選參數說明如下:
-f,–freq=INT使用屬性的出現次數不少于INT(默認為1) -m,–maxiter=INT設置INT為LBFGS的最大迭代次數(默認10k) -c,–cost=FLOAT設置FLOAT為代價參數,過大會過度擬合(默認1.0) -e,–eta=FLOAT設置終止標準FLOAT(默認0.0001) -C,–convert將文本模式轉為二進制模式 -t,–textmodel為調試建立文本模型文件 -a,–algorithm=(CRF|MIRA)選擇訓練算法,默認為CRF-L2 -p,–thread=INT線程數(默認1),利用多個CPU減少訓練時間 -H,–shrinking-size=INT設置INT為最適宜的跌代變量次數(默認20) -v,–version顯示版本號并退出 -h,–help顯示幫助并退出
輸出信息
iter:迭代次數。當迭代次數達到maxiter時,迭代終止 terr:標記錯誤率 serr:句子錯誤率 obj:當前對象的值。當這個值收斂到一個確定值的時候,訓練完成 diff:與上一個對象值之間的相對差。當此值低于eta時,訓練完成
預測
在訓練完模型后,我們可以使用訓練好的模型對新數據進行預測,預測命令格式如下:
crf_test-mcrf_modeltest.data>test.rstt
-m model表示使用我們剛剛訓練好的model模型,預測的數據文件為test.data> test.rstt 表示將預測后的數據寫入到test.rstt 中。
3
實踐2:基于sklearn_crfsuite實現NER
sklearn_crfsuite簡介
sklearn-crfsuite是基于CRFsuite庫的一款輕量級的CRF庫。該庫兼容sklearn的算法,因此可以結合sklearn庫的算法設計實體識別系統。sklearn-crfsuite不僅提供了條件隨機場的訓練和預測方法還提供了評測方法。
https://sklearn-crfsuite.readthedocs.io/en/latest/#
安裝:pip install sklearn-crfsuite
特征與模型創建
特征構造:模型初始化
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
訓練效果如下:
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/
審核編輯 :李倩
-
模型
+關注
關注
1文章
3178瀏覽量
48731 -
變量
+關注
關注
0文章
613瀏覽量
28334
原文標題:命名實體識別實踐 - CRF
文章出處:【微信號:zenRRan,微信公眾號:深度學習自然語言處理】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論