
Compartilhar:
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.
Comparação de APIs de análise de sentimento
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.9970158338546753API do Azure Text Analytics -
0.9928278923034668API de Linguagem Natural do Google -
0.800000011920929Watson 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.9563825130462646API do Azure Text Analytics -
0.0036676526069641113API de Linguagem Natural do Google -
-0.20000000298023224Watson 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.978675365447998API do Azure Text Analytics -
0.887139081954956API de Linguagem Natural do Google -
0.800000011920929Watson 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:
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.