机器学习——TF-IDF算法

TF-IDF(Term Frequency-Inverse Document Frequency)是一种广泛应用于文本挖掘和信息检索领域的经典加权算法,主要用于评估一个词语在文档集合中的重要程度。其核心思想是:一个词语在文档中出现的频率越高,同时在所有文档中出现的频率越低,则该词语对该文档的区分能力越强。

TF-IDF 的计算公式

TF-IDF(Term Frequency-Inverse Document Frequency)是一种常用的文本特征提取方法,由两部分组成:

1. 词频(TF,Term Frequency)

TF 衡量一个词在当前文档中出现的相对频率,计算公式为:

TF(t,d) = (词 t 在文档 d 中出现的次数) / (文档 d 的总词数)

应用场景:在一篇关于水果的文档中,"apple"出现频率自然比"computer"要高,TF值能反映这种词频差异。

示例计算

  • 文档 d 有 100 个词
  • 单词 "apple" 出现 5 次
  • 则 TF("apple", d) = 5 / 100 = 0.05

注意事项

  • 常用对数化或归一化处理来平滑极端值
  • 短文档中个别高频词可能产生过大的TF值

2. 逆文档频率(IDF,Inverse Document Frequency)

IDF 衡量一个词在整个语料库中的稀有程度,出现越少的词权重越高:

IDF(t,D) = log[ (语料库中文档总数 N) / (包含词 t 的文档数 + 1) ]

改进说明

  • 加1平滑处理(+1)是为了避免某些词未出现在语料库中导致分母为0
  • 对数运算(通常以10为底)可以压缩数值范围

示例计算

  • 语料库有1000篇文档
  • "apple"在100篇文档中出现过
  • 则 IDF("apple", D) = log(1000 / (100 + 1)) ≈ log(9.90) ≈ 2.30

特殊案例

  • 停用词(如"the"、"is")几乎出现在所有文档中,IDF值会趋近于0
  • 专业术语通常具有较高的IDF值

3. TF-IDF 最终计算

将TF和IDF相乘得到最终权重:

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

示例计算

  • TF("apple", d) = 0.05
  • IDF("apple", D) ≈ 2.30
  • 则 TF-IDF("apple", d, D) = 0.05 × 2.30 ≈ 0.115

实际应用注意事项

  1. 语料库规模会影响IDF值
  2. 不同领域的文档需要分别计算IDF
  3. 通常会进行归一化处理(如L2归一化)
  4. 可以结合停用词过滤提高效果

变体公式: 一些实现会使用不同的对数底数或调整平滑方式,例如:

  • IDF(t,D) = log[1 + (N/(df(t)+1))]
  • 使用自然对数(ln)代替常用对数(log10)

 TF-IDF 的 Python 实现​

Scikit-learn: TfidfVectorizer

用途​​:将文本转换为 TF-IDF 特征矩阵,适用于机器学习任务。

核心参数​

参数

类型

默认值

说明

input

str

'content'

输入类型('filename''file''content'

encoding

str

'utf-8'

文本编码方式

lowercase

bool

True

是否转换为小写

stop_words

str/list

None

停用词表('english'或自定义列表)

max_features

int

None

最大特征数(按词频排序)

ngram_range

tuple

(1, 1)

N-gram 范围(如 (1, 2)包含 1-gram 和 2-gram)

min_df

int/float

1

忽略词频低于此值的词(整数=次数,浮点数=比例)

max_df

int/float

1.0

忽略词频高于此值的词(整数=次数,浮点数=比例)

norm

str

'l2'

归一化方式('l1''l2'或 None

use_idf

bool

True

是否启用 IDF 权重

smooth_idf

bool

True

是否平滑 IDF(避免除零错误)

​关键方法​

方法

说明

fit(raw_documents)

学习词汇和 IDF

transform(raw_documents)

将文档转换为 TF-IDF 矩阵

fit_transform(raw_documents)

合并 fit和 transform

get_feature_names_out()

获取词汇表(Python ≥3.6)

get_stop_words()

获取停用词列表

# 导入必要的库
from sklearn.feature_extraction.text import TfidfVectorizer  # 导入TF-IDF向量化工具
import pandas as pd  # 导入pandas用于数据处理# 读取文本文件
file = open('task2_1.txt', 'r')  # 打开名为'task2_1.txt'的文本文件
data = file.readlines()  # 读取文件的所有行,存储在列表data中# 初始化TF-IDF向量化器
vectorizer = TfidfVectorizer()  # 创建TF-IDF向量化器对象# 计算TF-IDF矩阵
vetft = vectorizer.fit_transform(data)  # 对数据进行拟合和转换,得到TF-IDF矩阵(稀疏矩阵)
print(vetft)  # 打印TF-IDF矩阵(显示稀疏矩阵的存储格式)# 获取特征词(词汇表)
words = vectorizer.get_feature_names_out()  # 获取所有特征词(即词汇表)
print(words)  # 打印特征词列表# 将TF-IDF矩阵转换为DataFrame
# vetft.T 转置矩阵(行变列,列变行)
# .todense() 将稀疏矩阵转换为稠密矩阵
# index=words 使用特征词作为行索引
df = pd.DataFrame(vetft.T.todense(), index=words)  # 创建DataFrame,行是特征词,列是文档
print(df, end='\n')  # 打印DataFrame# 提取特定文档(第6列,索引为5)的TF-IDF特征
features = df.iloc[:, 5]  # 获取第6个文档的所有特征值(Python从0开始计数)
features.index = words  # 设置索引为特征词(确保顺序一致)
results = features.sort_values()  # 对特征值进行排序(默认升序)
print(results)  # 打印排序后的结果(显示每个词在该文档中的TF-IDF值,按值从小到大排列)

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

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

相关文章

区块链技术原理(9)-什么是以太币

文章目录前言什么是加密货币?什么是以太币(ETH)铸造 ETH燃烧 ETHETH 面额传输 ETH查询 ETH以太币的经济模型:发行与流通以太币与其他代币的区别以太币的历史与市场地位总结前言 以太币(Ether,简称 ETH&…

【Oracle APEX开发小技巧16】交互式网格操作内容根据是否启用进行隐藏/展示

在日常开发中,有想要根据某一状态或条件去限制/隐藏对应权限或操作按钮的情况,于是用简报模板列表进行展示,并提供以下功能:显示模板基本信息提供启用/禁用模板的开关提供编辑模板的入口根据模板状态显示不同的操作选项效果展示&a…

AIStarter:全网唯一跨平台桌面AI管理工具,支持Windows、Mac和Linux一键部署

AIStarter作为全网唯一支持Windows、Mac和Linux的桌面AI管理平台,为开发者提供高效的项目管理、模型插件和工作流共享体验。最近,熊哥发布了4.1.0版本更新视频,详细演示了如何在多平台上安装、使用和分享AI项目。本文基于视频内容&#xff0c…

AP模式/ESP32作为TCP服务端,转发串口接收的数据给网络调试助手

此代码为接收STM32的数据然后直接转发到网络调试助手,当有设备连接到esp32软件热点时会通过串口发送字符’a’给STM32,当有设备断开连接时会通过串口发送字符’b’,ESP32的TX:GPIO4, RX:GPIO5ESP32作为TCP服务器地址为192.168.4.1 监听端口为3333#include <string.h> #in…

kafka 中的Broker 是什么?它在集群中起什么作用?

Kafka中的Broker&#xff1a;集群的核心支柱 在分布式消息系统Apache Kafka中&#xff0c;Broker是构成Kafka集群的核心节点或服务器。 简单来说&#xff0c;每一个Broker就是运行着Kafka服务的一个实例&#xff0c;多台Broker共同协作&#xff0c;形成了强大的、可扩展的消息处…

【SOA用于噪声抑制】光纤DFB激光器中弛豫振荡噪声抑制

概述&#xff1a;本章记录了我们在光纤分布式反馈DFB激光器中使用饱和SOA来降低RIN的工作&#xff0c;以用于低频传感器应用。结果表明&#xff0c;放大器的增益动力学允许光纤激光器的弛豫振荡RO噪声分量减少30dB。 1 背景到目前为止&#xff0c;我研究了将饱和半导体光放大器…

神经网络的核心组件解析:从理论到实践

神经网络作为深度学习的核心技术&#xff0c;其复杂性常常令人望而却步。然而&#xff0c;尽管神经网络的结构、参数和计算过程看似繁琐&#xff0c;但其核心组件却是相对简洁且易于理解的。本文将深入探讨神经网络的四大核心组件——层、模型、损失函数与优化器&#xff0c;并…

Spring Boot项目通过Feign调用三方接口的详细教程

目录 一、环境准备 二、启用Feign客户端 三、定义Feign客户端接口 四、定义请求/响应DTO 五、调用Feign客户端 六、高级配置 1. 添加请求头&#xff08;如认证&#xff09; 2. 超时配置&#xff08;application.yml&#xff09; 3. 日志配置 七、错误处理 自定义错误…

ubuntu24.04安装 bpftool 以及生成 vmlinux.h 文件

文章目录前言一、apt安装二、源码安装三、生成vmlinux.h参考资料前言 $ cat /etc/os-release PRETTY_NAME"Ubuntu 24.04.2 LTS"$ uname -r 6.14.0-27-generic一、apt安装 安装bpftool&#xff1a; $ sudo apt install linux-tools-commonThe following NEW packa…

Pytorch FSDP权重分片保存与合并

注&#xff1a;本文章方法只适用Pytorch FSDP1的模型&#xff0c;且切分策略为SHARDED_STATE_DICT场景。 在使用FSDP训练模型时&#xff0c;为了节省显存通常会把模型权重也进行切分&#xff0c;在保存权重时为了加速保存通常每个进程各自保存自己持有的部分权重&#xff0c;避…

IDEA自动生成Mapper、XML和实体文件

1. 引入插件 <build><finalName>demo</finalName><plugins><plugin><groupId>org.mybatis.generator</groupId><artifactId>mybatis-generator-maven-plugin</artifactId><version>1.3.5</version><depe…

单例模式的理解

目录单例模式1.饿汉式(线程安全)2.懒汉式(通过synchronized修饰获取实例的方法保证线程安全)3.双重校验锁的方式实现单例模式4.静态内部类方式实现单例模式【推荐】单例模式 1.饿汉式(线程安全) package 并发的例子.单例模式; // 饿汉式单例模式&#xff08;天然线程安全&…

NLP---IF-IDF案例分析

一案例 - 红楼梦1首先准备语料库http://www.dxsxs.com这个网址去下载2 任务一&#xff1a;拆分提取import os import redef split_hongloumeng():# 1. 配置路径&#xff08;关键&#xff1a;根据实际文件位置修改&#xff09; # 脚本所在文件夹&#xff08;自动获取&#xff0…

LaTeX(排版系统)Texlive(环境)Vscode(编辑器)环境配置与安装

LaTeX、Texlive 和 Vscode 三者之间的关系&#xff0c;可以把它们理解成语言、工具链和编辑器的配合关系。 1.下载Texlive 华为镜像网站下载 小编这边下载的是texlive2025.iso最新版的&#xff0c;下载什么版本看自己需求&#xff0c;只要下载后缀未.iso的即可。为避免错误&am…

【深入浅出STM32(1)】 GPIO 深度解析:引脚特性、工作模式、速度选型及上下拉电阻详解

GPIO 深度解析&#xff1a;引脚特性、工作模式、速度选型及上下拉电阻详解一、GPIO概述二、GPIO的工作模式1、简述&#xff08;1&#xff09;4种输入模式&#xff08;2&#xff09;4种输出模式&#xff08;3&#xff09;4种最大输出速度2、引脚速度&#xff08;1&#xff09;输…

第1节 大模型分布式推理基础与技术体系

前言:为什么分布式推理是大模型时代的核心能力? 当我们谈论大模型时,往往首先想到的是训练阶段的千亿参数、千卡集群和数月的训练周期。但对于商业落地而言,推理阶段的技术挑战可能比训练更复杂。 2025年,某头部AI公司推出的130B参数模型在单机推理时面临两个选择:要么…

《软件工程导论》实验报告一 软件工程文档

目 录 一、实验目的 二、实验环境 三、实验内容与步骤 四、实验心得 一、实验目的 1. 理解软件工程的基本概念&#xff0c;熟悉软件&#xff0c;软件生命周期&#xff0c;软件生存周期过程和软件生命周期各阶段的定义和内容。 2. 了解软件工程文档的类别、内容及撰写软件工…

基于elk实现分布式日志

1.基本介绍 1.1 什么是分布式日志 在分布式应用中&#xff0c;日志被分散在储存不同的设备上。如果你管理数十上百台服务器&#xff0c;你还在使用依次登录每台机器的传统方法查阅日志。这样是不是感觉很繁琐和效率低下。所以我们使用集中化的日志管理&#xff0c;分布式日志…

多模态RAG赛题实战之策略优化--Datawhale AI夏令营

科大讯飞AI大赛&#xff08;多模态RAG方向&#xff09; - Datawhale 项目流程图 1、升级数据解析方案&#xff1a;从 fitz 到 MinerU PyMuPDF&#xff08;fitz&#xff09;是基于规则的方式提取pdf里面的数据&#xff1b;MinerU是基于深度学习模型通过把PDF内的页面看成是图片…

09--解密栈与队列:数据结构核心原理

1. 栈 1.1. 栈的简介 栈 是一种 特殊的线性表&#xff0c;具有数据 先进后出 特点。 注意&#xff1a; stack本身 不支持迭代器操作 主要原因是因为stack不支持数据的随机访问&#xff0c;必须保证数据先进后出的特点。stack在CPP库中实现为一种 容器适配器 所谓容器适配器&a…