version 1.0になって再度mosesのインストールの試み GIZA++, Boost, IRST, SRILM, mosesをインストール 結果:失敗 試行錯誤録:
井手上さんのMOSESマニュアルの転載 (無効リンクタグなどは外しました) インストールより使用方法の参考目的のため Mosesのインストール1. ツールのダウンロード 2. 最新バージョンに変更するためバージョン管理ソフトsvnをいれる(インストール&設定してあるorいらない場合は3へ) # apt-get install subversion ~/.subversion/serversを以下に変更。nagaokaの部分は自分の環境にあったものに変更してください。 [global] # http-proxy-exceptions = *.exception.com, www.internal-site.org http-proxy-host = proxy.nagaokaut.ac.jp http-proxy-port = 8080 # http-proxy-username = defaultusername # http-proxy-password = defaultpassword # http-compression = no # No http-timeout, so just use the builtin default. # No neon-debug-mask, so neon debugging is disabled. # ssl-authority-files = /path/to/CAcert.pem;/path/to/CAcert2.pem 3. make する # cd /usr/local/src/MT/src/trunk # ./regenerate-makefiles.sh 現在のMosesはマルチスレッド対応らしく、処理速度を高速にしたい方はここを参照してください。 # ./configure --with-srilm=/usr/local/src/MT/src/srilm --with-irstlm=/usr/local/src/MT/src/irstlm # make -j 4 古いバージョンのMosesだとコンパイル中に「set_dictionary_upper…」ってな感じのエラーがでていて、IRSTLMが使えなかったりしていたが、新しいバージョン(moses-2009-04-13.tgz)だと解決されてるみたい。 次に、以下を行います。 # cd /usr/local/src/MT/src/trunk/scripts # emacs Makefile ↓以下のようにパスを変更 * TARGETDIR=/usr/local/bin * BINDIR=/usr/local/bin # make all # make release # rm /usr/local/bin/scripts // 既にリンクがあった場合は削除しておく # ln -s /usr/local/bin/scripts-20080213-1554 /usr/local/bin/scripts (20080213-1554はmakeした時間。) # emacs ~/.bashrc ↓以下のように追加又は変更 * export SCRIPTS_ROOTDIR=/usr/local/bin/scripts
2つのモデルを用いて翻訳する。
パラレルコーパス(日<=>英)を使用して、翻訳モデルを作成する。 この翻訳モデルとはフレーズAがフレーズBに対応する、というようなフレーズ対応(アライメント)をとることと、 アライメントを取った後にフレーズ対応の数を数えて、フレーズ翻訳確率を付与。
翻訳を行うときに、言語の繋がりをよくして翻訳。
Mosesの使用方法英語から日本語へ翻訳する方法を紹介。(英語から日本語への翻訳時は英語の言語モデルを作成しなくてはならない) この流れで翻訳を行います。照し合せて実行するとわかりやすいかも。
train10k.row.{en,ja}
train500k.row.ja
dev30.row.{en,ja}
test30.row.{en,ja}
分かち書き(tokenize)と小文字化を行う。分かち書きにはtokenizer.sedが簡単で統一性があるので便利。 (train10k.row.en->train10k.en, dev30.row.en->dev30.en, test30.row.en->test30.en)
ChaSenやMeCabで分かち書きを行う。また、原形にした方が確実に精度は上がります。 (train10k.row.ja->train10k.ja, train500k.row.ja->train500k.ja, dev30.row.ja->dev30.ja, test30.row.ja->test30.ja) chasen -F "%m " train10k.row.ja > train10k.ja 各モデルの構築
$ ngram-count -order 5 -interpolate -kndiscount -text ../data/train500.ja -lm 500k.ja.lm
まずは/usr/local/bin/scripts/training/train-factored-phrase-model.perlを自分のところへコピー。 $ perl train-factored-phrase-model.perl -scripts-root-dir /usr/local/bin/scripts -corpus ../data/train10k --f en --e ja -alignment grow-diag-final-and -reordering msd-bidirectional-fe -lm 0:5:../lm/500k.ja.lm:0 このtrain-factored-phrase-model.perlで、以下の処理すべてを行ってくれる。 また、翻訳モデルの構築には時間がかかるので、CPUコア数が2個以上の場合 --parallel というオプションをつけることで、構築速度を約2倍にすることができる。
./MT/tm/modelに翻訳モデルが作成されているはず。 まずは./MT/tm/model/moses.ini(パラメータ)編集。歪み範囲(語順の変化範囲)を無制限(-1)にする $ cp moses.ini moses.ini.orig $ emacs moses.ini [distortion-limit] -1 ./MT/eval1をつくってそこで実行 翻訳コマンド /usr/local/src/MT/src/trunk/moses-cmd/src にパスを通す $ moses -config ../tm/model/moses.ini -input-file ../data/test30.en > output.ja
moses.iniのパラメータ調整をもっとまじめにするとき $ cp tm/model/moses.ini tm/model/moses.ini.org $ mkdir tune $ cd tune $ perl /usr/local/bin/scripts/training/mert-moses.pl ../data/dev30.en ../data/dev30.ja /usr/local/src/MT/src/trunk/moses-cmd/src/moses ../tm/model/moses.ini --working-dir /lab/takemoto/tune もし、フィルタリングされたフレーズテーブルなどを使用しないで、バイナリデータを使用したい場合は以下のオプションを追加する。 --no-filter-phrase-table チューニングされたmodel.iniファイルは、tuneディレクトリ内にある。 $ cp moses.ini ../tm/model/ BLEUスコアを見たいときは、tuneディレクトリで、 $ grep "BLEU" run*.moses.ini run1.moses.ini:# BLEU --not-estimated-- on dev /home/takemoto/smt/data/J2V/trash/2200_morph.ve run2.moses.ini:# BLEU 0.084297 on dev /home/takemoto/smt/data/J2V/trash/2200_morph.ve run3.moses.ini:# BLEU 0.120487 on dev /home/takemoto/smt/data/J2V/trash/2200_morph.ve run4.moses.ini:# BLEU 0.129202 on dev /home/takemoto/smt/data/J2V/trash/2200_morph.ve チューニングを途中から続けたい場合は、以下のオプションを追加して再実行すればいいかも・・・ --continue 研究室で遭遇したエラー
## チューニングエラーメッセージ ## After default: -l mem_free=0.5G -hard Using SCRIPTS_ROOTDIR: /usr/local/bin/scripts Not executable: /usr/local/bin/scripts/training/cmert-0.5/enhanced-mert at /usr/local/bin/scripts/training/mert-moses.pl line 290. */解決策/* $ emacs /usr/local/bin/scripts/training/mert-moses.pl my $cmertcmd="$SCRIPTS_ROOTDIR/training/cmert-0.5/enhanced-mert ↓プログラム名の変更 my $cmertcmd="$SCRIPTS_ROOTDIR/training/cmert-0.5/mert $ emacs tm/model/moses.ini [lmodel-file] 0 0 5 ../lm/nikkei99.lm ↓絶対パスを通す 0 0 5 /home/ohashi/smt/lm/nikkei99.lm
$ mkdir e2jmodel_filter $ cd e2jmodel_filter $ filter-model-given-input.pl filterd ../e2jmodel/model/moses.ini ../data/test.en これはtest.enを翻訳するときに使用するフレーズのみを抽出している。 |