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 взема предвид особеностите на езика: той правилно обработва токенизация за японски (без интервали между думите), арабски (писмо от дясно на ляво) и китайски (йероглифно писмо). За английски и български, токенизаторът работи на базата на интервали и пунктуация, но като взема предвид съкращения.
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 предоставя схеми за маркиране за лингвистичен анализ: части на речта (съществително, глагол, прилагателно), леми (нормална форма на думата), типове обекти (лице, организация, място) и други категории.
Лематизацията привежда думата до нейната речникова форма: „тича" → „тичам", „по-добър" → „добър", „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, включително български. Това прави 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: "Това приложение е невероятно!")
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 г. Ще ви консултираме и ще предложим най-доброто решение.
Прочетете също