本文目录导读:

我来详细介绍如何使用Scikit-learn进行文本向量化,包含多个实用案例。
基础文本向量化方法
1 词袋模型 (CountVectorizer)
from sklearn.feature_extraction.text import CountVectorizer
import numpy as np
# 示例文本数据
documents = [
'这个电影很好看,特效非常棒',
'剧情太差了,浪费了好的演员',
'特效和剧情都不错,值得推荐'
]
# 创建词袋模型向量化器
vectorizer = CountVectorizer(
max_features=1000, # 最大特征数量
min_df=1, # 最小文档频率
max_df=0.8, # 最大文档频率(过滤常见词)
stop_words=None, # 停用词
token_pattern=r'\b\w+\b', # 分词模式
ngram_range=(1, 1) # n-gram范围
)
# 拟合和转换文本
X = vectorizer.fit_transform(documents)
print('词汇表大小:', len(vectorizer.vocabulary_))
print('特征矩阵形状:', X.shape)
print('\n词汇表:')
print(list(vectorizer.vocabulary_.keys())[:10])
print('\n特征矩阵(稀疏表示):')
print(X.toarray())
2 TF-IDF向量化 (TfidfVectorizer)
from sklearn.feature_extraction.text import TfidfVectorizer
# 创建TF-IDF向量化器
tfidf_vectorizer = TfidfVectorizer(
max_features=1000,
min_df=2, # 至少出现在2个文档中
max_df=0.8,
sublinear_tf=True, # 使用1+log(tf)
use_idf=True, # 使用IDF加权
smooth_idf=True # 平滑IDF
)
# 拟合和转换
X_tfidf = tfidf_vectorizer.fit_transform(documents)
print('TF-IDF特征矩阵形状:', X_tfidf.shape)
print('\nTF-IDF特征矩阵(第一文档):')
print(X_tfidf[0].toarray())
# 获取特征名称
feature_names = tfidf_vectorizer.get_feature_names_out()
print('\n特征名称(前10个):')
print(feature_names[:10])
实际应用案例
1 文本分类完整流程
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.naive_bayes import MultinomialNB
from sklearn.model_selection import train_test_split
from sklearn.metrics import classification_report, accuracy_score
import pandas as pd
# 准备新闻分类数据
news_data = [
'中国科技公司研发出新型芯片',
'篮球比赛今天在体育馆进行',
'新能源电动车销量创新高',
'足球队备战世界杯预选赛',
'人工智能在医疗领域取得突破',
'奥运会筹备工作进展顺利'
]
news_labels = ['科技', '体育', '科技', '体育', '科技', '体育']
# 分割数据集
X_train, X_test, y_train, y_test = train_test_split(
news_data, news_labels, test_size=0.3, random_state=42
)
# 向量化
vectorizer = TfidfVectorizer(
max_features=500,
min_df=1,
max_df=0.9,
ngram_range=(1, 2) # 使用一元和二元词元
)
X_train_vec = vectorizer.fit_transform(X_train)
X_test_vec = vectorizer.transform(X_test)
# 训练分类器
classifier = MultinomialNB()
classifier.fit(X_train_vec, y_train)
# 预测和评估
y_pred = classifier.predict(X_test_vec)
print('分类准确率:', accuracy_score(y_test, y_pred))
print('\n分类报告:')
print(classification_report(y_test, y_pred))
2 文本相似度计算
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.metrics.pairwise import cosine_similarity
import numpy as np
# 定义文本
texts = [
'机器学习和深度学习都是人工智能的重要分支',
'深度学习是机器学习的一个重要领域',
'今天的天气非常好,适合去公园散步'
]
# 向量化
vectorizer = TfidfVectorizer()
X = vectorizer.fit_transform(texts)
# 计算余弦相似度
similarity_matrix = cosine_similarity(X)
print('文本相似度矩阵:')
for i in range(len(texts)):
for j in range(i+1, len(texts)):
print(f'文本{i+1}和文本{j+1}的相似度: {similarity_matrix[i][j]:.4f}')
# 查找最相似的文档
def find_most_similar(query, documents, vectorizer, n=2):
"""查找与查询最相似的文档"""
query_vec = vectorizer.transform([query])
similarities = cosine_similarity(query_vec, documents)[0]
# 获取top-n相似文档索引
top_indices = np.argsort(similarities)[::-1][:n]
results = []
for idx in top_indices:
results.append({
'text': documents[idx],
'similarity': similarities[idx]
})
return results
# 测试相似度查询
query = '机器学习与深度学习的关系'
results = find_most_similar(query, texts, vectorizer)
print(f'\n查询: "{query}"')
for r in results:
print(f'相似文本: "{r["text"]}" (相似度: {r["similarity"]:.4f})')
高级应用
1 自定义分词器
import jieba
from sklearn.feature_extraction.text import CountVectorizer
def jieba_tokenizer(text):
"""使用jieba进行中文分词"""
return list(jieba.cut(text))
# 创建自定义向量化器
custom_vectorizer = CountVectorizer(
tokenizer=jieba_tokenizer,
min_df=1,
max_features=100
)
# 测试
texts = [
'我爱北京天安门',
'北京欢迎您'
]
X = custom_vectorizer.fit_transform(texts)
print('自定义分词器特征:')
print(list(custom_vectorizer.vocabulary_.keys()))
2 Pipeline整合
from sklearn.pipeline import Pipeline
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.svm import SVC
# 创建完整的Pipeline
text_pipeline = Pipeline([
('vectorizer', TfidfVectorizer(
max_features=1000,
min_df=2,
max_df=0.8,
ngram_range=(1, 2)
)),
('classifier', SVC(kernel='linear', C=1.0))
])
# 训练Pipeline
text_pipeline.fit(news_data, news_labels)
# 预测新文本
new_text = ['人工智能技术正在快速发展']
prediction = text_pipeline.predict(new_text)
print(f'预测类别: {prediction[0]}')
# 获取预测概率(如果分类器支持)
try:
proba = text_pipeline.predict_proba(new_text)
print(f'预测概率: {proba}')
except:
print('此分类器不支持概率预测')
实用技巧
1 特征选择
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.feature_selection import SelectKBest, chi2
# 创建特征选择器
feature_selector = SelectKBest(chi2, k=50)
# 完整流程
vectorizer = TfidfVectorizer()
X = vectorizer.fit_transform(news_data)
y = np.array(news_labels)
# 选择最重要的特征
X_selected = feature_selector.fit_transform(X, y)
# 获取选中的特征名称
selected_indices = feature_selector.get_support(indices=True)
selected_features = [vectorizer.get_feature_names_out()[i] for i in selected_indices]
print('选中的特征:', selected_features[:10])
2 处理大规模数据
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.decomposition import TruncatedSVD
# 使用HashingVectorizer处理大规模数据
from sklearn.feature_extraction.text import HashingVectorizer
hashing_vectorizer = HashingVectorizer(
n_features=10000,
alternate_sign=False,
norm='l2'
)
# 使用TruncatedSVD降维
svd = TruncatedSVD(n_components=100)
# Pipeline
pipeline = Pipeline([
('hashing', hashing_vectorizer),
('svd', svd)
])
# 处理数据(示例)
X_transformed = pipeline.fit_transform(news_data)
print('降维后形状:', X_transformed.shape)
实战技巧总结
-
选择合适的向量化方法:
- 分类任务:推荐TF-IDF
- 语义相似度:推荐TF-IDF + 余弦相似度
- 快速原型:使用CountVectorizer
-
参数调优建议:
max_features:根据数据量调整,一般1000-10000min_df/max_df:过滤低频和高频词ngram_range:使用(1,2)捕获短语信息
-
处理中文文本:
- 使用jieba等分词工具进行预处理
- 考虑保留常用词和领域特定词汇
-
性能优化:
- 使用HashingVectorizer处理大规模数据
- 配合TruncatedSVD进行降维
- 使用稀疏矩阵节省内存
这些案例覆盖了Scikit-learn文本向量化的主要应用场景,可以根据具体需求选择合适的方法。