如何提高Doc2vec余弦相似度的重现性

How to improve the reproducibility of Doc2vec cosine similarity

我正在使用 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)

根据 documentation,您需要增加 epochs/steps 的数量(基于您使用的版本)以获得更高的矢量稳定性。如果未指定,模型初始化的 epochs 值将被重用。

因此,尝试使用更高的 epochs/steps 值来获得相似的向量,同时您必须权衡计算时间

infer_vector(doc_words, alpha=None, min_alpha=None, epochs=None, steps=None)

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

也就是说,运行之间应该只有一个小的"jitter",这对你以后的比较应该不会有太大的影响。 (您的下游比较应该容​​忍小的变化。)使用像这样使用随机化的算法,没有绝对 "right" 结果,只有有用的结果。

如果 运行 之间的差异仍然很大——例如将 most_similar() 结果从 运行 显着更改为 运行,则可能存在其他问题使用您的模型或设置:

  • Doc2Vec 在玩具大小的训练集上效果不佳——已发表的作品使用数万到数百万文档的文档集,其中每个文档有数十到数千个单词。如果您只使用一些短句,您将不会获得好的结果。

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

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