一、简介
TF-IDF(Term Frequency-inverse Document Frequency)是一种针对关键词的统计分析方法,用于评估一个词对一个文件集或者一个语料库的重要程度。 一个词的重要程度跟它在文章中出现的次数成正比,跟它在语料库出现的次数成反比。 这种计算方式能有效避免常用词对关键词的影响,提高了关键词与文章之间的相关性。
对于上述解释,还需要通俗说明一下。
TF是指词频,一篇文章中的某个词与出现次数越多,那就说明这个词的重要性越强。TF = 某词在文档中出现的次数 / 文档的总词量。
IDF是指逆文本频率,一个词语如果在整个语料库高频出现,那么该词的重要性也就越低。IDF=lg (语料库中文档总数 / 包含该词的文档数+1),这里为了避免分子为0所以加一。
综上所述,TF-IDF=TF x IDF,TF-IDF值越大表示该特征词对这个文本的重要性越大。
举个例子
现在有一篇100字的短文,其中“蜡笔小新”这个词出现了5次,那么该词的TF=某个词出现的次数 / 文章总字数 = 5 / 100 = 0.05。
而这里有1000篇文章,其中“蜡笔小新”这个词的有100篇,那么该词的idf=lg (语料库中文档总数 / 包含该词的文档数+1)=lg(1000 / 100) ≈ 1。
TF-IDF=0.05 x 1 = 0.05。
对于上述案例,如果这1000篇文章中,每篇文章都含有“的”字,那么idf将接近于0,所以对于“的”这个词的TF-IDF值也就趋近于0。
二、代码
这篇代码首先加载了分词器,直接调用了另一篇文章的分词的结果,将中文切分,参考:IKAnalyzer代码及注解。
然后根据分词器的结果将词汇划分为对应值。
package com.studyTools
import com.studyTools.IKAnalyzerDemo.ik
import org.apache.spark.mllib.feature.{HashingTF, IDF}
object TFIDF_Demo {
def main(args: Array[String]): Unit = {
// HashingTF 使用hash表来存储分词
// 默认hash表的桶数为 2^20,也就是1048576
// 1000:根据当前词汇量填入,尽量避免hash碰撞即可
val tf = new HashingTF(1000)
val tf_rdd = ik.map(x => {
(x._1, tf.transform(x._2))
})
println("-------------------tf-------------------")
tf_rdd.foreach(println)
val idf = new IDF().fit(tf_rdd.map(_._2))
val tfIdfs = tf_rdd.mapValues(idf.transform(_))
println("-------------------idf-------------------")
tfIdfs.foreach(println)
}
}
结果展示
-------------------tf-------------------
加载扩展词典:extend.dic
加载扩展停止词典:stopword.dic
(1,(1000,[79,314,366,468,875,957,985],[2.0,1.0,2.0,1.0,1.0,1.0,2.0]))
(2,(1000,[25,114,249,417,429,535,562,581,731,748,750,784,794,803,811,863],[1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0]))
(3,(1000,[139,230,313,519,528,596,615,750,811,957],[1.0,1.0,1.0,1.0,1.0,1.0,1.0,2.0,1.0,1.0]))
-------------------idf-------------------
(1,(1000,[79,314,366,468,875,957,985],[1.3862943611198906,0.6931471805599453,1.3862943611198906,0.6931471805599453,0.6931471805599453,0.28768207245178085,1.3862943611198906]))
(2,(1000,[25,114,249,417,429,535,562,581,731,748,750,784,794,803,811,863],[0.6931471805599453,0.6931471805599453,0.6931471805599453,0.6931471805599453,0.6931471805599453,0.6931471805599453,0.6931471805599453,0.6931471805599453,0.6931471805599453,0.6931471805599453,0.28768207245178085,0.6931471805599453,0.6931471805599453,0.6931471805599453,0.28768207245178085,0.6931471805599453]))