我是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
。
答案 0 :(得分:0)
不是的情况是,单个单词向量的所有尺寸都在-1.0
和1.0
之间。
也不应该将维度解释为“概率”。
而是,学习单词向量,使得内部神经网络在根据周围单词预测单词时变得尽可能好。在训练过程中没有任何约束或规范化,可以将各个维度强制限制在一个范围内,或者使各个维度可解释为可命名的质量。有时候,在相互比较之前,在训练后将此类向量转换为标准化单位长度的向量。此外,当您请求两个向量之间的余弦相似度时,结果将始终在-1.0
至1.0
的范围内。并且,在执行非常常见的most_similar()
操作(或类似操作)之前,具有批量单位归一化向量的Word2Vec
类在内部进行缓存。
但是,根据model.wv['overflow']
直接请求原始单词向量,将返回原始向量,无论原始总体大小如何,以及来自训练的维度值。您可以使用以下命令来请求以单位为单位的向量:
model.wv.word_vec('overflow', use_norm=True)
(另外请注意:在小型玩具大小的数据集上测试Word2Vec
通常不会获得有用或现实的结果:该算法确实需要大量不同的数据才能得出平衡且有用的单词向量。例如,要训练50维向量,我希望词汇表中至少有2500个唯一的单词,每个单词有数十种不同的用法-因此,一个包含数万个单词的语料库。默认epochs=5
,因为它仍然是一个很小的语料库。)