TF-IDF(Term Frequency-Inverse Document Frequency)算法详解

news2025/1/18 14:30:05

目录

概述

术语解释

词频(Term Frequency)

文档频率(Document Frequency)

倒排文档频率(Inverse Document Frequency)

计算(Computation)

代码语法

代码展示

安装相关包

测试代码及其结果

结果整理


概述

TF-IDF代表记录的词频倒排文档频率。它可以定义为计算一个词在一系列或语料库中与文本的相关性。其含义与词在文本中出现的次数成比例增加,但受语料库(数据集)中该词的频率的补偿。

术语解释

词频(Term Frequency)

在文档d中,频率表示给定词t的实例数量。因此,我们可以看到当一个词在文本中出现时,它变得更相关,这是合理的。由于术语的顺序不重要,我们可以使用一个向量来描述基于词袋模型的文本。对于论文中的每个特定术语,都有一个条目,其值是词频。

在文档中出现的术语的权重与该术语的词频成正比。

\begin{equation} \text{tf}(t, d) = \frac{\text{词} t \text{在文档} d \text{的数量}}{\text{文档} d \text{词总量}} \end{equation}

延伸:BM25 TF 计算(Bese Match25 Term Frequency)

用于测量特定文档中词项的频率,同时进行文档长度和词项饱和度的调整。

\begin{equation}\text{score} =\frac{​{\text{tf} \cdot (k1 + 1)}}{​{\text{tf} + k1 \cdot (1 - b + b \cdot \frac{\text{fieldLength}}{\text{avgFieldLength}})}}\end{equation}

freq: 词项在文档中的频率。 k1: 用于控制词项频率饱和度的调节参数(通常为1.2)。 b: 用于控制字段长度归一化的调节参数(通常为0.75)。 fieldLength: 文档中字段的长度。 avgFieldLength: 所有文档中字段平均长度。

文档频率(Document Frequency)

这测试了文本在整个语料库集合中的意义,与TF非常相似。唯一的区别在于,在文档d中,TF是词项t的频率计数器,而df是词项t在文档集N中的出现次数。换句话说,包含该词的论文数量即为DF。

\begin{equation} \text{df}(t, documents) = \frac{\text{词} t \text{在} documents \text{数量} }{ documents\text{词总量}} \end{equation}

倒排文档频率(Inverse Document Frequency)

主要用于测试词语的相关性。搜索的主要目标是找到符合需求的适当记录。由于tf认为所有术语同等重要,因此仅使用词频来衡量论文中术语的权重并不充分。首先,通过计算包含术语t的文档数量来找到术语t的文档频率:

$ df(t) = N(t) $

其中,$df(t)$为术语t的文档频率,$N(t)$为包含术语t的文档数量。

术语频率是指一个单一文档中术语出现的次数;而文档的频率是该术语在多个文档中出现的独立次数,它取决于整个语料库。现在让我们来看一下倒排文档频率的定义。词语的倒排文档频率是语料库中包含该词的文档数量与文本频率的倒数。$N$表示总文档数。

\begin{equation} \text{idf}(t) = \frac{N}{\text{df}(t)} = \frac{N}{N(t)} \end{equation}

常见的词语应被认为不太重要,但是采用最确定的整数元素似乎过于严格。因此,我们取该词在文档中的逆频率的对数(以2为底)。因此,术语t的逆文档频率(idf)变为:

\begin{equation} \text{idf}(t) = \log\left(\frac{N}{\text{df}(t)}\right) \end{equation}

延伸:在ES中使用的形式如下,通过设置ES查询的 "explain": true 参数可见。

\begin{equation}\text{​{idf}(t)}=\log\left(1 + \frac{​{\text{​{N}} - \text{​{​{df}(t)}} + 0.5}}{​{\text{​{​{df}(t)}} + 0.5}}\right)\end{equation}

0.5 是为了平滑,以避免由零除和对非常罕见的术语进行过度加权。

计算(Computation

TF-IDF是确定一个词对于一系列文本或语料库的重要性的最佳度量之一。TF-IDF是一个加权系统,根据词频(TF)和逆文档频率(IDF)为文档中的每个词分配权重。具有更高权重得分的词被视为更重要。

通常,TF-IDF权重由两个术语组成:

  • 规范化词频(TF)
  • 逆文档频率(IDF)

\begin{equation}\text{tf-idf}(t, d) = \text{tf}(t, d) \times \text{idf}(t)\end{equation}

代码语法

在Python中,可以使用sklearn模块中的TfidfVectorizer()方法计算TF-IDF值。

sklearn.feature_extraction.text.TfidfVectorizer(input)

Parameters:

input: 指定要传递的文档参数,可以是文件名、文件或文本内容本身。

Attributes:

vocabulary_: 返回一个字典,其中术语是键,特征索引是值。**

idf_: 返回作为参数传递的文档的逆文档频率向量。

Returns:

fit_transform(): 返回一个包含术语及其TF-IDF值的数组。

get_feature_names():返回一个特征名称列表。

代码展示

安装相关包

pip install scikit-learn

测试代码及其结果

from sklearn.feature_extraction.text import TfidfVectorizer
# 定义文档
d0 = 'Euler is a great man'
d1 = 'Euler'
d2 = 'nothing'
 
# 合并文档成为一个单一的语料库。
string = [d0, d1, d2]

# 从fit_transform()方法中获取TF-IDF值。
# 创建对象
tfidf = TfidfVectorizer()
 
# 获取 tf-df 值
result = tfidf.fit_transform(string)

# 打印语料库中单词的逆文档频率(IDF)值。
for ele1, ele2 in zip(tfidf.get_feature_names_out(), tfidf.idf_):
    print(ele1, ':', ele2)

# IDF结果输出 >>>
"""
euler : 1.2876820724517808
great : 1.6931471805599454
is : 1.6931471805599454
man : 1.6931471805599454
nothing : 1.6931471805599454
"""

# 索引获取
>>> tfidf.vocabulary_
"""
{'euler': 0, 'is': 2, 'great': 1, 'man': 3, 'nothing': 4}
"""

# tf-idf
>>> print(result)
# (文档编号,单词索引) tf-idf
"""
(0, 3)	0.5286346066596935
(0, 1)	0.5286346066596935
(0, 2)	0.5286346066596935
(0, 0)	0.4020402441612698
(1, 0)	1.0
(2, 4)	1.0
"""

# 可通过如下方式转成matrix形式
>>> result.toarray()
"""
array([[0.40204024, 0.52863461, 0.52863461, 0.52863461, 0.        ],
       [1.        , 0.        , 0.        , 0.        , 0.        ],
       [0.        , 0.        , 0.        , 0.        , 1.        ]])
"""

结果整理

DocumentWordDocument IndexWord Indextf-idf value
d0euler000.4020402441612698
d1euler101.0
d0is020.5286346066596935
d0great010.5286346066596935
d0man030.5286346066596935
d2nothing241.0

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1370318.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

2024年甘肃省职业院校技能大赛 “信息安全管理与评估”赛项样题卷①

2024年甘肃省职业院校技能大赛 高职学生组电子与信息大类信息安全管理与评估赛项样题 第一阶段:第二阶段:模块二 网络安全事件响应、数字取证调查、应用程序安全第二阶段 网络安全事件响应第一部分 网络安全事件响应第二部分 数字取证调查第三部分 应用程…

黑马程序员JavaWeb开发|案例:tlias智能学习辅助系统(上)准备工作、部门管理

一、准备工作 1.明确需求 根据产品经理绘制的页面原型,对部门和员工进行相应的增删改查操作。 2.环境搭建 将使用相同配置的不同项目作为Module放入同一Project,以提高相同配置的复用性。 准备数据库表(dept, emp) 资料中包含…

.NET Framework 与 .NET Core 与 .NET Standard

介绍 在本文中,我们将探讨 .NET Framework、.NET Core 和 .NET Standard 之间的差异。 .NET Framework 与 .NET Core .NET框架.NET核心 历史 .NET Framework 是 .NET 的第一个实现。 .NET Core 是 .NET 的最新实现。 开源 .NET Framework 的某些组件是开源的。 .N…

CSS渐变透明

文章目录 一、前言1.1、MDN 二、实现2.1、源码2.2、线上源码 三、最后 一、前言 使用场景:在做两个元素的连接处的UI适配时,图片的颜色不能保证一定跟背景颜色或者是主色调保持一致时,会显得比较突兀。 1.1、MDN MDN的文档,点击【…

ChatGLM2-6B 大语言模型本地搭建

ChatGLM模型介绍: ChatGLM2-6B 是清华 NLP 团队于不久前发布的中英双语对话模型,它具备了强大的问答和对话功能。拥有最大32K上下文,并且在授权后可免费商用! ChatGLM2-6B的6B代表了训练参数量为60亿,同时运用了模型…

uniapp中uview组件库丰富的Table 表格的使用方法

目录 #平台差异说明 #基本使用 #兼容性 #API #Table Props #Td Props #Th Props 表格组件一般用于展示大量结构化数据的场景 #平台差异说明 AppH5微信小程序支付宝小程序百度小程序头条小程序QQ小程序√√√√√√√ #基本使用 本组件标签类似HTML的table表格&#…

【Unity】Timer计时器属性及使用

可以代替协程完成延时操作 可以不用Update进行计时 GitHub开源计时插件 网址:https://github.com/akbiggs/UnityTimer/tree/master 导入:URL:https://github.com/akbiggs/UnityTimer.git 基本功能: 创建计时器: Time…

计算机毕业设计 基于SpringBoot的项目申报系统的设计与实现 Java实战项目 附源码+文档+视频讲解

博主介绍:✌从事软件开发10年之余,专注于Java技术领域、Python人工智能及数据挖掘、小程序项目开发和Android项目开发等。CSDN、掘金、华为云、InfoQ、阿里云等平台优质作者✌ 🍅文末获取源码联系🍅 👇🏻 精…

npm i sass -D的含义

命令 npm i sass -D 是一个在Node.js项目中使用npm(Node Package Manager)安装Sass预处理器的命令。这个命令的各个部分含义如下: npm: 这是Node Package Manager的缩写,一个用于Node.js的包管理和分发工具,允许开发者…

搭建Eureka服务注册中心

一、前言 我们在别的章节中已经详细讲解过eureka注册中心的作用,本节会简单讲解eureka作用,侧重注册中心的搭建。 Eureka作为服务注册中心可以进行服务注册和服务发现,注册在上面的服务可以到Eureka上进行服务实例的拉取,主要作用…

C++ 开发 + VSCode 调试

C 开发 VSCode 调试 MSYS2 安装 gcc、make下载安装MSMYS2pacman 添加镜像源 GCC1. 安装2. 查看结果3. 环境变量 GDB VSCode 调试所需插件创建项目调试代码1. tasks.json 配置任务2. launch.json 配置调试3. 运行 更进一步的 C/C 设置 参考资料 MSYS2 安装 gcc、make 下载 官…

CHS_01.1.5+操作系统引导

CHS_01.1.5操作系统引导 操作系统的引导一个新的磁盘安装操作系统后操作系统引导(开机过程) 操作系统的引导 我们会学习操作系统的引导 那你可能看见这个词的时候会觉得莫名其妙不明 绝地 什么是操作系统的引导呢 简单来说就是当你在开机的时候 如何让…

qt 实现登录界面

#include "mainwidget.h"MainWidget::MainWidget(QWidget *parent): QWidget(parent) {this->setWindowTitle("有道笔记");this->setWindowIcon(QIcon("C:\\Users\\18801\\Desktop\\ydIcon\\icon")); // this->setStyleSheet("…

esp32UART串口外设(Arduino)

通用异步接收器/发送器 (UART) 介绍 通用异步接收器/发送器 (UART) 是一种硬件功能,它使用广泛采用的异步串行通信接口(如 RS232、RS422 和 RS485)处理通信(即时序要求和数据成帧&…

torch.nn.CrossEntropyLoss()

torch.nn.CrossEntropyLoss(weight=None,size_average=None,ignore_index=-100,reduce=None,reduction=mean,label_smoothing=0.0) 计算过程 nn.CrossEntropyLoss()=nn.LogSoftmax()+nn.NLLLoss() import torch import torch.nn as nnloss_func = nn.CrossEntropyLoss() pre…

Windows11快速安装Android子系统

很多小伙伴想在电脑运行一下安卓程序,或则上班用手机摸鱼不方便,用电脑又没有想要的手机软件,那么怎么用电脑来安装安卓软件呢? 首先设置地区 安装Android子系统的前提需要安装 Amazon Appstore 这个应用,内地不能下载…

【CV】计算两个向量的夹角,并使用 OpenCV 可视化弧线

背景 基于人体/动物,骨骼点数据,计算关节角度 1. 原理 计算两个向量的夹角,我们已三个点为例,BA 向量和BC向量,求 B 的角度。若为四个点,延长交叉即可。 2. 效果 效果图如下 3. 核心代码 def comput…

vue2源码解析之第一步(对数据进行劫持)

###环境搭建 第一步 创建项目: npm init -y 第二步 安装对应的插件: npm i rollup rollup-plugin-babel babel/core babel/preset-env --save-dev 第三步 全局下创建rollup配置文件 rollup.config.js import babel from rollup-plug…

JVM工作原理与实战(十一):双亲委派机制

专栏导航 JVM工作原理与实战 RabbitMQ入门指南 从零开始了解大数据 目录 专栏导航 前言 一、双亲委派机制 1.双亲委派机制详解 2.父类加载器 3.双亲委派机制的主要作用 二、双亲委派机制常见问题 总结 前言 ​JVM作为Java程序的运行环境,其负责解释和执行字…

CDN的介绍以及加速内容传输原理

目前在公司的开发过程中,发现很多存储在oss的静态资源(图片,安装包)的链接中域名都使用了cdn域名,后面了解到这个cdn域名的主要作用是加速资源的访问,于是抽空了解了一下CDN加速原理。 目前使用得比较多的是…