huggingface longformer 区分大小写的分词器
huggingface longformer case sensitive tokenizer
此 page 展示了如何构建基于 longformer 的分类。
import pandas as pd
import datasets
from transformers import LongformerTokenizerFast, LongformerForSequenceClassification, Trainer, TrainingArguments, LongformerConfig
import torch.nn as nn
import torch
from torch.utils.data import Dataset, DataLoader
import numpy as np
from sklearn.metrics import accuracy_score, precision_recall_fscore_support
from tqdm import tqdm
import wandb
import os
# load model and tokenizer and define length of the text sequence
model = LongformerForSequenceClassification.from_pretrained('allenai/longformer-base-4096',
gradient_checkpointing=False,
attention_window = 512)
tokenizer = LongformerTokenizerFast.from_pretrained('allenai/longformer-base-4096', max_length = 1024)
我注意到分词器对数据的大小写很敏感。单词 do
和 Do
在下面得到不同的标记。我不需要这样的行为。在提供给 longformer 之前,我总是可以将我的数据小写。但是有没有其他更好的方法来告诉分词器忽略数据的大小写?
encoded_input = tokenizer("Do not meddle in the affairs of wizards, for they are subtle and quick to anger.")
print(encoded_input)
{'input_ids': [0, 8275, 45, 31510, 459, 11, 5, 5185, 9, 44859, 6, 13, 51, 32, 12405, 8, 2119, 7, 6378, 4, 2], 'attention_mask': [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]}
encoded_input3 = tokenizer("do not meddle in the affairs of wizards, for they are subtle and quick to anger.")
print(encoded_input3)
{'input_ids': [0, 5016, 45, 31510, 459, 11, 5, 5185, 9, 44859, 6, 13, 51, 32, 12405, 8, 2119, 7, 6378, 4, 2], 'attention_mask': [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]}
在我看来,最好不要修改预训练 transformer 的标记化方案:它们是用特定词汇预训练的,改变它可能会导致它们的恶化。
如果你仍然想让系统对大小写不敏感,并且如果你想使用相同的模型和相同的分词器而不对其进行过多修改,那么将输入数据小写是一个明智的策略。
但是,如果您愿意花费资源更新模型和分词器,您可以执行以下操作:
- 修改分词器:在其管道中添加一个小写 normalizer。
- (可选)修改分词器的词汇表:删除未使用的包含大写字符的词,并可能添加一些小写词。模型的嵌入层和输出层应该进行相应的修改,并且没有针对此的标准化代码,因此不建议进行此类操作,除非您非常了解自己在做什么。尽管如此,此类操作仍可以提高模型性能。
- Fine-tune 使用更新的分词器在大型数据集上的模型(具有原始掩码语言建模任务)。这将使神经网络更好地了解它可能发现的新小写文本。
这将使系统更好地适应未区分大小写的文本,但会花费您的时间(编写用于更新词汇表的代码)和计算资源(fine-tune 模型)。
此 page 展示了如何构建基于 longformer 的分类。
import pandas as pd
import datasets
from transformers import LongformerTokenizerFast, LongformerForSequenceClassification, Trainer, TrainingArguments, LongformerConfig
import torch.nn as nn
import torch
from torch.utils.data import Dataset, DataLoader
import numpy as np
from sklearn.metrics import accuracy_score, precision_recall_fscore_support
from tqdm import tqdm
import wandb
import os
# load model and tokenizer and define length of the text sequence
model = LongformerForSequenceClassification.from_pretrained('allenai/longformer-base-4096',
gradient_checkpointing=False,
attention_window = 512)
tokenizer = LongformerTokenizerFast.from_pretrained('allenai/longformer-base-4096', max_length = 1024)
我注意到分词器对数据的大小写很敏感。单词 do
和 Do
在下面得到不同的标记。我不需要这样的行为。在提供给 longformer 之前,我总是可以将我的数据小写。但是有没有其他更好的方法来告诉分词器忽略数据的大小写?
encoded_input = tokenizer("Do not meddle in the affairs of wizards, for they are subtle and quick to anger.")
print(encoded_input)
{'input_ids': [0, 8275, 45, 31510, 459, 11, 5, 5185, 9, 44859, 6, 13, 51, 32, 12405, 8, 2119, 7, 6378, 4, 2], 'attention_mask': [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]}
encoded_input3 = tokenizer("do not meddle in the affairs of wizards, for they are subtle and quick to anger.")
print(encoded_input3)
{'input_ids': [0, 5016, 45, 31510, 459, 11, 5, 5185, 9, 44859, 6, 13, 51, 32, 12405, 8, 2119, 7, 6378, 4, 2], 'attention_mask': [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]}
在我看来,最好不要修改预训练 transformer 的标记化方案:它们是用特定词汇预训练的,改变它可能会导致它们的恶化。
如果你仍然想让系统对大小写不敏感,并且如果你想使用相同的模型和相同的分词器而不对其进行过多修改,那么将输入数据小写是一个明智的策略。
但是,如果您愿意花费资源更新模型和分词器,您可以执行以下操作:
- 修改分词器:在其管道中添加一个小写 normalizer。
- (可选)修改分词器的词汇表:删除未使用的包含大写字符的词,并可能添加一些小写词。模型的嵌入层和输出层应该进行相应的修改,并且没有针对此的标准化代码,因此不建议进行此类操作,除非您非常了解自己在做什么。尽管如此,此类操作仍可以提高模型性能。
- Fine-tune 使用更新的分词器在大型数据集上的模型(具有原始掩码语言建模任务)。这将使神经网络更好地了解它可能发现的新小写文本。
这将使系统更好地适应未区分大小写的文本,但会花费您的时间(编写用于更新词汇表的代码)和计算资源(fine-tune 模型)。