MOSES

version 1.0になって再度mosesのインストールの試み

前回同様、haseさんの日記(http://d.hatena.ne.jp/hase1031/20120507/1336394611)を参考に
GIZA++, Boost, IRST, SRILM, mosesをインストール

結果:失敗
試行錯誤録:
  • ソースからインストールしたBoostは使えなかった(ソースにboot_iostreamsなどのライブラリが入ってない)のでyum install boostでインストールしたBoostを使用
  •  mosesコンパイル時の./bjam installのオプションとして toolset=gcc link=sharedを追加、  上記を反映させるためwith-boostはつけない( export BOOST_ROOT=""にしとく)
  • うまくいくとmosesdecoder/binに各種実行ファイルが生成されるはずなのだがメインのmoses実行ファイルの生成に失敗する
  • 以下にエラー出力の一部はっときます。 なにか分かる人がいたらご一報をお願いします。
  • [matsumoto@sendai]cat install.log  | grep error:                                                 (/work/matsumoto/Moses/mosesdecoder)
    moses-cmd/Main.cpp:200: error: ‘struct std::basic_string<char, std::char_traits<char>, std::allocator<char> >’ has no member named ‘native’
    [matsumoto@sendai]cat install.log  | grep failed                                                 (/work/matsumoto/Moses/mosesdecoder)
    ...failed gcc.compile.c++ moses-cmd/bin/gcc-4.4.7/release/debug-symbols-on/threading-multi/Main.o...
    ...failed gcc.link.dll moses/bin/gcc-4.4.7/release/debug-symbols-on/threading-multi/libmoses.so...
    ...failed gcc.link.dll /work/matsumoto/Moses/mosesdecoder/lib/libmoses.so...
    ...failed updating 3 targets...

    
 井手上さんのMOSESマニュアルの転載
 (無効リンクタグなどは外しました)
インストールより使用方法の参考目的のため

Mosesのインストール

1. ツールのダウンロード
Moses SMT Decoderからmoses.2007-05-29.tgzをダウンロードして解凍(とりあえず/usr/local/src/MT/src/に)

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 する
gcc version 4.1.2でmakeできた。他のバージョンではmakeの-jオプションが使えなかったりするかもしれません。 -jオプションは4つの並列で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の使用方法

英語から日本語へ翻訳する方法を紹介。(英語から日本語への翻訳時は英語の言語モデルを作成しなくてはならない) この流れで翻訳を行います。照し合せて実行するとわかりやすいかも。

必要なファイル(以下の図も参照)
./MT/dataを作ってそこにおく
  • 翻訳モデルを作るためのパラレルコーパス
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 

各モデルの構築

言語モデルの作成
5gramまでを作成
./MT/lmをつくってそこで実行
$ ngram-count -order 5 -interpolate -kndiscount -text ../data/train500.ja -lm 500k.ja.lm


翻訳モデルの作成
./MT/tmをつくってそこで実行
英語から日本語へ。(日本語から英語の時は-f ja -e en にする。言語モデルも英語版へ変更する。)

まずは/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倍にすることができる。

  • 単語アライメント
  • 翻訳確率の付与
  • reorderingモデルの生成(翻訳講習会では詳細を述べてくれなかった部分)

./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

研究室で遭遇したエラー

  • died with signal 6, without coredump
    • これは、学習コーパスに空行があったせいだった。
  • エラーメッセージは忘れたけど…
    • 「|」は文字としては使えなかった。
  • 翻訳結果が出ず、無限ループしているみたいになる
    • 最新版のMosesにアップグレードしたら直ったみたい
  • チューニングができないエラー


## チューニングエラーメッセージ ##
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を翻訳するときに使用するフレーズのみを抽出している。
これが終わると、e2jmodel_filter/filterd/moses.ini ができるので、それを翻訳のときに指定してあげれば良い。

Comments