https://d226lax1qjow5r.cloudfront.net/blog/blogposts/sentiment-api-analysis-comparison-dr/TW_EN_Sentiment-Analysis_1200x675.jpg

Comparación de las API de análisis de sentimiento

Publicado el May 11, 2021

Tiempo de lectura: 7 minutos

La comunicación escrita entre dos personas suele resultar difícil cuando se trata de interpretar las emociones. Las conversaciones en línea se malinterpretan con facilidad, lo que lleva a resultados no deseados o inesperados.

El análisis del sentimiento nos permite extraer el significado del texto mediante programación, lo que permite a los desarrolladores crear aplicaciones con circuitos de retroalimentación que pueden automatizarse en su mayor parte.

Disponer de la capacidad de analizar texto y dirigir a las personas al canal adecuado proporciona una capacidad distintiva para encontrar a los clientes que están menos satisfechos y pueden necesitar asistencia adicional o algún otro tipo de intervención.

Cualquier empresa que utilice la comunicación de texto, ya sea en las redes sociales o en los canales de asistencia, se beneficia enormemente de este análisis con fines de aprendizaje tanto a posteriori como en tiempo real. Como desarrolladores, podemos proporcionar esta funcionalidad a la organización con facilidad.

Visión general

Este post sirve como comparación de cuatro servicios en la nube de análisis de sentimientos: Amazon Comprehend, Azure Text Analytics, Google Natural Languagee IBM Watson Tone Analyzer.

Como entrada de texto, he utilizado el Nexmo Mensajes Entrantes webhook para obtener información instantánea del servicio con cada mensaje de texto. Durante el proceso, me aseguré de capturar algunas notas y las organicé aquí para ayudarte a evaluar un proveedor.

Precisión y puntuación

Cada servicio utiliza un sistema de puntuación ligeramente diferente. Sin embargo, cada uno tiende a utilizar 1 como referencia para el nivel de confianza. Cuanto más se acerque el número a 1, más seguro estará el servicio de que el sentimiento es exacto. Watson Tone Analyzer añade etiquetas al sentimiento como joy, sadnessy analytical para intentar clasificar mejor el sentimiento, mientras que los demás tienden a basarse únicamente en positivo y negativo.

Como se observa en las pruebas siguientes, la precisión de los sentimientos es fácil cuando la redacción y la intención son claras. Sin embargo, el contexto humano en el discurso puede cambiar drásticamente un sentimiento con el uso de lenguaje como el sarcasmo. El sarcasmo y otros recursos lingüísticos dificultan la precisión del análisis de sentimientos en el 100% de los casos y, en general, en el conjunto de las comunicaciones de texto.

"¡Soy feliz!"

Todos los servicios obtuvieron esta respuesta positiva/placentera sin demasiados problemas.

  • Amazon Comprehend - Positive - 0.9970158338546753

  • API de análisis de texto de Azure - 0.9928278923034668

  • API de lenguaje natural de Google - 0.800000011920929

  • Analizador de tonos Watson: 1 - Joy

"Estoy triste."

Otra prueba sencilla que arrojó un sentimiento negativo. Fíjate en que Google utiliza números negativos para el sentimiento negativo.

  • Amazon Comprehend - Negative - 0.9563825130462646

  • API de análisis de texto de Azure - 0.0036676526069641113

  • API de lenguaje natural de Google - -0.20000000298023224

  • Analizador de tonos Watson: 1 - Sadness

"Tan feliz de que hubiera un examen sorpresa hoy."

En la tercera prueba, utilicé un texto engañoso a propósito. Lo más probable es que esta frase fuera un sarcasmo y que el sentimiento fuera lo contrario de feliz. Todos los servicios confiaban menos en la exactitud del sentimiento positivo, pero Google le siguió la corriente.

  • Amazon Comprehend - Positive - 0.978675365447998

  • API de análisis de texto de Azure - 0.887139081954956

  • API de lenguaje natural de Google - 0.800000011920929

  • Analizador de tonos Watson: 0.899749 - Joy

Características

El tema principal de este artículo es el análisis de opiniones. Todos los proveedores de servicios enumerados aquí ofrecen al menos eso como mínimo. Google, Azure y Amazon también ofrecen herramientas adicionales de procesamiento del lenguaje natural, como análisis de entidades, análisis sintáctico, clasificación de contenidos y extracción de frases clave. IBM Watson Tone Analyzer solo ofrece análisis de sentimiento.

El precio de la funcionalidad adicional también varía según el proveedor, así que si piensas utilizarla, asegúrate primero de verificar los costes.

Idiomas admitidos

Los idiomas soportados varían bastante de un servicio a otro. Watson Tone Analyzer es el que menos idiomas admite, sólo inglés y francés. Todos los demás servicios ofrecen, como mínimo, estos y muchos otros idiomas. Los idiomas comunes son el alemán, el francés, el italiano, el español, el inglés y el portugués.

Soporte lingüístico de Amazon Comprehend

Compatibilidad con el lenguaje Azure Text Analytics

Asistencia lingüística de la API de lenguaje natural de Google

Watson Tone Analyzer Soporte de idiomas

Facilidad de uso

El análisis de sentimiento es una funcionalidad bien establecida para cada proveedor de nube. La configuración de cada servicio fue prácticamente la misma, con pequeñas excepciones. Los requisitos típicos incluyen activar el servicio y obtener las credenciales directamente del servicio o de un usuario autenticado.

Todos los servicios proporcionan un SDK con la funcionalidad incorporada para que la configuración y el uso sean sencillos.

Amazon Comprender

La solicitud de Amazon Comprehend utiliza una matriz para pasar varias frases a la vez y responde con un objeto referenciado por índice que utiliza Positive, Negative, Neutraly Mixed puntuaciones. El uso de puntuaciones múltiples como esta podría resultar útil en ocasiones en las que la frase es más compleja y no entra simplemente en una categoría de puntuación.

Solicitar

function analyzeTone(params) {
  var obj = {
    LanguageCode: "en",
    TextList: [
      params.text,
    ]
  };
    var comprehend = new AWS.Comprehend({region: process.env.AWS_REGION});
    comprehend.batchDetectSentiment(obj, function (err, data) {
    if (err) {
      console.log(err, err.stack);
    }
    else{
      console.dir(data, {depth: null})
    }
  });
}

Respuesta

{
  ResultList: [
    {
      Index: 0,
      Sentiment: 'POSITIVE',
      SentimentScore: {
        Positive: 0.9970158338546753,
        Negative: 0.0002091785572702065,
        Neutral: 0.002759476425126195,
        Mixed: 0.000015530584278167225
      }
    }
  ],
  ErrorList: []
}

Si quieres probarlo, tenemos un repositorio para Amazon Comprehend usando mensajería Nexmo.

Documentación de la API de Amazon Comprehend

API de análisis de texto de Azure

Solicitar

Azure Text Analytics también utiliza una matriz para varias líneas de texto, pero requiere el método text y id como objeto. La respuesta es un poco deficiente en comparación con los otros servicios, ya que sólo proporciona una puntuación de 0 a 1, con 0 como negative y 1 como positive.

function analyzeTone(params) {
  const creds = new CognitiveServicesCredentials.ApiKeyCredentials({ inHeader: { 'Ocp-Apim-Subscription-Key': process.env.TEXT_ANALYTICS_SUBSCRIPTION_KEY } });
  const client = new TextAnalyticsAPIClient.TextAnalyticsClient(creds, process.env.TEXT_ANALYTICS_ENDPOINT);

  const inputDocuments = {documents:[
      {id:"1", text:params.text}
  ]}

  const operation = client.sentiment({multiLanguageBatchInput: inputDocuments})
  operation
  .then(result => {
      console.dir(result, {depth: null})
  })
  .catch(err => {
      throw err;
  });

}

Respuesta

{ documents: [ { id: '1', score: 0.9928278923034668 } ], errors: [] }

Si quieres probarlo, tenemos un repositorio para Amazon Comprehend usando mensajería Nexmo.

Documentación de la API Azure Text Analytics

API de lenguaje natural de Google

La API de lenguaje natural de Google proporciona un método que acepta un documento cada vez, lo que puede generar tráfico adicional con un uso más sustancial. La respuesta proporciona una puntuación utilizando -1,0 como negative y 1,0 como positiveasí como una puntuación de magnitud, que es el valor absoluto de la puntuación. También responde con dos undefined claves en la respuesta que, a pesar de investigaciones adicionales, siguen sin explicación.

Solicitar

// Google Cloud Sentiment Analysis
const client = new language.LanguageServiceClient();

function analyzeTone(params) {
  let document = {
    content: params.text,
    type: 'PLAIN_TEXT',
  };

  client.analyzeSentiment({document: document})
      .then(results => {
        console.dir(results, {depth: null})
      })
      .catch(err => {
        console.log('error', err);
      });
}

Respuesta

[
  {
    sentences: [
      {
        text: { content: 'I am happy!', beginOffset: -1 },
        sentiment: { magnitude: 0.800000011920929, score: 0.800000011920929 }
      }
    ],
    documentSentiment: { magnitude: 0.800000011920929, score: 0.800000011920929 },
    language: 'en'
  },
  undefined,
  undefined
]

Si quieres probarlo, tenemos un repositorio para la API de Lenguaje Natural de Google utilizando la mensajería Nexmo.

Documentación de la API de lenguaje natural de Google

Analizador de tonos Watson

Watson Tone Analyzer también acepta una entrada de texto, pero también permite pasar frases y analizarlas individualmente con el indicador sentences en verdadero. La respuesta devuelve un rango de puntuación de 0 a 1, pero también incluye un tone_id que puede incluir lo siguiente anger, fear, joy, sadness, analytical, confident, tentative. Los tonos pueden ayudar a dar forma al significado de las frases un poco mejor y proporciona un contexto más humano.

Solicitar

// IBM Watson Tone Analysis
var toneAnalyzer = new ToneAnalyzerV3({
  iam_apikey: process.env.TONE_ANALYZER_IAM_APIKEY,
  url: process.env.TONE_ANALYZER_URL,
  version: '2017-09-21'
});

function analyzeTone(params) {
  let toneParams = {
    tone_input: { 'text': params.text},
    content_type: 'application/json',
  };

  toneAnalyzer.tone(toneParams)
      .then(toneAnalyzer => {
        console.dir(toneAnalyzer, {depth: null})
      })
      .catch(err => {
        console.log('error', err);
      });
}

Respuesta

{
  document_tone: { tones: [ { score: 1, tone_id: 'joy', tone_name: 'Joy' } ] }
}

Si quieres probarlo, tenemos un repositorio para IBM Watson Tone Analyzer usando mensajería Nexmo.

Documentación del análisis tonal Watson

Coste

Los precios de estos servicios resultaron un poco confusos a primera vista, pero después de pensar y calcular un poco, pude determinar cómo se desglosaban las cosas.

Tanto Amazon como Google cobran en una medida de units. La unidad de Amazon es de 100 caracteres con un mínimo de 300, y Google utiliza bloques de 1000 caracteres, cobrando la misma cantidad de 1 a 1000 caracteres. Azure también cobra por 1000 caracteres, pero los denomina text records. IBM mide por llamadas a la API.

Teniendo esto en cuenta, la forma más fácil de normalizar los distintos costes es utilizar como ejemplo un mensaje de 1.000 caracteres con un volumen de 500.000 al mes en un sistema estándar (mayor potencia de cálculo disponible a mayor coste). La tarificación por volumen puede ayudar en su caso concreto si tiene una cantidad significativamente superior.

Provider Free Tier Cost Normalized Cost*
Amazon Comprehend N/A Up to 10M Units - $0.0001 $500
Azure Text Analytics API 5,000 Text Records/Month 0-500K - $2 per 1,000 text records $1000
Google Natural Language API 5,000 Units/Month 5K+ -1M $1.00/1000 units $500
Watson Tone Analyzer 2,500 API Calls/Month 1-250K @ $0.0088
250K-500K @ $0.0013
$2437

* Costes basados en 500.000.000 de caracteres enviados al mes - a 10/11/19 - sujeto a cambios

Recapitulemos

Recorrer todos estos servicios resultó ser un ejercicio divertido y una buena experiencia de aprendizaje sobre el poder del análisis de sentimientos. Todos los proveedores ofrecen un buen nivel de funcionalidad y precisión. Al seleccionar uno de los 4 proveedores, asegúrese de evaluar en función de sus necesidades lingüísticas y determine el desglose de costes en función de su uso, ya que cada servicio disminuye con el volumen.

Amazon Comprehend, con sus características adicionales, bajo coste y soporte básico de idiomas, lo convierte en mi primera opción. Es fácil de configurar, sencillo de usar y el objeto de respuesta tiene detalles que me resultan muy útiles.

Si desea probar alguno o todos estos servicios, el programa equipo de Nexmo Extend ha creado un código de ejemplo para ayudarte a empezar.

Compartir:

https://a.storyblok.com/f/270183/384x384/444c073b5e/kellyjandrews.png
Kelly J AndrewsAntiguo miembro del equipo

Kelly J Andrews es desarrolladora de Nexmo y lleva más de 30 años jugando con los ordenadores. Utilizó BASIC por primera vez a los 5 años.

No fue hasta que creó su primera página web en 1997 y probó JavaScript por primera vez cuando encontró su verdadera vocación. Kelly lucha ahora por JavaScript, el código comprobable y la entrega rápida.

Se le puede encontrar cantando karaoke, haciendo magia o animando a los Cubs y a los Fighting Irish.