25 个版本 (13 个重大变更)

0.20.0 2024 年 8 月 8 日
0.19.1 2024 年 4 月 17 日
0.15.2 2024 年 2 月 12 日
0.15.0 2023 年 11 月 14 日
0.5.0 2019 年 10 月 9 日

14文本处理 中排名

Download history 21341/week @ 2024-05-04 24545/week @ 2024-05-11 20246/week @ 2024-05-18 21647/week @ 2024-05-25 23877/week @ 2024-06-01 23725/week @ 2024-06-08 21770/week @ 2024-06-15 25085/week @ 2024-06-22 18847/week @ 2024-06-29 26367/week @ 2024-07-06 22584/week @ 2024-07-13 28933/week @ 2024-07-20 23006/week @ 2024-07-27 22671/week @ 2024-08-03 20962/week @ 2024-08-10 19623/week @ 2024-08-17

91,603 每月下载量
90 个 Crates 中使用 (69 个直接使用)

Apache-2.0

775KB
19K SLoC



Build GitHub Doc


tokenizers 的核心,用 Rust 编写。提供对当今最常用分词器的实现,重点关注性能和多功能性。

什么是分词器

分词器作为一个管道工作,它将一些原始文本作为输入进行处理,并输出一个 Encoding。管道的各个步骤包括

  1. Normalizer:负责规范化文本。常见的规范化示例包括 Unicode 规范化标准,如 NFDNFKC。有关如何使用 Normalizers 的更多详细信息,请参阅 Hugging Face 博客
  2. PreTokenizer:负责在文本中创建初始的单词分割。最常见的方式是在空白字符上分割文本。
  3. Model:负责执行实际的分词。一个 Model 的例子是 BPEWordPiece
  4. PostProcessor:负责对 Encoding 进行后处理,添加任何相关内容,例如语言模型可能需要的特殊标记。

从 Hub 加载预训练的分词器

use tokenizers::tokenizer::{Result, Tokenizer};

fn main() -> Result<()> {
    # #[cfg(feature = "http")]
    # {
        let tokenizer = Tokenizer::from_pretrained("bert-base-cased", None)?;

        let encoding = tokenizer.encode("Hey there!", false)?;
        println!("{:?}", encoding.get_tokens());
    # }
    Ok(())
}

反序列化和分词示例

use tokenizers::tokenizer::{Result, Tokenizer, EncodeInput};
use tokenizers::models::bpe::BPE;

fn main() -> Result<()> {
    let bpe_builder = BPE::from_file("./path/to/vocab.json", "./path/to/merges.txt");
    let bpe = bpe_builder
        .dropout(0.1)
        .unk_token("[UNK]".into())
        .build()?;

    let mut tokenizer = Tokenizer::new(bpe);

    let encoding = tokenizer.encode("Hey there!", false)?;
    println!("{:?}", encoding.get_tokens());

    Ok(())
}

训练和序列化示例

use tokenizers::decoders::DecoderWrapper;
use tokenizers::models::bpe::{BpeTrainerBuilder, BPE};
use tokenizers::normalizers::{strip::Strip, unicode::NFC, utils::Sequence, NormalizerWrapper};
use tokenizers::pre_tokenizers::byte_level::ByteLevel;
use tokenizers::pre_tokenizers::PreTokenizerWrapper;
use tokenizers::processors::PostProcessorWrapper;
use tokenizers::{AddedToken, Model, Result, TokenizerBuilder};

use std::path::Path;

fn main() -> Result<()> {
    let vocab_size: usize = 100;

    let mut trainer = BpeTrainerBuilder::new()
        .show_progress(true)
        .vocab_size(vocab_size)
        .min_frequency(0)
        .special_tokens(vec![
            AddedToken::from(String::from("<s>"), true),
            AddedToken::from(String::from("<pad>"), true),
            AddedToken::from(String::from("</s>"), true),
            AddedToken::from(String::from("<unk>"), true),
            AddedToken::from(String::from("<mask>"), true),
        ])
        .build();

    let mut tokenizer = TokenizerBuilder::new()
        .with_model(BPE::default())
        .with_normalizer(Some(Sequence::new(vec![
            Strip::new(true, true).into(),
            NFC.into(),
        ])))
        .with_pre_tokenizer(Some(ByteLevel::default()))
        .with_post_processor(Some(ByteLevel::default()))
        .with_decoder(Some(ByteLevel::default()))
        .build()?;

    let pretty = false;
    tokenizer
        .train_from_files(
            &mut trainer,
            vec!["path/to/vocab.txt".to_string()],
        )?
        .save("tokenizer.json", pretty)?;

    Ok(())
}

更多信息

  • tokenizers 旨在在可能的情况下利用 CPU 并行性。并行程度由 CPU 提供的总核心/线程数决定,但可以通过设置 RAYON_RS_NUM_THREADS 环境变量进行调整。例如,设置 RAYON_RS_NUM_THREADS=4 将分配最多 4 个线程。 请注意,此行为可能在未来发生变化

特性

进度条:默认启用进度条可视化。如果某些目标的编译不支持 termios 依赖的 indicatif 进度条,则可能禁用。

依赖项

~13–27MB
~373K SLoC