文本长度规范 - 代码实现
1 课程概览
本课演示文本长度规范的代码实现,包括截断(超过固定长度截取)和补齐(不足固定长度用 0 填充)。提供两种实现方式:①使用 TensorFlow/Keras 的 pad_sequences API;②纯 Python 基础代码实现。
2 核心概念与定义
- 文本长度规范(Text Length Normalization):统一数据长度,使模型输入为等尺寸矩阵。
- 截断(Truncation):文本长度超过固定长度时,截取前面的部分。
- 补齐(Padding):文本长度不足固定长度时,用 0 填充至固定长度。
- pad_sequences:TensorFlow/Keras 提供的文本长度规范 API。
3 模型与算法详解
文本长度规范流程
- 确定固定长度:根据句子长度分布分析确定(如
cut_len=10) - 截断:长度 > 固定长度 → 截取前面部分
- 补齐:长度 < 固定长度 → 用 0 填充
两种实现方式
| 方式 | 说明 | 优点 | 缺点 |
|---|---|---|---|
| 方式一 | TensorFlow/Keras API | 代码简洁 | 有红色警告 |
| 方式二 | 纯 Python | 无警告、易理解 | 代码稍长 |
固定长度选择
- 根据文本数据分析中的句子长度分布确定
- 大多数句子集中在哪个长度,就用该长度作为固定长度
4 数学原理与推导
截断操作
给定文本序列 $X = [x_1, x_2, ..., x_m]$,固定长度 $L$:
$$\text{Truncate}(X, L) = [x_1, x_2, ..., x_L] \quad \text{if } m > L$$
补齐操作
$$\text{Pad}(X, L) = [x_1, x_2, ..., x_m, 0, 0, ..., 0] \quad \text{if } m < L$$
补齐后长度为 $L$,补齐 $L - m$ 个 0。
5 代码示例
方式一:使用 TensorFlow/Keras API
from tensorflow.keras.preprocessing.sequence import pad_sequences
# 1. 定义变量,记录截断/补齐长度
cut_len = 10 # 根据语料库句子长度分布自行定义
# 2. 定义函数,对输入文本进行截断补齐(第三方包)
def dm01_padding(x_train):
"""
使用 pad_sequences 进行截断补齐
:param x_train: 训练集(词索引列表)
"""
# maxlen: 最大长度
# padding: 'post' 表示在末尾补齐
# truncating: 'post' 表示在末尾截断
result = pad_sequences(
x_train,
maxlen=cut_len,
padding='post',
truncating='post'
)
print("截断补齐结果:", result)
return result
# 测试
x_train = [
[1, 2, 3, 5, 3, 12, 4, 5, 6, 7, 8, 9], # 长度 > 10,截断
[1, 2, 3, 5] # 长度 < 10,补齐
]
dm01_padding(x_train)
方式二:纯 Python 实现
# 纯 Python 实现文本长度规范
def dm02_padding_python(x_train, cut_len=10):
"""
纯 Python 实现截断补齐
:param x_train: 训练集
:param cut_len: 固定长度
"""
result = []
for sequence in x_train:
if len(sequence) > cut_len:
# 截断:取前 cut_len 个
result.append(sequence[:cut_len])
elif len(sequence) < cut_len:
# 补齐:末尾补 0
result.append(sequence + [0] * (cut_len - len(sequence)))
else:
# 长度正好
result.append(sequence)
print("截断补齐结果:", result)
return result
# 测试
x_train = [
[1, 2, 3, 5, 3, 12, 4, 5, 6, 7, 8, 9], # 截断
[1, 2, 3, 5] # 补齐
]
dm02_padding_python(x_train, cut_len=10)
输出示例
截断补齐结果:
[[1, 2, 3, 5, 3, 12, 4, 5, 6, 7], # 截断(原长度12→10)
[1, 2, 3, 5, 0, 0, 0, 0, 0, 0]] # 补齐(原长度4→10,补6个0)
6 重难点与易错提醒
- ❗重点:截断(超过截取)和补齐(不足用 0 填充)是核心操作。
- ❗重点:固定长度根据句子长度分布分析确定。
- ⚠️易错:
pad_sequences会产生红色警告,但不影响使用。 - 💡深入理解:模型输入需要等尺寸矩阵,因此必须统一长度。
- 💡深入理解:纯 Python 实现可避免第三方包警告,且更易理解。
7 课堂问答精选
Q1:什么是文本长度规范?
A:统一数据长度,使模型输入为等尺寸矩阵。超过固定长度的截断,不足的用 0 补齐。
Q2:如何确定固定长度?
A:根据文本数据分析中的句子长度分布确定。查看大多数句子集中在哪个长度,就用该长度作为固定长度。
Q3:截断和补齐分别是什么?
A:截断是文本长度超过固定长度时,截取前面的部分;补齐是文本长度不足固定长度时,用 0 填充至固定长度。
Q4:有哪两种实现方式?
A:①使用 TensorFlow/Keras 的 pad_sequences API;②纯 Python 基础代码实现(切片 + 列表拼接)。
8 本课小结
- 文本长度规范:统一数据长度,截断 + 补齐。
- 截断:长度 > 固定长度 → 截取前面部分。
- 补齐:长度 < 固定长度 → 用 0 填充。
- 固定长度:根据句子长度分布确定。
- 两种实现:
pad_sequencesAPI 或纯 Python。
9 延伸思考
- 截断和补齐的位置(前/后)对模型性能有什么影响?
- 除了用 0 补齐,还有其他补齐方式吗?