line.split(" ").toSeq-6ren">
gpt4 book ai didi

apache-spark - Spark Word2vec 向量数学

转载 作者:行者123 更新时间:2023-11-30 08:22:06 26 4
gpt4 key购买 nike

我正在查看example Word2Vec 的 Spark 站点:

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 循环会删除属于输入查询本身的条目,因为我注意到正确的答案通常是返回列表中的第二个,第一个通常是以下之一输入项。

关于apache-spark - Spark Word2vec 向量数学,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34172242/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com