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:
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.
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.
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ă.
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ă.
Î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ă.
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+!