11 只生成词向量之TF-IDF

在自然语言处理(NLP)中,词向量的表示方法有很多,从最简单的词袋模型开始,再到我们今天要讨论的TF-IDF(Term Frequency-Inverse Document Frequency)方法。相较于词袋模型,TF-IDF不仅考虑了词频,还考虑了词的重要性,从而为文本提供更为精确的表示。

什么是TF-IDF

TF-IDF 是一个统计算法,它用来评估单词在文档集合或语料库中的重要性。它由两个部分组成:

  • 词频(TF):一个词在某篇文档中出现的频率。其计算公式为:

    $$
    TF(w, d) = \frac{n_{w, d}}{\sum_{w’ \in d} n_{w’, d}}
    $$

    其中,$n_{w, d}$表示词w在文档d中的出现次数,$\sum_{w’ \in d} n_{w’, d}$表示文档d中词的总数。

  • 逆文档频率(IDF):一个词在所有文档中重要性的度量。其计算公式为:

    $$
    IDF(w, D) = \log\left(\frac{|D|}{|{d \in D: w \in d}|}\right)
    $$

    其中,$|D|$表示整个文档集合的大小,而$|{d \in D: w \in d}|$表示包含词w的文档数量。

结合这两个部分,我们可以得到TF-IDF的计算公式:

$$
TFIDF(w, d, D) = TF(w, d) \times IDF(w, D)
$$

TF-IDF的工作流程

TF-IDF的计算流程通常包括以下几个步骤:

  1. 文本预处理:去除停用词、标点符号,进行分词等。

  2. 计算词频(TF):统计每个词在每个文档中的出现频率。

  3. 计算逆文档频率(IDF):统计每个词在所有文档中出现的情况。

  4. 计算TF-IDF值:将TF和IDF相乘以获得每个词的TF-IDF值。

案例演示

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

  • 文档1:我 爱 自然 语言
  • 文档2:我 爱 编程
  • 文档3:自然 语言 处理 是 很 有趣 的

我们来计算“自然”这个词在这三篇文档中的TF-IDF值。

步骤1:文本预处理

在这个例子中,文本已经被很好地分词。我们可以直接进入下一步。

步骤2:计算词频(TF)

  • 文档1:我(1), 爱(1), 自然(1), 语言(1) => TF = {我: 0.25, 爱: 0.25, 自然: 0.25, 语言: 0.25}
  • 文档2:我(1), 爱(1), 编程(1) => TF = {我: 0.33, 爱: 0.33, 编程: 0.33}
  • 文档3:自然(1), 语言(1), 处理(1), 是(1), 很(1), 有趣(1), 的(1) => TF = {自然: 0.14, 语言: 0.14, 处理: 0.14, 是: 0.14, 很: 0.14, 有趣: 0.14, 的: 0.14}

步骤3:计算逆文档频率(IDF)

  • 自然在文档1和文档3中出现,文档总数为3,因此有:

$$
IDF(自然, D) = \log\left(\frac{3}{2}\right) \approx 0.176
$$

步骤4:计算TF-IDF值

  • 文档1

$$
TFIDF(自然, 文档1) = 0.25 \times 0.176 \approx 0.044
$$

  • 文档2:没有自然,因此为0。

  • 文档3

$$
TFIDF(自然, 文档3) = 0.14 \times 0.176 \approx 0.025
$$

最终结果为:

  • 文档1中的“自然” TF-IDF 值为 0.044
  • 文档2中的“自然” TF-IDF 值为 0
  • 文档3中的“自然” TF-IDF 值为 0.025

Python实现

我们可以使用Python中的scikit-learn来方便地计算TF-IDF值。以下是一个简单的实现:

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

# 样本文档
documents = ["我 爱 自然 语言", "我 爱 编程", "自然 语言 处理 是 很 有趣 的"]

# 创建TF-IDF向量器
vectorizer = TfidfVectorizer()

# 拟合并转换文档
tfidf_matrix = vectorizer.fit_transform(documents)

# 打印结果
feature_names = vectorizer.get_feature_names_out()
dense = tfidf_matrix.todense()
denselist = dense.tolist()

import pandas as pd

df_tfidf = pd.DataFrame(denselist, columns=feature_names)
print(df_tfidf)

输出将为一个包含每个单词在每个文档中TF-IDF值的矩阵。

小结

TF-IDF是一种强有力的文本特征提取方法,它解决了词袋模型的局限性,通过考虑词频和逆文档频率,我们能够提取出语料中的重要信息及词的相对重要性。在接下来的篇章中,我们将学习更为复杂的Word2Vec模型,这将进一步丰富我们的词向量知识体系。

通过本篇教程,你应该对TF-IDF有了基本的理解,以及如何在Python中实现它。希望你能在后续的学习中步入更深入的NLP领域!

11 只生成词向量之TF-IDF

https://zglg.work/nlp-zero/11/

作者

IT教程网(郭震)

发布于

2024-08-10

更新于

2024-08-11

许可协议

分享转发

交流

更多教程加公众号

更多教程加公众号

加入星球获取PDF

加入星球获取PDF

打卡评论