中文文本分类-新闻分类[数据挖掘]
对新闻文本(10类)进行文本分类,通过准确率、召回率、 f1-score 等指标对分类结果进行分析。
python版本:python 3.6
分类方法:朴素贝叶斯
需导入的相关库
import os
import time
import numpy as np
import pandas as pd
import jieba
from jieba import analyse
from sklearn.utils import shuffle
from sklearn.model_selection import train_test_split
from sklearn.feature_extraction.text import CountVectorizer,TfidfVectorizer #词集转换成向量
from sklearn.naive_bayes import MultinomialNB #朴素贝叶斯多分类
from sklearn.metrics import classification_report
import gensim #自然语言处理库
from gensim import corpora,models,similarities
上述有些库源 在windows下好像与python3.7版本会出现版本不兼容的问题,我在linux下使用3.7正常,windows下出现“DLL load failed”,所以换用3.6
对数据源选取数据规模
大家可以选择网上现有的数据源,然后选出自己需要数量的数据。我的数据是我自行爬取的,所以在爬取的时候就做了相应的数据预处理。所以我选取的数据是已经去空行、去重去掉一些乱七八糟的信息之后的数据。
1、读取数据源
#读取数据源,注释掉的是拼接数据的部分,有需要的可以参考
def con_data():# df1 = pd.read_csv('chinanews00.csv',names=['category','theme','URL','content'])# df2 = pd.read_csv('chinanews11.csv',names=['category','theme','URL','content'])# data = pd.concat([df1,df2],axis=0,ignore_index=True) #拼接表格data = pd.read_csv('chinanews.csv',names=['category','theme','URL','content'])df = data.groupby('category').count()#展示数据规模print(df)# print(data.shape)return data
2、按类别,分别选出前n条
实验之前做的是100w条数据,但是在这里为了重复方便,我将每类数据缩减为1000条,这样比较快~
#分组选行
def group(data,amount,file_path):df = data.groupby('category').head(amount)df.to_csv(file_path,mode='a',header=None, index=False, encoding="utf-8-sig")
于是就有了目标数据 eg: test.csv
文本分类
1、读入待分类数据
def read_file():data = pd.read_csv('test.csv',names=['category','theme','URL','content'])df = data.groupby('category').count()#展示数据规模print(df)return data
数据规模:
样本长这样:
2、对数据进行切割
这一步可有可无,主要是因为有的新闻文本篇幅很长很长,有的又很短,后面会造成词向量的长短不一。所以理论上来讲,是需要去掉过长或过短的文本内容,使得新闻文本的字数大致保持在一个范围内。不剔除的话,会降低分类的准确率。
3、jieba分词并去停用词
def separate_words(data):content = data.content.values.tolist() #将文本内容转换为list格式#读入停用词表stopwords = pd.read_csv("stopwords.txt",index_col=False,sep="\t",quoting=3,names=['stopword'], encoding='utf-8') #liststopwords = stopwords.stopword.values.tolist()print("正在分词,请耐心等候......")contents_clean = []all_words = []for line in content:current_segment = jieba.lcut(line) #jieba分词current_segment = [x.strip() for x in current_segment if x.strip()!=''] #去掉分词后出现的大量空字符串if len(current_segment) > 1 and current_segment != "\r\n":line_clean = []for word in current_segment:if word in stopwords:continueline_clean.append(word)all_words.append(str(word))contents_clean.append(line_clean) print('------------分词完成-----------')return contents_clean, all_words
结果是这样的:
其中,all_words可以用来统计某些词出现的频率,依据这个来修改停用词表stopwords。下图是我按照自己的词频统计,去掉了一些不合理的高频词后出现的结果。
4、标签转换
中文标签改为数字标签,便于分类
转换之前的标签:
#标签转换label_mappping = {'汽车':1,'财经':2, '法治':3, '社会':4, '体育':5, '国际':6, '文化':7, '军事':8, '娱乐':9, '台湾':0}df_train["label"] = df_train["label"].map(label_mappping)print(df_train.head())print("--------------------------------------3------------------------------------------")
转换之后的结果:
5、切分数据集
按1:1切分
#切分数据集x_train,x_test,y_train,y_test = train_test_split(df_train["contents_clean"].values,df_train["label"].values,test_size=0.5)
6、开始训练
因为现在的数据内容是以‘,’分隔开的,所以需要去掉将词与词之间用‘ ’连接起来。
def format_transform(x): #x是数据集(训练集或者测试集)words =[]for line_index in range(len(x)):try:words.append(" ".join(x[line_index]))except:print("数据格式有问题")return words
#训练words_train = format_transform(x_train) vectorizer = TfidfVectorizer(analyzer='word', max_features=4000,ngram_range=(1, 3),lowercase = False)vectorizer.fit(words_train)#转为向量格式classifier = MultinomialNB()classifier.fit(vectorizer.transform(words_train), y_train)
7、测试,并查看相关结果
words_test = format_transform(x_test)score = classifier.score(vectorizer.transform(words_test), y_test)print("----------------------------------分类结果报告-----------------------------------------")print("分类准确率:" + str(score))print("训练时间:" + str(round((end_1-start_1), 2)) + '秒')print("测试时间:" + str(round((end_2-start_2), 2)) + '秒')y_predict=classifier.predict(vectorizer.transform(words_test))print(classification_report(y_test,y_predict))
出来的结果是这样的:
emmmm,这个分类结果不是很理想。。。可以通过调参提高分类结果准确率。
中文文本分类-新闻分类[数据挖掘]相关推荐
- python文本数据分析-新闻分类任务
python文本数据分析-新闻分类任务 文本分析 文本数据 停用词:1.语料中大量出现:2.没啥大用:3.留着过年嘛?所以根据停用词表进行筛选,去掉这些停用词. Tf-idf:关键词提取 <中国 ...
- 中文文本分类的java包_java实现中文文本分类
基于libsvm 的中文文本分类原型支持向量机(Support Vector M... 基于SSPP-KELM多标签文本分类算法的实现_电子/电路_工程科技_专业资料.文本数据分类后,根据类标签的个数 ...
- 中文文本情感分类及情感分析资源大全
摘要:20世纪初以来,文本的情感分析在自然语言处理领域成为了研究的热点,吸引了众多学者越来越多的关注.对于中文文本的情感倾向性研究在这样一大环境下也得到了显著的发展.本文主要是基于机器学习方法的中文文 ...
- 如何用 Python 和循环神经网络(RNN)做中文文本分类?
本文为你展示,如何使用 fasttext 词嵌入预训练模型和循环神经网络(RNN), 在 Keras 深度学习框架上对中文评论信息进行情感分类. 疑问 回顾一下,之前咱们讲了很多关于中文文本分类的内容 ...
- 自然语言处理课程作业 中文文本情感分类
摘要:20世纪初以来,文本的情感分析在自然语言处理领域成为了研究的热点,吸引了众多学者越来越多的关注.对于中文文本的情感倾向性研究在这样一大环境下也得到了显著的发展.本文主要是基于机器学习方法的中文文 ...
- Pytorch实战——基于RNN的新闻分类
目录 一.项目介绍 二.基于RNN的新闻分类 Step1 加载数据集 Step2 分词和构建词汇表 Step3 构建数据加载器 dataloader Step4 定义神经网络模型 Step5 定义模型 ...
- 数学之美 | 余弦定理和新闻分类
文章目录 概述 余弦定理 新闻分类 数字化 计算相似性 案例 概述 三角函数的美在生活中可以说是无处不在,下面就给大家介绍一下计算机用余弦定理对新闻进行自动分类的基本方法.感兴趣的小伙伴可以了解一下, ...
- 中文新闻分类 数据集_NLP-新闻文本分类实战
一.赛题理解 赛题名称:零基础入门NLP之新闻文本分类 赛题目标:通过这道赛题可以引导大家走入自然语言处理的世界,带大家接触NLP的预处理.模型构建和模型训练等知识点. 赛题任务:赛题以自然语言处理为 ...
- 【毕业设计】深度学习中文文本分类(新闻分类 情感分类 垃圾邮件分类)
文章目录 0 简介 1 前言 2 中文文本分类 3 数据集准备 4 经典机器学习方法 4.1 分词.去停用词 4.2 文本向量化 tf-idf 4.3 构建训练和测试数据 4.4 训练分类器 4.4. ...
- 使用python和sklearn的中文文本多分类实战开发
文本分类一般可以分为二分类.多分类.多标签分类三种情况,二分类是指将一组文本分成两个类(0或1),比较常见的应用如垃圾邮件分类.电商网站的用户评价数据的正负面分类等,多分类是指将文本分成若干个类中的某 ...
最新文章
- 使用spring aop实现业务层mysql 读写分离
- APUE学习笔记——第十章信号中10.15节例程的运行结果与书本里的不一样
- 8、D8: Default interface methods are only supported starting with Android N (--min-api 24): void
- npm 安装报错 rollbackFailedOptional verb npm-session无法解决?
- Entity framework WhereInExtension
- springcloud-05-ribbon中不使用eureka
- linux下安装配置oracle
- JAVA获得天气json数据的方法,获取从天气预报接口返回回来的json数据
- linux定时监控端口并重新启动shell脚本命令
- 嵌入式电路设计(soc底板电路设计)
- 项目启动过后,停在了加载mapper xml文件过程中
- top结合jstack处理线上cpu飙升问题
- 如何利用VUE动态添加class样式
- c# asp.net页面传值方法总结
- 【BZOJ1703】【usaco2007margold】ranking the cows 奶牛的魅力排名
- 2018年中国区块链产业发展白皮书(附PDF下载)
- 找回 Windows 丢失的拨号密码
- Windows/Ubuntu搭建RTMP服务器+OBS推流+VLC拉流
- Netbeans使用问题整理
- 武汉大花岭科目二考试说明