Doc2Vec比Word2Vec向量的平均值或总和更差

时间:2017-07-21 09:40:30

标签: python machine-learning gensim word2vec doc2vec

我正在训练Word2Vec模型,如:

model = Word2Vec(documents, size=200, window=5, min_count=0, workers=4, iter=5, sg=1)

Doc2Vec模型如:

doc2vec_model = Doc2Vec(size=200, window=5, min_count=0, iter=5, workers=4, dm=1)
doc2vec_model.build_vocab(doc2vec_tagged_documents)
doc2vec_model.train(doc2vec_tagged_documents, total_examples=doc2vec_model.corpus_count, epochs=doc2vec_model.iter)

使用相同数据和可比较的参数。

在此之后,我将这些模型用于我的分类任务。我发现简单地平均或总结文档的word2vec嵌入比使用doc2vec向量要好得多。我还尝试了更多doc2vec次迭代(25,80和150 - 没有区别)。

任何提示或想法为什么以及如何改进doc2vec结果?

更新:这就是doc2vec_tagged_documents的创建方式:

doc2vec_tagged_documents = list()
counter = 0
for document in documents:
    doc2vec_tagged_documents.append(TaggedDocument(document, [counter]))
    counter += 1

关于我的数据的更多事实:

  • 我的培训数据包含4000个文档
  • 平均900字。
  • 我的词汇量大约是1000字。
  • 我的分类任务数据平均要小得多(平均12个字),但我也尝试将训练数据分成几行并训练doc2vec这样的模型,但结果几乎相同
  • 我的数据关于自然语言,请记住这一点。

1 个答案:

答案 0 :(得分:9)

求和/平均word2vec向量通常非常好!

更常见的是使用Doc2Vec进行10次或20次迭代,而不是继承自Word2Vec的默认值5。 (不过我看到你试过了。)

如果您的主要兴趣是doc-vectors - 而不是在某些Doc2Vec模式中共同训练的单词向量 - 那么也一定要尝试PV-DBOW模式(dm=0)。它训练得更快,通常是表现最好的。

如果您的语料库非常小,或者文档非常短,那么doc-vectors可能很难变得普遍有意义。 (在某些情况下,减少向量size可能会有所帮助。)但是,如果window占平均文档大小的很大一部分,那么通过单词向量学习的内容是什么?通过doc-vectors学到的非常非常相似。而且由于这些词语可能会被更多次训练,在更多样化的语境中,它们可能具有更广泛的含义 - 除非你有更多的较长文档。

有时有助于改进Doc2Vec载体以进行分类的其他内容:

  • 在训练结束时重新推断所有文档向量,甚至可能使用不同于infer_vector()默认值的参数,例如infer_vector(tokens, steps=50, alpha=0.025) - 虽然速度很慢,但这意味着所有文档都获得了向量从相同的最终模型状态,而不是批量训练剩下的东西

  • 已知分类标签,将其添加为经过培训的doc-tag,使用TaggedDocument tags的功能作为标签列表

  • 罕见的单词基本上只是对Word2Vec或Doc2Vec的噪音 - 所以高于1的min_count,或许显着更高,通常会有所帮助。 (混合的单身单词可能对单个doc-ID doc-vector特别有害,因为,设计,单身。训练过程,在竞争中doc-vector,试图让那些单例单词向量预测他们的单文档邻域...当真的,为了你的目的,你只是希望 doc-vector 是最具描述性的。所以这个建议尝试PV-DBOW,并增加min_count。)

希望这会有所帮助。