Spark机器学习之 TF-IDF
TF-IDF简介
TF-IDF叫做词频-逆向文件频率,主要体现一个文档当中的词语在语料库中的重要程度,计算公式如下:
I
D
F
(
t
,
D
)
=
l
o
g
∣
D
∣
+
1
D
F
(
t
,
D
)
+
1
,
.
IDF(t,D) = log\frac{|D|+1}{DF(t,D)+1},.
IDF(t,D)=logDF(t,D)+1∣D∣+1,.
TF分为两步,分为TF和IDF,在TF中使用Hashing处理文本,HashingTF相当于一个转换器,在文本当中会把相关的单词构成一个集合输入到hashingTF中,并由HasingTF转换成固定长度的特征向量,IDF是一个评估器,将TF转换器转换得到的特征向量作为当前的IDFModel的输入,通过计算得到单词在文档中出现的频次,IDF会进行权重的调整,会把介词等词的权重进行调整
示例如下
导入TF-IDF所需要的包
import org.apache.spark.ml.feature.{HashingTF,IDF,Tokenizer}
RDD的隐式转换包
import spark.implicits._
创建一个简单的DataFrame
val sentenceData=spark.createDataFrame(Seq(
(0,"I heard Spark but I love MapReduce"),
(1,"I wish Java could use case classes"),
(2,"Logistic regression models are neat")
)).toDF("label","sentence")
使用tokenizer对句子进行分词操作
setInputCol表示输入列,setOutputCol表示输出列,输入列为sentence,输出到words中
val tokenizer=new Tokenizer().setInputCol("sentence").setOutputCol("words")
val wordsData=tokenizer.transform(sentenceData)
查看分词结果
wordsData.show(false)
使用HashingTF的transform方法把句子哈希成为特征向量
使用setNumFeatures()设置向量空间大小
val hashingTF=new
HashingTF().setInputCol("words").setOutputCol("rawFeatures").setNumFeatures(2000)
val featurizedData=hashingTF.transform(wordsData)
featurizedData.select("rawFeatures").show(false)
其中2000表示哈希桶数量,第一个中括号的内容表示哈希值,第二个中括号表示单词出现的次数
使用IDF对单纯的词频特征向量进行权重调整
这一步主要是减少a,an,the之类的单词的权重,得到新的特征向量
val idf=new IDF().setInputCol("rawFeatures").setOutputCol("features")
val idfModel=idf.fit(featurizedData)
调用IDFModel的transform方法
take(3)表示取出前三条记录
val rescaledData=idfModel.transform(featurizedData)
rescaledData.select("features","label").take(3).foreach(println)
此时第二个中括号内的数据表示的就是每个单词的重要性的权值