#tokenizers #nlp #production #research #bert #bpe #gpt

huggingface/tokenizers-python

💥 针对研究和生产优化的快速最先进分词器

22 个不稳定版本 (4 个重大更改)

0.19.1 2024年4月17日
0.15.2 2024年2月12日
0.15.0 2023年11月14日
0.13.4-rc22023年5月17日
0.12.1 2022年4月13日

#522 in 解析器实现

8,390 个星标 & 117 个关注者

370KB
7.5K SLoC

Rust 5.5K SLoC // 0.0% comments Python 2K SLoC // 0.2% comments Forge Config 51 SLoC



Build GitHub


Tokenizers

提供当今最常用分词器的实现,重点关注性能和多功能性。

基于Rust实现的绑定。如果您对高级设计感兴趣,可以前往查看。

否则,让我们深入了解!

主要功能

  • 使用4个预制的分词器(Bert WordPiece和3种最常见的BPE版本)训练新词汇并进行分词。
  • 由于Rust实现,速度极快(包括训练和分词)。在服务器的CPU上对1GB的文本进行分词不到20秒。
  • 易于使用,但功能极其强大。
  • 专为研究和生产设计。
  • 归一化带有对齐跟踪。始终可以获取与给定标记相对应的原始句子部分。
  • 执行所有预处理操作:截断、填充、添加模型所需的特殊标记。

安装

使用pip

pip install tokenizers

从源代码安装

要使用此方法,您需要安装Rust

# Install with:
curl https://sh.rustup.rs -sSf | sh -s -- -y
export PATH="$HOME/.cargo/bin:$PATH"

Rust安装后,您可以通过以下方式进行编译

git clone https://github.com/huggingface/tokenizers
cd tokenizers/bindings/python

# Create a virtual env (you can use yours as well)
python -m venv .env
source .env/bin/activate

# Install `tokenizers` in the current virtual env
pip install -e .

从Hub加载预训练的标记器

from tokenizers import Tokenizer

tokenizer = Tokenizer.from_pretrained("bert-base-cased")

使用提供的标记器

我们提供了一些预构建的标记器来覆盖最常见的用例。您可以使用一些 vocab.jsonmerges.txt 文件轻松加载这些中的一个

from tokenizers import CharBPETokenizer

# Initialize a tokenizer
vocab = "./path/to/vocab.json"
merges = "./path/to/merges.txt"
tokenizer = CharBPETokenizer(vocab, merges)

# And then encode:
encoded = tokenizer.encode("I can feel the magic, can you?")
print(encoded.ids)
print(encoded.tokens)

并且您可以像这样简单地训练它们

from tokenizers import CharBPETokenizer

# Initialize a tokenizer
tokenizer = CharBPETokenizer()

# Then train it!
tokenizer.train([ "./path/to/files/1.txt", "./path/to/files/2.txt" ])

# Now, let's use it:
encoded = tokenizer.encode("I can feel the magic, can you?")

# And finally save it somewhere
tokenizer.save("./path/to/directory/my-bpe.tokenizer.json")

提供的标记器

  • CharBPETokenizer:原始的BPE
  • ByteLevelBPETokenizer:BPE的字节级别版本
  • SentencePieceBPETokenizer:与SentencePiece使用的BPE兼容的BPE实现
  • BertWordPieceTokenizer:著名的Bert标记器,使用WordPiece

所有这些都可以像上面解释的那样使用和训练!

构建自己的

当这些提供的标记器不能给您足够的自由时,您可以构建自己的标记器,通过将所有需要的不同部分组合在一起。您可以查看我们如何实现提供的标记器,并轻松地根据您的需求进行适配。

构建字节级BPE

以下是一个示例,展示如何通过将所有不同的部分组合在一起来构建自己的字节级BPE,并将其保存到单个文件中

from tokenizers import Tokenizer, models, pre_tokenizers, decoders, trainers, processors

# Initialize a tokenizer
tokenizer = Tokenizer(models.BPE())

# Customize pre-tokenization and decoding
tokenizer.pre_tokenizer = pre_tokenizers.ByteLevel(add_prefix_space=True)
tokenizer.decoder = decoders.ByteLevel()
tokenizer.post_processor = processors.ByteLevel(trim_offsets=True)

# And then train
trainer = trainers.BpeTrainer(
    vocab_size=20000,
    min_frequency=2,
    initial_alphabet=pre_tokenizers.ByteLevel.alphabet()
)
tokenizer.train([
    "./path/to/dataset/1.txt",
    "./path/to/dataset/2.txt",
    "./path/to/dataset/3.txt"
], trainer=trainer)

# And Save it
tokenizer.save("byte-level-bpe.tokenizer.json", pretty=True)

现在,当您想使用这个标记器时,就像这样简单

from tokenizers import Tokenizer

tokenizer = Tokenizer.from_file("byte-level-bpe.tokenizer.json")

encoded = tokenizer.encode("I can feel the magic, can you?")

依赖关系

~13–22MB
~344K SLoC