Premiers pas avec le traitement du langage naturel sous iOS 11

L’apprentissage automatique a sans aucun doute été l’un des sujets les plus en vogue de l’année écoulée, des entreprises de toutes sortes essayant de rendre leurs produits plus intelligents afin d’améliorer les expériences des utilisateurs et de différencier leurs offres.. 

Maintenant, Apple est entré dans la course pour fournir un apprentissage automatique aux développeurs. Core ML facilite pour les développeurs l'ajout d'un apprentissage approfondi de la machine à leurs applications..

En regardant simplement votre appareil iOS, vous constaterez que l'apprentissage automatique est intégré à presque toutes les applications système, le plus évident étant Siri. Par exemple, lorsque vous envoyez des messages texte, Apple utilise le traitement du langage naturel (NLP) pour prédire votre prochain mot ou proposer intelligemment une correction lors de la saisie d'un mot. Attendez-vous à l'apprentissage de la machine et à la PNL pour qu'il devienne de plus en plus présent et plus enraciné dans notre utilisation de la technologie, de la recherche au service à la clientèle. 

Objectifs de ce tutoriel

Ce didacticiel présente un sous-ensemble de l’apprentissage automatique: le traitement du langage naturel (PNL). Nous verrons ce qu'est la PNL et pourquoi cela vaut la peine d'être implémenté, avant de passer en revue les différentes couches ou schémas qui composent la PNL. Ceux-ci inclus:

  • identification de la langue
  • tokenisation
  • partie de l'identification de la parole
  • reconnaissance d'entité nommée

Après avoir étudié la théorie de la PNL, nous allons mettre nos connaissances en pratique en créant un simple client Twitter qui analyse les tweets. Allez-y et clonez le dépôt GitHub du tutoriel et jetez un coup d'oeil.

Connaissance supposée

Ce tutoriel suppose que vous êtes un développeur iOS expérimenté. Bien que nous travaillions avec l'apprentissage automatique, vous n'avez pas besoin de connaissances en la matière. De plus, alors que d'autres composants de Core ML nécessitent une connaissance de Python, nous ne travaillerons avec aucun aspect lié à Python avec la PNL. 

Introduction à l'apprentissage automatique et à la PNL

L'apprentissage automatique a pour objectif qu'un ordinateur effectue des tâches sans être explicitement programmé pour le faire, c'est-à-dire la capacité de penser ou d'interpréter de manière autonome. La conduite autonome est un cas d'utilisation contemporain de premier plan: elle permet aux voitures d'interpréter visuellement leur environnement et de conduire sans aide.. 

Au-delà de la reconnaissance visuelle, l’apprentissage automatique a également introduit la reconnaissance vocale, la recherche Web intelligente, etc. Avec Google, Microsoft, Facebook et IBM à l'avant-garde de la vulgarisation de l'apprentissage automatique et de son accès aux développeurs ordinaires, Apple a également décidé d'aller dans cette direction et de faciliter l'intégration de l'apprentissage automatique à des applications tierces.. 

Core ML est une nouveauté dans la famille de SDK d’Apple, introduite avec iOS 11 pour permettre aux développeurs d’implémenter une vaste gamme de modes d’apprentissage automatique et de types de couches d’apprentissage approfondi.. 

Le traitement du langage naturel (PNL) s'inscrit logiquement dans le cadre Core ML aux côtés de deux autres bibliothèques puissantes, Vision et GameplayKit. Vision fournit aux développeurs la possibilité de mettre en œuvre un apprentissage de la vision par ordinateur afin de détecter des visages, des points de repère ou d'autres objets, tandis que GameplayKit fournit aux développeurs de jeux des outils pour la création de jeux et des fonctionnalités de jeu spécifiques.. 

Dans ce tutoriel, nous allons nous concentrer sur le traitement du langage naturel.. 

Traitement du langage naturel (PNL)

Le traitement automatique du langage naturel est la science qui permet d'analyser et de comprendre un texte, de décomposer des phrases et des mots pour accomplir des tâches telles que l'analyse des sentiments, l'extraction de relations, la création de raccourcis, la synthèse de textes ou de phrases, etc. Ou pour le dire simplement, la PNL est la capacité pour les ordinateurs de comprendre le langage humain sous sa forme écrite ou orale.

La capacité d'extraire et d'encapsuler des mots et des phrases de manière contextuelle permet une meilleure intégration entre les utilisateurs et les appareils, voire entre deux appareils, grâce à des fragments de contenu significatifs. Nous allons explorer chacune de ces composantes en détail sous peu, mais d’abord, il est important de comprendre pourquoi vous voudriez mettre en œuvre la PNL..

Pourquoi implémenter le traitement du langage naturel? 

Alors que les entreprises continuent de s'appuyer sur le stockage et le traitement des mégadonnées, la PNL permet l'interprétation de textes libres et non structurés, ce qui les rend analysables. Avec beaucoup d’informations stockées dans des fichiers texte non structurés dans des dossiers médicaux, par exemple, la PNL peut parcourir une multitude de données et fournir des données sur le contexte, les intentions et même le sentiment. 

Au-delà de la capacité d’analyser le texte parlé et écrit, la PNL est maintenant devenue le moteur des robots de base de Slack avec lesquels vous pouvez presque avoir une conversation humaine complète, ainsi que des outils pour le service à la clientèle. Si vous vous rendez sur le site Web d'assistance d'Apple et demandez à parler au service clientèle, un robot Web vous présentera, qui tentera de vous orienter dans la bonne direction en fonction de la question que vous avez posée. Il aide les clients à se sentir compris en temps réel, sans avoir besoin de parler à un humain.. 

En examinant les spams et les filtres anti-spam, la PNL a permis de mieux comprendre le texte et de mieux classer les courriers électroniques avec une plus grande certitude quant à leur intention.. 

La synthèse est une technique NLP importante permettant d’analyser les sentiments, ce que les entreprises souhaiteraient utiliser sur les données de leurs comptes de médias sociaux, afin de suivre la perception de leurs produits.. 

L'application Photos sur iOS 11 est un autre bon exemple. Lors de la recherche de photos, l'apprentissage automatique fonctionne à plusieurs niveaux. En plus d'utiliser l'apprentissage automatique et la vision pour reconnaître le visage et le type de photo (c.-à-d. La plage, l'emplacement), les termes de recherche sont filtrés par le biais de la PNL. Si vous recherchez le terme «plages», il recherchera également les photos contenant la description. plage'. C'est ce que l'on appelle la lemmatisation. Vous en apprendrez plus à ce sujet ci-dessous, à mesure que nous apprendrons à quel point l'apprentissage machine est puissant, mais à quel point Apple vous permet de rendre vos applications plus intelligentes.. 

Grâce à une meilleure compréhension, par exemple, d'une chaîne de recherche, votre application sera en mesure d'interagir plus intelligemment avec les utilisateurs, en comprenant l'intention derrière le terme de recherche plutôt qu'en prenant le mot au sens littéral. En adoptant la bibliothèque de PNL d'Apple, les développeurs peuvent prendre en charge une approche de traitement de texte et une expérience utilisateur cohérentes sur l'ensemble de l'écosystème Apple, d'iOS à macOS, en passant par tvOS et watchOS.. 

L'apprentissage automatique étant effectué sur le périphérique, les utilisateurs tirent parti du processeur et du processeur graphique du périphérique pour optimiser les performances de calcul, au lieu d'accéder à des API d'apprentissage externes. Cela permet aux données utilisateur de rester sur l'appareil et réduit la latence due aux accès réseau. L'apprentissage automatique nécessitant une connaissance plus intime des utilisateurs afin de déduire des suggestions et des prévisions, pouvant contenir le traitement sur le périphérique physique et utilisant la confidentialité différentielle pour toutes les activités liées au réseau, vous pouvez fournir une expérience intelligente mais non invasive pour vos utilisateurs. 

Ensuite, nous allons examiner la composition du moteur de traitement du langage naturel d’Apple..

Présentation de NSLinguisticTagger

La classe fondamentale NSLinguisticTagger joue un rôle central dans l'analyse et le balisage de texte et de parole, en segmentant le contenu en paragraphes, phrases et mots. Elle est composée des schémas suivants:

  • identification de la langue
  • tokenisation
  • lemmatisation
  • partie du discours (PoS)
  • reconnaissance d'entité nommée

Quand vous initialisez NSLinguisticTagger, vous passez dans le NSLinguisticTagScheme vous êtes intéressé par l'analyse. Par exemple:

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

Vous devez ensuite configurer les différents arguments et propriétés, y compris en transmettant le texte d’entrée, avant d’énumérer le texte. NSLinguisticTagger objet d'instance, extraire des entités et des jetons. Approfondissons et voyons comment implémenter chacun des schémas, étape par étape, en commençant par le schéma d'identification de la langue.. 

Identification de la langue

Le premier type de schéma de balises, identification de la langue, tente d'identifier la langue du BCP-47 la plus répandue au niveau du document, du paragraphe ou de la phrase. Vous pouvez récupérer cette langue en accédant à la langue dominante propriété du NSLinguisticTagger objet d'instance:

… Let tagger = NSLinguisticTagger (tagSchemes: [.language], options: 0)… tagger.string = "Du texte dans une langue ou deux" let language = tagger.dominantLanguage //i.e "en" renvoyé pour l'anglais.

Assez simple. Ensuite, nous allons examiner la classification du texte en utilisant la méthode tokenization.

Tokenization

La tokénisation est le processus de démarcation et éventuellement de classification des sections d'une chaîne de caractères d'entrée. Les jetons résultants sont ensuite transmis à une autre forme de traitement. (source: Wikipedia)

En prenant un bloc de texte, la tokénisation décomposerait et classerait logiquement ce texte en paragraphes, phrases et mots. Nous commençons par définir le schéma approprié (.tokenType) pour le tagueur. Contrairement au schéma précédent, nous attendons plusieurs résultats et nous devons énumérer les balises renvoyées, comme illustré dans l'exemple ci-dessous:

let tagger = NSLinguisticTagger (tagSchemes: [.tokenType], options: 0) tagger.string = textString let gamme = NSRange (emplacement: 0, longueur: textString.utf16.count) // Définition de diverses options, telles que les espaces blancs ignorés et ponctuation let options: NSLinguisticTagger.Options = [.omitPunctuation, .omitWhitespace] // Nous énumérons à travers le tagueur, en utilisant les propriétés définies au-dessus de tagger.enumerateTags (dans: plage, unité: .word, scheme: .tokenType, options: options) tag, tokenRange, stop to let token = (text as NSString) .substring (with: tokenRange) // Gère chaque jeton (c'est-à-dire, ajoute à un tableau)

Maintenant nous avons une liste de mots. Mais ne serait-il pas intéressant de connaître l'origine de ces mots? Ainsi, par exemple, si un utilisateur recherche un terme comme "promenades" ou "promenades", il serait vraiment utile de connaître le mot d'origine "promenades" et de classer toutes ces permutations de "promenades" ensemble. C'est ce qu'on appelle la lemmatisation, et nous couvrirons cette prochaine. 

Lemmatisation 

La lemmatisation regroupe les formes infléchies d'un mot à analyser en tant qu'élément singulier, ce qui vous permet d'inférer le sens voulu. En gros, tout ce dont vous avez besoin de vous rappeler, c’est qu’il dérive de la forme du dictionnaire du mot.

Connaître la forme du dictionnaire du mot est très puissant et permet à vos utilisateurs de rechercher avec plus de "flou". Dans l'exemple précédent, nous considérons un utilisateur recherchant le terme «marcher». Sans lemmatisation, vous ne pourrez que renvoyer des mentions littérales de ce mot, mais si vous pouviez envisager d'autres formes du même mot, vous pourriez également obtenir des résultats qui mentionnent «marcher».. 

De la même manière que dans l'exemple précédent, pour effectuer la lemmatisation, définissez le schéma d'initialisation du tagger sur .lemme, avant d'énumérer les tags:

… Tagger.enumerateTags (in: range, unit: .word, scheme: .lemma, options: options) tag, tokenRange, arrêtez-vous si let lemma = tag? .RawValue // Gérez chaque élément de lemme… 

Ensuite, nous examinerons une partie du balisage vocal, ce qui nous permet de classer un bloc de texte en tant que noms, verbes, adjectifs ou autres parties.. 

Partie du discours (PoS)

Une partie du marquage vocal vise à associer la partie du discours à chaque mot spécifique, en fonction de la définition et du contexte du mot (sa relation avec les mots adjacents et associés). En tant qu'élément de la PNL, une partie du marquage de la parole nous permet de nous concentrer sur les noms et les verbes, ce qui peut nous aider à déduire de l'intention et de la signification du texte.. 

La mise en œuvre d’une partie du balisage vocal implique la définition de la propriété tagger à utiliser .lexicalClass, et énumérer de la même manière que dans les exemples précédents. Vous obtiendrez une décomposition de votre phrase en mots, avec une balise associative pour chaque mot, classant le mot comme appartenant à un nom, une préposition, un verbe, un adjectif ou un déterminant. Pour plus d'informations sur leur signification, reportez-vous à la documentation d'Apple concernant les types Lexical.. 

Un autre processus de la pile NLP d’Apple est la reconnaissance d’entités nommées (Named Entity Recognition), qui décompose des blocs de texte en extrayant des types d’entités spécifiques qui nous intéressent, tels que des noms, des emplacements, des organisations et des personnes. Regardons la prochaine. 

Reconnaissance d'entité nommée 

La reconnaissance d'entité nommée est l'un des composants de balisage de classification PNL les plus puissants, vous permettant de classer des entités ou des objets nommés du monde réel de votre phrase (c'est-à-dire des emplacements, des personnes et des noms). En tant qu'utilisateur d'iPhone, vous auriez déjà vu cela en action lorsque vous envoyiez des textos à vos amis et vous auriez observé certains mots clés mis en évidence, tels que les numéros de téléphone, les noms ou les dates.. 

Vous pouvez implémenter la reconnaissance d'entités nommées de la même manière que nos autres exemples, en définissant le schéma de balise sur .nomType, et en boucle à travers le tagger par une plage spécifique. 

Ensuite, vous mettrez en pratique ce que vous avez appris, avec une application simple prenant un ensemble prédéterminé de tweets, à mesure que vous transmettez chaque tweet via le pipeline NLP.. 

Mise en œuvre du traitement du langage naturel

Pour conclure, examinons une application client Twitter simple qui récupère cinq tweets dans un tableau et applique un traitement PNL à chacun d'eux..

Dans la capture d'écran suivante, nous avons utilisé la reconnaissance d'entité nommée de NLP pour mettre en surbrillance les mots clés de l'entité (organisations, emplacements, etc.) en rouge..

Continuez et clonez le projet TwitterNLPExample à partir du référentiel du tutoriel GitHub et jetez un coup d'œil au code. La classe qui nous intéresse le plus est TweetsViewController.swift. Jetons un coup d'oeil à sa tableView (_ tableView: cellForRowAt) méthode.

override func tableView (_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell // Récupère la cellule Tweet. let cell = tableView.dequeueReusableCell (withIdentifier: reuseIdentifier, pour: indexPath) // Récupère le modèle Tweet à partir de Tweets chargés. let tweet = tweets [indexPath.row] cell.textLabel? .text = tweet.text cell.detailTextLabel? .text = "Par \ (tweet.author.screenName)." self.range = NSRange (location: 0, length: (tweet.text.utf16.count)) self.detectLangage (avec: cell.textLabel!) self.getTokenization (avec: cell.textLabel!) self.getNamedEntityRecognition (avec: cell.textLabel!) self.getLemmatization (avec: cell.textLabel!) // Renvoie la cellule Tweet. cellule de retour

Pour chaque cellule (tweet), nous appelons quatre méthodes que nous définirons sous peu: 

  • detectLanguage ()
  • getTokenization ()
  • getNamedEntityRecognition ()
  • getLemmatization ()

Pour chacune de ces méthodes, nous appelons le énumérer méthode, en passant le schéma et l’étiquette de texte pour extraire le texte, comme pour identifier la langue:

func detectLanguage (avec textLabel: UILabel) let _ = énumérer (schéma: .language, label: textLabel)

Finalement, le énumérer La fonction est l'endroit où toutes les actions de la PNL se produisent réellement, en prenant en compte les propriétés et les arguments en fonction du type de traitement de la PNL que nous avons l'intention de faire, et en stockant les résultats dans des tableaux que nous pourrons utiliser ultérieurement. Pour les besoins de cet exemple, nous imprimons simplement les résultats sur la console, à des fins d'observation. 

func enumerate (scheme: NSLinguisticTagScheme, label: UILabel) -> [Chaîne]? var keywords = [Chaîne] () var tokens = [Chaîne] () var lemmas = [Chaîne] () let balises: [NSLinguisticTag] = [ .personalName, .placeName, .organizationName] let tagger = NSLinguisticTagger (tagSchemes: [modèle], options: 0) tagger.string = label.text tagger.enumerateTags (dans: plage !, unité: .word, schéma: schéma, options : options) tag, tokenRange, _ in switch (scheme) case NSLinguisticTagScheme.lemma: if let lemma = balise? .rawValue lemmas.append (lemma) casse NSLinguisticTagScheme.language: print ("Langue dominante: tagger.dominantLanguage ?? "Indéterminé")) casse de casse NSLinguisticTagScheme.nameType: if let tag = tag, tags.contains (tag) let nom = (label.text! as NSString) .substring (avec: tokenRange) print ( "entité: \ (nom)") keywords.append (nom) casse de casse NSLinguisticTagScheme.lexicalClass: casse de casse NSLinguisticTagScheme.tokenType: if let tagVal = point? .rawValue tokens.append (tagVal.lowercased ()) break default: break if (scheme == .nameType) let keywordAttrString = NSMutableAttributedString (string: tagger.string !, attributs: nil) pour le nom dans les mots clés if let indices = label.text? .indicesOf (string: name ) pour i dans les indices let range = NSRange (i… 

Pour le .nomType Schéma de reconnaissance d’entités nommées, nous prenons les mots-clés d’entités que nous avons extraits et les parcourons pour mettre en évidence les mots correspondant à ces entités. Vous pouvez même aller plus loin et créer des liens vers ces mots clés, peut-être pour rechercher des tweets correspondant à ces mots clés.. 

Allez-y, construisez et exécutez l'application et jetez un coup d'œil au résultat, en accordant une attention particulière aux lemmes et aux entités que nous avons extraits.. 

Conclusion

Que ce soit Google qui exploite Natural Language Processing dans ses moteurs de recherche ou les robots messagers d’Apple Siri et Facebook, il ne fait aucun doute que ce domaine connaît une croissance exponentielle. Mais la PNL et le Machine Learning ne sont plus le domaine exclusif des grandes entreprises. En introduisant le framework Core ML plus tôt cette année, Apple a facilité la tâche des développeurs de tous les jours sans formation approfondie pour pouvoir ajouter de l'intelligence à leurs applications..

Dans ce didacticiel, vous avez découvert qu'avec quelques lignes de code, vous pouvez utiliser Core ML pour déduire le contexte et l'intention de phrases et de paragraphes non structurés, ainsi que pour détecter la langue dominante. Nous verrons de nouvelles améliorations dans les futures versions du SDK, mais NLP promet déjà d’être un outil puissant qui sera largement utilisé dans l’App Store..

Pendant que vous êtes ici, consultez certains de nos autres articles sur le développement d'applications iOS et l'apprentissage automatique.!