余弦相似性 – word2vec,总和或平均字嵌入?
发布时间:2020-12-14 04:38:40 所属栏目:大数据 来源:网络整理
导读:我使用word2vec来表示一个小短语(3到4个单词)作为一个独特的向量,通过添加每个单独的嵌入或通过计算单词嵌入的平均值. 从我做过的实验中,我总是得到相同的余弦相似度.我怀疑它与训练后word2vec生成的单词长度(单位长度(Euclidean norm))有关吗?或者我在代码
我使用word2vec来表示一个小短语(3到4个单词)作为一个独特的向量,通过添加每个单独的嵌入或通过计算单词嵌入的平均值.
从我做过的实验中,我总是得到相同的余弦相似度.我怀疑它与训练后word2vec生成的单词长度(单位长度(Euclidean norm))有关吗?或者我在代码中有BUG,或者我遗漏了一些东西. 这是代码: import numpy as np from nltk import PunktWordTokenizer from gensim.models import Word2Vec from numpy.linalg import norm from scipy.spatial.distance import cosine def pattern2vector(tokens,word2vec,AVG=False): pattern_vector = np.zeros(word2vec.layer1_size) n_words = 0 if len(tokens) > 1: for t in tokens: try: vector = word2vec[t.strip()] pattern_vector = np.add(pattern_vector,vector) n_words += 1 except KeyError,e: continue if AVG is True: pattern_vector = np.divide(pattern_vector,n_words) elif len(tokens) == 1: try: pattern_vector = word2vec[tokens[0].strip()] except KeyError: pass return pattern_vector def main(): print "Loading word2vec model ...n" word2vecmodelpath = "/data/word2vec/vectors_200.bin" word2vec = Word2Vec.load_word2vec_format(word2vecmodelpath,binary=True) pattern_1 = 'founder and ceo' pattern_2 = 'co-founder and former chairman' tokens_1 = PunktWordTokenizer().tokenize(pattern_1) tokens_2 = PunktWordTokenizer().tokenize(pattern_2) print "vec1",tokens_1 print "vec2",tokens_2 p1 = pattern2vector(tokens_1,False) p2 = pattern2vector(tokens_2,False) print "nSUM" print "dot(vec1,vec2)",np.dot(p1,p2) print "norm(p1)",norm(p1) print "norm(p2)",norm(p2) print "dot((norm)vec1,norm(vec2))",np.dot(norm(p1),norm(p2)) print "cosine(vec1,np.divide(np.dot(p1,p2),norm(p2))) print "n" print "AVG" p1 = pattern2vector(tokens_1,True) p2 = pattern2vector(tokens_2,True) print "dot(vec1,norm(p2) print "dot(norm(vec1),norm(p2))) if __name__ == "__main__": main() 这是输出: Loading word2vec model ... Dimensions 200 vec1 ['founder','and','ceo'] vec2 ['co-founder','former','chairman'] SUM dot(vec1,vec2) 5.4008677771 norm(p1) 2.19382594282 norm(p2) 2.87226958166 dot((norm)vec1,norm(vec2)) 6.30125952303 cosine(vec1,vec2) 0.857109242583 AVG dot(vec1,vec2) 0.450072314758 norm(p1) 0.731275314273 norm(p2) 0.718067395416 dot(norm(vec1),norm(vec2)) 0.525104960252 cosine(vec1,vec2) 0.857109242583 我使用的是Cosine Similarity (Wikipedia)中定义的余弦相似度.规范和点积的值确实不同. 谁能解释为什么余弦是一样的? 谢谢, 解决方法
余弦测量两个向量之间的角度,并不考虑任一向量的长度.当您除以短语的长度时,您只是缩短向量,而不是改变其角度位置.所以你的结果对我来说是正确的.
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |