处理 GoogleNews-vectors-negative300.bin 中的 OOV 词

Handling OOV words in GoogleNews-vectors-negative300.bin

我需要为句子中的每个词计算词向量,如下所示:

['my', 'aunt', 'give', 'me', 'a', 'teddy', 'ruxpin']. 

如果我使用预训练的 [fastText][1] 嵌入:cc.en.300.bin.gz by facebook。我可以通过 OOV。但是,当我使用来自 GoogleNews-vectors-negative300.bin 的 Google 的 word2vec 时,它 returns 一个 InvalidKey 错误。我的问题是我们如何计算 OOV 的词向量呢?我在网上搜索我找不到任何东西。当然,这样做的方法是删除所有包含未在 google 的 word2vec 中列出的单词的句子。但是,我注意到 16134 个中只有 5550 个词完全嵌入了词。

我也做了

model = gensim.models.KeyedVectors.load_word2vec_format('/content/drive/My Drive/Colab Notebooks/GoogleNews-vectors-negative300.bin', binary=True) 
model.train(sentences_with_OOV_words)

但是tensorflow 2 returns报错了。

任何帮助将不胜感激。

如果找不到vocab,用同样大小的零向量初始化它们(Googleword2vec应该是300维的向量):

try:
    word_vector = model.wv.get_vector('your_word_here')

except KeyError:
    word_vector = np.zeros((300,))

太棒了!非常感谢。

def get_vectorOOV(s):
  try:
    return np.array(model.wv.get_vector(s))
  except KeyError:
    return np.zeros((300,))

GoogleNews 向量集是单词到向量的简单映射。它(或创建它的算法)没有用于为未知单词合成向量的工具。

(类似地,如果您将普通矢量集作为 KeyedVectors 加载到 gensim 中,则没有机会在结果对象上 运行 train(),因为你在你的问题代码中显示。它不是一个完整的可训练模型,只是向量的集合。)

您可以使用 in 关键字检查某个词是否可用。正如其他答案所指出的那样,您可以选择对此类单词使用一些插入值(例如全零向量)。

但最好完全忽略这些词 - 假装它们甚至不在您的文本中。 (改为使用零向量,然后将该零向量输入系统的其他部分,可以使这些未知词本质上 稀释 附近其他词向量的影响——这通常这不是你想要的。)