大数据学习之路(十一)——MapReduce实战(TF-IDF)

本次项目必须在完全部分下执行,单机或者伪分布应该都执行不了,会提示找不到文件。

项目介绍:TF-IDF

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

应用场景:

1. 权重计算方法经常会和余弦相似度(cosine similarity)一同使用于向量空间模型中,用以判断两份文件之间的相似性。

2. 广告投放,收集用户的朋友圈,或者博客,你会发现,朋友圈给你投放的广告,往往你跟发布的东西有关,例如一个人很喜欢旅游,那我们应该给他投放旅行社,或者风景秀丽的旅游景点。

3. 利用TF-IDF,对数据库的文本进行分词,建立索引后入库,提高用户全文检索的速率。

4. 等等…


接着我们看一下TF-IDF的公式,以及他的原理:

  我们首先看一下,何为TF

词频(term frequency,TF)指的是某一个给定的词语在该文件中出现的频率。这个数字是对词数(term count)的归一化,以防止它偏向长的文件。(同一个词语在长文件里可能会比短文件有更高的词数,而不管该词语重要与否。)对于在某一特定文件里的词语来说,它的重要性可表示为:
这里写图片描述
以上式子中分子是该词在文件中的出现次数,而分母则是在文件中所有字词的出现次数之和。

  我们首先看一下,何为IDF

逆向文件频率(inverse document frequency,IDF)是一个词语普遍重要性的度量。某一特定词语的IDF,可以由总文件数目除以包含该词语之文件的数目,再将得到的商取对数得到。
这里写图片描述
分子:|D| 语料库中的文件总数
分母:包含词语的文件数目(即的文件数目)如果该词语不在语料库中,就会导致分母为零,因此一般情况下使用
这里写图片描述
作为分母。

我们再看一下TF-IDF的公式:

这里写图片描述


在大致了解TF-IDF算法后,我们如何栗子,运用一下我们的Hadoop。

数据:

3823890210294392    今天我约了豆浆,油条
3823890235477306    一会儿带儿子去动物园约起~
3823890239358658    继续支持
3823890256464940    约起来!次饭去!
3823890264861035    我约了吃饭哦
...
ok,那接下来我们要做什么呢?我们要给每个用户进行计算,提取他的微博中的关键词,然后可以给用户进行精准投放。

思路:

我们需要获取公式中的各个参数。
1.语料库中的文件总数 |D|

这个只需要在一次MapReduce中进行统计就ok了。

2.每个微博中某个单词出现的总数 (nij)(∑kNkj)

我们用分词器(IKSegmenter)对用户的微博进行题词,count一下分子器的结果就可以得到∑kNkj,但是同一个微博中,除数是相同的,所以即使不除,也不会影响我们最终的结果,反而数据看起来更加明显
[ http://tool.oschina.net/uploads/apidocs/ikanalyzer/org/wltea/analyzer/core/IKSegmenter.html ]
并在reducer中根据单词,对用户一整个微博的次数进行统计,

  line结构设计可以如下
今天_3823890210294392    1
豆浆_3823890210294392    1
油条_3823890210294392    1
...
3. 我们来计算某个词语在总微博中出现的微博数(注意是微博数)(|{j:t《d}|)

我们需要对第一次的结果数据再次进行一次MapReduce

  组成如下结构

豆浆 3
...
4. 我们基本上集齐了公式所需的数据,接着我们要进行最后一次MapReduce

  首先,之前文件中所计算出来的数据使我们所需要的,我们需要对他进行缓存,以便后期计算的时候获取,我们将用到Job的addCacheFile方法,将指定URI加入进行缓存。
  然后,我们需要在mapper的setup中,先将缓存提取到内存中,我们定义两个map,根据规则拆分单词,进行缓存,然我们可以在map中使用。

我们将数据在mapper中处理成如下格式

key:3823890210294392
value: 豆浆:3.123
...

在reducer中中我们进行公式的最后一步,将所有的结果归总:

3823890210294392    豆浆:3.123    今天:0.123
...

在代码中,我们将会用到

// 换门缓存之前的结果文件
Job.addCacheFile
// 我们需要在Mapper中实现setup,并切将之前缓存的文件存入我们的内存中

代码在这里

[ https://github.com/qn9301/bigdata-learn/tree/master/hadoop/src/com/hadoop/learn/tfidf ]

猜你喜欢

转载自blog.csdn.net/qq_31343581/article/details/80905228
今日推荐