[DA45] 使用朴素贝叶斯进行文档分类

自然语言处理 第五期 传统机器学习–朴素贝叶斯 朴素贝叶斯的原理 朴素贝叶斯应用场景 朴素贝叶斯优缺点 朴素贝叶斯 sklearn 参数学习 利用朴素贝叶斯模型结合 Tf-idf 算法进行文本分类 一、朴素贝叶斯的原理 基于朴素贝叶斯公式,比较出后验概率的最大值来进行分类,后验概率的计算是由先验概率与类条件概率的乘积得出,先验概率和类条件概率要通过训练数据集得出,即为朴素贝叶斯分类模型,将其保存为中间结果,测试文档... 阅读详情

一. 相关介绍

(一) 朴素贝叶斯

    朴素贝叶斯分类最适合的场景是文本分类、情感分析和垃圾邮件识别,python 中的 sklearn 机器学习包提供了3种朴素贝叶斯分类算法:

    1. 高斯朴素贝叶斯(GaussianNB)

        适用场景:特征变量是连续变量,符合正态分布。

    2. 多项式朴素贝叶斯(MultinomialNB)

        适用场景:特征变量是离散变量,符合多项分布。

    3. 伯努利朴素贝叶斯(BernoulliNB)

        适用场景:特征变量是布尔变量,符合0/1分布。

(二) TF-IDF

    TF-IDF 是一个统计方法,用来评估某个词语对于一个文件集或文档库中的其中一份文件的重要程度。它由Term Frequency 和 Inverse Document Frequency 的组成,两者缩写为 TF 和 IDF,分别代表了词频和逆向文档频率。

    词频计算了一个单词在文档中出现的次数,它认为一个单词的重要性和它在文档中出现的次数呈正比。

    逆向文档频率是指一个单词在文档中的区分度。它认为一个单词出现在的文档数越少,就越能通过这个单词把该文档和其他文档区分开。IDF 越大就代表该单词的区分度越大。

    计算方法:

                         

                   TF-IDF为TF与IDF乘积:  TF-IDF = TF * IDF

    在sklearn中可以直接使用 TfidfVectorizer 类计算单词TF-IDF向量的值。

 

二. 数据分析

(一) 加载停用词表

    停用词是指在信息检索中,为节省存储空间和提高搜索效率,在处理自然语言数据(或文本)之前或之后会自动过滤掉某些字或词,这些字或词即被称为Stop Words(停用词)。

stop_words_path = './data/stop/stopword.txt'
with open(stop_words_path, 'r', encoding='utf-8') as sw_msg:
    stop_words = [line.strip() for line in sw_msg.readlines()]
    stop_words[0] = ","  # 修改'\ufeff,' 为 ‘,’
print(stop_words)
print(len(stop_words))

   通过检视stop_words列表,发现','读取后变为了'\ufeff,'(疑为编码格式错误造成), 所以在代码中专门进行了修改。

(二) 加载数据并进行分词

   利用中文分词工具包 jieba 对原始数据进行分词,并分别存入训练集和测试集列表中。

   代码中使用了try方式逐一读取文件,遇到读取错误的文件捕获异常并进行提示,之后对异常文件进行编码修改或删除操作,直到全部文件能够正确读取为止。

# 训练集
train_contents = []
data_list1 = ['体育', '女性', '文学', '校园']       # 文件夹(标签)名字
for j in data_list1:
    errortimes = 0      # 初始化读取文档错误次数
    path_lst = [name for name in os.listdir('./data/train/' + j)
                if os.path.isfile(os.path.join('./data/train/' + j, name))]     # 获取对应文件名列表
    for path in path_lst:
        path = './data/train/' + j + '/' + path       # 补全为相对路径
        try:                # 使用jieba工具包进行分词
            with open(path, 'r') as train_msg0:
                train_msg1 = train_msg0.read()
                train_cut_msg0 = jieba.cut(train_msg1)
                train_cut_msg1 = " ".join(train_cut_msg0)
            train_contents.append(train_cut_msg1)
        except Exception:   # 读取文件错误时, 打印读取错误的文档名
            errortimes += 1
            print(path, ' 文件读取错误')
    print(j, "训练集中,文件读取错误数:", errortimes)
print("训练集长度:", len(train_contents))

# 测试集
test_contents = []
data_list2 = ['体育', '女性', '文学', '校园']
for j in data_list2:
    errortimes = 0
    path_lst = [name for name in os.listdir('./data/test/' + j)
                if os.path.isfile(os.path.join('./data/test/' + j, name))]
    for path in path_lst:
        path = './data/test/' + j + '/' + path
        try:
            with open(path, 'r') as test_msg0:
                test_msg1 = test_msg0.read()
                test_cut_msg0 = jieba.cut(test_msg1)
                test_cut_msg1 = " ".join(test_cut_msg0)
            test_contents.append(test_cut_msg1)
        except Exception:
            errortimes += 1
            print(path, '.txt 文件读取错误')
    print(j, "测试集中,文件读取错误数:", errortimes)
print("测试集长度:", len(test_contents))

    最终输出结果:

 

(三) 计算单词权重

    使用TfidfVectorizer类得到TF-IDF 特征空间数据,其中max_df 参数为单词在文档中的最高出现率,假设 max_df=0.5,代表一个单词在 50% 的文档中都出现过了,那么它只携带了非常少的信息,因此就不作为分词统计。

     值得注意的是,为保证训练集与测试集样本特征量一致性,在训练集数据进行拟合后,必须再次使用 TfidfVectorizer初始化向量空间模型,并且使用训练集词袋向量vocabulary=tf.vocabulary_。

tf = TfidfVectorizer(stop_words=stop_words, max_df=0.5)
train_features = tf.fit_transform(train_contents)
print('训练集特征shape:', train_features.get_shape())
# 使用 TfidfVectorizer初始化向量空间模型  使用训练集词袋向量
tf_test = TfidfVectorizer(stop_words=stop_words, sublinear_tf=True, max_df=0.5, vocabulary=tf.vocabulary_)
test_features = tf_test.fit_transform(test_contents)
print('测试集特征shape:', test_features.get_shape())

    打印结果:  训练集特征shape: (3306, 22893),测试集特征shape: (200, 22893)。

(四) 生成分类器

    首先构造与特征对应的标签列表,样本对应的标签为其所在的文件夹名,代码中的数字为测试集对应分类文件夹中文件的个数,可以使用len(【文件名列表】)方法获得,在此为简化代码,所有数字为手动进入文件夹查询的值。

    由于TF-IDF特征数据为离散型数据,故使用多项式朴素贝叶斯类分类器,其中alpha为平滑参数,在本例中取值为0.01。

train_labels = ['体育'] * 1337 + ['女性'] * 954 + ['文学'] * 766 + ['校园'] * 249
test_labels = ['体育'] * 115 + ['女性'] * 38 + ['文学'] * 31 + ['校园'] * 16
model = MultinomialNB(alpha=0.01)
model.fit(train_features, train_labels)
predict_labels = model.predict(test_features)
# print(predict_labels)
score = accuracy_score(test_labels, predict_labels)
print('准确率:', score)

    使用accuracy_score对模型进行评估,测试集分类准确率为0.92,判定此模型较为理想。

 

详细代码及数据请点击:GitHub

 

 

 

文本主题分类(TFIDF-朴素贝叶斯分类) ** 文本主题分类(TFIDF-朴素贝叶斯分类) ** 大纲 List item 背景介绍: 贝叶斯讲的是一种”逆向概率“,当我们没有上帝视角时,无法准确的预知一个事物本质的时候,可以依靠和事物本质相关的事件来进行推断。一个典型的问题:检测试剂呈阳性时,该患者真的患该病的几率有多大? 一些常见的术语: 先验概率:如基于历史数据得出的某疾病的发病率 条件概率(P(B|A)):A条件下,B发生的概率 后验概率:根据结果推测原因的概率 全概率公式:P(A)=P(B1)*P(A|B1)+P(B2)*P(A|B 阅读详情

相关推荐

我的第一篇学习笔记——使用朴素贝叶斯算法对文档分类详解

朴素贝叶斯算法可以实现对文档的分类,其中最著名的应用之一就是过滤垃圾邮件。先做一个简单的分类,以论坛的留言为例,构建一个快速的过滤器,来区分哪些留言是负面言论,哪些是正面言论。 我对算法思路的理解:首先计算训练集中每个词语分别在正面(负面)文档中出现的概率以及正面(负面)文档的概率,再计算待分类样本中的每个词语属于正面(负面)文档的概率和正面(负面)文档概率的乘积,即为该样本属于正面(负面)样本...

小赵的博客 2805

机器学习——朴素贝叶斯算法

问题4:在不是垃圾短息的情况下,含字母A内容为AAA的,且含字母B(内容为AAB)概率?解决问题3: P(AAA|垃圾短信)= 分子:0+1 分母:特征词出现的个数:5个特。答案4:P(AAA,AAB|不是垃圾短信)= 2/(9-3) = 1/3。问题2:信息含字母A(内容为AAA)且含字母B(内容为AAB)的概率?最终答案:P(AAA|垃圾短信)= 0+1/3+5 = 1/8。问题3:在是垃圾短息的情况下,含字母A内容为AAA的概率?答案1: P(垃圾短信): 3/9 ==1/3。

weixin_63904583的博客 624

【机器学习 】使用朴素贝叶斯进行文档分类

朴素贝叶斯的一般过程: 1、收集数据:任何方法 2、准备数据:需要数值型或者布尔型数据 3、分析数据:有大量特征时,绘制特征作用不大,此时使用直方图效果更好 4、训练算法:计算不同的独立特征的条件概率 5、测试算法:计算错误率 6、使用算法:常见的朴素贝叶斯应用是文档分类。可以在任何分类场景中使用朴素贝叶斯分类器,不一定非要文本。 思考:如果每个特征需要N

zyy848877920的博客 2487

朴素贝叶斯,TF-IDF实现文本分类

TF-IDF概述 TF-IDF是Term Frequency - Inverse Document Frequency的缩写,即“词频-逆文本频率”。它由两部分组成,TF和IDF。 前面的TF也就是我们前面说到的词频,我们之前做的向量化也就是做了文本中各个词的出现频率统计,并作为文本特征,这个很好理解。关键是后面的这个IDF,即“逆文本频率”如何理解。在上一节中,我们讲到几乎所有文本都会出现...

Turbo_Come的博客 1万+

机器学习算法之朴素贝叶斯(Naive Bayes)--第二篇

引言 如果你对朴素贝叶斯的原理不太清楚,请看我的第一篇文章:http://blog.youkuaiyun.com/xlinsist/article/details/51236454 这篇文章主要介绍将朴素贝叶斯模型应用到文本分类任务的技巧和方法。 词袋模型(The Bag of Words Model) 对于机器学习算法来说,特征的选择是一个很重要的过程。那么如何从文本训练集中选出好的特征呢?在自

踩风火轮的乌龟 1万+

利用TFIDF实时微博情感分类-朴素贝叶斯算法

最近自己在做一个基于朴素贝叶斯算法的微博情感分类,首先朴素贝叶斯算法的基本推到我这里就不细说了。分类中我们一般会进行下面几个步骤: 1 对我们的语料库(训练文本)进行分词 2 对分词之后的文本进行TF-IDF的计算(TF-IDF介绍可以参考这边文章http://blog.youkuaiyun.com/yqlakers/article/details/70888897) 3 利用计算好的TF-IDF记性分

YQlakers的博客 4725

TF-IDF文本向量化及朴素贝叶斯文本分类

文本corpus的格式是每行一篇文章,先经过分词,去停用词之后,再利用jieba.analyse.extract_tags(context,topK = N)进行提取出每个文本前10个重要的关键词。文本corpus_tags里面内容是对应的每一行文本的标签。 jieba分词和去停用词代码: import jieba # 创建停用词列表函数 def stopwordslist(): ...

yinxiangzhao的博客 3353

【信息科学与工程学】【通信工程】第二百四十篇 IPv4/IPv6 功能点、特性和算法及 IPv4→IPv6 迁移特性02

说明:按「纯数学 → 数学物理 → 多物理场 → 界面/表面科学耦合 + 数学化学 + 运动科学(0.01 nm → μm → mm → cm 精度及超长运动)」纵向穿透,每一行给出,最后挂。

weixin_49199313的博客 509

朴素贝叶斯分类器详解:Data-Science-45min-Intros中的文本分类实战

Data-Science-45min-Intros项目提供了丰富的IPython Notebook教程,帮助初学者快速掌握数据科学基础技术。其中,朴素贝叶斯分类器作为文本分类的经典算法,在项目的naive-bayes-classifier-101模块中通过实际案例展示了其强大的分类能力。本文将带你深入理解朴素贝叶斯原理,并通过项目中的实战案例掌握文本分类技巧。 ## 朴素贝叶斯分类器:直观理解与

gitblog_00442的博客 1052

【信息科学与工程学】计算机科学与自动化-——第十五篇云计算 12 公有云里的“多Region + 多AZ“ 02 运营算法01

算法逐步思考推理思考(含数学方程式、对象、资源、任务、进程/协程/线程及对应的代数、约束、目标函数/传递函数/依赖函数、参数及参数的数值范围及边界条件、逐步推理的数学方程式列表、上下文切换、并发/串行/随机/乱序/顺序)算法逐步思考推理思考(含数学方程式、对象、资源、任务、进程/协程/线程及对应的代数、约束、目标函数/传递函数/依赖函数、参数及参数的数值范围及边界条件、逐步推理的数学方程式列表、上下文切换、并发/串行/随机/乱序/顺序)云厂商提高闲置资源利用率。算法复杂度为O(N),N为实例数量。

weixin_49199313的博客 282

【管理科学】第三十五篇 企业经营中的管理科学01 权力、风险、运营、物流、人力资源、库存、合同、品牌、业绩、项目

编号类型领域子领域/内容问题问题的数学分析(电磁/信息论/数学物理/数学化学/界面科学/表面科学 + 几何/拓扑/代数/集合论/图论/数论/函数评估/数值估计/概率/统计/向量/张量/矩阵/矢量 + 其他)算法逐步推理思考的数学表达式及实现步骤及时序流程 参数列表及参数的数值范围及数值分析及常量/常数1管理科学问题运营管理生产计划如何分配有限资源生产多种产品以最大化利润?线性代数、凸优化、单纯形法;向量与矩阵目标函数 max c^T x,约束 Ax ≤ b, x ≥ 0。步骤:①标准化引入松弛变量;②构建初

weixin_49199313的博客 247

朴素贝叶斯算法入门:DataAnalysisInAction项目中的文本分类应用

DataAnalysisInAction项目是一个包含详细笔记、代码和数据的数据分析实战项目,其中朴素贝叶斯算法的应用为文本分类提供了简单而高效的解决方案。本文将带你快速掌握朴素贝叶斯的核心概念及在文本分类中的实际应用。 ## 一、朴素贝叶斯算法的三种类型 在项目的[21/README.md](https://link.gitcode.com/i/98766d2cac0c25e6a0a9b80

gitblog_01056的博客 665

自动驾驶仿真:python和carsim联合仿真案例

carsim内部有许多相关联合仿真的demo,simulink、labview等等都有涉及,这里简单介绍下python和carsim联合仿真的方法,虽然carsim官方有个Steer_Control.py相关的案例,但是感觉比较冗余,这里抽出重点部分和大家交流探讨下。提示:以下是本篇文章正文内容,下面案例可供参考1、这里关于solvers的细节其实都没说,因为里面确实也没什么内容好讲的,本质就是调用carsim.dll,如果你需要更多的函数解析其实可以看vs_api.h,路径在,具体内容如下图所示。

zataji的博客 9062

数据分析实战45讲——第二关代码

参考了大白牙和唐吉柯德的代码! 重在参与,重在学习 import os import jieba from sklearn.feature_extraction.text import TfidfVectorizer from sklearn.naive_bayes import MultinomialNB from sklearn import metrics # 停用词表地址 #stop_w...

canf07的专栏 614

华硕电脑Win10改Win7系统:BIOS设置详解

通过上述步骤,华硕电脑用户可以将系统从Windows 10更改为Windows 7。虽然这个过程可能涉及一些技术细节和潜在的风险(如数据丢失和驱动不兼容),但只要按照指南仔细操作并做好准备工作,大多数用户应该能够成功完成系统回滚。请记住,在进行任何系统更改之前都要备份重要数据,并确保已了解所有潜在的风险和限制。希望本文能够帮助到需要回滚到Windows 7的华硕电脑用户!

nntxthml的博客 2262

英飞凌 AURIX Development Studio工程移植到Hightec的方法

1. 软件简介 AURIX™ Development Studio是英飞凌针对AURIX TC2XX/TC3XX系列单片机推出了一款免费的软件,集成了iLLD库,内置Tasking compiler和Tasking Debugger,但这两个模块只能用于非商业用途,可供学习和试用。iLLD库是英飞凌为TC2XX和TC3XX Tricore系列单片机提供的底层驱动库,有完善的使用手册,和较好的移植性。 Hightec是一款可以用来开发Aurix系列单片机的编译器,有免费版,可商用,集成GCC编译器,可用UDE

weixin_42967006的博客 7136

朴素贝叶斯之实例

朴素贝叶斯实例 目录 朴素贝叶斯实例 1.言论过滤器代码 2.过滤垃圾邮件代码 3.贝叶斯之新浪新闻分类(Sklearn)   1.言论过滤器代码 import numpy as np from functools import reduce #朴素贝叶斯之言论过滤器# """ 函数说明:创建实验样本 Parameters: 无 Returns: postin...

Tatiana's SA 1729

企业级AI平台架构设计:AI应用架构师的未来趋势

企业级AI平台是AI从“实验室”走向“生产线”的关键,而AI应用架构师就是这条“生产线”的总设计师。未来,随着生成式AI、边缘计算、自治式AI的发展,架构师的角色将越来越重要——他们不仅要构建技术平台,还要连接技术与业务,让AI真正创造价值。“不要做‘只会调模型的工程师’,要做‘能解决业务问题的架构师’。因为,真正有价值的AI,从来不是“最先进的模型”,而是“能落地、能复用、能创造业务价值的平台”。愿你在企业AI转型的浪潮中,成为那个“搭建桥梁的人”——连接技术与业务,连接现在与未来。

小程序开发 973

朴素贝叶斯算法_【白话机器学习】算法理论+实战之朴素贝叶斯

1. 写在前面如果想从事数据挖掘或者机器学习的工作,掌握常用的机器学习算法是非常有必要的,常见的机器学习算法:监督学习算法:逻辑回归,线性回归,决策树,朴素贝叶斯,K近邻,支持向量机,集成算法Adaboost等无监督算法:聚类,降维,关联规则, PageRank等为了详细的理解这些原理,曾经看过西瓜书,统计学习方法,机器学习实战等书,也听过一些机器学习的课程,但总感觉话语里比较深奥,读起...

weixin_39602280的博客 333

Ubuntu22.04安装ros(一键搞定)

然后发现可以一键安装,话不多说,直接终端输入如下指令。回车之后系统会自动安装ros。

m0_47313541的博客 7413

华为OD机考双机位C卷 - 评委评分 (Java & Python& JS & C/C++ & GO )

华为OD机考双机位C卷 - 评委评分 (OD上机考试双机位C卷)。提供在线OJ刷题。Java、C++、Python、GO语言、C语言、JavaScript题解,并提供完整思路讲解。

算法大师! 1750

《机器学习实战》之使用朴素贝叶斯进行文档分类

机器学习的一个重要应用就是文档的自动分类。在文档分类中,整个文档(如一封电子邮件) 是实例,而电子邮件中的某些元素则构成特征。虽然电子邮件是一种会不断增加的文本,但我们同 样也可以对新闻报道、用户留言、政府公文等其他任意类型的文本进行分类。我们可以观察文档中 出现的词,并把每个词的出现或者不出现作为一个特征,这样得到的特征数目就会跟词汇表中的词 目一样多。朴素贝叶斯是上节介绍的贝叶斯分类器的一个扩...

qq_28069577的博客 954

系统架构设计师【第1章】: 绪论 (核心总结)

系统架构 (System Architecture)是系统的一种整体的高层次的结构表示,是系统的骨架和根基,也决定了系统的健壮性和生命周期的长短。系统架构设计师是承担系统架构设计的核心角色,他不仅是连接用户需求和系统进一步设计与实现的桥梁,也是系统开发早期阶段质量保证的关键角色。通俗地说,系统架构 (System Architecture)

数据知道的博客 1万+

sklearn——朴素贝叶斯文本分类6

使用了countVectorizer和TfidfVectorizer两个统计统计模型,来比较使用哪个模型效果更好(其实都知道tfidf比较好,数学之美中比较好讲解),我们将通过图像可以看出两个统计模型的效果,并且使用了交叉验证#使用交叉验证 from sklearn.datasets import fetch_20newsgroups from sklearn.cross_validation i

panghaomingme的博客 1522

RK3588与FocalTech触摸屏代码适配全解析:从原理到实战

摘要:本文详细介绍了瑞芯微RK3588处理器与FocalTech触摸屏的适配过程,包括硬件特性、驱动加载、设备树配置和常见问题解决方案。RK3588作为8nm工艺的高性能处理器,具备强大的计算能力和丰富的接口资源;FocalTech触摸屏则采用电容式技术,支持I2C/SPI接口。适配关键步骤包括驱动程序加载、硬件连接检查、设备树配置和内核版本兼容性处理,并提供了代码示例和问题排查方法。随着嵌入式设备智能化发展,该适配技术将持续优化,为智能交互提供更优解决方案。

远程部署调试 运行安装 项目调试 二次开发 项目技术新 持续迭代 部分源码免费分享 272

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

SparkML中三种文本特征提取算法(TF-IDF/Word2Vec/CountVectorizer)

TF-IDF算法介绍:         词频-逆向文件频率(TF-IDF)是一种在文本挖掘中广泛使用的特征向量化方法,它可以体现一个文档中词语在语料库中的重要程度。         词语由t表示,文档由d表示,语料库由D表示。词频TF(t,,d)是词语t在文档d中出现的次数。文件频率DF(t,D)是包含词语的文档的个数。如果我们只使用词频来衡量重要性,很容易过度强调在文档中经常出现而并没有包含

行者小朱的博客 1万+

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

上一篇: [转] TEST 数据挖掘知识清单
下一篇: [PPB] 使用决策树模型进行空气质量评价
Vincent_Chu
博客等级 码龄9年 8粉丝 13原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值