关键词提取技术:TF-IDF 详解

1. 什么是TF-IDF?

        TF-IDF(Term Frequency-Inverse Document Frequency) 是一种统计方法,用于评估单词在文档集或语料库中的重要性。它是自然语言处理和信息检索中的核心技术之一。

TF-IDF主要基于以下两个概念:

  • TF(Term Frequency, 词频):衡量某个词语在文档中的出现频率。
  • IDF(Inverse Document Frequency, 逆文档频率):衡量词语在整个语料库中的普遍性。

TF-IDF = TF × IDF

2. TF-IDF 的底层原理

2.1 词频 (TF) 的定义

词频是指某个词在文档中出现的次数。常用的公式是:

TF(t,d)=f(t,d)∑t′∈df(t′,d)TF(t,d)=∑t′∈d​f(t′,d)f(t,d)​

其中:

  • f(t,d) 表示词 t 在文档 d 中出现的次数。
  • ∑t′∈df(t′,d) 表示文档 d 中所有词的出现次数总和。

解释:TF 的目的是衡量某个词在文档中出现的频率,但由于文档长度不同,直接使用词频会造成偏差,因此通常将词频归一化,防止词频受到文档长度影响。

2.2 逆文档频率 (IDF) 的定义

        逆文档频率用于衡量某个词在整个文档集中有多普遍。若某个词在很多文档中都出现,则其IDF较低,反之,若某个词只在少数文档中出现,则其IDF较高。

IDF 的公式为:

IDF(t,D)=log\frac{|D|}{|d\in D : t\in d|}

其中:

  • ∣D∣  表示文档集中的文档总数。
  • ∣d∈D:t∈d∣ 表示包含词  t 的文档数。

解释:IDF 减少那些普遍出现在很多文档中的常见词的重要性(例如“的”、“是”等),强调那些具有区分度的词。

2.3 TF-IDF 的计算

TF-IDF 是将 TF 和 IDF 相乘得到的:

TF-IDF(t,d,D)=TF(t,d)*IDF(t,D)

它的作用是衡量词 t  在文档 d  中的相对重要性,同时考虑到该词在整个语料库中的普遍性。

3. 代码实现(Python)

我们可以通过 Python 从底层原理来实现 TF-IDF。假设我们有如下文本:

import math
from collections import Counter# 假设的文档集
documents = ["the cat is on the table","the dog is in the house","there is a cat and a dog",
]# 1. 计算 TF
def compute_tf(doc):tf_dict = {}bow = doc.split()word_count = len(bow)word_freq = Counter(bow)for word, count in word_freq.items():tf_dict[word] = count / float(word_count)return tf_dict# 2. 计算 IDF
def compute_idf(docs):idf_dict = {}total_docs = len(docs)all_words = set([word for doc in docs for word in doc.split()])for word in all_words:containing_docs = sum([1 for doc in docs if word in doc.split()])idf_dict[word] = math.log(total_docs / float(containing_docs))return idf_dict# 3. 计算 TF-IDF
def compute_tfidf(docs):tfidf_list = []idf_dict = compute_idf(docs)for doc in docs:tf_dict = compute_tf(doc)tfidf_dict = {}for word, tf_value in tf_dict.items():tfidf_dict[word] = tf_value * idf_dict[word]tfidf_list.append(tfidf_dict)return tfidf_list# 运行结果
tfidf_values = compute_tfidf(documents)
for idx, doc_tfidf in enumerate(tfidf_values):print(f"Document {idx+1}: {doc_tfidf}")

代码解释:
  1. compute_tf(doc)

    • 输入:一个文档(字符串)。
    • 输出:一个字典,键是词语,值是词频。
    • 它通过分割字符串来获取每个词的出现次数,并将其归一化,得到 TF 值。
  2. compute_idf(docs)

    • 输入:文档集。
    • 输出:一个字典,键是词语,值是该词的 IDF。
    • 通过统计每个词语出现在多少文档中,然后根据公式计算 IDF。
  3. compute_tfidf(docs)

    • 输入:文档集。
    • 输出:每个文档的 TF-IDF 值。
    • 计算每个词在文档中的 TF 和在整个文档集中的 IDF,将两者相乘得到 TF-IDF。
输出结果示例:
Document 1: {'the': 0.0, 'cat': 0.13515503603605478, 'is': 0.0, 'on': 0.3662040962227032, 'table': 0.3662040962227032}
Document 2: {'the': 0.0, 'dog': 0.13515503603605478, 'is': 0.0, 'in': 0.3662040962227032, 'house': 0.3662040962227032}
Document 3: {'there': 0.3662040962227032, 'is': 0.0, 'a': 0.3662040962227032, 'cat': 0.13515503603605478, 'and': 0.3662040962227032, 'dog': 0.13515503603605478}

代码关键点:
  1. 词频(TF) 通过每个词在文档中的出现次数除以文档总词数来得到。
  2. 逆文档频率(IDF) 通过文档集中的文档总数除以包含该词的文档数,然后取对数。
  3. TF-IDF 通过词频和逆文档频率的乘积来评估某个词在当前文档中的重要性。

4. TF-IDF的意义与应用

4.1 意义

        TF-IDF 的目的在于找到那些在某一文档中频繁出现但在其他文档中较少出现的词,这些词通常能够很好地表示该文档的主题。例如,常用词“的”、“是”等对区分文档没有太大作用,但专有名词或主题词则能够起到显著区分作用。

4.2 应用场景
  1. 信息检索:在搜索引擎中,TF-IDF 用来衡量查询词和文档的相关性,从而排序最相关的文档。
  2. 关键词提取:在文本分类或情感分析任务中,可以使用 TF-IDF 提取文档中的关键词。
  3. 推荐系统:可以通过 TF-IDF 分析用户的兴趣偏好,推荐与用户感兴趣文档相似的内容。

5. 总结

        TF-IDF 是基于两个基本的统计概念:词频(TF)和逆文档频率(IDF)。它通过平衡词在单个文档中出现的频率和在整个语料库中出现的普遍性来衡量词的重要性。

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

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

相关文章

书籍推荐:《从零构建大型语言模型》附免费PDF下载

通过从头开始构建一个大型语言模型,了解如何创建、训练和调整大型语言模型 (LLMs)! 一、构建大型语言模型(从头开始) 在《构建大型语言模型(从头开始)》中,你将了解如何…

C++ —— 关于继承(inheritance)

目录 1. 继承的概念及定义 1.1 继承的概念 1.2 继承的定义格式 1.3 继承基类成员访问方式的变化 1.4 类模板的继承 2.基类与派生类的转换 3. 继承中的作用域 3.1 隐藏规则 4. 派⽣类的默认成员函数 4.1 4个常见默认成员函数 4.2 实现⼀个不能被继承的类 5. 继承与友元…

webpack 学习入门

webpack 1. 简介1.1 webpack 是什么1.2 webpack 五个核心概念1.2.1 入口 - Entry1.2.2 出口 - Output1.2.3 Loader1.2.4 插件 - Plugins1.2.6 模式 - Mode 2. webpack 初体验2.1 初始化配置2.1.1. 准备2.1.2. 写代码2.1.3 编译打包应用 3. webpack 开发环境的基本配置3.1 打包样…

HTML(七)表格

https://chatgai.lovepor.cn/ 在HTML中&#xff0c;表格的标准形式如下&#xff1a; <table></table> 使用上面的语言&#xff0c;就已经生成了一个表格&#xff0c;只不过这个表格什么都没有 那么&#xff0c;该如何让表格存在东西呢&#xff1f; 首先&#xf…

springboot 整合spring ai实现 基于知识库的客服问答

rag 需求产生的背景介绍&#xff1a; 在使用大模型时&#xff0c;常遇到的问题之一是模型可能产生幻觉&#xff0c;即生成的内容缺乏准确性。此外&#xff0c;由于大模型不直接访问企业的专有数据&#xff0c;其响应可能会显得泛泛而谈&#xff0c;不够精准或具体&#xff0c;…

基于YOLOv10的农场实时目标检测系统(python+pyside6界面+系统源码+可训练的数据集+也完成的训练模型)

摘要&#xff1a; 基于YOLOv10的农场实时目标检测系统&#xff0c;利用4393张图片&#xff08;3905张训练集&#xff0c;488张验证集&#xff09;进行模型训练&#xff0c;最终开发出一个高效的农场目标检测模型。为了方便用户操作和实时检测&#xff0c;本系统还开发了基于Pyt…

VSCode运行QT界面

VSCode用久了,感觉Qt Creator的写起代码来还是不如VSCode得心应手,虽然目前还是存在一些问题,先把目前实现的状况做个记录,后续有机会再进一步优化。 当前方式 通过QtCreator创建一个CMake项目,然后使用CMake的方式在VSCode中进行编译。 claude给出的建议 左上角的名字会…

30 天 Python 3 学习计划

30 天 Python 3 学习计划 https://www.runoob.com/python3/python3-tutorial.html 1. Python3 基础语法 2. Python3 基本数据类型 3. Python3 数据类型转换 4. Python3 解释器 5. Python3 注释 6. Python3 运算符 7. Python3 数字(Number) 8. Python3 字符串 …

SiLM27212 270V 4A/4A 支持高频信号输入 集成自举二极管的高低边门极驱动器

SiLM27212系列选型&#xff1a; SiLM27212LEK-DG SiLM27212EK-DG SiLM27212LCA-DG SiLM27212CA-DG SiLM27212LCB-DG SiLM27212CB-DG SiLM27212系列是一款支持高频信号输入的高低边N沟道MOSFET驱动器&#xff0c;有着优异的性能&#xff0c;广泛应用于各类模…

Linux查看下nginx及使用的配置文件

1、查到nginx进程 ps -aef | grep nginx2、通过进行pid查到nginx路径 pwdx <pid>3、根据路径得到配置文件 path***/nginx -t如下&#xff1a;

MacOS虚拟机安装Windows停滞在“让我们为你连接到网络”,如何解决?

1. 问题描述 MacOS在虚拟机安装win11过程中&#xff0c;停止在“让我们为你连接到网络”步骤&#xff0c;页面没有任何可以点击的按钮&#xff0c;进行下一步操作。 2. 解决方案&#xff08;亲测有效&#xff09; 到达该界面&#xff0c;按下ShiftF10&#xff08;Windows&…

【MySQL】入门篇—基本数据类型:使用ORDER BY进行排序

MySQL作为一种流行的关系数据库管理系统&#xff0c;提供了强大的数据查询功能&#xff0c;其中ORDER BY子句用于对查询结果进行排序。排序可以帮助用户更直观地查看数据&#xff0c;发现趋势或异常&#xff0c;尤其在处理大量数据时尤为重要。 应用场景&#xff1a; 用户管理…

【机器学习】深入浅出讲解贝叶斯分类算法

0. 前言 1.贝叶斯分类器介绍 贝叶斯分类是一类分类算法的总称&#xff0c;这类算法均以贝叶斯定理为基础&#xff0c;故统称为贝叶斯分类。而朴素贝叶斯&#xff08;Naive Bayes&#xff09;分类是贝叶斯分类中最简单&#xff0c;也是常见的一种分类方法。 一些很常见的分类…

整理—计算机网络

目录 网络OSI模型和TCP/IP模型 应用层有哪些协议 HTTP报文有哪些部分 HTTP常用的状态码 Http 502和 504 的区别 HTTP层请求的类型有哪些&#xff1f; GET和POST的使用场景&#xff0c;有哪些区别&#xff1f; HTTP的长连接 HTTP默认的端口是什么&#xff1f; HTTP1.1怎…

哪科竞赛含金量更高?五大学科竞赛含金量排名

2024年五大学科竞赛赛事已经渐渐拉开帷幕&#xff0c;本月底国内不少地区即将举行生物竞赛预赛的赛事。今天我们一起来看看五大学科竞赛哪科竞赛含金量更高。 高中五大学科竞赛&#xff08;数物化生信&#xff09;是升学路上的硬通货&#xff0c;比如说在强基破格中需要五大竞赛…

使用QueryWrapper中IN关键字超过1000个参数后如何处理

示例场景 假设我们有一个用户表 User&#xff0c;我们想根据用户 ID 查询用户信息。由于 ID 数量超过 1000&#xff0c;直接使用 IN 会导致错误。 方法一&#xff1a;分批查询 我们可以将 ID 列表分批处理&#xff0c;每批不超过 1000 个。 import com.baomidou.mybatisplu…

揭秘提升3DMAX效率的6款必备神级插件!

对于3DMax新手来说,掌握一些高效、实用的插件能够大大提升工作效率和创作质量。以下是6个不能错过的神级插件推荐: 第1个:3DMAX造山地形插件Mountain是一款专为3dMax设计的插件,旨在帮助用户轻松快速地创建逼真的山脉地形。以下是对该插件的详细介绍: 一、插件概述 Mou…

Xilinx远程固件升级(一)——QuickBoot方案

Xilinx 7系FPGA远程更新方案——QuickBoot方式远程更新bit 一、远程更新背景和架构 对于非ZYNQ系列的常规FPGA来说&#xff0c;对于bit的更新一般使用JTAG进行烧录。而作为商用产品&#xff0c;想要进行OTA升级时&#xff0c;使用JTAG的升级方式显然不适合&#xff0c;因此&a…

Server-Sent Events (SSE)

Server-Sent Events Spring Boot 中使用 SSE原理 有一个需求&#xff0c;这个需求希望如果用户触发了下单操作&#xff0c;就对b端的管理员发送一次弹窗&#xff0c;如果想让前端源源不断的接受到后端发送的实时数据&#xff0c;这种需求可以使用什么技术来实现 可以采用以下几…

数据分区(Data Partitioning)

数据分区&#xff08;Data Partitioning&#xff09; 数据分区是指将一个大规模的数据集按某种规则划分成多个子集&#xff0c;并将这些子集存储到不同的存储节点上。这种方式不仅能提高查询效率&#xff0c;还能减轻单一节点的负担&#xff0c;使系统更容易扩展。 数据分区的…