あんかけが書く

かきたいことをかきます。

ポケモンっぽい名前を生成するなどした


正直なにもわかっていない

はじめに

 ポケモンの名前は構成する文字によく見る並びがある気がする。リザードンとかシビルドンとかトリトドンとか「ドン」があるしバンギラスとかバンバドロとかバンプジンとか「バン」だし。というわけで適当に文字のマルコフ連鎖からポケモン名を作ってくれるプログラムをpythonでつくった。マルコフ連鎖とかは適当にググってください。



つくりかた

 2023年はChatGPT!!!!!!!!

こいつに聞け

 プログラムが投げられる。

import random

def generate_word_chain(text):
    words = text.split()  # 単語のリストを生成
    word_chain = {}
    for i in range(len(words) - 1):
        current_word = words[i]
        next_word = words[i + 1]
        if current_word not in word_chain:
            word_chain[current_word] = []
        word_chain[current_word].append(next_word)
    return word_chain

def generate_text(word_chain, length=10):
    current_word = random.choice(list(word_chain.keys()))  # ランダムな単語を選択
    generated_text = current_word
    for i in range(length):
        if current_word not in word_chain:
            break
        next_word = random.choice(word_chain[current_word])
        generated_text += ' ' + next_word
        current_word = next_word
    return generated_text

text = "The quick brown fox jumps over the lazy dog"
word_chain = generate_word_chain(text)
generated_text = generate_text(word_chain, length=10)
print(generated_text)

 お前これ適当に単語並べるだけじゃん。

 適当に「重みづけしといて~」と言いつつ適当に手直し。

import random
import re
from collections import Counter
from random import randint

def generate_markov_model(text):
    # マルコフ連鎖のモデルを構築する関数
    model = {}
    words = text.split()
    for i in range(len(words)-1):
        if words[i] not in model:
            model[words[i]] = []
        model[words[i]].append(words[i+1])
    return model

def generate_text(model, num_words):
    # マルコフ連鎖を使って、指定された数の単語からなる文章を生成する関数
    current_word = random.choice(list(model.keys()))
    while not re.search(r'[^:2Z・ァィゥェォャュョッーン]', current_word):
        current_word = random.choice(list(model.keys()))
    text = current_word
    for i in range(num_words-1):
        next_words = model[current_word]
        next_words_count = Counter(next_words)
        weights = [next_words_count[word] for word in next_words]
        next_word = random.choices(next_words, weights=weights)[0]
        text += next_word
        current_word = next_word
    return text

# ファイルからテキストを読み込む
with open('text2.txt') as f:
    text = f.read()

# マルコフ連鎖のモデルを構築する
model = generate_markov_model(text)

# マルコフ連鎖を使って、3-6文字からなる名前を6つ生成する
for i in range(6):
    generated_text = generate_text(model, randint(3, 6))
    print(generated_text)

 こんなんでええんか?重みづけの概念がこれでいいのか怪しい。詳しい人適当に教えてください。

データ

 コード中にあるtest2.txtはこちらのcsvのタイプを消して1文字ごとに区切ったもの。
https://wonderhorn.net/material/pokelist.html

 データの偏りとしてニドラン♂♀は統一して「ニドラン」にした。あとはSVに登場したパラドックスポケを削除。ポケモンっぽい名前でないような名づけをしているので、それらを消してポケモン感のある名前になりやすくする。
 ブロロロームのせいでロ(ro)→ロ(ro)の流れが強まるのを危惧するも見逃してやる。ギギギアルもそうか。お前も見逃してやる。こいつらを放置すると「ロロロロロロ」みたいな謎モンが生成される確率が高まる。でもマルコフ連鎖の理屈的に2文字同じものが続くものがいる時点で「ポポポポポポ」("ポポ"ッコ)とかも避けられないのか。
 「カプ・〇〇〇」は「プ・」と錬成された瞬間に「テ」か「ブ」か「コ」か「レ」が確定する。「プ・ブーン」なる謎モンも産まれうる。こいつも見逃してやる。

ゆけっ!メノシュー!

 とりあえずcmdで実行。

俺の手持ち

 弱そうが過ぎる。メノシューは地面草の無進化っぽい。ドラミドロのなりそこないとかアマルルガの進化前(アマルスだろ)みたいなやつとか。ケンシマームが多分切り札。物理型でめちゃくちゃにした後に鈍足高耐久特殊高火力のモリールドでギリ殴り勝ちそう。

 もう1パーティ作る。

ポケモンマニア の あんかけ が しょうぶ を しかけてきた!

 ケニャムーンて。起点づくり要員っぽい。トリル担当か?トリルしたらハダイドサが上から殴ってトリル切れるくらいにクローライドが詰めていきそう。トリル無理そうならセクハナイとダイキリーのグッドスタッフ組で対面勝ちを狙う。

結論

 ポケモンという存在しない生き物の中でも存在しない架空ポケでキャッキャするおじさんが生まれた。割と並びを見て面白かった。
 思ったより文字の並びの偏りは無い気がする。1000種もポケモンいるなら数体「ドン」族がいたとて誤差なのだろうか。ドードーとかドータクンとか「ドー」もいるし生成されたハダイドサは"ドサ"イドンのそっちが出ている。確率は難しい。
 

ブーバ/キキ効果

 これをやってみた要因に「ブーバ/キキ効果」を知ったのがある。元々何かで知っていたけれどまた調べなおした。
ja.wikipedia.org
 ポケモン的に言うならポケモンを全く知らない人に「こいつらのどっちがガオガエンで、どっちがペロッパフだと思う?」と聞いてみるような感じ。ガオガエンは力強い感じがあるし、ペロッパフは柔らかい感じがありそうだな~となんとなく正解率が高まるのではないか。

 図書館で音声学の本を見たのでそのうち読みに行く前にこんなことをした。そんなわけで存在しないポケモンを生成することでプログラムとか確率とか心理学とか音声学の勉強のきっかけになりそう。がんばります。

失敗作