You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 02:27:01