魂の生命の領域

AWS とか Python とか本読んだ感想とか哲学とか書きます

再翻訳で遊びたい 〜AWS Translate 編〜

導入

再翻訳を何回も実行するとめちゃくちゃな文章になって楽しいじゃないですか。 それを自動化したかったわけです。

どうやって実現するか

最初は Google 翻訳の API を自動で叩くようなスクリプトを考えていたのですが、せっかくAWS をお仕事で専門的にやっているので AWS Translate を使えばいいじゃんということを思いました。

API はとてもシンプルです。

boto3.amazonaws.com

あとは for 文が書ければ OK です。 こんなパラメータを用意してやって、

params = {
    'text': text,
    'source': source,
    'via': via
}

ここに何回も通せば再翻訳された文章の出来上がりです。 需要はないと思いますが全体のコードは末尾に掲載しています。

def unit_retranslate(params):
    """
    再翻訳を1回行う
    """
    # 翻訳
    tmp_result = client.translate_text(
        Text=params['text'],
        SourceLanguageCode=params['source'],
        TargetLanguageCode=params['via']
    )
    # 再翻訳
    result = client.translate_text(
        Text=tmp_result['TranslatedText'],
        SourceLanguageCode=params['via'],
        TargetLanguageCode=params['source']
    )
    params['text'] = result['TranslatedText']
    return params

TargetLanguageCodevia という変数にしたのが個人的に気に入ってます。 本当に間違った使い方という感じがして好きです。

早速遊んでみましょう。 サンプルの文章として私のもう一つのブログから適当な記事を引っ張ってきました。

最低軍団は偏差値最強軍団に対抗するというコンセプトのもとで結成されました。 この際、偏差値最低軍団とはならず単に最低軍団という名称になったのは、「偏差値だけでなく総合的な意味において最低である」ことを念頭を置いたためです。 最低軍団の初期メンバーはソレ、ソノ、難しいソレ、難しいソノの4人です。

難しいソレが中心となり結成されましたが、フロントマンとしてはソレをプッシュしており、難しいソレ自身はあまり表に出ないようにしています。 ソノはオックスフォード大学を卒業しており、Iron Maiden のヴォーカリストであるブルース・ディッキンソンと個人的な交友があります。 難しいソノは当初は存在するか存在しないかが判別できないほどに重症でしたが、寄せる器具の効能により、現在では大阪大学の医学部に通うまでに回復しています。

最低軍団の主な活動は音楽です。 最低軍団という名前のメタルバンドとして全宇宙で精力的に活動しています。 毎年フルアルバムをリリースしています。

ソレは9000億フレットで9000億弦のギターを9000億の1秒に9000億回という驚異的なスピードでピッキングすることで非常にスピード感溢れるサウンドを得意としますが、本人はメタルよりもケルト音楽の方に興味があるため、たびたび脱退騒動が発生します。

数年前に最低軍団に新しいソレと新しいソノがメンバーに加わったことでさらに音楽の表現の幅が広がりました。 今後も最低軍団から目が離せません。

宇宙を意識している

既に適度に狂った日本語なので、再翻訳時にそう簡単に意味をなした文章にはできないであろうという魂胆です。 これを英語を経由して再翻訳を重ねてみましょう。

1回目

最下位の軍団は、偏差値を持つ最強軍団と戦うというコンセプトのもとに結成された。この場合、「偏差値だけではなく全体的な意味で最も低い」ことを念頭に置いていたため、単に偏差値の最も低い軍団であった。最下位軍団の最も早いメンバーはソーレ、ソノ、ハードソレ、ハードソノである。

難しい足裏の中心として形成されたが、フロントマンとしては足裏を押し、難しい足裏自体は表にはあまり現れない。ソノはオックスフォード大学卒業。アイアン・メイデンのボーカリスト・ブルース・ディキンソンとは個人的な親交がある。当初、難しかった曽野は、存在するか否かを判断できないほど厳しかった。しかし、楽器の効能により、現在は大阪大学の医学部に回復しつつある。

最下位軍団の主な活動は音楽である。Lowest Legionというメタルバンドとして、宇宙各地で積極的に活動している。毎年フルアルバムをリリースしている。

ソレは900億フレットで900億の1秒にギター900億の弦の900億回という驚異的なスピードでピッキングすることで音感溢れる非常にスピード感が得意だが、本人はメタルよりもケルト音楽に興味を持っているため、離脱騒動を経験することが多い。

数年前、新ソレットと新ソノのメンバーが最低軍団に加わり、音楽表現の幅をさらに広げた。我々は最下位の軍団に目を離さない。

短い文章だとあまり差が出ないのである程度の分量を持ってきましたが比較が面倒ですね。 頑張って読んでみると、元の文章が割とはちゃめちゃなのであまり印象は変わらないです。 目に付く点として、「難しいソレ(人名)」が「難しい足裏」になってます。 多分英語にする段階で Sole になったんでしょう。 あと9000億という数字が全部900億になっているのは気になります。 誤解の余地はないと思うのですが……

2回目

最も低い軍団は、偏差値を持つ最強軍団と戦うというコンセプトのもとに結成された。この場合、「偏差値だけではなく全体的な意味で最も低い」ことを念頭に置いていたため、単純に偏差値が最も低い軍団であった。最下位軍団の最も早いメンバーはソーレ、ソノ、ハードソール、ハードソノである。

難しいソールの中心として形成されたが、フロントマンとしてはソールを押し、難しいソール自体はフロントサイドにあまり現れない。ソノはオックスフォード大学卒業。アイアン・メイデンのボーカリストのブルース・ディキンソンとは個人的な親交がある。当初、難しかった曽野は、存在するか否かを判断できないほど厳しかった。しかし、楽器の有効性から、大阪大学は現在、大阪大学の医学部に回復しつつある。

最下位軍団の主な活動は音楽である。Lowest Legionというメタルバンドとして、宇宙各地で積極的に活動している。毎年フルアルバムをリリースしている。

ソレは900億フレットで1秒間に900億のギターの900億の弦の驚異的なスピードでピッキングすることで音に溢れる非常にスピード感が得意だが、彼はメタルよりもケルト系の音楽であるため、離脱騒動を経験することが多い。

数年前、新ソレットと新ソノのメンバーが最下位軍団に加わり、音楽表現の幅をさらに広げた。我々は最下位の軍団に目を離さない。

ほとんど変化してません。 ただ、ジワジワ情報が抜け落ちてきているような感じがします。

3回目

最も低い軍団は、偏差値を持つ最強軍団と戦うというコンセプトのもとに結成された。この場合、「偏差値だけではなく全体的な意味で最も低い」ことを念頭に置いていたため、単に偏差値が最も低い軍団であった。最下位軍団の最も早いメンバーはソーレ、ソノ、ハードソール、ハードソノである。

難しいソールの中心として形成されるが、フロントマンがソールを押すにつれ、難しいソール自体はフロントサイドにあまり現れない。ソノはオックスフォード大学卒業。アイアン・メイデンのボーカリスト・ブルース・ディキンソンとは個人的な親交がある。当初、難しかった曽野は、存在するか否かを判断できないほど厳しかった。しかし、楽器の有効性から、大阪大学は現在、大阪大学の医学部に回復しつつある。

最下位軍団の主な活動は音楽である。Lowest Legionというメタルバンドとして、宇宙各地で積極的に活動している。毎年フルアルバムをリリースしている。

ソアは、900億フレットで毎秒900億ギターの900億弦という驚異的なスピードでピッキングすることで、非常に速い音感に秀でるが、彼はメタルよりもケルト系の音楽である。しかし、彼はしばしば脱退の妨害を経験する。

数年前、新ソレットと新ソノのメンバーが最下位軍団に加わり、音楽表現の幅をさらに広げた。我々は最下位の軍団に目を離さない。

前半は2回目の結果と完全に同じです。 後半の9000億弦ギターのくだりがかなりバグった感じになっています。

4回目

最も低い軍団は、偏差値を持つ最強軍団と戦うというコンセプトのもとに結成された。この場合、「偏差値だけではなく全体的な意味で最も低い」ことを念頭に置いていたため、単に偏差値が最も低い軍団であった。最下位軍団の最も早いメンバーはソーレ、ソノ、ハードソール、ハードソノである。

難しいソールの中心として形成されるが、フロントマンがソールを押すにつれ、難しいソール自体はフロントサイドにあまり現れない。ソノはオックスフォード大学卒業。アイアン・メイデンのボーカリストのブルース・ディキンソンとは個人的な親交がある。当初、難しかった曽野は、存在するか否かを判断できないほど厳しかった。しかし、楽器の有効性から、大阪大学は現在、大阪大学の医学部に回復しつつある。

最下位軍団の主な活動は音楽である。Lowest Legionというメタルバンドとして、宇宙各地で積極的に活動している。毎年フルアルバムをリリースしている。

ソレは900億フレットで毎秒900億ギターの900億弦という驚異的なスピードでピッキングすることで非常に速い音感に秀でるが、彼はメタルよりもケルト系の音楽である。しかし、彼はしばしば撤退の障害を経験する。

数年前、新ソレットと新ソノのメンバーが最下位軍団に加わり、音楽表現の幅をさらに広げた。我々は最下位の軍団に目を離さない。

ちょっと句読点が減ったぐらいでほぼ同じですね。 これ以上繰り返してもあんまり意味がなさそうのでここでやめました。

まとめ

明日気が向いたら Google 翻訳版も作ります。

付録

大したものではないですが、一応コード全部載せときます。

import boto3
import json
import sys

from datetime import datetime


client = boto3.client('translate')


def retranslate(source='ja', via='en', cnt=0):
    """
    入力ファイルの内容を指定の回数再翻訳する
    """
    with open('./in.txt', mode='r') as in_f:
        text = in_f.read()

    params = {
        'text': text,
        'source': source,
        'via': via
    }
    result = []
    for i in range(cnt):
        # 5000 文字の制限は API 実行前に弾いてしまう
        if len(params['text']) > 5000:
            break

        params = unit_retranslate(params)
        result.append({
            'no': i + 1,
            'text': params['text']
        })

    with open(f'./out/{format_file_name()}-out.json', mode='a', encoding='utf-8') as out_f:
        json.dump(result, out_f, indent=2, ensure_ascii=False)


def unit_retranslate(params):
    """
    再翻訳を1回行う
    """
    # 翻訳
    tmp_result = client.translate_text(
        Text=params['text'],
        SourceLanguageCode=params['source'],
        TargetLanguageCode=params['via']
    )
    # 再翻訳
    result = client.translate_text(
        Text=tmp_result['TranslatedText'],
        SourceLanguageCode=params['via'],
        TargetLanguageCode=params['source']
    )
    params['text'] = result['TranslatedText']
    return params


def format_file_name():
    """
    適当なファイル名を作るためのやつ
    """
    return datetime.now().strftime('%Y%m%d%H%M%S')


if __name__ == '__main__':
    args = sys.argv
    if len(args) == 2 and args[1].isdigit():
        cnt = int(args[1])

    retranslate(cnt=cnt)

拡張性を考慮しようとして諦めた形跡がなんとも恥ずかしいですね。