Определитель тона отзывов
Соберём всё вместе в программу, которая разбирает сотни отзывов: подготавливает тексты, прогоняет их через модель пачками и печатает понятный отчёт.
Подготовка
def clean(reviews, max_chars):
result = []
for text in reviews:
text = " ".join(text.split()) # лишние пробелы, табуляции, переводы строк
if not text:
continue # пустые отзывы модели не нужны
if len(text) > max_chars:
text = text[:max_chars] + "…" # очень длинные — обрезать
result.append(text)
return result
Токенизатор и сам обрежет слишком длинный текст (truncation=True), но лишний мусор лучше убрать заранее.
Пачками
results = []
for start in range(0, len(texts), batch_size):
results += classify(texts[start:start + batch_size])
Модель считает пакет из 16 отзывов почти так же быстро, как один. Порядок ответов совпадает с порядком текстов. Сам pipeline тоже умеет пачки: classify(texts, batch_size=16).
Отчёт
Сводка по классам, отдельная строка для неуверенных ответов и примеры — самый негативный отзыв, самые частые темы. Так человек быстро видит картину и может проверить сомнительные случаи.
Модели ошибаются
- сарказм и ирония («просто супер, третий раз ломается») сбивают модели с толку;
- модель, обученная на английских отзывах, плохо понимает русские — выбирайте модель под язык и тему (на Hub есть модели для русских отзывов);
- модели перенимают перекосы данных, на которых их учили.
Поэтому показывайте уверенность, ставьте порог и оставляйте человеку последнее слово в важных решениях.
Что дальше
- дообучение (
Trainer,datasets) — подстроить готовую модель под свои отзывы, имея несколько тысяч размеченных примеров; - видеокарта:
pipeline(…, device=0)— в десятки раз быстрее; - большие языковые модели через API — когда нужно не только определить тон, но и объяснить, что не так.
Итог
- подготовка: сжать пробелы, убрать пустые, обрезать длинные;
- пачки:
range(0, len(texts), batch_size), порядок сохраняется; - отчёт с порогом уверенности и примерами;
- модели ошибаются — нужен порог и проверка человеком.