Я хочу решить задачу прогнозирования стресса с предварительно обученным русским бертом.
Входные данные выглядят так:
граммов сверху|000100000001000
Нули означают отсутствие стресса. Единицы представляют характер стрессовой позиции.
Я хочу отобразить его как слово -> индекс числа гласных
Так будет вроде граммов -> 1 сверху -> 1
Итак, для каждого токена это должен быть линейный слой с softmax.
Я понимаю эту часть, но мне сложно иметь дело с предварительной обработкой текста, потому что текстовый токенизатор может разбить слово на токены подслов.
Токенизатор принимает входную строку и возвращает такие токены
bert_tokenizer.encode('граммов сверху')
->
[101, 44505, 26656, 102]
Итак, как получить сопоставление позиций между входными символами и словами?
Желаемый результат должен быть таким: [[0, 7], [8, 14]]
Я пытался читать документы https://huggingface.co/transformers/main_classes/tokenizer.html</ а>
И нашел функцию convert_ids_to_tokens Она работает как
encoded = bert_tokenizer.encode('граммов сверху')
bert_tokenizer.convert_ids_to_tokens(encoded)
->
['[CLS]', 'граммов', 'сверху', '[SEP]']
Но я не уверен, как использовать исходную строку и индексы напряжения для вычисления номера позиции напряжения для токена.
Оказалось, что у токенизатора есть параметр return_offsets_mapping, это решает мою проблему.