gensim Word2vec作为HTTP服务的代码' KeyedVectors'属性错误

时间:2017-05-23 19:26:37

标签: python gensim word2vec

我正在使用w2v_server_googlenews运行的word2vec HTTP服务器中的https://rare-technologies.com/word2vec-tutorial/#bonus_app代码。我将加载的文件更改为使用原始C版word2vec训练的矢量文件。我用

加载文件
gensim.models.KeyedVectors.load_word2vec_format(fname, binary=True)

似乎加载没有问题。但是当我测试HTTP服务时,让我们说

curl 'http://127.0.0.1/most_similar?positive%5B%5D=woman&positive%5B%5D=king&negative%5B%5D=man' 

我的结果只有执行时间。

{"taken": 0.0003361701965332031, "similars": [], "success": 1}

我在相关方法的除部分上放了一个traceback.print_exc(),在这种情况下def most_similar(self, *args, **kwargs):我得到了:

Traceback (most recent call last):
  File "./w2v_server.py", line 114, in most_similar
    topn=5)
  File "/usr/local/lib/python2.7/dist-packages/gensim/models/keyedvectors.py", line 304, in most_similar
    self.init_sims()
  File "/usr/local/lib/python2.7/dist-packages/gensim/models/keyedvectors.py", line 817, in init_sims
    self.syn0norm = (self.syn0 / sqrt((self.syn0 ** 2).sum(-1))[..., newaxis]).astype(REAL)
AttributeError: 'KeyedVectors' object has no attribute 'syn0'

有关为何会出现这种情况的任何想法?

注意:我使用python 2.7并使用pip安装gensim,这给了我gensim 2.1.0。

1 个答案:

答案 0 :(得分:2)

仅供参考,该演示代码基于gensim 0.12.3(从2015年开始,如其requirements.txt中所列),并且需要更新以使用最新的gensim。

在第70行(仅在w2v_server.py之后)向load_word2vec_format()添加一行可能就足够了,以强制创建所需的syn0norm属性(在较旧的gensims中是在删除原始syn0值之前,在加载时自动创建。具体做法是:

self.model.init_sims(replace=True)

(如果你要进行replace=True以外的操作,你可能会遗漏most_similar(),这可能需要原始载体。)

如果这可以解决您的问题,那么有利于收到w2v_server_googlenews回购的拉取请求!