1

我通过使用大量文本数据从 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

如果我做错了什么,有人可以告诉我吗?

谢谢

4

2 回答 2

1

存储在模型m.docvecs[18638](使用infer_vector(),您正在使用模型的最终状态。您可以尝试通过在训练阶段添加更多时期来最小化这种差异。

但是,我建议您始终使用,infer_vector()这样您就可以确定您的所有段落向量都是使用相同版本的模型创建的。

于 2017-05-11T13:09:14.110 回答
0

一些想法:

如果您的初始训练对文本示例进行了任何额外的预处理(例如大小写扁平化),那么您也应该对输入到infer_vector().

infer_vector()的可选参数(包括steps=5和)的 gensim 默认值alpha=0.1是疯狂的猜测,对于许多模型/训练模式来说可能是不够的。许多人报告了更高steps(达到数百个)或更低开始alpha(更像是训练默认值0.025)的更好结果。

当模型本身返回most_similar()结果时,它会对单位长度的归一化文档向量进行所有余弦相似度计算。– 即在需要时生成的model.docvecs.doctag_syn0norm数组中的那些。但是,返回的向量infer_vector()将只是原始的、未归一化的推断向量——类似于model.docvecs.doctag_syn0数组中的原始向量。如果计算您自己的余弦相似度,请务必考虑这一点。(我认为spatial.distance.cosine()这是原因。)

一般来说,在批量训练期间重新推断与训练过的文档向量相同的文本的向量应该会导致非常相似(但不相同)的向量。因此,如果实际上m.docvecs[18638]与您在此处重新推断的文本完全相同,那么距离应该很小。(这可以很好地检查训练过程和随后的推理是否产生预期的效果。)如果没有达到预期的相似性,您应该重新检查训练期间是否发生了正确的预处理,即模型参数导致真正的训练发生,你指的是正确的训练向量(18638),没有任何偏离/等错误,等等。

于 2017-05-15T22:42:33.050 回答