我正在尝试使用希腊文本训练一个新的标记生成器,以便稍后使用
将新标记添加到 Llama 3.1 标记生成器中tokenizer.add_tokens(list(new_tokens)).
但是,在希腊语和西班牙语文本上训练字节对编码分词器时,结果如下所示:
\['Translate', 'Ġfrom', 'ĠGreek', 'Ġto', 'ĠSpanish', ':', 'ĠÎĿα', 'ĠÎŃÏĥι', 'Ġογί', 'ĠγÎŃÏģοÏħ'\]
在分词器中扩展标记词汇时,这些编码的标记似乎是按字面传递的,而不是作为希腊字符的编码,并且分词器无法识别它们来编码句子。然而,当使用相同的方法并且新的标记被硬编码时,例如在
extender_tokenizer.add_tokens(['Αυτό', 'είναι'])
它确实有效。
我认为这是一个编码问题或者与 BPE 内部工作有关。 为什么希腊字符是这样显示的?与编码、BPE 或两者都有关吗?如何获取可以添加到标记生成器的希腊字符标记列表?
参考代码:
from tokenizers import Tokenizer, models, trainers, pre_tokenizers
tokenizer = Tokenizer(models.BPE())
tokenizer.pre_tokenizer = pre_tokenizers.ByteLevel()
trainer = trainers.BpeTrainer(vocab_size = 2000, min_frequency = 3, show_progress = True)
tokenizer.train_from_iterator(training_corpus, trainer = trainer)
正如 Joop Eggen 指出的,使用
tokenizers.UnicodeScripts
而不是 ByteLevel
解决了这个问题。