1 数据集准备
- 获取train.txt文件数据: with open(path, 'r', encoding='UTF-8') as f:
- 获取每一行数据:for line in tqdm(f): lin = line.strip()
- 保存为文本和标签: content, label = lin.split('\t')
- 分词,文本划分为token: config.tokenizer.tokenize(content)可以理解为 RobertaTokenizer.from_pretrained(self.bert_path).tokenize(content)
- 为token 拼接[CLS],是roberta用作分类任务必须需要的一个字符,[CLS]就是classification的意思,可以理解为用于下游分类的任务;
主要应用于两类下游任务:
(1)单文本分类任务: 对于文本分类任务,BERT模型在文本前插入一个[CLS]符号,并将与该符号对应的输出向量作为整篇文本的语义表示,用于文本分类 -- 与本文中已有的其他字词相比,这个无明显语义信息的符号会更“公平”的融合文本中各个字/词的语义信息;
(2)语句对分类任务: 该任务的实际应用场景包括:问答(判断一个问题与一个答案是否匹配)、语句匹配(两句话是否表达同一个意思)等。 -- BERT模型除了添加[CLS]符号并将对应的输出作为文本的语义表示,还对输入两句话用一个[SEP]符号作分割,并分别对两句话附加两个不同的文本向量以作区分;
6. 通过token获得token_ids:token_ids = config.tokenizer.convert_tokens_to_ids(token) -- 目的: 为了输入过程中的进一步输入进入bert进行位置embedding;
7. 对不足的文本进行pad补充:
(1) token的长度小于pad_size超参,首先对mask进行拼接,拼接为前边token_ids长度个数的1和最后补齐pad_size的0, token_ids的后半部分没有补东西,现在也把token_ids的最后补上0(vocab.txt中的第0位是[PAD]);
(2)如果token的长度已经等于或超过了pad_size超参了,则mask设置为pad_size长度的1,同时把token_ids进行截取;
8. train_data, dev_data, test_data整体数据处理好:vocab.txt中的角标、类别int类型,文本长度,一个待使用的mask;
9. 对数据集划分batch,每个batch包含数据:(x, seq_len, mask), y, x是vocab.txt中的角标,y是label, 都是torch.LongTensor类型;