Python开发的JSON驱动聊天机器人无法区分hi与hire如何解决?
问题原因
你当前代码使用的是子串包含匹配逻辑:if input in nutzereingabe,只要预设的关键词是用户输入内容的子字符串就会触发响应,因此hi作为hire的子串时也会匹配成功,出现误触发。另外你原代码中循环变量用了data,和外层存储JSON数据的data变量重名,会导致变量覆盖,后续如果要复用外层JSON数据会出问题。
修复方案
根据实际需求可以选择两种匹配逻辑:
方案1:完全匹配用户输入
仅当用户输入的内容和预设的关键词完全一致时才触发响应,适合单关键词触发的场景。
修改后的代码如下:
import json import random # 用with上下文管理器打开文件,执行完自动关闭,更安全 with open('/home/anilo/Dokumente/Anilo/Projekte/Chatbot/chatdata.json', encoding='utf-8') as f: data = json.load(f) nutzereingabe = input().strip().lower() matched = False # 循环变量改为item,避免覆盖外层的data变量 for item in data["data"]: for keyword in item["input"]: # 改为完全相等判断 if keyword == nutzereingabe: print(random.choice(item["antwort"])) matched = True break if matched: break
方案2:匹配独立单词
支持用户输入的句子中包含独立的关键词时触发(比如用户输入hi how are you也能触发hi的响应,但hire不会触发),需要先把用户输入拆分为独立单词再判断。
修改后的代码如下:
import json import random import re with open('/home/anilo/Dokumente/Anilo/Projekte/Chatbot/chatdata.json', encoding='utf-8') as f: data = json.load(f) nutzereingabe = input().lower() # 提取用户输入中的所有独立单词,自动忽略标点、空格等符号 input_words = re.findall(r'\b\w+\b', nutzereingabe) matched = False for item in data["data"]: for keyword in item["input"]: if keyword in input_words: print(random.choice(item["antwort"])) matched = True break if matched: break
内容的提问来源于stack exchange,提问作者user14857618
相关产品推荐
相关产品推荐

