Dataset中通常为原始数据,需要经过一定的数据处理并进行采样组batch,而后通过 paddle.io.DataLoader
为训练或预测使用,PaddleNLP中为其中各环节提供了相应的功能支持。
基于预训练模型的数据处理
在使用预训练模型做NLP任务时,需要加载对应的Tokenizer,PaddleNLP在 PreTrainedTokenizer
中内置的 __call__()
方法可以实现基础的数据处理功能。PaddleNLP内置的所有预训练模型的Tokenizer都继承自 PreTrainedTokenizer
,下面以BertTokenizer举例说明:
from paddlenlp.transformers import BertTokenizer tokenizer = BertTokenizer.from_pretrained('bert-base-chinese') # 单句转换(单条数据) print(tokenizer(text='天气不错')) # {'input_ids': [101, 1921, 3698, 679, 7231, 102], 'token_type_ids': [0, 0, 0, 0, 0, 0]} # 句对转换(单条数据) print(tokenizer(text='天气',text_pair='不错')) # {'input_ids': [101, 1921, 3698, 102, 679, 7231, 102], 'token_type_ids': [0, 0, 0, 0, 1, 1, 1]} # 单句转换(多条数据) print(tokenizer(text=['天气','不错'])) # [{'input_ids': [101, 1921, 3698, 102], 'token_type_ids': [0, 0, 0, 0]}, # {'input_ids': [101, 679, 7231, 102], 'token_type_ids': [0, 0, 0, 0]}]
关于 __call__()
方法的其他参数和功能,请查阅PreTrainedTokenizer。
paddlenlp内置的 paddlenlp.datasets.MapDataset
的 map()
方法支持传入一个函数,对数据集内的数据进行统一转换。下面我们以 LCQMC
的数据处理流程为例:
from paddlenlp.transformers import BertTokenizer from paddlenlp.datasets import load_dataset tokenizer = BertTokenizer.from_pretrained('bert-base-chinese') train_ds = load_dataset('lcqmc', splits='train') print(train_ds[0]) # {'query': '喜欢打篮球的男生喜欢什么样的女生', 'title': '爱打篮球的男生喜欢什么样的女生', 'label': 1}
可以看到, LCQMC
是一个句对匹配任务,即判断两个句子的意思是否相似的2分类任务。我们需要处理的是key为 query 和 title 的文本数据,我们编写基于 PreTrainedTokenizer
的数据处理函数并传入数据集的 map()
方法。
def convert_example(example, tokenizer):