首页 > 解决方案 > 在 SpaCy 上计算文本的平均向量

问题描述

我正在使用 SpaCy 计算几个文档之间的距离,我的方法如下:

1)将文本转换为一个spacy对象 2)删除停用词 3)对于剩余的每个词,获取向量表示并计算平均值。4) 使用几种方法来测量文档之间的距离。

我对这种方法的问题是大文件需要很长时间。

我发现 spacy 有一种方法,称为相似性,可以更快地执行此操作:

nlp_latin = spacy.load("/tmp/la_vectors_wiki_lg")
doc1 = nlp_latin(u"Caecilius est in horto")
doc2 = nlp_latin(u"servus est in atrio")
doc1.similarity(doc2)

但它只使用余弦距离,有没有一种方法只返回文档的平均向量?

标签: pythonnlpspacy

解决方案


只是为该线程的未来访问者扩展上述评论中的答案:

根据SpaCy 文档DocSpaCy 中的类具有vector返回其标记向量平均值的属性。

对于您的用例,在加载 SpaCy 后,以下代码将为您提供拉丁文本“Caecilius est in horto”的平均向量

doc = nlp_latin(u"Caecilius est in horto")
doc.vector

提高性能的旁注:

  1. 即使您只使用 SpaCy 管道的标记器组件,SpaCy 也会在您调用spacy.load. 因此,加载它们会显着降低性能。exclude为了解决这个问题,您可以通过将参数添加到函数中来排除这些额外的组件spacy.load,如下所示(有关更多信息,请查看Spacy 关于处理管道的文档。):
   nlp_latin = spacy.load("/tmp/la_vectors_wiki_lg", exclude=["parser", "ner", "tagger", "textcat"])
  1. 同样,由于您仅使用 SpaCy 将原始文本转换为标记,因此您可以将nlp_latin函数调用替换为nlp_latin.make_doc. 可以像以前一样检索平均令牌向量doc.vector。这确保 SpaCy 仅在 nlp_latin 调用后使用标记器,从而使您的代码更快。有关更多信息,请查看此链接的扩展和性能部分

推荐阅读