TF-IDF是一种统计方法,用以评估一字词对于一个文件集或一个语料库中的其中一份文件的重要程度。字词的重要性随着它在文件中出现的次数成正比增加,但同时会随着它在语料库中出现的频率成反比下降。TF-IDF加权的各种形式常被搜索引擎应用,作为文件与用户查询之间相关程度的度量或评级。除了TF-IDF以外,因特网上的搜索引擎还会使用基于链接分析的评级方法,以确定文件在搜寻结果中出现的顺序
特征抽取:从原始数据中抽取特征。
“词频-逆向文件频率”(TF-IDF)是一种在文本挖掘中广泛使用的特征向量化方法,它可以体现一个文档中词语在语料库中的重要程度。
词语:用t表示。
文档:用d表示。
语料库:用D表示。
词频TF(t,d):词语t在文档d中出现的次数。
文件频率DF(t,D):包含词t的文档的个数。
如果我们只使用词频来衡量重要性,很容易过度强调在文档中经常出现,却没有太多实际信息的词语,比如“a”,“the”以及“of”。如果一个词语经常出现在语料库中,意味着它并不能很好的对文档进行分区。TF-IDF就是在数值化文档信息,衡量词语能提供多少信息以分区文档。定义如下:
此处|D|是语料库中总的文档数。公式中使用log函数,当词出现在所有文档中时,它的IDF值变为0。加1是为了避免分母为0的情况。那么TF-IDF度量值表示为:
在Spark ML库中,TF-IDF被分成两部分:TF (+hashing) 和 IDF。
TF: HashingTF 是一个Transformer,在文本处理中,接收词条的集合然后把这些集合转化成固定长度的特征向量。这个算法在哈希的同时会统计各个词条的词频。
IDF: IDF是一个Estimator,在一个数据集上应用它的fit()方法,产生一个IDFModel。 该IDFModel 接收特征向量(由HashingTF产生),然后计算每一个词在文档中出现的频次。IDF会减少那些在语料库中出现频率较高的词的权重。
举个例子:
假如一片文章中总词语数量为100个,而词语“机器学习”出现了3次,那么“机器学习”一词在该文件中的词频就是3/100=0.03。所以,如果“机器学习”一词在999份文件中出现过,而文件总数为9999999份的话,其逆向文件频率就是log(999+1/9999999+1)=4。最后的TF-IDF的值为0.03*4=0.12。
在调用的整个逻辑是这样的:
* 创建sparksession
* 加载数据
* 处理数据到表格的形式
* 创建hashingTF-----有输入值,输出值,特征向量的值,最后需要经过transfrom————————显示结果
* 创建idf-----------有输入值,输出值,需要使用fit方法生成idfModel,最后也需要经过transfrom————————显示结果
根据上面的步骤开始进行下面是代码的实现:
第一步,val spark: SparkSession = SparkUtils.getLocalSpark("TF_IDFDemoTest01")
第二步,加载数据。
import spark.implicits._
val createDataFrame:DataFrame = spark.createDataFrame(Seq(
(0,"Hi i ha aaaa"),
(1,"i wish java could use case classes"),
(3,"i wish ")).toDF("label","sentence")
第三步,
![](https://img.haomeiwen.com/i4175278/135cc9b2fc81932a.png)
第四步,
![](https://img.haomeiwen.com/i4175278/6871c7240c88e51d.png)
第五步,
![](https://img.haomeiwen.com/i4175278/feb75f08053b11a5.png)
这里先介绍算法的原理和实现。先把算法的原理和实现弄明白之后,再开始在项目中进行实战。
由于简书是不能上传代码的。如果你有需要的话,可以加我微信好友maochentingqiang
网友评论