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ホームページ
辻井研究室
MIYAO Yusuke (yusuke@is.s.u-tokyo.ac.jp)