我正在尝试评估代表单词的两个向量的余弦相似度。我正在使用来自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)
[如果有人能帮助我,我会很高兴,因为我仍处于初学者的水平。
[我不确定您使用的是哪个快速文本数据集,但是我从here下载了一个1M,300维的Wiki新闻,并使用下面的示例代码定义了一些负余弦相似度。
所以您可能只需要尝试更多的单词向量,但我认为您没有做错任何事情。
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))