spark TF-IDF入门
在Spark ML
库中,TF-IDF
被分成两部分:TF (+hashing)
和 IDF
。
TF: HashingTF 是一个Transformer
,在文本处理中,接收词条的集合然后把这些集合转化成固定长度的特征向量
。这个算法在哈希的同时会统计各个词条的词频
。
IDF: IDF是一个Estimator
,在一个数据集上应用它的fit()
方法,产生一个IDFModel
。 该IDFModel
接收特征向量(由HashingTF产生),然后计算每一个词在文档中出现的频次。IDF
会减少那些在语料库中出现频率较高的词的权重。
Spark.mllib
中实现词频率统计使用特征hash
的方式,原始特征通过hash函数,映射到一个索引值。后面只需要统计这些索引值的频率,就可以知道对应词的频率。这种方式避免设计一个全局1对1的词到索引的映射,这个映射在映射大量语料库时需要花费更长的时间。但需要注意,通过hash
的方式可能会映射到同一个值的情况,即不同的原始特征通过Hash
映射后是同一个值。为了降低这种情况出现的概率,我们只能对特征向量升维。i.e., 提高hash表
的桶数,默认特征维度是 2^20 = 1,048,576
.
在下面的代码段中,我们以一组句子开始。首先使用分解器Tokenizer
把句子划分为单个词语。对每一个句子(词袋),我们使用HashingTF
将句子转换为特征向量
,最后使用IDF
重新调整特征向量。这种转换通常可以提高使用文本特征的性能。
import org.apache.spark.ml.feature.{HashingTF, IDF, IDFModel, Tokenizer}
import org.apache.spark.sql.{DataFrame, SparkSession}object tfidf {def main(args: Array[String]): Unit = {val spark: SparkSession = SparkSession.builder().master("local").getOrCreate()val sentenceData: DataFrame = spark.createDataFrame(Seq((0, "I heard about Spark and I love Spark"),(0, "I wish Java could use case classes"),(1, "Logistic regression models are neat"))).toDF("label", "sentence")sentenceData.show()val tokenizer: Tokenizer = new Tokenizer().setInputCol("sentence").setOutputCol("words")//+-----+--------------------+--------------------+//|label| sentence| words|//+-----+--------------------+--------------------+//| 0|I heard about Spa...|[i, heard, about,...|//| 0|I wish Java could...|[i, wish, java, c...|//| 1|Logistic regressi...|[logistic, regres...|//+-----+--------------------+--------------------+//利用分词器进行分词并成为df的一列,结果如上图//分词后还是个dataframe,且多了一列//tokenizer的transform()方法把每个句子拆分成了一个个单词。val wordsData: DataFrame = tokenizer.transform(sentenceData)wordsData.show()//用HashingTF的transform()方法把句子哈希成特征向量。我们这里设置哈希表的桶数为2000。val hashingTF: HashingTF = new HashingTF().setInputCol("words").setOutputCol("rawFeatures").setNumFeatures(2000)val featurizedData: DataFrame = hashingTF.transform(wordsData)//+-----+------------------------------------+---------------------------------------------+---------------------------------------------------------------------+//|label|sentence |words |rawFeatures |//+-----+------------------------------------+---------------------------------------------+---------------------------------------------------------------------+//|0 |I heard about Spark and I love Spark|[i, heard, about, spark, and, i, love, spark]|(2000,[240,333,1105,1329,1357,1777],[1.0,1.0,2.0,2.0,1.0,1.0]) |//|0 |I wish Java could use case classes |[i, wish, java, could, use, case, classes] |(2000,[213,342,489,495,1329,1809,1967],[1.0,1.0,1.0,1.0,1.0,1.0,1.0])|//|1 |Logistic regression models are neat |[logistic, regression, models, are, neat] |(2000,[286,695,1138,1193,1604],[1.0,1.0,1.0,1.0,1.0]) |//+-----+------------------------------------+---------------------------------------------+---------------------------------------------------------------------+// 我们可以看到每一个单词被哈希成了一个不同的索引值。// 以”I heard about Spark and I love Spark”为例,输出结果中2000代表哈希表的桶数,// “[240,333,1105,1329,1357,1777]”分别代表着“i, spark, heard, about, and, love”的哈希值,// “1.0,1.0,2.0,2.0,1.0,1.0]”为对应单词的出现次数。featurizedData.show(false)//调用IDF方法来重新构造特征向量的规模,生成的idf是一个Estimator,在特征向量上应用它的fit()方法,会产生一个IDFModel。val idf: IDF = new IDF().setInputCol("rawFeatures").setOutputCol("features")val idfModel: IDFModel = idf.fit(featurizedData)//调用IDFModel的transform方法,可以得到每一个单词对应的TF-IDF 度量值val rescaledData: DataFrame = idfModel.transform(featurizedData)//|label|sentence |words |rawFeatures |features |//+-----+------------------------------------+---------------------------------------------+---------------------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+//|0 |I heard about Spark and I love Spark|[i, heard, about, spark, and, i, love, spark]|(2000,[240,333,1105,1329,1357,1777],[1.0,1.0,2.0,2.0,1.0,1.0]) |(2000,[240,333,1105,1329,1357,1777],[0.6931471805599453,0.6931471805599453,1.3862943611198906,0.5753641449035617,0.6931471805599453,0.6931471805599453]) |//|0 |I wish Java could use case classes |[i, wish, java, could, use, case, classes] |(2000,[213,342,489,495,1329,1809,1967],[1.0,1.0,1.0,1.0,1.0,1.0,1.0])|(2000,[213,342,489,495,1329,1809,1967],[0.6931471805599453,0.6931471805599453,0.6931471805599453,0.6931471805599453,0.28768207245178085,0.6931471805599453,0.6931471805599453])|//|1 |Logistic regression models are neat |[logistic, regression, models, are, neat] |(2000,[286,695,1138,1193,1604],[1.0,1.0,1.0,1.0,1.0]) |(2000,[286,695,1138,1193,1604],[0.6931471805599453,0.6931471805599453,0.6931471805599453,0.6931471805599453,0.6931471805599453]) |//+-----+------------------------------------+---------------------------------------------+---------------------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+rescaledData.show(false)}
}
参考
Spark入门:特征抽取: TF-IDF — spark.ml_厦大数据库实验室博客
https://dblab.xmu.edu.cn/blog/1261-2/
spark TF-IDF入门相关推荐
- 搜索引擎:文本分类——TF/IDF算法
原理 TFIDF的主要思想是:如果某个词或短语在一篇文章中出现的频率TF高,并且在其他文章中很少出现,则认为此词或者短语具有很好的类别区分能力,适合用来分类.TFIDF实际上是:TF * IDF,TF ...
- 关键词提取算法—TF/IDF算法
关键词提取算法一般可分为有监督学习和无监督学习两类. 有监督的关键词提取方法可以通过分类的方式进行,通过构建一个较为完善的词表,然后判断每个文档与词表中的每个词的匹配程度,以类似打标签的方式,达到关键 ...
- tf/idf_Neo4j:带密码的TF / IDF(和变体)
tf/idf 几周前,我写了一篇博客文章,介绍了如何使用scikit-learn在HIMYM成绩单上运行TF / IDF,以按情节找到最重要的短语,然后我很好奇在Neo4j中很难做到. 我首先将Wik ...
- Neo4j:带密码的TF / IDF(和变体)
几周前,我写了一篇博客文章,介绍了如何使用scikit-learn在HIMYM成绩单上运行TF / IDF,以按情节找到最重要的短语,然后我很好奇在Neo4j中很难做到. 我首先将Wikipedia的 ...
- scitkit-learn:计算机科学论文的TF / IDF和余弦相似度
几个月前,我下载了数千篇计算机科学论文的元数据,这样我就可以尝试编写一个迷你推荐引擎来告诉我接下来应该读什么论文. 由于我没有任何人可以阅读每篇论文的数据,因此排除了协作过滤方法,所以我认为我可以尝试 ...
- Spark工作原理入门
Spark工作原理入门 文章目录 Spark工作原理入门 1.功能概要 基本描述 运用场景 实际使用 2.模块组成 HDFS MLlib Mesos Tachyon GraphX Spark SQL ...
- 大数据求索(8):Spark Streaming简易入门一
大数据求索(8):Spark Streaming简易入门一 一.Spark Streaming简单介绍 Spark Streaming是基于Spark Core上的一个应用程序,可伸缩,高吞吐,容错( ...
- 随笔_从《芳华》影评到TF/IDF算法
前两天看好多<芳华>的影评说:为什么好人没好报?于是感叹一堆世态炎凉,人性丑陋什么的.我觉得这问题是:为什么中央空调(对谁都温暖)往往不被看好. 先说说TF/IDF算法,这是一种信息处 ...
- 文本特征抽取的向量空间模型(VSM)和TF/IDF方法
文本特征抽取 两组小说,一组是爱情的,另一组是科幻的.我们能否用支持向量机训练一个模型,用来识别小说类型呢? 这个并不容易.因为支持向量机这类机器学习算法只能接受数学里面的向量作为输入.如果用它来做文 ...
- 使用lingpipe自然语言处理包进行文本分类/** * 使用 lingpipe的tf/idf分类器训练语料 * * @author laigood */ public class trai
/** * 使用 lingpipe的tf/idf分类器训练语料 * * @author laigood */ public class traintclassifier { //训练语料文件 ...
最新文章
- 改进筛法- 质数中的质数(质数筛法)
- 进化:一个平庸人的互联网之路
- python 遍历文件夹写入excel_python:创建文件夹:写入文本1:读取txt:读取Excel文件遍历文件夹:...
- dubbo使用简单说明
- 统一社会信用代码 正则验证
- Python自动化运维之高级函数
- sqlserver 日期函数
- C#LeetCode刷题之#933-最近的请求次数(Number of Recent Calls)
- Python介绍、发展史、安装、变量、注释、输入
- linux动态可执行文件,Linux中ELF格式 可执行文件+动态链接器 的加载
- Go 远超 Python,机器学习人才极度稀缺,全球 16,655 位程序员告诉你这些真相!...
- 阿里云的工程师要被祭天了?
- 编程java 格式_Java代码的基本格式
- Python科学计算初探——余弦相似度
- Visio实用技巧总结
- 推荐7款珍藏已久的手机APP,非常实用
- 《光剑文集》青玉案: 27首
- win7装sql2000找不到服务器,WIN7 64位系统 SQL2000服务无法启动
- 西方哲学史的主要发展阶段
- Python开发培训哪里好
热门文章
- 云服务器可以用来做什么?有什么用途?
- vuex mapstate_Vuex从使用到原理解析
- mysql 存储过程游标 循环输出select 查询结果
- ubuntu之间传输文件
- linux内存管理_Linux内存管理(转)
- java接口中的default_java8 通过反射执行接口的default方法
- 苹果手机耗电快_苹果手机耗电快怎么解决?我有2个小技巧能帮到你
- python对文件操作的相关函数_第六章、Python文件操作
- python类的构造方法名称_Python的面向对象、Class 概念与使用
- 广东计算机考试1级时间安排,1级计算机考试时间