零基础入门NLP - 天池新闻文本分类Task2笔记

零基础入门NLP - 天池新闻文本分类

以下以Datawhale与天池举办的新闻文本分类这个NLP赛题做的NLP入门Task2笔记
赛题链接:https://tianchi.aliyun.com/competition/entrance/531810/introduction.

Task2:数据读取与数据分析

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

数据读取

赛题数据使用csv格式进行存储。因此可以直接用Pandas完成数据读取的操作。

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

这里的read_csv由三部分构成:
读取的文件路径,这里需要根据改成你本地的路径,可以使用相对路径或绝对路径;
分隔符sep,为每列分割的字符,设置为\t即可;
读取行数nrows,为此次读取文件的函数,是数值类型(由于数据集比较大,建议先设置为100)

train_df.head()

以下读取好的数据,是表格的形式。第一列为新闻的类别,第二列为新闻的字符。

ilabeltext
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…

数据分析

在读取完成数据集后,我们还可以对数据集进行数据分析的操作。虽然对于非结构数据并不需要做很多的数据分析,但通过数据分析还是可以找出一些规律的。

句子长度分析

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

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

在这里插入图片描述
下图将句子长度绘制了直方图,可见大部分句子的长度都几种在2000以内。

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

在这里插入图片描述

新闻类别分析

对数据集的类别进行分布统计,具体统计每类新闻的样本个数。

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

在这里插入图片描述

在数据集中标签的对应的关系如下:{‘科技’: 0, ‘股票’: 1, ‘体育’: 2, ‘娱乐’: 3, ‘时政’: 4, ‘社会’: 5, ‘教育’: 6, ‘财经’: 7, ‘家居’: 8, ‘游戏’: 9, ‘房产’: 10, ‘时尚’: 11, ‘彩票’: 12, ‘星座’: 13}

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

字符分布统计

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

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

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)

这里还可以根据字在每个句子的出现情况,反推出标点符号。下面代码统计了不同字符在句子中出现的次数,其中字符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])
# ('3750', 197997)
print(word_count[1])
# ('900', 197653)
print(word_count[2])
# ('648', 191975)

结论

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

赛题中每个新闻包含的字符个数平均为1000个,还有一些新闻字符较长;
赛题中新闻类别分布不均匀,科技类新闻样本量接近4w,星座类新闻样本量不到1k;
赛题总共包括7000-8000个字符;
通过数据分析,我们还可以得出以下结论:

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

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

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