You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 12:55:17