1、文本数据分析方法
2、标签数量分布
2.1 获取训练集和验证集的标签数量分布
import seaborn as sns
import pandas as pd
import matplotlib.pyplot as plt
import jieba
import jieba.posseg as pseg
from itertools import chain
from wordcloud import WordCloud
plt.style.use('fivethirtyeight')
train_data = pd.read_csv("./cn_data/train.tsv", sep="\t")
valid_data = pd.read_csv("./cn_data/dev.tsv", sep="\t")
sns.countplot("label", data=train_data)
plt.title("train_data")
plt.show()
sns.countplot("label", data=valid_data)
plt.title("valid_data")
plt.show()
-
训练集标签数量分布: -
验证集标签数量分布: -
分析: ??在深度学习模型评估中, 我们一般使用ACC作为评估指标, 若想将ACC的基线定义在50%左右, 则需要我们的正负样本比例维持在1:1左右, 否则就要进行必要的数据增强或数据删减. 上图中训练和验证集正负样本都稍有不均衡, 可以进行一些数据增强.
2.2 获取训练集和验证集的句子长度分布
train_data["sentence_length"] = list(map(lambda x: len(x), train_data["sentence"]))
sns.countplot("sentence_length", data=train_data)
plt.xticks([])
plt.show()
sns.distplot(train_data["sentence_length"])
plt.yticks([])
plt.show()
valid_data["sentence_length"] = list(map(lambda x: len(x), valid_data["sentence"]))
sns.countplot("sentence_length", data=valid_data)
plt.xticks([])
plt.show()
sns.distplot(valid_data["sentence_length"])
plt.yticks([])
plt.show()
- 训练集句子长度分布:
- 验证集句子长度分布:
- 分析:
??通过绘制句子长度分布图, 可以得知我们的语料中大部分句子长度的分布范围, 因为模型的输入要求为固定尺寸的张量,合理的长度范围对之后进行句子截断补齐(规范长度)起到关键的指导作用. 上图中大部分句子长度的范围大致为20-250之间.
2.3 获取训练集和验证集的正负样本长度散点分布
plt.figure(figsize=(20, 8), dpi=100)
sns.stripplot(y='sentence_length', x = 'label', data = train_data)
plt.show()
plt.figure(figsize=(20, 8), dpi=100)
sns.stripplot(y='sentence_length', x = 'label', data = valid_data)
plt.show()
- 训练集上正负样本的长度散点分布:
- 验证集上正负样本的长度散点分布:
- 分析:
??通过查看正负样本长度散点图, 可以有效定位异常点的出现位置, 帮助我们更准确进行人工语料审查. 上图中在训练集正样本中出现了异常点, 它的句子长度近3500左右, 需要我们人工审查.
2.4 获取训练集和验证集不同词汇总数统计
train_vocab = set(chain(*map(lambda x: jieba.lcut(x), train_data['sentence'])))
print("训练集词汇总数:", len(train_vocab))
valid_vocab = set(chain(*map(lambda x: jieba.lcut(x), valid_data['sentence'])))
print("验证集词汇总数:", len(valid_vocab))
输出结果:
训练集词汇总数: 12162
验证集词汇总数: 6857
2.5 获得训练集上正负的样本的高频形容词词云
def get_a_list(text):
r = []
for g in pseg.lcut(text):
if g.flag == 'a':
r.append(g.word)
return r
def get_word_cloud(keywords_list):
"""
实例化绘制词云的类,其中参数font_path是字体路径,显示中文
max_words指词云图像最多显示多少个词,background_color为背景颜色
"""
wordcloud = WordCloud(font_path='./SimHei.ttf', max_words=100, background_color='white')
keywords_string = ''.join(keywords_list)
wordcloud.generate(keywords_string)
plt.figure()
plt.imshow(wordcloud, interpolation='bilinear')
plt.axis('off')
plt.show()
p_train_data = train_data[train_data['label'] == 1]['sentence']
p_a_train_vocab = chain(*map(lambda x: get_a_list(x), p_train_data))
n_train_data = train_data[train_data['label'] == 0]['sentence']
n_a_train_vocab = chain(*map(lambda x: get_a_list(x), n_train_data))
get_word_cloud(p_a_train_vocab)
get_word_cloud(n_a_train_vocab)
- 训练集正样本形容词词云:
- 训练集负样本形容词词云:
2.6 获得验证集上正负的样本的形容词词云
p_valid_data = valid_data[valid_data['label' == 1]]['sentence']
p_a_valid_vocab = chain(*map(lambda x: get_a_list(x), p_valid_data))
n_valid_data = valid_data[valid_data['label' == 0]]['sentence']
n_a_valid_vocab = chain(*map(lambda x: get_a_list(x), n_valid_data))
get_word_cloud(p_a_valid_vocab)
get_word_cloud(n_a_valid_vocab)
- 验证集正样本形容词词云:
- 验证集负样本形容词词云:
- 分析:
??根据高频形容词词云显示, 我们可以对当前语料质量进行简单评估, 同时对违反语料标签含义的词汇进行人工审查和修正, 来保证绝大多数语料符合训练标准。上图中的正样本大多数是褒义词, 而负样本大多数是贬义词, 基本符合要求, 但是负样本词云中也存在"便利"这样的褒义词, 因此可以人工进行审查。
|