自己的主机做网站服务器,有创意的设计公司名字大全,制作网站的固定成本,wordpress 4.4.1声明#xff1a;这只是浅显的一个小试验#xff0c;且借助了AI。使用的是jupyter notebook,所以代码是一块一块#xff0c;从上往下执行的
知识点#xff1a;正则删除除数字和字母外的所有字符、高频词云、混淆矩阵
参考#xff1a;使用python和sklearn的中文文本多分类…声明这只是浅显的一个小试验且借助了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(keepFalse).sum()}) 重命名列名
由于数据中没有列名所以读取的时候headerNone(见第一段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[数量], width0.6,colorcolors)
# 添加数据标签
for i in range(len(Num)):plt.text(labels[i], Num[数量][i]0.01, f{Num[数量][i]}, hacenter,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[数量], width0.6,colorcolors)
# plt.xlabel(Num[类别])
# 添加数据标签
for i in range(len(Num2)):plt.text(labels[i], Num2[数量][i]0.05, f{Num2[数量][i]}, hacenter,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(width800, height400,max_words10, background_colorwhite).generate(text)plt.figure(figsize(10, 5))plt.imshow(wordcloud, interpolationbilinear)plt.title(fWord Cloud for Category {category},fontsize 30)plt.axis(off)plt.show()根据我们事先的得知的数字与类别的对应关系1-World2-Sports3-Business4-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(fAccuracy: {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, annotTrue, fmtd, cmapBlues, xticklabelsclf.classes_, yticklabelsclf.classes_)
plt.xlabel(预测)
plt.ylabel(实际)
plt.title(混淆矩阵)
plt.show()
下图为朴素贝叶斯预测的混淆矩阵。可以看出对于朴素贝叶斯模型来说容易将第1类错误预测为第3类第2类错误预测为第1类第3类错误预测为第1、4类第4类错误预测为第3类。