Реализация Natural Language Processing в мобильном приложении
Мы интегрируем NLP в мобильные приложения более пяти лет. Если ваше приложение обрабатывает текст — отзывы пользователей, чаты поддержки, сканы документов — рано или поздно возникает задача добавить анализ тональности, распознавание имён или автоматический перевод. Решений десятки: платформенные API от Apple и Google, кастомные модели на MobileBERT, облачные сервисы. Как выбрать правильное без опыта? Наши инженеры сертифицированы Apple и Google, а каждый проект начинается с аудита ваших данных. Правильный выбор архитектуры NLP определяет не только точность, но и время отклика, размер приложения и приватность пользователей. В этой статье мы делимся практическим опытом: как не ошибиться с выбором, сэкономив время и деньги. Мы подготовили сравнительную таблицу основных подходов – она поможет быстро оценить, какой вариант подходит вашему проекту.
Какой подход выбрать для NLP в мобильном приложении?
Выбор между on-device и облачным NLP зависит от сценария. On-device — быстрее, приватнее, работает офлайн. Облако — точнее, поддерживает больше языков, требует интернета. Мы помогаем выбрать оптимальный вариант под ваши задачи.
| Критерий | On-device NLP | Cloud NLP |
|---|---|---|
| Скорость инференса | < 100 мс | 200–500 мс + сетевая задержка |
| Приватность | Данные не покидают устройство | Данные передаются на сервер |
| Работа офлайн | Да | Нет |
| Точность | Ниже (квантизованные модели) | Выше (полные модели) |
| Сложность интеграции | Средняя (настройка модели) | Низкая (REST API) |
Сравнение: On-device NLP обрабатывает текст в 5–10 раз быстрее облачного при условии, что модель оптимизирована под мобильное устройство. Это подтверждает наша практика.
Платформенные NLP API
Начинать нужно с того, что уже есть на устройстве — это бесплатно по ресурсам и работает без интернета.
iOS — NaturalLanguage framework:
import NaturalLanguage
// Определение языка
let recognizer = NLLanguageRecognizer()
recognizer.processString("Привет, как дела?")
let language = recognizer.dominantLanguage // .russian
// Токенизация
let tokenizer = NLTokenizer(unit: .word)
tokenizer.string = text
tokenizer.enumerateTokens(in: text.startIndex..<text.endIndex) { range, _ in
print(String(text[range]))
return true
}
// Анализ тональности
let tagger = NLTagger(tagSchemes: [.sentimentScore])
tagger.string = text
let (sentiment, _) = tagger.tag(at: text.startIndex,
unit: .paragraph,
scheme: .sentimentScore)
let score = Double(sentiment?.rawValue ?? "0") ?? 0.0
// score: -1.0 (негатив) ... +1.0 (позитив)
Android — ML Kit Text APIs:
EntityExtraction (ML Kit) умеет находить адреса, телефоны, даты, трекинг-номера, деньги — без интернета, модель скачивается один раз (~8 МБ). LanguageIdentification — аналог NLLanguageRecognizer. Модель SmartReply — уже разобрана в другой услуге.
Apple NaturalLanguage Framework и ML Kit for Android — проверенные инструменты, которые мы используем в каждом втором проекте.
| Фича | iOS NaturalLanguage | Android ML Kit |
|---|---|---|
| Токенизация | Да (NLTokenizer) | Да (TextSegmentation) |
| NER | Да (NLTag) | Да (EntityExtraction) |
| Анализ тональности | Да (sentimentScore) | Да (DocumentSentiment) |
| Язык | Определение + токены | Определение + классификация |
| Размер | Встроенный | ~8 МБ на сущности |
Когда облачное API выгоднее on-device?
Если нужна поддержка редких языков или максимальная точность (например, юридическая документация), облачные сервисы (OpenAI, YandexGPT, Google Cloud NLP) дают лучшее качество. Мы подключаем их как fallback или основной движок, когда требования к скорости не критичны.
Классификация текста на TFLite
Платформенные API не умеют в доменную классификацию — не скажут «это отзыв о еде» или «это технический запрос в поддержку». Нужна своя модель.
Типовой pipeline для мобильного NLP-классификатора:
- Обучение: BERT-tiny или MobileBERT (8 МБ vs 100 МБ у full BERT) на PyTorch/TF
- Конвертация:
torch.onnx.export()→ ONNX →onnxruntime-mobile, илиtf2tflite→.tflite - Квантизация: int8 через TFLite Converter даёт ~4x сжатие с минимальной потерей точности
Подробнее о квантизации
Квантизация с int8 снижает размер модели в 4 раза и ускоряет инференс на 20-30% на CPU. На устройствах с DSP/NPU (Android 8.1+) ускорение может достигать 10x. Важно: точность классификации может упасть на 1-3%, что обычно приемлемо для мобильных сценариев.class TextClassifier(context: Context) {
private val interpreter: Interpreter
private val tokenizer: BertTokenizer
init {
val modelBuffer = loadModelFile(context, "bert_tiny_classifier.tflite")
interpreter = Interpreter(modelBuffer, Interpreter.Options().apply {
addDelegate(NnApiDelegate()) // Android Neural Networks API
})
tokenizer = BertTokenizer.fromAssets(context, "vocab.txt")
}
fun classify(text: String): ClassificationResult {
val tokens = tokenizer.encode(text, maxLength = 128, truncate = true)
val inputIds = Array(1) { tokens.inputIds.toIntArray() }
val attentionMask = Array(1) { tokens.attentionMask.toIntArray() }
val output = Array(1) { FloatArray(NUM_LABELS) }
interpreter.runForMultipleInputsOutputs(
arrayOf(inputIds, attentionMask),
mapOf(0 to output)
)
return output[0].argmax().let { ClassificationResult(label = LABELS[it], confidence = output[0][it]) }
}
}
NNAPI делегат на Android 8.1+ ускоряет инференс через DSP/NPU. На Pixel 7+ — ускорение до 10x. На бюджетных устройствах NNAPI может быть медленнее CPU — тестируйте на реальных девайсах.
Named Entity Recognition
NER — извлечение именованных сущностей из текста (персоны, организации, локации, даты). Примеры применения: автоматическое создание событий в календаре из сообщений, предзаполнение форм из CV, парсинг чеков.
ML Kit EntityExtraction покрывает типовые сущности без обучения. Для кастомных доменов — собственная NER-модель на базе BiLSTM+CRF или BERT. Размер модели: BiLSTM — 5–15 МБ, DistilBERT-NER — ~60 МБ в fp16.
На iOS NL framework возвращает NLTag с типами: .personalName, .placeName, .organizationName. Работает на устройстве без интернета.
Суммаризация и перевод
Суммаризация on-device требует тяжёлых моделей (BART, T5 минимум 60–100 МБ). Для мобильного — либо экстрактивная суммаризация (выбор ключевых предложений без генерации, работает через TF-IDF + MMR, ~100 КБ логики), либо cloud API (OpenAI, YandexGPT).
Машинный перевод: ML Kit Translation поддерживает 59 языков, модели скачиваются по запросу (~30 МБ на пару языков). На iOS — MLTranslation через Apple Intelligence (iOS 18+) или облачные API.
Обработка пользовательского ввода: очистка и нормализация
Часто упускаемый шаг — предобработка текста перед NLP-моделью. Опечатки, сленг, смайлы, смешанная раскладка (когда латиницей пишут русские слова) — всё это снижает точность. Apache Lucene Analyzers на Android или NLTokenizer с кастомными правилами на iOS помогают привести текст к нормальной форме.
Что входит в нашу работу
Мы гарантируем прозрачный процесс и фиксируем результат:
- Анализ ваших данных и требований к NLP-функциям (точность, скорость, языки)
- Выбор подхода: платформенные API, кастомная on-device модель или облачный сервис
- Разработка и обучение модели (если требуется)
- Интеграция в приложение с учётом архитектуры (чистая архитектура, MVVM, MVI)
- Тестирование на реальных устройствах (более 30 моделей iOS/Android)
- Документация и обучение вашей команды
- Поддержка после запуска (гарантийный период 3 месяца)
Почему стоит доверить NLP-интеграцию нам?
- 5+ лет опыта в мобильной разработке
- 30+ проектов с NLP (от анализа отзывов до голосовых ассистентов)
- Сертифицированные инженеры (iOS, Android, ML)
- Решения работают на 500+ миллионах устройств
- Ускорение time-to-market в среднем в 2 раза за счёт готовых компонентов
Оценим ваш проект за 1 день. Свяжитесь с нами — обсудим задачу и предложим оптимальное решение. Закажите интеграцию NLP уже сегодня.
Ориентиры по срокам
Интеграция платформенных NLP API (тональность, токенизация, NER) — 3–5 дней. Кастомный классификатор с обучением и мобильной оптимизацией — 3–6 недель. Сроки указаны для работы под ключ.







