iNi*_*kkz 5 similarity python-3.x gensim doc2vec
我试图找出两个文档之间的相似性。我正在使用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)
Run Code Online (Sandbox Code Playgroud)
我也尝试过dm和dbow。与dbow相比, dm给出了更好的结果(相似度分数)。我理解dm 与 dbow的概念。但不知道哪种方法适合两个文档之间的相似性度量。
第一个问题:哪种方法在相似性方面表现最好?
model.wv.n_similarity(<words_1>, <words_2>)使用词向量给出相似度得分。
model.docvecs.similarity_unseen_docs(model, doc1, doc2)使用文档向量给出相似性得分,其中 doc1 和 doc2 不是标签/或文档标签的索引。每个 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提供标签上的相似度分数,而不是属于其标签的实际单词的相似度分数。我不确定,如果我错了,请纠正我。
如何将余弦相似度得分转换为概率?
谢谢。
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)
Run Code Online (Sandbox Code Playgroud)
PV-DM 模式(dm=1,默认)和PV-DBOW 模式(dm=0)都可以很好地工作。哪个更好取决于您的数据和目标。一旦您拥有了一种可靠的方法来定量评估模型结果的质量,对于您的项目目标 \xe2\x80\x93,您将希望能够调整模型的所有元参数,包括 DM/DBOW 模式 \xe2\x80\x93 您可以而且应该尝试两者。
PV-DBOW 训练速度很快,并且通常在简短的文档(几十个单词)上效果很好。但请注意,此模式不会训练可用的词向量,除非您还添加该dbow_words=1选项,这会减慢训练速度。
使用model.wv.n_similarity()仅依赖于词向量。它对每组 f 个词向量进行平均,然后报告这两个平均值之间的余弦相似度。(因此,它仅在 PV-DM 模式或dbow_words=1激活的 PV-DBOW 下才有意义。
使用model. docvecs.similarity_unseen_docs()useinfer_vector()将每个提供的文档视为新文本,并为其计算真正的Doc2Vec文档向量(而不仅仅是词向量的平均值)。(此方法适用于单词列表,而不是标签列表。)
哪个更好是您应该针对您的目标进行测试的东西。平均词向量是一种更简单、更快速的技术,用于制作文本向量 \xe2\x80\x93,但对于很多用途来说仍然可以正常工作。推断的文档向量需要更长的时间来计算,但如果有一个好的模型,对于某些任务可能会更好。
\n\n关于您的设置的其他注意事项:
\n\n通常,设置min_count低至 2 是一个坏主意:那些罕见的单词没有足够的例子来表达很多意思,并且实际上会干扰周围单词的质量
Doc2Vec与已发布的结果(通常使用数万到数百万个文档)相比,10k 个文档对于训练语料库来说偏小。
已发表的结果通常使用 10-20 个训练时期(尽管更多,例如您选择的 50 个,可能会有所帮助,特别是对于较小的语料库)
在典型的多核机器上workers=1会比默认的慢得多(workers=3);在具有 8 个或更多核心的机器上,最多通常workers=8是一个好主意。(不过,除非使用更新的corpus_file输入选项,否则最多workers16 个、32 个等核心数量并没有帮助。)
经典Doc2Vec用法不会只为文档分配已知标签(如“10 个字符串类型的标签”),而是为每个文档分配唯一的 ID。在某些情况下,使用或添加已知标签作为标签可能会有所帮助,但请注意,如果您只提供 10 个标签,那么您实际上已经将 10,000 个文档变成了 10 个文档(从模型的角度来看)视图,它会看到具有相同标签的所有文本,就好像它们是具有该标签的一个较大文档的片段)。在普通的 PV-DBOW 中,仅从 10 个不同的示例中训练 10 个文档向量,每个向量有 100 个维度,这没有多大意义:它很容易出现严重的过度拟合。(在带有 的 PV-DM 或 PV-DBOW 中dbow_words,模型同时训练 10 个文档向量和数百/数千个其他词汇-词向量这一事实将有助于抵消过度拟合的风险。)
| 归档时间: |
|
| 查看次数: |
2841 次 |
| 最近记录: |