在2个不同的Word2Vec模型中单个单词的余弦相似度计算

时间:2018-09-11 13:43:29

标签: python-3.x gensim word2vec word-embedding

我使用gensim构建了两个单词嵌入(word2vec模型),并使用model.save(model_name)命令将其保存为(word2vec1和word2vec2),用于两个不同的语料库(两个语料库有些相似,相似的意思)它们之间的关系就像一本书的第一部分和第二部分一样。假设两个语料库的头几个词(按照频率或出现的顺序)是同一个词(假设为a)。

对于两个word2vec模型,如何计算提取的最高单词(例如'a')的相似度(cosine-similarity or similarity)? most_similar()在这种情况下是否有效?

我想知道在两个相似的生成模型中,同一个词与(a)有多少相似程度?

任何想法都会受到赞赏。

1 个答案:

答案 0 :(得分:2)

您似乎对word2vec有错误的认识。它没有为一个单词提供一个绝对矢量。它设法找到一个单词相对于其他单词的表示形式。因此,对于同一个语料库,如果您运行word2vec两次,您将为同一个单词获得2个不同的向量。当您将其与其他单词向量进行比较时,含义就出现了。

king-man将永远与queen-woman接近(余弦相似度明智),无论您训练了多少次。但是每列火车之后它们的向量将不同。

在您的情况下,由于两个模型的训练方式不同,所以比较同一单词的向量与比较两个随机向量是相同的。您应该比较一下相对关系。也许是这样的:model1.most_similar('dog')model2.most_similar('dog')

但是,要回答您的问题,如果要比较两个向量,可以按以下方法进行。但是结果将毫无意义。

只需从每个模型中提取向量并手动计算余弦相似度即可。

vec1 = model1.wv['computer']
vec2 = model2.wv['computer']
print(np.sum(vec1*vec2)/(np.linalg.norm(vec1)*np.linalg.norm(vec2)))