计算SpaCy上文本的平均向量

时间:2019-06-09 18:28:42

标签: python nlp 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)

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

1 个答案:

答案 0 :(得分:2)

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

根据 SpaCy documentation,SpaCy 中的 Doc 类有一个属性 vector,它返回其标记向量的平均值。

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

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

提高性能的旁注:

  1. 即使您只使用 SpaCy 管道的标记器组件,SpaCy 也会在您调用 spacy.load 时加载其他组件(即“解析器”、“ner”、“tagger”和“textcat”)。因此,加载它们会显着降低性能。要解决此问题,您可以通过向 exclude 函数添加 spacy.load 参数来排除这些附加组件,如下所示(有关详细信息,请查看 Spacy documentation on processing pipelines.):
   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 调用后使用标记器,从而使您的代码更快。有关详细信息,请查看 Scaling and Performance section of this link