moses で phrase-table.gz が上手く生成されない時の対処法


統計的機械翻訳システム Moses を使って、英語から日本語への自動翻訳システムを作りました。翻訳文の生成には moses.ini と phrase-table.gz(圧縮ファイル) が必要なのですが、この phrase-table.gz を展開しても何も記述されておらず、翻訳も上手くいかなかった時の対処法です。

翻訳システムの作り方自体は 以下のリンクを参考にしました。

統計的機械翻訳システム Moses で遊ぶ
Google翻訳(みたいなもの)を自作してみた。

作業環境

  • Linux (CentOS)
  • mosesdecorder (RELEASE-4.0)
  • boost_1_67_0
  • giza-pp

原因に関連して起こる症状

① model/phrase-table.gz を展開しても何も入ってない

phrase-table.gzを解凍して先頭の10行を表示する
$ gzip -dc model/phrase-table.gz | head
$ 

② 翻訳システムを起動しても表示が変になる

Mosesを実行した時の表示(誤り)
$ moses -f model/moses.ini
Created input-output object : [1.562] seconds
This is a pen.
Translating: This is a pen. 
Line 0: Initialize search took 0.000 seconds total
Line 0: Collecting options took 0.000 seconds at moses/Manager.cpp Line 141
Line 0: Search took 0.000 seconds
This is a pen. 
BEST TRANSLATION: This|UNK|UNK|UNK is|UNK|UNK|UNK a|UNK|UNK|UNK pen.|UNK|UNK|UNK [1111]  [total=-426.251] core=(-400.000,-4.000,4.000,0.000,0.000,0.000,0.000,0.000,-62.102)  
Line 0: Decision rule took 0.000 seconds total
Line 0: Additional reporting took 0.000 seconds total
Line 0: Translation took 0.001 seconds total

 原因

翻訳モデルの学習が Step5 で止まっている
(止まってはいるものの上手くいっているかの様に次の処理を始める)

Training Step
1 Prepare data
2 Run GIZA
3 Align words
4 Lexical translation
5 Extract phrases  ← これ
6 Score phrases
7 Reordering model
8 Generation model
9 Configuration file
Moses公式サイトより

(5) extract phrases @ Tue Jun 26 17:10:00 JST 2018
   ⁝
   (中略)
   ⁝
sh: ~/temp/mosesdecoder/scripts/../bin/extract: No such file or directory

よく見てみると、Step5で mosesdecoder 以下に /bin/extract が無いと言われています。
Moses公式のサポートページを読んでみると、 mosesdecoder/bin/extract が無い場合、mosesのコンパイルが上手くいっていない可能性があるとのこと。

extractのアドレスを探すコマンド
$ which extract
~/.local/bin/extract

確かに変な所にありますね…

Mosesをinstallした時のコマンド
$ git clone https://github.com/moses-smt/mosesdecoder.git
$ cd mosesdecoder
$ make -f contrib/Makefiles/install-dependencies.gmake
$ ./compile.sh [additional options]

私はここで、./compile.sh--prefix=$HOME/.local --install-scriptsオプションをつけてコンパイルしました。これが原因だった様です。

対処法

./compile.shは、--prefix=オプションは mosesdecoder ディレクトリを直接指定する。

Mosesをinstallする正しいコマンド
$ git clone https://github.com/moses-smt/mosesdecoder.git
$ cd mosesdecoder
$ make -f contrib/Makefiles/install-dependencies.gmake
$ ./compile.sh --prefix=$HOME/.../mosesdecoder --install-scripts

mosesdecoder/bin/extract が出来ており、翻訳モデルもNo such file or directoryが表示されることはありませんでした。その結果、phrase-table.gz が上手く生成され、自動翻訳システムも正常に動作させることが出来ました。