朴素贝叶斯算法python sklearn实现_朴素贝叶斯算法——实现新闻分类(Sklearn实现)...

2023-11-10

1、朴素贝叶斯实现新闻分类的步骤

(1)提供文本文件,即

(2)准备数据

将数据集划分为训练集和测试集;使用jieba模块进行分词,词频统计,停用词过滤,文本特征提取,将文本数据向量化

(3)分析数据:使用matplotlib模块分析

(4)训练算法:使用sklearn.naive_bayes 的MultinomialNB进行训练

在scikit-learn中,一共有3个朴素贝叶斯的分类算法类。分别是GaussianNB,MultinomialNB和BernoulliNB。

其中GaussianNB就是先验为高斯分布的朴素贝叶斯,MultinomialNB就是先验为多项式分布的朴素贝叶斯,而BernoulliNB就是先验为伯努利分布的朴素贝叶斯。

(5)测试算法:使用测试集对贝叶斯分类器进行测试

2、代码实现

# -*- coding: UTF-8 -*-

import os

import random

import jieba

from sklearn.naive_bayes import MultinomialNB

import matplotlib.pyplot as plt

"""

函数说明:中文文本处理

Parameters:

folder_path - 文本存放的路径

test_size - 测试集占比,默认占所有数据集的百分之20

Returns:

all_words_list - 按词频降序排序的训练集列表

train_data_list - 训练集列表

test_data_list - 测试集列表

train_class_list - 训练集标签列表

test_class_list - 测试集标签列表

"""

def TextProcessing(folder_path, test_size=0.2):

folder_list = os.listdir(folder_path) # 查看folder_path下的文件

data_list = [] # 数据集数据

class_list = [] # 数据集类别

# 遍历每个子文件夹

for folder in folder_list:

new_folder_path = os.path.join(folder_path, folder) # 根据子文件夹,生成新的路径

files = os.listdir(new_folder_path) # 存放子文件夹下的txt文件的列表

j = 1

# 遍历每个txt文件

for file in files:

if j > 100: # 每类txt样本数最多100个

break

with open(os.path.join(new_folder_path, file), 'r', encoding='utf-8') as f: # 打开txt文件

raw = f.read()

word_cut = jieba.cut(raw, cut_all=False) # 精简模式,返回一个可迭代的generator

word_list = list(word_cut) # generator转换为list

data_list.append(word_list) # 添加数据集数据

class_list.append(folder) # 添加数据集类别

j += 1

data_class_list = list(zip(data_list, class_list)) # zip压缩合并,将数据与标签对应压缩

random.shuffle(data_class_list) # 将data_class_list乱序

index = int(len(data_class_list) * test_size) + 1 # 训练集和测试集切分的索引值

train_list = data_class_list[index:] # 训练集

test_list = data_class_list[:index] # 测试集

train_data_list, train_class_list = zip(*train_list) # 训练集解压缩

test_data_list, test_class_list = zip(*test_list) # 测试集解压缩

all_words_dict = {} # 统计训练集词频

for word_list in train_data_list:

for word in word_list:

if word in all_words_dict.keys():

all_words_dict[word] += 1

else:

all_words_dict[word] = 1

# 根据键的值倒序排序

all_words_tuple_list = sorted(all_words_dict.items(), key=lambda f: f[1], reverse=True)

all_words_list, all_words_nums = zip(*all_words_tuple_list) # 解压缩

all_words_list = list(all_words_list) # 转换成列表

return all_words_list, train_data_list, test_data_list, train_class_list, test_class_list

"""

函数说明:读取文件里的内容,并去重

Parameters:

words_file - 文件路径

Returns:

words_set - 读取的内容的set集合

"""

def MakeWordsSet(words_file):

words_set = set() # 创建set集合

with open(words_file, 'r', encoding='utf-8') as f: # 打开文件

for line in f.readlines(): # 一行一行读取

word = line.strip() # 去回车

if len(word) > 0: # 有文本,则添加到words_set中

words_set.add(word)

return words_set # 返回处理结果

"""

函数说明:文本特征选取

Parameters:

all_words_list - 训练集所有文本列表

deleteN - 删除词频最高的deleteN个词

stopwords_set - 指定的结束语

Returns:

feature_words - 特征集

"""

def words_dict(all_words_list, deleteN, stopwords_set=set()):

feature_words = [] # 特征列表

n = 1

for t in range(deleteN, len(all_words_list), 1):

if n > 1000: # feature_words的维度为1000

break

# 如果这个词不是数字,并且不是指定的结束语,并且单词长度大于1小于5,那么这个词就可以作为特征词

if not all_words_list[t].isdigit() and all_words_list[t] not in stopwords_set and 1 < len(all_words_list[t]) < 5:

feature_words.append(all_words_list[t])

n += 1

return feature_words

"""

函数说明:根据feature_words将文本向量化

Parameters:

train_data_list - 训练集

test_data_list - 测试集

feature_words - 特征集

Returns:

train_feature_list - 训练集向量化列表

test_feature_list - 测试集向量化列表

"""

def TextFeatures(train_data_list, test_data_list, feature_words):

def text_features(text, feature_words): # 出现在特征集中,则置1

text_words = set(text)

features = [1 if word in text_words else 0 for word in feature_words]

return features

train_feature_list = [text_features(text, feature_words) for text in train_data_list]

test_feature_list = [text_features(text, feature_words) for text in test_data_list]

return train_feature_list, test_feature_list # 返回结果

"""

函数说明:新闻分类器

Parameters:

train_feature_list - 训练集向量化的特征文本

test_feature_list - 测试集向量化的特征文本

train_class_list - 训练集分类标签

test_class_list - 测试集分类标签

Returns:

test_accuracy - 分类器精度

"""

def TextClassifier(train_feature_list, test_feature_list, train_class_list, test_class_list):

classifier = MultinomialNB().fit(train_feature_list, train_class_list)

test_accuracy = classifier.score(test_feature_list, test_class_list)

return test_accuracy

if __name__ == '__main__':

# 文本预处理

folder_path = './SogouC/Sample' # 训练集存放地址

all_words_list, train_data_list, test_data_list, train_class_list, test_class_list = TextProcessing(folder_path,test_size=0.2)

# 生成stopwords_set

stopwords_file = './stopwords_cn.txt'

stopwords_set = MakeWordsSet(stopwords_file)

test_accuracy_list = []

"""

deleteNs = range(0, 1000, 20) # 0 20 40 60 ... 980

for deleteN in deleteNs:

feature_words = words_dict(all_words_list, deleteN, stopwords_set)

train_feature_list, test_feature_list = TextFeatures(train_data_list, test_data_list, feature_words)

test_accuracy = TextClassifier(train_feature_list, test_feature_list, train_class_list, test_class_list)

test_accuracy_list.append(test_accuracy)

plt.figure()

plt.plot(deleteNs, test_accuracy_list)

plt.title('Relationship of deleteNs and test_accuracy')

plt.xlabel('deleteNs')

plt.ylabel('test_accuracy')

plt.show()

"""

feature_words = words_dict(all_words_list, 450, stopwords_set)

train_feature_list, test_feature_list = TextFeatures(train_data_list, test_data_list, feature_words)

test_accuracy = TextClassifier(train_feature_list, test_feature_list, train_class_list, test_class_list)

test_accuracy_list.append(test_accuracy)

ave = lambda c: sum(c) / len(c)

print(ave(test_accuracy_list))

结果为:

a1edda95325b8dd3efbb5a72cc66fbb4.png

95cbe2f6c5476d09ecf973b354bd92c8.png

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

朴素贝叶斯算法python sklearn实现_朴素贝叶斯算法——实现新闻分类(Sklearn实现)... 的相关文章

  • Windows下,Eclipse的Android NDK(r8e) 配置

    一 关于NDK Android NDK全称 Native Development Kit 即本地开发包 1 NDK是一系列工具的集合 NDK提供了一系列的工具 这些工具对开发者的帮助是巨大的 它们能帮助开发者快速开发C 或C 的动态库 并能
  • windows怎么部署项目到云服务器

    要将项目部署到云服务器 可以按照以下步骤进行操作 1 在云服务提供商上创建一个云服务器实例 并确保已经将其配置和启动 2 在本地开发环境中将项目打包成可执行文件或者jar包 并确保项目能够正确运行 3 使用远程连接工具 如SSH RDP等
  • ctfshow萌新web17

    c传参过滤掉php 思路 include文件包含 利用日志文件包含 访问日志文件 c var log nginx access log 发现日志文件记录了user agent头 于是在该头中插入一句话木马 再访问日志文件 看日
  • AMBA总线协议AHB、APB、AXI对比分析

    一 AMBA概述 AMBA Advanced Microcontroller Bus Architecture 高级处理器总线架构 AHB Advanced High performance Bus 高级高性能总线 ASB Advanced
  • Uniapp中vueX实现登录状态功能

    uniapp使用Vuex实现登录状态的判断 退出登录 使用action commit实现登录功能 Vue use Vuex export default new Vuex Store state token userid username
  • 了解CMS(Concurrent Mark-Sweep)垃圾回收器

    原文地址为 了解CMS Concurrent Mark Sweep 垃圾回收器 一字不差的贴的人家的 就是感觉写的比较好 贴出来了 羞羞 1 总体介绍 CMS Concurrent Mark Sweep 是以牺牲吞吐量为代价来获得最短回收停
  • 使用git和maven过程一些命令

    git常用命令 1 git status 查看文件在工作目录与缓存的状态 2 git add 添加所有的文件到缓存 3 git commit m 提交的描述信息 如果我们这里不用 m参数的话 git将调到一个文本编译器 通常是vim 来让你
  • mysql5.7 leftjoin group by(获取关联表最新数据)

    用户表 users 日志表 logs 外键 user id 创建时间 created at 获取所有用户最新的日志 SELECT b from SELECT user id max created at as maxtime from lo
  • nafxcwd.lib(afxmem.obj) error lnk2005

    最近写程序突然遇到个错误 nafxcwd lib afxmem obj error lnk2005 查了下msdn发现主要原因是同时使用了CRT中的new delete和MFC中的new delete重载导致的 参考 http suppor
  • RabbitMq基本概念 = >实践DirectExchange和TopicExchange交换机模式

    AMQP 和IM的区别 AMQP 高级消息队列 1 可以一对多广播 也可以一对一广播 2 生产者和消费者不知道对方是谁 IM 1 只能一对一广播 2 生产者和消费者知道对方是谁 RabbitMQ 只是消息代理 我们不生产消息 我们只是消息的
  • 怎样成为一名优秀的程序员?

    新加坡国立大学计算机系有两门课 CS 1101 1102 几乎所有的大学计算机系课程都有两门类似的课程 但几乎所有的学生都误解了这两门课 以为前者是教C 后者是教java 但实际上前者是 Programming Methodology 后者
  • Java学习笔记——34多线程01

    多线程 实现多线程 进程和线程的区别 多线程的实现方式 方式一 继承Thread类 设置线程名称 线程调度 线程控制 线程生命周期 方式二 实现Runnable接口 实现多线程 进程和线程的区别 进程 是正在运行的程序 是系统进行资源分配和
  • Netstat命令详解(Windows)

    Netstat 用于显示与IP TCP UDP 和ICMP 协议相关的统计数据 一般用于检验本机各端口的网络连接情况 如果你的计算机有时候接收到的数据报导致出错数据或故障 你不必感到奇怪 TCP IP 可以容许这些类型的错误 并能够自动重发
  • Kotlin/Java之常用“集合型”数据类型

    先说说数组 Array 和 ArrayList lt 数组 Array gt 整型数组初始化 val point intArrayOf 0 0 实为IntArray 对应Java类型 int 其他还有 charArrayOf byteArr
  • 两数求和

    给定一个整数数组 nums 和一个目标值 target 请你在该数组中找出和为目标值的那 两个 整数 并返回他们的数组下标 你可以假设每种输入只会对应一个答案 但是 你不能重复利用这个数组中同样的元素 示例 给定 nums 2 7 11 1
  • 服务器租用机房机房的类型应该如何选择

    服务器租用机房机房的类型应该如何选择 1 单电信机房 单电信服务器机房业务模式比较固定 访问量也不是很大 适合新闻类网站或政务类网站 如果网站的PV流量持续增加 建议后期采用租赁CDN的方式解决非电信用户访问网站速度过慢的问题 2 双线机房
  • QKL123区块链排行榜(2019年04月)

    QKL123区块链排行榜包括区块链项目 区块链交易平台 区块链媒体 区块链公众号 区块链矿机 区块链矿池 EOS Dapp ETH Dapp 区块链钱包九大榜单 目前 区块链项目榜单选取的客观指标包括流通市值 GitHub提交数 区块链交易
  • 嵌入式stm32基础项目开发:心率检测仪的设计与实现

    嵌入式stm32基础项目开发 心率检测仪的设计与实现 本教程主要给大家谅解了嵌入式stm32开发 心率检测仪的设计与实现 需要的朋友们可以下载来看看 作为参考 项目描述 通过心律传感器采集我们的心律数据 然后通过串口传送到上位机中 上位机用
  • 这篇文章教大家怎么生成ai图片

    在数字化时代 人工智能技术的发展正在改变我们的生活方式 其中之一就是在艺术领域的应用 ai绘画是人工智能技术在艺术领域的一种应用 它可以自动创作出各种各样的图片 为艺术家和设计师提供了更加便捷和高效的绘画工具 ai绘画的出现 不仅可以缩短绘

随机推荐

  • 素数环(回溯算法)

    回溯算法 在包含问题的所有可能解的解空间树中 从根节点出发 按照深度优先遍历的策略进行搜索 对于解空间树种的某个节点 如果该节点满足问题的约束条件 则进入该子树继续进行搜索 否则将以该节点为根节点的子树进行剪枝 回溯法常常可以避免所有的可能
  • layui table.js表格一直返回数据异常

    1 排查数据是否已经正常返回 2 layui table 返回格式默认不能自定义的 返回的分页json格式需要和table js中规定的返回键一致 如下 3 经过测试 其实最重要的是code需要和上图中statusName后的resultC
  • Cisco 路由器VOIP 配置解析

    在企业网络中推广 IP 语音技术有很多优点 例如可以控制数据流量 保证语音质量 充分利用企业租用的数据线路资源 节省传统的长途话费等等 企业使用 IP 语音技术 可以将语音 数据和多媒体通信融合在一个集成的网络中 并在一个企业解决方案中 把
  • 简易版的飞机大战(C语言)

    一 只会发射激光 画质不清晰的飞机大战 游戏的总体结构根据C语言的循环制作的 本来还想说点什么但是注释里面都有 代码 include
  • ansys18安装以后打不开_ansys18.0安装过程及常见问题解决方案【图文】

    1 首先打开ansys18 0安装文件夹 一般情况下通过网络渠道下载的ansys18 0安装包会有四个文件夹 crack文件夹为授权配置文件夹 disk1 disk2 disk3文件夹为安装程序包 我们首先打开disk1文件夹 双击setu
  • 物联网LoRa系列-31:通过LoRa终端实现远程抄表的原理与系统框架(水、电、气、热等通用)

    LoRa终端远程抄表的系统架构图 抄表系统由 无线电表 线集中器 业务数据中心组成 1 无线电表 又称为LoRa终端 内嵌LoRa模块 进行数据的采集 并LoRa WAN协议实现远程数据的传输 LoRa智能终端能将传统水表 电表等读数通过电
  • 可迭代(iterable)和类数组(array-like)

    可迭代 iterable 和类数组 array like 可迭代 iterable 是实现了 Symbol iterator 方法的对象 可以应用 for of 的对象被称为 可迭代的 类数组 array like 是有索引和 length
  • Redis主从复制的原理

    更多内容 欢迎关注微信公众号 全菜工程师小辉 公众号回复关键词 领取免费学习资料 在Redis集群中 让若干个Redis服务器去复制另一个Redis服务器 我们定义被复制的服务器为主服务器 master 而对主服务器进行复制的服务器则被称为
  • pyautogui库的使用教程(超详细)

    一 前言 PyAutoGUI 让您的 Python 脚本控制鼠标和键盘以自动与其他应用程序交互 官方文档 PyAutoGUI documentation 常用函数列表 函数名 功能 基本 pyautogui size 返回包含分辨率的元组
  • 在编辑操作时,el-select多选下拉组件,选中label标签后,框中无法回显选中的label,,,

    1 问题描述 在编辑操作时 页面的el select多选下拉组件 在选择新的label标签时 change事件和监听数组对象都能确定数据已发生改变 ngmodel绑定就是最新的id集合 但就是框中不显示最新选中的label 而change事
  • 论文导读

    图的最大独立集问题 MIS problem 是图论研究中的一个重要问题 具有广泛的应用 本文介绍了最大独立集求解相关的三篇工作 包括一篇启发式方法和两篇基于学习的方法 希望能让大家对这个问题有所了解 问题定义 一个图G V E 的顶点集子集
  • 放弃手写代码吧!用低代码你能生成各种源码

    很多同学不知道为什么要用Low code做开发 传统IT开发不行么 当然可以 传统IT自研软件开发 通过编程去写代码 还有数据库 API 第三方基础架构等 这个方式很好 但不可避免的会带来开发周期长 难度大 技术人员不易开发维护 因此价格及
  • EDUCODER---WEB__JavaScript学习手册十:正则表达式

    第一关 字符串字面量 请在此处编写代码 Begin var pattern js n End 第二关 字符类 请在此处编写代码 Begin var pattern1 a zA Z 0 9 var pattern2 A 0 9 End 第三关
  • Linux下Python环境安装与部署

    因为我是Python零基础 所以如何部署全靠百度 这边我把我查到的资料和安装使用过程中遇到写下来 如果有写的不对的或者有更好的方式 欢迎评论指出 一 Python环境安装 网上有很多安装教程 可以自行百度安装 我参考的是这个 仅第一步安装p
  • The Lost House【树形DP+期望+构造路径】

    题目链接 POJ 2057 题意 有一棵N的点的树 开始的时候蜗牛在1号结点 它不知道它的家在哪个叶子结点 树上的有些结点有虫虫 虫虫会告诉你 你的家是否在以它所在结点为根的子树上 现在需要你规划走的方案 使得找到哪个叶子结点才是家的所走路
  • python将word表格转写入excel

    Notes 想将一份 word 文件中的几个表格转写入 excel 文件中 后续用 excel 处理 用到 python docx 和 pandas 分别处理 word 和 excel 安装 python docx pip install
  • pytorch中网络loss传播和参数更新理解

    相比于2018年 在ICLR2019提交论文中 提及不同框架的论文数量发生了极大变化 网友发现 提及tensorflow的论文数量从2018年的228篇略微提升到了266篇 keras从42提升到56 但是pytorch的数量从87篇提升到
  • 利用R包ggmap进行空间可视化

    ggmap 是在R环境里调用地图作用可视化的利器 它的语法结构跟ggplot2非常相似 也使R语言的用户可以迅速上手 ggmap 结合 ggplot 可以方便快速绘制基于地图的可视化图表 下面的文章里 我将用两个例子 三藩市的犯罪记录 和
  • require 方法详解

    在 NodeJS 中有一个方法是我们使用频率最高的 那就是 require 方法 NodeJs 遵循 CommonJS 规范 该规范的核心是通过 require来加载其他依赖的模块 几个问题 module exports 或者 export
  • 朴素贝叶斯算法python sklearn实现_朴素贝叶斯算法——实现新闻分类(Sklearn实现)...

    1 朴素贝叶斯实现新闻分类的步骤 1 提供文本文件 即 2 准备数据 将数据集划分为训练集和测试集 使用jieba模块进行分词 词频统计 停用词过滤 文本特征提取 将文本数据向量化 3 分析数据 使用matplotlib模块分析 4 训练算