使用Doc2Vec的哪种dm或dbow方法可以很好地实现文档相似性?

时间:2019-05-27 09:34:46

标签: python-3.x gensim similarity doc2vec

我正在尝试找出2个文档之间的相似性。我正在使用 Doc2vec Gensim 训练 1万个文档。大约有 10种字符串类型的标签。每个标签由一个唯一的单词组成,并包含某种文档。使用分布式存储方法训练模型。

Doc2Vec(alpha=0.025, min_alpha=0.0001, min_count=2, window=10, dm=1, dm_mean=1, epochs=50, seed=25, vector_size=100, workers=1)

我也尝试过 dm dbow 。与 dbow 相比, dm 可以提供更好的结果(相似性得分)。我了解了 dm vs dbow 的概念。但是,不知道哪种方法适合两个文档之间的相似性度量。

第一个问题:哪种方法在相似性方面表现最佳?

model.wv.n_similarity(<words_1>, <words_2>)使用词向量给出相似度得分。

model.docvecs.similarity_unseen_docs(model, doc1, doc2)使用 doc向量给出相似性评分,其中doc1和doc2不是标签/或doctag的索引。 每个doc1和doc2包含10-20个单词的句子。

wv.n_similarity docvecs.similarity_unseen_docs 都对相同类型的文档提供了不同的相似性评分。

wv.n_similarity 相比,

docvecs.similarity_unseen_docs 收效甚微,但 wv.n_similarity 有时也会收效良好。

问题: docvecs.similarity_unseen_docs和wv.n_similarity有什么区别?我可以使用docvecs.similarity_unseen_docs查找未见数据之间的相似度分数吗(这可能是一个愚蠢的问题)?

我之所以这样问,是因为 docvecs.similarity_unseen_docs 提供的是标签的相似度得分,而不是属于其标签的实际单词。我不确定,如果我错了,请在这里纠正。

如何将余弦相似性得分转换为概率?

谢谢。

model = Doc2Vec(alpha=0.025, min_alpha=0.0001, min_count=2, window=10, dm=1, dm_mean=1, epochs=50, seed=25, vector_size=100, workers=4)
# Training of the model
tagged_data = [TaggedDocument(words=_d, tags=[str(i)]) for i, _d in enumerate(<list_of_list_of_tokens>)]
model.build_vocab(tagged_data)
model.train(tagged_data, total_examples=model.corpus_count, epochs=model.epochs)

# Finding similarity score
model.wv.n_similarity(<doc_words1>, <doc_words2>)
model.random.seed(25)
model.docvecs.similarity_unseen_docs(model, <doc_words1>, <doc_words2>)

1 个答案:

答案 0 :(得分:1)

PV-DM模式(默认为dm=1和PV-DBOW模式(dm=0)都可以正常工作。哪个更好取决于您的数据和目标。一旦有了一种可靠的方法来对模型结果的质量进行定量评分,就可以为您的项目目标(您希望能够调整所有模型的元参数,包括DM / DBOW模式)进行调整,您可以并且应该尝试都。

PV-DBOW的训练速度很快,并且在短文档(几十个单词)上通常可以很好地工作。不过请注意,此模式不会训练可用的单词向量除非,您还添加了dbow_words=1选项,这会减慢训练速度。

使用model.wv.n_similarity()仅依赖于单词向量。它将每个集合的f个字向量平均,然后报告这两个平均值之间的余弦相似度。 (因此,仅在PV-DM模式或激活dbow_words=1的PV-DBOW下才有意义。

使用model. docvecs.similarity_unseen_docs()使用infer_vector()将所提供的每个文档都视为新文本,为此,它们的文档真实Doc2Vec为文档矢量(不是 -词向量)。 (此方法适用于单词列表,而不是 标签列表。)

您应该为自己的目标测试哪个更好。词向量的平均值是一种用于制作文本向量的更简单,更快速的技术,但在很多情况下仍然可以正常使用。推断出的文档向量需要更长的时间来计算,但是具有良好的模型,对于某些任务可能会更好。

关于设置的其他说明:

  • 通常,将min_count设置为2是一个不好的主意:那些稀有单词没有足够的例子说明很多意思,实际上会干扰周围单词的质量

    < / li> 与发布的Doc2Vec结果(通常使用成千上万的文档)相比,
  • 1万个文档在训练语料库中占很小的比例。

  • 发布的结果通常会使用10到20个训练时期(不过,如您选择的50个时期,可能会更有用,尤其是对于较小的主体)

  • 在典型的多核计算机workers=1上,
  • 会比默认值(workers=3)慢得多;在具有8个或更多内核的计算机上,通常最好使用workers=8。 (不过,除非使用更新的corpus_file输入选项,否则更多workers(最多16个,32个等)的内核将无济于事。)

  • 经典的Doc2Vec用法不会为文档分配已知标签(如“ 10字符串类型的标签”),而是为每个文档分配唯一的ID。在某些情况下,使用或添加已知的标签作为标签可能会有所帮助,但是请注意,如果仅提供标签,则实际上已将10,000个文档转换为10个文档(从模型的视图,可以看到所有带有相同标签的文本,就像它们是一个带有该标签的较大文档的片段一样)。在普通的PV-DBOW中,仅从10个不同的示例中仅训练10个doc矢量(每个100维)就没有多大意义:容易出现严重的过度拟合。 (在带有dbow_words的PV-DM或PV-DBOW中,该模型同时训练了10个文档向量和成千上万的其他词汇词向量,这将有助于抵消过度拟合的风险。)