Реалізація 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 не вміють в доменну класифікацію — не скажуть «це відгук про їжу» або «це технічний запит в підтримку». Потрібна своя модель.
Типовий конвеєр для мобільного 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 тижнів.







