文字遷移確率でポケモンの名前をランダム作成

# 文字の遷移確率で遊ぶ
特定の文章サンプル内の文字遷移確率をもとめてランダム単語を作ります。
# 文字の遷移確率とは
「大和」「大井」「大淀」というサンプルで考えて「大」は「和」「井」「淀」それぞれに３３％の確率で遷移する文字だと計算できます。以上のような計算をサンプル中に登場する文字全てで行います。
# ポケモンの名前で実験
実験結果です、コードは後述。

```
2
Z
♀
♂
ァイクタ
アージュラ
ィアンリルー
イノムーリス
ウマスバナ
ェリンパ
エルガーナン
ォレジャ
オムーンZ
カシェリダ
ガスピジー
キーホールキ
ギラース
クトリルガー
グノームナト
ケニンド
ゲピウマナ
コモン♂
ゴングマ
サクース
ザルルピ
シャタスブ
ジロットーチ
スリムス
ズレアズ
セルトノク
ゼルゲボ
ソハナクラ
ゾウマンガ
ターリオコ
ダールロウカ
チルナイルト
ッタスル
ツブビゴ
ティナマケ
デンメイン
トンタング
ドキブネ
ナノクイ
ニングラ
ヌギラティ
ネーププス
ノードキモメ
ハストドゴー
バックヌギ
パルフライ
ヒポタマ
ビワンカメノ
ピィオニド
フカルトライ
ブイホーラー
プスカルゲ
ヘラセクラ
ベトドーン
ペリトリア
ホータツベイ
ボミルドシェ
ポチャンZ
マオウオン
ミライク
ムパルリア
メノムッグカ
モネッス
ャモリッスタ
ヤミラール
ューランテイ
ユキンブ
ョンリン
ヨーナクー
ラピンデプク
リリアリ
ルシギア
レジョッツ
ロスバスタマ
ワルビィ
ングート
ーノオングノ
```
コモン♂　とか　ポチャンZ　とか　ゾウマンガ　とかそれっぽいなにかができました。「2」とか1文字で終わっているのはサンプル中でその後に続く文字が存在しない文字です。ちなみに自分はポケモンをやったことがありません、見た目にわかりやすく数が多いという理由でポケモンを選びました。


# ソースコード

```python

import csv
import io
import numpy as np
import os
import sys

TsvData = """1	フシギダネ
2	フシギソウ
3	フシギバナ
4	ヒトカゲ
5	リザード
6	リザードン
7	ゼニガメ
8	カメール
9	カメックス
10	キャタピー
11	トランセル
12	バタフリー
13	ビードル
14	コクーン
15	スピアー
16	ポッポ
17	ピジョン
18	ピジョット
19	コラッタ
20	ラッタ
21	オニスズメ
22	オニドリル
23	アーボ
24	アーボック
25	ピカチュウ
26	ライチュウ
27	サンド
28	サンドパン
29	ニドラン♀
30	ニドリーナ
31	ニドクイン
32	ニドラン♂
33	ニドリーノ
34	ニドキング
35	ピッピ
36	ピクシー
37	ロコン
38	キュウコン
39	プリン
40	プクリン
41	ズバット
42	ゴルバット
43	ナゾノクサ
44	クサイハナ
45	ラフレシア
46	パラス
47	パラセクト
48	コンパン
49	モルフォン
50	ディグダ
51	ダグトリオ
52	ニャース
53	ペルシアン
54	コダック
55	ゴルダック
56	マンキー
57	オコリザル
58	ガーディ
59	ウインディ
60	ニョロモ
61	ニョロゾ
62	ニョロボン
63	ケーシィ
64	ユンゲラー
65	フーディン
66	ワンリキー
67	ゴーリキー
68	カイリキー
69	マダツボミ
70	ウツドン
71	ウツボット
72	メノクラゲ
73	ドククラゲ
74	イシツブテ
75	ゴローン
76	ゴローニャ
77	ポニータ
78	ギャロップ
79	ヤドン
80	ヤドラン
81	コイル
82	レアコイル
83	カモネギ
84	ドードー
85	ドードリオ
86	パウワウ
87	ジュゴン
88	ベトベター
89	ベトベトン
90	シェルダー
91	パルシェン
92	ゴース
93	ゴースト
94	ゲンガー
95	イワーク
96	スリープ
97	スリーパー
98	クラブ
99	キングラー
100	ビリリダマ
101	マルマイン
102	タマタマ
103	ナッシー
104	カラカラ
105	ガラガラ
106	サワムラー
107	エビワラー
108	ベロリンガ
109	ドガース
110	マタドガス
111	サイホーン
112	サイドン
113	ラッキー
114	モンジャラ
115	ガルーラ
116	タッツー
117	シードラ
118	トサキント
119	アズマオウ
120	ヒトデマン
121	スターミー
122	バリヤード
123	ストライク
124	ルージュラ
125	エレブー
126	ブーバー
127	カイロス
128	ケンタロス
129	コイキング
130	ギャラドス
131	ラプラス
132	メタモン
133	イーブイ
134	シャワーズ
135	サンダース
136	ブースター
137	ポリゴン
138	オムナイト
139	オムスター
140	カブト
141	カブトプス
142	プテラ
143	カビゴン
144	フリーザー
145	サンダー
146	ファイヤー
147	ミニリュウ
148	ハクリュー
149	カイリュー
150	ミュウツー
151	ミュウ
152	チコリータ
153	ベイリーフ
154	メガニウム
155	ヒノアラシ
156	マグマラシ
157	バクフーン
158	ワニノコ
159	アリゲイツ
160	オーダイル
161	オタチ
162	オオタチ
163	ホーホー
164	ヨルノズク
165	レディバ
166	レディアン
167	イトマル
168	アリアドス
169	クロバット
170	チョンチー
171	ランターン
172	ピチュー
173	ピィ
174	ププリン
175	トゲピー
176	トゲチック
177	ネイティ
178	ネイティオ
179	メリープ
180	モココ
181	デンリュウ
182	キレイハナ
183	マリル
184	マリルリ
185	ウソッキー
186	ニョロトノ
187	ハネッコ
188	ポポッコ
189	ワタッコ
190	エイパム
191	ヒマナッツ
192	キマワリ
193	ヤンヤンマ
194	ウパー
195	ヌオー
196	エーフィ
197	ブラッキー
198	ヤミカラス
199	ヤドキング
200	ムウマ
201	アンノーン
202	ソーナンス
203	キリンリキ
204	クヌギダマ
205	フォレトス
206	ノコッチ
207	グライガー
208	ハガネール
209	ブルー
210	グランブル
211	ハリーセン
212	ハッサム
213	ツボツボ
214	ヘラクロス
215	ニューラ
216	ヒメグマ
217	リングマ
218	マグマッグ
219	マグカルゴ
220	ウリムー
221	イノムー
222	サニーゴ
223	テッポウオ
224	オクタン
225	デリバード
226	マンタイン
227	エアームド
228	デルビル
229	ヘルガー
230	キングドラ
231	ゴマゾウ
232	ドンファン
233	ポリゴン2
234	オドシシ
235	ドーブル
236	バルキー
237	カポエラー
238	ムチュール
239	エレキッド
240	ブビィ
241	ミルタンク
242	ハピナス
243	ライコウ
244	エンテイ
245	スイクン
246	ヨーギラス
247	サナギラス
248	バンギラス
249	ルギア
250	ホウオウ
251	セレビィ
252	キモリ
253	ジュプトル
254	ジュカイン
255	アチャモ
256	ワカシャモ
257	バシャーモ
258	ミズゴロウ
259	ヌマクロー
260	ラグラージ
261	ポチエナ
262	グラエナ
263	ジグザグマ
264	マッスグマ
265	ケムッソ
266	カラサリス
267	アゲハント
268	マユルド
269	ドクケイル
270	ハスボー
271	ハスブレロ
272	ルンパッパ
273	タネボー
274	コノハナ
275	ダーテング
276	スバメ
277	オオスバメ
278	キャモメ
279	ペリッパー
280	ラルトス
281	キルリア
282	サーナイト
283	アメタマ
284	アメモース
285	キノココ
286	キノガッサ
287	ナマケロ
288	ヤルキモノ
289	ケッキング
290	ツチニン
291	テッカニン
292	ヌケニン
293	ゴニョニョ
294	ドゴーム
295	バクオング
296	マクノシタ
297	ハリテヤマ
298	ルリリ
299	ノズパス
300	エネコ
301	エネコロロ
302	ヤミラミ
303	クチート
304	ココドラ
305	コドラ
306	ボスゴドラ
307	アサナン
308	チャーレム
309	ラクライ
310	ライボルト
311	プラスル
312	マイナン
313	バルビート
314	イルミーゼ
315	ロゼリア
316	ゴクリン
317	マルノーム
318	キバニア
319	サメハダー
320	ホエルコ
321	ホエルオー
322	ドンメル
323	バクーダ
324	コータス
325	バネブー
326	ブーピッグ
327	パッチール
328	ナックラー
329	ビブラーバ
330	フライゴン
331	サボネア
332	ノクタス
333	チルット
334	チルタリス
335	ザングース
336	ハブネーク
337	ルナトーン
338	ソルロック
339	ドジョッチ
340	ナマズン
341	ヘイガニ
342	シザリガー
343	ヤジロン
344	ネンドール
345	リリーラ
346	ユレイドル
347	アノプス
348	アーマルド
349	ヒンバス
350	ミロカロス
351	ポワルン
352	カクレオン
353	カゲボウズ
354	ジュペッタ
355	ヨマワル
356	サマヨール
357	トロピウス
358	チリーン
359	アブソル
360	ソーナノ
361	ユキワラシ
362	オニゴーリ
363	タマザラシ
364	トドグラー
365	トドゼルガ
366	パールル
367	ハンテール
368	サクラビス
369	ジーランス
370	ラブカス
371	タツベイ
372	コモルー
373	ボーマンダ
374	ダンバル
375	メタング
376	メタグロス
377	レジロック
378	レジアイス
379	レジスチル
380	ラティアス
381	ラティオス
382	カイオーガ
383	グラードン
384	レックウザ
385	ジラーチ
386	デオキシス
387	ナエトル
388	ハヤシガメ
389	ドタイトス
390	ヒコザル
391	モウカザル
392	ゴウカザル
393	ポッチャマ
394	ポッタイシ
395	エンペルト
396	ムックル
397	ムクバード
398	ムクホーク
399	ビッパ
400	ビーダル
401	コロボーシ
402	コロトック
403	コリンク
404	ルクシオ
405	レントラー
406	スボミー
407	ロズレイド
408	ズガイドス
409	ラムパルド
410	タテトプス
411	トリデプス
412	ミノムッチ
413	ミノマダム
414	ガーメイル
415	ミツハニー
416	ビークイン
417	パチリス
418	ブイゼル
419	フローゼル
420	チェリンボ
421	チェリム
422	カラナクシ
423	トリトドン
424	エテボース
425	フワンテ
426	フワライド
427	ミミロル
428	ミミロップ
429	ムウマージ
430	ドンカラス
431	ニャルマー
432	ブニャット
433	リーシャン
434	スカンプー
435	スカタンク
436	ドーミラー
437	ドータクン
438	ウソハチ
439	マネネ
440	ピンプク
441	ペラップ
442	ミカルゲ
443	フカマル
444	ガバイト
445	ガブリアス
446	ゴンベ
447	リオル
448	ルカリオ
449	ヒポポタス
450	カバルドン
451	スコルピ
452	ドラピオン
453	グレッグル
454	ドクロッグ
455	マスキッパ
456	ケイコウオ
457	ネオラント
458	タマンタ
459	ユキカブリ
460	ユキノオー
461	マニューラ
462	ジバコイル
463	ベロベルト
464	ドサイドン
465	モジャンボ
466	エレキブル
467	ブーバーン
468	トゲキッス
469	メガヤンマ
470	リーフィア
471	グレイシア
472	グライオン
473	マンムー
474	ポリゴンZ
475	エルレイド
476	ダイノーズ
477	ヨノワール
478	ユキメノコ
479	ロトム
480	ユクシー
481	エムリット
482	アグノム
483	ディアルガ
484	パルキア
485	ヒードラン
486	レジギガス
487	ギラティナ
488	クレセリア
489	フィオネ
490	マナフィ
491	ダークライ
492	シェイミ
493	アルセウス
"""

def run():
    # 名前を変数に読み込む
    name = []
    nameLength = []
    for l in io.StringIO(TsvData):
        iname = l.strip().split("\t")[1]
        name.append(iname)
        nameLength.append(len(iname))
    # 文字の集計
    allChar = []
    for c in list("".join(name)):
        allChar.append(c)
    uniqueChar = np.unique(allChar).tolist()
    
    # 遷移確率を求める
    dim = len(uniqueChar)
    x = np.zeros((dim, dim))
    for iname in name:
        ilen = len(iname)
        for i in range(ilen):
            curIdx = uniqueChar.index(iname[i])
            #if i > 0:
            #    preIdx = uniqueChar.index(iname[i - 1])
            #    x[curIdx][preIdx] += 1
            if i < (ilen - 1):
                nextIdx = uniqueChar.index(iname[i + 1])
                x[curIdx][nextIdx] += 1
    
    # 遷移確率からランダムに名前を作る
    x = x / np.sum(x, axis=1).reshape(-1, 1)
    x[np.isnan(x)] = 0
    for i in range(len(uniqueChar)):
        newName = uniqueChar[i]
        rrange = np.random.randint(np.min(nameLength), np.max(nameLength))
        for n in range(rrange + 1):
            prob = x[uniqueChar.index(newName[-1])]
            if np.max(prob) == 0: break
            newChar = np.random.choice(uniqueChar, 1, p=prob)
            newName += newChar[0]
        print(str(newName))

if __name__ == "__main__":
    run()
"""
python main.py
"""
```

# 動機とか
隠れマルコフやRNNを調べていたら遷移確率というものが出てきて遷移確率を使ったなにかを作りたくなったので実装してみました。