mcpField
S
sentencepiece

sentencepiece

github.com/orchestra-research开发14.1k960 次安装19 周前更新
代码仓库

关于 sentencepiece

SentencePiece 是面向原始文本的无监督分词器,无需语言专属预处理,适用于多语言模型与 CJK 文本。它支持训练子词模型,并提供确定性词表和采样式分词。

主要功能

  1. 01直接处理原始文本
  2. 02支持 BPE 与 Unigram
  3. 03训练自定义词表
  4. 04子词正则化采样
  5. 05编码与解码文本

适用场景

  1. 01训练多语言模型的分词器
  2. 02处理中文、日文或韩文文本
  3. 03通过采样分词增强训练数据

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/orchestra-research/ai-research-skills --skill sentencepiece

安装后在 Claude Code 中输入/sentencepiece确认已加载。

附带文件references/algorithms.mdreferences/training.md

详细介绍

SentencePiece - 与语言无关的分词

可在未经语言特定预处理的原始文本上运行的无监督分词器。

何时使用 SentencePiece

在以下情况下使用 SentencePiece:

  • 构建多语言模型(无需语言特定规则)
  • 处理 CJK 语言(中文、日语、韩语)
  • 需要可复现的分词(确定性词汇表)
  • 希望使用原始文本进行训练(无需预分词)
  • 需要轻量级部署(6MB 内存,每秒 50k 个句子)

性能:

  • 速度:每秒 50,000 个句子
  • 内存:加载模型约需 6MB
  • 语言:所有语言(与语言无关)

改用其他方案:

  • HuggingFace Tokenizers:训练更快,灵活性更高
  • tiktoken:OpenAI 模型(GPT-3.5/4)
  • BERT WordPiece:以英语为中心的任务

快速入门

安装
# Python
pip install sentencepiece

# C++ (requires CMake)
git clone https://github.com/google/sentencepiece.git
cd sentencepiece
mkdir build && cd build
cmake .. && make -j $(nproc)
sudo make install
训练模型
# Command-line (BPE with 8000 vocab)
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

# Load model
sp = spm.SentencePieceProcessor(model_file='m.model')

# Encode to pieces
pieces = sp.encode('This is a test', out_type=str)
print(pieces)  # ['▁This', '▁is', '▁a', '▁test']

# Encode to IDs
ids = sp.encode('This is a test', out_type=int)
print(ids)  # [284, 47, 11, 1243]

# Decode
text = sp.decode(ids)
print(text)  # "This is a test"

与语言无关的设计

将空白字符作为符号(▁)
text = "Hello world"
pieces = sp.encode(text, out_type=str)
print(pieces)  # ['▁Hello', '▁world']

# Decode preserves spaces
decoded = sp.decode_pieces(pieces)
print(decoded)  # "Hello world"

核心原则:将文本视为原始 Unicode,空白字符 = ▁(元符号)

分词算法

BPE(字节对编码)
spm.SentencePieceTrainer.train(
    input='data.txt',
    model_prefix='bpe_model',
    vocab_size=16000,
    model_type='bpe'
)

使用者:mBART

Unigram(默认)
spm.SentencePieceTrainer.train(
    input='data.txt',
    model_prefix='unigram_model',
    vocab_size=8000,
    model_type='unigram'
)

使用者:T5、ALBERT、XLNet

训练配置

必要参数
spm.SentencePieceTrainer.train(
    input='corpus.txt',
    model_prefix='m',
    vocab_size=32000,
    model_type='unigram',
    character_coverage=0.9995,  # 1.0 for CJK
    user_defined_symbols=['[SEP]', '[CLS]'],
    unk_piece='<unk>',
    num_threads=16
)
字符覆盖率
语言类型覆盖率原因
英语0.9995最常见的字符
CJK(中文)1.0需要所有字符
多语言0.9995平衡

编码选项

子词正则化
# Sample different tokenizations
for _ in range(3):
    pieces = sp.encode('tokenization', out_type=str, enable_sampling=True, alpha=0.1)
    print(pieces)

# Output (different each time):
# ['▁token', 'ization']
# ['▁tok', 'en', 'ization']

使用场景:用于提升鲁棒性的数据增强。

常见模式

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 集成
from transformers import T5Tokenizer

# T5 uses SentencePiece internally
tokenizer = T5Tokenizer.from_pretrained('t5-base')
inputs = tokenizer('translate English to French: Hello', return_tensors='pt')

性能基准

训练速度
语料BPE(16k)Unigram(8k)
100 MB1-2 分钟3-4 分钟
1 GB10-15 分钟30-40 分钟
分词速度
  • SentencePiece:每秒 50,000 个句子
  • HF Tokenizers:每秒 200,000 个句子(快 4×)

支持的模型

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)

参考资料

资源

评论

支持 Markdown