NLP以赛代练 Task 2:数据读取与分析

数据读取与分析

  • 数据读取
  • 数据分析
    • 句子长度分析
    • 类别分布
    • 字符分布统计
    • 数据分析的结论

 


数据读取

import pandas as pd

train_df = pd.read_csv('/Users/debroon/Desktop/train_set.csv', sep='\t', nrows=100)
train_df.head() 
# 查看 top5 的数据

NLP以赛代练 Task 2:数据读取与分析_第1张图片
不算前面的行号,第一列为新闻的类别,第二列为新闻的字符。
 


数据分析

一切技术的出现都是为了解决现实问题,而现实问题分为简单问题和复杂问题。

  • 简单问题,需要简单分析,我们使用「数据分析」。比如最近的阅读量怎么减少了。
  • 复杂问题,需要复杂分析,我们使用「机器学习」。比如根据阅读历史推送新书。

数据分析,核心是分析思维。

分析思维不是要证明你智商很高,而是考察你面对问题展开的分析能力和分析思维。

书上的 5 w 2 h 5w2h 5w2h 这样的常用分析方法,其实根本用不在数据分析工作里。最常用的分析方法其实是:

  • 多维度拆解分析方法;
  • 对比分析方法;
  • 假设检验分析方法;
  • 相关分析方法;
  • 群组分析方法;
  • AARRR漏斗模型分析方法;
  • RFM模型分析方法;
  • … …

握常用的业务数据指标,你才可以灵活应对面试中提出的业务问题。我整理了下面常用的业务指标,准备好这些内容,就可以应对 90 90 90 %的面试了。

  • 反映用户数据的指标:日新增用户、活跃率、留存率;
  • 反映行为数据的指标: P V PV PV(访问次数)、 U V UV UV(访问人数)、转发率、转化率、 K K K因子;
  • 反映总量的指标: 成交总额、成交数量、访问时长;
  • 反映人均的指标:人均付费( A R P U ARPU ARPU/客单价)、付费用户人均付费( A R P P U ARPPU ARPPU)、人均访问时长;
  • 反映付费的指标:付费率、复购率、回购率。

在读取完成数据集后,我们还可以对数据集进行数据分析的操作。

虽然对于非结构数据并不需要做很多的数据分析,但通过数据分析还是可以找出一些规律的。

读取了所有的训练集数据,在此我们通过数据分析希望得出以下结论:

  • 句子长度情况?
  • 哪些类别比较多?
  • 字符分布是怎么样的?

 


句子长度分析

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

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

每个句子平均由907个字符构成,最短的句子长度为2,最长的句子长度为57921,所以说,给定的文本/句子比较长。

可视化,将句子长度绘制了直方图:

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

直方图,大部分句子的长度都几种在2000以内:
NLP以赛代练 Task 2:数据读取与分析_第2张图片
 


类别分布

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

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

NLP以赛代练 Task 2:数据读取与分析_第3张图片
在数据集中标签的对应的关系如下:

  • ‘科技’: 0
  • ‘股票’: 1
  • ‘体育’: 2
  • ‘娱乐’: 3
  • ‘时政’: 4
  • ‘社会’: 5
  • ‘教育’: 6
  • ‘财经’: 7
  • ‘家居’: 8
  • ‘游戏’: 9
  • ‘房产’: 10
  • ‘时尚’: 11
  • ‘彩票’: 12
  • ‘星座’: 13

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


字符分布统计

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

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))
print(word_count[0])
print(word_count[-1])

运行值:

2405
('3750', 3702)
('5034', 1)

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

这里还可以根据字在每个句子的出现情况,反推出标点符号。

下面代码统计了不同字符在句子中出现的次数,其中字符 3750 3750 3750,字符 900 900 900 和字符 648 648 648 20 w 20w 20w 新闻的覆盖率接近 99 99 99%,很有可能是标点符号。

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])
print(word_count[1])
print(word_count[2])

运行值:

('3750', 99)
('900', 99)
('648', 96)

 


数据分析的结论

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

  • 每条新闻包含的字符个数平均为 1000 1000 1000 个,还有一些新闻字符较长;
  • 新闻类别分布不均匀,科技类新闻样本量接近 4 w 4w 4w,星座类新闻样本量不到 1 k 1k 1k
  • 总共包括 3000 3000 3000 个字符;

通过数据分析,我们还可以得出以下结论:

  • 每个新闻平均字符个数较多,可能需要截断;
  • 由于类别不均衡,会严重影响模型的精度。

你可能感兴趣的:(#,机器学习)