Machine learning is ongetwijfeld een van de populairste onderwerpen van het afgelopen jaar geweest, waarbij bedrijven van allerlei aard probeerden hun producten intelligenter te maken om gebruikerservaringen te verbeteren en hun aanbod te differentiëren.
Nu is Apple de race ingegaan om ontwikkelaargerichte machine learning te bieden. Core ML maakt het gemakkelijk voor ontwikkelaars om deep machine learning aan hun apps toe te voegen.
Alleen al door naar je iOS-apparaat te kijken, zie je machine learning in bijna elke systeem-app worden opgenomen - het meest voor de hand liggende is Siri. Als u bijvoorbeeld sms-berichten verzendt, gebruikt Apple Natural Language Processing (NLP) om uw volgende woord te voorspellen of op intelligente wijze een correctie voor te stellen tijdens het typen van een woord. Verwacht machine learning en NLP om steeds aanwezig te blijven en verder ingebakken in ons gebruik van technologie, van zoeken tot klantenservice.
Deze tutorial zal je kennis laten maken met een deel van de machine learning: Natural Language Processing (NLP). We bespreken wat NLP is en waarom het de moeite waard is om te implementeren, voordat we kijken naar de verschillende lagen of schema's waaruit NLP bestaat. Waaronder:
Nadat we de NLP-theorie hebben doorlopen, zullen we onze kennis in praktijk brengen door een eenvoudige Twitter-client te maken die tweets analyseert. Ga je gang en klop de GitHub-repo van de tutorial en neem een kijkje.
Deze tutorial gaat ervan uit dat je een ervaren iOS-ontwikkelaar bent. Hoewel we met machine learning zullen werken, hoeft u geen achtergrond in het onderwerp te hebben. Bovendien, terwijl andere componenten van Core ML enige kennis van Python vereisen, zullen we niet werken met enige Python-gerelateerde aspecten met NLP.
Het doel van machine learning is dat een computer taken doet zonder expliciet geprogrammeerd te zijn om dit te doen - het vermogen om autonoom te denken of te interpreteren. Een opvallende eigentijdse use-case is autonoom rijden: auto's de mogelijkheid bieden om hun omgeving visueel te interpreteren en zonder hulp te rijden.
Naast visuele herkenning heeft machine learning ook spraakherkenning, intelligent internet zoeken en meer geïntroduceerd. Met Google, Microsoft, Facebook en IBM in de voorhoede van het populariseren van machine learning en deze beschikbaar te maken voor gewone ontwikkelaars, heeft Apple ook besloten om die richting uit te gaan en het gemakkelijker te maken om machine learning op te nemen in applicaties van derden..
Core ML is nieuw voor de SDK-familie van Apple, geïntroduceerd als onderdeel van iOS 11, zodat ontwikkelaars een breed scala aan machine-leermodi en deep learning-laagtypen kunnen implementeren.
Natural Language Processing (NLP) zit logischerwijze in het Core ML-framework naast twee andere krachtige bibliotheken, Vision en GameplayKit. Vision biedt ontwikkelaars de mogelijkheid om computer vision-machine learning te implementeren om dingen te bereiken zoals het detecteren van gezichten, oriëntatiepunten of andere objecten, terwijl GameplayKit game-ontwikkelaars tools biedt voor het schrijven van spellen en specifieke gameplay-functies.
In deze tutorial zullen we ons concentreren op natuurlijke taalverwerking.
Natuurlijke taalverwerking is de wetenschap van het kunnen analyseren en begrijpen van tekst, het opsplitsen van zinnen en woorden om taken uit te voeren zoals sentimentanalyse, relatie-extractie, stemming, tekst of zinsamenvatting en meer. Of simpel gezegd, NLP is het vermogen van computers om menselijke taal te begrijpen in zijn natuurlijk gesproken of geschreven vorm.
Het vermogen om woorden en zinnen contextueel uit te pakken en in te kapselen, zorgt voor een betere integratie tussen gebruikers en apparaten, of zelfs tussen twee apparaten, door zinvolle stukjes inhoud. We zullen elk van deze componenten kortstondig in detail onderzoeken, maar in de eerste plaats is het belangrijk om te begrijpen waarom je NLP zou willen implementeren.
Met bedrijven die blijven vertrouwen op het opslaan en verwerken van big data, maakt NLP de interpretatie van vrije en ongestructureerde tekst mogelijk, waardoor deze analyseerbaar is. Met veel informatie opgeslagen in ongestructureerde tekstbestanden - bijvoorbeeld in medische dossiers - kan NLP gegevensbestanden doorzoeken en gegevens verstrekken over context, intentie en zelfs sentiment.
Naast het kunnen analyseren van gesproken en geschreven tekst, is NLP nu de motor achter bots - van degenen in Slack waar je bijna een volledig menselijk gesprek mee kunt hebben, tot hulpmiddelen voor klantenservice. Als je naar de ondersteuningswebsite van Apple gaat en een verzoek indient om met de klantenservice te praten, krijg je een webbot te zien die zal proberen je in de juiste richting te sturen op basis van de vraag die je hebt gesteld. Het helpt klanten zich in realtime begrepen te voelen, zonder daadwerkelijk met een mens te hoeven praten.
E-mail-spams en spamfilters bekeken, hebben NLP het mogelijk gemaakt om tekst beter te begrijpen en om e-mails met meer zekerheid over hun intenties beter te classificeren.
Samenvatten is een belangrijke NLP-techniek om sentimentanalyse te leveren, iets dat bedrijven zouden willen gebruiken op de gegevens van hun sociale-mediarekeningen, om de perceptie van de producten van het bedrijf bij te houden..
De Photos-app op iOS 11 is een ander goed voorbeeld. Bij het zoeken naar foto's werkt machine learning op meerdere niveaus. Naast het gebruik van machine learning en visie om het gezicht en type foto te herkennen (bijv. Strand, locatie), worden zoektermen gefilterd door NLP, en als je zoekt naar de term 'stranden', zal het ook zoeken naar foto's die de beschrijving bevatten ' strand'. Dit wordt lemmatisatie genoemd en je zult hieronder meer leren, terwijl we leren waarderen hoe krachtig machine-leren is, en toch hoe gemakkelijk Apple het voor je maakt om je apps intelligenter te maken.
Als uw app een beter begrip heeft van bijvoorbeeld een zoekreeks, kan deze intelligenter met gebruikers communiceren en de bedoeling achter de zoekterm begrijpen in plaats van het woord in letterlijke zin te gebruiken. Door de NLP-bibliotheek van Apple te omarmen, kunnen ontwikkelaars een consistente tekstverwerkingsaanpak en gebruikerservaring ondersteunen in het hele Apple-ecosysteem, van iOS tot macOS, tvOS en watchOS.
Omdat machine-learning op het apparaat wordt uitgevoerd, profiteren gebruikers van de CPU en GPU van het apparaat om de prestaties in berekeningen te verbeteren, in plaats van externe API's voor computerleren te gebruiken. Hierdoor kunnen gebruikersgegevens op het apparaat blijven en neemt de wachttijd af vanwege netwerktoegang. Met machine-learning die een meer intieme kennis van gebruikers vereist om suggesties en voorspellingen te kunnen afleiden, verwerking naar het fysieke apparaat te kunnen bevatten en gebruik te maken van differentiële privacy voor netwerkgerelateerde activiteiten, kunt u een intelligente maar niet-invasieve ervaring bieden voor uw gebruikers.
Vervolgens bekijken we de samenstelling van de natuurlijke taalverwerkingsengine van Apple.
De basisklasse NSLinguisticTagger speelt een centrale rol bij het analyseren en taggen van tekst en spraak, het segmenteren van inhoud in alinea's, zinnen en woorden en bestaat uit de volgende schema's:
Wanneer u initialiseert NSLinguisticTagger
, je passeert in de NSLinguisticTagScheme
je bent geïnteresseerd in analyseren. Bijvoorbeeld:
laat tagger = NSLinguisticTagger (tagSchemes: [.language, .tokenType, ...], opties: 0)
U zou dan de verschillende argumenten en eigenschappen instellen, inclusief doorgeven in de invoertekst, voordat u opslaat in de NSLinguisticTagger
instance object, entiteiten en tokens uitpakken. Laten we dieper duiken en zien hoe we elk schema stap voor stap kunnen implementeren, te beginnen met het taalidentificatieschema.
Het eerste type tagschema, taalidentificatie, probeert de BCP-47-taal te identificeren die het meest prominent is op een document-, paragraaf- of zinniveau. U kunt deze taal ophalen door naar de dominantLanguage
eigendom van de NSLinguisticTagger
instance object:
... Laat tagger = NSLinguisticTagger (tagSchemes: [.language], options: 0) ... tagger.string = "Enkele tekst in een of twee talen" laat taal = tagger.dominantLanguage //i.e "en" terug voor Engels.
Vrij eenvoudig. Vervolgens zullen we kijken naar het classificeren van tekst met behulp van de tokenisatiemethode.
Tokenization is het proces van het afbakenen en eventueel classificeren van secties van een reeks invoertekens. De resulterende tokens worden vervolgens doorgegeven aan een andere vorm van verwerking. (Bron: Wikipedia)
Door een tekstblok te nemen, zou tokenisering logisch de tekst ontbinden en classificeren in alinea's, zinnen en woorden. We beginnen met het instellen van het juiste schema (.tokenType
) voor de tagger. In tegenstelling tot het vorige schema verwachten we meerdere resultaten en moeten we de geretourneerde tags opsommen, zoals geïllustreerd in het onderstaande voorbeeld:
laat tagger = NSLinguisticTagger (tagSchemes: [.tokenType], opties: 0) tagger.string = textString laat bereik = NSRange (locatie: 0, lengte: textString.utf16.count) // Verschillende opties instellen, zoals het negeren van spaties en leestekens laat opties: NSLinguisticTagger.Options = [.omitPunctuation, .omitWhitespace] // We inventariseren de tagger, met behulp van de eigenschappen die zijn ingesteld boven tagger.enumerateTags (in: bereik, eenheid: .word, schema: .tokenType, opties: opties) tag, tokenRange, stop in let token = (tekst als NSString) .substring (met: tokenRange) // Behandel elk token (dwz voeg toe aan array)
Nu hebben we een woordenlijst. Maar zou het niet interessant zijn om de oorsprong van die woorden te krijgen? Dus als een gebruiker bijvoorbeeld zoekt naar een term als 'wandelen' of 'lopen', zou het erg handig zijn om het oorsprongswoord 'lopen' te krijgen en al deze permutaties van 'wandelen' samen te classificeren. Dit wordt lemmatisatie genoemd en daar zullen we het over hebben.
Lemmatisering groepeert de verbogen vormen van een te analyseren woord als een enkelvoudig item, waardoor je de bedoelde betekenis kunt afleiden. In wezen is alles wat u moet onthouden dat het de woordenboekvorm van het woord is.
Het kennen van de woordenboekvorm van het woord is echt krachtig en stelt uw gebruikers in staat met meer 'fuzziness' te zoeken. In het vorige voorbeeld beschouwen we een gebruiker die zoekt naar de term 'wandelen'. Zonder lemmatisatie zou je letterlijke vermeldingen van dat woord alleen kunnen retourneren, maar als je andere vormen van hetzelfde woord zou kunnen overwegen, zou je ook resultaten kunnen krijgen die 'lopen' vermelden.
Net als bij het vorige voorbeeld, om lemmatisatie uit te voeren, zouden we het schema in de initialisatie van de tagger instellen op .lemma
, voor het opsommen van de tags:
... tagger.enumerateTags (in: bereik, eenheid: .word, schema: .lemma, opties: opties) tag, tokenRange, stop in if let lemma = tag? .RawValue // Verwerk elk lemma-item ...
Vervolgens bekijken we een deel van spraakmarkering, waardoor we een blok tekst kunnen classificeren als zelfstandige naamwoorden, werkwoorden, bijvoeglijke naamwoorden of andere delen..
Een deel van Speech-tagging beoogt het deel van de spraak te koppelen aan elk specifiek woord, op basis van zowel de definitie van het woord als de context (de relatie met aangrenzende en verwante woorden). Als onderdeel van NLP stelt een deel van spraaklabelen ons in staat om ons te concentreren op de zelfstandige naamwoorden en werkwoorden, wat ons kan helpen de bedoeling en betekenis van tekst te bepalen.
Het implementeren van delen van spraaklabels houdt in dat de tagger-eigenschap moet worden gebruikt .lexicalClass
, en opsommen op dezelfde manier als aangetoond in de voorgaande voorbeelden. Je krijgt een decompositie van je zin in woorden, met een associatieve tag voor elk, het woord classificerend als behorend tot een zelfstandig naamwoord, voorzetsel, werkwoord, bijvoeglijk naamwoord of determiner. Raadpleeg Apple's documentatie over de Lexical Types voor meer informatie over wat deze betekenen.
Een ander proces binnen de NLP-stapel van Apple is 'Named Entity Recognition', waarin blokken tekst worden ontleed, specifieke entiteitstypen worden geëxtraheerd waarin we zijn geïnteresseerd, zoals namen, locaties, organisaties en mensen. Laten we daar naar kijken.
Met de naam Entiteitsherkenning is een van de krachtigste taggingcomponenten voor NLP-classificatie, waarmee u benoemde real-world entiteiten of objecten uit uw zin kunt classificeren (zoals locaties, mensen, namen). Als een iPhone-gebruiker zou je dit al in actie hebben gezien wanneer je je vrienden sms't en je bepaalde zoekwoorden zou hebben gemarkeerd, zoals telefoonnummers, namen of datums.
U kunt Named Entity Recognition op dezelfde manier implementeren als onze andere voorbeelden, door het tagschema in te stellen .nameType
, en lus door de tagger door een specifiek bereik.
Vervolgens plaats je wat je hebt geleerd in actie, met een eenvoudige app die een vooraf bepaalde set tweets gebruikt, terwijl je elke tweet door de NLP-pijplijn steekt.
Om alles af te ronden, bekijken we een eenvoudige Twitter-client-app die vijf tweets in een tabelweergave ophaalt en enige NLP-verwerking toepast voor elke.
In de volgende screenshot gebruikten we NLP's Named Entity Recognition om de belangrijkste entiteitswoorden (organisaties, locaties etc.) in rood te markeren.
Ga je gang en kloon het TwitterNLPExample-project uit de tutorial GitHub repo en bekijk de code snel. De klas waar we het meest in geïnteresseerd zijn, is TweetsViewController.swift
. Laten we het eens bekijken tableView (_ tableView: cellForRowAt)
methode.
override func tableView (_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell // De cel Tweet ophalen. laat cel = tableView.dequeueReusableCell (withIdentifier: reuseIdentifier, for: indexPath) // Haal het Tweet-model op van geladen tweets. let tweet = tweets [indexPath.row] cell.textLabel? .text = tweet.text cell.detailTextLabel? .text = "By \ (tweet.author.screenName)." self.range = NSRange (locatie: 0, lengte: (tweet.text.utf16.count)) self.detectLanguage (met: cell.textLabel!) self.getTokenization (with: cell.textLabel!) self.getNamedEntityRecognition (with: cell.textLabel!) self.getLemmatization (with: cell.textLabel!) // Retourneer de cel Tweet. cel retourneren
Voor elke cel (tweet) noemen we vier methoden die we binnenkort zullen definiëren:
DETECTLANGUAGE ()
getTokenization ()
getNamedEntityRecognition ()
getLemmatization ()
Voor elk van deze methoden noemen we de opsommen
methode, doorgeven van het schema en tekstlabel om de tekst uit te pakken, zoals we doen om de taal te identificeren:
func detectLanguage (met textLabel: UILabel) let _ = opsommen (schema: .language, label: textLabel)
eindelijk, de opsommen
De functie is waar alle NLP-acties echt plaatsvinden, waarbij de eigenschappen en argumenten worden meegenomen op basis van het type NLP-verwerking dat we van plan zijn te doen en de resultaten in arrays opslaan zodat we ze later kunnen gebruiken. Voor de doeleinden van dit voorbeeld printen we de resultaten eenvoudigweg af naar de console, voor observatiedoeleinden.
func enumerate (schema: NSLinguisticTagScheme, label: UILabel) -> [String]? var keywords = [String] () var tokens = [String] () var lemmas = [String] () laat tags: [NSLinguisticTag] = [ .personalName, .placeName, .organizationName] laat tagger = NSLinguisticTagger (tagSchemes: [schema], opties: 0) tagger.string = label.text tagger.enumerateTags (in: range !, unit: .word, scheme: scheme, options : opties) tag, tokenRange, _ in switch (schema) case NSLinguisticTagScheme.lemma: if let lemma = tag? .rawValue lemmas.append (lemma) break case NSLinguisticTagScheme.language: print ("Dominant taal: \ ( 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 (naam) break case NSLinguisticTagScheme.lexicalClass: break case NSLinguisticTagScheme.tokenType: if let tagVal = tag? .rawValue tokens.append (tagVal.lowercased ()) standaardonderbreking: pauze if (scheme == .nameType) letwoordAttrString = NSMutableAttributedString (string: tagger.string !, attributen: nihil) voor naam in sleutelwoorden if let indices = label.text? .indicesOf (string: name ) voor i in indices let range = NSRange (i ...Voor de
.nameType
Met de naam Entiteitsherkenning, nemen we de entiteitszoekwoorden die we hebben geëxtraheerd en gaan we door om de woorden te markeren die overeenkomen met die entiteiten. U kunt zelfs een stap verder gaan en die trefwoordenlinks maken - misschien om te zoeken naar tweets die overeenkomen met die zoekwoorden.Ga je gang en bouw en run de app en bekijk de output, met speciale aandacht voor de lemma's en entiteiten die we hebben geëxtraheerd.
Conclusie
Van Google maakt gebruik van Natural Language Processing in zijn zoekmachines tot Apple's Siri en de messenger bots van Facebook, het lijdt geen twijfel dat dit veld exponentieel groeit. Maar NLP en Machine Learning zijn niet langer het exclusieve domein van grote bedrijven. Door eerder dit jaar het Core ML-framework te introduceren, heeft Apple het voor alledaagse ontwikkelaars gemakkelijk gemaakt om zonder achtergrond in deep learning intelligentie toe te voegen aan hun apps.
In deze zelfstudie zag je hoe je met een paar regels code Core ML kunt gebruiken om context en intentie af te leiden van ongestructureerde zinnen en paragrafen, en de dominante taal te detecteren. We zullen verdere verbeteringen zien in toekomstige herhalingen van de SDK, maar NLP belooft al een krachtige tool te zijn die veel gebruikt zal worden in de App Store.
Terwijl je hier bent, bekijk enkele van onze andere berichten over de ontwikkeling van iOS-apps en machine learning!