0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

猫系の顔文字を“自動生成”してみる:Python + ChatGPT APIでバリエーション拡張

Posted at

はじめに

テキスト UI やチャット画面で日本的なニュアンスを出すのに、顔文字(kaomoji)は最高です。
本記事では以下の手順で、猫系の顔文字を「収集 → 正規化 → 生成AIで増やす → Web に一覧化」するまでをまとめます。

  • ① 既存の猫系顔文字を少量だけ**種(seed)**として用意
  • Python + ChatGPT API でスタイルを保ったままバリエーションを一括生成
  • ③ HTML + JS でクリックコピー付きの簡易一覧ページを作成
  • ④ デモ:Kaomojiya.org の猫ページ(例)

Screenshot 2025-11-10 at 4.43.24 PM.png

目的は「開発者のワークフローで再利用しやすい形」にすること。JSON 化・重複除去・NG 文字のガードなど、実務向けの小技も入れています。


1. 種データ(猫系・手作業で収集)

まずはネットでよく見る猫っぽい顔文字を10〜15個ほどピックアップ(著作権や転載規約に配慮し、一般的な記号の組合せのみ使用)。

[
  "(=^・ω・^=)", "(=^・^=)", "(=①ω①=)", "ฅ^•ﻌ•^ฅ", "(Ф∀Ф)",
  "(=ㅇᆽㅇ=)", "(=ↀωↀ=)", "ʕ·ᴥ·ʔฅ", "(=ↀᆺↀ=)✧", "(=´∇`=)",
  "≽ܫ≼", "ฅ(=^ω^=)ฅ", "꒰ᐢ⸝⸝• ̫ •⸝⸝ᐢ꒱", "(=TωT=)"
]

収集時のポイント:

  • テーマ性(猫っぽい耳・ひげ・肉球・鳴き)を意識
  • 丸括弧/全角半角の揺れを後工程で正規化
  • 意味が変わる機種依存文字は避ける

2. 生成方針とプロンプト設計

生成AIに丸投げしないのがコツ。以下のような制約付きプロンプトで「安全・多様・テーマ一貫」を担保します。

  • 出力は重複禁止・配列 JSON
  • ASCII/全角記号のみ(外字/合成絵文字禁止)
  • 既存のスタイル特徴(耳=^ ^=、ひげ=ω= 等)を継承
  • 長過ぎない(10〜14 幅目安)/ 左右バランス良し
  • ネガティブプロンプト:人や動物蔑視・政治など文脈を連想させない

例:システム & ユーザー プロンプト

[system]
You are a careful kaomoji generator. Follow constraints exactly.

[user]
目的: 猫(ねこ)系の顔文字を、既存の種データのスタイルを保ちつつ増やす。
出力要件:
- JSON配列で20個、文字列のみ。コメント禁止。
- ASCII/全角記号のみ、外字・絵文字(emoji)禁止。
- 顔文字の幅はおおむね10〜14文字。
- 猫らしさ(耳/ひげ/目/肉球など)が分かること。
- 既存と重複しない、近すぎない。

既存の種:
(=^・ω・^=), (=^・^=), (=①ω①=), ฅ^•ﻌ•^ฅ, (Ф∀Ф),
(=ㅇᆽㅇ=), (=ↀωↀ=), ʕ·ᴥ·ʔฅ, (=ↀᆺↀ=)✧, (=´∇`=),
≽ܫ≼, ฅ(=^ω^=)ฅ, ꒰ᐢ⸝⸝• ̫ •⸝⸝ᐢ꒱, (=TωT=)

出力:
- JSONのみ(例: ["(=^x^=)", "..."])

3. 生成スクリプト(Python)

※ API キーは環境変数で管理。実行前に export OPENAI_API_KEY=...。

import os, json, re, time
from typing import List
from openai import OpenAI

client = OpenAI(api_key=os.getenv("OPENAI_API_KEY"))

SEED = [
    "(=^・ω・^=)", "(=^・^=)", "(=①ω①=)", "ฅ^•ﻌ•^ฅ", "(Ф∀Ф)",
    "(=ㅇᆽㅇ=)", "(=ↀωↀ=)", "ʕ·ᴥ·ʔฅ", "(=ↀᆺↀ=)✧", "(=´∇`=)",
    "≽ܫ≼", "ฅ(=^ω^=)ฅ", "꒰ᐢ⸝⸝• ̫ •⸝⸝ᐢ꒱", "(=TωT=)"
]

def normalize(s: str) -> str:
    s = s.replace("\u3000", " ").strip()
    s = re.sub(r"\s+", " ", s)
    return s

def dedup(xs: List[str]) -> List[str]:
    seen, out = set(), []
    for x in xs:
        k = normalize(x)
        if 8 <= len(k) <= 16 and k not in seen:
            seen.add(k); out.append(k)
    return out

def generate_variations(seeds: List[str], n: int = 20) -> List[str]:
    sys = "You are a careful kaomoji generator. Output JSON array only."
    user = f"""目的: 猫(ねこ)系の顔文字を、既存の種データのスタイルを保ちつつ増やす。

出力要件:

  • JSON配列で{n}個、文字列のみ。コメント禁止。
  • ASCII/全角記号のみ、外字・絵文字(emoji)禁止。
  • 顔文字の幅はおおむね10〜14文字。
  • 猫らしさ(耳/ひげ/目/肉球など)が分かること。
  • 既存と重複しない、近すぎない。
    既存の種:
    {", ".join(seeds)}
    出力:
  • JSONのみ(例: ["(=^x^=)", "..."])
    resp = client.chat.completions.create(
        model="gpt-4o-mini",
        messages=[{"role":"system","content":sys},
                  {"role":"user","content":user}],
        temperature=0.7
    )
    txt = resp.choices[0].message.content.strip()
    m = re.search(r"\[.*\]", txt, flags=re.S)
    arr = json.loads(m.group(0)) if m else []
    arr = [normalize(s) for s in arr]
    return dedup(arr)

if __name__ == "__main__":
    generated = generate_variations(SEED, n=24)
    all_ = dedup(SEED + generated)
    print(json.dumps(all_, ensure_ascii=False, indent=2))
    with open("neko-kaomoji.json", "w", encoding="utf-8") as f:
        json.dump(all_, f, ensure_ascii=False, indent=2)

4. 生成結果(例)

上のスクリプトで得られた出力の一部(例):

"(=^•ω•^=)", "(=・ω・=)ノ", "ฅ(=^・ω・^=)ฅ", "(=^ェ^=)", "(=ↀᆺↀ=)ノ",
"(=^・ェ・^=)", "≖ܫ≖", "(=`ω´=)", "(=^・^=)☆", "ฅ(=^・^=)ฅ",
"(=^‥^=)", "(=^・ᆺ・^=)", "(ФωФ)", "ฅ(=^・ω・^=)ฅ♪", "(=^▽^=)"

5. Web 一覧(クリックコピー)

最低限の HTML + JS でクリックコピー対応の一覧にします。

<!doctype html>
<meta charset="utf-8" />
<title>猫顔文字ギャラリー</title>
<style>
  body { font-family: system-ui, sans-serif; padding: 20px; }
  .item { display:inline-block; margin:6px; padding:10px 14px; border:1px solid #ddd; border-radius:10px; cursor:pointer; }
  .item:active { transform: scale(0.98); }
  .copied { background:#eef; }
</style>

<h1>猫系顔文字 (click to copy)</h1>
<div id="list"></div>

<script type="module">
import data from './neko-kaomoji.json' assert { type: 'json' };

const list = document.getElementById('list');
data.forEach(k => {
  const div = document.createElement('div');
  div.className = 'item';
  div.textContent = k;
  div.onclick = async () => {
    await navigator.clipboard.writeText(k);
    div.classList.add('copied');
    setTimeout(() => div.classList.remove('copied'), 600);
  };
  list.appendChild(div);
});
</script>

6. デモ & 仕上げ

  • デモ(例):https://www.kaomojiya.org/cat-kaomoji
  • トップから他カテゴリへ導線(犬・挨拶・感情・擬音など)
  • 検索・類似推薦(例:「笑い」→「喜び」)を入れると滞在時間↑
  • SEO 的には title/description/h1 と日本語タグを丁寧に

まとめ

  • 少量の良質な種を用意して、生成AIで拡張
  • 正規化・重複排除でクオリティ維持
  • クリックコピー UIで実用性を確保
  • 公開は 顔文字屋 のカテゴリページとして整理

顔文字は“雰囲気”の言語レイヤ。
生成AIと軽量な Web 実装を組み合わせると、テーマ性を保った辞書をすばやく量産できます。

付録:NG を減らす追加プロンプト例

  • 「縦に極端に長い顔文字は出さない」
  • 「動物が猫以外に見える要素(犬鼻や角)は避ける」
  • 「左右の耳は対称形を優先(例:=^ ^=)」
  • 「政治・宗教・性的表現に連想しうる記号は除外」
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?