https://d226lax1qjow5r.cloudfront.net/blog/blogposts/sentiment-analysis-using-ibm-watson-tone-analyzer-in-php-dr/Blog_Sentiment-Analysis_Watson_1200x600.png

Analyse de sentiments avec IBM Watson Tone Analyzer en PHP

Publié le April 26, 2021

Temps de lecture : 13 minutes

Dans un monde où les données et les textes sont souvent au premier rang, il est de plus en plus important de comprendre le sentiment des communications que nous recevons. Il est également important de comprendre comment les mots que nous utilisons peuvent véhiculer un sentiment erroné.

Il est courant de lire un SMS et de "penser" que le destinataire est en colère, déçu ou sarcastique. Le texte en noir et blanc ne permet pas de "sentir" ce qui est partagé, en particulier dans les environnements de travail politiques ou lorsque des idées et des visions passionnées sont partagées.

L'analyse des sentiments est un excellent outil pour nous aider à combler le fossé entre ce que nous disons et ce que nous pensons. Bien qu'elle ne puisse pas tout résoudre, elle peut aider à prendre une direction plus positive.

Voyons comment l'analyse des sentiments pourrait être utilisée avec les SMS de Vonage en exploitant le service IBM Watson à l'aide d'un simple script de rappel PHP.

Configuration du projet

Pour commencer, dans cet exemple, nous allons exécuter une application PHP localement avec le serveur web intégré de serveur web intégré PHP. Bien que le serveur web intégré ne doive pas être utilisé dans un environnement de production, il convient parfaitement pour des scripts d'exemple comme celui-ci.

Nous utiliserons ensuite ngrok pour rendre l'application locale disponible sur l'internet en tant que point de rappel pour le service SMS de Vonage. Jetez un coup d'œil à cette page si vous avez besoin d'aide pour installer ngrok, mais les bases sont les suivantes : Créez un Account sur ngrok, téléchargez l'exécutable, démarrez un tunnel via CLI, puis utilisez les URLs fournies dans le CLI une fois qu'il est en cours d'exécution.

Compte IBM Watson

Il faut notamment disposer d'un Account, et d'identifiants API, auprès d'un service fournissant une analyse des sentiments. Au moment de la rédaction de ce billet, il en existe quelques-uns, et vous pouvez consulter cet article pour en connaître les grandes lignes. Cependant, pour cet exemple, nous utiliserons le service IBM Watson Tone Analyzer d'IBM.

Il faudra pour cela disposer d'un compte IBM Cloud, créer une ressource et configurer des identifiants, le tout gratuitement jusqu'à ce que vous atteigniez un certain niveau d'utilisation.

IBM Cloud

Après avoir configuré un Account sur IBM Cloud, et vous être connecté, le tableau de bord vous sera présenté. À partir de là, vous cliquerez sur le bouton Créer une ressource.

Create resource at IBM CloudCreate resource at IBM Cloud

Ensuite, faites défiler vers le bas pour cliquer sur la case Tone Analyzer (analyseur de tonalité).

Tone Analyzer service at IBM CloudTone Analyzer service at IBM Cloud

Complétez le formulaire avec les informations requises, en sélectionnant une région proche. Une clé API et une URL vous seront ensuite fournies. Notez-les, car vous en aurez besoin ultérieurement.

Base d'applications

À ce stade, nous devons commencer à organiser l'application. Nous partirons d'un répertoire vide, et commencerons à construire l'exemple d'application de rappel à partir de là. Nous supposerons également que nous disposons d'un système local sur lequel PHP est déjà installé et fonctionne, et qu'il peut être utilisé via l'interface de ligne de commande (CLI).

Dans ce répertoire vide, créez un nouveau fichier PHP et nommez-le index.php. Pour l'instant, tapez simplement le mot "test" dans le fichier. Cela créera une sortie et nous permettra de tester dans l'étape suivante.

Serveur web intégré à PHP et ngrok

Pour commencer, nous allons démarrer le serveur web PHP intégré et lancer ngrok. Cela permettra de s'assurer que l'environnement est opérationnel et prêt dès le départ.

En utilisant le terminal du système, naviguez jusqu'à l'emplacement de notre répertoire. Une fois sur place, lancez la commande pour démarrer le serveur web intégré PHP, comme suit :

php -S localhost:8080

À ce stade, en saisissant "http://localhost:8080", nous devrions voir "test" comme réponse si c'est ce qui a été saisi dans le formulaire de demande d'information. index.php créé précédemment.

Ensuite, nous lançons ngrok pour rendre les résultats du serveur web disponibles sur Internet. Dans un terminal, naviguez jusqu'à l'emplacement où ngrok a été installé précédemment, et entrez la commande suivante :

./ngrok http 8080

En retour, ngrok nous fournira quelques informations importantes, comme dans la capture d'écran ci-dessous.

ngrok information returnedngrok information returned

Cela nous permet de connaître les informations relatives au service, y compris les URL de tunnel à utiliser pour accéder à notre script exécuté localement. Nous pouvons saisir les informations fournies dans un navigateur web et nous devrions obtenir les mêmes résultats que lors de la requête via localhost ci-dessus.

Remarque : il est recommandé d'utiliser des URL https pour protéger les informations d'identification partagées entre les services.

Nous laisserons l'instance de ngrok fonctionner tout au long de cet exemple. Lorsque vous serez prêt à l'arrêter, appuyez simplement sur "Ctrl+c" dans le terminal et ngrok se fermera.

Configuration de Vonage

Avec les URL fournies par ngrok, nous pouvons mettre à jour le numéro de SMS fourni par Vonage.

Vonage API Account

To complete this tutorial, you will need a Vonage API account. If you don’t have one already, you can sign up today and start building with free credit. Once you have an account, you can find your API Key and API Secret at the top of the Vonage API Dashboard.

Dans le tableau de bord de Vonage, développez l'élément de menu Numbers pour exposer "Your numbers".

nexmo_dashboardVonage Dashboard

Cliquez ensuite sur le bouton Paramètres pour modifier l'URL du Webhook entrant pour les SMS.

nexmo_hooksVonage Hooks

Compositeur

Pour des raisons de commodité, nous utiliserons Composer pour installer quelques paquets et nous faciliter la vie avec son autoloader et sa gestion des dépendances.

Nous supposerons que Composer est déjà installé globalement sur notre système, afin de pouvoir l'utiliser facilement chaque fois que nous en avons besoin, et de faciliter sa mise à jour.

Dans le dossier du projet, nous devons lancer Composer, ce qui nous permettra d'inclure quelques paquets/dépendances. Naviguez donc dans le répertoire du projet, via le CLI, et lancez la commande suivante.

composer init

Les dernières versions de Composer proposent désormais un processus étape par étape pour faciliter la mise en place d'un projet. Suivez les instructions et remplissez les champs comme vous le souhaitez. Veuillez utiliser les paquets dans la section suivante de ce qui devrait être requis.

Dépendances requises

Pour compléter l'assistant de la section précédente, ou pour configurer manuellement un fichier composer.json inclure les dépendances suivantes pour cet exemple :

  • vlucas/phpdotenv - stocke les informations d'identification dans la superglobale $_ENV

  • slim/slim - micro-cadre léger qui facilite la gestion des appels HTTP et des callbacks

  • slim/psr7 - facilite l'interopérabilité HTTP entre les bibliothèques

  • guzzlehttp/guzzle - pour gérer les appels HTTP plutôt que d'utiliser cUrl

Installation de Composer

Avec toutes les dépendances ajoutées à Composer, nous sommes maintenant prêts à les installer en utilisant la commande suivante dans le CLI.

composer install

Créer des informations d'identification

Les informations d'identification pour cet exemple d'application seront placées dans un fichier ENV et analysées par phpdotenv.

ENV setup

La création d'un fichier .env nous permet de stocker les informations d'identification dont nous aurons besoin pour nous connecter au service externe. Dans ce cas, il s'agira de l'API IBM Watson. Ajoutez le contenu suivant dans le fichier nouvellement créé nommé .env à la racine du projet :

TONE_ANALYZER_IAM_APIKEY={YOUR-WATSON-KEY-HERE} TONE_ANALYZER_URL=https://gateway-wdc.watsonplatform.net/tone-analyzer/api/v3/tone/

NOTE : L'URL peut changer, assurez-vous donc qu'elle est similaire à celle fournie par IBM Cloud. Veillez à remplacer les valeurs par celles reçues du service IBM Watson.

Utilisation de PHPDotEnv

Dans le fichier index.php créé plus tôt, nous commençons à ajouter du code pour tirer parti de l'autoloader Composer et du paquetage PHP phpdotenv pour injecter le contenu du fichier .env dans la superglobale $_ENV.

<?php

require('vendor/autoload.php');

Dotenv\Dotenv::create(__DIR__)->load();

NOTE : Par convention, le code ci-dessus chargera le fichier .env à partir du répertoire actuel. Si un autre emplacement est souhaité, une méthode supplémentaire pour l'ouvrir sera nécessaire. (non illustré)

Guzzle pour HTTP

Nous inclurons également Guzzle, un paquetage PHP pour gérer les requêtes HTTP au lieu d'utiliser cURL, pour tout appel au service externe IBM Watson. Nous l'importerons avec une déclaration use après l'exigence de Composer ci-dessus.

use GuzzleHttp\Client;

Utilisation de Slim PHP

Pour mettre en place slim dans notre exemple de script de rappel, nous allons importer avec une déclaration use immédiatement après l'instruction Composer autoload require. Ensuite, nous appellerons la fonction create() de Slim pour créer une application Slim et un appel de fonction à app->run à la fin du fichier pour lancer les choses.

use Psr\Http\Message\ServerRequestInterface as Request;
use Psr\Http\Message\ResponseInterface as Response;
use Slim\Factory\AppFactory;

$app = AppFactory::create();

//... call to Dotenv

$app->run();

Attraper un appel HTTP

L'objectif est d'utiliser la fonctionnalité Slim pour capturer les requêtes HTTP et répondre avec JSON. Nous inclurons les interfaces Request et Response conformes au PSR pour nous aider à rester interopérables avec les communications HTTP, nous les importons donc avec les déclarations use en même temps que l'importation Slim illustrée ci-dessus.

Après l'injection des variables d'environnement et la création de l'application Slim, nous ajouterons un appel de méthode any() pour gérer le routage du point de terminaison HTTP, comme suit.

$app->any('/message[/]', function (Request $request, Response $response) {

// {{body of the app here}}

});

Remarquez que nous permettons à ce script d'effectuer des appels any HTTP à ce script. (GET, POST, PUT, DELETE, etc.) J'aime faire cela à dessein et me permettre de renvoyer des codes d'état HTTP valides si nécessaire. Ce sera la première chose que nous ajouterons dans le corps de la fonction anonyme ci-dessus.

En principe, si une requête HTTP autre qu'une requête POST est reçue, le script doit répondre par un code d'état 405. Nous ne voulons que des requêtes POST.

if ($request->getMethod() != 'POST') {
        return $response->withStatus(405);
}

Analyse de la requête JSON

Le service Vonage enverra une charge utile JSON dans la requête POST. Nous analyserons le JSON pour en faire un objet que nous pourrons utiliser dans de futurs appels au service IBM Watson Sentiment.

$body = json_decode($request->getBody());

Appel HTTP à Watson

À l'aide de cet objet, nous demandons à IBM Watson d'analyser le sentiment du message. $body nous demandons à IBM Watson d'analyser le sentiment du message. Pour ce faire, nous créons une nouvelle instance de Guzzle Client afin de traiter la demande.

Note : C'est ici que $_ENV, créé à partir du fichier .env entre en jeu.

$client = new Client();

$result = $client->request(
        'GET',
        $_ENV['TONE_ANALYZER_URL'] . '?version=2017-09-21&text=' . urlencode($body->text),
        ['auth' => ['apikey', $_ENV['TONE_ANALYZER_IAM_APIKEY']]]
    );

Renvoyer une réponse

Enfin, nous utilisons le Content-Type renvoyé par IBM, ou nous le définissons manuellement. Ensuite, nous renvoyons l'analyse des sentiments fournie par le service sous la forme d'un nouvel objet JSON.

$contentType = $result->getHeaderLine('Content-Type') ?: 'application/json';

$response = $response->withHeader('Content-Type', $contentType);

return $response->withBody($result->getBody());

Conclusion

Comme le montre cet exemple, il est simple d'inclure l'analyse des sentiments dans les Applications pour clarifier l'intention de communication. Comprendre le sentiment de ce que les autres partagent peut être un facteur important pour réduire la politique et le stress dans notre vie quotidienne. De plus en plus de services commencent à intégrer ce niveau de fonctionnalité dans leurs applications, et j'espère que cet exemple d'utilisation avec les SMS vous sera utile.

Pour un exemple de code complet, voir https://github.com/nexmo-community/sms-ibm-sentiment-php.

Partager:

https://a.storyblok.com/f/270183/384x384/b3c7ffaf85/adamculp.png
Adam CulpAnciens de Vonage

Adam est un développeur et un consultant qui aime l'ultra-course, les blogs, et qui aide les autres à apprivoiser la technologie pour accomplir des choses étonnantes avec un désir insatiable de mentorat et d'aide.