Python 了解gensim.complications.index中索引器的最相似方法
所以我做了一个索引器,运行一些最相似的查询,在300维向量空间中找到一些向量的最近邻。这是它的代码:Python 了解gensim.complications.index中索引器的最相似方法,python,nlp,gensim,word2vec,annoy,Python,Nlp,Gensim,Word2vec,Annoy,所以我做了一个索引器,运行一些最相似的查询,在300维向量空间中找到一些向量的最近邻。这是它的代码: def most_similar(self, vector, num_neighbors): """Find the approximate `num_neighbors` most similar items. Parameters ---------- vector : numpy.array Vector for word/document.
def most_similar(self, vector, num_neighbors):
"""Find the approximate `num_neighbors` most similar items.
Parameters
----------
vector : numpy.array
Vector for word/document.
num_neighbors : int
Number of most similar items
Returns
-------
list of (str, float)
List of most similar items in format [(`item`, `cosine_distance`), ... ]
"""
ids, distances = self.index.get_nns_by_vector(
vector, num_neighbors, include_distances=True)
return [(self.labels[ids[i]], 1 - distances[i] / 2) for i in range(len(ids))]
我想知道为什么距离的返回值都是从1开始,然后除以2?当然,在这样做之后,最大/最小距离都被弄乱了?来自gensim的文档:
"List of most similar items in format [(`item`, `cosine_distance`), ...]"
索引返回的距离是向量之间的欧几里德距离。因此,该方法需要将欧氏距离转换为余弦距离。余弦距离等于1-e/2
,其中e
是欧氏距离值,因此转换。有关等效性的推导,请参见
还注意到这种转换不会改变值之间的顺序关系,考虑<代码> 0 D1<D2<1 < /代码>然后<代码> d1/2 < d2/2 < /> >和<代码> 1 -d1/2 < 1 -d2/2 < /代码>因此,如果
d1
是o1
和o2
的d2
之间的距离,那么在转换后o1
仍然比o2更接近查询向量,谢谢你的回答,这真的很有帮助。我不明白的一点是,如果它返回向量之间的余弦距离,为什么它会给WordEmbeddingSkeyeAdvectors类中使用COSADD方法的最相似的方法带来不同的结果?COSADD方法不也只是找到余弦距离吗?WordEmbeddingSkeyeAdvectors中最相似的函数返回余弦相似性,余弦距离=1-余弦相似性。有关欧几里得距离、余弦距离和余弦相似性之间关系的更多信息,请参见上的wikipedia条目。