我正在使用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)
答案 0 :(得分:1)
根据documentation,您需要增加历元/步数(基于您使用的版本),以使向量更加稳定。如果未指定,则将重用来自模型初始化的epochs值。
因此,请尝试以较高的值表示历元/步数,以同时获得相似的矢量,而此时您必须权衡取舍的计算时间
infer_vector(doc_words, alpha=None, min_alpha=None, epochs=None, steps=None)
答案 1 :(得分:1)
如果您为epochs
提供了一个可选的infer_vector()
参数,该参数比默认参数大,则生成的矢量(从运行到单个文本的运行)将变得更加相似。 (这可能对小文本特别有用。)
也就是说,每次运行之间应该只有一个小的“抖动”,并且在以后的比较中不会有太大的不同。 (您的下游比较应该容忍微小的变化。)使用像这样使用随机化的算法,没有绝对“正确”的结果,只是有用的结果。
如果两次运行之间的差异仍然很大-例如每次运行都会显着更改most_similar()
结果,那么您的模型或设置可能还会存在其他问题:
Doc2Vec在玩具大小的训练集上效果不佳–已发布的工作使用了成千上万个文档集到数百万个文档,其中每个文档数以十万计至数千个单词。如果仅使用少数短句,则不会获得良好的结果。
infer_vector()
需要获取一个字符串令牌列表,而不是一个字符串。而且,这些标记应该已经按照与训练数据相同的方式进行了预处理。馈给infer_vector()
的所有未知单词将被忽略,从而使输入更短(或零长度),使结果更多(或全部)随机。
另外,gensim的Doc2Vec
具有本机的.save()
和.load()
方法,而不是原始的pickle
应该使用–特别是在较大的模型上,它们将使工作效率更高或没有错误。 (不过请注意:它们可能会创建多个保存文件,应将它们保存在一起,以便加载主文件时可以找到辅助文件。)