Word2vec中单词类比背后的运算是什么?

Zag*_*rax 5 python gensim word2vec word-embedding

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

最近的研究表明,词向量捕捉了许多语言规律,例如向量运算向量(‘巴黎’)-向量(‘法国’)+向量(‘意大利’)产生的向量非常接近向量(‘罗马’) '),并且向量('king') -向量('man') + vector('woman') 接近于向量('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
Run Code Online (Sandbox Code Playgroud)

请注意,这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)]
Run Code Online (Sandbox Code Playgroud)

那么,类比这个词到底有什么作用呢?我应该如何重现它?

goj*_*omo 5

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

对于您试图解决的类比,您的算术是错误的。打个比方,“A 之于 B 就像 C 之于?” 通常写为:

A : B :: C : _?_
Run Code Online (Sandbox Code Playgroud)

您从“B”开始,减去“A”,然后添加“C”。所以这个例子:

France : Paris :: Italy : _?_
Run Code Online (Sandbox Code Playgroud)

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

wv('Paris') - wv('France') + wv('Italy`) = target_coordinates  # close-to wv('Rome')
Run Code Online (Sandbox Code Playgroud)

并解决:

Paris : France :: Berlin : _?_
Run Code Online (Sandbox Code Playgroud)

你会尝试:

wv('France') - wv('Paris') + wv('Berlin') = target_coordinates
Run Code Online (Sandbox Code Playgroud)

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

您可以将其视为:

  1. 从国家向量开始(“法国”)
  2. 减去(国家&首都)向量(“巴黎”)。这给你留下了一个临时向量,即“零”乡村性和“负”资本性。
  3. 添加另一个(国家&首都)向量(“柏林”)。这给你留下了一个结果向量,同样是“一个”国家属性和“零”资本属性。

另请注意,这gensim需要most_similar()多个正面和负面的单词示例来为您进行算术运算。所以你可以这样做:

sims = word_vectors.most_similar(positive=['France', 'Berlin'], negative=['Paris'])
Run Code Online (Sandbox Code Playgroud)