本文目录导读:

我来详细介绍如何使用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文本向量化的主要应用场景,可以根据具体需求选择合适的方法。
版权声明:NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播