Аргумент "never_split" не работает на Bert Tokenizer - PullRequest
1 голос
/ 29 марта 2020

Я использовал опцию never_split и попытался сохранить некоторые токены. Но токенизатор все же делит их на WordPieces.

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

Я что-то здесь скучаю?

1 Ответ

0 голосов
/ 30 марта 2020

Я бы назвал это ошибкой или, по крайней мере, не очень хорошо задокументировано. Аргумент never_split учитывается только при использовании BasicTokenizer (который является частью BertTokenizer).

Вы вызываете функцию токенизации из вашей указанной c модели (bert-base-uncased), и это учитывает только его словарный запас (как я и ожидал). Чтобы предотвратить расщепление определенных токенов, они должны быть частью словаря (вы можете расширить словарный запас с помощью метода 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']
...