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的计算流程通常包括以下几个步骤:
文本预处理:去除停用词、标点符号,进行分词等。
计算词频(TF):统计每个词在每个文档中的出现频率。
计算逆文档频率(IDF):统计每个词在所有文档中出现的情况。
计算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 | from sklearn.feature_extraction.text import TfidfVectorizer |
输出将为一个包含每个单词在每个文档中TF-IDF值的矩阵。
小结
TF-IDF是一种强有力的文本特征提取方法,它解决了词袋模型的局限性,通过考虑词频和逆文档频率,我们能够提取出语料中的重要信息及词的相对重要性。在接下来的篇章中,我们将学习更为复杂的Word2Vec
模型,这将进一步丰富我们的词向量知识体系。
通过本篇教程,你应该对TF-IDF有了基本的理解,以及如何在Python中实现它。希望你能在后续的学习中步入更深入的NLP领域!
11 只生成词向量之TF-IDF