« | »

2011.08.11

CRFsuite 0.12 released

CRFsuiteのバージョン0.12をリリースしました.このバージョンは変更点がてんこ盛りです.張り切りすぎたせいで,ドキュメントの更新に手間取り,コードが出来てからリリースまで1年くらい経過してしまいました.変更点はChangeLogの通りですが,このブログではいくつか補足しながら紹介します.

ソースコードの大がかりな再構成を行いました.特に,グラフィカルモデルの処理に関する部分(対数尤度や勾配の計算など)と,学習アルゴリズムに関する部分を分離しました.今回のソースコードの再構成により,新しい学習アルゴリズムの追加や,異なる形状のグラフィカルモデル(例えば属性とラベルバイグラムに対する素性や二次マルコフ素性)を追加しやすくしました.ソースコードの再構成をやるモチベーションは前々からあったのですが,@yuutatさんの「Fast Newton-CG Method for Batch Learning of Conditional Random Fields」の研究に混ぜて頂いたのをきっかけに,コードの大がかりな修正を行いました.新しいグラフィカルモデルを追加したり,ヘッシアン・ベクトル積のDPによる計算を追加することには,まだ未着手ですが,そのための基礎を固めました.

ソースコードを綺麗にしたついでに,平均化パーセプトロンPassive-AggressiveAdaptive Regularization of Weights (AROW) の学習アルゴリズムを追加しました.学習アルゴリズムは,-aオプションで指定することになりました.学習アルゴリズム毎のパラメータの一覧は,-Hオプションで見ることができます.

ソースコードの見直しを行っているときに,「あー昔は理解が足りず無駄な計算をしているなぁ」と思うところがいくつかあったので,その部分を修正しました.日記で書いていたSSEのexp計算ルーチンも取り込まれています.これらの修正により,だいたい1.4~1.5倍速くなりました.新しいベンチマーク結果を載せておきました.

系列の開始(BOS)と終了(EOS)の素性を自動的に生成するのを廃止しました.以前のCRFsuiteでは,BOS,EOSという特殊なステートを定義し,そのステートから各ラベルへの遷移素性(バイグラム素性)を作っていました.考えてみたら,系列の先頭と末尾にEOS/BOSを表す属性を追加すれば十分だったので,BOS/EOSに対する特殊なコードを削除しました.BOS/EOS素性を作りたいときは,各インスタンスの先頭と末尾のアイテムに,”__BOS__”や”__EOS__”みたいな属性を追加してください.

いくつかの学習パラメータの名前が変更になりました.重要なところでは,”regularization.sigma”が”c1″及び”c2″になりました(c1 = 1.0 / regularization.sigma; c2 = 0.5 / regularization.sigma^2).これにより,L1正則化,L2正則化が同時に使えるようになりました.L1正則化,L2正則化をOFFにするときは,それぞれ”c1″,”c2″を0にセットしてください(sigmaによる設定だと無限大にする必要があったので,cによる設定に変更しました).

交差検定(cross-validation)やテストセットによる評価(holdout-evaluation)を,データセットにグループ番号を割り振ることで実装しました.学習と同時にテストセットで評価を行うには,複数のデータセットをCRFsuiteに入力し,どのデータセットで評価を行うのか,グループ番号を指定します.交差検定を行うときは,N個のデータセットを明示的に与えるか,-gオプションを使い入力されたデータセットを自動的にN分割すればOKです.

データセットのフォーマットに関するドキュメントを書きました.データフォーマットはCRFsuiteの特徴の一つでもあるのですが,ユーザからの質問が多いので,きちんと書くことにしました.

これまでは,#でコメントを書くことを許していたのですが,自然言語のテキストから属性を作るときにうっかりと”#”を使ってしまうトラブルが起きそうなので,廃止しました.

予測されたラベル系列の条件付き確率(-pオプション)や,各ラベルの周辺確率(-iオプション)を出力できるようにしました.これらの機能には多くの要望が寄せられました.

CRFsuiteのC言語APIを大幅に改訂しました.ライブラリの名前はlibcrfからlibcrfsuiteに変更になりました.ライブラリが公開している関数名は,”crfsuite_”という文字列から始まるようになりました.C言語のAPIドキュメントを書きました.

CRFsuiteのライブラリを簡単に使うために,C++のラッパー(crfsuite_api.hppcrfsuite.hpp)を書きました(C++/SWIGのAPIドキュメント).さらに,C++のAPIをSWIGを経由して他の言語から呼び出せるようにしました.手始めにPythonのモジュールを構築し,学習とタグ付けがPythonから行えるようになりました.モジュールのビルド方法はREADMEを参照してください.

CRFsuiteに与えるデータセットを生成するためのサンプルスクリプトを改良しました.チャンキングのサンプル(chunking.py)は,わかりやすい属性名を出力するようになりました.また,CRFsuiteのPythonモジュールを利用して直接タグ付けを行う機能も実装されました.CRF++互換のテンプレートを処理するためのスクリプト(template.py)を追加しました.その他,固有表現抽出(ner.py),品詞タグ付け(pos.py)のサンプルも追加しました.これらのサンプルを改変するだけで,CRFsuiteを新しいタスクに適用できると思います.

メモリリークを何点か修正し,メモリ使用量を若干削減しました.

モデルファイルが存在しないときに落ちる問題を修正しました.

Trackback URL

Comment & Trackback

0.12リリースおめでとうございます。
早速ダウンロードしました。

勉強不足で変な質問かもしれませんが、CRFはRegression問題にも利用可能でしょうか?

CRFでregressionというのは聞いたことがないですね.
おそらくサンティさんの目的だと,時系列予測をやる方がよいと思います.

Good afternoon, PhD Naoaki Okazaki!
I’m from Vietnam, currently i’m studing about natural language
processing, and i have downloaded CRFsuite (a fast implementation of Conditional Random Fields (CRFs) (Win32 binary) from your website for my studying. But i dont know how to read information
from model file which is created by CRF model.
Could you help me how to do this?
Thanks so much
i’m looking forward to you respone!

Why do you have to ‘read’ the model created by CRFsuite?
You can simply use it for tagging.

Naoaki

i dont know how to tag for a data by using the model created by
CRFsuite. That’s reason why i want read the model.

my input data file is a text which is analyzed features but it don’t
contain labels which i’m studing. So, how to use the model which
i have trained in order to bring labels into my input data file. Will i have to read the model created by CRFsuite?

i’m looking forward to receiving your guidance so that I can solve
this problem

Please read the tutorial.

i really want to read weight of a feature which is stored in the model
file in order to i can use trained features for my studing.

Are you sure that you read the tutorial? This document appears to answer all of your questions so far; you can use “dump” to see feature weights.

As an open-source developer, I will answer to a specific question or problem in the implementation and documentation, but don’t have time to give usage instructions step by step for your purpose. Your question looks very vague to me; I’m not sure of whether you want to tag unlabeled instances or read the model. Anyway, these features are mentioned in the tutorial.

Thanks for understanding.
Naoaki

thanks for your guidance!

i know that i can use “dump” to see feature weights, and these
feature weights are so important to to identify any text if the text
has been analyzed the characteristics first.

So, if the model is stored in binary format, it’s too difficult to using
semi-supervised trainning process. That’s main reason why i want to know structure of the model file in order to read feature weights

i’m looking forward to you respone!

could you tell me what mean of transition and state_feature in crf
model

Comment feed

Comment





XHTML: You can use these tags:
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>