Cum de a codifica procesarea limbajului natural pe Android cu IBM Watson

Datorită valului în creștere al inteligenței artificiale, utilizatorii în aceste zile au ajuns să aștepte aplicații care sunt atât de inteligente și conștiente de contextele în care sunt folosite. IBM Watson oferă o varietate de servicii legate de limbajul natural pe care le puteți utiliza pentru a crea astfel de aplicații.

De exemplu, puteți utiliza serviciul de înțelegere a limbajului natural pentru a extrage cuvinte cheie, entități, sentimente și multe alte detalii semantice din orice text citit de utilizator. Și dacă textul se întâmplă să fie într-o limbă străină, puteți utiliza serviciul Traducător de limbă pentru a identifica limba și ao traduce într-o limbă pe care utilizatorul o înțelege.

În acest tutorial, vă voi prezenta câteva dintre aceste servicii, arătându-vă cum să creați o aplicație care să traducă paginile web în limba engleză și să extragă sentimente, entități importante și emoții de la ei.

Înainte de a continua, vă sugerăm să citiți următorul tutorial introductiv privind serviciile IBM Watson:

1. Activarea serviciilor

Vom lucra astăzi cu trei servicii Watson și fiecare dintre ele trebuie activat separat. Deci, deschideți tabloul de bord IBM Bluemix și apăsați pe Crea buton.

Primul serviciu pe care îl vom activa este Conversia documentelor care ne permite să convertim documente HTML, PDF și DOCX în text simplu sau JSON. Selectați-l din catalog, dați-i un nume semnificativ și apăsați pe Crea buton.

Apoi, reveniți la catalog și alegeți Traducător de limbă serviciu. Sprijină câteva limbi vorbite pe scară largă și poate, în mod implicit, să se ocupe de text în trei domenii: știri, conversații și brevete. În timp ce primele două domenii sunt adecvate pentru majoritatea textelor, ultimul domeniu poate fi mai precis pentru textele care conțin o mulțime de termeni tehnici sau legali.

În pagina de configurare, dați serviciului un nume semnificativ și apăsați pe Crea buton.

Reveniți la catalog și alegeți Înțelegerea limbii naturale serviciu. Vom folosi acest serviciu pentru a extrage sentimente, entități și emoții din textul nestructurat. Din nou, dați-i un nume semnificativ în ecranul de configurare și apăsați pe Crea buton.

Dacă deschideți acum tabloul de bord, ar trebui să vedeți ceva de genul:

Toate cele trei servicii au acreditări unice de conectare asociate cu acestea. Trebuie să le notezi pe toate, pentru că le vei avea nevoie mai târziu. Pentru a determina acreditările oricărui serviciu, selectați-l pe tabloul de bord, deschideți-l Serviciul de acreditare și apăsați butonul Vizualizați acreditările buton.

2. Configurarea proiectului

Pentru a putea utiliza aceste trei servicii într-un proiect Android Studio, trebuie să adăugăm Watson Java SDK ca un punerea în aplicare dependența în aplicaţia ale modulului build.gradle fişier.

implementare 'com.ibm.watson.developer_cloud: java-sdk: 3.9.1'

În plus, vom folosi biblioteca de combustibil ca un client HTTP, deci adăugați-l și ca un punerea în aplicare dependenţă.

implementare "com.github.kittinunf.fuel: fuel-android: 1.10.0 '

Ambele combustibil și Watson Java SDK pot funcționa numai dacă aplicația noastră are INTERNET permisiune, așa că cereți-o în fișierul manifest.

Apoi, adăugați  etichetele care conțin numele de utilizator și parolele tuturor celor trei servicii către strings.xml fişier.

USERNAME1 password1 USERNAME2 password2 USERNAME3 PASSWORD3

În cele din urmă, pentru a păstra concise codul nostru, în acest tutorial vom folosi Kotlin în loc de Java, deci asigurați-vă că ați activat suportul Kotlin.

3. Utilizarea serviciului de conversie a documentelor

Vom folosi serviciul Watson Document Conversion pentru a converti paginile web HTML în text simplu. Pentru a permite utilizatorului să introducă o adresă de pagină web, adăugați-o Editează textul widget pentru aspectul activității dvs. În plus, includeți a TextView widget pentru a afișa conținutul paginii web ca text simplu. Pentru a vă asigura că conținutul paginilor web lungi nu este trunchiat, vă sugerez să le plasați în interiorul a ScrollView widget.

   

În codul de mai sus, puteți vedea că imeOptions atributul Editează textul widgetul este setat la actionGo. Acesta permite utilizatorilor să apese un buton "Go" pe tastatura lor virtuală după terminarea introducerii adresei. Pentru a asculta acel eveniment de apăsare a butonului, adăugați următorul cod Kotlin la activitățile dvs. onCreate () metodă:

documentURL.setOnEditorActionListener _, action, _ -> if (action == EditorInfo.IME_ACTION_GO) // Mai mult cod aici false

În interiorul ascultătorului evenimentului, primul lucru pe care trebuie să-l facem este să determinați adresa URL introdusă de utilizator. Putem face acest lucru ușor accesând text proprietate a Editează textul widget. Odată ce avem adresa URL, putem folosi combustibilul httpGet () de descărcare a conținutului paginii web.

Pentru că vrem httpGet () pentru a rula în mod asincron, trebuie să adăugăm un apel invers la acesta folosind responseString () , care ne permite, de asemenea, să procesăm conținutul descărcat ca un șir.

val url: String = documentURL.text.toString () url.httpGet (). răspunsString _, _, rezultat -> val (document, _) = rezultat dacă (err == null)

Acum este momentul să creați o instanță a DocumentConversion care are toate metodele de care avem nevoie pentru a interacționa cu serviciul de conversie a documentelor. Constructorul său așteaptă o dată de versiune împreună cu datele de conectare ale serviciului.

val documentConverter = DocumentConversion (documentConversion.VERSION_DATE_2015_12_01, resources.getString (R.string.document_conversion_username), resources.getString (R.string.document_conversion_password))

SDK-ul Watson Java nu ne permite să trecem direct șiruri de caractere la serviciul de conversie a documentelor. Are nevoie Fişier obiecte în schimb. De aceea, să creăm un fișier temporar folosind createTempFile () metodă a Fişier clasă și scrieți conținutul paginii web pe care am descărcat-o folosind writeText () metodă.

val tempFile = File.createTempFile ("temp_file", null) tempFile.writeText (document, Charsets.UTF_8)

În acest moment, putem apela convertDocumentToText () și treceți fișierul temporar la acesta pentru a începe conversia. Metoda se așteaptă de asemenea la tipul MIME al fișierului temporar, deci nu uitați să îl includeți. Odată ce conversia este completă, puteți afișa textul simplu prin simpla atribuire acestuia text proprietate a TextView widget.

Următorul cod vă arată cum să efectuați conversia într-un fir nou și să actualizați TextView în thread-ul utilizatorului de interfață:

AsyncTask.execute val plainText = documentConverter.convertDocumentToText (tempFile, "text / html") .execute () runOnUiThread documentContents.text = plainText

Puteți rula aplicația acum și introduceți adresa URL a unei pagini web germane pentru a vedea serviciul de conversie a documentelor care funcționează.

4. Utilizarea serviciului de traducători de limbi

Cu serviciul Traducător de limbi, vom converti acum textul simplu, în germană, în limba engleză.

În loc să actualizăm aspectul nostru, pentru a permite utilizatorului să pornească manual traducerea, să adăugăm un meniu activității noastre. Pentru a face acest lucru, începeți prin a crea un nou fișier de resurse de meniu și adăugați următorul cod:

    

După cum puteți vedea, codul de mai sus creează un meniu cu două opțiuni: traduce și analizează. În acest pas, vom lucra numai cu prima opțiune.

Pentru a face meniul, trebuie să îl umflăm înăuntru onCreateOptionsMenu () metodă a activității noastre.

suprascrie distracția onCreateOptionsMenu (meniu: Meniu?): Boolean menuInflater.inflate (R.menu.my_menu, meniu) returnează super.onCreateOptionsMenu (meniu)

Prin suprimarea onOptionsItemSelected () , putem să știm când utilizatorul utilizează meniul. În plus, putem determina elementul pe care utilizatorul l-a apăsat prin verificarea ID-ul itemului. Următorul cod verifică dacă utilizatorul a ales opțiunea de traducere.

suprascrie fun onOptionsItemSelected (item: MenuItem?): Boolean if (element? .itmId == R.id.action_translate) // Mai mult cod aici return true

La fel ca serviciul de documentare, serviciul Traducător de limbă are și o clasă dedicată care ne permite să interacționăm cu el. După cum probabil ați ghicit, se numește LanguageTranslator. Pentru a crea o instanță a clasei, trebuie să transmitem constructorului numai datele de autentificare ale serviciului.

val translator = LimbaTranslator (resources.getString (R.string.language_translator_username), resources.getString (R.string.language_translator_password))

Clasa are a Traduceți() metoda pe care o putem folosi acum pentru a traduce textul nostru german în limba engleză. Ca argumente, se așteaptă ca textul să fie tradus ca un șir, limba curentă a textului și limba dorită.

După terminarea traducerii, vom avea acces la un TranslationResult obiect al cărui firstTranslation proprietate conține textul tradus.

Următorul cod vă arată cum să efectuați traducerea și să redați rezultatul în TextView widget.

AsyncTask.execute val translatedDocument = traducator .translate (documentContents.text .toString (), Language.GERMAN, Language.ENGLISH) .execute () runOnUiThread documentContents.text = tradusDocument .firstTranslation

Acum puteți rula din nou aplicația, tastați adresa URL a unei pagini web germane și utilizați meniul pentru a traduce conținutul acesteia în limba engleză.

5. Utilizarea serviciului de înțelegere a limbajului natural

În cele din urmă, pentru a efectua o analiză semantică a textului tradus și a extrage diverse detalii importante din acesta, putem folosi NaturalLanguageUnderstanding clasă, care servește drept client pentru serviciul de înțelegere a limbajului natural.

Următorul cod vă arată cum să inițializați clientul numai atunci când utilizatorul apasă a doua opțiune a meniului pe care l-am creat în pasul anterior:

dacă elementul .itemId == R.id.action_analyze) val analyzer = NaturalLanguageUnderstanding (NaturalLanguageUnderstanding.VERSION_DATE_2017_02_27, resources.getString (R.string.natural_language_understanding_username), resources.getString (R.string.natural_language_understanding_password)) // Mai mult cod aici 

În comparație cu celelalte servicii legate de limbajul natural, utilizarea serviciului de înțelegere a limbajului natural este puțin mai implicat, în primul rând pentru că are un număr mare de caracteristici.

Pentru moment, să spunem că vrem să determinăm sentimentul general al textului tradus și să extragem toate entitățile majore pe care le menționează. Fiecare entitate în sine poate avea o emoție și sentiment asociate cu ea, deci să spunem că vrem să le extragem și pe acestea.

Pentru a spune serviciului că vrem să extragem toate entitățile și emoțiile și sentimentele asociate cu ele, avem nevoie de un EntitiesOptions obiect, care poate fi creat folosind EntitiesOptions.Builder clasă.

val entităOptions = EntitiesOptions.Builder () .emotion (true) .sentiment (true) .build ()

În mod similar, pentru a spune serviciului că vrem sentimentul general al textului, avem nevoie de o SentimentOptions obiect.

val sentimentOptions = SentimentOptions.Builder () .document (true) .build ()

SentimentOptions și EntitiesOptions obiectele trebuie acum grupate împreună pentru a forma o Caracteristici obiect, care poate fi folosit pentru a compune un AnalyzeOptions obiect. AnalyzeOptions obiect este cel mai important dintre toate obiectele de mai sus, deoarece aici specificați textul pe care doriți să îl analizați.

(*) valută = Funcții. Builder () .entities (entitoneOptions) .sentiment (sentimentOptions) .build () val analyzerOptions = AnalyzeOptions.Builder () .text (documentContents.text.toString

Odata ce AnalyzeOptions obiect este gata, putem trece de ea a analiza() metodă pentru a începe analiza.

AsyncTask.execute val rezultatele = analyzer.analyze (analyzerOptions) .execute () // Mai mult cod aici

Rezultatul analizei este un AnalysisResults obiect, conținând toate informațiile pe care le-am cerut.

Pentru a determina sentimentul general al textului, mai întâi trebuie să extragem scorul general al sentimentului folosind sentiment.document.score proprietate. Un scor al sentimentului nu este altceva decât un număr în virgulă mobilă. Dacă e zero, sentimentul e neutru. Dacă este negativă sau pozitivă, sentimentul este prea negativ sau pozitiv.

val globalSentimentScore = results.sentiment.document.score Var globalSentiment = "Pozitiv" dacă (globalSentimentScore < 0.0) overallSentiment = "Negative" if(overallSentimentScore == 0.0) overallSentiment = "Neutral" var output = "Overall sentiment: $overallSentiment\n\n"

Apoi, prin bucle prin entități listă prezentă în AnalysisResults obiect, putem procesa fiecare entitate individual. În mod implicit, fiecare entitate are un tip asociat cu aceasta. De exemplu, serviciul poate spune dacă o entitate este o persoană, o companie sau un vehicul. În prezent, poate identifica peste 450 de tipuri diferite de entități.

Pentru că le-am cerut, fiecare entitate va avea acum un scor de sentiment și emoții asociate cu ea.

Putem determina scorul sentimentului folosind pur și simplu sentiment.score proprietate. Determinarea emoției asociate cu o entitate, cu toate acestea, nu este la fel de simplă. Watson susține în prezent cinci emoții: furie, bucurie, dezgust, teamă și tristețe. Fiecare entitate va avea toate cele cinci emoții, dar valori diferite asociate cu fiecare dintre ele, specificând cât de încrezător este serviciul că emoția este corectă. Prin urmare, pentru a determina emoția corectă, trebuie să alegem cea cu cea mai mare valoare.

Următorul cod afișează fiecare entitate împreună cu tipul, scorul sentimentului și emoția:

pentru (entitate în rezultate.entities) output + = "$ entity.text ($ entity.type) \ n" val validEmotions = arrayOf (" , "Tristețe") val emotionValues ​​= arrayOf (entity.emotion.anger, entity.emotion.joy, entity.emotion.disgust, entity.emotion.fear, entity.emotion.sadness) val currentEmotion = validEmotions [emotionValues.indexOf (emotionValues .max ()]] ieșire + = "Emoție: $ currentEmotion," + "Sentiment: $ entity.sentiment.score" + "\ n \ n"

Pentru a afișa ieșirea generată, putem actualiza din nou TextView widget.

runOnUiThread documentContents.text = output

În acest moment, puteți rula aplicația din nou pentru a vedea toate cele trei servicii care lucrează împreună.

Concluzie

Acum știți cum să utilizați trei dintre cele mai utilizate servicii de limbă naturală pe care Watson le oferă. În acest tutorial, ați văzut de asemenea cât de ușor este să utilizați programul SDK Watson Java pentru a face toate serviciile să colaboreze pentru a crea o aplicație inteligentă pentru Android.

Pentru a afla mai multe despre servicii și setul SDK, vă puteți referi la depozitul GitHub al SDK-ului. Și pentru a afla mai multe despre utilizarea tehnologiei de învățare Watson în propriile aplicații, consultați câteva dintre celelalte postări de aici pe Envato Tuts+!

Cod