我正在研究具有以下用例的句子相似度算法:给定一个新句子,我想从给定的集合中检索它的 n 个最相似的句子。我使用的是 Gensim v.3.7.1,我已经训练了 word2vec 和 doc2vec 模型。后者的结果优于 word2vec,但我在使用 Doc2Vec 模型执行高效查询时遇到了问题。该模型使用分布式词袋实现(dm = 0)。
我过去常常使用内置方法 model.most_similar()
来推断相似性,但是一旦我开始使用比我想要查询的数据更多的数据进行训练,这是不可能的。也就是说,我想在我的训练数据集的一个子集中找到最相似的句子。我对此的快速解决方法是使用余弦相似度将新句子的向量与我的集合中的每个向量进行比较,但显然这无法扩展,因为我必须计算嵌入负载并进行大量比较。
我成功使用word-mover distance对于 word2vec 和 doc2vec,但是当使用余弦相似度时,我对 doc2vec 得到了更好的结果。我如何使用 PV-DBOW Doc2Vec 模型和来自 class Similarity 的方法针对我的集合高效查询新文档?
我正在寻找与我对 WMD 所做的类似的方法,但对于 doc2vec 余弦相似性:
# set_to_query contains ~10% of the training data + some future updates
set_to_query_tokenized = [sentence.split() for sentence in set_to_query]
w2v_model = gensim.models.Word2Vec.load("my_w2v_model")
w2v_to_query = gensim.similarities.WmdSimilarity(
corpus = set_to_query_tokenized,
w2v_model = w2v_model,
num_best=10
)
new_query = "I want to find the most similar sentence to this one".split()
most_similar = w2v_to_query[new_query]
最佳答案
创建您自己的向量子集,作为 KeyedVectors
实例,并不像它可以或应该的那样容易。
但是,您应该能够使用只加载感兴趣的向量的 WordEmbeddingsKeyedVectors
(即使您使用的是文档向量)。我还没有测试过这个,但假设 d2v_model
是你的 Doc2Vec
模型,而 list_of_tags
是你想要在你的子集中的标签,试试像:
subset_vectors = WordEmbeddingsKeyedVectors(vector_size)
subset_vectors.add(list_of_tags, d2v_model.docvecs[list_of_tags])
然后您可以执行常规操作,例如 subset_vectors
上的 most_similar()
。
关于python - 如何使用 Gensim doc2vec 执行高效查询?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56130065/