**前言:**前文讲解了文本数据处理,这篇文章讲解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 = 2
def 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_sequence
texts = [[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次连续翻译, 更多的翻译次数将产生效率低下, 语义失真等问题。
今天的分享到此结束。