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