Travatarの学習

English

本ページは、Travatarを使った翻訳モデルの作成方法について説明します。 特に、英日翻訳を例に使いますが、他の言語対でも同様の処理でモデルを作成することができます。 問題や分からないところがあった場合は、気軽にメインページに書いてある連絡先へメールをいただければ、お答えします。

ソフトのインストール

まず、ディレクトリを作って、そこへ移動します。

mkdir ~/travatar-tutorial
cd ~/travatar-tutorial

まず、Travatarの最新版をインストールします。 ダウンロードページへ移動し、travatar-tutorialディレクトリ下のtravatarディレクトリへプログラムを入れます。 下記の通り、コマンドを動かして、ヘルプメッセージが表示されればOKです。

cd ~/travatar-tutorial
travatar/src/bin/travatar --help

Travatarに加えて、入力文の構文解析を行う構文解析器、出力文の単語分割(トークン化)を行うトークナイザ、単語の対応付けを行うアライナーが必要です。 本ページでは、英語の構文解析にCkylark、日本語の単語分割にKyTea、単語の対応付けにGIZA++を利用します。 まず、それぞれのサイトに行って、ツールの最新版をダウンロードしてインストールしましょう。

Ckylarkに関しては、まずgithubからコードをダウンロードしてから、ディレクトリに入ってプログラムをコンパイルします。

cd ckylark
autoreconf -i
./configure
make
cd ~/travatar-tutorial

KyTeaは下記の通りの手順でコンパイルできます(0.4.7以外のバージョンを使っている場合はバージョン番号を適当に修正してください)。

tar -xzf kytea-0.4.7.tar.gz
cd kytea-0.4.7
./configure --prefix=$HOME/travatar-tutorial/usr
make
make install
cd ~/travatar-tutorial

GIZA++のコンパイル手順は下記の通りです。

tar -xzf giza-pp*.tar.gz
cd giza-pp
make
cp GIZA++-v2/GIZA++ GIZA++-v2/*.out mkcls-v2/mkcls .
cd ~/travatar-tutorial

学習データの収集

次に、翻訳・言語モデルの学習データが必要です。 本ページでは、京都フリー翻訳タスクのデータを利用します。 下記のコマンドを使ってデータを入手できます。

wget http://www.phontron.com/kftt/download/kftt-data-1.0.tar.gz
tar -xzf kftt-data-1.0.tar.gz

データの準備

次に、データをTravatarが使える形へと前処理を行う必要があります。 つまり、入力文の構文解析と、出力文の単語分割を行います。 (これを1回自分でコマンドを動かして行うことをおすすめしますが、手順を理解してから、Travatarに含まれている前処理スクリプトを使うと便利です。) まず、データディレクトリを作成します。

mkdir data

トークン化

まずは、トークン化(つまり単語分割)を行います。 英語に関しては、Travatarに含まれているトークン化プログラムを使います。

travatar/src/bin/tokenizer < kftt-data-1.0/data/orig/kyoto-train.en > data/kyoto-train.tok.en

ここで、data/kyoto-train.tok.enを開いてみれば、単語はトークン化されている(つまり単語と句読点の間にスペースが入っている等)ことが分かります。 同じ処理をkyoto-devkyoto-testに対して行います。

travatar/src/bin/tokenizer < kftt-data-1.0/data/orig/kyoto-dev.en > data/kyoto-dev.tok.en
travatar/src/bin/tokenizer < kftt-data-1.0/data/orig/kyoto-test.en > data/kyoto-test.tok.en

次に、日本語をKyTeaでトークン化します。 -notags-wsconst Dを追加していますが、これは品詞付与を行わなず、数字の分割を抑制するためです。

usr/bin/kytea -notags -wsconst D < kftt-data-1.0/data/orig/kyoto-train.ja > data/kyoto-train.tok.ja

data/kyoto-train.tok.jaもきちんとトークン化されていることを確認してから、同じ処理をkyoto-devkyoto-testに対して行います。

usr/bin/kytea -notags -wsconst D < kftt-data-1.0/data/orig/kyoto-dev.ja > data/kyoto-dev.tok.ja
usr/bin/kytea -notags -wsconst D < kftt-data-1.0/data/orig/kyoto-test.ja > data/kyoto-test.tok.ja

学習データから長文の削除

学習データに非常に長い文が含まれる時、構文解析や単語アライメントに多くの時間がかかったり、失敗したりする原因になります。 長文をデータから削除するために、Travatarのclean-corpus.plスクリプトを使います。 (-max_lenの値を変えることで、文の最大長を調整することができます。)

travatar/script/train/clean-corpus.pl -max_len 60 data/kyoto-train.tok.en data/kyoto-train.tok.ja data/kyoto-clean.tok.en data/kyoto-clean.tok.ja

また、通常は翻訳システムを作成する際になるべく多くの学習データを使いたいところですが、今回はチュートリアルなので、学習時間短縮のらめに、最初の2万文のみを使うことにします。

head -20000 < data/kyoto-clean.tok.en > data/kyoto-head.tok.en
head -20000 < data/kyoto-clean.tok.ja > data/kyoto-head.tok.ja

以降のコマンドでkyoto-headではなく、kyoto-cleanを利用すると、全データでシステムを学習することが可能です。

構文解析

次に、Ckylarkを使って、学習データの英文の構文解析を行います。

ckylark/src/bin/ckylark --add-root-tag --model ckylark/data/wsj < data/kyoto-head.tok.en > data/kyoto-head.parse.en

kyoto-devkyoto-testに対して同じ処理を行います。

ckylark/src/bin/ckylark --add-root-tag --model ckylark/data/wsj < data/kyoto-dev.tok.en > data/kyoto-dev.parse.en
ckylark/src/bin/ckylark --add-root-tag --model ckylark/data/wsj < data/kyoto-test.tok.en > data/kyoto-test.parse.en

構文解析は時間がかかりますので、特に学習データの解析は時間が結構かかります(1〜2時間)。 高速化を含め、構文解析に関する諸事項は構文解析のページに詳しく書いてあります。

言語モデルの学習

他の統計的機械翻訳システムと同様に、Travatarは出力の流暢性を担保するための言語モデル(LM)を利用します。 言語モデルを学習するために、まずディレクトリを作成します。

mkdir lm

次に、出力言語のデータを小文字化します。

travatar/script/tree/lowercase.pl < data/kyoto-train.tok.ja > data/kyoto-train.toklow.ja

これに対して、Travatarと同梱されているlmplzを実行します。

travatar/src/kenlm/lm/lmplz -o 5 < data/kyoto-train.toklow.ja > lm/kyoto-train.ja.arpa

出来上がった言語モデルファイルを、読み込みの効率化のために、バイナリ化します。

travatar/src/kenlm/lm/build_binary -i lm/kyoto-train.ja.arpa lm/kyoto-train.ja.blm

翻訳モデルの学習

翻訳モデルの学習には、構文解析済みの学習データが必要ですので、構文解析が終わるまで待ちます。 学習データの構文解析が終わったら、まず解析結果に対して小文字化を行います。 (こうすることにより、大文字と小文字の単語を別の単語として扱わないようにします。)

travatar/script/tree/lowercase.pl < data/kyoto-head.parse.en > data/kyoto-head.parselow.en
travatar/script/tree/lowercase.pl < data/kyoto-head.tok.ja > data/kyoto-head.toklow.ja

同じ処理をkyoto-devkyoto-testに対して行います。

travatar/script/tree/lowercase.pl < data/kyoto-dev.parse.en > data/kyoto-dev.parselow.en
travatar/script/tree/lowercase.pl < data/kyoto-dev.tok.ja > data/kyoto-dev.toklow.ja
travatar/script/tree/lowercase.pl < data/kyoto-test.parse.en > data/kyoto-test.parselow.en
travatar/script/tree/lowercase.pl < data/kyoto-test.tok.ja > data/kyoto-test.toklow.ja
データの準備が終わったら、Travatarの学習スクリプトを動かします。 学習スクリプトは、構文解析済みの英語、トークン化済みの日本語、言語モデル、という3通りの入力を受け取ります。 GIZA++とTravatarのディレクトリを指定し、学習済みのモデルファイルが出力されるディレクトリwork_dirを指定します。 学習は時間がかかりますので、&を追加することで背景で動かして、nohupを先頭につけます。 また,並列処理が可能なパソコンを使っている場合は、スレッド数を-threadsコマンドを指定すると、学習が早く終わります。 (特に、下記の通り2以上の数字を指定すると早くなります。)

nohup travatar/script/train/train-travatar.pl -work_dir $HOME/travatar-tutorial/train -lm_file $HOME/travatar-tutorial/lm/kyoto-train.ja.blm -src_file data/kyoto-head.parselow.en -trg_file data/kyoto-head.toklow.ja -travatar_dir travatar -bin_dir giza-pp -threads 2 &> train.log &

学習が終わり次第、train.logを見て、学習が無事に終わったことを確認します。 無事に終了した場合は最後に「Finished training!」が書いてあり、何か問題があった場合はだいたいエラーがあります。 エラーが出て、理由が分からない場合は遠慮なくメインページの連絡先へtrain.logなどを送って、質問してください。 また、学習には様々なオプションがあり、精度の向上につながることがありますので、1回チュートリアルを一通り終わらせてから学習オプションのページをご覧下さい。

チューニング

上記の学習プロセスは翻訳モデルを作成し、一応訳を生成できるようになります。 しかし、良い翻訳精度を実現するために、翻訳モデル・言語モデル・単語ペナルティなどの重みを最適化するチューニングが必要です。

重みのチューニングをmert-travatar.plスクリプトで行います。 チューニングの際に、開発データ(kyoto-dev)を何回か翻訳する必要があるので、時間がそこそこかかります。

nohup travatar/script/mert/mert-travatar.pl -travatar-config train/model/travatar.ini -nbest 100 -src data/kyoto-dev.parselow.en -ref data/kyoto-dev.toklow.ja -travatar-dir travatar -working-dir tune &> tune.log &

これも、1分以内と早く終了した場合は、問題がある可能性が高いので、tune.logを確認してください。 また、複数のコアを使ってチューニングを早くしたい場合は、-threads XXオプションを指定します。(XXは使いたいコア数です。)

精度評価

チューニングが無事に終了すれば、最適化されたモデルはtune/travatar.iniに入っているはずです。 これを使って、評価用テキストkyoto-testを翻訳し、精度を評価します。 その前に、モデルファイルが大きくて多くのメモリを必要とするため、翻訳に必要ないルールをあらかじめ削除するようにフィルタリングをかけます。

mkdir test
travatar/script/train/filter-model.pl tune/travatar.ini test/filtered-test.ini test/filtered-test "travatar/script/train/filter-rt.pl -src data/kyoto-test.parselow.en"

ここで、最後の引数はフィルタリングに用いるコマンドです。 -srcオプションを、翻訳するファイルにします。 フィルタリングが終わり次第、翻訳を行います。 (前と同じく、-threads XXを追加することでスピードを向上させることができます。)

travatar/src/bin/travatar -config_file test/filtered-test.ini < data/kyoto-test.parselow.en > test/kyoto-test.out

最後に、翻訳の精度を、自動評価尺度を使って評価します。 参照文とシステム出力をmt-evaluatorプログラムに入れて、評価します。 他のオプションを評価のページに書いてあります。

travatar/src/bin/mt-evaluator -ref data/kyoto-test.toklow.ja test/kyoto-test.out

これでうまく行ったなら、BLEUが10-12、RIBESが56-58ぐらいの値になります。 精度を更に向上させたい場合は、構文解析学習オプションのページを見ます。