TF-IDF的算法原理以及Python实现过程

 更新时间:2024年06月13日 15:35:58   作者:辰阳星宇  
这篇文章主要介绍了TF-IDF的算法原理以及Python实现过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

算法原理

TF-IDF(Term Frequency-Inverse Document Frequency)是词频-逆文档频率,主要实现在一个文章集中找到每篇文章的关键字(也就是文章中哪些词汇是最重要的)。

主要从两个方面考虑,一篇文章中各个词语的出现频率。另一个是该词语在几篇文章中出现。

1、TF(Term Frequency) 词频

首先,解释第一个方面,一篇文章中各个词语出现的频率。

从直观上来说,如果一篇文章中某些词语出现频率很高(除了“的、是、你”等助词等),那么从这一角度来说,可以认为该词是这篇文章的关键词

使用数学公式表达就是

在某篇文章中该词出现较多,则TF值较大。该词在文章中出现较少,则TF值较小。注意要停用一些“的”、“是”、“你”、“我”…助词、人称代词等等。

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

然后,解释第二个方面,该词在哪几篇文章中出现过。在一个文章集中,我们的目标是找到每篇文章的特有的关键词,可以反映出该文章独有特点,即找到差异化且可有代表性的词。那么这个词通常情况下,并不会在其余文章中经常出现,否则对区分文章关键信息的作用就会较小。因此,我们这一方面就是找到本篇文章中的词语,很少出现在其余文章中。

使用数学公式表达就是

采用逆文档频率,该词在文档中没有怎么出现,则IDF值会较大。如果该词在其余文档出现较多,则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,对标点符号等没有进行停用处理。

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。 

相关文章

  • Tensorflow 2.4加载处理图片的三种方式详解

    Tensorflow 2.4加载处理图片的三种方式详解

    这篇文章主要为大家介绍了Tensorflow 2.4加载处理图片的三种方式详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-11-11
  • Pygame实现小球躲避实例代码

    Pygame实现小球躲避实例代码

    大家好,本篇文章主要讲的是Pygame实现小球躲避实例代码,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下,方便下次浏览
    2021-12-12
  • Python 启动时选择32位 或64位版的操作

    Python 启动时选择32位 或64位版的操作

    这篇文章主要介绍了Python 启动时选择32位 或64位版的操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-03-03
  • python入门之Tkinter使用的方法详解

    python入门之Tkinter使用的方法详解

    作为Python开发者,图形用户界面(GUI)开发是必备技能之一,本文将介绍Python自带的GUI工具包TKinter,这篇文章主要给大家介绍了关于python入门之Tkinter使用的相关资料,需要的朋友可以参考下
    2022-03-03
  • Python3实现的简单工资管理系统示例

    Python3实现的简单工资管理系统示例

    这篇文章主要介绍了Python3实现的简单工资管理系统,涉及Python文件读写、数据遍历、判断等相关操作技巧,需要的朋友可以参考下
    2019-03-03
  • 如何在pycharm中快捷安装pip命令(如pygame)

    如何在pycharm中快捷安装pip命令(如pygame)

    这篇文章主要介绍了如何在pycharm中快捷安装pip命令(如pygame),具有很好的参考价值,希望对大家有所帮助。
    2021-05-05
  • Python 生成多行重复数据的方法实现

    Python 生成多行重复数据的方法实现

    本文主要介绍了Python 生成多行重复数据的方法实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-03-03
  • 用Python调用win命令行提高工作效率的实例

    用Python调用win命令行提高工作效率的实例

    今天小编就为大家分享一篇用Python调用win命令行提高工作效率的实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-08-08
  • python 实现屏幕录制示例

    python 实现屏幕录制示例

    今天小编就为大家分享一篇python 实现屏幕录制示例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-12-12
  • python实现多线程网页下载器

    python实现多线程网页下载器

    这篇文章主要为大家详细介绍了python实现一个多线程网页下载器,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-04-04

最新评论