延び延びになっていた Eliza の中身をいよいよ見始める。Eliza と私との出会いは、かれこれ 10 年以上前だろうか。最初に見たのは BASIC で書かれたものだった。これを当時の国民機 NEC PC98 シリーズの互換機の EPSON で動かしたのが最初だ。LISP 版もその後見たかな。で、とにかく見てみると、Python で書かれたものは、はるかに分かりやすい。あ、正規表現使っているから簡単になったのか。ふーん。
eliza をクラスとして定義している。つまり、まあ、Eliza というのはどういうものになるのだよという設計図が最初に書かれているわけだ。この設計図あるいは遺伝子とでもいったらいいのだろうか、これを元に実際に動かすときに Eliza の実体を作ってお話するわけ(我ながら滅茶苦茶ラフな解説である)。
LISP 版であれば、この設計図自体を変更していくことができるので Eliza の進化が可能といえば可能だ。遺伝子にたとえたのは、この実体を作り出す設計図自体を自動的に書き換えていくプログラムを作れば、さらに自動的に進化していける。そして、突然変異が発生したり、実体がまともに動かずにすぐに死んでいったりなどすることを念頭においている。
と能書きばかり長い(笑)。さすがにここで終わってはなんなので、もう少し続ける。まず、クラスつまり設計図というか雛形が実体になるときには、__init__ という関数が呼ばれる。この中でデータを Eliza が読み込んで使いやすい形にしている。
[r’I need (.*)’, [ "Why do you need %1?", "Would it really help you to get %1?", "Are you sure you need %1?"]],
正規表現を使って、「私はxxが欲しい」(I need) と来た場合には3つのパターンを用意する。つまり、「どうしてxxが欲しいの?」"Why do you need %1? と(省略)、で、実際には %1 の部分にマッチした文字を当てはめていくということになるわけだ。英語の場合、これがやりやすいのは、例えば、"I need a friend who ....." と友人(friend)を修飾するようなものが長々ときても、それをそのまま持ってきても、ちゃんと文が成り立つ可能性が高いことだ。
変換(transform) では、入力された文をまずスペースで分割する。日本語なら形態素解析を行って単語ごとに分かちがきしてやるが、英語の場合スペースで切るだけだから1行で済んでしまうのだ。で、最初に覚えこんだ正規表現パターンとは別に用意してある単語の置き換え用の辞書を参照しする。つまり正規表現とは別に単語辞書が用意されているのだ。ここでは、I am ... の I を You に置き換えたり、am を are に置き換え、また、you’ve を you have に置き換えるために使う。つまり、I と You の変換のための小さな辞書から、キーの部分だけを抜き出してやる。つまり I, am, you’ve というリストができる。そうしたら、入力された文の頭から置き換えリストを参照して、置き換える必要がある単語は置き換えてやる。で、それが終わったら、もう一度、ばらばらにした単語をつなぎなおして一つの文字列にして返す。
実際のプログラムでは、これを繰り返し呼び出して会話を行うわけだ。なんで、その程度にも関わらずもっともらしい動きになるか。それは、登録してある例文のウマさと、英語自体の特性によるものだろう。日本語ではとてもこれと等価のプログラムを同じような行数で書くことはできないのだ。だから、たかが Eliza されど Eliza なのだ。これの元となったプログラムは、1966年に作られたものであることに注意! 要するにアメリカではその時代にすでに人工無能の走りが出ていたわけで、現状ではもっと高度なものになっているということだ。
なんて書くと、次は Alice でも見なきゃいけないのかな。その前に、やっぱり、プログラムの方をすすめないとな。