利用贝叶斯分类器对fetch_20newsgroups数据集进行分类

步骤

1 数据采集
2 特征提取
3 模型训练
4 模型评估

20 Newsgroups数据集介绍

20newsgroups数据集是用于文本分类、文本挖据和信息检索研究的国际标准数据集之一。数据集收集了大约20,000左右的新闻组文档,均匀分为20个不同主题的新闻组集合。一些新闻组的主题特别相似(e.g. comp.sys.ibm.pc.hardware/ comp.sys.mac.hardware),还有一些却完全不相关 (e.g misc.forsale /soc.religion.christian)。
在这里插入图片描述
20newsgroups数据集有三个版本。第一个版本19997是原始的并没有修改过的版本。第二个版本bydate是按时间顺序分为训练(60%)和测试(40%)两部分数据集,不包含重复文档和新闻组名(新闻组,路径,隶属于,日期)。第三个版本18828不包含重复文档,只有来源和主题。

20news-19997.tar.gz –原始20 Newsgroups数据集
20news-bydate.tar.gz –按时间分类; 不包含重复文档和新闻组名(18846 个文档)
20news-18828.tar.gz– 不包含重复文档,只有来源和主题 (18828 个文档)
在sklearn中,该模型有两种装载方式,第一种是sklearn.datasets.fetch_20newsgroups,返回一个可以被文本特征提取器(如sklearn.feature_extraction.text.CountVectorizer)自定义参数提取特征的原始文本序列;第二种是sklearn.datasets.fetch_20newsgroups_vectorized,返回一个已提取特征的文本序列,即不需要使用特征提取器。

文本特征提取

特征提取
将文本数据转化成特征向量的过程
比较常用的文本特征表示法为词袋法
词袋法
不考虑词语出现的顺序,每个出现过的词汇单独作为一列特征
这些不重复的特征词汇集合为词表
每一个文本都可以在很长的词表上统计出一个很多列的特征向量
如果每个文本都出现的词汇,一般被标记为 停用词 不计入特征向量

主要有两个api来实现 CountVectorizer 和 TfidfVectorizer
CountVectorizer:
只考虑词汇在文本中出现的频率
TfidfVectorizer
除了考量某词汇在文本出现的频率,还关注包含这个词汇的所有文本的数量
能够削减高频没有意义的词汇出现带来的影响, 挖掘更有意义的特征

相比之下,文本条目越多,Tfid的效果会越显著

下面对两种提取特征的方法,分别设置停用词和不停用,
使用朴素贝叶斯进行分类预测,比较评估效果

示例

from sklearn.datasets import  fetch_20newsgroups
from sklearn.cross_validation import train_test_split
from sklearn.feature_extraction.text import CountVectorizer, TfidfVectorizer
from sklearn.naive_bayes import MultinomialNB
from sklearn.metrics import classification_report

'''
文本特征提取:
    将文本数据转化成特征向量的过程
    比较常用的文本特征表示法为词袋法
词袋法:
    不考虑词语出现的顺序,每个出现过的词汇单独作为一列特征
    这些不重复的特征词汇集合为词表
    每一个文本都可以在很长的词表上统计出一个很多列的特征向量
    如果每个文本都出现的词汇,一般被标记为 停用词 不计入特征向量
    
主要有两个api来实现 CountVectorizer 和 TfidfVectorizer
CountVectorizer:
    只考虑词汇在文本中出现的频率
TfidfVectorizer:
    除了考量某词汇在文本出现的频率,还关注包含这个词汇的所有文本的数量
    能够削减高频没有意义的词汇出现带来的影响, 挖掘更有意义的特征

相比之下,文本条目越多,Tfid的效果会越显著


下面对两种提取特征的方法,分别设置停用词和不停用,
使用朴素贝叶斯进行分类预测,比较评估效果

'''


# 1 下载新闻数据
news = fetch_20newsgroups(subset="all")


# 2 分割训练数据和测试数据
x_train, x_test, y_train, y_test = train_test_split(news.data,
                                                    news.target,
                                                    test_size=0.25,
                                                    random_state=33)


# 3.1 采用普通统计CountVectorizer提取特征向量
# 默认配置不去除停用词
count_vec = CountVectorizer()
x_count_train = count_vec.fit_transform(x_train)
x_count_test = count_vec.transform(x_test)
# 去除停用词
count_stop_vec = CountVectorizer(analyzer='word', stop_words='english')
x_count_stop_train = count_stop_vec.fit_transform(x_train)
x_count_stop_test = count_stop_vec.transform(x_test)

# 3.2 采用TfidfVectorizer提取文本特征向量
# 默认配置不去除停用词
tfid_vec = TfidfVectorizer()
x_tfid_train = tfid_vec.fit_transform(x_train)
x_tfid_test = tfid_vec.</
  • 4
    点赞
  • 43
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值