Реализация AI-анализа тональности текста (Sentiment Analysis) в мобильном приложении
Sentiment analysis в мобильном контексте решает конкретные задачи: автоматическая модерация пользовательских отзывов, анализ тональности чатов и комментариев в реальном времени, мониторинг фидбека внутри приложения. Выбор между on-device моделью и серверным API определяет всё — latency, приватность, стоимость, точность.
On-device vs Cloud API
Cloud API (OpenAI, Google Cloud Natural Language, AWS Comprehend) — точность выше, особенно на неструктурированном тексте, но каждый запрос стоит денег и требует сети. Для продуктовой аналитики (отзывы, опросы) — нормально. Для realtime анализа каждого вводимого символа — нет.
On-device (CoreML + BERT / TensorFlow Lite + MobileBERT) — приватно, работает offline, нулевая latency по сети. Минус: модель весит 40–80 МБ, точность ниже на неоднозначных случаях, сложнее поддерживать (переобучение = обновление приложения или OTA-модели).
На iOS: CoreML с моделью DistilBERT-sentiment (конвертируется через coremltools из Hugging Face checkpoint). Inference < 50 мс на iPhone 12+. Инициализация MLModel при старте приложения, не при первом вызове — иначе получишь 300 мс задержку при первом анализе.
На Android: TensorFlow Lite с MobileBERT — аналогичный подход. Interpreter инициализируем в Application.onCreate() в фоновом потоке.
Гранулярность тональности
Базовый positive/negative/neutral — слишком груб для большинства задач. Fine-grained sentiment дают больше:
- Aspect-based sentiment: «доставка отличная, но упаковка плохая» — не один sentiment, а два по разным аспектам.
- Emotion classification: joy, anger, sadness, fear, surprise — для продуктового анализа ценнее, чем просто +/-.
- Intensity: очень негативный vs слегка негативный — влияет на приоритет реакции.
На практике: если нужен aspect-based — берём серверную модель (flair, spaCy с кастомными NER + sentiment pipeline) или GPT с structured output. On-device дотянет только до 3-классового классификатора без аспектов.
Конкретный кейс: анализ in-app отзывов
Экран обратной связи: пользователь пишет текст → по мере набора или при submit анализируем тональность on-device → если negative score > 0.7, перед отправкой показываем «Нам жаль, что у вас возникли трудности. Хотите сразу связаться с поддержкой?» → переводим в чат вместо публичного отзыва. Это стандартный паттерн снижения негативных публичных отзывов.
Техническая реализация: CoreMLSentimentAnalyzer.analyze(text) возвращает SentimentResult(label:score:). Debounce на 500 мс, чтобы не запускать inference при каждом символе. Результат храним в ReviewDraft — при submit передаём серверу вместе с текстом.
Мультиязычность
Отдельная модель под каждый язык — лучшая точность, но большой размер бандла. XLM-RoBERTa — мультиязычная модель, одна на все языки, хуже на каждом отдельном языке, но сильно лучше, чем ничего. Для русскоязычных текстов: DeepPavlov rubert-base-cased-sentiment — хорошая точность на CIS-данных, конвертируется в CoreML/TFLite.
Процесс работы
Определяем сценарий использования (realtime vs batch, on-device vs cloud), язык текстов, нужную гранулярность. Выбираем модель, интегрируем, настраиваем пороговые значения для бизнес-логики, тестируем на репрезентативных данных из продакшена.
Ориентиры по срокам
Интеграция готовой модели (Cloud API или pre-trained CoreML/TFLite) с базовым positive/negative/neutral — 3–5 дней. Кастомная модель с fine-tuning на своих данных, aspect-based анализ, мультиязычная поддержка — 3–5 недель. Стоимость рассчитывается индивидуально.







