我一直在寻找的例子星火网站Word2Vec的:
val input = sc.textFile("text8").map(line => line.split(" ").toSeq)
val word2vec = new Word2Vec()
val model = word2vec.fit(input)
val synonyms = model.findSynonyms("country name here", 40)
我如何做有趣的矢量,如国王 - 男人+女人=女王.我可以使用model.getVectors,但不知道如何继续进行.
这是一个例子pyspark
,我想直接移植到Scala - 关键是使用model.transform
.
首先,我们按照示例训练模型:
from pyspark import SparkContext
from pyspark.mllib.feature import Word2Vec
sc = SparkContext()
inp = sc.textFile("text8_lines").map(lambda row: row.split(" "))
k = 220 # vector dimensionality
word2vec = Word2Vec().setVectorSize(k)
model = word2vec.fit(inp)
k
单词向量的维数 - 越高越好(默认值为100),但你需要内存,我可以用我的机器获得的最高数字是220.(编辑:相关出版物中的典型值在300之间)和1000)
在我们训练模型之后,我们可以定义一个简单的函数如下:
def getAnalogy(s, model):
qry = model.transform(s[0]) - model.transform(s[1]) - model.transform(s[2])
res = model.findSynonyms((-1)*qry,5) # return 5 "synonyms"
res = [x[0] for x in res]
for k in range(0,3):
if s[k] in res:
res.remove(s[k])
return res[0]
现在,这里有一些国家及其首都的例子:
s = ('france', 'paris', 'portugal')
getAnalogy(s, model)
# u'lisbon'
s = ('china', 'beijing', 'russia')
getAnalogy(s, model)
# u'moscow'
s = ('spain', 'madrid', 'greece')
getAnalogy(s, model)
# u'athens'
s = ('germany', 'berlin', 'portugal')
getAnalogy(s, model)
# u'lisbon'
s = ('japan', 'tokyo', 'sweden')
getAnalogy(s, model)
# u'stockholm'
s = ('finland', 'helsinki', 'iran')
getAnalogy(s, model)
# u'tehran'
s = ('egypt', 'cairo', 'finland')
getAnalogy(s, model)
# u'helsinki'
结果并不总是正确的 - 我会留给您进行实验,但是随着更多的训练数据和更高的矢量维度,它们会变得更好k
.
for
函数中的循环删除属于输入查询本身的条目,因为我注意到,正确的答案通常是返回列表中的第二个,第一个通常是输入项之一.