【问题标题】:How to improve the reproducibility of Doc2vec cosine similarity如何提高 Doc2vec 余弦相似度的重现性
【发布时间】:2018-12-19 14:03:18
【问题描述】:
我正在使用 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.x
nlp
gensim
similarity
doc2vec
【解决方案1】:
如果您向infer_vector() 提供一个大于默认值的可选epochs 参数,则生成的向量(从运行到运行单个文本)应该变得更加相似。 (这可能对小文本特别有用。)
也就是说,运行之间应该只有很小的“抖动”,这不会对您以后的比较产生太大影响。 (你的下游比较应该容忍小的变化。)像这样使用随机化的算法,没有绝对“正确”的结果,只有有用的结果。
如果运行之间的差异仍然很大——例如在运行之间显着更改most_similar() 结果,那么您的模型或设置可能存在其他问题:
Doc2Vec 在玩具大小的训练集上效果不佳 - 已发布的作品使用的文档集包含数千到数百万个文档,其中每个文档包含数十到数千个单词。如果你只使用几个短句,你不会得到好的结果。
infer_vector() 需要获取字符串令牌列表,不是字符串。而且,这些令牌应该已经以与训练数据相同的方式进行了预处理。任何输入到infer_vector() 的未知单词都将被忽略,使输入更短(或零长度),使结果更加(或完全)随机。
另外,gensim 的 Doc2Vec 具有原生的 .save() 和 .load() 方法,应该使用它们而不是原始的 pickle - 特别是在较大的模型上,它们会更有效地或没有错误地做事。 (虽然注意:他们可能会创建多个保存文件,这些文件应该放在一起,以便加载主文件可以找到附属文件。)
【解决方案2】:
根据documentation,您需要增加 epochs/steps 的数量(基于您使用的版本)以获得更多的向量稳定性。如果未指定,则模型初始化的 epochs 值将被重用。
因此,尝试使用更高的 epochs/steps 值来获得相似的向量,同时您必须权衡计算时间似乎
infer_vector(doc_words, alpha=None, min_alpha=None, epochs=None, steps=None)