使用Python实现一个简单的文本分类器
在现代人工智能应用中,文本分类是一项基础且重要的任务。它广泛应用于垃圾邮件识别、新闻分类、情感分析等领域。本文将介绍如何使用Python构建一个简单的文本分类器,并通过Scikit-learn库实现基于朴素贝叶斯(Naive Bayes)算法的文本分类模型。
我们将按照以下步骤完成这个项目:
数据准备与预处理 特征提取(词袋模型) 构建并训练分类模型 模型评估 应用模型进行预测1. 数据准备与预处理
为了演示目的,我们使用Scikit-learn内置的fetch_20newsgroups
数据集。该数据集包含大约2万篇新闻文档,均匀分布在20个不同的新闻组中。我们将选取其中两个类别进行二分类任务:rec.sport.baseball
和 comp.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))
本文完,希望对你理解和实践文本分类有所帮助!