Как запретить BERT разбивать определенные c слов на словарные части - PullRequest
0 голосов
/ 29 мая 2020

Я использую предварительно обученную модель BERT для токенизации текста в значимые токены. Однако в тексте много специфических c слов, и я не хочу, чтобы модель BERT разбивала их на части. Есть ли какое-то решение? Например:

tokenizer = BertTokenizer('bert-base-uncased-vocab.txt')
tokens = tokenizer.tokenize("metastasis")

Создайте токены следующим образом:

['meta', '##sta', '##sis']

Однако я хочу сохранить все слова как один токен, например:

['metastasis']

Ответы [ 2 ]

1 голос
/ 29 мая 2020

Вы можете добавлять новые токены к существующему предварительно обученному токенизатору, но затем вам необходимо обучить свою модель с помощью улучшенного токенизатора (дополнительные токены).

Пример:

from transformers import BertTokenizer
tokenizer = BertTokenizer.from_pretrained('bert-base-uncased')
v = tokenizer.get_vocab()
print(len(v))
tokenizer.add_tokens(['whatever', 'underdog'])
v = tokenizer.get_vocab()
print(len(v))

Если токен уже существует как «что угодно», он не будет добавлен.

Вывод:

30522
30523
0 голосов
/ 29 мая 2020

Основываясь на обсуждении здесь , один из способов использования моего собственного дополнительного словарного словаря, который содержит c специфические слова, - это изменить первые ~ 1000 строк файла vocab.txt ([unused ] строк) с указанными c словами. Например, я заменил «[unused1]» на «метастаз» в файле vocab.txt и после токенизации с измененным файлом vocab.txt получил следующий результат:

tokens = tokenizer.tokenize("metastasis")
Output: ['metastasis']
...