HuggingFace Tokenizers 是一个快速、可用于生产环境的分词库,采用 Rust 核心实现,同时提供 Python 与 Node.js 绑定,兼顾性能与易用性。
用途 该库适用于需要极快分词的场景(官方称每 GB 文本分词耗时不到 20 秒)、从零训练自定义分词器、需要对齐追踪(token 对应原文位置)、构建生产级 NLP 流水线,以及高效分词大规模语料。官方也指出,若只需加载预训练分词器,可使用 transformers 的 AutoTokenizer(其内部即使用本库);SentencePiece 与 tiktoken 是可选替代方案。
主要能力
- 支持 BPE、WordPiece、Unigram 三种分词算法。
- 提供完整的处理流水线:归一化(Normalization)→ 预分词(Pre-tokenization)→ 模型(Model)→ 后处理(Post-processing)。
- 支持从 HuggingFace Hub 加载预训练分词器,也支持从文件或迭代器训练自定义分词器。
- 支持批量编码、填充(padding)、截断(truncation)。
- 支持对齐追踪,可获取每个 token 在原文中的偏移量。
- 可与 transformers 集成,通过 AutoTokenizer 使用,或用 PreTrainedTokenizerFast 包装自定义分词器。
- 支持多进程并行处理大规模语料。
使用方式 安装: pip install tokenizers
与 transformers 集成
pip install tokenizers transformers
加载预训练分词器: from tokenizers import Tokenizer tokenizer = Tokenizer.from_pretrained("bert-base-uncased") output = tokenizer.encode("Hello, how are you?") print(output.tokens) print(output.ids) text = tokenizer.decode(output.ids)
训练自定义 BPE 分词器: from tokenizers import Tokenizer from tokenizers.models import BPE from tokenizers.trainers import BpeTrainer from tokenizers.pre_tokenizers import Whitespace tokenizer = Tokenizer(BPE(unk_token="[UNK]")) tokenizer.pre_tokenizer = Whitespace() trainer = BpeTrainer( vocab_size=30000, special_tokens=["[UNK]", "[CLS]", "[SEP]", "[PAD]", "[MASK]"], min_frequency=2 ) files = ["train.txt", "validation.txt"] tokenizer.train(files, trainer) tokenizer.save("my-tokenizer.json")
批量编码与填充: tokenizer.enable_padding(pad_id=3, pad_token="[PAD]") texts = ["Hello world", "This is a longer sentence"] encodings = tokenizer.encode_batch(texts)
从迭代器训练(适合大数据集): tokenizer.train_from_iterator(batch_iterator(), trainer=trainer, length=len(dataset))
启用截断与填充: tokenizer.enable_truncation(max_length=512) tokenizer.enable_padding(pad_id=tokenizer.token_to_id("[PAD]"), pad_token="[PAD]", length=512)
与 transformers 集成: from transformers import AutoTokenizer tokenizer = AutoTokenizer.from_pretrained("bert-base-uncased") print(tokenizer.is_fast) fast_tokenizer = tokenizer.backend_tokenizer
from transformers import PreTrainedTokenizerFast transformers_tokenizer = PreTrainedTokenizerFast( tokenizer_file="my-tokenizer.json", unk_token="[UNK]", pad_token="[PAD]", cls_token="[CLS]", sep_token="[SEP]", mask_token="[MASK]" )
多进程处理: from multiprocessing import Pool tokenizer = Tokenizer.from_file("tokenizer.json") def encode_batch(texts): return tokenizer.encode_batch(texts) with Pool(8) as pool: results = pool.map(encode_batch, chunks)
适用场景
- 构建生产级 NLP 流水线,需要高速分词。
- 训练领域专用或语言专用的自定义分词器。
- 命名实体识别、问答、token 分类等需要将预测结果映射回原文位置的任务(对齐追踪)。
- 大规模语料的高效批量分词。
限制与说明
- 官方资料未提供收费、价格或平台限制信息。
- 训练速度与分词速度的基准数据来自官方在特定硬件(16 核 CPU、英文维基百科)上的测试,实际表现可能因环境而异。
- 不同算法各有取舍:BPE 分词依赖合并顺序,可能意外拆分常见词;WordPiece 在无子词匹配时会产生 [UNK],且保存的是词表而非合并规则(文件更大);Unigram 训练计算开销较大,超参数更多。
- 若仅需加载预训练分词器,官方建议考虑 transformers 的 AutoTokenizer 或 SentencePiece、tiktoken 等替代方案。
参考资源
- 文档:https://huggingface.co/docs/tokenizers
- GitHub:https://github.com/huggingface/tokenizers
- 课程:https://huggingface.co/learn/nlp-course/chapter6/1
- 模型浏览:https://huggingface.co/models?library=tokenizers
- 版本:0.20.0+