如何使用spark从word2vec模型获取数据框

How to get a dataframe from word2vec model using spark

我目前正在开发苏打水应用程序,我是 spark 和 h2o 的初学者。

我想做的事情:

  1. 正在加载输入文本文件
  2. 创建一个 word2vec 模型
  3. 创建一个包含一列 word 和一列 Vector
  4. 的数据框
  5. 使用数据帧作为 h2o 的输入

通过创建模型,我得到了一张地图,但我不知道如何创建它的数据框。输出应如下所示:

字数 | 向量

断言 | [0.3, 0.4.......]

感觉 | [0.6, 0.2.......] 等等。

到目前为止,这是我的代码:

from pyspark import SparkContext
from pyspark.mllib.feature import Word2Vec
from pysparkling import *
import h2o

from pyspark.sql import SQLContext
from pyspark.mllib.linalg import Vectors
from pyspark.sql import Row


# Starting h2o application on spark cluster
hc = H2OContext(sc).start()

# Loading input file
inp = sc.textFile("examples/custom/text8.txt").map(lambda row: row.split(" "))

# building the word2vec model with a vector size of 10
word2vec = Word2Vec()
model = word2vec.setVectorSize(10).fit(inp)

# Sanity check
model.findSynonyms("property",5)

# assign vector representation (map to variable
wordVectorsDF = model.getVectors()

# Transform wordVectorsDF word into dataframe

Spark 提供了哪些方法或功能?

提前致谢

首先在 H2O 中我们不支持 Vector 列类型,你必须制作这样的框架:

word   | V1  | V2  | ...
assert | 0.3 | 0.4 | ...
sense  | 0.6 | 0.2 | ...

现在是真正的问题 - 不,因为它是 Scala Map,我们提供了从数据源(HDFS/S3 上的文件、数据库等)或从 [=23] 转换创建框架的方法=] 但不是来自 Java/Scala 个集合。写一个是可以的,但是很麻烦。

不是最高效的解决方案,但最简单的代码方式是首先制作一个 DF(或 RDD)(通过 运行 sc.parallelize on map.toSeq)然后转换它到 H2OFrame:

import hc._
val wordsDF = sc.parallelize(wordVectorsDF.toSeq).toDF
val h2oFrame = asH2OFrame(wordsDF)

我发现有两个用于 Word2Vec 转换的库 - 我不知道为什么。

from pyspark.mllib.feature import Word2Vec
from pyspark.ml.feature import Word2Vec

第二行 returns 一个具有函数 getVectors() 的数据框,并且具有与第一行不同的用于构建模型的参数。

也许有人可以就这两个不同的库发表评论。

提前致谢。