一个关于spark机器学习的文字问题

以下是我的机器学习代码和部分数据截图

import org.apache.spark.sql.SparkSession
import org.apache.spark.ml.linalg.{Vector,Vectors}
import org.apache.spark.ml.Pipeline
import org.apache.spark.ml.feature.{IndexToString, StringIndexer, VectorIndexer}
import spark.implicits._
case class cars2(features: org.apache.spark.ml.linalg.Vector, label: String)
 val data = spark.sparkContext.textFile("file:///usr/local/bigdatacase/dataset/jq2.txt").map(_.split("\t")).map(p => cars2(Vectors.dense(p(1).toDouble,p(2).toDouble,p(3).toDouble, p(4).toDouble),p(0).toString())).toDF()
data.createOrReplaceTempView("cars2")
val df = spark.sql("select * from cars2")
df.map(t => t(1)+":"+t(0)).collect()

img

以下是我遇到的问题:

img

img


看上去他似乎要求我特征向量必须用数字,那么有没有什么办法能让特征向量可以用中文和英文字符呢?如果有,那该怎么做呢?


import org.apache.spark.sql.SparkSession
import org.apache.spark.ml.linalg.{Vector,Vectors}
import org.apache.spark.ml.Pipeline
import org.apache.spark.ml.feature.{IndexToString, StringIndexer, VectorIndexer}
import spark.implicits._

case class Cars2(features: org.apache.spark.ml.linalg.Vector, label: String)

val data = spark.sparkContext.textFile("file:///usr/local/bigdatacase/dataset/jq2.txt")
  .map(_.split("\t"))
  .map(p => Cars2(Vectors.dense(p(1).toDouble, p(2).toDouble, p(3).toDouble, p(4).toDouble), p(0).toString()))
  .toDF()

data.createOrReplaceTempView("cars2")

val df = spark.sql("select * from cars2")

df.map(t => t.getAs[String]("label") + ":" + t.getAs[Vector]("features").toString).collect()

基于bing、GPT部分内容和本人思考总结:

特征向量是由数字组成的向量,所以中文字符和英文字符不能直接作为特征向量的元素。但是,我们可以通过将中文和英文字符转化为数字来实现中英文混合的特征向量。
一种方法是使用词袋模型,将每个字符看做一个词,然后使用one-hot编码将每个字符映射为一个数字。例如,如果我们有一个包含中英文字符的文本“你好hello”,可以将其转化为一个长度为10的向量,其中前两个元素表示“你”和“好”,后面的5个元素表示“h”、“e”、“l”、“o”和一个空格,最后3个元素为0。
另一种方法是使用词向量,将每个字符看做一个词,并使用预训练的词向量模型将每个字符转化为一个向量。这样可以更好地捕捉字符之间的语义关系,但需要更多的计算资源和预处理工作。
无论哪种方法,都需要将中英文字符统一处理,并进行相应的编码或者转化。