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

NLP:文本特征处理和回译数据增强法

本文目录:

  • 一、添加n-gram特征
    • (一)概念
    • (二)提取n-gram特征
  • 二、文本长度规范及其作用
    • (一)截断(Truncation)
    • (二)填充(Padding)
  • 三、回译数据增强法

**前言:**前文讲解了文本数据处理,这篇文章讲解NLP的文本特征处理。

文本特征处理主要有 添加n-gram特征文本长度规范两种方式。

一、添加n-gram特征

(一)概念

N-gram是自然语言处理(NLP)中的一种基础但强大的文本特征表示方法,用于捕捉局部词序信息。

假设给定分词列表: ["是谁", "敲动", "我心"]对应的数值映射列表为: [1, 34, 21]我们可以认为数值映射列表中的每个数字是词汇特征.除此之外, 我们还可以把"是谁""敲动"两个词共同出现且相邻也作为一种特征加入到序列列表中,假设1000就代表"是谁""敲动"共同出现且相邻此时数值映射列表就变成了包含2-gram特征的特征列表: [1, 34, 21, 1000]这里的"是谁""敲动"共同出现且相邻就是bi-gram特征中的一个."敲动""我心"也是共现且相邻的两个词汇, 因此它们也是bi-gram特征.假设1001代表"敲动""我心"共同出现且相邻那么, 最后原始的数值映射列表 [1, 34, 21] 添加了bi-gram特征之后就变成了 [1, 34, 21, 1000, 1001]

(二)提取n-gram特征

代码:

# 一般n-gram中的n取2或者3, 这里取2为例
ngram_range = 2def create_ngram_set(input_list):"""description: 从数值列表中提取所有的n-gram特征:param input_list: 输入的数值列表, 可以看作是词汇映射后的列表, 里面每个数字的取值范围为[1, 25000]:return: n-gram特征组成的集合eg:>>> create_ngram_set([1, 3, 2, 1, 5, 3]){(3, 2), (1, 3), (2, 1), (1, 5), (5, 3)}""" return set(zip(*[input_list[i:] for i in range(ngram_range)]))

调用:

input_list = [1, 3, 2, 1, 5, 3]
res = create_ngram_set(input_list)
print(res)

运行结果:

# 该输入列表的所有bi-gram特征
{(3, 2), (1, 3), (2, 1), (1, 5), (5, 3)}

二、文本长度规范及其作用

一般模型的输入需要等尺寸大小的矩阵, 因此在进入模型前需要对每条文本数值映射后的长度进行规范:分析出覆盖绝大多数文本的合理长度, 然后对超长文本进行截断, 对不足文本进行补齐(一般使用数字0)。

(一)截断(Truncation)

作用:丢弃超出最大长度的部分文本。

适用场景:文本长度分布长尾,且尾部信息冗余。

实现示例(PyTorch):

max_len = 128
text = "这是一段非常长的文本..."  # 假设分词后为词ID列表
truncated_text = text[:max_len]  # 保留前128个词

(二)填充(Padding)

作用:将短文本补至固定长度。

适用场景:文本长度差异较小,且尾部信息重要。

实现示例:

from torch.nn.utils.rnn import pad_sequencetexts = [[1, 2, 3], [4, 5]]  # 两个样本的词ID列表
padded_texts = pad_sequence([torch.tensor(x) for x in texts], batch_first=True, padding_value=0)  # 填充0

输出结果:

tensor([[1, 2, 3],[4, 5, 0]])

另外,pad_sequence是个很有用的方法,也可以设置截断(其本身包含truncating参数,而post和pre可设置前后操作方向)。

from tensorflow.keras.preprocessing import sequence
list_new=[[1,2,3,4,5],[1,2,3,4,5,6,7,8,9,10]]#list_new=sequence.pad_sequences(list_new,maxlen=5,truncating='pre')#输出:[[ 1  2  3  4  5][ 6  7  8  9 10]]
#list_new=sequence.pad_sequences(list_new,maxlen=10,truncating='pre')#输出:[[ 0  0  0  0  0  1  2  3  4  5][ 0  0  0  0  0  6  7  8  9 10]]
list_new=sequence.pad_sequences(list_new,maxlen=10,padding='post')#输出[[ 1  2  3  4  5  0  0  0  0  0][ 1  2  3  4  5  6  7  8  9 10]]
print(list_new)

三、回译数据增强法

回译数据增强目前是文本数据增强方面效果较好的增强方法, 一般基于google、有道等翻译接口, 将文本数据翻译成另外一种语言(一般选择小语种),之后再翻译回原语言, 即可认为得到与与原语料同标签的新语料, 新语料加入到原数据集中即可认为是对原数据集数据增强。

回译数据增强优势: * 操作简便, 获得新语料质量高。

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

高重复率解决办法: * 进行连续的多语言翻译, 如: 中文→韩文→日语→英文→中文, 但最多只采用3次连续翻译, 更多的翻译次数将产生效率低下, 语义失真等问题。

今天的分享到此结束。

http://www.dtcms.com/a/268617.html

相关文章:

  • Mac-右键用 VS Code 打开文件夹
  • 【Echarts】“折线+柱状”实现双图表-家庭用电量可视化【文章附完整代码】
  • 泛微虚拟视图-数据虚拟化集成
  • 从库函数到API接口,深挖不同语言背后的“封装”与“调用”思想
  • pytest通过pytest_runtest_makereport添加失败截图到Allure报告中
  • 常见问题与最佳实践——AI教你学Docker
  • 1-Kafka介绍及常见应用场景
  • 学习基于springboot秒杀系统-环境配置(接口封装,mybatis,mysql,redis(Linux))
  • 2025年全国青少年信息素养大赛图形化(Scratch)编程小学低年级组初赛样题答案+解析
  • 登山第二十六梯:单目3D检测一切——一只眼看世界
  • 【C++开源库使用】使用libcurl开源库发送url请求(http请求)去下载用户头像文件(附完整源码)
  • 【R语言】 在读取 CSV 或 Excel 文件时的标准输出
  • 自定义简单线性回归模型
  • 【AI大模型】神经网络反向传播:核心原理与完整实现
  • 电脑电压过高的影响与风险分析
  • 轨迹优化 | 基于激光雷达的欧氏距离场ESDF地图构建(附ROS C++仿真)
  • 回溯题解——子集【LeetCode】二进制枚举法
  • ssh: Could not resolve hostname d: Temporary failure in name resolution
  • 从依赖地狱到依赖天堂PNPM
  • 01、通过内网穿透工具把家中闲置电脑变成在线服务器
  • C盘瘦身 -- 虚拟内存文件 pagefile.sys
  • (六)PS识别:源数据分析- 挖掘图像的 “元语言”技术实现
  • python list去重
  • 【Behavior Tree】-- 行为树AI逻辑实现- Unity 游戏引擎实现
  • Docker 将镜像打成压缩包将压缩包传到服务器运行
  • 物联网技术的关键技术与区块链发展趋势的深度融合分析
  • Java SE与Java EE使用方法及组件封装指南
  • 安卓10.0系统修改定制化_____安卓9与安卓10系统文件差异 有关定制选项修改差异
  • Java 并发编程中的同步工具类全面解析
  • qiankun隔离机制