Spacy大语言模型计算M&M相似度返回0.0的问题及解决方案咨询
问题原因
Spacy的en_core_web_lg这类预训练模型的词向量是基于公开通用语料训练的,像"M&M"这种无空格连写的品牌名在训练语料里出现频率极低,模型没为它生成有效的语义向量——说白了就是模型“认不出”这个连写的词,只能把它当成无意义的未知token,没有可用向量参与相似度计算,所以结果一直是0.0。而改成"M & M"后,空格把它拆成了三个有明确语义的token(M、&、M),每个都有训练好的向量,自然能正常算出相似度。
解决方案(无需手动加空格)
自定义分词规则+绑定向量
用Spacy的分词器特殊规则,把"M&M"识别为单个token,并给它绑定和"M & M"一致的向量:import spacy from spacy.symbols import ORTH nlp = spacy.load("en_core_web_lg") # 添加特殊分词规则,让"M&M"被识别为单个token nlp.tokenizer.add_special_case("M&M", [{ORTH: "M&M"}]) # 给这个token赋予和"M & M"相同的向量 m_and_m_vector = nlp("M & M").vector nlp.vocab.set_vector("M&M", m_and_m_vector) # 测试 query = nlp("M&M") query2 = nlp("M&M chocolate pouch") print("相似度得分:", query2.similarity(query))文本预处理自动补空格
写个简单的正则替换,在&两侧自动加空格,不用手动修改输入文本:import spacy import re nlp = spacy.load("en_core_web_lg") def preprocess(text): # 匹配X&Y的模式,替换成X & Y(X和Y为非空格字符) return re.sub(r"(\S)&(\S)", r"\1 & \2", text) # 测试 query = nlp(preprocess("M&M")) query2 = nlp(preprocess("M&M chocolate pouch")) print("相似度得分:", query2.similarity(query))直接给词汇表添加向量
如果只需要处理"M&M"这一种情况,直接给词汇表中的"M&M"赋值向量更简单:import spacy nlp = spacy.load("en_core_web_lg") # 给"M&M"设置和"M & M"相同的向量 nlp.vocab.set_vector("M&M", nlp("M & M").vector) # 测试 query = nlp("M&M") query2 = nlp("M&M chocolate pouch") print("相似度得分:", query2.similarity(query))
内容的提问来源于stack exchange,提问作者Eamonn Kenny
相关产品推荐
相关产品推荐

