Comment coder le traitement du langage naturel sous Android avec IBM Watson

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:

1. Activer les services

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.

2. Configuration du projet

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..

3. Utilisation du service de conversion de documents

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.

4. Utilisation du service de traduction linguistique

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..

5. Utilisation du service de compréhension en langage naturel

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..

Conclusion

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.+!