tokenizers [Bug?] 修改预训练分词器的normalizer并不总是起作用

col17t5w  于 6个月前  发布在  其他
关注(0)|答案(2)|浏览(106)

我不确定这是不是一个bug/特性,有时候修改预训练分词器的normalizer是有效的,但有时候它不起作用。
例如,对于"mistralai/Mistral-7B-v0.1"有效,但对于"mistralai/Mistral-7B-v0.3"无效:

from transformers import AutoTokenizer
from tokenizers.normalizers import Sequence, Replace, Prepend

tokenizer_name = "mistralai/Mistral-7B-v0.1"
old_tok = AutoTokenizer.from_pretrained(tokenizer_name)

assert old_tok.backend_tokenizer.normalizer != None

new_normalizer = Sequence(
    [Prepend('▁'), Replace('▁', ' '), Replace("foo", "bar"), Replace('<br>', '\n')]
)

old_tok.backend_tokenizer.normalizer = new_normalizer
new_tokenizdr_name = f"new_tokenizer-{tokenizer_name}"
old_tok.save_pretrained(new_tokenizdr_name)

old_tok = AutoTokenizer.from_pretrained(tokenizer_name)
new_tok = AutoTokenizer.from_pretrained(new_tokenizdr_name)

[out]:

>>> print(' '.join(old_tok.batch_decode(old_tok("I foo you<br>hello world")['input_ids'])))
<s> I foo you < br > hello world

>>> print(' '.join(new_tok.batch_decode(new_tok("I foo you<br>hello world")['input_ids'])))
<s>  I  bar  you 
 hello  world

上述过程对于"mistralai/Mistral-7B-v0.3"不起作用。

ff29svar

ff29svar1#

我认为这确实是一个bug,另一个用户发现间接覆盖是修改后缺失的normalizer的一个解决方法。
https://stackoverflow.com/questions/78612251/how-do-we-add-modify-the-normalizer-in-a-pretrained-huggingface-tokenizer/78624238#78624238

bfnvny8b

bfnvny8b2#

这是一个"bug",但可能会一直重新转换(如果在tokenizer_config.json中将from_slow设置为True,则会重新转换)。

相关问题