Dart相似度匹配聊天机器人多意图响应异常问题求助
解决Dart聊天机器人多类别匹配问题
当前你的问题核心是原有逻辑仅取相似度最高的单一类别返回响应,要实现多类别匹配,需对每个短语类别单独做相似度评估,判断是否达到匹配阈值,再收集所有符合条件的响应。以下是具体实现方案:
1. 重构类别结构
先把每个短语类别(问候、道别等)封装成包含短语列表和对应响应的实体,方便统一处理:
class ChatCategory { final String name; final List<String> phrases; final String response; ChatCategory({ required this.name, required this.phrases, required this.response, }); }
2. 实现多类别匹配逻辑
不再只筛选单一最高相似度类别,而是遍历所有类别,计算用户输入与该类别下所有短语的最高相似度,若超过预设阈值则标记为匹配:
import 'package:string_similarity/string_similarity.dart'; // 定义相似度阈值(可根据需求调整,比如0.5) const double similarityThreshold = 0.5; List<String> getMultiCategoryResponses(String userInput, List<ChatCategory> categories) { List<String> matchedResponses = []; for (var category in categories) { // 计算用户输入与当前类别所有短语的最高相似度 double maxSimilarity = 0.0; for (var phrase in category.phrases) { // 统一转小写避免大小写干扰相似度计算 double similarity = userInput.toLowerCase().similarityTo(phrase.toLowerCase()); if (similarity > maxSimilarity) { maxSimilarity = similarity; } } // 若相似度超过阈值则加入响应列表 if (maxSimilarity >= similarityThreshold) { matchedResponses.add(category.response); } } return matchedResponses; }
3. 测试示例
初始化类别数据并测试多输入场景:
void main() { // 初始化各类别数据 List<ChatCategory> categories = [ ChatCategory( name: '问候', phrases: ['hello', 'hi', 'hey'], response: '你好!很高兴见到你😊', ), ChatCategory( name: '道别', phrases: ['good bye', 'bye', 'see you'], response: '再见!期待下次见面👋', ), ]; // 测试输入"Hello good bye" String userInput = "Hello good bye"; List<String> responses = getMultiCategoryResponses(userInput, categories); // 输出所有匹配的响应,也可通过join拼接成单句 for (var response in responses) { print(response); } }
关键说明
- 阈值调整:
similarityThreshold需根据实际场景调试,严格匹配可设为0.6,宽松匹配可设为0.4。 - 响应组合:若需要将多个响应合并成一句话,可使用
responses.join(' ')完成拼接。 - 性能优化:如果类别短语数量较多,可提前将所有短语转成小写缓存,避免重复转换。
内容的提问来源于stack exchange,提问作者Mustafa Abu Shraikh
相关产品推荐
相关产品推荐

