2016-05-11 6 views
1

Ich bin neu in Spark und Scala, so dass ich einige grundlegende Dinge hier falsch verstanden haben könnte. Ich versuche Sparks word2vec Modell auf meinen eigenen Daten zu trainieren. Nach ihrem documentation, einem Weg, dies zu tun ist,Training Sparks word2vec mit einer RDD [String]

val input = sc.textFile("text8").map(line => line.split(" ").toSeq) 
val word2vec = new Word2Vec() 
val model = word2vec.fit(input) 

Der text8-Datensatz eine Zeile vieler Worte enthält, was bedeutet, dass input ein RDD[Seq[String]] werden wird.

Nach meinem eigenen Datensatz massiert, die ein Wort pro Zeile hat, mit verschiedenen map s etc. Ich bin mit einem RDD[String] links, aber ich kann nicht scheinen zu können, das word2vec Modell auf sich trainieren. Ich habe versucht, input.map(v => Seq(v)), die tatsächlich eine RDD[Seq[String]] geben, aber das wird eine Sequenz für jedes Wort geben, was ich denke, ist völlig falsch.

Wie kann ich eine Sequenz um meine Saiten wickeln, oder gibt es noch etwas, das ich verpasst habe?

EDIT

Also habe ich es irgendwie heraus. Von meiner clean ist eine RDD[String] Ich mache val input = sc.parallelize(Seq(clean.collect().toSeq)). Dies gibt mir die korrekte Datenstruktur (RDD[Seq[String]]) passend zum Word2vec-Modell. Das Ausführen von Collect auf einem großen Dataset führt jedoch zu einem Speicherfehler. Ich bin mir nicht ganz sicher, wie sie die Anpassung vorhaben. Vielleicht ist es nicht wirklich parallelisierbar. Oder vielleicht sollte ich mehrere semi-lange Sequenzen von Streichern und RDD haben, statt einer langen Sequenz wie ich jetzt?

Antwort

1

Es scheint, dass die Dokumentation an einem anderen Ort aktualisiert wird (obwohl ich die "neuesten" Dokumente angeschaut habe). Neue Dokumente sind unter: https://spark.apache.org/docs/latest/ml-features.html

Das neue Beispiel löscht die text8 Beispieldatei insgesamt. Ich zweifle daran, ob das ursprüngliche Beispiel jemals so funktioniert hat, wie es beabsichtigt war. Die RDD-Eingabe für word2vec sollte eine Reihe von Listen mit Zeichenfolgen sein, in der Regel Sätze oder anders konstruierte N-Gramme.

enthielt Beispiel für andere verlorene Seelen:

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

Warum nicht

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

oder was auch immer wäre ein geeigneter Begrenzer Ihre Worte aufzuspalten auf. Dadurch erhalten Sie die gewünschte Zeichenfolge - aber mit gültigen Wörtern.

+0

Das ist im Grunde, was ich mache, um meine eigenen Daten vorzubereiten. Soweit ich verstehe, wird dies eine 'RDD [String]' geben, wie ich in meiner Frage geschrieben habe. Dies wird nicht funktionieren, da das Word2vec-Modell eine 'RDD [Seq [String]]' als Eingabe zu akzeptieren scheint. – burk

Verwandte Themen