研究者の卵の卵

決して頭がいいとは言えない大学生が、日々おもったことや学んだことをつらつら書きます。人工知能や脳科学の話が多くなりそうです。

Pythonで機械翻訳 -'translate'パッケージ & Webスクレイピング-

はじめに

最近、卒業研究でPythonからフレーズ翻訳をするスクリプトを書かないといけない場面がありました。
いちばん安定していて間違いない方法はおそらくGoogle Translate APIを利用することだと思うのですが、 これには金がかかるという欠点があります。
無料でできる方法でちゃんと精度よく翻訳ができるスクリプトを書く方法をインターネッツで検索かけても、 実はそれほど出ていなかったり、情報が古くて実行できなかったりといろいろな問題がありました。 なので、改めてここで備忘録ついでに情報を残しておこうと思います。

translate パッケージ

あまり知られていないっぽいながらもラクな方法としては、 "translate"というパッケージをつかう、というのがあります。
pipでインストールできますし、condaとか使っててpipするのが嫌な人はソースを落としてきてsetup.pyを実行することでも利用できます。
私はconda利用者ですが、依存に問題がないことが確認できたらバンバンpipしちゃう人種の人間なので、pipでインストールしました。

$ pip install translate

以下のようにコードを書くと、簡単に翻訳ができます。

>>> from translate import Translator
>>>
>>> translator = Translator(from_lang = "ja", to_lang = "en")
>>> result = translator.translate("これはペンです。")
>>> result
'This is a pen.'

見た感じ、出力はGoogle翻訳と同じなので、どうやら何かしらの方法でGoogle翻訳を通して出力を行っているみたいですね。
ちなみに、他の翻訳プロバイダを試すこともできたりします。

>>> translator = Translator(provider = "microsoft", from_lang = "ja", to_lang = "de")

ただし残念ながら、上記のようにしてmicrosoft翻訳(?)をプロバイダに選択しても、 HTTPでクエリを投げるときにどうやらアクセスが拒否されるみたいです。
まぁGoogle翻訳の方が精度もいいので、基本的にはここには何も指定せずに実行するのがいいでしょう。

この方法で翻訳をするとき、かなりネックになってくるのが実行速度です。
みなさんも試してみるとわかると思いますが、「これはペンです」ぐらいの例文でも翻訳するのに1秒ほどかかります。
私に限らず、自然言語処理系の研究室で機械翻訳の必要が出てきてる時って基本的に大量のフレーズを一気に翻訳したい時だと思うので、 この方法はそういう人には全然おすすめできません。
時間かかってもいい人は別にいいと思うんですけどね。

Webスクレイピング

一見ごり押しですがかなり効果的な方法です。
BeautifulSoupとrequestsを利用してHTTPつかって直接Google翻訳のサイトにクエリを投げてしまいます。
あんまりWebスクレイピングとかやったことなかったのですが、Google翻訳のソースを見てみるとどうやら翻訳の結果は "result_box"というIDのボックス内に表示されているみたいです。
翻訳先言語の指定および投げたいフレーズはURLで指定できるので、直接取ってやろうぜ、というコンセプトです。
ちなみにBeautifulSoupとかrequestsとかはAnacondaでPythonをインストールすると最初からついてるみたいですね。
少なくとも私が試したときはそうでした。

>>> from bs4 import BeautifulSoup
>>> import requests
>>>
>>> target_url = "https://translate.google.com"
>>> params = {"hl":"en", "text":"これはペンです。"}
>>>
>>> r = requests.get(target_url, params = params)
>>> result = BeautifulSoup(r.text, "html.parser").find(id = "result_box").text
>>> result
'this is a pen.'

translateパッケージを使う場合と比べてこちらのほうが行数は増えますね。
もう少しきれいにまとめて実装できるのかもしれませんが、なんせコーダーとしてのスキルが結構低いので、 こういう書き方しかできないのはご了承ください。

個人的にちょっと気に入らないのが、http介して処理しているはずなのにこちらの方がtranslateパッケージを 使う場合よりもはるかに処理が速い点です。
translateパッケージの利点は行数が少なくなる点だから、そこは若干がんばってほしかった点ではありますね。

参考

imaharu.sakura.ne.jp