我使用在英语数据上训练的roberta-base tokenizer tokenizer = RobertaTokenizerFast.from_pretrained('roberta-base',add_prefix_space=True)来标记化孟加拉语,只是为了看看它是如何表现的。当我尝试对一个孟加拉字符tokenizer.encode('বা')进行编码时,我得到了[0, 1437, 35861, 11582, 35861, 4726, 2],这意味着它在它的词汇表中找到了一些与孟加拉字符匹配的标记,即使是在英语上训练。在进一步的研究中,我发现这些都是特殊字符['<s>', 'Ġ', 'à¦', '¬', 'à¦', '¾', '</s>']。我的问题是,为什么会发生这种情况,当应用于一种新的语言时,它不是应该输出未知的标记吗?非常感谢您的帮助
发布于 2021-10-22 08:40:41
正如评论中提到的,原因是RoBERTa标记器是基于字节的,而不是基于字符的。
在UTF-8中,字符由不同的字节数表示,这与拉丁字母有很大的不同: ASCII字符是单字节的,“最长”字符最多为四个字节。维基百科的一个例子:
Char | UTF code | Bytes
------------------------------
$ | U+0024 | 24
¢ | U+00A2 | C2 A2
ह | U+0939 | E0 A4 B9
€ | U+20AC | E2 82 AC
| U+10348 | F0 90 8D 88因此,RoBERTa使用的SentecePiece标记器首先将文本分割成字节,这始终是可能的,而且只有256个字节,所以没有什么是每个OOV的。然后,已知的字节组被分组为来自词汇表的已知标记。
SentencePiece还对空格和特殊字符进行特殊处理。首先,它用特殊字符和空格分割文本,并用特殊字符替换空格。在最初的实现中,它是一个特殊的UTF8下划线▁,在Huggingface实现中,它是Ġ。这个特殊字符也被放在句子的开头,所以当单词在句子的开头或中间时,它们被一致地表示出来。
所以,你看到的输出基本上是:
Ġ)前面的特殊空格符号,的四个字节
这意味着字符বা不在词汇表中,因此它最终被表示为四个字节,并且字节总是已知的。
https://stackoverflow.com/questions/69089843
复制相似问题