首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Word2vec中,类比这个词背后的操作是什么?

在Word2vec中,类比这个词背后的操作是什么?
EN

Stack Overflow用户
提问于 2018-09-17 09:30:43
回答 2查看 3.7K关注 0票数 5

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

最近的研究表明,矢量这个词捕捉了许多语言规律,例如向量运算矢量(‘Paris’)-向量(‘法国’)+向量(‘意大利’)产生的向量非常接近矢量(‘罗马’),向量(‘king’)-矢量(‘man’)+向量(‘woman’)接近矢量(‘queen’) 3,1。您可以通过运行演示-类比to来尝试一个简单的演示。

因此,我们可以从提供的演示脚本中尝试:

代码语言:javascript
复制
+ ../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中打开相同的单词向量并尝试自己计算向量,我就无法再现这种行为。例如:

代码语言:javascript
复制
>>> 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)]

那么,类比这个词到底在做什么呢?我该怎么复制它?

EN

回答 2

Stack Overflow用户

发布于 2018-09-17 13:24:52

它应该只是按元素加减矢量。和余弦距离找到最相似的。但是,如果您使用原始的word2vec嵌入,那么"paris“和"Paris”之间就会有区别(字符串没有降低或符号化)。

你也可以尝试:

代码语言:javascript
复制
v = word_vectors['France'] - word_vectors['Paris'] + word_vectors['Berlin']

代码语言:javascript
复制
v = word_vectors['Paris'] - word_vectors['France'] + word_vectors['Germany']

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

票数 4
EN

Stack Overflow用户

发布于 2018-09-17 20:09:53

您应该清楚地知道您使用的是哪个字向量集:不同的集合将有不同的能力来很好地执行类比任务。(那些在小型text8数据集上受过训练的人可能很弱;谷歌发布的大型GoogleNews集可能会做得很好,至少在某些情况下,比如放弃低频率词。)

你对你想要解决的类比做了错误的计算。打个比方,"A是B,C是B ?“常写为:

代码语言:javascript
复制
A : B :: C : _?_

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

代码语言:javascript
复制
France : Paris :: Italy : _?_

...gives摘录文本中的公式:

代码语言:javascript
复制
wv('Paris') - wv('France') + wv('Italy`) = target_coordinates  # close-to wv('Rome')

取而代之的是:

代码语言:javascript
复制
Paris : France :: Berlin : _?_

你可以试着:

代码语言:javascript
复制
wv('France') - wv('Paris') + wv('Berlin') = target_coordinates

...then看什么离target_coordinates最近。(注意操作顺序与您的尝试之间的差异。)

你可以把它想象成:

  1. 从一个国家开始-矢量(‘法国’)
  2. 减去(国家和首都)-vector(巴黎)。这就给你留下了一个临时向量,那就是,“零”国家,和“负”大写。
  3. 再加上另一个(国家和首都)-vector(柏林)。这就给你留下了一个结果向量,也就是“一个”国家,和“零”大写字母。

还请注意,gensimmost_similar()接受多个正负单词示例来为您做算术。所以,您可以这样做:

代码语言:javascript
复制
sims = word_vectors.most_similar(positive=['France', 'Berlin'], negative=['Paris'])
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52364632

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档