如何在 Spacy 中为 OOV 术语指定词向量?

How to specify word vector for OOV terms in Spacy?

我有一个预训练的 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 向量(因为它不存在于词汇表中):

我的目标是能够为缺失的单词指定向量,因此不是为单词 'abcdef' 得到一个全为 0 的向量,而是可以得到(例如)一个全为 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 词合成胜于无的猜测向量.这类似于人们通常如何从熟悉的词根中找出一个词的要旨。