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

目录

概述

术语解释

词频(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.mzph.cn/news/618865.shtml

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

相关文章

邮件开发客户:从吸引潜在客户到提高转化率的实用指南

做外贸的很多企业都习惯使用邮件作为沟通工具,所以我们也可以利用邮件发送开发信来进行客户开发。 为什么外贸企业喜欢使用邮件呢? 1、使用习惯 不同于我们国家习惯使用微信沟通,邮件始终是外国人在进行商务、营销、日常沟通等场合下常用且重…

基于OCR的包装产品生产日期识别系统

基于OCR的包装产品生产日期识别系统 背景技术方案PaddleOCR模型应用数据挑战与解决方案优化策略 项目实施步骤结果与展望 背景 在工业生产中,产品包装上的生产日期信息是至关重要的,它关系到物资的时效性和质量。为了更快、更准确地提取这些信息&#x…

Redis中的Java客户端

一、Jedis Jedis是一个Java实现的Redis客户端连接工具。 Jedis使用非常简单,直接引入依赖。基于默认参数的Jedis连接池,初始化连接池类(使用默认连接池参数)JedisPool,获取一个Jedis连接Jedis jedisjp.getResource()…

.NET core 中的Kestrel 服务器

什么是Kestrel? Kestrel 是一个跨平台的Web服务器,会默认在ASP.NET Core 项目模板中对其进行配置。未使用 IIS 托管时,ASP.NET Core 项目模板默认使用 Kestrel。 Kestrel 的功能包括: 跨平台:Kestrel 是可在 Window…

从零开始的源码搭建:详解连锁餐饮行业中的点餐小程序开发

时下,点餐小程序成为了许多餐饮企业引入的一种创新工具,不仅方便了顾客的用餐体验,同时也提高了餐厅的运营效率。本文将详细探讨如何从零开始搭建一个源码,并深入解析连锁餐饮行业中的点餐小程序开发过程。 一、需求分析与规划 在…

如何使用Flash模拟EEPROM

目录 1、FLASH与EEPROM简介 2、FLASH模拟EEPROM原理 2.1、EERPOM数据结构 2.2、EERPOM物理结构 在讲解这篇博文前,首先要明白为什么使用Flash存储来模拟EEPROM? 主要有以下几个原因: 成本效益:许多微控制器(MCU)和系统芯片(SoC)内…

统计学-R语言-4.2

文章目录 前言单变量数据的描述分析分类型数据频数表条形图饼图 数值型数据数值型数据数据的集中趋势--均值数据的集中趋势--众数 离散程度离散程度--极差离散程度--四分位数极差离散程度--方差离散程度--加权方差离散程度--标准差离散程度--变异系数 数据的形状数据的形状--偏…

高级分布式系统-第7讲 分布式系统的时钟同步

顺序的分类 在分布式系统中, 顺序关系主要分为以下三类:时间顺序: 事件在时间轴上发生的先后关系。 无限时刻集组成有向时间轴, 时间顺序是通过时刻的顺序体现的。 因果顺序: 如果事件e1是事件e2发生的原因&#xf…

数据分析概述2(详细介绍机器学习

目录 1.名词解释:1.1算法和模型1.2参数和超参数 2.基础算法:3.高级算法:4.数据准备5.常用python包小结: 1.名词解释: 1.1算法和模型 算法:用于训练模型的方法,分为有监督学习、无监督学习、半…

Logstash:迁移数据到 Elasticsearch

在生产环境中,不使用 Apache Kafka 等流平台进行数据迁移并不是一个好的做法。 在这篇文章中,我们将详细探讨 Apache Kafka 和 Logstash 的关系。 但首先让我们简单了解一下 Apache Kafka 的含义。 Apache Kafka 是分布式流平台,擅长实时数据…

anaconda创建虚拟环境启动jupyter notebook

1.进入虚拟环境 (以环境名为py37_pytorch1.9为例) 创建虚拟环境: conda create -n py37_pytorch1.9 python3.7 查看已经创建的虚拟环境: ​​​​​​​conda env list 切换/进入环境: conda activate py37_pytorch1.9 删除环…

C语言宏定义小技巧

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、定义一年多少秒(除闰年)举例运行结果出现的问题原因 二、定义整型数据要避免的坑举例运行结果原因解决方法 三 、未完待续 前言 提…

Fiddler怎么抓请求做接口

第一步:安装fiddler 可以在官网下载最新版本 VIP小伙伴可以在课前准备下载,如果已经安装,请忽略 打开fiddler开始抓取测试对象的请求,以教管系统登录为例 打开fiddler,准备开始抓取,清空会话,开启抓取状态,因为fiddler默认抓取http协议,所以这里不需要设置什么。 打开系统登…

通过 CMake 制作库文件 静态库 和 动态库

hehedalinux:~/Linux/loveDBTeacher-v2$ tree . ├── CMakeLists.txt ├── include │ └── head.h ├── main.c └── src├── add.c├── div.c├── mult.c└── sub.c CMake Calc 项目 在这里有add.c,div.c,mult.c,sub.c,main.c,head.h 二、生成静态库 …

【数据结构】二叉树问题总结

目录 1.二叉树前序遍历,中序遍历和后序的实现 2.层序遍历 3.求二叉树中的节点个数 4.求二叉树中的叶子节点个数 5.求二叉树的高度 6.求二叉树第k层节点个数 7.二叉树查找值为x的节点 8.单值二叉树 9.二叉树最大深度 10.翻转二叉树 11. 检查两颗树是否相同…

NetDevOps:华三交换机通过Netmiko或者Nornir获取接口信息通过TextFSM解析报错问题

python代码:实现功能获取交换机接口信息并通过TextFSM进行解析。 from netmiko import Netmiko import textfsm show_intf_cmd_mapping {hp_comware: display interface, }def ssh_device_2_get_intfs(device_type, host, username, password, port):dev_info {d…

【2023年度回顾】让我们在新的一年继续努力前行

每当我们在努力的时候都会想:为什么我要努力?躺着不舒服吗? 大家好!我是命运之光,一名普普通通的计算机科学与技术专业的大三学生。 📕回顾一下整个2023年 因为我有每天发朋友圈的习惯,所以这一…

chromedriver 114以后版本下载地址

谷歌浏览器版本经常会升级,chromedriver 也得下载匹配的版本 chromedriver 114以前版本下载地址https://registry.npmmirror.com/binary.html?pathchromedriver/ 找到匹配浏览器版本 查看自己浏览器版本号v120.0 v120.0版本chromedriver下载地址https://google…

Ubuntu 22.04 安装prometheus

服务器监控和报警软件有很多,为什么我们会选择Prometheus而不是其他软件呢? 因为它有以下优点: 自带简易web监控页面,用户可以很方便地查看监控数据和使用仪表盘。能实时收集数据并根据自定义警报规则推送告警;具有丰…

Java SPI在数据库驱动、SpringBoot自动装配中的应用

文章目录 1. 初识SPI1.1 SPI的作用1.2 SPI的工作原理1.3 SPI的三个组件:Service、Service Provider、ServiceLoader1.4 SPI使用场景1.5 具体的SPI 源码分析(SPI的核心就是ServiceLoader.load()方法)1.6 SPI 的优缺点 2. API、SPI、JNDI释义3.…