More than 1 year has passed since last update.


参考

統計的機械学習システムMosesで遊ぶ


対話コーパスの準備

田中コーパスをダウンロードする

mkdir ~/workspace/smt/corpus

cd ~/workspace/smt/corpus
wget ftp://ftp.monash.edu.au/pub/nihongo/examples.utf.gz

ダウンロードしたgzファイルを解凍してtxtファイルに保存

gzip -dc examples.utf.gz > examples.txt

行頭にA:がある行は、日英対訳コーパスである。

B:行は表記ゆれなど、追加情報が記載されている。


tanaka_corpus.txt

A: ムーリエルは20歳になりました。     Muiriel is 20 now.#ID=1282_4707

B: は 二十歳(はたち){20歳} になる[01]{になりました}
A: すぐに戻ります。 I will be back soon.#ID=1284_4709
B: 直ぐに{すぐに} 戻る{戻ります}
...

このファイルから必要な部分を切り出す

gzip -dc examples.utf.gz | grep ^A: | cut -f1 | sed 's/^A: //' | mecab -Owakati >tanaka.ja

gzip -dc examples.utf.gz | grep ^A: | cut -f2 | sed 's/#.*$//' >tanaka.en

コマンド
説明

cut
タブ区切りになっているのでフィールド(列)ごとに分割できる

mecab
日本語文を単語に分割

grep ^A:
"A:"を含む行を検索し、その表の先頭を示す(^)

sed 's/^A: //'
行頭の"A:"を削除

sed 's/#.*$//'
"#"とその後に続く文字を削除


言語モデルの学習

日本語側のファイルから言語モデルを学習する

言語モデル:ある単語の列を与えると、日本語としての流暢さによって得点をつけてくれる関数のようなもの

機械翻訳では言語モデルを利用することで翻訳候補の中から自然なものが選ばれるようにする

Mosesに同梱されているKenLMを用いて言語モデルを学習する

KenLMでの言語モデル学習を行う

~/workspace/mosesdecorder/bin/lmplz -o 5 -S 80% -T /tmp < tanaka.ja >tanaka.ja.arpa


翻訳モデルの学習

日英の対訳コーパスから、翻訳モデルを学習する

翻訳モデル:英語と日本語の単語列を与えると、対訳の適切さによって得点をつけてくれる関数のようなもの

cd ~/workspace/smt

~/workspace/mosesdecorder/scripts/training/train-model.perl \
--root-dir . \
--corpus corpus/tanaka \
--f en \
--e ja \
--lm 0:5:$HOME/smt/corpus/tanaka.ja.arpa \
--external-bin-dir ./mosesdecoder/tools

コマンド
説明

--corpus, --f, --e
--corpusの値に--fと--eの拡張子を追加したものを対訳コーパスの各言語側のファイルとして読み込む --fが翻訳元、--eが翻訳先

--lm
言語モデルの指定

--external-bin-dir
Moses以外のプログラムの実行ファイルが存在するパスを指定

最終的な結果はmodel/phrase-table.gz


英和翻訳を試す

model/moses.iniの設定ファイルを編集

利用する言語モデルの種類をSRILM → KenLMに修正

SRILM name=LM0 factor=0 path=/home/y-uti/smt/corpus/tanaka.ja.arpa order=5


KENLM name=LM0 factor=0 path=/home/y-uti/smt/corpus/tanaka.ja.arpa order=5

プログラムを実行

-fオプションに設定ファイルを指定する

言語モデル、翻訳モデルの指定などは設定ファイルに書かれている

~/workspace/mosesdecoder/bin/moses -f model/moses.ini

言語モデル、翻訳モデルが読み込まれた後、入力モードになる

英語を入力すると翻訳された日本語が出力される