cosine_similarity
определяется как скалярное произведение двух нормализованных векторов.
Это по сути матричное умножение, за которым следует argmax
для получения наилучшего индекса.
I 'Я буду использовать numpy
, хотя - как уже упоминалось в комментариях - вы, вероятно, можете подключить его к модели BERT
с pytorch
или tensorflow
.
Сначала мы определим нормализованный средний вектор:
def calculate_avg_norm_vec(sentence):
vs = sentence2vectors(sentence) # TODO: use Bert embedding
vm = vs.mean(axis=0)
return vm/np.linalg.norm(vm)
Затем мы строим матрицу всех предложений и их векторов
X = np.apply_along_axis(calculate_avg_norm_vec, 1, all_sentences)
target = calculate_avg_norm_vec(target_sentence)
Наконец, нам нужно умножить target
вектор с матрицей X
и возьмите argmax
index_of_sentence = np.dot(X,target.T).argmax(axis=1)
Возможно, вы захотите убедиться, что axis
и индексирование соответствуют вашим данным, но это общая схема