1 背景
在进行词向量转换时(词嵌入),由于各个句子长短不一,无法直接转换成张量,这时就需要对较短的句子进行填充(padding),以满足张量输入对于形状的要求。
2 方法一
np.pad(array, pad_width, mode, **kwargs) # 返回填充后的 numpy 数组
import copy
import numpy as np
# 将一系列句子填充到指定长度
def padding(lst: list, max_len: int = None):
# 填充后的句子列表
lst_pad = copy.deepcopy(lst)
# 填充后的长度
max_len = len(max(X, key=len)) if max_len is None else max_len
for inx, x in enumerate(lst):
x = np.array(x)
# 需要填充的长度
pad_len = max_len - len(x)
lst_pad[inx] = np.pad(x, (0, pad_len)).tolist()
return lst_pad
if __name__ == '__main__':
# 句子的词汇库索引表示
X = [[1], [2, 3], [4, 5, 6]]
print("填充前的X:{X}".format(X=X))
X_pad = padding(X, 4)
print("填充后的X:{X}".format(X=X_pad))
"""
填充前的X:[[1], [2, 3], [4, 5, 6]]
填充后的X:[[1, 0, 0, 0], [2, 3, 0, 0], [4, 5, 6, 0]]
"""
3 方法二
pad_sequence(sequences, batch_first, padding_value) # 返回填充后的 tensor 张量
import copy
import torch
from torch.nn.utils.rnn import pad_sequence
# 将一系列句子填充到指定长度
def padding(lst: list):
# List[Tensor]
lst_pad = [torch.tensor(x) for x in copy.deepcopy(lst)]
return pad_sequence(lst_pad, batch_first=True)
if __name__ == '__main__':
# 句子的词汇库索引表示
X = [[1], [2, 3], [4, 5, 6]]
print("填充前的X:{X}".format(X=X))
X_pad = padding(X)
print("填充后的X:{X}".format(X=X_pad))
"""
填充前的X:[[1], [2, 3], [4, 5, 6]]
填充后的X:tensor([[1, 0, 0],
[2, 3, 0],
[4, 5, 6]])
"""