gensim word2vec 条目大于 1
gensim word2vec entry greater than 1
我是 NLP 和 gensim 的新手,目前正在尝试使用 gensim word2vec 模块解决一些 NLP 问题。我目前对 word2vec 的理解,结果 vectors/matrix 应该包含 -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]
可以看到上面的vector中有1.6473309
和-1.180383
不是情况,单个词向量的所有维度都在 -1.0
和 1.0
之间。
也不应将维度解释为 "probabilities"。
相反,学习词向量使得内部神经网络在根据周围词预测词方面变得尽可能好。在训练过程中没有约束或规范化将各个维度强制到一个限制范围内,或者使各个维度可以解释为可命名的品质。
有时会在训练后将此类向量转换为归一化单位长度的向量,然后再相互比较。此外,当您请求两个向量之间的余弦相似度时,结果将始终在 -1.0
到 1.0
的范围内。并且,在执行非常常见的 most_similar()
操作(或类似操作)之前,Word2Vec
class 带有批量单位规范化向量并在内部缓存结果。
但是,根据 model.wv['overflow']
直接要求原始词向量,return 原始向量将具有来自训练的任何原始总体大小和每个维度值。您可以使用以下方式请求单位规范向量:
model.wv.word_vec('overflow', use_norm=True)
(另外请注意:在微型玩具大小的数据集上测试 Word2Vec
通常不会获得有用或现实的结果:该算法确实需要大量多样的数据才能得出平衡、有用的词向量。例如,要训练 50 维向量,我需要词汇表中至少有 2,500 个不同的词,每个词有几十种不同的用法——所以语料库有数万个词。我可能还会使用超过默认 epochs=5
,因为那仍然是一个非常小的语料库。)
我是 NLP 和 gensim 的新手,目前正在尝试使用 gensim word2vec 模块解决一些 NLP 问题。我目前对 word2vec 的理解,结果 vectors/matrix 应该包含 -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]
可以看到上面的vector中有1.6473309
和-1.180383
不是情况,单个词向量的所有维度都在 -1.0
和 1.0
之间。
也不应将维度解释为 "probabilities"。
相反,学习词向量使得内部神经网络在根据周围词预测词方面变得尽可能好。在训练过程中没有约束或规范化将各个维度强制到一个限制范围内,或者使各个维度可以解释为可命名的品质。
有时会在训练后将此类向量转换为归一化单位长度的向量,然后再相互比较。此外,当您请求两个向量之间的余弦相似度时,结果将始终在 -1.0
到 1.0
的范围内。并且,在执行非常常见的 most_similar()
操作(或类似操作)之前,Word2Vec
class 带有批量单位规范化向量并在内部缓存结果。
但是,根据 model.wv['overflow']
直接要求原始词向量,return 原始向量将具有来自训练的任何原始总体大小和每个维度值。您可以使用以下方式请求单位规范向量:
model.wv.word_vec('overflow', use_norm=True)
(另外请注意:在微型玩具大小的数据集上测试 Word2Vec
通常不会获得有用或现实的结果:该算法确实需要大量多样的数据才能得出平衡、有用的词向量。例如,要训练 50 维向量,我需要词汇表中至少有 2,500 个不同的词,每个词有几十种不同的用法——所以语料库有数万个词。我可能还会使用超过默认 epochs=5
,因为那仍然是一个非常小的语料库。)