经典的king - man + woman = queen示例,带有预训练词嵌入和r中的word2vec包



我真的很绝望,我就是不能用R中的word2vec包和任何(!)预训练的嵌入模型(作为bin文件)复制所谓的king - man + woman = queen的经典示例。

如果有人能提供工作代码来复制这个例子,我将非常感激。包括必要的预训练模型的链接,该模型也是可下载的(许多不是!)。

非常感谢!

关于在R中使用word2vec的概述,请访问https://www.bnosac.be/index.php/blog/100-word2vec-in-r,其中甚至显示了一个king - man + woman = queen的示例。

只是按照那里的说明,下载了第一个英语300-dim嵌入word2vec模型,从http://vectors.nlpl.eu/repository运行在我遇到的英国国家语料库上,下载并解压缩了我驱动器上的model.bin,然后检查模型中的术语(单词显然是附加在pos标签上的),获得单词向量,显示向量,获得国王-男人+女人,并找到最接近该向量的向量…女王。

> library(word2vec)
> model <- read.word2vec("C:/Users/jwijf/OneDrive/Bureaublad/model.bin", normalize = TRUE)
> head(summary(model, type = "vocabulary"), n = 10)
[1] "vintage-style_ADJ" "Sinopoli_PROPN"    "Yarrell_PROPN"     "en-1_NUM"          "74°–78°F_X"       
[6] "bursa_NOUN"        "uni-male_ADJ"      "37541_NUM"         "Menuetto_PROPN"    "Saxena_PROPN"     
> wv <- predict(model, newdata = c("king_NOUN", "man_NOUN", "woman_NOUN"), type = "embedding")
> head(t(wv), n = 10)
king_NOUN    man_NOUN  woman_NOUN
[1,] -0.4536242 -0.47802860 -1.03320265
[2,]  0.7096733  1.40374041 -0.91597748
[3,]  1.1509652  2.35536361  1.57869458
[4,] -0.2882653 -0.59587735 -0.59021348
[5,] -0.2110678 -1.05059254 -0.64248675
[6,]  0.1846713 -0.05871651 -1.01818573
[7,]  0.5493720  0.13456300  0.38765019
[8,] -0.9401053  0.56237948  0.02383301
[9,]  0.1140556 -0.38569298 -0.43408644
[10,]  0.3657919  0.92853492 -2.56553030
> wv <- wv["king_NOUN", ] - wv["man_NOUN", ] + wv["woman_NOUN", ]
> predict(model, newdata = wv, type = "nearest", top_n = 4)
term similarity rank
1       king_NOUN  0.9332663    1
2      queen_NOUN  0.7813236    2
3 coronation_NOUN  0.7663506    3
4   kingship_NOUN  0.7626975    4

你喜欢基于你自己的文本或更大的语料库(如text8文件)建立自己的模型吗?按照https://www.bnosac.be/index.php/blog/100-word2vec-in-r所示的说明操作。获取一个文本文件,使用R包word2vec构建模型,等待模型完成训练,然后与之交互。

download.file("http://mattmahoney.net/dc/text8.zip", "text8.zip")
unzip("text8.zip", files = "text8")
> library(word2vec)
> set.seed(123456789)
> model <- word2vec(x = "text8", type = "cbow", dim = 100, window = 10, lr = 0.05, iter = 5, hs = FALSE, threads = 2)
> wv    <- predict(model, newdata = c("king", "man", "woman"), type = "embedding")
> wv    <- wv["king", ] - wv["man", ] + wv["woman", ]
> predict(model, newdata = wv, type = "nearest", top_n = 4)
term similarity rank
1     king  0.9743692    1
2    queen  0.8295941    2

您没有显示您尝试了哪些预训练模型,也没有显示您在尝试中使用了哪些数据,也没有显示您使用了哪些训练然后探测的代码并且失败了,也没有显示您的尝试是如何失败的。所以如果不给你写一个完整的教程,你就很难提供帮助。而且网上已经有很多word2vec教程了。

但注意:

  • word2vec是一种数据饥渴型算法,它的有用特性(包括模拟解决能力)只有在使用足够大的训练集时才真正变得可靠。
  • 也就是说,当使用相同的向量算法时,大多数来自有能力的团队的预训练模型应该很容易显示经典的man : king :: woman : queen类比解。候选人答案排名(排除问题中的所有单词)为原创作品
  • 如果我没记错的话,仅仅100MB的未压缩文本text8数据集(http://mattmahoney.net/dc/textdata)在man : king :: woman : queen上通常会成功或接近成功,尽管相关的1GB数据text9往往会做得更好。不过,对于生成强大的通用词向量来说,这两种方法都有点小。相比之下,谷歌大约在2013年发布了GoogleNews向量,与此同时,最初的word2vec论文据说是在100GB的新闻文章上进行训练的。不过,请注意:text8&text9数据集,通过剥离所有标点/换行符,可能需要分块传递给一些需要训练文本符合一定限制的word2vec实现。例如,Python的Gensim期望每个训练文本不超过10000个令牌。text8是一行1700万字。如果您将包含1700万个令牌的一行作为一个训练文本传递给Gensim,则99.94%的令牌将被忽略,因为超出了10,000个令牌的限制。您的R实现可能有类似的,甚至更严格的实现限制。