AI・機械学習

人工知能を作りたい②

palm

こんにちは!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 メソッド

このメソッドは、ユーザーからの入力を受け取り、それを PatternResponderresponse メソッドに渡して応答を取得します。

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)
画像に alt 属性が指定されていません。ファイル名: -2024-05-25-7.09.00.png

まとめ

このコードを使えば、パターン辞書に基づいた応答を行うチャットボット「Mirai」を作成することができます。今回は基本的な応答パターンを使いましたが、パターン辞書を充実させることで、より自然で多様な会話が可能になります。次回はさらに高度な機能を追加して、Miraiを進化させていきましょう!

最後まで読んでいただき、ありがとうございました!

合わせて読みたい
人工知能を作りたい③
人工知能を作りたい③
スポンサーリンク
ABOUT ME
Palm
Palm
東京通信大学3年生
私はpalm(ぱるむ)です。お花や自然が大好きです。専門学校でWeb開発を学び、東京通信大学に編入しました。得意分野は、ウェブ開発(フロントエンド、バックエンド)や機械学習(自然言語、データ分析)です。趣味で色々デモ開発をしています。
記事URLをコピーしました