NaturalLanguage — to framework Apple do przetwarzania języka naturalnego na urządzeniach iOS i macOS, zapewniający dostęp do tokenizacji, rozpoznawania języka, tagowania części mowy, lematyzacji i identyfikacji nazwanych encji. Według Apple WWDC 2020 framework wykonuje całą analizę na urządzeniu, bez wysyłania danych na serwer, co gwarantuje poufność danych użytkownika. NaturalLanguage obsługuje ponad 30 języków i integruje się z Core ML dla niestandardowych modeli NLP.
Najważniejsze
NaturalLanguage (NL) — to framework uczenia maszynowego Apple do analizy języka naturalnego, wchodzący w skład Foundation i dostępny na iOS 12+, macOS 10.14+ i watchOS 5+. Framework zapewnia gotowe możliwości NLP bez konieczności uczenia własnych modeli.
W przeciwieństwie do chmurowych usług NLP (Google Cloud NLP, Amazon Comprehend), NaturalLanguage wykonuje całą analizę na urządzeniu. Oznacza to zerowe opóźnienie na zapytania sieciowe, działanie w trybie offline i pełną poufność danych — tekst nie opuszcza urządzenia użytkownika.
Według Apple ML Research 2023, on-device NLP na układach A12+ przetwarza zapytania 3–5 razy szybciej niż podobne rozwiązania chmurowe, przy zachowaniu dokładności powyżej 85% dla podstawowych zadań. Framework jest zoptymalizowany pod Neural Engine, co pozwala przetwarzać do 100 zapytań na sekundę na nowoczesnych urządzeniach.
NaturalLanguage jest używany w aplikacjach iOS do analizy opinii, inteligentnego wyszukiwania, autouzupełniania, moderacji treści i wyodrębniania strukturalnych danych z nieustrukturyzowanego tekstu. Framework obsługuje ponad 30 języków, w tym polski, ukraiński, turecki i arabski.
NLTokenizer — to klasa do dzielenia tekstu na jednostki lingwistyczne: słowa, zdania, akapity lub dokumenty. Tokenizacja to pierwszy krok praktycznie każdego pipeline'u NLP, a NaturalLanguage zapewnia ją w gotowej formie.
NLTokenizer uwzględnia specyfikę języka: poprawnie obsługuje tokenizację dla japońskiego (bez spacji między słowami), arabskiego (pismo prawostronne) i chińskiego (pismo ideograficzne). Dla angielskiego i polskiego tokenizator działa na podstawie spacji i interpunkcji, ale z uwzględnieniem skrótów (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
}
Tokenizacja na poziomie zdań jest przydatna do dzielenia dużych tekstów na logiczne bloki przed dalszą analizą. NLTokenizerSentence określi granice zdań nawet przy braku kropki na końcu lub przy zdaniach pytających.
let sentenceTokenizer = NLTokenizer(unit: .sentence)
sentenceTokenizer.string = text
sentenceTokenizer.enumerateTokens(in: text.startIndex..<text.endIndex) { range, _ in
print("Sentence: \\(text[range])")
return true
}
NLTokenizer — to podstawa dla wszystkich pozostałych możliwości NaturalLanguage. Po tokenizacji tekst jest gotowy do rozpoznawania języka, tagowania i lematyzacji.
NLLanguageRecognizer określa język tekstu i zwraca najbardziej prawdopodobną opcję z podaniem pewności. Framework obsługuje ponad 30 języków i może pracować z tekstem o dowolnej długości — od jednego słowa do całego dokumentu.
Algorytm NLLanguageRecognizer analizuje n-gramy znaków i porównuje je z profilami językowymi. Dla krótkich tekstów (do 50 znaków) dokładność spada, dlatego Apple zaleca przekazywanie do analizy co najmniej 100–200 znaków dla pewnego określenia języka.
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)")
}
Metoda languageHypotheses zwraca słownik języków z prawdopodobieństwami w kolejności malejącej. Jest to przydatne, gdy tekst zawiera mieszankę języków lub gdy trzeba pokazać użytkownikowi kilka opcji do wyboru, a nie tylko dominujący język.
NaturalLanguage określa język polski z dokładnością 95% dla tekstów od 100 znaków. Dla krótkich tekstów (1–2 słowa) dokładność spada do 60–70% — w takich przypadkach lepiej użyć languageHypotheses i pokazać top-3 opcje.
NLTagScheme zapewnia schematy tagowania do analizy lingwistycznej: części mowy (noun, verb, adjective), lematy (normalna forma słowa), typy encji (person, organization, place) i inne kategorie.
Lematyzacja sprowadza słowo do jego formy słownikowej: „biegł" → „biec", „lepszy" → „dobry", „books" → „book". Jest to krytyczne dla wyszukiwania i analizy tekstu — bez lematyzacji „kot" i „kota" są uważane za różne tokeny, co obniża jakość pipeline'ów 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")"
}
Przykład wyniku: cats → Noun, were → Verb, quickly → Adverb. Łącząc lematyzację i części mowy, można zbudować inteligentne wyszukiwanie, które znajdzie „biegnące koty" na zapytanie „biec kot".
NLTagScheme.lemma działa dla wszystkich obsługiwanych przez NaturalLanguage języków, w tym polskiego. To czyni NLTagger uniwersalnym narzędziem do wielojęzycznych aplikacji bez konieczności ładowania oddzielnych modeli dla każdego języka.
Named Entity Recognition (NER) — to zadanie wyodrębniania z tekstu nazwanych encji: imion osób, nazw organizacji, miejsc geograficznych i danych osobowych. NaturalLanguage obsługuje NER przez NLTagScheme.nameType.
NLTagScheme.nameType rozróżnia trzy typy encji: PersonalName (imiona osób), OrganizationName (organizacje, firmy) i PlaceName (nazwy geograficzne). Pozwala to automatycznie wyodrębniać strukturalne dane z wiadomości, e-maili i opinii.
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)"
}
}
Wynik: Tim Cook → PersonalName, Apple → OrganizationName, Cupertino → PlaceName. NER od NaturalLanguage nie wymaga niestandardowego uczenia i działa po wyjęciu z pudełka dla angielskiego, francuskiego, niemieckiego, hiszpańskiego i innych języków.
Dla języka polskiego NER jest obsługiwany, ale dokładność jest nieco niższa — około 70–75% w porównaniu do 85% dla angielskiego. Jeśli wymagana jest wysoka dokładność dla polskiego, Apple zaleca nauczenie niestandardowego modelu Core ML na własnych danych z użyciem Create ML.
NLModel — to klasa do pracy z nauczonymi modelami NLP Core ML, w tym wbudowanym modelem analizy sentymentu, wstępnie nauczonym przez Apple. Model określa tonację tekstu: pozytywną, negatywną lub neutralną.
Wbudowany model analizy sentymentu jest nauczony na opiniach z App Store i działa dla angielskiego, francuskiego, niemieckiego, włoskiego, hiszpańskiego, portugalskiego, chińskiego i japońskiego. Dla języka polskiego model nie jest wstępnie nauczony — wymagany jest Create ML i własne oznaczone dane.
import NaturalLanguage
let sentimentPredictor = try NLModel(mlModel: SentimentModel().model)
let sentiment = sentimentPredictor.predictedLabel(for: "Ta aplikacja jest niesamowita!")
print("Sentiment: \\(sentiment ?? "neutral")") // "positive"
NLModel obsługuje również niestandardowe modele nauczone przez Create ML. Można nauczyć model klasyfikacji tekstu na własnych danych (kategorie produktów, typy zgłoszeń do wsparcia, style językowe) i używać go przez ten sam interfejs NLModel.
Według Apple Create ML documentation 2024, niestandardowy model tekstowy uczy się na 500–5000 przykładach, aby osiągnąć dokładność 80–95%. NaturalLanguage ładuje model raz i buforuje go dla kolejnych wywołań, co minimalizuje opóźnienie przy powtarzających się zapytaniach.
| Zadanie NLP | Klasa NaturalLanguage | Obsługa polskiego |
|---|---|---|
| Tokenizacja | NLTokenizer | Tak |
| Rozpoznawanie języka | NLLanguageRecognizer | Tak |
| Lematyzacja | NLTagger + .lemma | Tak |
| Cięści mowy | NLTagger + .lexicalClass | Tak |
| NER | NLTagger + .nameType | Ograniczona |
| Sentyment | NLModel (wstępnie naucz.) | Nie |
Często zadawane pytania
NaturalLanguage zapewnia gotowe modele NLP bez konieczności uczenia: tokenizację, rozpoznawanie języka, NER. Core ML wymaga uczenia modelu na własnych danych i daje więcej elastyczności dla specyficznych zadań. NaturalLanguage jest lepszy do podstawowych zadań „po wyjęciu z pudełka", Core ML — dla wąsko wyspecjalizowanych.
Tak, NaturalLanguage w pełni działa na urządzeniu bez połączenia internetowego. Wszystkie modele są wbudowane w iOS i macOS, dane nie są wysyłane na serwer. To kluczowa przewaga nad chmurowymi usługami NLP, które wymagają sieci i stwarzają ryzyko dla prywatności.
NaturalLanguage obsługuje ponad 30 języków, w tym polski, angielski, hiszpański, francuski, niemiecki, włoski, portugalski, chiński, japoński, koreański, arabski, turecki i ukraiński. Dokładność tokenizacji i lematyzacji jest wysoka dla wszystkich obsługiwanych języków, NER i sentyment — głównie dla angielskiego.
Użyj Create ML — aplikacji Apple do uczenia modeli uczenia maszynowego bez programowania. Załaduj oznaczony zestaw danych (CSV lub JSON), wybierz zadanie klasyfikacji tekstu lub tagowania, naucz model i wyeksportuj do formatu Core ML (.mlmodel). Następnie załaduj model przez NLModel(mlModel:) w kodzie.
NaturalLanguage jest dostępny na iOS 12+, macOS 10.14+, watchOS 5+ i tvOS 12+. Na urządzeniach z układem A12+ i Neural Engine wydajność jest wyższa — przetwarzanie tekstu przyspiesza 3–5 razy dzięki sprzętowemu przyspieszeniu uczenia maszynowego. Na starszych urządzeniach (A11 i wcześniejsze) framework działa, ale wolniej.
Podsumowanie
Opracujemy aplikację mobilną pod klucz
IT Sectr tworzy aplikacje na iOS i Androida dla startupów i firm od 2017 roku. Doradzimy Ci i zaproponujemy najlepsze rozwiązanie.
Przeczytaj również