【问题标题】:Handling OOV words in GoogleNews-vectors-negative300.bin处理 GoogleNews-vectors-negative300.bin 中的 OOV 词
【发布时间】:2019-09-16 04:18:26
【问题描述】:

我需要计算一个句子的每个单词的单词向量,它被标记如下:

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

如果我使用的是预训练的 [fastText][1] Embeddings: cc.en.300.bin.gz by facebook。我可以通过OOV。但是,当我从 GoogleNews-vectors-negative300.bin 使用 Google 的 word2vec 时,它返回一个 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 返回错误。

任何帮助将不胜感激。

【问题讨论】:

  • 如果找不到词汇,可以用零向量初始化(即300维向量,全为0)。
  • 你的意思是,我创建了一个 gensim.models.keyedvectors.Word2VecKeyedVectors 的 Child 类,然后在那里重写 'get_vec' 方法?如果是这样,我能找到实现吗?谢谢。
  • 我认为你可以只做一个try 和except 而不是创建一个子类。看我的回答。

标签: word2vec oov


【解决方案1】:

如果没有找到词汇,用相同大小的零向量初始化它们(谷歌word2vec应该是300维的向量):

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

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

【讨论】:

    【解决方案2】:

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

    (同样,如果您将纯向量集作为KeyedVectors 加载到gensim 中,则没有机会在结果对象上运行train(),正如您在问题代码中显示的那样。它不是完全可训练的模型,只是向量的集合。)

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

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

    【讨论】:

    • 感谢您的重述。我认为在我的情况下,所有 0 向量都是要走的路,我在我看不见的测试集上获得了 100% 的准确度!现在你让我想知道!
    【解决方案3】:

    太棒了!非常感谢。

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

    【讨论】:

      猜你喜欢
      • 2018-03-08
      • 1970-01-01
      • 1970-01-01
      • 2016-03-02
      • 1970-01-01
      • 2020-06-04
      • 2016-05-09
      • 2015-11-24
      • 2018-06-09
      相关资源
      最近更新 更多