Maskininnlæring har utvilsomt vært et av de heteste emnene i løpet av det siste året, med selskaper av alle slag som prøver å gjøre sine produkter mer intelligente for å forbedre brukeropplevelsene og skille deres tilbud.
Nå har Apple gått i løpet for å gi utvikler-vendt maskinlæring. Core ML gjør det enkelt for utviklere å legge til dyp maskinlæring til sine apps.
Bare ved å ta en titt på iOS-enheten din, ser du maskinlæring innlemmet i nesten alle systemapp-det mest åpenbare å være Siri. For eksempel, når du sender tekstmeldinger, bruker Apple Natural Language Processing (NLP) til å enten forutsi ditt neste ord eller foreslå en korrekt korreksjon mens du skriver et ord. Forventer maskinlæring og NLP å fortsette å bli stadig tilstedeværende og videre innblandet i vår bruk av teknologi, fra søk til kundeservice.
Denne opplæringen vil introdusere deg til en delmengde maskinlæring: Natural Language Processing (NLP). Vi vil dekke hva NLP er og hvorfor det er verdt å implementere, før du ser på de forskjellige lagene eller ordene som utgjør NLP. Disse inkluderer:
Etter å ha gjennomgått NLP-teorien, vil vi sette vår kunnskap til praksis ved å lage en enkel Twitter-klient som analyserer tweets. Gå videre og klone opplæringen GitHub repo og ta en titt.
Denne opplæringen forutsetter at du er en erfaren iOS-utvikler. Selv om vi skal jobbe med maskinlæring, trenger du ikke å ha noen bakgrunn i emnet. I tillegg, mens andre komponenter i Core ML krever litt kunnskap om Python, vil vi ikke jobbe med noen Python-relaterte aspekter med NLP.
Målet med maskinlæring er at en datamaskin skal utføre oppgaver uten å være eksplisitt programmert for å gjøre det - evnen til å tenke eller tolke autonomt. Et høyt profilert, moderne brukstilfelle er autonom kjøring: gir bilene muligheten til å visuelt tolke sitt miljø og kjøre uten hjelp.
Utover visuell anerkjennelse har maskinlæring også innført talegjenkjenning, intelligent nettsøk og mer. Med Google, Microsoft, Facebook og IBM i forkant av populariserende maskinlæring og gjør den tilgjengelig for vanlige utviklere, har Apple også bestemt seg for å bevege seg i den retningen og gjøre det enklere for maskinlæring å bli innlemmet i tredjepartsprogrammer.
Core ML er nytt for Apples familie av SDKs, introdusert som en del av iOS 11 for å tillate utviklere å implementere et stort utvalg av maskininnlæringsmoduser og dype lærlagtyper.
Natural Language Processing (NLP) sitter logisk innenfor Core ML-rammen sammen med to andre kraftige biblioteker, Vision and GameplayKit. Vision gir utviklere muligheten til å implementere datasystemmaskinlæring for å utføre ting som å oppdage ansikter, landemerker eller andre objekter, mens GameplayKit gir spillutviklere verktøy for forfatterspill og spesifikke spillfunksjoner.
I denne opplæringen vil vi fokusere på Natural Language Processing.
Natural Language Processing er vitenskapen om å kunne analysere og forstå tekst, bryte ned setninger og ord for å utføre oppgaver som sentimentanalyse, forholdsutvinning, stemming, tekst eller setningsoppsummering og mer. Eller for å si det enkelt, er NLP muligheten for at datamaskiner skal forstå menneskers språk i sin naturlig eller skrevne form.
Evnen til å trekke ut og inkapslere ord og setninger kontekstuelt muliggjør forbedret integrasjon mellom brukere og enheter, eller til og med mellom to enheter, gjennom meningsfulle biter av innhold. Vi vil snart utforske hver av disse komponentene, men for det første er det viktig å forstå hvorfor du vil implementere NLP.
Med bedrifter som fortsetter å stole på lagring og behandling av store data, muliggjør NLP tolkningen av fri og ustrukturert tekst, noe som gjør det analyserbart. Med mye informasjon lagret i ustrukturerte tekstfiler - i medisinske journaler, kan NLP, for eksempel, seile seg gjennom trover av data og gi data om kontekst, hensikt og til og med følelse.
Utover å kunne analysere muntlig og skriftlig tekst, har NLP nå blitt motoren bak roboter - fra de i Slack som du nesten kan ha en komplett menneskelig samtale med, til verktøy for kundeservice. Hvis du går til Apples støtteside og ber om å snakke med kundeservice, vil du bli presentert med en web bot som vil prøve og peke deg i riktig retning basert på spørsmålet du har spurt. Det hjelper kundene til å føle seg forstått i sanntid, uten at de faktisk trenger å snakke med et menneske.
Ta en titt på e-postspam og spamfiltre, NLP har gjort det mulig å forstå tekst bedre, og bedre klassifisere e-post med større sikkerhet om deres hensikt.
Oppsummering er en viktig NLP-teknikk for å gi sentimentanalyse, noe som selskapene vil ønske å ansette på data fra sine sosiale medier, for å spore oppfattelsen av selskapets produkter.
Bilder-appen på iOS 11 er et annet godt eksempel. Når du søker etter bilder, fungerer maskinlæring på flere nivåer. I tillegg til å bruke maskinlæring og visjon for å gjenkjenne ansiktet og typen foto (dvs. strand, plassering), filtreres søkeordene gjennom NLP, og hvis du søker etter begrepet 'strender', vil det også søke etter bilder som inneholder beskrivelsen ' Strand'. Dette kalles lemmatisering, og du vil lære mer om dette under, da vi lærer å sette pris på hvor kraftig maskinlæring er, men hvor lett Apple gjør det for deg å gjøre appene dine mer intelligente.
Med appen din som har bedre forståelse av for eksempel en søkestreng, vil den kunne samhandle mer intelligent med brukerne, forstå hensikten bak søkeordet i stedet for å ta ordet i bokstavelig forstand. Ved å omfavne Apples NLP-bibliotek kan utviklere støtte en konsistent tekstbehandlingsmetode og brukeropplevelse over hele Apples økosystem, fra iOS til macOS, tvOS og watchOS.
Med maskinlæring utført på enheten, nyter brukere ved å utnytte enhetens CPU og GPU for å levere ytelseseffektivitet i beregninger, i stedet for å få tilgang til eksterne maskinlærings-APIer. Dette gjør at brukerdata forblir på enheten og reduserer ventetid på grunn av nettverkstilgang. Med maskinlæring som krever en mer intim kunnskap om brukere for å utlede forslag og spådommer, å kunne inneholde behandling til den fysiske enheten og bruke differensial personvern for alle nettverksrelaterte aktiviteter, kan du gi en intelligent, men ikke-invasiv opplevelse for brukerne dine.
Neste, vi tar en titt på sminke av Apples Natural Language Processing-motor.
Den grunnleggende klassen NSLinguisticTagger spiller en sentral rolle i analysering og merking av tekst og tale, segmentering av innhold i avsnitt, setninger og ord og består av følgende ordninger:
Når du initialiserer NSLinguisticTagger
, du passerer i NSLinguisticTagScheme
du er interessert i å analysere. For eksempel:
la tagger = NSLinguisticTagger (tagSchemes: [.language, .tokenType, ...], alternativer: 0)
Du vil da sette opp de forskjellige argumentene og egenskapene, inkludert passering i inntastingen, før du teller gjennom NSLinguisticTagger
eksempelobjekt, utvinning av enheter og tokens. La oss dykke dypere og se hvordan du implementerer hvert av systemene, steg for steg, starter med språkidentifikasjonsordningen.
Den første merketypen, språkidentifikasjon, forsøker å identifisere BCP-47-språket mest fremtredende på enten et dokument, et avsnitt eller et setningsnivå. Du kan hente dette språket ved å få tilgang til dominantLanguage
eiendom av NSLinguisticTagger
eksempel objekt:
... Tag tagger = NSLinguisticTagger (tagSchemes: [.language], alternativer: 0) ... tagger.string = "Enkelte tekst på et språk eller to" la språk = tagger.dominantLanguage //i.e "no" returnert til engelsk.
Ganske rett fram. Deretter ser vi på å klassifisere tekst ved hjelp av tokeniseringsmetoden.
Tokenisering er prosessen med å avgrense og muligens klassifisere deler av en streng med inntastingsfigurer. De resulterende tokens blir deretter videreført til en annen form for behandling. (Kilde: Wikipedia)
Med en blokk med tekst, vil tokenisering logisk dekomponere og klassifisere den teksten i avsnitt, setninger og ord. Vi starter med å sette riktig ordning (.tokenType
) for taggeren. I motsetning til forrige ordning, forventer vi flere resultater, og vi må oppregne gjennom de returnerte kodene, som illustrert i eksemplet nedenfor:
la tagger = NSLinguisticTagger (tagSchemes: [.tokenType], alternativer: 0) tagger.string = textString let range = NSRange (plassering: 0, lengde: textString.utf16.count) // Angi forskjellige alternativer, for eksempel å ignorere hvite mellomrom og tegnsetting lar alternativene: NSLinguisticTagger.Options = [.omitPunctuation, .omitWhitespace] // Vi teller gjennom taggeren, ved hjelp av egenskapene som er angitt ovenfor tagger.enumerateTags (i: rekkevidde, enhet: .word, skjema: .tokenType, alternativer: alternativer) tag, tokenRange, stopp i let token = (tekst som NSString) .ubstring (med: tokenRange) // Håndter hvert token, (dvs. legg til i array)
Nå har vi en liste over ord. Men ville det ikke være interessant å få opprinnelsen til disse ordene? For eksempel, hvis en bruker søker etter et begrep som "går" eller "går", ville det være veldig nyttig å få opprinnelsesordet, 'gå' og klassifisere alle disse permutasjonene av 'walk' sammen. Dette kalles lemmatisering, og vi vil dekke det neste.
Lemmatisering grupperer sammen de bøyede formene av et ord som skal analyseres som en singular gjenstand, slik at du kan utlede den tilsiktede betydningen. I hovedsak er alt du trenger å huske at det er å avlede ordboksformen av ordet.
Å vite ordboksformen av ordet er veldig kraftig og lar brukerne søke med større "fuzziness". I det forrige eksempelet vurderer vi en bruker som søker etter begrepet 'walking'. Uten lemmatisering ville du bare kunne returnere bokstavelige nevnelser av det ordet, men hvis du var i stand til å vurdere andre former for samme ord, ville du også kunne få resultater som nevner 'walk'.
På samme måte som forrige eksempel, for å utføre lemmatisering, ville vi sette ordningen i taggerinitialiseringen til .lemma
, før deumerering av kodene:
... tagger.enumerateTags (i: rekkevidde, enhet: .word, skjema: .lemma, alternativer: alternativer) tag, tokenRange, stopp inn hvis la lemma = tag? .RawValue // Håndter hvert lemma element ...
Neste opp, vi ser på en del av talemerking, som tillater oss å klassifisere en blokk med tekst som substantiver, verb, adjektiver eller andre deler.
En del av talemerking tar sikte på å knytte delen av talen til hvert bestemt ord, basert på både ordets definisjon og kontekst (dets forhold til nærliggende og beslektede ord). Som et element i NLP, gir en del av talemerking oss mulighet til å fokusere på substantivene og verbene, noe som kan hjelpe oss med å oppnå hensikten og meningen med teksten.
Implementering av en del av talemerking innebærer å sette inn taggeregenskapen som skal brukes .lexicalClass
, og opptelling på samme måte som vist i de foregående eksemplene. Du vil få en dekomponering av setningen din i ord, med en tilknyttende kode for hver, som klassifiserer ordet som tilhører et substantiv, preposisjon, verb, adjektiv eller determiner. For mer informasjon om hva dette betyr, kan du se Apples dokumentasjon som dekker Lexical-typer.
En annen prosess i Apples NLP-stabel er Named Entity Recognition, som dekomponerer tekstblokker, utvider bestemte entitetstyper som vi er interessert i, for eksempel navn, steder, organisasjoner og mennesker. La oss se på det neste.
Navngitt Entity Recognition er en av de kraftigste komponentene for NLP-klassifisering, slik at du kan klassifisere navngitte virkelige enheter eller objekter fra setningen din (dvs. steder, personer, navn). Som iPhone-bruker, ville du allerede ha sett dette i aksjon når du tekst dine venner, og du ville ha observert bestemte søkeord uthevet, for eksempel telefonnumre, navn eller datoer.
Du kan implementere Named Entity Recognition på en lignende måte som våre andre eksempler, og sette inn ordstedsordningen til .nameType
, og looping gjennom taggeren av et bestemt utvalg.
Deretter legger du til hva du lærte til handling, med en enkel app som vil ta et forhåndsbestemt sett med tweets, mens du legger hver tweet gjennom NLP-rørledningen.
For å pakke opp ting, ser vi på en enkel Twitter klientapp som henter fem tweets i en tabellvisning og bruker noen NLP-behandling for hver enkelt.
I det følgende skjermbildet brukte vi NLPs Named Entity Recognition til å markere nøkkelordene (organisasjoner, steder etc.) i rødt.
Fortsett og klon TwitterNLPExample-prosjektet fra opplæringen GitHub repo og ta en rask titt på koden. Klassen vi er mest interessert i er TweetsViewController.swift
. La oss ta en titt på det tableView (_ tableView: cellForRowAt)
metode.
overstyr func tableView (_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell // Hent Tweet-cellen. la cellen = tableView.dequeueReusableCell (withIdentifier: reuseIdentifier, for: indexPath) // Hent Tweet-modellen fra lastede Tweets. la tweet = tweets [indexPath.row] cell.textLabel? .text = tweet.text cell.detailTextLabel? .text = "Av \ (tweet.author.screenName)." self.range = NSRange (plassering: 0, lengde: (tweet.text.utf16.count)) self.detectLanguage (med: cell.textLabel!) self.getTokenization (med: cell.textLabel!) self.getNamedEntityRecognition (med: cell.textLabel!) self.getLemmatization (med: cell.textLabel!) // Returnere Tweet-cellen. returcelle
For hver celle (tweet), kaller vi fire metoder som vi skal definere kort tid:
oppdage språk()
getTokenization ()
getNamedEntityRecognition ()
getLemmatization ()
For hver av disse metodene kaller vi nummerere
metode, passerer i ordningen og tekstetiketten for å trekke ut teksten, som vi gjør for å identifisere språket:
func detectLanguage (med tekstLabel: UILabel) la _ = oppsummering (skjema: .language, label: textLabel)
Endelig, den nummerere
Funksjonen er hvor all NLP-handlingen virkelig skjer, tar i egenskapene og argumentene basert på typen NLP-prosessering vi har til hensikt å gjøre, og lagrer resultatene i arrays for at vi senere skal bruke. I dette eksemplet skriver vi ut resultatene til konsollen, for observasjonsformål.
Funksjonsbeskrivelse (skjema: NSLinguisticTagScheme, etikett: UILabel) -> [String]? var søkeord = [String] () var tokens = [String] () var lemmas = [String] () la tags: [NSLinguisticTag] = [ .personalnavn, .stednavn, .organiseringnavn] let tagger = NSLinguisticTagger (tagSchemes: [skjema], alternativer: 0) tagger.string = label.text tagger.enumerateTags (i: rekkefølge !, enhet: .ord, skjema: skjema, alternativer : alternativer) tag, tokenRange, _ i bytte (skjema) tilfelle NSLinguisticTagScheme.lemma: hvis la lemma = tag? .rawValue lemmas.append (lemma) brekkaske NSLinguisticTagScheme.language: print ("Dominant language: \ tagger.dominantLanguage ?? "Ubestemt") ") pause tilfelle NSLinguisticTagScheme.nameType: hvis la tag = tag, tags.contains (tag) la navn = (label.text! as NSString) .substring (med: tokenRange) print "enhet: \ (navn)") søkeord.append (navn) pause sak NSLinguisticTagScheme.lexicalClass: pause sak NSLinguisticTagScheme.tokenType: hvis la tagVal = tag? .rawValue tokens.append (tagVal.lowercased ()) bryte standard: pause hvis (skjema == .nameType) la keywordAttrString = NSMutableAttributedString (streng: tagger.string !, attributter: null) for navn i søkeord hvis la indeks = label.text? .indicesOf (streng: navn ) for jeg i indekser la range = NSRange (jeg ...For
.nameType
Navngitt Entity Recognition Scheme, tar vi enhetens søkeord vi hentet ut og går gjennom for å markere ordene som samsvarer med disse enhetene. Du kan til og med ta det et skritt videre og gjøre disse søkeordene koblinger - kanskje for å søke etter tweets som matcher disse søkeordene.Fortsett å bygge og kjøre appen og se på utdataene, og ta særlig hensyn til lemmene og enheter vi har hentet ut.
Konklusjon
Fra Google bruker Natural Language Processing i sine søkemotorer til Apples Siri og Facebook's messenger bots, er det ingen tvil om at dette feltet vokser eksponentielt. Men NLP og Machine Learning er ikke lenger det eksklusive domenet til store selskaper. Ved å introdusere Core ML-rammeverket tidligere i år har Apple gjort det enkelt for hverdagsutviklere uten bakgrunn i dyp læring for å kunne legge til intelligens i sine apper.
I denne veiledningen så du hvordan med noen linjer med kode du kan bruke Core ML til å avlede kontekst og hensikt fra ustrukturerte setninger og avsnitt, samt oppdage det dominerende språket. Vi vil se ytterligere forbedringer i fremtidige iterasjoner av SDK, men NLP lover allerede å være et kraftig verktøy som vil bli mye brukt i App Store.
Mens du er her, sjekk ut noen av våre andre innlegg på IOS app utvikling og maskin læring!