2

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

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

我成功地对 word2vec 和 doc2vec 使用了word-mover 距离,但是在使用余弦相似度时,我得到了更好的 doc2vec 结果。如何使用 PV-DBOW Doc2Vec 模型和类 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]
4

1 回答 1

0

例如,创建自己的向量子集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

于 2019-05-20T18:34:31.627 回答