Python案例如何用Scikit-learn做文本向量化

wen python案例 2

本文目录导读:

Python案例如何用Scikit-learn做文本向量化

  1. 基础文本向量化方法
  2. 实际应用案例
  3. 高级应用
  4. 实用技巧
  5. 实战技巧总结

我来详细介绍如何使用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)

实战技巧总结

  1. 选择合适的向量化方法

    • 分类任务:推荐TF-IDF
    • 语义相似度:推荐TF-IDF + 余弦相似度
    • 快速原型:使用CountVectorizer
  2. 参数调优建议

    • max_features:根据数据量调整,一般1000-10000
    • min_df/max_df:过滤低频和高频词
    • ngram_range:使用(1,2)捕获短语信息
  3. 处理中文文本

    • 使用jieba等分词工具进行预处理
    • 考虑保留常用词和领域特定词汇
  4. 性能优化

    • 使用HashingVectorizer处理大规模数据
    • 配合TruncatedSVD进行降维
    • 使用稀疏矩阵节省内存

这些案例覆盖了Scikit-learn文本向量化的主要应用场景,可以根据具体需求选择合适的方法。

抱歉,评论功能暂时关闭!