Inizia con l'elaborazione del linguaggio naturale in iOS 11

L'apprendimento automatico è stato indubbiamente uno degli argomenti più caldi dello scorso anno, con aziende di ogni tipo che cercano di rendere i loro prodotti più intelligenti per migliorare le esperienze degli utenti e differenziare le loro offerte. 

Ora Apple è entrata in corsa per fornire un apprendimento automatico rivolto agli sviluppatori. Core ML facilita agli sviluppatori l'aggiunta dell'apprendimento automatico alle loro app.

Basta dare un'occhiata al tuo dispositivo iOS, vedrai l'apprendimento automatico incorporato in quasi tutte le app di sistema, il più ovvio è Siri. Ad esempio, quando si inviano messaggi di testo, Apple utilizza Natural Language Processing (NLP) per prevedere la parola successiva o suggerire in modo intelligente una correzione mentre si digita una parola. Aspettatevi che l'apprendimento automatico e la PNL continuino ad essere sempre presenti e ulteriormente radicati nell'uso della tecnologia, dalla ricerca al servizio clienti. 

Obiettivi di questo tutorial

Questo tutorial ti introdurrà a un sottoinsieme di machine learning: Natural Language Processing (NLP). Illustreremo cos'è la PNL e perché valga la pena implementarla, prima di esaminare i vari livelli o schemi che compongono la PNL. Questi includono:

  • identificazione della lingua
  • tokenizzazione
  • parte dell'identificazione del discorso
  • riconoscimento di entità con nome

Dopo aver esaminato la teoria della PNL, metteremo le nostre conoscenze in pratica creando un semplice client Twitter che analizzi i tweet. Vai avanti e clona il repository GitHub del tutorial e dai un'occhiata.

Conoscenza presunta

Questo tutorial presume che tu sia uno sviluppatore iOS esperto. Sebbene lavoreremo con l'apprendimento automatico, non è necessario avere alcun background nell'argomento. Inoltre, mentre altri componenti di Core ML richiedono una certa conoscenza di Python, non lavoreremo con nessun aspetto relativo a Python con la PNL. 

Introduzione a Machine Learning e PNL

L'obiettivo dell'apprendimento automatico è che un computer svolga compiti senza essere programmato esplicitamente per farlo, la capacità di pensare o interpretare autonomamente. Un caso d'uso contemporaneo di alto profilo è la guida autonoma: dare alle auto la capacità di interpretare visivamente il proprio ambiente e guidare senza aiuto. 

Oltre al riconoscimento visivo, l'apprendimento automatico ha introdotto anche il riconoscimento vocale, la ricerca intelligente sul Web e altro ancora. Con Google, Microsoft, Facebook e IBM in prima linea nel diffondere l'apprendimento automatico e renderlo disponibile agli sviluppatori ordinari, Apple ha anche deciso di muoversi in quella direzione e rendere più facile l'apprendimento automatico da incorporare in applicazioni di terze parti. 

Core ML è una novità della famiglia di SDK di Apple, introdotta come parte di iOS 11 per consentire agli sviluppatori di implementare una vasta gamma di modalità di apprendimento automatico e tipi di livelli di deep learning. 

Natural Language Processing (NLP) si trova logicamente all'interno del framework Core ML insieme ad altre due potenti librerie, Vision e GameplayKit. Vision offre agli sviluppatori la possibilità di implementare l'apprendimento automatico di computer vision per realizzare cose come il rilevamento di volti, punti di riferimento o altri oggetti, mentre GameplayKit offre agli sviluppatori di giochi strumenti per l'authoring di giochi e funzionalità di gioco specifiche. 

In questo tutorial, ci concentreremo sull'elaborazione del linguaggio naturale. 

Natural Language Processing (NLP)

L'elaborazione del linguaggio naturale è la scienza di essere in grado di analizzare e comprendere il testo, abbattere frasi e parole per svolgere compiti quali analisi del sentimento, estrazione delle relazioni, derivazione, riepilogo del testo o delle frasi e altro. O per dirla in parole povere, la PNL è la capacità dei computer di comprendere il linguaggio umano nella sua forma naturale, parlata o scritta.

La capacità di estrarre e incapsulare contestualmente parole e frasi consente una migliore integrazione tra utenti e dispositivi, o anche tra due dispositivi, attraverso blocchi significativi di contenuti. Esploreremo ciascuno di questi componenti in dettaglio a breve, ma in primo luogo è importante capire perché si vorrebbe implementare la PNL.

Perché implementare l'elaborazione del linguaggio naturale? 

Con le aziende che continuano a fare affidamento sulla memorizzazione e l'elaborazione di big data, la PNL consente l'interpretazione di testo libero e non strutturato, rendendolo analizzabile. Con molte informazioni memorizzate in file di testo non strutturati, ad esempio nelle cartelle cliniche, la PNL può setacciare i dati e fornire dati sul contesto, l'intento e persino il sentimento. 

Oltre ad essere in grado di analizzare il testo parlato e scritto, la PNL è ora diventata il motore dei robot, da quelli in Slack, con cui è possibile avere una conversazione umana completa, con strumenti per il servizio clienti. Se si visita il sito Web di supporto di Apple e si richiede di parlare con il servizio clienti, verrà presentato un Web Bot che cercherà di indicarti la giusta direzione in base alla domanda che hai posto. Aiuta i clienti a sentirsi compresi in tempo reale, senza dover realmente parlare con un umano. 

Dando uno sguardo agli spam di e-mail e ai filtri anti-spam, la PNL ha permesso di essere in grado di capire meglio il testo e di classificare meglio le e-mail con maggiore certezza sui loro intenti. 

La ricapitolazione è un'importante tecnica di PNL per fornire analisi del sentimento, qualcosa che le aziende vorrebbero utilizzare sui dati dei loro account sui social media, al fine di tracciare la percezione dei prodotti dell'azienda. 

L'app Foto su iOS 11 è un altro buon esempio. Durante la ricerca di foto, l'apprendimento automatico funziona su più livelli. Oltre a utilizzare l'apprendimento automatico e la visione per riconoscere il volto e il tipo di foto (es. Spiaggia, posizione), i termini di ricerca vengono filtrati tramite PNL, e se cerchi il termine "spiagge", cercherà anche le foto che contengono la descrizione " spiaggia'. Questo è chiamato lemmatization, e imparerai di più su questo di seguito, mentre impariamo ad apprezzare quanto sia potente l'apprendimento automatico, e tuttavia quanto sia facile Apple ti permette di rendere le tue app più intelligenti. 

Con la tua app che ha una migliore comprensione di, ad esempio, una stringa di ricerca, sarà in grado di interagire in modo più intelligente con gli utenti, capendo l'intento dietro il termine di ricerca piuttosto che prendere la parola in senso letterale. Abbracciando la libreria NLP di Apple, gli sviluppatori possono supportare un approccio coerente per l'elaborazione del testo e l'esperienza utente in tutto l'ecosistema Apple, da iOS a macOS, tvOS e watchOS. 

Con l'apprendimento automatico eseguito su dispositivo, gli utenti beneficiano sfruttando la CPU e la GPU del dispositivo per offrire prestazioni ottimali nei calcoli, invece di accedere a API di apprendimento automatico esterne. Ciò consente ai dati dell'utente di rimanere sul dispositivo e riduce la latenza dovuta agli accessi alla rete. Con l'apprendimento automatico che richiede una conoscenza più approfondita degli utenti al fine di dedurre suggerimenti e previsioni, essere in grado di contenere l'elaborazione sul dispositivo fisico e utilizzare la privacy differenziale per qualsiasi attività connessa alla rete, è possibile fornire un'esperienza intelligente ma non invasiva per i tuoi utenti. 

Successivamente, daremo un'occhiata al trucco del motore di elaborazione del linguaggio naturale di Apple.

Presentazione di NSLinguisticTagger

La classe Foundational NSLinguisticTagger svolge un ruolo centrale nell'analisi e nella codifica di testo e parlato, segmentando il contenuto in paragrafi, frasi e parole ed è composta dai seguenti schemi:

  • identificazione della lingua
  • tokenizzazione
  • lemmatizzazione
  • parte del discorso (PoS)
  • riconoscimento di entità con nome

Quando si inizializza NSLinguisticTagger, tu passi nel NSLinguisticTagScheme sei interessato ad analizzare. Per esempio:

let tagger = NSLinguisticTagger (tagSchemes: [.language, .tokenType, ...], opzioni: 0)

Dovresti quindi impostare i vari argomenti e proprietà, incluso il passaggio nel testo di input, prima di eseguire l'enumerazione attraverso il NSLinguisticTagger oggetto istanza, estraendo entità e token. Andiamo più in profondità e vediamo come implementare ciascuno degli schemi, passo dopo passo, iniziando con lo schema di identificazione della lingua. 

Identificazione della lingua

Il primo tipo di schema di tag, l'identificazione della lingua, tenta di identificare la lingua BCP-47 più prominente a livello di documento, paragrafo o frase. Puoi recuperare questa lingua accedendo al dominantLanguage proprietà del NSLinguisticTagger oggetto istanza:

... Let tagger = NSLinguisticTagger (tagSchemes: [.language], options: 0) ... tagger.string = "Qualche testo in una lingua o due" let language = tagger.dominantLanguage //i.e "en" restituito per l'inglese.

Abbastanza diretto. Successivamente, esamineremo la classificazione del testo utilizzando il metodo di tokenizzazione.

tokenizzazione

La tokenizzazione è il processo di demarcazione e, eventualmente, la classificazione di sezioni di una stringa di caratteri di input. I token risultanti vengono quindi passati a un'altra forma di elaborazione. (Fonte: Wikipedia)

Prendendo un blocco di testo, la tokenizzazione potrebbe decomporsi e classificare logicamente quel testo in paragrafi, frasi e parole. Iniziamo impostando lo schema appropriato (.tokenType) per il tagger. A differenza dello schema precedente, ci aspettiamo risultati multipli, e dobbiamo enumerare attraverso i tag restituiti, come illustrato nell'esempio seguente:

let tagger = NSLinguisticTagger (tagSchemes: [.tokenType], opzioni: 0) tagger.string = textString lascia intervallo = NSRange (posizione: 0, lunghezza: textString.utf16.count) // Impostazione di varie opzioni, come ignorare gli spazi bianchi e le punteggiature consentono opzioni: NSLinguisticTagger.Options = [.omitPunctuation, .omitWhitespace] // Enumeriamo attraverso il tagger, utilizzando le proprietà impostate sopra tagger.enumerateTags (in: range, unit: .word, scheme: .tokenType, options: options) tag, tokenRange, stop in let token = (testo come NSString) .substring (con: tokenRange) // Gestisce ogni token, (cioè aggiungi all'array)

Ora abbiamo una lista di parole. Ma non sarebbe interessante ottenere le origini di quelle parole? Ad esempio, se un utente cerca un termine come "cammina" o "cammina", sarebbe davvero utile ottenere la parola d'origine, "camminare" e classificare tutte queste permutazioni di "camminare" insieme. Questo è chiamato lemmatizzazione, e lo copriremo dopo. 

lemmatizzazione 

La Lemmatizzazione raggruppa le forme flesse di una parola da analizzare come un oggetto singolare, permettendoti di dedurre il significato voluto. In sostanza, tutto ciò che devi ricordare è che sta derivando la forma del dizionario della parola.

Conoscere la forma del dizionario della parola è davvero potente e consente ai tuoi utenti di cercare con maggiore 'sfocatura'. Nell'esempio precedente, consideriamo un utente che cerca il termine "camminare". Senza lemmatizzazione, saresti in grado di restituire solo menzioni letterali di quella parola, ma se tu potessi considerare altre forme della stessa parola, potresti anche ottenere risultati che menzionano "camminare". 

Analogamente all'esempio precedente, per eseguire la lemmatizzazione, dovremmo impostare lo schema nell'inizializzazione del tagger su .lemma, prima di enumerare i tag:

... tagger.enumerateTags (in: range, unit: .word, scheme: .lemma, options: options) tag, tokenRange, stop in if let lemma = tag? .RawValue // Gestisci ogni elemento lemma ... 

In seguito, esamineremo parte del tagging del parlato, che ci consente di classificare un blocco di testo come nomi, verbi, aggettivi o altre parti. 

Parte del discorso (PoS)

Parte della codifica vocale ha lo scopo di associare la parte del discorso a ciascuna parola specifica, in base sia alla definizione della parola sia al contesto (la sua relazione con parole adiacenti e correlate). Come elemento della PNL, parte della codifica vocale ci consente di concentrarci sui nomi e sui verbi, che possono aiutarci a dedurre l'intento e il significato del testo. 

L'implementazione di parte della codifica vocale comporta l'impostazione della proprietà tagger da utilizzare .lexicalClass, e elencando allo stesso modo dimostrato negli esempi precedenti. Si otterrà una scomposizione della frase in parole, con un tag associativo per ciascuno, classificando la parola come appartenente a un nome, preposizione, verbo, aggettivo o determinante. Per ulteriori informazioni su cosa significano, consultare la documentazione di Apple relativa ai Tipi lessicali. 

Un altro processo all'interno dello stack NLP di Apple è Named Entity Recognition, che scompone blocchi di testo, estraendo tipi di entità specifici a cui siamo interessati, come nomi, posizioni, organizzazioni e persone. Diamo un'occhiata a quello successivo. 

Riconoscimento di entità con nome 

Il riconoscimento dell'entità denominata è uno dei più potenti componenti di codifica della classificazione NLP, che consente di classificare entità o oggetti denominati nel mondo reale dalla frase (ovvero luoghi, persone, nomi). Come utente di iPhone, avresti già visto questo in azione quando scrivi i tuoi amici, e avresti osservato alcune parole chiave evidenziate, come numeri di telefono, nomi o date. 

È possibile implementare il riconoscimento di entità con nome in modo simile ai nostri altri esempi, impostando lo schema di tag su .NAMETYPE, e looping attraverso il tagger da un intervallo specifico. 

Successivamente, metti in pratica ciò che hai imparato, con una semplice app che richiederà un insieme predeterminato di tweet, mentre metti ciascun tweet nella pipeline della PNL. 

Implementazione dell'elaborazione del linguaggio naturale

Per concludere, daremo un'occhiata a una semplice app client Twitter che recupera cinque tweet in una visualizzazione tabella e applica alcune elaborazioni NLP per ognuna di esse.

Nello screenshot seguente, abbiamo utilizzato il riconoscimento di entità nominata della NLP per evidenziare le parole chiave dell'entità (organizzazioni, luoghi, ecc.) In rosso.

Vai avanti e clonare il progetto TwitterNLPExample dal repository GitHub tutorial e dare un'occhiata al codice. La classe a cui siamo più interessati è TweetsViewController.swift. Diamo un'occhiata al suo tableView (_ tableView: cellForRowAt) metodo.

override func tableView (_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell // Recupera la cella di Tweet. let cella = tableView.dequeueReusableCell (withIdentifier: reuseIdentifier, per: indexPath) // Recupera il modello Tweet da Tweets caricati. let tweet = tweets [indexPath.row] cell.textLabel? .text = tweet.text cell.detailTextLabel? .text = "Per \ (tweet.author.screenName)." self.range = NSRange (posizione: 0, lunghezza: (tweet.text.utf16.count)) self.detectLanguage (con: cell.textLabel!) self.getTokenization (con: cell.textLabel!) self.getNamedEntityRecognition (con: cell.textLabel!) self.getLemmatization (con: cell.textLabel!) // Restituisce la cella di Tweet. restituisci la cella

Per ogni cella (tweet), chiamiamo quattro metodi che definiremo a breve: 

  • rileva lingua()
  • getTokenization ()
  • getNamedEntityRecognition ()
  • getLemmatization ()

Per ognuno di questi metodi, chiamiamo il enumerare metodo, passando lo schema e l'etichetta di testo per estrarre il testo, come facciamo per identificare la lingua:

func detectLanguage (with textLabel: UILabel) let _ = enumerate (scheme: .language, label: textLabel)

Finalmente, il enumerare la funzione è dove tutta l'azione della PNL sta realmente accadendo, prendendo in considerazione le proprietà e gli argomenti basati sul tipo di elaborazione NLP che intendiamo fare, e memorizzando i risultati negli array per usarli in seguito. Ai fini di questo esempio, stampiamo semplicemente i risultati sulla console, a scopo di osservazione. 

func enumerate (scheme: NSLinguisticTagScheme, label: UILabel) -> [String]? var keywords = [String] () var tokens = [String] () var lemmas = [String] () lascia tags: [NSLinguisticTag] = [ .personalName, .placeName, .organizationName] let tagger = NSLinguisticTagger (tagSchemes: [schema], opzioni: 0) tagger.string = label.text tagger.enumerateTags (in: range !, unità: .word, schema: schema, opzioni : options) tag, tokenRange, _ in switch (schema) case NSLinguisticTagScheme.lemma: if let lemma = tag? .rawValue lemmas.append (lemma) break case NSLinguisticTagScheme.language: print ("Linguaggio dominante: \ ( tagger.dominantLanguage ?? "Undetermined") ") break case NSLinguisticTagScheme.nameType: if let tag = tag, tags.contains (tag) let name = (label.text! as NSString) .substring (with: tokenRange) print ( "entity: \ (name)") keywords.append (nome) break case NSLinguisticTagScheme.lexicalClass: break case NSLinguisticTagScheme.tokenType: if let tagVal = tag? .rawValue tokens.append (tagVal.lowercased ()) break default: break if (scheme == .nameType) let keywordAttrString = NSMutableAttributedString (stringa: tagger.string !, attributi: nil) per nome nelle parole chiave if let indices = label.text? .indicesOf (string: name ) for i in indices let range = NSRange (i ... 

Per il .NAMETYPE Schema di riconoscimento di entità nominate, prendiamo le parole chiave di entità che abbiamo estratto e passiamo attraverso per evidenziare le parole che corrispondono a tali entità. Potresti anche fare un ulteriore passo avanti e creare collegamenti a tali parole chiave, magari per cercare tweet corrispondenti a tali parole chiave. 

Vai avanti, costruisci ed esegui l'app e dai un'occhiata all'output, prestando particolare attenzione ai lemmi e alle entità che abbiamo estratto. 

Conclusione

Da Google che sfrutta Natural Language Processing nei suoi motori di ricerca per i robot messenger di Siri e Facebook di Apple, non c'è dubbio che questo settore stia crescendo esponenzialmente. Ma NLP e Machine Learning non sono più il dominio esclusivo delle grandi aziende. Introducendo il framework Core ML all'inizio di quest'anno, Apple ha reso facile per gli sviluppatori di tutti i giorni senza un background in deep learning di poter aggiungere intelligenza alle proprie app.

In questo tutorial, hai visto come con poche righe di codice puoi utilizzare Core ML per dedurre contesto e intenti da frasi e paragrafi non strutturati, oltre a rilevare il linguaggio dominante. Vedremo ulteriori miglioramenti nelle future versioni dell'SDK, ma la PNL sta già promettendo di essere uno strumento potente che sarà ampiamente utilizzato nell'App Store.

Mentre sei qui, dai uno sguardo ad alcuni dei nostri altri post sullo sviluppo di app per iOS e sull'apprendimento automatico!