当前位置: 首页 > news >正文

【NLP自然语言处理】文本的数据分析------迅速掌握常用的文本数据分析方法~

目录

🍔 文件数据分析介绍

🍔 数据集说明

🍔 获取标签数量分布

🍔 获取句子长度分布

🍔 获取正负样本长度散点分布

🍔 获取不同词汇总数统计

🍔 获取训练集高频形容词词云

🍔 获取验证集形容词词云

🍔 小结


 

学习目标

🍀 了解文本数据分析的作用

🍀 掌握常用的几种文本数据分析方法

🍔 文件数据分析介绍

  • 文本数据分析的作用:

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

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

🍔 数据集说明

  • 我们将基于真实的中文酒店评论语料来讲解常用的几种文本数据分析方法.

  • 中文酒店评论语料:

    • 属于二分类的中文情感分析语料, 该语料存放在"./cn_data"目录下.
    • 其中train.tsv代表训练集, dev.tsv代表验证集, 二者数据样式相同.
  • train.tsv数据样式:

sentence    label
早餐不好,服务不到位,晚餐无西餐,早餐晚餐相同,房间条件不好,餐厅不分吸烟区.房间不分有无烟房.    0
去的时候 ,酒店大厅和餐厅在装修,感觉大厅有点挤.由于餐厅装修本来该享受的早饭,也没有享受(他们是8点开始每个房间送,但是我时间来不及了)不过前台服务员态度好!    1
有很长时间没有在西藏大厦住了,以前去北京在这里住的较多。这次住进来发现换了液晶电视,但网络不是很好,他们自己说是收费的原因造成的。其它还好。  1
非常好的地理位置,住的是豪华海景房,打开窗户就可以看见栈桥和海景。记得很早以前也住过,现在重新装修了。总的来说比较满意,以后还会住   1
交通很方便,房间小了一点,但是干净整洁,很有香港的特色,性价比较高,推荐一下哦 1
酒店的装修比较陈旧,房间的隔音,主要是卫生间的隔音非常差,只能算是一般的    0
酒店有点旧,房间比较小,但酒店的位子不错,就在海边,可以直接去游泳。8楼的海景打开窗户就是海。如果想住在热闹的地带,这里不是一个很好的选择,不过威海城市真的比较小,打车还是相当便宜的。晚上酒店门口出租车比较少。   1
位置很好,走路到文庙、清凉寺5分钟都用不了,周边公交车很多很方便,就是出租车不太爱去(老城区路窄爱堵车),因为是老宾馆所以设施要陈旧些,    1
酒店设备一般,套房里卧室的不能上网,要到客厅去。    0

  • train.tsv数据样式说明:
    • train.tsv中的数据内容共分为2列, 第一列数据代表具有感情色彩的评论文本; 第二列数据, 0或1, 代表每条文本数据是积极或者消极的评论, 0代表消极, 1代表积极.

🍔 获取标签数量分布

# 导入必备工具包
import seaborn as sns
import pandas as pd
import matplotlib.pyplot as plt
# 设置显示风格
plt.style.use('fivethirtyeight') # 分别读取训练tsv和验证tsv
train_data = pd.read_csv("data/cn_data/train.tsv", sep="\t")
valid_data = pd.read_csv("data/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左右, 否则就要进行必要的数据增强或数据删减. 上图中训练和验证集正负样本都稍有不均衡, 可以进行一些数据增强.

🍔 获取句子长度分布

# 在训练数据中添加新的句子长度列, 每个元素的值都是对应的句子列的长度
train_data["sentence_length"] = list(map(lambda x: len(x), train_data["sentence"]))# 绘制句子长度列的数量分布图
sns.countplot("sentence_length", data=train_data)
# 主要关注count长度分布的纵坐标, 不需要绘制横坐标, 横坐标范围通过dist图进行查看
plt.xticks([])
plt.show()# 绘制dist长度分布图
sns.distplot(train_data["sentence_length"])# 主要关注dist长度分布横坐标, 不需要绘制纵坐标
plt.yticks([])
plt.show()# 在验证数据中添加新的句子长度列, 每个元素的值都是对应的句子列的长度
valid_data["sentence_length"] = list(map(lambda x: len(x), valid_data["sentence"]))# 绘制句子长度列的数量分布图
sns.countplot("sentence_length", data=valid_data)# 主要关注count长度分布的纵坐标, 不需要绘制横坐标, 横坐标范围通过dist图进行查看
plt.xticks([])
plt.show()# 绘制dist长度分布图
sns.distplot(valid_data["sentence_length"])# 主要关注dist长度分布横坐标, 不需要绘制纵坐标
plt.yticks([])
plt.show()
  • 训练集句子长度分布:

  • 验证集句子长度分布:

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

🍔 获取正负样本长度散点分布

# 绘制训练集长度分布的散点图
sns.stripplot(y='sentence_length',x='label',data=train_data)
plt.show()# 绘制验证集长度分布的散点图
sns.stripplot(y='sentence_length',x='label',data=valid_data)
plt.show()
  • 训练集上正负样本的长度散点分布:

  • 验证集上正负样本的长度散点分布:

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

🍔 获取不同词汇总数统计

# 导入jieba用于分词
# 导入chain方法用于扁平化列表
import jieba
from itertools import chain# 进行训练集的句子进行分词, 并统计出不同词汇的总数
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))
  • 输出效果:
训练集共包含不同词汇总数为: 12147
训练集共包含不同词汇总数为: 6857

🍔 获取训练集高频形容词词云

# 使用jieba中的词性标注功能
import jieba.posseg as psegdef get_a_list(text):"""用于获取形容词列表"""# 使用jieba的词性标注方法切分文本,获得具有词性属性flag和词汇属性word的对象, # 从而判断flag是否为形容词,来返回对应的词汇r = []for g in pseg.lcut(text):if g.flag == "a":r.append(g.word)return r# 导入绘制词云的工具包
from wordcloud import WordClouddef 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"]# 对正样本的每个句子的形容词
train_p_a_vocab = chain(*map(lambda x: get_a_list(x), p_train_data))
#print(train_p_n_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_p_a_vocab)
get_word_cloud(train_n_a_vocab)
  • 训练集正样本形容词词云:

  • 训练集负样本形容词词云:

🍔 获取验证集形容词词云

# 获得验证集上正样本
p_valid_data = valid_data[valid_data["label"]==1]["sentence"]# 对正样本的每个句子的形容词
valid_p_a_vocab = chain(*map(lambda x: get_a_list(x), p_valid_data))
#print(train_p_n_vocab)# 获得验证集上负样本
n_valid_data = valid_data[valid_data["label"]==0]["sentence"]# 获取负样本的每个句子的形容词
valid_n_a_vocab = chain(*map(lambda x: get_a_list(x), n_valid_data))# 调用绘制词云函数
get_word_cloud(valid_p_a_vocab)
get_word_cloud(valid_n_a_vocab)
  • 验证集正样本形容词词云:

  • 验证集负样本形容词词云:

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

🍔 小结

  • 学习了文本数据分析的作用:

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

    • 标签数量分布
    • 句子长度分布
    • 词频统计与关键词词云
  • 学习了基于真实的中文酒店评论语料进行几种文本数据分析方法.

    • 获得训练集和验证集的标签数量分布
    • 获取训练集和验证集的句子长度分布
    • 获取训练集和验证集的正负样本长度散点分布
    • 获得训练集与验证集不同词汇总数统计
    • 获得训练集上正负的样本的高频形容词词云

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • Android中如何实现adb向应用发送特定指令并接收返回
  • 攻防世界 supersqli
  • 【Java中的位运算和逻辑运算详解及其区别】
  • 橘子学ES实战操作之管道类型Ingest pipelines的基本使用
  • 1-10 图像增强对比度 opencv树莓派4B 入门系列笔记
  • 【软件设计师真题】第一大题---数据流图设计
  • OCC开发_变高箱梁全桥建模
  • 书生大模型全链路开源开放体系笔记
  • 设计模式 19 观察者模式
  • GD - EmbeddedBuilder - 给已有工程换MCU
  • C语言小游戏--贪吃蛇实现
  • 【B题第二套完整论文已出】2024数模国赛B题第二套完整论文+可运行代码参考(无偿分享)
  • Vue使用fetch获取本地数据
  • ESP32_获取心知天气
  • python之对象通过中介间接协作
  • 【译】JS基础算法脚本:字符串结尾
  • android 一些 utils
  • CentOS7简单部署NFS
  • CSS居中完全指南——构建CSS居中决策树
  • echarts花样作死的坑
  • ES10 特性的完整指南
  • ES6 学习笔记(一)let,const和解构赋值
  • JavaScript中的对象个人分享
  • leetcode98. Validate Binary Search Tree
  • NSTimer学习笔记
  • Otto开发初探——微服务依赖管理新利器
  • passportjs 源码分析
  • QQ浏览器x5内核的兼容性问题
  • spring cloud gateway 源码解析(4)跨域问题处理
  • vue数据传递--我有特殊的实现技巧
  • Vue--数据传输
  • Vue小说阅读器(仿追书神器)
  • XForms - 更强大的Form
  • 飞驰在Mesos的涡轮引擎上
  • 前端每日实战:70# 视频演示如何用纯 CSS 创作一只徘徊的果冻怪兽
  • 实现菜单下拉伸展折叠效果demo
  • 使用Swoole加速Laravel(正式环境中)
  • 通过来模仿稀土掘金个人页面的布局来学习使用CoordinatorLayout
  • 吐槽Javascript系列二:数组中的splice和slice方法
  • 小程序开发中的那些坑
  • 智能合约开发环境搭建及Hello World合约
  • raise 与 raise ... from 的区别
  • 阿里云服务器购买完整流程
  • #预处理和函数的对比以及条件编译
  • (1)Nginx简介和安装教程
  • (10)STL算法之搜索(二) 二分查找
  • (26)4.7 字符函数和字符串函数
  • (el-Transfer)操作(不使用 ts):Element-plus 中 Select 组件动态设置 options 值需求的解决过程
  • (不用互三)AI绘画:科技赋能艺术的崭新时代
  • (顶刊)一个基于分类代理模型的超多目标优化算法
  • (二)WCF的Binding模型
  • (亲测成功)在centos7.5上安装kvm,通过VNC远程连接并创建多台ubuntu虚拟机(ubuntu server版本)...
  • (学习日记)2024.01.19
  • (一)【Jmeter】JDK及Jmeter的安装部署及简单配置
  • (转)eclipse内存溢出设置 -Xms212m -Xmx804m -XX:PermSize=250M -XX:MaxPermSize=356m