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

Python 如何使用Gensim doc2vec执行高效查询?,python,gensim,similarity,doc2vec,sentence-similarity,Python,Gensim,Similarity,Doc2vec,Sentence Similarity,我正在使用以下用例开发一个句子相似性算法:给定一个新句子,我想从给定的集合中检索它的n个最相似的句子。我正在使用Gensim v.3.7.1,我已经培训了word2vec和doc2vec模型。后者的结果优于word2vec,但我在使用Doc2Vec模型执行高效查询时遇到了问题。该模型使用分布式字袋实现(dm=0) 我曾经使用内置方法model.most_similar(),来推断相似性,但一旦我开始使用更多我想要查询的数据进行训练,这就不可能了。也就是说,我想在我的训练数据集的子集中找到最相似的

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

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

我成功地使用了word2vec和doc2vec,但在使用余弦相似性时,doc2vec的效果更好。如何使用PV-DBOW Doc2Vec模型和来自的方法有效地根据我的集合查询新文档

我正在寻找一种类似于我处理大规模杀伤性武器的方法,但对于doc2vec余弦相似性:

#set_to_查询包含约10%的培训数据+一些未来更新
set_to_query_tokenized=[set_to_query中的句子的句子.split()]
w2v_model=gensim.models.Word2Vec.load(“我的w2v_model”)
w2v_to_query=gensim.complications.WmdSimilarity(
语料库=将\u设置为\u查询\u标记化,
w2v_模型=w2v_模型,
num_best=10
)
new_query=“我想找到与此最相似的句子”。split()
最相似=w2v到查询[新查询]

创建自己的向量子集,作为一个
KeyedVectors
实例,并不像可能或应该的那样容易

但是,您应该能够使用只加载感兴趣的向量的
wordembeddingskeyevectors
(即使您使用的是文档向量)。我没有对此进行测试,但假设
d2v\u model
是您的
Doc2Vec
模型,并且
list\u标签是您想要在子集中使用的标签,请尝试以下操作:

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

然后,您可以对
子集向量
d2v\u model.docvecs执行常规操作,如
most\u similable()
。most\u similable()
始终用于在培训期间使用的文档中查找最接近的匹配项。您是否还希望搜索以增量和连续方式到达的新培训后文档?你能偶尔用所有原始和新文档从头开始重新训练模型吗?@gojomo我在问题中添加了一些代码,以便更好地解释我在这里要做的事情。我想在其中查找匹配项的文档是我的训练数据集的一个子集–这就是为什么我不能使用
model.docvecs.most_-similable()
。因此,您已经用N个文档训练了一个
Doc2Vec
模型,但只想对M个文档的较小子集执行
most_-similable()
,其中M