Googletrans (Google Translate API)
Google は Google Translate (Google 翻訳) とよばれる多言語翻訳サイトを無料で提供しています (左側のボックスにテキストを入れると、自動的に右側に翻訳文を表示してくれるという、とてもシンプルな使い方のできる Web アプリです)。Googletrans は、Google Translate API を実装した Python ライブラリです (Python から Google Translate に接続できるということです)。
Googletransのインストール
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のサンプルコード
それでは、色々な日本語を翻訳して精度を確かめてみましょう。最初に 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 シャープペン
正解です!
'''
【技術英語の豆知識】
・commercial software 商業ソフト
ちなみに Python は無料で提供される open sorce software です。
・comprehensive and interdiciplinary 包括的かつ学際的
comprehensive は「広範囲の、総合的、大局的」の意。
・paradigm on research 研究方法
paradigm (パラダイム) もよく使われる単語。
オブジェクト指向言語と関数型言語も異なるパラダイム。
・vendor 供給メーカー・売り手