ランダム名前生成装置

カタカナをランダムに生成する乱数発生装置を用意しました。
さて、その上で、「一見意味があるっぽく見える名前」をランダムに生成するアルゴリズムはどーなるかなとか考えて見る。


大雑把には、「長さ」と「発音の良さ」がポイントになる。
「長さ」というのは、文字列長のこと。「アリス」って名前なら3文字って程度の意味。この閾値はある程度の幅を持たせて、3〜7文字ぐらいがまあいいところか。数字が少ないほうが出やすいとかの確率操作もできるけど、それはまあ置いておいて。
次に「発音の良さ」。さっきの例で言えば「アリス」という文字列は、なじんでるし、たぶん有声音とか無声音とか発声学的にもなんか裏づけがあって聞き取りやすかったりするんだろうと思われる。
ただし、これをランダムに生成しようとするとなると、たぶんどっかで聞いたようなのを一覧表作ってランダムチョイスしたほうが合理的になってくると思う。
でもそれじゃあつまらんし、ってところでランダムに語感のいい名前を生成するロジックは、さてどんなもんだろうか、と考える。


まず、これはもうどうしようもないと思うので、名前っぽい文字列を大量にプログラムに食わせる。食わせて、その名前っぽい文字列の文字数と文字の並びを評価させる。
文字数の評価についてはカウントするだけだから略。
文字の並びの評価は、例えば「アリス」なら、一文字目に「ア」がある場合、二文字目には「リ」が来ると評価+1として定める。二文字目が「リ」で、三文字目が「ス」なら、これも評価+1とする。
というような評価を、サンプルで食わせた文字列分、すべてについて評価していく。二次元配列で全パターン組み合わせたテーブルを持つか、評価文字列を一次元配列で記憶して、評価時にヒット数で判定させるかは、まあ処理が軽いほうを採用って程度で。サンプルが多い場合は二次元配列で処理したほうが結果的には軽そうかな。


で、一文字目に「リ」、二文字目に「ス」が来た場合、先の評価法では、評価はついていない。その文字の並びは二文字目と三文字目に来たときの評価になるから。しかしそれだと判定が厳密すぎるので、評価を半分にして加点する、とする。この場合は0.5点。
ランダムに生成する文字列は、例えば最初の文字はなんでもいいけど、二文字目は五個ぐらい候補を用意する(重複は削除する)。これらの候補について評価させて、評価が最高のものを採用する。
というのを、文字列数が全部埋まるまで繰り返す。禁則条件として一番最初に「ン」と「ー」は来ない、とする。また、評価の条件として、小文字は大文字としてカウントする。「ァ」は「ア」として評価して、生成された文字列を勝手に読み替えるようにする。
って感じでいけないかなあ。やってみないとわからないけど。サンプルの名前リストを作るのがめんどいです。そしてサンプルの名前リストがあれば自動生成する意味があんまりないです。