ぽこひでブログ

ほのぼの大学4年をやってる [ぽこひで] の学生エンジニアブログ?

人工無能で会話してみた n-gram編(1)

はじめまして。大学の前期授業も始まって今年から人工知能の講義があったので、試しに図書館にあったこの「はじめてのAIプログラミング」を読んでみました!

はじめてのAIプログラミング―C言語で作る人工知能と人工無能

はじめてのAIプログラミング―C言語で作る人工知能と人工無能

実装は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