Можно ли подавать текст в BERT без предобработки
Что проверяют
Отличаете ли вы предобработку под классические модели на мешке слов от того, что нужно трансформеру. Вопрос вылавливает кандидатов, которые по привычке чистят текст до состояния, в котором модель работает хуже, чем на сыром.
Как отвечать
Совсем без обработки не выйдет, но обязательный шаг ровно один: токенизация тем же токенизатором, которым обучался чекпоинт. Он сам добавит служебные токены начала и разделителя, разобьёт слова на подслова из своего словаря, соберёт маску внимания и добьёт последовательность паддингом.
tok = AutoTokenizer.from_pretrained(name)
batch = tok(texts, truncation=True, max_length=512,
padding=True, return_tensors="pt")Всё остальное, что обычно называют предобработкой, для этой модели скорее вредно. Удаление стоп-слов ломает синтаксис, на котором она и строит контекстные представления. Стемминг и лемматизация превращают знакомые формы в незнакомые. Приводить текст к нижнему регистру руками тоже не нужно: у чекпоинта без учёта регистра это делает сам токенизатор, а у регистрозависимого регистр несёт информацию, и вы её просто уничтожите.
Полезной остаётся чистка мусора: разметка, повторяющиеся шаблоны рассылок, битая кодировка, нормализация Unicode. И стратегия для длинных текстов, потому что вход ограничен по числу токенов.
Где спотыкаются
Берут токенизатор от другой модели или свой словарь. Идентификаторы перестают соответствовать матрице эмбеддингов, качество падает почти до случайного, а ошибок при этом нет ни одной.
Второе: молча теряют хвост длинных документов. Обрезка по лимиту позиций отрабатывает тихо, и если важное лежит в конце, метрика проседает без предупреждения. Лечится окнами с перекрытием или моделью с длинным контекстом.
Третье: делают паддинг руками и не передают маску внимания. Модель считает пустые позиции содержательными, а усреднение по всем токенам размывает вектор паддингом тем сильнее, чем короче текст.