# lexextract: derivbank および lexicon 作成ツール

English version

構文木から derivation と lexical entry を作るツールです．

lexextract [オプション] 文法獲得モジュール treebank derivbank lexicon template lexbank
文法獲得モジュール | inverse schema や inverse lexical rule が定義された lilfes プログラム
treebank | 入力の treebank (lildb 形式)
derivbank | derivation を出力するファイル (lildb 形式)
lexicon | lexicon を出力するファイル (lildb 形式)
template | lexical entry template を出力するファイル (lildb 形式)
lexbank | derivation の terminal 列を出力するファイル (lildb 形式)
オプション
-v | デバッグ用メッセージを表示します．
-vv | デバッグ用メッセージをたくさん表示します．

treetrans によって作成された treebank から，ターゲット文法理論の derivation bank (derivbank) を作成し，さらに lexicon を抽出します．

まず，derivmake.lil で定義されているインタフェースを使って，構文木を以 下のアルゴリズムで derivation に変換します．

1. 構文木の根元の TREE_NODE\NODE_SIGN\ 素性の値に対し， root_constraints/1 を適用する．

   root_constraints(-$Sign)
   $Sign | ルートの sign
   derivation のルートの sign と，$Sign を単一化しま す．

2. 構文木の各ノードの TREE_NODE\NODE_SIGN\ 素性の値に対し，トップダ ウンに inverse_schema_binary/4 または inverse_schema_unary/3 を適用 する．このとき，TREE_NODE\SCHEMA_NAME\ の値をスキーマ名として使用す る．スキーマ適用は深さ優先で行われる．

   inverse_schema_binary(+$SchemaName, +$Mother, -$Left, -$Right)
   $SchemaName | スキーマの名前
   $Mother | 親の sign
   $Left | 左の娘の sign
   $Right | 右の娘の sign
   $Mother に binary schema を適用し，娘の sign を計 算します．

   inverse_schema_unary(+$SchemaName, +$Mother, -$Dtr)
   $SchemaName | スキーマの名前
   $Mother | 親の sign
   $Dtr | 娘の sign
   $Mother に unary schema を適用し，娘の sign を計算 します．

3. 全ての中間ノードで inverse schema を適用した後，各末端ノードの TREE_NODE\NODE_SIGN\ の値に対し，lexical_constraints/2 を適用する． inverse_schema をすべて適用した後にこれが適用されるため，lexical entry のデフォルト制約をここでかけることができる．

   lexical_constraints(+$Word, -$Sign)
   $Word | 単語を表す素性構造(word) (TREE_NODE\WORD\ 素性の値)
   $Sign | 末端ノードの sign
   末端ノードの sign を $Sign を単一化します．

変換後の derivation は，derivtypes.lil で定義されている素性構造で derivbank に格納されます．また，derivation の末端ノードだけを集めたリ ストは lexbank に格納されます．

次に，derivation の各末端ノードの素性構造から，lexical entry template 及び単語と lexical entry template のマッピングを抽出します．抽出のイン タフェースは lexextract.lil で定義されており，以下のアルゴリズムで抽出 を行います．以下の各ステップでは，処理対象の素性構造がその都度コピーさ れるので，新たな制約をかけたり，破壊的操作などを行っても，他のlexical entry に影響を与えません．

1. derivation の末端ノードの DERIV_SIGN\ 素性の値に対し， lexical_entry_template/3 を適用する．結果は derivation の LEXENTRY_SIGN\ 素性に格納される．

   lexical_entry_template(+$Word, +$Sign, -$Template)
   $Word | 単語を表す素性構造
   $Sign | 単語に対応する sign
   $Template | 単語の lexical entry template
   単語 $Word に対応する sign $Sign から，その単語の lexical entry template $Template を作ります．

2. 結果の素性構造に対してreduce_lexical_template/5 を適用し，lexicon を引くキー，lexeme の素性構造，そして lexical rule の適用履歴を得る． 結果の lexeme の素性構造は template database に格納される． lexeme の素性構造は，derivation の LEXEME_SIGN\ 素性にも格納される．

   reduce_lexical_template(+$Word, +$InTemplate, -$Key, -$OutTemplate, -$LexRules)
   $Word | 単語を表す素性構造
   $InTemplate | 入力の template (lexical_entry_template/3 の 出力)
   $Key | lexicon に登録する時のキー
   $OutTemplate | lexeme の template
   $LexRules | 適用された lexical rule のリスト
   lexical_entry_template/3 で得られた template に， lexical rule を逆適用し，lexeme の template を計算します．

3. lexeme の素性構造がまだデータベースに登録されていない初出のも のであるときは，lexeme_name/4 を適用しtemplate の名前を得る．この template の名前とlexical rule の適用履歴の組み合わせが，ここで の lexical entry template の名前となる．キーと template の名前の マッピングがlexicon に登録される．template の名前は，derivation の TERM_TEMPLATE\ 素性にも格納される．

   lexeme_name(+$Word, +$Template, +$ID, -$Name)
   $Word | 単語を表す素性構造
   $Template | lexeme の sign
   $ID | 通し番号
   $Name | lexeme の名前(string)
   lexeme に一意の名前をつけます．

4. 単語の出現回数をインクリメントする．出現回数は， `lexrefine`で単語の足切りをするときに使う．

   `word_count_key(+$LexKey, -$CountKey)`
   $LexKey | 入力のキー(lexicon を引くときのキー)
   $CountKey | 単語を数えるのに使うキー
   単語の出現回数を数えるときに使うキーを返します． lexicon を引くキーが違う場合でも同じ単語としてカウントしたいものに対 しては同じ $CountKey を返すようにします．

全ての derivation から文法抽出が終わると，lexicon と template database をファイルに保存します．

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