使用 RDD[String] 训练 Sparks word2vec

Training Sparks word2vec with a RDD[String]

我是 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]]

在使用不同的 maps 等处理我自己的数据集(每行一个词)之后。我只剩下一个 RDD[String],但我似乎无法做到在其上训练 word2vec 模型。我试着做 input.map(v => Seq(v)),它实际上给出了一个 RDD[Seq[String]],但是这会给每个单词一个序列,我想这是完全错误的。

如何在我的字符串周围环绕一个序列,或者我错过了什么?

编辑

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

为什么不

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

或任何合适的分隔符来分隔您的话。这将为您提供所需的字符串序列 - 但包含有效的单词。

似乎在其他位置更新了文档(即使我正在查看 "latest" 文档)。新文档位于: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)

我记得,ml中的word2vec以dataframe为参数,mllib中的word2vec可以以rdd为参数。您发布的示例适用于 ml 中的 word2vec。这是官方指南:https://spark.apache.org/docs/latest/mllib-feature-extraction.html#word2vec