如何使用 Gensim doc2vec 执行高效查询?

How to perform efficient queries with Gensim doc2vec?

我正在研究具有以下用例的句子相似度算法:给定一个新句子,我想从给定的集合中检索它的 n 个最相似的句子。我使用的是 Gensim v.3.7.1,我已经训练了 word2vec 和 doc2vec 模型。后者的结果优于 word2vec,但我在使用 Doc2Vec 模型执行高效查询时遇到了问题。该模型使用分布式词袋实现(dm = 0)。

我曾经使用内置方法 model.most_similar() 来推断相似性,但是一旦我开始使用比我想要查询的数据更多的数据进行训练,这是不可能的。也就是说,我想在我的训练数据集中的一个子集中找到最相似的句子。我对此的快速修复是使用余弦相似度将新句子的向量与我的集合中的每个向量进行比较,但显然这不能缩放,因为我必须计算嵌入负载并进行大量比较。

我成功使用了word-mover distance for both of word2vec and doc2vec, but I get better results for doc2vec when using cosine similarity. How can I efficiently query a new document against my set using the PV-DBOW Doc2Vec model and a method from 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(即使您正在使用 doc-vectors)。我还没有对此进行测试,但假设 d2v_model 是您的 Doc2Vec 模型,并且 list_of_tags 是您想要在子集中使用的标签,请尝试类似:

subset_vectors = WordEmbeddingsKeyedVectors(vector_size)
subset_vectors.add(list_of_tags, d2v_model.docvecs[list_of_tags])

然后您可以执行常规操作,例如 most_similar() on subset_vectors