Spark-特征抽取(TF-IDF)

mac单机简单实现一个Spark-特征抽取(TF-IDF)。

TF-IDF原理:

词频TF(t,d)是某个词t在文档d中出现的次数。 
文档频率DF(t,D)是包含词t的文档d的数目。

如果我们仅使用词频来衡量重要性,则很容易过分强调那些出现非常频繁但携带很少与文档相关信息量的词。比如:的,地,得一类的。

如果一个词在在语料库中出现非常频繁,意味着它更不能携带特定文档的特定信息。逆文档频率就是一个用于度量一个词能提供多少信息量的数值:

具体定义:

IDF(t,D)=log |D|/(DF(t,D)+1)

TFIDF(t,d,D)=TF(t,d)×IDF(t,D)

在SparkML库中,TF-IDF被分为两部分:TF和IDF 已经实现了,可以直接调用。

代码如下(选取了一个中文例子,英文试了也适用):

import org.apache.spark.sql.{DataFrame, Row, SparkSession}
import org.apache.spark.ml.feature.{HashingTF, _}

object HFTest {

  def main(args: Array[String]) {
    val spark = SparkSession
      .builder
      .appName("HFTest")
      .getOrCreate()

    val sentenceDataFrame = spark.createDataFrame(Seq(
      (0, "一种 简单 的 文本 特征 提取 算法"),
      (1, "特征 提取 算法"),
      (2, "一种 简单")
    )).toDF("id", "sentence")

    val tokenizer = new Tokenizer().setInputCol("sentence").setOutputCol("words")
    var wordData = tokenizer.transform(sentenceDataFrame)
    wordData.select("sentence", "words").show(false)
    //HashingTF是一个Transformer,文本处理中接收词条的集合然后把这些集合转换成固定长度的特征向量
    //这个算法在哈希的同时会统计各个词条的词频

    var hashingTF = new HashingTF()
      .setInputCol("words").setOutputCol("tf")
    val tf= hashingTF.transform(wordData)
    tf.cache()
    tf.show(false)

    val idf=new IDF().setInputCol("tf").setOutputCol("features").fit(tf)
    val tfidf =idf.transform(tf)

    println("tfidf: ")
    tfidf.show(false)


    spark.stop()

}

}

输出:

代码中没有设定HashingTF的大小,系统默认给了262144,如果是集群上设为100万+也是可以的。

+---+-------------------+---------------------------+---------------------------------------------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+

|id |sentence           |words                      |tf                                                                                     |features                                                                                                                                                                                             |

+---+-------------------+---------------------------+---------------------------------------------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+

|0  |一种 简单 的 文本 特征 提取 算法|[一种, 简单, 的, 文本, 特征, 提取, 算法]|(262144,[40925,60063,110521,111586,112201,238030,260200],[1.0,1.0,1.0,1.0,1.0,1.0,1.0])|(262144,[40925,60063,110521,111586,112201,238030,260200],[0.28768207245178085,0.28768207245178085,0.6931471805599453,0.28768207245178085,0.28768207245178085,0.6931471805599453,0.28768207245178085])|

|1  |特征 提取 算法           |[特征, 提取, 算法]               |(262144,[60063,111586,260200],[1.0,1.0,1.0])                                           |(262144,[60063,111586,260200],[0.28768207245178085,0.28768207245178085,0.28768207245178085])                                                                                                         |

|2  |一种 简单              |[一种, 简单]                   |(262144,[40925,112201],[1.0,1.0])                                                      |(262144,[40925,112201],[0.28768207245178085,0.28768207245178085])                                                                                                                                    |

+---+-------------------+---------------------------+---------------------------------------------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值