fastNLP.core.field

class fastNLP.core.field.Padder(pad_val=0, **kwargs)[源代码]

别名 fastNLP.Padder fastNLP.core.field.Padder

所有padder都需要继承这个类,并覆盖__call__方法。 用于对batch进行padding操作。传入的element是inplace的,即直接修改element可能导致数据变化,建议inplace修改之前deepcopy一份。

__call__(self, contents, field_name, field_ele_dtype):
__init__(pad_val=0, **kwargs)[源代码]
参数
  • contents (List[Any]) -- 传入的element是inplace的,即直接修改element可能导致数据变化,建议inplace修改之前 deepcopy一份。

  • field_name (str,) -- field的名称。

  • field_ele_dtype (np.int64,np.float64,np.str,None,) -- 该field的内层元素的类型。如果该field的ignore_type为True,该这个值为None。

返回

np.array([padded_element])

class fastNLP.core.field.AutoPadder(pad_val=0)[源代码]

基类 fastNLP.Padder

别名 fastNLP.AutoPadder fastNLP.core.field.AutoPadder

根据contents的数据自动判定是否需要做padding。

1 如果元素类型(元素类型是指field中最里层元素的数据类型, 可以通过FieldArray.dtype查看,比如['This', 'is', ...]的元素类 型为str, [[1,2], ...]的元素类型为int)的数据不为数值类型则不会进行pad

2 如果元素类型为数值类型,比如np.int64, np.float64, int, float, torch.int64等

2.1 如果该field的内容为数值类型(包括int, float等),比如为seq_len, 则不进行padding

2.2 如果该field的内容等价于一维list, 那么会将Batch中的List pad为一样长。

2.3 如果该field的内容等价于二维list,那么会按照英语character padding的方式进行padding。如果是character padding建议使用
class

fastNLP.EngChar2DPadder.

2.4 如果该field的内容等价于三维list,则如果每个instance在每个维度上相等,会组成一个batch的tensor返回,这种情况应该是为图片

的情况。

3 其它情况不进行处理,返回一个np.array类型。

class fastNLP.core.field.EngChar2DPadder(pad_val=0, pad_length=0)[源代码]

基类 fastNLP.Padder

别名 fastNLP.EngChar2DPadder fastNLP.core.field.EngChar2DPadder

用于为英语执行character级别的2D padding操作。对应的field内容应该类似[['T', 'h', 'i', 's'], ['a'], ['d', 'e', 'm', 'o']], 但这个Padder只能处理index为int的情况。

padded过后的batch内容,形状为(batch_size, max_sentence_length, max_word_length). max_sentence_length为这个batch中最大句 子长度;max_word_length为这个batch中最长的word的长度:

from fastNLP import DataSet
from fastNLP import EngChar2DPadder
from fastNLP import Vocabulary
dataset = DataSet({'sent': ['This is the first demo', 'This is the second demo']})
dataset.apply(lambda ins:[list(word) for word in ins['sent'].split()], new_field_name='chars')
vocab = Vocabulary()
vocab.from_dataset(dataset, field_name='chars')
vocab.index_dataset(dataset, field_name='chars')
dataset.set_input('chars')
padder = EngChar2DPadder()
dataset.set_padder('chars', padder)  # chars这个field的设置为了EnChar2DPadder
__init__(pad_val=0, pad_length=0)[源代码]
参数
  • pad_val -- int, pad的位置使用该index

  • pad_length -- int, 如果为0则取一个batch中最大的单词长度作为padding长度。如果为大于0的数,则将所有单词的长度 都pad或截取到该长度.