当前位置: 首页 > ds >正文

TF-IDF算法详解

引言

TF-IDF(Term Frequency-Inverse Document Frequency)是信息检索和文本挖掘中常用的加权技术,用于评估一个词语对于一个文档集或语料库中某个文档的重要程度。

一、基本概念

1. 组成要素

TF-IDF由两部分组成:

  • TF (Term Frequency):词频,表示词在文档中出现的频率
  • IDF (Inverse Document Frequency):逆文档频率,衡量词的普遍重要性

2. 核心思想

一个词语的重要性随着它在文档中出现的次数成正比增加,但同时会随着它在语料库中出现的频率成反比下降。

二、算法公式

1. 词频(TF)计算

t f ( t , d ) = f t , d ∑ t ′ ∈ d f t ′ , d tf(t,d) = \frac{f_{t,d}}{\sum_{t' \in d} f_{t',d}} tf(t,d)=tdft,dft,d
其中:

  • f t , d f_{t,d} ft,d:词t在文档d中出现的次数
  • 分母是文档d中所有词出现次数的总和

2. 逆文档频率(IDF)计算

i d f ( t , D ) = log ⁡ N ∣ { d ∈ D : t ∈ d } ∣ idf(t,D) = \log \frac{N}{|\{d \in D: t \in d\}|} idf(t,D)=log{dD:td}N
其中:

  • N N N:语料库中文档总数
  • ∣ { d ∈ D : t ∈ d } ∣ |\{d \in D: t \in d\}| {dD:td}:包含词t的文档数量

3. TF-IDF计算

t f i d f ( t , d , D ) = t f ( t , d ) × i d f ( t , D ) tfidf(t,d,D) = tf(t,d) \times idf(t,D) tfidf(t,d,D)=tf(t,d)×idf(t,D)

三、算法步骤

  1. 预处理

    • 分词/分字
    • 去除停用词
    • 词干提取/词形还原(英文)
  2. 构建词袋模型

    • 创建词汇表
    • 统计每个词在每个文档中的出现次数
  3. 计算TF

    • 对每个文档中的每个词计算词频
  4. 计算IDF

    • 对整个语料库计算每个词的逆文档频率
  5. 计算TF-IDF

    • 将TF和IDF值相乘
  6. 归一化(可选):

    • 对文档向量进行归一化处理

四、Python实现示例

from sklearn.feature_extraction.text import TfidfVectorizer
import pandas as pd# 示例文档集
documents = ["自然语言处理是人工智能的重要领域","信息检索是自然语言处理的应用之一","深度学习推动了自然语言处理的发展"
]# 创建TF-IDF向量器
vectorizer = TfidfVectorizer(token_pattern=r"(?u)\b\w+\b")  # 中文需要调整token_pattern# 计算TF-IDF矩阵
tfidf_matrix = vectorizer.fit_transform(documents)# 转换为DataFrame展示
df_tfidf = pd.DataFrame(tfidf_matrix.toarray(),columns=vectorizer.get_feature_names_out()
)print(df_tfidf)

五、算法变体与改进

1. TF变体

  • 原始计数 t f ( t , d ) = f t , d tf(t,d) = f_{t,d} tf(t,d)=ft,d
  • 对数缩放 t f ( t , d ) = log ⁡ ( 1 + f t , d ) tf(t,d) = \log(1 + f_{t,d}) tf(t,d)=log(1+ft,d)
  • 布尔频率 t f ( t , d ) = 1 tf(t,d) = 1 tf(t,d)=1 (如果t在d中出现)

2. IDF变体

  • 平滑IDF i d f ( t , D ) = log ⁡ N 1 + ∣ { d ∈ D : t ∈ d } ∣ + 1 idf(t,D) = \log \frac{N}{1 + |\{d \in D: t \in d\}|} + 1 idf(t,D)=log1+{dD:td}N+1
  • 最大IDF i d f ( t , D ) = log ⁡ max ⁡ t ′ ∣ { d ∈ D : t ′ ∈ d } ∣ 1 + ∣ { d ∈ D : t ∈ d } ∣ idf(t,D) = \log \frac{\max_{t'} |\{d \in D: t' \in d\}|}{1 + |\{d \in D: t \in d\}|} idf(t,D)=log1+{dD:td}maxt{dD:td}

3. 归一化方法

  • 余弦归一化 t f i d f ( t , d , D ) ∑ t ′ ∈ d t f i d f ( t ′ , d , D ) 2 \frac{tfidf(t,d,D)}{\sqrt{\sum_{t' \in d} tfidf(t',d,D)^2}} tdtfidf(t,d,D)2 tfidf(t,d,D)
  • L2归一化:向量除以它的L2范数

六、应用场景

  1. 文本相似度计算
  2. 文档分类/聚类
  3. 关键词提取
  4. 搜索引擎排序
  5. 推荐系统

七、优缺点分析

优点:

  • 简单有效,计算效率高
  • 考虑了词在文档中的局部重要性和全局重要性
  • 适用于多种文本挖掘任务

缺点:

  • 无法捕捉词序信息(词袋模型限制)
  • 不能处理一词多义和多词一义问题
  • 对低频词可能过于敏感
  • 无法利用词之间的语义关系

八、与其他技术的比较

  1. TF-IDF vs 词频(TF)

    • TF-IDF考虑了词的全局分布,而TF只考虑局部频率
  2. TF-IDF vs 词嵌入(Word2Vec等)

    • 词嵌入能捕捉语义关系,TF-IDF不能
    • TF-IDF解释性更强
  3. TF-IDF vs BM25

    • BM25是TF-IDF的改进版,考虑了文档长度等因素

九、实际应用注意事项

  1. 预处理的重要性

    • 停用词处理
    • 词干提取/词形还原
    • 大小写统一处理
  2. 稀疏性问题

    • 高维稀疏矩阵的处理
    • 考虑使用截断SVD等降维技术
  3. 参数调优

    • max_features:限制特征数量
    • min_df/max_df:过滤低频/高频词
    • ngram_range:考虑短语组合

TF-IDF虽然简单,但在许多文本处理任务中仍然是强有力的基线方法,理解其原理和实现细节对自然语言处理工作至关重要。

http://www.xdnf.cn/news/4044.html

相关文章:

  • C# 定时器实现
  • 正态分布习题集 · 题目篇
  • 递归算法详解(Java 实现):从原理到高阶应用
  • 类和对象(上)
  • C语言 指针(5)
  • 两台电动缸同步算法
  • n8n 构建一个 ReAct AI Agent 示例
  • 数理性能大幅提升|暴雨一体机适配DeepSeek Prover v2
  • C++类_成员函数指针
  • 移动 Trae 目录到 E 盘 - 解决 C 盘空间不足问题
  • 在Qt Creator中使用CUDA
  • 录播课制作技术指南
  • Javase 基础加强 —— 03 集合
  • Room + WorkManager的Android学习总结
  • 2025年DA数智大会大模型与大数据应用实践峰会(脱敏)PPT合集(36份)
  • **面试水货程序员马小帅**
  • 技术部测试规范
  • PyTorch_张量拼接
  • ES6入门---第三单元 模块四:Set和WeakSet
  • SQL手工注入(DVWA)
  • 「Mac畅玩AIGC与多模态17」开发篇13 - 条件判断与分支跳转工作流示例
  • 交互式智能体面临长周期决策和随机环境反馈交互等挑战 以及解决办法
  • 记录一次手动更新英特尔Management Engine固件的经历
  • Python绘制误差棒:深入解析数据的不确定性
  • 文章记单词 | 第62篇(六级)
  • W-TinyLFU缓存驱逐算法解析
  • Maven框架详解:构建与依赖管理的利器
  • 《奇迹世界起源》:宝箱工坊介绍!
  • MyBatis 核心类详解与架构解析:从入门到源码级理解
  • 《前端秘籍:SCSS阴影效果全兼容指南》