文本型数据的向量化:TF-IDF

1.对于文本型数据的分类处理(或者其他的处理),根据ik和jcseg等分词器先对它们进行分词处理之后,大家都知道,计算机是处理不了汉字的,对于文本型的词我们如何才能让计算机处理呢?我们可以通过TF-IDF将文本型的数据向量化。对于TF-IDF的概念我就不再阐述,网上的资源非常多,这里我主要来看看是如何实现的。
2.测试数据的准备(pca.txt)
1,纵坐标 是 该词 在该 文章 中 的 权重
0,其 出发点 是 一个词 对于 分类 的 重要性 不但 取决于 其在 整个语料 中 出现 的 概率
0,那么 它 对于 分类 的 重要性 也是 不同 的
1,我们 是 祖国 的 接班人
说明:,前面的是类别,后面的是伪造的一些分词的结构,通过空格分割,具体的一篇文章,可以通过分词器将其分割成这样的。
3.代码实现
LableWords.scala
package com.iflytek.classifier
import java.io.Serializable
case class LableWords(label:String,words:Array[String]) extends Serializable{
}

TestTfIdf.scala
package com.iflytek.tfidf
import org.apache.spark.sql.SparkSession
import org.apache.spark.ml.linalg.Vectors
import org.apache.spark.ml.feature.HashingTF
import org.apache.spark.ml.feature.IDF
import com.iflytek.classifier.LableWords
import org.apache.log4j.Logger
import org.apache.log4j.Level

object TestTfIdf {
  def main(args: Array[String]): Unit = {
    val sc=SparkSession.builder().master("local").appName("tfidf").getOrCreate()
    Logger.getRootLogger.setLevel(Level.OFF)
    import sc.implicits._
    val dataFile=sc.sparkContext.textFile("E:\\test\\pca.txt", 10)
    .map { line => val split=line.split(",")
      LableWords(split(0),split(1).split(" ")) }.toDS
    val tf=new HashingTF().setInputCol("words").setOutputCol("rawfeatures").setNumFeatures(10000)//10000表示设置的特征数
    val tfdata=tf.transform(dataFile)
    val idf=new IDF().setInputCol("rawfeatures").setOutputCol("features").fit(tfdata)
    val idfdata=idf.transform(tfdata) 
    idfdata.select("label", "features").foreach { x => println(x.apply(0)+" "+x.apply(1)) }
  }
}
4.运行结果截图
文本型数据的向量化:TF-IDF_第1张图片
说明:最左边的是类别(0,1)右边的10000是特征数,就是第一个[]里面的数据是每个词被转换成的数字,范围应该在特征数之间,后面的[]是这个词对应的tfidf的值。

你可能感兴趣的:(spark)