コンテンツにスキップ

日本語見出しから英語ファイル名を生成

[質問]

記事の日本語タイトルからファイル名を作りたいです。構成としては、HTML画面上に[記事タイトル]入力欄と、[ファイル名]入力欄があり、基本はどちらも手で入力します。しかし[ファイル名を自動生成]ボタンを押すと、タイトルからファイル名を生成します。あとから手で修正も可能です。

[回答] Gemini

ユーザーが入力した日本語タイトルから、「意味の通じる英語のファイル名」を自動生成する仕組みですね。

この場合、単なる翻訳だけでなく、ファイル名として適切な形(スペースをハイフンに置き換える、記号を除くなど)に整形する処理(Slugify)を組み合わせるのが一般的です。

Python(バックエンド)でこの機能を実装する際の、おすすめの構成とコード例を紹介します。


実装の全体像

  1. 翻訳: DeepL または OpenAI で日本語タイトルを英語に変換。
  2. 整形: 英語のフレーズを小文字にし、記号を消してハイフンで繋ぐ(例: My Articlemy-article)。
  3. 返却: フロントエンド(HTML)のファイル名入力欄に値を戻す。

Pythonによる実装例

ここでは、最も汎用性が高く「気の利いたファイル名」になりやすい OpenAI (GPT-4o) を使った例を紹介します。

import re
from openai import OpenAI

client = OpenAI(api_key="YOUR_API_KEY")

def generate_filename(japanese_title):
    # 1. 翻訳 (ファイル名に適した短い英語を依頼)
    response = client.chat.completions.create(
        model="gpt-4o",
        messages=[
            {"role": "system", "content": "Translate the given Japanese title into a short, descriptive English phrase for a URL slug or filename. Use only lowercase and spaces."},
            {"role": "user", "content": japanese_title}
        ]
    )
    english_text = response.choices[0].message.content.strip().lower()

    # 2. 整形 (記号削除とハイフン連結)
    # 英数字以外をスペースに置き換え、前後の空白を削除
    clean_text = re.sub(r'[^a-z0-9\s-]', '', english_text)
    # スペースをハイフンに変換し、連続するハイフンを1つにまとめる
    filename = re.sub(r'\s+', '-', clean_text).strip('-')

    return f"{filename}.html"

# テスト
title = "Pythonで効率的に翻訳APIを呼び出す方法"
print(generate_filename(title)) 
# 出力例: how-to-call-translation-api-efficiently-with-python.html

UI(HTML/JavaScript)の動き

ユーザーの利便性を考えると、以下のようなJavaScriptの挙動になります。

  • [ファイル名を自動生成] ボタン: 1. タイトルの値を読み取る。
  • Pythonサーバー(FlaskやFastAPIなど)へAPIリクエストを送る。
  • 返ってきた文字列をファイル名入力欄にセットする。
  • 手動修正: 生成された後、ユーザーが自由にその欄を書き換えられるように input タグにしておきます。

運用上のポイント

  • 文字数制限: ファイル名が長くなりすぎないよう、プロンプトで「3〜5単語程度で」と制限をかけるのがコツです。
  • DeepLを使う場合: DeepLには整形機能はないため、上記の re.sub(正規表現)による整形処理を必ず自前で通すようにしてください。
  • コスト管理: ユーザーがボタンを連打するとAPI費用がかさむため、フロントエンド側で「一度押したら数秒無効化する」などの制御を入れると安全です。

もし、この処理を組み込むための Webフレームワーク(Flask, Django, FastAPIなど) の具体的な書き方についても知りたい場合は、ぜひ教えてください!