Zenn
💭

ipynbファイルのmarkdownセルで 自動翻訳する方法

2025/03/22に公開
1

概要

  • この記事の対象者
    Python で自動翻訳ツールを試してみたい人。

  • この記事の要約
    Jupyter Notebookの Markdownテキストを、googletransを使って日本語に自動翻訳する仕組みについて解説

  • この記事を読んでできること
    googletrans を利用して翻訳処理を実装する方法

序説

最近購入した本の付録に、Jupyter Notebook(.ipynb)形式のファイルが付いていました。
内容は主にコードと Markdown 文書で構成されており、Markdown の文章は英語で書かれていました。
そこで、「これを日本語に変換できたらもっと使いやすいのでは?」と思い、
どうすれば自動で翻訳できるのか調べ、実際にコードを書いてみることにしました

成果物

以下の画像は、元々英語だった Markdown セルが日本語に翻訳された成果物の一例です。

googletrans

googletransとは

googletrans (PyPI)
https://pypi.org/project/googletrans/

googletrans は、オープンソースコミュニティによって開発された Python ライブラリで、元々 GitHub 上の「ssut」というユーザーが作成しました。
その後、コミュニティ内でフォークや改良が重ねられ、現在では複数のバージョンが存在しています。

主な Features

  1. Fast and reliable: translate.google.com と同じサーバーを利用しており、高速かつ信頼性がある。
  2. 自動言語検出: 入力されたテキストの言語を自動で判別します。
  3. 一括翻訳: 複数の文章をまとめて翻訳することも可能。

仕組み

googletrans は、Google が翻訳時に利用するトークン生成の仕組みを、難読化され最小化されたコードからリバースエンジニアリングして実装されています。
この技術により、公式 API を使わずとも翻訳サービスにアクセスできるようになっていますが、その反面、Google 側の仕様変更によりいつでも動作が停止するリスクもはらんでいます。

サンプルコード

https://colab.research.google.com/drive/1wKFAbiE8JH0fvFh0hNeJEIOARtN3u0Qe?usp=sharing

インストール方法

$ pip install googletrans

サンプルコード
以下のコードは、非同期の処理で韓国語やラテン語のテキストを翻訳する例です。

import asyncio
from googletrans import Translator

async def translate_text():
    async with Translator() as translator:
        result = await translator.translate('안녕하세요.')
        print(result)  # 出力例: <Translated src=ko dest=en text=Good evening. pronunciation=Good evening.>
        
        result = await translator.translate('안녕하세요.', dest='ja')
        print(result)  # 出力例: <Translated src=ko dest=ja text=こんにちは。 pronunciation=Kon'nichiwa.>
        
        result = await translator.translate('veritas lux mea', src='la')
        print(result)  # 出力例: <Translated src=la dest=en text=The truth is my light pronunciation=The truth is my light>

asyncio.run(translate_text())

コードの説明

https://colab.research.google.com/drive/1wKFAbiE8JH0fvFh0hNeJEIOARtN3u0Qe?usp=sharing

今回のコードは、主に以下の3つのステップで構成されています。

1. GitHub上の.ipynbファイル取得

URL変換
convert_to_raw_url 関数では、GitHub上の通常のURL(例:https://github.com/user/repo/blob/branch/notebook.ipynb
を、rawデータ取得用のURL(例:https://raw.githubusercontent.com/user/repo/branch/notebook.ipynb
)に変換します。
これにより、ファイルの実際のJSONデータを簡単にダウンロードできるようになります。

2. googletransを用いた翻訳処理

Markdownセルの走査
ノートブックのJSON構造を読み込み、各セルのcell_typeが"markdown"であるかをチェックします。

翻訳実行
対象セルのテキスト(source)はリスト形式で格納されているため、一度文字列に結合し、googletransのTranslatorクラスのtranslateメソッドを利用して英語から日本語に翻訳します。
翻訳結果はセルの内容に上書きされ、もとのノートブックのレイアウトやその他の設定はそのまま保持されます。

3. 翻訳済みノートブックの保存

新規ファイルの作成
翻訳処理が完了したノートブックデータを、json.dumpを用いて新たな.ipynbファイルに保存します。
これにより、オリジナルのノートブック構造を崩すことなく、Markdownセルのみ日本語に変更された新しいファイルが生成されます。

結言

ファイルパスや、テーブルスタイルなど日本語にしてほしくないところも、翻訳されてしまうなど一部改善が必要そうでした!
ただ、無料でこれだけ翻訳できれば良いのではないでしょうか?
ぜひ、あなたのプロジェクトでも試してみてください。

コード

! pip install googletrans==4.0.0-rc1
import json
import requests
from googletrans import Translator

def convert_to_raw_url(url):
    """
    GitHub上の通常の.ipynbファイルURLをrawファイルのURLに変換する
    例: https://github.com/user/repo/blob/branch/notebook.ipynb → 
         https://raw.githubusercontent.com/user/repo/branch/notebook.ipynb
    """
    if "github.com" in url and "/blob/" in url:
        raw_url = url.replace("github.com", "raw.githubusercontent.com").replace("/blob/", "/")
        return raw_url
    return url

def translate_markdown_in_ipynb(github_url, output_filename):
    # URLをrawファイルのURLに変換
    raw_url = convert_to_raw_url(github_url)
    
    # GitHubから.ipynbファイルをダウンロード
    response = requests.get(raw_url)
    response.raise_for_status()  # エラーがあれば例外を発生
    notebook = response.json()
    
    translator = Translator()
    
    # 各セルをチェックし、Markdownセルであれば翻訳
    for cell in notebook.get("cells", []):
        if cell.get("cell_type") == "markdown":
            # セル内のテキストは通常リスト形式なので、結合して一つの文字列にする
            original_text = "".join(cell.get("source", []))
            if original_text.strip():  # 空文字列でなければ
                translated = translator.translate(original_text, src='en', dest='ja')
                translated_text = translated.text
                # 翻訳結果をセルの内容に置換(リスト形式で保存)
                cell["source"] = [translated_text]
    
    # 翻訳済みノートブックを新たなファイルに保存
    with open(output_filename, "w", encoding="utf-8") as f:
        json.dump(notebook, f, ensure_ascii=False, indent=2)
    print(f"翻訳済みノートブックは {output_filename} に保存されました。")

if __name__ == "__main__":
    # GitHub上の.ipynbファイルのURLを入力
    github_url = input("GitHub上の.ipynbファイルのURLを入力してください: ").strip()
    output_filename = "translated_notebook.ipynb"
    translate_markdown_in_ipynb(github_url, output_filename)
1
ちゅらデータ株式会社

Discussion

ログインするとコメントできます