Grâce à la vague croissante d'intelligence artificielle, les utilisateurs s'attendent maintenant à des applications intelligentes et conscientes du contexte dans lequel elles sont utilisées. IBM Watson propose une variété de services liés au langage naturel que vous pouvez utiliser pour créer de telles applications..
Par exemple, vous pouvez utiliser son service Natural Language Understanding pour extraire des mots-clés, des entités, des sentiments et de nombreux autres détails sémantiques de tout texte lu par l'utilisateur. Et si le texte est dans une langue étrangère, vous pouvez utiliser le service de traduction de langue pour identifier la langue et la traduire dans une langue comprise de l'utilisateur.
Dans ce tutoriel, je vais vous présenter quelques-uns de ces services en vous montrant comment créer une application capable de traduire des pages Web allemandes en anglais et d'en extraire les sentiments, les entités importantes et les émotions..
Avant de poursuivre, je vous suggère de lire le didacticiel d’introduction suivant sur les services IBM Watson:
Nous allons travailler avec trois services Watson aujourd'hui, et chacun d'entre eux doit être activé séparément. Alors ouvrez votre tableau de bord IBM Bluemix et appuyez sur le bouton Créer bouton.
Le premier service que nous allons activer est le Conversion de document service, ce qui nous permet de convertir des documents HTML, PDF et DOCX en texte brut ou JSON. Sélectionnez-le dans le catalogue, nommez-le et appuyez sur le bouton Créer bouton.
Ensuite, retournez au catalogue et choisissez le Traducteur un service. Il prend en charge plusieurs langues largement parlées et peut, par défaut, gérer du texte dans trois domaines: nouvelles, conversation et brevets. Alors que les deux premiers domaines conviennent à la plupart des textes, le dernier domaine peut être plus précis pour les textes contenant de nombreux termes techniques ou juridiques..
Dans sa page de configuration, attribuez un nom explicite au service et appuyez sur le bouton Créer bouton.
Retournez au catalogue et choisissez le Compréhension du langage naturel un service. Nous utiliserons ce service pour extraire des sentiments, des entités et des émotions d'un texte non structuré. Encore une fois, donnez-lui un nom explicite dans l'écran de configuration et appuyez sur le bouton Créer bouton.
Si vous ouvrez le tableau de bord maintenant, vous devriez pouvoir voir quelque chose comme ceci:
Les trois services ont des identifiants de connexion uniques qui leur sont associés. Vous devez tous les noter, car vous en aurez besoin plus tard. Pour déterminer les informations d'identification de tout service, sélectionnez-le dans le tableau de bord, ouvrez son Identifiants de service onglet, et appuyez sur le Voir les références bouton.
Pour pouvoir utiliser ces trois services dans un projet Android Studio, nous devons ajouter le kit de développement Java Watson en tant que la mise en oeuvre
dépendance dans le app
modules build.gradle fichier.
implémentation 'com.ibm.watson.developer_cloud: java-sdk: 3.9.1'
De plus, nous utiliserons la bibliothèque Fuel en tant que client HTTP, donc ajoutez-la aussi en tant que la mise en oeuvre
dépendance.
implémentation 'com.github.kittinunf.fuel: fuel-android: 1.10.0'
Fuel et le kit de développement Java Watson ne peuvent fonctionner que si notre application dispose du L'INTERNET
permission, alors demandez-le dans le fichier manifeste.
Ensuite, ajoutez
balises contenant les noms d'utilisateur et les mots de passe des trois services du strings.xml fichier.
USERNAME1 MOT DE PASSE1 USERNAME2 MOT DE PASSE2 USERNAME3 MOT DE PASSE3
Enfin, pour que notre code soit concis, dans ce didacticiel, nous utiliserons Kotlin au lieu de Java. Assurez-vous donc que vous avez activé le support Kotlin..
Nous allons utiliser le service Watson Document Conversion pour convertir les pages Web HTML en texte brut. Pour permettre à l’utilisateur de saisir une adresse de page Web, ajoutez un Éditer le texte
widget à la mise en page de votre activité. En outre, inclure un Affichage
widget pour afficher le contenu de la page Web sous forme de texte brut. Pour vous assurer que le contenu de longues pages Web ne sont pas tronquées, je vous suggère de les placer dans un ScrollView
widget.
Dans le code ci-dessus, vous pouvez voir que le imeOptions
attribut du Éditer le texte
le widget est réglé sur actionGo
. Il permet aux utilisateurs d'appuyer sur un bouton "Go" sur leurs claviers virtuels une fois qu'ils ont fini de taper l'adresse. Pour écouter cet événement, ajoutez le code Kotlin suivant à votre activité. onCreate ()
méthode:
documentURL.setOnEditorActionListener _, action, _ -> if (action == EditorInfo.IME_ACTION_GO) // Plus de code ici false
Dans l'écouteur d'événements, la première chose à faire est de déterminer l'URL saisie par l'utilisateur. Nous pouvons le faire facilement en accédant à la texte
propriété du Éditer le texte
widget. Une fois que nous avons l'URL, nous pouvons utiliser le carburant httpGet ()
méthode pour télécharger le contenu de la page Web.
Parce que nous voulons le httpGet ()
méthode pour exécuter de manière asynchrone, nous devons lui ajouter un rappel en utilisant le responseString ()
méthode, qui nous permet également de traiter le contenu téléchargé sous forme de chaîne.
val url: String = documentURL.text.toString () url.httpGet (). responseString _, _, result -> val (document, _) = result if (err == null) // Plus de code ici
Il est maintenant temps de créer une instance du DocumentConversion
class, qui contient toutes les méthodes nécessaires pour interagir avec le service de conversion de documents. Son constructeur attend une date de version avec les identifiants de connexion du service..
val documentConverter = DocumentConversion (DocumentConversion.VERSION_DATE_2015_12_01, resources.getString (R.string.document_conversion_username), resources.getString (R.string.document_conversion_password))
Le kit de développement de logiciels Java Watson ne nous permet pas de transmettre directement des chaînes au service de conversion de documents. Il faut Fichier
objets à la place. Par conséquent, créons maintenant un fichier temporaire en utilisant le createTempFile ()
méthode du Fichier
classe, et écrivez le contenu de la page Web que nous avons téléchargée à l'aide de la writeText ()
méthode.
val tempFile = File.createTempFile ("temp_file", null) tempFile.writeText (document, Charsets.UTF_8)
À ce stade, nous pouvons appeler le convertDocumentToText ()
méthode et transmettez-lui le fichier temporaire pour démarrer la conversion. La méthode attend également le type MIME du fichier temporaire, alors n'oubliez pas de l'inclure. Une fois la conversion terminée, vous pouvez afficher le texte brut en l’attribuant simplement à texte
propriété du Affichage
widget.
Le code suivant vous montre comment effectuer la conversion dans un nouveau thread et mettre à jour le Affichage
dans le fil de l'interface utilisateur:
AsyncTask.execute val plainText = documentConverter .convertDocumentToText (tempFile, "text / html") .execute () runOnUiThread documentContents.text = plainText
Vous pouvez exécuter l'application maintenant et taper l'URL d'une page Web allemande pour voir le service de conversion de document fonctionner.
Avec le service de traduction linguistique, nous allons maintenant convertir le texte brut, qui est en allemand, en anglais.
Au lieu de mettre à jour notre mise en page, pour permettre à l'utilisateur de démarrer manuellement la traduction, ajoutons un menu à notre activité. Pour ce faire, commencez par créer un nouveau fichier de ressources de menu et ajoutez-y le code suivant:
Comme vous pouvez le constater, le code ci-dessus crée un menu avec deux options: traduire et analyser. Dans cette étape, nous allons travailler avec la première option uniquement.
Pour rendre le menu, il faut le gonfler à l'intérieur du onCreateOptionsMenu ()
méthode de notre activité.
remplacer fun onCreateOptionsMenu (menu: Menu?): Boolean menuInflater.inflate (R.menu.my_menu, menu) retourne super.onCreateOptionsMenu (menu)
En remplaçant le onOptionsItemSelected ()
méthode, nous pouvons savoir quand l'utilisateur utilise le menu. De plus, nous pouvons déterminer sur quel élément l'utilisateur a appuyé en vérifiant la ID de l'article
. Le code suivant vérifie si l'utilisateur a choisi l'option de traduction.
remplacer fun onOptionsItemSelected (item: MenuItem?): Boolean if (item? .itemId == R.id.action_translate) // Plus de code ici return true
Tout comme le service de document, le service de traduction de langue a également une classe dédiée qui nous permet d’interagir avec elle. Comme vous l'avez peut-être deviné, ça s'appelle Traducteur
. Pour créer une instance de la classe, nous devons uniquement transmettre les informations de connexion du service à son constructeur..
val translator = LanguageTranslator (resources.getString (R.string.language_translator_username), resources.getString (R.string.language_translator_password))
La classe a un Traduire()
méthode, nous pouvons maintenant utiliser pour traduire notre texte allemand en anglais. En tant qu'arguments, il s'attend à ce que le texte soit traduit sous forme de chaîne, la langue actuelle du texte et la langue souhaitée..
Une fois la traduction terminée avec succès, nous aurons accès à un TraductionRésultat
objet, dont première traduction
propriété contient le texte traduit.
Le code suivant vous montre comment effectuer la traduction et rendre le résultat dans le dossier Affichage
widget.
AsyncTask.execute val translateDocument = translator .translate (documentContents.text .toString (), Language.GERMAN, Language.ENGLISH) .execute () runOnUiThread documentContents.text = translationDocument.firstTranslation
Vous pouvez maintenant exécuter l'application à nouveau, taper l'URL d'une page Web allemande et utiliser le menu pour traduire son contenu en anglais..
Enfin, pour effectuer une analyse sémantique sur le texte traduit et en extraire divers détails importants, nous pouvons utiliser le NaturelLangueCompréhension
classe, qui sert de client pour le service Natural Language Understanding.
Le code suivant vous montre comment initialiser le client uniquement lorsque l'utilisateur appuie sur la deuxième option du menu créé à l'étape précédente:
Si vous êtes à la recherche de (liste de références), vous obtiendrez des informations sur le sujet suivant: (.LanguageUnderstanding (NaturalLanguageUnderstanding.VERSION_DATE_2017_02_27) ici
Comparé aux autres services liés au langage naturel, l’utilisation du service Compréhension du langage naturel est légèrement plus compliquée, principalement parce qu’il comporte un grand nombre de fonctionnalités..
Pour le moment, supposons que nous voulions déterminer le sentiment général du texte traduit et extraire toutes les entités majeures qu’il mentionne. Chaque entité elle-même peut avoir une émotion et un sentiment qui lui sont associés, alors disons que nous voulons les extraire aussi.
Pour dire au service que nous voulons extraire toutes les entités et les émotions et les sentiments qui leur sont associés, nous avons besoin d'un EntitésOptions
objet, qui peut être créé en utilisant le EntitiesOptions.Builder
classe.
val entityOptions = EntitiesOptions.Builder () .emotion (true) .sentiment (true) .build ()
De même, pour dire au service que nous voulons le sentiment général du texte, il nous faut un SentimentOptions
objet.
val sentimentOptions = SentimentOptions.Builder () .document (true) .build ()
le SentimentOptions
et EntitésOptions
les objets doivent maintenant être regroupés pour former un Caractéristiques
objet, qui peut être utilisé pour composer un AnalyserOptions
objet. le AnalyserOptions
objet est le plus important de tous les objets ci-dessus car c'est là que vous spécifiez le texte que vous souhaitez analyser.
val features = Features.Builder () .entities (entityOptions) .sentiment (sentimentOptions) .build () val analyzerOptions = AnalyzeOptions.Builder () .text (documentContents.text.toString ()) .features (features) .build ()
Une fois la AnalyserOptions
l'objet est prêt, on peut le passer le analyser()
méthode pour démarrer l'analyse.
AsyncTask.execute val results = analyzer.analyze (analyzerOptions) .execute () // Plus de code ici
Le résultat de l'analyse est un Les résultats d'analyse
objet contenant toutes les informations demandées.
Pour déterminer le sentiment général du texte, nous devons d’abord extraire le score du sentiment général en utilisant la sentiment.document.score
propriété. Un score de sentiment n'est rien d'autre qu'un nombre à virgule flottante. Si c'est nul, le sentiment est neutre. Si c'est négatif ou positif, le sentiment est aussi négatif ou positif.
val OverallSentimentScore = results.sentiment.document.score var OverallSentiment = "Positif" if (OverallSentimentScore < 0.0) overallSentiment = "Negative" if(overallSentimentScore == 0.0) overallSentiment = "Neutral" var output = "Overall sentiment: $overallSentiment\n\n"
Ensuite, en parcourant le entités
liste présente dans le Les résultats d'analyse
objet, nous pouvons traiter chaque entité individuellement. Par défaut, chaque entité est associée à un type. Par exemple, le service peut indiquer si une entité est une personne, une entreprise ou un véhicule. Actuellement, il peut identifier plus de 450 types différents d'entités.
Parce que nous les avons demandées, chaque entité aura désormais aussi un score de sentiment et des émotions associées..
Nous pouvons déterminer le score de sentiment en utilisant simplement le sentiment.score
propriété. Déterminer l'émotion associée à une entité, cependant, n'est pas aussi simple. Watson supporte actuellement cinq émotions: la colère, la joie, le dégoût, la peur et la tristesse. Chaque entité aura les cinq émotions, mais des valeurs différentes seront associées à chacune d’elles, spécifiant le degré de confiance du service dans le fait que l’émotion est correcte. Par conséquent, pour déterminer la bonne émotion, nous devons choisir celle qui a la plus grande valeur..
Le code suivant répertorie chaque entité avec son type, son score de sentiment et son émotion:
for (entité dans results.entities) output + = "$ entity.text ($ entity.type)) \ n" val validEmotions = arrayOf ("Colère", "Joie", "Dégoût", "Peur" , "Sadness") 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 ())] output + = "Emotion: $ currentEmotion," + "Sentiment: $ entity.sentiment.score" + "\ n \ n"
Pour afficher le résultat généré, nous pouvons à nouveau mettre à jour le Affichage
widget.
runOnUiThread documentContents.text = sortie
À ce stade, vous pouvez exécuter l'application à nouveau pour voir les trois services fonctionner ensemble..
Vous savez maintenant utiliser trois des services les plus utilisés par Watson en matière de langage naturel. Dans ce didacticiel, vous avez également constaté à quel point il est facile d’utiliser le kit de développement Java (SDK) Watson pour que tous les services fonctionnent ensemble afin de créer une application Android intelligente..
Pour en savoir plus sur les services et le SDK, vous pouvez vous reporter au référentiel GitHub du SDK. Et pour en savoir plus sur l'utilisation de Watson machine learning dans vos propres applications, consultez certains de nos autres articles ici sur Envato Tuts.+!