kenkovlog

けんこふたんっオフィシャユブヨグッ
アンッ!アンッ!アンッ!アンッ!

Moses をインストールした

Moses をインストールした。 以下のインストールは http://www.statmt.org/moses/ にあるMoses の公式ドキュメントに従っている。

Moses のインストール

github からインストール

$ cd
$ git clone git://github.com/moses-smt/mosesdecoder.git
$ cd mosesdecoder
$ ./bjam -j4

-j オプションでコア数を指定する。僕のマシンは4 つなので -j4

これでdecoding は出来るが、自分のモデルを訓練しようと思うと

  • GIZA++ (IBM モデルに基づいたword probability, word alignment のトレーニング)
  • IRSTLM (language model)

をインストールする必要がある。

GIZA++, IRSTLM のインストール

まずGIZA++ は

$ cd
$ wget http://giza-pp.googlecode.com/files/giza-pp-v1.0.7.tar.gz -O - | tar vxzf -
$ cd giza-pp
$ make

する。次にスクリプトをmosesdecoder 以下に配置する。

$ cd ~/mosesdecoder
$ mkdir tools
$ cp ~/giza-pp/GIZA++-v2/GIZA++ ~/giza-pp/GIZA++-v2/snt2cooc.out ~/giza-pp/mkcls-v2/mkcls tools

実行する時には、

train-model.perl -external-bin-dir $HOME/mosesdecoder/tools

という感じで -external-bin-dir を付ける。

IRSTLM はまず公式サイト http://sourceforge.net/projects/irstlm/ からソースをDL してきて、 次に

$ cp Downlaods/irstlm-5.80.01.tgz ~
$ tar zxvf irstlm-5.80.01.tgz
$ cd irstlm-5.80.01
$ ./regenerate-makefiles.sh
$ ./configure --prefix=$HOME/irstlm
$ make install

ただ、このままやるとregenerate-makefiles.sh する時に

configure.in:8: error: 'AM_CONFIG_HEADER': this macro is obsolete.
    You should use the 'AC_CONFIG_HEADERS' macro instead.

と怒られるので、 configure.in の中の AM_CONFIG_HEADERAC_CONFIG_HEADERS に置換してから実行する。

コーパスの準備

まずはコーパスの準備をしましょう。ここでは日本語<->英語のパラレルコーパスを持っているとします。 英語のセンテンスを ~/jec/corpus/jec.en 、日本語のセンテンスを ~/jec/corpus/jec.en というファイルに、順番に 対応するように配置します。

ここまででファイルは次のようになっています。

$ tree ~/jec
jec
├── corpus
    ├── jec.en
    └── jec.ja

次に

  • tokenize
  • truecasing
  • cleaning

します。truecasing のためのモデルが今回はないため tokenize と cleaning のみ行います。

まずはtokenize:

$ ~/mosesdecoder/scripts/tokenizer/tokenizer.perl -l en < ~/jec/corpus/jec.en > ~/jec/corpus/jec.tok.en
#日本語にはmecab を使う
$ mecab -O wakati < ~/jec/corpus/jec.ja > ~/jec/corpus/jec.tok.ja

次にcleaning します。これで長いセンテンスを落とします。

$ ~/mosesdecoder/scripts/training/clean-corpus-n.perl ~/lm/corpus/jec.tok ja en ~/lm/jec.clean 1 80

Language Model の学習

~/jec/corpus 以下にjec.en, jec. ja を用意する。

corpus $ ~/mosesdecoder/scripts/training/clean-corpus-n.perl ~/jec/corpus/jec ja en ~/jec/corpus/jec.clean 1 80

Language Model をirstlm を使ってトレーニングする:

$ mkdir ~/jec/lm
$ ~/irstlm/bin/add-start-end.sh < ~/jec/corpus/jec.en > ~/jec/lm/jec.sb.en
$ env IRSTLM=$HOME/irstlm ~/irstlm/bin/build-lm.sh -i  ~/jec/lm/jec.sb.en  -t ~/jec/lm/tmp  -p  -s improved-kneser-ney -o ~/jec/lm/jec.lm.en
$ ~/irstlm/bin/compile-lm --text yes ~/jec/lm/jec.lm.en.gz ~/jec/lm/jec.arpa.en
# 圧縮
$ ~/mosesdecoder/bin/build_binary  ~/jec/lm/jec.arpa.en  ~/jec/lm/jec.blm.en

MT system の学習

さて、word alignment やphrase を学習してみましょう。

$ ~/mosesdecoder/scripts/training/train-model.perl -root-dir ~/jec/train -corpus ~/jec/corpus/jec.clean -f ja -e en -alignment grow-diag-final-and -reordering msd-bidirectional-fe -lm 0:3:$HOME/jec/lm/jec.blm.en:8 -external-bin-dir ~/mosesdecoder/tools -cores 4 > ~/jec/train/training.out

これでやると -reordering msd-bidirectional-fe のオプションで

Executing: /Users/kenkov/mosesdecoder/scripts/../bin/lexical-reordering-score /Users/kenkov/jec/train/model/extract.o.sorted.gz 0.5 /Users/kenkov/jec/train/model/reordering-table. --model "wbe msd wbe-msd-bidirectional-fe"
Lexical Reordering Scorer
scores lexical reordering models of several types (hierarchical, phrase-based and word-based-extraction
libc++abi.dylib: terminate called throwing an exception
ERROR: Execution of: /Users/kenkov/mosesdecoder/scripts/../bin/lexical-reordering-score /Users/kenkov/jec/train/model/extract.o.sorted.gz 0.5 /Users/kenkov/jec/train/model/reordering-table. --model "wbe msd wbe-msd-bidirectional-fe"
  died with signal 6, with coredump

とエラーがでるので、 -reordering msd-bidirectional-fe のオプションをとって

$ ~/mosesdecoder/scripts/training/train-model.perl -root-dir ~/jec/train -corpus ~/jec/corpus/jec.clean -f ja -e en -alignment grow-diag-final-and -lm 0:3:$HOME/jec/lm/jec.blm.en:8 -external-bin-dir ~/mosesdecoder/tools -cores 4 > ~/jec/train/training.out

を実行した。

ここまで完了すると次のようになっているはず。

$ tree ~/jec
./jec├── corpus
│   ├── jec.clean.en
│   ├── jec.clean.ja
│   ├── jec.en
│   ├── jec.ja
│   ├── jec.tok.en
│   └── jec.tok.ja
├── lm│   ├── jec.arpa.en
│   ├── jec.blm.en
│   ├── jec.lm.en.gz
│   └── jec.sb.en
└── train
    ├── corpus
    │   ├── en-ja-int-train.snt
    │   ├── en.vcb
    │   ├── en.vcb.classes
    │   ├── en.vcb.classes.cats
    │   ├── ja-en-int-train.snt
    │   ├── ja.vcb
    │   ├── ja.vcb.classes
    │   └── ja.vcb.classes.cats
    ├── giza.en-ja
    │   ├── en-ja.A3.final.gz
    │   ├── en-ja.cooc
    │   └── en-ja.gizacfg
    ├── giza.ja-en
    │   ├── ja-en.A3.final.gz
    │   ├── ja-en.cooc
    │   └── ja-en.gizacfg
    ├── model
    │   ├── aligned.grow-diag-final-and
    │   ├── extract.inv.sorted.gz
    │   ├── extract.sorted.gz
    │   ├── lex.e2f
    │   ├── lex.f2e
    │   ├── moses.ini
    │   └── phrase-table.gz
    └── training.out

全部まとめれば

#! /bin/sh
# coding:utf-8

# make corpus
~/mosesdecoder/scripts/tokenizer/tokenizer.perl -l en < ~/jec/corpus/jec.en > ~/jec/corpus/jec.tok.en
mecab -O wakati < ~/jec/corpus/jec.ja > ~/jec/corpus/jec.tok.ja

~/mosesdecoder/scripts/training/clean-corpus-n.perl ~/jec/corpus/jec.tok ja en ~/jec/corpus/jec.clean 1 80

# training
mkdir ~/jec/{lm,train}

~/irstlm/bin/add-start-end.sh < ~/jec/corpus/jec.en > ~/jec/lm/jec.sb.en
env IRSTLM=$HOME/irstlm ~/irstlm/bin/build-lm.sh -i  ~/jec/lm/jec.sb.en  -t ~/jec/lm/tmp  -p  -s improved-kneser-ney -o ~/jec/lm/jec.lm.en
~/irstlm/bin/compile-lm --text yes ~/jec/lm/jec.lm.en.gz ~/jec/lm/jec.arpa.en
~/mosesdecoder/bin/build_binary  ~/jec/lm/jec.arpa.en  ~/jec/lm/jec.blm.en

~/mosesdecoder/scripts/training/train-model.perl -root-dir ~/jec/train -corpus ~/jec/corpus/jec.clean -f ja -e en -alignment grow-diag-final-and -reordering msd-bidirectional-fe -lm 0:3:$HOME/jec/lm/jec.blm.en:8 -external-bin-dir ~/mosesdecoder/tools -cores 4 > ~/jec/train/training.out

~/mosesdecoder/scripts/training/train-model.perl -root-dir ~/jec/train -corpus ~/jec/corpus/jec.clean -f ja -e en -alignment grow-diag-final-and -lm 0:3:$HOME/jec/lm/jec.blm.en:8 -external-bin-dir ~/mosesdecoder/tools -cores 4 > ~/jec/train/training.out

という感じになるはず。

けんこふたん