gensim word2vec条目大于1

时间:2019-07-31 18:49:40

标签: python nlp gensim word2vec

我是NLP和gensim的新手,目前正尝试使用gensim word2vec模块解决一些NLP问题。我目前对word2vec的理解,结果向量/矩阵的所有条目都应在-1和1之间。但是,尝试将一个简单的结果输入到具有大于1的条目的向量中。我不确定哪一部分是错误的有人给一些建议吗?

我已经使用gensim utils.simple_preprocess生成令牌列表的列表。列表如下:

[['buffer', 'overflow', 'in', 'client', 'mysql', 'cc', 'in', 'oracle', 'mysql', 'and', 'mariadb', 'before', 'allows', 'remote', 'database', 'servers', 'to', 'cause', 'denial', 'of', 'service', 'crash', 'and', 'possibly', 'execute', 'arbitrary', 'code', 'via', 'long', 'server', 'version', 'string'], ['the', 'xslt', 'component', 'in', 'apache', 'camel', 'before', 'and', 'before', 'allows', 'remote', 'attackers', 'to', 'read', 'arbitrary', 'files', 'and', 'possibly', 'have', 'other', 'unspecified', 'impact', 'via', 'an', 'xml', 'document', 'containing', 'an', 'external', 'entity', 'declaration', 'in', 'conjunction', 'with', 'an', 'entity', 'reference', 'related', 'to', 'an', 'xml', 'external', 'entity', 'xxe', 'issue']]

我相信这是gensim word2vec的正确输入格式。

word2vec = models.word2vec.Word2Vec(sentences, size=50, window=5, min_count=1, workers=3, sg=1)
vector = word2vec['overflow']
print(vector)

我希望输出结果是一个包含概率的向量(即,介于-1和1之间),但实际上结果如下:

[ 0.12800379 -0.7405527  -0.85575     0.25480416 -0.2535793   0.142656
 -0.6361196  -0.13117172  1.1251501   0.5350017   0.05962601 -0.58876884
  0.02858278  0.46106443 -0.22623934  1.6473309   0.5096218  -0.06609935
 -0.70007527  1.0663376  -0.5668168   0.96070313 -1.180383   -0.58649933
 -0.09380565 -0.22683378  0.71361005  0.01779896  0.19778453  0.74370056
 -0.62354785  0.11807996 -0.54997736  0.10106519  0.23364201 -0.11299669
 -0.28960565 -0.54400533  0.10737313  0.3354464  -0.5992898   0.57183135
 -0.67273194  0.6867607   0.2173506   0.15364875  0.7696457  -0.24330224
  0.46414775  0.98163396]

您可以看到上面的向量中有1.6473309-1.180383

1 个答案:

答案 0 :(得分:0)

不是的情况是,单个单词向量的所有尺寸都在-1.01.0之间。

也不应该将维度解释为“概率”。

而是,学习单词向量,使得内部神经网络在根据周围单词预测单词时变得尽可能好。在训练过程中没有任何约束或规范化,可以将各个维度强制限制在一个范围内,或者使各个维度可解释为可命名的质量。

有时候,在相互比较之前,在训练后将此类向量转换为标准化单位长度的向量。此外,当您请求两个向量之间的余弦相似度时,结果将始终在-1.01.0的范围内。并且,在执行非常常见的most_similar()操作(或类似操作)之前,具有批量单位归一化向量的Word2Vec类在内部进行缓存。

但是,根据model.wv['overflow']直接请求原始单词向量,将返回原始向量,无论原始总体大小如何,以及来自训练的维度值。您可以使用以下命令来请求以单位为单位的向量:

model.wv.word_vec('overflow', use_norm=True)

(另外请注意:在小型玩具大小的数据集上测试Word2Vec通常不会获得有用或现实的结果:该算法确实需要大量不同的数据才能得出平衡且有用的单词向量。例如,要训练50维向量,我希望词汇表中至少有2500个唯一的单词,每个单词有数十种不同的用法-因此,一个包含数万个单词的语料库。默认epochs=5,因为它仍然是一个很小的语料库。)