https://d226lax1qjow5r.cloudfront.net/blog/blogposts/sentiment-analysis-for-customer-experience-with-python-and-streamlit/sentiment-analysis_streamlit_1200x600.png

Análisis del sentimiento para la experiencia del cliente con Python y Streamlit

Publicado el April 19, 2021

Tiempo de lectura: 14 minutos

Comienza a aprovechar la API de mensajería de Vonage para mejorar el servicio al cliente, por ejemplo, recopilando opiniones de plataformas de medios sociales como Facebook.

El análisis de sentimientos extrae información de las opiniones de los clientes mediante técnicas de procesamiento del lenguaje natural para determinar si los datos son positivos, negativos o neutros. Las empresas aprovechan el análisis de sentimientos para controlar la opinión sobre los productos y la marca, así como para comprender las necesidades de los clientes.

Este tutorial cubre los siguientes puntos:

  • Inicializar el entorno de pruebas de Messages API en Vonage

  • Recopilar datos de los clientes a través de Facebook

  • Crear un bot para gestionar los comentarios de los clientes en Facebook por:

    • Almacenamiento de estos datos en una base de datos o en un archivo de texto

    • Devolver al cliente las respuestas pertinentes

  • Cree un cuadro de mandos a través de Streamlit para comprender en tiempo real los sentimientos de los clientes.

  • Mida los sentimientos de los clientes con una escala positiva, negativa y neutra

  • Analice los principales puntos débiles de los clientes mediante la visualización

Requisitos previos

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.

Crear un bot de Facebook

Messages API Sandbox permite a las empresas enviar y recibir mensajes a través de varios canales sociales, como WhatsApp, Facebook y Viber. También permite a las empresas enviar SMS y MMS a través de esta API. Para enviar mensajes a través de cualquiera de los canales sociales externos, necesitarás una cuenta comercial con cada proveedor y tenerla conectada a tu cuenta de API de Vonage.

Para este tutorial utilizaremos Facebook, así que asegúrate de que tienes una Account de Facebook lista para hacer la prueba.

Para empezar a crear nuestra aplicación, en el directorio de tu proyecto ejecuta el siguiente comando para inicializar el proyecto node, y luego instala las librerías de terceros necesarias:

npm init -y npm install express body-parser nedb @vonage/server-sdk@beta dotenv

Los comandos anteriores crearán package.json, package.lock así como un directorio node_modules directorio. Dentro del archivo package.json verás las librerías que acabamos de instalar, como express y vonage/server-sdk. Un ejemplo de lo que verás se muestra a continuación:

{
  "name": "facebook-bot",
  "version": "1.0.0",
  "description": "Sign up for a Vonage API account at ${CUSTOMER_DASHBOARD_URL}.",
  "main": "index.js",
  "scripts": {
    "serve": "node index.js"
  },
  "keywords": [],
  "author": "",
  "license": "ISC",
  "dependencies": {
    "@vonage/server-sdk": "^2.10.7-beta",
    "body-parser": "^1.19.0",
    "dotenv": "^8.2.0",
    "express": "^4.17.1",
    "nedb": "^1.8.0"
  },
  "devDependencies": {}
}

Cuando llegue un mensaje de Facebook, Vonage enviará una solicitud HTTP a una URL de webhook preconfigurada. Tu aplicación Node debe ser accesible a Internet para recibirla, por lo que recomendamos usar Ngrok.

En tu Terminal, ejecuta el siguiente comando para lanzar Ngrok en el puerto 3000 (Tenga en cuenta que la URL de reenvío cambia cada vez que se reinicia ngrok, así que téngalo en cuenta si va a reiniciar ngrok):

npx ngrok http 3000

Ahora tenemos que crear una aplicación en el dashboard. Asegúrese de añadir un nombre relevante para el propósito de la aplicación, a continuación, active Messages ya que esta aplicación tendrá que hacer uso de la Messages API. A continuación, haga clic en el botón "Generar clave pública y privada". Esto obligará a su navegador a descargar un archivo private.key archivo. Colócalo en el directorio raíz de tu proyecto. Por último, haga clic en el botón Generate new application que le redirigirá a la página de presentación de la aplicación. Haga una copia del Application ID que se muestra en la página, ya que también será necesario en el código más adelante.

Mientras estás en esta página, debemos definir las URL de los webhooks. Un webhook es una extensión de una API, pero en lugar de que tu código solicite datos de la plataforma API, Vonage te envía los datos a ti. Los datos llegan en una solicitud web a tu aplicación, que puede ser el resultado de una llamada anterior a la API (este tipo de webhook también se denomina "devolución de llamada"), como una solicitud asincrónica a la API de mensajería. Los webhooks también se utilizan para notificar a tu aplicación de eventos como un mensaje entrante que debe almacenarse en un archivo o enviar un mensaje saliente a la aplicación.

Las URL deben actualizarse en el panel de control como se muestra a continuación (Asegúrese de reemplazar <ngrok URL> con su url ngrok):

  • Webhooks de entrada: http://<ngrok URL>/webhooks/inbound

  • Webhooks de estado: http://<ngrok URL>/webhooks/status

Navegue de nuevo al Mensajes Sandbox para incluir tu cuenta de Facebook en la lista blanca de Facebook Messenger Sandbox. Haz clic en Add to sandbox y sigue las instrucciones que aparecen en la página.

Guarde sus credenciales en un archivo .env al que se puede acceder a través de index.js.

VONAGE_API_KEY=### VONAGE_API_SECRET=### VONAGE_APPLICATION_ID=e0c5d5d8-###

Luego, en el archivo index.js incluye los módulos que se hayan instalado previamente, como express, Vonage server-sdk, como se muestra en el siguiente ejemplo:

const app = require('express')()
const bodyParser = require('body-parser')
const nedb = require('nedb')
const Vonage = require('@vonage/server-sdk')

A continuación, tenemos que crear una base de datos con el nombre de archivo messages.dbañada la siguiente línea a su index.js archivo:

const messages = new nedb({ filename: 'messages.db', autoload: true })

Ahora debemos inicializar un nuevo objeto de Vonage con nuestras credenciales, que consisten en la clave de la API, el secreto de la API, el ID de la aplicación, junto con la ruta y el nombre de archivo de private.key. También debemos configurar la URL del host de la API para que apunte a la URL del sandbox. En su archivo index.js añada el siguiente código:

const vonage = new Vonage({
  apiKey: process.env.VONAGE_API_KEY,
  apiSecret: process.env.VONAGE_API_SECRET,
  applicationId: process.env.VONAGE_APPLICATION_ID,
  privateKey: './private.key'
}, {
  apiHost: 'https://messages-sandbox.nexmo.com'
})

Vamos a crear una función llamada sendMessageque enviará mensajes a Facebook en respuesta a las consultas, comentarios o reseñas de los clientes. En la función, que se muestra en el ejemplo a continuación, hay un elemento to y un fromque serán instrucciones para la API. El to (o destinatario) debe ser la cuenta de Facebook incluida en la lista blanca. Añade la siguiente función a tu archivo index.js archivo:

function sendMessage(sender, recipient, text) {
  const to = { type: 'messenger', id: recipient }
  const from = { type: 'messenger', id: sender }
  const message = { content: { type: 'text', text: text } }
 
  vonage.channel.send(to, from, message, function(error, result) {
    if(error) { return console.error(error) }
    console.log(result)
  })
}

En el ejemplo anterior verá vonage.channel.sendque envía un mensaje con los parámetros to, from y mensaje y en caso de error, devuelve este error, y registrará el mensaje de error.

A continuación, tendremos que añadir el webhook en nuestra aplicación para escuchar la ruta /webhooks/inbound en la URL, que recibirá mensajes de la Messages API cada vez que se reciba un mensaje de Facebook. Se analiza y obtiene el id de mensajería del remitente desde el cuerpo y también el texto que se envía, junto con la marca de tiempo e insertar en los mensajes de respuesta dada ya sea una condición de error if-else será una comprensión exitosa de los comentarios de los usuarios.

Si se produce un error, el mensaje enviado al remitente será "¡Lo siento! ¿Podría repetirlo?". Por otro lado, si el mensajero recupera y envía el mensaje de los clientes a la aplicación, se almacenará en messages.db mientras que a los usuarios se les devolverá una respuesta del tipo "¡Gracias por su comentario y valoración!". Así que añade lo siguiente a tu archivo index.js archivo:

app.post('/inbound', function(request, response) {
  if (request.body.message.content.text.toLowerCase().trim() === 'recap') {
    messages.find({'from.id': request.body.from.id }, function (error, records) {
      if (error) { return console.error(error) }
      const message = records.map(function(record) {
        return record.message.content.text + ' (sent at ' + record.timestamp + ')'
      }).join('\n\n')
      sendMessage(request.body.to.id, request.body.from.id, message)
    })
  } else {
    messages.insert(request.body, function (error, record) {
      if (error) {
        sendMessage(request.body.to.id, request.body.from.id, 'Sorry! Could you repeat?')
        return console.error(error)
      }
      sendMessage(request.body.to.id, request.body.from.id, 'Thanks for your feedback and review!')
    })
  }
 
  response.send('ok')
})

Por último, tenemos que añadir otro listener para el endpoint /webhooks/status que devolverá el mensaje "ok". También necesitamos añadir la funcionalidad de escucha, que mantiene la aplicación ejecutándose y escuchando como un servidor web en el puerto 3000. Así que al final de tu archivo index.js añade lo siguiente:

app.post('/status', function(request, response) {
  console.log(request.body)
  response.send('ok')
})
app.listen(3000)

¡Ahora es el momento de probar tu aplicación! Primero necesitas ejecutar tu aplicación web, en tu Terminal, ejecuta el siguiente comando:

node index.js

Ahora, si vas a Facebook Messengerbusca el usuario de Vonage Sandbox y envíale un mensaje. Recibirás una respuesta en Messenger.

Analizar los comentarios de los usuarios

Los datos del Facebook de los clientes a través del sandbox de Vonage se almacenan en el messages.db archivo. En una demostración simulada, un usuario hizo una crítica de los productos y servicios de una empresa a medida y una muestra de los datos se registra en el script de ejemplo siguiente.

{"message_uuid":"e6e659be-3cdb-464f-96ef-8597cb307586","from":{"type":"messenger","id":"3819505444810553"},"to":{"type":"messenger","id":"107083064136738"},"message":{"content":{"type":"text","text":"how terrible can this product be, does not solve my pain point"}},"timestamp":"2021-03-15T08:43:30.993Z","_id":"6TdDhlo8CVxEr7tq"}
{"message_uuid":"7775fa83-f073-481c-8866-c60bca28ec97","from":{"type":"messenger","id":"3819505444810553"},"to":{"type":"messenger","id":"107083064136738"},"message":{"content":{"type":"text","text":"how can there be no response for so long on such bad service"}},"timestamp":"2021-03-15T08:44:37.924Z","_id":"GSVzREWsYllKHOlJ"}

Podemos ver que cada message_uuid es único para cada mensaje enviado al bot de Facebook. Las direcciones from y to especifican la identidad de los clientes y del bot respectivamente. El mensaje contiene el contenido que está en un tipo de texto y es simplemente la retroalimentación proporcionada por el cliente. Para analizar estos comentarios, se visualizarán a través del framework Streamlit de python con librerías como TextBlob, WordCloud, Matplotlib y Pandas. Cree un nuevo archivo llamado dashboard.py y añade el siguiente código en este nuevo archivo:

import streamlit as st
from textblob import TextBlob
from wordcloud import WordCloud, STOPWORDS, ImageColorGenerator
import matplotlib.pyplot as plt
import pandas as pd
st.set_option('deprecation.showPyplotGlobalUse', False)

Streamlit es un marco de aplicaciones de código abierto para equipos de aprendizaje automático y ciencia de datos. TextBlob es una biblioteca de Python para el procesamiento de datos textuales. Proporciona una API sencilla para sumergirse en tareas comunes de procesamiento del lenguaje natural (PLN). WordCloud es una técnica para mostrar qué palabras son las más frecuentes en un texto dado. Matplotlib es una completa biblioteca para crear visualizaciones estáticas, animadas e interactivas en Python. Pandas es una herramienta de análisis y manipulación de datos de código abierto, rápida, potente, flexible y fácil de usar, construida sobre el lenguaje de programación Python.

Con todas estas herramientas, en primer lugar, abrimos los datos almacenados en messages.db, leemos y procesamos todos los registros de comentarios recopilados de todos los usuarios. Buscamos los mensajes/contenidos y eliminamos la marca de tiempo porque no es necesaria para el análisis del sentimiento en la opinión. Los comentarios procesados se almacenarán en una lista.

El ejemplo que figura a continuación lleva a cabo las instrucciones enumeradas anteriormente. Añada lo siguiente al final de su archivo dashboard.py archivo:

file1 = open('messages.db', 'r')
Lines = file1.readlines()
feedback_list = list()
for line in Lines:
   feedback = line.split(":")[11]
   feedback = feedback.replace('}},"timestamp"',"")
   feedback_list.append(feedback)

A continuación, generamos una nube de palabras para visualizar la frecuencia de las palabras proporcionadas en los comentarios por los usuarios. Podemos ver que ciertas palabras clave son mucho más prominentes, como "terrible", "largo", "malo", etc. Wordcloud simplemente cuenta cuántas veces ha aparecido cada palabra en todas las frases de los comentarios proporcionados por los clientes. Una forma mejor sería analizar el sentimiento general del cliente.

Podemos utilizar el análisis de polaridad de sentimiento básico de TextBlob en la frase que da una estimación relativamente fiable de las experiencias emotivas del cliente a partir de sus comentarios textuales y almacenarlos en una nueva lista de valores de sentimiento. Ahora en su dashboard.py añade el siguiente código:

sentiment_values = list()
for feedback in feedback_list:
    sentiment_feedback = TextBlob(feedback).sentiment.polarity
    sentiment_values.append(sentiment_feedback)

A continuación, mostraremos el sentimiento global dentro de un rango de -1 a 1. Para polaridades de sentimiento superiores a 0, la salida será verde, mientras que para aquellos valores negativos que signifiquen infelicidad, el sentimiento se mostrará en rojo en la página web. Copie lo siguiente en su archivo dashboard.py archivo:

st.title("Overall Sentiment")
if average_sentiment > 0:
   colors = 'green'
else:
   colors = 'red'

Actualmente, la opinión general es de -0,417, lo que sugiere que, en general, muchos de los comentarios no apoyan los productos y servicios de la empresa. Podemos ver los comentarios en una tabla en la que se muestra cada una de las opiniones. Hay pocas opiniones con valor 0. Esto significa que, según el análisis, la opinión es neutra y no se entienden las connotaciones negativas del mensaje. Podemos ver que "Este producto no está a la altura..." y "Sólo utilizaré este producto si me lo regalan" sugerirían sentimientos negativos, pero el resultado es neutro o positivo. Por lo tanto, se puede desarrollar un modelo más complejo de aprender y entrenar para el análisis de sentimientos en este caso de uso. Además, es posible que el análisis general de los sentimientos no quiera ser una simple media, sino cálculos potencialmente más complejos o una media ponderada.

La aplicación Streamlit web dashboard puede iniciarse inicializando el siguiente comando. Streamli necesita ser instalado para que el panel de control web sea configurado. Otros métodos de despliegue en flask o Django funcionan igual de bien y pueden ser explorados.

streamlit run dashboard.py

En conclusión, este tutorial ha mostrado cómo configurar y conectar una API de Messages API de Vonage a Facebook y recopilar comentarios de los clientes que luego se analizan mediante el análisis de sentimientos para realizar un seguimiento en tiempo real de los sentimientos de los clientes.

Compartir:

https://a.storyblok.com/f/270183/312x306/c035eb1226/solomon-soh.png
Solomon Soh

Solomon Soh is a Alteryx and Alibaba Cloud Certified practitioner who focus on developing AI solutions for ad-tech, fintech, and operational business problems.