mirror of
https://github.com/mii443/tokenizers.git
synced 2025-08-22 16:25:30 +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 == []
|
||||
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 {
|
||||
model.continuing_subword_prefix = Some(prefix.to_owned());
|
||||
} else {
|
||||
model.continuing_subword_prefix = None;
|
||||
}
|
||||
if let Some(suffix) = &self.end_of_word_suffix {
|
||||
model.end_of_word_suffix = Some(suffix.to_owned());
|
||||
} else {
|
||||
model.end_of_word_suffix = None;
|
||||
}
|
||||
|
||||
Ok(self.special_tokens.clone())
|
||||
|
@ -1,6 +1,7 @@
|
||||
use tokenizers::models::bpe::BPE;
|
||||
use tokenizers::pre_tokenizers::whitespace::Whitespace;
|
||||
use tokenizers::{DecoderWrapper, NormalizerWrapper, PostProcessorWrapper, PreTokenizerWrapper};
|
||||
use tokenizers::{Model, TokenizerBuilder};
|
||||
use tokenizers::{Model, Tokenizer, TokenizerBuilder};
|
||||
|
||||
#[test]
|
||||
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().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