IndexError: index is out of bounds - word2vec

IndexError: index is out of bounds - word2vec

我使用大小为 512 的 Gensim 包训练了一个名为 word_vectors 的 word2vec 模型。

fname = get_tmpfile('word2vec.model')
word_vectors = KeyedVectors.load(fname, mmap='r')

现在,我创建了一个新的 Numpy 数组(大小也是 512),我已将其添加到 word2vec 中,如下所示:

vector = (rand(512)-0.5) *20
word_vectors.add('koffie', vector)

这样做似乎很顺利,甚至在我打电话时也是如此

word_vectors['koffie']

我得到数组作为输出,正如预期的那样。

然而,当我想在我的模型中寻找最相似的词时 运行 下面的代码:

word_vectors.most_similar('koffie')

我收到以下错误:

Traceback (most recent call last):

  File "<ipython-input-283-ce992786ce89>", line 1, in <module>
    word_vectors.most_similar('koffie')

  File "C:\Users200016\AppData\Local\Continuum\anaconda3\envs\ldaword2vec\lib\site-packages\gensim\models\keyedvectors.py", line 553, in most_similar
    mean.append(weight * self.word_vec(word, use_norm=True))

  File "C:\Users200016\AppData\Local\Continuum\anaconda3\envs\ldaword2vec\lib\site-packages\gensim\models\keyedvectors.py", line 461, in word_vec
    result = self.vectors_norm[self.vocab[word].index]

IndexError: index 146139 is out of bounds for axis 0 with size 146138


word_vector.size()
Traceback (most recent call last):

  File "<ipython-input-284-2606aca38446>", line 1, in <module>
    word_vector.size()

NameError: name 'word_vector' is not defined

错误似乎表明我的索引在这里不正确。但是因为我只是间接索引(使用键而不是实际的数字索引),所以我看不到我需要在这里更改什么。

谁知道这里出了什么问题?我该怎么做才能克服这个错误?

第一次执行 .most_similar() 时,一个 KeyedVectors 实例(在 gensim 版本到 3.8.3 中)将创建一个 unit-normalized 向量的缓存以协助所有后续 bulk-similarity 操作,并将其放在 .vectors_norm.

看起来您添加的新向量并没有 flush/recalculate/expand 缓存 .vectors_norm - 最初 KeyedVectors class 和 .most_similar() 操作是设计时并未考虑 constantly-growing 或 constantly-changing sets-of-vectors,而是作为 post-training、冻结向量集的实用程序。

这就是你 IndexError 的原因。

您应该能够 work-around 通过明确清除 .vectors_norm 任何时候您对 KeyedVectors 执行 modifications/additions,例如:

word_vectors.vectors_norm = None

(这在下一个 4.0.0 版本的 gensim 中应该不是必需的,但我会 double-check 那里没有类似的问题。)

分开:

  • 您的 'word_vector' is not defined 错误仅仅是因为您似乎将 's' 从您选择的变量名称 word_vectors

    中删除了
  • 您可能不需要使用 gensim-testing-utility-method get_tmpfile() - 只需使用您自己明确的、有意的文件系统路径来保存和加载

  • 使用KeyedVectors.load()是否合适取决于保存的内容。如果您实际上要保存完整的 Word2Vec class 实例(不仅仅是向量),使用 Word2Vec.load() 会更合适。