基于HuggingFace的BERT模型:替换[unusedX]令牌添加领域特定词汇
利用BERT的[unusedX]令牌添加领域特定词汇的方法
要替换BERT自带的[unusedX]令牌为领域词汇,关键是直接修改分词器的词汇映射表,同时要注意BertTokenizerFast和原生BertTokenizer的处理差异——你之前的方法没生效,是因为BertTokenizerFast基于Rust实现,不能直接修改Python层面的vocab字典,得用它的底层API操作。
以下是两种可行方案:
方案1:针对BertTokenizerFast(推荐)
直接修改分词器的词汇表,把目标[unusedX]令牌替换成领域词汇,步骤如下:
from transformers import BertTokenizerFast # 加载分词器 tokenizer = BertTokenizerFast.from_pretrained('bert-base-uncased') # 选择要替换的unused令牌,比如[unused701] unused_token = '[unused701]' domain_word = 'DomainSpecificWord' # 获取unused令牌的ID unused_id = tokenizer.vocab[unused_token] # 1. 更新词汇映射:移除unused令牌,添加领域词汇映射到同一ID del tokenizer.vocab[unused_token] tokenizer.vocab[domain_word] = unused_id # 2. 更新反向映射(id2token) del tokenizer.id2token[unused_id] tokenizer.id2token[unused_id] = domain_word # 3. 同步底层Rust分词器的词汇表 tokenizer._tokenizer.add_tokens([domain_word], special_tokens=True) # 手动设置词汇表以覆盖原unused令牌的ID tokenizer._tokenizer.set_vocab(tokenizer.vocab) # 测试编码结果 print(tokenizer.encode(domain_word, add_special_tokens=True)) # 输出示例:[101, 30522, 102](30522为原[unused701]的ID)
方案2:针对原生BertTokenizer
如果使用纯Python实现的BertTokenizer,可以直接修改词汇表:
from transformers import BertTokenizer tokenizer = BertTokenizer.from_pretrained('bert-base-uncased') unused_token = '[unused701]' domain_word = 'DomainSpecificWord' # 替换词汇映射 tokenizer.vocab[domain_word] = tokenizer.vocab.pop(unused_token) # 更新反向映射 tokenizer.id2token = {v: k for k, v in tokenizer.vocab.items()} # 测试编码结果 print(tokenizer.encode(domain_word, add_special_tokens=True))
关键注意事项
- 替换后原[unusedX]令牌会失效,需确保选择的unused令牌未被其他逻辑占用。
- 微调模型时无需调整embedding层维度:仅替换令牌映射,词汇表总长度不变,原[unusedX]对应的embedding权重可直接复用,微调时会自动更新为领域词汇的语义。
- 多词汇替换:重复上述步骤即可,每个领域词汇对应一个独立的[unusedX]令牌。
内容的提问来源于stack exchange,提问作者Carlos Muradyan
相关产品推荐
相关产品推荐

