python-3.x - 哪种方法 dm 或 dbow 适用于使用 Doc2Vec 的文档相似性?

标签 python-3.x gensim similarity doc2vec

我试图找出 2 个文档之间的相似性。我正在使用 Doc2vec Gensim 围绕训练 10k 文件 .周围有 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 以及。 dm 相比,给出更好的结果(相似度得分) dbow .我理解了的概念dm vs dbow .但是不知道哪种方法对两个文档之间的相似性度量有好处。

第一个问题:哪种方法在相似性上表现最好?
model.wv.n_similarity(<words_1>, <words_2>)使用 给出相似度得分词向量 .
model.docvecs.similarity_unseen_docs(model, doc1, doc2)使用 给出相似度得分文档向量 其中 doc1 和 doc2 不是标签/或 doctags 的索引。每个 doc1 和 doc2 包含 10-20 个词类的句子。

两者 wv.n_similarity docvecs.similarity_unseen_docs 对相同类型的文档提供不同的相似度分数。

docvecs.similarity_unseen_docs 相比,结果略好wv.n_similarity 但是 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>)

最佳答案

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 文档向量( 而不是 仅仅是词的平均值)。 (此方法对单词列表进行操作,而不是对标签列表进行操作。)

哪个更好是你应该为你的目标测试的东西。平均词向量是一种制作文本向量的更简单、更快速的技术——但在很多情况下仍然可以正常工作。推断的 doc-vectors 需要更长的时间来计算,但使用一个好的模型,对于某些任务可能会更好。

关于您的设置的其他注意事项:

  • 经常,将 min_count 设置为 2 是一个坏主意:那些稀有词没有足够的例子来表示很多,实际上干扰了周围词的质量
  • 与已发布的 Doc2Vec 结果(通常使用数万到数百万个文档)相比,
  • 10k 文档对于训练语料库而言偏小。
  • 发布的结果通常使用 10-20 个训练时期(尽管更多,比如您选择的 50 个,可能对较小的语料库尤其有用)
  • 在典型的多核机器上 workers=1 将比默认值( workers=3 )慢得多;在具有 8 个或更多内核的机器上,最多 workers=8 通常是个好主意。 (尽管如此,除非使用较新的 corpus_file 输入选项,否则更多 workers 到 16、32 等内核的完整计数无济于事。)
  • 经典 Doc2Vec 用法不会仅分配已知标签的文档(如“10 字符串类型的标签”),而是分配每个文档的唯一 ID。在某些情况下,使用或添加已知标签作为标签可能会有所帮助,但请注意,如果 只有 提供 10 个标签,那么您实际上已经将 10,000 个文档变成了 10 个文档(从模型 View 的角度来看,将所有具有相同标签的文本视为具有该标签的一个较大文档的片段)。在普通的 PV-DBOW 中,仅训练 10 个 doc-vectors,每个 100 维,从 10 个不同的例子中没有多大意义:它容易出现严重的过度拟合。 (在具有 dbow_words 的 PV-DM 或 PV-DBOW 中,模型同时训练 10 个文档向量和成百上千个其他词汇词向量的事实将有助于抵消过度拟合的风险。)
  • 关于python-3.x - 哪种方法 dm 或 dbow 适用于使用 Doc2Vec 的文档相似性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56323377/

    相关文章:

    python - 如何在 Python 2.x 和 3.x 中使用 doctest 测试异常?

    将文件上传到 REST URL 的 Python 3 脚本(多部分请求)

    python - 精确 <a> 标签值时出错 - BeautifulSoup

    python - Doc2vec:聚类结果向量

    nlp - wmd(词移动距离)和基于 wmd 的相似度有什么区别?

    lucene - 如何在 Lucene 中对类似文档进行评分?

    python - 为什么每次 PyQt5 项目都会收到警告 "QStandardPaths: XDG_RUNTIME_DIR not set"

    nlp - 如何在 gensim 中使用 build_vocab?

    python - 使用 Spacy 计算多个文档相似度的有效方法

    text - 具有 TF-IDF 权重的余弦相似度的系统阈值