# treetrans: 構文木変換ツール

English version

構文木をパターンルールを使って変換するツールです．

treetrans [オプション] ルールモジュール 入力ファイル 出力データベース
ルールモジュール | 構文木を変換するパターンルールがかかれた lilfes file
入力ファイル | 入力の treebank (テキスト形式)
出力データベース | 出力の treebank (lildb 形式)
オプション
-v | デバッグ用メッセージを表示します．
-vv | デバッグ用メッセージをたくさん表示します．

一行に一つの構文木が書かれたテキストファイルを入力とし，構文木変換ルー ルを各入力木に適用し，その結果を lildb 形式のデータベースに格納します．

## 構文木の入力の仕方

treetrans は，'input_parse_tree/2' を呼び出すことでテキストファイルか ら構文木を読み込みます．'input_parse_tree/2' は treetrans のインタフェー スとして"treetrans.lil" で型定義されていますが，中身は実装されていない ので，文法開発者が実装してください．'input_parse_tree/2' の第一引数に は入力ファイルの一行が渡され，第二引数に構文木が返されることを想定して います．構文木は，"treetypes.lil" で定義されている型で記述します．

`input_parse_tree(+$String, -$Tree)`
`+$String` | 入力ファイルの行
`-$Tree` | 構文木
入力ファイルの各行から構文木を読み込みます

入力ファイルが Penn Treebank 形式の場合は，"treeio.lil" で実装されてい る 'input_ptb_parse_tree/2' が利用できます．'input_ptb_parse_tree/2' を利用するには，"treeio.lil" で定義されている以下のインタフェースを実 装する必要があります．

`ptb_empty_category(-$Category)`
`-$Category` | 空範疇とみなす SYM の値
構文木の中で空範疇とみなす非終端記号を指定します． SYM は "treetypes.lil" で定義されている素性です．

`ptb_preprocess_word(+$Input, -$Output)`
`+$Input` | 入力単語
`-$Output` | 前処理をかけた結果
入力単語に前処理をかけます．特殊文字をエスケープした り，全て小文字に変換したりします．

`ptb_preprocess_pos(+$Input, -$Output)`
`+$Input` | 入力品詞
`-$Output` | 前処理をかけた結果
入力品詞に前処理をかけます．

`ptb_delete_pos(-$POS)`
`-$POS` | 品詞
構文木の中で無視する品詞を指定します．この品詞のノー ドのみを持つ非終端記号も無視されます．$POS には ptb_preprocess_pos/2 の結果を渡します．

これらを実装した上で，'input_parse_tree/2' から 'input_ptb_parse_tree/2' を呼び出してください．例えば以下のように使い ます．

>     ptb_empty_category("-NONE-").
>     ptb_preprocess_word($In, $Out) :- to_lower($In, $Out).
>     ptb_preprocess_pos($POS, $POS).
>     ptb_delete_pos(".").
>     ptb_delete_pos("""").
>     input_parse_tree($String, $Tree) :-
>         input_ptb_parse_tree($String, $Tree).

入力ファイルが Penn Treebank 形式でない場合は，自分で 'input_parse_tree/2' を実装してください．

## 構文木変換ルールの書き方

構文木変換は，以下のステップで行われます．

- 構文木の前処理
- パターンルールによる変換
- ステミング

まず，以下のインタフェースを用いて，構文木を入力する時(パターンルール を適用する前)に構文木を整形することができます．

`delete_tree(+$Tree)`
`+$Tree` | 構文木の部分木
+$Tree と unifiable な部分木を削除します．

`nonterminal_mapping(+$InSym, -$OutSym)`
`+$InSym` | 入力の nonterminal symbol
`-$OutSym` | 出力の nonterminal symbol
nonterminal symbol $InSym を $OutSym に変換します．

`preterminal_mapping(+$InSurface, +$InSym, -$OutSurface, -$OutSym)`
`+$InSurface` | 入力の単語(surface form)
`+$InSym` | 入力の nonterminal symbol
`-$OutSurface` | 出力の単語(surface form)
`-$OutSym` | 出力の nonterminal symbol
単語 $InSurface/$InSym を $OutSurface/$OutSym に変換します．

`preterminal_projection(+$InSym, -$NewSym)`
`+$InSym` | preterminal symbol
`-$NewSym` | nonterminal symbol
preterminal $InSym の直上に，nonterminal symbol $NewSym を加えます．

パターンルールは，treetrans.lil で定義されているインタフェースを用いて， lilfes プログラムで記述します．構文木は，treetypes.lil で定義されてい る素性構造で表現されます．例えば，以下の例では，(... than/IN XXX) とい う木を，(... (PP than/IN XXX:argument)) という木に変換します．

>     tree_transform_class("than", "topdown", "weak").

>     tree_subst_pattern("than",
>                        TREE_NODE\$Node & TREE_DTRS\$Dtrs,
>                        TREE_NODE\$Node & TREE_DTRS\$NewDtrs) :-
>         $Dtrs = [$Left & tree_any & ANY_TREES\[_|_],
>                  $Than & tree & TREE_NODE\(SYM\"IN" & WORD\SURFACE\"than"),
>                  $Right & tree & TREE_NODE\HEAD_MARK\argument],
>         $NewDtrs = [$Left,
>                     TREE_NODE\(SYM\"PP" & MOD\[] & ID\[] & HEAD_MARK\modifier) &
>                     TREE_DTRS\[$Than, $Right]].

まず，`tree_transform_class/3` で変換ルールの名前，適用順序，適 用失敗したときのふるまいを指定します．

`tree_transform_class(+$Name, +$Direction, +$Strict)`
`+$Name` | 変換ルールの名前

`+$Direction`

変換ルールの適用順序

- "topdown": 上から下へ適用する
- "bottomup": 下から上へ適用する
- "rootonly": 構文木の根にだけ適用する

`+$Strict`

失敗したときの振舞い

- "strict": 適用失敗したら，構文木の変換を失敗させる
- "weak": 適用失敗しても無視して次のルールに行く

次に，以下のようなインタフェースを用いて変換ルールを記述します．全ての インタフェースにおいて，第一引数は上で指定した変換ルール名です． `treetrans`プログラムは，tree_transform_class/3 で指定された適用 順序にしたがって，構文木の各ノードをトラバースし，変換ルールを適用しま す．

`tree_ignore(+$Name, ?$Tree)`
`+$Name` | ルール名
`+$Tree` | tree: 構文木
+$Tree と unifiable な木を取り除きます．

`tree_transform_rule(+$Name, +$InTree, -$OutTree)`
`+$Name` | ルール名
`+$InTree` | tree: 入力構文木
`-$OutTree` | tree: 出力構文木
$InTree を $OutTree に変換します．

`tree_subst_pattern(+$Name, +$InPattern, +$OutPattern)`
`+$Name` | ルール名
`+$InTree` | tree: 入力木のパターン
`+$OutTree` | tree: 出力木のパターン
$InTree に tree_match/2 でマッチする木を， $OutPattern のパターンに変換します．

`tree_unify(+$Name, ?$Tree)`
`+$Name` | ルール名
`+$Tree` | tree: 構文木
$Tree を構文木に unify します．

`tree_match_pattern(+$Name, +$Pattern)`
`+$Name` | ルール名
`+$Tree` | tree: 構文木パターン
$Pattern を構文木に unify します．

変換ルールは，`tree_transform_class/3`で定義された順番で適用されます． 各変換ルールでは`tree_ignore/2, tree_transform_rule/3, tree_subst_pattern/3, tree_unify/2, tree_match_pattern/2` の順番で 適用が試みられ，ひとつの適用が成功するとあとは適用されません．

変換ルールの中で，tree_binarize/2 (構文木を二分木化する．binarizer.lilで定義されている) や mark_head/1, mark_modifier/1 (それぞれ，head マークや， modifier/argument マークをつける．markhead.lilで定義されている) など のツールを使うこともできます．

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