基于MapReduce的TFIDF的编码

一.概念

首先大家需要知道什么是TFIDF

TF-IDF(Term Frequency-Inverse Document Frequency, 词频-逆文件频率).

是一种用于资讯检索与资讯探勘的常用加权技术。TF-IDF是一种统计方法,用以评估一字词对于一个文件集或一个语料库中的其中一份文件的重要程度。字词的重要性随着它在文件中出现的次数成正比增加,但同时会随着它在语料库中出现的频率成反比下降。

上述引用总结就是, 一个词语在一篇文章中出现次数越多, 同时在所有文档中出现次数越少, 越能够代表该文章.

这也就是TF-IDF的含义.

词频 (term frequency, TF) 指的是某一个给定的词语在该文件中出现的次数。这个数字通常会被归一化(一般是词频除以文章总词数), 以防止它偏向长的文件。(同一个词语在长文件里可能会比短文件有更高的词频,而不管该词语重要与否。)

但是, 需要注意, 一些通用的词语对于主题并没有太大的作用, 反倒是一些出现频率较少的词才能够表达文章的主题, 所以单纯使用是TF不合适的。权重的设计必须满足:一个词预测主题的能力越强,权重越大,反之,权重越小。所有统计的文章中,一些词只是在其中很少几篇文章中出现,那么这样的词对文章的主题的作用很大,这些词的权重应该设计的较大。IDF就是在完成这样的工作.

公式:

TFw=wTFw=在某一类中词条w出现的次数该类中所有的词条数目

逆向文件频率 (inverse document frequency, IDF)   IDF的主要思想是:如果包含词条t的文档越少, IDF越大,则说明词条具有很好的类别区分能力。某一特定词语的IDF,可以由总文件数目除以包含该词语之文件的数目,再将得到的商取对数得到。

公式: 

IDF=log(w+1),10IDF=log(语料库的文档总数包含词条w的文档数+1),分母之所以要加1,是为了避免分母为0

  某一特定文件内的高词语频率,以及该词语在整个文件集合中的低文件频率,可以产生出高权重的TF-IDF。因此,TF-IDF倾向于过滤掉常见的词语,保留重要的词语。 
  

TFIDF=TFIDF

二、MR实例

508篇文章,切分好的文章,首先用一个py代码把这个508篇文章合并到一起


合并的代码:


然后开始便携map的代码:

首先要明确map的作用是是要求出每篇文章不同词在当前文章只出现一次,这样的作用是为了求IDF的值,一个词在一篇文章保证只出现一次,另外还需要这个词在当前文章出现的次数,和当前文章的总词数,后面两个指标是为了求TF的值,最后为了区分每个TFIDF的值在不同文章里面的值,还需要文章名,知道这些后,我们来写代码:

#coding=utf-8

import sys
#当前这一篇文章的总词数
everyWord = 0


for line in sys.stdin:
        ss = line.strip().split('\t')
        if len(ss) != 2:
                continue
        fileName,fileContent = ss
        #定义一个set集合,去除当前文章的重复词的个数,为了统计该词在508篇文章出现的文章次数
        word_set = set()
        #定义字典类型,为了统计当前文章每个词出现的次数,方便red计算tf值
        word_dict = {}
        for content in fileContent.strip().split(' '):
                s = content.strip()
                #如果字典里面没有该单词,给字典的key=word value= 1,如果已经存在,直接修改value值进行+1
                if s not in word_dict:
                        word_dict[s] = 1
                else:
                        word_dict[s] += 1
                word_set.add(s)


                everyWord = len(fileContent.strip().split(' '))

        for word in word_set:
                if word in word_dict:

                        print '%s\t%s\t%s\t%s\t%s' %(word,1,word_dict[word],everyWord,fileName)

好了,map写好后,接下来看reduce,由于字数限制,所有执行的代码可以在我的下载里面下载,接下来只讲下思路:

reducer的作用就是利用map出来的结果进行合并计算,

我们需要计算的是TF值,和IDF的值,map出来的结果:


第一是单词,第二个是计算idf所需要的值,即代表文章数,第三个是在相应文章里面出现的次数,第四个是当前文章的总的次数,第五个是文章名,好,有这几个值,我们先来算idf,idf的值=总的文章数/该词在所有文章里出现文章的数+1 总的文章数是知道的,然后我们来计算分母,开始循环所有这结果,计算分母即可,这里需要注意的是,map出来的结果已经是partititon,sort之后的结果,已经排完序了,所以用的时候只要判断当前词和上面的词相不相同,相同就进行sum+1,不同就把上一个输出来


接下来需要计算TF的值,而TF的值比较好算,直接计算单词出现的次数/总词数即可,最后就是怎么计算每个词在当前文章里面的TFIDF了。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值