myfinderの技術や周辺的活動のblog

2008年12月10日水曜日

人工無脳(chatbot)を実装してみる -第一回-

某書籍を見てまったりと実装してみる。
今日は基本的なコードだけアップします。
(基本的には本ママ)

* Bot本体

require 'Responder'

class Munoh
def initialize(name)
@name = name
# 「ってなに?」と聞き返すレスポンダ
@resp_what = WhatResponder.new("what")
# 固定的な回答をランダムに行なうレスポンダ
@resp_rand = RandomResponder.new("rand")
# デフォルトはランダム
@responder = @resp_rand
end

def dialogue(input)
# 質問が入力された場合に、1/2の確率でレスポンダを選択
@responder = rand(2) == 0 ? @resp_what : @resp_rand
return @responder.response(input)
end

def responder_name
return @responder.name
end

def name
return @name
end
end

* Responder

# レスポンスの基底クラス
class Responder
def initialize(name)
@name = name
end

# 基底クラスには特に実装なし
def response(input)
return ''
end

def name
return @name
end
end

# 「ってなに?」と聞き返すだけの簡単なお仕事をするクラス
class WhatResponder < Responder
def response(input)
return "#{input}ってなに?"
end
end

# ランダムに回答を返すだけの簡単なお仕事をするクラス
class RandomResponder < Responder
def initialize(name)
super
@response = ['さむいね', 'あついよ', '自販機からギザ10出て来た!']
end

def response(input)
# 実際に返答する回答を選択して返す
return @response[rand(@response.size)]
end
end

* これらをキックするmainプログラム

require 'Munoh'

def prompt(munoh)
return munoh.name + ':' + munoh.responder_name + '> '
end

puts 'ChatBot System protorype : むのうたん'
proto = Munoh.new('むのうたん')
while true
print '>'
input = gets
input.chomp!
break if input == ''

response = proto.dialogue(input)
puts prompt(proto) + response
end


ここからちょっとずつ成長させていきます。
あと、書いているコードはCodeReposにUPしてますので、最新版はそっちをご覧ください。

0 件のコメント: