Python 与向量最相似的词
我在Gensim中使用了维基百科中预先训练好的单词向量,Python 与向量最相似的词,python,nlp,Python,Nlp,我在Gensim中使用了维基百科中预先训练好的单词向量,“glot-wiki-gigaword-100”。如图所示,您可以使用 model_gigaword.wv.most_similar(positive=['dirty','grimy'],topn=10) 但是,我想查询与指定为数组的给定向量最相似的单词(与预训练模型中的单词向量格式相同)。例如,在预训练模型中加上或减去两个词向量的结果,如 vec = model_gigaword['king']-model_gigaword['man'
“glot-wiki-gigaword-100”
。如图所示,您可以使用
model_gigaword.wv.most_similar(positive=['dirty','grimy'],topn=10)
但是,我想查询与指定为数组的给定向量最相似的单词(与预训练模型中的单词向量格式相同)。例如,在预训练模型中加上或减去两个词向量的结果,如
vec = model_gigaword['king']-model_gigaword['man']
输出:(用于vec
)
如何获得与
vec
最相似的单词?您可以直接将其与model\u gigaword.wv.most\u相似
your_word_vector = np.array([-0.696, -1.26119, -0.49109, 0.91179, 0.23077281,
-0.18835002, -0.65568995, -0.29686698, -0.60074997, -1.35762 ,
-0.11816999, 0.01779997, -0.74096 , 0.21192 , -0.407071 ,
-1.04871 , -0.480674 , -0.95541 , -0.06046999, 0.20678002,
-1.1516 , -0.98955095, 0.44508 , 0.32682198, -0.03306001,
-0.31138003, 0.87721 , 0.34279 , 0.78621 , -0.297459 ,
0.529243 , -0.07398 , 0.551844 , 0.54218 , -0.39394 ,
0.96368 , 0.22518003, 0.05197001, -0.912573 , -0.718755 ,
0.08056 , 0.421177 , -0.34256 , -0.71294 , -0.25391 ,
-0.65362 , -0.31369498, 0.216278 , 0.41873002, -0.21784998,
0.21340999, 0.480393 , 0.47077006, -1.00272 , 0.16624999,
-0.07340002, 0.09219003, -0.02021003, -0.58403 , -0.47306 ,
0.05066001, -0.64416003, 0.80061007, 0.224344 , -0.20483994,
-0.33785298, -1.24589 , 0.08900005, -0.08385998, -0.195515 ,
0.08500999, -0.55749 , 0.19473001, -0.0751 , -0.61184 ,
-0.08018 , -0.34303 , 1.03759 , -0.36085004, 0.93508005,
-0.00997001, -0.57282 , 0.33101702, 0.271261 , 0.47389007,
1.1219599 , -0.00199997, -1.609 , 0.57377803, -0.17023998,
-0.22913098, -0.33818996, -0.367797 , 0.367965 , -1.08955 ,
-0.664806 , 0.05213001, 0.40829998, 0.125692 , -0.44967002])
model_gigaword.wv.most_similar(positive=[your_word_vector], topn=10)
正如预期的那样,这些结果几乎是垃圾。请阅读下面的原因。
但有一点很重要。我看到你在努力寻找类似于欧几里德空间中的差分向量的词。
king
和man
之间的差异导致向量类似于queen
和woman
之间的差异,这意味着差异向量的长度和方向编码了两对单词之间的上下文差异
该向量的字面位置可能是垃圾,因为通过在欧几里德空间中检查它,可以将其锚定在原点上。上述两个差异向量(国王->男人和王后->女人)分别定位在“国王”和“王后”上。
你应该有这样的直觉:A->B和C->D可能有相似的向量连接它们,即使A,B和C,D可能在欧几里德空间的完全独立的部分中排列,如果它们之间有相似的上下文差异。这就是经过适当训练的word2vec中的向量空间所编码的内容
谢谢,您能用代码说明一下吗?如果使用gensim将gensim.downloader导入为api,则可以轻松加载模型。
model\u gigaword=api.load(“glove-wiki-gigaword-100”)
。我的疑问是:(1)如何以最佳方式从模型到(单词,dims)矩阵(实际上,有400000多个单词和100个维度),(2)如何像Gensim那样快速执行点积(我认为使用numpy/scipy)检查我更新的答案,结果发现有一个更简单的方法。一定要让我知道这是否对你有用。啊,谢谢你,这真的让事情明朗了。我的实际用例是查询像vector['queen']+vector['king']-vector['man']这样的东西,它应该生成一个接近vector['woman']的向量。然后,通过相似性搜索,我会提取“女人”作为热门歌曲(或其中一个)。你认为余弦相似性(我认为最相似的是使用余弦相似性)是最好的吗?我有一种感觉,正如你们所暗示的,欧几里德距离可能更相关。我相信余弦相似性会给你们带来更好的结果,因为word2vec,就像你们所看到的,按方向编码上下文。方向相似且长度相似的向量往往在上下文/语义上相似。同时,word2vec空间中的欧几里德距离仍然有意义,但我认为余弦相似性将是比较向量的更好方法。此外,如果你认为它解决了你的问题,请标记该问题。这将有助于其他人寻找类似的问题。我已经更新了我的答案,找到了一个更简单的解决方案。
your_word_vector = np.array([-0.696, -1.26119, -0.49109, 0.91179, 0.23077281,
-0.18835002, -0.65568995, -0.29686698, -0.60074997, -1.35762 ,
-0.11816999, 0.01779997, -0.74096 , 0.21192 , -0.407071 ,
-1.04871 , -0.480674 , -0.95541 , -0.06046999, 0.20678002,
-1.1516 , -0.98955095, 0.44508 , 0.32682198, -0.03306001,
-0.31138003, 0.87721 , 0.34279 , 0.78621 , -0.297459 ,
0.529243 , -0.07398 , 0.551844 , 0.54218 , -0.39394 ,
0.96368 , 0.22518003, 0.05197001, -0.912573 , -0.718755 ,
0.08056 , 0.421177 , -0.34256 , -0.71294 , -0.25391 ,
-0.65362 , -0.31369498, 0.216278 , 0.41873002, -0.21784998,
0.21340999, 0.480393 , 0.47077006, -1.00272 , 0.16624999,
-0.07340002, 0.09219003, -0.02021003, -0.58403 , -0.47306 ,
0.05066001, -0.64416003, 0.80061007, 0.224344 , -0.20483994,
-0.33785298, -1.24589 , 0.08900005, -0.08385998, -0.195515 ,
0.08500999, -0.55749 , 0.19473001, -0.0751 , -0.61184 ,
-0.08018 , -0.34303 , 1.03759 , -0.36085004, 0.93508005,
-0.00997001, -0.57282 , 0.33101702, 0.271261 , 0.47389007,
1.1219599 , -0.00199997, -1.609 , 0.57377803, -0.17023998,
-0.22913098, -0.33818996, -0.367797 , 0.367965 , -1.08955 ,
-0.664806 , 0.05213001, 0.40829998, 0.125692 , -0.44967002])
model_gigaword.wv.most_similar(positive=[your_word_vector], topn=10)
[('vajiravudh', 0.7130449414253235),
('prajadhipok', 0.6764554381370544),
('andrianampoinimerina', 0.6474215984344482),
('jeongjo', 0.6449092626571655),
('taejong', 0.6352322697639465),
('rehoboam', 0.6319528818130493),
('injo', 0.6317901611328125),
('gojong', 0.6302404999732971),
('seonjo', 0.6272163391113281),
('elessar', 0.6250109672546387)]