我正在研究具有以下用例的句子相似度算法:给定一个新句子,我想从给定集合中检索其n个最相似的句子。我正在使用Gensim v.3.7.1,并且已经训练了word2vec和doc2vec模型。后者的结果优于word2vec,但我无法在Doc2Vec模型上执行有效的查询。此模型使用分布式词袋实现(dm = 0)。
我曾经使用内置方法model.most_similar()
来推论相似性,但是一旦我开始使用更多要查询的数据进行训练,这是不可能的。也就是说,我想在我的训练数据集的子集中找到最相似的句子。为此,我的快速解决方案是使用余弦相似度将新句子的向量与集合中的每个向量进行比较,但是显然这无法缩放,因为我必须计算嵌入的负载并进行大量比较。
我成功地为{2}和doc2vec都使用了word-mover distance,但是当使用余弦相似度时,对于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]
答案 0 :(得分:0)
创建自己的向量子集(作为<mapping-file></mapping-file>
实例)并不像应该或应该那样容易。
但是,您应该能够使用仅加载感兴趣的向量的KeyedVectors
(即使您正在使用doc-vectors)。我尚未对此进行测试,但是假设WordEmbeddingsKeyedVectors
是您的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()
。