文档章节

Spark数据挖掘-TF-IDF文档矩阵

clebeg
 clebeg
发布于 2015/11/19 20:47
字数 1207
阅读 1993
收藏 11

Spark数据挖掘-TF-IDF文档矩阵

前言

得到词文档矩阵往往都是文本挖掘算法的第一步,词文档矩阵中行表示语料库中出现过的词(实际代码都是对词进行整数编码),列表示所有的文档,矩阵中的每个值就代表词在文档中的重要程度。目前已经有很多计算词在文档中权重的模型,不过最通用的模型应该就是 词频-逆文档频率(简称:TF-IDF) 矩阵。

TF-IDF

先看一下TF-IDF如何计算每个词在文档中的重要程度,先假设得到了下面几个变量的值:

  • termFrequencyInDoc:Int 词在文档中出现的次数
  • totalTermsInDoc: Int 文档中所有词的个数
  • termFreqInCorpus: Int 语料库中出现这个词的不同文档数
  • totalDocs: Int 整个语料库包含的文档数量

利用上面的几个值就可以计算一个词在文档中的重要程度,代码如下:

def termDocWeight(termFrequencyInDoc: Int, totalTermsInDoc: Int,
  termFreqInCorpus: Int, totalDocs: Int): Double = {
  val tf = termFrequencyInDoc.toDouble / totalTermsInDoc
  val docFreq = totalDocs.toDouble / termFreqInCorpus
  val idf = math.log(docFreq)
  tf * idf
}

TF-IDF含义解读

直观理解,TF-IDF考虑了如下两个方面:

  1. 首先,词在某篇文档中出现的越多越重要
  2. 其次,词在其他文档中尽量少出现,如果每篇文档中它都出现的很多,它就没有区分度了。所以这里采用的是文档频率取逆,也就是取倒数。

但是有个问题,首先词频是近似服从指数分布,一些通用词出现的次数可能是低频词几十或者几百倍,直接采用文档频率取逆会导致稀缺词获得一个巨大的权重,实际上就会忽略其他词的影响,这样显然不妥,为了去掉这个影响,算法采用对文档频率取逆之后再取对数,这样就把乘法差异转化为加法差异。使得稀缺词权重降低了。

TF-IDF的局限

这个算法本质还是词袋模型,它没有考虑词与词之间的顺序、语法结构以及语义。通过对每个不同的词计数,这个模型很难区别一词多义、以及同义词。实际编程中往往每篇文档表示为行向量,每个元素代表词对应的索引位置,这样可以适应语料库中文档变的越来越多,通常情况下,语料库文档的增加速度肯定大过词的增长速度。而且这样的行向量也是稀疏表示,节省空间。

TF-IDF实战

TF-IDF原理非常简单,实际工作中还是有很多需要注意的地方,下面就用 Spark 实战的方式讲解如何将一个语料库转为 TF-IDF 矩阵,首先给出具体的步骤:

  1. 实际工作中对每篇文档往往都有一个唯一的标识主键,这样方便以后的统计
  2. 文档清洗(去掉不符合要求的文档:比如文档内容为空)
  3. 文档分词(去掉停用词、按词性过滤一下词、过滤低频词、词干提取),其中词干提取指的是将比如:“大款、大款们”合并为一个词,中文实现这个难度很大。
  4. 数据加载,词编码、文档编码
  5. 将数据编码之后转为文档词向量再合并为矩阵
  6. 计算IF-IDF

数据清洗、停词库每个项目都会有不同的要求,但是分词、词编码、文档编码等工作还是比较通用的,下面会对通用技术通过 Spark 实战详细讲解(尤其是分布式编程需要注意的地方:)

分布式文本分词

分布式文本分词注意两个地方:

  • 停词库需要广播到所有机器
  • 每个 executor 只需启动一个分词模型即可,分词模型很耗资源,与连接数据库一样,每个executor只需启动一个实例

计算TF-IDF

val documents: RDD[Seq[String]] = sc.textFile("your_data_dir").map(_.split(" ").toSeq)

val hashingTF = new HashingTF()
val tf: RDD[Vector] = hashingTF.transform(documents)

tf.cache()
//没有在两个文档中出现过的词语不要
val idf = new IDF(minDocFreq = 2).fit(tf)
val tfidf: RDD[Vector] = idf.transform(tf)

© 著作权归作者所有

clebeg
粉丝 45
博文 40
码字总数 40057
作品 0
广州
程序员
私信 提问
地铁译:Spark for python developers ---Spark与数据的机器学习

机器学习可以从数据中得到有用的见解. 目标是纵观Spark MLlib,采用合适的算法从数据集中生成见解。对于 Twitter的数据集, 采用非监督集群算法来区分与Apache
Spark相关的tweets . 初始输入...

abel_cao
01/17
0
0
Spark应用HanLP对中文语料进行文本挖掘--聚类详解教程

软件:IDEA2014、Maven、HanLP、JDK; 用到的知识:HanLP、Spark TF-IDF、Spark kmeans、Spark mapPartition; 用到的数据集:http://www.threedweb.cn/thread-1288-1-1.html(不需要下载,已...

左手的倒影
2018/11/12
42
0
Spark Mlib TFIDF源码详读 笔记

在提取文本特征时,经常用到TF-IDF算法。Spark Mlib实现了该算法。下面是Spark Mlib中,TF_IDF算法调用的一个实例: 要求输入数据 必须是一行一篇文章(切过词的),Spark Mlib中没有提供切词...

小萝卜_
2016/05/05
1K
2
Spark数据挖掘-基于 LSA 隐层语义分析理解APP描述信息(1)

Spark数据挖掘-基于 LSA 隐层语义分析理解APP描述信息(1) 1 前言 结构化数据处理比较直接,然而非结构化数据(比如:文本、语音)处理就比较具有挑战。对于文本现在比较成熟的技术是搜索引擎...

clebeg
2015/11/19
1K
0
基于Spark的机器学习实践 (二) - 初识MLlib

1 MLlib概述 1.1 MLlib 介绍 ◆ 是基于Spark core的机器学习库,具有Spark的优点 ◆ 底层计算经过优化,比常规编码效率往往要高 ◆ 实现了多种机器学习算法,可以进行模型训练及预测 1.2 Spark ...

javaedge
04/09
0
0

没有更多内容

加载失败,请刷新页面

加载更多

可能是国内第一篇全面解读 Java 现状及趋势的文章

作者 | 张晓楠 Dragonwell JDK 最新版本 8.1.1-GA 发布,包括全新特性和更新! 导读:InfoQ 发布《2019 中国 Java 发展趋势报告》,反映 Java 在中国发展的独特性,同时也希望大家对 Java 有...

阿里云官方博客
29分钟前
6
0
Spring Boot 2.x基础教程:Swagger静态文档的生成

前言 通过之前的两篇关于Swagger入门以及具体使用细节的介绍之后,我们已经能够轻松地为Spring MVC的Web项目自动构建出API文档了。如果您还不熟悉这块,可以先阅读: Spring Boot 2.x基础教程...

程序猿DD
33分钟前
4
0
《毅力》读书笔记

1.确信你全身心地投入 2.准备好为目标进行艰难的跋涉 3.通过减少需要使用毅力的情形,为将来的挑战做好准备 4.尽可能具体细致地确定你的目标和实现目标的过程 5.把挑战分解为小而易于管理的小...

lingch
34分钟前
3
0
zk中快速选举FastLeaderElection实现

选举涉及概念 服务器状态 投票 如何选择投票? 协议 选举 如何进行选举? epoch 发送者 接收者 发送队列 接收队列 服务器状态 public enum ServerState { LOOKING,寻找Leader状态,当服务处于...

writeademo
37分钟前
4
0
教你玩转Linux—磁盘管理

Linux磁盘管理好坏直接关系到整个系统的性能问题,Linux磁盘管理常用三个命令为df、du和fdisk。 df df命令参数功能:检查文件系统的磁盘空间占用情况。可以利用该命令来获取硬盘被占用了多少...

Linux就该这么学
40分钟前
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部