便利な LiLFeS モジュール
English version
既に説明したツールに加えて,文法開発を支援するための LiLFeS プログラム
がいくつか提供されています.これらは,lilfes から読みこんだり(-l オプ
ションで指定する),パーザから読みこんだりすることにより,利用すること
が出来ます.
- 文法開発に使うモジュール
- 構文解析に使うモジュール
- 文法開発や構文解析の様子を観察する
- 構文解析器をアプリケーションで使う
"mayz/markhead.lil" は,構文木の各ノードに head, argument, modifier の
マークをつけるためのプログラムです.マークをつけるルールを指定するため
のインタフェースを実装すると,構文木へ自動的にマークをつけてくれます.
head マークをつけるためのインタフェースは以下の3つです.最初の2つは
MOD 素性の値を,もう一つは SYM 素性の値を見て head を決めます.
| head_tag(+$Tag)
|
| MOD 素性の中に $Tag があると,そのノードは head マー
クにします.
|
| nonhead_tag(+$Tag)
|
| MOD 素性の中に $Tag があると,そのノードは head マー
クにしません.modifier か argument かは別のルールで決められます.
|
| head_table(+$Sym, +$Dir, +$SymList)
|
| $Sym | 親のシンボル
|
| $Dir | head をサーチする方向("left" か "right")
|
| $SymList | head マークをつけるシンボルのリスト
|
| 親のシンボルが $Sym の時,子ノードを $Dir で指定され
た方向に見ていって,$SymList の最初のシンボルがみつかればそれを head
とします.みつからなかったら,$SymList の次のシンボルを探しにいきます.
$SymList の要素がリストになっている時は,そのリストのどれかのシンボル
がみつかればそれを head とします.
|
以上のインタフェースで得られる情報を元に,構文木の各ノードに head マー
クをつけます.
| mark_head(+$Tree)
|
| $Tree | 構文木
|
$Tree の各ノードで,その娘の中の一つに,以下のアルゴ
リズムで head マークをつけます.
- すでに head マークがついた娘がいれば終了.
- head_tag がついていれば head マークをつける.
- nonhead_tag がついていれば head マークをつけない.
- head_table を用いて head を決める.
|
modifier, argument マークをつけるためのインタフェースは以下の通りです.
このプログラムでは head マークはすでにつけられていると仮定します.最初
の2つは MOD 素性の値を,残りは SYM 素性の値を見てマークを決めます.
| argument_tag(+$Tag)
|
| MOD 素性の中に $Tag があると,そのノードは argument
マークにします.
|
| modifier_tag(+$Tag)
|
| MOD 素性の中に $Tag があると,そのノードは modifier マー
クにします.
|
| head_argument_table(+$HeadSym, +$SymList)
|
| $HeadSym | 主辞のシンボル(SYM 素性の値)
|
| $SymList | argument マークをつけるシンボルのリスト
|
| 主辞のシンボルが $HeadSym の時,$SymList の中のシン
ボルをもつノードに argument マークをつけます.
|
| argument_table(+$Sym, +$SymList)
|
| $Sym | 親のシンボル
|
| $SymList | argument マークをつけるシンボルのリスト
|
| 親のシンボルが $Sym の時,$SymList の中のシン
ボルをもつノードに argument マークをつけます.
|
| left_argument_table(+$Sym, +$SymList)
|
| $Sym | 親のシンボル
|
| $SymList | argument マークをつけるシンボルのリスト
|
| 親のシンボルが $Sym の時,主辞の左側で,$SymList の
中のシンボルをもつノードに argument マークをつけます.
|
| right_argument_table(+$Sym, +$SymList)
|
| $Sym | 親のシンボル
|
| $SymList | argument マークをつけるシンボルのリスト
|
| 親のシンボルが $Sym の時,主辞の右側で,$SymList の
中のシンボルをもつノードに argument マークをつけます.
|
以上のインタフェースで与えられる情報を元に,構文木の(head マークがつい
ていない)全てのノードに,modifier または argument のマークをつけます.
| mark_modifier(+$Tree)
|
| $Tree | 構文木
|
$Tree の各ノードに,以下のアルゴリズムで,modifier
または argument マークをつけます.
- argument_tag がついていれば argument マークをつける
- modifier_tag がついていれば,modifier マークをつける
- head_argument_table を使って argument マークをつける
- argument_table を使って argument マークをつける
- left_argument_table を使って argument マークをつける
- right_argument_table を使って argument マークをつける
- 残ったノードに modifier マークをつける
|
以上のプログラムは,既にマークがついているノードには何もしません.つま
り,tree conversion プログラムによって,例外的な木には予めマークをつけ
ておくことができます.また,以下のインタフェースを用いて,例外的な木に
ユーザがマークをつけることもできます.このインタフェースは,木の各ノー
ドにマークをつけるときに呼ばれます.
| mark_exceptional(+$Tree)
|
| $Tree | 構文木(tree)
|
| ユーザが $Tree にマークをつけます.
|
"mayz/binarizer.lil" は,head, modifier, argument マークがつけられた木
を,head を中心にして二分木化します.
| tree_binarize(+$Tree, -$BinTree)
|
| $Tree | 入力の木
|
| $BinTree | 二分木化された木
|
| $Tree を二分木化して $BinTree に返します.
|
このプログラムは,head を中心にして,head の右側を下に,左側を上にして
二分木化します.例外的に二分木化したい場合は,以下のインタフェースを使
います.このインタフェースは,入力の木の各ノードに対して呼び出されます.
| binarizer_preprocess(+$Tree, -$BinTree)
|
| $Tree | 入力の木
|
| $BinTree | 二分木化された木
|
"mayz/treematch.lil" は,構文木のパターンマッチを行うための述語を提供
します."treetrans"で構文木の変換を行
う際に便利です.構文木のパターンを利用したマッチングや置換を行うことが
できます.
構文木のパターンは,構文木の素性構造表現 (tree 型)で表しますが,それに
加えて,tree_any という型を使うことができます.tree_any は,0個以上の
構文木にマッチします.たとえば,
(tree &
TREE_NODE\SYM\"S" &
TREE_DTRS\[tree_any,
(tree & TREE_NODE\SYM\"VP"),
tree_any])
というパターンは,"S" の娘のうち少なくとも一つが "VP" である木にマッチ
します."VP" の左右に0個以上の木があるときでもマッチします.tree_any
にマッチした木のリストは,tree_any の ANY_TREES 素性に格納されます.
以下の述語で,構文木のパターンを指定したマッチングや置換を行うことがで
きます.
| tree_match(+$Patten, +$Tree)
|
| $Pattern | 構文木のパターン (tree または tree_any)
|
| $Tree | 入力の構文木 (tree)
|
| 構文木のパターンと構文木がマッチすると,成功します.
|
> ?- tree_match((tree &
TREE_NODE\SYM\"SBAR" &
TREE_DTRS\[TREE_NODE\(SYM\"RB" & WORD\SURFACE\"rather"),
TREE_NODE\(SYM\"IN" & WORD\SURFACE\"than"),
TREE_NODE\(SYM\"NP")]),
(tree &
TREE_DTRS\[tree_any & ANY_TREES\[_|_],
tree & TREE_NODE\(SYM\"IN" & WORD\SURFACE\"than"),
tree & TREE_NODE\HEAD_MARK\argument])).
yes
|
| tree_substitution(+$OutPattern, -$OutTree)
|
| $InPattern | 構文木のパターン (tree または tree_any)
|
| $OutTree | 出力 (tree)
|
| 構文木のパターン(tree_any 型を含む)を,通常の構文木
(tree_any 型を含まない)に変換します.
|
| tree_subst(+$InPattern, +$OutPattern, +$InTree, -$OutTree)
|
| $InPattern | 入力構文木のパターン (tree または tree_any)
|
| $OutPattern | 出力構文木のパターン (tree または tree_any)
|
| $InTree | 入力の構文木 (tree)
|
| $OutTree | 出力 (tree)
|
入力構文木をパターンとマッチさせ,マッチした場合は出
力パターンに変換し構文木を出力します.つまり,以下の操作を行います.
tree_match($InPattern, $InTree),
tree_substitution($OutPattern, $OutTree).
具体例は,treetransのマニュアルを参照して下さい.
|
"mayz/grammar.lil" は,lexicon, template をデータベースから引くための
述語を提供します.以下の述語で,データベースを操作します.
| import_lexicon(+$LexiconFile, +$TemplateFile)
|
| $LexiconFile | lexicon データベースのファイル名(string)
|
| $TemplateFile | template データベースのファイル名(string)
|
| lexicon, template のデータベースを読みこみます.
|
| lookup_lexicon(+$Word, -$TempNameList)
|
| $Word | 入力単語
|
| $TempNameList | テンプレート名のリスト(string の list)
|
| lexicon データベースを引いて,$Word に割り当てるテン
プレートのリストを返します.
|
| lookup_template(+$TempName, -$Sign)
|
| $TempName | テンプレート名(string)
|
| $Sign | テンプレートの素性構造
|
| template データベースを引いて,$TempName の素性構造
を返します.
|
lookup_lexicon/2を使うには,以下のインタフェースを実装して,
入力単語から lexicon データベースのキーを返して下さい.
| lexicon_lookup_key(+$Word, -$Key)
|
| $Word | 入力単語
|
| $Key | lexicon データベースのキー
|
| unknown_word_lookup_key(+$Word, -$Key)
|
| $Word | 入力単語
|
| $Key | lexicon データベースの未知語−キー
|
"mayz/tagger.lil" は,外部タガーを使うためのインタフェースを提供します.
まず,以下の述語でタガーの初期化/終了化をします.
| initialize_external_tagger(+$Name, +$Arguments)
|
| $Name | タガーのコマンド名(string)
|
| $Arguments | タガーのコマンド引数(string の list)
|
| タガーを起動します.
|
| terminate_external_tagger
|
| タガーを終了します.
|
| is_external_tagger_initialized
|
| タガーが既に初期化されているときは成功します.
|
タガーを初期化後,タガーを使う/使わないを以下のインタフェースで切り替
えることができます.
| enable_external_tagger
|
| タガーを有効化します.
|
| disable_external_tagger
|
| タガーを無効化します.
|
| is_external_tagger_enabled
|
| タガーが有効化されていれば成功します.
|
以下の述語で,タガーに文字列を渡し,結果の文字列を返します.
| external_tagger(+$Input, -$Output)
|
| $Input | 入力の文字列
|
| $Output | 出力の文字列
|
| タガーが有効であれば $Input をタガーの標準入力に渡し,
標準出力に返ってきた文字列を $Output に返します.タガーが無効であれば
$Input をそのまま $Output に返します.
|
"mayz/morivtrans.lil" は,木構造の変換(treetrans)や文法抽出
(lexextract) の過程をグラフィカルに見るためのモジュールです.
XHTML/XSLT をサポートしたブラウザ(FireFox など)や,MoriVブラウザを
用いることで,木構造や素性構造をふくめて,文法抽出の過程をブラウズする
ことができます.
このモジュールは,http サーバおよび cgi として動作します.まず,木構造
変換,および文法抽出のモジュールといっしょに,mayz/morivtrans.lil を読
みこみます.
% lilfes -l 木構造変換モジュール -l 文法抽出モジュール -l mayz/morivtrans
次に,cgi コマンドを起動します.
> ?- cgi.
すると,http サーバが起動し,接続待ち状態になります.サーバを起動した
ホストの 27109 ポートの /cgi-lilfes/moriv? に,ブラウザでアクセスしてく
ださい.
http://サーバを起動したホスト:27109/cgi-lilfes/moriv?
一番上のフォームに Penn Treebank スタイルの構文木を入力して Input ボタ
ンを押すと,左下にメニューが,右下に入力した構文木が表示されます.あと
は,左下のメニューを使ってデータをブラウズしてください.
"mayz/morivparser.lil" は,MAYZ ツールキットで作成した文法および確率モ
デルを使って構文解析を行い、その結果をグラフィカルに見るためのモジュー
ルです.XHTML/XSLT をサポートしたブラウザ(FireFox など)や,MoriVブラウザを
用いることで,構文解析結果の木構造や素性構造を見ることが出来ます.
このモジュールを利用するためには,構文木に使われるシンボルを得るために
"display.lil" で定義されているインタフェースを実装する必要があります.
| sign_label(+$Sign, -$Symbol)
|
| $Sign | 素性構造
|
| $Symbol | string
|
| $Sign を表す文字列を返す.
|
| lexname_label(+$LexName, -$Symbol)
|
| $LexName | LEX_NAME (lexical_entry/3 の第2引数で返したもの)
|
| $Symbol | string
|
| LEX_NAME を表す文字列を返す.
|
| schema_edge_label_unary(+$SchemaName, -$Label)
|
| $SchemaName | スキーマの名前
|
| $Label | 娘へのエッジにつける文字列
|
| unary schema が適用されたノードから娘へのエッジに表
示するラベルを返します.
|
| schema_edge_label_binary(+$SchemaName,
-$LeftLabel, -$RightLabel
|
| $SchemaName | スキーマの名前
|
| $LeftLabel | 左の娘へのエッジにつける文字列
|
| $RightLabel | 右の娘へのエッジにつける文字列
|
| binary schema が適用されたノードから娘たちへのエッジ
に表示するラベルを返します.
|
| schema_label(+$SchemaName, -$Label
|
| $SchemaName | スキーマの名前
|
| $Label | スキーマの名前を表す文字列
|
| スキーマの名前を表す文字列を返します.
|
| lex_template_label(+$LexTemplate, -$Label
|
| $LexTemplate | テンプレートの名前(lex_template)
|
| $Label | テンプレートの名前を表す文字列
|
| テンプレートの名前を表す文字列を返します.
|
| word_label(+$Word, -$Label)
|
| $Word | 単語を表す素性構造(word)
|
| $Label | 単語を表す文字列
|
| 単語を表す文字列を返します.
|
| extent_label(+$Extent, -$Label)
|
| $Extent | extent を表す素性構造
|
| $Label | extent を表す文字列
|
| extent (sentence_to_word_lattice/2 で返すリストの要
素)を表す文字列を返します.
|
このモジュールは,http サーバおよび cgi として動作します.パーザを起動
するときに,mayz/morivparser.lil を読みこみ,cgi コマンドを起動しま
す.たとえば,mayzup パーザを使うときは,以下のように起動します.
% mayzup -l 文法モジュール -l mayz/movirparser -e cgi
すると,http サーバが起動し,接続待ち状態になります.サーバを起動した
ホストの 27109 ポートの /cgi-lilfes/moriv? に,ブラウザでアクセスしてく
ださい.
http://サーバを起動したホスト:27109/cgi-lilfes/moriv?
サーバに接続後,一番上のフォームに文を入力して Input ボタンを押すと,
左下に解析結果の概要とメニューが表示されます.あとは,メニューを使って
構文木や素性構造を表示させてブラウズしてください.
"mayz/morivchart.lil" は,構文解析のチャート(CKY表)を,XHTML/XSLT をサ
ポートしたブラウザ(FireFox など)や,MoriVでブラウズ
するためのモジュールです.構文解析の途中で生成されたエッジを見ることが
できます.
このモジュールを利用するためには,構文木に使われるシンボルを得るために
"display.lil" で定義されているインタフェースを実装する必要があります.
詳しくは,構文解析結果をブラウズするを見て
下さい.
パーザを起動する時に mayz/morivchart を読み込み,cgi コマンドで http
サーバを起動したら,ブラウザでサーバに接続して下さい.すると,一番上に
文を入力するフォームが表示されるので,そこに文を入力します.すると,左
下にチャートが表示されます.チャートのセルをクリックすると,右下にその
チャート内のエッジの情報が表示されます.
"mayz/morivgrammar.lil" は,構文解析で使われる辞書を,XHTML/XSLT をサ
ポートしたブラウザ(FireFox など)や,MoriVでブラウズ
するためのモジュールです.各単語に割り当てられている語彙項目の一覧やそ
の素性構造を見ることができます.
このモジュールを利用するためには,構文木に使われるシンボルを得るために
"display.lil" で定義されているインタフェースを実装する必要があります.
詳しくは,構文解析結果をブラウズするを見て
下さい.
パーザを起動する時に mayz/morivgrammar を読み込み,cgi コマンドでhttp
サーバを起動したら,ブラウザでサーバに接続して下さい.すると,一番上に
単語を入力するフォームが表示されるので,そこに単語/品詞を入力してくだ
さい.すると,左下に語彙項目の一覧が表示されます.語彙項目のリンクをク
リックすると,右下にその素性構造が表示されます.
"mayz/coverage.lil" は,MAYZ で作成した文法のカバレッジを測定するため
のモジュールです.文法モジュールといっしょに mayz/coverage.lil を読み
こみ,以下の述語を実行してください.
| eval_coverage(+$Lexbank, +$Lexicon, +$Template, +$OutputFile)
|
| $Lexbank | 評価の対象となるコーパスの Lexbank ファイルの名前
|
| $Lexicon | 文法の lexicon ファイルの名前
|
| $Templates | 文法の template ファイルの名前
|
| $OutputFile | 測定結果を出力するファイルの名前
|
カバレッジ測定のために,未知のコーパスの lexbank を使います.したがっ
て,未知のコーパスについても,treetrans, lexextract をあらかじめ適用し,
lexbank を作っておく必要があります.
"mayz/evalparse.lil" は,MAYZ で作成した文法および確率モデルを使った構
文解析の精度を測定するためのモジュールです.一文ごとの正解数を測定する
述語を実装するだけで,テストコーパス全体での精度を測定することができま
す.
まず,一文ごとの正解数を測定する以下のインタフェースを実装する必要があ
ります.
| eval_parse(+$Best, +$Correct, +$TermList,
-$NumAnswers, -$NumOutputs, -$NumCorrects, -$NumPartials, -$Errors)
|
| $Best | パーザが出力した parse_tree
|
| $Correct | 正解の parse_tree
|
| $TermList | derivation の終端ノードのリスト (lexbank に相当)
|
| $NumAnswers | 答の数 (recall の母数)
|
| $NumOutputs | 出力の数 (precision の母数)
|
| $NumCorrects | 完全正解の数
|
| $NumPartials | 部分正解の数
|
| $Errors | error analysis の結果のリスト(出力ファイルに各要素
が出力されます)
|
パーザを起動するときに,mayz/evalparse.lil を読みこみ,以下の述語を実
行して下さい.精度の測定結果,および各文で不正解だった部分がファイルに
出力されます.
| eval_parse_file(+$Derivbank, +$OutputFile)
|
| $Derivbank | 評価の対象となる derivbank の名前
|
| $OutputFile | 評価結果を出力するファイルの名前
|
| $Derivbank で構文解析の精度を測定し,結果を
$OutputFile に出力します.
|
"mayz/parseall.lil" は,構文解析結果をデータベース(lildb)に貯めるため
の LiLFeS モジュールです.入力テキストの各行を構文解析し,解析木全体を
データベースに格納します.データベースのキーは,文番号になります.構文
解析が失敗した場合は,
parse_error型とその subtype で,失敗した原因を格納します.
このモジュールでは,以下の述語を利用できます.
| parse_all(+$Input, +$Output)
|
| $Input | 入力ファイルの名前
|
| $Output | 出力データベースの名前
|
| 入力ファイルの各行を解析し,結果を出力データベースに
格納します.
|
| parse_all(+$Output)
|
| $Output | 出力データベースの名前
|
| 標準入力の各行を解析し,結果を出力データベースに格納
します.
|
MAYZツールキットマニュアル
MAYZホームページ
辻井研究室
MIYAO Yusuke (yusuke@is.s.u-tokyo.ac.jp)