TF-IDF算法原理详解与Python代码实现

季宁
季宁
发布时间:2026-10-13 | 5人浏览过
原创

本文深入解析TF-IDF(词频-逆文档频率)算法的核心原理,阐述如何通过词频与逆文档频率计算关键词重要性。结合Python中的[[wp:a3]]分词与[[wp:a4]]计数工具,提供完整的代码实现示例,帮助开发者掌握文本挖掘中的关键词提取技术。

算法原理

TF-IDF(Term Frequency-Inverse Document Frequency,词频-逆文档频率)是一种用于信息检索与文本挖掘的统计方法,其核心目标是在文章集中识别出每篇文章的关键字,即评估文章中哪些词汇最具代表性。

该算法主要从两个维度进行考量:一是词语在单篇文章中的出现频率,二是该词语在整个文章集合中出现的普遍程度。

1、TF(Term Frequency)词频

首先解释第一个维度,即统计一篇文章中各个词语出现的频率。

直观来看,如果某个词语在一篇文章中出现的频率很高(排除“的”、“是”、“你”等常见助词),那么可以初步认为该词是这篇文章的关键词。

其数学表达公式如下:

当某词在文章中出现次数较多时,TF值较大;出现较少时,TF值较小。需要注意的是,计算前需过滤掉“的”、“是”、“你”、“我”等无实际语义的助词和人称代词。

2、IDF(Inverse Document Frequency)逆文件频率

接着解释第二个维度,即考察该词语在哪些文章中出现过。在文章集合中,我们的目标是找出每篇文章特有的、能反映其独特性的关键词。通常,这类具有区分度的词语不会在其他文章中频繁出现;如果某个词在所有文章中都很常见,它对区分文章关键信息的作用就会减弱。因此,这一维度的目的是寻找那些在本篇文章中出现,但在其他文章中很少出现的词语。

其数学表达公式如下:

采用逆文档频率,若该词在文档集合中出现的文档数量较少,则IDF值较大;若该词在其余文档中出现较多,则IDF值较小。

最后,将TF与IDF相乘,得到文章中每个词的TF-IDF值。该值越大,表明该词在文章中的重要程度越高,越适合作为文章的关键词。

Python实现

在本实现中,主要使用jieba进行中文分词处理,并利用Counter进行词频计数统计。

# -*- coding: utf-8 -*-

import math
import jieba
from collections import Counter
from collections import defaultdict


def TFIDF(dataset):
    # 统计每个文章中每个词语的tf
    j = 0
    doc_len = len(dataset)
    cntr = [0] * doc_len          # Counter每个文章
    total = [0] * doc_len          # 获取每个文章中各自的词语总数
    word_tf = [0] * doc_len          # 获取每个文章中每个词语的tf
    for sent in dataset:
        iters = jieba.cut(sent)
        cntr[j] = Counter(iters)    
        total[j] = sum(cntr[j].values())    
        word_tf[j] = defaultdict(int)
        for i in cntr[j].keys():        
            word_tf[j][i] = cntr[j][i] / total[j]
        j += 1
    
    
    # 构建词汇表和总词频
    word_cnt = defaultdict(int)
    for word_list in word_tf:
        for word in word_list:
            word_cnt[word] += 1
    
    # 统计词汇在文档中的频率
    doc_tf = defaultdict(int)
    for word in word_cnt:
        for article in dataset:
            if word in article:
                doc_tf[word] += 1
    
    # 构建词汇的idf
    word_idf = {}
    for word in doc_tf:
        word_idf[word] = math.log(doc_len / (doc_tf[word] + 1))
        
    # 构建每篇文章中词的tf-idf     
    t = 0    
    word_tf_idf = [0] * doc_len        
    for article in word_tf:
        word_tf_idf[t] = defaultdict(int)
        for word in article:
            word_tf_idf[t][word] = article[word] * word_idf[word]            
        t += 1
    
    # 对每篇文章每个词的tf-idf进行由大到小排序
    t = 0
    for i in word_tf_idf:
        for j in i:  
            word_tf[t] = dict(sorted(word_tf[t].items(), key=lambda x:x[1], reverse=True))
            word_tf_idf[t] = dict(sorted(word_tf_idf[t].items(), key=lambda x:x[1], reverse=True))        
        t += 1
            
    return word_tf_idf, word_tf
    
    

if __name__ == '__main__':

    dataset = ["中国的北京是中国的首都","那里有一句话叫做“北京欢迎您”,北京啊北京",
               "北京欢迎您!相信梦想,梦,相信有梦就会有奇迹"]    
    word_tf_idf,word_tf = TFIDF(dataset)
    
    print("=============tf-idf=============")
    for i in word_tf_idf:
        print(i)
    print("=============tf=============")
    for i in word_tf:
        print(i)
        

注:此代码旨在展示TF-IDF的实现逻辑,未对标点符号等进行停用词过滤处理。

总结

以上为个人经验分享,希望能为大家提供参考,也希望大家多多支持本站。

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表