深入理解spaCy中的词向量与相似度计算
spaCy 项目地址: https://gitcode.com/gh_mirrors/spa/spaCy
词向量基础概念
在自然语言处理(NLP)中,词向量(Word Vectors)或称词嵌入(Word Embeddings)是词语的多维语义表示。spaCy使用这些向量来确定词语之间的相似度。词向量通常通过算法生成,每个词被表示为高维空间中的一个点,语义相近的词在这个空间中位置也相近。
一个典型的词向量看起来像这样(以"banana"为例):
array([2.02280000e-01, -7.66180009e-02, 3.70319992e-01,
3.28450017e-02, -4.19569999e-01, 7.20689967e-02,
... # 通常有数百个维度
-1.19659996e+00, -4.71559986e-02, 5.31750023e-01], dtype=float32)
spaCy中的向量使用注意事项
重要提示:spaCy的小型模型包(名称以sm
结尾的)为了保持轻量和快速,不包含词向量,只包含上下文相关的张量。这意味着虽然你仍然可以使用similarity()
方法来比较文档、片段和词元,但效果会打折扣,且单个词元不会有向量分配。
要使用真正的词向量,你需要下载更大的模型包,例如:
python -m spacy download en_core_web_lg
实际操作:检查词向量
加载包含词向量的模型后,你可以检查每个词元是否具有向量表示:
import spacy
nlp = spacy.load("en_core_web_md")
tokens = nlp("dog cat banana afskfsd")
for token in tokens:
print(token.text, token.has_vector, token.vector_norm, token.is_oov)
输出结果会显示:
- 文本:原始词元文本
- 是否有向量:布尔值,表示该词是否有向量表示
- 向量范数:词向量的L2范数(各维度平方和的平方根)
- 是否OOV:是否超出词汇表(Out-of-vocabulary)
常见词如"dog"、"cat"和"banana"通常都有向量表示,而像"afskfsd"这样的生僻词则会被标记为OOV,其向量表示是全零向量。
相似度计算实战
spaCy可以比较两个对象的相似度,这在推荐系统或重复内容检测等场景非常有用。每个Doc
、Span
、Token
和Lexeme
对象都有.similarity
方法:
doc1 = nlp("I like salty fries and hamburgers.")
doc2 = nlp("Fast food tastes very good.")
# 文档相似度
print(doc1, "<->", doc2, doc1.similarity(doc2))
# 片段和词元相似度
french_fries = doc1[2:4]
burgers = doc1[5]
print(french_fries, "<->", burgers, french_fries.similarity(burgers))
相似度结果的合理预期
在使用相似度分数时,保持合理预期非常重要:
- 相似度没有客观定义:相似与否取决于具体应用场景
- 文档和片段的相似度默认使用词向量的平均值:这意味着短语"fast food"的向量是"fast"和"food"向量的平均,可能无法准确代表整个短语
- 向量平均对词序不敏感:表达相同意思但用词不同的文档可能比用词相同但意思不同的文档相似度分数更低
进阶技巧
对于需要更精细语义表示的场景,可以考虑使用sense2vec
这样的扩展库,它能处理名词短语并包含词性标签和实体标签,提供更丰富的语义分析能力。
最佳实践建议
- 根据应用需求选择合适的模型大小
- 对于专业领域,考虑使用领域特定数据训练自定义词向量
- 相似度分数应作为参考而非绝对标准
- 对于关键应用,建议结合其他NLP技术共同决策
通过合理使用spaCy的词向量和相似度计算功能,你可以为应用程序添加强大的语义理解能力。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考