如何让JavaScript聊天机器人识别语句中的关键词而非单个单词?
问题
我正在开发一款新的聊天机器人,目前该机器人仅能匹配单个单词,匹配成功时会展示对应文本文件的内容。例如输入“address”,会显示地址文本文件;但如果输入“what's your address?”这类语句,机器人会返回“I don't understand”。
请问是否有办法实现扫描用户的回复内容,提取匹配的关键词并触发对应响应?
当前示例代码:
_processSay(message) { const address = this._address; const events = this._events; let content; if (message == 'address') { content = fs.readFileSync(address).toString(); } else if (message == 'events') { content = fs.readFileSync(events).toString(); } else { content = "sorry, I did not understand you"; } return content; }
我完全是JavaScript新手,正在尝试解决这个问题。我一直在寻找类似contains或includes的匹配语句,而非使用==这类精确相等判断,但目前还没找到可行方法。
解决方案
你要找的就是JavaScript原生的includes()方法,它可以直接检查字符串是否包含指定子串,正好解决你的需求。下面是具体修改方案:
1. 基础修改:用includes()替代精确匹配
把原来的message == 'address'改成message.includes('address'),这样只要用户输入内容里包含目标关键词,就能触发对应响应。
2. 处理大小写问题
如果用户输入"Address"或者"ADDRESS",includes()会匹配失败,所以可以先把用户消息统一转成小写再检查:
const lowerCaseMessage = message.toLowerCase();
3. 优化代码结构(推荐)
如果后续要添加更多关键词,一堆else if会显得杂乱,你可以用对象映射关键词和对应文件路径,扩展起来更方便:
修改后的完整代码:
_processSay(message) { // 定义关键词与文件路径的映射关系 const keywordMap = { 'address': this._address, 'events': this._events }; let content; // 统一转小写,避免大小写匹配问题 const lowerCaseMessage = message.toLowerCase(); // 遍历所有关键词,检查是否存在于用户输入中 for (const keyword in keywordMap) { if (lowerCaseMessage.includes(keyword)) { content = fs.readFileSync(keywordMap[keyword]).toString(); // 找到匹配后跳出循环,避免多关键词冲突 break; } } // 未匹配到任何关键词时返回默认提示 if (!content) { content = "sorry, I did not understand you"; } return content; }
代码说明
toLowerCase():将用户输入统一转为小写,确保无论输入大小写关键词都能匹配keywordMap:集中管理关键词和对应文件路径,后续新增关键词只需在对象中添加一行即可for...in循环:遍历所有关键词,找到第一个匹配项就返回对应内容,避免重复匹配
这样修改后,用户输入"what's your address?"或者"Show me the events list"这类语句,机器人都能正确触发对应的响应了。
内容的提问来源于stack exchange,提问作者Richard Foleher
相关产品推荐
相关产品推荐

