$Id: index.html,v 1.10 2001/07/08 16:13:33 taku-ku Exp $;
YamCha は, Support Vector Machines に基づく汎用的な Chunker です. Chunker とは言っても, Chunking (Chunk 同定)を Tagging (Tag 付与)とみなすため, 一般的な Tagger として利用することも可能です.
Chunking (Chunk 同定問題)とは, 自然言語処理において, 最も基本的な処理の 1つとして認識されています. 簡単に言えば, 「与えらえた文を適当な解析単位に分割し, その分割した各要素に名前を付与する.」 という一連の処理のことを指します. 実際に, 多くの処理が Chunking の範疇に入ります. 例えば, 文節切り, 英語の基本句同定(Base Phrase Chunking), 形態素解析, わかち書き, 固有名詞抽出 などがあります. YamChaは, Support Vector Machines を学習アルゴリズムとし, 統一的な枠組でこれらの処理を行います.
解析精度に関して言えば, BaseNP Chunking において 2001年 6月現在 最も高い精度を示しています. また, 2000年 9月に行なわれた, CoNLL2000 Shared Task, Chnking においては, 11チーム中 1位の成績を修めています.
% ./configure % make % make check % su # make install
学習/テストデータは, 複数のトークンと複数のカラム から構成されます.
各行は, 入力のトークンに対応します. トークンは, 各タスクに より定義が変わりますが, 一般に「単語」と考えて構いません. これらのトークンの連続が一つの「文」に相当します.
また, それぞれのカラムが, 各トークンに付与された属性です. たとえば, 1カラムは, 語彙, 2カラムは品詞, 3カラムは 細分類 などが考えられます. 各カラムは, タブまたはスペースで区切られている必要があります. カラムの数には制限はありません. つまり, 各トークンに付与する属性の数は何個でも構いません. しかし, 必ず固定長にする必要があります. 属性が定義できない場合は, ダミーの属性を付与するなどして対処してください.
推定(学習)すべきタグは, 最後のカラムに与えます.
テストデータには, 必須ではありません.
文と文の境界は, EOS と記述した行のみ, もしくは空行を付与することで同定します.
以下は, 学習データの例です. (CoNLL shared task で使用されたフォーマット)
He PRP B-NP reckons VBZ B-VP the DT B-NP current JJ I-NP account NN I-NP deficit NN I-NP will MD B-VP narrow VB I-VP to TO B-PP only RB B-NP # # I-NP 1.8 CD I-NP billion CD I-NP in IN B-PP September NNP B-NP . . O EOS He PRP B-NP reckons VBZ B-VP
1カラム目が語彙, 2カラム目が 品詞であり, それに対し, 3 カラム目に Base Phrase を示す tag が付与されています. この場合は, 1,2カラムの情報から, 3カラム目のタグを推定するというタスク (= Base Phrase Chunking)になります. Base Phrase Chunking についての詳細は, ここ をご覧ください.
以下のようなデータは, 2,3番目のトークンのカラムの数が 2となってるため, エラーとなります. カラムの数は必ず固定長にしてください.
He PRP B-NP reckons B-VP the B-NP current JJ I-NP account NN I-NP ..
以下は, 文節区切りタスクにおける学習データの例です.
見出し語 品詞1 品詞2 活用型 活用形 B-Iタグ
が各カラムに対応します. 活用等が無い場合は, "*" というダミーを導入しています.
自動 名詞 普通名詞 * * B 獲得 名詞 サ変名詞 * * I する 動詞 * サ変動詞 基本形 I 研究 名詞 サ変名詞 * * B を 助詞 格助詞 * * I 行なって 動詞 * 子音動詞ワ行 タ系連用テ形 B いる 接尾辞 動詞性接尾辞 母音動詞 基本形 I . 特殊 句点 * * I EOS
学習済みモデルは, アーキテクチャ非依存の text 形式で配布されています.
(2001年 7月現在 公開されてるモデルはありません. 逐次公開していく予定です.)
YamCha は, アーキテクチャ依存の binary 形式に変換したモデルを使用します.
ここでは, gzip で圧縮された text 形式 のファイル名を, foo.txtmodel.gz とし, 説明します. まず, yamcha-config を --libexecdir という オプション で起動し, libexec の ディレクトリを表示させます. その後, そのディレクトリにある mkmodel を実行して, モデルをコンパイルします.
% yamcha-config --libexecdir /usr/local/libexec/yamcha % /usr/local/libexec/yamcha/mkmodel foo.txtmodel.gz foo.model
text 形式のモデルをいったんすべてメモリ上に展開するため, 多くのメモリを消費します.
あとは, yamcha に -m オプションで, このモデルを与え, ここで説明したフォーマットのテストデータを 標準入力 (もしくは引数)に与えます.
% yamcha -m foo.model < TEST
例として, Base NP chunking をとりあげます. (詳細はこちら)
このような学習データを想定します. 1カラム目が語彙, 2カラム目が 品詞であり, それに対し, 3 カラム目に Base Noun Phrase を示す IOB tag が付与されています. (IOB2 による表現).
まず, yamcha-config を --libexecdir という オプション で起動し, libexec の ディレクトリを表示させます. そのディレクトリにある Makefile を利用し, 学習を行ないます.
% yamcha-config --libexecdir /usr/local/libexec/yamcha % make -f /usr/local/libexec/yamcha/Makefile CORPUS=train.data MODEL=case_study train /usr/bin/yamcha -F'F:-2..2:0.. T:-2..-1' < train.data > case_study.data perl -w /usr/local/libexec/yamcha/mkparam case_study < case_study.data perl -w /usr/local/libexec/yamcha/mksvmdata case_study .. 略
Makefile に与える時の必須パラメータとしてCORPUSと MODELがあります.
CORPUSは, ここで説明したフォーマットで
記述された学習データのファイルで, MODELは,
学習後に作成されるモデルファイルや, 各種中間ファイルの prefix となります.
上記の例では, CORPUSに train.data を, MODELに case_studyを指定しています.
学習後に, 下記のファイルが生成されます
% ls case_study.* case_study.log : 学習過程のログ case_study.model : バイナリ形式のモデル (アーキテクチャ依存) case_study.se : Support Example case_study.svmdata : 変換後の学習にデータ case_study.txtmodel.gz : テキスト形式のモデル (アーキテクチャ非依存)
case_study.txtmodel.gz は, バイナリ形式に変換することができます. (ここ参照)
実際に, こんなテストデータを解析してみましょう.
% yamcha -m case_study.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 said VBD O O ...
最後のカラムが, 推定されたタグです.
3番目が正解のタグですから, この場合, 3番目と4番目を比較すれば, 評価が行なえます.
make 時のパラメータ DIRECTIONを -Bと指定すれば, 解析方向を, 後ろ向きに変更できます. この情報は, モデルの中に 埋めこまれるでの, 解析時には, 解析方向を改めて指定する 必要はありません. 前向き, 後ろ向き解析の詳細は, 論文をご覧ください.
% make -f /usr/local/libexec/yamcha/Makefile CORPUS=train.data \\ MODEL=case_study DIRECTION="-B" train
デフォルトの素性としては, 前後2つのすべてのカラムの情報, 自分自身のすべてのカラムの情報, 前2つのタグ(これは解析時には動的に 追加)が使用されてます.
素性は, make 時のパラメータ FEATURE
を使う事で, 変更することができます.
デフォルトは "F:-2..2:0.. T:-2..-1"です.
この表現は, 以下の図において,
「赤い枠のタグを推定するのに, 青い枠の素性を使用する」
という意味と同値です.
F:左文脈開始位置..右文脈終了位置:カラム開始位置..カラム終了位置 T:タグ左文脈開始位置..タグ左文脈終了位置
というフォーマットで記述します.
まずは, 静的素性 F: の説明です.
図中において, -2 .. +2 の範囲の窓 (window)を考慮するため,
左文脈開始位置は -2, 右文脈終了位置は +2 となります.
また, それぞれ, カラム 0, 1 を素性として考慮しているので,
カラム開始位置は, 0, カラム終了位置とは 1 となります.
カラム終了位置は, 省略可能で, 省略すると
最後のカラムの番号となります. (注意:タグのカラムは考えません.)
これらから 静的素性は, "F:-2..2:0..1" となります.
(この場合, "F:-2..2:0.."としても構いません.)
次に, 動的素性 T: の説明です.
動的素性は, 推定されたタグそのものを動的にフィードバックしながら追
加していく素性のことです.
図中において, -2 から -1 の位置の素性が追加されているため,
タグ左文脈開始位置は, -2, タグ左文脈修了位置 は, -1 となります.
これらから動的素性は, "T:-2..-1" となります.
注意点:
* 動的素性は, 解析を行ないながら追加していくため,
タグ左文脈開始終了位置は必ず -1 以下でなければなりません.
* 解析方向を逆向きに設定した場合,
「青い枠の位置は変えず, 元のコーパスが逆方向に入力する」
と考えてください. つまり, T:-2..-1 と指定すると,
後ろ 2 つのタグが素性として追加されます.
* F,T は繰り返し何回も使えます. 個々の表現で重複があっても, ひとつにまとめられます.
% make -f /usr/local/libexec/yamcha/Makefile CORPUS=train.data \\ MODEL=case_study FEATURE="F:-3..3:0.. T:-3..-1" train
いろいろな例
![]() F:-3..3:0.. T:-3..-1 |
![]() F:-2..2:1..1 F:0..0:0..1 T:-1..-1 |
![]() F:-3..-2:0.. F:0..0:0.. F:2..3:0.. T:-3..-2 |
![]() F:-3..-2:1..1 F:-1..0:0..0 F:2..3:1..1 T:-3..-1 |
make 時のパラメータ SVM_PARAMにより, SVM の学習条件を制御できます.
デフォルトは, "-t1 -d2 -c1" です.
2次の polynomial kernel, slack 変数 1という意味です.
YamChaは, polynomial kernel 以外の kernel はサポートしません.
% make -f /usr/local/libexec/yamcha/Makefile CORPUS=train.data \\ MODEL=case_study SVM_PARAM="-t1 -d3 -c1" train
-f オプション で, 出力フォーマットを変更できます.
-f 0: 推定されたタグのみを出力 (デフォルト)
-f 1: 推定されたタグとそのスコアを表示
-f 2: 推定されたタグと, すべての候補に対するスコアを表示
% yamcha -f0 -m case_study.model < test.data Rockwell NNP B B International NNP I I Corp. NNP I I 's POS B B # スコア/全候補のスコアの和 % yamcha -f1 -m case_study.model Rockwell NNP B B 1.6073/2.12283 International NNP I I 1.47421/1.53285 Corp. NNP I I 1.36632/1.62572 's POS B B 1.12317/1.18013 # タグ/そのタグのスコア % yamcha -f2 -m case_study.model < test.dat Rockwell NNP B B B/1.6073 I/0 O/0.515531 International NNP I I B/0 I/1.47421 O/0.0586355 Corp. NNP I I B/0 I/1.36632 O/0.259397 's POS B B B/1.12317 I/0 O/0.0569625
例えば, IOB モデルにおいて, あるトークンは, O になりえない事が, prior で分かると, B/I のみから推定させたくなります. このような場合, -C オプション を使い, テストデータに推定すべきタグの候補を指定することができます.
例えば, 1行目は, B のみの1つから, 2 行目は, B/I の2つから推定したい場合は,
Rockwell NNP B International NNP B I
とします. つまり, 候補のタグを, 3行目以降に羅列するだけです.
あとは, このファイルを -C オプション付きで解析させます.
% yamcha -C -m case_study.model < test.data
注意点は, -C オプションを付与する場合と付与しない場合とで, テストデータフォーマットの解釈が変わることです. 付与した場合は, 最後の列のタグ以降は, 推定すべき候補として解釈されますが, 付しない場合は, それらのタグは無視されます.
$Id: index.html,v 1.10 2001/07/08 16:13:33 taku-ku Exp $;
taku-ku@is.aist-nara.ac.jp