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
}
Токенизация на уровне предложений полезна для разбиения больших текстов на логические блоки перед дальнейшим анализом. NLTokenizerSentence определит границы предложений даже при отсутствии точки в конце или при наличии вопросительных предложений.
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 предоставляет схемы тегирования для лингвистического анализа: части речи (noun, verb, adjective), леммы (нормальная форма слова), типы сущностей (person, organization, place) и другие категории.
Лемматизация приводит слово к его словарной форме: «бежал» → «бежать», «лучше» → «хороший», «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 → Noun, were → Verb, quickly → Adverb. Комбинируя лемматизацию и части речи, можно строить умный поиск, который находит «бегущих котов» по запросу «бежать кот».
NLTagScheme.lemma работает для всех поддерживаемых NaturalLanguage языков, включая русский. Это makes 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 format (.mlmodel). Затем загрузите модель через NLModel(mlModel:) в коде.
NaturalLanguage доступен на iOS 12+, macOS 10.14+, watchOS 5+ и tvOS 12+. На устройствах с чипом A12+ и Neural Engine производительность выше — обработка текста ускоряется в 3–5 раз за счёт аппаратного ускорения машинного обучения. На старых устройствах (A11 и ранее) фреймворк работает, но медленнее.
Итоги
Мы разработаем мобильное приложение под ключ
IT Sectr создаёт приложения для iOS и Android для стартапов и бизнеса с 2017 года. Мы проконсультируем вас и предложим наилучшее решение.
Читайте также