ここでは,構文解析の際に曖昧性解消をする確率モデルの一つ Unigram モデルの 推定について説明します.
Unigram モデルは,各単語に対して語彙項目を割り当てる確率のモデルです. 単語をw,周辺の単語列をs,語彙項目をl とすると, p(l|w,s) を求めます. Enju の確率モデルは最大エントロピーモデルになっているので, モデルの推定では素性の最適な重みを計算することになります (詳しくは確率モデルを参照して下さい). そのために最大エントロピーモデル推定器 Amis と mayz の Amis 用ツール unimaker, amisfilter を利用しています.
具体的には次のような手順で推定が行われます.
確率イベントとは,以下のように // で区切られたフィールドを持つ文字列です.
最後のフィールドはこのイベントのカテゴリ を表しています. その他のフィールドはイベントの特徴を表す記号です. unimaker は derivation 中の単語とその語彙項目を表す確率イベントの リストをファイルに出力します.ms-period-//NNP//[D< N.3sg>]_lxm-noun_adjective_rule//haag//NNP//haag//NNP//uni
amisfilter では,確率イベントに対してそのカテゴリにしたがって マスクをかけます. マスクではどのフィールドを組み合わせて素性を作るかが指定されています. 例えば上の確率イベントに,(0, 1, 1, 1, 1, 1, 1)というマスクをかけると, 次のような素性が得られます.
amisfilter はこのように確率イベントから素性を取り出し, Amis 形式のデータファイルを生成します. 最後に,Amis によって素性の最適な重みが計算されます._//NNP//[D< N.3sg>]_lxm-noun_adjective_rule//haag//NNP//haag//NNP//uni
以下各ステップについて説明します.
ここでは unimaker を 使って,確率イベントをファイルに出力する過程を説明します.
unimaker モデル名 イベント抽出モジュール derivbank イベントファイル | |
モデル名 | 確率モデルの名前(構文解析の時にも使います) |
イベント抽出モジュール | 文法とイベント抽出の述語が実装されている lilfes module |
derivbank | 文法獲得で得た derivbank (lildb 形式) |
イベントファイル | 確率イベントを出力するファイル (テキスト形式または gz/bz による圧縮形式) |
derivbank に格納された derivation の末端ノードには, TERM_TEMPLATE 素性に語彙項目テンプレートの名前 (語彙素テンプレートの名前と語彙規則の適用履歴を組み合わせたもの) が格納されています. unimaker では,各末端ノードの単語情報 (TERM_WORD 素性の値 'word' 型) と 語彙項目テンプレートの名前 (TERM_TEMPLATE 素性), また周辺の末端ノードの単語情報から確率イベントを出力します.
Enju の場合,derivation 末端ノードから2種類の word lattice を作る述語は "devel/unimake.lil" に実装されています. また,derivation 末端ノードから正しい(正しくない)語彙項目を計算する述語も "devel/unimake.lil" に実装されています. これらの性質は次のようになっています.
um_derivation_to_word_lattice(derivation_internal & DERIV_DTRS\$Dtrs, $WordLattice) :- um_derivation_to_word_lattice_dtrs($Dtrs, $WordLattice). %% 再帰処理のための述語 um_derivation_to_word_lattice(derivation_terminal & TERM_WORD\$Word, [left_position\$LPos & right_position\$RPos & word\$LexEntry]) :- $LexEntry = [$Word], $Word = POSITION\$LPos, $RPos is $LPos + 1. um_derivation_to_deriv_word_lattice(derivation_internal & DERIV_DTRS\$Dtrs, $WordLattice) :- um_derivation_to_deriv_word_lattice_dtrs($Dtrs, $WordLattice). %% 再帰処理のための述語 um_derivation_to_deriv_word_lattice(derivation_terminal & $Term & TERM_WORD\$Word, [left_position\$LPos & right_position\$RPos & word\$LexEntry]) :- $LexEntry = $Term, $Word = POSITION\$LPos, $RPos is $LPos + 1. um_correct_lexical_entry(TERM_WORD\$Word & LEXENTRY_SIGN\$Sign, $LexName) :- lookup_lexicon($Word, $TempNameList), member($TempName, $TempNameList), lookup_template($TempName, $LexEntry), equivalent($LexEntry, $Sign), !, $LexName = LEX_WORD\$Word & LEX_TEMPLATE\$TempName. um_complement_lexical_entry(TERM_WORD\$Word & LEXENTRY_SIGN\$Sign, $LexName) :- lookup_lexicon($Word, $TempNameList1), check_coverage($TempNameList1, $Sign, $TempName1), %% $TempNameList1 に %% $Sign を持つものが含まれているか調べる findall($Lex, (member($TN, $TempNameList1), $TN \= $TempName1, $Lex = LEX_WORD\$Word & LEX_TEMPLATE\$TN), $LexList), member(LEX_TEMPLATE\$TempName, $LexList), $LexName = LEX_WORD\$Word & LEX_TEMPLATE\$TempName.
また,確率イベントを取り出す述語 extract_lexical_event/4 は, "grammar/unievent.lil" で実装され, カテゴリ "uni" の確率イベントを抽出します. その特徴フィールドには次のようなものが含まれます.
extract_lexical_event("hpsg-uni", "uni", $LexEntry, $Event) :- $LexEntry = (LEX_WORD\ (SURFACE\ $Surface & POS\ $Pos & BASE\ $Base & BASE_POS\ $BasePOS & POSITION\ $Position) & LEX_TEMPLATE\($LexTemplate & LEXEME_NAME\$LexemeName)), lex_template_label($LexTemplate, $LexName), $PositionN2 is $Position - 2, $PositionN1 is $Position - 1, $PositionP1 is $Position + 1, $PositionP2 is $Position + 2, $PositionP3 is $Position + 3, $PositionP4 is $Position + 4, lexical_event($PositionN2, $PositionN1, $Event, $Event2), %% -2 lexical_event($PositionN1, $Position, $Event2, $Event3), %% -1 $Event3 = [$Surface, $Pos, $LexName, $Base, $BasePOS, $LexemeName|$Event4], lexical_event($PositionP1, $PositionP2, $Event4, $Event5), %% 1 lexical_event($PositionP2, $PositionP3, $Event5, $Event6), %% 2 lexical_event($PositionP3, $PositionP4, $Event6, []). %% 3
unimaker が出力する確率イベントファイルは次のようになっています.
(実際には一つの確率イベントが一行で出力されます.
下の event_2_0 の場合3個の確率イベントなので3行となります.)
ここでは amisfilter を使って,
上のステップで出力された確率イベントにマスクをかけ,
素性を取り出し,Amis 形式のデータファイル出力する過程を説明します.
具体的には次のような処理が行われます.
Enju の場合,feature_mask/3 は "grammar/lexmask.lil" で実装されています.
その中でカテゴリ "uni" に対するマスクには次のようなものが含まれます.
(表に示していないフィールドは全て×)
上のマスクを上のステップで示した確率イベントファイルの例に適用すると,
次のような Amis 形式のイベントファイルが得られます.
上のステップで得られた Amis 形式のモデルファイルとイベントファイルから
Amis を使って
素性の最適な重みを計算します.
出力ファイルにはモデルファイルと同じ形式で,計算された素性の重みが示されています.
この例の場合,
event_2_0 は単語 "Ms." に "[D
event_2_0
1 BOS//BOS//BOS//BOS//BOS//BOS//BOS//BOS//ms-period-//NNP//
[D< N.3sg>]_lxm-noun_adjective_rule//ms-period-//NNP//
[D< N.3sg>]_lxm//haag//NNP//haag//NNP//plays//VBZ//play//VB//
elianti//NNP//elianti//NNP//uni
0 BOS//BOS//BOS//BOS//BOS//BOS//BOS//BOS//ms-period-//NNP//
[D< N.3sg>]_lxm//ms-period-//NNP//[D< N.3sg>]_lxm//haag//
NNP//haag//NNP//plays//VBZ//play//VB//elianti//NNP//elianti//NNP//
uni
0 BOS//BOS//BOS//BOS//BOS//BOS//BOS//BOS//ms-period-//NNP//
[< NP.3sg.adj>]NP.adj_mod//ms-period-//NNP//
[< NP.3sg.adj>]NP.adj_mod//haag//NNP//haag//NNP//plays//VBZ//
play//VB//elianti//NNP//elianti//NNP//uni
event_2_1
...
マスクをかけて素性を取り出す
amisfilter モデル名 マスクモジュール 確率イベントファイル
カウントファイル モデルファイル イベントファイル
モデル名 確率モデルの名前(構文解析の時にも使います)
マスクモジュール 確率イベントにかけるマスクが実装され
ている lilfes module
確率イベントファイル 入力の確率イベントファイル (テキストま
たは gz/bz 圧縮形式)
カウントファイル 素性の頻度を出力するファイル (テキスト
形式)
モデルファイル モデルファイル (AmisModel 形式)
イベントファイル イベントファイル (AmisEvent 形式)
これらは次のように実装されます.
1語前 今の語
Surface POS BaseSurface BasePos Surface POS LexEntry BaseSurface BasePos Lexeme
mask 10 ○ × × ×
○ × ○ × × ×
mask 12 × ○ × ×
○ × ○ × × ×
%% 10 ... w-1, w0
feature_mask("hpsg-uni", "uni", [0, 0, 0, 0,
1, 0, 0, 0,
1, 0, 1, 0, 0, 0,
0, 0, 0, 0,
0, 0, 0, 0,
0, 0, 0, 0]).
%% 12 ... p-1, w0
feature_mask("hpsg-uni", "uni", [0, 0, 0, 0,
0, 1, 0, 0,
1, 0, 1, 0, 0, 0,
0, 0, 0, 0,
0, 0, 0, 0,
0, 0, 0, 0]).
1個の確率イベントに対して,複数の素性が出力されています.
出力される Amis 形式のモデルファイルには,採用された素性と
その重みの初期値が出力されています.
event_2_0
1 _//_//_//_//BOS//_//_//_//_//_//[D< N.3sg>]_lxm-noun_adjective
_rule//_//_//_//_//_//_//_//_//_//_//_//_//_//_//_//uni _//_//_//_//_
//_//_//_//ms-period-//_//[D%lt N.3sg>]_lxm-noun_adjective_rule//_//_//_
//_//_//_//_//_//_//_//_//_//_//_//_//uni _//_//_//_//_//_//_//_//_//
_//[D%lt N.3sg>]_lxm-noun_adjective_rule//_//_//_//haag//_//_//_//_//_//
_//_//_//_//_//_//uni _//BOS//_//_//_//_//_//_//_//_//[D%lt N.3sg>]_lxm-
noun_adjective_rule//_//_//_//_//_//_//_//_//_//_//_//_//_//_//_//uni
_//_//_//_//_//BOS//_//_//_//_//[D%lt N.3sg>]_lxm-noun_adjective_rule//
_//_//_//_//_//_//_//_//_//_//_//_//_//_//_//uni _//_//_//_//_//_//_/
/_//_//NNP//[D%lt N.3sg>]_lxm-noun_adjective_rule//_//_//_//_//_//_//_//
_//_//_//_//_//_//_//_//uni _//_//_//_//_//_//_//_//_//_//[D%lt N.3sg>]_
lxm-noun_adjective_rule//_//_//_//_//NNP//_//_//_//_//_//_//_//_//_//
_//uni _//_//_//_//_//_//_//_//_//_//[D%lt N.3sg>]_lxm-noun_adjective_ru
le//_//_//_//_//_//_//_//_//VBZ//_//_//_//_//_//_//uni _//_//_//_//_/
/_//_//_//_//_//[D%lt N.3sg>]_lxm-noun_adjective_rule//_//_//_//_//_//_/
/_//_//_//_//_//_//NNP//_//_//uni _//_//_//_//BOS//_//_//_//ms-period
-//_//[D%lt N.3sg>]_lxm-noun_adjective_rule//_//_//_//_//_//_//_//_//_//
_//_//_//_//_//_//uni _//_//_//_//_//BOS//_//_//ms-period-//_//[D%lt N.3
sg>]_lxm-noun_adjective_rule//_//_//_//_//_//_//_//_//_//_//_//_//_//
_//_//uni _//_//_//_//_//_//_//_//ms-period-//NNP//[D%lt N.3sg>]_lxm-nou
....
0 _//_//_//_//BOS//_//_//_//_//_//[D%lt N.3sg>]_lxm//_//_//_//_//_
......
_//_//_//_//BOS//_//_//_//_//_//[D< N.3sg>]_lxm-noun_adjective_ru
le//_//_//_//_//_//_//_//_//_//_//_//_//_//_//_//uni _//_//_//_//_ 1.0
_//_//_//_//_//_//_//_//ms-period-//_//[D%lt N.3sg>]_lxm-noun_adjec
tive_rule//_//_//_//_//_//_//_//_//_//_//_//_//_//_//_//uni 1.0
....
_//_//_//_//BOS//_//_//_//ms-period-//_//[D%lt N.3sg>]_lxm-noun_adj
ective_rule//_//_//_//_//_//_//_//_//_//_//_//_//_//_//_//uni 1.0
_//_//_//_//_//BOS//_//_//ms-period-//_//[D%lt N.3sg>]_lxm-noun_adj
ective_rule//_//_//_//_//_//_//_//_//_//_//_//_//_//_//_//uni 1.0
....
素性の最適な重みを計算する
_//_//_//_//BOS//_//_//_//_//_//[D< N.3sg>]_lxm-noun_adjective_ru
le//_//_//_//_//_//_//_//_//_//_//_//_//_//_//_//uni 1.221022e+00
_//_//_//_//_//_//_//_//ms-period-//_//[D%lt N.3sg>]_lxm-noun_adjective_rule//_/
/_//_//_//_//_//_//_//_//_//_//_//_//_//_//uni 1.069326e+00
....
_//_//_//_//BOS//_//_//_//ms-period-//_//[D%lt N.3sg>]_lxm-noun_adj
ective_rule//_//_//_//_//_//_//_//_//_//_//_//_//_//_//_//uni 1.124106e+00
_//_//_//_//_//BOS//_//_//ms-period-//_//[D%lt N.3sg>]_lxm-noun_adj
ective_rule//_//_//_//_//_//_//_//_//_//_//_//_//_//_//_//uni 1.124106e+00
....
Enju 開発者用マニュアル
Enju ホームページ
辻井研究室
MIYAO Yusuke (yusuke@is.s.u-tokyo.ac.jp)