You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
85 lines
2.7 KiB
Python
85 lines
2.7 KiB
Python
|
6 months ago
|
import re
|
||
|
|
import random
|
||
|
|
|
||
|
|
# 定义规则库:模式(正则表达式) -> 响应模板列表
|
||
|
|
rules = {
|
||
|
|
r'I need (.*)': [
|
||
|
|
"Why do you need {0}?",
|
||
|
|
"Would it really help you to get {0}?",
|
||
|
|
"Are you sure you need {0}?"
|
||
|
|
],
|
||
|
|
r'Why don\'t you (.*)\?': [
|
||
|
|
"Do you really think I don't {0}?",
|
||
|
|
"Perhaps eventually I will {0}.",
|
||
|
|
"Do you really want me to {0}?"
|
||
|
|
],
|
||
|
|
r'Why can\'t I (.*)\?': [
|
||
|
|
"Do you think you should be able to {0}?",
|
||
|
|
"If you could {0}, what would you do?",
|
||
|
|
"I don't know -- why can't you {0}?"
|
||
|
|
],
|
||
|
|
r'I am (.*)': [
|
||
|
|
"Did you come to me because you are {0}?",
|
||
|
|
"How long have you been {0}?",
|
||
|
|
"How do you feel about being {0}?"
|
||
|
|
],
|
||
|
|
r'.* mother .*': [
|
||
|
|
"Tell me more about your mother.",
|
||
|
|
"What was your relationship with your mother like?",
|
||
|
|
"How do you feel about your mother?"
|
||
|
|
],
|
||
|
|
r'.* father .*': [
|
||
|
|
"Tell me more about your father.",
|
||
|
|
"How did your father make you feel?",
|
||
|
|
"What has your father taught you?"
|
||
|
|
],
|
||
|
|
r'.*': [
|
||
|
|
"Please tell me more.",
|
||
|
|
"Let's change focus a bit... Tell me about your family.",
|
||
|
|
"Can you elaborate on that?"
|
||
|
|
]
|
||
|
|
}
|
||
|
|
|
||
|
|
# 定义代词转换规则
|
||
|
|
pronoun_swap = {
|
||
|
|
"i": "you", "you": "i", "me": "you", "my": "your",
|
||
|
|
"am": "are", "are": "am", "was": "were", "i'd": "you would",
|
||
|
|
"i've": "you have", "i'll": "you will", "yours": "mine",
|
||
|
|
"mine": "yours"
|
||
|
|
}
|
||
|
|
|
||
|
|
def swap_pronouns(phrase):
|
||
|
|
"""
|
||
|
|
对输入短语中的代词进行第一/第二人称转换
|
||
|
|
"""
|
||
|
|
words = phrase.lower().split()
|
||
|
|
swapped_words = [pronoun_swap.get(word, word) for word in words]
|
||
|
|
return " ".join(swapped_words)
|
||
|
|
|
||
|
|
def respond(user_input):
|
||
|
|
"""
|
||
|
|
根据规则库生成响应
|
||
|
|
"""
|
||
|
|
for pattern, responses in rules.items():
|
||
|
|
match = re.search(pattern, user_input, re.IGNORECASE)
|
||
|
|
if match:
|
||
|
|
# 捕获匹配到的部分
|
||
|
|
captured_group = match.group(1) if match.groups() else ''
|
||
|
|
# 进行代词转换
|
||
|
|
swapped_group = swap_pronouns(captured_group)
|
||
|
|
# 从模板中随机选择一个并格式化
|
||
|
|
response = random.choice(responses).format(swapped_group)
|
||
|
|
return response
|
||
|
|
# 如果没有匹配任何特定规则,使用最后的通配符规则
|
||
|
|
return random.choice(rules[r'.*'])
|
||
|
|
|
||
|
|
# 主聊天循环
|
||
|
|
if __name__ == '__main__':
|
||
|
|
print("Therapist: Hello! How can I help you today?")
|
||
|
|
while True:
|
||
|
|
user_input = input("You: ")
|
||
|
|
if user_input.lower() in ["quit", "exit", "bye"]:
|
||
|
|
print("Therapist: Goodbye. It was nice talking to you.")
|
||
|
|
break
|
||
|
|
response = respond(user_input)
|
||
|
|
print(f"Therapist: {response}")
|