TF-IDF (BigData, Data Mining)

TF-IDF(term frequency–inverse document frequency)是一种用于信息检索与数据挖掘的常用加权技术。
TF是词频(Term Frequency),
IDF是逆文本频率指数(Inverse Document Frequency)。

简介

TF-IDF是一种统计方法,用以评估一字词对于一个文件集或一个语料库中的其中一份文件的重要程度。
字词的重要性随着它在文件中出现的次数成正比增加,但同时会随着它在语料库中出现的频率成反比下降。
TF-IDF加权的各种形式常被搜索引擎应用,作为文件与用户查询之间相关程度的度量或评级。

除了TF-IDF以外,因特网上的搜索引擎还会使用基于链接分析的评级方法,以确定文件在搜寻结果中出现的顺序。

原理

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

IDF的主要思想

如果包含词条t的文档越少,也就是n越小,IDF越大,则说明词条t具有很好的类别区分能力。

IDF的不足之处.

如果某一类文档C中包含词条t的文档数为m,而其它类包含t的文档总数为k,显然所有包含t的文档数n=m+k,当m大的时候,n也大,按照IDF公式得到的IDF的值会小,就说明该词条t类别区分能力不强。

实际上,
如果一个词条在一个类的文档中频繁出现,则说明该词条能够很好代表这个类的文本的特征,这样的词条应该给它们赋予较高的权重,并选来作为该类文本的特征词以区别与其它类文档。

在这里插入图片描述

计算

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

在这里插入图片描述

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

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

TF-IDF代码

import math

# 计算词频(TF)
def calculate_tf(word_list):
    tf_dict = {}
    for word in word_list:
        if word in tf_dict:
            tf_dict[word] += 1
        else:
            tf_dict[word] = 1
    for word in tf_dict:
        tf_dict[word] = tf_dict[word] / len(word_list)
    return tf_dict

# 计算逆文档频率(IDF)
def calculate_idf(documents, word):
    n = 0
    for document in documents:
        if word in document:
            n += 1
    idf = math.log(len(documents) / n)
    return idf

# 计算TF-IDF
def calculate_tfidf(tf, idf):
    tfidf = {}
    for word in tf:
        tfidf[word] = tf[word] * idf[word]
    return tfidf

# 示例代码
documents = [
    ['apple', 'banana', 'orange', 'banana'],
    ['banana', 'orange', 'orange', 'orange'],
    ['apple', 'orange', 'orange', 'banana']
]

tf_list = []
idf_dict = {}
for document in documents:
    tf = calculate_tf(document)
    tf_list.append(tf)
    for word in tf:
        if word in idf_dict:
            idf_dict[word] += 1
        else:
            idf_dict[word] = 1

for word in idf_dict:
    idf_dict[word] = calculate_idf(documents, word)

tfidf_list = []
for tf in tf_list:
    tfidf = calculate_tfidf(tf, idf_dict)
    tfidf_list.append(tfidf)

print(tfidf_list)

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Cmy_CTO

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值