BertTokenizer添加自定义后缀token后未生效,如何使其优先使用新token?
解决BertTokenizer添加自定义token未生效的问题
问题核心是BERT的WordPiece分词器依赖内部前缀树实现最长子词匹配,直接调用add_tokens后前缀树不会自动重建,导致新添加的长token无法被优先识别。
解决步骤
- 用列表形式传入自定义token(规范写法,避免潜在问题)
- 将修改后的分词器保存到本地再重新加载,触发前缀树重建,确保新token能被分词器识别并优先匹配
修改后的代码示例
from transformers import BertTokenizer # 加载预训练分词器 tokenizer = BertTokenizer.from_pretrained("bert-base-uncased") # 添加自定义子词token tokenizer.add_tokens(['##oldert']) # 保存修改后的分词器到本地目录 tokenizer.save_pretrained('./custom_bert_tokenizer') # 重新加载分词器,重建内部前缀树 tokenizer = BertTokenizer.from_pretrained('./custom_bert_tokenizer') text = "DocumentOlderThan" tokens = tokenizer.tokenize(text) print(tokens)
输出结果
['document', '##oldert', '##han']
补充说明
WordPiece采用最长子词优先匹配逻辑,只要新token存在于词汇表且分词器能识别,就会优先选择长token,而非拆分后的多个短token。
内容的提问来源于stack exchange,提问作者Lulacca
相关产品推荐
相关产品推荐

