2016-06-28 36 views
1

我目前正在研究一个波光粼粼的水应用程序,并且我是spark和h2o中的初学者。如何使用spark从word2vec模型获取数据框

我想要做什么:

  1. 加载文本文件
  2. 一个输入创建word2vec模型
  3. 创建一个数据框与列和使用列矢量
  4. 数据帧作为h2o的输入

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

word | Vector

assert | [0.3,0.4 .....]

sense | [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 

是否有任何方法,它或火花所提供的功能?

在此先感谢

回答

1

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

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

第二行返回的数据帧与该功能getVectors()并diffenrent参数为从第一行建立一个模型。

也许有人可以评论关于这两个不同的图书馆。

在此先感谢。

+0

Spark中有2个ML包,一个是旧的,另一个是针对DataFrame的新包 - 旧的是为了向后兼容 –

0

首先在水中的,我们不支持Vector列类型,你必须做出这样的框架:

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

现在的实际问题 - 不,因为它是一个Scala Map,我们提供了从数据源(HDFS/S3上的文件,数据库等)创建帧的方法,或者从RDD/DataFrame转换而不是Java/Scala收集的帧。写一个将是可能的,但相当繁琐。

不是最高效的解决方案,但最简单的代码,明智的将是使一个DF(或RDD)第一(通过运行map.toSeqsc.parallelize),然后将其转换为H2OFrame:

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

感谢您的帮助,代码中的这些步骤在spark上运行,spark支持vector为列类型。在未来的步骤中,它会像上面已经提到的那样自我转换。 – sedioben