Разработка NLP-решений и систем обработки текста

Проектируем и внедряем системы искусственного интеллекта: от прототипа до production-ready решения. Наша команда объединяет экспертизу в машинном обучении, дата-инжиниринге и MLOps, чтобы AI работал не в лаборатории, а в реальном бизнесе.
Показано 30 из 149 услугВсе 1566 услуг
Средняя
от 1 недели до 3 месяцев
Сложная
от 2 недель до 3 месяцев
Средняя
от 1 недели до 3 месяцев
Часто задаваемые вопросы
Направления AI-разработки
Этапы разработки AI-решения
Последние работы
  • image_website-b2b-advance_0.png
    Разработка сайта компании B2B ADVANCE
    1218
  • image_web-applications_feedme_466_0.webp
    Разработка веб-приложения для компании FEEDME
    1161
  • image_websites_belfingroup_462_0.webp
    Разработка веб-сайта для компании БЕЛФИНГРУПП
    853
  • image_ecommerce_furnoro_435_0.webp
    Разработка интернет магазина для компании FURNORO
    1047
  • image_logo-advance_0.png
    Разработка логотипа компании B2B Advance
    561
  • image_crm_enviok_479_0.webp
    Разработка веб-приложения для компании Enviok
    825

NLP: классификация текста, NER, эмбеддинги и извлечение информации

Приходит задача: «классифицировать обращения в службу поддержки — их около 50 тысяч в месяц, сейчас всё вручную». Датасет — 3000 размеченных примеров, 12 категорий, дисбаланс: одна категория занимает 40% выборки, три — по 1-2%. Accuracy baseline — 78%. Кажется неплохо, пока не смотришь на recall по редким классам: 0.31, 0.44, 0.28. Именно эти классы — жалобы и угрозы оттока — важнее всего бизнесу.

Это типичный NLP-проект. Проблема не в алгоритме, а в том, что accuracy — не та метрика.

Классификация текста: от BERT до дистилляции

BERT-подобные модели — стандарт для классификации. ruBERT-base или ruBERT-large от DeepPavlov для русского языка. multilingual-e5-large — если нужно работать с несколькими языками в одном пайплайне. XLM-RoBERTa-large — сильный multilingual backbone с хорошим качеством на ru/uk/de/fr.

Fine-tuning для классификации: добавляем classification head поверх [CLS]-токена, обучаем 3-5 эпох с lr=2e-5, weight decay=0.01. При дисбалансе классов: weighted CrossEntropyLoss или focal loss с gamma=2.0.

Кейс с дисбалансом. Датасет из примера выше: 3000 примеров, дисбаланс 1:20 на редких классах. Решение: class_weight через sklearn compute_class_weight('balanced', ...) + подаём в CrossEntropyLoss. Дополнительно — augmentation редких классов через backtranslation (ru → en → ru через Google Translate API или MarianMT) или перефразирование через LLM. В результате recall по редким классам вырос с 0.31 до 0.67 при незначительном падении accuracy (76% → 74%).

Дистилляция для production. BERT-large даёт F1 0.89, но inference на CPU — 180ms. Дистилляция в DistilBERT или использование ruBERT-tiny2 (DeepPavlov) снижает latency до 25ms при F1 0.84. Для большинства задач классификации — приемлемый трейдофф. Если 25ms всё равно много — экспорт в ONNX Runtime даёт дополнительный 1.5-2x.

NER: распознавание именованных сущностей

NER — извлечение из текста сущностей: персоны, организации, локации, даты, суммы, номера документов. Для общих категорий (PER, ORG, LOC) предобученные модели работают хорошо. Для специализированных (медицинские термины, юридические понятия, инженерные наименования) — нужен fine-tuning.

Разметка данных. Основная стоимость NER-проекта. Для качественной модели нужно 500-2000 размеченных предложений на каждый тип сущности. Инструменты разметки: Label Studio (open source), Prodigy (платный, от создателей spaCy, отличный UX). Формат IOB2 — стандарт.

Architektura. token classification поверх BERT: каждому токену присваивается метка (B-PER, I-PER, O и т.д.). spaCy 3.x с transformer pipeline — хороший production-выбор: удобный API, встроенный serving, поддержка кастомных компонентов.

Вложенные сущности. Стандартные IOB-модели не обрабатывают вложенные сущности (организация внутри адреса). Для таких задач — span-based NER: SpanBERT или модели из семейства SpERT. Сложнее в реализации, но правильно решает задачу.

Постобработка — обязательна. Модель предсказывает токены, но нужны нормализованные сущности. Для дат — нормализация через dateparser. Для денежных сумм — regex + валидация. Для имён — дедупликация через нечёткое совпадение (rapidfuzz).

Sentiment Analysis и opinion mining

Бинарная классификация positive/negative работает с BERT из коробки. Настоящая сложность — когда нужна аспектная тональность (ABSA, Aspect-Based Sentiment Analysis): «в ресторане хорошая кухня, но ужасный сервис».

Для ABSA: задача распадается на aspect extraction (NER) + sentiment classification по каждому аспекту. Либо joint модели типа BERT-for-ABSA, обученные end-to-end. Качество на русских данных ниже, чем на английских — меньше размеченных датасетов. RuSentiment, SentiRuEval — основные ресурсы для русского.

Для продакшена с простой позитив/негатив/нейтраль: distil-модели достаточно. Три класса, balanced датасет, 2000+ примеров — F1 macro 0.82-0.87 достижимо за 1-2 дня работы.

Суммаризация текста

Экстрактивная суммаризация (выбираем предложения из текста) — работает через TextRank или BM25-based scoring без обучения. Быстро, предсказуемо, не галлюцинирует. Хорошо для длинных документов, где нужна быстрая выжимка.

Абстрактивная суммаризация (генерирует новый текст) — seq2seq модели. mT5, mBART для multilingual. FRED-T5 и ruT5-large — специализированные русские модели для суммаризации. Для production deployement суммаризаторов через LLM API (GPT-4, Claude) — часто лучший трейдофф стоимость/качество/скорость разработки.

Эмбеддинги: векторные представления текста

Эмбеддинги — основа для семантического поиска, дедупликации, кластеризации, RAG. Качество эмбеддингов критически влияет на downstream задачи.

Модели. E5-large-v2, BGE-M3, multilingual-e5-large — сильные multilingual embedders. sentence-transformers/paraphrase-multilingual-mpnet-base-v2 — быстрый вариант с меньшим качеством. Для задач на русском: ru-en-RoSBERTa (Skoltech) даёт хорошие результаты на semantic textual similarity.

Оценка качества эмбеддингов. MTEB benchmark — стандарт для comparison. Смотрим Retrieval, STS, Clustering subtasks. Важно: топовые результаты на MTEB не всегда означают лучшие результаты на вашем доменном датасете. Обязательно строим домен-специфичный eval.

Fine-tuning эмбеддингов. Если стандартные модели дают недостаточное качество — contrastive learning на доменных парах (позитивные и негативные пары). sentence-transformers поддерживает MultipleNegativesRankingLoss для обучения на парах (вопрос, правильный ответ). 500-2000 пар, 1-3 эпохи — часто дают 5-15% прирост Recall@k на доменных данных.

Размерность и хранение. E5-large: 1024 dim, float32 — 4KB на вектор. При 10M документов — 40GB для индекса. Квантизация в int8 снижает до 10GB с незначительной потерей качества. FAISS IVF_PQ — ещё более компактно, но с потерями при recall.

Извлечение информации и парсинг документов

Структурированное извлечение из неструктурированного текста — одна из самых частых задач. Примеры: извлечь ключевые условия из договора, распарсить технические характеристики из описания товара, вытащить даты и суммы из счетов.

Подход 1: regex + rule-based. Для типовых полей с предсказуемым форматом (ИНН, ОГРН, суммы, даты) — надёжнее нейросети. Не требует данных, предсказуем.

Подход 2: NER + постобработка. Для сущностей с вариативным форматом.

Подход 3: LLM с structured output. GPT-4 / Claude с JSON schema — для сложных неструктурированных документов, где rule-based не справляется. Стоимость: ~$0.001-0.01 на документ в зависимости от объёма и модели. Для объёмов 10k+ документов/день — нужно считать экономику.

Для production обычно работает гибрид: regex/NER для типовых полей + LLM для edge cases и сложных структур.

Этапы работы

Анализ данных и базовые метрики. Смотрим распределение классов, длину текстов, качество разметки, языковой состав. Определяем правильные метрики: F1 macro для дисбаланса, Precision@k для ранжирования, Recall@k для поиска.

Baseline. TF-IDF + LogReg или CatBoost на bag-of-words — за день получаем baseline. Разрыв между baseline и BERT-fine-tuning показывает, насколько важен семантический контекст.

Обучение и валидация. k-fold cross-validation (k=5), ранняя остановка по F1 на валидации. Анализ ошибочных предсказаний руками — даёт идеи для улучшения.

Деплой. ONNX Runtime для CPU-инференса. FastAPI + uvicorn — стандарт для REST API. Батчинг запросов, если нужна пропускная способность.

Прототип на существующих данных — 1-3 недели. Production-система с CI/CD и мониторингом — 1.5-2.5 месяца.