TF-IDF的理解与代码实例_tfij表示-程序员宅基地

技术标签: 推荐系统  

一、关于TF-IDF的理解

代码链接: github.

  1. 词频-逆文档频率(Term Frequency-Inverse Document Frequency, TF-IDF) 是一
    种用于资讯检索与文本挖掘的常用加权技术。

  2. TF-IDF是一种统计方法,用以评估一个字词对于一个文件集或一个语料库中的其中一份文件的重要程度。字词的重要性随着它在文件中出现的次数成正比增加,但同时会随着它在语料库中出现的频率成反比下降,其计算公式:

在这里插入图片描述

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

  2. TF-IDF加权的各种形式常被搜索引擎应用,作为文件与用户查询之间相关程度的度量或评级。

二、TF-IDF

  1. 词频 ( Term Frequency , TF )
  • 指的是某一个给定的词语在该文件中出现的频率。这个数字是对词数的归一化,以防止偏向更长的文件。(同一个词语在长文件里可能会比短文件有更高的词数,而不管该词语重要与否。),词频计算公式为:

在这里插入图片描述
其中TFij表示词语 i 在文档 j 中出现的频率,nij表示i在j中出现的次数,n*j 表示文档 j 的总词数。

  1. 逆向文件频率( Inverse Document Frequency , IDF )
  • 是一个词语普遍重要性的度量,某一特定词语的IDF,可以由总文档数目除以包含该词语的文档的数目,再将得到的商取对数得到,IDF计算公式为:

在这里插入图片描述

其中IDFi表示词语 i 在文档集中的逆文档频率,N表示文档集中的文档总数,Ni表示文档集中包含了词语 i 的文档数。

三、实现代码(基于Jupyter编辑器)

为了便于理解,代码是基于Jupyter编译器实现,每一步骤均有输出结果。
代码链接: github.

  1. 引入依赖
import numpy as np
import pandas as pd
  1. 定义数据和预处理
docA = "The cat sat on my bed"
docB = "The dog sat on my knees"

bowA = docA.split(" ")
bowB = docB.split(" ")
#bowA
#构建词库
wordSet = set(bowA).union(set(bowB))
#wordSet

输出: {‘The’, ‘bed’, ‘cat’, ‘dog’, ‘knees’, ‘my’, ‘on’, ‘sat’}

  1. 进行词数统计
#用统计字典来保存词出现的次数
wordDictA = dict.fromkeys(wordSet,0)
wordDictB = dict.fromkeys(wordSet,0)
#wordDictA

#遍历文档统计词数
for word in bowA:
    wordDictA[word] += 1
for word in bowB:
    wordDictB[word] += 1
    
pd.DataFrame([wordDictA,wordDictB])

输出结果:
在这里插入图片描述

  1. 计算词频TF
def computeTF(wordDict,bow):
    #用一个字典对象记录所有的tf,把所有的词对应在bow文档里的tf都算出来
    tfDict = {
    }
    nbowCount = len(bow)
    
    for word,count in wordDict.items():
        tfDict[word] = count / nbowCount
    return tfDict

tfA = computeTF( wordDictA,bowA )
tfB = computeTF( wordDictB,bowB )

tfA

输出结果:

{‘on’: 0.16666666666666666,
‘dog’: 0.0,
‘my’: 0.16666666666666666,
‘knees’: 0.0,
‘cat’: 0.16666666666666666,
‘The’: 0.16666666666666666,
‘sat’: 0.16666666666666666,
‘bed’: 0.16666666666666666}

对于”dog“、”knees“在docA中没有出现,故其计算结果为0。

  1. 计算逆文档频率idf
def computeIDF(wordDictList):
    #用一个字典对象保存idf结果,每个词作为key
    idfDict = dict.fromkeys(wordDictList[0],0)
    N = len(wordDictList)
    import math
    
    for wordDict in wordDictList:
        #遍历字典中的每个词汇,统计Ni
        for word,count in wordDict.items():
            if count > 0:
                #先把Ni增加1,存入idfDict
                idfDict[word] += 1
                
    #已经得到所有词汇i对应的Ni,现在根据公式把它替换成为idf值
    for word,ni in idfDict.items():
        idfDict[word] = math.log10((N + 1)/(ni+1))
    return idfDict

idfs = computeIDF([wordDictA,wordDictB])
idfs

输出结果:

{‘on’: 0.0,
‘dog’: 0.17609125905568124,
‘my’: 0.0,
‘knees’: 0.17609125905568124,
‘cat’: 0.17609125905568124,
‘The’: 0.0,
‘sat’: 0.0,
‘bed’: 0.17609125905568124}

对于"on"、”my“、”The“、”sat“这些词在docA与docB中都出现了,说明相对不重要,其计算结果为0。

  1. 计算TF-IDF
def computeTFIDF(tf,idfs):
    tfidf = {
    }
    for word,tfval in tf.items():
        tfidf[word] = tfval * idfs[word]
    return tfidf

tfidfA = computeTFIDF(tfA,idfs)
tfidfB = computeTFIDF(tfB,idfs)

pd.DataFrame([tfidfA,tfidfB])

输出结果:
在这里插入图片描述
每个词的关键程度一目了然,本例中的bed,cat与dog,knees相对比较重要。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/luanfenlian0992/article/details/105957840

智能推荐

Python 实现京东自动登录领京豆_京东自动领京豆脚本-程序员宅基地

文章浏览阅读2.2w次,点赞4次,收藏54次。今天带大家进行模拟京东登录,并进行签到获取京豆,1000 个京豆 = 10 元,是不是一个发现了一个「发家致富」的好路子?废话不多说,下面开始正题。整体流程如下:京东自动签到流程1 模拟登录首先我们需要的就是模拟京东登录,只有登录了才能进行签到领京豆等操作。模拟登录其实就是通过 HTTP 的 POST 请求讲用户的登录信息发送给服务器进行认证的过程。1.1 登录数据分析登录过程表面上看着挺简单,我..._京东自动领京豆脚本

Google App Crash 参考解决方案,2024年最新拼多多面试java-程序员宅基地

文章浏览阅读565次,点赞17次,收藏20次。}--------- beginning of crash01-01 12:00:00.918 1583 1583 E AndroidRuntime: FATAL EXCEPTION: main01-01 12:00:00.918 1583 1583 E AndroidRuntime: Process: com.google.android.setupwizard, PID: 158301-01 12:00:00.918 1583 1583 E AndroidRuntime: java.lan

第一章:认识Java语言-程序员宅基地

文章浏览阅读916次,点赞16次,收藏19次。Java是一种简单、面向对象、分布式、稳健性、安全性、平台独立与可移植性、多线程、动态性的计算机编程语言。除了java还有很多编程语言:C语言、C++、C#、python等。不同的计算机编程语言语法不同;应用场景不同;Java是一种后端开发编程语言。开发流程:应用程序-》1、市场调研:用户的需求2、需求文档3、需求评审4、UI设计(提高用户体验)5、前端开发(利用前端技术实现网页,网页以浏览器直接打开\部署到浏览器,静态页面:数据不变)

Flutter浪潮下的音视频研发探索(1),android插件化-程序员宅基地

文章浏览阅读848次,点赞13次,收藏17次。UI这块知识是现今使用者最多的。当年火爆一时的Android入门培训,学会这小块知识就能随便找到不错的工作了。不过很显然现在远远不够了,拒绝无休止的CV,亲自去项目实战,读源码,研究原理吧!

iOS/Xcode异常:no visible @interface for XXX declares the selector YYY_no visible @interface for 'sampleclass' declares t-程序员宅基地

文章浏览阅读1.2w次。在iOS/Xcode开发过程中,出现如下异常信息:no visible @interface for XXX declares the selector YYY分析原因:There are lots of reasons it could happen, but generally it’s saying that at the line of code it flags, it do_no visible @interface for 'sampleclass' declares the selector 'getaverage:of

毕业设计:基于深度学习的野生动物种类识别系统 目标检测 人工智能_基于深度学习的动物目标检测及分类系统设计与实现-程序员宅基地

文章浏览阅读1.5k次,点赞54次,收藏21次。毕业设计:基于深度学习的野生动物种类识别系统融合了深度学习和计算机视觉技术,旨在解决野生动物种类识别的难题。将介绍系统的设计原理和关键技术,探讨其在野生动物保护和生态研究领域的应用前景。为计算机、软件工程、人工智能和大数据等专业的毕业生提供了一个有意义的研究课题。无论您对深度学习技术保持浓厚兴趣,还是希望探索机器学习、算法或人工智能领域的同学,本文将为您提供灵感和指导,引领您进入这个具有挑战性和创新性的研究领域。_基于深度学习的动物目标检测及分类系统设计与实现

随便推点

VIL-SLAM论文翻译:Stereo Visual Inertial LiDAR Simultaneous Localization and Mapping-程序员宅基地

文章浏览阅读1.4k次,点赞2次,收藏18次。文章目录写在前面摘要1.引言2.相关工作3.系统概述4.视觉前端5.双目视觉惯性里程计A. IMU预积分因子B. 非结构化视觉因子C. 优化和边缘化6. 激光建图A. LiDAR扫描去畸变B. 帧到地图配准7. LiDAR增强的闭环A. 回环检测B. 回环约束C. 全局位姿图优化D. 重定位8. 实验结果A.平台和软件B.测试和结果C. EuRoCMAV数据集测试9.结论写在前面写作参考: robot L开源代码: 开源代码链接论文原文: 原文链接摘要SLAM是移动和空中机器人的一项基本任务_vil-slam

linux shell find命令 查找多种文件后缀_shell 同时查找两种结尾的配置文件-程序员宅基地

文章浏览阅读2.4w次,点赞14次,收藏46次。find命令最常用的是查找某个文件,如:find ./ -name "abc.txt"则会在当前目录及子目录下查找abc.txt文件更常用的是查找某一类型的文件,如:find ./ -name "*.txt"则会在当前目录及子目录下查找所有txt文件,但是如果要查找多种文件类型呢?比如某文件夹下面所有.c文件和.h文件,可以这样做:find ./ -name "*.[..._shell 同时查找两种结尾的配置文件

Rocky Linux安装部署Elasticsearch(ELK日志服务器)_rockylinux elk(1)-程序员宅基地

文章浏览阅读268次。(img-QrJpO645-1712860091908)]8、设置elasticsearch.service开机自动启动。10、查看elasticsearch.service运行状态。9、启动elasticsearch.service服务。7、使用yum安装elasticsearch。3、点击Downloads链接。5、查看yum安装方式。遇到一点意外,研究下先。4、点击左下角yum。

String中的intern()方法_string 的intern方法-程序员宅基地

文章浏览阅读349次。String中的intern方法的实现原理(jdk8中):以下面代码为例public class InternTest{ String s1 = new String("a") + new String("b"); s1.intern(); String s2 = "ab"; System.out.println(s1 == s2);//true }(1)String s1 = new String(“a”) + new String(“b”);①创建StringBuilder对_string 的intern方法

VS.NET 学习方法论[转]_net 6 webrequest.create(sourceuri) 替代函数-程序员宅基地

文章浏览阅读1.7k次。 ——我的VS.NET学习之旅                                        屠恩海(SunHai)   开发工具:Micr_net 6 webrequest.create(sourceuri) 替代函数