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

昨天 8阅读

在现代人工智能应用中,文本分类是一项基础且重要的任务。它广泛应用于垃圾邮件识别、新闻分类、情感分析等领域。本文将介绍如何使用Python构建一个简单的文本分类器,并通过Scikit-learn库实现基于朴素贝叶斯(Naive Bayes)算法的文本分类模型。

我们将按照以下步骤完成这个项目:

数据准备与预处理 特征提取(词袋模型) 构建并训练分类模型 模型评估 应用模型进行预测

1. 数据准备与预处理

为了演示目的,我们使用Scikit-learn内置的fetch_20newsgroups数据集。该数据集包含大约2万篇新闻文档,均匀分布在20个不同的新闻组中。我们将选取其中两个类别进行二分类任务:rec.sport.baseballcomp.sys.mac.hardware

from sklearn.datasets import fetch_20newsgroups# 加载训练和测试数据categories = ['rec.sport.baseball', 'comp.sys.mac.hardware']train_data = fetch_20newsgroups(subset='train', categories=categories, shuffle=True, random_state=42)test_data = fetch_20newsgroups(subset='test', categories=categories, shuffle=True, random_state=42)# 查看数据基本信息print("训练样本数量:", len(train_data.data))print("测试样本数量:", len(test_data.data))print("标签名称:", train_data.target_names)

输出示例:

训练样本数量: 1680测试样本数量: 1127标签名称: ['comp.sys.mac.hardware', 'rec.sport.baseball']

2. 特征提取:词袋模型(Bag of Words)

文本数据不能直接输入到机器学习模型中,我们需要将其转换为数值特征向量。常用的方法是“词袋模型”(Bag-of-Words),我们可以使用CountVectorizer来实现。

from sklearn.feature_extraction.text import CountVectorizervectorizer = CountVectorizer()X_train = vectorizer.fit_transform(train_data.data)X_test = vectorizer.transform(test_data.data)print("特征维度:", X_train.shape[1])  # 输出特征维度

3. 构建并训练分类模型

接下来我们使用朴素贝叶斯分类器中的多项式朴素贝叶斯(Multinomial Naive Bayes)来训练我们的模型。

from sklearn.naive_bayes import MultinomialNB# 初始化模型clf = MultinomialNB()# 训练模型clf.fit(X_train, train_data.target)

4. 模型评估

模型训练完成后,我们使用测试集对其进行评估,主要关注准确率和分类报告(包括精确率、召回率、F1值等指标)。

from sklearn.metrics import accuracy_score, classification_report# 预测测试集y_pred = clf.predict(X_test)# 计算准确率accuracy = accuracy_score(test_data.target, y_pred)print("模型准确率:", accuracy)# 打印分类报告report = classification_report(test_data.target, y_pred, target_names=train_data.target_names)print("分类报告:\n", report)

输出示例:

模型准确率: 0.9343396226415094分类报告:              precision    recall  f1-score   support           0       0.93      0.95      0.94       599           1       0.94      0.91      0.93       528    accuracy                           0.93      1127   macro avg       0.93      0.93      0.93      1127weighted avg       0.93      0.93      0.93      1127

可以看出,模型在测试集上的准确率达到约93%,表现良好。


5. 应用模型进行预测

现在我们可以使用训练好的模型对新的文本进行分类了。例如,判断一段话属于哪一类新闻。

def predict_category(text):    text_vectorized = vectorizer.transform([text])    predicted_index = clf.predict(text_vectorized)[0]    return train_data.target_names[predicted_index]# 示例文本sample_text_1 = "The Giants won the baseball game yesterday."sample_text_2 = "How to install macOS on an old Mac?"print("预测结果1:", predict_category(sample_text_1))print("预测结果2:", predict_category(sample_text_2))

输出示例:

预测结果1: rec.sport.baseball预测结果2: comp.sys.mac.hardware

总结与扩展

本文介绍了如何使用Python和Scikit-learn库构建一个基于朴素贝叶斯的文本分类器。整个流程包括数据加载、文本预处理、特征提取、模型训练与评估以及实际应用。虽然这里仅使用了一个相对简单的模型,但其效果已经非常不错。

可选扩展方向:

使用TF-IDF代替词袋模型:可以尝试TfidfVectorizer以提升特征表示的质量。更换分类器:如逻辑回归、支持向量机(SVM)、随机森林等。增加更多类别:从二分类扩展到多分类任务。中文文本分类:需要额外的分词处理(如jieba库)。深度学习方法:如使用Keras或PyTorch构建神经网络模型。

如果你对这些方向感兴趣,欢迎继续深入研究!


完整代码汇总

from sklearn.datasets import fetch_20newsgroupsfrom sklearn.feature_extraction.text import CountVectorizerfrom sklearn.naive_bayes import MultinomialNBfrom sklearn.metrics import accuracy_score, classification_report# 1. 加载数据categories = ['rec.sport.baseball', 'comp.sys.mac.hardware']train_data = fetch_20newsgroups(subset='train', categories=categories, shuffle=True, random_state=42)test_data = fetch_20newsgroups(subset='test', categories=categories, shuffle=True, random_state=42)# 2. 特征提取vectorizer = CountVectorizer()X_train = vectorizer.fit_transform(train_data.data)X_test = vectorizer.transform(test_data.data)# 3. 模型训练clf = MultinomialNB()clf.fit(X_train, train_data.target)# 4. 模型评估y_pred = clf.predict(X_test)accuracy = accuracy_score(test_data.target, y_pred)print("模型准确率:", accuracy)print("分类报告:\n", classification_report(test_data.target, y_pred, target_names=train_data.target_names))# 5. 使用模型预测新文本def predict_category(text):    text_vectorized = vectorizer.transform([text])    predicted_index = clf.predict(text_vectorized)[0]    return train_data.target_names[predicted_index]# 示例sample_text_1 = "The Giants won the baseball game yesterday."sample_text_2 = "How to install macOS on an old Mac?"print("预测结果1:", predict_category(sample_text_1))print("预测结果2:", predict_category(sample_text_2))

本文完,希望对你理解和实践文本分类有所帮助!

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

目录[+]

您是本站第96名访客 今日有31篇新文章

微信号复制成功

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