前処理では入力文字列に品詞タグ付けや stemming を行い,word lattice に変換して up に渡します. Word lattice は 'extent' 型のリストであり,ひとつの 'extent' が多くの場合一単語に対応します. 前処理は sentence_to_word_lattice/2 という述語で行われていて, Enju の場合の実装は "enju/preproc.lil" にあります. "enju/preproc.lil" の実装を変更すれば,自分なりの前処理を行うことができます.
Enju の場合,前処理は以下のように行われます.
Enju では入力文に品詞タグ付けをするために外部の品詞タガーを利用しています. 外部の品詞タガーを使うために,MAYZ ツールキットで提供されている external_tagger/2 という述語が使われています. この述語の第1引数に入力文を渡すと,それをタガーの標準入力に渡しタガーによる出力を第2引数に返すようになっています. 初期化述語 initialize_external_tagger/2で外部タガーを起動した後,この述語を呼ぶようにしてください.
Enju のデフォルトの品詞タガーはEnju と同時に配布されている"stepp" になっていますが,"ENJU_TAGGER" 環境変数や"-t" オプションで変更することができます.
Enju では次にタガーの出力 (述語 external_tagger/2 の第2引数) を単語ごとに区切る処理を行います. デフォルトのタガーはスペースを区切り文字として出力するので,単純にスペースごとに文字列を切ることで単語に切り分けています.
Enju では次に各単語の文字列や品詞などの情報を 'extent' 型に格納し,そのリストを word lattice として up に渡します. Enju のデフォルトタガーの出力を使った場合,各単語は "単語文字列/品詞1|品詞2|..." という形になっています. 品詞タグは PennTreebank のものであり,"|" で区切られて並んでいる品詞1、品詞2 というのは単語に対する品詞の候補です. 各単語から 'extent' 型を生成するために,述語 token_to_word_lattice, token_to_word/4 を定義して以下のような処理を行っています.
述語 token_to_word_lattice では,括弧の処理も行います. タガーの出力に品詞なしの "\(" や "\)" を含めておくと,括弧で囲まれた範囲に対して 'extent_bracket' 型が生成されます. 'extent_bracket' を含む word lattice を up に渡すと,構文解析時に括弧をやぶるような constituent を作らなくなるため構文解析の高速化が期待できます.