我真的很绝望,我就是不能用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实现可能有类似的,甚至更严格的实现限制。