1、TF-IDF

  TF-IDF(term frequency/inverse document frequency) 的概念被公认为信息检索中最重要的发明。描述单个term与特定document的相关性。

  TF(Term Frequency): 表示一个term与某个document的相关性。公式为: term在document中出现的次数/document中所有term出现的总次数.

  IDF(Inverse Document Frequency):表示一个term表示document的主题的权重大小。

  主要是通过包含了该term的docuement的数量和docuement set的总数量来比较的。出现的次数越多,权重越小。公式是log(D/Dt)   D是文档集合大小

Dw是包含了该Word的文档的总数。根据关键字k1,k2,k3进行搜索结果的相关性就变成TF1*IDF1 + TF2*IDF2 + TF3*IDF3。比如document1的term总量

为1000,k1,k2,k3在document1出现的次数是100,200,50。包含了 k1, k2, k3的docuement总量分别是1000, 10000,5000。document set的总

量为10000。

  TF1 = 100/1000 = 0.1;                           TF2 = 200/1000 = 0.2;                           TF3 = 50/1000 = 0.05;

  IDF1 = log(10000/1000) = log(10) = 2.3; IDF2 = log(10000/100000) = log(1) = 0;  IDF3 = log(10000/5000) = log(2) = 0.69;

  这样关键字k1,k2,k3与docuement1的相关性= 0.1*2.3 + 0.2*0 + 0.05*0.69 = 0.2645;其中k1比k3的比重在document1要大,k2的比重是0.

  TF/IDF 的概念就是一个特定条件下、关键词的概率分布的交叉熵(Kullback-Leibler Divergence)。

  TF和IDF的其他解释可参阅《数学之美》(吴军著),这本书超赞。

2、MapReduce 计算

  不讨论实现的细节,只考虑如何构造其中的Key和value。

  为了计算TF-IDF ,需要分别计算TF和IDF,TF为单词在文档中的频率,因此首先需要知道单词 word在文档Doc中出现的频度,其次需要知道当前Doc中单词的个数。

第一个JOB计算word在Doc中的频度。

  MAP的输入:Key:行号 Value为对应文档的一行。在map函数中将每一行切分为一个个的单词,当然这么做其实是不完全正确的,比如对于词组 set

out,其原本的意思是出发,但是将其按单词进行划分后变为 set 和out,这不是我们原本的意愿。在此,为了简单起见我们忽略这些细节。MAP的输出:

Word@Doc   1。也就是 单词@文档名称 作为Key,Value为 1,表示 单词Word在Doc中出现了一次。

  MapReduce的会根据Key排序并组合相应的Value,因此JOB1的Reduce输入为:Key:Word@Doc  Value:1,1,1,1... 因此可以统计出单词Word在

Doc中一共 出现了多少次。将Reduce的输出设为:Key:Doc  Value:Word->N。表示文档Doc中单词Word出现了N次。经过MapReduce的shuffle过程

后,Reduce的输出变为:Key:Doc  Value:Word1->N1  Word2->N2,... ... ,Wordk->Nk。JOB1的Reduce输出可以作为JOB2-Map的输入。

  到此,第一个JOB就统计了单词在不同文档的频度,Reduce的输出为第二个JOB的输入。

  第二个JOB计算一个文档所有单词的个数和某一单词在文档中的频率TF。

  MAP的输入:Key:Doc  Value:Word1->N1,Word2->N2,... ...  。因此Map函数中可以计算一个文档中单词的总数Total,文档中每个单词的

个数是已知的,因此可以计算单词Word针对文档Doc的TF。将当前MAP的输出设为:Key:Word,Value:Doc  N/Total ,也就是单词作为Key,所在文档

Doc和对应的TF作为Value。经过shuffle后,JOB2-Reduce的输入:Key:Word,Value:Doc1 N1/Total  Doc2 N2/Total ... ... ,此时知道单词Word

在Doc1,Doc2... 等文档中出现,通过MapReduce获取文档总数,就可以计算Word针对每个文档Doc的IDF值,此时Reduce的输出变为:Key:Word@Doc Value:TF IDF TF*IDF。

  至此,TF-IDF的计算完毕。对上述过程的优化,后续探讨。

  

  

MapReduce ---- TD-IDF的更多相关文章

  1. 【Elasticsearch学习】文档搜索全过程

    在ES执行分布式搜索时,分布式搜索操作需要分散到所有相关分片,若一个索引有3个主分片,每个主分片有一个副本分片,那么搜索请求会在这6个分片中随机选择3个分片,这3个分片有可能是主分片也可能是副本分片, ...

  2. SQL Server优化技巧之SQL Server中的"MapReduce"

    日常的OLTP环境中,有时会涉及到一些统计方面的SQL语句,这些语句可能消耗巨大,进而影响整体运行环境,这里我为大家介绍如何利用SQL Server中的”类MapReduce”方式,在特定的统计情形中 ...

  3. 运用mapreduce计算tf-idf

    问题描写叙述:给定一个大文件,文件里的内容每一行为:文档名,文档内容. input 文档名1,word1 Word2 ....... 文档名2,word1 Word2 ....... output w ...

  4. Hadoop MapReduce开发最佳实践(上篇)

    body{ font-family: "Microsoft YaHei UI","Microsoft YaHei",SimSun,"Segoe UI& ...

  5. 【Hadoop学习之十二】MapReduce案例分析四-TF-IDF

    环境 虚拟机:VMware 10 Linux版本:CentOS-6.5-x86_64 客户端:Xshell4 FTP:Xftp4 jdk8 hadoop-3.1.1 概念TF-IDF(term fre ...

  6. 云计算大会有感—MapReduce和UDF

    (转载请注明出处:http://blog.csdn.net/buptgshengod) 1.參会有感       首先还是非常感谢CSDN能给我票,让我有机会參加这次中国云计算峰会.感觉不写点什么对不 ...

  7. Mapreduce的文件和hbase共同输入

    Mapreduce的文件和hbase共同输入 package duogemap;   import java.io.IOException;   import org.apache.hadoop.co ...

  8. mapreduce多文件输出的两方法

    mapreduce多文件输出的两方法   package duogemap;   import java.io.IOException;   import org.apache.hadoop.conf ...

  9. mapreduce中一个map多个输入路径

    package duogemap; import java.io.IOException; import java.util.ArrayList; import java.util.List; imp ...

随机推荐

  1. iOS开发之网络请求(基于AFNetworking的再封装)

    最近一直很忙也没有什么时间写博客了.放假了休息一下,就写一篇博客来总结一下最近做项目中出现过的问题吧!!! 首先,在项目中我的起到了什么作用,无非就是把美工(UI设计师)给我们的图显示出来,然后再和服 ...

  2. 总结PHP中几种常用的网页跳转代码

    网页跳转的意思就是指当你在浏览器中访问A页面时,会自动跳转到B页面,往往网页跳转用在404页面中会比较多点.至于怎么实现网页跳转,网上已经提供了很多的方法,有些方法是不可行的,经过测试,叶德华今天就在 ...

  3. JQuery EasyUI combobox动态添加option

    <input class="easyui-combobox" id="rwlb" name="rwlb" style="wi ...

  4. mysql 蠕虫复制

    INSERT into user_info(version,create_user_count,create_pc_count) select version,create_user_count,cr ...

  5. mysql5 乱码问题解决方案

    今天在写项目时碰到了mysql数据库数据乱码的问题,也从网上查了很多方法,前后折腾了两个小时才终于调整好.现在就把调整过程中碰到的一些问题记录下来: 1.项目是SSH架构,一开始我以为是调用hiber ...

  6. ZRender源码分析5:Shape绘图详解

    回顾 上一篇说到:ZRender源码分析4:Painter(View层)-中,这次,来补充一下具体的shape 关于热区的边框 以圆形为例: document.addEventListener('DO ...

  7. hdu 5126 stars cdq分治套cdq分治+树状数组

    题目链接 给n个操作, 第一种是在x, y, z这个点+1. 第二种询问(x1, y1, z1). (x2, y2, z2)之间的总值. 用一次cdq分治可以将三维变两维, 两次的话就变成一维了, 然 ...

  8. 安装solaris_11.2与windows双系统(VM10模拟实现)(二)

    下面我们在虚拟机下安装双系统 1.首先我们新建一个虚拟机 新建的时候一定要注意客户机操作系统应选择solaris,不然不行: 新建完成后我们先分两个分区,这里我先从U盘启动进去(也可以用xp/win7 ...

  9. python中实现多线程的几种方式

    python实现多线程的方式大概有 1.threading 2._thread #!/usr/bin/python #!coding:utf-8 import threading def action ...

  10. shell基础——变量定义

    快速参考: 变量定义格式: 变量名=值 str1="hello world" # define a string var str2=hello # define a string ...