https://a.storyblok.com/f/270183/121424/edb5efa544/tw_en_sentiment-analysis_1200x675.jpg

Comparação de APIs de análise de sentimento

Publicado em May 11, 2021

Tempo de leitura: 8 minutos

A comunicação escrita entre duas pessoas costuma ser um desafio quando se trata de interpretar emoções. As conversas online são facilmente mal interpretadas, o que pode levar a resultados indesejados ou inesperados.

A análise de sentimentos nos permite extrair significado do texto de forma programática, possibilitando que os desenvolvedores criem Applications com ciclos de feedback que podem ser, em grande parte, automatizados.

A capacidade de analisar textos e encaminhar as pessoas para o canal adequado oferece uma vantagem competitiva para identificar clientes que não estão totalmente satisfeitos e que possam precisar de assistência adicional ou de algum outro tipo de intervenção.

Qualquer empresa que utilize comunicação por mensagens de texto, seja nas redes sociais ou em canais de atendimento, se beneficia enormemente dessa análise para fins de aprendizado, tanto a posteriori quanto em tempo real. Como desenvolvedores, podemos oferecer essa funcionalidade à organização com facilidade.

Visão geral

Esta publicação apresenta uma comparação entre quatro serviços em nuvem de análise de sentimento: Amazon Comprehend, Azure Text Analytics, Google Natural Languagee IBM Watson Tone Analyzer.

Como entrada de texto, utilizei o webhook de mensagens recebidas do Nexmo para permitir um feedback instantâneo do serviço a cada mensagem de texto. Durante o processo, tomei o cuidado de anotar algumas observações e as organizei aqui para ajudar você a avaliar um provedor.

Precisão e pontuação

Cada serviço utiliza um sistema de pontuação ligeiramente diferente. No entanto, cada um tende a usar 1 como referência para um nível de confiança. Quanto mais próximo de 1 for o número, maior será a confiança do serviço de que o sentimento está correto. O Watson Tone Analyzer atribui rótulos ao sentimento, como joy, sadness, e analytical para tentar classificar o sentimento de forma mais detalhada, enquanto os demais tendem a se basear apenas em positivo e negativo.

Conforme constatado nos testes abaixo, é fácil determinar a precisão do sentimento quando a formulação e a intenção são claras. No entanto, o contexto humano na fala pode alterar drasticamente um sentimento com o uso de recursos linguísticos como o sarcasmo. O sarcasmo e outros recursos linguísticos tornam a análise de sentimento mais difícil de ser 100% precisa e, de modo geral, a comunicação por texto como um todo.

"Estou feliz!"

Todos os cultos receberam isso como uma reação positiva/alegre, sem muita dificuldade.

  • Amazon Comprehend - Positive - 0.9970158338546753

  • API do Azure Text Analytics - 0.9928278923034668

  • API de Linguagem Natural do Google - 0.800000011920929

  • Watson Tone Analyzer: 1 - Joy

"Estou triste."

Outro teste simples que apresentou um sentimento negativo. Observe aqui que o Google usa números negativos para indicar sentimento negativo.

  • Amazon Comprehend - Negative - 0.9563825130462646

  • API do Azure Text Analytics - 0.0036676526069641113

  • API de Linguagem Natural do Google - -0.20000000298023224

  • Watson Tone Analyzer: 1 - Sadness

"Que alegria que teve uma prova surpresa hoje."

No terceiro teste, utilizei um texto propositalmente enganoso. Essa frase provavelmente seria um sarcasmo, e o sentimento seria o oposto de “feliz”. Todos os serviços se mostraram menos confiantes quanto à precisão do sentimento positivo, mas o Google aceitou a interpretação.

  • Amazon Comprehend - Positive - 0.978675365447998

  • API do Azure Text Analytics - 0.887139081954956

  • API de Linguagem Natural do Google - 0.800000011920929

  • Watson Tone Analyzer: 0.899749 - Joy

Recursos

O foco principal deste post é a análise de sentimento. Todos os provedores de serviços listados aqui oferecem, no mínimo, esse recurso. O Google, o Azure e a Amazon também oferecem ferramentas adicionais de processamento de linguagem natural, como análise de entidades, análise sintática, classificação de conteúdo e extração de frases-chave. O IBM Watson Tone Analyzer oferece apenas a análise de sentimento.

O preço dessa funcionalidade adicional também varia de acordo com o provedor; portanto, se você pretende utilizá-la, certifique-se de Verify os custos primeiro.

Idiomas suportados

Os idiomas suportados variam bastante de um serviço para outro. O Watson Tone Analyzer é o que oferece menos opções, suportando apenas inglês e francês. Todos os outros serviços oferecem, no mínimo, esses idiomas, além de muitos outros. Os idiomas em comum entre eles são alemão, francês, italiano, espanhol, inglês e português.

Suporte a idiomas do Amazon Comprehend

Suporte a idiomas no Azure Text Analytics

Suporte a idiomas da API de Linguagem Natural do Google

Suporte a idiomas do Watson Tone Analyzer

Facilidade de uso

A análise de sentimentos é uma funcionalidade bem estabelecida em todos os provedores de nuvem. A configuração para cada serviço era basicamente a mesma, com pequenas exceções. Os requisitos típicos incluem ativar o serviço e obter as credenciais diretamente do serviço ou de um usuário autenticado.

Todos os serviços oferecem um SDK com funcionalidades integradas para facilitar a configuração e o uso.

Amazon Comprehend

A solicitação do Amazon Comprehend usa um array para enviar várias frases de uma só vez e responde com um objeto indexado que utiliza Positive, Negative, Neutral, e Mixed pontuações. Usar várias pontuações dessa forma pode ser útil em casos em que a frase é mais complexa e não se enquadra apenas em uma categoria de pontuação.

Solicitação

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

Resposta

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

Se você quiser testar isso, temos um repositório para o Amazon Comprehend usando o serviço de mensagens da Nexmo.

Documentação da API do Amazon Comprehend

API do Azure Text Analytics

Solicitação

O Azure Text Analytics também utiliza um array para várias linhas de texto, mas exige o uso do text e id sejam passados como um objeto. A resposta é um pouco limitada em comparação com os outros serviços, fornecendo apenas uma pontuação de 0 a 1, sendo 0 o negative e 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;
  });

}

Resposta

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

Se você quiser testar isso, temos um repositório para o Amazon Comprehend usando o serviço de mensagens da Nexmo.

Documentação da API do Azure Text Analytics

API de Linguagem Natural do Google

A API de Linguagem Natural do Google oferece um método que aceita um documento por vez, o que pode gerar tráfego adicional em casos de uso mais intenso. A resposta fornece uma pontuação utilizando -1,0 como negative e 1,0 como positive, além de uma pontuação de magnitude, que é o valor absoluto da pontuação. Ela também respondeu com duas undefined chaves na resposta que, apesar de pesquisas adicionais, permanecem sem explicação.

Solicitação

// 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);
      });
}

Resposta

[
  {
    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
]

Se você quiser testar isso, temos um repositório para API de Linguagem Natural do Google usando o serviço de mensagens do Nexmo.

Documentação da API de Linguagem Natural do Google

Analisador de Tom Watson

O Watson Tone Analyzer também aceita uma entrada de texto, mas permite que as frases sejam inseridas e analisadas individualmente com o sinalizador sentences definido como “true”. A resposta retorna um valor entre 0 e 1, mas também inclui um tone_id que pode incluir o seguinte: anger, fear, joy, sadness, analytical, confident, tentative. Os tons podem ajudar a definir um pouco melhor o significado das frases e fornecem um contexto mais humano.

Solicitação

// 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);
      });
}

Resposta

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

Se você quiser testar isso, temos um repositório para o IBM Watson Tone Analyzer que utiliza o serviço de mensagens da Nexmo.

Documentação sobre a Análise de Tom do Watson

Custo

A estrutura de preços desses serviços pareceu um pouco confusa à primeira vista, mas, depois de refletir um pouco e fazer alguns cálculos, consegui entender como as coisas funcionavam.

Tanto a Amazon quanto o Google cobram com base em uma unidade de medida de units. A unidade da Amazon é de 100 caracteres, com um mínimo de 300, enquanto o Google usa blocos de 1.000 caracteres, cobrando o mesmo valor para 1 a 1.000 caracteres. O Azure também cobra por 1.000 caracteres, mas chama isso de text records. A IBM mede por chamadas de API.

Diante disso, a maneira mais fácil de normalizar os diferentes custos é usar como exemplo uma mensagem de 1.000 caracteres, com um volume de 500.000 por mês em um sistema padrão (maior poder de computação está disponível a custos mais elevados). A tarifação por volume pode ser vantajosa para o seu caso específico, caso você tenha um volume significativamente maior.

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

* Custos baseados em 500.000.000 de caracteres enviados por mês — a partir de 11/10/19 — sujeitos a alterações

Resumo

Analisar todos esses serviços acabou sendo um exercício divertido e uma boa experiência de aprendizado sobre o poder da análise de sentimentos. Cada fornecedor oferece um bom nível de funcionalidades e precisão. Ao escolher um dos quatro fornecedores, certifique-se de avaliá-lo com base nas suas necessidades linguísticas e determine a composição dos custos de acordo com o seu uso, já que o preço de cada serviço diminui com o aumento do volume.

O Amazon Comprehend, com seus recursos adicionais, baixo custo e suporte a idiomas básicos, é minha primeira escolha. É fácil de configurar, simples de usar e o objeto de resposta contém detalhes que considero muito úteis.

Se você quiser experimentar algum ou todos esses serviços, o equipe do Nexmo Extend criou alguns exemplos de código para ajudar você a começar.

Compartilhar:

https://a.storyblok.com/f/270183/384x384/444c073b5e/kellyjandrews.png
Kelly J AndrewsEx-membro da equipe

Kelly J Andrews é defensora de desenvolvedores da Nexmo e vem se dedicando à informática há mais de 30 anos, tendo usado BASIC pela primeira vez aos 5 anos de idade.

Foi só ao criar sua primeira página da web, em 1997, e ao experimentar o JavaScript pela primeira vez que ele descobriu sua verdadeira vocação. Hoje, Kelly luta pelo JavaScript, pelo código testável e pela entrega rápida.

É possível encontrá-lo cantando no karaokê, fazendo truques de mágica ou torcendo pelos Cubs e pelos Fighting Irish.