用Python实现文本分类案例
准备工作
在开始构建分类器之前,我们需要先准备好数据集。我们将使用Reuters新闻数据集,该数据集包含来自Reuters新闻社的11,228个新闻文章。我们将使用其中的7,533个文章作为训练集,2,462个文章作为测试集。可以通过以下代码从Scikit-learn中加载数据集:
from sklearn.datasets import fetch_20newsgroups
categories = ['rec.sport.baseball', 'comp.sys.ibm.pc.hardware', 'talk.politics.guns']
newsgroups_train = fetch_20newsgroups(subset='train', categories=categories)
newsgroups_test = fetch_20newsgroups(subset='test', categories=categories)
若下载速度太慢,可尝试手动下载数据集
将手动下载的数据集导入
fetch_20newsgroups(data_home=None, # 文件下载的路径
subset='train', # 加载那一部分数据集 train/test
categories=None, # 选取哪一类数据集[类别列表],默认20类
shuffle=True, # 将数据集随机排序
random_state=42, # 随机数生成器
remove=(), # ('headers','footers','quotes') 去除部分文本
download_if_missing=True # 如果没有下载过,重新下载
)
news = fetch_20newsgroups(subset='all')
特征提取
接下来,我们需要将每个新闻文章表示为机器可以理解的向量。我们将使用一种称为TF-IDF(介绍)的技术来提取特征。TF-IDF代表“词频 - 逆文档频率”,它测量了一个词在一个文档中的重要性。
from sklearn.feature_extraction.text import TfidfVectorizer
# 创建TF-IDF矢量器
vectorizer = TfidfVectorizer(stop_words='english')
# 根据训练数据调整矢量器
X_train = vectorizer.fit_transform(newsgroups_train.data)
# 使用同一矢量器转换测试数据
X_test = vectorizer.transform(newsgroups_test.data)
训练分类器
现在我们已经准备好训练分类器了。我们将使用一个称为朴素贝叶斯的算法,该算法经常用于文本分类任务。
from sklearn.naive_bayes import MultinomialNB
# 训练多项式朴素贝叶斯分类器
clf = MultinomialNB()
clf.fit(X_train, newsgroups_train.target)
测试分类器
最后,我们将使用测试集对分类器进行评估。
from sklearn.metrics import accuracy_score
# 对测试数据进行预测
y_pred = clf.predict(X_test)
# 计算分类器的精度
accuracy = accuracy_score(newsgroups_test.target, y_pred)
print(f"Accuracy: {accuracy}")
输出结果如图:

在这个例子中,我们得到了一个约为0.99的准确率,这意味着我们的分类器可以准确地将新闻文章分类到正确的类别中。
结论
通过使用Scikit-learn和Python,我们可以轻松地构建一个文本分类器,用于将新闻文章分类为不同的类别。这个例子只是介绍了文本分类的基础知识,在实际应用中,我们可能需要更复杂的特征提取和算法选择来获得更好的分类性能。但是,这个例子向我们展示了如何使用Python和Scikit-learn库来构建一个简单但有效的文本分类器。
在实际应用中,文本分类可以用于许多不同的场景,例如:情感分析、垃圾邮件过滤、新闻自动分类等。如果您对这些应用感兴趣,可以通过学习更多的自然语言处理和机器学习知识来进一步深入研究。
希望这篇文章对您有所帮助!
8777





