我使用大量的文本数据训练了gensim的段落矢量模型。我做了下一个测试:我验证了任何句子的索引,然后为它推断了一个向量
>>> x=m.docvecs[18638]
>>> g=m.infer_vector("The seven OxyR target sequences analyzed previously and two new sites grxA at position 207 in GenBank entry M13449 and a second Mu phage mom site at position 59 in GenBank entry V01463 were used to generate an individual information weight matrix".split())
当我计算余弦相似度时,它非常低(预期相反)。
>>> 1 - spatial.distance.cosine(g, x)
0.20437437837633066
有人可以告诉我,如果我做错了吗?
由于
答案 0 :(得分:0)
存储在模型(m.docvecs[18638]
)中的段落向量是在训练阶段创建的,然后模型可能已经改变,因为其他段落用于训练。使用infer_vector()
,您正在使用模型的最终状态。您可以尝试通过在训练阶段添加更多时期来最小化这种差异。
但是我建议你总是使用infer_vector()
,这样你就可以确定所有的段落向量都是使用相同版本的模型创建的。
答案 1 :(得分:0)
一些想法:
如果您的初始培训对文本示例进行了任何额外的预处理 - 比如说case-flattening - 那么您也应该将这些标记作为馈送到infer_vector()
的标记。
infer_vector()
的可选参数的gensim默认值(包括steps=5
和alpha=0.1
)是对许多模型/训练模式可能不足的猜测。许多人报告的结果更好steps
(数百人),或更低的起始alpha
(更像是0.025
的培训默认值)。
当模型本身返回most_similar()
个结果时,它会对单位长度归一化doc-vectors进行所有余弦相似度计算。
- 即生成时需要的model.docvecs.doctag_syn0norm
数组中的那些。但是,infer_vector()
返回的向量将只是原始的非标准化推断向量 - 类似于model.docvecs.doctag_syn0
数组中的原始向量。如果计算你自己的余弦相似性,一定要考虑到这一点。 (我认为spatial.distance.cosine()
说明了这一点。)
通常,在批量训练期间重新推断用于训练文档向量的相同文本的向量应该导致非常相似(但不相同)的向量。因此,如果实际上m.docvecs[18638]
与您在此处重新推断的文本完全相同,则距离应该非常小。 (对于培训过程和后来的推理是否具有预期效果,这可能是一个很好的“健全性检查”。)如果未达到预期的相似性,则应重新检查培训期间是否进行了正确的预处理,即模型参数导致真正的训练发生,你指的是正确训练的矢量(18638),没有任何一个/一个/等错误,等等。