KMC3回生になったprimeです。
KMCにいるPepperくんの新歓特別企画として、Pepperくんにポケモンしりとりをしてもらうことにしました。 Pepperくんの優秀な頭脳により的確に人間を詰めていきます。
Pepperくんがポケモンしりとりをできるようになるまで
なぜポケモンしりとりなのか?
もともとは任意の言葉が使えるような普通のしりとりにしようと考えていたのですが、Pepperくんの音声認識エンジンではうまく行かないことがわかり、ポケモンだけに限定したしりとりをしてもらうことにしました。
辞書の準備
keitarou/pokemon_zukan · GitHub の https://github.com/keitarou/pokemon_zukan/blob/master/data/xy/ja/name_table.json からポケモンの名前データを一括で取ってきました。
さらに、しりとりのルールに合わせて名前データを整形したものを用意します。 具体的には、「ニドラン♀」の「♀」などの記号を読みに変換し、NKFでひらがなに変換して、濁点・半濁点や伸ばし棒を除去し、捨てがな(「ぁ」、「っ」などの小さいがな)をふつうのひらがなに変換しました。変換プログラムはRubyで記述しました。 https://gist.github.com/primenumber/25588158f3b97dc64c9c
ポケモンの名前の辞書をPepperくんに読み込ませ、聞き取った単語をしりとりのルールに照らし合わせて合法な名前かを判断して、合法であれば次に述べるAIサーバーに単語を投げ、サーバーから返って来た結果を喋ります。しりとりのバリデータはChoregraphe内のPythonブロックで記述しています。音声認識自体はQiChat Scirptによりかなり簡単に行うことができます。
AIサーバー
Pepperくんの脳であるコンピュータは、残念ながらたくさんの計算をするにはあまり向いていないので、ネットワーク上にあるサーバーでAIプログラムを動かしています。 Pepperとのやり取りをするサーバー部分をRubyで、AIのコア部分をC++で記述しています。
AIのしくみ
まず、ツンベアー↔アリゲイツのような一手で元に戻るような単語のペアは勝敗に影響を与えないことがわかるので、勝敗判定の際にはそのようなペアをすべて取り除いてから考えれば良いことがわかります。
そして、勝敗判定のアルゴリズムにはαβ法というアルゴリズムを利用しています。
これにより、(もし存在すれば)「人間がどんなポケモンを選んでも、このあとPepperくんが上手くポケモンを選べば、必ず勝てる」ような手を高速に見つけることができます。
計算時間の都合上、十数手(ただし、一手で元に戻る単語のペアは除く)で詰まないような場合にはランダムにポケモンを選びます。
また、局面によってはPepper君がどんな手を選んでも(人間が上手くポケモンを選べば)Pepper君が負けるような場面が存在します。
そのような場合は「最短の負け手数」が最長になるような手をこちらもαβ法で選ぶようなAIになっています。
UIの整備
Pepperくんには胸にタブレットが付いているので、そこに「直前に言われたポケモンの名前と画像」、「いまどちらの番か」、「次はどの文字から始まるか」という情報を表示するようにしています。
Pepperくんの胸のタブレットはPepperくんとは独立していて、インターネットに繋がっていないので(Wifiを有効にする方法もあるようですが、今回は上手く行きませんでした)、ポケモンの画像をすべて手元に持っておかないといけません。 しかし、ポケモンの画像700枚以上を十分な解像度で保持しようとすると数十MBに達するため、泣く泣く1/3のサイズに縮小したものを3倍に拡大して表示しています。
新入生とポケモンしりとりをやってみて
PepperくんのしりとりAIは非常に強く、人間がたとえポケモン名一覧を持っていたとしてもPepperくんに勝つのは非常に難しくなっています。例えば、人間が「イトマル」から始めるとPepperくんはその時点で勝ちを確信し、このあと人間がどう発言してもPepperくんが必ず勝利します。新歓が始まってから少しづつAIを改良してきましたが、今のAIになってからは数十回中1,2回程度しか人間に負けていません。
まとめ
京大マイコンクラブでは、4月だけでなく5月にも毎週月曜・木曜の18:30から新歓説明会を行なっています!18:15に共北ショップ前に集合してもOKです!
京大マイコンクラブの部室に来てPepperくんとポケモンしりとりをしよう!!!