使用贝叶斯算法完成文档分类问题

news2024/9/27 12:16:02

贝叶斯原理

  贝叶斯原理(Bayes' theorem)是一种用于计算条件概率的数学公式。它是以18世纪英国数学家托马斯·贝叶斯(Thomas Bayes)的名字命名的。贝叶斯原理表达了在已知某个事件发生的情况下,另一个事件发生的概率。具体而言,它可以用来计算某个假设的后验概率,即在已知一些先验概率的情况下,根据新的证据来更新这些概率。贝叶斯原理的数学表达式为:

P(A|B) = P(B|A) * P(A) / P(B)

其中,P(A|B)表示在B发生的条件下A发生的概率,也称为后验概率;P(B|A)表示在A发生的条件下B发生的概率,也称为似然度;P(A)和P(B)分别表示A和B的先验概率,即在考虑任何证据之前,A和B分别发生的概率。上面的解释比较难以理解,下面通过一个实际的例子来看看。

  假设一个地区的晴天和雨天出现的频率分别为70%和30%,雨天时候出现爆雷的概率是80%,在晴天出现爆雷的概率是20%。其中,该地区晴天和雨天的概率是先验概率,雨天出现爆雷或者晴天出现爆雷的概率是条件概率,现在要计算后验概率:在爆雷情况下是雨天的概率。
根据贝叶斯公式,计算规则如下所示: P(雨天|爆雷) = P(爆雷|雨天)*P(雨天)/P(爆雷)
在爆雷情况下出现雨天的概率= 在雨天情况下发生爆雷的概率*雨天的概率,再除以发生爆雷的概率。 P(爆雷) =  (P爆雷|雨天)* P雨天 +  (P爆雷|晴天)*P晴天
出现爆雷的概率 = 雨天情况下出现爆雷的概率*雨天概率 + 晴天概率下出现爆雷的概率* 晴天概率,P(爆雷):称为归一化常数,下面这个公式成为全概率公式:
P(B) = Σ P(B|A_i) * P(A_i)
所以最终的计算是:
P(雨天|爆雷) = P(爆雷|雨天)*P(雨天)/P(爆雷)
P(雨天|爆雷) = 0.8 * 0.3/(0.8*0.3 + 0.2*0.7)约等于0.46
朴素贝叶斯算法进行文本分类
  朴素贝叶斯(Naive Bayes)是一种基于贝叶斯定理的分类算法。朴素贝叶斯算法的原理是基于特征条件独立假设,即假设每个特征在分类中是相互独立的 在朴素贝叶斯算法中,给定一个样本及其特征,首先需要计算每个类别的概率。然后,根据贝叶斯定理,计算每个特征在给定类别下的条件概率。最后,将每个特征的条件概率相乘,并乘以该类别的概率,得到该样本属于该类别的后验概率。将后验概率最大的类别作为该样本的分类结果。 由于朴素贝叶斯算法假设特征之间相互独立,因此它的计算速度非常快。同时,它也不需要大量的训练数据来构建分类模型。因此,朴素贝叶斯算法在处理高维度数据时具有优势,并且常常被用于文本分类、垃圾邮件过滤、情感分析等领域。
  Scikit-learn是一个基于Python编程语言的开源机器学习库,它为各种机器学习任务提供了简单而高效的工具。Scikit-learn提供了多种算法和模型,例如分类、回归、聚类、降维等。它也提供了一些实用工具,如模型选择、数据预处理、特征工程等,方便用户进行机器学习模型的构建和评估。Scikit-learn提供 了3个朴素贝叶斯分类算法,分别是高斯朴素贝叶斯(GaussianNB)、多项式朴素贝叶斯(MultinomialNB)和伯努利朴素贝叶斯(BernoulliNB)。 这三种算法适合应用在不同的场景下,我们应该根据特征变量的不同选择不同的算法:

高斯朴素贝叶斯:特征变量是连续变量,符合高斯分布,比如说人的身高,物体的长度。

多项式朴素贝叶斯:特征变量是离散变量,符合多项分布,在文档分类中特征变量体现在一个单词出现的次数,或者是单词的TF-IDF值等。

伯努利朴素贝叶斯:特征变量是布尔变量,符合0/1分布,在文档分类中特征是单词是否出现。

  上面介绍了朴素贝叶斯原理,那么如何使用朴素贝叶斯进行文档分类任务呢?下面是使用多项式朴素贝叶斯进行文本分类的demo例子。

# 中文文本分类
import os
import jieba
import warnings
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.naive_bayes import MultinomialNB
from sklearn import metrics

warnings.filterwarnings('ignore')

def cut_words(file_path):
    """
    对文本进行切词
    :param file_path: txt文本路径
    :return: 用空格分词的字符串
    """
    text_with_spaces = ''
    text=open(file_path, 'r', encoding='gb18030').read()
    textcut = jieba.cut(text)
    for word in textcut:
        text_with_spaces += word + ' '
    return text_with_spaces

def loadfile(file_dir, label):
    """
    将路径下的所有文件加载
    :param file_dir: 保存txt文件目录
    :param label: 文档标签
    :return: 分词后的文档列表和标签
    """
    file_list = os.listdir(file_dir)
    words_list = []
    labels_list = []
    for file in file_list:
        file_path = file_dir + '/' + file
        words_list.append(cut_words(file_path))
        labels_list.append(label)                                                                                                                 
    return words_list, labels_list

# 训练数据
train_words_list1, train_labels1 = loadfile('text classification/train/女性', '女性')
train_words_list2, train_labels2 = loadfile('text classification/train/体育', '体育')
train_words_list3, train_labels3 = loadfile('text classification/train/文学', '文学')
train_words_list4, train_labels4 = loadfile('text classification/train/校园', '校园')

train_words_list = train_words_list1 + train_words_list2 + train_words_list3 + train_words_list4
train_labels = train_labels1 + train_labels2 + train_labels3 + train_labels4

# 测试数据
test_words_list1, test_labels1 = loadfile('text classification/test/女性', '女性')
test_words_list2, test_labels2 = loadfile('text classification/test/体育', '体育')
test_words_list3, test_labels3 = loadfile('text classification/test/文学', '文学')
test_words_list4, test_labels4 = loadfile('text classification/test/校园', '校园')

test_words_list = test_words_list1 + test_words_list2 + test_words_list3 + test_words_list4
test_labels = test_labels1 + test_labels2 + test_labels3 + test_labels4

stop_words = open('text classification/stop/stopword.txt', 'r', encoding='utf-8').read()
stop_words = stop_words.encode('utf-8').decode('utf-8-sig') # 列表头部\ufeff处理
stop_words = stop_words.split('\n') # 根据分隔符分隔

# 计算单词权重
tf = TfidfVectorizer(stop_words=stop_words, max_df=0.5)

train_features = tf.fit_transform(train_words_list)
# 上面fit过了,这里transform
test_features = tf.transform(test_words_list) 

# 多项式贝叶斯分类器
from sklearn.naive_bayes import MultinomialNB  
clf = MultinomialNB(alpha=0.001).fit(train_features, train_labels)
predicted_labels=clf.predict(test_features)

# 计算准确率
print('准确率为:', metrics.accuracy_score(test_labels, predicted_labels))

   上面的例子中用到了TfidVectorizer来提取特征向量,TfidfVectorizer是Scikit-learn中的一个文本特征提取函数,用于将文本转换为数值特征向量。它的作用是将原始的文本数据集转换为TF-IDF特征向量集。TF-IDF(Term Frequency-Inverse Document Frequency)是一种用于衡量一个词语在文档中的重要性的指标。词频TF计算了一个单词在文档中出现的次数,它认为一个单词的重要性和它在文档中出现的次数呈正比。逆向文档频率IDF,是指一个单词在文档中的区分度。它认为一个单词出现在的文档数越少,就越能通过这个单词把该文档和其他文档区分开。IDF越大就代表该单词的区分度越大。所以TF-IDF实际上是词频TF和逆向文档频率IDF的乘积。这样我们倾向于找到TF和IDF取值都高的单词作为区分,即这个单词在一个文档中出现的次数多,同时又很少出现在其他文档中。这样的单词适合用于分类。TF-IDF的具体计算公式如下:

TF-IDF = TF(t,d) * IDF(t)。 其中,t表示词语,d表示文档,TF(t,d)表示词语t在文档d中出现的频率,IDF(t)表示逆文档频率,可以通过以下公式计算:

IDF(t) = log(N / df(t))。 其中,N表示文档总数,df(t)表示包含词语t的文档数。

TfidfVectorizer函数的主要参数如下:

  • stop_words:停用词列表,可以是'english'表示使用Scikit-learn自带的英文停用词列表,也可以是一个自定义停用词列表;
  • tokenizer:用于分词的函数,如果不指定,则默认使用Scikit-learn的内置分词器;
  • ngram_range:用于控制特征中词语的个数,可以是单个词语(unigram),两个词语(bigram),三个词语(trigram)等;
  • max_features:用于控制特征向量的最大维度;
  • norm:用于归一化特征向量的方式,可以是'l1'或'l2';
  • use_idf:是否使用IDF权重;
  • smooth_idf:是否对IDF权重加1平滑处理;
  • sublinear_tf:是否使用对数函数对TF进行缩放。

下面是使用TfidfVectorizer将一段文本转换成特征向量的例子。

from sklearn.feature_extraction.text import TfidfVectorizer

vectorizer = TfidfVectorizer(stop_words='english')
documents = [
    "This is the first document.",
    "This is the second document.",
    "And this is the third one.",
]
X = vectorizer.fit_transform(documents)
print(X.toarray())
print(X.shape)

下面是打印的特征向量结果,使用了X.toarray()方法将稀疏矩阵转换为密集矩阵。,第一个结果是没有传入stop_words的结果,生成的特征向量是一个3行9列的数据,第二个结果是加入stop_words的结果,第二次是一个3行2列的数据。每一行代表一个文档,每一列代表一个特征。可以看到,这些特征是根据词频和逆文档频率计算得到的。

   再回看前面的对文档分类的 Demo例子,实际使用朴素贝叶斯算法对文档进行分类的任务可以划分成下面6个子任务。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/805324.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Golang系统开发】搜索引擎(1) 如何快速判断网页是否已经被爬取

文章目录 1. 写在前面2. 数组存储3. 位图存储3.1 位图简介3.2 链表法3.3 开放寻址法 1. 写在前面 在实际工作中,我们经常需要判断一个对象是否存在,比如判断用户注册登陆时候,需要判断用户是否存在,再比如搜索引擎中的爬虫&#x…

大数据面试题之Elasticsearch:每日三题(七)

大数据面试题之Elasticsearch:每日三题 1.Elasticsearch索引文档的流程?2.Elasticsearch更新和删除文档的流程?3.Elasticsearch搜索的流程? 1.Elasticsearch索引文档的流程? 协调节点默认使用文档ID参与计算(也支持通过routing)&a…

【UE4】给角色添加脚步声

步骤: 1. 导入一个脚步声音频文件(.wav格式) 2. 打开角色蓝图,这里以第三人称角色模板蓝图“ThirdPersonCharacter”为例,在事件图表中添加一个生成音效的自定义事件。 3. 打开动画序列“ThirdPersonRun” 找到小白人…

Python编程——while循环嵌套讲解(附案例)

作者:Insist-- 个人主页:insist--个人主页 本文专栏:Python专栏 专栏介绍:本专栏为免费专栏,并且会持续更新python基础知识,欢迎各位订阅关注。 目录 一、while嵌套的语法 二、注意事项 三、while嵌套循…

【Java】分支结构习题

【Java】分支结构 文章目录 【Java】分支结构题1 :数字9 出现的次数题2 :计算1/1-1/21/3-1/41/5 …… 1/99 - 1/100 的值。题3 :猜数字题4 :牛客BC110 X图案题5 :输出一个整数的每一位题6 : 模拟三次密码输…

统信UOS安装mysql数据库(mariadb)-统信UOS安装JDK-统信UOS安装nginx(附安装包)

统信UOS离线全套安装教程(手把手教程) 银河麒麟的各种离线全套安装教程: https://blog.csdn.net/ACCPluzhiqi/article/details/131988147 1.统信UOS桌面系统安装mysql(mariadb) 2.统信UOS桌面系统安装JDK 3.统信UOS桌…

CAN学习笔记3:STM32 CAN控制器介绍

STM32 CAN控制器 1 概述 STM32 CAN控制器(bxCAN),支持CAN 2.0A 和 CAN 2.0B Active版本协议。CAN 2.0A 只能处理标准数据帧且扩展帧的内容会识别错误,而CAN 2.0B Active 可以处理标准数据帧和扩展数据帧。 2 bxCAN 特性 波特率…

【JavaWeb】正则表达式

🎄欢迎来到边境矢梦的csdn博文,本文主要讲解Java 中正则表达式 的相关知识🎄 🌈我是边境矢梦,一个正在为秋招和算法竞赛做准备的学生🌈 🎆喜欢的朋友可以关注一下🫰🫰&am…

Metabase RCE漏洞复现(CVE-2023-38646)

0x01 产品简介 Metabase是一个开源的数据分析和可视化工具,它可以帮助用户轻松地连接到各种数据源,包括数据库、云服务和API,然后使用直观的界面进行数据查询、分析和可视化。 0x02 漏洞概述 未经身份认证的远程攻击者利用该漏洞可以在服务器…

【C语言趣味教程】(4) 变量:代码注释 | 变量的声明 | 初始化与赋值 | 变量的命名 | 关键字 | 标识符 | 变量名的命名规范

🔗 《C语言趣味教程》👈 猛戳订阅!!! Ⅰ. 代码注释(Comment) 0x00 引入:注释的作用 "程序员最讨厌两种人:一种是不写注释的人,一种是让我写注释的人。…

如何用DHTMLX组件为Web应用创建甘特图?(一)

dhtmlxGantt是用于跨浏览器和跨平台应用程序的功能齐全的Gantt图表。可满足项目管理应用程序的所有需求,是最完善的甘特图图表库。甘特图仍然是项目管理应用程序中最需要的工具之一,DHTMLX Gantt组件提供了能提升研发甘特图功能所需的重要工具。 在这篇…

【深度学习】InST,Inversion-Based Style Transfer with Diffusion Models,论文

代码:https://github.com/zyxElsa/InST 论文:https://arxiv.org/abs/2211.13203 文章目录 AbstractIntroductionRelated WorkImage style transferText-to-image synthesisInversion of diffusion models MethodOverview ExperimentsComparison with Sty…

我的第一个后端项目(环境搭建,Springboot项目,运行,接口验证)

一. 安装Java开发工具包(JDK): 访问Java Software | OracleOracle官方网站,下载适合你操作系统的最新版本的JDK。安装JDK并设置好JAVA_HOME环境变量。 二. 安装集成开发环境(IDE): 推荐使用In…

Appium+python自动化(二十八)- 高级滑动(超详解)

高级溜冰的滑动 滑动操作一般是两点之间的滑动,这种滑动在这里称其为低级的溜冰滑动;就是上一节给小伙伴们分享的。然而实际使用过程中用户可能要进行一些多点连续滑动操作。如九宫格滑动操作,连续拖动图片移动等场景。那么这种高级绚丽的溜…

word里的页码问题

一份文档写完,如果需要页码,第一页是封面,封面不需要页码怎么办? 解决:打开页眉页脚,然后把首页不同勾选上,这一页就没有页码了。 目录页,往往要使用罗马数字,其他正文又…

《遗留系统现代化》读书笔记(模式篇-代码现代化(一))

本文地址:http://t.csdn.cn/vS0Za 文章目录 代码现代化:你的代码可测吗?你的代码可测吗?标题如何让代码变得可测?接缝的位置接缝的类型新生和外覆为代码添加测试决策表模式测试的类型和组织遗留系统中的测试策略 代码…

【深度学习笔记】Softmax 回归

本专栏是网易云课堂人工智能课程《神经网络与深度学习》的学习笔记,视频由网易云课堂与 deeplearning.ai 联合出品,主讲人是吴恩达 Andrew Ng 教授。感兴趣的网友可以观看网易云课堂的视频进行深入学习,视频的链接如下: 神经网络和…

QuantMania!《快乐机器学习》和《Python 从入门到入迷》作者,FRM,CAIA

王的机器主理人 王圣元 (FRM, CAIA) 某加密货币公司 Head of Quant 冬海集团 SeaMoney 建模负责人 八方咨询 量化总监 新加坡国立大学金融数学硕士 新加坡国立大学量化金融学士 《快乐机器学习》的作者 《Python 从入门到入迷》的作者 第一本书 《快乐机器学习》 第二本书《Pyt…

MySQL 8.0详细安装配置教程

一. 前言 MySQL是目前最为流行的开源数据库产品,是完全网络化跨平台的关系型数据库系统。它起初是由瑞典MySQLAB公司开发,后来被Oracle公司收购,目前属于Oracle公司。因为开源,所以任何人都能从官网免费下载MySQL软件&#xff0c…

【4】-多个User执行测试

目录 一个locustfile中有多个User 使用--class-picker指定执行 小结 一个locustfile中有多个User from locust import task, HttpUserclass User01(HttpUser):weight 3 # 权重host https://www.baidu.comtaskdef user_01_task(self):self.client.get(url/, nameuser_01_…