# forestmaker: feature forest モデル作成ツール

English version

feature forest model のイベントファイルを作るツールです．

forestmaker モデル名 文法モジュール derivbank イベントファイル
モデル名 | 確率モデルの名前(構文解析の時にも使います)
文法モジュール | 文法およびイベント抽出 predicate が実装されている lilfes module
derivbank | 文法獲得で得た derivbank (lildb 形式)
イベントファイル | unfiltered event を出力するファイル (テキスト形式または gz/bz による圧縮形式)
オプション
-r ファイル名 | reference distribution を出力するファイル名
-n 閾値 | イベントを抽出する文の数
-v | デバッグ用メッセージを表示します．
-vv | デバッグ用メッセージをたくさん表示します．

確率モデルの名前は，一つのイベントファイルに対して一つ割り当てます．違 う名前を割り当てれば，複数のイベントファイルを同時に用いることができま す．例えば，feature forest model の reference distribution として unigram model を使うときは，それぞれのモデルに対して別のモデル名を割り 当てます．

文法および derivbank を入力として，derivation の確率の最大エントロピー モデルを作成するためのツールです．このツールでは，確率モデルの学習に必 要な unfiltered event を作成します．

unfiltered event とは，以下のように // で区切られたフィールドを持つ文 字列です．

>     SUBJ//plays//VBZ//[npVPnp]//haag//NNP//[NP]_2//binary

最後のフィールド(binary)はこのイベントのカテゴリを表していま す．カテゴリは，後のステップでこのイベント形式にマスクをかける時などに 利用します．カテゴリが同じイベントに対しては同じマスクをかけるので， フィールドの数が同じである必要があります．つまり，フィールドの数が違う イベントを使いたい時は，カテゴリ名を分けて下さい．例えば，binary ルー ルと unary ルールではフィールドの数が異なるので，別々のカテゴリ名を使 います．

各 unfiltered event は，一文の derivation forest を，feature forest 形 式で表したものです．トレーニングデータ(derivbank)の各文に対して derivation forest を作る必要があるため，全ての文を構文解析し，結果の derivation forest の各ノードに対して確率イベントを取りだしてファイルに 出力します．従って，構文解析を行なうためのインタフェースと，確率イベン トを取りだすためのインタフェースを実装する必要があります．

まず，構文解析を行なうためには，UP で定義されているインタフェース (id_schema_binary など)を実装します．詳しくは文法の使い方やUPの マニュアルを参照してください．

それに加えて，`sentence_to_word_lattice/2`と `lexical_entry/2`の代わりに，"mayz/forestmake.lil" で定義されて いる以下のインタフェースを実装してください．

`fm_derivation_to_word_lattice(+$Derivation, -$WordLattice)`
$Derivation | derivation
$WordLattice | word lattice (extent のリスト)
derivation から word lattice を作ります．

`fm_lexical_entry(+$Lex, -$LexName)`
$Lex | 入力単語とそれに割り当てられるテンプレートの名前(lex_entry)
$LexName | LEX_NAME (lexical_entry/2 の第２引数)
単語に割り当てる語彙項目を返します．

これらの述語は，`sentence_to_word_lattice/2`や `lexical_entry/2`と全く同じものを返してもよいですが，正解の構造 が与えられるので，それを利用することもできます．例えば， `fm_lexical_entry/2`では正解の語彙項目テンプレートの名前が入力 として与えられるので，正解の語彙項目と，確率値の高い語彙項目のみを返す (つまり確率値の低い語彙項目は足切りする)ようにすれば，構文解析コストが 減るので，イベントファイルを作る時間が節約できます．derivation forest は正解の木を含んでいる必要があるので正解の語彙項目を必ず返さなければな らないことに注意してください．

また，正解の構文木を作るために，以下のインタフェースを実装してください． 正解の構文木を作るには derivbank の各 derivation が使われますが，終端ノー ドに対応する語彙項目を以下のインタフェースで与える必要があります．

`fm_correct_lexical_entry(+$Term, -$LexName)`
$Term | derivation の終端ノード(derivation_terminal)
$LexName | LEX_NAME (lexical_entry/2 の第２引数)
derivation の終端ノードに対応する語彙項目を返します．

次に，確率イベントを取りだすインタフェース("mayz/amismodel.lil" で定義 されている)を実装します．以下のインタフェースでは，derivation forest の各ノードから確率イベントを文字列リストの形で取りだします． `forestmaker`は，derivation forest のそれぞれのノードについてこ れらの述語を呼び出し，結果を feature forest 形式でイベントファイルに出 力します．

`extract_terminal_event(+$ModelName, -$Category, +$LexName, +$Sign, +$SignPlus, -$Event)`
$ModelName | 確率モデルの名前
$Category | カテゴリ名
$LexName | LEX_NAME (lexical_entry/2 の第２引数)
$Sign | 語彙項目
$SignPlus | SIGN_PLUS (reduce_sign/3 の第３引数)
$Event | イベントを表す文字列リスト
終端ノードのイベントを取りだします．

`extract_unary_event(+$ModelName, -$Category, +$SchemaName, +$Dtr, +$Mother, +$SignPlus, -$Event)`
$ModelName | 確率モデルの名前
$Category | カテゴリ名
$SchemaName | スキーマの名前
$Dtr | 娘の素性構造
$Mother | 親の素性構造
$SignPlus | SIGN_PLUS (reduce_sign/3 の第３引数)
$Event | イベントを表す文字列リスト
Unary ルールのイベントを取りだします．

`extract_binary_event(+$ModelName, -$Category, +$SchemaName, +$LeftDtr, +$RightDtr, +$Mother, +$SignPlus, -$Event)`
$ModelName | 確率モデルの名前
$Category | カテゴリ名
$SchemaName | スキーマの名前
$LeftDtr | 左の娘の素性構造
$RightDtr | 右の娘の素性構造
$Mother | 親の素性構造
$SignPlus | SIGN_PLUS (reduce_sign/3 の第３引数)
$Event | イベントを表す文字列リスト
Binary ルールのイベントを取りだします．

`extract_root_event(+$ModelName, -$Category, +$Sign, -$Event)`
$ModelName | 確率モデルの名前
$Category | カテゴリ名
$Sign | ルートノードの素性構造
$Event | イベントを表す文字列リスト
ルートノードのイベントを取りだします．

確率モデルの名前は，`forestmaker`の第一引数で与えたものと同じも のを指定してください．

それぞれのインタフェースには，素性関数の値(integer または float)を指定 できる形式もあります．最後の引数に素性関数の値を指定して下さい．

- `extract_terminal_event_feature_value/7`
- `extract_unary_event_feature_value/8`
- `extract_binary_event_feature_value/9`
- `extract_root_event_feature_value/5`

`forestmaker`は，reference distribution を使ったイベントファイ ルを作ることもできます．reference distribution を出力するファイルの名 前を -r オプションで指定し，以下のインタフェースを実装してください．

`reference_prob_terminal(+$ModelName, +$LexName, +$Sign, +$SignPlus, -$Prob)`
$ModelName | 確率モデルの名前
$LexName | LEX_NAME (lexical_entry/3 の第２引数)
$Sign | 語彙項目の素性構造
$SignPlus | SIGN_PLUS (reduce_sign/3 の第３引数)
$Prob | 終端ノードの reference probability
終端ノードの reference probability を返します．

`reference_prob_unary(+$ModelName, +$SchemaName, +$Dtr, +$Mother, +$SignPlus, -$Prob)`
$ModelName | 確率モデルの名前
$SchemaName | スキーマの名前
$Dtr | 娘の素性構造
$Mother | 親の素性構造
$SignPlus | SIGN_PLUS (reduce_sign/3 の第３引数)
$Prob | reference probability
Unary ルールの reference probability を返します．

`reference_prob_binary(+$ModelName, +$SchemaName, +$LeftDtr, +$RightDtr, +$Mother, +$SignPlus, -$Prob)`
$ModelName | 確率モデルの名前
$SchemaName | スキーマの名前
$LeftDtr | 左の娘の素性構造
$RightDtr | 右の娘の素性構造
$Mother | 親の素性構造
$SignPlus | SIGN_PLUS (reduce_sign/3 の第３引数)
$Prob | reference probability
Binary ルールの reference probability を返します．

`reference_prob_root(+$ModelName, +$Sign, -$Prob)`
$ModelName | 確率モデルの名前
$Sign | ルートノードの素性構造
$Prob | reference probability
ルートノードの reference probability を返します．

MAYZツールキットマニュアル MAYZホームページ 辻井研究室