MAYZ ツールキットで作成した文法を使って,構文解析を行なう方法を説 明します.
MAYZ ツールキットでは,lexicon, template や確率モデルを作ることができ ますが,それを使って実際に構文解析を行なうには,構文解析器が必要です. MAYZ ツールキットには,unification-based grammar のための高速な汎用構 文解析器UPが含まれています.このツールを利用 すれば,UP が要求するいくつかのインタフェースを実装するだけで,構文解 析を行なうことができます.
UP を利用して構文解析を行なうためには,UP が文法や曖昧性解消モデルにア クセスするためのインタフェースを実装する必要があります.インタフェース は "mayz/parser.lil" で定義されています.
UP を用いるには,最低限以下のインタフェースを実装する必要があります.
| sentence_to_word_lattice(+$Input, -$WordLattice) | |
| $Input | 入力文 |
| $WordLattice | list of extent |
| $Input を単語単位に区切り,単語のリスト $WordLattice を返す. | |
| lexical_entry(+$Word, -$LexName) | |
| $Word | 入力の単語 |
| $LexName | lexical entry の名前 |
| 単語 $Word に割り当てる lexical entry の名前 $LexName を返す.一つの $Word に複数の $LexName を返してもよい. | |
| lexical_entry_sign(+$LexName, -$Sign) | |
| $LexName | lexical entry の名前 |
| $LexEntry | lexical entry の素性構造 |
| $LexName に対応する lexical entry を返す.$LexName と $Sign は一対一に対応しなければならない. | |
| id_schema_unary(+$SchemaName, +$Dtr, -$Mother, -$DCP) | |
| $SchemaName | スキーマの名前 |
| $Dtr | 娘の素性構造 |
| $Mother | 親の素性構造 |
| $DCP | スキーマ適用後に実行する lilfes プログラム |
| unary schema を適用します.unary schema がない場合は, 実装する必要はありません. | |
| id_schema_binary(+$SchemaName, +$Left, +$Right, -$Mother, -$DCP) | |
| $SchemaName | スキーマの名前 |
| $Left | 左の娘の素性構造 |
| $Right | 右の娘の素性構造 |
| $Mother | 親の素性構造 |
| $DCP | スキーマ適用語に実行する lilfes プログラム |
| binary schema を適用します. | |
| root_sign($Sign) | |
| $Sign | 文のルートノードの素性構造 |
| $Sign がルートノードの条件を満たしているかどうか判断 します. | |
| reduce_sign(+$InSign, -$OutSign, -$SignPlus) | |
| $InSign | スキーマ適用後の親の sign |
| $OutSign | 不要な情報を取り除いた sign |
| $SignPlus | 取り除かれた情報 |
| スキーマ適用が成功したときにできた sign に適用されま す.以降の解析では,$InSign ではなく,$OutSign が使われます.$InSign の中で不要な情報(娘の素性構造など)を取り除くと,違う構造から同じ $OutSign ができたとき,それらを同一視して解析を続けることで,解析を効 率化することができます.$SignPlus には,そのとき取り除かれた情報を返す ようにすると,edge_link の SIGN_PLUS 素性にその情報が残されます. | |
"mayz/sample_hpsg.lil" に簡単な HPSG 文法の例があり,そこでこれらのイ ンタフェースが実装されているので参考にしてください.
以上のインタフェースだけでは確率モデルの情報がありませんので,曖昧性解 消はできません.以上のインタフェースのみを実装した文法で構文解析を行う ときは,UP を "-nofom" オプションつきで起動してください.たとえば, "mayz/sample_hpsg.lil" で構文解析を行うときは,以下のように UP を起動 します.
% up -i -nofom -l mayz/sample_hpsg
曖昧性解消を行いたいときは,以下のインタフェースを実装します.以下のイ ンタフェースを実装すると,UP は figure-of-merit (FOM) の計算を構文解析 と同時に行ない,best_fom_sign/2 などで最適解を得ることができます.各 FOM は加算されていくので,確率値を用いるときは,log-probability を用い てください.
| fom_root(+$Sign, -$FOM) | |
| $Sign | 文のルートノードの素性構造 |
| $FOM | ルートノードの FOM |
| ルートノードの FOM を返します. | |
| fom_binary(+$RuleName, +$LeftDtr, +$RightDtr, +$MotherSign, +$SignPlus, -$FOM) | |
| $RuleName | スキーマの名前 |
| $LeftDtr | 左の娘の素性構造 |
| $RightDtr | 左の娘の素性構造 |
| $MotherSign | 親の素性構造 |
| $SignPlus | reduce_sign/3 の第3引数 |
| $FOM | binary スキーマ適用の FOM |
| binary スキーマを適用したときの FOM を返します. | |
| fom_unary(+$RuleName, +$Dtr, +$MotherSign, +$SignPlus, -$FOM) | |
| $RuleName | スキーマの名前 |
| $Dtr | 娘の素性構造 |
| $MotherSign | 親の素性構造 |
| $SignPlus | reduce_sign/3 の第3引数 |
| $FOM | unary スキーマ適用の FOM |
| unary スキーマを適用したときの FOM を返します. | |
| fom_terminal(+$LexName, +$Sign, +$SignPlus, -$FOM) | |
| $LexName | LEX_NAME (lexical_entry/2 の第2引数) |
| $Sign | 語彙項目の素性構造 |
| $SignPlus | reduce_sign/3 の第3引数 |
| $FOM | 終端 sign の FOM |
| 終端 sign の FOM を返します. | |
| fom_lexical_entry(+$Word, +$LexName, -$FOM) | |
| $Word | 単語 |
| $LexName | LEX_NAME (lexical_entry/2 の第2引数) |
| $FOM | 語彙項目の FOM |
| 語彙項目の FOM を返します. | |
上のインタフェースを実装した文法を用いて構文解析を行うときは,"-fom" または "-iter" オプションつきで UP を起動します.たとえば, "mygrammar.lil" を用いて起動するときは,以下のようにします.
% up -i -iter -l mygrammar
これ以外の UP の機能については,UP のマニュアル を参照してください.
MAYZ ツールキットでは,lexicon や template をデータベースから引いてく るための機能しか提供しません.構文解析器が要求するインタフェースは,文 法開発者が実装する必要があります.詳しくはUPの使い方 を見てください.
MAYZ ツールキットが lexicon や template をデータベースから引くために提 供するツールは以下の通りで,mayz/grammar.lil で実装されています.これ ら以外にも外部タガーを利用するための ツールも提供されています.
| import_lexicon($LexFile, $TemplateFile) | |
| $LexFile | lexicon のファイル名 |
| $TemplateFile | template table のファイル名 |
| lexicon と template table を読みこみます. | |
| lookup_lexicon(+$Word, -$TempNameList) | |
| $Word | 単語を表す素性構造 |
| $TempNameList | lex_template のリスト |
| lexicon を引いて,単語に割り当てられた template のリ ストを返します. | |
| lookup_template(+$TempName, -$Template) | |
| $TempName | lex_template |
| $Template | template の素性構造 |
| template table を引いて,template の名前からその素性 構造を返します. | |
これらのツールを使うためには,以下のインタフェースを実装する必要があり ます.
| lexicon_lookup_key(+$Word, -$Key) | |
| $Word | 単語を表す素性構造 |
| $Key | lexicon を引くためのキー |
| 単語を表す素性構造(sentence_to_word_lattice/2 で返した リストの各要素)から,lexicon を引くためのキー(inverse_lexical_rule/5 の第3引数や,lexical_rule/5 の第4引数)を返す. | |
| unknown_word_lookup_key(+$Word, -$Key) | |
| $Word | 単語を表す素性構造 |
| $Key | lexicon を引くためのキー |
| 単語を表す素性構造から,未知語の lexicon を引くため のキーを返す. | |
UP で構文解析を行うときは,lexical_entry/2, lexical_entry_sign/2 で lexical entry を作るときに,lookup_lexicon/2 や lookup_template/2 を利 用することになります.
unimaker, forestmaker で作った確率モデルは,UP で 構文解析する時の FOM として使うことができます.ツール キットで提供されているパーザmayzupを使う と,確率モデルを作るときに使ったインタフェース extract_???_eventやfeature_mask/3をそのまま使って, FOM (log probability) を計算するための組みこみ述語が提供されます.
以下の組み込み述語は,mayzup のみで提供さ れます.
| init_amis_model(+$ModelName, +$ModelFile) | |
| $ModelName | モデルの名前 |
| $ModelFile | パラメタファイルの名前 |
| 新しい amis モデルを作り,$ModelFile からパラメタを 読みこみ,さらに feature_mask を読みこんで初期化します. | |
| delete_amis_model(+$ModelName) | |
| $ModelName | モデルの名前 |
| init_amis_model/2 で作ったモデルを消します. | |
| amis_event_weight(+$ModelName, +$Category, +$Event, -$FOM) | |
| $ModelName | モデルの名前 |
| $Category | カテゴリ名 |
| $Event | イベント(文字列のリスト) |
| $FOM | イベントの FOM (log probability) |
| 文字列リストで表されたイベントに,$Category の feature mask をかけて得られた素性の重みの和を FOM として返す. | |
| amis_log_probability(+$ModelName, +$Category, +$EventList, -$FOM) | |
| $ModelName | モデルの名前 |
| $Category | カテゴリ名 |
| $EventList | イベントのリスト(文字列リストのリスト) |
| $FOM | イベントの FOM (log probability) のリスト |
| 各イベントの重みを amis_event_weight で計算し,それ を正規化して FOM として返す. | |
以上の組みこみ述語を利用して,イベントの FOM (log probability) を計算 します.計算した FOM は,UP の使い方で説明したインタ フェースを用いて,構文解析器から利用できるようにします.
mayzup の使い方はほとんど upと同じです.たとえば,"mygrammar.lil" を読み込 むときは,以下のように起動します.
% mayzup -i -iter -l mygrammar