2016-05-11 97 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