Maschinelles Lernen war zweifellos eines der heißesten Themen des vergangenen Jahres. Unternehmen aller Art versuchen, ihre Produkte intelligenter zu machen, um die Benutzererfahrung zu verbessern und ihr Angebot zu differenzieren.
Jetzt ist Apple in das Rennen gegangen, um maschinelles Lernen für Entwickler anzubieten. Core ML macht es Entwicklern leicht, ihre Apps um Deep Machine Learning zu erweitern.
Ein Blick auf Ihr iOS-Gerät zeigt, dass in fast jeder System-App maschinelles Lernen integriert ist - das offensichtlichste ist Siri. Wenn Sie zum Beispiel Textnachrichten senden, verwendet Apple Natural Language Processing (NLP), um entweder das nächste Wort vorherzusagen oder beim Eingeben eines Wortes intelligent eine Korrektur vorzuschlagen. Erwarten Sie, dass maschinelles Lernen und NLP in unserem Einsatz von Technologie, von der Suche bis zum Kundendienst, immer präsenter werden und weiter verankert werden.
Dieses Lernprogramm führt Sie in eine Teilmenge des maschinellen Lernens ein: Natural Language Processing (NLP). Wir werden uns damit beschäftigen, was NLP ist und warum es sich lohnt zu implementieren, bevor wir uns die verschiedenen Ebenen oder Schemata ansehen, aus denen NLP besteht. Diese schließen ein:
Nachdem wir die Theorie des NLP durchgearbeitet haben, werden wir unser Wissen in die Praxis umsetzen, indem wir einen einfachen Twitter-Client erstellen, der Tweets analysiert. Klonen Sie das GitHub-Repo des Tutorials und werfen Sie einen Blick darauf.
In diesem Lernprogramm wird davon ausgegangen, dass Sie ein erfahrener iOS-Entwickler sind. Obwohl wir mit maschinellem Lernen arbeiten werden, brauchen Sie keinen Hintergrund zu diesem Thema. Während andere Komponenten von Core ML einige Kenntnisse in Python erfordern, arbeiten wir mit NLP nicht mit Python-relevanten Aspekten.
Das Ziel des maschinellen Lernens besteht darin, dass ein Computer Aufgaben ausführt, ohne dafür explizit programmiert zu sein, dh die Fähigkeit, autonom zu denken oder zu interpretieren. Ein hochkarätiger, zeitgemäßer Anwendungsfall ist autonomes Fahren: Ermöglicht Fahrzeugen, ihre Umgebung visuell zu interpretieren und selbstständig zu fahren.
Neben der visuellen Erkennung hat das maschinelle Lernen auch Spracherkennung, intelligente Websuche und mehr eingeführt. Da Google, Microsoft, Facebook und IBM an vorderster Front dabei sind, maschinelles Lernen zu popularisieren und für gewöhnliche Entwickler verfügbar zu machen, hat sich Apple dazu entschlossen, in diese Richtung zu gehen und das maschinelle Lernen einfacher in Drittanbieteranwendungen integrieren zu können.
Core ML ist neu in der SDK-Familie von Apple und wurde als Teil von iOS 11 eingeführt, um Entwicklern die Implementierung einer Vielzahl von maschinellen Lernmodi und tieferen Schichttypen zu ermöglichen.
Natural Language Processing (NLP) befindet sich logischerweise innerhalb des Core ML-Frameworks neben zwei anderen leistungsstarken Bibliotheken, Vision und GameplayKit. Vision bietet Entwicklern die Möglichkeit, Computer Vision Machine Learning zu implementieren, um beispielsweise Gesichter, Orientierungspunkte oder andere Objekte zu erkennen, während GameplayKit Spielentwicklern Tools für das Authoring von Spielen und bestimmte Gameplay-Funktionen zur Verfügung stellt.
In diesem Tutorial konzentrieren wir uns auf die Verarbeitung natürlicher Sprachen.
Natural Language Processing ist die Wissenschaft, in der Lage ist, Text zu analysieren und zu verstehen, Sätze und Wörter aufzubrechen, um Aufgaben wie Sentiment-Analyse, Beziehungsextraktion, Stemming, Text- oder Satzzusammenfassung usw. auszuführen. Einfach ausgedrückt: NLP ist die Fähigkeit des Computers, die menschliche Sprache in ihrer natürlich gesprochenen oder geschriebenen Form zu verstehen.
Die Möglichkeit, Wörter und Sätze kontextabhängig zu extrahieren und zu kapseln, ermöglicht eine verbesserte Integration zwischen Benutzern und Geräten oder sogar zwischen zwei Geräten durch sinnvolle Inhaltsstücke. Wir werden jede dieser Komponenten in Kürze detailliert untersuchen, aber zuerst ist es wichtig zu verstehen, warum Sie NLP implementieren möchten.
Da Unternehmen weiterhin auf die Speicherung und Verarbeitung von Big Data angewiesen sind, ermöglicht NLP die Interpretation von freiem und unstrukturiertem Text, wodurch dieser analysiert werden kann. Mit vielen Informationen, die in unstrukturierten Textdateien gespeichert sind (z. B. in Krankenakten), kann NLP beispielsweise Datenmengen durchsuchen und Daten zu Kontext, Absicht und sogar Gefühl liefern.
NLP ist nicht nur in der Lage, gesprochene und geschriebene Texte zu analysieren, sondern hat sich zu einem Motor für Bots entwickelt - von denen in Slack, mit denen Sie sich fast vollständig menschlich unterhalten können, bis hin zu Tools für den Kundendienst. Wenn Sie die Support-Website von Apple besuchen und anfragen, um mit dem Kundenservice zu sprechen, wird Ihnen ein Web-Bot angezeigt, der versucht, Sie anhand der gestellten Frage in die richtige Richtung zu weisen. Es hilft Kunden, sich in Echtzeit verstanden zu fühlen, ohne tatsächlich mit einem Menschen sprechen zu müssen.
Mit einem Blick auf E-Mail-Spam und Spam-Filter hat NLP es möglich gemacht, Text besser zu verstehen und E-Mails mit größerer Sicherheit hinsichtlich ihrer Absichten zu klassifizieren.
Summarization ist eine wichtige NLP-Technik zur Erstellung von Sentiment-Analysen, die Unternehmen auf Daten aus ihren Social-Media-Konten anwenden möchten, um die Wahrnehmung der Produkte des Unternehmens zu verfolgen.
Die Fotos-App auf iOS 11 ist ein weiteres gutes Beispiel. Bei der Suche nach Fotos funktioniert maschinelles Lernen auf mehreren Ebenen. Neben der Verwendung von Machine Learning und Vision zum Erkennen von Gesicht und Art des Fotos (z. B. Strand, Standort) werden die Suchbegriffe durch NLP gefiltert. Wenn Sie nach dem Begriff "Strände" suchen, werden auch nach Fotos gesucht, die die Beschreibung enthalten. Strand'. Dies wird als Lemmatisierung bezeichnet, und Sie werden im Folgenden mehr darüber erfahren, da wir lernen, wie leistungsfähig maschinelles Lernen ist, und wie einfach es für Apple ist, Ihre Apps intelligenter zu machen.
Wenn Ihre App beispielsweise einen Suchstring besser versteht, kann sie intelligenter mit Benutzern interagieren und die Absicht hinter dem Suchbegriff verstehen, anstatt das Wort im wörtlichen Sinne zu verstehen. Durch die Nutzung der NLP-Bibliothek von Apple können Entwickler einen konsistenten Textverarbeitungsansatz und eine Benutzererfahrung im gesamten Apple-Ökosystem unterstützen, von iOS bis macOS, tvOS und watchOS.
Mit maschinellem Lernen auf dem Gerät profitieren Benutzer von der Nutzung der CPU und GPU des Geräts, um Leistungseffizienz bei Berechnungen zu gewährleisten, anstatt auf externe Maschinenlern-APIs zuzugreifen. Dadurch können Benutzerdaten auf dem Gerät bleiben und die Latenz aufgrund von Netzwerkzugriffen reduziert werden. Da maschinelles Lernen ein vertieftes Wissen der Benutzer erfordert, um auf Vorschläge und Vorhersagen schließen zu können, die Verarbeitung auf dem physischen Gerät zu berücksichtigen und differenzierte Privatsphäre für alle netzwerkbezogenen Aktivitäten zu nutzen, können Sie eine intelligente, aber nicht invasive Erfahrung für Sie bereitstellen Ihre Benutzer.
Als Nächstes betrachten wir die Zusammensetzung der Appliance Natural Language Processing Engine.
Die grundlegende Klasse NSLinguisticTagger spielt eine zentrale Rolle bei der Analyse und Markierung von Text und Sprache, wobei der Inhalt in Absätze, Sätze und Wörter unterteilt wird, und besteht aus den folgenden Schemata:
Wenn Sie initialisieren NSLinguisticTagger
, du gehst in die NSLinguisticTagScheme
Sie interessieren sich für die Analyse. Zum Beispiel:
let tagger = NSLinguisticTagger (tagSchemes: [.language, .tokenType,…], Optionen: 0)
Sie müssen dann die verschiedenen Argumente und Eigenschaften einrichten, einschließlich des Übergebens des Eingabetextes, bevor Sie die Aufzählung durchführen NSLinguisticTagger
Instanzobjekt, Entitäten und Token extrahieren. Lassen Sie uns tiefer eintauchen und sehen, wie Sie die einzelnen Schemata Schritt für Schritt implementieren, beginnend mit dem Spracherkennungsschema.
Der erste Tag-Schema-Typ, Sprachidentifikation, versucht die BCP-47-Sprache zu identifizieren, die entweder auf Dokument-, Absatz- oder Satzebene am deutlichsten ist. Sie können diese Sprache abrufen, indem Sie auf die dominantLanguage
Eigentum der NSLinguisticTagger
Instanzobjekt:
… Let tagger = NSLinguisticTagger (tagSchemes: [.language], Optionen: 0)… tagger.string = "Etwas Text in einer oder zwei Sprachen" let language = tagger.dominantLanguage //i.e "en" für Englisch zurückgegeben.
Ziemlich einfach. Als Nächstes betrachten wir die Klassifizierung von Text mithilfe der Tokenisierungsmethode.
Tokenisierung ist der Prozess der Abgrenzung und möglicherweise Klassifizierung von Abschnitten einer Zeichenfolge von Eingabezeichen. Die resultierenden Token werden dann an eine andere Verarbeitungsform weitergeleitet. (Quelle: Wikipedia)
Mit einem Textblock würde die Tokenisierung diesen Text logisch in Absätze, Sätze und Wörter zerlegen und klassifizieren. Wir beginnen mit der Festlegung des geeigneten Schemas (.tokenType
) für den Tagger. Im Gegensatz zum vorherigen Schema erwarten wir mehrere Ergebnisse, und wir müssen die zurückgegebenen Tags auflisten, wie im folgenden Beispiel veranschaulicht:
let tagger = NSLinguisticTagger (tagSchemes: [.tokenType], Optionen: 0) tagger.string = textString let range = NSRange (Speicherort: 0, Länge: textString.utf16.count) // Verschiedene Optionen festlegen, z. B. Leerzeichen ignorieren und Satzzeichen lassen Optionen: NSLinguisticTagger.Options = [.omitPunctuation, .omitWhitespace] // Wir listen den Tagger auf, wobei die oben angegebenen Eigenschaften verwendet werden: tagger.enumerateTags (in: range, unit: .word, Schema: .tokenType, options: options) Tag, tokenRange, stop in let token = (Text als NSString) .substring (mit: tokenRange) // Behandle jedes Token (z. B. zum Array hinzufügen)
Jetzt haben wir eine Liste mit Wörtern. Aber wäre es nicht interessant, den Ursprung dieser Wörter zu finden? Wenn ein Benutzer beispielsweise nach einem Begriff wie "Gehen" oder "Gehen" sucht, wäre es wirklich nützlich, das Ursprungswort "Gehen" zu erhalten und alle diese Permutationen von "Gehen" zusammen zu klassifizieren. Dies wird Lemmatisierung genannt, und wir werden das als nächstes behandeln.
Bei der Lemmatisierung werden die flektierten Formen eines Wortes zu einem einzigen Element zusammengefasst, sodass Sie auf die beabsichtigte Bedeutung schließen können. Im Wesentlichen müssen Sie sich nur daran erinnern, dass es die Wörterbuchform des Wortes ableitet.
Die Kenntnis der Wörterbuchform des Wortes ist wirklich mächtig und ermöglicht es Ihren Benutzern, mit größerer "Unschärfe" zu suchen. Im vorherigen Beispiel betrachten wir einen Benutzer, der nach dem Begriff "Gehen" sucht. Ohne Lemmatisierung können Sie nur wörtliche Erwähnungen dieses Wortes zurückgeben, aber wenn Sie andere Formen desselben Wortes in Betracht ziehen könnten, könnten Sie auch Ergebnisse erhalten, die "walk" erwähnen..
Ähnlich wie im vorherigen Beispiel würden wir zur Durchführung der Lemmatisierung das Schema in der Tagger-Initialisierung auf festlegen .Lemma
, vor dem Aufzählen der Tags:
… Tagger.enumerateTags (in: range, unit: .word, schema: .lemma, Optionen: Optionen) tag, tokenRange, stop in wenn let lemma = tag? .RawValue // Handle jedes Lemma-Element…
Als Nächstes betrachten wir einen Teil der Sprachmarkierung, mit dem wir einen Textblock als Substantive, Verben, Adjektive oder andere Teile klassifizieren können.
Ein Teil der Sprachmarkierung zielt darauf ab, den Teil der Sprache jedem bestimmten Wort zuzuordnen, basierend auf der Definition und dem Kontext des Wortes (seiner Beziehung zu benachbarten und verwandten Wörtern). Als Teil des NLP ermöglicht ein Teil der Sprachmarkierung, uns auf die Substantive und Verben zu konzentrieren, was uns dabei helfen kann, die Absicht und Bedeutung von Text zu bestimmen.
Beim Implementieren eines Teils der Sprachmarkierung müssen Sie die zu verwendende Tagger-Eigenschaft festlegen .lexicalClass
, und Aufzählen auf die gleiche Weise, die in den vorherigen Beispielen gezeigt wurde. Sie erhalten eine Zerlegung Ihres Satzes in Wörter mit jeweils einem assoziativen Tag, der das Wort als zu einem Nomen, zu einer Präposition, einem Verb, einem Adjektiv oder zu einem Determinanten gehört. Weitere Informationen zu diesen Bedeutungen finden Sie in der Dokumentation zu Lexical Types von Apple.
Ein weiterer Prozess innerhalb des NLP-Stacks von Apple ist Named Entity Recognition. Dabei werden Textblöcke zerlegt und bestimmte Entitätstypen extrahiert, an denen wir interessiert sind, z. B. Namen, Standorte, Organisationen und Personen. Lass uns das als nächstes betrachten.
Named Entity Recognition ist eine der leistungsfähigsten NLP-Klassifizierungs-Tagging-Komponenten, mit der Sie benannte Entitäten oder Objekte in der realen Welt aus Ihrem Satz (d. H. Orte, Personen, Namen) klassifizieren können. Als iPhone-Benutzer hätten Sie dies bereits in Aktion gesehen, wenn Sie Ihren Freunden SMS schreiben, und Sie hätten bestimmte Schlüsselwörter wie Telefonnummern, Namen oder Daten hervorgehoben.
Sie können die Erkennung benannter Entitäten auf ähnliche Weise wie unsere anderen Beispiele implementieren, indem Sie das Tag-Schema auf einstellen .nameType
, und durchlaufen den Tagger um einen bestimmten Bereich.
Als Nächstes setzen Sie das Gelernte in die Tat um, mit einer einfachen App, die eine bestimmte Anzahl von Tweets verwendet, während Sie jeden Tweet durch die NLP-Pipeline stellen.
Zum Abschluss betrachten wir eine einfache Twitter-Client-App, die fünf Tweets in einer Tabellensicht abruft und für jede einzelne NLP-Verarbeitung anwendet.
In der folgenden Abbildung haben wir die Benannte Entitätserkennung von NLP verwendet, um die Schlüsselwörter der Entitäten (Organisationen, Standorte usw.) rot hervorzuheben.
Klonen Sie das TwitterNLPExample-Projekt aus dem Tutorial GitHub-Repo und werfen Sie einen Blick auf den Code. Die Klasse, die uns am meisten interessiert, ist TweetsViewController.swift
. Lassen Sie uns einen Blick darauf werfen tableView (_ tableView: cellForRowAt)
Methode.
func tableView überschreiben (_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell // Abrufen der Tweet-Zelle. let cell = tableView.dequeueReusableCell (withIdentifier: reuseIdentifier, für: indexPath) // Rufen Sie das Tweet-Modell aus geladenen Tweets ab. let tweet = tweets [indexPath.row] cell.textLabel? .text = tweet.text cell.detailTextLabel? .text = "By \ (tweet.author.screenName)." self.range = NSRange (Speicherort: 0, Länge: (tweet.text.utf16.count)) self.detectLanguage (mit: cell.textLabel!) self.getTokenization (mit: cell.textLabel!) self.getNamedEntityRecognition (mit: cell.textLabel!) self.getLemmatization (mit: cell.textLabel!) // Die Tweet-Zelle zurückgeben. Zellenrückgabe
Für jede Zelle (Tweet) rufen wir vier Methoden auf, die wir in Kürze definieren werden:
Sprache erkennen()
getTokenization ()
getNamedEntityRecognition ()
getLemmatization ()
Für jede dieser Methoden nennen wir die aufzählen
Übergeben Sie das Schema und die Textbezeichnung, um den Text zu extrahieren, wie wir die Sprache bestimmen:
func detectLanguage (mit textLabel: UILabel) let _ = enumerate (Schema: .language, label: textLabel)
Endlich, das aufzählen
Funktion ist der Ort, an dem die gesamte NLP-Aktion tatsächlich stattfindet. Dabei werden die Eigenschaften und Argumente basierend auf der Art der NLP-Verarbeitung berücksichtigt, die wir ausführen möchten, und die Ergebnisse werden in Arrays gespeichert, die wir später verwenden können. Für die Zwecke dieses Beispiels drucken wir die Ergebnisse zu Beobachtungszwecken einfach auf der Konsole aus.
func Aufzählung (Schema: NSLinguisticTagScheme, Label: UILabel) -> [String]? var keywords = [String] () var tokens = [String] () var lemmas = [String] () let tags: [NSLinguisticTag] = [ .personalName, .placeName, .organizationName] let tagger = NSLinguisticTagger (tagSchemes: [Schema], Optionen: 0) tagger.string = label.text tagger.enumerateTags (in: range !, unit: .word, schema: options, Optionen) : options) tag, tokenRange, _ in switch (Schema) case NSLinguisticTagScheme.lemma: wenn lemma = tag? .rawValue lemmas.append (lemma) Fall wechseln NSLinguisticTagScheme.language: print ("Dominant language: \ ( tagger.dominantLanguage ?? "Unbestimmt") ") Umbruchfall NSLinguisticTagScheme.nameType: wenn let tag = tag, tags.contains (tag) let name = (label.text! als NSString) .substring (mit: tokenRange) print ( "entity: \ (name)") keywords.append (name) break case NSLinguisticTagScheme.lexicalClass: break case NSLinguisticTagScheme.tokenType: if let tagVal = tag? .rawValue tokens.append (tagVal.lowercased ()) break default: break if (Schema == .nameType) let keywordAttrString = NSMutableAttributedString (Zeichenfolge: tagger.string!, Attribute: nil) für den Namen in den Schlüsselwörtern wenn Indizes = label.text? .indicesOf (Zeichenfolge: name ) für i in Indizes lass range = NSRange (i…Für die
.nameType
Das so genannte Entity Recognition-Schema verwendet die Entschlüsselungsschlüsselwörter, die wir extrahiert haben, und hebt die Wörter hervor, die diesen Entitäten entsprechen. Sie könnten sogar noch einen Schritt weitergehen und diese Keywords als Links verwenden, um nach Tweets zu suchen, die diesen Keywords entsprechen.Erstellen Sie die App, führen Sie sie aus und sehen Sie sich die Ausgabe an. Achten Sie dabei besonders auf die von uns extrahierten Lemmata und Entitäten.
Fazit
Von Google, das Natural Language Processing in seinen Suchmaschinen nutzt, bis hin zu den Messenger-Bots von Siri und Facebook von Apple, besteht kein Zweifel, dass dieses Feld exponentiell wächst. NLP und Machine Learning sind jedoch nicht mehr die ausschließliche Domäne großer Unternehmen. Durch die Einführung des Core ML-Frameworks Anfang des Jahres hat Apple es für Entwickler im Alltag ohne großen Grundkenntnisse leicht gemacht, ihren Apps Intelligenz hinzuzufügen.
In diesem Lernprogramm haben Sie gesehen, wie Sie mit ein paar Zeilen Code Core ML verwenden können, um Kontext und Absicht aus unstrukturierten Sätzen und Absätzen abzuleiten und die dominante Sprache zu erkennen. In zukünftigen Iterationen des SDK werden sich weitere Verbesserungen ergeben. NLP verspricht jedoch bereits, ein leistungsfähiges Werkzeug zu sein, das im App Store weit verbreitet ist.
Während Sie hier sind, lesen Sie einige unserer anderen Beiträge zur Entwicklung von iOS-Apps und zum maschinellen Lernen!