【问题标题】:Calculate average vector of a text on SpaCy在 SpaCy 上计算文本的平均向量
【发布时间】:2021-07-18 23:38:09
【问题描述】:

我正在使用 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)

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

【问题讨论】:

  • 根据文档“带有内置词向量的模型使它们可用作 Token.vector 属性。Doc.vectorSpan.vector 将默认为其标记向量的平均值。”
  • @bivouac0 请回答以结束问题(y)

标签: python nlp spacy


【解决方案1】:

只是在上面的 cmets 中为该线程的未来访问者扩展答案:

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

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

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

提高性能的旁注:

  1. 即使您只使用 SpaCy 管道的标记器组件,当您调用 spacy.load 时,SpaCy 也会加载其他组件(即“parser”、“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

【讨论】:

    猜你喜欢
    • 2014-05-16
    • 1970-01-01
    • 1970-01-01
    • 2014-06-26
    • 2016-05-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多