TF-IDF 详解

在自然语言处理(NLP)和信息检索领域,TF-IDF(Term Frequency-Inverse Document Frequency,词频-逆文档频率)是一种常用的文本权重计算方法。它能够衡量单词在文档中的重要性,并在文本分类、关键词提取、搜索引擎等多个领域广泛应用。

TF-IDF 是一种经典的文本表示方法,能够衡量单词在文档中的重要性。它在信息检索、文本分类和关键词提取等任务中广泛应用。然而,它无法捕捉语义信息,通常与词向量(如 Word2Vec、BERT)等方法结合使用,以提高文本分析的效果

1. TF-IDF 简介

TF-IDF 主要用于评估某个词语在一篇文档中的重要性,基本思想是:

  • 词频(Term Frequency, TF) 衡量某个词在文档中出现的频率。
  • 逆文档频率(Inverse Document Frequency, IDF) 衡量该词在整个语料库中的稀有程度。

通过 TF 和 IDF 的结合,我们可以计算出一个词的重要性,常见应用包括:

  • 关键词提取:自动识别文档的核心词汇。
  • 文本相似度计算:用于文本分类和推荐系统。
  • 搜索引擎排序:衡量查询词与文档的相关性。

2. TF-IDF 计算公式

TF-IDF 的计算包含两个部分:

2.1 词频(TF)

词频用于衡量某个单词在一篇文档中出现的频率。常见的计算方法如下:

$$ TF(t, d) = \frac{f(t, d)}{\sum_{w \in d} f(w, d)} $$

其中:

  • ( f(t, d) ) 表示词 ( t ) 在文档 ( d ) 中出现的次数。
  • ( \sum_{w \in d} f(w, d) ) 表示文档 ( d ) 中所有单词的总出现次数。

2.2 逆文档频率(IDF)

逆文档频率用于衡量某个单词在整个文档集合中是否具有区分度。其计算公式为:

$$ IDF(t) = \log \frac{N}{1 + DF(t)} $$

其中:

  • ( N ) 是文档总数。
  • ( DF(t) ) 是包含词 ( t ) 的文档数量。
  • 分母加 1 是为了避免除零错误。

2.3 TF-IDF 计算

最终,TF-IDF 计算公式为:

$$ TFIDF(t, d) = TF(t, d) \times IDF(t) $$

3. TF-IDF 计算示例

假设我们有如下三篇文档:

文档 1: “机器学习 是 人工智能 的 一个 分支”

文档 2: “深度学习 是 机器学习 的 一个 重要 方向”

文档 3: “自然语言处理 是 人工智能 的 一个 重要 领域”

计算 “机器学习” 在 文档 2 中的 TF-IDF 值:

  • TF(“机器学习”, 文档 2) = 1 / 7 ≈ 0.142
  • IDF(“机器学习”) = log(3 / 2) ≈ 0.176
  • TF-IDF(“机器学习”, 文档 2) ≈ 0.142 × 0.176 ≈ 0.025

4. TF-IDF 的优缺点

4.1 优点

✅ 计算简单,易于理解和实现。
✅ 在搜索引擎和文本分析任务中表现良好。
✅ 适用于高维文本数据。

4.2 缺点

❌ 无法捕捉单词的语义信息,例如 “苹果” 可以指水果也可以指公司。
❌ 对长文本不够鲁棒,容易造成高频词权重偏高。
❌ 不能处理同义词、上下文信息,需要结合词向量等方法。

5. TF-IDF 在 NLP 领域的应用

  • 搜索引擎:计算查询词与网页的相关性,提高搜索质量。
  • 文本分类:作为文本特征用于机器学习模型。
  • 关键词提取:自动提取文档的核心关键词。
  • 文档相似度计算:用于推荐系统、聚类分析等。

6. Python 代码实现 TF-IDF

Python 提供了 sklearn.feature_extraction.text.TfidfVectorizer 方便计算 TF-IDF,示例如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
from sklearn.feature_extraction.text import TfidfVectorizer

# 定义文档集
documents = [
"机器学习 是 人工智能 的 一个 分支",
"深度学习 是 机器学习 的 一个 重要 方向",
"自然语言处理 是 人工智能 的 一个 重要 领域"
]

# 初始化 TF-IDF 计算器
vectorizer = TfidfVectorizer()
tf_idf_matrix = vectorizer.fit_transform(documents)

# 获取特征词汇表
words = vectorizer.get_feature_names_out()

# 转换为数组并输出
print(tf_idf_matrix.toarray())
Contents
  1. 1. 1. TF-IDF 简介
  2. 2. 2. TF-IDF 计算公式
    1. 2.1. 2.1 词频(TF)
    2. 2.2. 2.2 逆文档频率(IDF)
    3. 2.3. 2.3 TF-IDF 计算
  3. 3. 3. TF-IDF 计算示例
  4. 4. 4. TF-IDF 的优缺点
    1. 4.1. 4.1 优点
    2. 4.2. 4.2 缺点
  5. 5. 5. TF-IDF 在 NLP 领域的应用
  6. 6. 6. Python 代码实现 TF-IDF
|