自然语言处理(四):文本预处理之文本数据分析

自然语言处理笔记总目录


文本数据分析能够有效帮助我们理解数据语料, 快速检查出语料可能存在的问题, 并指导之后模型训练过程中一些超参数的选择

常用的几种文本数据分析方法:

  • 标签数量分布
  • 句子长度分布
  • 词频统计与关键词词云

标签数量分布:

import seaborn as sns
import pandas as pd
import matplotlib.pyplot as plt

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.gcf().subplots_adjust(bottom=0.12, left=0.15)
plt.show()

sns.countplot("label", data=valid_data)
plt.title("train_data")
plt.gcf().subplots_adjust(bottom=0.12, left=0.13)
plt.show()

训练集标签数量分布:

在这里插入图片描述 在这里插入图片描述

在深度学习模型评估中, 我们一般使用ACC作为评估指标, 若想将ACC的基线定义在50%左右, 则需要我们的正负样本比例维持在1:1左右, 否则就要进行必要的数据增强或数据删减. 上图中训练和验证集正负样本都稍有不均衡, 可以进行一些数据增强

句子长度分布:

import seaborn as sns
import pandas as pd
import matplotlib.pyplot as plt

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')

train_data["sentence_lenth"] = list(map(lambda x: len(x), train_data["sentence"]))

sns.countplot("sentence_lenth", data=train_data)
plt.xticks([])
plt.subplots_adjust(left=0.1, bottom=0.1)
plt.show()

sns.distplot(train_data["sentence_lenth"])
plt.yticks([])
plt.subplots_adjust(bottom=0.12)
plt.show()

valid_data["sentence_lenth"] = list(map(lambda x: len(x), valid_data["sentence"]))

sns.countplot("sentence_lenth", data=valid_data)
plt.xticks([])
plt.subplots_adjust(left=0.1, bottom=0.1)
plt.show()

sns.distplot(valid_data["sentence_lenth"])
plt.yticks([])
plt.subplots_adjust(bottom=0.12)
plt.show()

训练集句子长度分布:
在这里插入图片描述 在这里插入图片描述
验证集句子长度分布:
在这里插入图片描述 在这里插入图片描述

通过绘制句子长度分布图,可以得知我们的语料中大部分句子长度的分布范围,因为模型的输入要求为固定尺寸的张量,合理的长度范围对之后进行句子截断补齐(规范长度)起到关键的指导作用。上图中大部分句子长度的范围大致为20-250之间

sns.stripplot(y='sentence_lenth', x='label', data=train_data)
plt.subplots_adjust(left=0.16, bottom=0.13)
plt.show()

sns.stripplot(y='sentence_lenth', x='label', data=valid_data)
plt.subplots_adjust(left=0.16, bottom=0.13)
plt.show()

训练集、验证集上正负样本的长度散点分布:
在这里插入图片描述 在这里插入图片描述

通过查看正负样本长度散点图,可以有效定位异常点的出现位置,帮助我们更准确进行人工语料审查。上图中在训练集正样本中出现了异常点,它的句子长度近3500左右,需要我们人工审查

获得训练集与验证集不同词汇总数统计:

import pandas as pd
import matplotlib.pyplot as plt
import jieba
from itertools import chain

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')

a = map(lambda x: jieba.lcut(x), train_data["sentence"])

train_vocab = set(chain(*map(lambda x: jieba.lcut(x), train_data["sentence"])))
print("训练集共包含不同词汇的总数为:", len(train_vocab))

vaild_vocab = set(chain(*map(lambda x: jieba.lcut(x), valid_data["sentence"])))
print("验证集共包含不同词汇的总数为:", len(vaild_vocab))

在这里插入图片描述

参考:chain的用法

获得训练集上正负的样本的高频形容词词云:

from itertools import chain
import jieba.posseg as pseg
import matplotlib.pyplot as plt
import pandas as pd
from wordcloud import WordCloud


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):
    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)
    plt.axis("off")
    plt.show()


train_data = pd.read_csv("./cn_data/train.tsv", sep='\t')
valid_data = pd.read_csv("./cn_data/dev.tsv", sep='\t')

p_train_data = train_data[train_data["label"] == 1]["sentence"]
train_p_a_vocab = chain(*map(lambda x: get_a_list(x), p_train_data))
get_word_cloud(train_p_a_vocab)

n_train_data = train_data[train_data["label"] == 0]["sentence"]
train_n_a_vocab = chain(*map(lambda x: get_a_list(x), n_train_data))
get_word_cloud(train_n_a_vocab)

在这里插入图片描述在这里插入图片描述

获得验证集上正负的样本的形容词词云的方法与上类似

根据高频形容词词云显示, 我们可以对当前语料质量进行简单评估, 同时对违反语料标签含义的词汇进行人工审查和修正, 来保证绝大多数语料符合训练标准. 上图中的正样本大多数是褒义词, 而负样本大多数是贬义词, 基本符合要求, 但是负样本词云中也存在"便利"这样的褒义词, 因此可以人工进行审查

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

GeniusAng丶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值