1. 程式人生 > >條件隨機場(4)——CRF++分詞訓練和預測

條件隨機場(4)——CRF++分詞訓練和預測

這是CRF的最後一篇總結。這篇總結是訓練分詞模型和預測。CRF、最大熵、隱馬爾科夫模型貌似都可以做分詞、詞性標註、命名實體識別,以前只是在hanLP裡面用這些工具,實際上是不明所以的。現在要開始弄明白其中原理,並自己訓練模型了。好吧,又囉嗦了。

先說一說CRF++的訓練和預測吧,在《條件隨機場(3)——學習和預測》中提到CRF++訓練介面為crf_learn,預測介面為crf_test,直接呼叫就可以了,官網上有呼叫命令。
crf_learn需要的訓練資料是有標註的,如果是分詞,就對一個詞中的每一個字進行標註,標註值為每個字在詞中的位置,4tag標註的話,標註集合為Y={S,B,M,E},S表示單字為詞,B表示詞的首字,M表示詞的中間字,E表示詞的結尾字。同時,同一個詞字與標註之間用’\t’分隔,字與字之間通過’\n’分隔。句子與句子之間通過一行空白行分隔。
crf_learn接受的資料是這樣的:

邁      B
向      E
充      B
滿      E
希      B
望      E
的      S
新      S
世      B
紀      E
—       B
—       E
一      B
九      M
九      M
八      M
年      E
新      B
年      E
講      B
話      E
(      S
附      S
圖      B
片      E
1      S
張      S
)      S

中      B
共      M
中      M

crf_test接收的預測語句也不是通常的句子,之前直接將一整句話預測,預測出來的結果是

今天天氣很好,出去逛逛。    S

以為是模型訓練問題,後來發現,是crf_test對預測資料要求的格式不同,這句話被crf_test會當做一個字來處理的。crf_test接收的預測資料是這個樣子的

共      B
同      B
創      B
造      B
美      B
好      B
的      B
新      B
世      B
紀      B
—       B
—       B
二      B
○       B
○       B
一      B
年      B
新      B
年      B
賀      B
詞      B

(      B
二      B
○       B
○       B
○       B
年      B
十      B
二      B
月      B
三      B

本笨妞採用了pku的語料來訓練。pku的語料是這種格式的:

邁向  充滿  希望  的  新  世紀  ——  一九九八年  新年  講話  (  附  圖片  1  張  )  
中共中央  總書記  、  國家  主席  江  澤民  
(  一九九七年  十二月  三十一日  )  
12月  31日  ,  中共中央  總書記  、  國家  主席  江  澤民  發表  1998年  新年  講話  《  邁向  充滿  希望  的  新  世紀  》  。  (  新華社  記者  蘭  紅光  攝  )  
同胞  們  、  朋友  們  、  女士  們  、  先生  們  :  
在  1998年  來臨  之際  ,  我  十分  高興  地  通過  中央  人民  廣播  電臺  、  中國  國際  廣播  電臺  和  中央  電視臺  ,  向  全國  各族  人民  ,  向  香港  特別  行政區  同胞  、  澳門  和  臺灣  同胞  、  海外  僑胞  ,  向  世界  各國  的  朋友  們  ,  致以  誠摯  的  問候  和  良好  的  祝願  !  

預測語料是這樣的:

共同創造美好的新世紀——二○○一年新年賀詞
(二○○○年十二月三十一日)(附圖片1張)
女士們,先生們,同志們,朋友們:
2001年新年鐘聲即將敲響。人類社會前進的航船就要駛入21世紀的新航程。中國人民進入了向現代化建設第三步戰略目標邁進的新徵程。
在這個激動人心的時刻,我很高興通過中國國際廣播電臺、中央人民廣播電臺和中央電視臺,向全國各族人民,向香港特別行政區同胞、澳門特別行政區同胞和臺灣同胞、海外僑胞,向世界各國的朋友們,致以新世紀>第一個新年的祝賀!

採用通用的4tag標註法,下面是從“我愛自然語言”的部落格copy來的程式碼,用於對訓練語料和預測語料進行標註,程式碼如下:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# Author: [email protected]
# Copyright 2014 @ YuZhen Technology
#
# 4 tags for character tagging: B(Begin), E(End), M(Middle), S(Single)

import codecs
import sys

def character_tagging(input_file, output_file):
    input_data = codecs.open(input_file, 'r', 'utf-8')
    output_data = codecs.open(output_file, 'w', 'utf-8')
    for line in input_data.readlines():
        word_list = line.strip().split()
        for word in word_list:
            if len(word) == 1:
                output_data.write(word + "\tS\n")
            else:
                output_data.write(word[0] + "\tB\n")
                for w in word[1:len(word)-1]:
                    output_data.write(w + "\tM\n")
                output_data.write(word[len(word)-1] + "\tE\n")
        output_data.write("\n")
    input_data.close()
    output_data.close()

if __name__ == '__main__':
    if len(sys.argv) != 3:
        print "pls use: python make_crf_train_data.py input output"
        sys.exit()
    input_file = sys.argv[1]
    output_file = sys.argv[2]
    character_tagging(input_file, output_file)

同樣,預測語料標註程式碼如下:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# Author: [email protected]
# Copyright 2014 @ YuZhen Technology
#
# 4 tags for character tagging: B(Begin), E(End), M(Middle), S(Single)

import codecs
import sys

def character_split(input_file, output_file):
    input_data = codecs.open(input_file, 'r', 'utf-8')
    output_data = codecs.open(output_file, 'w', 'utf-8')
    for line in input_data.readlines():
        for word in line.strip():
            word = word.strip()
            if word:
                output_data.write(word + "\tB\n")
        output_data.write("\n")
    input_data.close()
    output_data.close()

if __name__ == '__main__':
    if len(sys.argv) != 3:
        print "pls use: python make_crf_test_data.py input output"
        sys.exit()
    input_file = sys.argv[1]
    output_file = sys.argv[2]
    character_split(input_file, output_file)

資料處理完之後,用以下命令訓練

crf_learn -f 3 -c 4.0 example/seg/template data/tagging/pku_train_tagging.utf8 model/crf_model_pku -t

crf_learn可自定義的引數還有很多,具體參見官網。以上命令中,template是特徵模板,偷懶直接將example裡面的分詞模板拿來用了。
模板是這樣的:

# Unigram
U00:%x[-2,0]        
U01:%x[-1,0]
U02:%x[0,0]
U03:%x[1,0]
U04:%x[2,0]
U05:%x[-2,0]/%x[-1,0]/%x[0,0]
U06:%x[-1,0]/%x[0,0]/%x[1,0]
U07:%x[0,0]/%x[1,0]/%x[2,0]
U08:%x[-1,0]/%x[0,0]
U09:%x[0,0]/%x[1,0]

# Bigram
B

特徵模板的解釋這裡最權威。Unigram和Bigram是特徵模板的型別。U00:%x[-2,0]中,U表示型別為Unigram,00表示特徵的id,%x[-2,0]表示x(在這裡為字)的位置,-2表示x的行偏移,0表示x的列偏移。
用pku語料為例

U00:%x[-2,0]  ==>邁     
U01:%x[-1,0]  ==>向
U02:%x[0,0]   ==>充
U03:%x[1,0]   ==>滿
U04:%x[2,0]   ==>希
U05:%x[-2,0]/%x[-1,0]/%x[0,0]  ==>邁/向/充
U06:%x[-1,0]/%x[0,0]/%x[1,0]   ==>向/充/滿
U07:%x[0,0]/%x[1,0]/%x[2,0]    ==>充/滿/希
U08:%x[-1,0]/%x[0,0]           ==>向/充
U09:%x[0,0]/%x[1,0]            ==>充/滿

而這些x的標註為

邁      B
向      E
充      B
滿      E
希      B

根據特徵模板和標註資料可以做出的特徵是這樣的:

func1 = if (output = S and feature="U00:邁") return 1 else return 0
func2 = if (output = B and feature="U00:邁") return 1 else return 0
func3 = if (output = M and feature="U00:邁") return 1  else return 0
func4 = if (output = E and feature="U00:邁") return 1  else return 0
...

對於這5個字來說,能生成(4*10)個特徵函式(L*N),4是Y的取值個數,我們是4tag標註,所以L是4,這5個字通過特徵模板,擴充套件成了上面的10個特徵,N是10。對於整個語料來說,L還是4,N則是整個語料根據特徵模板能擴展出來的特徵個數。
在上一篇總結訓練過程中提到,當特徵與實際的標註匹配上時,會影響該特徵對應的權重的梯度,以此來更新各特徵對應的權重。
上面只是官方給出的特徵模板,很多同道中人都直接用這個模板(我也直接用了),但是實際上模板是可以自己根據實際情況自定義的哦。

根據命令訓練完之後,得到模型crf_model_pku,然後拿模型來預測句子,命令如下:

crf_test -m model/crf_model_pku data/tagging/pku_test_tagging.utf8 >> data/result/pku_test_result

結果是這樣的

揚      B       B
帆      B       E
遠      B       B
東      B       E
做      B       S
與      B       S
中      B       B
國      B       E
合      B       B
作      B       E
的      B       S
先      B       B
行      B       E

希      B       B
臘      B       E
的      B       S
經      B       B
濟      B       E
結      B       B
構      B       E
較      B       S
特      B       B
殊      B       E
。      B       S

海      B       B
運      B       E
業      B       S
雄      B       B
踞      B       E
全      B       B

用make_crf_train_data.py相反的過程,就可以將結果通過第三列標註將詞分開了。

至此,CRF的學習基本完成了。接下來就是BiLSTM-CRF了,這個演算法貌似才是現在segment、NER、詞性標註的主流演算法。不過以手上的pku、msr的資料跑LSTM,也不知道效果如何哦。先不管了,研究之後再說。

相關推薦

條件機場(4)——CRF++訓練預測

這是CRF的最後一篇總結。這篇總結是訓練分詞模型和預測。CRF、最大熵、隱馬爾科夫模型貌似都可以做分詞、詞性標註、命名實體識別,以前只是在hanLP裡面用這些工具,實際上是不明所以的。現在要開始弄明白其中原理,並自己訓練模型了。好吧,又囉嗦了。 先說一說CRF

NLP之CRF訓練(六)

分鐘 -c data ++ del 控制 rdquo 進制 文本 分三步1、先分詞2、做BEMS標註,同時做詞性標註3、訓練模型 1、對語料進行分詞 拿到測試部的語料或者其他渠道的語料,先對語料進行分詞,我剛剛開始是用NS分詞的,等CRF模型訓練好後

條件隨機場簡介(CRF)(三)

轉載請註明出處,謝謝。 質量不佳,請多包涵。 Conditional random field(CRF)(條件隨機場)簡介(三) 3.Conditional Random fields 條件隨機場 (譯者:chain-CRF) Laffert

條件隨機場簡介(CRF)(一)

轉載請註明出處,謝謝。 質量不佳,請多包涵。 Conditional random field(CRF)(條件隨機場) 簡介(一) 1. 標註序列資料 給序列資料進行標籤是很多領域的重要任務,比如生物資訊學、計算語言學、語音識別。例如,資源語言

CRF++ 條件隨機場訓練,Anaconda的centos環境搭建

一、安裝Anaconda環境(最好到官網下載最新版本) 1、檢視系統的型別:file /sbin/init (檢視系統是32位的,還是64位的,本人是32位的) 2、下載安裝包,並上傳,比如:Anaconda3-5.2.0-Linux-x86.sh 3、安裝命令:bas

條件隨機場介紹(4)—— An Introduction to Conditional Random Fields

all str 都是 random ted 之前 圖模型 回顧 over 4. 推斷 高效的推斷算法對條件隨機場的訓練和序列預測都非常重要。主要有兩個推斷問題:第一,模型訓練之後,為新的輸入\(\mathbf{x}\)確定最可能的標記\(\mathbf{y}^* = \ar

CRF條件隨機場總結

fields 學習筆記 call 馬爾科夫隨機場 detail strong 概率計算 觀測 play 根據《統計學習方法》一書中的描述,條件隨機場(conditional random field, CRF)是給定一組輸入隨機變量條件下另一組輸出隨機變量的條件概

【原始碼】條件隨機場訓練的非均勻隨機平均梯度法

我們應用隨機平均梯度(SAG)演算法訓練條件隨機場(CRFs)。 We apply stochastic average gradient (SAG)algorithms for training conditional random fields (CR

條件隨機場專題(2)--CRF模型

        CRF是一種典型的判別式模型,它是根據模板,得到相應的特徵函式,再通過這些特徵函式進行引數的優化計算,那麼在介紹CRF模型前,就有必要先介紹判別式模型和生成式模型。       判別式模型和生成式模型的區別:         從流程上看:         生

【NLP】基於CRF條件隨機場的命名實體識別原理詳解

1. 命名實體用來做什麼? 在自然語言處理應用領域中,命名實體識別是資訊檢索、知識圖譜、機器翻譯、情感分析、問答系統等多項自然語言處理應用的基礎任務,例如,我們需要利用命名實體識別技術自動識別使用者的查詢,然後將查詢中的實體連結到知識圖譜對應的結點上其識別的準確率將會直接影

CRF條件隨機場簡介

 CRF(Conditional Random Field) 條件隨機場是近幾年自然語言處理領域常用的演算法之一,常用於句法分析、命名實體識別、詞性標註等。在我看來,CRF就像一個反向的隱馬爾可夫模型(HMM),兩者都是用了馬爾科夫鏈作為隱含變數的概率轉移模型,只不過HMM

CRF++/CRF/條件隨機場的特徵函式模板

由於最近想實現CRF,學完了理論後就開始怎麼想怎麼實現,想參照CRF++的開源實現,但首先要解決的怎麼理解特徵模板,所以寫了此文,主要參考了2篇文章,在此感謝。 CRF++要求的訓練資料格

Viterbi(維特比)演算法在CRF(條件隨機場)中是如何起作用的?

之前我們介紹過BERT+CRF來進行命名實體識別,並對其中的BERT和CRF的概念和作用做了相關的介紹,然對於CRF中的最優的標籤序列的計算原理,我們只提到了維特比演算法,並沒有做進一步的解釋,本文將對維特比演算法做一個通俗的講解,以便大家更好的理解CRF為什麼能夠得到最優的標籤序列。 通過閱讀本文你將能

條件隨機場——時間序列(句子單詞序列也算),其特征函數必須要考慮前一刻的數據

讓我 分享 lightbox 位置 可能 不難 唱歌 第一個 能夠 摘自:https://www.zhihu.com/question/35866596/answer/139485548 用一個活生生的例子來說明條件隨機場的,十分的通俗易懂!原文在這裏 [Introduc

條件隨機場-應用

model 數字 文件路徑 style 數據文件 1.5 exp ram 交叉驗證   今天介紹CRFs在中文分詞中的應用   工具:CRF++,可以去 https://taku910.github.io/crfpp/ 下載,訓練數據和測試數據可以考慮使用bakeoff20

條件隨機場介紹(2)—— An Introduction to Conditional Random Fields

圖結構 程序 實際應用 markdown ots 語法規則 復雜 得到 有一個 1. 引言 在許多實際應用中,能夠對相互依賴的多個變量進行預測的能力非常重要。這些應用的涵蓋範圍很廣,包括圖片區域劃分[49,61,69]、Go遊戲中的得分評估[130]、DNA基因切分[7]、

條件隨機場介紹(1)—— An Introduction to Conditional Random Fields

結合 特征 tro charles 信息學 幫助 all div 問題 條件隨機場介紹 原文:An Introduction to Conditional Random Fields 作者: Charles Sutton (School of Informatics, U

條件隨機場介紹(5)—— An Introduction to Conditional Random Fields

反向傳播 活性 多個實例 環路 因子 partial 5.7 最好 及其 5. 參數估計 本節我們討論如何估計條件隨機場的參數\(\theta = \{ \theta_k \}\)。在最簡單最典型情況下,我們面對的數據是完全標註的獨立數據,但是也有關於半監督學習的條件隨機場

條件隨機場介紹(6)—— An Introduction to Conditional Random Fields

因此 500px 內部 都是 問題 網絡 很多 選擇 精確 6. 相關研究和未來方向 本部分簡要分析條件隨機場的發展路線,特別是在結構化預測(structured prediction)方面。除此之外,還將分析條件隨機場與神經網絡和最大熵馬爾可夫模型(MEMMs)的關系。最

使用條件隨機場模型解決文字分類問題(附Python程式碼)

對深度學習感興趣,熱愛Tensorflow的小夥伴,歡迎關注我們的網站!http://www.tensorflownews.com。我們的公眾號:磐創AI。   一. 介紹 世界上每天都在生成數量驚人的文字資料。Google每秒處理超過40,000次搜尋,而根據福布斯報道,