我使用ByteLevelBPETokenizer
来训练一个用于阿姆哈拉语(资源较少的语言)的自定义分词器。
tokenizer = ByteLevelBPETokenizer(lowercase=False)
tokenizer.train(files=paths, vocab_size=32000, min_frequency=3, special_tokens=[
"<s>",
"<pad>",
"</s>",
"<unk>",
"<mask>",
])
我得到的merge.txt和vocab.json文件现在不可读。
áĪ ħ
áĪ °
ĠáĬ¥ áĬķ
ĠáĬ ¨
Ġáĭ Ń
áĬ Ń
ĠáĪ Ī
áį į
此外,编码结果也会导致相同的不可读输出。
output = tokenizer.encode("አበበ በሶ በላ። ጫላ ጩቤ ጨበጠ፡፡")
print(output.ids, output.tokens, output.offsets)
>>>[0, 319, 5739, 2883, 4037, 303, 1631, 299, 5173, 506, 748, 11918, 363, 2] ['<s>', 'áĬł', 'áīłáīł', 'ĠáīłáĪ¶', 'ĠáīłáĪĭ', 'áį¢', 'ĠáĮ«', 'áĪĭ', 'ĠáĮ©', 'áī¤', 'ĠáĮ¨', 'áīłáĮł', 'áį¡áį¡', '</s>'] [(0, 0), (0, 3), (3, 9), (9, 16), (16, 23), (23, 26), (26, 30), (30, 33), (33, 37), (37, 40), (40, 44), (44, 50), (50, 56), (0, 0)]
这是预期的行为吗?我稍后将使用这个脚本来训练一个RoberTa模型。
谢谢!
2条答案
按热度按时间y53ybaqx1#
我也对波斯文本有类似的问题。
oxcyiej72#
嘿,@seyyaw,@taesiri。
TLDR;这是字节级别的BPE工作原理。主要优点是:
这是完全预期的行为。字节级别的BPE将所有Unicode代码点转换为多个字节级别的字符:
U+0020
变为Ġ
。目的是通过这样做,您最终获得了一个包含256个标记的初始字母表。这些256个标记可以合并在一起以表示词汇表中的任何其他标记。这导致了更小的词汇表,永远不需要一个“未知”的标记。