2

我使用了该never_split选项并尝试保留一些令牌。但是分词器仍然将它们分成单词。

tokenizer = BertTokenizer.from_pretrained('bert-base-uncased', never_split=['lol'])
tokenizer.tokenize("lol That's funny")
['lo', '##l', 'that', "'", 's', 'funny']

我在这里想念什么吗?

4

1 回答 1

3

我会称这是一个错误,或者至少没有很好的文档记录。never_split仅当您使用 BasicTokenizer(它是 BertTokenizer 的一部分)时才考虑该参数。

您正在从您的特定模型(bert-base-uncased)调用 tokenize 函数,这考虑他的词汇表(如我所料)。为了防止某些标记的分裂,它们必须是词汇表的一部分(您可以使用方法add_tokens扩展词汇表)。

我认为下面的示例显示了我想说的内容:

from transformers import BertTokenizer

text = "lol That's funny lool"

tokenizer = BertTokenizer.from_pretrained('bert-base-uncased', never_split=['lol'])
#what you are doing
print(tokenizer.tokenize(text))

#how it is currently working
print(tokenizer.basic_tokenizer.tokenize(text))

#how you should do it
tokenizer.add_tokens('lol')
print(tokenizer.tokenize(text))

输出:

['lo', '##l', 'that', "'", 's', 'funny', 'lo', '##ol']
['lol', 'that', "'", 's', 'funny', 'lool']
['lol', 'that', "'", 's', 'funny', 'lo', '##ol']
于 2020-03-30T20:29:37.613 回答