Java Deeplearning4j到spark管道:将字符串类型转换为org.apache.spark.mllib.linalg.VectorUDT

Java Deeplearning4j到spark管道:将字符串类型转换为org.apache.spark.mllib.linalg.VectorUDT,java,apache-spark,machine-learning,deeplearning4j,Java,Apache Spark,Machine Learning,Deeplearning4j,我有一个情绪分析程序,可以使用循环中性网络预测给定的电影评论是正面的还是负面的。我使用的是深度学习4J深度学习lib库。现在我需要将该程序添加到ApacheSpark管道中 执行此操作时,我有一个类MovieReviewClassifier,它扩展了org.apache.spark.ml.classification.ProbabilisticClassifier,我必须将该类的一个实例添加到管道中。使用setFeaturesCol(String s)方法将构建模型所需的功能输入到程序中。我添加

我有一个情绪分析程序,可以使用循环中性网络预测给定的电影评论是正面的还是负面的。我使用的是深度学习4J深度学习lib库。现在我需要将该程序添加到ApacheSpark管道中

执行此操作时,我有一个类
MovieReviewClassifier
,它扩展了
org.apache.spark.ml.classification.ProbabilisticClassifier
,我必须将该类的一个实例添加到管道中。使用
setFeaturesCol(String s)
方法将构建模型所需的功能输入到程序中。我添加的功能是
String
格式的,因为它们是用于情绪分析的一组字符串。但是这些特性应该以
org.apache.spark.mllib.linalg.VectorUDT
的形式出现。有没有办法将字符串转换为矢量UDT

我已在下面附上我的管道实现代码:

public class RNNPipeline {
    final static String RESPONSE_VARIABLE =  "s";
    final static String INDEXED_RESPONSE_VARIABLE =  "indexedClass";
    final static String FEATURES = "features";
    final static String PREDICTION = "prediction";
    final static String PREDICTION_LABEL = "predictionLabel";

    public static void main(String[] args) {

        SparkConf sparkConf = new SparkConf();
        sparkConf.setAppName("test-client").setMaster("local[2]");
        sparkConf.set("spark.driver.allowMultipleContexts", "true");
        JavaSparkContext javaSparkContext = new JavaSparkContext(sparkConf);
        SQLContext sqlContext = new SQLContext(javaSparkContext);

        // ======================== Import data ====================================
        DataFrame dataFrame =    sqlContext.read().format("com.databricks.spark.csv")
                .option("inferSchema", "true")
                .option("header", "true")
                .load("/home/RNN3/WordVec/training.csv");

        // Split in to train/test data
        double [] dataSplitWeights = {0.7,0.3};
        DataFrame[] data = dataFrame.randomSplit(dataSplitWeights);



        // ======================== Preprocess ===========================



        // Encode labels
        StringIndexerModel labelIndexer = new StringIndexer().setInputCol(RESPONSE_VARIABLE)
                .setOutputCol(INDEXED_RESPONSE_VARIABLE)
                .fit(data[0]);


        // Convert indexed labels back to original labels (decode labels).
        IndexToString labelConverter = new IndexToString().setInputCol(PREDICTION)
                .setOutputCol(PREDICTION_LABEL)
                .setLabels(labelIndexer.labels());


        // ======================== Train ========================



        MovieReviewClassifier mrClassifier = new MovieReviewClassifier().setLabelCol(INDEXED_RESPONSE_VARIABLE).setFeaturesCol("Review");



        // Fit the pipeline for training..setLabelCol.setLabelCol.setLabelCol.setLabelCol
        Pipeline pipeline = new Pipeline().setStages(new PipelineStage[] { labelIndexer, mrClassifier, labelConverter});
        PipelineModel pipelineModel = pipeline.fit(data[0]);

        }

  }
Review是功能列,其中包含要预测为正或负的字符串

我在执行代码时出现以下错误:

Exception in thread "main" java.lang.IllegalArgumentException: requirement failed: Column Review must be of type org.apache.spark.mllib.linalg.VectorUDT@f71b0bce but was actually StringType.
    at scala.Predef$.require(Predef.scala:233)
    at org.apache.spark.ml.util.SchemaUtils$.checkColumnType(SchemaUtils.scala:42)
    at org.apache.spark.ml.PredictorParams$class.validateAndTransformSchema(Predictor.scala:50)
    at org.apache.spark.ml.Predictor.validateAndTransformSchema(Predictor.scala:71)
    at org.apache.spark.ml.Predictor.transformSchema(Predictor.scala:116)
    at org.apache.spark.ml.Pipeline$$anonfun$transformSchema$4.apply(Pipeline.scala:167)
    at org.apache.spark.ml.Pipeline$$anonfun$transformSchema$4.apply(Pipeline.scala:167)
    at scala.collection.IndexedSeqOptimized$class.foldl(IndexedSeqOptimized.scala:51)
    at scala.collection.IndexedSeqOptimized$class.foldLeft(IndexedSeqOptimized.scala:60)
    at scala.collection.mutable.ArrayOps$ofRef.foldLeft(ArrayOps.scala:108)
    at org.apache.spark.ml.Pipeline.transformSchema(Pipeline.scala:167)
    at org.apache.spark.ml.PipelineStage.transformSchema(Pipeline.scala:62)
    at org.apache.spark.ml.Pipeline.fit(Pipeline.scala:121)
    at RNNPipeline.main(RNNPipeline.java:82)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:606)
    at com.intellij.rt.execution.application.AppMain.main(AppMain.java:144)
根据其

用户定义的Vector类型,允许通过DataFrame与SQL轻松交互

事实上

DataFrame支持许多基本和结构化类型;有关受支持类型的列表,请参阅Spark SQL数据类型参考。除了Spark SQL指南中列出的类型外,DataFrame还可以使用ML向量类型

以及您被要求提供的
org.apache.spark.sql.types.UserDefinedType

您可以传递一个
DenseVector
SparseVector
,这是根据
字符串创建的


String
“Review”
?)到
向量的转换取决于您如何组织数据。

将字符串类型转换为verctor UDT的方法是使用word2vec。我必须将word2vec对象添加到spark管道中才能进行转换。

可能吗?当然但是,如果没有示例数据和解释,就不太可能有人能够帮助你。