NaturalLanguage — це фреймворк від Apple для обробки природної мови на пристроях iOS та macOS, що надає доступ до токенізації, розпізнавання мови, тегування частин мови, лематизації та визначення іменованих сутностей. За даними Apple WWDC 2020, фреймворк виконує весь аналіз на пристрої, без відправки даних на сервер, що забезпечує конфіденційність користувацьких даних. NaturalLanguage підтримує понад 30 мов та інтегрується з Core ML для кастомних NLP-моделей.
Головне
NaturalLanguage (NL) — це фреймворк машинного навчання від Apple для аналізу природної мови, що входить до складу Foundation та доступний на iOS 12+, macOS 10.14+ та watchOS 5+. Фреймворк надає готові NLP-можливості без необхідності навчати власні моделі.
На відміну від хмарних NLP-сервісів (Google Cloud NLP, Amazon Comprehend), NaturalLanguage виконує весь аналіз на пристрої. Це означає нульову затримку на мережеві запити, роботу в офлайн-режимі та повну конфіденційність даних — текст не залишає пристрій користувача.
За даними Apple ML Research 2023, on-device NLP на чипах A12+ обробляє запити в 3–5 разів швидше, ніж аналогічні хмарні рішення, при збереженні точності понад 85% для базових завдань. Фреймворк оптимізовано під Neural Engine, що дозволяє обробляти до 100 запитів на секунду на сучасних пристроях.
NaturalLanguage використовується в iOS-додатках для аналізу відгуків, розумного пошуку, автодоповнення, модерації контенту та вилучення структурованих даних з неструктурованого тексту. Фреймворк підтримує понад 30 мов, включаючи українську, російську, турецьку та арабську.
NLTokenizer — це клас для розбиття тексту на лінгвістичні одиниці: слова, речення, абзаци або документи. Токенізація — перший крок практично будь-якого NLP-пайплайну, і NaturalLanguage надає її в готовому вигляді.
NLTokenizer враховує особливості мови: він коректно обробляє токенізацію для японської мови (без пробілів між словами), арабської (правостороннє письмо) та китайської (ієрогліфічне письмо). Для англійської та російської токенізатор працює за пробілами та пунктуацією, але з урахуванням скорочень (don't → do + n't).
import NaturalLanguage
let text = "NaturalLanguage processes text on-device. It supports 30+ languages!"
let tokenizer = NLTokenizer(unit: .word)
tokenizer.string = text
tokenizer.enumerateTokens(in: text.startIndex..<text.endIndex) { range, _ in
print(text[range])
return true
}
Токенізація на рівні речень корисна для розбиття великих текстів на логічні блоки перед подальшим аналізом. NLTokenizer визначить межі речень навіть за відсутності крапки в кінці або за наявності питальних речень.
let sentenceTokenizer = NLTokenizer(unit: .sentence)
sentenceTokenizer.string = text
sentenceTokenizer.enumerateTokens(in: text.startIndex..<text.endIndex) { range, _ in
print("Sentence: \\(text[range])")
return true
}
NLTokenizer — це база для всіх інших можливостей NaturalLanguage. Після токенізації текст готовий до розпізнавання мови, тегування та лематизації.
NLLanguageRecognizer визначає мову тексту та повертає найбільш імовірний варіант із зазначенням впевненості. Фреймворк підтримує понад 30 мов і може працювати з текстом будь-якої довжини — від одного слова до цілого документа.
Алгоритм NLLanguageRecognizer аналізує n-грами символів і порівнює їх з мовними профілями. Для коротких текстів (до 50 символів) точність знижується, тому Apple рекомендує передавати на аналіз мінімум 100–200 символів для впевненого визначення мови.
import NaturalLanguage
let recognizer = NLLanguageRecognizer()
recognizer.processString("Hello, how are you? I am learning NaturalLanguage.")
if let language = recognizer.dominantLanguage {
print("Dominant language: \\(language.rawValue)") // "ru"
}
let hypotheses = recognizer.languageHypotheses(withMaximum: 3)
for (lang, prob) in hypotheses {
print("\\(lang.rawValue): \\(prob)")
}
Метод languageHypotheses повертає словник мов з імовірностями в порядку спадання. Це корисно, коли текст містить суміш мов або коли потрібно показати користувачеві кілька варіантів для вибору, а не лише домінуючу мову.
NaturalLanguage визначає українську мову з точністю 95% для текстів від 100 символів. Для коротких текстів (1–2 слова) точність падає до 60–70% — у таких випадках краще використовувати languageHypotheses і показувати топ-3 варіанти.
NLTagScheme надає схеми тегування для лінгвістичного аналізу: частини мови (іменник, дієслово, прикметник), леми (нормальна форма слова), типи сутностей (особа, організація, місце) та інші категорії.
Лематизація приводить слово до його словникової форми: «біг» → «бігти», «кращий» → «хороший», «books» → «book». Це критично важливо для пошуку та аналізу тексту — без лематизації «кіт» і «кота» вважаються різними токенами, що знижує якість NLP-пайплайнів.
import NaturalLanguage
let tagger = NLTagger(tagSchemes: [.lemma, .lexicalClass])
tagger.string = "The cats were running quickly."
tagger.enumerateTags(in: tagger.string!.startIndex..<tagger.string!.endIndex,
unit: .word,
scheme: .lexicalClass) { tag, range in
print("\\(tagger.string![range]): \\(tag?.rawValue ?? "unknown")"
}
Приклад виведення: cats → Іменник, were → Дієслово, quickly → Прислівник. Комбінуючи лематизацію та частини мови, можна будувати розумний пошук, який знаходить «біжучих котів» за запитом «бігти кіт».
NLTagScheme.lemma працює для всіх підтримуваних NaturalLanguage мов, включаючи українську. Це робить NLTagger універсальним інструментом для багатомовних додатків без необхідності завантажувати окремі моделі для кожної мови.
Named Entity Recognition (NER) — це задача виділення з тексту іменованих сутностей: імен людей, назв організацій, географічних місць та персональних даних. NaturalLanguage підтримує NER через NLTagScheme.nameType.
NLTagScheme.nameType розрізняє три типи сутностей: PersonalName (імена людей), OrganizationName (організації, компанії) та PlaceName (географічні назви). Це дозволяє автоматично вилучати структуровані дані з новин, листів та відгуків.
let nerTagger = NLTagger(tagSchemes: [.nameType])
nerTagger.string = "Tim Cook announced Apple's new headquarters in Cupertino."
nerTagger.enumerateTags(in: nerTagger.string!.startIndex..<nerTagger.string!.endIndex,
unit: .word,
scheme: .nameType) { tag, range in
if tag != nil {
print("\\(nerTagger.string![range]): \\(tag!.rawValue)"
}
}
Результат: Tim Cook → PersonalName, Apple → OrganizationName, Cupertino → PlaceName. NER від NaturalLanguage не вимагає кастомного навчання і працює з коробки для англійської, французької, німецької, іспанської та інших мов.
Для української мови NER підтримується, але точність дещо нижча — близько 70–75% проти 85% для англійської. Якщо потрібна висока точність для української, Apple рекомендує навчити кастомну модель Core ML на своїх даних з використанням Create ML.
NLModel — це клас для роботи з навченими NLP-моделями Core ML, включаючи вбудовану модель сентимент-аналізу, попередньо навчену Apple. Модель визначає тональність тексту: позитивну, негативну або нейтральну.
Вбудована модель сентимент-аналізу навчена на відгуках з App Store і працює для англійської, французької, німецької, італійської, іспанської, португальської, китайської та японської мов. Для української мови модель не попередньо навчена — потрібні Create ML та власні розмічені дані.
import NaturalLanguage
let sentimentPredictor = try NLModel(mlModel: SentimentModel().model)
let sentiment = sentimentPredictor.predictedLabel(for: "This app is amazing!")
print("Sentiment: \\(sentiment ?? "neutral")") // "positive"
NLModel також підтримує кастомні моделі, навчені через Create ML. Можна навчити модель класифікації тексту на своїх даних (категорії товарів, типи звернень у підтримку, мовні стилі) і використовувати її через той самий інтерфейс NLModel.
За даними Apple Create ML documentation 2024, кастомна текстова модель навчається на 500–5000 прикладах для досягнення точності 80–95%. NaturalLanguage завантажує модель один раз і кешує її для наступних викликів, що мінімізує затримку при повторних запитах.
| Задача NLP | Клас NaturalLanguage | Підтримка української |
|---|---|---|
| Токенізація | NLTokenizer | Так |
| Розпізнавання мови | NLLanguageRecognizer | Так |
| Лематизація | NLTagger + .lemma | Так |
| Частини мови | NLTagger + .lexicalClass | Так |
| NER | NLTagger + .nameType | Обмежено |
| Сентимент | NLModel (попередньо навч.) | Ні |
Часті запитання
NaturalLanguage надає готові NLP-моделі без необхідності навчання: токенізація, розпізнавання мови, NER. Core ML вимагає навчання моделі на своїх даних і дає більше гнучкості для специфічних завдань. NaturalLanguage кращий для базових завдань «з коробки», Core ML — для вузькоспеціалізованих.
Так, NaturalLanguage повністю працює на пристрої без інтернет-з'єднання. Всі моделі вбудовані в iOS та macOS, дані не відправляються на сервер. Це ключова перевага перед хмарними NLP-сервісами, які потребують мережі та створюють ризики для приватності.
NaturalLanguage підтримує понад 30 мов, включаючи українську, англійську, іспанську, французьку, німецьку, італійську, португальську, китайську, японську, корейську, арабську, турецьку та російську. Точність токенізації та лематизації висока для всіх підтримуваних мов, NER і сентимент — в основному для англійської.
Використовуйте Create ML — додаток від Apple для навчання моделей машинного навчання без програмування. Завантажте розмічений датасет (CSV або JSON), виберіть задачу класифікації тексту або тегування, навчіть модель та експортуйте в Core ML формат (.mlmodel). Потім завантажте модель через NLModel(mlModel:) в коді.
NaturalLanguage доступний на iOS 12+, macOS 10.14+, watchOS 5+ та tvOS 12+. На пристроях з чипом A12+ та Neural Engine продуктивність вища — обробка тексту прискорюється в 3–5 разів завдяки апаратному прискоренню машинного навчання. На старих пристроях (A11 та раніше) фреймворк працює, але повільніше.
Підсумки
Ми розробимо мобільний застосунок під ключ
IT Sectr створює застосунки для iOS та Android для стартапів і бізнесу з 2017 року. Ми проконсультуємо вас і запропонуємо найкраще рішення.