前言
本篇主要进行数据的读取与分析工作。
2.1 数据读取与分析
2.1.1 数据读取
首先进行数据读取,采用pandas库的read_csv将前100行读下来,以“\t”进行分隔,显示前五行。
第一列为系统生成的索引,第二列为文本的标签,第三列为文本经匿名处理后的结果,每一行代表一条文本。
2.1.2 数据分析
数据分析的三个目标:
- 赛题数据中,新闻文本的长度是多少?
- 赛题数据的类别分布是怎么样的,哪些类别比较多?
- 赛题数据中,字符分布是怎么样的?
2.1.2.1 句子长度分析
可以看出,文本最长为57921,最短为2,平均长度为907,句子长度相对较长。
2.1.2.2 新闻类别分布
文本一共13类,其中0类科技最多,13类星座最少。
2.1.2.3 字符分布统计
资料中提供的采用Counter的方法,需要将20w行的数据进行拼接,然后以空格进行分隔的方式导致占用很大内存,效率较低。
train_tfr = pd.read_csv('data/train_set.csv', sep='\t', chunksize=20000)
for chunk in train_tfr:
do_sometime(chunk) # 这里的chunk是DataFrame,和下面的操作一样,不过需要额外变量以整合所有分块的统计数据
经过计算发现,字符3750,字符900和字符648在20w新闻的覆盖率接近99%,很有可能是标点符号。
此外,一共出现了6869个词。
2.1.2.4 数据分析的结论
- 赛题中每个新闻包含的字符个数平均为1000个,也有些达到5w+;
- 赛题中新闻类别分布不均匀,文本共13类,科技类新闻样本量接近4w,星座类新闻样本量不到1k;
- 赛题总共包括6869个字符;
- 由于类别不均衡,会严重影响模型的精度,在后续过程中可能考虑对样本的分布进行处理。
2.2 Task2 作业
(1)假设前面说的字符3750,字符900和字符648是句子的标点符号,请分析赛题每篇新闻平均由多少个句子构成?
引入re库,将3750、900和648作为句子的分界,并计算每篇新闻由多少个句子构成。
可以看出,平均每篇新闻的句子数为80.8,最大的句子个数为3460,最小的句子由一句话构成。
(2)统计每类新闻中出现次数最多的字符。
train_df = pd.read_csv(r'Data/train_set.csv', sep='\t')
for i in range(0, 14):
df = train_df[train_df['label'] == i]['text']
biaodian = ['3750', '900', '648']
df_2 = df.apply(lambda x: [i for i in x.split(' ') if i not in biaodian])
all_lines = str(df_2.values.tolist())
word_count = Counter(all_lines.split(" ")) # 统计数字和出现次数
word_count = sorted(word_count.items(), key=lambda d: d[1], reverse=True) # 排序
print(i, word_count[0]) # 新闻类,次数最多的字符及次数