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

发布于:2025-07-08 ⋅ 阅读:(14) ⋅ 点赞:(0)


**前言:**前文讲解了文本数据处理,这篇文章讲解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次连续翻译, 更多的翻译次数将产生效率低下, 语义失真等问题。

今天的分享到此结束。


网站公告

今日签到

点亮在社区的每一天
去签到