【发布时间】:2019-05-14 12:06:29
【问题描述】:
我正在研究具有以下用例的句子相似度算法:给定一个新句子,我想从给定集合中检索其 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]
【问题讨论】:
-
d2v_model.docvecs.most_similar()始终用于在训练期间使用的文档中查找最接近的匹配项。您是否还想搜索增量和连续到达的新培训后文档的问题?您能否偶尔使用所有文档(原始文档和新文档)从头开始重新训练模型? -
@gojomo 我在我的问题中添加了一些代码,以更好地解释我在这里尝试做的事情。我想在其中找到匹配项的文档是我的训练数据集的一个子集——这就是我不能使用
model.docvecs.most_similar()的原因。 -
所以,您已经用 N 个文档训练了一个
Doc2Vec模型,但只想针对 M 个文档的一些较小子集执行most_similar(),其中 M -
@gojomo 就是这样!
标签: python gensim similarity doc2vec sentence-similarity