比较NumPy数组的相似性

时间:2019-07-05 19:33:03

标签: python numpy gensim

我有一个目标形状为(300,)的NumPy数组和一组形状也为(300,)的候选数组。这些数组是单词的Word2Vec表示形式。我正在尝试使用其向量表示法找到与目标单词最相似的候选单词。找到与目标单词最相似的候选单词的最佳方法是什么?

一种方法是对目标词和候选词之间的逐元素差异的绝对值求和,然后选择具有最低绝对绝对值的候选词。例如:

candidate_1_difference = np.subtract(target_vector, candidate_vector)
candidate_1_abs_difference = np.absolute(candidate_1_difference)
candidate_1_total_difference = np.sum(candidate_1_abs_difference)

但是,这似乎很笨拙,而且可能是错误的。有什么更好的方法?

编辑以包含示例向量:

import numpy as np
import gensim

path = 'https://s3.amazonaws.com/dl4j-distribution/GoogleNews-vectors-negative300.bin.gz'


def func1(path):
    #Limited to 50K words to reduce load time
    model = gensim.models.KeyedVectors.load_word2vec_format(path, binary=True, limit=50000)
    context =  ['computer','mouse','keyboard']
    candidates = ['office','house','winter']
    vectors_to_sum = []
    for word in context:
        vectors_to_sum.append(model.wv[word])
    target_vector = np.sum(vectors_to_sum)

    candidate_vector = candidates[0]
    candidate_1_difference = np.subtract(target_vector, candidate_vector)
    candidate_1_abs_difference = np.absolute(candidate_1_difference)
    candidate_1_total_difference = np.sum(candidate_1_abs_difference)
    return candidate_1_total_difference

1 个答案:

答案 0 :(得分:1)

您所拥有的基本上是正确的。您正在计算L1范数,它是绝对差之和。另一个更常见的选择是计算欧几里得范数或L2-范数,这是平方和的平方根的熟悉的距离度量。

您可以使用numpy.linalg.norm来计算不同的范数,默认情况下,它们会计算矢量的L-2范数。

distance = np.linalg.norm(target_vector - candidate_vector)

如果列表中存储了一个目标向量和多个候选向量,以上方法仍然有效,但是您需要指定范数轴,然后获得一个范数向量,每个候选向量一个。

有关候选向量的列表:

distance = np.linalg.norm(target_vector - np.array(candidate_vector), axis=1)