Googletrans

Googletrans

Googletrans

 Google は Google Translate (Google 翻訳) とよばれる多言語翻訳サイトを無料で提供しています (左側のボックスにテキストを入れると、自動的に右側に翻訳文を表示してくれるという、とてもシンプルな使い方のできる Web アプリです)。Googletrans は、Google Translate API を実装した Python ライブラリです (Python から Google Translate に接続できるということです)。

 Google Colaboratory を利用している場合、コードセルに次のコードを打ち込むと、Googletrans をインストールできます。

!pip install googletrans

 Anaconda 環境であれば、conda-forge チャンネルから googletransをインストールできます。conda-forge が有効でない場合、Anaconda Prompt を起動し、次のコマンドでチャンネルに conda-forgeを追加します。

conda config --add channels conda-forge

 conda-forge を追加したら、以下のコマンドで googletrans を次のようにインストールできます。

conda install googletrans

 それでは、色々な日本語を翻訳して精度を確かめてみましょう。最初に Googletrans から Translator クラスをインポートして、インスタンスを生成します。

# In[1]

# googletransモジュールから
# 翻訳APIをインポート
from googletrans import Translator

# Translatorクラスのインスタンスを生成
translator = Translator()

 Translator オブジェクトの translate() メソッドの引数に翻訳したい文章を渡すと英語に翻訳されます。

# In[2]

# 翻訳元の文章
string_ja = "今日も頑張ってPythonを勉強しよう。"

# 文章を英語に翻訳する
trans_en = translator.translate(string_ja)

print(trans_en.text)
Let's do our best to study Python today.

 ...「今日も」の「も」のニュアンスが上手く翻訳できませんでしたね。やはり日本語の接続助詞は微妙なニュアンスを含むので、翻訳が難しいのかもしれません。翻訳された英文を translate() メソッドで再度日本語に変換してみましょう。

 翻訳元の言語種類 src は自動判断されるので、その判別能力を信用するなら省略できますが、ここでは一応明示しておきます。翻訳先の言語種類 dest はデフォルトで英語 (en) に設定されているので、翻訳先の言語種類を変更する場合は明示する必要があります。ここでは日本語に変換するので dest に "ja" を渡します。ちなみに、dest は destination (先、行き先) の頭文字です。

# In[3]

# 翻訳された文章を再度日本語に変換してみる
# 翻訳元の言語種類srcは自動判断されるようなので(信用できれば)省略可能
# 翻訳先の言語種類destはデフォルトで英語(en)なので、
# 翻訳先の言語種類を変更する場合は明示する
trans_ja = translator.translate(trans_en.text, dest='ja', src='en')

print(trans_ja.text)
今日はPythonを勉強するために最善を尽くしましょう。

 接続助詞以外は間違っていませんが、ちょっと堅い文章になってしまいました。次はちょっと意地悪な単語を含む文章を翻訳させてみます。

# In[4]

# 翻訳元の文章
string_ja = "私はにゃんこを飼っています。"

# 文章を英語に翻訳する
# 「にゃんこ」を英訳できるかな?
trans_en = translator.translate(string_ja)

print(trans_en.text)
I have a cat.

 見事に翻訳してくれました。ちなみに "にゃんこ" という単語だけでは "cat" に変換してくれないので、Google Translate の AI は文脈から "にゃんこ" が "猫" のことであると判別したことになります。次はもうちょっと複雑な文章を翻訳してみます。

# In[5]

# 翻訳元の文章
# 「食べ過ぎて...」の主語を省略してみる
string_ja = "私はにゃんこを飼っていますが、最近食べ過ぎて太ってしまい、健康状態が心配です。"

# 文章を英語に翻訳する
trans_en = translator.translate(string_ja)

print(trans_en.text)
I have a cat, but recently I've eaten too much and got fat, so I'm worried about my health.

 "食べ過ぎて太った" の主語は "にゃんこ" ですが、翻訳文章では主語を "I (私)" にしてしまいました。"にゃんこの健康" の箇所も "my health (私の健康)" になってしまっています。日本語では頻繁に主語が省略されますが、英語では少ないので、このへんも難しいところですね。日本語を英語に翻訳するときは、なるべく主語を補うようにしたほうがいいですね。

 もちろん、英語以外の言語にも翻訳できます。たとえば、ドイツ語に翻訳したいときは、dest に言語コード "de" を渡します。

# In[6]

# 翻訳元の文章
string_ja = "道を歩いていたら、気持ちよさそうに毛づくろいしている猫を発見した。"

# 文章をドイツ語に翻訳する
trans_de = translator.translate(string_ja, dest='de', src='ja')

print(trans_de.text)
Als ich die Straße entlang ging, fand ich eine Katze, die sich bequem pflegte.

 残念ながら、私はドイツ語が読めないので、この翻訳文が正しいのかどうかわかりません。同じ文章を英語に訳してみます。

# In[7]

# 文章を英語に翻訳する
trans_en = translator.translate(string_ja, dest='en', src='ja')

print(trans_en.text)
As I was walking down the road, I found a cat grooming comfortably.

 文章の質はともかくとして、一応は正しく翻訳されています。英語とドイツ語はルーツが同じで (ともに印欧祖語を起源とする) 、構造が似ているので、英語で上手く訳されたということは、ドイツ語のほうも大丈夫なのではないかと思います (← 本当かよ)。ドイツ語に詳しい人がいたら、正しく翻訳されているかどうか教えてください。

 適当な文章や単語を入れて、7ヶ国語の翻訳文を同時に表示する関数をつくってみました。

# In[8]

# 7ヶ国語翻訳関数
def translate(word):

    # 言語コード辞書
    lang_dict = {"en":"英語",
                 "fr":"フランス語",
                 "de":"ドイツ語",
                 "es":"スペイン語",
                 "nl":"オランダ語",
                 "sv":"スウェーデン語",
                 "he":"ヘブライ語"}

    # 文章を各国語に翻訳する
    for i in lang_dict:
        trans = translator.translate(word, dest=i, src='ja')
        print("{} : {}".format(lang_dict[i], trans.text))

 "おはよう" を各国でどんなふうに言うのか確かめてみましょう。

# In[9]

#「おはよう」を7ヶ国語に翻訳
translate("おはよう")
英語 : Good morning
フランス語 : Bonjour
ドイツ語 : Guten Morgen
スペイン語 : Buenos días
オランダ語 : Goedemorgen
スウェーデン語 : God morgon
ヘブライ語 : בוקר טוב

 フランス語は「ボンジュール」、ドイツ語は「グーテンモルゲン」... ヘブライ語は ... よ、読めませんね。ヘブライ語に詳しい人がいたら教えてください。
 

英単語クイズ関数

 Googletrans を使って、英単語クイズ関数を作成してみました。英単語のリストを渡すと、その中からいくつかの単語を選んで順番に表示します。ユーザーがテキストボックスに解答を入力すると、「正解」または「残念」と表示します。

# In[1]

from googletrans import Translator
translator = Translator()
import random

# 英単語クイズ関数
def en_ja_words(words, n):

    # words(単語リスト)から無作為に重複なしで単語をn個選んでリストを作成
    selection = random.sample(words, n)

    for i in selection:
        answer = input(i + " ")

        # リストの英単語を和訳
        trans_word = translator.translate(i, dest="ja", src="en")

        # 解答を英訳
        trans_answer = translator.translate(answer, src="ja")

        # リストの英単語と解答の英訳が一致すれば正解
        # 単語を構成するアルファベットを小文字にして一致判定
        if i.lower() == trans_answer.text.lower():
            print("正解です!")

        else:
            print("残念! 正解は「{}」です。".format(trans_word.text))

 同じ英単語に対しても、ユーザーの解答にはある程度の幅があります。たとえば、下にあるような "mechanical pencil" という単語に対して、ユーザーは「シャープペンシル」、「シャープペン」、「シャーペン」などの言葉を入力する可能性があります。ユーザーの解答を translate() メソッドで英訳して、リストから選ばれた英単語と一致すれば、これらはすべて正解とします。文房具の英単語リストを渡して en_ja_words() を実行してみましょう。

# In[2]

# 文房具の英単語リスト
stationaries = ["ballpoint pen",  # ボールペン
                "mechanical pencil",  # シャープペンシル
                "eraser",  # 消しゴム
                "highlighter",  # 蛍光ペン
                "rubber band",  # 輪ゴム
                "scissors"]  # ハサミ

# 英単語クイズ関数を実行する
# 問題の単語はランダムに選ばれるので実行結果は毎回異なる
en_ja_words(stationaries, 3)
highlighter 蛍光ペン
正解です!

scissors 定規
残念! 正解は「はさみ」です。

mechanical pencil シャープペン
正解です!