gensim 基于KeyedVectors函数(例如rank())在使用vocab字段时,当从Doc2VecKeyedVectors调用时会失败,

gstyhher  于 4个月前  发布在  其他
关注(0)|答案(3)|浏览(55)

描述

链接到邮件列表中原始帖子的链接
在这里重述:
当在Doc2VecKeyedVectors模型上调用作为基类BasedKeyedVectors一部分的函数时(它们似乎将entity1和entity2用作它们的变量名),它会抛出一个KeyError,表示它无法识别doc标签。但是,在Doc2VecKeyedVectors类内的函数(如distance)上使用相同的doc标签,则返回预期的结果。

步骤/代码/语料库以重现问题

相关代码已在描述中链接,如果您更喜欢,请告诉我是否将其复制到这里。

预期结果

希望函数能够识别doc标签并执行相关的计算。

实际结果

抛出了一个KeyError。

Traceback (most recent call last):
  File "C:/Users/cmiramontes/Documents/Projects/PyCharm/otb-ml-integration/Server/OTB_ML_Services.py", line 192, in <module>
    main()
  File "C:/Users/cmiramontes/Documents/Projects/PyCharm/otb-ml-integration/Server/OTB_ML_Services.py", line 188, in main
    d2v.rank(sens, e1, e2)
  File "C:\Users\cmiramontes\Documents\Projects\PyCharm\otb-ml-integration\Server\doc2vec_services.py", line 70, in rank
    return model.docvecs.rank(entity1, entity2)
  File "C:\Users\cmiramontes\Documents\Projects\PyCharm\otb-ml-integration\venv\lib\site-packages\gensim\models\keyedvectors.py", line 190, in rank
    return len(self.closer_than(entity1, entity2)) + 1
  File "C:\Users\cmiramontes\Documents\Projects\PyCharm\otb-ml-integration\venv\lib\site-packages\gensim\models\keyedvectors.py", line 183, in closer_than
    e1_index = self.vocab[entity1].index
KeyError: '00359a92-f243-4b59-b998-33ad0d23b0cd'
lsmepo6l

lsmepo6l1#

快速修复的方法是重写Doc2VecKeyedVectors中的一些额外方法以匹配其操作方式。但这种方法有点丑陋,因为超类初始化了空属性(词汇表、向量、索引到实体),然后这些属性被子类未使用,因为它使用了与其高度相似的(文档标签、向量文档、偏移量到文档标签) - 这里尝试统一相似类的努力最多只是完成了一半。对每个超类方法进行测试覆盖,但针对每个子类的示例,本可以捕获到这个问题。

ovfsdjhp

ovfsdjhp3#

感谢cmiram的报告,我添加了一个示例来重现问题:

from gensim.test.utils import common_texts
from gensim.models.doc2vec import Doc2Vec, TaggedDocument

corpus = [TaggedDocument(txt, [str(idx)]) for idx, txt in enumerate(common_texts)]
model = Doc2Vec(corpus, min_count=1)

model.docvecs.rank('1', '2')

预期 :整数值
实际 :

KeyError                                  Traceback (most recent call last)
<ipython-input-1-5f319b2c14a8> in <module>()
      7 model = Doc2Vec(corpus, min_count=1)
      8 
----> 9 model.docvecs.rank('1', '2')
     10 

/home/ivan/.virtualenvs/math/local/lib/python2.7/site-packages/gensim/models/keyedvectors.pyc in rank(self, entity1, entity2)
    355     def rank(self, entity1, entity2):
    356         """Rank of the distance of `entity2` from `entity1`, in relation to distances of all entities from `entity1`."""
--> 357         return len(self.closer_than(entity1, entity2)) + 1
    358 
    359 

/home/ivan/.virtualenvs/math/local/lib/python2.7/site-packages/gensim/models/keyedvectors.pyc in closer_than(self, entity1, entity2)
    348         """Get all entities that are closer to `entity1` than `entity2` is to `entity1`."""
    349         all_distances = self.distances(entity1)
--> 350         e1_index = self.vocab[entity1].index
    351         e2_index = self.vocab[entity2].index
    352         closer_node_indices = np.where(all_distances < all_distances[e2_index])[0]

KeyError: '1'

相关问题