TF_IDF原理与实践

TF-IDF是一种统计方法,评估单词在文档中的重要性。它是TF(词频)和IDF(逆向文件频率)的乘积,常用于信息检索和文本挖掘。TF衡量词在文档中的频率,IDF反映词在文档集中的独特性。TF-IDF有助于过滤停用词,适用于文本摘要和分类。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

定义

在信息检索中,tf-idf(词频-逆文档频率)是一种统计方法,用以评估一个单词在一个文档集合或语料库中的重要程度。经常被用作信息检索、文本挖掘以及用户模型的权重因素。tf-idf的值会随着单词在文档中出现的次数的增加而增大,也会随着单词在语料库中出现的次数的增多而减小。tf-idf是如今最流行的词频加权方案之一。

tf-idf的各种改进版本经常被搜索引擎用作在给定用户查询时对文档的相关性进行评分和排序的主要工具。tf-idf可以成功地用于各种主题字段的停用词过滤,包括文本摘要和分类。

原理

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

通俗理解TF-IDF就是:TF刻画了词语t对某篇文档的重要性,IDF刻画了词语t对整个文档集的重要性。

TF(Term Frequency,词频)

TF(Term Frequency,词频)表示一个给定词语t在一篇给定文档d中出现的频率。TF越高,则词语t对文档d来说越重要,TF越低,则词语t对文档d来说越不重要。那是否可以以TF作为文本相似度评价标准呢?答案是不行的,举个例子,常用的中文词语如“我”,“了”,“是”等,在给定的一篇中文文档中出现的频率是很高的,但这些中文词几乎在每篇文档中都具有非常高的词频,如果以TF作为文本相似度评价标准,那么几乎每篇文档都能被命中。

对于在某一文档 dj 里的词语 ti 来说,ti 的词频可表示为:词频
其中 ni,j 是词语 ti 在文档 dj 中的出现次数,分母则是在文件 dj 中所有词语的出现次数之和。
注意,这里除了文档总词数作为分母,只是做了一个标准化,因为有的文章长,有的文章短,出现100次的不一定算多,出现3次的不一定就少。有时候也用其他作为分母进行标准化。

IDF(Inverse Document Frequency,逆向文件频率)

IDF(Inverse Document Frequency,逆向文件频率)的主要思想是:如果包含词语t的文档越少,则IDF越大,说明词语t在整个文档集层面上具有很好的类别区分能力。IDF说明了什么问题呢?还是举个例子,常用的中文词语如“我”,“了”,“是”等在每篇文档中几乎具有非常高的词频,那么对于整个文档集而言,这些词都是不重要的。对于整个文档集而言,评价词语重要性的标准就是IDF。

某一特定词语的IDF,可以由总文件数除以包含该词语的文件数,再将得到的商取对数得到:
在这里插入图片描述
其中 |D| 是语料库中所有文档总数,分母是包含词语 ti 的所有文档数。
在scikit-learn的TfidfTransformer()方法中,如果声明TfidfTransformer(smooth_idf=false),那么IDF的计算就变为:
在这里插入图片描述
对IDF的理解:语料库的文档总数实际上是一个词分布的可能性大小,n篇文档,有n种可能。包含词ti的文档数m,表示词ti的真实分布有m个“可能”。那么log(n/m) = log(n) - log(m)就可以表示词ti在m篇文档中的出现,导致的词ti分布可能性的减少(即信息增益),这个值越小,表示词ti分布越散,我们认为一个词越集中出现在某一类文档,它对这类文档的分类越有贡献,那么当一个词分布太散了,那他对文档归类的作用也不那么大了。

代码实现:

#TD_IDF
tf_dic={}
from sklearn.feature_extraction.text import TfidfVectorizer
for feat in ['xy_3','v']: 
    corpus=[' '.join(datai[feat].map(str)) for name,datai in data.groupby('ship')]
    tfidf = TfidfVectorizer(min_df = 10 , max_df = 0.9)
    #返回稀疏矩阵
    tf_idf_array=tfidf.fit_transform(corpus)
    tf_dic[f'{feat}_tf']=tf_idf_array.toarray()

#TSEN降维
from sklearn.manifold import TSNE
for feat in ['xy_3','v']:   
    if feat in ['xy_3']:
        tsne=TSNE(n_components=3)
    else:
        tsne=TSNE(n_components=1)
    one_hots=tsne.fit_transform(tf_dic[f'{feat}_tf'])
    for i in range(len(one_hots[0])):
        data_label[f'label_tf_{feat}_{i}']=one_hots[:,i]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值