spaCy en_core_web_trf模型计算文本相似度返回0.0是何原因
问题原因
返回值恒为0.0是*en_core_web_trf模型的默认配置逻辑*导致的,和依赖安装、版本、运行设备无关:
- spaCy的
.similarity()方法默认通过读取两个文本对象的.vector属性计算余弦相似度,对象的.vector为全零张量时,相似度计算结果固定为0.0。 en_core_web_trf是基于Transformer结构的预训练模型,默认pipeline不会把Transformer输出的上下文嵌入赋值给.vector属性,该属性在默认配置下就是全零张量,因此无论输入什么文本对,计算出的相似度都是0.0。
解决方法
- 快速验证场景可替换为自带静态词向量的模型:直接更换加载的模型为
en_core_web_md或en_core_web_lg即可,这两类模型会自动为.vector属性填充有效向量,无需修改后续相似度计算代码,加载代码修改为nlp=spacy.load('en_core_web_md')即可得到合理的相似度结果。 - 需使用Transformer模型的场景,可手动提取Transformer层输出的嵌入做相似度计算,参考代码如下:
import spacy import torch nlp = spacy.load('en_core_web_trf') def calc_similarity(text_a: str, text_b: str) -> float: doc_a = nlp(text_a) doc_b = nlp(text_b) # 提取Transformer输出的句向量,此处取CLS位输出作为句表征 vec_a = doc_a._.trf_data.tensors[0][0, 0, :] vec_b = doc_b._.trf_data.tensors[0][0, 0, :] return torch.cosine_similarity(vec_a.unsqueeze(0), vec_b.unsqueeze(0)).item() score_1 = calc_similarity('hello', 'hi') score_2 = calc_similarity('There is a coat on the chair.', 'Something is on my seat.')
内容的提问来源于stack exchange,提问作者Astro_Scientist97
相关产品推荐
相关产品推荐

