2016-05-11 66 views
1

我是新来的Spark和斯卡拉,所以我可能误解了一些基本的东西在这里。我试图根据自己的数据培训Sparks word2vec模型。根据他们的documentation,一个做到这一点的方法是培训spark2与RDD的word2vec [字符串]

val input = sc.textFile("text8").map(line => line.split(" ").toSeq) 
val word2vec = new Word2Vec() 
val model = word2vec.fit(input) 

text8数据集包含了许多话一条线,这意味着input将成为RDD[Seq[String]]

按摩我自己的数据集后,每行有一个单词,使用不同的map s等。我剩下一个RDD[String],但我似乎无法训练word2vec模型。我试过input.map(v => Seq(v)),它实际上给了RDD[Seq[String]],但是这会给每个单词一个序列,我想这是完全错误的。

如何在我的字符串周围包裹一个序列,或者是否有其他我错过的东西?

编辑

让我有种想它。从我的cleanRDD[String]我做val input = sc.parallelize(Seq(clean.collect().toSeq))。这给了我正确的数据结构(RDD[Seq[String]])以适应word2vec模型。但是,在大型数据集上运行collect会导致内存不足错误。我不太确定他们打算如何完成这个配件?也许它不是真正的可并行化。或者,也许我应该有几个半长的字符串序列和RDD,而不是像我现在拥有的一个长序列?

回答

1

似乎文档在其他位置更新(即使我正在查看“最新”文档)。新文档位于:https://spark.apache.org/docs/latest/ml-features.html

新示例将text8示例文件全部删除。我怀疑最初的例子是否按预期工作。 word2vec的RDD输入应该是一组字符串列表,通常是句子或其他构造的n元组。

实施例包括为其他失魂:

val documentDF = sqlContext.createDataFrame(Seq(
    "Hi I heard about Spark".split(" "), 
    "I wish Java could use case classes".split(" "), 
    "Logistic regression models are neat".split(" ") 
).map(Tuple1.apply)).toDF("text") 

// Learn a mapping from words to Vectors. 
val word2Vec = new Word2Vec() 
    .setInputCol("text") 
    .setOutputCol("result") 
    .setVectorSize(3) 
    .setMinCount(0) 
val model = word2Vec.fit(documentDF) 
0

为什么不

input.map(v => v.split(" ")) 

或任何将是一个适当的分隔符对分裂你的话。这将给你所需的字符串序列 - 但有效的话。

+0

这就是我正在做的准备自己的数据。据我所知,这将给我的问题写一个'RDD [字符串]'。这不会起作用,因为word2vec模型似乎将RDD [Seq [String]]作为输入。 – burk