目录

  • 赛题介绍
  • 1 导入工具包
  • 2 读取数据
  • 3 数据集样例查看
  • 4 查看数据类型和数据大小
  • 5 查看缺失值
  • 6 观察数据分布
    • 6.1 查看Label分布
    • 6.2 查看句子长度分布
    • 6.3 句子中字符数量分布
  • 7 总结分析

赛题介绍

零基础入门NLP - 新闻文本分类
赛题以新闻数据为赛题数据,数据集报名后可见并可下载。赛题数据为新闻文本,并按照字符级别进行匿名处理。整合划分出14个候选分类类别:财经、彩票、房产、股票、家居、教育、科技、社会、时尚、时政、体育、星座、游戏、娱乐的文本数据。
赛题数据由以下几个部分构成:训练集20w条样本,测试集A包括5w条样本,测试集B包括5w条样本。为了预防选手人工标注测试集的情况,我们将比赛数据的文本按照字符级别进行了匿名处理。处理后的赛题训练数据如下:

label text
6 57 44 66 56 2 3 3 37 5 41 9 57 44 47 45 33 13 63 58 31 17 47 0 1 1 69 26 60 62 15 21 12 49 18 38 20 50 23 57 44 45 33 25 28 47 22 52 35 30 14 24 69 54 7 48 19 11 51 16 43 26 34 53 27 64 8 4 42 36 46 65 69 29 39 15 37 57 44 45 33 69 54 7 25 40 35 30 66 56 47 55 69 61 10 60 42 36 46 65 37 5 41 32 67 6 59 47 0 1 1 68

在数据集中标签的对应的关系如下:

{‘科技’: 0, ‘股票’: 1, ‘体育’: 2, ‘娱乐’: 3, ‘时政’: 4, ‘社会’: 5, ‘教育’: 6, ‘财经’: 7, ‘家居’: 8, ‘游戏’: 9, ‘房产’: 10, ‘时尚’: 11, ‘彩票’: 12, ‘星座’: 13}

1 导入工具包

import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
import seaborn as sns
from scipy import statsimport warnings
warnings.filterwarnings("ignore")

2 读取数据

test_data = pd.read_csv('./test_a.csv',sep='\t', encoding='UTF-8')
train_data = pd.read_csv('./train_set.csv',sep='\t', encoding='UTF-8')

3 数据集样例查看

查看数据集的前几行数据,了解数据集、测试集的字段信息

print(train_data.head(3))

label text
0 2 2967 6758 339 2021 1854 3731 4109 3792 4149 15…
1 11 4464 486 6352 5619 2465 4802 1452 3137 5778 54…
2 3 7346 4068 5074 3747 5681 6093 1777 2226 7354 6…

注意:第一行数据是序号,第二行的才是label,第三行是text

print(test_data.head(3))

text
0 5399 3117 1070 4321 4568 2621 5466 3772 4516 2…
1 2491 4109 1757 7539 648 3695 3038 4490 23 7019…
2 2673 5076 6835 2835 5948 5677 3247 4124 2465 5…

注意:测试集是没有label的,第一行的0-2是序号

4 查看数据类型和数据大小

(1)查看测试集信息数据

print(test_data.info())

<class ‘pandas.core.frame.DataFrame’>
RangeIndex: 50000 entries, 0 to 49999
Data columns (total 1 columns):
Column Non-Null Count Dtype
0 text 50000 non-null object
dtypes: object(1)
memory usage: 390.8+ KB
None

可以看到有50000条数据,其中text类型是object类型。数据大小是390.8KB
(2)查看 数据集信息数据

print(train_data.info())

<class ‘pandas.core.frame.DataFrame’>
RangeIndex: 200000 entries, 0 to 199999
Data columns (total 2 columns):
Column Non-Null Count Dtype
0 label 200000 non-null int64
1 text 200000 non-null object
dtypes: int64(1), object(1)
memory usage: 3.1+ MB
None

可以看到有200000条数据,其中label类型是int64,text类型是object类型。数据大小是3.1MB

5 查看缺失值

(1)计算数据集中label列的缺失率和缺失了label值的行数

# 计算label这一列的缺失率
print((train_data.shape[0]-train_data['label'].count())/train_data.shape[0])
# 计算缺失label值的行数
print(train_data[train_data['label'].isna()].count())

0.0
label 0
text 0
dtype: int64

注意:label是有值=0的,所以不能像以下的text去==0 去判断该行是否为空
可以看到label缺失率为0,也没有缺失的行数

(2)计算数据集中text列的缺失率和缺失了text值的行数

# 计算text这一列的缺失率
print((train_data.shape[0]-train_data['text'].count())/train_data.shape[0])
# 计算缺失text值的行数
print(train_data[train_data['text'].isna() | (train_data['text']==0)].count())

0.0
label 0
text 0
dtype: int64

可以看到text缺失率为0,也没有缺失的行数

6 观察数据分布

6.1 查看Label分布

(1)方法一:jupyter notebook下

import numpy as np
import matplotlib
from matplotlib import pylab, mlab, pyplot
plt = pyplot
import pandas as pdtrain_data = pd.read_csv('./train_set.csv',sep='\t', encoding='UTF-8')
train_data['label'].value_counts().plot(kind='bar')
plt.title('News class count')
plt.xlabel("category")
Text(0.5, 0, 'category')

(2)方法二:VScode下使用pandas.core.series.Series 的方法

import pandas as pd
import matplotlib.pyplot as plttrain_data['label'].value_counts().plot(kind='bar')
plt.title('News class count')
plt.xlabel("category")
plt.text(0.5, 0, 'category')
plt.show()


(3)方法三:VScode下手写计数统计

import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
import seaborn as sns
from scipy import statsimport warnings
warnings.filterwarnings("ignore")
# 读取文件
test_data = pd.read_csv('./test_a.csv',sep='\t', encoding='UTF-8')
train_data = pd.read_csv('./train_set.csv',sep='\t', encoding='UTF-8')# 统计label的各种类别数量
distribute_label = {0:0,1:0,2:0,3:0,4:0,5:0,6:0,7:0,8:0,9:0,10:0,11:0,12:0,13:0}
for i, v in train_data['label'].items():if distribute_label.get(v)==None:distribute_label[v] = 1else:distribute_label[v] =distribute_label.get(v)+1label_list = distribute_label.keys()
num_list1 = distribute_label.values()      # 纵坐标值1
x = range(len(num_list1))
"""
绘制条形图
left:长条形中点横坐标
height:长条形高度
width:长条形宽度,默认值0.8
label:为后面设置legend准备
"""
rects1 = plt.bar(x,height=num_list1, width=0.4, alpha=0.8, color='red', label="labelnumber")
plt.ylim(0, 50000)     # y轴取值范围
plt.ylabel("number")
"""
设置x轴刻度显示值
"""
plt.xticks([index + 0.2 for index in x], label_list)
plt.xlabel("label")
plt.title("label-distribution")
plt.legend()     # 设置题注
# 编辑文本
for rect in rects1:height = rect.get_height()plt.text(rect.get_x() + rect.get_width() / 2, height+1, str(height), ha="center", va="bottom")
plt.show()

从图中可以看到数据的label分布很不均匀,这对模型准确率的是有非常大的影响。后面的数据预处理必须要通过相应的方法处理的。

6.2 查看句子长度分布

train_data['text_len'] = train_data['text'].apply(lambda x: len(x.split(' ')))
print(train_data['text_len'].describe())
plt.hist(train_data['text_len'], bins=200) #使用了%pylab,可以直接使用'plt'
plt.xlabel('sentence-length')
plt.ylabel('category-number')
# plt.text(0.5, 1.0, '')
plt.show()

count 200000.000000
mean 907.207110
std 996.029036
min 2.000000
25% 374.000000
50% 676.000000
75% 1131.000000
max 57921.000000


从输出的数据可以看到句子的平均长度907,最短的只有2。从图中可以看出,句子长度大多数分布在2000以下

6.3 句子中字符数量分布

from collections import Counter
all_lines = ' '.join(list(train_data['text']))
word_count = Counter(all_lines.split(" "))
word_count = sorted(word_count.items(), key=lambda d:d[1], reverse = True)print(len(word_count))
print(word_count[0])
print(word_count[-1])

6869
(‘3750’, 7482224)
(‘3133’, 1)

从统计结果中可以看出,在训练集中总共包括6869个不同字,其中编号3750的字出现的次数最多,编号3133的字出现的次数最少。

这里还可以根据字在每个句子的出现情况,反推出标点符号。下面代码统计了不同字符在句子中出现的次数,其中字符3750,字符900和字符648在20w新闻的覆盖率接近99%,很有可能是标点符号。

思考:如果是标点符号,这对模型的准确率是有影响的,是否应该去除去提高模型的准确率

7 总结分析

(1)总结

  • 数据集中每个新闻包含的字符个数平均为1000个,还有一些新闻字符较长;
  • 数据集中新闻类别分布不均匀,科技类新闻样本量接近4w,星座类新闻样本量不到1k;
  • 数据集中总共包括7000-8000个字符;
  • 数据集中存在高频的字符,有可能是标点符号

(2)分析

  • 每个新闻平均字符个数较多,可能需要截断
  • 由于类别不均衡,会严重影响模型的精度,需要对数据集预处理,使得类别尽量均衡
  • 存在高频的字符,是标点符号,可能需要剔除

【NLP-新闻文本分类】1 数据分析和探索相关推荐

  1. Task01——零基础入门NLP - 新闻文本分类之赛题理解

    本篇目标 首先本篇文章会对赛题进行介绍以及个人对赛题的理解,带大家接触NLP的预处理.模型构建和模型训练等知识点. 赛题介绍 赛题名称:零基础入门NLP - 新闻文本分类 赛题任务:赛题以自然语言处理 ...

  2. 零基础入门NLP - 新闻文本分类

    本文是对阿里云新人竞赛中的"零基础入门NLP - 新闻文本分类"解体过程进行的记录,目前仅使用了textCNN模型进行预测,后续还会考虑使用LSTM进行对比. 赛题数据 赛题以新闻 ...

  3. 零基础入门NLP - 新闻文本分类,正式赛第一名方案分享

    零基础入门NLP - 新闻文本分类,正式赛第一名方案分享:https://mp.weixin.qq.com/s/7WpZUqdlItBToLYuRLm44g

  4. 【初学者入门】零基础入门NLP - 新闻文本分类

    序言 从今天开始入门学习NLP,虽然有点晚,但是我觉得任何时候都值得开始,尤其是面对你去感兴趣的事情.今天的任务是 [零基础入门NLP - 新闻文本分类],这是天池大赛中的入门级算法比赛,入口链接请自 ...

  5. 天池零基础入门NLP - 新闻文本分类Top1方案的bert4torch复现

    天池有些长期比赛可以练习玩玩(还可以继续提交),于是试了下简单的新闻文本分类任务,Top1的解决方案思路是"预训练+fgm+交叉验证模型融合",代码是基于bert4keras的,本 ...

  6. NLP(新闻文本分类)——数据读取与数据分析

    初始数据 import pandas as pd df_train = pd.read_csv('E:/python-project/deep-learning/datawhale/nlp/news- ...

  7. 阿里云天池 零基础入门NLP - 新闻文本分类 2种做法,F1=0.87

    problem 1.赛题理解 数据集: 在NLP_data_list_0715.csv中,有三个链接. 分别可以下载训练集,测试集A,测试样例. f1_score介绍: F1分数(F1-score)是 ...

  8. 【学习笔记】零基础入门NLP - 新闻文本分类实战

    赛题理解   首先要理解赛题的背景及描述--赛题以新闻数据为赛题数据,数据集报名后可见并可下载.赛题数据为新闻文本,并按照字符级别进行匿名处理.整合划分出14个候选分类类别:财经.彩票.房产.股票.家 ...

  9. 【天池学习赛】零基础入门NLP - 新闻文本分类

    一.赛题描述 赛题数据为新闻文本,并按照字符级别进行匿名处理.整合划分出14个候选分类类别:财经.彩票.房产.股票.家居.教育.科技.社会.时尚.时政.体育.星座.游戏.娱乐的文本数据. 赛题任务:赛 ...

  10. NLP - 新闻文本分类-baseline

    本次新人赛是Datawhale与天池联合发起的0基础入门系列赛事第三场,赛题以自然语言处理为背景,要求选手根据新闻文本字符对新闻的类别进行分类,这是一个经典文本分类问题.通过这道赛题可以引导大家走入自 ...

最新文章

  1. 服务器支持热部署吗,热部署
  2. C语言程序设计之标准库快速排序qsort函数用法示例
  3. 多核学习在图像分类中的应用
  4. MySQL读写分离一主多从实现
  5. python自带的idle优点_python新手入门使用自带的IDLE、用pycharm还是visual studio ?
  6. mysql timestamp utc_MySQL 5.7 时间显示修改(log_timestamps UTC)
  7. Java面向对象部分小结
  8. linux 权限之所有者所属组
  9. 阿里云 wdcp面板后台控制安装
  10. 《完美软件》读书笔记9:良好测试的要素
  11. Java 高级算法——数组中查询重复的数字之二
  12. 机器学习算法——聚类3(k均值算法)
  13. HDU 6080 2017百度之星程序设计大赛 - 资格赛
  14. 手机端,网站页面被浏览器转码
  15. Deep Learning Hierarchical Representations for Image Steganalysis【Ye-Net:图像隐写分析的深度学习层次表示】
  16. 网页防篡改技术发展趋势
  17. 你真的了解整流桥的结构和原理吗?
  18. java使用scanner.next方式接收键盘输入
  19. 破解完全入门篇,第七章-寻找软件的注册码
  20. java计算机毕业设计江智能股票推荐系统MyBatis+系统+LW文档+源码+调试部署

热门文章

  1. java数组中删除元素或一个数组元素
  2. PM的自我修养——QQ2014forAndroid客户端简要分析(一)
  3. 2014(马年)学年总结
  4. 小黑记事本怎样设置html,小黑记事本如何使用便签 设置便签的方法
  5. 自考英语二之从阅读开始--2020-11-15
  6. 什么是Web server
  7. 6000php相当于,jquery – Javascript中的PMT
  8. python安装包版本对应:opencv-python,scikit-learn,matplotlib,numpy,scipy(版本对应,paddlex官方提供)
  9. ios备忘录下载安卓版_PanDownload 安卓手机版,解决百度网盘下载速度慢
  10. 号外:百度又出自媒体!百家号6月16即将上线