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)
+$InSympreterminal symbol
-$NewSymnonterminal 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ルール名
+$Treetree: 構文木
+$Tree と unifiable な木を取り除きます.
tree_transform_rule(+$Name, +$InTree, -$OutTree)
+$Nameルール名
+$InTreetree: 入力構文木
-$OutTreetree: 出力構文木
$InTree を $OutTree に変換します.
tree_subst_pattern(+$Name, +$InPattern, +$OutPattern)
+$Nameルール名
+$InTreetree: 入力木のパターン
+$OutTreetree: 出力木のパターン
$InTree に tree_match/2 でマッチする木を, $OutPattern のパターンに変換します.
tree_unify(+$Name, ?$Tree)
+$Nameルール名
+$Treetree: 構文木
$Tree を構文木に unify します.
tree_match_pattern(+$Name, +$Pattern)
+$Nameルール名
+$Treetree: 構文木パターン
$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ホームページ 辻井研究室
MIYAO Yusuke (yusuke@is.s.u-tokyo.ac.jp)