CRF 簡介入門

2021-06-20 04:58:11 字數 4199 閱讀 1145

conditional

random

field

:條件隨機場,一種機器學習技術(模型)

crf由

john lafferty

最早用於

nlp技術領域,其在

nlp技術領域中主要用於文字標註,並有多種應用場景,例如:

本文主要描述如何使用

crf技術來進行中文分詞。

1. crf

把分詞當做字的詞位分類問題,通常定義字的詞位資訊如下:

2. crf分詞的過程就是對詞位標註後,將b和e之間的字,以及s單字構成分詞

3. crf分詞例項:

上面介紹了crf技術思想以及如何用於分詞,下面將介紹如何在實際開發中使用crf進行分詞工作。目前常見的crf工具包有pocket crf, flexcrf 車crf++,目前網上也有一些它們3者之間的對比報告,個人感覺crf++在易用性,穩定性和準確性等綜合方面的表現最好,同時在公司的專案開發中也一直在使用,因此下面將概述一下crf++的使用方法(具體細節可以到crf++官方主頁去查閱,

1.安裝

編譯器要求:c++編譯器(gcc 3.0或更高)

命令:% ./configure

% make

% su

# make install

注:只有擁有root帳號的使用者才能成功安裝。

77number of features: 

32856

freq: 

1eta: 

0.0001

c(sigma^2): 

10iter=0 terr=0.7494725738 serr=1 obj=2082.968899 diff=1

iter=1 terr=0.1671940928 serr=0.8831168831 obj=1406.329356 diff=0.3248438053

iter=2 terr=0.1503164557 serr=0.8831168831 obj=626.9159973 diff=0.5542182244

其中:iter:迭代次數

terr:和tags相關的錯誤率(錯誤的tag數/所有的tag數)

serr:與sentence相關的錯誤率(錯誤的sentence數/所有的sentence數)

obj:當前物件的值。當這個值收斂到乙個確定的值是,crf模型將停止迭代

diff:與上乙個物件值之間的相對差

有兩個主要的引數用於控制訓練條件:

-c float:使用這個選項,你可以改變crf的hyper-parameter。當取乙個極大的c值,crf將可能對訓練資料產生過擬合(overfitting)現象。這個引數將會調節overfitting和underfitting之間的平衡。結果將會對引數帶來有意義的影響。使用者可以通過使用held-out data或者更多的通用模型的選擇方法如十字交叉驗證法(cross validation)獲得最有的值。

-f num:這個引數用於設定特徵的cut-off閾值。crf++訓練時只使用出現次數不少於num次數的特徵進行訓練。預設值為1。當使用crf++訓練大規模資料時,單一特徵的數量將達到數百萬,此時選擇這個引數很有用。

這裡有乙個使用這兩個引數的例子:

% crf_learn -f 3 -c 1.5 template_file train_file model_file

4.測試(解碼)

使用crf_test 命令:

% crf_test -m model_file test_files ...

其中,model_file是crf_learn建立的。在測試過程中,使用者不需要指定template file,因為,mode file已經有了template的資訊。test_file是你想要標註序列標記的測試語料。這個檔案的書寫格式應該與訓練檔案一致。

下面是乙個crf_test輸出的例子:

% crf_test -m model test.data

rockwell 

nnp 

b  b

international 

nnp 

i  i

corp. 

nnp 

i  i

's  pos 

b  b

tulsa 

nnp 

i  i

unit 

nn i  i

..其中,最後一列是模型估計的tag。如果第三列是標準的tag,則可以通過簡單的比較第三列和第四列之間的差別計算出準確率。

詳細的層次(verbose level)

-v選項:將設定verbose level。預設值為0。通過增加層次,你可以從crf++獲得額外的資訊。

層次1:

你 可以對每個tag使用邊緣概率(marginal probabilities)(這是一種對輸出tag的confidence measure),對輸出使用條件概率(conditional probably)(針對整個輸出的confidence measure)。

例如:% crf_test -v1 -m model test.data| head

# 0.478113

rockwell 

nnp 

b  b/0.992465

international 

nnp 

i  i/0.979089

corp. 

nnp 

i  i/0.954883

's  pos 

b  b/0.986396

tulsa 

nnp 

i  i/0.991966

...其中,第一行的"# 0.478113"即是輸出的條件概率,而且每乙個輸出tag各自含有乙個概率,表示形式如「b/0.992465」。

層次2:

你可以對所有的其他候選求邊緣概率。

例如:% crf_test -v2 -m model test.data

# 0.478113

rockwell 

nnp 

b  b/0.992465 

b/0.992465 

i/0.00144946 

o/0.00608594

international 

nnp 

i  i/0.979089 

b/0.0105273 

i/0.979089 

o/0.0103833

corp. 

nnp 

i  i/0.954883 

b/0.00477976 

i/0.954883 

o/0.040337

's  pos 

b  b/0.986396 

b/0.986396 

i/0.00655976 

o/0.00704426

tulsa 

nnp 

i  i/0.991966 

b/0.00787494 

i/0.991966 

o/0.00015949

unit 

nn i  i/0.996169 

b/0.00283111 

i/0.996169 

o/0.000999975

..n-best outputs

-n選項:使用這個選項將獲得n-best結果,它根據crf計算出的條件概率排序得到。當選擇了n-best結果,crf++會自動新增一行,形式為「# n prob」,其中n是排序後的輸出結果,從0開始。prob表示output的條件概率。

需要注意的是,如果crf++不能找到足夠的n條路徑是,它將放棄列舉n-best結果。這種情況在所給的句子很短的情況下常出現。

crf++使用前向viterbi和後向a*搜尋相結合的方法。這種結合適應了n-best結果的需求。

下面是乙個n-best結果的例子:

% crf_test -n 20 -m model test.data

# 0 0.478113

rockwell 

nnp 

b  b

international 

nnp 

i  i

corp. 

nnp 

i  i

's  pos 

b  b

...# 1 0.194335

rockwell 

nnp 

b  b

international 

nnp 

i  i

React 簡介入門

一.react是facebook推出的乙個用來構建使用者介面的js庫。最新版本v15.3.2。具備以下特性 1.不是乙個mvc框架 2.不適用模板 3.響應式更新非常簡單 4.html5僅僅是個開始 二.react實現了單向相應的資料流,從而減少了重複 比傳統資料繫結更簡單。三.react元件通過乙...

KOA框架簡介,入門指引

koa 是乙個新的 web 框架,由 express 幕後的原班人馬打造,致力於成為 web 應用和 api 開發領域中的乙個更小 更富有表現力 更健壯的基石 koa git master find type f name js grep v test lib context.js lib resp...

XML入門簡介

xml可以用來描述資料,重點是 資料是什麼 html則是用來顯示資料,重點是 如何顯示資料 在你繼續之前你應該具有下面一些基礎的知識 你最好在學習xml之前就了解上面的內容,因為在xml的學習過程中將用到這些知識。xml是用來存放資料的 xml不是html的替代品,xml和html是兩種不同用途的語...