Вот фрагмент, который может быть вам полезен, если вы хотите реализовать Word2Vec и сохранить вложения обученной модели. Я добавил типы к переменным, а также к некоторым именам заполнителей, чтобы было легче понять, что ожидается в качестве входных данных для различных функций.

Сначала вам нужно будет импортировать Word2Vec и Word2VecModel.

import org.apache.spark.ml.feature.{Word2Vec, Word2VecModel}

Затем вам нужно будет импортировать имплициты искрового сеанса, поскольку вы будете работать с наборами данных.

import sparkSession.implicits._

Затем вам нужно подготовить входные данные для алгоритма. Алгоритм обучения ожидает набор данных последовательностей строк. В приведенном ниже примере «getTrainset» — это функция, которая извлекает ваш учебный корпус и форматирует его в требуемый тип.

val trainset: Dataset[Seq[String]] = getTrainset()

Теперь вы готовы начать использовать Word2Vec. Вам нужно сначала настроить алгоритм Word2Vec с параметрами, которые вы выбрали.

val wordToVec: Word2Vec = new Word2Vec() .setInputCol("column-name-of-your-trainset-dataset") .setOutputCol("output-column-name") .setStepSize(learningRateFloat) .setVectorSize(vectorSizeInt) .setWindowSize(windowSizeInt) .setMaxIter(numberOfIterationsInt) .setMinCount(minimumCountForDiscartingInt) .setNumPartitions(wordToVecPartitions)

Далее следует этап обучения.

val model = wordToVec.fit(trainset)

После того, как ваша модель будет обучена, вы захотите обработать ее и сохранить в нужном формате. Поскольку вы имеете дело с набором данных, вам необходимо сопоставить результаты с чем-то более безопасным. Вы можете сделать это с классом case следующим образом:

case class MyCustomType(word: String, vector: Vector) { def toPair = (word.toLong, vector.toArray) } model.getVectors.as[MyCustomType].map(_.toPair)

Наконец, вы хотите сохранить свою модель. Обратите внимание, что модель Word2Vec имеет функцию сохранения, которая сохраняет ее в специальном формате, легко перезагружаемом в Word2VecModel. В этом примере вместо этого мы сохраним в паркет, так как вам может понадобиться более необработанная версия вашей модели.

model .repartition(partitionsToSaveModelInto) .withColumnRenamed("_1", "word") .withColumnRenamed("_2", "vector") .select("word", "vector") .write.parquet(options.outputFile)

Первоначально опубликовано на странице intothedepthsofdataengineering.wordpress.com 27 июня 2017 г.