赞
踩
一、TF-IDF回顾
1.TF-IDF(Term frequency-inverse document frequency )
TF-IDF是文本挖掘中一种广泛使用的特征向量化方法。TF-IDF反映了语料中单词对文档的重要程度。假设单词用t表示,F表示频度,文档用d表示,语料用D表示,那么文档频度DF(t, D)是包含单词t的文档数。
如果仅使用词的频率来衡量重要性,则介词、人称代词等词会对文档的描述产生很重要的作用,而这些词实质上对文档的描述并没有决定性的作用,例如“a”,“the”,“of”,“we”和“I”。因此如果术语在语料库中经常出现,则表示它不包含有关特定文档的特殊信息。
2.公式
逆文档频度(IDF)是单词携带信息量的数值度量。
其中 |D|是语料中的文档总数,DF(t, D)是包含单词t的文档数,文档用d表示,语料用D表示。由于使用了log计算,如果单词在所有文档中出现,那么IDF就等于0。注意这里做了平滑处理(+1操作),防止单词没有在语料中出现时IDF计算中除0。
TF-IDF度量是TF和IDF的简单相乘:
MLlib中词频统计的实现使用了hashing trick(散列技巧),也就是使用哈希函数将原始特征映射到一个数字索引。然后基于这个索引来计算词频。
3.在spark 中TF和IDF的实现是HashingTF和IDF。HashingTF以RDD为输入。
import org.apache.spark.rdd.RDD import org.apache.spark.SparkContext import org.apache.spark.mllib.feature.HashingTF import org.apache.spark.mllib.linalg.Vector import org.apache.spark.mllib.feature.IDF val sc: SparkContext = ... //读取文档数据保存到RDD:documents中 val documents: RDD[Seq[String]] = sc.textFile("...").map(_.split(" ").toSeq) val hashingTF = new HashingTF() //获取文档数据的单词频度矩阵 val tf: RDD[Vector] = hashingTF.transform(documents) //依据tf计算文档的IDF值 val idf = new IDF().fit(tf) //依据idf和tf计算文档的tfidf值 val tfidf: RDD[Vector] = idf.transform(tf)
在Spark MLlib中IDF可以设置文档的最低频度,用于过滤少于最小数量的文档中出现的术语,设置参数为minDocFreq。
import org.apache.spark.rdd.RDD
import org.apache.spark.SparkContext
import org.apache.spark.mllib.feature.HashingTF
import org.apache.spark.mllib.linalg.Vector
import org.apache.spark.mllib.feature.IDF
//读取文档数据保存到RDD:documents中
val documents: RDD[Seq[String]] = sc.textFile("...").map(_.split(" ").toSeq)
val hashingTF = new HashingTF()
//获取文档数据的单词频度矩阵
val tf: RDD[Vector] = hashingTF.transform(
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。