Análise de Sentimento com ASP.NET Core e Azure Cognitive Services

Neste artigo veremos como ter acesso a funcionalidade de análise de sentimento em uma aplicação ASP.NET Core, de maneira simples e prática.

O que são Azure Cognitive Services

Serviços de nuvem da Microsoft que disponibiliza recursos de inteligência artificial e machine learning para construção de aplicações “inteligentes”. Eles podem ser acessados por APIs REST, e por SDKs disponíveis em diversas linguagens.

Existem serviços das categorias:

  • Visão
  • Fala
  • Linguagem
  • Decisão

Vamos focar aqui neste artigo na categoria Linguagem, especificamente nos recursos de Análise de Sentimento.

O que é Análise de Sentimento

Análise de sentimento é uma técnica que permite extrair informações quanto ao sentimento de um texto. A métrica utilizada no resultado da análise é um score que vai de 0 a 1 para os 3 tipos de sentimento: Negativo, Neutro, e Positivo.

Os resultados são disponibilizados a nível do documento e também de sentença.

Vamos para a parte mais prática?

Criar um recurso de Análise de Texto

No portal do Azure, busque por “Language” na caixa de busca global, e selecione “Criar language”.

Na tela seguinte, selecione “Continue to create your resource”.

Aqui você deve preencher algumas informações, como:
  • Assinatura
  • Grupo de recursos
  • Região
  • Nome da instância
  • Tipo de preço

Eu selecionei o tipo de preço Free F0, camada gratuita, e o restante fica a sua preferência.

Selecione “Examinar + criar”, revise as informações na nova tela e selecione “Criar”.

Aguarde a implantação do recurso, e selecione “Ir para o recurso”.

Na tela de detalhes do recurso, selecione a opção “Chaves e Ponto de extremidade” no menu lateral, e então em “Mostrar as Chaves”. Salve a CHAVE 1 em um lugar seguro, já que utilizaremos posteriormente no momento de integrar. Também salve o Ponto de extremidade.

Chaves e Ponto de extremidade do recurso Language do Cognitive Services

Com nosso recurso criado, e a chave salva, vamos para a nossa API.

Configurando nossa API

Primeiramente, precisamos instalar o pacote Azure.AI.TextAnalytics através da interface do Gerenciador de Pacotes NuGet ou via comando do .NET CLI abaixo.

dotnet add package Azure.AI.TextAnalytics

Com o pacote instalado, é necessário adicionar o Ponto de extremidade e a chave que obtemos na seção anterior do artigo, e armazenar em nossas configurações. Isso pode ser feito via .NET Secrets, diretamente no appsettings.json (não se deve subir código em um repositório Git com essa informação), ou variável de ambiente.

Eu vou utilizar o appsettings.json para simplificar, mas fica a seu critério e cuidado.

"TextApi": {
    "Key": "<minha-chave>",
    "Endpoint": "<meu-ponto-de-extremidade"
  }

Com isso feito, vou apresentar logo abaixo o código de dois Models que eu utilizarei neste artigo: um modelo de entrada para o texto a ser analisado, e um modelo de saída para o resultado da análise de sentimento.

Modelo de entrada (Input Model)

public class SentimentAnalysisInputModel
    {
        public string Text { get; set; }
    }

Modelo de saída (View Model)

public class SentimentAnalysisViewModel
    {
        public SentimentAnalysisViewModel(string text, TextSentiment sentiment, double positive, double neutral, double negative)
        {
            Text = text;
            Sentiment = sentiment.ToString();
            Positive = positive;
            Neutral = neutral;
            Negative = negative;
        }

        public string Text { get; private set; }
        public string Sentiment { get; private set; }
        public double Positive { get; private set; }
        public double Neutral { get; private set; }
        public double Negative { get; private set; }
    }

Finalmente, logo abaixo está o código do nosso Controller e Action.

    [ApiController]
    [Route("api/text-analyzer")]
    public class TextAnalyzerController : ControllerBase
    {
        private readonly TextAnalyticsClient _textAnalyticsClient;

        public TextAnalyzerController(IConfiguration configuration)
        {
            var textApiKey = configuration.GetSection("TextApi:Key").Value;
            var credentials = new AzureKeyCredential(textApiKey);

            var endpoint = new Uri(configuration.GetSection("TextApi:Endpoint").Value);

            _textAnalyticsClient = new TextAnalyticsClient(endpoint, credentials);
        }

        [HttpPost("sentiment-analysis")]
        public async Task<IActionResult> SentimentAnalysis(SentimentAnalysisInputModel model) {
            var result = await _textAnalyticsClient.AnalyzeSentimentAsync(model.Text);

            var documentSentiment = result.Value;

            var sentimentAnalysis = new SentimentAnalysisViewModel(
                model.Text,
                documentSentiment.Sentiment,
                documentSentiment.ConfidenceScores.Positive,
                documentSentiment.ConfidenceScores.Neutral,
                documentSentiment.ConfidenceScores.Negative
            );

            return Ok(sentimentAnalysis);
        }
    }

Alguns pontos sobre o código acima:

  • Note a construção do objeto de tipo TextAnalyticsClient. Ele vai ser utilizado para a execução da análise de sentimento usando o serviço Language do Azure Cognitive Services, e necessita de um objeto de tipo Uri inicializado com o ponto de extremidade, e o AzureCredentials, que é instanciado através da chave;
  • O objeto de tipo DocumentSentiment (armazenado na variável documentSentiment) contém os dados que precisamos para obter o resultado da análise de sentimento. A propriedade Sentiment é um enum de tipo TextSentiment;
  • Algo bem interessante é que o DocumentSentiment tem uma propriedade Sentences que permite acessar o texto e análise de sentimento das sentenças individuais;
  • O idioma é detectado a partir do texto enviado, mas é possível especificá-lo adicionando um segundo parâmetro na chamada do método AnalyzeSentimentAsync.

Testando a API

Para testar a aplicação eu vou utilizar o Swagger.

Farei 3 testes: 1 com predominância de cada um sentimento entre os disponíveis (Positive, Neutral, Negative).

O primeiro texto que será analisado é positivo.

Logo abaixo está a resposta da API de análise de sentimento.

Resposta da API de análise de sentimento para um texto positivo

Veja que não tem ambiguidade aqui. O score para Positive é 1, e para os outros dois é 0.

Vamos para o neutro agora.

Não existe um sentimento aparente aqui, sendo simplesmente a descrição de um conceito / tecnologia / plataforma.

Logo abaixo podemos ver a resposta de nossa API.

Resposta da API de análise de sentimento para um texto negativo

Ao contrário do teste de Positive, veja que ele é predominantemente Neutral, e também que tem, mesmo em pequeno valor, um score para os outros 2 sentimentos.

Finalmente, vamos utilizar um texto com sentimento negativo.

Requisição para API de um texto negativo

E a resposta, como esperada, é predominantemente de sentimento Negative!

Resposta da API de análise de sentimento para um texto negativo

Quer alavancar sua carreira como Desenvolvedor(a) .NET?

Além de Desenvolvedor .NET Sênior, eu sou instrutor de mais de 700 alunos e também tenho dezenas de mentorados.

Conheça o Método .NET Direto ao Ponto, minha plataforma com mais de 800 videoaulas, com cursos cobrindo temas relacionados a linguagem C# e Programação Orientada a Objetos, APIs REST com ASP NET Core, Microsserviços com ASP NET Core, HTML, CSS e JavaScript, Desenvolvimento Front-end com Angular, Desenvolvimento Front-end com React, JavaScript Intermediário, TypeScript, Formação Arquitetura de Software, Microsoft Azure, Agile, SQL, e muito mais.

Inclui comunidade de centenas de alunos, suporte por ela, plataforma e e-mail, atualizações regulares e muito mais.

Clique aqui para ter mais informações e garantir sua vaga


Conclusão

Neste artigo vemos como é simples e prático ter acesso a capacidades incríveis como análise de sentimento, sem precisar conhecer a fundo tópicos como aprendizado de máquina e inteligência artificial.

Com isso, conseguimos adicionar capacidades modernas e inovadoras em nossas aplicações, rapidamente.