python-新闻文本分类详细案例-(数据集见文末链接)

article/2025/8/17 18:13:50

文章目录

  • 分析思路
  • 所用数据集
  • 一、导入相关包
  • 二、数据分析
    • 1.读取数据
    • 2. jieba分词并去除停用词
    • 3. TF-IDF
    • 4. 网格搜索寻最优模型及最优参数
    • 5. 预测并评估预测效果
  • 总结


分析思路

新闻文本数据包含四类新闻,分别用1,2,3,4 表示。
(1)读取数据;
(2)利用 jieba 对文本进行分词并去除停用词;
(3)运用 TF-IDF 将文本转换为机器学习分类算法能够识别的数字特征,
(4)通过网格搜索 在 LogisticRegression, MultinomialNB,RandomForestRegressor 三种分类算法 中寻找最优算法以及最优参数;
(5)训练最优模型进行预测并评估预测效果。

所用数据集

所用新闻数据集包含 train 训练集, test 测试集 数据两个文件夹,两个文件夹下各包含 四个子文件夹,代表1,2,3,4 四类新闻的文件,每条新闻的txt 文件存放在此四类文件夹中。如下图所示:
在这里插入图片描述
train 和 test 各类新闻总数量:
在这里插入图片描述

一、导入相关包

import pandas as pd
import numpy as np
import jieba  #jieba分词
import os   
from sklearn.feature_extraction.text import TfidfVectorizer #TF-IDF
from sklearn.model_selection import GridSearchCV            #网格搜索
from sklearn.linear_model import LogisticRegression
from sklearn.naive_bayes import MultinomialNB
from sklearn.ensemble import RandomForestRegressor
from sklearn.metrics import confusion_matrix,classification_report #预测效果的评估
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif']=['SimHei']  #这两行用于plt图像显示中文,否则plt无法显示中文
plt.rcParams['axes.unicode_minus']=False

二、数据分析

1.读取数据

代码如下:

# 数据读取函数
def read_file(train_test,news_type):  #train_test:指定是trian或test文件夹,news_type:新闻类型 1234files_path = f'text//{train_test}//{news_type}' files = os.listdir(files_path)       #获取某一类新闻的文件名列表:['1.txt','2.txt',...]file_news = []  for file in files:file_path = files_path + '//'+ filewith open(file_path,'r') as f:   #读取新闻news = f.readlines()file_news.append(news[0].strip()) df = pd.DataFrame({'type':[news_type for i in range(len(file_news))],'news':file_news})return df    #返回 新闻类型 、新闻内容构成的Dataframe#获取训练集数据量
train = read_file('train',1).append(read_file('train',2),ignore_index = True).append(read_file('train',3),ignore_index = True).append(read_file('train',4),ignore_index = True)
train_size = len(train)#数据读取,去重,重置索引   date_news: 所有新闻数据
date_news = read_file('train',1).append(read_file('train',2),ignore_index = True).append(read_file('train',3),ignore_index = True).append(read_file('train',4),ignore_index = True).append(read_file('test',1)).append(read_file('test',2),ignore_index = True).append(read_file('test',3),ignore_index = True).append(read_file('test',4),ignore_index = True)
date_news = date_news.drop_duplicates() 
date_news = date_news.reset_index(drop = True)  #去重之后,重置索引,否则后面检索数据时易出错
#数据统计
date_news.groupby(['type'])['type'].count()  

观察一下数据:
在这里插入图片描述

2. jieba分词并去除停用词

代码如下:

#停用词读取
with open('stopwords.txt','r',encoding='utf-8') as f:stopwords = f.readlines()
stopwords = [i.strip() for i in stopwords]#结巴分词并去除停用词
def jieba_stop(each):result = []jieba_line = jieba.lcut(each)  #jieb.cut()返回迭代器,节省空间;jieba.lcut() 直接返回分词后的列表。三种分词模式:默认精确模式,用于文本分析  for l in jieba_line:if (l not in stopwords) and (l != ''): # 去除停用词以及空格result.append(l.strip())return result
date_news.news = date_news.news.apply(jieba_stop)  #注意 apply 的用法
date_news.news = date_news.news.apply(lambda x: ','.join([i for i in x if i !=''])) #反复去除空字符

分词结果:
在这里插入图片描述
词频统计:

all_words = [i.strip() for line in date_news.news for i in line.split(',')]
all_df = pd.DataFrame({'words':all_words})
all_df.groupby(['words'])['words'].count().sort_values(ascending = False)[:10].plot.bar()  #表示停用词去除完全,分词效果尚可

在这里插入图片描述

3. TF-IDF

#TF-IDF 
tfidf = TfidfVectorizer()
news_tfidf = tfidf.fit_transform(date_news.news)

4. 网格搜索寻最优模型及最优参数

在这里只用了 LogisticRegression,MultinomialNB。

#数据集划分
y = date_news.type  
X_train = news_tfidf[:train_size,:]  #训练集X
X_test = news_tfidf[train_size:,:]   #测试集X
y_train = y.iloc[:train_size,]  
y_test = y.iloc[train_size:,]  
lr = LogisticRegression()  #模型拟合
MNB = MultinomialNB()
lr_params = {'C':[0.1,0.5,1,10],'random_state':[0]}  #参数
MNB_params = {'alpha':[0.1,0.5,1,10]}
#rf = RandomForestRegressor()
#rf_params = {'n_estimators':[500,1000],'max_depth':[5,10],'random_state':[0]}#网格搜索
lr_grid = GridSearchCV(lr,lr_params,n_jobs=-1,cv=10,verbose=1,scoring='neg_mean_squared_error')
lr_grid.fit(X_train,y_train)
MNB_grid = GridSearchCV(MNB,MNB_params,n_jobs=-1,cv=10,verbose=1,scoring='neg_mean_squared_error')
MNB_grid.fit(X_train,y_train)
# rf_grid = GridSearchCV(rf,rf_params,n_jobs=-1,cv=10,verbose=1,scoring='neg_mean_squared_error')
# rf_grid.fit(X_train,y_train)
print('LR best params: '+ str(lr_grid.best_params_))  #最优参数
print('LR best score: '+ str(lr_grid.best_score_))        #最优分数
#print('RF best params: '+ str(rf_grid.best_params_))
#print('RF best score: '+ str(rf_grid.best_score_))
print('MNB best params: '+ str(MNB_grid.best_params_))
print('MNB best score: '+ str(MNB_grid.best_score_))

结果显示 MultinomialNB(alpha = 0.1) 最优 :
在这里插入图片描述

5. 预测并评估预测效果

y_predict = MNB_grid.predict(X_test)     #预测值
mat = confusion_matrix(y_test,y_predict) #混淆矩阵
df = pd.DataFrame(mat,columns=[1,2,3,4],index=[1,2,3,4])
report_MNB = classification_report(y_test,y_predict)

在这里插入图片描述

总结

预测结果显示:模型对 1、2、3 类的 预测效果较好而对第四类预测效果不佳,通过分析发现,各类的样本量存在较大差异,这可能导致预测效果的偏差。因此,在做文本分类任务,应尽量保证各类型文本数量相近(采用下采样或者过采样),并且考虑利用模型融合提高预测效果。

数据集链接:https://pan.baidu.com/s/1580VyM0LqxsAjxYsXlhLuA
提取码:sky5


http://chatgpt.dhexx.cn/article/HFMtEgvm.shtml

相关文章

NetWORK ShortCuts 创建

很多时候我们创建了很多SHARE DRIVE的SHOT CUT: 但是我们不知道他们的路径在哪里,在下一台新电脑的时候,我们又要重新创建?NONONO, 我们打开其中一个SHORT CUT 我们点一下 "Proposal_Content_RPA" 右边的空…

shortcuts实现

1.使用条件 android 7.1以上 2.功能说明 长按桌面app图标出现快捷方式列表,点击可跳转到app的指定界面,用户也可以将其作为一个单独的快捷方式 3.效果截图 3.技术实现 分为两种方式,静态xml配置和动态代码配置,二者各有优劣&#…

Android ShortCuts使用

ShortCuts是什么? Shortcuts是指在桌面长按app图标而出现的快捷方式,可以为你的app的关键功能添加更加快速的入口而不是先打开app 点击快捷方式可以访问应用功能,而且这种快捷方式也可以被拖拽到桌面的单独位置,变成单独的左面快…

Android App Shortcuts

周五了,周末还远吗?~ 加入我知识星球的人都得到了提升,可不要错过哦~ 点击阅读原文即可。 本文较长,阅读大约十分钟 ~ 我们都知道iPhone6S推出了3D Touch的功能,也算是一个大卖点,Google也后来居上&#xf…

Linux下cut命令用法详解

Linux下cut命令用法详解 原创:frozen_sucker(冰棍) 有时我们经常会遇到这样一些问题:有一页电话号码薄,上面按顺序规则地写着人名、家庭住址、电话、备注等,此时我们只想取出所有人的名字和其对应的电话号码,你有几种…

使用Dynamic Shortcuts

在看完Static Shortcuts后, 我们不相信Google仅仅给我们开发者开放了局限性如此大的使用方式, 肯定还会存在灵活性更大的API, 是的, 这就是我们马上要讲的Dynamic Shortcuts, 我把它称为动态配置. 说起动态配置, 那肯定是用java代码实现了, 那如何实现呢? 首先第一步, 我们需…

Shortcuts,让你可以在系统的桌面上为所欲为

/ 今日科技快讯 / 近日,有用户刷抖音时看到烤虾广告下单,实付款194元买了250克烤虾干,货到付款后发现是三无产品,且外形口感与广告宣传天差地别。对此抖音表示,已对此事展开相关调查,并下架涉嫌虚假宣传…

Shortcuts使用解析(一)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/susan_123456/article/details/93793490 Shortcuts是什么? Shortcuts是指在桌面长按App图标而出现的快捷方式,可以为你的App的关键功能添加更快速的…

是时候来了解android7了:shortcuts(快捷方式)

本文已授权微信公众号:鸿洋(hongyangAndroid)在微信公众号平台原创首发。 就在前几天的一个晚上, Google召开了它的秋季发布会, 毫无悬念的宣布了它的最新手机品牌Pixel, 与此同时我的nexus设备也从亲儿子降级成为干儿子. 不过还好Google并没…

Android 7.1 新特性:快捷方式 Shortcuts 详解

Android 7.1 新特性:快捷方式 Shortcuts 详解 一、Shortcuts 介绍 Android 7.1 允许 App 自定义 Shortcuts,类似 iOS 的 3D touch。通过在桌面长按 App 弹出 Shortcut 列表,点击某个 Shortcut 快速进入某项操作,同时 Shortcut 可以…

Android7.1新特性:快捷方式Shortcuts详解

Shortcuts介绍 Android7.1(API Level 25)及以上系统可以自定义Shortcuts,通过在桌面上长按App Icon弹出Shortcut列表,点击某个shortcut可使用户快捷得打开App里常用的或推荐的任务。长按列表中的任一个Shortcut可拖动到桌面进行固…

oracle 左连接

oracle左连接小结 当使用左连接关联表进行查询时,如果右侧的表在关联的条件中有重复的数据,就会导致最后的查询结果比预期的多,比如: select * from A 需要关联的表 select * from B 这里的两个表的id都是主键,现在…

lambda多表左连接

下面是mysql多表左连接,对应的lambda表达式写法,只为快速解决你的问题,详细的就不介绍了,只出结果,相信稍微有点基础的都能看懂。相关知识点,请自行百度 关键字:GroupJoin、SelectMany sql语句…

实例讲解内连接、左连接、右连接、交叉连接、外连接以及全连接

目录 示例表&#xff1a;1.内连接-inner&#xff1a;实例1&#xff1a;内连接表a和表b实例2&#xff1a;内连接表a和表c实例3&#xff1a;内连接表a和表b,使用“>”号实例4&#xff1a;内连接表a和表b,使用“<”号实例5&#xff1a;内连接表a和表b,指定字段显示实例6&…

mysql 左连接查询记录数,MySQL左连接查询记录行数

最近修复一个数据问题&#xff0c;其中用到了左连接&#xff0c;我的意识里还以为A左连接B&#xff0c;查询出的记录数量会是A的记录数&#xff0c;然而实际操作后发现认知严重错。 网上关于左连接的一张图 摘自网上的一张图&#xff0c;图确实没毛病&#xff0c;但我却产生了误…

mysql左连接出现笛卡尔积_Mysql内连接、左连接会出现笛卡尔积的理解

先简单解释一下笛卡尔积。 现在,我们有两个集合A和B。 A = {0,1} B = {2,3,4} 集合 AB 和 BA的结果集就可以分别表示为以下这种形式: AB = {(0,2),(1,2),(0,3),(1,3),(0,4),(1,4)}; BA = {(2,0),(2,1),(3,0),(3,1),(4,0),(4,1)}; 以上AB和BA的结…

关于左右连接

首先来看一下两张主要的表&#xff1a; persons表 orders表 现在我们希望列出所有的人&#xff0c;以及他们的定购。 SELECTpersons.last_name,persons.first_name,orders.order_no FROMpersons LEFT JOIN orders ON persons.pid orders.pid ORDER BYpersons.last_nam…

LINQ左连接

title: linq左连接 date: 2021-12-05 08:45:48 tags: C# Linq LINQ语言继承查询 近日项目实践中遇到这样的一个事情。在一个项目需求里存在这么一个情况&#xff0c;有以下一个主表与几个基础数据表组成一个大表&#xff0c;要求主表中的有的数据必须展示出来&#xff0c;但大…

ClickHouse左连接

A左连接B>S1区域 1、等价方式一 SELECT date, ts, country, province, city,ye_no FROM (SELECT date, ts, country, province, city,0 AS yes_no FROM DBa.tba WHERE (date today()-1) ) ALL LEFT JOIN (SELECT date, ts, country, province, city FROM DBb.tbb WH…

【Mysql】图解左、右、内与全连接

一、前言 使用学生表与成绩表来演示Mysql中的各种连接查找 学生表的建表语句如下&#xff1a; CREATE TABLE student(id int(11) NOT NULL AUTO_INCREMENT COMMENT 自增序号,st_id int(11) DEFAULT NULL COMMENT 学生id,st_name varchar(255) DEFAULT NULL COMMENT 学生姓名…