如何向已有的Huggingface AutoTokenizer中添加新token?
如何向已有的Huggingface AutoTokenizer中添加新token?
要在现有AutoTokenizer基础上扩展词汇表(不重新训练、保留原token索引),你需要使用add_tokens()方法,而非train_new_from_iterator()——后者会从头训练新的tokenizer,完全替换原有的词汇体系。
错误方法回顾
你之前尝试的train_new_from_iterator()会重新训练tokenizer,导致原token的索引被覆盖,新token从预留ID之后开始分配:
import pandas as pd def batch_iterator(batch_size=3, size=8): df = pd.DataFrame({"note_text": ['foobar', 'helloworld']}) for x in range(0, size, batch_size): yield df['note_text'].to_list() old_tokenizer = AutoTokenizer.from_pretrained('roberta-base') training_corpus = batch_iterator() new_tokenizer = old_tokenizer.train_new_from_iterator(training_corpus, 32000) print(len(old_tokenizer)) print(old_tokenizer( ['foobarzz', 'helloworld'] )) print(new_tokenizer( ['foobarzz', 'hello world'] ))
输出:
50265 {'input_ids': [[0, 21466, 22468, 7399, 2], [0, 20030, 1722, 39949, 2]], 'attention_mask': [[1, 1, 1, 1, 1], [1, 1, 1, 1, 1]]} {'input_ids': [[0, 275, 2], [0, 276, 2]], 'attention_mask': [[1, 1, 1], [1, 1, 1]]}
正确实现方法
使用add_tokens()直接向现有tokenizer添加新token,新token的ID会从原词汇表长度开始分配:
from transformers import AutoTokenizer # 加载原有tokenizer old_tokenizer = AutoTokenizer.from_pretrained('roberta-base') print(f"原词汇表大小: {len(old_tokenizer)}") # 定义要添加的新token new_tokens = ['foobar', 'helloworld'] # 添加新token num_added_tokens = old_tokenizer.add_tokens(new_tokens) print(f"成功添加 {num_added_tokens} 个新token") print(f"扩展后词汇表大小: {len(old_tokenizer)}") # 测试效果 test_texts = ['foobar', 'helloworld', 'foobarzz'] print(old_tokenizer(test_texts))
输出示例:
原词汇表大小: 50265 成功添加 2 个新token 扩展后词汇表大小: 50267 {'input_ids': [[0, 50265, 2], [0, 50266, 2], [0, 50265, 22468, 7399, 2]], 'attention_mask': [[1, 1, 1], [1, 1, 1], [1, 1, 1, 1, 1]]}
注意事项
- 添加token后,如果要将新词汇表应用到模型,需要同步扩展模型的embedding层:
from transformers import AutoModel model = AutoModel.from_pretrained('roberta-base') model.resize_token_embeddings(len(old_tokenizer)) add_tokens()支持批量添加单个token,也可以添加子词(但需确保tokenizer的分词逻辑兼容)。
内容的提问来源于stack exchange,提问作者alvas
相关产品推荐
相关产品推荐

