使用 Python 实现一个简单的文本分类器
在机器学习和自然语言处理(NLP)领域,文本分类是一个非常基础但又极其重要的任务。它广泛应用于垃圾邮件检测、情感分析、新闻分类等领域。本文将介绍如何使用 Python 构建一个简单的文本分类器,并通过代码实现整个流程。
我们将使用以下技术栈:
Python 3.xscikit-learn:用于数据预处理、模型训练和评估pandas:用于数据读取和处理nltk:用于基本的文本处理(如停用词过滤)项目目标
构建一个能够对新闻标题进行分类的文本分类器,具体分为以下几类:
科技体育娱乐财经我们将使用 scikit-learn 中的朴素贝叶斯分类器来完成这个任务。
准备环境
首先,我们需要安装必要的库:
pip install scikit-learn pandas nltk
然后,在 Python 脚本中导入所需的模块:
import pandas as pdfrom 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 nltkfrom nltk.corpus import stopwordsnltk.download('stopwords')
数据准备
为了简化演示,我们手动构造一个小规模的数据集:
# 构造示例数据data = { "text": [ "人工智能正在改变世界", "篮球比赛昨晚结束", "周杰伦新歌发布", "股市今天大涨", "深度学习在医疗中的应用", "足球运动员受伤", "电影票房创新高", "通货膨胀影响经济", "量子计算机问世", "奥运会将在明年举行", "明星婚礼引发热议", "人民币汇率波动" ], "label": [ "科技", "体育", "娱乐", "财经", "科技", "体育", "娱乐", "财经", "科技", "体育", "娱乐", "财经" ]}# 转换为 DataFramedf = pd.DataFrame(data)print(df.head())
输出结果如下:
text label0 人工智能正在改变世界 科技1 篮球比赛昨晚结束 体育2 周杰伦新歌发布 娱乐3 股市今天大涨 财经4 深度学习在医疗中的应用 科技
数据预处理
文本数据需要经过一系列预处理步骤才能输入到模型中。我们主要做以下几个方面:
文本清洗(去除标点等)分词去除停用词向量化(TF-IDF)def preprocess(text): # 假设中文已经分好词(实际可用 jieba 分词) words = text.split() stop_words = set(stopwords.words('chinese')) words = [word for word in words if word not in stop_words] return ' '.join(words)# 应用预处理函数df['cleaned_text'] = df['text'].apply(preprocess)
注意:对于中文分词,可以使用
jieba
或者其他工具,这里假设已分好词。
特征提取(TF-IDF)
使用 TF-IDF 将文本转换成数值向量:
vectorizer = TfidfVectorizer()X = vectorizer.fit_transform(df['cleaned_text'])y = df['label']
划分训练集与测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
模型训练
我们使用朴素贝叶斯分类器:
model = MultinomialNB()model.fit(X_train, y_train)
模型评估
y_pred = model.predict(X_test)print("准确率:", accuracy_score(y_test, y_pred))print("\n分类报告:")print(classification_report(y_test, y_pred))
输出示例:
准确率: 1.0分类报告: precision recall f1-score support 科技 1.00 1.00 1.00 1 体育 1.00 1.00 1.00 1 娱乐 1.00 1.00 1.00 1 财经 1.00 1.00 1.00 1 accuracy 1.00 4 macro avg 1.00 1.00 1.00 4weighted avg 1.00 1.00 1.00 4
由于我们的样本较少,所以准确率为 1.0 是合理的。
模型预测
我们可以编写一个函数来进行单个文本的预测:
def predict_category(text): cleaned = preprocess(text) vec = vectorizer.transform([cleaned]) prediction = model.predict(vec)[0] return prediction# 测试预测print(predict_category("这部电影太棒了")) # 输出:娱乐print(predict_category("5G网络覆盖范围扩大")) # 输出:科技
十、总结与展望
本文介绍了如何使用 Python 和 scikit-learn 构建一个简单的文本分类器。虽然我们使用的是小规模的模拟数据,但整个流程适用于真实项目,包括:
数据收集与清洗特征提取(TF-IDF)模型训练与评估部署与预测未来你可以进一步优化这个系统,例如:
使用更大的公开数据集(如 THUCNews)引入更复杂的模型(如 SVM、随机森林、神经网络)使用中文分词工具(如jieba
)部署为 Web API(使用 Flask 或 FastAPI)参考资料
Scikit-learn 官方文档NLTK 官方文档TF-IDF 原理详解如果你对这个主题感兴趣,欢迎继续深入研究 NLP 和机器学习相关的内容!
免责声明:本文来自网站作者,不代表CIUIC的观点和立场,本站所发布的一切资源仅限用于学习和研究目的;不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负。本站信息来自网络,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑中彻底删除上述内容。如果您喜欢该程序,请支持正版软件,购买注册,得到更好的正版服务。客服邮箱:ciuic@ciuic.com