NaturalLanguage — је Apple-ов оквир за обраду природног језика на iOS и macOS уређајима, који пружа приступ токенизацији, препознавању језика, означавању делова говора, лематизацији и идентификацији именованих entity-ја. Према Apple WWDC 2020, оквир обавља сву анализу на уређају, без слања података на сервер, што обезбеђује поверљивост корисничких података. NaturalLanguage подржава преко 30 језика и интегрише се са Core ML за прилагођене NLP моделе.
Главне карактеристике
NaturalLanguage (NL) — је Apple-ов оквир машинског учења за анализу природног језика, који је део Foundation-а и доступан је на iOS 12+, macOS 10.14+ и watchOS 5+. Оквир пружа готове NLP могућности без потребе за обучавањем сопствених модела.
За разлику од cloud NLP сервиса (Google Cloud NLP, Amazon Comprehend), NaturalLanguage обавља сву анализу на уређају. То значи нулто кашњење за мрежне захтеве, рад у офлајн режиму и потпуну поверљивост података — текст не напушта корисников уређај.
Према Apple ML Research 2023, on-device NLP на A12+ чиповима обрађује захтеве 3–5 пута брже од сличних cloud решења, уз задржавање прецизности од преко 85% за основне задатке. Оквир је оптимизован за Neural Engine, омогућавајући обраду до 100 захтева у секунди на савременим уређајима.
NaturalLanguage се користи у iOS апликацијама за анализу рецензија, паметно претраживање, аутоматско довршавање, модерирање садржаја и издвајање структурираних података из неструктурираног текста. Оквир подржава преко 30 језика, укључујући српски, украјински, турски и арапски.
NLTokenizer — је класа за дељење текста на лингвистичке јединице: речи, реченице, параграфе или документе. Токенизација је први корак скоро сваког NLP pipeline-а, а 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 пружа шеме означавања за лингвистичку анализу: делове говора (именица, глагол, придев), леме (нормални облик речи), типове entity-ја (особа, организација, место) и друге категорије.
Лематизација своди реч на њен речнички облик: „трчао" → „трчати", „бољи" → „добар", „books" → „book". Ово је критично за претрагу и анализу текста — без лематизације „мачка" и „мачке" се сматрају различитим токенима, што смањује квалитет NLP pipeline-а.
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) — је задатак издвајања именованих entity-ја из текста: имена особа, назива организација, географских места и личних података. NaturalLanguage подржава NER кроз NLTagScheme.nameType.
NLTagScheme.nameType разликује три типа entity-ја: 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 документацији из 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, подаци се не шаљу на сервер. Ово је кључна предност у односу на cloud 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. године. Саветоваћемо вас и предложити најбоље решење.
Прочитајте такође