天池新闻文本分类-Task02- 数据读取与数据分析


主要内容为数据读取和数据分析:使用Pandas库完成数据读取操作,并对赛题数据进行分析

学习目标

  • 1.学习使用Pandas读取赛题数据
  • 2.分析赛题数据的分布规律

数据读取

import pandas as pd
train_df = pd.read_csv('datalab/72510/train_set.csv', sep='\t', nrows=100)

pandas模块中的read_csv在上述代码中有如下三部分组成:

  • ’ '中的内容为读取的文件路径,可以使用相对路径或绝对路径
  • sep为分隔符,即每列分割的字符
  • nrows为读取的行数

查看train_df的前5行数据:
第一列为新闻的类别,第二列为新闻的字符

train_df.head()
labeltext
022967 6758 339 2021 1854 3731 4109 3792 4149 15…
1114464 486 6352 5619 2465 4802 1452 3137 5778 54…
237346 4068 5074 3747 5681 6093 1777 2226 7354 6…
327159 948 4866 2109 5520 2490 211 3956 5520 549…
433646 3055 3055 2490 4659 6065 3370 5814 2465 5.

数据分析

对数据集进行读取完之后需要进行分析,以找到数据集中隐藏的规律
通过数据分析希望得出以下结论:

  • 赛题数据中,新闻文本的长度是多少?
  • 赛题数据的类别分布是怎么样的,哪些类别比较多?
  • 赛题数据中,字符分布是怎么样的?

句子长度分析

在赛题数据中每行句子的字符使用空格进行隔开,所以可以直接统计单词的个数来得到每个句子的长度。代码如下:

train_df['text_len'] = train_df['text'].apply(lambda x: len(x.split(' ')))
print(train_df['text_len'].describe())

代码解析

  • lambda匿名函数
    匿名函数中对text字段按空格进行分割
    python lambda函数的使用:
    在这里插入图片描述

  • pandas describe:
    其物理意义在于观察这一系列数据的范围。大小、波动趋势等等,便于判断后续对 数据采取哪类模型更合适。

DataFrame.describe(percentiles=None, include=None, exclude=None)
  • apply函数
DataFrame.apply(func, axis=0, broadcast=False, raw=False, reduce=None, args=(), **kwds)

该函数最有用的是第一个参数,这个参数是函数,相当于C/C++的函数指针。
这个函数需要自己实现,函数的传入参数根据axis来定,比如axis = 1,就会把一行数据作为Series的数据结构传入给自己实现的函数中,我们在函数中实现对Series不同属性之间的计算,返回一个结果,则apply函数会自动遍历每一行DataFrame的数据,最后将所有结果组合成一个Series数据结构并返回。

输出结果

count     100.000000
mean      872.320000
std       923.138191
min        64.000000
25%       359.500000
50%       598.000000
75%      1058.000000
max      7125.000000
Name: text_len, dtype: float64

下图将句子长度绘制了直方图

import matplotlib.pyplot as plt
_ = plt.hist(train_df['text_len'], bins=200)
plt.xlabel('Text char count')
plt.title("Histogram of char count")

在这里插入图片描述
上图显示略有问题

  • matplotlib.plot的坐标轴刻度间隔以及刻度范围
from matplotlib.pyplot import MultipleLocator
import matplotlib.pyplot as plt
_ = plt.hist(train_df['text_len'], bins=2000)
plt.xlabel('Text char count')
plt.title("Histogram of char count")
#把x轴的刻度范围设置为0到10000
plt.xlim(0,10000)

在这里插入图片描述
可见大部分句子的长度都几种在2000以内

新闻类别分布

接下来可以对数据集的类别进行分布统计,具体统计每类新闻的样本个数

train_df['label'].value_counts().plot(kind='bar')
plt.title('News class count')
plt.xlabel("category")

在这里插入图片描述
在数据集中标签的对应的关系如下:

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

从统计结果可以看出,赛题的数据集类别分布存在较为不均匀的情况。在训练集中(前100数据)股票类新闻最多,其次是体育类新闻,最少的新闻是星座新闻。

字符分布统计

接下来可以统计每个字符出现的次数,首先可以将训练集中所有的句子进行拼接进而划分为字符,并统计每个字符的个数

from collections import Counter
all_lines = ' '.join(list(train_df['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])
2405
('3750', 3702)
('5034', 1)

从统计结果中可以看出,在训练集中(前100)总共包括2405个字,其中编号3750的字出现的次数最多,编号5034的字出现的次数最少。

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

from collections import Counter
train_df['text_unique'] = train_df['text'].apply(lambda x: ' '.join(list(set(x.split(' ')))))
all_lines = ' '.join(list(train_df['text_unique']))
word_count = Counter(all_lines.split(" "))
word_count = sorted(word_count.items(), key=lambda d:int(d[1]), reverse = True)

print(word_count[0])

print(word_count[1])

print(word_count[2])
('3750', 99)
('900', 99)
('648', 96)

数据分析结论

通过上述分析我们可以得出以下结论:

  • 赛题中每个新闻包含的字符个数平均为1000个,还有一些新闻字符较长;
  • 赛题中新闻类别分布不均匀,科技类新闻样本量接近4w,星座类新闻样本量不到1k;
  • 赛题总共包括7000-8000个字符;

通过数据分析,我们还可以得出以下结论:

  • 每个新闻平均字符个数较多,可能需要截断;

  • 由于类别不均衡,会严重影响模型的精度;

小结

本章对赛题数据进行读取,并新闻句子长度、类别和字符进行了可视化分析。

作业

  1. 假设字符3750,字符900和字符648是句子的标点符号,请分析赛题每篇新闻平均由多少个句子构成?
  2. 统计每类新闻中出现次数对多的字符
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值