mirror of
https://github.com/mii443/tokenizers.git
synced 2025-08-31 12:39:21 +00:00
Fix invalid continuing subwrd prefix. (#864)
* Creating failing test for invalid continuing subwrd prefix. * Test in rust + the associated fix. * Clippy. * Black.
This commit is contained in:
@ -239,3 +239,17 @@ class TestUnigram:
|
|||||||
assert trainer.special_tokens == []
|
assert trainer.special_tokens == []
|
||||||
trainer.initial_alphabet = ["d", "z"]
|
trainer.initial_alphabet = ["d", "z"]
|
||||||
assert sorted(trainer.initial_alphabet) == ["d", "z"]
|
assert sorted(trainer.initial_alphabet) == ["d", "z"]
|
||||||
|
|
||||||
|
def test_continuing_prefix_trainer_mistmatch(self):
|
||||||
|
UNK = "[UNK]"
|
||||||
|
special_tokens = [UNK]
|
||||||
|
tokenizer = Tokenizer(models.BPE(unk_token=UNK, continuing_subword_prefix="##"))
|
||||||
|
trainer = trainers.BpeTrainer(special_tokens=special_tokens)
|
||||||
|
tokenizer.pre_tokenizer = pre_tokenizers.Sequence(
|
||||||
|
[pre_tokenizers.Whitespace(), pre_tokenizers.Digits(individual_digits=True)]
|
||||||
|
)
|
||||||
|
tokenizer.train(files=["data/big.txt"], trainer=trainer)
|
||||||
|
|
||||||
|
tokenizer.save("data/tokenizer.json")
|
||||||
|
|
||||||
|
tokenizer.from_file("data/tokenizer.json")
|
||||||
|
@ -1,340 +0,0 @@
|
|||||||
{
|
|
||||||
"version": "1.0",
|
|
||||||
"truncation": null,
|
|
||||||
"padding": null,
|
|
||||||
"added_tokens": [],
|
|
||||||
"normalizer": null,
|
|
||||||
"pre_tokenizer": {
|
|
||||||
"type": "WhitespaceSplit"
|
|
||||||
},
|
|
||||||
"post_processor": {
|
|
||||||
"type": "ByteLevel",
|
|
||||||
"add_prefix_space": true,
|
|
||||||
"trim_offsets": false
|
|
||||||
},
|
|
||||||
"decoder": {
|
|
||||||
"type": "ByteLevel",
|
|
||||||
"add_prefix_space": true,
|
|
||||||
"trim_offsets": true
|
|
||||||
},
|
|
||||||
"model": {
|
|
||||||
"type": "BPE",
|
|
||||||
"dropout": null,
|
|
||||||
"unk_token": null,
|
|
||||||
"continuing_subword_prefix": null,
|
|
||||||
"end_of_word_suffix": null,
|
|
||||||
"fuse_unk": false,
|
|
||||||
"vocab": {
|
|
||||||
"!": 0,
|
|
||||||
"\"": 1,
|
|
||||||
"#": 2,
|
|
||||||
"$": 3,
|
|
||||||
"%": 4,
|
|
||||||
"&": 5,
|
|
||||||
"'": 6,
|
|
||||||
"(": 7,
|
|
||||||
")": 8,
|
|
||||||
"*": 9,
|
|
||||||
"+": 10,
|
|
||||||
",": 11,
|
|
||||||
"-": 12,
|
|
||||||
".": 13,
|
|
||||||
"/": 14,
|
|
||||||
"0": 15,
|
|
||||||
"1": 16,
|
|
||||||
"2": 17,
|
|
||||||
"3": 18,
|
|
||||||
"4": 19,
|
|
||||||
"5": 20,
|
|
||||||
"6": 21,
|
|
||||||
"7": 22,
|
|
||||||
"8": 23,
|
|
||||||
"9": 24,
|
|
||||||
":": 25,
|
|
||||||
";": 26,
|
|
||||||
"<": 27,
|
|
||||||
"=": 28,
|
|
||||||
">": 29,
|
|
||||||
"?": 30,
|
|
||||||
"@": 31,
|
|
||||||
"A": 32,
|
|
||||||
"B": 33,
|
|
||||||
"C": 34,
|
|
||||||
"D": 35,
|
|
||||||
"E": 36,
|
|
||||||
"F": 37,
|
|
||||||
"G": 38,
|
|
||||||
"H": 39,
|
|
||||||
"I": 40,
|
|
||||||
"J": 41,
|
|
||||||
"K": 42,
|
|
||||||
"L": 43,
|
|
||||||
"M": 44,
|
|
||||||
"N": 45,
|
|
||||||
"O": 46,
|
|
||||||
"P": 47,
|
|
||||||
"Q": 48,
|
|
||||||
"R": 49,
|
|
||||||
"S": 50,
|
|
||||||
"T": 51,
|
|
||||||
"U": 52,
|
|
||||||
"V": 53,
|
|
||||||
"W": 54,
|
|
||||||
"X": 55,
|
|
||||||
"Y": 56,
|
|
||||||
"Z": 57,
|
|
||||||
"[": 58,
|
|
||||||
"\\": 59,
|
|
||||||
"]": 60,
|
|
||||||
"^": 61,
|
|
||||||
"_": 62,
|
|
||||||
"`": 63,
|
|
||||||
"a": 64,
|
|
||||||
"b": 65,
|
|
||||||
"c": 66,
|
|
||||||
"d": 67,
|
|
||||||
"e": 68,
|
|
||||||
"f": 69,
|
|
||||||
"g": 70,
|
|
||||||
"h": 71,
|
|
||||||
"i": 72,
|
|
||||||
"j": 73,
|
|
||||||
"k": 74,
|
|
||||||
"l": 75,
|
|
||||||
"m": 76,
|
|
||||||
"n": 77,
|
|
||||||
"o": 78,
|
|
||||||
"p": 79,
|
|
||||||
"q": 80,
|
|
||||||
"r": 81,
|
|
||||||
"s": 82,
|
|
||||||
"t": 83,
|
|
||||||
"u": 84,
|
|
||||||
"v": 85,
|
|
||||||
"w": 86,
|
|
||||||
"x": 87,
|
|
||||||
"y": 88,
|
|
||||||
"z": 89,
|
|
||||||
"{": 90,
|
|
||||||
"|": 91,
|
|
||||||
"}": 92,
|
|
||||||
"~": 93,
|
|
||||||
"¡": 94,
|
|
||||||
"¢": 95,
|
|
||||||
"£": 96,
|
|
||||||
"¤": 97,
|
|
||||||
"¥": 98,
|
|
||||||
"¦": 99,
|
|
||||||
"§": 100,
|
|
||||||
"¨": 101,
|
|
||||||
"©": 102,
|
|
||||||
"ª": 103,
|
|
||||||
"«": 104,
|
|
||||||
"¬": 105,
|
|
||||||
"®": 106,
|
|
||||||
"¯": 107,
|
|
||||||
"°": 108,
|
|
||||||
"±": 109,
|
|
||||||
"²": 110,
|
|
||||||
"³": 111,
|
|
||||||
"´": 112,
|
|
||||||
"µ": 113,
|
|
||||||
"¶": 114,
|
|
||||||
"·": 115,
|
|
||||||
"¸": 116,
|
|
||||||
"¹": 117,
|
|
||||||
"º": 118,
|
|
||||||
"»": 119,
|
|
||||||
"¼": 120,
|
|
||||||
"½": 121,
|
|
||||||
"¾": 122,
|
|
||||||
"¿": 123,
|
|
||||||
"À": 124,
|
|
||||||
"Á": 125,
|
|
||||||
"Â": 126,
|
|
||||||
"Ã": 127,
|
|
||||||
"Ä": 128,
|
|
||||||
"Å": 129,
|
|
||||||
"Æ": 130,
|
|
||||||
"Ç": 131,
|
|
||||||
"È": 132,
|
|
||||||
"É": 133,
|
|
||||||
"Ê": 134,
|
|
||||||
"Ë": 135,
|
|
||||||
"Ì": 136,
|
|
||||||
"Í": 137,
|
|
||||||
"Î": 138,
|
|
||||||
"Ï": 139,
|
|
||||||
"Ð": 140,
|
|
||||||
"Ñ": 141,
|
|
||||||
"Ò": 142,
|
|
||||||
"Ó": 143,
|
|
||||||
"Ô": 144,
|
|
||||||
"Õ": 145,
|
|
||||||
"Ö": 146,
|
|
||||||
"×": 147,
|
|
||||||
"Ø": 148,
|
|
||||||
"Ù": 149,
|
|
||||||
"Ú": 150,
|
|
||||||
"Û": 151,
|
|
||||||
"Ü": 152,
|
|
||||||
"Ý": 153,
|
|
||||||
"Þ": 154,
|
|
||||||
"ß": 155,
|
|
||||||
"à": 156,
|
|
||||||
"á": 157,
|
|
||||||
"â": 158,
|
|
||||||
"ã": 159,
|
|
||||||
"ä": 160,
|
|
||||||
"å": 161,
|
|
||||||
"æ": 162,
|
|
||||||
"ç": 163,
|
|
||||||
"è": 164,
|
|
||||||
"é": 165,
|
|
||||||
"ê": 166,
|
|
||||||
"ë": 167,
|
|
||||||
"ì": 168,
|
|
||||||
"í": 169,
|
|
||||||
"î": 170,
|
|
||||||
"ï": 171,
|
|
||||||
"ð": 172,
|
|
||||||
"ñ": 173,
|
|
||||||
"ò": 174,
|
|
||||||
"ó": 175,
|
|
||||||
"ô": 176,
|
|
||||||
"õ": 177,
|
|
||||||
"ö": 178,
|
|
||||||
"÷": 179,
|
|
||||||
"ø": 180,
|
|
||||||
"ù": 181,
|
|
||||||
"ú": 182,
|
|
||||||
"û": 183,
|
|
||||||
"ü": 184,
|
|
||||||
"ý": 185,
|
|
||||||
"þ": 186,
|
|
||||||
"ÿ": 187,
|
|
||||||
"Ā": 188,
|
|
||||||
"ā": 189,
|
|
||||||
"Ă": 190,
|
|
||||||
"ă": 191,
|
|
||||||
"Ą": 192,
|
|
||||||
"ą": 193,
|
|
||||||
"Ć": 194,
|
|
||||||
"ć": 195,
|
|
||||||
"Ĉ": 196,
|
|
||||||
"ĉ": 197,
|
|
||||||
"Ċ": 198,
|
|
||||||
"ċ": 199,
|
|
||||||
"Č": 200,
|
|
||||||
"č": 201,
|
|
||||||
"Ď": 202,
|
|
||||||
"ď": 203,
|
|
||||||
"Đ": 204,
|
|
||||||
"đ": 205,
|
|
||||||
"Ē": 206,
|
|
||||||
"ē": 207,
|
|
||||||
"Ĕ": 208,
|
|
||||||
"ĕ": 209,
|
|
||||||
"Ė": 210,
|
|
||||||
"ė": 211,
|
|
||||||
"Ę": 212,
|
|
||||||
"ę": 213,
|
|
||||||
"Ě": 214,
|
|
||||||
"ě": 215,
|
|
||||||
"Ĝ": 216,
|
|
||||||
"ĝ": 217,
|
|
||||||
"Ğ": 218,
|
|
||||||
"ğ": 219,
|
|
||||||
"Ġ": 220,
|
|
||||||
"ġ": 221,
|
|
||||||
"Ģ": 222,
|
|
||||||
"ģ": 223,
|
|
||||||
"Ĥ": 224,
|
|
||||||
"ĥ": 225,
|
|
||||||
"Ħ": 226,
|
|
||||||
"ħ": 227,
|
|
||||||
"Ĩ": 228,
|
|
||||||
"ĩ": 229,
|
|
||||||
"Ī": 230,
|
|
||||||
"ī": 231,
|
|
||||||
"Ĭ": 232,
|
|
||||||
"ĭ": 233,
|
|
||||||
"Į": 234,
|
|
||||||
"į": 235,
|
|
||||||
"İ": 236,
|
|
||||||
"ı": 237,
|
|
||||||
"IJ": 238,
|
|
||||||
"ij": 239,
|
|
||||||
"Ĵ": 240,
|
|
||||||
"ĵ": 241,
|
|
||||||
"Ķ": 242,
|
|
||||||
"ķ": 243,
|
|
||||||
"ĸ": 244,
|
|
||||||
"Ĺ": 245,
|
|
||||||
"ĺ": 246,
|
|
||||||
"Ļ": 247,
|
|
||||||
"ļ": 248,
|
|
||||||
"Ľ": 249,
|
|
||||||
"ľ": 250,
|
|
||||||
"Ŀ": 251,
|
|
||||||
"ŀ": 252,
|
|
||||||
"Ł": 253,
|
|
||||||
"ł": 254,
|
|
||||||
"Ń": 255,
|
|
||||||
"CU": 256,
|
|
||||||
"DO": 257,
|
|
||||||
"EN": 258,
|
|
||||||
"MEN": 259,
|
|
||||||
"T>": 260,
|
|
||||||
"es": 261,
|
|
||||||
"is": 262,
|
|
||||||
"tes": 263,
|
|
||||||
"CUMEN": 264,
|
|
||||||
"DOCUMEN": 265,
|
|
||||||
"test": 266,
|
|
||||||
"DOCUMENT>": 267,
|
|
||||||
"/DOCUMENT>": 268,
|
|
||||||
"<DOCUMENT>": 269,
|
|
||||||
"</DOCUMENT>": 270,
|
|
||||||
"\\test": 271,
|
|
||||||
"a}": 272,
|
|
||||||
"atest": 273,
|
|
||||||
"bl": 274,
|
|
||||||
"his": 275,
|
|
||||||
"this": 276,
|
|
||||||
"{bl": 277,
|
|
||||||
"isatest": 278,
|
|
||||||
"\\test{bl": 279,
|
|
||||||
"thisisatest": 280,
|
|
||||||
"\\test{bla}": 281
|
|
||||||
},
|
|
||||||
"merges": [
|
|
||||||
"C U",
|
|
||||||
"D O",
|
|
||||||
"E N",
|
|
||||||
"M EN",
|
|
||||||
"T >",
|
|
||||||
"e s",
|
|
||||||
"i s",
|
|
||||||
"t es",
|
|
||||||
"CU MEN",
|
|
||||||
"DO CUMEN",
|
|
||||||
"tes t",
|
|
||||||
"DOCUMEN T>",
|
|
||||||
"/ DOCUMENT>",
|
|
||||||
"< DOCUMENT>",
|
|
||||||
"< /DOCUMENT>",
|
|
||||||
"\\ test",
|
|
||||||
"a }",
|
|
||||||
"a test",
|
|
||||||
"b l",
|
|
||||||
"h is",
|
|
||||||
"t his",
|
|
||||||
"{ bl",
|
|
||||||
"is atest",
|
|
||||||
"\\test {bl",
|
|
||||||
"this isatest",
|
|
||||||
"\\test{bl a}"
|
|
||||||
]
|
|
||||||
}
|
|
||||||
}
|
|
@ -575,9 +575,13 @@ impl BpeTrainer {
|
|||||||
|
|
||||||
if let Some(prefix) = &self.continuing_subword_prefix {
|
if let Some(prefix) = &self.continuing_subword_prefix {
|
||||||
model.continuing_subword_prefix = Some(prefix.to_owned());
|
model.continuing_subword_prefix = Some(prefix.to_owned());
|
||||||
|
} else {
|
||||||
|
model.continuing_subword_prefix = None;
|
||||||
}
|
}
|
||||||
if let Some(suffix) = &self.end_of_word_suffix {
|
if let Some(suffix) = &self.end_of_word_suffix {
|
||||||
model.end_of_word_suffix = Some(suffix.to_owned());
|
model.end_of_word_suffix = Some(suffix.to_owned());
|
||||||
|
} else {
|
||||||
|
model.end_of_word_suffix = None;
|
||||||
}
|
}
|
||||||
|
|
||||||
Ok(self.special_tokens.clone())
|
Ok(self.special_tokens.clone())
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
use tokenizers::models::bpe::BPE;
|
use tokenizers::models::bpe::BPE;
|
||||||
|
use tokenizers::pre_tokenizers::whitespace::Whitespace;
|
||||||
use tokenizers::{DecoderWrapper, NormalizerWrapper, PostProcessorWrapper, PreTokenizerWrapper};
|
use tokenizers::{DecoderWrapper, NormalizerWrapper, PostProcessorWrapper, PreTokenizerWrapper};
|
||||||
use tokenizers::{Model, TokenizerBuilder};
|
use tokenizers::{Model, Tokenizer, TokenizerBuilder};
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn bpe_values_after_training() {
|
fn bpe_values_after_training() {
|
||||||
@ -27,3 +28,33 @@ fn bpe_values_after_training() {
|
|||||||
assert_eq!(tokenizer.get_model().dropout, Some(0.1));
|
assert_eq!(tokenizer.get_model().dropout, Some(0.1));
|
||||||
assert_eq!(tokenizer.get_model().unk_token, Some("[UNK]".to_string()));
|
assert_eq!(tokenizer.get_model().unk_token, Some("[UNK]".to_string()));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn bpe_continuing_subword_prefix_error() {
|
||||||
|
let mut tokenizer = TokenizerBuilder::<
|
||||||
|
BPE,
|
||||||
|
NormalizerWrapper,
|
||||||
|
PreTokenizerWrapper,
|
||||||
|
PostProcessorWrapper,
|
||||||
|
DecoderWrapper,
|
||||||
|
>::default()
|
||||||
|
.with_model(
|
||||||
|
BPE::builder()
|
||||||
|
.unk_token("[UNK]".to_string())
|
||||||
|
.continuing_subword_prefix("##".to_string())
|
||||||
|
.build()
|
||||||
|
.unwrap(),
|
||||||
|
)
|
||||||
|
.with_pre_tokenizer(Some(PreTokenizerWrapper::Whitespace(Whitespace::default())))
|
||||||
|
.build()
|
||||||
|
.unwrap();
|
||||||
|
let mut trainer = tokenizer.get_model().get_trainer();
|
||||||
|
tokenizer
|
||||||
|
.train_from_files(&mut trainer, vec!["./data/small.txt".to_string()])
|
||||||
|
.unwrap();
|
||||||
|
tokenizer.save("tokenizer.json", true).unwrap();
|
||||||
|
let tokenizer = Tokenizer::from_file("tokenizer.json").unwrap();
|
||||||
|
assert_eq!(tokenizer.get_vocab_size(false), 1526);
|
||||||
|
|
||||||
|
std::fs::remove_file("tokenizer.json").unwrap();
|
||||||
|
}
|
||||||
|
Reference in New Issue
Block a user