如何从PySpark的word2vec模型中获取单词列表?

4
我正在尝试使用PySpark生成单词向量。使用gensim,我可以看到以下单词及其最接近的单词:
sentences = open(os.getcwd() + "/tweets.txt").read().splitlines()
w2v_input=[]
for i in sentences:
    tokenised=i.split()
    w2v_input.append(tokenised)
model = word2vec.Word2Vec(w2v_input)
for key in model.wv.vocab.keys():
    print key
    print model.most_similar(positive=[key])

使用 PySpark
inp = sc.textFile("tweet.txt").map(lambda row: row.split(" "))
word2vec = Word2Vec()
model = word2vec.fit(inp)

我该如何从模型中的向量空间生成单词?这相当于gensim中model.wv.vocab.keys()的pyspark等效方法吗?
背景:我需要将模型中的单词和同义词存储到一个映射表中,以便稍后用于查找推文的情感。由于模型属于spark上下文,因此我无法在pyspark的map函数中重用单词向量模型(以下是错误)。我想要pyspark word2vec版本,而不是gensim,因为它为某些测试单词提供更好的同义词。
 Exception: It appears that you are attempting to reference SparkContext from a broadcast variable, action, or transformation.SparkContext can only be used on the driver, not in code that it run on workers.

任何替代方案也是受欢迎的。
2个回答

5

在Spark中,相应的命令是model.getVectors(),它会返回一个字典。这里有一个快速的玩具示例,只有3个单词(alpha, beta, charlie),改编自文档

sc.version
# u'2.1.1'

from pyspark.mllib.feature import Word2Vec
sentence = "alpha beta " * 100 + "alpha charlie " * 10
localDoc = [sentence, sentence]
doc = sc.parallelize(localDoc).map(lambda line: line.split(" "))
word2vec = Word2Vec()
model = word2vec.fit(doc)

model.getVectors().keys()
#  [u'alpha', u'beta', u'charlie']

关于寻找同义词,您可以查看我的另一个答案
关于您提到的错误和可能的解决方法,请查看我的这个答案

0

正如这里所建议的那样,如果您想要包含文档中的所有单词,请相应地设置MinCount参数(默认值为5):

word2vec = Word2Vec()
word2vec.setMinCount(1)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接