人工知能を作りたい②
こんにちは!Palmです!
今回は、以前作成したおうむ返しChat Botに「Responder」機能を追加して、さらに進化させたChat Botを紹介します。前回は自然な会話には程遠かったですが、今回はパターン辞書を使って、より自然な応答ができるようにしました。
コードの解説
以下が今回紹介するコードです。まずは全体像を見てください。
1import re
2import random
3
4class Mirai:
5 def __init__(self, name, pattern_file):
6 self.name = name
7 self.responder = PatternResponder(pattern_file)
8
9 def dialogue(self, input_text):
10 return self.responder.response(input_text)
11
12 def get_responder_name(self):
13 return "PatternResponder"
14
15 def get_name(self):
16 return self.name
17
18class PatternResponder:
19 def __init__(self, pattern_file):
20 self.patterns = self.load_patterns(pattern_file)
21
22 def load_patterns(self, pattern_file):
23 patterns = []
24 with open(pattern_file, 'r', encoding='utf-8') as f:
25 for line in f:
26 line = line.strip()
27 pattern, responses = line.split('\t', 1)
28 response_list = responses.split('|')
29 patterns.append((re.compile(pattern), response_list))
30 return patterns
31
32 def response(self, input_text):
33 for pattern, responses in self.patterns:
34 if pattern.search(input_text):
35 return random.choice(responses)
36 return "ごめん、よくわからない。"
37
38def prompt(obj):
39 return obj.get_name() + ':' + obj.get_responder_name() + '> '
40
41print("パターン辞書を使った Miraiとの会話を始めます。")
42mirai = Mirai('Mirai', 'dics/pattern.txt')
43
44while True:
45 inputs = input(' > ')
46 if not inputs:
47 print('会話を終了します')
48 break
49 else:
50 response = mirai.dialogue(inputs)
51 print(prompt(mirai), response)
パターン辞書(dics/pattern.txt)
このパターン辞書は、チャットボットがユーザーの入力に対して適切な応答を返すためのテンプレートです。各行は特定の入力パターンと、それに対応する複数の応答を含んでいます。パターンには正規表現を使用しており、柔軟なマッチングが可能です。各パターンに対して複数の応答が指定されているため、ランダムに選ばれた応答が返されることで、会話が単調になりにくくなっています。
1#dics/pattern.txt
2
3おはよ[う|ー] おはよう!今日も元気?
4ありがと[う|ー] どういたしまして!|こちらこそありがとう!
5すごい ほんとにすごいね!|びっくりしたよ!
6疲れた ゆっくり休んでね。|無理しないでね。
7おやすみ おやすみなさい、良い夢を!
8こんにちは こんにちは!今日はどんな日?
9寂しい いつでも話を聞くよ。|大丈夫、ここにいるからね。
10お疲れ様 お疲れ様!今日も頑張ったね。
11何してるの いろいろやってるよ。|君は何してるの?
12さようなら さようなら、またね!|元気でね!
13楽しみ それは良かったね!|楽しみだね!
14どこ住み? 東京の西側だよ。|秘密だよ。
15好きな食べ物は? ラーメンが好きかな。|お寿司もいいね。
16[暇|ひま] 何か楽しいことを見つけよう!|映画でも見る?
17わかった 理解してくれて嬉しいよ。|ありがとう!
18今日の天気は? 晴れだよ。|雨が降ってるみたいだよ。
19どんな音楽が好き? ロックが好きだよ。|クラシックもいいね。
20君の名前は? 私の名前はMiraiだよ。|Miraiって呼んでね。
21元気? 元気だよ!君はどう?|絶好調!
22どこ行ったの? ちょっと散歩してたよ。|買い物に行ってた。
23何歳? 内緒だけど、かなり若いよ。|年齢は秘密!
以下はその例です:
「おはよう」や「おはよー」という入力に対して、「おはよう!今日も元気?」と応答します。
「ありがと」や「ありがとう」という入力には、「どういたしまして!」や「こちらこそありがとう!」と応答します。
「すごい」という入力には、「ほんとにすごいね!」や「びっくりしたよ!」と応答します。
「疲れた」という入力には、「ゆっくり休んでね。」や「無理しないでね。」と応答します。
このように、パターンと応答を設定することで、チャットボットはさまざまなユーザーの入力に対して適切な応答を返すことができます。これにより、会話がより自然で楽しいものになります。
コードの詳細解説
このコードは、ユーザーの入力に対して、パターン辞書を使って応答を返すChat Bot「Mirai」を作成します。以下に主要な部分を解説します。
Mirai
クラス
Mirai
クラスは、チャットボットの中心です。ここでは、名前を設定し、応答を担当する PatternResponder
のインスタンスを作成します。
1class Mirai:
__init__
メソッド
このメソッドは、Mirai
クラスのインスタンスが作成されるときに呼び出されます。名前を設定し、PatternResponder
を読み込みます。
1def __init__(self, name, pattern_file):
2 self.name = name
3 self.responder = PatternResponder(pattern_file)
dialogue
メソッド
このメソッドは、ユーザーからの入力を受け取り、それを PatternResponder
の response
メソッドに渡して応答を取得します。
1def dialogue(self, input_text):
2 return self.responder.response(input_text)
get_responder_name
メソッド
このメソッドは、常に “PatternResponder” を返します。応答者の名前を取得するために使用されます。
1def get_responder_name(self):
2 return "PatternResponder"
get_name
メソッド
このメソッドは、チャットボットの名前を返します。例えば、”Mirai” です。
1def get_name(self):
2 return self.name
PatternResponder
クラス
PatternResponder
クラスは、パターン辞書を使ってユーザーの入力に応答する役割を担います。
1class PatternResponder:
__init__
メソッド
初期化メソッドで、パターン辞書を読み込みます。
1def __init__(self, pattern_file):
2 self.patterns = self.load_patterns(pattern_file)
load_patterns
メソッド
このメソッドは、パターン辞書ファイルを開いて、各行を読み込み、パターンと応答を分けてリストに格納します。
1def load_patterns(self, pattern_file):
2 patterns = []
3 with open(pattern_file, 'r', encoding='utf-8') as f:
4 for line in f:
5 line = line.strip()
6 pattern, responses = line.split('\t', 1)
7 response_list = responses.split('|')
8 patterns.append((re.compile(pattern), response_list))
9 return patterns
response
メソッド
このメソッドは、ユーザーの入力に対して、パターン辞書の中から一致するパターンを探し、対応する応答をランダムに選んで返します。一致するパターンがない場合は、デフォルト(「ごめん、よくわからない。」)の応答を返します。
1def response(self, input_text):
2 for pattern, responses in self.patterns:
3 if pattern.search(input_text):
4 return random.choice(responses)
5 return "ごめん、よくわからない。"
prompt
関数
prompt
関数は、Mirai
インスタンスから名前と応答者の名前を取得して、プロンプト文字列を生成します。
1def prompt(obj):
2 return obj.get_name() + ':' + obj.get_responder_name() + '> '
このような文字列で返ってきます。
1Mirai:PatternResponder>
メインの処理(実行)
この部分では、チャットボットとの対話が開始されます。ユーザーの入力を受け取り、それに応じた応答を返します。ユーザーが入力を停止すると、会話が終了します。
1print("パターン辞書を使った Miraiとの会話を始めます。")
2mirai = Mirai('Mirai', 'dics/pattern.txt')
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」を作成することができます。今回は基本的な応答パターンを使いましたが、パターン辞書を充実させることで、より自然で多様な会話が可能になります。次回はさらに高度な機能を追加して、Miraiを進化させていきましょう!
最後まで読んでいただき、ありがとうございました!