其他分享
首页 > 其他分享> > Task02_数据可视化

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()
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...
# 统计句子长度
%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%

通过以上分析可以发现:

标签:count,word,df,text,train,可视化,print,Task02,数据
来源: https://blog.csdn.net/ahdaizhixu/article/details/120628528