NLP入门Task2 数据读取与数据分析(以新闻文本分类赛事进行学习)

在datawhale组织的天池大赛学习:入门NLP(以新闻文本分类赛事进行学习)。
本节内容主要以Pandas对数据进行读取和分析。

一、数据读取及查看

读取数据集并查看:

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline

df = pd.read_csv('input/train_set.csv', sep='\t')
df.head(10)

>>> Output:
> 	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...
3	2	7159 948 4866 2109 5520 2490 211 3956 5520 549...
4	3	3646 3055 3055 2490 4659 6065 3370 5814 2465 5...
5	9	3819 4525 1129 6725 6485 2109 3800 5264 1006 4...
6	3	307 4780 6811 1580 7539 5886 5486 3433 6644 58...
7	10	26 4270 1866 5977 3523 3764 4464 3659 4853 517...
8	12	2708 2218 5915 4559 886 1241 4819 314 4261 166...
9	3	3654 531 1348 29 4553 6722 1474 5099 7541 307 ...
  1. %matplotlib inline 显示做图的代码,在当前编辑框下方即显示所画的图
  2. pd.read_csv的参数,第一个是数据集位置,sep=’\t’,表示以\t为分隔符,把数据分开
  3. dataFrame.head默认显示前五行,括号内数字表示显示多少行数据
df['text_len'] = df['text'].apply(lambda x: len(x.split(' ')))
df['text_len'].describe()

>>> Output:
>count    200000.000000
mean        907.207110
std         996.029036
min           2.000000
25%         374.000000
50%         676.000000
75%        1131.000000
max       57921.000000
Name: text_len, dtype: float64

上述分析可知:

  1. 最长的句子字符数57921个
  2. 最短的句子字符数2个
  3. 平均句子长度在907个字符

二、数据分析

1. 句子长度分析

df['text_len'].plot(legend=True, figsize=(18,6))
plt.title('text_len of all data')
plt.xlabel('row number')
plt.ylabel('len of text')

在这里插入图片描述
上图分析得知:数据量很大,图中过于密集,所以我们制作一个统计图如:

plt.figure(figsize=(18,6), dpi=300)   # 设置图片的长宽
plt.xticks(np.arange(0,60000,2000))   # 设置x轴的刻度
_ = plt.hist(df['text_len'], bins=20000)  # 这个参数指定bin(箱子)的个数,也就是总共有几条条状图

在这里插入图片描述

由上图分析,可观察到,大部分数据集中在2000以内。进一步分析得到如下:

plt.figure(figsize=(18,6), dpi=300)   # 设置图片的长宽
plt.xticks(np.arange(0,5000,200))   # 设置x轴的刻度
_ = plt.hist(df[df['text_len']<=5000]['text_len'], bins=2000)  # 这个参数指定bin(箱子)的个数,也就是总共有几条条状图

在这里插入图片描述
由上述分析,得出结论:
大部分字符数集中在1500以内,也就是说句子字符长度大部分在1500个字符内,不会太长。
和上一个图分析结果差不多,但下面这个图,更清晰直观一点。

2. 新闻类别分析

X = df['label'].value_counts()
plt.figure(figsize=(12,5))
X.plot(kind='bar')
plt.title('label of all data')
plt.xlabel('type of news')
plt.ylabel('number of news in type')
for i in X:
    plt.text(list(X).index(i),i,i+10)

在这里插入图片描述
如上图:
在数据集中标签的对应的关系如下:{‘科技’: 0, ‘股票’: 1, ‘体育’: 2, ‘娱乐’: 3, ‘时政’: 4, ‘社会’: 5, ‘教育’: 6, ‘财经’: 7, ‘家居’: 8, ‘游戏’: 9, ‘房产’: 10, ‘时尚’: 11, ‘彩票’: 12, ‘星座’: 13}
由上图可知,科技类新闻占比最多,有38928条,星座类新闻占比最低,只有918条。高低差距非常大。

3. 字符数量统计

由于给予的数据集中,数据为一条一条的,所以我们先将所有数据组合到一起,然后一次计算所有数据中字符的数量信息。

from collections import Counter
all_lines = ' '.join(list(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])

>>>Output:
> 6869
('3750', 7482224)
('3133', 1)
  1. from collections import Counter是python中常用的计算器库,详见:from collections import Counter计数器
  2. 第二句代码,将text部分转换成list形式,然后list里面的通过join方式组合在一起,中间以空格(实验中是空格隔开,也可以用其他符号,以具体情况定)隔开
    如:list=[[1 2 3], [4 5 6], [2 4 1]]. (这里的list和实验中经转换后的list形式一致)
    ’ '.join(list)处理完后结果是:[1 2 3 4 5 6 2 4 1]这种形式。
  3. 第三句代码,通过split对上述结果进行分割,分隔符为空格,通过Counter计数。
  4. 第四句代码,按照数量从大到小进行排序。
  5. 后三句输出。

结论:由上述结果得知,在训练集中总共包括6869个字,其中编号3750的字出现的次数最多,编号3133的字出现的次数最少。

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

df['text_unique'] = df['text'].apply(lambda x: ' '.join(list(set(x.split(' ')))))   
all_lines = ' '.join(list(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])

>>>Output:
('3750', 197997)
('900', 197653)
('648', 191975)

print(word_count[0][1]/200000)
print(word_count[1][1]/200000)
print(word_count[2][1]/200000)

>>>Output:
>0.989985
0.988265
0.959875

上述三个占比分别为:0.99/0.99/0.96。

三、结论

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

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

四、作业

待完成。。。

©️2020 CSDN 皮肤主题: 1024 设计师:上身试试 返回首页