问题描述
我已经使用大小为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版本中这不是必需的,但是我会仔细检查那里没有类似的问题。)
另外:
-
您的
保留为's'。word_vectors.vectors_norm = None
错误仅仅是因为您似乎未将所选变量名'word_vector' is not defined
-
您可能不需要使用gensim-testing-utility-method
word_vectors
-只需使用您自己的明确的,有意的文件系统路径进行保存和加载 -
使用
get_tmpfile()
是否合适取决于保存的内容。如果实际上您要保存完整的KeyedVectors.load()
类实例(不仅仅是向量),则使用Word2Vec
会更合适。