如何从Hugging Face PreTrainedTokenizer中移除Token并保存?
从Hugging Face PreTrainedTokenizer中移除Token的推荐方法
由于直接修改词汇表文件的方式已被弃用且不适用于所有Tokenizer,推荐通过以下通用步骤移除指定Token并保存更新后的Tokenizer:
1. 提取并过滤现有词汇表
先获取Tokenizer的完整词汇表,过滤掉需要移除的Token集合:
from transformers import AutoTokenizer # 加载原始Tokenizer tokenizer = AutoTokenizer.from_pretrained("your-model-name") # 定义要移除的Token集合 tokens_to_remove = {"[UNUSED0]", "unused_token_1", "some-token"} # 过滤词汇表:保留不在移除列表中的Token filtered_vocab = {token: idx for token, idx in tokenizer.get_vocab().items() if token not in tokens_to_remove}
2. 重新初始化Tokenizer
根据原始Tokenizer的类型,用过滤后的词汇表构建新的Tokenizer实例,需保留原始Tokenizer的核心配置(如大小写转换、特殊Token设置):
示例:BERT类Tokenizer
from transformers import BertTokenizer new_tokenizer = BertTokenizer( vocab=None, vocab_dict=filtered_vocab, do_lower_case=tokenizer.do_lower_case, unk_token=tokenizer.unk_token, sep_token=tokenizer.sep_token, pad_token=tokenizer.pad_token, cls_token=tokenizer.cls_token, mask_token=tokenizer.mask_token )
示例:GPT2类Tokenizer
from transformers import GPT2Tokenizer new_tokenizer = GPT2Tokenizer( vocab=None, merges_file=None, vocab_dict=filtered_vocab, merges=tokenizer.merges, # 保留原始BPE合并规则 unk_token=tokenizer.unk_token, bos_token=tokenizer.bos_token, eos_token=tokenizer.eos_token, pad_token=tokenizer.pad_token )
3. 保存更新后的Tokenizer
使用save_pretrained方法将新Tokenizer保存到本地,后续可通过from_pretrained加载使用:
new_tokenizer.save_pretrained("./updated-tokenizer")
注意事项
- FastTokenizer兼容性:若原始Tokenizer是
PreTrainedTokenizerFast(多数默认加载的Tokenizer),直接修改词汇表可能导致后端tokenizer逻辑(如SentencePiece、BPE)异常。建议先转换为普通Tokenizer(加载时使用非Fast版本,如GPT2Tokenizer而非GPT2TokenizerFast)再操作,或根据需求重新训练FastTokenizer。 - 模型适配:若后续要将更新后的Tokenizer与预训练模型配合使用,需同步调整模型的embedding层权重,裁剪掉对应已移除Token的embedding向量,避免维度不匹配或无效权重问题。
内容的提问来源于stack exchange,提问作者Bram Vanroy
相关产品推荐
相关产品推荐

