我已经使用doc2vec在多个文档中找到相似之处,但是当我检查创建模型的同一文档时,分数应该为'1'对吗?因为使用的文档和要预测的文档是相同的。可悲的是,我在寻找相似之处时得到了不同的分数。下面是附带的代码。请告诉我如何做到这一点,我在这里找不到错误。请帮助我... doc2vec - calculating document cosine similarity
from gensim.models.doc2vec import Doc2Vec, TaggedDocument
df['Tagged_data'] = df['sent_to_word_tokenize_text'].apply(lambda x: [TaggedDocument(d, [i]) for i, d in enumerate(x)])
sadguru_model = Doc2Vec(df['Tagged_data'][0], vector_size = 1000, window = 500, dm = 1, min_count = 1, workers = 2, epochs = 100)
test_doc = word_tokenize(' '.join([word for word in df['Sentence_Tokenized_Text'][0]]))
# Sadguru model document
index0 = sadguru_model.docvecs.most_similar(positive=sadguru_model.infer_vector(test_doc)], topn =1) output: index0 = [(4014, 0.5270981788635254)]
输出:index0 = [(4014, 0.5270981788635254)]
Doc2Vec
不会为每个输入文档发现真实的唯一矢量。相反,它使用内部算法逐步学习有用的近似向量,而内部算法本身利用了大量的随机初始化和随机采样。结果:
有关更多信息,请参见Gensim FAQ questions 11 & 12。
如果您的数据和参数足够,那么您可以期望两个相同的文档应具有“非常接近”的向量,并且对相同文档字词的重新推论将创建一个与该文档中的同一文档“非常接近”的向量。原始训练集。 (没有“非常紧密”的精确定义,但在工作模型中,此类相同单词的文档将比训练集中的其他文档彼此更靠近。)
因此,您应该期望'C'相似度接近1.0
,但基本上从不 1.0
准确,除非您经过大量努力有意制作了两个相同的向量。
但是,您甚至都看不到“非常接近”的结果,因为与常规或最佳实践相比,您的训练参数(可能是训练语料库)看起来不合常规。具体来说:
A vector_size=1000
仅适用于数百万(理想地是几千万)文档的巨大数据集。如果您使用的向量大于数据可以填补有意义的差异,则模型的结果将显得越来越随机-尤其是在相同或非常相似的文档的情况下,因为现在不再是随机的,迭代的过程,而是逐渐将它们累加到相同的价值观“邻里”,它们可能遍布各地。
A window=500
是前所未有的。默认值为5
,有时使用的值最大为20
,或者偶尔使用巨型值,当且仅当*文档本身很小时,这样有效的窗口仍只是“整个文档的大小可管理” ”。在文档大小超过500个单词的真实大小的语料库上,window=500
的计算成本非常高,而且如果向量的差值比更典型的值大,则可能会产生结果。
A min_count=1
几乎总是一个坏主意。仅出现一次或几次的单词就没有Doc2Vec
(以及Word2Vec
,FastText
等相关算法)学习有意义的表示所需要的各种巧妙使用。取而代之的是,单次使用/罕见使用会产生怪异的非代表性示例,并且通常只是起到噪音的作用,从而防止人们更好地理解具有足够示例的其他词语。随着训练数据的增长,应该增加5
上的值,而不是减少它。
epochs=100
非常不常见,通常用于通过对数据进行大量重新训练而努力从数据不足中挤压出某些结果的情况。 (在最有意义的情况下,由于数据量少,您将vector_size
decrease
Doc2Vec
,历元为10-20在已发布的结果中很常见。 尝试使用不大于唯一文档数的平方根的vector_size
,将min_count
保留为默认值(或至少为2
),将window
保留为默认值(除非您(特别是文档非常少的文档),然后尝试epochs=20
(除非文档数量很少并且发现有更多改进)。
然后,您可能会发现自相似性测试返回一些高值-可能是0.9
或更高–而不是0.52
,但仍然不是1.0
。