WHCSRL 技术网

【阿里云天池算法挑战赛】零基础入门NLP - 新闻文本分类-Day2-数据读取与数据分析

 一、赛题解析

【阿里云天池算法挑战赛】零基础入门NLP - 新闻文本分类-Day1-赛题理解_202xxx的博客-CSDN博客

二、数据读取

下载完成数据后推荐使用anaconda,python3.8进行数据读取与模型训练

首先安装需要用到的模块包:

pip版本:

pip添加国内源,增加下载速度_202xxx的博客-CSDN博客

pip install pandas -i https://pypi.tuna.tsinghua.edu.cn/simple

conda版本:

新建conda虚拟环境:

  1. conda create --name py38 python=3.8
  2. conda activate py38

conda添加国内源_202xxx的博客-CSDN博客

conda install pandas

用读取数据,train_dir为训练集的存储路径,nrows为读取数据的行数

  1. import pandas as pd
  2. train_dir = '../data/train_set.csv'
  3. nrows=None
  4. train_df = pd.read_csv(train_dir, sep=' ', nrows=nrows)

查看前5条新闻数据

train_df.head()
labeltext
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...
433646 3055 3055 2490 4659 6065 3370 5814 2465 5...

三、数据分析

句子长度分布

统计每篇新闻的长度(词的数量)

  1. import matplotlib.pyplot as plt
  2. train_df['text_len'] = train_df['text'].apply(lambda x: len(x.split(' ')))
  3. print(train_df['text_len'].describe())

用describe()函数得到新闻长度的统计特征值 

  1. count 200000.000000
  2. mean 907.207110
  3. std 996.029036
  4. min 2.000000
  5. 25%% 374.000000
  6. 50%% 676.000000
  7. 75%% 1131.000000
  8. max 57921.000000
  9. Name: text_len, dtype: float64

得到训练数据新闻总数为200000篇,其中最短的新闻字数为2,最长的新闻字数为57921,平均紫薯为907.2

绘制句子长度的直方图:

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

 可见大部分句子长度都在6000以内

新闻类别分布

绘制新闻类别标签的统计直方图

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

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

可以看出数量最多的新闻为科技类,最少的为星座类。

字符分布统计

将训练数据所有字符进行合并,统计出每个字符出现的频数

  1. from collections import Counter
  2. all_lines = ' '.join(list(train_df['text']))
  3. word_count = Counter(all_lines.split(" "))
  4. word_count = sorted(word_count.items(), key=lambda d:d[1], reverse = True)
  5. print(len(word_count))
  6. print(word_count[0])
  7. print(word_count[-1])

可以得到,训练数据用到的字符数为6869个,其中用的最多的字符编号为“3750”,用了748万次,最少字符编号为“3133”,用了2次:

  1. 6869
  2. ('3750', 7482224)
  3. ('3133', 1)

现对每篇文章字符进行去重再统计

  1. from collections import Counter
  2. train_df['text_unique'] = train_df['text'].apply(lambda x: ' '.join(list(set(x.split(' ')))))
  3. all_lines = ' '.join(list(train_df['text_unique']))
  4. word_count = Counter(all_lines.split(" "))
  5. word_count = sorted(word_count.items(), key=lambda d:int(d[1]), reverse = True)
  6. print(word_count[0])
  7. print(word_count[1])
  8. print(word_count[2])

可以得到用到编号“3750”的文章数量有197997篇,总文章数量为200000篇,因此可以猜测其为标点符号。

  1. ('3750', 197997)
  2. ('900', 197653)
  3. ('648', 191975)

四、作业思路

1. 假设字符3750,字符900和字符648是句子的标点符号,请分析赛题每篇新闻平均由多少个句子构成?

答:分别统计每篇新闻中包含有字符3750,字符900和字符648的数量,每篇新闻的句子数量=标点符号出现的数量,因此求平均可以得到每篇新闻平均由多少个句子构成。等价于已知道200000篇新闻中出现字符3750的数量为7482224次,字符900的数量为3262544,字符648的数量为4924890。求平均得到每篇新闻的句子数量为78.

  1. #作业1
  2. from collections import Counter
  3. all_lines = ' '.join(list(train_df['text']))
  4. word_count = Counter(all_lines.split(" "))
  5. print(word_count["3750"])
  6. print(word_count["900"])
  7. print(word_count["648"])
  8. print((word_count["3750"] + word_count["900"] + word_count["648"])/train_df.shape[0])

2.统计每类新闻中出现次数最多的字符?

答:根据label对df中的text新闻进行分组拼接,分别计算每个label中的新闻最大字符和数量

  1. train_df_label = train_df[["label", "text"]].groupby("label").apply(lambda x:" ".join(x["text"])).reset_index()
  2. train_df_label.columns = [["label", "text"]]
  3. from collections import Counter
  4. train_df_label['text_max'] = train_df_label["text"].apply(lambda x:sorted(Counter(x["text"].split(" ")).items(), key=lambda d:int(d[1]), reverse = True)[0], axis = 1)
  5. train_df_label
labeltexttext_max
003659 3659 1903 1866 4326 4744 7239 3479 4261 4...(3750, 1267331)
114412 5988 5036 4216 7539 5644 1906 2380 2252 6...(3750, 1200686)
222967 6758 339 2021 1854 3731 4109 3792 4149 15...(3750, 1458331)
337346 4068 5074 3747 5681 6093 1777 2226 7354 6...(3750, 774668)
443772 4269 3433 6122 2035 4531 465 6565 498 358...(3750, 360839)
552827 2444 7399 3528 2260 6127 1871 119 3615 57...(3750, 715740)
665284 1779 2109 6248 7039 5677 1816 5430 3154 1...(3750, 469540)
776469 1066 1623 1018 3694 4089 3809 4516 6656 3...(3750, 428638)
882087 730 5166 3300 7539 1722 5305 913 4326 669...(3750, 242367)
993819 4525 1129 6725 6485 2109 3800 5264 1006 4...(3750, 178783)
101026 4270 1866 5977 3523 3764 4464 3659 4853 517...(3750, 180259)
11114464 486 6352 5619 2465 4802 1452 3137 5778 54...(3750, 83834)
12122708 2218 5915 4559 886 1241 4819 314 4261 166...(3750, 87412)
13131903 2112 3019 3607 7539 3864 4939 4768 3420 2...(3750, 33796)

五、总结

根据不同的维度,分别提取新闻的特征,为模型训练作准备。

六、Reference

tianchi_competition/零基础入门NLP - 新闻文本分类 at main · RxxxxR/tianchi_competition · GitHub

Datawhale零基础入门NLP赛事 - Task2 数据读取与数据分析-天池实验室-实时在线的数据分析协作工具,享受免费计算资源

推荐阅读