CRF++

CRF++の使い方などのまとめ

CRFの原理

CRF++の使い方解説

CRF 応用

CRF++以外のCRF実装

CRF++の使い方の練習

CRF++を実際に動かして使い方の練習をする

簡単のため、次の1つの要素のみのtemplateファイルを使う

  • template
U02:%x[0,0]

このtemplateを使って次の学習データを学習する

  • train.data
A +
A +
A +
B -
B +
B +
C +
X -
X -
Y -
Z -

次のコマンドで学習を行う

$ crf_learn  -t template train.data   model

学習結果は以下のようなファイルとなる

  • model.txt
version: 100
cost-factor: 1
maxid: 12
xsize: 1

+
-

U02:%x[0,0]

0 U02:A
2 U02:B
4 U02:C
6 U02:X
8 U02:Y
10 U02:Z

0.6462678961244115
-0.6462678961244128
0.2016113127964356
-0.2016113127964371
0.3374158284496933
-0.3374158284496931
-0.5213066287709371
0.5213066287709373
-0.3374158284496930
0.3374158284496934
-0.3374158284496929
0.3374158284496936

この学習結果を次のテストファイルに適用する

test.data

A +
X -
B +
C +
$ crf_test -v2 -m model test.data

次の実行結果を得る

# 0.230404
A	+	+/0.784576	+/0.784576	-/0.215424
X	-	-/0.739354	+/0.260646	-/0.739354
B	+	+/0.599462	+/0.599462	-/0.400538
C	+	+/0.662584	+/0.662584	-/0.337416

Aの答えが+か-のどちらにラベルになるかの確率

+/0.784576	-/0.215424

は、学習データ中の最初の2つの数値

0.6462678961244115
-0.6462678961244128

で決まる。これを手計算してみる。

p=exp(0.6462678961244115);
n=exp(-0.6462678961244128);
p/(p+n) =  .7845760890555549;
n/(p+n) =  0.215423910944445

となりcrf_testの結果と一致した。
Bについても学習データの

0.2016113127964356
-0.2016113127964371

から計算すると同じ様に計算できる。

CRF++の練習その2

次の入れ替えをした学習データで同じ事をしてみる
A:2 B:3 C:4 X:7 Y:8 Z:9

  • train.data
2 +
2 +
2 +
3 -
3 +
3 +
4 +
7 -
7 -
8 -
9 -

学習結果も名前が入れ替わっただけの同じものになる。
今度は学習データにない 0 5 を入力するとどうなるか確かめる

  • test.data
2 +
9 -
0 +
5 -

結果は以下のようになり 0,5は確率0.5でどちらともいえない結果になった

# 0.129962
2	+	+/0.784576	+/0.784576	-/0.215424
9	-	-/0.662584	+/0.337416	-/0.662584
0	+	+/0.500000	+/0.500000	-/0.500000
5	-	+/0.500000	+/0.500000	-/0.500000

CRF++は数値データの補完が出来ないことを確認した