doc2vec 使用 gensim 库得出不准确的相似性结果
Inaccurate similarities results by doc2vec using gensim library
我正在使用 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)]
我做错了什么?我怎样才能提高结果的准确性?
在不知道文档内容的情况下,这里有两个提示可能对您有所帮助。
首先,100 个 epoch 可能对于模型学习差异来说太小了。
另外,检查文档的内容与您使用的语料库。确保词汇与您的文件相关?
您的 it
数据是什么,它是如何准备的? (例如,print(iter(it).next())
有什么作用,特别是如果你连续调用它两次?)
通过调用 train()
100 次,并保留默认值 model.iter
5,您实际上对数据进行了 500 次传递。前 5 遍将使用 train()
内部有效的 alpha
管理来逐渐将学习率降低到您声明的 min_alpha
值。然后你接下来的 495 次传球将以你自己笨拙地管理的 alpha 率,首先在 0.025
附近备份,然后降低每批 5 直到你达到 0.005
。
None 那是个好主意。您可以只调用 train()
一次,将您想要的 epochs
数量传递给它。已发表作品中的典型时期数为 10-20。 (多一点可能对小数据集有帮助,但如果您认为需要数百个,则数据或设置可能有其他问题。)
如果数据量很小,您将不会得到非常有趣的 Word2Vec
/Doc2Vec
结果,因为这些算法依赖于大量不同的示例。发布的结果往往使用包含数万到数百万文档的训练集,并且每个文档至少有几十个,但最好是数百个单词。对于更小的数据集,有时您可以通过使用更多的训练遍数和更小的向量来挤出足够的结果。此外,使用更简单的 PV-DBOW 模式 (dm=0
) 可能有助于较小的 corpuses/documents。
most_similar()
报告的值不相似 "percentages"。它们是余弦相似度值,从 -1.0 到 1.0,它们的绝对值不如不同结果的相对等级重要。因此,如果有很多相似度 >0.9 的结果并不重要——只要这些文档比排名较低的文档更像查询文档。
因此,查看建议为最相似的单个文档才是真正的考验。如果它们看起来像是胡说八道,则可能是您的数据或其准备或训练参数存在问题。
对于具有足够真实自然语言文本的数据集,通常 min_count
值越高,结果越好。真实的文本往往有很多低频词,如果没有更多的例子,这些词就不会暗示强大的东西,因此在训练期间保留它们会起到噪音的作用,使模型不那么强大。
我正在使用 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)]
我做错了什么?我怎样才能提高结果的准确性?
在不知道文档内容的情况下,这里有两个提示可能对您有所帮助。
首先,100 个 epoch 可能对于模型学习差异来说太小了。
另外,检查文档的内容与您使用的语料库。确保词汇与您的文件相关?
您的 it
数据是什么,它是如何准备的? (例如,print(iter(it).next())
有什么作用,特别是如果你连续调用它两次?)
通过调用 train()
100 次,并保留默认值 model.iter
5,您实际上对数据进行了 500 次传递。前 5 遍将使用 train()
内部有效的 alpha
管理来逐渐将学习率降低到您声明的 min_alpha
值。然后你接下来的 495 次传球将以你自己笨拙地管理的 alpha 率,首先在 0.025
附近备份,然后降低每批 5 直到你达到 0.005
。
None 那是个好主意。您可以只调用 train()
一次,将您想要的 epochs
数量传递给它。已发表作品中的典型时期数为 10-20。 (多一点可能对小数据集有帮助,但如果您认为需要数百个,则数据或设置可能有其他问题。)
如果数据量很小,您将不会得到非常有趣的 Word2Vec
/Doc2Vec
结果,因为这些算法依赖于大量不同的示例。发布的结果往往使用包含数万到数百万文档的训练集,并且每个文档至少有几十个,但最好是数百个单词。对于更小的数据集,有时您可以通过使用更多的训练遍数和更小的向量来挤出足够的结果。此外,使用更简单的 PV-DBOW 模式 (dm=0
) 可能有助于较小的 corpuses/documents。
most_similar()
报告的值不相似 "percentages"。它们是余弦相似度值,从 -1.0 到 1.0,它们的绝对值不如不同结果的相对等级重要。因此,如果有很多相似度 >0.9 的结果并不重要——只要这些文档比排名较低的文档更像查询文档。
因此,查看建议为最相似的单个文档才是真正的考验。如果它们看起来像是胡说八道,则可能是您的数据或其准备或训练参数存在问题。
对于具有足够真实自然语言文本的数据集,通常 min_count
值越高,结果越好。真实的文本往往有很多低频词,如果没有更多的例子,这些词就不会暗示强大的东西,因此在训练期间保留它们会起到噪音的作用,使模型不那么强大。