google/sentencepiece

Unsupervised text tokenizer for Neural Network-based text generation.

SentencePiece – 与语言无关的子词分词器

简介 – SentencePiece 是一个快速、轻量级的库(C++ 核心,提供 Python、Go、Rust 等绑定),直接从原始文本学习和应用子词分词模型。它支持两种最常见的子词算法——字节对编码(BPE)和 Unigram 语言模型——并生成一个独立的 .model 文件,可在任何地方使用,无需额外预处理。

为什么对 AI 很重要 – 现代神经语言模型(例如 LLM、翻译系统、语音转文本流水线)需要固定大小的词汇表。SentencePiece 让您可以完全以数据驱动的方式创建该词汇表,处理空白、Unicode 和没有明确词边界的语言(如中文、日文、泰文等),而无需任何特定语言的标记器。分词是无损的:可以精确重建原始字符串,从而简化下游的分词还原。

主要功能

  • 语言无关的训练 – 输入原始句子;无需外部分词器。
  • 两种子词算法 – BPE 和 Unigram,两者均支持可选的子词正则化(采样)和用于数据增强的 BPE‑Dropout。
  • 快速的 C++ 实现 – 约 5 万句/秒,内存占用约 6 MiB。
  • 零依赖运行时(SentencePiece Lite) – 一个微型 C++20 库(约 45 KB 静态库),可内存映射,用于设备端或高吞吐量服务器。
  • 跨语言绑定 – Python(pip install sentencepiece)、Go、Rust 以及纯 C API。
  • 自包含模型文件 – .model 文件捆绑了词汇表、规范化规则和分词逻辑,确保跨平台结果一致。
  • 经基准测试的性能 – 在多线程工作负载下,比 Hugging Face 的 fast tokenizers 快 4-10 倍(参见 README 中的表格)。

典型工作流(Python)

import sentencepiece as spm
# 1️⃣ 从原始文本文件训练
spm.SentencePieceTrainer.train(
    input='data.txt', model_prefix='my', vocab_size=8000)

# 2️⃣ 加载模型
sp = spm.SentencePieceProcessor(model_file='my.model')

# 3️⃣ 编码/解码
ids   = sp.encode('Hello world!', return_type=int)
pieces = sp.encode('Hello world!', return_type=str)
print(sp.decode(ids))   # → "Hello world!"

同样的模型可以从 C++、Go 或 Rust 使用等效的 API。

何时使用

  • 构建需要自定义子词词汇表的新 LLM、翻译或语音模型。
  • 处理缺乏明确词分隔符的语言。
  • 在需要小巧、无依赖运行时的大众设备或高吞吐量服务器上部署分词。
  • 希望跨多个编程环境实现确定性、可逆的分词。

资源 – 仓库包含丰富的文档(CLI 指南、C++/Python API 参考、训练选项速查表、Docker 部署说明)以及用于重现性的性能基准测试套件。

许可证 – Apache 2.0(宽松,商业友好)。

相关

  • 项目
  • Dispatch
  • Dispatch
  • 项目
  • 项目