はじめに
テキスト UI やチャット画面で日本的なニュアンスを出すのに、顔文字(kaomoji)は最高です。
本記事では以下の手順で、猫系の顔文字を「収集 → 正規化 → 生成AIで増やす → Web に一覧化」するまでをまとめます。
- ① 既存の猫系顔文字を少量だけ**種(seed)**として用意
- ② Python + ChatGPT API でスタイルを保ったままバリエーションを一括生成
- ③ HTML + JS でクリックコピー付きの簡易一覧ページを作成
- ④ デモ:Kaomojiya.org の猫ページ(例)
目的は「開発者のワークフローで再利用しやすい形」にすること。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 を減らす追加プロンプト例
- 「縦に極端に長い顔文字は出さない」
- 「動物が猫以外に見える要素(犬鼻や角)は避ける」
- 「左右の耳は対称形を優先(例:=^ ^=)」
- 「政治・宗教・性的表現に連想しうる記号は除外」
