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:供給メーカー・売り手