Begin 2011 kon een computersysteem met natuurlijke taalbegrip, IBM Watson, alle menselijke deelnemers verslaan in een quiz-achtige spelshow genaamd Jeopardy! Het was een historische gebeurtenis en was misschien het punt toen het grote publiek begon te beseffen dat kunstmatige intelligentie niet langer het spul van science fiction was.
Destijds draaide Watson op een supercomputer en kon weinig meer doen dan vragen over trivia beantwoorden. Tegenwoordig is het echter omgevormd tot een veel veelzijdiger systeem en veel van zijn mogelijkheden zijn beschikbaar via de cloud.
In deze reeks zelfstudies laat ik je zien hoe je verschillende diensten kunt gebruiken die worden aangeboden door de IBM Watson Developer Cloud in Android-apps. In deze inleidende zelfstudie leert u hoe u kunt werken met IBM Bluemix, de Watson Java SDK en de Watson-tonanalyseapparaat om een eenvoudige Android-app te maken die de emoties in elk stuk tekst kan identificeren.
Om dit te kunnen volgen, heb je nodig:
De services van Watson zijn alleen toegankelijk via het IBM Bluemix-cloudplatform. Dat betekent dat u ze alleen in uw toepassing kunt gebruiken nadat u ze hebt ingeschakeld in de Bluemix-console en de vereiste inloggegevens hebt verkregen.
Begin door u aan te melden bij de console en te navigeren naar Diensten> Watson.
Druk vervolgens op Maak een Watson-service om alle Watson-services te bekijken die voor u beschikbaar zijn.
Voor nu, omdat we alleen geïnteresseerd zijn in het analyseren van de emotionele toon in geschreven tekst, selecteert u de Tone Analyzer service.
Verander in het volgende scherm de naam van de service naar iets zinnigs en druk op creëren knop.
De toonanalyzerservice wordt nu geactiveerd voor uw account en er wordt een set aanmeldingsreferenties gegenereerd. Om te zien wat die inloggegevens zijn, opent u de Serviceformulieren tab en selecteer de Bekijk inloggegevens actie.
Sla de inhoud van het JSON-document op naar een bestand op uw computer. Ik stel voor dat je het bestand een naam geeft credentials.json.
Met de Watson Java SDK kunt u heel gemakkelijk communiceren met elke Watson-service. Om het in uw project te kunnen gebruiken, voegt u het toe als een compileren
afhankelijkheid in de app
module build.gradle het dossier.
compileer 'com.ibm.watson.developer_cloud: java-sdk: 3.7.2'
Voor deze zelfstudie hebt u nog twee bibliotheken nodig: Commons IO, voor het vereenvoudigen van bestands-IO-bewerkingen en ondersteuning voor Android-ontwerp, om een aantal Material Design-widgets te kunnen gebruiken. Voeg ze ook toe als compileren
afhankelijkheden.
compileer 'commons-io: commons-io: 2.5' compileer 'com.android.support:design:23.4.0'
Je hebt ook de INTERNET
toestemming om te communiceren met de servers van IBM, dus voeg de volgende regel toe aan de AndroidManifest.xml het dossier:
Druk ten slotte op Synchroniseer nu knop om de projectconfiguratie te voltooien.
Als u wilt communiceren met de toongenalyseservice van Watson, moet u de ToneAnalyzer
klasse. De constructor verwacht een datumtekenreeks als argument, waarmee het automatisch de te gebruiken versie van de toongenalyseservice bepaalt.
final ToneAnalyzer toneAnalyzer = new ToneAnalyzer ("2017-07-01");
Merk op dat de datum altijd een statische tekenreeks moet zijn. Dit helpt ervoor te zorgen dat uw app niet stopt met werken wanneer een nieuwe versie van de service wijzigingen aanbrengt.
De ToneAnalyzer
instance moet worden geconfigureerd om uw inloggegevens te gebruiken, dus verplaats de credentials.json bestand, dat u eerder in deze tutorial hebt gemaakt, naar uw project res / raw map.
Vervolgens moet u de waarden van de .extra extraheren gebruikersnaam
en wachtwoord
sleutels uit het JSON-bestand. De volgende code laat zien hoe je dit snel doet met behulp van de IOUtils
en JSONObject
klassen:
JSONObject-referenties = nieuw JSONObject (IOUtils.toString (getResources (). OpenRawResource (R.raw.credentials), "UTF-8")); // Converteer het bestand naar een JSON-object // Extraheer de twee waarden String gebruikersnaam = credentials.getString ("gebruikersnaam"); String-wachtwoord = credentials.getString ("wachtwoord");
U kunt nu de configuratie van de. Voltooien ToneAnalyzer
bijvoorbeeld door de setUsernameAndPassword ()
methode.
toneAnalyzer.setUsernameAndPassword (gebruikersnaam, wachtwoord);
Onze app heeft een interface nodig waarmee de gebruiker een paar zinnen kan typen en op een knop kan drukken om de toonanalyse te starten. Met andere woorden, u moet nu een eenvoudige lay-out maken met een Tekst bewerken
widget en a Knop
widget.
Je kunt optioneel ook een TextInputLayout
container om ervoor te zorgen dat de Tekst bewerken
widget voldoet aan de richtlijnen van Material Design.
Voeg daarom de volgende code toe aan het lay-out XML-bestand van uw activiteit:
De toonanalyse moet starten zodra de gebruiker op de knop drukt. Daarom moet u een gebeurtenishandler voor de klik toevoegen aan de Knop
widget met zijn setOnClickListener ()
methode. Vergeet voordat je dit doet echter niet om een verwijzing naar de widget te krijgen met behulp van de findViewById ()
methode.
Button analysisButton = (Button) findViewById (R.id.analyze_button); analyzeButton.setOnClickListener (nieuwe View.OnClickListener () @Override public void onClick (View view) // Meer code hier);
Binnen de on-click event handler, is het eerste wat u moet doen bepalen wat de gebruiker heeft getypt in de Tekst bewerken
widget met zijn getText ()
methode.
EditText userInput = (EditText) findViewById (R.id.user_input); final String textToAnalyze = userInput.getText (). toString ();
Zoals alle Watson-services biedt de toonanalysedienst een groot aantal verschillende functies. Het kan bijvoorbeeld emoties, taalstijl en sociale neigingen identificeren in zijn inbreng. Het kan ook werken met JSON-documenten, platte tekst en HTML. Daarom moet u, om het efficiënt te gebruiken, expliciet de functies specificeren die u nodig hebt met behulp van a ToneOptions
object, dat eenvoudig kan worden gemaakt met behulp van de ToneOptions.Builder
klasse.
Voor nu gebruiken we de service alleen om een lijst weer te geven van alle emoties die aanwezig zijn in een tekst zonder opmaak. Hier ziet u hoe u een maakt ToneOptions
voorwerp zeggend:
ToneOptions-opties = new ToneOptions.Builder () .addTone (Tone.EMOTION) .html (false) .build ();
U kunt nu een toonanalyseverzoek opstellen door het gettone ()
methode, die een tekenreeks verwacht die de tekst bevat om te analyseren en een ToneOptions
object als zijn enige argumenten. Om het verzoek asynchroon uit te voeren, moet u ook het enqueue ()
methode, die een ServiceCallback
bijvoorbeeld als zijn argument.
toneAnalyzer.getTone (textToAnalyze, options) .enqueue (new ServiceCallback() @Override public void onResponse (ToneAnalysis response) // Meer code hier @Override public void onFailure (Exception e) e.printStackTrace (); );
Binnen in de onResponse ()
methode van de ServiceCallback
klas, hebt u toegang tot a ToneAnalysis
voorwerp. Door het te noemen getDocumentTone ()
methode, kunt u de algemene toon bepalen van de tekst die u aan de service hebt doorgegeven.
De retourwaarde van de getDocumentTone ()
methode is een ElementTone
object met een lijst met tooncategorieën. Omdat we eerder expliciet hebben aangegeven dat we alleen geïnteresseerd zijn in de categorie emoties, bevat de lijst slechts één element. Daarom, hier is hoe je de scores extraheert voor alle emoties die de service heeft gedetecteerd:
Lijstscores = response.getDocumentTone () .getTones () .get (0) .getTones ();
Zoals je zou verwachten, ToneScore
object vertegenwoordigt een enkele emotie. Het heeft een Dubbele
met de daadwerkelijke score en een Draad
vertel je de naam van de emotie. Als de score groter is dan 0,5, betekent dit dat de kans groot is dat de emotie in de tekst wordt uitgedrukt.
Laten we nu alleen die emoties kiezen waarvan de scores groter zijn dan 0,5 en gebruik ze om een bericht te maken dat aan de gebruiker kan worden getoond met een Geroosterd brood
.
String detectedTones = ""; for (ToneScore score: scores) if (score.getScore ()> 0.5f) detectedTones + = score.getName () + ""; final String toastMessage = "De volgende emoties zijn gedetecteerd: \ n \ n" + detectedTones.toUpperCase ();
Omdat het onResponse ()
methode werkt op verschillende threads, u moet ervoor zorgen dat u de Geroosterd brood
pas na het bellen van de runOnUiThread ()
methode.
runOnUiThread (nieuw Runnable () @Override public void run () Toast.makeText (getBaseContext (), toastMessage, Toast.LENGTH_LONG) .show (););
De app is nu klaar. Als u het uitvoert, typt u een paar zinnen in en start u de analyse, dan kunt u Watson nauwkeurig zien welke emoties aanwezig zijn in uw tekst.
In deze zelfstudie hebt u een Android-app gemaakt die de ton-analyseapparatuur van IBM Watson kan gebruiken om de complexe taak uit te voeren van het raden van de emoties die in een stuk tekst worden uitgedrukt. Je hebt ook de basis geleerd van het gebruik van de Watson Java SDK en de IBM Bluemix-console.
Voor meer informatie over de service kunt u de officiële documentatie raadplegen.
In de tussentijd kun je een aantal van onze andere berichten bekijken over het gebruik van machine learning voor je Android-apps hier op Envato Tuts+!