【机器学习】文本多分类

声明:这只是浅显的一个小试验,且借助了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.xdnf.cn/news/139826.html

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

相关文章

资源分享 | 情绪脑电研究公开数据集

SEED SEED数据集是由上海交大类脑计算与机器智能研究中心(BCMI)开发的。该数据集是基于脑电的情绪分类任务而设计的数据集。该数据集记录了15名被试在观看积极、中性和消极情绪电影片段时的EEG信号,每个视频片段的时间为3-5分钟。每个参与者重复采集三天&#xff0…

多分类中混淆矩阵的TP,TN,FN,FP计算

关于混淆矩阵,各位可以在这里了解:混淆矩阵细致理解_夏天是冰红茶的博客-CSDN博客 上一篇中我们了解了混淆矩阵,并且进行了类定义,那么在这一节中我们将要对其进行扩展,在多分类中,如何去计算TP&#xff0…

IDEA中创建Java Web项目方法1

以下过程使用IntelliJ IDEA 2021.3 一、File-> New -> Project... 1. 项目类型中选择 Java Enterprise 项目 2. Name:填写自己的项目名称 3. Project template:选择项目的模板,Web application。支持JSP和Servlet的项目 4. Applica…

Nginx location 精准匹配URL = /

Location是什么? Location是Nginx中的块级指令(block directive),通过配置Location指令块,可以决定客户端发过来的请求URI如何处理(是映射到本地文件还是转发出去)及被哪个location处理。 匹配模式 分为两种模式&…

位段 联合体 枚举

Hello好久不见,今天分享的是接上次结构体没有分享完的内容,这次我们讲讲位段 枚举和联合体的概念以及他们的用法。 2.1 什么是位段 位段的声明和结构是类似的,有两个不同: 1.位段的成员必须是 int、unsigned int 或signed int 。 …

微信开放平台第三方开发,实现代小程序备案申请

大家好,我是小悟 微信小程序备案整体流程总共分为五个环节:备案信息填写、平台初审、工信部短信核验、通管局审核和备案成功。 服务商可以代小程序发起备案申请。在申请小程序备案之前,需要确保小程序基本信息已填写完成、小程序至少存在一个…

com.google.gson.internal.LinkedTreeMap cannot be cast to XXX

起因是在对google商品做本地缓存时,上线后发现的bug 刚开始非常自信,debug没问题线上有问题,大概率就是混淆文件没有添加keep,于是本地添加对SDK中类的keep,本地打包release验证,不出意外还是崩溃 仔细看…

C语言指针变量的引用距离

本段代码&#xff0c;测试&#xff0c;C的函数传参中&#xff0c;形参是基础类型参数和地址参数&#xff0c;对于实参的值影响。 #include <stdio.h> add(int a,int b){a;b;printf("add副本a%d\n",a);printf("add副本b%d\n",b);printf("副本ca…

Interceptor的使用场景:拦截请求中的租户信息,注入到租户上下文中

业务场景 在SaaS环境中&#xff0c;租户是最重要的隔离业务数据的属性了&#xff0c;在自己的项目体系环境中&#xff0c;租户id能保证有值。但有个特殊场景&#xff0c;某些特殊权限的账号需要修改指定租户的内容&#xff0c;也即前端会携带租户信息过来&#xff0c;并且内部涉…

在github上设置不同分支,方便回滚

在github上设置不同分支&#xff0c;方便回滚 步骤可能出现的问题couldnt find remote ref gpuVersion1. 确保您处于正确的分支2. 添加并提交更改&#xff08;如果还未进行&#xff09;3. 推送本地分支到远程仓库4. 验证操作 步骤 之前在github上上传了一个项目代码&#xff0c…

【马蹄集】—— 数论专题:筛法

数论专题 目录 MT2213 质数率MT2214 元素共鸣MT2215 小码哥的喜欢数MT2216 数的自我MT2217 数字游戏 MT2213 质数率 难度&#xff1a;黄金    时间限制&#xff1a;1秒    占用内存&#xff1a;256M 题目描述 请求出 [ 1 , n ] \left[1,n\right] [1,n] 范围内质数占比率。…

Unity的AB包相关

1、打包 在这个界面左边右键&#xff0c;CreateNewBundle 将要打包的模型制作成预设体 在下面勾选 选好平台路径&#xff0c;点击Build 2、加载AB包 public class ABTest : MonoBehaviour {// Start is called before the first frame updatevoid Start(){//加载AB包AssetB…

识别准确率达 95%,华能东方电厂财务机器人实践探索

摘 要&#xff1a;基于华能集团公司大数据与人工智能构想理念&#xff0c;结合东方电厂实际工作需要&#xff0c;财务工作要向数字化、智能化纵深推进&#xff0c;随着财务数字化转型和升级加速&#xff0c;信息化水平不断提升&#xff0c;以及内部信息互联互通不断加深&#x…

深入探析NCV7356D1R2G 单线CAN收发器各项参数

NCV7356D1R2G深力科是一款用于单线数据链路的物理层器件&#xff0c;能够使用多种具碰撞分解的载波感测多重存取 (CSMA/CR) 协议运行&#xff0c;如博世控制器区域网络 (CAN) 2.0 版。此串行数据链路网络适用于不需要高速数据的应用&#xff0c;低速数据可在物理介质部件和微处…

【用unity实现100个游戏之12】unity制作一个俯视角2DRPG《类星露谷物语》资源收集游戏demo

文章目录 前言加快编辑器运行速度素材(1)场景人物(2)工具 一、人物移动和动画切换二、走路灰尘粒子效果探究实现 三、树木排序设计方法一方法二 四、绘制拿工具的角色动画五、砍树实现六、存储拾取物品引入Unity 的可序列化字典类 七、实现靠近收获物品自动吸附八、树木被砍掉的…

视频编解码器H.264和H265有什么区别?

对于大型视频文件来说&#xff0c;视频编解码器至关重要&#xff0c;它可以将文件压缩为较小的尺寸&#xff0c;从而可以更轻松地存储和加快传输速度。而两种最常用的编解码器是H.264和H.265&#xff0c;那么它们两者之间有什么区别&#xff0c;哪一个更好呢&#xff1f; 1. 什…

手摸手图解 CodeWhisperer 的安装使用

CodeWhisperer 是亚⻢逊出品的一款基于机器学习的通用代码生成器&#xff0c;可实时提供代码建议。 亚马逊云科技开发者社区为开发者们提供全球的开发技术资源。这里有技术文档、开发案例、技术专栏、培训视频、活动与竞赛等。帮助中国开发者对接世界最前沿技术&#xff0c;观点…

JCEF中js与java交互、js与java相互调用

jcef中js与java相互调用&#xff0c;java与js相互调用&#xff0c;chrome与java相互调用&#xff0c;java与chrome相互调用、jcef与java相互调用 前提&#xff1a;https://blog.csdn.net/weixin_44480167/article/details/133170970&#xff08;java内嵌浏览器CEF-JAVA、jcef、…

车辆检测:An Efficient Wide-Range Pseudo-3D Vehicle Detection Using A Single Camera

论文作者&#xff1a;Zhupeng Ye,Yinqi Li,Zejian Yuan 作者单位&#xff1a;Xian Jiaotong University 论文链接&#xff1a;http://arxiv.org/abs/2309.08369v1 项目链接&#xff1a;https://www.youtube.com/watch?v1gk1PmsQ5Q8 内容简介&#xff1a; 1&#xff09;方…

【数据结构】二叉树之堆的实现

&#x1f525;博客主页&#xff1a;小王又困了 &#x1f4da;系列专栏&#xff1a;数据结构 &#x1f31f;人之为学&#xff0c;不日近则日退 ❤️感谢大家点赞&#x1f44d;收藏⭐评论✍️ 目录 一、二叉树的顺序结构 &#x1f4d2;1.1顺序存储 &#x1f4d2;1.2堆的性质…