Word2vec中类比一词背后的操作是什么?

问题描述 投票:2回答:2

https://code.google.com/archive/p/word2vec/说:

最近显示,单词向量捕获了许多语言规则,例如向量操作向量('Paris') - 向量('France')+向量('Italy')导致向量非常接近向量('Rome ')和vector('king') - vector('man')+ vector('woman')接近vector('queen')[3,1]。您可以通过运行demo-analogy.sh来尝试一个简单的演示。

所以我们可以尝试使用提供的演示脚本:

+ ../bin/word-analogy ../data/text8-vector.bin
Enter three words (EXIT to break): paris france berlin

Word: paris  Position in vocabulary: 198365

Word: france  Position in vocabulary: 225534

Word: berlin  Position in vocabulary: 380477

                                              Word              Distance
------------------------------------------------------------------------
                                           germany      0.509434
                                          european      0.486505

请注意,paris france berlin是演示提示的输入提示。问题是,如果我在Gensim中打开相同的单词向量并尝试自己计算向量,则无法重现此行为。例如:

>>> word_vectors = KeyedVectors.load_word2vec_format(BIGDATA, binary=True)
>>> v = word_vectors['paris'] - word_vectors['france'] + word_vectors['berlin']
>>> word_vectors.most_similar(np.array([v]))
[('berlin', 0.7331711649894714), ('paris', 0.6669869422912598), ('kunst', 0.4056406617164612), ('inca', 0.4025722146034241), ('dubai', 0.3934606909751892), ('natalie_portman', 0.3909246325492859), ('joel', 0.3843030333518982), ('lil_kim', 0.3784593939781189), ('heidi', 0.3782389461994171), ('diy', 0.3767407238483429)]

那么,类比实际上在做什么呢?我该如何重现它?

python gensim word2vec word-embedding
2个回答
2
投票

它应该只是向量的元素加法和减法。和余弦距离找到最相似的。但是,如果你使用原始的word2vec嵌入,“paris”和“Paris”之间存在差异(字符串没有降低或者是lemmatised)。

您也可以尝试:

v = word_vectors['France'] - word_vectors['Paris'] + word_vectors['Berlin']

要么

v = word_vectors['Paris'] - word_vectors['France'] + word_vectors['Germany']

因为你应该比较相同的概念(城市 - 国家+国家 - >另一个城市)


1
投票

您应该清楚确切地知道您正在使用哪个单词 - 向量集:不同的集合将具有在类比任务上表现良好的不同能力。 (那些在微小的text8数据集上训练的人可能相当弱;谷歌发布的大型GoogleNews集可能会做得很好,至少在某些条件下,例如丢弃低频率的话。)

你正在为你想要解决的类比做错算术。比喻“A是B到C是什么?”经常写成:

A : B :: C : _?_

你从'B'开始,减去'A',然后加'C'。所以这个例子:

France : Paris :: Italy : _?_

...给出摘录文本中的公式:

wv('Paris') - wv('France') + wv('Italy`) = target_coordinates  # close-to wv('Rome')

而要解决:

Paris : France :: Berlin : _?_

你会尝试:

wv('France') - wv('Paris') + wv('Berlin') = target_coordinates

...然后看看最接近target_coordinates的是什么。 (注意操作顺序与尝试的区别。)

您可以将其视为:

  1. 从国家矢量('法国')开始
  2. 减去(country&capital)-vector('Paris')。这将为您留下一个临时向量,即“零”国家和“负”资本。
  3. 添加另一个(国家和首都) - 矢量('柏林')。这将为您留下一个结果向量,即“一个”国家和“零”资本。

还要注意gensimmost_similar()需要多个正面和负面的单词示例,为你做算术。所以你可以这样做:

sims = word_vectors.most_similar(positive=['France', 'Berlin'], negative=['Paris'])
© www.soinside.com 2019 - 2024. All rights reserved.