资讯动态

SentencePiece 子词分词完全指南:语言无关的 BPE / Unigram 分词器实战

发布时间:2026/9/23 2:32:47 来源:尧图企业网站定制
SentencePiece 子词分词完全指南语言无关的 BPE / Unigram 分词器实战【免费下载链接】AI-Research-SKILLsComprehensive open-source library of AI research and engineering skills for any AI model. Package the skills and your claude code/codex/gemini agent will be an AI research agent with full horsepower. Maintained by Orchestra Research.项目地址: https://gitcode.com/gh_mirrors/ai/AI-Research-SKILLsSentencePiece 是 Google 开源的语言无关language-independent子词分词器它将文本视为原始 Unicode 序列直接处理无需任何语言专属的预分词规则因此天然适合多语言模型、CJK中文/日文/韩文场景以及需要可复现分词结果的科研与工程任务。在本仓库的 AI Research Skills 体系中它被定位为「子词分词Subword tokenization」任务的指定技能参见 技能路由表。读完本文你将掌握 SentencePiece 的安装、训练、编码/解码全流程理解 BPE 与 Unigram 两种核心算法及其适用场景并能在 T5、ALBERT、XLNet、mBART 等主流模型生态中直接落地使用。何时使用 SentencePiece优先选择 SentencePiece 的场景构建多语言模型无需任何语言专属规则同一套流程处理所有语言处理 CJK 语言中文、日文、韩文这些语言没有显式词边界SentencePiece 直接在原始文本上切分需要可复现的分词结果词表vocabulary确定性生成同一语料产出完全一致的模型希望在原始文本上直接训练不需要预分词pre-tokenization环节追求轻量部署加载后的模型仅占用约 6MB 内存分词吞吐约 5 万句/秒。性能概览指标数值分词速度约 50,000 句/秒模型加载内存约 6MB支持语言全部语言无关何时改用替代方案HuggingFace Tokenizers训练更快、灵活性更高Rust 核心实现可追踪 token 与原文字符的对齐关系详见 02-tokenization/huggingface-tokenizers/SKILL.mdtiktokenOpenAI GPT-3.5/4 系列模型使用BERT WordPiece偏英语中心的任务。在仓库的 Tokenization 分类下两个技能是互补关系HuggingFace Tokenizers 负责「高性能与自定义分词器训练」SentencePiece 负责「子词分词」见 技能路由表。快速开始安装# Python pip install sentencepiece # C需要 CMake git clone https://github.com/google/sentencepiece.git cd sentencepiece mkdir build cd build cmake .. make -j $(nproc) sudo make installPython 环境安装后即可使用spm.SentencePieceTrainer训练与spm.SentencePieceProcessor推理两个核心类。训练模型# 命令行BPE8000 词表 spm_train --inputdata.txt --model_prefixm --vocab_size8000 --model_typebpe # Python API import sentencepiece as spm spm.SentencePieceTrainer.train( inputdata.txt, model_prefixm, vocab_size8000, model_typebpe )训练耗时参考约 100MB 语料 1~2 分钟。编码与解码import sentencepiece as spm # 加载模型 sp spm.SentencePieceProcessor(model_filem.model) # 编码为子词片段 pieces sp.encode(This is a test, out_typestr) print(pieces) # [▁This, ▁is, ▁a, ▁test] # 编码为 token ID ids sp.encode(This is a test, out_typeint) print(ids) # [284, 47, 11, 1243] # 解码还原 text sp.decode(ids) print(text) # This is a test注意out_type参数决定编码结果的形态str返回可读的子词片段int返回词表索引 ID。decode接受 ID 列表并还原原始文本。语言无关的设计核心▁ 元符号SentencePiece 最关键的机制是将空白符作为普通字符处理训练前先把空白替换为元符号▁U2581解码时再还原为空格。这样分词器无需预先按空格切词从根源上绕开了「语言是否有词边界」的问题。text Hello world pieces sp.encode(text, out_typestr) print(pieces) # [▁Hello, ▁world] # 解码保留空格 decoded sp.decode_pieces(pieces) print(decoded) # Hello world核心原则把文本当作原始 Unicode 处理空白 ▁元符号。这也是它在 CJK 场景表现优异的原因——中文句子不需要先分词直接切出有意义的子词单元。Tokenization 算法BPE 与 UnigramSentencePiece 支持四种model_typeunigram默认、bpe、char、word。其中 BPE 与 Unigram 是最常用的两种详细原理见 references/algorithms.md。BPEByte-Pair Encoding算法流程以字符集初始化词表统计相邻 token 对的共现频率合并出现频率最高的对重复直到达到目标词表大小。示例语料low:5, lower:2, newest:6, widest:3第 1 轮最高频对为es9 次合并为es第 2 轮最高频为est9 次合并为est结果newest→new|estwidest→wid|est。spm.SentencePieceTrainer.train( inputdata.txt, model_prefixbpe_model, vocab_size16000, model_typebpe )优势算法简单、训练快、压缩比好。劣势分词结果是确定性的无法采样可能意外拆散常见词。代表模型mBARTfacebook/mbart-large-5025 万词表。Unigram默认推荐算法流程从超大种子词表覆盖所有子串出发计算每个 token 的概率逐步剔除对整体损失影响最小的 token重复直到达到目标词表大小。概率分词示例对 lowestOption 1: [low, est] P 0.02 × 0.03 0.0006 ← 概率最高被选中 Option 2: [l, o, w, est] P 0.01 × 0.015 × 0.01 × 0.03 0.000000045spm.SentencePieceTrainer.train( inputdata.txt, model_prefixunigram_model, vocab_size8000, model_typeunigram )优势概率式分词支持采样对形态丰富的语言效果更好天然支持子词正则化。劣势训练较慢、算法更复杂。代表模型T5、ALBERT、XLNet。两种算法对比特性BPEUnigram训练速度快慢分词方式确定性概率式支持采样否是常见词表大小16k–32k8k–32k代表模型mBARTT5, ALBERT, XLNet训练配置详解核心参数spm.SentencePieceTrainer.train( # 必填 inputcorpus.txt, # 输入语料 model_prefixoutput, # 输出前缀 vocab_size8000, # 目标词表大小 # 算法 model_typeunigram, # unigram、bpe、char、word # 覆盖率 character_coverage0.9995, # 多数语言 0.9995CJK 用 1.0 # 归一化 normalization_rule_namenmt_nfkc, # nmt_nfkc、nfkc、identity # 性能 num_threads16, # 训练线程数 input_sentence_size10000000 # 最大加载句子数 )特殊 token 配置spm.SentencePieceTrainer.train( inputcorpus.txt, model_prefixm, vocab_size32000, # 控制符号模型控制用特殊 token control_symbols[s, /s, pad], # 用户自定义符号永不切分 user_defined_symbols[[MASK], [SEP], [CLS]], # 特殊 token 的 piece 形式 unk_pieceunk, bos_pieces, eos_piece/s, pad_piecepad, # 特殊 token 的 ID unk_id0, bos_id1, eos_id2, pad_id3 )高级选项spm.SentencePieceTrainer.train( inputcorpus.txt, model_prefixm, vocab_size32000, # 字节回退处理未知字符如 emoji byte_fallbackTrue, # 数字处理 split_digitsTrue, # 数字逐位切分 # 脚本切分 split_by_unicode_scriptTrue, # 按 Unicode 脚本切分 split_by_whitespaceTrue, # 按空白切分 # 长度约束 max_sentencepiece_length16, # 单个 token 最大长度 # 低频词处理 min_frequency2, # token 最低出现频次 # 训练规模 input_sentence_size10000000, # 最大句子数 shuffle_input_sentenceTrue, # 打乱训练数据 # 种子词表 seed_sentencepiece_size1000000 # 种子词表大小 )各参数的详细说明与调优建议可参考 references/training.md。从 Python 迭代器训练大数据集import sentencepiece as spm from datasets import load_dataset # 加载数据集 dataset load_dataset(wikitext, wikitext-103-raw-v1, splittrain) # 创建迭代器 def corpus_iterator(): for example in dataset: if example[text].strip(): yield example[text] # 从迭代器训练 spm.SentencePieceTrainer.train( sentence_iteratorcorpus_iterator(), model_prefixwiki, vocab_size32000, model_typeunigram )train结束后会输出两个文件m.model二进制模型与m.vocab文本词表分别用于推理加载和词表检查。字符覆盖率Character Coveragecharacter_coverage决定训练时覆盖语料中字符的比例未覆盖的字符将落入未知 token。注意它只作用于训练时字符级采样而非切分限制。语言类型建议覆盖率原因英语0.9995覆盖 a-z、A-Z、标点及常见重音即可CJK中文1.0汉字体系必须全部覆盖多语言0.9995–1.0在覆盖率与词表大小间取平衡# 中文语料全覆盖 spm.SentencePieceTrainer.train( inputzh_corpus.txt, character_coverage1.0 )词表大小选择任务词表大小依据英语单语16k–32k标准配置多语言32k–250k语言越多词表越大CJK32k–100k汉字字符基数大代码16k–32k与英语类似归一化规则Normalization归一化在训练与推理前对文本做统一化处理直接影响 token 的稳定性nmt_nfkc推荐NFKC Unicode 归一化 空白处理适合绝大多数任务identity不做任何归一化原样保留输入适用于代码、大小写敏感任务nfkc标准 NFKC 归一化强度低于nmt_nfkc。normalization_rule_nameidentity # 代码 / 大小写敏感场景编码选项子词正则化Subword RegularizationUnigram 模型支持在编码时对同一文本采样多种合法切分从而对训练数据做隐式增强sp spm.SentencePieceProcessor(model_filem.model) # 采样不同切分 for _ in range(3): pieces sp.encode(tokenization, out_typestr, enable_samplingTrue, alpha0.1) print(pieces) # 输出每次不同 # [▁token, ization] # [▁tok, en, ization] # [▁token, iz, ation]alpha参数正则化强度0.0确定性分词不采样0.1轻微扰动推荐平衡点0.5高扰动1.0最大扰动。收益① 鲁棒性——模型学到多种合法切分② 数据增强——训练样本更多样③ 泛化——减少对特定切分的过拟合。代表应用mT5、XLM-RoBERTa。实践上推荐训练时开启采样、推理时关闭确定性模式以获得一致输出。# 训练循环中的用法 for batch in dataloader: tokens sp.encode(batch[text], enable_samplingTrue, alpha0.1) # 训练模型...NBest 编码获取多种切分候选sp spm.SentencePieceProcessor(model_filem.model) # 获取 top-5 切分 nbest sp.nbest_encode(tokenization, nbest_size5, out_typestr) for pieces, score in nbest: print(f{pieces} (log prob: {score:.4f})) # 输出 # [▁token, ization] (log prob: -2.34) # [▁tok, en, ization] (log prob: -2.41) # [▁token, iz, ation] (log prob: -2.57)应用场景① 集成分词——对多种切分结果取平均② 不确定性估计——观察分数方差③ 调试——理解分词器行为。常见模式T5 风格训练T5 使用 Unigram 100 个extra_id_*哨兵 token 作为去噪目标spm.SentencePieceTrainer.train( inputc4_corpus.txt, model_prefixt5, vocab_size32000, model_typeunigram, user_defined_symbols[fextra_id_{i} for i in range(100)], unk_id2, eos_id1, pad_id0 )与 transformers 集成from transformers import T5Tokenizer # T5 内部使用 SentencePiece tokenizer T5Tokenizer.from_pretrained(t5-base) inputs tokenizer(translate English to French: Hello, return_tensorspt)性能基准训练速度语料BPE (16k)Unigram (8k)100 MB1–2 分钟3–4 分钟1 GB10–15 分钟30–40 分钟分词速度SentencePiece约 50,000 句/秒HF Tokenizers约 200,000 句/秒约 4 倍。若吞吐成为瓶颈可参考仓库中 HuggingFace Tokenizers 技能Rust 核心1GB 语料 20 秒。性能优化实践多线程训练spm.SentencePieceTrainer.train( inputlarge_corpus.txt, num_threads32 # 使用全部核心 )加速比16 核心下约 4–8 倍。超大语料采样# 大于 10GB 语料采样 1000 万句 spm.SentencePieceTrainer.train( inputhuge_corpus.txt, input_sentence_size10000000, shuffle_input_sentenceTrue )超大规模语料10GBspm.SentencePieceTrainer.train( inputmassive_corpus.txt, train_extremely_large_corpusTrue, # 为 10GB 语料启用 input_sentence_size100000000 )支持的主流模型模型词表算法T5 系列t5-base、t5-large32kUnigramALBERTalbert-base-v230kUnigramXLNetxlnet-base-cased32kUnigrammBARTfacebook/mbart-large-50250kBPE最佳实践清单多数任务优先 Unigram对多语言更友好CJK 语料设character_coverage1.0保证汉字全覆盖使用nmt_nfkc归一化通用场景表现稳定为特殊 token 添加user_defined_symbols如 BERT 风格[CLS]/[SEP]开启byte_fallback增强对 emoji 与生僻字的鲁棒性词表从 32000 起步多数任务的良好默认值开启多线程训练显著缩短训练时间多语言场景选 Unigram、追求速度选 BPE按需求权衡训练开启子词正则化alpha0.1、推理用确定性模式兼顾鲁棒与一致。深入阅读SentencePiece 训练指南——完整的训练参数、语料准备与性能调优Tokenization 算法详解——BPE 与 Unigram 算法对比及子词正则化原理技能路由表——了解该技能在自动研究流程中的定位与触发场景HuggingFace Tokenizers 技能——需要更高吞吐或对齐追踪时的互补方案。版本说明以上用法基于 sentencepiece 0.2.0 与 transformers 最新稳定版的 Python API命令行工具spm_train/spm_spm_encode参数与 Python API 一一对应可放心混用。【免费下载链接】AI-Research-SKILLsComprehensive open-source library of AI research and engineering skills for any AI model. Package the skills and your claude code/codex/gemini agent will be an AI research agent with full horsepower. Maintained by Orchestra Research.项目地址: https://gitcode.com/gh_mirrors/ai/AI-Research-SKILLs创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价