Task02_数据可视化
作者:互联网
本次学习活动来自Coogle数据科学:30天入门数据竞赛
学习内容来自于:阿里云天池 - 零基础入门NLP - 新闻文本分类
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from tqdm import tqdm
data_path = 'data/'
save_path = 'result/'
train_df = pd.read_csv(data_path+'train_set.csv',sep='\t')
train_df.head()
label | text | |
---|---|---|
0 | 2 | 2967 6758 339 2021 1854 3731 4109 3792 4149 15... |
1 | 11 | 4464 486 6352 5619 2465 4802 1452 3137 5778 54... |
2 | 3 | 7346 4068 5074 3747 5681 6093 1777 2226 7354 6... |
3 | 2 | 7159 948 4866 2109 5520 2490 211 3956 5520 549... |
4 | 3 | 3646 3055 3055 2490 4659 6065 3370 5814 2465 5... |
# 统计句子长度
%pylab inline
train_df['text_len'] = train_df['text'].apply(lambda x: len(x.split(' ')))
print(train_df['text_len'].describe())
Populating the interactive namespace from numpy and matplotlib
count 200000.000000
mean 907.207110
std 996.029036
min 2.000000
25% 374.000000
50% 676.000000
75% 1131.000000
max 57921.000000
Name: text_len, dtype: float64
# 根据句子长度绘制直方图
_ = plt.hist(train_df['text_len'], bins=200)
plt.xlabel('Text char count')
plt.title("Histogram of char count")
# 设置坐标轴范围
plt.xlim(0, 8000)
(0.0, 8000.0)
# 统计新闻类别
train_df['label'].value_counts().plot(kind='bar')
plt.title('News class count')
plt.xlabel("category")
Text(0.5, 0, 'category')
在数据集中标签的对应的关系如下:{0:‘科技’, 1:‘股票’, 2:‘体育’, 3:‘娱乐’, 4:‘时政’, 5:‘社会’, 6:‘教育’, 7:‘财经’, 8:‘家居’, 9:‘游戏’, 10:‘房产’, 11:‘时尚’, 12:‘彩票’, 13:‘星座’}
从统计结果可以看出,赛题的数据集类别分布存在较为不均匀的情况。在训练集中科技类新闻最多,其次是股票类新闻,最少的新闻是星座新闻。
# 统计每个单词出现次数
# 设置一个字典,以单词为key,值为value计算
word_count = {}
words = []
for list1 in tqdm(train_df['text']):
#print(list1.split(' '))
words = list1.split(' ')
for word in words:
word_count.setdefault(word,0)
word_count[word] += 1
100%|████████████████████████████████████████████████████████████████████████| 200000/200000 [00:56<00:00, 3552.54it/s]
# 按照单词出现的次数倒序排列
word_count_sorted = sorted(word_count.items(), key=lambda x:x[1], reverse=True)
word_count_sorted
[('3750', 7482224),
('648', 4924890),
('900', 3262544),
('3370', 2020958),
('6122', 1602363),
('4464', 1544962),
('7399', 1455864),
('4939', 1387951),
('3659', 1251253),
('4811', 1159401),
('5598', 1121908),
('2465', 1087011),
('669', 1086645),
('2400', 1031116),
('5560', 1020573),
('299', 927955),
('2109', 921676),
('4893', 917183),
('4411', 884362),
('1699', 853028),
('1519', 805002),
('803', 786906),
('1635', 785260),
('6065', 753778),
('5998', 723615),
('1903', 689400),
('5445', 679277),
('1324', 666498),
('2376', 647118),
('340', 638801),
('4659', 629805),
('3800', 609360),
('5948', 606320),
('1460', 603450),
...]
这里可以看出,在200000条新闻中,'3750’出现了748W次,'648’出现了492W次,'900’出现了326W次,我们可以猜测,这些符号可能是标点符号。
# 另一种方法
from collections import Counter
all_lines = ' '.join(list(train_df['text']))
# counter能直接统计出单词出现的次数
word_count = Counter(all_lines.split(" "))
word_count = sorted(tqdm(word_count.items()), key=lambda d:d[1], reverse = True)
print(len(word_count))
print(word_count[0])
print(word_count[-1])
6869
('3750', 7482224)
('3133', 1)
这里还可以根据字在每个句子的出现情况,反推出标点符号。下面代码统计了不同字符在句子中出现的次数,其中字符3750,字符900和字符648在20w新闻的覆盖率接近99%,很有可能是标点符号。
# 对每条新闻的字符进行去重,放到'text_unique'里
train_df['text_unique'] = train_df['text'].apply(lambda x: ' '.join(list(set(x.split(' ')))))
# 将所有新闻的去重字符放到all_lines中,这时,all_lines里的字符是有重复的,因为不同文章也有可能有相同字符
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][0],'覆盖的文章范围为:{:.2%}'.format(int(word_count[0][1])/200000))
print(word_count[1][0],'覆盖的文章范围为:{:.2%}'.format(int(word_count[1][1])/200000))
print(word_count[2][0],'覆盖的文章范围为:{:.2%}'.format(int(word_count[2][1])/200000))
3750 覆盖的文章范围为:99.00%
900 覆盖的文章范围为:98.83%
648 覆盖的文章范围为:95.99%
通过以上分析可以发现:
- 每个新闻平均包含字符个数为907个
- 新闻类别分布不均匀,类别数量差距较大
标签:count,word,df,text,train,可视化,print,Task02,数据 来源: https://blog.csdn.net/ahdaizhixu/article/details/120628528