人工知能を作りたい①

こんにちは、Palmです。
最近、Pythonの学習を再開しました。しかし、私が最後に何かを開発したのは1年前で、家にある書籍も古いため、ライブラリが正常に動かないことがわかりました。今のPythonの流行もわからなくなってきました。現在やりたいことは、ニュース記事などをカテゴリーに分けて学習データを確保し、自分のブログがどのカテゴリーに位置しているかを分析することですが、作り方がわからず保留中です。
話は変わりますが、今日は人工知能の初歩であるおうむ返しプログラムを作ります。
今回の目標は、とりあえずプログラムと会話します。
会話といっても意思疎通できるわけではなく、ユーザーが何か入力すると、その返事が返ってくるものです。
Miraiという名前の人工知能にしてみました。
全体のコードです。
1class Mirai:
2 def __init__(self, name):
3
4 self.name = name
5 self.responder = Responder('Repeat')
6
7 def dialogue(self, input):
8
9 return self.responder.response(input)
10
11 def get_responder_name(self):
12
13 return self.responder.name
14
15 def get_name(self):
16
17 return self.name
18
19class Responder:
20
21 def __init__(self, name):
22
23 self.name = name
24
25 def response(self, input):
26
27 return '{}とはなんですか?'.format(input)
28
29def prompt(obj):
30
31 return obj.get_name() + ':' + obj.get_responder_name() + '> '
32
33print('Miraiとの会話を始めます')
34
35mirai = Mirai('Mirai')
36
37while True:
38 inputs = input(' > ')
39 if not inputs:
40 print('会話を終了します')
41 break
42 else:
43 response = mirai.dialogue(inputs)
44 print(prompt(mirai), response)
解説
本体クラス
1class Mirai:
Mirai本体のクラスを宣言します。
1def __init__(self, name):
2 self.name = name
3 self.responder = Responder('Repeat')
コンストラクタでインスタンス変数name
とresponder
を初期化します。name
: Mirai
オブジェクトの名前。responder
: Responder
オブジェクトを'Repeat'
という名前で初期化します。
1def dialogue(self, input):
2 return self.responder.response(input)
ユーザの入力に応じてresponder
のresponse()
メソッドを呼び出し、応答文字列を取得します。input
: ユーザの発言。
1def get_responder_name(self):
2 return self.responder.name
応答に使用されたResponder
オブジェクトの名前を返します。
1def get_name(self):
2 return self.name
Mirai
オブジェクトの名前を返します。
応答クラス
1class Responder:
Responder
(応答)クラスを宣言します。
1def __init__(self, name):
2 self.name = name
コンストラクタでインスタンス変数name
を初期化します。
name
: Responder
オブジェクトの名前。
1def response(self, input):
2 return '{}とはなんですか?'.format(input)
ユーザの入力に対する応答文字列を生成し返します。
input
: ユーザが入力した文字列。
1def prompt(obj):
2 return obj.get_name() + ':' + obj.get_responder_name() + '> '
Mirai
のプロンプトを作る関数。
obj
: 呼び出し元のMirai
オブジェクト。
以下の形式で文字列を返します。
「’Miraiオブジェクト名:応答オブジェクト名 > ‘」の文字列を返す
実行
1print('Miraiとの会話を始めます')
2mirai = Mirai('Mirai')
3
4while True:
5 inputs = input(' > ')
6 if not inputs:
7 print('会話を終了します')
8 break
9 else:
10 response = mirai.dialogue(inputs)
11 print(prompt(mirai), response)
会話を開始し、ユーザーの入力を待ち受けます。入力がない場合は会話を終了し、それ以外の場合はMirai
オブジェクトのdialogue
(応答文字列を取得する)メソッドを呼び出して応答を表示します。
まとめ
また、おうむ返しBotを作ってみました!しかし、Botとは自然な会話をしたいので、次はパターン辞書というものを作ってみます。パターン辞書とは、特定の発言に対して決まった応答を返す辞書のことです。例えば、「ありがとう」と言ったら「どういたしまして」と返すように設定します。
最後まで読んでいただきありがとうございました!
