MapReduce实现TF-IDF详解

TF-IDF算法简介

TF-IDF概念

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

原理

TFIDF的主要思想是:如果某个词或短语在一篇文章中出现的频率TF高,并且在其他文章中很少出现,则认为此词或者短语具有很好的类别区分能力,适合用来分类。TFIDF实际上是:TF * IDF,TF词频(Term Frequency),IDF逆向文件频率(Inverse Document Frequency)。

TF表示分词在文档中出现的频率,算法是:(该分词在该文档出现的次数)/(该文档分词的总数),这个值越大表示这个词越重要,即权重就越大,TF    (例如:一篇文档分词后,总共有500个分词,而分词”Hello”出现的次数是20次,则TF值是: tf =20/500=0.04)。

IDF是是一个词语普遍重要性的度量。一个文档库中,一个分词出现在的文档数越少越能和其它文档区别开来。算法是: log(总文档数/(出现该分词的文档数+1)) 。如果一个词越常见,那么分母就越大,逆文档频率就越小越接近0。分母之所以要加1,是为了避免分母为0(即所有文档都不包含该词),IDF (例如:一个文档库中总共有10000篇文档, 99篇文档中出现过“Hello”分词,则idf是: Idf = log(10000/(99+1)) =2)。

TF-IDF=词频(TF)*逆文档频率(IDF),TF-IDF与一个词在文档中的出现次数成正比,与整个语料库中包含该词的文档数成反比(例如:一篇文档分词后,总共有500个分词,而分词”Hello”出现的次数是20次,则TF值是: tf =20/500=0.04;一个文档库中总共有10000篇文档, 99篇文档中出现过“Hello”分词,则idf是: Idf = log(10000/(99+1)) =2;TF-IDF= 0.04*2=0.08)。

用途

自动提取关键词,计算出文档的每个词的TF-IDF值,然后按降序排列,取排在最前面的几个词。信息检索时,对于每个文档,都可以分别计算一组搜索词("TF-IDF"、"MapReduce")的TF-IDF,将它们相加,就可以得到整个文档的TF-IDF。这个值最高的文档就是与搜索词最相关的文档。

优缺点

TF-IDF算法的优点是简单快速,结果比较符合实际情况。缺点是,单纯以"词频"衡量一个词的重要性,不够全面,有时重要的词可能出现次数并不 多。而且,这种算法无法体现词的位置信息,出现位置靠前的词与出现位置靠后的词,都被视为重要性相同,这是不正确的(一种解决方法是,对全文的第一段和 每一段的第一句话,给予较大的权重。)。

MapReduce实现TF-IDF的思路

实现思路

通过两个MapReduce实现,第一个MapReduce计算出TF,第二个MapReduce计算IDF和TF-IDF并写入到输出文件中

第一个MR

第一步:在setup阶段通过FileSplit获取文件名,代码实现如下:

第二步:在map阶段利用StringTokenizer分词器,根据空白字符(“ ”,“\t”,“\n”)分割字符串,存储为<key=word:filename, value=1>的键值对,代码实现如下:

第三步:自定义Partition,一个文件指定给一个Reduce处理(这种处理问题很容易导致负载不均,实际开发中根据不同的业务需求,可以做相应的调整。例如:我们统计文档是全英文的可以根据首字母来指定不同的reduce,然后把计算总次数单独给一个reduce来计算) ,代码实现如下:

第四步:重写Combiner,因为Combiner在本地执行,所以Combiner可以做一定的优化,减少IO开销,在Combiner阶段对单个分词在文件块中出现的次数(这儿只能统计单个分词在单个文件块中出现的次数,不是在文章中的出现次数)做一次统计,存储为<key=word:filename, value=单个分词在文件块中出现的次数>的键值对,代码实现如下:

第五步:1、Reduce阶段,首先重写reduce方法,统计该文档分词的总数和该分词在该文档出现的次数,代码实现如下:

2、最后重写cleanup方法,计算该分词的TF值,写入到tf的临时输出文件中,存储类型为<key=word:filename, value=tf>(这儿需要对tf做一个判断,因为分母一定大于或等于分子,有可能会出现无穷小) ,代码实现如下:

第二个MR

第一步:Map阶段利用StringTokenizer分词器,根据空白字符(“ ”,“\t”,“\n”)分割字符串,存储为<key=word, value=tf:filename>的键值对,代码实现如下:

第二步:1、首先重写setup方法,统计语料库的文档总数,代码实现如下:

2、然后统计包含分词的文档数,计算分词的IDF值,最后计算TF-IDF值,并写入到输出文件中,代码实现如下:

MR的高级定制

一、打开源码,我们可以看到,MapReduce的执行过程都是由run方法来控制,根据不同的业务可以重写Mapper的run方法,定制任务的执行过程,代码实现如下:

二、重写Reducer的run方法,根据特定业务需求控制任务的执行过程,代码实现如下:

原文地址:https://www.cnblogs.com/NightmareZone/p/8535438.html

时间: 2024-07-30 19:56:14

MapReduce实现TF-IDF详解的相关文章

MapReduce工作原理图文详解 (炼数成金)

MapReduce工作原理图文详解 1.Map-Reduce 工作机制剖析图: 1.首先,第一步,我们先编写好我们的map-reduce程序,然后在一个client 节点里面进行提交.(一般来说可以在Hadoop集群里里面的任意一个节点进行,只要该节点装了Hadoop并且连入了Hadoop集群) 2.job client 在收到这个请求以后呢,会找到JobTracker并且请求一个作业ID(Job ID).(根据我们的核心配置文件,可以很轻易的找到JobTracker) 3.通过HDFS 系统把

【转】Hadoop在MapReduce中使用压缩详解

原文链接 http://www.cnblogs.com/ggjucheng/archive/2012/04/22/2465580.html#top hadoop对于压缩文件的支持 hadoop对于压缩格式的是透明识别,我们的MapReduce任务的执行是透明的,hadoop能够自动为我们 将压缩的文件解压,而不用我们去关心. 如果我们压缩的文件有相应压缩格式的扩展名(比如lzo,gz,bzip2等),hadoop就会根据扩展名去选择解码器解压. hadoop对每个压缩格式的支持,详细见下表:  

MapReduce工作原理图文详解

这篇文章主要分析以下两点内容:目录:1.MapReduce作业运行流程2.Map.Reduce任务中Shuffle和排序的过程 正文: 1.MapReduce作业运行流程 下面贴出我用visio2010画出的流程示意图: 流程分析: 1.在客户端启动一个作业. 2.向JobTracker请求一个Job ID. 3.将运行作业所需要的资源文件复制到HDFS上,包括MapReduce程序打包的JAR文件.配置文件和客户端计算所得的输入划分信息.这些文件都存放在JobTracker专门为该作业创建的文

mapreduce shuffle 和sort 详解

    MapReduce 框架的核心步骤主要分两部分:Map 和Reduce.当你向MapReduce 框架提交一个计算作业时,它会首先把计算作业拆分成若干个Map 任务,然后分配到不同的节点上去执行,每一个Map 任务处理输入数据中的一部分,当Map 任务完成后,它会生成一些中间文件,这些中间文件将会作为Reduce 任务的输入数据.Reduce 任务的主要目标就是把前面若干个Map 的输出汇总到一起并输出. 本文的重点是剖析MapReduce 的核心过程--Shuffle和Sort.在本文

Hadoop二次排序及MapReduce处理流程实例详解

一.概述 MapReduce框架对处理结果的输出会根据key值进行默认的排序,这个默认排序可以满足一部分需求,但是也是十分有限的,在我们实际的需求当中,往往有要对reduce输出结果进行二次排序的需求.对于二次排序的实现,网络上已经有很多人分享过了,但是对二次排序的实现原理及整个MapReduce框架的处理流程的分析还是有非常大的出入,而且部分分析是没有经过验证的.本文将通过一个实际的MapReduce二次排序的例子,讲述二次排序的实现和其MapReduce的整个处理流程,并且通过结果和Map.

&lt;转&gt;MapReduce工作原理图文详解

转自 http://weixiaolu.iteye.com/blog/1474172前言:  前段时间我们云计算团队一起学习了hadoop相关的知识,大家都积极地做了.学了很多东西,收获颇丰.可是开学后,大家都忙各自的事情,云计算方面的动静都不太大.呵呵~不过最近在胡老大的号召下,我们云计算团队重振旗鼓了,希望大伙仍高举“云在手,跟我走”的口号战斗下去.这篇博文就算是我们团队“重启云计算”的见证吧,也希望有更多优秀的文章出炉.汤帅,亮仔,谢总•••搞起来啊! 呵呵,下面我们进入正题,这篇文章主要

MapReduce 二次排序详解

1 首先说一下工作原理: 在map阶段,使用job.setInputFormatClass定义的InputFormat将输入的数据集分割成小数据块splites,同时InputFormat提供一个RecordReder的实现.本例子中使用的是TextInputFormat,他提供的RecordReder会将文本的一行的行号作为key,这一行的文本作为value.这就是自定义Map的输入是<LongWritable, Text>的原因.然后调用自定义Map的map方法,将一个个<LongW

Hadoop学习之路(二十三)MapReduce中的shuffle详解

概述 1.MapReduce 中,mapper 阶段处理的数据如何传递给 reducer 阶段,是 MapReduce 框架中 最关键的一个流程,这个流程就叫 Shuffle 2.Shuffle: 数据混洗 ——(核心机制:数据分区,排序,局部聚合,缓存,拉取,再合并 排序) 3.具体来说:就是将 MapTask 输出的处理结果数据,按照 Partitioner 组件制定的规则分发 给 ReduceTask,并在分发的过程中,对数据按 key 进行了分区和排序 MapReduce的Shuffle

tensorflow 的tf.where详解

最近在用到数据筛选,观看代码中有tf.where()的用法,不是很常用,也不是很好理解.在这里记录一下 1 tf.where( 2 condition, 3 x=None, 4 y=None, 5 name=None 6 ) Return the elements, either from x or y, depending on the condition. 理解:where嘛,就是要根据条件找到你要的东西. condition:条件,是一个boolean x:数据 y:同x维度的数据. 返回

tf.GradientTape详解

参考文献:https://blog.csdn.net/guanxs/article/details/102471843 在TensorFlow 1.x静态图时代,我们知道每个静态图都有两部分,一部分是前向图,另一部分是反向图.反向图就是用来计算梯度的,用在整个训练过程中.而TensorFlow 2.0默认是eager模式,每行代码顺序执行,没有了构建图的过程(也取消了control_dependency的用法).但也不能每行都计算一下梯度吧?计算量太大,也没必要.因此,需要一个上下文管理器(co