Cómo desplegar NLP: Ejemplo de análisis de sentimiento

illustration-industries-retail.png

Como parte de nuestra serie de varios blogs sobre el procesamiento del lenguaje natural (NLP), analizaremos un ejemplo utilizando un modelo NLP de análisis de sentimiento para evaluar si los campos de comentarios (texto) contienen sentimientos positivos o negativos. Usando un modelo disponible de forma pública, te mostraremos cómo desplegar ese modelo en Elasticsearch y usar el modelo en un pipeline de ingesta para clasificar las opiniones de los clientes como positivas o negativas.

El análisis de sentimiento es un tipo de clasificación binaria en el que se predice que el campo será un valor u otro. Por lo general, hay una puntuación de probabilidad para esa predicción entre 0 y 1, y las puntuaciones más cercanas a 1 indican predicciones más seguras. Este tipo de análisis de NLP se puede aplicar de manera útil a muchos conjuntos de datos, como reseñas de productos o comentarios de los clientes.

Las opiniones de los clientes que deseamos clasificar se encuentran en un conjunto de datos públicos del Desafío de conjuntos de datos de Yelp de 2015. El conjunto de datos, recopilados del sitio de Yelp Review, es el recurso perfecto para probar el análisis de sentimiento. En este ejemplo, evaluaremos una muestra del conjunto de datos de reseñas de Yelp con un modelo NLP de análisis de sentimiento común y usaremos el modelo para etiquetar los comentarios como positivos o negativos. Esperamos descubrir qué porcentaje de reseñas son positivas y negativas.

Despliegue del modelo de análisis de sentimiento en Elasticsearch

El primer paso es instalar el modelo desde Hugging Face con el agente docker Eland que creamos en el ejemplo de NER:
docker run -it --rm elastic/eland \
    eland_import_hub_model \
      --url $ELASTICSEARCH_URL \
      --hub-model-id distilbert-base-uncased-finetuned-sst-2-english \
      --task-type text_classification \
      --start

Esta vez, --task-type está configurado a text_classification y la opción --start se pasa al script de Eland para que el modelo se despliegue automáticamente sin tener que iniciarlo en la UI de Gestión de modelo.

Una vez desplegado, prueba estos ejemplos en la consola de Kibana:

POST _ml/trained_models/distilbert-base-uncased-finetuned-sst-2-english/deployment/_infer
{
  "docs": [
    {
      "text_field": "The movie was awesome!"
    }
  ]
}

Este debería ser el resultado que veas:

{
  "predicted_value" : "POSITIVE",
  "prediction_probability" : 0.9998643924765398
}

También puedes probar este ejemplo:

POST _ml/trained_models/distilbert-base-uncased-finetuned-sst-2-english/deployment/_infer
{
  "docs": [
    {
      "text_field": "The cat was sick on the bed"
    }
  ]
}

Produce una respuesta fuertemente negativa tanto para el gato como para la persona que limpia las sábanas.

{
  "predicted_value" : "NEGATIVE",
  "prediction_probability" : 0.9992468477843378
}

Análisis de las reseñas de Yelp

Como se mencionó en la introducción, utilizaremos un subconjunto de las reseñas de Yelp disponibles en Hugging Face que se han marcado manualmente con sentimiento. Esto nos permitirá comparar los resultados con el índice marcado. Usaremos la función de carga de archivos de Kibana a fin de cargar una muestra de este conjunto de datos para procesar con el procesador de inferencia.

En la consola de Kibana, podemos crear un pipeline de ingesta (como hicimos en la publicación de blog anterior), esta vez para el análisis de sentimiento, y llamarla sentiment. Las reseñas están en un campo llamado review. Como hicimos antes, definiremos un field_map para mapear review al campo que espera el modelo. Se establece el mismo controlador on_failure desde el pipeline de NER:  

PUT _ingest/pipeline/sentiment
{
  "processors": [
    {
      "inference": {
        "model_id": "distilbert-base-uncased-finetuned-sst-2-english",
        "field_map": {
          "review": "text_field"
        }
      }
    }
  ],
  "on_failure": [
    {
      "set": {
        "description": "Index document to 'failed-<index>'",
        "field": "_index",
        "value": "failed-{{{_index}}}"
      }
    },
    {
      "set": {
        "description": "Set error message",
        "field": "ingest.failure",
        "value": "{{_ingest.on_failure_message}}"
      }
    }
  ]
}

Los documentos de reseñas se almacenan en el índice de Elasticsearch yelp-reviews. Utilice la API de reindexación para enviar los datos de las reseñas a través del pipeline de análisis de sentimiento. Dado que la reindexación tardará algún tiempo en procesar todos los documentos e inferir sobre ellos, reindexa en segundo plano invocando la API con el marcador wait_for_completion=false. Verifica el progreso con la API de administración de tareas.

POST _reindex?wait_for_completion=false
{
  "source": {
    "index": "yelp-reviews"
  },
  "dest": {
    "index": "yelp-reviews-with-sentiment",
    "pipeline": "sentiment"
  }
}

Lo anterior devuelve una ID de tarea. Podemos monitorear el progreso de la tarea con lo siguiente:

The above returns a task id. We can monitor progress of the task with:

Como alternativa, rastrea el progreso observando el aumento del recuento de inferencias en la UI de estadísticas de modelo.

Los documentos reindexados ahora contienen los resultados de las inferencias. Como ejemplo, uno de los documentos analizados se ve así:

{
    "review": "The food is good. Unfortunately the service is very hit or miss. The main issue seems to be with the kitchen, the waiters and waitresses are often very apologetic for the long waits and it's pretty obvious that some of them avoid the tables after taking the initial order to avoid hearing complaints.",
    "ml": {
        "inference": {
            "predicted_value": "NEGATIVE",
            "prediction_probability": 0.9985209630712552,
            "model_id": "distilbert-base-uncased-finetuned-sst-2-english"
        }
    },
    "timestamp": "2022-02-02T15:10:38.195345345Z"
}

El valor predicho es NEGATIVO, lo cual es razonable dado el mal servicio.

Visualizar cuántas reseñas son negativas

¿Qué porcentaje de reseñas son negativas? ¿Y cómo se compara nuestro modelo con el sentimiento etiquetado manualmente? Averigüémoslo creando una visualización simple para rastrear reseñas positivas versus negativas del modelo y manualmente. Al crear una visualización basada en ml.inference.predicted_value field, podemos reportar sobre la comparación y ver que aproximadamente el 44 % de las reseñas se consideran positivas y, de ellas, el 4,59 % se etiqueta incorrectamente en el modelo de análisis de sentimiento.

Prueba

El NLP es una nueva e importante característica de Elastic Stack para la versión 8.0, con un emocionante roadmap. Descubre características nuevas y mantente al tanto de los desarrollos más recientes creando tu cluster en Elastic Cloud. Suscríbete para una prueba gratuita de 14 días hoy y prueba los ejemplos de este blog.

Si deseas conocer más sobre NLP, lee: