前処理

English version

前処理は,sentence_to_word_lattice/2という述語で行っています. "grammar/grammar.lil" で実装されています.また,入力文中の特殊文字をエ スケープする処理は "grammar/preproc.lil" で,stemming 処理は "grammar/stem.lil" で実装されています."grammar/grammar.lil" の実装を 変更すれば,自分なりの前処理を行うことができます.

前処理は,以下の順番で行われます.

  1. 品詞タガーをかける
  2. スペースで区切る
  3. 各単語から extent を作る

以下,それぞれについて説明します.

品詞タガーをかける

品詞タガーを使うために,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つ以上あると,空白 の単語とみなされます.

各単語から extent を作る

各単語は,"単語/品詞" という形であると仮定しています.品詞は Penn Treebank の品詞です.sentence_to_word_lattice/2 の出力(第2 引数)は 'extent' (mayz/parser.lil で定義されている)のリストで返すこと になっているので,"単語/品詞" という文字列を,'extent' に変換します. この処理は,token_to_word_lattice で行っています.

token_to_word_lattice では,各単語に対して,以下の処理を行い ます.

  1. 単語と品詞を切り出す.
  2. 単語の位置を計算する.
  3. 品詞,単語の特殊文字をエスケープする(具体的な処理は "grammar/preproc.lil" で実装されています)
  4. delete_pos/1 で指定されている品詞を持つ単語は無視する(今のとこ ろ品詞が "." の単語は無視しています)
  5. stemming を行う(具体的な処理は "grammar/stem.lil" で実装されて います.stem のデータベース "DATA/Enju.dict" を使います.)
  6. 元々の入力単語/品詞,エスケープされた単語/品詞,stemming された 単語/品詞,単語の位置を,それぞれ INPUT/INPUT_POS, SURFACE/POS, BASE/BASE_POS, POSITION という素性に入れる.この素性構造は "mayz/word.lil" で定義されている 'word' 型で表される.

品詞が "|" で区切られて複数指定されていた時は,それぞれの品詞について 'word' 型の素性構造を作ります.従って,各単語は 'word' 型のリストで表 します.

このようにして作った単語情報('word' 型のリスト)を,'extent_word' 型の 'word' 素性に入れます.さらに単語の extent の開始/終了位置をそれぞれ 'left_pos', 'right_pos' 素性に入れます.

また,token_to_word_lattice では,括弧の処理も行います.タグ付 き文の中に "\(" や "\)" (品詞なし)が含まれていたときは,対応する括弧 で囲まれた範囲について 'extent_bracket' 型を生成します.これにより,up は括弧を破るような constituent を作らなくなるため,構文解析の高速化が期 待されます.つまり,品詞タガーが括弧によって構文構造(noun chunk など)を ある程度与えることにより,構文解析を高速化することができます.


Enju 開発者用マニュアル Enju ホームページ 辻井研究室
MIYAO Yusuke (yusuke@is.s.u-tokyo.ac.jp)