sentencepiece

sentencepiece

无监督神经网络文本分词与去分词工具

SentencePiece是一种用于神经网络文本生成系统的无监督分词工具。它支持多种子词算法,如BPE和unigram语言模型,可直接从原始文本训练。这个工具具有语言无关性,实现了子词正则化,运行速度快,占用资源少。SentencePiece能直接生成词汇ID序列,执行NFKC标准化,是一个完全端到端的系统,无需依赖特定语言的预处理或后处理。

SentencePiece分词子词单元自然语言处理机器翻译Github开源项目

SentencePiece

构建 C++ 构建 Wheels GitHub 问题 PyPI 版本 PyPi 下载量 欢迎贡献 许可证 SLSA 3

SentencePiece 是一个无监督的文本分词器和去分词器,主要用于基于神经网络的文本生成系统,其中词汇表大小在神经模型训练之前预先确定。SentencePiece 实现了子词单元(例如,字节对编码(BPE)[Sennrich et al.])和unigram 语言模型[Kudo.]),并扩展了直接从原始句子训练的功能。SentencePiece 允许我们构建一个纯粹的端到端系统,不依赖于特定语言的预处理/后处理。

这不是 Google 的官方产品。

技术亮点

  • 纯数据驱动:SentencePiece 从句子中训练分词和去分词模型。不总是需要预分词(Moses 分词器/MeCab/KyTea)。
  • 语言无关:SentencePiece 将句子仅视为 Unicode 字符序列。没有语言相关的逻辑。
  • 多种子词算法:支持 BPE [Sennrich et al.] 和 unigram 语言模型 [Kudo.]。
  • 子词正则化:SentencePiece 实现了子词采样,用于子词正则化BPE-dropout,有助于提高 NMT 模型的鲁棒性和准确性。
  • 快速且轻量:分割速度约为 50k 句/秒,内存占用约为 6MB。
  • 自包含:只要使用相同的模型文件,就能获得相同的分词/去分词结果。
  • 直接生成词汇 id:SentencePiece 管理词汇到 id 的映射,可以直接从原始句子生成词汇 id 序列。
  • 基于 NFKC 的规范化:SentencePiece 执行基于 NFKC 的文本规范化。

对于不熟悉 SentencePiece 作为软件/算法的人,可以阅读这里的温和介绍

与其他实现的比较

特性SentencePiecesubword-nmtWordPiece
支持的算法BPE, unigram, char, wordBPEBPE*
开源?Google 内部
子词正则化
Python 库 (pip)不适用
C++ 库不适用
需要预分割?
可自定义规范化(如 NFKC)不适用
直接 id 生成不适用

注意,WordPiece 使用的 BPE 算法与原始 BPE 略有不同。

概述

什么是 SentencePiece?

SentencePiece 是子词单元的重新实现,这是一种缓解神经机器翻译中开放词汇问题的有效方法。SentencePiece 支持两种分割算法,字节对编码(BPE) [Sennrich et al.] 和 unigram 语言模型 [Kudo.]。以下是与其他实现的主要区别。

唯一标记的数量是预先确定的

神经机器翻译模型通常使用固定的词汇表。与大多数假设无限词汇表的无监督词分割算法不同,SentencePiece 训练分割模型时确保最终词汇表大小是固定的,例如 8k、16k 或 32k。

请注意,SentencePiece 为训练指定最终词汇表大小,这与 subword-nmt 使用合并操作次数不同。合并操作次数是 BPE 特有的参数,不适用于其他分割算法,包括 unigram、word 和 character。

从原始句子训练

以前的子词实现假设输入句子已经预先分词。这种限制是为了高效训练而必需的,但使得预处理变得复杂,因为我们必须事先运行特定语言的分词器。

SentencePiece的实现足够快,可以直接从原始句子训练模型。这对于训练中文和日语的分词器和去分词器特别有用,因为这些语言中单词之间没有明确的空格。

将空白作为基本符号处理

自然语言处理的第一步是文本分词。例如,标准的英语分词器会将文本"Hello world."分割成以下三个标记:

[Hello] [World] [.]

一个观察结果是,原始输入和分词后的序列是不可逆转换的。例如,"World"和"."之间没有空格的信息在分词序列中丢失了,因为Tokenize("World.") == Tokenize("World .")

SentencePiece将输入文本仅视为Unicode字符序列。空白也被视为普通符号处理。为了明确地将空白作为基本标记处理,SentencePiece首先用元符号"▁"(U+2581)转义空白,如下所示:

Hello▁World.

然后,将此文本分割成小片段,例如:

[Hello] [▁Wor] [ld] [.]

由于空白在分段文本中得以保留,我们可以无歧义地进行去分词。

  detokenized = ''.join(pieces).replace('▁', ' ')

这一特性使得无需依赖特定语言资源就能执行去分词成为可能。

请注意,当使用标准词分割器分割句子时,我们无法应用相同的无损转换,因为它们将空白视为特殊符号。分词后的序列不保留恢复原始句子所需的必要信息。

  • (英) Hello world. → [Hello] [World] [.] (Hello和World之间有空格)
  • (日) こんにちは世界。 → [こんにちは] [世界] [。] (こんにちは和世界之间没有空格)

子词正则化和BPE-dropout

子词正则化[Kudo.]和BPE-dropout Provilkov等人是简单的正则化方法,通过即时子词采样虚拟增强训练数据,有助于提高神经机器翻译模型的准确性和鲁棒性。

要启用子词正则化,您需要将SentencePiece库(C++/Python)集成到神经机器翻译系统中,以便在每次参数更新时采样一种分割方式,这与标准的离线数据准备不同。以下是Python库的示例。您可以发现'New York'在每次调用SampleEncode (C++)encode with enable_sampling=True (Python)时都被不同地分割。采样参数的详细信息可以在sentencepiece_processor.h中找到。

>>> import sentencepiece as spm
>>> s = spm.SentencePieceProcessor(model_file='spm.model')
>>> for n in range(5):
...     s.encode('New York', out_type=str, enable_sampling=True, alpha=0.1, nbest_size=-1)
...
['▁', 'N', 'e', 'w', '▁York']
['▁', 'New', '▁York']
['▁', 'New', '▁Y', 'o', 'r', 'k']
['▁', 'New', '▁York']
['▁', 'New', '▁York']

安装

Python模块

SentencePiece提供Python包装器,支持SentencePiece训练和分割。 您可以使用以下命令安装SentencePiece的Python二进制包:

pip install sentencepiece

更多详情,请参阅Python模块

从C++源代码构建和安装SentencePiece命令行工具

构建SentencePiece需要以下工具和库:

  • cmake
  • C++11编译器
  • gperftools库(可选,可获得10-40%的性能提升)

在Ubuntu上,可以使用apt-get安装构建工具:

% sudo apt-get install cmake build-essential pkg-config libgoogle-perftools-dev

然后,您可以按如下方式构建和安装命令行工具:

% git clone https://github.com/google/sentencepiece.git 
% cd sentencepiece
% mkdir build
% cd build
% cmake ..
% make -j $(nproc)
% sudo make install
% sudo ldconfig -v

在OSX/macOS上,将最后一条命令替换为sudo update_dyld_shared_cache

使用vcpkg构建和安装

您可以使用vcpkg依赖管理器下载和安装sentencepiece:

git clone https://github.com/Microsoft/vcpkg.git
cd vcpkg
./bootstrap-vcpkg.sh
./vcpkg integrate install
./vcpkg install sentencepiece

vcpkg中的sentencepiece端口由Microsoft团队成员和社区贡献者保持最新。如果版本过时,请在vcpkg仓库上创建问题或拉取请求

从签名发布的wheel下载并安装SentencePiece

您可以从GitHub发布页面下载wheel。 我们在发布过程中使用OpenSSF的slsa-framework/slsa-github-generator生成SLSA3签名。要验证发布二进制文件:

  1. slsa-framework/slsa-verifier#installation安装验证工具。
  2. GitHub发布页面下载来源文件attestation.intoto.jsonl
  3. 运行验证器:
slsa-verifier -artifact-path <the-wheel> -provenance attestation.intoto.jsonl -source github.com/google/sentencepiece -tag <the-tag>

pip install wheel_file.whl

使用说明

训练SentencePiece模型

% spm_train --input=<输入文件> --model_prefix=<模型名称> --vocab_size=8000 --character_coverage=1.0 --model_type=<类型>
  • --input: 每行一个句子的原始语料文件。无需运行分词器、规范化器或预处理器。默认情况下,SentencePiece使用Unicode NFKC对输入进行规范化。您可以传入以逗号分隔的文件列表。
  • --model_prefix: 输出模型名称前缀。将生成<模型名称>.model<模型名称>.vocab文件。
  • --vocab_size: 词汇表大小,例如8000、16000或32000。
  • --character_coverage: 模型覆盖的字符比例,良好的默认值为:对于具有丰富字符集的语言(如日语或中文)使用0.9995,对于具有较小字符集的其他语言使用1.0
  • --model_type: 模型类型。可选择unigram(默认)、bpecharword。使用word类型时,输入句子必须预先分词。

使用--help标志显示所有训练参数,或查看此处获取概览。

将原始文本编码为句子片段/ID

% spm_encode --model=<模型文件> --output_format=piece < 输入 > 输出
% spm_encode --model=<模型文件> --output_format=id < 输入 > 输出

使用--extra_options标志插入BOS/EOS标记或反转输入序列。

% spm_encode --extra_options=eos (仅添加</s>)
% spm_encode --extra_options=bos:eos (添加<s>和</s>)
% spm_encode --extra_options=reverse:bos:eos (反转输入并添加<s>和</s>)

SentencePiece支持N-best分割和分割采样,使用--output_format=(nbest|sample)_(piece|id)标志。

% spm_encode --model=<模型文件> --output_format=sample_piece --nbest_size=-1 --alpha=0.5 < 输入 > 输出
% spm_encode --model=<模型文件> --output_format=nbest_id --nbest_size=10 < 输入 > 输出

将句子片段/ID解码为原始文本

% spm_decode --model=<模型文件> --input_format=piece < 输入 > 输出
% spm_decode --model=<模型文件> --input_format=id < 输入 > 输出

使用--extra_options标志以相反顺序解码文本。

% spm_decode --extra_options=reverse < 输入 > 输出

端到端示例

% spm_train --input=data/botchan.txt --model_prefix=m --vocab_size=1000
unigram_model_trainer.cc(494) LOG(INFO) 开始训练,参数为:
input: "../data/botchan.txt"
... <省略>
unigram_model_trainer.cc(529) LOG(INFO) EM子迭代=1 大小=1100 目标值=10.4973 词元数=37630 每片段词元数=34.2091
trainer_interface.cc(272) LOG(INFO) 保存模型:m.model
trainer_interface.cc(281) LOG(INFO) 保存词汇表:m.vocab

% echo "I saw a girl with a telescope." | spm_encode --model=m.model
▁I ▁saw ▁a ▁girl ▁with ▁a ▁ te le s c o pe .

% echo "I saw a girl with a telescope." | spm_encode --model=m.model --output_format=id
9 459 11 939 44 11 4 142 82 8 28 21 132 6

% echo "9 459 11 939 44 11 4 142 82 8 28 21 132 6" | spm_decode --model=m.model --input_format=id
I saw a girl with a telescope.

您可以发现原始输入句子从词汇ID序列中恢复出来。

导出词汇表列表

% spm_export_vocab --model=<模型文件> --output=<输出文件>

<输出文件>存储词汇表列表和发射对数概率。词汇ID对应于此文件中的行号。

重新定义特殊元标记

默认情况下,SentencePiece使用未知(<unk>)、BOS(<s>)和EOS(</s>)标记,它们的ID分别为0、1和2。我们可以在训练阶段重新定义这个映射,如下所示:

% spm_train --bos_id=0 --eos_id=1 --unk_id=5 --input=... --model_prefix=... --character_coverage=...

当设置-1 ID时,例如bos_id=-1,这个特殊标记将被禁用。请注意,未知ID不能被禁用。我们可以使用--pad_id=3为填充(<pad>)定义一个ID。

如果您想分配其他特殊标记,请参阅使用自定义符号

词汇限制

spm_encode接受--vocabulary--vocabulary_threshold选项,这样spm_encode只会生成在词汇表中也出现的符号(至少有一定频率)。这个特性的背景在subword-nmt页面中有描述。

使用方法基本与subword-nmt相同。假设L1和L2是两种语言(源语言/目标语言),训练共享的spm模型,并为每种语言获取结果词汇:

% cat {训练文件}.L1 {训练文件}.L2 | shuffle > train
% spm_train --input=train --model_prefix=spm --vocab_size=8000 --character_coverage=0.9995
% spm_encode --model=spm.model --generate_vocabulary < {训练文件}.L1 > {词汇文件}.L1
% spm_encode --model=spm.model --generate_vocabulary < {训练文件}.L2 > {词汇文件}.L2

使用shuffle命令是为了以防万一,因为spm_train默认加载语料库的前1000万行。

然后使用--vocabulary选项对训练/测试语料进行分割

% spm_encode --model=spm.model --vocabulary={词汇文件}.L1 --vocabulary_threshold=50 < {测试文件}.L1 > {测试文件}.seg.L1
% spm_encode --model=spm.model --vocabulary={词汇文件}.L2 --vocabulary_threshold=50 < {测试文件}.L2 > {测试文件}.seg.L2

高级主题

编辑推荐精选

讯飞智文

讯飞智文

一键生成PPT和Word,让学习生活更轻松

讯飞智文是一个利用 AI 技术的项目,能够帮助用户生成 PPT 以及各类文档。无论是商业领域的市场分析报告、年度目标制定,还是学生群体的职业生涯规划、实习避坑指南,亦或是活动策划、旅游攻略等内容,它都能提供支持,帮助用户精准表达,轻松呈现各种信息。

AI办公办公工具AI工具讯飞智文AI在线生成PPTAI撰写助手多语种文档生成AI自动配图热门
讯飞星火

讯飞星火

深度推理能力全新升级,全面对标OpenAI o1

科大讯飞的星火大模型,支持语言理解、知识问答和文本创作等多功能,适用于多种文件和业务场景,提升办公和日常生活的效率。讯飞星火是一个提供丰富智能服务的平台,涵盖科技资讯、图像创作、写作辅助、编程解答、科研文献解读等功能,能为不同需求的用户提供便捷高效的帮助,助力用户轻松获取信息、解决问题,满足多样化使用场景。

热门AI开发模型训练AI工具讯飞星火大模型智能问答内容创作多语种支持智慧生活
Spark-TTS

Spark-TTS

一种基于大语言模型的高效单流解耦语音令牌文本到语音合成模型

Spark-TTS 是一个基于 PyTorch 的开源文本到语音合成项目,由多个知名机构联合参与。该项目提供了高效的 LLM(大语言模型)驱动的语音合成方案,支持语音克隆和语音创建功能,可通过命令行界面(CLI)和 Web UI 两种方式使用。用户可以根据需求调整语音的性别、音高、速度等参数,生成高质量的语音。该项目适用于多种场景,如有声读物制作、智能语音助手开发等。

Trae

Trae

字节跳动发布的AI编程神器IDE

Trae是一种自适应的集成开发环境(IDE),通过自动化和多元协作改变开发流程。利用Trae,团队能够更快速、精确地编写和部署代码,从而提高编程效率和项目交付速度。Trae具备上下文感知和代码自动完成功能,是提升开发效率的理想工具。

AI工具TraeAI IDE协作生产力转型热门
咔片PPT

咔片PPT

AI助力,做PPT更简单!

咔片是一款轻量化在线演示设计工具,借助 AI 技术,实现从内容生成到智能设计的一站式 PPT 制作服务。支持多种文档格式导入生成 PPT,提供海量模板、智能美化、素材替换等功能,适用于销售、教师、学生等各类人群,能高效制作出高品质 PPT,满足不同场景演示需求。

讯飞绘文

讯飞绘文

选题、配图、成文,一站式创作,让内容运营更高效

讯飞绘文,一个AI集成平台,支持写作、选题、配图、排版和发布。高效生成适用于各类媒体的定制内容,加速品牌传播,提升内容营销效果。

热门AI辅助写作AI工具讯飞绘文内容运营AI创作个性化文章多平台分发AI助手
材料星

材料星

专业的AI公文写作平台,公文写作神器

AI 材料星,专业的 AI 公文写作辅助平台,为体制内工作人员提供高效的公文写作解决方案。拥有海量公文文库、9 大核心 AI 功能,支持 30 + 文稿类型生成,助力快速完成领导讲话、工作总结、述职报告等材料,提升办公效率,是体制打工人的得力写作神器。

openai-agents-python

openai-agents-python

OpenAI Agents SDK,助力开发者便捷使用 OpenAI 相关功能。

openai-agents-python 是 OpenAI 推出的一款强大 Python SDK,它为开发者提供了与 OpenAI 模型交互的高效工具,支持工具调用、结果处理、追踪等功能,涵盖多种应用场景,如研究助手、财务研究等,能显著提升开发效率,让开发者更轻松地利用 OpenAI 的技术优势。

Hunyuan3D-2

Hunyuan3D-2

高分辨率纹理 3D 资产生成

Hunyuan3D-2 是腾讯开发的用于 3D 资产生成的强大工具,支持从文本描述、单张图片或多视角图片生成 3D 模型,具备快速形状生成能力,可生成带纹理的高质量 3D 模型,适用于多个领域,为 3D 创作提供了高效解决方案。

3FS

3FS

一个具备存储、管理和客户端操作等多种功能的分布式文件系统相关项目。

3FS 是一个功能强大的分布式文件系统项目,涵盖了存储引擎、元数据管理、客户端工具等多个模块。它支持多种文件操作,如创建文件和目录、设置布局等,同时具备高效的事件循环、节点选择和协程池管理等特性。适用于需要大规模数据存储和管理的场景,能够提高系统的性能和可靠性,是分布式存储领域的优质解决方案。

下拉加载更多