如何用Python字典实现多关键词用户输入识别?
完善现有质数匹配方案
你的代码目前只判断整个输入是否是单个关键词,要处理长输入,得先把输入拆成单个单词,再逐个匹配关键词,最后把匹配到的值相乘。修改后的代码如下:
keywords = {"open": 2, "close": 3, "door" : 5, "don't": -1} # 把输入转小写并拆成单词列表 input_words = input("/ ").lower().split() product = 1 found_keyword = False # 遍历每个单词,匹配关键词并计算乘积 for word in input_words: if word in keywords: product *= keywords[word] found_keyword = True # 有匹配才输出乘积,否则提示无匹配 if found_keyword: print(product) else: print("没找到任何关键词")
测试效果:
- 输入
please open the door for me,会提取open和door,输出10 - 输入
don't close door,提取don't、close、door,输出-15
不过这个方案有几个局限:
- 没法处理多词关键词(比如
turn on这种短语) - 关键词多了之后,乘积会变得极大,虽然Python支持大整数,但可读性很差
- 新增关键词时得找新的质数,比较麻烦
更优的实现方案
直接用集合存储匹配到的关键词,再根据关键词组合触发对应逻辑,比质数乘积更直观,也更容易维护。
基础版:直接判断关键词组合
# 定义所有关键词 all_keywords = {"open", "close", "door", "don't"} input_words = input("/ ").lower().split() # 收集匹配到的关键词 matched_keywords = set() for word in input_words: if word in all_keywords: matched_keywords.add(word) # 根据匹配的组合执行逻辑 if matched_keywords == {"open", "door"}: print("执行开门操作") elif matched_keywords == {"close", "door"}: print("执行关门操作") elif "don't" in matched_keywords and "open" in matched_keywords and "door" in matched_keywords: print("拒绝执行开门操作") else: print("无对应操作")
进阶版:用字典映射组合到动作
如果关键词组合多了,用if-elif会太繁琐,可以直接把组合和对应的动作存在字典里:
# 定义关键词组合和对应动作(用frozenset是因为集合不能当字典键) combo_actions = { frozenset({"open", "door"}): "执行开门", frozenset({"close", "door"}): "执行关门", frozenset({"don't", "open", "door"}): "拒绝开门" } # 提取所有关键词,方便快速匹配 all_keywords = {kw for combo in combo_actions.keys() for kw in combo} input_words = input("/ ").lower().split() matched_keywords = set() for word in input_words: if word in all_keywords: matched_keywords.add(word) # 查找对应的动作 for combo, action in combo_actions.items(): # 这里用issubset表示只要包含组合里的关键词就触发,也可以用==要求完全匹配 if combo.issubset(matched_keywords): print(action) break else: print("未匹配到有效操作")
支持多词关键词
如果需要处理turn on这种多词关键词,可以检查连续的单词组合:
all_keywords = {"open", "close", "door", "don't", "turn on"} input_words = input("/ ").lower().split() matched_keywords = set() # 先匹配单个单词 for word in input_words: if word in all_keywords: matched_keywords.add(word) # 再匹配双词组合 for i in range(len(input_words) - 1): two_word_phrase = " ".join(input_words[i:i+2]) if two_word_phrase in all_keywords: matched_keywords.add(two_word_phrase) # 移除单个单词的匹配,避免重复计数(可选) if input_words[i] in matched_keywords: matched_keywords.remove(input_words[i]) if input_words[i+1] in matched_keywords: matched_keywords.remove(input_words[i+1]) print("匹配到的关键词:", matched_keywords)
内容的提问来源于stack exchange,提问作者user22309639
相关产品推荐
相关产品推荐

