Task02-数据读取与数据分析
- 数据读取
- 数据分析
- 句子长度分析
- 新闻类别分布
- 字符分布
- 结论
本次学习主要内容是:先用pandas读取数据,然后对数据进行简单的描述性统计。
数据读取
训练集数据共20w条左右,下载解压后的格式即为csv格式,因此可以直接用pandas进行数据读取。
import pandas as pd
train_df = pd.read_csv('train_set.csv', sep='\t') #因为训练集有20w条,数据太大,也可以只选择读取前100条:nrows=100
train_df.head(7) #显示前7行数据
结果如下:
其中label列为新闻类别,text列为新闻字符。
数据分析
we want to know:
- 新闻文本有多长?
- 新闻类别分布如何?哪类新闻比较多?
- 新闻字符分布如何?
句子长度分析
%pylab inline
train_df['text_len'] = train_df['text'].apply(lambda x: len(x.split(' '))) #每行句子的字符使用空格进行隔开
print(train_df['text_len'].describe())
结果如下:
绘制句子长度直方图:
_ = plt.hist(train_df['text_len'], bins=200)
plt.xlabel('Text char count')
plt.title("Histogram of char count")
结果如下:
可见大部分句子长度都在2000以内。
新闻类别分布
train_df['label'].value_counts().plot(kind='bar') #统计每类新闻的样本个数并绘制直方图
plt.title('News class count')
plt.xlabel("category")
结果如下:
字符分布
统计每个字符出现的次数,首先可以将训练集中所有的句子进行拼接而划分为字符,然后统计每个字符的个数。
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)) # 6869
print(word_count[0]) # ('3750', 7482224)
print(word_count[-1]) # ('3133', 1)
训练集中共包括6869个字符,其中编号为3750的字符出现次数最多,编号3133的字符出现次数最少。由此可大致反推出覆盖率最多的字符可能就是标点符号。
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]) # ('3750', 197997)
print(word_count[1]) # ('900', 197653)
print(word_count[2]) # ('648', 191975)
结论
- 训练集中每个新闻平均包含的字符个数为1000;
- 训练集中新闻类别分布不均匀,科技类新闻样本量接近4w,而星座类新闻样本量不到1k;
- 训练集共包含7000-8000个字符。
通过数据分析我们还可以得出: - 每个新闻平均字符个数较多,可能需要截断;
- 由于类别不均匀,可能会严重影响模型的精度。