Обучение Sparks word2vec с RDD[String]

Я новичок в Spark и Scala, поэтому я мог неправильно понять некоторые основные вещи. Я пытаюсь обучить модель Sparks 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 и т. д., у меня остался 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. Однако при сборе большого набора данных возникает ошибка нехватки памяти. Я не совсем уверен, как они собираются делать примерку? Может быть, это не совсем параллелизуется. Или, может быть, я должен иметь несколько полудлинных последовательностей строк внутри и RDD вместо одной длинной последовательности, как сейчас?


person burk    schedule 11.05.2016    source источник


Ответы (3)


Кажется, что документация обновляется в другом месте (хотя я просматривал «последние» документы). Новые документы находятся по адресу: https://spark.apache.org/docs/latest/ml-features.html

Новый пример полностью удаляет файл примера text8. Я сомневаюсь, что исходный пример когда-либо работал должным образом. Вход RDD для word2vec должен быть набором списков строк, обычно предложений или иным образом сконструированных 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)
person burk    schedule 16.05.2016

Почему бы и нет

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

или любой другой подходящий разделитель для разделения ваших слов. Это даст вам желаемую последовательность строк, но с допустимыми словами.

person WestCoastProjects    schedule 14.05.2016
comment
Это в основном то, что я делаю, чтобы подготовить свои собственные данные. Насколько я понимаю, это даст RDD[String], как я написал в своем вопросе. Это не сработает, поскольку модель word2vec, похоже, принимает RDD[Seq[String]] в качестве входных данных. - person burk; 15.05.2016

Насколько я помню, word2vec в ml принимает dataframe в качестве аргумента, а word2vec в mllib может принимать в качестве аргумента rdd. Пример, который вы разместили, предназначен для word2vec в мл. Вот официальное руководство: https://spark.apache.org/docs/latest/mllib-feature-extraction.html#word2vec

person Addison    schedule 16.06.2017