import re
import datetime
class Chatbot:
def __init__(self):
self.context = {}
self.history = []
self.user_name = None
self.current_intent = None # 現在の意図を保持
self.emotion_state = "neutral" # ユーザーの感情状態
self.long_term_memory = {} # ユーザーの好みなどを記憶する
# コンテキストと履歴を更新
def update_context(self, key, value):
self.context[key] = value
def add_to_history(self, user_input, bot_response):
self.history.append({"user": user_input, "bot": bot_response})
# 感情を分析
def analyze_emotion(self, user_input):
if re.search(r"疲れた|悲しい", user_input):
return "sad"
elif re.search(r"嬉しい|楽しい", user_input):
return "happy"
else:
return "neutral"
# 意図の認識
def intent_recognition(self, user_input):
if re.search(r"こんにちは|おはよう", user_input):
return "greeting"
elif re.search(r"名前は|あなたは誰", user_input):
return "identity"
elif re.search(r"ありがとう", user_input):
return "thanks"
elif re.search(r"天気|天候", user_input):
return "weather"
elif re.search(r"日付|時間", user_input):
return "time"
elif re.search(r"さようなら|バイバイ", user_input):
return "farewell"
elif re.search(r"趣味", user_input):
return "hobby"
elif re.search(r"タスク|予定", user_input):
return "task_management"
else:
return "unknown"
# 意図に応じた応答生成
def handle_intent(self, intent, user_input):
if intent == "greeting":
return self.greet_user()
elif intent == "identity":
return self.ask_for_name()
elif intent == "thanks":
return "どういたしまして!"
elif intent == "weather":
return self.get_weather()
elif intent == "time":
return self.get_time()
elif intent == "farewell":
return "さようなら!またお会いしましょう。"
elif intent == "hobby":
return self.ask_hobby()
elif intent == "task_management":
return self.manage_task()
else:
return "すみません、よくわかりません。もう一度お願いします。"
# 挨拶応答
def greet_user(self):
if self.user_name:
return f"こんにちは、{self.user_name}さん!今日はどうされましたか?"
else:
return "こんにちは!お名前を教えていただけますか?"
# 名前を聞く
def ask_for_name(self):
if not self.user_name:
self.current_intent = "ask_name"
return "私はあなたの名前をまだ聞いていませんね。教えていただけますか?"
else:
return f"あなたのお名前は{self.user_name}ですね!"
# 趣味について聞く
def ask_hobby(self):
if "hobby" not in self.long_term_memory:
self.current_intent = "ask_hobby"
return "趣味は何ですか?"
else:
hobby = self.long_term_memory['hobby']
return f"以前おっしゃった趣味は{hobby}ですね!"
# タスク管理(例: カレンダーに予定を追加)
def manage_task(self):
self.current_intent = "task_management"
return "新しい予定を追加したいのですか?詳細を教えてください。"
# 天気情報の取得(仮想)
def get_weather(self):
return "今日は晴れで、気温は22度です。"
# 日付・時間を取得
def get_time(self):
now = datetime.datetime.now()
return f"今は{now.strftime('%Y年%m月%d日 %H:%M:%S')}です。"
# 応答を感情に基づいて調整
def adjust_response_by_emotion(self, response):
if self.emotion_state == "sad":
return f"元気出してくださいね。{response}"
elif self.emotion_state == "happy":
return f"素晴らしいですね!{response}"
else:
return response
# 名前を更新
def update_name(self, user_input):
self.user_name = user_input
self.long_term_memory['name'] = user_input
# 趣味を保存
def update_hobby(self, user_input):
self.long_term_memory['hobby'] = user_input
# 応答のメインロジック
def chatbot_response(self, user_input):
if self.current_intent == "ask_name":
self.update_name(user_input)
return f"お名前は{self.user_name}さんですね!よろしくお願いします!"
elif self.current_intent == "ask_hobby":
self.update_hobby(user_input)
return f"{self.user_name}さんの趣味は{user_input}ですね!"
# 感情分析
self.emotion_state = self.analyze_emotion(user_input)
# 意図解析
intent = self.intent_recognition(user_input)
# 応答生成
response = self.handle_intent(intent, user_input)
# コンテキストと履歴の更新
self.add_to_history(user_input, response)
return self.adjust_response_by_emotion(response)
# チャットボットを実行
def run_chatbot():
chatbot = Chatbot()
# 初回挨拶
print("ボット: こんにちは!お名前を教えてください。")
while True:
user_input = input("あなた: ")
if user_input == "終了":
print("チャットを終了します。")
break
bot_response = chatbot.chatbot_response(user_input)
print("ボット: " + bot_response)
# チャットボットを実行
run_chatbot()