人工無能で会話してみた n-gram編(1)
はじめまして。大学の前期授業も始まって今年から人工知能の講義があったので、試しに図書館にあったこの「はじめてのAIプログラミング」を読んでみました!
はじめてのAIプログラミング―C言語で作る人工知能と人工無能
- 作者: 小高知宏
- 出版社/メーカー: オーム社
- 発売日: 2006/10
- メディア: 単行本
- クリック: 112回
- この商品を含むブログ (24件) を見る
実装はC言語なんですが、年明けからRubyを勉強し始めてからC言語の冗長性になんか嫌気がさしてしまったので、自分なりに拙いプログラムながらRubyで実装してみました。
読んでみると「はじめて」とうたってるだけあって、最初の方はかなりわかりやすくて読んでいて楽しかったです。その内容を少しずつ紹介できたらなと思います。
基本的にこの本の7割近くは人工無能の話で、人間と対話するにあたってどのような技術が使われてきたかをCのソース付きで解説してくれています。その中でも、最初に紹介されていたn-gram法とマルコフ連鎖を今日は自分のメモがてらここに。
簡単な人工無能で会話するために、まず学習させる文章を用意します。夏目漱石とか古い感じの書籍だと著作権が切れてて無料でインターネットに載ってたりするので今回はそれを活用する。
まず、その文章をn-gram法といって、n文字ずつのまとまりに区切ってその表れ方を解析する方法で、文章の特徴を知ります。例えば2-gram法で
「明日は晴れだ。」-> [明日],[日は],[は晴],[晴れ],[れだ],[だ。]
と区切れます。この方法で区切ったこの2文字列を何か配列に格納して、2文字列が文章内に何回出現したかを記録していきます。これをつたないプログラムで書くと
@list = {} def ngram(n, text) i = 0 while(text[i+n-1]) do @list[text[i,n]]? (@list[text[i,n] += 1) : (@list[text[i,n]] = 1) i += 1 end end
となります。何らかの文章(text)と何文字ごとに分解するか(n)を引数で渡して、例えば3文字なら、3文字先の文字が存在しなくなるまで、while文で繰り返して、もし既にその3文字列が存在すれば+1を、まだ存在しなかったら1回出現したので1を格納する。といった動作をします。
実際に実行してみると
ngram(2,"私は日本人です。私は中国人です。あなたは何人ですか?") #=> {"私は"=>2, "は日"=>1, "日本"=>1, "本人"=>1, "人で"=>3, "です"=>3, "す。"=>2, "。私"=>1, "は中"=>1, "中国"=>1, "国人"=>1, "。あ"=>1, "あな"=>1, "なた"=>1, "たは"=>1, "は何"=>1, "何人"=>1, "すか"=>1, "か?"=>1}
と@listに格納されるので、とりあずこれでn-gram法は完成ということで。
次回はこのn-gram法で作ったn文字列をマルコフ連鎖で繋げてそれっぽい?会話をできる人工無能を頑張って作りますっb