【问题标题】: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)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-12-04
        • 2020-08-12
        • 1970-01-01
        • 2011-01-01
        • 2017-12-12
        • 1970-01-01
        • 2023-02-10
        相关资源
        最近更新 更多