我正在尝试找出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>)
答案 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是一个不好的主意:那些稀有单词没有足够的例子说明很多意思,实际上会干扰周围单词的质量
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个文档向量和成千上万的其他词汇词向量,这将有助于抵消过度拟合的风险。)