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

NLP——文本预处理(下)

四、文本数据分析

概念

文本数据分析就是通过一些算法工具统计语料中的数据分布情况,帮助我们更好的了解所处理的文本数据。

作用

  • 能够有效帮助我们理解数据语料

  • 快速检查出语料可能存在的问题

  • 指导之后模型训练过程中一些超参数的选择

获取标签分布

1. 导包
import seaborn as sns
import pandas as pd
import matplotlib
matplotlib.use('TkAgg')
import matplotlib.pyplot as plt# 解决中文乱码问题
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
2. 设置显示风格、读取训练集和验证集(路径根据真实情况来定)
    # 设置显示风格plt.style.use('fivethirtyeight')# 读取数据train_data = pd.read_csv('./cn_data/train.tsv', sep='\t')dev_data = pd.read_csv('./cn_data/dev.tsv', sep='\t')
3. 统计label标签的0,1分组、构建训练集直方图
    sns.countplot(x='label', data=train_data)plt.title('训练标签数量')plt.show()
4. 构建测试集图像
    sns.countplot(x='label', data=dev_data)plt.title('测试标签数量')plt.show()
5. 主程序
if __name__ == '__main__':label_count_demo()

获取句子长度

1. 导包
import seaborn as sns
import pandas as pd
import matplotlib
matplotlib.use('TkAgg')
import matplotlib.pyplot as plt# 解决中文乱码问题
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
2. 设置风格、读取训练集和验证集
def sentence_length_count_demo():# 设置显示风格plt.style.use('fivethirtyeight')# 读取训练集和验证集数据train_data = pd.read_csv('./cn_data/train.tsv', sep='\t')dev_data = pd.read_csv('./cn_data/dev.tsv',sep='\t')
3. 新增数据长度列

其中:map(参数1:可执行的函数, 参数2:可以进行迭代的数据结构) -> 返回结果

    # 定义一个函数,用于map使用,功能:获取sentence的长度def get_length(sentence):return len(sentence)# 对train_data['sentence']的每一行求长度result = list(map(get_length,train_data['sentence']))# 为了让数据可以被seaborn展示,需要把list转成Dataframe格式# [sentence, label ] -> (扩充一列)  [sentence, label, sentence_length]train_data['sentence_length'] = result
4.  绘图
    # 绘制训练集数据长度分布图-柱状图,展示每个不同句子长度出现的频次sns.countplot(x='sentence_length', data=train_data)plt.xticks([])plt.title('训练集数据长度')plt.show()# 验证集添加长度列dev_data['sentence_length'] = dev_data['sentence'].apply(get_length)# 绘制验证集数据长度分布图-柱状图,展示每个不同句子长度出现的频次sns.countplot(x='sentence_length', data=dev_data)plt.xticks([])plt.title('验证集数据长度')plt.show()# 训练集密度分布图,展示句子长度的分布趋势sns.displot(x='sentence_length', data=train_data)plt.yticks([])plt.title('训练集数据长度')plt.show()# 测试集密度分布图,展示句子长度的分布趋势sns.displot(x='sentence_length', data=dev_data)plt.yticks([])plt.title('验证集数据长度')plt.show()
5. 主程序
if __name__ == '__main__':sentence_length_count_demo()

获取正负样本散点图

1. 导包(同上)
2. 更改函数名
def sns_stripplot_demo():
3. 设置风格、读取数据(同上)
4. 新增数据长度列(同上)
5. 使用 Seaborn 绘制训练集和验证集中不同标签(label)对应的句子长度分布的散点图
    # 使用 Seaborn 绘制训练集中不同标签(label)对应的句子长度分布的散点图sns.stripplot(x='label',y='sentence_length',data=train_data)plt.show()# 获取sentence_lengthdev_data['sentence_length'] = dev_data['sentence'].apply(get_length)# 使用 Seaborn 绘制验证集中不同标签(label)对应的句子长度分布的散点sns.stripplot(x='label', y='sentence_length', data=dev_data,jitter=True, alpha=0.6)plt.show()
5. 主程序
if __name__ == '__main__':sns_stripplot_demo()

获取词汇数统计

1. 导包
import jieba
from itertools import chain
import pandas as pd
2. 读取数据
def word_test_count():# 读取训练集,并转成Dataframe格式train_data = pd.read_csv('./cn_data/train.tsv', sep='\t')# 读取测试集,并转成Dataframe格式dev_data = pd.read_csv('./cn_data/dev.tsv', sep='\t')
3. 使用map进行分词,返回一个迭代器
    map_result = map(lambda x: jieba.lcut(x), train_data['sentence'])
4. 将分词结果打平
    chain_result = chain(*map_result)
5. 去重并输出
    train_words = set(chain_result)print(f'训练集的单词数: {len(train_words)}')# 打印测试集的去重单词数dev_words = set(chain(*map(lambda x: jieba.lcut(x), dev_data['sentence'])))print(f'测试集的单词数: {len(dev_words)}')
6. 主程序
if __name__ == '__main__':word_test_count()

获取词云

1. 导包
import jieba
import jieba.posseg as pseg
import matplotlib
matplotlib.use('TkAgg')
import matplotlib.pyplot as plt
from wordcloud import WordCloud
from itertools import chain
import pandas as pd
2. 定义一个获取形容词的函数
def get_a_list(sentence):# 1. 定义一个list,接受形容词列表a_word_list = []# 2. 分词word_list = pseg.lcut(sentence)# 3.遍历分词结果,过滤掉非形容词for word,flag in word_list:if flag == 'a':a_word_list.append(word)return a_word_list
3. 定义一个词云生成函数
def get_word_cloud(key_word_list):# 1.构建一个WordCloud对象word_cloud = WordCloud(font_path='./cn_data/SimHei.ttf',max_words=100,background_color='white')# 2. 把形容词列表转换成以空格分割的字符串words_str = " ".join(key_word_list)# 3. 获取word_cloud产生的图像word_cloud_fig = word_cloud.generate(words_str)# 4. 使用plt展示词云plt.figure()plt.imshow(word_cloud_fig, interpolation='bilinear')plt.axis("off")plt.show()
4. 读取数据、搜索符合的正样本并取形容词列表,然后打平
def word_cloud_demo():# 1.获得训练集上正样本 p_train_data# 读取训练集,并转成df格式train_data = pd.read_csv('./cn_data/train.tsv', sep='\t')# 读取测试集,并转成df格式dev_data = pd.read_csv('./cn_data/dev.tsv', sep='\t')# 使用逻辑 ==操作检索符合正样本 train_data[train_data['label'] == 1]# 这里返回数据集正样本的sentence列p_train_data =train_data[train_data['label'] == 1]['sentence']# 获取每句话的形容词列表并且放在一起打平# 2 获取正样本的每个句子的形容词 p_a_train_vocab = chain(*map(a,b))key_word_list = chain(*map(lambda x:get_a_list(x),p_train_data))# 3 调用绘制词云函数get_word_cloud(key_word_list)
5. 训练样本
    # 训练集负样本n_train_data = train_data[train_data['label'] == 0]['sentence']key_word_list =chain(*map(lambda x:get_a_list(x),n_train_data))get_word_cloud(key_word_list)# 测试集正样本p_dev_data = dev_data[dev_data['label'] == 1]['sentence']key_word_list = chain(*map(lambda x: get_a_list(x), p_dev_data))get_word_cloud(key_word_list)# 测试集负样本n_dev_data = dev_data[dev_data['label'] == 0]['sentence']key_word_list = chain(*map(lambda x: get_a_list(x), n_dev_data))get_word_cloud(key_word_list)
6. 主程序
if __name__ == '__main__':word_cloud_demo()

五、文本特征处理

概念

文本处理的概念就是给文本增加特征,类似机器学习中的特征工程。

作用

提高模型训练的效果。

常见方法

1. n_gram

定义:相邻n个单词共现特征,n通常取值2或3。

作用:增加新的特征,提升模型评估指标。

代码实现:   set(zip(*[word_list[i:]  for i in range(n)]))

① 给定n的值,对序列切片,根据n的大小切n-1次

② *是拆包,zip函数是把不同序列按对应索引元素配对组成元组,长度冗余的部分舍去,注意:直接返回zip函数的结果是存储地址,所以下面使用到set。

③ 使用set集合去重,注意:set集合是无序的(但不完全随机,因为会取用hash)

n = 3
def n_gram(word_list):n_gram_list = []for index in range(n):n_gram_list.append(word_list[index:])return set(zip(*n_gram_list))

例如:给定序列[1,3,5,2,6,4]和n=2,通过以上操作得到的n_gram_list=[[1,3,5,2,6,4],[3,5,2,6,4]]

对于上述方法代码过长,我们可以通过列表表达式优化

def n_gram_new(word_list):return set(zip(*[word_list[i:] for i in range(n)]))

④ 主程序

if __name__ == '__main__':word_list = [1, 3, 2, 1, 5, 3]gram_result = n_gram(word_list)gram_new_result = n_gram_new(word_list)print(f'gram_result:{gram_result}')print(f'gram_new_result:{gram_new_result}')

2. 文本长度规范

定义:对语料的长度进行截断或者补充(一般补0),让每句话长度保持一致。

作用:对齐文本长度,满足模型的输入的尺寸要求(等尺寸大小的矩阵)。

实现:squence.pad_sequences(data , max_len  )
           padding: 在前面还是后面补齐 (pre/post)
           truncating:在前面还是后面截断 (pre/post)

① 导包,设置文本目标长度

② 设置长度规范函数

默认从前面进行截断或者填充操作;

如果想在后面进行截断或者填充操作,需要修改 padding='post' / truncating="post";

padding是补齐, truncating是截断

③主程序

# ① 导包,设置文本目标长度
from keras.preprocessing import sequencemax_len = 10# ② 设置长度规范函数def text_padding(X):return sequence.pad_sequences(X, maxlen=max_len)# return sequence.pad_sequences(X, maxlen=max_len,padding='post', truncating='post')# ③主程序
if __name__ == '__main__':x = [[1, 23, 5, 32, 55, 63, 2, 21, 78, 32, 23, 1],[2, 32, 1, 23, 1]]padding = text_padding(x)print(padding)

六、文本数据增强

定义

增加样本量和多样性,对数据集进行过采样。

作用

解决样本不均衡或者数据样本少的问题。

回译数据增强法

定义

基于各种翻译接口,将文本数据翻译成另外一种语言,之后再翻译回原语言,得到新语料,完成对原数据集数据增强。

优势

操作简便, 获得新语料质量高。

可能遇到的问题

在短文本回译过程中, 新语料与原语料可能存在很高的重复率, 并不能有效增大样本的特征空间。

解决方法

进行连续的多语言翻译。

实现方式

各大翻译api或者AI大模型。

http://www.lqws.cn/news/556813.html

相关文章:

  • 翻译服务器
  • Redis高级数据结构深度解析:BitMap、布隆过滤器、HyperLogLog与Geo应用实践
  • 趣味数据结构之——数组
  • Java 使用 Easy Excel 进行 Excel 数据导入导出
  • 一分钟了解思路链提示词(Chain-of-thought Prompting)
  • uni-app manifest.json 配置:定制化应用的各项功能和行为
  • 基于Pandas和FineBI的昆明职位数据分析与可视化实现(二)- 职位数据清洗与预处理
  • 《自动控制原理 》- 第 1 章 自动控制的基本原理与方式
  • Linux基本指令篇 —— more指令
  • PostgreSQL 中,若需显示 不在 `IN` 子句列表中的数据
  • SQL常用命令
  • 阿里云Ubuntu服务器上安装MySQL并配置远程连接
  • 网络缓冲区
  • Solidity学习 - 错误处理
  • ffpaly播放 g711a音频命令
  • 【学习笔记】深入理解Java虚拟机学习笔记——第12章 Java内存模型与线程
  • 设计模式之抽象工厂模式
  • Docker 入门教程(五):Docker 命令思维导图
  • 【分布式机架感知】分布式机架感知能力的主流存储系统与数据库软件
  • 微处理原理与应用篇---STM32寄存器控制GPIO
  • 矩阵的条件数(Condition Number of a Matrix)
  • 华为云Flexus+DeepSeek征文 | 基于华为云ModelArts Studio安装NoteGen AI笔记应用程序
  • Learning PostgresSQL读书笔记: 第11章 Transactions, MVCC, WALs, and Checkpoints
  • 基于Docker的mosquitto安装测试
  • FPGA设计的上板调试
  • python多线程详细讲解
  • Python爬虫实战:研究difflib库相关技术
  • Ubuntu 主机通过 `enp4s0` 向开发板共享网络的完整步骤
  • 默克树技术原理
  • 组成原理--指令指令集寻址方式的介绍