填充句子到相同长度

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]])
    """

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值