Transformer中tokenizer的使用:分词、token_id与token转换

该博客介绍了如何利用transformers库中的BertTokenizer对中文文本进行分词,包括添加特殊标记和填充操作,以便于后续的注意力可视化。同时,对比了不包含填充和特殊标记的简单分词方式。内容适合于自然语言处理和深度学习的实践者。
摘要由CSDN通过智能技术生成

我们使用transformer中的tokenizer进行分词,如何获得分词后的句子呢?

from transformers import BertTokenizer
tokenizer = BertTokenizer.from_pretrained('bert-base-chinese')
text = '今天是个好天气,我们可以出去走走。'
token_ids = tokenizer.encode(text, max_length = 30, add_special_tokens = True, padding = 'max_length', truncation = True)
# [101, 791, 1921, 3221, 702, 1962, 1921, 3698, 8024, 2769, 812, 1377, 809, 1139, 1343, 6624, 6624, 511, 102, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]

tokened_text = tokenizer.convert_ids_to_tokens(token_ids)
# ['[CLS]', '今', '天', '是', '个', '好', '天', '气', ',', '我', '们', '可', '以', '出', '去', '走', '走', '。', '[SEP]', '[PAD]', '[PAD]', '[PAD]', '[PAD]', '[PAD]', '[PAD]', '[PAD]', '[PAD]', '[PAD]', '[PAD]', '[PAD]']

这样,我们得到的 token_ids 和  tokened_text 是同样维度的,如果后续需要文本attention可视化,这样做会方便很多

当然,如果只是为了分词,也可以这样做:

tokened_text = tokenizer.tokenize(text)
# ['今', '天', '是', '个', '好', '天', '气', ',', '我', '们', '可', '以', '出', '去', '走', '走', '。']

只不过这样得到的分词,是不包含padding部分,以及special token的。

  • 7
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我可以为您提供一个使用Transformer实现文本分类任务的简单基础应用的教程和PyCharm可运行代码。 1. 数据集准备 我们使用IMDB电影评论数据集,该数据集包含50,000个电影评论,每个评论标注为正面或负面情感。我们将使用80%的数据作为训练集,20%的数据作为测试集。 首先,从以下链接下载数据集:http://ai.stanford.edu/~amaas/data/sentiment/ 将数据集解压缩到您选择的目录。您应该会看到一个名为“aclImdb”的文件夹,其包含“train”和“test”两个子文件夹,分别包含训练和测试数据。 我们将使用torchtext库来加载和预处理数据集。请确保已安装此库。 2. 数据处理 接下来,我们将使用torchtext库来预处理数据集。我们将使用Field对象来指定如何处理每个字段(例如文本和标签)。我们将使用TabularDataset对象来加载数据集,并将其转换为可以用于训练的迭代器。 请注意,我们使用的是预训练的语言模型(BERT)来处理文本数据。因此,我们需要使用BERT tokenizer来将文本转换为标记。我们将使用transformers库tokenizer。 首先,我们将定义Field对象来处理文本和标签: ```python import torchtext from transformers import BertTokenizer # Load the BERT tokenizer tokenizer = BertTokenizer.from_pretrained('bert-base-uncased') # Define the text and label fields TEXT = torchtext.data.Field(batch_first=True, use_vocab=False, tokenize=tokenizer.encode, pad_token=tokenizer.pad_token_id, unk_token=tokenizer.unk_token_id) LABEL = torchtext.data.LabelField(dtype=torch.float) ``` 然后,我们将使用TabularDataset对象加载数据集,并将其转换为可以用于训练的迭代器: ```python from torchtext.datasets import IMDB train_data, test_data = IMDB.splits(TEXT, LABEL, root="./aclImdb") # Use 80% of the data for training, 20% for validation train_data, valid_data = train_data.split(split_ratio=0.8) # Create batches of size 32 for training and validation BATCH_SIZE = 32 train_iterator, valid_iterator, test_iterator = torchtext.data.BucketIterator.splits((train_data, valid_data, test_data), batch_size=BATCH_SIZE, sort_key=lambda x: len(x.text), repeat=False) ``` 3. 模型定义 接下来,我们将定义Transformer模型。我们将使用transformers库的预训练模型(BERT)作为我们的编码器,它将输入文本转换为特征向量。我们将添加一个简单的分类器来预测情感标签。 ```python import torch import torch.nn as nn from transformers import BertModel class Transformer(nn.Module): def __init__(self): super().__init__() self.encoder = BertModel.from_pretrained('bert-base-uncased') self.classifier = nn.Linear(self.encoder.config.hidden_size, 1) def forward(self, input_ids, attention_mask): outputs = self.encoder(input_ids=input_ids, attention_mask=attention_mask) pooled_output = outputs[1] logits = self.classifier(pooled_output) return logits ``` 4. 训练模型 我们现在已经准备好训练我们的模型了。我们将使用二元交叉熵损失函数和Adam优化器。我们将使用GPU加速训练过程。 ```python device = torch.device('cuda' if torch.cuda.is_available() else 'cpu') # Create the model model = Transformer().to(device) # Define the loss and optimizer criterion = nn.BCEWithLogitsLoss() optimizer = torch.optim.Adam(model.parameters()) # Define the training loop def train(model, iterator, optimizer, criterion): epoch_loss = 0 model.train() for batch in iterator: input_ids = batch.text.to(device) attention_mask = (input_ids != tokenizer.pad_token_id).type(torch.uint8).to(device) labels = batch.label.to(device) optimizer.zero_grad() logits = model(input_ids, attention_mask) loss = criterion(logits.squeeze(-1), labels) loss.backward() optimizer.step() epoch_loss += loss.item() return epoch_loss / len(iterator) # Define the evaluation loop def evaluate(model, iterator, criterion): epoch_loss = 0 model.eval() with torch.no_grad(): for batch in iterator: input_ids = batch.text.to(device) attention_mask = (input_ids != tokenizer.pad_token_id).type(torch.uint8).to(device) labels = batch.label.to(device) logits = model(input_ids, attention_mask) loss = criterion(logits.squeeze(-1), labels) epoch_loss += loss.item() return epoch_loss / len(iterator) # Train the model N_EPOCHS = 5 best_valid_loss = float('inf') for epoch in range(N_EPOCHS): train_loss = train(model, train_iterator, optimizer, criterion) valid_loss = evaluate(model, valid_iterator, criterion) if valid_loss < best_valid_loss: best_valid_loss = valid_loss torch.save(model.state_dict(), 'model.pt') print(f'Epoch: {epoch+1:02} | Train Loss: {train_loss:.3f} | Val. Loss: {valid_loss:.3f}') # Test the model model.load_state_dict(torch.load('model.pt')) test_loss = evaluate(model, test_iterator, criterion) print(f'Test Loss: {test_loss:.3f}') ``` 5. 结果分析 我们训练了一个简单的Transformer模型来执行情感分类任务。我们使用IMDB电影评论数据集进行了训练和测试,并使用二元交叉熵损失函数和Adam优化器进行了优化。 在最后一轮训练后,我们保存了具有最佳验证损失的模型,并使用它来评估测试集。最终测试损失为0.276。 您可以在PyCharm运行上面的代码,只需在文件顶部导入所需的库即可。请确保已安装以下库:torch, transformers, torchtext。 希望这个教程对您有所帮助!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值