问题描述
我观察到当我在一个单词的get_sentence_vector()和get_word_vector()之间切换时,相似性是相同的。例如,我可以在计算embedding_2或embedding_3时切换此方法,但embedding_2和embedding_3并非正常,这很奇怪:
from scipy.spatial.distance import cosine
import numpy as np
import fasttext
import fasttext.util
# download an english model
fasttext.util.download_model('en',if_exists='ignore') # English
model = fasttext.load_model('cc.en.300.bin')
# Getting word vectors for 'one' and 'two'.
embedding_1 = model.get_sentence_vector('baby dog')
embedding_2 = model.get_word_vector('puppy')
embedding_3 = model.get_sentence_vector('puppy')
def cosine_similarity(embedding_1,embedding_2):
# Calculate the cosine similarity of the two embeddings.
sim = 1 - cosine(embedding_1,embedding_2)
print('Cosine similarity: {:.2}'.format(sim))
# compare the embeddings
cosine_similarity(embedding_1,embedding_2)
# compare the embeddings
cosine_similarity(embedding_1,embedding_3)
# Checking if the two approaches yield the same result.
is_equal = np.array_equal(embedding_2,embedding_3)
# Printing the result.
print(is_equal)
如果我切换方法,相似度始终为0.76,但is_equal为false。我有两个问题:
(1)我可能必须对短语使用get_sentence_vector(),但是就单词而言,应该使用哪一个?当我为一个单词调用get_sentence_vector()时会发生什么?
(2)我使用fasttext是因为它可以处理词汇量,使用fasttext的嵌入进行余弦相似度比较是一个好主意吗?
解决方法
-
您应该将
get_word_vector
用于单词,将get_sentence_vector
用于句子。get_sentence_vector
将每个单词向量除以其范数,然后取平均值。如果您对更多详细信息感兴趣,请阅读this。 -
由于fastText提供矢量表示,因此最好使用此矢量来比较单词和句子。