使用 Python 实现一个简单的文本分类器

昨天 2阅读

在现代人工智能和机器学习的广泛应用中,文本分类是一个基础但非常重要的任务。它广泛应用于垃圾邮件检测、情感分析、新闻分类等领域。本文将介绍如何使用 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 的更多高级技术。

免责声明:本文来自网站作者,不代表CIUIC的观点和立场,本站所发布的一切资源仅限用于学习和研究目的;不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负。本站信息来自网络,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑中彻底删除上述内容。如果您喜欢该程序,请支持正版软件,购买注册,得到更好的正版服务。客服邮箱:ciuic@ciuic.com

目录[+]

您是本站第17008名访客 今日有8篇新文章

微信号复制成功

打开微信,点击右上角"+"号,添加朋友,粘贴微信号,搜索即可!