TF-IDF和词袋模型
TF-IDF和词袋模型(Bag of Words, BoW)是文本特征提取的两种经典方法,下面我会用通俗易懂的方式对比讲解它们的原理、实现和应用场景,并附上代码示例。
一、词袋模型(Bag of Words, BoW)
1. 核心思想
-
粗暴但有效:将文本看作一个“装满单词的袋子”,忽略词序、语法,只统计每个词出现的频率。
-
类比:就像拆解乐高模型,把所有零件倒出来数一数每种积木的数量,而不关心原来怎么拼的。
2. 实现步骤
-
构建词表:统计所有文本中出现的唯一单词(即词汇表)。
-
生成向量:对每个句子,统计词表中每个词的出现次数。
3. 示例
原始文本:
-
句子1: "I love dogs."
-
句子2: "I hate dogs and cats."
词表(Vocabulary):
['I', 'love', 'hate', 'dogs', 'and', 'cats']
向量化结果:
I | love | hate | dogs | and | cats | |
---|---|---|---|---|---|---|
句子1 | 1 | 1 | 0 | 1 | 0 | 0 |
句子2 | 1 | 0 | 1 | 1 | 1 | 1 |
4. Python代码
from sklearn.feature_extraction.text import CountVectorizercorpus = ["I love dogs.", "I hate dogs and cats."]
vectorizer = CountVectorizer()
X = vectorizer.fit_transform(corpus)print("词表:", vectorizer.get_feature_names_out())
print("向量矩阵:\n", X.toarray())
输出:
词表: ['and' 'cats' 'dogs' 'hate' 'love']
向量矩阵:[[0 0 1 0 1][1 1 1 1 0]]
5. 优缺点
-
优点:简单、计算快。
-
缺点:
-
忽略词序("狗咬人"和"人咬狗"向量相同)。
-
高频常见词(如"the"、"is")会主导特征。
-
二、TF-IDF(Term Frequency-Inverse Document Frequency)
1. 核心思想
-
加权统计:不仅考虑词频(TF),还惩罚在所有文档中常见的词(通过IDF)。
-
目的:突出对当前文档有区分度的词,抑制通用词。
2. 公式拆解
-
TF(词频):
TF(t,d)=词t在文档d中出现的次数文档d的总词数TF(t,d)=文档d的总词数词t在文档d中出现的次数 -
IDF(逆文档频率):
IDF(t)=log(总文档数包含词t的文档数)IDF(t)=log(包含词t的文档数总文档数) -
TF-IDF:
TF-IDF(t,d)=TF(t,d)×IDF(t)TF-IDF(t,d)=TF(t,d)×IDF(t)
3. 示例(同前文本)
-
计算"dogs"在句子1中的TF-IDF:
-
TF = 1/3 ≈ 0.33
-
IDF = log(2/2) = 0 (因为"dogs"在两个句子中都出现)
-
TF-IDF = 0.33 * 0 = 0
-
-
计算"love"在句子1中的TF-IDF:
-
TF = 1/3 ≈ 0.33
-
IDF = log(2/1) ≈ 0.69 (仅句子1包含"love")
-
TF-IDF = 0.33 * 0.69 ≈ 0.23
-
4. Python代码
from sklearn.feature_extraction.text import TfidfVectorizercorpus = ["I love dogs.", "I hate dogs and cats."]
vectorizer = TfidfVectorizer()
X = vectorizer.fit_transform(corpus)print("词表:", vectorizer.get_feature_names_out())
print("TF-IDF矩阵:\n", X.toarray().round(2))
输出:
词表: ['and' 'cats' 'dogs' 'hate' 'love']
TF-IDF矩阵:[[0. 0. 0.55 0. 0.83][0.58 0.58 0.33 0.58 0. ]]
(注:实际输出包含归一化,数值可能略有不同)
5. 优缺点
-
优点:
-
降低常见词的权重(如"dogs"的TF-IDF为0.33 vs. 词袋中的1)。
-
提升关键词的重要性(如"love"在句子1中权重高)。
-
-
缺点:
-
仍无法捕捉词序和语义。
-
计算量略大于词袋模型。
-
三、对比总结
特性 | 词袋模型(BoW) | TF-IDF |
---|---|---|
是否考虑词频 | 是(原始计数) | 是(加权后的词频) |
是否惩罚常见词 | 否 | 是(通过IDF) |
适用场景 | 简单文本分类/基线模型 | 信息检索、关键词提取 |
计算复杂度 | 低 | 中等 |
四、如何选择?
-
用词袋模型:
-
需要快速基线模型时。
-
配合朴素贝叶斯等简单模型。
-
-
用TF-IDF:
-
当常见词(如“的”、“是”)可能干扰结果时。
-
需要提取文档关键词时(如搜索引擎)。
-
五、进阶思考
-
局限性:两者都无法理解语义(如"好"和"棒"被视为无关词)。
-
改进方向:
-
Word2Vec/GloVe:考虑词义相似性。
-
BERT:基于上下文的深度语义表示。
-