Почему моё косинусное сходство всегда положительное? (FastText) - PullRequest
0 голосов
/ 25 марта 2020

Я пытаюсь оценить косинусное сходство двух векторов, представляющих слова. Я использую предварительно обученные векторы слов из fasttext. Теперь мне интересно, почему мое косинусное сходство всегда является положительным числом, независимо от того, какое слово я использую. Любые предложения?

Вот эта часть моего кода. a и b - векторы слов.

def cos_sim(a, b):
   dot_product = np.dot(a, b)
   norm_a = np.linalg.norm(a)
   norm_b = np.linalg.norm(b)
   return dot_product / (norm_a * norm_b)

Буду рад, если кто-нибудь сможет мне помочь, поскольку я все еще на начальном уровне.

1 Ответ

0 голосов
/ 26 марта 2020

Я не уверен, какой набор данных быстрого текста вы используете, но я скачал вики-новости размером 1M, 300 из здесь , и, используя приведенный ниже пример кода, я определил отрицательное косинусное сходство.

Так что, возможно, вам просто нужно попытаться найти больше векторов слов, хотя я не думаю, что вы делаете что-то неправильно как таковое.

import io
import numpy as np
from sklearn.metrics.pairwise import cosine_similarity

ffp = "/path/to//wiki-news-300d-1M.vec"

def load_vectors(fname):
    fin = io.open(fname, 'r', encoding='utf-8', newline='\n', errors='ignore')
    n, d = map(int, fin.readline().split())
    data = {}
    for ix, line in enumerate(fin):
        tokens = line.rstrip().split(' ')
        data[tokens[0]] = list(map(float, tokens[1:]))

        if ix > 1000:
            break
    return data

data = load_vectors(ffp)
word_vectors = np.asarray(list(data.values()))

r = cosine_similarity(word_vectors[300:500, :], word_vectors[100:200])

print(r.min())
print(np.count_nonzero(r < 0))
...