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