我正在使用Gensim库来训练一些使用doc2vec的数据文件,同时尝试使用model.docvecs.most_similar("file")
方法测试其中一个文件的相似性,我总是得到91%以上的所有结果,它们之间几乎没有差别(这不是逻辑),因为文件之间没有相似之处。所以结果不准确。
以下是培训模型的代码
model = gensim.models.Doc2Vec(vector_size=300, min_count=0, alpha=0.025, min_alpha=0.00025,dm=1)
model.build_vocab(it)
for epoch in range(100):
model.train(it,epochs=model.iter, total_examples=model.corpus_count)
model.alpha -= 0.0002
model.min_alpha = model.alpha
model.save('doc2vecs.model')
model_d2v = gensim.models.doc2vec.Doc2Vec.load('doc2vecs.model')
sim = model_d2v.docvecs.most_similar('file1.txt')
print sim
这是输出结果
[('file2.txt',0.9279470443725586),('file6.txt',0.9258157014846802),('file3.txt',0.92499840259552),('file5.txt',0.9209873676300049),('file4.txt',0.9180108308792114) ,('file7.txt',0.9141069650650024)]
我究竟做错了什么?我怎样才能提高结果的准确性?
你的it
数据是什么,它是如何准备的? (例如,print(iter(it).next())
做了什么,特别是如果你连续两次调用它?)
通过调用train()
100次,并保留默认的model.iter
为5,你实际上对数据进行了500次传递。并且前5次传球将使用train()
s内部,有效的alpha
管理将学习率逐渐降低到您声明的min_alpha
值。然后你的下一个495传球将是你自己的笨拙管理的阿尔法率,首先在0.025
附近备份,然后降低每批5,直到你到达0.005
。
这些都不是一个好主意。你可以打电话给train()
一次,传递你想要的epochs
数量。已发表作品的典型时代数为10-20。 (对于小型数据集,可能会有所帮助,但如果您认为需要数百个,那么数据或设置可能还有其他问题。)
如果它是少量数据,你将不会得到非常有趣的Word2Vec
/ Doc2Vec
结果,因为这些算法取决于许多不同的例子。已发布的结果倾向于使用具有数万到数百万个文档的训练集,并且每个文档至少有数十个,但最好是数百个单词。使用更小的数据集,有时您可以通过使用更多的训练传递和更小的向量来挤出足够的结果。使用更简单的PV-DBOW模式(dm=0
)也可以帮助更小的语料库/文档。
most_similar()
报告的值不是相似性“百分比”。它们是余弦相似值,从-1.0到1.0,它们的绝对值不如不同结果的相对等级重要。因此,如果存在大量具有> 0.9相似性的结果,则无关紧要 - 只要这些文档更像是查询文档而不是排名较低的文档。
因此,查看建议最相似的单个文档是真正的测试。如果它们看起来像废话,那么您的数据或其准备或培训参数可能存在问题。
对于具有足够的真实自然语言文本的数据集,通常更高的min_count
值可以提供更好的结果。真实文本往往有很多低频词,并不代表强大的东西而没有更多的例子,因此在训练期间保留它们会起到噪音的作用,使模型不那么强大。
在不知道文档内容的情况下,这里有两个可能对您有帮助的提示。