使用RDD训练Sparks word2vec [String]

时间:2016-05-11 19:42:15

标签: scala apache-spark apache-spark-mllib spark-dataframe

我是Spark和Scala的新手所以我可能在这里误解了一些基本的东西。我正在尝试在我自己的数据上训练Sparks word2vec模型。根据他们的documentation,一种方法是

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等。我留下了RDD[String],但我似乎无法训练word2vec模型就可以了。我尝试input.map(v => Seq(v))实际上给了RDD[Seq[String]],但这会为每个单词提供一个序列,我猜这完全错了。

如何在字符串周围包裹一个序列,还是有其他我遗漏的东西?

修改

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

3 个答案:

答案 0 :(得分:1)

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

新示例完全删除了text8示例文件。我怀疑原始的例子是否按预期工作。对word2vec的RDD输入应该是一组字符串列表,通常是句子或以其他方式构造的n-gram。

包括其他失落灵魂的例子:

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)

答案 1 :(得分:0)

为什么不

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

或任何适当的分隔符来分割您的单词。这将为您提供所需的字符串序列 - 但使用有效的单词。

答案 2 :(得分:0)

我记得,ml2中的word2vec将数据帧作为参数,mllib中的word2vec可以将rdd作为参数。您发布的示例是以ml2为单位的word2vec。以下是官方指南:https://spark.apache.org/docs/latest/mllib-feature-extraction.html#word2vec