Реализация Natural Language Processing в мобильном приложении
NLP в мобильном контексте — это не одна задача, а несколько принципиально разных: классификация текста, извлечение сущностей (NER), анализ тональности, суммаризация, машинный перевод. Каждая решается разными инструментами с разными требованиями к ресурсам.
Платформенные 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 — уже разобрана в другой услуге.
Классификация текста на 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 сжатие с минимальной потерей точности
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, ML Kit или собственная модель. Для кастомных моделей: подготовка данных, обучение, квантизация, конвертация. Интеграция с NNAPI/Metal-делегатом для ускорения. Тестирование на языковом разнообразии (диалекты, ошибки ввода).
Ориентиры по срокам
Интеграция платформенных NLP API (тональность, токенизация, NER) — 3–5 дней. Кастомный классификатор с обучением и мобильной оптимизацией — 3–6 недель.







