KyTeaを使った単語分割のための部分的アノテーション
Graham Neubig, 森 信介
2011-01-20

~~~~~~ はじめに ~~~~~~

KyTea の最も大きな利点の１つは分野適応が簡単であることです。特に、部分
的アノテーション(後述)を使った分野適応は有用です。従来手法では、辞書に
単語を追加する以外には、フルアノテーションコーパスを準備する必要があり
ました。フルアノテーションコーパスは、

  「この 時期 の 中心 人物 は 、 風穴 延昭 で あ る 。」

のように、全ての単語境界に空白を入れ、単語境界のないところに空白を入れ
ないことで、すべての文字間の境界情報をアノテーションします。しかし、こ
の文の中で、「風穴」以外、ほとんどの単語境界は自明であり、アノテーショ
ンする必要はないため、時間の無駄が生じます。その代わり、部分的アノテー
ションでは、以下のように「風穴」のところだけをアノテーションすることが
できます。

  「こ の 時 期 の 中 心 人 物 は 、|風-穴|延 昭 で あ る 。」

ここで、縦棒「|」は「単語境界あり」、横棒「-」は「単語境界なし」を意味
し、空白は「単語境界の有無はアノテーションされていない」ことを意味しま
す。これにより、アノテーションが分野適応に有用な箇所のみに集中すること
がでます。KyTea はこのような言語資源から学習することができるので、効率
的なアノテーションを実現することができます。


~~~~~~ 準備 ~~~~~~

アノテーション作業を開始する前に以下の準備をしてください。テキストファ
イルのエンコードはすべて UTF-8 にしてください。

0) KyTea が動作することを確認し、必要があれば makemodel.sh を編集する。

     KYTEA=$PATH_TO_KYTEA_BIN/kytea
     TRAIN=$PATH_TO_KYTEA_BIN/train-kytea

   なお、kytea [Enter] で動作する場合には、デフォルトのままでよいです。


1) 単語分割の基準を決めます。様々な基準はありますが、KyTea に付属してい
   るモデルは、以下に説明している基準を利用しています。
   http://plata.ar.media.kyoto-u.ac.jp/sasada/research/project/corpus/

2) まず、一般分野のフルアノテーションコーパスを data/ フォルダに移しま
   す。次に、makemodel.sh を編集して GEN_CORPORA にこのコーパスのパスを
   追加します。例えばコーパスが BCCWJ.word の場合以下のようになります。

      GEN_CORPORA="-full data/BCCWJ.word"

   配布時には Creative Commons License の基に再配布可能なWikipedia デー
   タを入れていますが、非常に少量であり、自動解析結果を人手で簡単に修正
   しただけなので、単語の分割境界情報は100%信頼できるとは言えなません。
   このため、手元に利用可能な言語資源があれば、それで置き換えることをお
   すすめします。特に、日本語書き言葉均衡コーパス(BCCWJ) は様々な分野の
   テキストに対して非常に精度の高いアノテーションを行ってあるため、
   KyTea の学習に適しています。

3) アノテーションしたい生コーパスを data/target-train.raw に移します。

4) 辞書(複数可)がある場合は、それらの辞書ファイル(ここでは dict-1.txt
   と dict-2.txt とする) を data/ フォルダに移し、makemodel.sh を編集し
   て DICTS 変数にこの辞書のパスを追加します。この例では、以下のよ
   うになります。

     GEN_DICTS="-dict data/dict-1.txt -dict data/dict-2.txt"

   ここで　注意すべき点はいくつかあります。１つ目は、UniDic などの単語
   コーパスの単語分割基準に合った網羅的な辞書があれば、単語分割の精度が
   ない場合に比べて非常に高くなります。手に入れば利用をおすすめします。
   また、従来の形態素解析と違って、辞書は必ずしもコーパスの単語分割基準
   に沿っていなくても精度は落ちません。分野内の複合語の辞書を利用すれば
   さらなる精度向上が実現可能となります。ただし、２つの異なる辞書を利用
   する場合、１つのファイルとしてではなく、以上の例のように個別に読み込
   むほうが精度が高くなります。


~~~~ アノテーション ~~~~~

準備ができたら実際のアノテーションに移ります。以下の３ステップを数十回
繰り返すと、適応分野における分割精度はかなり上がります。

1) 現在持っている言語資源(コーパスと辞書)でモデルを作成し、アノテーショ
   ンすべき箇所を選択します。

     [user@machine]$ ./makemodel.sh

   ※この結果得られる work/XXX.mod (XXX は数字)が、各繰り返し時点での
     KyTea のモデルファイルです。つまり、最も大きい数字のファイルが最良
     のモデルです。
   ※言語資源の量によりますが、おおよそ5分ぐらいかかります。


2) work/XXX.annotにできるファイルの中の「!」を「|」や「-」 に書き換え
   、「!」の周りに間違った単語境界があればそれも直します。ここで XXX
   は数字であり、最も大きい数字のファイルをアノテーションして下さい。
   アノテーションが困難な箇所があれば、 「|」と「-」の代わりに「?」を
   入れてアノテーションされていないままにすることもできます。

3) 新しいファイルを保存します。

     [user@machine]$ ./saveannot.sh

   ※「Double boundary ' |' at XXX」のようなエラーが起こった場合はXXX
    行目にアノテーションの形式が誤っている（具体的には、空白を消さずに
    単語境界「|」を入れている）ので、 アノテーションファイルを直して、
    もう一度./saveannot.shを直してください。
   ※この後 1) に戻ります。

アノテーションが終わったら、部分的アノテーションされたコーパスは
save/XXX.wannとして保存されます。新たにKyTeaを学習する場合、"-part 
save/XXX.wann"のオプションを指定すると、部分的アノテーションされた資源
を利用してモデルを学習することができます。

~~~~ 注意すべきこと ~~~~

o XXX.annot ファイルの中で、文の最初の文字の前や最後の文字の後ろに「|」
  や「-」を入れないでください。

o 「save/XXX.wann」と「work/XXX.wordprob」ファイルは毎回保存されるため
  、もとの生コーパスが大きい場合、ディスクの容量がかかります。アノテー
  ションされた物が誤って消去されるのを防ぐため自動では消しておりません
  が、容量が足りない場合は古いものを手動で消してください。

以上
