正直なにもわかっていない
マルコフ連鎖のモデルをポケモンの名前にして適当につなぎ合わせたらポケモンの名前っぽいものができるのではと思ってChatGPTに作らせて適当に回しているけど雑過ぎてそれっぽくならない pic.twitter.com/IUiKbvX9ku
— あんかけ (@aaaannnnkkkkake) 2023年4月10日
はじめに
ポケモンの名前は構成する文字によく見る並びがある気がする。リザードンとかシビルドンとかトリトドンとか「ドン」があるしバンギラスとかバンバドロとかバンプジンとか「バン」だし。というわけで適当に文字のマルコフ連鎖からポケモン名を作ってくれるプログラムを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
ポケモン的に言うならポケモンを全く知らない人に「こいつらのどっちがガオガエンで、どっちがペロッパフだと思う?」と聞いてみるような感じ。ガオガエンは力強い感じがあるし、ペロッパフは柔らかい感じがありそうだな~となんとなく正解率が高まるのではないか。
図書館で音声学の本を見たのでそのうち読みに行く前にこんなことをした。そんなわけで存在しないポケモンを生成することでプログラムとか確率とか心理学とか音声学の勉強のきっかけになりそう。がんばります。