【问题标题】:How to specify word vector for OOV terms in Spacy?如何在 Spacy 中为 OOV 项指定词向量?
【发布时间】:2020-01-27 01:04:27
【问题描述】:

我有一个预训练的 word2vec 模型,我将其加载到 spacy 以向量化新词。给定新文本,我执行nlp('hi').vector 以获得单词“hi”的向量。

最终,需要对我的预训练模型的词汇表中不存在的新词进行向量化。在这种情况下,spacy 默认为一个用零填充的向量。我希望能够为 OOV 术语设置此默认向量。

例子:

import spacy
path_model= '/home/bionlp/spacy.bio_word2vec.model'
nlp=spacy.load(path_spacy)
print(nlp('abcdef').vector, '\n',nlp('gene').vector)

此代码为单词“gene”输出一个密集向量,为单词“abcdef”输出一个全为 0 的向量(因为它不存在于词汇表中):

我的目标是能够为丢失的单词指定向量,因此您可以获得(例如)一个全为 1 的向量,而不是为单词“abcdef”获取一个全 0 的向量。

【问题讨论】:

  • 您想将 all 词汇表外 (OOV) 词的向量指定为您选择的单个新向量吗?或者为每个新的 OOV 设置一个您提供的不同向量?或者想要一种方法来为新的 OOV 词计算一个新的、与模型兼容的向量(可能通过使用子词相关性或一些新的使用示例)?
  • 我试图将单个向量应用于所有 OOV 单词

标签: python word2vec spacy


【解决方案1】:

如果你只是想要你的插件向量而不是 SpaCy 默认的全零向量,你可以添加一个额外的步骤,用你的替换任何全零向量。例如:

words = ['words', 'may', 'by', 'fehlt']
my_oov_vec = ...  # whatever you like
spacy_vecs = [nlp(word) for word in words]
fixed_vecs = [vec if vec.any() else my_oov_vec 
              for vec in spacy_vecs]

我不确定你为什么要这样做。大量使用词向量的工作只是省略了词汇表之外的词;使用任何插头值,包括 SpaCy 的零向量,可能只会增加无用的噪音。

如果更好地处理 OOV 词很重要,请注意,其他一些词向量模型,如 FastText,可以通过使用在训练期间为子词片段学习的向量,为 OOV 词合成优于无的猜测向量。这类似于人们通常如何从熟悉的词根中找出一个词的主旨。

【讨论】:

  • 这行得通,而且确实是一个简单的后处理。但是我受到计算时间的限制,并且很想知道在调用'nlp(word)'时是否有任何方法可以直接应用'my_oov_vec',所以整个矢量化更快?感谢您的详细回答,FastText 或 Bert 可能确实对我们的场景非常有用,其中训练后出现了许多新词
  • 你确定这种方法太慢了吗?快速浏览一下 SpaCy 源代码,看起来每次都组合了新的零向量(if github.com/explosion/spaCy/blob/…> 是相关的地方),所以看起来没有简单的方法为所有不存在的单词分配一个新的“后备”值。相反,您必须在对象/SpaCy 代码之外以启发式方式执行此操作 - 任何此类执行方式都可能具有与上述类似的复杂性,检查全零值并替换它。
  • 我同意你的评论,我还没有找到任何方法来预先分配这个“回退”值,所以最好的解决方案可能是下载和修改源代码或寻找额外的计算资源。就速度差异而言,我同意差异并不大。请参阅stackoverflow.com/questions/57672043/… 中的示例。也许在处理非常大的语料库时,我可能会雇用更多的计算资源。
猜你喜欢
  • 1970-01-01
  • 2023-04-02
  • 2021-09-11
  • 2019-04-18
  • 2018-06-09
  • 1970-01-01
  • 1970-01-01
  • 2019-12-31
  • 2021-05-07
相关资源
最近更新 更多