SparkMLLib中基于DataFrame的TF-IDF

一 简介

假如给你一篇文章,让你找出其关键词,那么估计大部分人想到的都是统计这个文章中单词出现的频率,频率最高的那个往往就是该文档的关键词。实际上就是进行了词频统计TF(Term Frequency,缩写为TF)

但是,很容易想到的一个问题是:“的”“是”这类词的频率往往是最高的对吧?但是这些词明显不能当做文档的关键词,这些词有个专业词叫做停用词(stop words),我们往往要过滤掉这些词。

这时候又会出现一个问题,那就是比如我们在一篇文章(浪尖讲机器学习)中得到的词频:“中国人”“机器学习“ ”浪尖”,这三个词频都一样,那是不是随便选个词都能代表这篇文章呢?显然不是。中国人是一个很泛很泛的词,相对而言“机器学习”,“浪尖”对于这篇文章重要性要拍在中国人前面。

所以,我们需要一个重要性调整系数,衡量一个词是不是常见词。如果某个词比较少见,但是它在这篇文章中多次出现,那么它很可能就反映了这篇文章的特性,正是我们所需要的关键词。

用统计学语言表达,就是在词频的基础上,要对每个词分配一个"重要性"权重。最常见的词("的"、"是"、"在")给予最小的权重,较常见的词("中国")给予较小的权重,较少见的词("蜜蜂"、"养殖")给予较大的权重。这个权重叫做"逆文档频率"(Inverse Document Frequency,缩写为IDF),它的大小与一个词的常见程度成反比。

知道了"词频"(TF)和"逆文档频率"(IDF)以后,将这两个值相乘,就得到了一个词的TF-IDF值。某个词对文章的重要性越高,它的TF-IDF值就越大。所以,排在最前面的几个词,就是这篇文章的关键词。

再啰嗦的概述一下:

TF-IDF是一种统计方法,用以评估一字词对于一个文件集或一个语料库中的其中一份文件的重要程度。字词的重要性随着它在文件中出现的次数成正比增加,但同时会随着它在语料库中出现的频率成反比下降。TF-IDF加权的各种形式常被搜索引擎应用,作为文件与用户查询之间相关程度的度量或评级。除了TF-IDF以外,因特网上的搜索引擎还会使用基于链接分析的评级方法,以确定文件在搜寻结果中出现的顺序。

二 TF-IDF统计方法

本节中会出现的符号解释:

TF(t,d):表示文档d中单词t出现的频率

DF(t,D):文档集D中包含单词t的文档总数。

TF-词频计算方法

考虑到文档内容有长短之分,进行词频标准化

IDF-逆向文档频率

数学表达方法

如果一个词越常见,那么分母就越大,逆文档频率就越小越接近0。分母之所以要加1,是为了避免分母为0(即所有文档都不包含该词)。log表示对得到的值取对数。

TF-IDF

数学表达式

可以看到,TF-IDF与一个词在文档中的出现次数成正比,与该词在整个语言中的出现次数成反比。所以,自动提取关键词的算法就很清楚了,就是计算出文档的每个词的TF-IDF值,然后按降序排列,取排在最前面的几个词。

三 Spark MLlib中的TF-IDF

在MLlib中,是将TF和IDF分开,使它们更灵活。

TF: HashingTF与CountVectorizer这两个都可以用来生成词频向量。

HashingTF是一个Transformer取词集合并将这些集合转换成固定长度的特征向量。在文本处理中,“一组术语”可能是一堆文字。HashingTF利用哈希技巧。通过应用hash函数将原始特征映射到index。这里是有的hash算法是MurmurHash3. 然后根据映射的index计算词频。这种方式避免了计算一个全局的term-to-index的映射,因为假如文档集比较大的时候计算该映射也是非常的浪费,但是他带来了一个潜在的hash冲突的问题,也即不同的原始特征可能会有相同的hash值。为了减少hash冲突,可以增加目标特征的维度,例如hashtable的桶的数目。由于使用简单的模来将散列函数转换为列索引,所以建议使用2的幂作为特征维度,否则特征将不会均匀地映射到列。默认的特征维度是 =262,144。可选的二进制切换参数控制术语频率计数。设置为true时,所有非零频率计数都设置为1. 这对建模二进制(而不是整数)计数的离散概率模型特别有用。

CountVectorizer将文本文档转换为词条计数的向量。这个后面浪尖会出文章详细介绍。

IDF:是一个Estimator,作用于一个数据集并产生一个IDFModel。IDFModel取特征向量(通常这些特征向量由HashingTF或者CountVectorizer产生)并且对每一列进行缩放。直观地,它对语料库中经常出现的列进行权重下调。

注意:spark.ml不提供文本分割的工具。推荐你参考http://nlp.stanford.edu/ 和https://github.com/scalanlp/chalk

四 举例说明

下面的例子中,使用Tokenizer将句子分割成单词。对于每个句子(单词包),我们使用HashingTF 将句子散列成一个特征向量。我们IDF用来重新调整特征向量;使用文本作为特征向量的时候通常会提高性能。然后特征向量就可以传递给学习算法了。

import org.apache.spark.ml.feature.{HashingTF, IDF, Tokenizer}
import org.apache.spark.sql.SparkSession

object TfIdfExample {

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

 // $example on$
 val sentenceData = spark.createDataFrame(Seq(
      (0.0, "Hi I heard about Spark"),
 (0.0, "I wish Java could use case classes"),
 (1.0, "Logistic regression models are neat")
    )).toDF("label", "sentence")

 val tokenizer = new Tokenizer().setInputCol("sentence").setOutputCol("words")
 val wordsData = tokenizer.transform(sentenceData)

 val hashingTF = new HashingTF().setInputCol("words").setOutputCol("rawFeatures").setNumFeatures(20)

 //也可以使用CountVectorizer来获取词频向量
 val featurizedData = hashingTF.transform(wordsData)
 // alternatively, CountVectorizer can also be used to get term frequency vectors

 val idf = new IDF().setInputCol("rawFeatures").setOutputCol("features")
 val idfModel = idf.fit(featurizedData)

 val rescaledData = idfModel.transform(featurizedData)
 rescaledData.select("label", "features").show()

 spark.stop()
  }
}

原文发布于微信公众号 - Spark学习技巧(bigdatatip)

原文发表时间:2017-12-06

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏大数据挖掘DT机器学习

文本挖掘:社交网络、社群划分

作者:Matt 自然语言处理实习生 http://blog.csdn.net/sinat_26917383/article/details/5144453...

45560
来自专栏量化投资与机器学习

【Python量化投资】金融应用中用matplotlib库实现的数据可视化

Python中,matplotlib可以视为数据可视化的基准和主力。尽管有许多其他的可视化库,但是matplotlib已经确立了一个标杆,在许多情况下,它都是健...

32950
来自专栏数据科学学习手札

(数据科学学习手札08)系统聚类法的Python源码实现(与Python,R自带方法进行比较)

聚类分析是数据挖掘方法中应用非常广泛的一项,而聚类分析根据其大体方法的不同又分为系统聚类和快速聚类,其中系统聚类的优点是可以很直观的得到聚类数不同时具体类中包括...

28850
来自专栏机器之心

学界 | 斯坦福提出神经任务编程NTP:让机器人从层级任务中学习

选自arXiv 机器之心编译 参与:朱乾树、蒋思源 斯坦福视觉与学习实验室与加州大学提出神经任务编程(NTP),它可以将指定任务作为输入,并递归地将该任务分解成...

37690
来自专栏我的技术专栏

浅谈 GPU图形固定渲染管线

图形渲染管道被认为是实时图形渲染的核心,简称为管道。管道的主要功能是由给定的虚拟摄像机、三维物体、灯源、光照模型、纹理贴图或其他来产生或渲染一个二维图像。由此可...

29480
来自专栏量子位

AlphaGo Zero你也来造一只,PyTorch实现五脏俱全| 附代码

遥想当年,AlphaGo的Master版本,在完胜柯洁九段之后不久,就被后辈AlphaGo Zero (简称狗零) 击溃了。

18600
来自专栏机器学习算法原理与实践

用Spark学习矩阵分解推荐算法

    在矩阵分解在协同过滤推荐算法中的应用中,我们对矩阵分解在推荐算法中的应用原理做了总结,这里我们就从实践的角度来用Spark学习矩阵分解推荐算法。

15730
来自专栏ATYUN订阅号

验证码,再见!利用机器学习在15分钟内破解验证码

每个人都讨厌验证码——只有输入了那些讨厌的图片上的文本,才能访问网站。验证码的设计是为了防止计算机自动填写表格,验证你是一个真实的“人”。但随着深度学习和计算机...

54150
来自专栏数据科学与人工智能

【算法】TextRank算法为文本生成关键字和摘要

TextRank算法基于PageRank,用于为文本生成关键字和摘要。其论文是:

11620
来自专栏生信技能树

第5篇:对ATAC-Seq/ChIP-seq的质量评估(二)——ChIPQC

第4篇:对ATAC-Seq/ChIP-seq的质量评估(一)——phantompeakqualtools

59430

扫码关注云+社区

领取腾讯云代金券