HuggingFace Tokenizers 是一个面向研究与生产环境的快速分词工具库,官方定位为“Fast, production-ready tokenizers with Rust performance and Python ease-of-use”。其核心使用 Rust 实现,并提供 Python 与 Node.js 绑定,官方资料称可在 CPU 上 20 秒内完成 1GB 文本的分词,比纯 Python 实现快 10–100 倍。
【适用场景】 官方列出的适用场景包括:需要极快分词速度(每 GB 文本少于 20 秒);从零训练自定义分词器;需要对齐追踪(token 到原始文本位置);构建生产环境 NLP 流水线;高效地对大规模语料进行分词。若不满足上述需求,官方也说明可考虑替代方案:SentencePiece(语言无关,被 T5/ALBERT 使用)、tiktoken(OpenAI 面向 GPT 模型的 BPE 分词器)、transformers AutoTokenizer(仅用于加载预训练分词器,内部即使用本库)。
【安装与快速开始】 安装命令为 pip install tokenizers,如需与 transformers 集成则使用 pip install tokenizers transformers。 加载预训练分词器可通过 Tokenizer.from_pretrained("bert-base-uncased"),随后调用 tokenizer.encode() 得到 tokens 与 ids,并用 tokenizer.decode() 还原文本。代码示例显示输入 "Hello, how are you?" 得到 tokens 为 ['hello', ',', 'how', 'are', 'you', '?'],ids 为 [7592, 1010, 2129, 2024, 2017, 1029]。
【训练自定义 BPE 分词器】 示例中通过 Tokenizer(BPE(unk_token="[UNK]")) 初始化,设置 pre_tokenizer 为 Whitespace(),再用 BpeTrainer 配置 vocab_size=30000、special_tokens=["[UNK]", "[CLS]", "[SEP]", "[PAD]", "[MASK]"]、min_frequency=2,最后用 tokenizer.train(files, trainer) 在文件上训练并保存。官方给出训练时间参考:100MB 语料约 1–2 分钟,1GB 约 10–20 分钟。
【批量编码与填充】 可通过 tokenizer.enable_padding(pad_id=3, pad_token="[PAD]") 启用填充,再用 tokenizer.encode_batch(texts) 对文本列表批量编码。
【三种分词算法】
- BPE(Byte-Pair Encoding):从字符级词表开始,找最频繁字符对并合并,重复至词表大小达标;被 GPT-2、GPT-3、RoBERTa、BART、DeBERTa 使用。优点是能较好处理 OOV 词、词表大小灵活、适合形态丰富语言;权衡是分词依赖合并顺序,可能意外拆分常见词。
- WordPiece:从字符词表开始,用 frequency(pair) / (frequency(first) × frequency(second)) 对合并对评分,合并最高分对,重复至词表大小达标;被 BERT、DistilBERT、MobileBERT 使用。优点是优先进行有意义的合并;权衡是无子词匹配时未知词变为 [UNK],且保存的是词表而非合并规则(文件更大)。
- Unigram:从大词表(所有子串)开始,计算当前词表下语料损失,移除对损失影响最小的 token,重复至词表大小达标;被 ALBERT、T5、mBART、XLNet(经 SentencePiece)使用。优点是概率化、适合无词边界语言、能处理多样语言语境;权衡是训练计算开销大、需要调节的超参数更多。 每种算法均给出示例代码与关键参数说明。
【分词流水线】 完整流水线为:Normalization → Pre-tokenization → Model → Post-processing。 归一化(Normalization)用于清理和标准化文本,示例使用 Sequence([NFD(), Lowercase(), StripAccents()]),可将 "Héllo WORLD" 变为 "hello world"。常见归一化器包括 NFD/NFC/NFKD/NFKC(Unicode 归一化形式)、Lowercase()、StripAccents()、Strip()、Replace(pattern, content)。 预分词(Pre-tokenization)将文本拆分为类词单元,示例 Sequence([Whitespace(), Punctuation()]) 将 "Hello, world!" 拆为 ["Hello", ",", "world", "!"]。常见预分词器包括 Whitespace()、ByteLevel()、Punctuation()、Digits(individual_digits=True)、Metaspace()。 后处理(Post-processing)用于添加特殊 token,示例使用 TemplateProcessing 配置 BERT 风格 single="[CLS] $A [SEP]"、pair="[CLS] $A [SEP] $B [SEP]";亦给出 GPT-2 的 "$A <|endoftext|>" 与 RoBERTa 的 "<s> $A </s>" 等模式。
【对齐追踪】 通过 output.tokens 与 output.offsets 可把 token 映射回原文位置,官方给出 "Hello, world!" 示例,输出 hello → [0,5)、, → [5,6)、world → [7,12)、! → [12,13)。用途包括命名实体识别、问答答案片段抽取、token 分类标签对齐。
【与 transformers 集成】 可通过 AutoTokenizer.from_pretrained() 加载,tokenizer.is_fast 为 True;通过 tokenizer.backend_tokenizer 可访问底层 tokenizers.Tokenizer。自定义分词器可保存后用 PreTrainedTokenizerFast(tokenizer_file="my-tokenizer.json", ...) 包装为 transformers 分词器,并像普通分词器一样调用(支持 padding、truncation、max_length、return_tensors)。
【常见模式】 包括从迭代器训练(train_from_iterator,配合 datasets 使用,处理 1GB 约 10–20 分钟)、启用截断与填充(enable_truncation、enable_padding)、多进程编码(multiprocessing.Pool,官方称 8 核可获得 5–8 倍加速)。
【性能基准】 官方给出训练速度参考(16 核 CPU,英文 Wikipedia):10MB 语料下 BPE(30k) 约 15 秒、WordPiece(30k) 约 18 秒、Unigram(8k) 约 25 秒;100MB 下分别约 1.5 分钟、2 分钟、4 分钟;1GB 下分别约 15 分钟、20 分钟、40 分钟。分词速度参考:1GB 语料纯 Python 约 20 分钟(约 50 MB/min),HF Tokenizers 约 15 秒(约 4 GB/min),约 80 倍加速。内存占用参考:加载分词器约 10 MB,训练 BPE(30k) 约 200 MB,编码 100 万句约 500 MB。
【支持的预训练模型】 可通过 from_pretrained() 使用的预训练分词器示例包括:BERT 家族(bert-base-uncased、bert-large-cased、distilbert-base-uncased、roberta-base、roberta-large);GPT 家族(gpt2、gpt2-medium、gpt2-large、distilgpt2);T5 家族(t5-small、t5-base、t5-large、google/flan-t5-xxl);其他(facebook/bart-base、facebook/mbart-large-cc25、albert-base-v2、albert-xlarge-v2、xlm-roberta-base、xlm-roberta-large)。官方提供浏览入口 https://huggingface.co/models?library=tokenizers。
【参考与资源】 官方引用资料涵盖训练指南、算法深入解析、流水线组件、transformers 集成。资源包括文档 https://huggingface.co/docs/tokenizers、GitHub https://github.com/huggingface/tokenizers(9,000+ star)、版本 0.20.0+、课程 https://huggingface.co/learn/nlp-course/chapter6/1,以及论文 BPE(Sennrich et al., 2016)、WordPiece(Schuster & Nakajima, 2012)。
【限制】 官方资料未提供收费、价格与平台支持细节;除上述性能基准外未给出更多环境差异说明。