我是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中有几个半长的字符串序列,而不是像我现在那样的一个长序列?
答案 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