CRF++
CRF++の使い方などのまとめ
CRFの原理
- CRFがよくわからなくてお腹が痛くなってしまう人のための30分でわかるCRFのはなし http://d.hatena.ne.jp/echizen_tm/20111206/1323180144
- 条件付き確率場(CRF)メモ http://d.hatena.ne.jp/jetbead/20110929/1317253922
- 条件付き確率場の推論と学習 http://www.slideshare.net/rezoolab/seminar-19715143
- Computer Visionの話などもあるスライド
- How Conditional Random Fields and Logistic Regression could be the same? http://stats.stackexchange.com/questions/63826/how-conditional-random-fields-and-logistic-regression-could-be-the-same
CRF++の使い方解説
CRF 応用
- CRF を使った Web 本文抽出 http://www.slideshare.net/shuyo/crf-web
- いろいろ論文紹介 http://d.hatena.ne.jp/n_shuyo/20100716/nlp
CRF++以外のCRF実装
- CRFsuite http://www.chokkan.org/software/#id492076
- CRF++と同じくC++で実装されている。CRF++と異なり最適化を liblbfgs http://www.chokkan.org/software/liblbfgs/ で行う(CRF++は最適化部分が分離していない)。L1ノルム正規化にはlbfgssではなくlbfgs-bが必要なはずなので、L2ノルムしかできないようだ?CRF++はL1ノルムも扱える
- 可変次数 Linear-Chain CRF http://vocrf.net/index_ja.html
- CRFsuiteをさらに改造したものなようだ github : https://github.com/hiroshi-manabe/crfsuite-variableorder
- conditional random fields package for R http://stackoverflow.com/questions/6524232/conditional-random-fields-package-for-r
- http://crf.sourceforge.net/
- FlexCRFs http://flexcrfs.sourceforge.net/ C++実装。並列計算できる
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++は数値データの補完が出来ないことを確認した