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

今天 2阅读

在当今的机器学习和自然语言处理(NLP)领域,文本分类是一项基础而重要的任务。它广泛应用于垃圾邮件识别、情感分析、新闻分类等场景。本文将通过使用 Python 和 Scikit-learn 库,实现一个基于朴素贝叶斯算法的简单文本分类器,并提供完整的代码示例。

我们将使用经典的 20 Newsgroups 数据集作为训练数据。该数据集包含大约 20,000 个新闻组文档,分布在 20 个不同的类别中。


环境准备

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

pip install scikit-learnpip install numpy

导入必要的库

from sklearn.datasets import fetch_20newsgroupsfrom sklearn.feature_extraction.text import TfidfVectorizerfrom sklearn.model_selection import train_test_splitfrom sklearn.naive_bayes import MultinomialNBfrom sklearn.metrics import classification_report, accuracy_scoreimport numpy as np

加载数据集

我们从 fetch_20newsgroups 中加载数据集。为了简化演示,我们只选择其中几个类别进行分类。

# 选择几个类别进行分类categories = ['alt.atheism', 'comp.graphics', 'sci.med', 'soc.religion.christian']# 加载数据集newsgroups = fetch_20newsgroups(subset='all', categories=categories, shuffle=True, random_state=42)# 查看数据集信息print("样本数量:", len(newsgroups.data))print("类别名称:", newsgroups.target_names)

输出示例:

样本数量: 3373类别名称: ['alt.atheism', 'comp.graphics', 'sci.med', 'soc.religion.christian']

特征提取(TF-IDF)

由于机器学习模型无法直接处理原始文本,我们需要将其转换为数值特征。这里我们使用 TF-IDF 向量化方法。

# 创建 TF-IDF 向量化器vectorizer = TfidfVectorizer(stop_words='english', max_df=0.6)# 转换文本为 TF-IDF 特征矩阵X = vectorizer.fit_transform(newsgroups.data)y = newsgroups.target

划分训练集与测试集

# 划分训练集和测试集(80% 训练,20% 测试)X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)print("训练集大小:", X_train.shape[0])print("测试集大小:", X_test.shape[0])

训练模型(朴素贝叶斯)

我们使用多项式朴素贝叶斯分类器来训练我们的模型。

# 初始化分类器clf = MultinomialNB()# 训练模型clf.fit(X_train, y_train)

模型评估

使用测试集对模型进行评估,查看其准确率和分类报告。

# 在测试集上预测y_pred = clf.predict(X_test)# 输出准确率print("准确率:", accuracy_score(y_test, y_pred))# 分类报告print("\n分类报告:")print(classification_report(y_test, y_pred, target_names=newsgroups.target_names))

输出示例:

准确率: 0.9154761904761905分类报告:                          precision    recall  f1-score   support             alt.atheism       0.91      0.89      0.90       101            comp.graphics       0.93      0.95      0.94       173                sci.med       0.92      0.90      0.91       131 soc.religion.christian       0.91      0.91      0.91       127              accuracy                           0.92       532             macro avg       0.92      0.91      0.91       532          weighted avg       0.92      0.92      0.92       532

模型应用(预测新文本)

我们可以使用训练好的模型对新的文本进行分类。

def predict_category(text):    text_tfidf = vectorizer.transform([text])    predicted = clf.predict(text_tfidf)    return newsgroups.target_names[predicted[0]]# 示例输入sample_text = "Religion is the sigh of the oppressed creature, the heart of a heartless world..."predicted_category = predict_category(sample_text)print("预测类别:", predicted_category)

输出示例:

预测类别: soc.religion.christian

总结与扩展

本文展示了如何使用 Python 构建一个简单的文本分类器。我们使用了 TF-IDF 进行特征提取,并采用朴素贝叶斯算法进行分类。整个流程包括数据加载、预处理、特征工程、模型训练与评估。

扩展建议:

尝试其他分类器:如支持向量机(SVM)、随机森林、逻辑回归等。使用深度学习模型:例如使用 TensorFlow/Keras 构建 LSTM 或 Transformer 模型。优化 TF-IDF 参数:如调整 max_featuresngram_range 等参数。增加类别数量:尝试对全部 20 个类别进行分类。中文文本分类:可以使用 jieba 分词工具对中文文本进行处理。

十、完整代码汇总

以下是本项目完整的可运行代码:

from sklearn.datasets import fetch_20newsgroupsfrom sklearn.feature_extraction.text import TfidfVectorizerfrom sklearn.model_selection import train_test_splitfrom sklearn.naive_bayes import MultinomialNBfrom sklearn.metrics import classification_report, accuracy_score# 加载数据集categories = ['alt.atheism', 'comp.graphics', 'sci.med', 'soc.religion.christian']newsgroups = fetch_20newsgroups(subset='all', categories=categories, shuffle=True, random_state=42)# TF-IDF 特征提取vectorizer = TfidfVectorizer(stop_words='english', max_df=0.6)X = vectorizer.fit_transform(newsgroups.data)y = newsgroups.target# 划分训练集和测试集X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)# 训练模型clf = MultinomialNB()clf.fit(X_train, y_train)# 模型评估y_pred = clf.predict(X_test)print("准确率:", accuracy_score(y_test, y_pred))print("\n分类报告:")print(classification_report(y_test, y_pred, target_names=newsgroups.target_names))# 预测新文本def predict_category(text):    text_tfidf = vectorizer.transform([text])    predicted = clf.predict(text_tfidf)    return newsgroups.target_names[predicted[0]]sample_text = "Religion is the sigh of the oppressed creature, the heart of a heartless world..."print("预测类别:", predict_category(sample_text))

如果你对 NLP 和机器学习感兴趣,文本分类是一个非常好的入门实践项目。希望这篇文章对你有所帮助!

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

目录[+]

您是本站第5382名访客 今日有14篇新文章

微信号复制成功

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