Începeți cu procesarea limbajului natural în iOS 11

Învățarea cu mașină a fost, fără îndoială, una dintre cele mai fierbinți subiecte din ultimul an, companiile de toate felurile încercând să-și facă produsele mai inteligente pentru a îmbunătăți experiențele utilizatorilor și pentru a-și diferenția ofertele. 

Acum, Apple a intrat în cursa pentru a oferi dezvoltatorului cu care se confruntă învățarea mașinilor. Core ML facilitează dezvoltatorilor să adauge învățarea în mașină profundă la aplicațiile lor.

Doar prin a arunca o privire la dispozitivul iOS, veți vedea învățarea mașinilor încorporate în aproape fiecare aplicație de sistem - cea mai evidentă fiind Siri. De exemplu, atunci când trimiteți mesaje text, Apple utilizează Procesarea limbajului natural (NLP) pentru a prezice cuvântul dvs. următor sau pentru a sugera inteligent o corecție în timp ce tastați un cuvânt. Asteptati-va ca invatarea mecanica si NLP sa continue sa devina tot mai prezente si mai ingradinate in utilizarea tehnologiei noastre, de la cautare la servicii pentru clienti. 

Obiectivele acestui tutorial

Acest tutorial vă va prezenta un subset de învățare în mașină: Procesarea limbajului natural (NLP). Vom analiza ceea ce este NLP și de ce merită implementat, înainte de a privi diferitele straturi sau scheme care alcătuiesc NLP. Acestea includ:

  • identificarea limbii
  • tokenizarea
  • parte a identificării vorbirii
  • numită recunoaștere a entității

După ce trece prin teoria NLP, vom pune cunoștințele noastre la practică prin crearea unui simplu client Twitter care analizează tweets. Continuați și clonați replica GitHub a tutorialului și aruncați o privire.

Cunoașterea presupusă

Acest tutorial presupune că sunteți un dezvoltator experimentat iOS. Deși vom lucra cu învățarea în mașină, nu trebuie să aveți niciun fundal în subiect. În plus, în timp ce alte componente ale Core ML necesită o anumită cunoaștere a Python, nu vom lucra cu niciun aspect legat de Python cu NLP. 

Introducere în învățarea în mașină și NLP

Scopul învățării mecanice este ca un computer să facă sarcini fără a fi programat în mod explicit să facă acest lucru - abilitatea de a gândi sau interpreta în mod autonom. Un caz de folosință contemporană de înaltă performanță este autovehiculul autonom: oferind mașinilor posibilitatea de a interpreta vizual mediul înconjurător și de a conduce vehicule fără ajutor. 

Dincolo de recunoașterea vizuală, învățarea în mașină a introdus de asemenea recunoașterea vorbirii, căutarea inteligentă pe web și multe altele. Cu Google, Microsoft, Facebook și IBM în fruntea popularizării procesului de învățare a mașinilor și punerii la dispoziția dezvoltatorilor obișnuiți, Apple a decis, de asemenea, să se mute în această direcție și să faciliteze integrarea în aplicații terțe. 

Core ML este nou pentru familia de SDK-uri Apple, introdusă ca parte a iOS 11 pentru a permite dezvoltatorilor să implementeze o mare varietate de moduri de învățare a mașinilor și tipuri de straturi de învățare profundă. 

Procesul de prelucrare a limbajului natural (NLP) se află în mod logic în cadrul Core ML, alături de alte două biblioteci puternice, Vision și GameplayKit. Vision oferă dezvoltatorilor abilitatea de a implementa învățarea mașinilor de vizionare a computerului pentru a realiza lucruri cum ar fi detectarea fețelor, reperelor sau a altor obiecte, în timp ce GameplayKit oferă dezvoltatorilor de jocuri instrumente pentru crearea de jocuri și caracteristici specifice de joc. 

În acest tutorial, ne vom concentra pe prelucrarea limbajului natural. 

Procesarea limbajului natural (NLP)

Procesarea limbajului natural este știința capacității de a analiza și de a înțelege textul, de a rupe propozițiile și cuvintele pentru a îndeplini sarcini precum analiza sentimentului, extracția relațiilor, rezultatul, rezumarea textului sau a frazei și multe altele. Sau pur și simplu, NLP este abilitatea computerelor de a înțelege limba umană în forma sa natural vorbită sau scrisă.

Abilitatea de a extrage și încapsula cuvinte și fraze contextual permite o integrare îmbunătățită între utilizatori și dispozitive, sau chiar între două dispozitive, prin bucăți semnificative de conținut. Vom explora în detaliu fiecare dintre aceste componente, dar în primul rând este important să înțelegeți de ce ați dori să implementați NLP.

De ce implementați procesarea limbajului natural? 

Întrucât companiile continuă să se bazeze pe stocarea și prelucrarea datelor importante, NLP permite interpretarea textului liber și nestructurat, făcându-l analizat. Cu multe informații stocate în fișiere text nestructurate - de exemplu în dosare medicale - NLP poate să treacă prin valori mari de date și să furnizeze date despre context, intenție și chiar sentimente. 

Dincolo de posibilitatea de a analiza textul scris și scris, NLP a devenit acum motorul din spatele roboților - de la cei din Slack, încât puteți avea aproape o conversație umană completă, cu instrumente pentru servicii pentru clienți. Dacă mergeți la site-ul de asistență al Apple și cereți să vorbiți cu serviciul pentru clienți, veți primi un bot web care vă va încerca să vă îndrepte în direcția corectă pe baza întrebării pe care ați solicitat-o. Îi ajută pe clienți să se simtă înțeleși în timp real, fără a avea nevoie să vorbească cu un om. 

Aruncând o privire asupra spam-urilor de e-mail și a filtrelor de spam, NLP a făcut posibilă înțelegerea mai bună a textului și o mai bună clasificare a e-mailurilor cu mai multă certitudine cu privire la intențiile lor. 

Sumarizarea este o tehnică importantă de NLP care oferă analiza sentimentului, lucru pe care companiile ar dori să-l folosească pe baza datelor din conturile lor sociale, pentru a urmări percepția produselor companiei. 

Aplicația Photos pe iOS 11 este un alt exemplu bun. Când căutați fotografii, învățarea automată funcționează pe mai multe nivele. Pe lângă faptul că utilizează învățarea în mașină și viziunea de a recunoaște chipul și tipul fotografiei (de ex., Plajă, locație), termenii de căutare sunt filtrați prin NLP, iar dacă căutați termenul "plaje", va căuta și fotografii care conțin descrierea " plajă'. Aceasta este numită lemmatizare și veți afla mai multe despre aceasta mai jos, deoarece învățăm să apreciem cât de puternică este învățarea mașinilor, dar cât de ușor vă ajută Apple să vă facă aplicațiile mai inteligente. 

Dacă aplicația dvs. înțelege mai bine, de exemplu, un șir de căutare, va fi capabil să interacționeze mai inteligent cu utilizatorii, înțelegând intenția din spatele termenului de căutare, decât să ia cuvântul în sensul său literal. Prin imbratisarea bibliotecii NLP a Apple, dezvoltatorii pot sprijini o abordare consecventă de procesare a textului și o experiență a utilizatorilor în întregul ecosistem Apple, de la iOS la macOS, tvOS și watchOS. 

Odată cu învățarea pe mașină efectuată pe dispozitiv, utilizatorii beneficiază prin utilizarea procesorului și GPU-ului dispozitivului pentru a furniza eficiență de performanță în calcul, în loc să acceseze API externe de învățare automată. Acest lucru permite ca datele utilizatorului să rămână pe dispozitiv și reduc latența din cauza accesului la rețea. Cu învățarea mașinilor care necesită o cunoaștere mai intimă a utilizatorilor pentru a deduce sugestii și predicții, capacitatea de a conține procesarea pe dispozitivul fizic și utilizarea confidențialității diferențiate pentru orice activități legate de rețea, puteți oferi o experiență inteligentă, dar neinvazivă pentru utilizatorii dvs.. 

Apoi, vom analiza machiajul motorului Apple Processing Natural Language.

Introducerea NSLinguisticTagger

Clasa fundamentală NSLinguisticTagger joacă un rol central în analizarea și etichetarea textului și a vorbirii, segmentarea conținutului în paragrafe, propoziții și cuvinte și este alcătuită din următoarele scheme:

  • identificarea limbii
  • tokenizarea
  • lemmatization
  • parte a discursului (PoS)
  • numită recunoaștere a entității

Când inițializați NSLinguisticTagger, treci în NSLinguisticTagScheme vă interesează analiza. De exemplu:

permiteți tagger = NSLinguisticTagger (tagSchemes: [.language, .tokenType, ...], opțiuni: 0)

Apoi, veți configura diferitele argumente și proprietăți, inclusiv trecerea în textul de intrare, înainte de a enumera prin NSLinguisticTagger obiect exemplu, extragerea entităților și jetoanelor. Să ne aruncăm mai adânc și să vedem cum să implementăm fiecare schemă, pas cu pas, începând cu schema de identificare a limbajului. 

Identificarea limbii

Primul tip de sistem de etichete, identificarea limbajului, încearcă să identifice limbajul BCP-47 cel mai proeminent la un nivel de document, paragraf sau teză. Puteți accesa această limbă accesând dominantLanguage proprietate a NSLinguisticTagger obiect exemplu:

... lasa tagger = NSLinguisticTagger (tagSchemes: [.language], optiuni: 0) ... tagger.string = "Câteva texte într-o limbă sau două" Letter = tagger.dominantLanguage //i.e "en".

Destul de direct. Apoi, vom analiza clasificarea textului folosind metoda de tokenizare.

tokenizarea

Tokenizarea este procesul de delimitare și, eventual, clasificarea secțiunilor unui șir de caractere de intrare. Jetoanele rezultate sunt apoi transmise unei alte forme de procesare. (Sursa: Wikipedia)

Luând un bloc de text, tokenizarea ar descompune logic și va clasifica textul în paragrafe, propoziții și cuvinte. Începem prin stabilirea schemei adecvate (.TokenType) pentru eticheta. Spre deosebire de schema anterioară, așteptăm rezultate multiple și trebuie să enumerăm prin etichetele returnate, după cum se arată în exemplul de mai jos:

permite tagger = NSLinguisticTagger (tagSchemes: [.tokenType], opțiuni: 0) tagger.string = textString lasă interval = NSRange (locație: 0, lungime: textString.utf16.count) punctuații lăsăm opțiunile: NSLinguisticTagger.Options = [.omitPunctuation, .omitWhitespace] // Am enumerat prin tagger, folosind proprietățile setate mai sus tagger.enumerateTags (în: interval, unitate: .word, schema: .tokenType, opțiuni: opțiuni) tag, tokenRange, stop in let token = (text ca NSString) .substring (cu: tokenRange) // Manipulați fiecare token (adică adăugați la array)

Acum avem o listă de cuvinte. Dar nu ar fi interesant să se obțină originile acelor cuvinte? De exemplu, dacă un utilizator caută un termen cum ar fi "plimbările" sau "mersul pe jos", ar fi foarte util să obținem cuvântul de origine, să mergem și să clasificăm toate aceste permutări ale "plimbării" împreună. Aceasta se numește lemmatizare și vom acoperi următorul lucru. 

Lemmatization 

Lemmatizarea grupează împreună formele inflexionate ale unui cuvânt care urmează să fie analizate ca un element singular, permițându-vă să deducem sensul dorit. În esență, tot ce trebuie să vă amintiți este că derivă forma dicționarului cuvântului.

Cunoașterea formei dicționarului a cuvântului este foarte puternică și permite utilizatorilor dvs. să caute cu mai multă "fuzziness". În exemplul anterior, considerăm că un utilizator caută termenul "mersul pe jos". Fără lemmatizare, veți putea să vă întoarceți numai mențiunile literale ale cuvântului respectiv, dar dacă ați putea lua în considerare alte forme ale aceluiași cuvânt, ați putea obține rezultate care menționează "plimbarea". 

Similar cu exemplul anterior, pentru a efectua lemmatizarea, am seta schema în inițierea tagger la .lemă, înainte de enumerarea etichetelor:

... tagger.enumerateTags (în: interval, unitate: .word, schema: .lemma, opțiuni: opțiuni) tag, tokenRange, stop în cazul în care lemma = tag? .RawValue // Manipulați fiecare articol lemma ... 

În continuare, vom examina o parte din etichetarea expresiei, care ne permite să clasificăm un bloc de text ca substantive, verbe, adjective sau alte părți. 

Parte a discursului (PoS)

O parte din etichetarea vorbirii urmărește să asocieze partea discursului la fiecare cuvânt specific, pe baza definiției și a contextului cuvântului (relația sa cu cuvinte adiacente și conexe). Ca element al NLP, o parte din tagging-ul de vorbire ne permite să ne concentrăm asupra substantivelor și verbelor, ceea ce ne poate ajuta să deducem intenția și semnificația textului. 

Punerea în aplicare a etichetei de vorbire implică stabilirea proprietății tagger pentru utilizare .lexicalClass, și enumerând în același mod demonstrat în exemplele anterioare. Veți obține o descompunere a propoziției dvs. în cuvinte, cu o etichetă asociativă pentru fiecare, clasificând cuvântul ca aparținând unui substantiv, preposition, verb, adjectiv sau determinator. Pentru mai multe informații despre ce înseamnă aceasta, consultați documentația Apple care acoperă tipurile Lexical. 

Un alt proces din stiva NLP a Apple este Recunoașterea entităților numite, care descompune blocuri de text, extragând tipuri specifice de entități care ne interesează, cum ar fi nume, locații, organizații și persoane. Să ne uităm la următoarea. 

Recunoașterea entității numită 

Recunoașterea entității numită este una dintre cele mai puternice componente de etichetare a clasificării NLP, permițându-vă să clasificați entități sau obiecte din lumea reală din propoziția dvs. (adică locații, persoane, nume). Ca utilizator de iPhone, ați fi văzut deja acest lucru în acțiune atunci când îi trimiteți prietenilor mesaje și ați observat anumite cuvinte cheie evidențiate, cum ar fi numere de telefon, nume sau date. 

Puteți implementa recunoașterea numelor entităților în mod similar celorlalte exemple, setând schema de etichete .nameType, și prin looping prin tagger de către un anumit interval. 

Apoi, veți pune ceea ce ați învățat în acțiune, cu o aplicație simplă care va lua un set predeterminat de tweets, pe măsură ce puneți fiecare tweet prin conducta NLP. 

Implementarea procesării limbajului natural

Pentru a încheia lucrurile, vom arunca o privire la o simplă aplicație client Twitter care recuperează cinci tweets într-o vizualizare de tabel și aplică unele procesări NLP pentru fiecare.

În următoarea captură de ecran, am folosit Recunoașterea numelor entităților NLP pentru a evidenția cu roșu cuvintele cheie ale entității (organizații, locații etc.).

Continuați și clonați proiectele TwitterNLPExample din reparația GitHub tutorial și examinați rapid codul. Clasa în care ne interesează mai mult este TweetsViewController.swift. Să aruncăm o privire la ei tableView (_tableView: cellForRowAt) metodă.

override func tableView (_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell // Retrieve celula Tweet. let cell = tableView.dequeueReusableCell (cuIdentifier: reuseIdentifier, pentru: indexPath) // Returnați modelul Tweet din Tweets încărcat. lasă tweet = tweets [indexPath.row] cell.textLabel? .text = tweet.text cell.detailTextLabel? .text = "Prin \ (tweet.author.screenName)." auto.range = NSRange (location: 0, length: (tweet.text.utf16.count)) self.detectLanguage (cu: cell.textLabel!) self.getTokenization (cu: cell.textLabel!) self.getNamedEntityRecognition cell.textLabel!) self.getLemmatizare (cu: cell.textLabel!) // Returnați celula Tweet. retur cell

Pentru fiecare celulă (tweet), numim patru metode pe care le vom defini în scurt timp: 

  • Detecteaza limba()
  • getTokenization ()
  • getNamedEntityRecognition ()
  • getLemmatization ()

Pentru fiecare dintre aceste metode, numim enumera metodă, trecerea în sistem și eticheta de text pentru a extrage textul, așa cum facem pentru a identifica limba:

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

În cele din urmă, enumera funcția în care se desfășoară toate acțiunile NLP, luând proprietățile și argumentele bazate pe tipul de procesare NLP pe care intenționăm să o facem și stocând rezultatele într-o serie de tabele pentru a le utiliza mai târziu. În scopul acestui exemplu, pur și simplu tipărim rezultatele în consola, pentru scopuri de observare. 

()) var var = [String] () var lemmas = [String] () permite etichete: [NSLinguisticTag] = [ .personalName, .nameName, .organizationName] permite tagger = NSLinguisticTagger (tagSchemes: [scheme], opțiuni: 0) tagger.string = label.text tagger.enumerateTags (în: interval !, unitate: .word, schema: : opțiune) tag, tokenRange, _ în switch (schemă) caz NSLinguisticTagScheme.lemma: if lemma = tag? .rawValue lemmas.append (lemma) break case NSLinguisticTagScheme.language: tagger.dominantLanguage "Undetermined")) caz de pauză NSLinguisticTagScheme.nameTip: dacă eticheta etichetă, tags.contains (tag) let name = (label.text! ca NSString) .substring (cu: tokenRange) "(nume)) caz break_name NSLinguisticTagScheme.lexicalClass: break case NSLinguisticTagScheme.tokenType: dacă permiteți tagVal = tag? .rawValue tokens.append (tagVal.lowercased () (nume_integradat) dacă schema == .nameType) let keywordAttrString = NSMutableAttributedString (șir: tagger.string !, atribute: nil) ) pentru i în indici (lasă interval = NSRange (i ... 

Pentru .nameType Denumită schemă de recunoaștere a entităților, luăm cuvintele cheie ale entității pe care le extragem și treceți pentru a evidenția cuvintele care se potrivesc acelor entități. Puteți chiar să faceți un pas mai departe și să faceți acele linkuri de cuvinte cheie - poate căutați pentru tweets care se potrivesc cu acele cuvinte cheie. 

Continuați și construiți și rulați aplicația și aruncați o privire la ieșire, acordând o atenție deosebită lemelor și entităților pe care le-am extras. 

Concluzie

De la Google, care utilizează procesarea limbajului natural în motoarele sale de căutare, la robotii de mesagerie Siri ai Apple și Facebook, nu există nicio îndoială că acest domeniu crește exponențial. Dar NLP și Machine Learning nu mai sunt domeniul exclusiv al companiilor mari. Prin introducerea cadrului MLM la începutul acestui an, Apple a facilitat dezvoltatorilor de zi cu zi, fără a avea un background în învățarea profundă, pentru a putea adăuga inteligență în aplicațiile lor.

În acest tutorial, ați văzut cum, cu câteva linii de cod, puteți utiliza Core ML pentru a deduce contextul și intenția de la propoziții și paragrafe nestructurate, precum și pentru a detecta limba dominantă. Vom vedea îmbunătățiri viitoare în viitoarele iterații ale SDK-ului, însă NLP promite deja că va fi un instrument puternic care va fi utilizat pe scară largă în App Store.

În timp ce sunteți aici, verificați câteva dintre celelalte postări despre dezvoltarea aplicațiilor iOS și învățarea în mașină!

Cod