Task02-数据读取与数据分析

  • 数据读取
  • 数据分析
  • 句子长度分析
  • 新闻类别分布
  • 字符分布
  • 结论

本次学习主要内容是:先用pandas读取数据,然后对数据进行简单的描述性统计。

数据读取

训练集数据共20w条左右,下载解压后的格式即为csv格式,因此可以直接用pandas进行数据读取。

import pandas as pd
train_df = pd.read_csv('train_set.csv', sep='\t') #因为训练集有20w条,数据太大,也可以只选择读取前100条:nrows=100
train_df.head(7) #显示前7行数据

结果如下:

nlp抽取 NLP抽取数据_数据分析


其中label列为新闻类别,text列为新闻字符。

数据分析

we want to know:

  • 新闻文本有多长?
  • 新闻类别分布如何?哪类新闻比较多?
  • 新闻字符分布如何?

句子长度分析

%pylab inline
train_df['text_len'] = train_df['text'].apply(lambda x: len(x.split(' '))) #每行句子的字符使用空格进行隔开
print(train_df['text_len'].describe())

结果如下:

nlp抽取 NLP抽取数据_自然语言处理_02


绘制句子长度直方图:

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

结果如下:

nlp抽取 NLP抽取数据_nlp抽取_03


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

新闻类别分布

train_df['label'].value_counts().plot(kind='bar') #统计每类新闻的样本个数并绘制直方图
plt.title('News class count')
plt.xlabel("category")

结果如下:

nlp抽取 NLP抽取数据_数据分析_04

字符分布

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

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)

训练集中共包括6869个字符,其中编号为3750的字符出现次数最多,编号3133的字符出现次数最少。由此可大致反推出覆盖率最多的字符可能就是标点符号。

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个字符。
    通过数据分析我们还可以得出:
  • 每个新闻平均字符个数较多,可能需要截断;
  • 由于类别不均匀,可能会严重影响模型的精度。