Сравнение массивов NumPy на сходство - PullRequest
0 голосов
/ 05 июля 2019

У меня есть целевой массив NumPy с формой (300,) и набором массивов-кандидатов также с формой (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 Ответ

1 голос
/ 05 июля 2019

То, что у вас есть, в основном правильно.Вы рассчитываете 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)
...