NaturalLanguage é um framework da Apple para processamento de linguagem natural em dispositivos iOS e macOS, fornecendo acesso a tokenização, reconhecimento de idiomas, etiquetagem de partes do discurso, lematização e reconhecimento de entidades nomeadas. De acordo com a Apple WWDC 2020, o framework realiza toda a análise no dispositivo, sem enviar dados para um servidor, garantindo a privacidade dos dados do usuário. O NaturalLanguage suporta mais de 30 idiomas e integra-se com o Core ML para modelos NLP personalizados.
Principais Conclusões
NaturalLanguage (NL) é um framework de aprendizado de máquina da Apple para análise de linguagem natural, parte do Foundation e disponível no iOS 12+, macOS 10.14+ e watchOS 5+. O framework fornece capacidades NLP prontas para uso sem a necessidade de treinar modelos personalizados.
Ao contrário dos serviços NLP em nuvem (Google Cloud NLP, Amazon Comprehend), o NaturalLanguage realiza toda a análise no dispositivo. Isso significa latência de rede zero, operação offline e privacidade total dos dados — o texto nunca sai do dispositivo do usuário.
De acordo com a Apple ML Research 2023, o NLP no dispositivo em chips A12+ processa solicitações 3–5 vezes mais rápido que soluções em nuvem similares, mantendo uma precisão acima de 85% para tarefas básicas. O framework é otimizado para o Neural Engine, capaz de processar até 100 solicitações por segundo em dispositivos modernos.
O NaturalLanguage é usado em aplicativos iOS para análise de avaliações, pesquisa inteligente, autocompletar, moderação de conteúdo e extração de dados estruturados de texto não estruturado. O framework suporta mais de 30 idiomas, incluindo russo, ucraniano, turco e árabe.
NLTokenizer é uma classe para dividir texto em unidades linguísticas: palavras, frases, parágrafos ou documentos. A tokenização é o primeiro passo de praticamente qualquer pipeline de NLP, e o NaturalLanguage a fornece pronta para uso.
O NLTokenizer leva em consideração as características específicas do idioma: ele lida corretamente com a tokenização para japonês (sem espaços entre palavras), árabe (escrita da direita para a esquerda) e chinês (escrita logográfica). Para inglês e russo, o tokenizador funciona por espaços e pontuação, mas leva em conta contrações (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
}
A tokenização no nível de frases é útil para dividir textos grandes em blocos lógicos antes da análise posterior. O NLTokenizer determinará os limites das frases mesmo quando não houver ponto no final ou quando houver frases interrogativas.
let sentenceTokenizer = NLTokenizer(unit: .sentence)
sentenceTokenizer.string = text
sentenceTokenizer.enumerateTokens(in: text.startIndex..<text.endIndex) { range, _ in
print("Sentence: \\(text[range])")
return true
}
NLTokenizer é a base para todas as outras capacidades do NaturalLanguage. Após a tokenização, o texto está pronto para reconhecimento de idiomas, etiquetagem e lematização.
NLLanguageRecognizer determina o idioma do texto e retorna a opção mais provável com uma pontuação de confiança. O framework suporta mais de 30 idiomas e pode trabalhar com texto de qualquer comprimento — de uma única palavra a um documento inteiro.
O algoritmo do NLLanguageRecognizer analisa n-gramas de caracteres e os compara com perfis de idiomas. Para textos curtos (até 50 caracteres), a precisão diminui, então a Apple recomenda enviar pelo menos 100–200 caracteres para uma identificação confiável do idioma.
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)")
}
O método languageHypotheses retorna um dicionário de idiomas com probabilidades em ordem decrescente. Isso é útil quando o texto contém uma mistura de idiomas ou quando você precisa mostrar ao usuário várias opções para escolher, em vez de apenas o idioma dominante.
O NaturalLanguage identifica o russo com 95% de precisão para textos de 100 caracteres ou mais. Para textos curtos (1–2 palavras), a precisão cai para 60–70% — nesses casos, é melhor usar languageHypotheses e mostrar as 3 principais opções.
NLTagScheme fornece esquemas de etiquetagem para análise linguística: partes do discurso (substantivo, verbo, adjetivo), lemas (forma base de uma palavra), tipos de entidade (pessoa, organização, lugar) e outras categorias.
A lematização reduz uma palavra à sua forma de dicionário: "correu" → "correr", "melhor" → "bom", "books" → "book". Isso é criticamente importante para pesquisa e análise de texto — sem lematização, "gato" e "gatos" são tratados como tokens diferentes, reduzindo a qualidade dos pipelines de 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")"
}
Exemplo de saída: cats → Substantivo, were → Verbo, quickly → Advérbio. Combinando lematização e partes do discurso, você pode construir uma pesquisa inteligente que encontra "gatos correndo" a partir de uma consulta "correr gato".
NLTagScheme.lemma funciona para todos os idiomas suportados pelo NaturalLanguage, incluindo o russo. Isso torna o NLTagger uma ferramenta versátil para aplicativos multilíngues sem a necessidade de carregar modelos separados para cada idioma.
Reconhecimento de Entidades Nomeadas (NER) é a tarefa de extrair entidades nomeadas do texto: nomes de pessoas, nomes de organizações, localizações geográficas e dados pessoais. O NaturalLanguage suporta NER através do NLTagScheme.nameType.
NLTagScheme.nameType distingue três tipos de entidades: PersonalName, OrganizationName e PlaceName. Isso permite a extração automática de dados estruturados de notícias, e-mails e avaliações.
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)"
}
}
Resultado: Tim Cook → PersonalName, Apple → OrganizationName, Cupertino → PlaceName. O NER do NaturalLanguage não requer treinamento personalizado e funciona imediatamente para inglês, francês, alemão, espanhol e outros idiomas.
Para o russo, o NER é suportado mas a precisão é um pouco menor — cerca de 70–75% contra 85% para inglês. Se for necessária alta precisão para russo, a Apple recomenda treinar um modelo Core ML personalizado com seus próprios dados usando o Create ML.
NLModel é uma classe para trabalhar com modelos Core ML NLP treinados, incluindo o modelo integrado de análise de sentimento pré-treinado pela Apple. O modelo determina o sentimento do texto: positivo, negativo ou neutro.
O modelo integrado de análise de sentimento é treinado em avaliações da App Store e funciona para inglês, francês, alemão, italiano, espanhol, português, chinês e japonês. Para russo, o modelo não é pré-treinado — você precisa do Create ML e seus próprios dados rotulados.
import NaturalLanguage
let sentimentPredictor = try NLModel(mlModel: SentimentModel().model)
let sentiment = sentimentPredictor.predictedLabel(for: "This app is amazing!")
print("Sentiment: \\(sentiment ?? "neutral")") // "positive"
NLModel também suporta modelos personalizados treinados através do Create ML. Você pode treinar um modelo de classificação de texto com seus próprios dados (categorias de produtos, tipos de tickets de suporte, estilos de linguagem) e usá-lo através da mesma interface NLModel.
De acordo com a documentação do Apple Create ML 2024, um modelo de texto personalizado treina com 500–5000 exemplos para alcançar 80–95% de precisão. O NaturalLanguage carrega o modelo uma vez e o armazena em cache para chamadas subsequentes, minimizando a latência para solicitações repetidas.
| Tarefa NLP | Classe NaturalLanguage | Suporte Russo |
|---|---|---|
| Tokenização | NLTokenizer | Sim |
| Reconhecimento de Idioma | NLLanguageRecognizer | Sim |
| Lematização | NLTagger + .lemma | Sim |
| Partes do Discurso | NLTagger + .lexicalClass | Sim |
| NER | NLTagger + .nameType | Limitado |
| Sentimento | NLModel (pré-treinado) | Não |
Perguntas Frequentes
NaturalLanguage fornece modelos NLP prontos para uso sem necessidade de treinamento: tokenização, reconhecimento de idiomas, NER. O Core ML requer treinar um modelo com seus próprios dados e oferece mais flexibilidade para tarefas específicas. O NaturalLanguage é melhor para tarefas básicas prontas para uso, enquanto o Core ML é para tarefas altamente especializadas.
Sim, o NaturalLanguage funciona completamente no dispositivo sem conexão com a internet. Todos os modelos estão integrados no iOS e macOS, e os dados não são enviados para um servidor. Esta é uma vantagem key sobre serviços NLP em nuvem que requerem acesso à rede e criam riscos de privacidade.
NaturalLanguage suporta mais de 30 idiomas, incluindo russo, inglês, espanhol, francês, alemão, italiano, português, chinês, japonês, coreano, árabe, turco e ucraniano. A precisão da tokenização e lematização é alta para todos os idiomas suportados, enquanto o NER e a análise de sentimento são principalmente para inglês.
Use o Create ML — o aplicativo da Apple para treinar modelos de aprendizado de máquina sem programação. Carregue um conjunto de dados rotulado (CSV ou JSON), escolha uma tarefa de classificação de texto ou etiquetagem, treine o modelo e exporte para o formato Core ML (.mlmodel). Em seguida, carregue o modelo através de NLModel(mlModel:) no código.
NaturalLanguage está disponível no iOS 12+, macOS 10.14+, watchOS 5+ e tvOS 12+. Em dispositivos com o chip A12+ e Neural Engine, o desempenho é maior — o processamento de texto é acelerado 3–5 vezes graças ao aprendizado de máquina acelerado por hardware. Em dispositivos mais antigos (A11 e anteriores), o framework funciona mas é mais lento.
Resumo
Vamos desenvolver um aplicativo móvel chave na mão
A IT Sectr cria aplicativos para iOS e Android para startups e empresas desde 2017. Nós vamos aconselhá-lo e propor a melhor solução.
Leia também