tokenizers ByteLevelBPETokenizer输出似乎很奇怪,

ltskdhd1  于 5个月前  发布在  其他
关注(0)|答案(2)|浏览(87)

我使用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模型。
谢谢!

y53ybaqx

y53ybaqx1#

我也对波斯文本有类似的问题。

oxcyiej7

oxcyiej72#

嘿,@seyyaw,@taesiri。

TLDR;这是字节级别的BPE工作原理。主要优点是:

  • 更小的词汇表
  • 没有未知的标记

这是完全预期的行为。字节级别的BPE将所有Unicode代码点转换为多个字节级别的字符:

  1. 每个Unicode代码点被分解为字节(对于ASCII字符为1个字节,对于UTF-8 Unicode代码点最多为4个字节)
  2. 每个字节值从Unicode表的开头获得一个“可见”字符分配给它。这尤其重要,因为有很多控制字符,所以我们不能简单地有一个简单的MapASCII表字符<->字节值。因此,一些字符会得到其他表示,例如空格U+0020变为Ġ
    目的是通过这样做,您最终获得了一个包含256个标记的初始字母表。这些256个标记可以合并在一起以表示词汇表中的任何其他标记。这导致了更小的词汇表,永远不需要一个“未知”的标记。

相关问题