第1关:朴素贝叶斯——新闻分类
任务描述
本关任务:使用sklearn
完成新闻主题分类任务。
相关知识
为了完成本关任务,你需要掌握如何使用sklearn
提供的MultinomialNB
类与文本向量化。
数据简介
本关使用的是20newsgroups
数据集,20newsgroups
数据集是用于文本分类、文本挖据和信息检索研究的国际标准数据集之一。数据集收集了18846
篇新闻组文档,均匀分为20
个不同主题(比如电脑硬件、中东等主题)的新闻组集合。
sklearn
为该数据集提供了接口,若想使用该数据集,代码如下:
from sklearn.datasets import fetch_20newsgroups
#加载数据集
news = fetch_20newsgroups(data_home='./', subset='all')
#X表示新闻文本,y表示标签
X = news.data
y = news.target
若想查看某一篇新闻文本,代码如下:
#打印数据集中第一篇新闻文本
print(news.data[111])
部分数据如下:
From: Mamatha Devineni Ratnam <mr47+@andrew.cmu.edu>
Subject: Pens fans reactions
Organization: Post Office, Carnegie Mellon, Pittsburgh, PA
Lines: 12
NNTP-Posting-Host: po4.andrew.cmu.edu
I am sure some bashers of Pens fans are pretty confused about the lack
of any kind of posts about the recent Pens massacre of the Devils. Actually,
I am bit puzzled too and a bit relieved. However, I am going to put an end
to non-PIttsburghers relief with a bit of praise for the Pens. Man, they
are killing those Devils worse than I thought. Jagr just showed you why
he is much better than his regular season stats. He is also a lot
fo fun to watch in the playoffs. Bowman should let JAgr have a lot of
fun in the next couple of games since the Pens are going to beat the pulp out of Jersey anyway. I was very disappointed not to see the Islanders lose the final
regular season game. PENS RULE!!!
其中新闻文本对应的主题标签,已经用0-19
这20
个数字表示。
文本向量化
由于数据集中每一条数据都是很长的一个字符串,所以我们需要对数据进行向量化的处理。例如,I have a apple!\n I have a pen!
可能需要将该字符串转换成向量如[10, 7, 0, 1, 2, 6, 22, 100, 8]
。
sklearn
提供了实现词频向量化功能的CountVectorizer
类。想要对数据进行向量化,代码如下:
from sklearn.feature_ext\fraction.text import CountVectorizer
#实例化向量化对象
vec = CountVectorizer()
#将训练集中的新闻向量化
X_train = vec.fit_transform(X_train)
#将测试集中的新闻向量化
X_test = vec.transform(X_test)
MultinomialNB
MultinomialNB
类中的fit
函数实现了朴素贝叶斯分类算法训练模型的功能,predict
函数实现了法模型预测的功能。
其中fit
函数的参数如下:
X
:大小为[样本数量,特征数量]
的ndarry
,存放训练样本Y
:值为整型,大小为[样本数量]
的ndarray
,存放训练样本的分类标签
而predict
函数有一个向量输入:
X
:大小为[样本数量,特征数量]
的ndarry
,存放预测样本
MultinomialNB
的使用代码如下:
clf = tree.MultinomialNB()
clf.fit(X_train, Y_train)
result = clf.predict(X_test)
编程要求
填写news_predict(train_sample, train_label, test_sample)
函数完成鸢尾花分类任务,其中:
train_sample
:原始训练样本train_label
:训练标签test_sample
:原始测试样本
第1关任务——代码题
# 从sklearn.feature_extraction.text里导入文本特征向量化模块
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.naive_bayes import MultinomialNB
def news_predict(train_sample, train_label, test_sample):
'''
训练模型并进行预测,返回预测结果
:param train_sample:原始训练集中的新闻文本,类型为ndarray
:param train_label:训练集中新闻文本对应的主题标签,类型为ndarray
:test_sample:原始测试集中的新闻文本,类型为ndarray
'''
# ********* Begin *********#
# 创建CountVectorizer对象
vectorizer = CountVectorizer()
# 使用fit_transform方法将训练集的文本数据转换为特征向量
train_data = vectorizer.fit_transform(train_sample)
# 创建MultinomialNB对象
clf = MultinomialNB()
# 使用fit方法训练模型
clf.fit(train_data, train_label)
# 使用predict方法对测试集的文本数据进行预测
test_data = vectorizer.transform(test_sample)
pred_label = clf.predict(test_data)
# 返回预测结果
return pred_label
# ********* End *********#