アニマルという対話ゲームがあります。その概要はこんなかんじです。まずユーザになにか動物を思い受かべてもらいます。また、コンピュータが持っている知識は、このような初期のものから出発します。
最初の「ワンと鳴きますか?」に “Yes” と答えると、「犬ですね?」と訊いてきます。ここでさらに “Yes” と答えれば、アニマルが当てたということで、ゲームは終ります。
また、最初の「ワンと鳴きますか?」に “No” と答えると、「猫ですね?」と訊いてきます。「ワン」と鳴かない動物はたくさんいますので、もしかしたら、ユーザはここでは “No” と答えるかもしれません。アニマルの面白いところはここからです。
ここで、アニマルは、「思い受かべた動物はなんですか?」という質問と、「どのような質問をすればいいですか?」という質問をしてきます。仮に思い受かべたものは「フェレット」であり、「胴長ですか?」という質問をすればいいと答えたします。すると、アニマルは、その知識を、先の木構造に組み込みます。たとえば次のように:
このようにアニマルは、失敗すると、新たにユーザから知識を得て、自分が持っている知識を更新しえていきます。この、「フェレット」と、「胴長ですか?」に相当する知識は、元々「猫ですね?」があった位置に「胴長ですか?」を置き、それに対しての回答が “Yes” の場合には「フェレットですね?」を答え、 “No” の場合には、それに対しての答えの部分に「猫ですね?」を持っていきます。
かりに「ワンと鳴きますか?」に “Yes” と答えると、「犬ですね?」と訊いてきます。ですが、「ワン」と鳴く動物はほかにもいそうです。ここでも、「犬ですね?」という問いに “No” と答えた場合、アニマルは同じように新らしい知識を得ます。
アニマルでは、これらの知識の増やし方は、かならずこの形を取ります。
“Yes/No” の二分木であり、一番下の要素は推測する動物になります。ですので、11段の木があれば、11 - 1 = 10段が実質の深さになります。この二分木がキッチリと埋められている場合、2^10 = 1024個の動物を推測できることになります。
アニマルは、質問も答えも定型的であるという制限がありますが、知識を増やしていくという方法は、いわゆる人工無脳にも使えます。もちろん、人工無脳の場合、このような定型的なやりとりには限りませんので、単純な木構造では、その知識を現わせません。
話を簡単にするために、人工無脳において入力の形態素解析や統語解析はしないとしましょう。加えて、単語あるいは文節ごとに分かち書きをするものとします。その上で、ランダムでもなんでもいいので、ある単語や文節が現われたらこのように返事を返すという単純なものとしましょう。
これだけの場合、知識にアニマルのような階層構造は持たないため、二次元の配列、あるいは2要素のレコードの配列で実現できます。
ですが、ある言葉が入力されたら、常に同じ返事をするというのも面白くないでしょう。そうすると、2次元以上の要素を持つ配列ないしレコードの配列、あるいは二次元配列の応えの部分には、すくなくとも1階層の木を持たせることもできるでしょう。木の場合であれば、もしかしたら、どの応えを返すかについては確率もついているかもしれません。
これでもまだ単純すぎるかもしれません。そこで、入力に対して、どの応えを返して、さらにどういう入力が来たら、さらにどの応えを返すか…… というようなことを憶える必要があるかもしれません。
この場合、基本的なデータ構造としては、グラフを構成することになります:
実際には、入力と出力に対応するデータも持つので、オートマトンなどになるでしょう:
人工無脳を本企画の題材にするのは難しいかと思いますが、アニマルなら課題にできるかもしれません。
興味を持たれましたら、ぜひご支援や、コメントをお願いいたします。
プロジェクトの本文や、活動報告についての感想、ご意見、ご質問を、ぜひコメントでお寄せいただければと思います。現在は支援募集期間中であり、本企画の実施期間ではないため、お寄せいただいた感想などについてはリターンとしてではなく、お返事や回答をさせていただきます。
また、私個人についてはこちらをご覧ください。