IndexError:索引超出范围-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:\Users\20200016\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:\Users\20200016\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>",in <module>
    word_vector.size()

NameError: name 'word_vector' is not defined

错误似乎表明我的索引在这里不正确。但是由于我只是间接索引(使用键而不是实际的数字索引),因此我看不到需要在此处进行更改。

谁知道这里出了什么问题?而我该如何克服这个错误

解决方法

第一次执行docker login -u developer -p $(oc whoami -t) $registry.most_similar()实例(在3.8.3的gensim版本中)将创建单位归一化向量的高速缓存,以帮助进行所有后续的批量相似操作,并将其放在KeyedVectors中。

您添加的新向量似乎没有刷新/重新计算/扩展缓存了.vectors_norm的内容-最初的.vectors_norm类和KeyedVectors操作不是设计为不断增长的或不断变化的向量集,而是作为训练后的冻结向量集的实用程序。

这就是您的.most_similar()的原因。

您应该能够通过在每次对IndexError进行修改/添加时明确清除.vectors_norm来解决此问题,例如:

KeyedVectors

(在gensim的下一个4.0.0版本中这不是必需的,但是我会仔细检查那里没有类似的问题。)

另外:

  • 您的word_vectors.vectors_norm = None 错误仅仅是因为您似乎未将所选变量名'word_vector' is not defined

    保留为's'。
  • 您可能不需要使用gensim-testing-utility-method word_vectors-只需使用您自己的明确的,有意的文件系统路径进行保存和加载

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