Задачи pipeline: тональность, NER, генерация

Разбираем три популярные задачи: классификацию тональности, извлечение сущностей и генерацию текста.

Задача (task) в pipeline — это строка-идентификатор, которая определяет тип модели и формат входа-выхода, например "ner" или "text-generation".

Анализ тональности

Задача sentiment-analysis определяет эмоциональную окраску текста — позитив, негатив (иногда нейтраль). Применяется для анализа отзывов, комментариев, обращений в поддержку.

clf = pipeline("sentiment-analysis")
print(clf("I love this!"))
# [{'label': 'POSITIVE', 'score': 0.9998}]

Распознавание именованных сущностей (NER)

NER (Named Entity Recognition) находит в тексте имена людей, организации, локации, даты. Это базовая задача NLP — связь с одноимённым курсом прямая.

ner = pipeline("ner", grouped_entities=True)
print(ner("Илон Маск основал SpaceX в США"))
# [{'entity_group': 'PER', 'word': 'Илон Маск'},
#  {'entity_group': 'ORG', 'word': 'SpaceX'},
#  {'entity_group': 'LOC', 'word': 'США'}]

Параметр grouped_entities=True склеивает токены одной сущности в одно слово — иначе «SpaceX» может разбиться на части.

Генерация текста

Задача text-generation продолжает заданный текст. Под капотом — decoder-модель (вроде GPT), которая предсказывает следующее слово раз за разом. Связь с курсом по LLM: это и есть упрощённая суть работы языковых моделей.

gen = pipeline("text-generation", model="gpt2")
print(gen("Машинное обучение это", max_new_tokens=20))

Как работает под капотом

Для классификации модель выдаёт логиты по числу классов, и постобработка выбирает максимальный. Для NER модель размечает каждый токен меткой (это token-classification), а постобработка склеивает соседние токены одной сущности. Для генерации модель работает авторегрессионно: предсказала слово, добавила его ко входу, предсказала следующее — и так до лимита токенов. Поэтому генерация медленнее классификации: модель вызывается много раз.

Частые ошибки

  • Забыть grouped_entities в NER. Получите разрозненные кусочки слов вместо целых сущностей.
  • Генерировать без лимита. Без max_new_tokens текст может получиться очень длинным или зациклиться.
  • Ожидать осмысленности от gpt2 на русском. Маленькие модели на русском работают слабо — берите подходящую.

Итог

  • sentiment-analysis — классификация тональности текста.
  • ner — извлечение сущностей (люди, организации, места); используйте grouped_entities=True.
  • text-generation — авторегрессионное продолжение текста decoder-моделью.
  • Генерация медленнее классификации, потому что модель вызывается многократно.
Проверьте себя
1. Что делает задача NER?
AОпределяет тональность текста
BНаходит именованные сущности: людей, организации, места
CПереводит текст
DСжимает текст
2. Зачем в NER нужен параметр grouped_entities=True?
AЧтобы ускорить модель
BЧтобы склеить токены одной сущности в целое слово
CЧтобы перевести сущности
DЧтобы убрать стоп-слова
3. Почему генерация текста медленнее классификации?
AМодель генерации больше по размеру всегда
BМодель вызывается многократно, предсказывая по одному слову
CИспользуется более медленный токенизатор
DГенерация требует интернета