首页 > 解决方案 > 如何提高 Doc2vec 余弦相似度的重现性

问题描述

我正在使用 Gensim 的 Doc2vec 来训练一个模型,我使用 infer_vector 来推断一个新文档的向量来比较模型的相似度文档。但是,重复使用同一个文档可能会产生非常不同的结果。这样就无法准确评估类似的文档。
搜索网络提到,infer_vector 具有随机特性,所以每次产生一个新的文本向量,都会有所不同。
有没有办法解决这个问题?

model_dm =pickle.load(model_pickle)

inferred_vector_dm = model_dm.infer_vector(i)  

simsinput =model_dm.docvecs.most_similar([inferred_vector_dm],topn=10)

标签: python-3.xnlpgensimsimilaritydoc2vec

解决方案


如果您提供一个大于默认值的可选epochs参数,则生成的向量(从运行到运行单个文本)应该变得更加相似。infer_vector()(这可能对小文本特别有用。)

也就是说,运行之间应该只有很小的“抖动”,这对你以后的比较不会有太大的影响。(您的下游比较应该容​​忍小的变化。)使用这样的算法,使用随机化,没有绝对“正确”的结果,只有有用的结果。

如果运行之间的差异仍然很大——例如most_similar()从运行到运行显着改变结果,那么您的模型或设置可能存在其他问题:

  • Doc2Vec 在玩具大小的训练集上效果不佳 - 已发表的作品使用的文档集从数千到数百万个文档,其中每个文档包含数十到数千个单词。如果你只使用少量的短句,你将不会得到好的结果。

  • infer_vector()需要获取字符串令牌列表,而不是字符串。而且,这些令牌应该已经以与训练数据相同的方式进行了预处理。输入的任何未知单词都infer_vector()将被忽略,使输入更短(或零长度),使结果更加(或完全)随机。

另外,gensimDoc2Vec有本机.save().load()方法,应该使用而不是原始方法pickle——尤其是在较大的模型上,它们会更有效地做事或没有错误。(虽然注意:他们可能会创建多个保存文件,这些文件应该放在一起,以便加载主文件可以找到附属文件。)


推荐阅读