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 在 文本处理 中排名
91,603 每月下载量
在 90 个 Crates 中使用 (69 个直接使用)
775KB
19K SLoC
tokenizers
的核心,用 Rust 编写。提供对当今最常用分词器的实现,重点关注性能和多功能性。
什么是分词器
分词器作为一个管道工作,它将一些原始文本作为输入进行处理,并输出一个 Encoding
。管道的各个步骤包括
Normalizer
:负责规范化文本。常见的规范化示例包括 Unicode 规范化标准,如NFD
或NFKC
。有关如何使用Normalizers
的更多详细信息,请参阅 Hugging Face 博客PreTokenizer
:负责在文本中创建初始的单词分割。最常见的方式是在空白字符上分割文本。Model
:负责执行实际的分词。一个Model
的例子是BPE
或WordPiece
。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