我正在使用Word2vec通过gensim与谷歌的预先训练向量谷歌新闻。我注意到,通过对Word2Vec
对象执行直接索引查找可以访问的字向量不是单位向量:
>>> import numpy
>>> from gensim.models import Word2Vec
>>> w2v = Word2Vec.load_word2vec_format('GoogleNews-vectors-negative300.bin', binary=True)
>>> king_vector = w2v['king']
>>> numpy.linalg.norm(king_vector)
2.9022589
但是,在^{.syn0norm
属性的规范化版本,该属性只包含单位向量:
>>> w2v.init_sims()
>>> unit_king_vector = w2v.syn0norm[w2v.vocab['king'].index]
>>> numpy.linalg.norm(unit_king_vector)
0.99999994
较大的矢量只是单位矢量的放大版本:
>>> king_vector - numpy.linalg.norm(king_vector) * unit_king_vector
array([ 0.00000000e+00, -1.86264515e-09, 0.00000000e+00,
0.00000000e+00, -1.86264515e-09, 0.00000000e+00,
-7.45058060e-09, 0.00000000e+00, 3.72529030e-09,
0.00000000e+00, 0.00000000e+00, 0.00000000e+00,
0.00000000e+00, 0.00000000e+00, 0.00000000e+00,
0.00000000e+00, 0.00000000e+00, 0.00000000e+00,
0.00000000e+00, 0.00000000e+00, 0.00000000e+00,
... (some lines omitted) ...
-1.86264515e-09, -3.72529030e-09, 0.00000000e+00,
0.00000000e+00, 0.00000000e+00, 0.00000000e+00,
0.00000000e+00, 0.00000000e+00, 0.00000000e+00,
0.00000000e+00, 0.00000000e+00, 0.00000000e+00], dtype=float32)
鉴于Word2Vec中的单词相似度比较是由cosine similarity完成的,所以我并不清楚非正规化向量的长度意味着什么——尽管我假设它们的意思是某物,因为gensim将它们公开给我,而不是只公开.syn0norm
中的单位向量。
这些非标准化的Word2vec向量的长度是如何生成的,它们的含义是什么?对于什么样的计算,使用正规化向量是有意义的,什么时候应该使用非正规化向量?
我会为事先的罗嗦道歉。
词嵌入模型的目标函数是最大化模型下的数据日志似然。在word2vec中,这是通过最小化给定单词上下文的单词的预测向量(使用上下文)和实际向量(当前表示)的
dot product
(用softmax
规范化)来实现的。注意,训练单词向量的任务要么是预测上下文给定的单词,要么是单词给定的上下文(
skip-gram
vscbow
)。单词向量的长度本身没有意义,但是向量本身具有有趣的特性/应用。要查找相似的词,可以查找具有最大余弦相似性的词(相当于在对向量进行单位规格化后查找具有最小欧氏距离的词,请检查link),而^{} 函数正在执行此操作。
要找到类比,我们可以简单地使用词向量的原始向量表示之间的差(或方向)向量。例如
在
gensim
中参考文献:
将答案复制到相关的(尚未答复的question)
我认为你正在寻找的答案是阿德里安·沙克尔和本杰明·威尔逊在2015年的论文Measuring Word Significance using Distributed Representations of Words中描述的。要点:
相关问题 更多 >
编程相关推荐