2016-05-18 14 views
0

Ich habe die Sätze in Wort RDD in Tokens umgewandelt. Jetzt brauche ich Bigrams.
ex. This is my test => (This is), (is my), (my test)
Ich habe Suche durch und gefunden .sliding Operator für diesen Zweck. Aber ich bekomme diese Option nicht auf meiner Sonnenfinsternis (möglicherweise ist sie für eine neuere Version von Spark verfügbar)
Also was kann ich machen, ohne .sliding?Bigrams in Funke mit Java (8) finden

Hinzufügen von Code zu bekommen started-

public static void biGram (JavaRDD<String> in) 
{ 
    JavaRDD<String> sentence = in.map(s -> s.toLowerCase()); 
    //get bigram from sentence w/o sliding - CODE HERE 
} 
+0

Können Sie Ihren Code veröffentlichen? Sliding funktioniert nur bei iteratble, so dass Sie mapPartition mit gleiten verwenden können. Sobald Sie den Code hochladen, könnte ich etwas schreiben –

+0

@ Z-Star veröffentlicht – insomniac

Antwort

1

Gleiten ist in der Tat die Art und Weise mit ngrams zu gehen. Die Sache ist, Schiebe funktioniert auf Iteratoren, teilen Sie einfach Ihren Satz und schieben Sie über das Array. Ich füge einen Scala-Code hinzu.

val sentences:RDD[String] = in.map(s => s.toLowerCase()) 
val biGrams:RDD[Iterator[Array[String]]] = sentences.map(s => s.split(" ").sliding(2))  
0

Sie können einfach N-Gramm-Transformationsfunktion in Spark verwenden.

public static void biGram (JavaRDD<String> in) 
{ 
    //Converting string into row 
    JavaRDD<Row> sentence = sentence.map(s -> RowFactory.create(s.toLowerCase())); 

    StructType schema = new StructType(new StructField[] { 
      new StructField("sentence", DataTypes.StringType, false, Metadata.empty()) 
    }); 

    //Creating dataframe 
    DataFrame dataFrame = sqlContext.createDataFrame(sentence, schema); 

    //Tokenizing sentence into words 
    RegexTokenizer rt = new RegexTokenizer().setInputCol("sentence").setOutputCol("split") 
      .setMinTokenLength(4) 
      .setPattern("\\s+"); 
    DataFrame rtDF = rt.transform(dataFrame); 

    //Creating bigrams 
    NGram bigram = new NGram().setInputCol(rt.getOutputCol()).setOutputCol("bigram").setN(2); //Here setN(2) means bigram 
    DataFrame bigramDF = bigram.transform(rtDF); 


    System.out.println("Result :: "+bigramDF.select("bigram").collectAsList()); 
}