GEMINI LABEN
API — Gemini API のリリースノートは9月3日の Lyria 3.5 が最新のままです。9月10日時点で新しい項目はありませんでしたCLI — Gemini CLI の v0.47.0 nightly に、Antigravity CLI への移行コマンドとドキュメントが入りました。nightly である点は忘れずにGARDEN — Gemini Enterprise Agent Platform の Model Garden に Claude Fable 5.1 が加わりました。埋め込み SKU とエージェント計測の価格も更新されていますDEPRECATION — gemini-omni-flash-preview の廃止は9月30日、あと20日です。移行先は8月27日に GA となった gemini-omni-1.1-flash になりますSIRI — iOS 27 が9月14日に配信されます。刷新された Siri は Google の Gemini モデルの協力で開発されたと報じられていますが、詳細は未確認ですPRICE — Gemini 3.8 Flash と 3.7 Flash の 0.75 ドル / 3.75 ドルは導入価格です。2027年1月1日から 1.50 ドル / 7.50 ドルへ変わりますAPI — Gemini API のリリースノートは9月3日の Lyria 3.5 が最新のままです。9月10日時点で新しい項目はありませんでしたCLI — Gemini CLI の v0.47.0 nightly に、Antigravity CLI への移行コマンドとドキュメントが入りました。nightly である点は忘れずにGARDEN — Gemini Enterprise Agent Platform の Model Garden に Claude Fable 5.1 が加わりました。埋め込み SKU とエージェント計測の価格も更新されていますDEPRECATION — gemini-omni-flash-preview の廃止は9月30日、あと20日です。移行先は8月27日に GA となった gemini-omni-1.1-flash になりますSIRI — iOS 27 が9月14日に配信されます。刷新された Siri は Google の Gemini モデルの協力で開発されたと報じられていますが、詳細は未確認ですPRICE — Gemini 3.8 Flash と 3.7 Flash の 0.75 ドル / 3.75 ドルは導入価格です。2027年1月1日から 1.50 ドル / 7.50 ドルへ変わります
記事一覧/開発ツール
開発ツール/2026-09-10中級

浮世絵カタログの表記ゆれ照合を、正規化と候補列挙の二層で組む手順

同じ絵師名が三通りに散らばったカタログを揃えるとき、Gemini に同一判定をさせると世代違いが混ざります。正規化を先に置き、モデルには候補の列挙だけを頼む二層構成を、動くコードと費用の見積もりつきでお伝えします。

Gemini API236構造化出力17データ整備個人開発117浮世絵

プレミアム記事

浮世絵壁紙の配信前に、カタログを上から順に見返していた夜のことでした。同じ絵師の名前が、三つの表記で並んでおりました。「歌川広重」「安藤広重」「Utagawa Hiroshige」。どれも誤りではありません。ただ、私のスクリプトにとっては三人の別人でした。

版木から起こされた古い紙をスキャンして、折れや汚れを一枚ずつ手で直しています。そこは道具を替えていない領域です。一方で、直し終えた画像に添えるメタデータ——絵師名、画題、シリーズ名——は、人の手で入力している以上、必ず揺れます。

この揺れを Gemini に吸収させようとして、最初のうちは遠回りをしました。書き残しておきます。

「同じ人ですか」と聞いた日に起きたこと

最初に書いたのは、二つの名前をそのまま渡して同一人物かどうかを尋ねる関数でした。ほとんどの場合、返事は正しいのです。問題は、正しくない数十件のほうにありました。

初代の広重と、その門人が襲名した二代広重が、同じ人物として返ってきます。しかも返事は「はい、同一人物です」という断定の形をとりますので、一覧の上では正解と見分けがつきません。私はそれをそのまま採用して、配信済みの数点に誤った作者名を載せてしまいました。

判断は私が持ち、モデルには材料だけを出してもらいます。 この線引きにたどり着いたところまでは良かったのですが、判定をやめただけでは足りませんでした。呼び出しの件数そのものが多すぎたのです。同じ絵師の表記ゆれを、毎回モデルに考えさせていたわけです。

第一層: 正規化はコードの仕事です

揺れの大半は、意味の問題ではありません。全角と半角、旧字体と新字体、ヘボン式の長音、括弧書きの補足——機械的に潰せるものばかりです。ここに推論を持ち込む理由はありません。

# normalize.py — モデルを呼ぶ前に、決定論で潰せる揺れを潰す
import re
import unicodedata
 
# 旧字体・異体字 → 新字体(実際のカタログで出会ったものだけを足していきます)
KYUJI = str.maketrans({
    "廣": "広", "國": "国", "齋": "斎", "澤": "沢",
    "溪": "渓", "藝": "芸", "驛": "駅", "豐": "豊",
})
 
# 漢数字・大字の混在(「五拾三次」「五十三次」を同じ列に寄せます)
NUM_FIX = [("拾", "十"), ("卅", "三十")]
 
# 括弧の補足、肩書き、丸数字などの装飾
DECOR = re.compile(r"[((\[][^))\]]*[))\]]|$|$|[①-⑳]")
 
 
def normalize(name: str) -> str:
    s = unicodedata.normalize("NFKC", name)      # 全角英数と半角カナを揃えます
    s = s.translate(KYUJI)
    for a, b in NUM_FIX:
        s = s.replace(a, b)
    s = DECOR.sub("", s)
    s = re.sub(r"[\s・,.'’\-]", "", s)            # 区切り記号は落とします
    return s.lower()
 
 
def romaji_key(name: str) -> str:
    """ローマ字表記の長音ゆれ(Hiroshige / Hirōshige / Hiroshige)を1本に寄せます。"""
    s = unicodedata.normalize("NFKD", name)
    s = "".join(c for c in s if not unicodedata.combining(c))  # ō → o
    s = re.sub(r"(ou|oo|uu)", lambda m: m.group(0)[0], s.lower())
    return re.sub(r"[^a-z]", "", s)
 
 
if __name__ == "__main__":
    for a, b in [("歌川廣重", "歌川広重"), ("Utagawa Hirōshige", "Utagawa Hiroshige")]:
        key = normalize if re.search(r"[ぁ-んァ-ヶ一-龥]", a) else romaji_key
        print(a, b, key(a) == key(b))
        # 期待する出力:
        # 歌川廣重 歌川広重 True
        # Utagawa Hirōshige Utagawa Hiroshige True

私のカタログでは、この関数を通すだけで、揺れの大部分が同じキーに落ちました。残ったのは「歌川広重」と「安藤広重」のように、文字の上ではどうやっても結びつかない組です。モデルの出番はここから先だけで十分でした。

ここまでお読みいただきありがとうございます。

この記事の続きを読む

この先には、実装コードやベンチマーク結果など、実務でお役に立てる内容をご用意しています。このサイトは広告を掲載しておらず、サーバーや開発にかかる費用はメンバーの皆様のご支援で成り立っています。もしお役に立てていましたら、ご支援いただけますと大変ありがたいです。

この記事で得られること
名寄せをモデルに丸投げして静かに壊れる前に、正規化とモデル呼び出しの境目を自分で引けるようになります
response_schema と system_instruction だけで出力を安定させる書き方が手に入り、temperature に頼る設計から抜けられます
千件規模の名寄せを1ドル前後で回す配分が分かり、モデルを呼ぶ件数そのものを減らせるようになります
Stripe による安全な決済 · いつでもキャンセル可能

この記事を購入する

この先の内容をすべてお読みいただけます。一度のご購入で、いつでも何度でもアクセスできます。このサイトは広告を掲載しておらず、皆さまのご支援がサーバー費用などの運営を支えています。

または
メンバーシップなら全記事が読み放題 →
シェア

お読みいただきありがとうございます

Gemini Lab は広告なしで運営しており、サーバー費用などの運営コストはメンバーシップのご支援で賄っています。実装コード・ベンチマーク・本番設計パターンなど、実務でお役立ていただける記事を毎日更新しています。もし読んでよかったと感じていただけましたら、ぜひご覧ください。

  • コピー&ペーストで使える実装コード付き
  • 毎日新しい上級ガイドを追加
  • ¥580/月 または ¥2,480 の永久アクセス
メンバーシップを見る →

関連記事

開発ツール2026-08-24
Gemini の訳文で %1$s が消えても、レビューでは気づけません。文字列リソースへ戻す前の検査
Gemini に訳させたアプリの文字列から書式指定子が抜けたり全角になったりする事象を、実運用の中で拾い続けています。壊れ方を4種類に整理し、生成時に守らせる書き方と、受け取った直後に弾く短い検査を紹介します。
開発ツール2026-08-20
Gemini に書かせたレビュー返信を、送信前に止めるための最小の検査
ストアのレビュー返信は下書きより送信後が怖い作業です。守れない約束・連絡先の混入・文体崩れを送信前に機械で止める Python の検査を、実際に走らせた結果と誤検出の修正まで含めて置いておきます。
開発ツール2026-08-30
モデル廃止日をまたぐ古い端末に、読み替えではなく拒否を返す設計
モデルが止まっても、配布済みのアプリは止まりません。後継へ黙って差し替えるか、明示的に断るか。出力契約を軸に廃止台帳を作り、残存曲線から自分の締切日を逆算するまでの実装と計測をまとめました。
📚RECOMMENDED BOOKS
大規模言語モデル入門
山田育矢
LLM開発
生成AIプロンプトエンジニアリング入門
我妻幸長
プロンプト
Claude CodeによるAI駆動開発入門
平川知秀
AI駆動開発
※ アフィリエイトリンクを含みます