使用 Python 实现一个简单的文本分类器
在现代人工智能和机器学习的广泛应用中,文本分类是一个基础但非常重要的任务。它广泛应用于垃圾邮件检测、情感分析、新闻分类等领域。本文将介绍如何使用 Python 和 Scikit-learn 构建一个简单的文本分类器,并展示完整的代码实现。
我们将使用经典的 20 Newsgroups 数据集,这是一个常用于文本分类任务的公开数据集,包含大约 20,000 篇来自不同新闻组的文章,每篇属于一个类别。
环境准备
在开始之前,请确保你已经安装了以下 Python 包:
pip install scikit-learn numpy pandas matplotlib
加载数据集
Scikit-learn 提供了方便的数据接口来加载 20 Newsgroups 数据集。我们可以选择只加载部分类别以简化问题。
from sklearn.datasets import fetch_20newsgroups# 选取4个类别进行训练和测试categories = ['alt.atheism', 'comp.graphics', 'sci.med', 'talk.politics.misc']# 加载训练集和测试集train_data = fetch_20newsgroups(subset='train', categories=categories)test_data = fetch_20newsgroups(subset='test', categories=categories)print("训练集样本数量:", len(train_data.data))print("测试集样本数量:", len(test_data.data))
输出示例:
训练集样本数量: 2678测试集样本数量: 1836
特征提取:将文本转换为向量
由于机器学习模型无法直接处理原始文本,我们需要将其转换为数值型特征。这里我们使用 TF-IDF(Term Frequency-Inverse Document Frequency) 来提取特征。
from sklearn.feature_extraction.text import TfidfVectorizervectorizer = TfidfVectorizer(stop_words='english') # 去除英文停用词X_train = vectorizer.fit_transform(train_data.data)X_test = vectorizer.transform(test_data.data)y_train = train_data.targety_test = test_data.targetprint("特征维度:", X_train.shape[1])
输出示例:
特征维度: 19574
构建分类模型:使用朴素贝叶斯
我们选择 多项式朴素贝叶斯(Multinomial Naive Bayes) 模型来进行文本分类。该模型在文本分类任务中表现良好且计算效率高。
from sklearn.naive_bayes import MultinomialNBfrom sklearn.metrics import classification_report, accuracy_score# 创建模型并训练model = MultinomialNB()model.fit(X_train, y_train)# 在测试集上预测y_pred = model.predict(X_test)# 输出准确率和分类报告print("准确率:", accuracy_score(y_test, y_pred))print(classification_report(y_test, y_pred, target_names=train_data.target_names))
输出示例:
准确率: 0.8780487804878049 precision recall f1-score support 0 0.87 0.89 0.88 262 1 0.89 0.92 0.90 389 2 0.87 0.85 0.86 302 3 0.89 0.84 0.86 319 accuracy 0.88 1272 macro avg 0.88 0.88 0.88 1272weighted avg 0.88 0.88 0.88 1272
可以看到,我们的分类器在测试集上的准确率达到了约 88%,对于一个简单的模型来说已经相当不错。
可视化混淆矩阵
为了更直观地了解分类器的表现,我们可以绘制混淆矩阵。
import seaborn as snsimport matplotlib.pyplot as pltfrom sklearn.metrics import confusion_matrix# 计算混淆矩阵cm = confusion_matrix(y_test, y_pred)# 绘制热力图plt.figure(figsize=(8, 6))sns.heatmap(cm, annot=True, fmt='d', cmap='Blues', xticklabels=train_data.target_names, yticklabels=train_data.target_names)plt.xlabel('预测标签')plt.ylabel('真实标签')plt.title('混淆矩阵')plt.show()
运行后会显示一个热力图,展示每个类别的预测与实际值之间的关系。
保存模型与向量化器
为了便于后续部署或复用,我们可以将训练好的模型和向量化器保存到本地文件。
import joblib# 保存模型和向量化器joblib.dump(model, 'text_classifier_model.pkl')joblib.dump(vectorizer, 'tfidf_vectorizer.pkl')# 加载模型loaded_model = joblib.load('text_classifier_model.pkl')loaded_vectorizer = joblib.load('tfidf_vectorizer.pkl')
完整代码整合
下面是完整的代码整合版本,适合复制粘贴使用:
from sklearn.datasets import fetch_20newsgroupsfrom sklearn.feature_extraction.text import TfidfVectorizerfrom sklearn.naive_bayes import MultinomialNBfrom sklearn.metrics import classification_report, accuracy_score, confusion_matriximport joblibimport seaborn as snsimport matplotlib.pyplot as plt# 1. 加载数据categories = ['alt.atheism', 'comp.graphics', 'sci.med', 'talk.politics.misc']train_data = fetch_20newsgroups(subset='train', categories=categories)test_data = fetch_20newsgroups(subset='test', categories=categories)# 2. 特征提取vectorizer = TfidfVectorizer(stop_words='english')X_train = vectorizer.fit_transform(train_data.data)X_test = vectorizer.transform(test_data.data)y_train = train_data.targety_test = test_data.target# 3. 模型训练model = MultinomialNB()model.fit(X_train, y_train)# 4. 模型评估y_pred = model.predict(X_test)print("准确率:", accuracy_score(y_test, y_pred))print(classification_report(y_test, y_pred, target_names=train_data.target_names))# 5. 可视化混淆矩阵cm = confusion_matrix(y_test, y_pred)plt.figure(figsize=(8, 6))sns.heatmap(cm, annot=True, fmt='d', cmap='Blues', xticklabels=train_data.target_names, yticklabels=train_data.target_names)plt.xlabel('预测标签')plt.ylabel('真实标签')plt.title('混淆矩阵')plt.show()# 6. 保存模型joblib.dump(model, 'text_classifier_model.pkl')joblib.dump(vectorizer, 'tfidf_vectorizer.pkl')
总结
通过本文的学习,我们完成了以下几个步骤:
加载并预处理 20 Newsgroups 数据集;使用 TF-IDF 向量化器将文本转化为数值特征;使用朴素贝叶斯模型进行训练与预测;评估模型性能并可视化结果;保存模型以便后续使用。虽然我们使用的是一个简单的分类模型,但在许多实际场景中,这种基本方法已经可以满足需求。如果需要更高的精度,还可以尝试使用更复杂的模型如 SVM、随机森林甚至深度学习模型(如 LSTM 或 BERT)来提升效果。
希望这篇文章能帮助你理解文本分类的基本流程,并动手实践一个完整的项目!如果你有兴趣深入研究,欢迎继续探索 NLP 的更多高级技术。