代码之家  ›  专栏  ›  技术社区  ›  Bram Vanroy

0和1之间的余弦相似性

  •  0
  • Bram Vanroy  · 技术社区  · 7 年前

    我对计算向量之间的相似性很感兴趣,但是这种相似性必须是一个介于0和1之间的数字。关于tf-idf和余弦相似性有许多问题,都表明该值介于0和1之间。从 Wikipedia :

    在信息检索的情况下,二者的余弦相似性 tfidf权重)不能为负。两项之间的夹角

    model_a 还有一句话 model_b 就像这样

    import gensim as gs
    from sklearn.metrics.pairwise import cosine_similarity
    
    model_a = gs.models.KeyedVectors.load_word2vec_format(model_a_path, binary=False)
    model_b = gs.models.KeyedVectors.load_word2vec_format(model_b_path, binary=False)
    
    vector_a = model_a[word_a].reshape(1, -1)
    vector_b = model_b[word_b].reshape(1, -1)
    
    sim = cosine_similarity(vector_a, vector_b).item(0)
    

    但是 sim 是[-1,1]范围内的相似性度量。有没有一种科学合理的方法将其映射到[0,1]范围?直觉上我认为

    norm_sim = (sim + 1) / 2
    

    是可以的,但我不确定这是否是良好的做法,就实际意义上的余弦相似性。如果没有,是否建议使用其他相似性度量?

    0 回复  |  直到 6 年前
        1
  •  4
  •   gojomo    6 年前

    这些值不再是真正的全方位角,这就不一定重要了。(如果算法需要真实的角度,它可以在-1.0到1.0之间工作。)

    使用无符号绝对值将是一个坏主意,因为它会改变相似性的排名顺序,将一些“本机”最不相似的结果向上移动。

    https://cs.cmu.edu/~bmurphy/NNSE/ )但是,gensim不支持这个变体,只有尝试它才能揭示它是否适合任何特定的项目。

    https://arxiv.org/abs/1702.01417v2

        2
  •  0
  •   inverted_index    6 年前

    只是更新了@gojomo的答案,我认为你需要有可解释的单词嵌入,其中包含 非阴性

    本文是解决这个问题的一个很好的开端: https://www.aclweb.org/anthology/D15-1196