本文为学习Datawhale 2021.9组队学习情感分析笔记
原学习文档地址:https://github.com/datawhalechina/team-learning-nlp/tree/master/EmotionalAnalysis
最后一个任务再重走一遍全流程
1 设置随机种子数
"""1.set seed"""
SEED = 1234
torch.manual_seed(SEED)
torch.backends.cudnn.deterministic = True
torch.cuda.manual_seed(SEED)
torch.cuda.manual_seed_all(SEED)
2 加载数据
baseline的数据处理方式
"""2.load data"""
# 设置分词 标记器spacy,并指定使用模型
TEXT = data.Field(tokenize='spacy', tokenizer_language= 'en_core_web_sm')
LABEL = data.LabelField(dtype = torch.float)
# 如果之前运行过,数据会保存在那个文件夹里,这里运行的时候就不会再下了,可以手动把数据放一份到该目录下的.data
# 可以点进函数里手动下载后再保存
train_data, test_data = datasets.IMDB.splits(TEXT, LABEL)
# 设置seed确保每次的分割结果相同
train_data, valid_data = train_data.split(split_ratio=0.8, random_state=random.seed(SEED))
Transfomer模型实现的数据处理步骤需要进行分词,每一种Transformer模型都是使用特定的词汇进行训练的,所以我们需要使用每一种Transformer模型为我们提供的其专有的分词器(tokenizer)对我们的数据进行处理,除此之外还需要知道模型的最大输入长度和[CLS],[EOS]等特殊token对应的序号。
tokenizer = BertTokenizer.from_pretrained('distilbert-base-uncased')
max_input_length = tokenizer.max_model_input_sizes['bert-base-uncased']
init_token_idx = tokenizer.cls_token_id
eos_token_idx = tokenizer.eos_token_id
pad_token_idx = tokenizer.pad_token_id
unk_token_idx = tokenizer.unk_token_id
def tokenize_and_cut(sentence):
tokens = tokenizer.tokenize(sentence)
tokens = tokens[:max_input_length-2] # 减去了开始和结尾两个标志
return tokens
"""定义数据处理的字段"""
TEXT = data.Field(batch_first=True, # Transformer模型要求输入的数据第一维是bs
use_vocab=False, # 不需要切分数据了
tokenize=tokenize_and_cut,
preprocessing=tokenizer.convert_tokens_to_ids,
init_token=init_token_idx,
eos_token=eos_token_idx,
pad_token=pad_token_idx,
unk_token=unk_token_idx)
LABEL = data.LabelField(dtype=torch.float)
"""加载数据"""
train_data, test_data = datasets.IMDB.splits(TEXT, LABEL)
train_data, valid_data = train_data.split(random_state = random.seed(SEED))
3 不需要建立字典
字典就是为了创建text和idx的对应关系,因为有Transformer的tokenizer,所以此处不需要再建立字典了
4 创建迭代器