【机器学习】文本多分类

声明:这只是浅显的一个小试验,且借助了AI。使用的是jupyter notebook,所以代码是一块一块,从上往下执行的

知识点:正则删除除数字和字母外的所有字符、高频词云、混淆矩阵

参考:使用python和sklearn的中文文本多分类实战开发_文本多标签分类 用二分类器做 python 数据集中文_-派神-的博客-CSDN博客


数据:【免费】初步的文本多分类小实验资源-CSDN文库

数据介绍:训练集train.csv中有120000条数据,测试集test.csv中有7600条数据。两个文件中记录的是新闻,均只有3列,第1列记录了新闻的种类(world,sports,sci/Tech,Business,记录与class.txt中),总共有4类[3,4,2,1],且每一类的占比均为25%;第2列记录了新闻标题,第3列记录了新闻的大致内容。

数据总体情况

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import re # 正则匹配
plt.rcParams['font.sans-serif'] = ['STKaiTi']
plt.rcParams['axes.unicode_minus']=False# 数据的情况
dfTrain = pd.read_csv('train.csv',header = None)
dfTest = pd.read_csv('test.csv',header = None)
print(f'训练集数据量:{len(dfTrain)}')
print(f'测试集数据量:{len(dfTest)}')
print(f'数据:{dfTrain.head(4)}')

数据预处理

空值与重复值

没有空值与重复值

# 检查是否有空值
print(f'数据情况{dfTrain.info()}')
print(f'第1列空值:{dfTrain.iloc[0].isnull().sum()}')
print(f'第2列空值:{dfTrain.iloc[1].isnull().sum()}')
print(f'第3列空值:{dfTrain.iloc[2].isnull().sum()}')
# 重复值分析与处理
print(f'重复值:{dfTrain.duplicated(keep=False).sum()}')

重命名列名

由于数据中没有列名,所以,读取的时候header=None(见第一段pd.read_csv),为了操作的方便,添加列名['category','title','content']。

# 列重命名
dfTrain.columns = ['category','title','content']
dfTest.columns = ['category','title','content']

删除除数字和英文的所有字符

为了展示出高频词的词云以及后续的处理,这里使用正则表达式删除数据中第2、3列中除数字和字母外的所有字符,且各词汇之间采用空格切分。

# 在a-z A-Z 0-9范围外的字符替换为空格字符
def remove_punctuation(text):cleaned_text = re.sub(r'[^a-zA-Z0-9]', ' ', text)return cleaned_text
# 删除除数字和英文的所有字符
dfTrain['title'] = dfTrain['title'].apply(remove_punctuation)
dfTest['title'] = dfTest['title'].apply(remove_punctuation)
dfTrain['content'] = dfTrain['content'].apply(remove_punctuation)
dfTest['content'] = dfTest['content'].apply(remove_punctuation)

补充

我这个试验只采用了第2列title的内容,没有用第3列content 里的内容,预测精度会有所下降。

这里呢其实还是可以有其他操作的。比如将第2列和第3列合并成新的一列,然后用新的一列作为输入。还可以删除英文里面的停用词,减少无意义的高频词。

不同分类对数据进行可视化

# 训练集种类
print(f'种类:{dfTrain.iloc[:,0].unique()}')
# 训练集各类别数据量
d= {'类别':dfTrain['category'].value_counts().index,'数量':dfTrain['category'].value_counts()}
Num = pd.DataFrame(data = d).reset_index(drop = True)# 柱状图
plt.figure(1,figsize = (10,6),dpi = 400)
plt.title('训练集类别数据量',fontsize = 15)  # 标题
labels = ['World','Sports','Business','Sci/Tech']
colors = ['skyblue', 'green', 'orange','red']
plt.bar(labels,Num['数量'], width=0.6,color=colors)
# 添加数据标签
for i in range(len(Num)):plt.text(labels[i], Num['数量'][i]+0.01, f'{Num["数量"][i]}', ha='center',rotation = 0,fontsize = 15)plt.xlabel('种类',fontsize = 15)
plt.ylabel('数量',fontsize = 15)
plt.show()# 测试集种类
print(f'种类:{dfTest.iloc[:,0].unique()}')
# 测试集各类别数据量
d2= {'类别':dfTest['category'].value_counts().index,'数量':dfTest['category'].value_counts()}
Num2 = pd.DataFrame(data = d2).reset_index(drop = True)# 柱状图
plt.figure(2,figsize = (10,6),dpi = 400)
plt.title('测试集类别数据量',fontsize = 15)  # 标题
labels = ['World','Sports','Business','Sci/Tech']
colors = ['skyblue', 'green', 'orange','red']
plt.bar(labels,Num2['数量'], width=0.6,color=colors)
# plt.xlabel(Num['类别'])
# 添加数据标签
for i in range(len(Num2)):plt.text(labels[i], Num2['数量'][i]+0.05, f'{Num2["数量"][i]}', ha='center',rotation = 0,fontsize = 15)
plt.xlabel('种类',fontsize = 15)
plt.ylabel('数量',fontsize = 15)
plt.show()

高频词词云

 画出训练集中,4种分类的新闻标题的top10的高频词云,需要借助wordcloud库

import pandas as pd
import matplotlib.pyplot as plt
from wordcloud import WordCloud
from collections import defaultdict# 创建一个存储每个类别文本的字典
category_text = defaultdict(str)# 将每个类别的文本合并到对应的字典项中
for category, sentence in zip(dfTrain['category'], dfTrain['title']):category_text[category] += sentence + ' '# 生成词云图像并绘制
for category, text in category_text.items():wordcloud = WordCloud(width=800, height=400,max_words=10, background_color="white").generate(text)plt.figure(figsize=(10, 5))plt.imshow(wordcloud, interpolation="bilinear")plt.title(f'Word Cloud for Category {category}',fontsize = 30)plt.axis("off")plt.show()

 

         根据我们事先的得知的数字与类别的对应关系:1-World,2-Sports,3-Business,4-Sci/Tech,观察每种类别的高频词云图,可以看出对于world,常出现诸如Iraq、US等国家名称,对于Sports类,常出现Win,Game等相关词汇,对于Business类,常出现deal,oil,price等相关词汇,对于Sci/Tech类,常出现MicroSoft,Intel等相关词汇。因此,每一类的高频词云是符合当前类的特征的。

模型预测

思路:为了能使模型能够对文本进行预测,首先需要使用TF-IDF向量化器进行文本特征提取(至于原理什么的,我不知道,AI生成的)。然后再次基础上借助预测模型进行多分类预测,在训练集中训练,测试集中测试

使用朴素贝叶斯

import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.naive_bayes import MultinomialNB
from sklearn.metrics import accuracy_score, classification_report# 划分x,y
X_train = dfTrain['title']
X_test = dfTest['title']
y_train  = dfTrain['category']
y_test  = dfTest['category']
# 文本特征提取,使用词袋模型
vectorizer = CountVectorizer()
X_train_vec = vectorizer.fit_transform(X_train)
X_test_vec = vectorizer.transform(X_test)
# 训练朴素贝叶斯分类器
clf = MultinomialNB()
clf.fit(X_train_vec, y_train)
# 预测
y_pred = clf.predict(X_test_vec)
# 评估模型性能
accuracy = accuracy_score(y_test, y_pred)
print(f'Accuracy: {accuracy:.2f}')
# 输出分类报告
print(classification_report(y_test, y_pred))

下图为朴素贝叶斯的预测结果,总体的预测准确率为0.87。但是对于不同类别的预测效果也不同,可以看出朴素贝叶斯对类别2的预测效果最好的,精确度、召回率、f1分数均能达到0.9以上 

画出混淆矩阵 

from sklearn.metrics import confusion_matrix
import seaborn as sns# 计算混淆矩阵
conf_matrix = confusion_matrix(y_test, y_pred)# 绘制混淆矩阵
plt.figure(figsize=(8, 6),dpi = 400)
sns.heatmap(conf_matrix, annot=True, fmt='d', cmap='Blues', xticklabels=clf.classes_, yticklabels=clf.classes_)
plt.xlabel('预测')
plt.ylabel('实际')
plt.title('混淆矩阵')
plt.show()

下图为朴素贝叶斯预测的混淆矩阵。可以看出对于朴素贝叶斯模型来说,容易将第1类错误预测为第3类,第2类错误预测为第1类,第3类错误预测为第1、4类,第4类错误预测为第3类。 

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

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

相关文章

题目 1053: 二级C语言-平均值计算

输入10个整数,求它们的平均值,并输出大于平均值的数据的个数。 输出格式 大于平均数的个数 样例输入 1 2 3 4 5 6 7 8 9 10 样例输出 5 这题简单,直接创建数组,录入10个数。求累和再求平均数,之后for循环遍历数组…

DS相关题目

DS相关题目 题目一:消失的数字 拿到这道题目之后,首先可以想到的一个解题方法就是,我们可以先排序,排完序之后,这个数组其实就是一个有序的数组了,那只用比较数组中的每一个元素和他对应的下标是不是相等的…

代码管理工具git1

ctrl 加滚轮 放大字体 在计算机任意位置单击右键,选择::Git Bash Here git version git清屏命令:ctrl L查看用户名和邮箱地址: $ git config user.name$ git config user.email修改用户名和邮箱地址:$ git…

C#中Visual Studio如何为解决方案设置启动项目

目录 第一种方法:快速选定启动项目的方法1.在解决方案资源管理器中,选择解决方案(最高层节点)2.选择解决方案节点的上下文(右键单击)菜单,然后选择“属性”。 “解决方案属性页”对话框随即显示第二种方法:右击First11或者second11,点击设置启动项目即可Visual Studio…

C#使用DirectX SDK 加载.x三维模型

最近因为项目要做显示一个三维模型,所以研究了下如何在Winform中加载并显示三维模型。在Windows平台巨硬公司提供了DirectX SDK用于渲染图形,参考了几篇文章做了个demo记录下,以便日后温习只用。这个SDK涉及到了计算机图形学的一些基础知识&a…

【物联网】简要解释RTK(Real-Time Kinematic)>>实时动态差分定位

引言: RTK(Real-Time Kinematic)技术是一种基于差分GPS的高精度定位技术,它通过实时通信和数据处理,能够提供厘米级甚至亚米级的定位精度。RTK技术在许多领域都得到了广泛应用,如测绘、航空航天、农业等。本…

物联网终端算法

物联网终端算法是指在物联网终端设备上运行的各种算法,包括数据采集、数据预处理、数据传输、数据存储、数据处理、数据分析等算法。以下是物联网终端算法的一些具体应用: 数据采集算法:用于采集各种传感器数据,包括温度、湿度、气…

yum安装mysql8

记录一下安装过程用于后面项目参考 目录 说明安装步骤yum安装默认目录修改默认的数据目录必要的my.cnf属性修改卸载Mysql 说明 一般情况下都是docker安装,部分特殊情况下,例如老外的项目部分禁用docker,那一般二进制安装或者yum直接安装。 …

Springboot -- DOCX转PDF(二)

之前记录了按照模板生成 DOCX 文件、并转换为 PDF 文件的方法 https://blog.csdn.net/qq_40096897/article/details/131979177?spm1001.2014.3001.5501 但是使用效果并不是很理想,转换完的 PDF 格式和原本的文档格式不匹配。所以在此重新找了一个文件转 PDF 的方法…

职场工作与生活

序言: 和很多在CSDN的博主一样,大家在工作之后就很少或者是不再回到CSDN,确实自己也一年多没上了。因为可能当初大家在这就是为了记录和分享当初自己学习技术的东西。而大家走出象牙塔开始工作后,发生了很大的转变。在国内…

PY32F003F18之输入捕获

输入捕获是定时器的功能之一,配合外部引脚,捕获脉宽时间或采集周期。 CPU中的定时器最基本的功能就是计数功能,其次是输入捕获(IC),再次就是比较输出(OC),还有就是使用引脚对外部时钟进行计数,触发信号捕捉…

LuatOS-SOC接口文档(air780E)--audio - 多媒体音频

常量 常量 类型 解释 audio.PCM number PCM格式,即原始ADC数据 audio.MORE_DATA number audio.on回调函数传入参数的值,表示底层播放完一段数据,可以传入更多数据 audio.DONE number audio.on回调函数传入参数的值,表示…

计算机二级python基础题刷题笔记

1.关于format格式化输出 &#xff1a;引导符号&#xff08;必须有&#xff09; <填充>&#xff1a;用于填充的单个字符&#xff0c;比如“”&#xff0c;“” <对齐>&#xff1a;<左对齐,>右对齐&#xff0c;^居中对齐 <宽度>:槽的设定&#xff0c;输…

SpringCloud中的Eureka的集群配置

微服务框架中最为重要的就是注册中心&#xff0c;如果只是单注册中心&#xff0c;一旦出现问题&#xff0c;容易导致整个微服务环境不可用&#xff0c;所以建议注册中心集群。 目前SpringCloud框架中使用Eureka作为注册中心&#xff0c;本文简单介绍一下Eureka的集群配置&…

阿里云 linux 的nginx 配置uni-app的H5前端项目vue,后端接口阿里云。

背景 vue项目调用接口是阿里云的&#xff0c;H5网站也要部署到阿里云&#xff0c;2个不同的服务器&#xff0c;需要做nginx部署与api代理。 端口配置 首先当然是买个阿里云服务器&#xff0c;这里是配置是linux系统&#xff0c;配置访问的域名 &#xff0c;再接着&#xff1…

iOS系统暗黑模式

系统暗黑模式&#xff1a; 暗黑模式颜色适配&#xff1a; 方式1&#xff1a; Assets配置&#xff1a;在Assets中配置好颜色后&#xff0c;可以通过colorNamed: 放大获取到动态颜色。 方式2&#xff1a;代码配置&#xff0c;通过代码colorWithDynamicProvider: 可以看出来生成…

【Obsidian】中编辑模式和阅读模式光标乱跳问题以及编辑模式中段落聚集的问题解决

前言 最近用Obsidian 软件写md笔记&#xff0c;但是当我分别使用编辑模式和阅读模式时出现了光标乱跳的问题。比如我在编辑模式&#xff0c;光标停留在第500行&#xff0c;但是切换成编辑模式就变成了1000行。而且光标根本没停在原来的位置。这样重新定位非常麻烦。 两种阅读…

Coke(五):协程任务的同步/异步等待

项目Github主页Coke。 在前几篇文章中&#xff0c;多次用到了协程任务上的同步等待和异步等待功能&#xff0c;本文将对这部分内容做进一步的介绍。首先来看一个简单的例子 #include <iostream> #include <chrono> #include "coke/coke.h"coke::Task&l…

linux espidf vscode

安装 根据 https://docs.espressif.com/projects/esp-idf/zh_CN/latest/esp32s2/get-started/linux-macos-setup.html 里的要求安装一些东西&#xff0c;点插件的首页的“… Package”也能跳转 在 vscode 里安装 ESP-IDF 插件&#xff0c;下载服务器选择 Espressif&#xff0c…

我眼中的大数据: 我们未来该往何处

满打满算&#xff0c;工作接近三年的时间了&#xff0c;入行大数据也三年了。从开始时惊艳于大数据处理的高效&#xff0c;到现在时常迷茫未来数据的出路在哪&#xff0c;恍恍惚惚跨过了互联网的高峰。今天突然觉得&#xff0c;该总结下过去&#xff0c;思考下未来。我尽可能少…