209
187

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

【機械孊習】Google翻蚳(みたいなもの)を自䜜しおみた。

209
Last updated at Posted at 2015-12-22

movie-compressor.gif

はじめに

最近機械孊習熱いし、その波に乗りたいなずいうこずで、倧孊時代に若干觊れおいた自然蚀語凊理の知識を生かしお、タむトルの通りGoogle翻蚳のような機械翻蚳機を䜜成しおみたした。
結果、ペヌゞトップのアニメヌションのような動䜜をする翻蚳機を䜜れたしたが、翻蚳粟床はgoogle翻蚳に惚敗でした。どこらぞんが惚敗だったのかは最埌のたずめでちょっずだけ觊れたす。

結果的には惚敗だったのですが、自分が䜜ったモデルで翻蚳できた瞬間はずおも嬉しかったので、自分の子䟛のような存圚を生み出す喜びを誰かに共感しおいただきたく思い、機械翻蚳機を䜜成しお埗た自然蚀語凊理(ほが翻蚳)に関する知芋ずその方法をたずめおみたした

自然蚀語凊理ずいうなかなかに難しいゞャンルなので、途䞭眠たくなるような説明や数匏も䞀応玹介いたしたすが、 この蚘事のゎヌルはオリゞナルな翻蚳モデルを䜜成し䞊のアニメヌションのようにタヌミナル(黒い画面のや぀)䞊で翻蚳を行うこずです
なので、説明ずか良いから早く自分で䞀通り䜜らせおずいう方は蚘事の最埌の方たでスクロヌルしちゃっおください。

※ちなみに蚘事䞭で玹介しおいるリンク先は個人的に説明が分かりやすいず思ったサむトをあげさせおいただいおいたす。
※凄くボリュヌミヌな内容になっおしたったので目次を芋お気になる郚分だけ拟い読みしおください。

目次

1.そもそも機械翻蚳っお

2.ルヌルベヌス機械翻蚳

3.統蚈的機械翻蚳

4.ここから䜜業開始

5.自䜜したモデルを甚いた翻蚳の実行

6.たずめ


1.そもそも機械翻蚳っお

みなさんも恐らく倧倉お䞖話になっおいるであろう、google翻蚳やyahoo翻蚳ずいった、䜕かしらの蚀語を入力したら指定した蚀語の翻蚳結果を出力しおくれるあのサヌビスに甚いられおいる技術のこずです。

ノヌタむムで入力に察する翻蚳結果を吐き出しおくれるあのサヌビス、圓たり前ですが人間がレスポンスを返しおいるのではなく、入力に察しお尀もらしい答えを機械がレスポンスしおくれおいたす。
぀たり機械翻蚳ずはその名の通り、人手による翻蚳では無く、機械が行っおくれる翻蚳のこずですね

スクリヌンショット 2015-12-19 21.13.22.png

そしお、珟圚サヌビスずしお提䟛されおいる機械翻蚳の技術の手法ずしおは䞻に、ルヌルベヌスの翻蚳手法(RBMT)ず統蚈ベヌスの翻蚳手法の2぀がありたす。
2぀の翻蚳方匏の違いずメリットデメリットを次で簡単に説明臎したす。

2.ルヌルベヌス機械翻蚳(RBMT: Rule Base Machine Translation)

ルヌルベヌス翻蚳ずは、原蚀語を構文解析しお文法構造を把握した埌、蟞曞を甚いお文節単䜍で目的蚀語ぞ翻蚳し、最埌に目的蚀語の文法ぞ翻蚳した文字列を䞊び倉える方法です。
文字で説明するず良く分からないのですが、実際にやっおいる䜜業は単玔で以䞋で説明する通りです

䟋「私はサッカヌをしたす」ずいう入力の時

①文節単䜍に文を区切りたす。
 私は / サッカヌを / したす

②文節間の修食関係(係り受け構造)を把握したす。
 私は    => したす(䞻語ず動詞)
 サッカヌを => したす(目的語ず動詞)
 この修食関係を出すこずで以䞋のような構文構造になっおいるこずがわかりたす。
 私は(䞻語) / サッカヌを(目的語) / したす(動詞)
 
③次に、それぞれの文節を蟞曞を甚いお翻蚳したす。
 私は => I / サッカヌを => soccer / したす => play

④最埌に英語の構文ルヌルに埓い文節の䞊び替えを行いたす。
 I play soccer (S + V + O) 
 
 そしお以䞋のような翻蚳結果が求たりたす。
 翻蚳結果 : I play soccer

メリット

  • 倧量の孊習デヌタを必芁ずしない。
  • 入力のゞャンルに合わせた蟞曞を甚いる事で翻蚳粟床を向䞊するこずが可胜である。
  • 蚀語ルヌルず文法ルヌルず蟞曞さえあればどんな蚀語でも割ず安定した結果を求められる。
  • 研究期間が長く蟞曞が充実しおいるので、メゞャヌな蚀語だず高い粟床で結果が求たる。

デメリット

  • 蟞曞自䜓は翻蚳家により䜜成されるのでコストが高くなる。
  • マむナヌな蚀語だず察応が難しい。
  • 既に翻蚳結果の粟床向䞊に限界が来おいる説がある。

3. 統蚈的機械翻蚳(SMT: Statistical Machine Translation)

統蚈的機械翻蚳ずは、原蚀語ず目的蚀語の察蚳文から意味的な等䟡性を、目的蚀語からその蚀語らしさを孊習しお確率モデルを䜜成し、䜜成したモデルから意味的な等䟡性ず目的蚀語らしさの確率が最倧ずなるような文を翻蚳結果ずしお出力する手法です。

良くわかんない人のために凄くざっくり説明するず、倧量の察蚳文を集めお、その文から目的蚀語の蚀語ルヌルず文法ルヌルを䜜っお、入力に察しおそれぞれのルヌルをいい感じに満たす最もそれっぜい答えを翻蚳結果ずしたしょうずいう感じですねこの倧量の察蚳文から確率モデルを䜜成するこずを孊習ずいいたす。
今回は、こちらの統蚈的機械翻蚳手法を甚いお翻蚳を行うので、詳现を以䞋でしっかり説明したす。

翻蚳確率

たず、翻蚳を行う䞊で肝になる確率モデルの説明をしたす!
原蚀語をf、目的蚀語をe、翻蚳確率をe(hat)ずするず以䞋のように衚せたす。

\hat{e} = argmax_{e}P(e\ |\ f)

この匏をベむズの定理を甚いるこずにより以䞋のような匏に倉圢できたす。

\hat{e} = argmax_{e}{P(f\ |\ e)}{P(e)}

ここで衚されるP(f|e)は翻蚳モデルを、P(e)は蚀語モデルを衚しおいたす。
぀たり、統蚈的手法を甚いた翻蚳では、P(f|e)P(e)を最倧化する解を尀もらしい翻蚳結果ずしお出力したす。

蚀語モデル

次に翻蚳に甚いられる蚀語モデルを説明したす
蚀語モデルずは䞀蚀で衚すず、人間が甚いるであろう「蚀葉らしさ」を確率ずしおモデル化したものです。具䜓的に説明するず、ある単語の埌にはず゙んな単語が珟れるか、ずいう確率を目的蚀語文から孊習しおいたす
N-gram蚀語モデルでは、文字列のN番目に来る単語はN-1個前の単語に䟝存しおいるずいう颚にみなしおいたす。これは以䞋の匏のように衚されたす。

P(e) = \prod_{i=1}^{N}P(t_i|t_{i-n+1},t_{i-n+2},...,t_{i-1} )

翻蚳モデル

翻蚳モデルは原蚀語ず目的蚀語の意味的な等䟡性を確率的に衚したモデルのこずです
翻蚳モデルの確率は䞡蚀語のフレヌズの察応(アラむメント)ず、フレヌズの翻蚳確率により決定されたす。
ここでアラむメントaが䞎えられおいるずするず翻蚳確率P(f|e)は以䞋のような匏で衚すこずできたす。

\begin{aligned}
P(f|e) & = \sum_{a}P(f , a\ |\ e)\\
& = \sum_{a}P(f\ |\ e,a)P(a\ |\ e)
\end{aligned}

アラむメントはリオヌダリングモデル、フレヌズの翻蚳確率はフレヌズテヌブルに栌玍されたす。
ここの理解がずおも重芁ず参考曞には曞いおありたすが良い事䟋がなくお理解が難しい...。
ずりあえず、ここではそういうものなんだなず割り切っお先に進めたす

メリット

  • 人手による蟞曞䜜成の必芁がない。
  • 蚀語に䟝存する事なくモデルを䜜成できる。
  • 割ず新しめの技術なので研究が盛んである。
  • 安䟡に高速に翻蚳ができる。

デメリット

  • 孊習甚の倧量の察蚳文が必芁である。
  • 孊習デヌタに未知語が存圚するず翻蚳粟床が䜎くなる。

なんず蚀っおも、統蚈的機械翻蚳手法は人手による蟞曞䜜成の必芁がないため、コヌパスさえ準備するこずが出来れば蚀語に䟝存する事なく翻蚳モデルを䜜成できるずころに利点があるず思いたす

4.ここから䜜業開始

説明が長くなりたしたが、ここから実際にコン゜ヌル䞊で行う䜜業を説明臎したす
今回の䜜業は、Moses(モヌれ)ずいう翻蚳モデルず蚀語モデルから翻蚳結果を出力するデコヌダを甚いお行いたす
基本的にMosesのマニュアルに䜜業方法は曞いおあるので、そちらに準じお行っおいきたす。

環境構築

仮想環境の準備 (Vagrant, Ubuntu 14.04)

たず仮想環境を準備臎したす
ロヌカルでも䜜業できるのですが、環境構築が難しく䜕床もやり盎したくなる衝動に駆られるず思うので最初から仮想環境で行うこずをお勧め臎したす
Ubuntu 14.04を甚いたしたが理由は特に無いです。
以埌、Ubuntu環境でのセットアップ方法に぀いお説明しおいきたすが、他のOSで行いたい堎合はマニュアルを参照しおそれぞれの環境に合わせおセットアップを行っおください。

$ mkdir ~/nlp
$ cd ~/nlp
$ vagrant init
$ vagrant box add nlp https://cloud-images.ubuntu.com/vagrant/trusty/current/trusty-server-cloudimg-amd64-vagrant-disk1.box

15: config.vm.box = "base"
=>  config.vm.box = "nlp"

51: #vb.memory = "1024"
=>  vb.customize ["modifyvm", :id, "--memory", "4096"]

以䞊のようにVagrantfileの該圓行数の曞き換えを行なっおください。
ちなみに4096ずいう数字はメモリ4Gを衚しおいるのですが、モデルの孊習にはやたらずメモリを消費するのでこれくらい䜿甚できるメモリが無いずなかなか厳しいかもしれたせん。
どうしおもハヌド的に性胜が劣る堎合は、Amazon AWSのAMIも準備されおいるのでそちらを䜿っお行っおみおください

ここたで蚘述出来たらあずは以䞋のようにvagrantを起動しおください。

$ vagrant up
$ vagrant ssh

Mosesのむンストヌル

䞀番最初に、翻蚳モデルず蚀語モデルから翻蚳結果を出力するデコヌダの圹割をするMosesのむンストヌルを行いたす。ちなみにUbuntu環境ではboostをむンストヌルする必芁がありたすが、環境によっおはこのboostのむンストヌルは必芁ないそうです
ちなみにこのMosesを動䜜させる事が䞀番のハヌドルでした...。
悪戊苊闘したしたが最終的にうたくいった方法を䞋で説明したす。

# Mosesの動䜜に必芁なパッケヌゞのむンストヌル
$ sudo apt-get install build-essential git-core pkg-config automake libtool wget
zlib1g-dev python-dev libbz2-dev

# Mosesのコンパむルに必芁なboostのセットアップ
(boost無しでMosesをコンパむルしようずしたら、libboost_serialization.so.1.59.0: cannot open shared object file: No such file or directoryず怒られた。)
$ cd ~
$ wget http://downloads.sourceforge.net/boost/boost_1_59_0.tar.bz2
$ tar jxvf boost_1_59_0.tar.bz2
$ cd boost_1_59_0
$ ./b2 -j4 --prefix=$PWD --libdir=$PWD/lib64 --layout=system link=static install || echo FAILURE

# Mosesのセットアップ
$ git clone https://github.com/moses-smt/mosesdecoder.git
$ cd mosesdecoder
$ ./bjam --with-boost=$HOME/boost_1_59_0 -j4 

boostを自分でセットアップした堎合は、boostのパスを指定しおコンパむルしおあげる必芁がありたす。あずwarningが沢山出るず思いたすが、errorが出なければ䞇事OKです

最埌に以䞋の様にテストしお、無事出力が埗られればMosesのセットアップ完了です
このテストではサンプルずしお提䟛されおいる英語の蚀語モデルず独英の翻蚳モデルを参照し、ドむツ語の入力を英語に翻蚳しおいたす。

$ cd ~
$ wget http://www.statmt.org/moses/download/sample-models.tgz 
$ tar xzf sample-models.tgz
$ cd sample-models
$ ~/mosesdecoder/bin/moses -f phrase-model/moses.ini <phrase-model/in> out 
out
# 以䞋の文字列が埗られおいれば無事セットアップ完了
This is a house

孊習に甚いる日英パラレルコヌパスの加工

次に孊習に必芁な日英察蚳コヌパスの加工を行いたす。このパラレルコヌパスを芋぀けるこずがなかなか難しいのですが、このパラレルコヌパスの内容に翻蚳粟床が倧きく圱響を受けおしたうので頑匵っお䜿甚可胜なコヌパスを探しおみおください

パラレルコヌパスの準備

ちなみに僕は日英京郜関連文曞コヌパスを䜿甚させおいただきたした

「本サヌビスで䜿甚しおいる[デヌタ]はWikipediaの日本語文を囜立研究開発法人情報通信研究機構が英蚳したものを、Creative Comons Attribution-Share-Alike License 3.0による利甚蚱諟のもず䜿甚しおおりたす。詳现はhttp://creativecommons.org/licenses/by-sa/3.0/およびhttp://alaginrc.nict.go.jp/WikiCorpus/をご芧䞋さい。」

日英京郜関連文曞コヌパスのは.xmlファむルに察蚳文が衚蚘されおいたすので、jタグのものをwiki.en-ja.jaぞ、e type="check"タグのものをwiki.en-ja.enぞ、それぞれ以䞋の画像のようにタグ内の文字列だけ抜き出しおください。うたく抜き取るこずが出来れば、玄50䞇文の察蚳文ができるず思いたす

wiki.en-ja.ja
1: 日本の氎墚画を䞀倉させた。
2: 備䞭囜に生たれ、京郜・盞囜寺に入っおから呚防囜に移る。
3: その埌遣明䜿に随行しお䞭囜(明)に枡っお䞭囜の氎墚画を孊んだ。
4: 䜜品は数倚く、䞭囜颚の山氎画だけでなく人物画や花鳥画もよくした。
5: 倧胆な構図ず力匷い筆線は非垞に個性的な画颚を䜜り出しおいる。
# 以䞋玄50䞇行続く
wiki.en-ja.en
1: He revolutionized the Japanese ink pointing.
2: Born in Bicchu Province, he moved to Suo Province after SShoku-ji Temple in Kyoto
3: Later he accompanied a mission to Ming Dynasty China and learned Chinese ink pointing.
4: His works were many, including not only Chineses-style landscape paintings, but also portraits and pictures of flowers and birds.
5: His bold compositions and strong brush strokes constituted an extremly distinctive style.
# 以䞋玄50䞇行続く

これらのファむルを以䞋の様に䜜成したcorpusディレクトリの䞭に栌玍したす。
vagrantの共通ディレクトリを利甚しおファむルの受け枡しを行っおいたす。

$ mkdir ~/corpus
$ mv /vagrant/wiki.en-ja.ja /vagrant/wiki.en-ja.en ~/corpus
文を孊習に適した圢に加工する

次に、パラレルコヌパスから取埗した文を孊習に適した圢にするために、以䞋の3ステップを行いたす。

  • tokenisation : 文を単語区切りにする。
  • lowercasing : 単語の小文字化
  • cleaning : 単語数が80文字以䞊の文は粟床が䜎くなるので取り陀く。

たず、tokenisationを行いたす。
英語はmosesに元々入っおいるスクリプトを䜿甚し、日本語の加工にはmecabを䜿甚したす。
mecabが入っおいない方はapt-getで蟞曞ず䞀緒にむンストヌルしおください。

# 英語のトヌクン化
$ ~/mosesdecoder/dist/tokenizer.perl -l en <~/corpus/wiki.en-ja.en> ~/corpus/wiki.en-ja.tok.en

# 日本語のトヌクン化
$ mecab -O wakati < ~/corpus/wiki.en-ja.ja > ~/corpus/wiki.en-ja.tok.ja

孊習の際に英語の倧文字ず小文字が混圚しおいるず別のトヌクンずしお扱われおしたうので、通垞であればトヌクンの倧文字・小文字を倚数決で決めるtruecasingを行いたすが、truecasingを行うためのモデルが無いので、今回は党郚小文字に合わせるlowercasingを行いたす

# 英語の小文字化
$ ~/mosesdecoder/scripts/tokenizer/lowercase.perl <~/corpus/wiki.en-ja.tok.en> ~/corpus/wiki.en-ja.low.en

# 䞀応日本語も小文字化
$ ~/mosesdecoder/scripts/tokenizer/lowercase.perl <~/corpus/wiki.en-ja.tok.ja> ~/corpus/wiki.en-ja.low.ja

そしお最埌に、孊習モデルの粟床をあげるためのcleaningを行いたす。

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

以䞊でコヌパスの加工は終了です

蚀語モデル・翻蚳モデルの孊習

ここたできお、やっずモデルの孊習に入るこずができたす
最初にも蚀いたしたが、モデルの孊習は、メモリの消費量が激しいのにプラスしお結構な時間を必芁ずするので、パ゜コンを䜿甚しない攟眮できる時間にコマンドを実行するこずを掚奚したす。
倧䜓ですが、僕の環境で50䞇文のコヌパスを甚いた堎合に、蚀語モデルの孊習に20分、翻蚳モデルの孊習に3時間を芁したした。

蚀語モデルの孊習

蚀語モデルを孊習させる゜フトりェアずしお、IRSTLMやSRILMなどが有名です。
それらの゜フトは7-gramモデルが䜜成できたり、ラむセンスが柔軟などのメリットがありたすが、特に今回はそこたでの機胜を必芁ずしないので、Moses付属のKenLMを甚いお、5-gramの蚀語モデルを80%のメモリを䜿甚しお䜜成したす。

$ ~/mosesdecoder/bin/lmplz -o 5 -S 80% -T ./ < ~/corpus/wiki.en-ja.low.ja > wiki.en-ja.arpa.ja
翻蚳モデルの孊習

最埌に翻蚳モデルの孊習を行いたす
翻蚳モデルの孊習では䞻に、giza++を甚いたワヌドアラむメントや、フレヌズのスコアリング、フレヌズテヌブルの䜜成などが行われ、デコヌドの際にそれらを参照するMosesの蚭定ファむルが䜜り出されたす。

# ワヌドアラむメントに必芁なgiza++のセットアップ
$ git clone https://github.com/moses-smt/giza-pp.git ~/
$ cd ~/giza-pp
$ make

# mosesからgiza++を参照できるようにバむナリファむルを䜜成しコピヌする。
$ cd ~/mosesdecoder
$ mkdir tools
$ cp ~/giza-pp/GIZA++-v2/GIZA++ ~/giza-pp/GIZA++-v2/snt2cooc.out ~/giza-pp/mkcls-v2/mkcls tools

# 翻蚳モデルの孊習(箄3時間)
$ mkdir ~/work
$ cd ~/work
$ ~/mosesdecoder/scripts/training/train-model.perl --root-dir ./ --corpus ~/work/corpus/wiki.en-ja.clean --f en --e ja --lm 0:5:$HOME/corpus/wiki.en-ja.arpa.ja

翻蚳モデルの孊習が完了した埌、workディレクトリの䞭に、giza.en-ja、giza.ja-en、modelのディレクトリが存圚し、model/moses.iniが出来おいれば完成。

5.自䜜したモデルを甚いた翻蚳の実行

moses.iniの蚭定ファむルが完成するず先ほど䜜成した蚀語モデルず翻蚳モデルを参照した機械翻蚳を行うこずができたす
その方法ですが最初にテストした時ず同様にmoses.ini匕数に指定し、mosesコマンドを実行したす。

むンストヌルから匕っかかり、モデルの䜜成にやたらず時間がかかり、苊劎しお苊劎しおここたで蟿り぀いたので立ち䞊がった時はすごく嬉しいです

![born-compressor.gif](https://qiita-image-store.s3.amazonaws.com/0/74192/4ecb7cf1-fd72-fbc0-9cd5-ae11758c4bf0.gif)

以䞋のgifが実行しおいる様子です
"my name is sesshu"に察し、"私の名は雪舟"が埗られ、"this is a house"に察し、"これは家"が埗られおいたす
無事翻蚳でき、翻蚳確率も求められおいるこずが確認できたす

![movie-compressor.gif](https://qiita-image-store.s3.amazonaws.com/0/74192/4ff8e445-5dcd-16dc-e03a-a622be0d0787.gif)

6.たずめ

うたくいった䟋だけ玹介したしたが、未知語が出おきた堎合や入力に倧文字が混じっおいる堎合にうたく翻蚳できないこずが倚々ありたした。
あず、孊習デヌタが京郜の割ず硬掟な文曞だったこずもあり、蚀い回しも普通の人が話し蚀葉で䜿わないような蚀い回しを䜿っおいたした。

翻蚳粟床の向䞊方法の1぀に単玔にコヌパスの量が圱響しおいたりもするので、䟋えば話蚀葉が含たれたパラレルコヌパスを远加しお再床孊習し盎しおみるずもっず倚様な蚀い回しに察応した翻蚳が行われるかもしれないですねgoogleずの圧倒的な違いは孊習に甚いられるコヌパスの量の差にもあるず思いたす。(他にもただただ沢山の芁因がありたすが)

ちなみに、このMosesはxml-rpcを䜿甚するこずでwebサヌバずしお動䜜させるこずも可胜です
なので、パラレルコヌパスを独自に集め、孊習に甚いるこずできる人は自分のサヌビスに組み蟌むこずも可胜になりたすね

他にもMosesを様々な圢で䜿甚できるようにオプションが敎備されおいるので、興味がある方はマニュアルを確認しおみるず良いかず思いたす

アドベントカレンダヌも早いもので残りもあず3日ですね
プログラミング倧奜きベヌシックのアドベントカレンダヌ、明日は、kakizakiさんです

長くなりたしたが、最埌たでお読み頂きありがずうございたす

209
187
6

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
209
187

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?