SuperAPI AI 工具集

sentencepiece

智能体与模型

查看项目

更新于 10-15 13:03

技能介绍

SentencePiece 是一个无监督、与语言无关的分词器,直接在原始文本上工作,不需要针对特定语言做预处理。它把文本当作原始 Unicode 处理,将空白符视为一个元符号(▁),因此可以统一处理包括中日韩(CJK)在内的各种语言。

用途

适合在以下情况使用 SentencePiece:构建多语言模型(无需语言特定规则);处理 CJK 语言(中文、日文、韩文);需要可复现的分词(确定性词表);希望在原始文本上训练(无需预分词);需要轻量部署(约 6MB 内存,约 50,000 句/秒)。

主要能力

支持两种分词算法:BPE(Byte-Pair Encoding,被 mBART 使用)和 Unigram(默认,被 T5、ALBERT、XLNet 使用)。支持子词正则化(subword regularization),通过采样产生不同分词结果,可用于数据增强以提升鲁棒性。支持自定义符号(user_defined_symbols)、未知词符号(unk_piece)等训练配置。

性能:速度约 50,000 句/秒;加载模型内存约 6MB;支持所有语言(与语言无关)。

使用方式

安装: 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 install

训练模型: 命令行(BPE,词表 8000): spm_train --input=data.txt --model_prefix=m --vocab_size=8000 --model_type=bpe Python API: import sentencepiece as spm spm.SentencePieceTrainer.train( input='data.txt', model_prefix='m', vocab_size=8000, model_type='bpe' ) 资料称 100MB 语料训练时间约 1-2 分钟。

编码与解码: import sentencepiece as spm sp = spm.SentencePieceProcessor(model_file='m.model') pieces = sp.encode('This is a test', out_type=str) print(pieces) # ['▁This', '▁is', '▁a', '▁test'] ids = sp.encode('This is a test', out_type=int) print(ids) # [284, 47, 11, 1243] text = sp.decode(ids) print(text) # "This is a test"

语言无关设计:空白符作为符号(▁)。例如 "Hello world" 编码为 ['▁Hello', '▁world'],解码后保留空格。核心原则:将文本视为原始 Unicode,空白符 = ▁(元符号)。

训练配置要点: 常用参数包括 input、model_prefix、vocab_size、model_type、character_coverage、user_defined_symbols、unk_piece、num_threads。 字符覆盖率(character_coverage):英文常用 0.9995;CJK(中文)用 1.0(需要所有字符);多语言用 0.9995 以平衡。

编码选项:子词正则化,通过 enable_sampling=True 和 alpha 参数采样不同分词,例如: for _ in range(3): pieces = sp.encode('tokenization', out_type=str, enable_sampling=True, alpha=0.1) print(pieces) 每次输出不同,可用于数据增强。

常见模式:T5 风格训练示例: spm.SentencePieceTrainer.train( input='c4_corpus.txt', model_prefix='t5', vocab_size=32000, model_type='unigram', user_defined_symbols=[f'<extra_id_{i}>' for i in range(100)], unk_id=2, eos_id=1, pad_id=0 ) 与 transformers 集成:T5 内部使用 SentencePiece,例如: from transformers import T5Tokenizer tokenizer = T5Tokenizer.from_pretrained('t5-base') inputs = tokenizer('translate English to French: Hello', return_tensors='pt')

适用场景

多语言模型训练、CJK 文本处理、需要确定性词表的可复现分词、在原始文本上直接训练、轻量部署场景。

限制与替代

资料指出,若追求更快的训练和更高灵活性,可考虑 HuggingFace Tokenizers;OpenAI 模型(GPT-3.5/4)使用 tiktoken;英文为中心的任务可用 BERT WordPiece。性能对比:SentencePiece 约 50,000 句/秒,HF Tokenizers 约 200,000 句/秒(快约 4 倍)。训练速度参考:100MB 语料 BPE(16k)约 1-2 分钟、Unigram(8k)约 3-4 分钟;1GB 语料 BPE 约 10-15 分钟、Unigram 约 30-40 分钟。

支持模型:T5 系列(t5-base、t5-large,32k 词表,Unigram)、ALBERT(albert-base-v2,30k 词表,Unigram)、XLNet(xlnet-base-cased,32k 词表,Unigram)、mBART(facebook/mbart-large-50,250k 词表,BPE)。

参考:GitHub https://github.com/google/sentencepiece ;论文 https://arxiv.org/abs/1808.06226 (EMNLP 2018);版本 0.2.0+。