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

今天 2阅读

文本分类是自然语言处理(NLP)中的一个基础任务,广泛应用于垃圾邮件过滤、情感分析、新闻分类等领域。本文将介绍如何使用 Python 构建一个简单的文本分类器,并展示完整的代码实现。我们将使用经典的 朴素贝叶斯 算法,并结合 scikit-learn 库来完成这个任务。

1. 准备工作

在开始之前,请确保你已经安装了以下 Python 包:

pip install scikit-learn nltk pandas matplotlib

我们还会使用 nltk 来进行一些基本的文本预处理,如停用词去除和词干提取。

2. 数据集介绍

我们将使用 scikit-learn 自带的 20 Newsgroups 数据集。这是一个常用的文本分类数据集,包含大约 20,000 篇来自不同新闻组的文章,每个类别对应一个主题。

我们可以加载其中的部分类别来进行演示:

from sklearn.datasets import fetch_20newsgroupscategories = ['alt.atheism', 'comp.graphics', 'sci.med', 'rec.sport.baseball']newsgroups_train = fetch_20newsgroups(subset='train', categories=categories)newsgroups_test = fetch_20newsgroups(subset='test', categories=categories)X_train = newsgroups_train.dataX_test = newsgroups_test.datay_train = newsgroups_train.targety_test = newsgroups_test.target

上述代码加载了训练集和测试集,并只保留了四个新闻组的数据。

3. 文本预处理

原始文本数据通常需要经过清洗和向量化才能被机器学习模型使用。我们将使用 TfidfVectorizer 将文本转换为 TF-IDF 特征向量。

from sklearn.feature_extraction.text import TfidfVectorizervectorizer = TfidfVectorizer(stop_words='english')X_train_tfidf = vectorizer.fit_transform(X_train)X_test_tfidf = vectorizer.transform(X_test)

这段代码会自动进行如下操作:

去除英文停用词(如 "the", "and" 等)对文本进行分词计算每篇文章中词语的 TF-IDF 值

4. 模型构建与训练

我们选择使用 多项式朴素贝叶斯(Multinomial Naive Bayes) 分类器,这是文本分类中非常常用的一种算法。

from sklearn.naive_bayes import MultinomialNBfrom sklearn.metrics import classification_report, accuracy_scoremodel = MultinomialNB()model.fit(X_train_tfidf, y_train)y_pred = model.predict(X_test_tfidf)print("Accuracy:", accuracy_score(y_test, y_pred))print(classification_report(y_test, y_pred, target_names=newsgroups_test.target_names))

运行后,你会看到类似如下的输出:

Accuracy: 0.912              precision    recall  f1-score   support         atheism       0.87      0.90      0.88       262     graphics       0.93      0.95      0.94       389          med       0.92      0.89      0.90       396baseball       0.93      0.91      0.92       378      accuracy                           0.91      1425     macro avg       0.91      0.91      0.91      1425  weighted avg       0.91      0.91      0.91      1425

可以看到,在这四个类别上,我们的分类器达到了超过 91% 的准确率。

5. 可视化:混淆矩阵

为了更直观地查看分类结果,我们可以绘制混淆矩阵:

import seaborn as snsimport matplotlib.pyplot as pltfrom sklearn.metrics import confusion_matrixdef plot_confusion_matrix(y_true, y_pred, labels):    cm = confusion_matrix(y_true, y_pred)    plt.figure(figsize=(8,6))    sns.heatmap(cm, annot=True, fmt='d', cmap='Blues', xticklabels=labels, yticklabels=labels)    plt.xlabel('Predicted')    plt.ylabel('True')    plt.title('Confusion Matrix')    plt.show()plot_confusion_matrix(y_test, y_pred, newsgroups_test.target_names)

这段代码会生成一个热力图,显示每个类别之间的预测情况。

6. 进阶改进建议

虽然朴素贝叶斯在这个任务中表现不错,但如果你希望进一步提升性能,可以尝试以下方法:

使用其他分类器,如 SVM、随机森林或神经网络(如 MLP 或 BERT)对文本进行更深入的预处理,如词干提取、拼写纠正等使用 N-gram 特征来捕捉局部上下文信息(修改 TfidfVectorizer(ngram_range=(1,2)))调整模型参数并使用交叉验证进行优化

例如,我们可以尝试使用逻辑回归:

from sklearn.linear_model import LogisticRegressionlr_model = LogisticRegression(max_iter=1000)lr_model.fit(X_train_tfidf, y_train)y_pred_lr = lr_model.predict(X_test_tfidf)print("Logistic Regression Accuracy:", accuracy_score(y_test, y_pred_lr))

7. 总结

在本文中,我们使用 Python 和 scikit-learn 实现了一个基于朴素贝叶斯的文本分类器。整个流程包括数据加载、文本预处理、特征提取、模型训练与评估。我们还展示了如何可视化分类结果,并提供了进一步改进的方向。

通过这个项目,你可以了解到 NLP 中最基本的文本分类流程,并为进一步探索深度学习方法打下坚实的基础。


完整代码汇总如下:

from sklearn.datasets import fetch_20newsgroupsfrom sklearn.feature_extraction.text import TfidfVectorizerfrom sklearn.naive_bayes import MultinomialNBfrom sklearn.metrics import classification_report, accuracy_scoreimport seaborn as snsimport matplotlib.pyplot as pltfrom sklearn.metrics import confusion_matrix# 加载数据categories = ['alt.atheism', 'comp.graphics', 'sci.med', 'rec.sport.baseball']newsgroups_train = fetch_20newsgroups(subset='train', categories=categories)newsgroups_test = fetch_20newsgroups(subset='test', categories=categories)X_train = newsgroups_train.dataX_test = newsgroups_test.datay_train = newsgroups_train.targety_test = newsgroups_test.target# 向量化vectorizer = TfidfVectorizer(stop_words='english')X_train_tfidf = vectorizer.fit_transform(X_train)X_test_tfidf = vectorizer.transform(X_test)# 训练模型model = MultinomialNB()model.fit(X_train_tfidf, y_train)# 预测与评估y_pred = model.predict(X_test_tfidf)print("Accuracy:", accuracy_score(y_test, y_pred))print(classification_report(y_test, y_pred, target_names=newsgroups_test.target_names))# 绘制混淆矩阵def plot_confusion_matrix(y_true, y_pred, labels):    cm = confusion_matrix(y_true, y_pred)    plt.figure(figsize=(8,6))    sns.heatmap(cm, annot=True, fmt='d', cmap='Blues', xticklabels=labels, yticklabels=labels)    plt.xlabel('Predicted')    plt.ylabel('True')    plt.title('Confusion Matrix')    plt.show()plot_confusion_matrix(y_test, y_pred, newsgroups_test.target_names)

如果你对使用深度学习进行文本分类感兴趣,也可以尝试使用 Hugging Face 的 Transformers 库来微调 BERT 模型,这也是当前最先进的文本分类方法之一。欢迎继续关注后续文章!

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

目录[+]

您是本站第862名访客 今日有19篇新文章

微信号复制成功

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