TF-IDF代码及注解


一、简介

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]))
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值