2017-06-01 7 views
0

Ich verwende eine NGramTransformer dann eine CountVectorizerModel.Create Composite-Transformator Funken

Ich muss in der Lage sein, einen zusammengesetzten Transformator für die spätere Verwendung zu erstellen. nur

Ich konnte dies erreichen, indem eine List<Transformer> und Schleife durch alle Elemente zu machen, aber ich möchte wissen, ob es möglich ist, ein Transformer mit 2 anderen du wirst Transformer

+1

Sie die Pipeline-API von Funken ml – eliasah

+1

verwenden kann ich – LonsomeHell

+0

einen Blick auf die dank nehmen Es ist auf die offizielle mllib/ml Dokumentation – eliasah

Antwort

2

Dies ist praktisch sehr einfach zu erstellen müssen die Pipeline API verwenden, um Ihre Pipeline zu erstellen:

import java.util.Arrays; 

import org.apache.spark.ml.Pipeline; 
import org.apache.spark.ml.PipelineModel; 
import org.apache.spark.ml.PipelineStage; 
import org.apache.spark.ml.feature.CountVectorizer; 
import org.apache.spark.ml.feature.NGram; 
import org.apache.spark.ml.feature.Tokenizer; 
import org.apache.spark.sql.Row; 
import org.apache.spark.sql.RowFactory; 
import org.apache.spark.sql.types.DataTypes; 
import org.apache.spark.sql.types.Metadata; 
import org.apache.spark.sql.types.StructField; 
import org.apache.spark.sql.types.StructType; 

List<Row> data = Arrays.asList(
      RowFactory.create(0, "Hi I heard about Spark"), 
      RowFactory.create(1, "I wish Java could use case classes"), 
      RowFactory.create(2, "Logistic,regression,models,are,neat") 
    ); 

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

Nun wollen wir unsere Pipeline definieren (tokenizer, ngram Transformator und zählen vectorizer):

Tokenizer tokenizer = new Tokenizer().setInputCol("text").setOutputCol("words"); 

NGram ngramTransformer = NGram().setN(2).setInputCol("words").setOutputCol("ngrams"); 

CountVectorizer countVectorizer = new CountVectorizer() 
    .setInputCol("ngrams") 
    .setOutputCol("feature") 
    .setVocabSize(3) 
    .setMinDF(2); 

Wir können jetzt die Pipeline erstellen und trainieren:

Pipeline pipeline = new Pipeline() 
      .setStages(new PipelineStage[]{tokenizer, ngramTransformer, countVectorizer}); 

// Fit the pipeline to training documents. 
PipelineModel model = pipeline.fit(sentenceDataFrame); 

Ich hoffe, das hilft