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

Análisis de sentimientos con IBM Watson Tone Analyzer en PHP

Publicado el April 26, 2021

Tiempo de lectura: 12 minutos

En un mundo en el que los datos y el texto ocupan a menudo un lugar destacado, cada vez es más importante comprender el sentimiento de las comunicaciones que recibimos. También es importante entender cómo las palabras que utilizamos pueden transmitir un sentimiento equivocado.

Es habitual leer un mensaje de texto SMS y "pensar" que están enfadados, decepcionados o siendo sarcásticos. El texto en blanco y negro hace que sea difícil "sentir" lo que se está compartiendo, especialmente en entornos de trabajo políticos o en los que pueden compartirse ideas y visiones apasionadas o de opinión.

El análisis de sentimientos es una gran herramienta para ayudarnos a salvar la distancia entre lo que decimos y lo que queremos decir. Y, aunque no pueda arreglarlo todo, puede ayudar a impulsar una dirección más positiva.

Veamos cómo se puede utilizar el análisis de opiniones con la mensajería de texto SMS de Vonage aprovechando el servicio IBM Watson con un sencillo script PHP de devolución de llamada.

Configuración del proyecto

Para empezar, en este ejemplo, ejecutaremos una aplicación PHP localmente con el servidor web incorporado de PHP. Aunque el servidor web incorporado no debería usarse en un entorno de producción, está bien para scripts de ejemplo como este.

Entonces utilizaremos ngrok para que la aplicación local esté disponible en Internet como punto final de devolución de llamada para el servicio SMS de Vonage. Echa un vistazo a esta página si necesitas ayuda para configurar ngrok, pero lo básico es: Crea una Account en ngrok, descarga el ejecutable, inicia un túnel vía CLI, y luego usa las URLs provistas en el CLI después de que esté corriendo.

Cuenta IBM Watson

Uno de los requisitos es tener una Account, y credenciales API, con un servicio que proporcione análisis de sentimiento. A partir de este post, hay algunos disponibles, y puedes consultar este artículo para ver un desglose básico. Sin embargo, para este ejemplo, utilizaremos el IBM Watson Tone Analyzer de IBM.

Esto requerirá una cuenta de IBM Cloud, la creación de un recurso y la configuración de credenciales, todo ello gratuito hasta que alcance un determinado nivel de uso.

Nube de IBM

Después de configurar una Account en IBM Cloud e iniciar sesión, se le presentará el Dashboard. Desde allí, haga clic en el botón Crear recurso.

Create resource at IBM CloudCreate resource at IBM Cloud

A continuación, desplácese hacia abajo para hacer clic en el cuadro Analizador de tonos.

Tone Analyzer service at IBM CloudTone Analyzer service at IBM Cloud

Rellene el formulario con la información requerida, seleccionando una región cercana. A continuación se le proporcionará una clave API y una URL. Anótelos, porque los necesitará más adelante.

Base de aplicaciones

En este punto, necesitamos empezar a organizar la aplicación. Asumiremos un directorio vacío, y comenzaremos a construir la aplicación de callback de ejemplo desde allí. También asumiremos un sistema local con PHP ya configurado y corriendo, y capaz de ser usado vía CLI (Command Line Interface).

En este directorio vacío, cree un nuevo archivo PHP y nómbrelo index.php. Por el momento, simplemente escriba la palabra "test" en el archivo. Esto creará alguna salida y nos permitirá probar en el siguiente paso.

PHP Built-in Webserver y ngrok

Para empezar, pondremos en marcha el servidor web PHP incorporado y ejecutaremos ngrok. Esto asegurará que el entorno está funcionando y listo desde el principio.

Utilizando el terminal del sistema, navegue hasta la ubicación de nuestro directorio. Una vez allí, emita el comando para iniciar el servidor web PHP incorporado, así:

php -S localhost:8080

En este punto, al introducir "http://localhost:8080" deberíamos ver "test" como respuesta si eso es lo que se introdujo en el archivo index.php creado anteriormente.

A continuación, ejecutaremos ngrok para que los resultados del servidor web estén disponibles en Internet. En un terminal, navegue a la ubicación donde ngrok fue instalado previamente, e introduzca el siguiente comando:

./ngrok http 8080

A cambio, ngrok nos proporcionará información importante, como en la captura de pantalla siguiente.

ngrok information returnedngrok information returned

Esto nos permite conocer la información del servicio, incluyendo las URL del túnel que debemos utilizar para acceder a nuestro script que se ejecuta localmente. Podemos introducir la información proporcionada en un navegador web y obtener los mismos resultados que cuando se solicita a través de localhost anteriormente.

Nota: Se recomienda utilizar URLs https para proteger las credenciales que se comparten entre los servicios.

Dejaremos que la instancia de ngrok se ejecute a lo largo de este ejemplo. Cuando estés listo para apagarlo, simplemente pulsa "Ctrl+c" en el terminal y se cerrará ngrok.

Configuración de Vonage

Con las URL proporcionadas por ngrok, podemos actualizar el número de SMS proporcionado por 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.

En el panel de Vonage, expande el elemento de menú Numbers para exponer "Tus números".

nexmo_dashboardVonage Dashboard

A continuación, haz clic en el botón Configuración para editar la URL del Webhook de entrada para SMS.

nexmo_hooksVonage Hooks

Compositor

Por conveniencia, usaremos Composer para instalar algunos paquetes y hacernos la vida más fácil con su autocargador y gestión de dependencias.

Supondremos que Composer ya está instalado globalmente en nuestro sistema, para poder utilizarlo fácilmente siempre que lo necesitemos, y para que sea más fácil mantenerlo actualizado.

En la carpeta del proyecto, tenemos que init Composer, lo que nos permite incluir algunos paquetes / dependencias. Por lo tanto, navegue hasta el directorio del proyecto, a través de CLI, y ejecute el siguiente comando.

composer init

Las últimas versiones de Composer ahora realizan un proceso paso a paso para ayudar a configurar un proyecto. Siga las indicaciones y rellene lo que desee. Por favor, utilice los paquetes en la siguiente sección de lo que debería ser necesario.

Dependencias necesarias

Para completar el asistente de la sección anterior, o para configurar manualmente un archivo composer.json incluya las siguientes dependencias para este ejemplo:

  • vlucas/phpdotenv - almacena las credenciales en el superglobal $_ENV

  • slim/slim - microframework ligero que facilita el manejo de llamadas HTTP y callbacks

  • slim/psr7 - facilita la interoperabilidad HTTP entre bibliotecas

  • guzzlehttp/guzzle - para manejar llamadas HTTP en lugar de usar cUrl

Instalación de Composer

Con todas las dependencias añadidas a Composer, ahora estamos listos para instalarlas utilizando el siguiente comando en la CLI.

composer install

Crear credenciales

Las credenciales para esta aplicación de ejemplo se alojarán en un archivo ENV y serán analizadas por phpdotenv.

Configuración ENV

La creación de un .env nos permite almacenar las credenciales que necesitaremos cuando nos conectemos al servicio externo. En este caso, será la API de IBM Watson. Añade el siguiente contenido en el archivo recién creado llamado .env en la raíz del proyecto:

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

NOTA: La URL puede cambiar, así que asegúrese de que es similar a la proporcionada por IBM Cloud. Asegúrese de intercambiar los valores con los recibidos del servicio IBM Watson.

Uso de PHPDotEnv

En el archivo index.php creado anteriormente, empezamos a añadir código para aprovechar el autocargador de Composer y el paquete phpdotenv de PHP para inyectar el contenido del archivo .env en el superglobal $_ENV.

<?php

require('vendor/autoload.php');

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

NOTA: Por convención, el código anterior cargará el archivo .env desde el directorio actual. Si se desea otra ubicación, será necesario un método adicional para abrirlo. (no se muestra)

Guzzle para HTTP

También incluiremos Guzzle, un paquete PHP para manejar peticiones HTTP en lugar de usar cURL, para cualquier llamada al servicio externo de IBM Watson. Lo importaremos con una use después del requisito de Composer anterior.

use GuzzleHttp\Client;

Uso de Slim PHP

Para configurar slim en nuestro script callback de ejemplo, importaremos con una sentencia use inmediatamente después del autoload require de Composer. Luego llamaremos a la función create() de Slim para crear una aplicación Slim y una llamada a la función app->run al final del archivo para poner las cosas en marcha.

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();

Captura de una llamada HTTP

El deseo es utilizar la funcionalidad Slim para capturar peticiones HTTP y responder con JSON. Incluiremos las interfaces Request y Response compatibles con PSR para ayudarnos a mantener la interoperabilidad con las comunicaciones HTTP, por lo que las importamos con sentencias use junto con la importación de Slim mostrada arriba.

Tras inyectar las variables de entorno y la creación de la aplicación Slim, añadiremos una llamada al método any() para gestionar el enrutamiento del endpoint HTTP, de la siguiente manera.

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

// {{body of the app here}}

});

Note que estamos permitiendo la capacidad de hacer any llamadas HTTP a este script. (GET, POST, PUT, DELETE, etc.) Me gusta hacer esto a propósito y permitirme devolver códigos de estado HTTP válidos según sea necesario. Que será lo primero que añadamos en el cuerpo de la función anónima anterior.

Básicamente, si entra cualquier tipo de petición HTTP que no sea una petición POST, el script debe responder con un código de estado 405. Sólo queremos peticiones POST.

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

Parse Solicitud JSON

El servicio de Vonage enviará una carga JSON dentro de la solicitud POST. Convertiremos el JSON en un objeto que podremos utilizar en futuras llamadas al servicio IBM Watson Sentiment.

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

Llamada HTTP a Watson

Utilizando el objeto $body hacemos una petición a IBM Watson para analizar el sentimiento del mensaje. Hacemos esto con una nueva instancia de Guzzle Client para gestionar la solicitud.

Nota: Aquí es donde $_ENV, creado a partir del archivo .env entra en juego.

$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']]]
    );

Devolver una respuesta

Y finalmente, utilizamos el Content-Type devuelto por IBM, o lo establecemos manualmente. A continuación, devolvemos el análisis de sentimiento proporcionado por el servicio como un nuevo objeto JSON.

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

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

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

Conclusión

Como se muestra en este ejemplo, es sencillo incluir el análisis de sentimientos en las aplicaciones para aclarar la intención de la comunicación. Comprender el sentimiento de lo que otros comparten puede ser un factor enorme para reducir la política y el estrés en nuestra vida cotidiana. Cada vez más servicios están empezando a incorporar este nivel de funcionalidad en sus aplicaciones, y espero que este ejemplo de uso con SMS te resulte útil.

Para ver un ejemplo de código completo, visite https://github.com/nexmo-community/sms-ibm-sentiment-php.

Compartir:

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

Adam es un desarrollador y consultor al que le gusta correr a toda velocidad, bloguear y ayudar a otros a domar la tecnología para conseguir cosas increíbles, con un deseo insaciable de servir de mentor y ayudar.