文法の使い方

English version

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


UP の使い方

MAYZ ツールキットでは,lexicon, template や確率モデルを作ることができ ますが,それを使って実際に構文解析を行なうには,構文解析器が必要です. MAYZ ツールキットには,unification-based grammar のための高速な汎用構 文解析器UPが含まれています.このツールを利用 すれば,UP が要求するいくつかのインタフェースを実装するだけで,構文解 析を行なうことができます.

UP を利用して構文解析を行なうためには,UP が文法や曖昧性解消モデルにア クセスするためのインタフェースを実装する必要があります.インタフェース は "mayz/parser.lil" で定義されています.

UP を用いるには,最低限以下のインタフェースを実装する必要があります.

sentence_to_word_lattice(+$Input, -$WordLattice)
$Input入力文
$WordLatticelist of extent
$Input を単語単位に区切り,単語のリスト $WordLattice を返す.
lexical_entry(+$Word, -$LexName)
$Word入力の単語
$LexNamelexical entry の名前
単語 $Word に割り当てる lexical entry の名前 $LexName を返す.一つの $Word に複数の $LexName を返してもよい.
lexical_entry_sign(+$LexName, -$Sign)
$LexNamelexical entry の名前
$LexEntrylexical 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親の素性構造
$SignPlusreduce_sign/3 の第3引数
$FOMbinary スキーマ適用の FOM
binary スキーマを適用したときの FOM を返します.
fom_unary(+$RuleName, +$Dtr, +$MotherSign, +$SignPlus, -$FOM)
$RuleNameスキーマの名前
$Dtr娘の素性構造
$MotherSign親の素性構造
$SignPlusreduce_sign/3 の第3引数
$FOMunary スキーマ適用の FOM
unary スキーマを適用したときの FOM を返します.
fom_terminal(+$LexName, +$Sign, +$SignPlus, -$FOM)
$LexNameLEX_NAME (lexical_entry/2 の第2引数)
$Sign語彙項目の素性構造
$SignPlusreduce_sign/3 の第3引数
$FOM終端 sign の FOM
終端 sign の FOM を返します.
fom_lexical_entry(+$Word, +$LexName, -$FOM)
$Word単語
$LexNameLEX_NAME (lexical_entry/2 の第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)
$LexFilelexicon のファイル名
$TemplateFiletemplate table のファイル名
lexicon と template table を読みこみます.
lookup_lexicon(+$Word, -$TempNameList)
$Word単語を表す素性構造
$TempNameListlex_template のリスト
lexicon を引いて,単語に割り当てられた template のリ ストを返します.
lookup_template(+$TempName, -$Template)
$TempNamelex_template
$Templatetemplate の素性構造
template table を引いて,template の名前からその素性 構造を返します.

これらのツールを使うためには,以下のインタフェースを実装する必要があり ます.

lexicon_lookup_key(+$Word, -$Key)
$Word単語を表す素性構造
$Keylexicon を引くためのキー
単語を表す素性構造(sentence_to_word_lattice/2 で返した リストの各要素)から,lexicon を引くためのキー(inverse_lexical_rule/5 の第3引数や,lexical_rule/5 の第4引数)を返す.
unknown_word_lookup_key(+$Word, -$Key)
$Word単語を表す素性構造
$Keylexicon を引くためのキー
単語を表す素性構造から,未知語の lexicon を引くため のキーを返す.

UP で構文解析を行うときは,lexical_entry/2, lexical_entry_sign/2 で lexical entry を作るときに,lookup_lexicon/2 や lookup_template/2 を利 用することになります.

確率モデルの使い方

unimaker, forestmaker で作った確率モデルは,UP で 構文解析する時の FOM として使うことができます.ツール キットで提供されているパーザmayzupを使う と,確率モデルを作るときに使ったインタフェース extract_???_eventfeature_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ホームページ 辻井研究室
MIYAO Yusuke (yusuke@is.s.u-tokyo.ac.jp)