如何遍历JSON文件嵌套字典并集成Sentence Transformers实现语义匹配校验
无硬编码嵌套语义匹配实现
前置说明
先将匹配得分计算逻辑抽为公共函数,避免重复编码,提前计算目标文本的向量缓存,减少重复计算提升性能。
完整实现代码
from sentence_transformers import SentenceTransformer, util import torch import json # 1. 初始化模型、加载配置、预计算目标文本向量(只需执行1次) # 可替换为你实际使用的语义匹配模型 embedder = SentenceTransformer('all-MiniLM-L6-v2') # 加载你的JSON配置文件 with open("你的配置文件路径.json", "r", encoding="utf-8") as f: config = json.load(f) global_threshold = config["Threshold"] # 替换为你实际要匹配的目标文本列表 corpus = ["目标文本1", "目标文本2"] corpus_embeddings = embedder.encode(corpus, convert_to_tensor=True) top_k = min(5, len(corpus)) # 2. 公共匹配函数:输入查询词列表,返回该组查询词的最高匹配得分 def get_max_match_score(queries): max_score = 0.0 for query in queries: query_embedding = embedder.encode(query, convert_to_tensor=True) cos_scores = util.pytorch_cos_sim(query_embedding, corpus_embeddings)[0] # 直接取当前查询词的最高匹配得分,无需遍历top5 current_max = torch.max(cos_scores).item() if current_max > max_score: max_score = current_max return max_score # 3. 主遍历逻辑:完全无硬编码服务/产品名称 result = {} for service in config["Services"]: service_name = service["Name"] service_queries = service["Query"] # 服务级匹配校验 service_max_score = get_max_match_score(service_queries) if service_max_score < global_threshold: # 低于全局阈值直接跳过该服务下所有产品 continue # 服务级匹配通过,遍历该服务下全部产品 result[service_name] = {} for product in service["Products"]: product_name = product["Name"] product_queries = product["Query"] product_threshold = product["Threshold"] # 产品级匹配校验 product_max_score = get_max_match_score(product_queries) if product_max_score >= product_threshold: result[service_name][product_name] = "positive" else: result[service_name][product_name] = "negative" # 输出最终匹配结果 print(result)
逻辑说明
- 所有服务、产品信息都通过遍历JSON配置的
Services、Products数组直接获取,完全不需要硬编码Service1、product1这类名称,后续新增/修改配置无需调整业务代码 - 公共函数封装了匹配逻辑,直接返回一组查询词的最高匹配得分,符合你“取最高值和阈值比对”的需求
- 服务级得分低于全局阈值时直接跳过该服务下全部产品的匹配,完全符合你要求的业务流程
内容的提问来源于stack exchange,提问作者Almosino
相关产品推荐
相关产品推荐

