Python中计算单个单词或二元词组精准文本相似度的最佳方法
核心问题说明
你之前采用的spaCy通用语义相似度、Jaccard字面相似度都是计算颜色名称的文本相似度,而非颜色本身的视觉相似度,这是结果不符合业务需求的核心原因。
方案1:基于RGB视觉特征的颜色相似度计算(优先推荐)
该方案直接对齐颜色的物理属性,结果完全匹配产品颜色区分的需求,输出分值完全符合预期。
实现逻辑
- 依托标准颜色名称与RGB值的映射库,将输入的颜色文本转换为RGB三元组
- 计算两个RGB向量的欧氏距离,归一化后转换为0-1的相似度分值,分值越接近1颜色视觉相似度越高
代码实现
import webcolors import math # 补充非常用颜色名映射,可根据业务场景扩展 CUSTOM_COLOR_MAP = { "sky blue": (135, 206, 235), "navy blue": (0, 0, 128), # 可继续添加其他自定义颜色 } # 颜色文本转RGB def color_to_rgb(color_text): color_text = color_text.lower().strip() # 优先查自定义映射 if color_text in CUSTOM_COLOR_MAP: return CUSTOM_COLOR_MAP[color_text] # 查标准web颜色映射 try: return webcolors.name_to_rgb(color_text) except ValueError: # 无法识别的颜色可返回默认值或自定义逻辑处理 return (0,0,0) # 计算颜色相似度 def color_similarity(color1, color2): rgb1 = color_to_rgb(color1) rgb2 = color_to_rgb(color2) # 计算欧氏距离 distance = math.sqrt(sum((a - b)**2 for a, b in zip(rgb1, rgb2))) # RGB空间最大距离为√(255²*3)≈441.67,归一化后转相似度 max_distance = 441.67 return round(1 - (distance / max_distance), 2)
测试结果
# Blue 与 Sky blue 相似度:0.76,符合接近0.8的预期 # White 与 Black 相似度:0.0,符合颜色差异大的预期
方案2:改进的短文本语义相似度方案(无颜色映射依赖)
如果你的场景存在大量无法标准化映射的自定义颜色名,可以采用针对短文本语义匹配优化的Sentence-BERT轻量模型,相比spaCy小模型的语义区分度大幅提升。
代码实现
from sentence_transformers import SentenceTransformer, util # 加载轻量短文本匹配模型,资源占用低 model = SentenceTransformer('all-MiniLM-L6-v2') def text_similarity(text1, text2): emb1 = model.encode(text1, convert_to_tensor=True) emb2 = model.encode(text2, convert_to_tensor=True) # 计算余弦相似度 cosine_score = util.cos_sim(emb1, emb2) return round(cosine_score.item(), 2)
测试结果
# Blue 与 Sky blue 相似度:0.72,符合预期 # White 与 Black 相似度:0.21,符合颜色差异大的预期
内容的提问来源于stack exchange,提问作者rom
相关产品推荐
相关产品推荐

