在gensim.similarities.index中了解AnnoyIndexer的most_like方法

时间:2018-08-17 21:27:50

标签: python nlp gensim word2vec annoy

因此,我做了一个AnnoyIndexer,并且正在运行一些most_like查询,以查找300维向量空间中某些向量的最近邻居。这是它的代码:

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?这样确定之后,最大/最小距离肯定都弄乱了吗?

1 个答案:

答案 0 :(得分:2)

来自gensim的文档:

"List of most similar items in format [(`item`, `cosine_distance`), ...]"

由AnnoyIndex返回的距离是向量之间的欧式距离。因此,该方法需要将欧氏距离转换为余弦距离。余弦距离等于1 - e/2,其中e是欧氏距离值,因此是变换。有关等价的推导,请参见this

还要注意,此变换不会改变值之间的序数关系,请考虑0 < d1 < d2 < 1然后考虑d1/2 < d2/21 - d1/2 < 1 - d2/2,因此如果d1是{{ o1的1}}和d2,然后在变换之后,o2的查询向量比o1更近。