Task 2
第二个学习任务,分析数据。
分析目标:
①赛题数据中,新闻文本的长度是多少?
②赛题数据的类别分布是怎么样的,哪些类别比较多?
③赛题数据中,字符分布是怎么样的?
数据的长度分析
因为每个字符都以空格隔离,所以可以直接进行统计。
train_df['text_len'] = train_df['text'].apply(lambda x: len(x.split(' ')))
print(train_df['text_len'].describe())
输出结果:
count 1000.00000
mean 904.30900
std 929.32823
min 21.00000
25% 367.00000
50% 656.00000
75% 1102.50000
max 10018.00000
Name: text_len, dtype: float64
数据解释:
25%那一行表示:有25%的数据在367以下!
以此类推,有50%的文本长度在656以下,有75%的文本长度在1102.5以下.
这个数值可以由describe(percentiles=[.25, .5, .75])进行调整。
结论:
数据文本很长,每个文本平均由907个字符构成,最短的文本长度为2,最长的文本长度为57921。
根据文本长度我们绘制直方图进行观察:
import matplotlib.pyplot as plt
plt.hist(train_df['text_len'], bins=200)
plt.xlabel('Text char count')
plt.title("Histogram of char count")
plt.show()
由图可得:文本长度集中在0~2000个字符之间。
数据的类别发布
统计训练数据的label分布情况,并画出柱状图。
train_df['label'].value_counts().plot(kind='bar')
plt.title('News class count')
plt.xlabel("category")
plt.show()
由图可知,数据集的类别发布较为不均匀。训练集中科技类新闻最多,星座类新闻最少。
数据的字符发布
我们将所有文本进行拼接,然后对每个字符进行统计。
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])
输出结果:
3969
('3750', 37255)
('5556', 1)
结论:
共有3969个不同的字符,其中编码为‘3750’的字符出现次数最多,‘5556’出现次数最少。根据官方文档:字符3750、900、648在20w新闻覆盖率接近90%,很可能为标点符号。
总结
1.赛题中每个新闻包含的字符个数平均为1000个,还有一些新闻字符较长;
2.赛题中新闻类别分布不均匀,科技类新闻样本量接近4w,星座类新闻样本量不到1k;
3.赛题总共包括7000-8000个字符。
通过数据分析,我们还可以得出以下结论:
1.每个新闻平均字符个数较多,可能需要截断;
2.由于类别不均衡,会严重影响模型的精度。
作业
还没来得及做!难受!
1.假设字符3750,字符900和字符648是句子的标点符号,请分析赛题每篇新闻平均由多少个句子构成?
思路:日常生活中出现得最多的标点符号是:句号、逗号、分号。其中个人认为句号数量应该处于其他标点符号的中间,即字符900为句号,初步估计句子个数为:197653.
2.统计每类新闻中出现次数对多的字符?
还没来得及打代码尝试。
周末回来把缺的内容和自己的思考补上!今天不够时间学习,难受!