前処理は,sentence_to_word_lattice/2という述語で行っています. "grammar/grammar.lil" で実装されています.また,入力文中の特殊文字をエ スケープする処理は "grammar/preproc.lil" で,stemming 処理は "grammar/stem.lil" で実装されています."grammar/grammar.lil" の実装を 変更すれば,自分なりの前処理を行うことができます.
前処理は,以下の順番で行われます.
以下,それぞれについて説明します.
品詞タガーを使うために,MAYZ ツールキットで提供されてい る external_tagger/2 という述語を利用しています. initialize_external_tagger/2で外部タガーを起動した後,この述 語を呼ぶと,第1引数をタガーの標準入力に渡し,標準出力を第2引数に返し てくれます.
タガーの初期化(initialize_external_tagger/2)は, "grammar/grammar.lil" の中で行っています."ENJU_TAGGER" という環境変数 が設定されているときはそのタガーを使います.設定されていないときは初期 化しないので,タガーは使わなくなります.
"ENJU_TAGGER" 環境変数は,enju コマンドの中("parser/enju.cc")で up の初 期化の前に設定されるようになっています.デフォルトでは enju と同時に配 布されている"uptagger" になっていますが,ユーザが "ENJU_TAGGER" 環境変 数をあらかじめ設定することもでき,まだ "-t" オプションで上書きできるよ うになっています.
タガーの出力は,'*enju_tagged_sentence*' という配列にセットされます.
タガーの出力(external_tagger/2 の第2引数)は,スペースを区切り文字とし た文字列だと仮定しています.その文字列を,スペース1つを区切り文字とし て,単語に切り分けます.
スペース1つを区切り文字としているので,スペースが2つ以上あると,空白 の単語とみなされます.
各単語は,"単語/品詞" という形であると仮定しています.品詞は Penn Treebank の品詞です.sentence_to_word_lattice/2 の出力(第2 引数)は 'extent' (mayz/parser.lil で定義されている)のリストで返すこと になっているので,"単語/品詞" という文字列を,'extent' に変換します. この処理は,token_to_word_lattice で行っています.
token_to_word_lattice では,各単語に対して,以下の処理を行い ます.
品詞が "|" で区切られて複数指定されていた時は,それぞれの品詞について 'word' 型の素性構造を作ります.従って,各単語は 'word' 型のリストで表 します.
このようにして作った単語情報('word' 型のリスト)を,'extent_word' 型の 'word' 素性に入れます.さらに単語の extent の開始/終了位置をそれぞれ 'left_pos', 'right_pos' 素性に入れます.
また,token_to_word_lattice では,括弧の処理も行います.タグ付 き文の中に "\(" や "\)" (品詞なし)が含まれていたときは,対応する括弧 で囲まれた範囲について 'extent_bracket' 型を生成します.これにより,up は括弧を破るような constituent を作らなくなるため,構文解析の高速化が期 待されます.つまり,品詞タガーが括弧によって構文構造(noun chunk など)を ある程度与えることにより,構文解析を高速化することができます.