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

时间:2018-09-17 09:30:43

标签: python gensim word2vec word-embedding

根据https://code.google.com/archive/p/word2vec/

  

最近发现,单词向量捕获了许多语言   规律性,例如向量运算vector('Paris')-   vector('France')+ vector('Italy')产生的向量非常   接近vector('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)]

那么,类比这个词实际上是做什么的?我应该如何复制它?

2 个答案:

答案 0 :(得分:2)

它应该只是向量的逐元素加法和减法。 与余弦距离找到最相似的。 但是,如果您使用原始的word2vec嵌入,则“ paris”和“ Paris”之间是有区别的(字符串未降低或限制了其词性)。

您也可以尝试:

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

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

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

答案 1 :(得分:1)

您应该确切地知道使用的是哪个单词向量集:不同的集合将具有不同的能力,它们在类比任务中表现良好。 (在很小的text8数据集上受过训练的人可能很弱;至少在某些条件下,例如丢弃低频率单词,Google发布的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. 减去(国家和首都)向量(“巴黎”)。这样就给您留下了一个过渡向量,即排序,“零”国家状态和“负”资本状态。
  3. 添加另一个(国家和首都)载体(“柏林”)。这给您留下的结果向量又是“一个”国家(地区)和“零”资本状态。

还请注意,gensim的{​​{1}}带有多个正例和负例,可以为您做算术运算。因此,您可以这样做:

most_similar()