# 文法の使い方

English version

MAYZ ツールキットで作成した文法を使って，構文解析を行なう方法を説 明します．

- UP の使い方
- Lexicon, template の使い方
- 確率モデルの使い方

## UP の使い方

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 の第３引数
$FOM | binary スキーマ適用の FOM
binary スキーマを適用したときの FOM を返します．

`fom_unary(+$RuleName, +$Dtr, +$MotherSign, +$SignPlus, -$FOM)`
$RuleName | スキーマの名前
$Dtr | 娘の素性構造
$MotherSign | 親の素性構造
$SignPlus | reduce_sign/3 の第３引数
$FOM | unary スキーマ適用の FOM
unary スキーマを適用したときの FOM を返します．

`fom_terminal(+$LexName, +$Sign, +$SignPlus, -$FOM)`
$LexName | LEX_NAME (lexical_entry/2 の第２引数)
$Sign | 語彙項目の素性構造
$SignPlus | reduce_sign/3 の第３引数
$FOM | 終端 sign の FOM
終端 sign の FOM を返します．

`fom_lexical_entry(+$Word, +$LexName, -$FOM)`
$Word | 単語
$LexName | LEX_NAME (lexical_entry/2 の第２引数)
$FOM | 語彙項目の FOM
語彙項目の FOM を返します．

上のインタフェースを実装した文法を用いて構文解析を行うときは，"-fom" または "-iter" オプションつきで UP を起動します．たとえば， "mygrammar.lil" を用いて起動するときは，以下のようにします．

    % up -i -iter -l mygrammar

これ以外の UP の機能については，UP のマニュアル を参照してください．

## Lexicon, template の使い方

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

MAYZツールキットマニュアル MAYZホームページ 辻井研究室