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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

ChatGPT知名开源项目有哪些

ChatGPT-Next-Web:基于ChatGPT API的私有化部署网页聊天系统 主要功能: 只需在 1 分钟内即可在 Vercel 上一键免费部署,支持私有服务器快速部署,支持使用私有域名支持ChatGPT3.5、4等常见模型Linux/Windows/MacOS 上的紧凑型客户…

vulhub中的Apache HTTPD 多后缀解析漏洞详解

Apache HTTPD 多后缀解析漏洞 1.查看python版本 这里python版本很重要,因为版本过低可能会导致后面的结果运行不成功 这里我就遇到了因为版本过低而执行不了docker-compose up -d的情况 查看python版本 cd /usr/bin ls -al python* 当版本过低时安装高版本的 …

uniapp微信小程序投票系统实战 (SpringBoot2+vue3.2+element plus ) -创建图文投票实现

锋哥原创的uniapp微信小程序投票系统实战: uniapp微信小程序投票系统实战课程 (SpringBoot2vue3.2element plus ) ( 火爆连载更新中... )_哔哩哔哩_bilibiliuniapp微信小程序投票系统实战课程 (SpringBoot2vue3.2element plus ) ( 火爆连载更新中... )共计21条视频…

论文封面表格制作

原文参考:【【论文排版】论文封面完美对齐 强迫症重度患者的经验分享】https://www.bilibili.com/video/BV18f4y1p7hc?vd_source046491acdcff4b39fed20406b36a93e2 视频里up主介绍很详细。我自己也记录一下。 介绍一下如何完成论文封面信息的填写。 创建一个3列…

C++并发编程实战第2版笔记

文章目录 p19 某个线程只可以join()一次p22 只有当joinable()返回true时才能调用detach()P21 在std::thread对象析构前,必须明确是等待还是分离线程P25 移动语义P25 将类的成员函数设定为线程函数 p19 某个线程只可以join()一次 只要调用了join(),隶属于…

Vue-11、Vue计算属性

Vue计算属性是Vue实例的属性,用来根据已有的数据进行计算得到新的数据。计算属性的值会根据它的依赖缓存起来,在依赖没有发生改变时直接返回缓存的值,提高了性能。 计算属性的定义方式为在Vue实例中使用computed关键字,并将计算属…

次氯酸HClO荧光探针的结构特点-星戈瑞单品

次氯酸荧光探针是一种用于检测次氯酸盐(ClO⁻)存在的化合物,通常被设计为荧光分子,其荧光性质在与次氯酸反应时发生变化。这类荧光探针的设计通常考虑到以下结构特点: **1.含有感应基团:**探针分子通常包含…

推荐优秀的大学数学课程

今天在B站看 R-S积分 发现这个老师讲的不错:Riemann-Stieltjes Integrals_哔哩哔哩_bilibili 可以用优秀来说,板书也不错!授课老师:吴庆堂老师(国立交通大学,目前台湾阳明大学和台湾交通大学合并而成的台湾…

哔哩哔哩浏览器 AI 助手:bilibili subtitle

分享一个好用不火的浏览器插件,能够让我们在浏览 B 站视频的时候体验更棒。 写在前面 B 站视频时间越来越长的今天,在打开视频的时候,如果能够清晰直观的看到视频字幕,当我们点击带有时间轴的字幕就能够一键跳转到自己想看的视频…

轻松get压力测试指南

身为后端程序员怎么也要会一点压力测试相关的技术吧, 不然无脑上线项目万一项目火了进来大量请求时出现程序执行缓慢, 宕机等情况你肯定稳稳背锅, 而且这个时候短时间内还没办法解决, 只能使用物理扩容CPU, 内存, 更换网络等几种方式来解决问题, 妥妥的为公司增加支出好吧, 下一…

中年危机与自我成长职业女性的心理转型之路

中年危机与自我成长:职业女性的心理转型之路 案例:李女士,45岁,职业女性 李女士是一位职业女性,人到中年,她突然感到自己的生活仿佛失去了方向。她来找我咨询,希望能够找到一条心理转型的道路&a…

第87讲:XtraBackup备份工具的核心技术要点及全库备份、恢复案例

文章目录 1.XtraBackup备份工具的简介2.XBK备份工具的安装3.XBK备份工具的使用语法4.XBK备份前的准备5.使用XBK对全库进行备份5.1.XBK备份全库数据的语法格式5.2.使用XBK进行全库备份5.3.查看XBK备份的数据文件5.4.备份过程中生产的XBK文件 6.模拟故障案例并使用XBK恢复备份的数…

从传统部署到无服务器计算:AI应用在AWS平台上的革新与飞跃

文章目录 《快速构建AI应用–AWS无服务器AI应用实战》内容简介作者简介目录 随着人工智能技术的不断发展,越来越多的企业开始将人工智能应用于各个业务场景,以提高效率、降低成本并创造新的商业模式。然而,传统的人工智能解决方案往往需要大量…

数字化工厂产品推荐 带OPC UA的分布式IO模块

背景 近年来,为了提升在全球范围内的竞争力,制造企业希望自己工厂的机器之间协同性更强,自动化设备采集到的数据能够发挥更大的价值,越来越多的传统型工业制造企业开始加入数字化工厂建设的行列,实现智能制造。 数字化…

Linux系统操作——tcping安装与使用

目录 .一、安装 1、安装依赖 tcptraceroute和bc 2、安装tcping 3、赋予tcping执行权限 4、测试 5、tcping返回结果说明 二、使用说明(参数) 一、安装 1、安装依赖 tcptraceroute和bc 【 CentOS 或 RHEL】 sudo yum install -y tcptraceroute bc…

快递批量查询神器,一键自动识别快递公司并实时追踪

想象一下,你有一堆快递单号需要查询,一个个复制粘贴简直让人崩溃!现在,有了我们的快递批量查询神器,这些烦恼全部消失! 首先第一步,进入快递批量查询高手主页面之后,点击“高级设置…

kafka: 基础概念回顾(生产者客户端和机架感知相关内容)

一、kafka生产者客户端 在kafka体系结构中有如下几个重要的概念: Producer:生产者,负责生产消息并投递到kafka broker的某个的分区中Consumer:消费者,负责消费kafka若干个分区中的消息Broker:kafka服务节…

20240110-你是成年人了,你的精力要用来赚钱

丘吉尔曾经说过:从让一个人生气事情的大小,就能看出一个人的价值。我觉得这句话很有道理。为什么有的人动不动就生气?而有的人却对一些冒犯做到丝毫不在乎? 我们经常就一些鸡毛蒜皮的事情去计较,其实很多事情不值得我…

格雷希尔G65系列快速接头满足汽车减震器的气压、油压测试要求

当汽车经过不平路面时,汽车减震器可以抑制弹簧吸震后因反弹带来的震荡和来自路面的冲击,为乘客带来平稳舒适的行车体验。减震器在出厂之前,需要模拟汽车的真实行驶环境,在模拟当中需要对它们进行气压和油压的轮番测试。 客户的测试…

LLaMA-VID:突破视觉语言模型界限,精准捕捉图像精髓

模型概述 LLaMA-VID模型的主要目标是解决现有视觉语言模型在处理长时视频时遇到的挑战。这些挑战主要包括处理大量视觉特征所需的高计算资源以及信息的复杂性和冗余性。为了克服这些难题,LLaMA-VID采用了创新的方法,有效地减少了长时视频中无关紧要信息…