一、为什么要做文本特征提取?
想象你要教AI识别两种文本:
-
类型A:"这部电影太棒了,强烈推荐!"
-
类型B:"糟糕的观影体验,浪费钱。"
计算机只认识数字,不认识汉字/英文。我们需要把文字转换成特征向量(一组数字),就像把中文翻译成计算机的母语。
二、文本特征提取三大方法
方法1:词袋模型(Bag of Words)
核心思想:数单词出现的次数,忽略顺序
类比:就像把一篇文章丢进碎纸机,统计每个单词碎片的数量
from sklearn.feature_extraction.text import CountVectorizer
corpus = [
"I love python programming", # 文档1
"Python is better than Java" # 文档2
]
# 创建词袋模型
vectorizer = CountVectorizer()
X = vectorizer.fit_transform(corpus)
# 查看结果
print("词表:", vectorizer.get_feature_names_out())
print("特征矩阵:\n", X.toarray())
输出:
词表: ['better' 'java' 'love' 'programming' 'python' 'than']
特征矩阵:
[[0 0 1 1 1 0] # love(1), programming(1), python(1)
[1 1 0 0 1 1]] # better(1), java(1), python(1), than(1)
特点:
-
简单直接
-
丢失了单词顺序("狗咬人"和"人咬狗"结果一样)
-
适合小规模文本分类
方法2:TF-IDF(词频-逆文档频率)
核心思想:给重要的词打高分,常见词打低分
类比:老师批改作文时,会给"人工智能"这种专业词加分,对"的/是"这种常见词忽略
from sklearn.feature_extraction.text import TfidfVectorizer
corpus = [
"The cat sat on the mat",
"The dog ate my homework"
]
vectorizer = TfidfVectorizer()
X = vectorizer.fit_transform(corpus)
print("词表:", vectorizer.get_feature_names_out())
print("TF-IDF矩阵:\n", X.toarray().round(2))
输出:
词表: ['ate' 'cat' 'dog' 'homework' 'mat' 'my' 'on' 'sat' 'the']
TF-IDF矩阵:
[[0. 0.6 0. 0. 0.6 0. 0.45 0.45 0.38] # cat/mat得分高
[0.53 0. 0.53 0.53 0. 0.53 0. 0. 0.27]] # ate/dog/homework得分高
特点:
-
降低了常见词的权重(如"the")
-
提升了关键词的重要性
-
适合信息检索、关键词提取
方法3:Word2Vec(词嵌入)
核心思想:让意思相近的词在数字空间里位置也接近
类比:把单词放到地图上,"北京"和"上海"距离近,"西瓜"和"水果"距离近
from gensim.models import Word2Vec
sentences = [
["machine", "learning", "is", "fun"],
["deep", "learning", "uses", "neural", "nets"]
]
# 训练Word2Vec模型
model = Word2Vec(sentences, vector_size=3, window=2, min_count=1)
# 查看"learning"的词向量
print(model.wv["learning"])
输出示例:
[ 0.012 0.456 -0.789] # 3维向量
特点:
-
能捕捉语义关系(king - man + woman ≈ queen)
-
需要大量训练数据
-
适合需要理解语义的场景
三、如何选择方法?
场景 | 推荐方法 | 原因 |
---|---|---|
垃圾邮件分类 | 词袋/TF-IDF | 简单高效 |
电影评论情感分析 | TF-IDF | 需要突出情感词 |
智能客服问答系统 | Word2Vec/BERT | 需要理解语义相似度 |
新闻主题聚类 | TF-IDF + PCA | 降维后可视化 |
四、处理中文文本的特殊技巧
-
分词:英文有空格分隔,中文需要先分词
import jieba text = "我喜欢机器学习" print(" ".join(jieba.cut(text))) # 输出:我 喜欢 机器 学习
-
去除停用词:过滤掉"的/了/是"等无意义词
stopwords = ["的", "了", "是"] words = [w for w in words if w not in stopwords]
-
词性过滤:只保留名词/动词等关键词语
import jieba.posseg as pseg words = [word for word, flag in pseg.cut(text) if flag.startswith('n')]
五、完整文本处理流水线示例
六、动手实验建议
-
用TF-IDF处理豆瓣电影短评,看看哪些词对"好评/差评"影响最大
-
比较词袋和TF-IDF在新闻分类任务中的准确率差异
-
使用
gensim
训练自己的Word2Vec模型,找找"算法"最近的10个词
记住:文本特征提取是NLP的基石,掌握它你就打开了自然语言处理的大门!