我使用了该never_split
选项并尝试保留一些令牌。但是分词器仍然将它们分成单词。
tokenizer = BertTokenizer.from_pretrained('bert-base-uncased', never_split=['lol'])
tokenizer.tokenize("lol That's funny")
['lo', '##l', 'that', "'", 's', 'funny']
我在这里想念什么吗?
我使用了该never_split
选项并尝试保留一些令牌。但是分词器仍然将它们分成单词。
tokenizer = BertTokenizer.from_pretrained('bert-base-uncased', never_split=['lol'])
tokenizer.tokenize("lol That's funny")
['lo', '##l', 'that', "'", 's', 'funny']
我在这里想念什么吗?
我会称这是一个错误,或者至少没有很好的文档记录。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']