Apache Spark MLlibを使用してドキュメント分類子を実装しようとしていますが、データの表現に問題があります。コードは次のとおりです。
import org.Apache.spark.sql.{Row, SQLContext}
import org.Apache.spark.sql.types.{StringType, StructField, StructType}
import org.Apache.spark.ml.feature.Tokenizer
import org.Apache.spark.ml.feature.HashingTF
import org.Apache.spark.ml.feature.IDF
val sql = new SQLContext(sc)
// Load raw data from a TSV file
val raw = sc.textFile("data.tsv").map(_.split("\t").toSeq)
// Convert the RDD to a dataframe
val schema = StructType(List(StructField("class", StringType), StructField("content", StringType)))
val dataframe = sql.createDataFrame(raw.map(row => Row(row(0), row(1))), schema)
// Tokenize
val tokenizer = new Tokenizer().setInputCol("content").setOutputCol("tokens")
val tokenized = tokenizer.transform(dataframe)
// TF-IDF
val htf = new HashingTF().setInputCol("tokens").setOutputCol("rawFeatures").setNumFeatures(500)
val tf = htf.transform(tokenized)
tf.cache
val idf = new IDF().setInputCol("rawFeatures").setOutputCol("features")
val idfModel = idf.fit(tf)
val tfidf = idfModel.transform(tf)
// Create labeled points
val labeled = tfidf.map(row => LabeledPoint(row.getDouble(0), row.get(4)))
データフレームを使用してトークンを生成し、TF-IDF機能を作成する必要があります。このデータフレームをRDD [LabeledPoint]に変換しようとすると、問題が発生します。データフレームの行をマップしましたが、Rowのgetメソッドは、データフレームスキーマ(Vector)で定義された型ではなく、Any型を返します。したがって、MLモデルをトレーニングするために必要なRDDを構築できません。
TF-IDFを計算した後にRDD [LabeledPoint]を取得するための最良のオプションは何ですか?
オブジェクトをキャストすることは私のために働いた。
試してください:
// Create labeled points
val labeled = tfidf.map(row => LabeledPoint(row.getDouble(0), row(4).asInstanceOf[Vector]))
getAs[T](i: Int): T
を使用する必要があります
// Create labeled points
import org.Apache.spark.mllib.linalg.{Vector, Vectors}
val labeled = tfidf.map(row => LabeledPoint(row.getDouble(0), row.getAs[Vector](4)))