Machine Learning - Analisando sentimentos com ML.NET & Blazor

Machine Learning - Analisando sentimentos com ML.NET & Blazor

Fala Galera

Neste post vamos discutir um pouco como podemos criar um sistema de análise de sentimentos utilizando ML.NET e o Blazor.

O ML.NET é um framework de Machine Learning, Open Source para aprendizado de máquina. Este framework permite que os desenvolvedores criem seus próprios modelos e assim ensine a máquina como se comportar e quais decisões tomar baseado no modelo previamente criado. O ML.NET foi desenvolvido pelo time da Microsoft Research e utilizado em muitos dos seus produtos como Windows, Bing, Office e entre outros.

O framework ML.NET foi desenvolvido sobre o .NET Core assim tornando possível criar machine learning em várias plataformas como Windows, Linux e MacOS.

O interessante deste framework é que ele traz diversas APIs pré definidas como Análise de Sentimentos, Object Detection, Forecast e entre outros.

Neste post vamos utilizar o Ml.NET para criar um analisador de sentimentos utilizando Blazor.

Escolhendo o projeto

Para iniciar nosso analisador de sentimentos, precisamos criar o projeto corretamente para isso abra o Visual Studio e escolha o projeto conforme imagem abaixo:

Não foi fornecido texto alternativo para esta imagem

Com o nosso projeto escolhido, vamos adicionar o ML.NET no projeto conforme imagem abaixo:

Não foi fornecido texto alternativo para esta imagem

Pronto nosso projeto está configurado para utilizar o ML.NET.

Inicializando o Modelo com o Dataset de dados

Para criar nosso analisador de sentimentos precisaremos treinar nosso modelo com um conjunto de dados. Para isso existe um conjunto de dados pronto para consumo.

Colocaremos os arquivos na pasta Data do nosso projeto. Esse mesmo Dataset pode ser encontrado aqui.

Feito isso vamos criar duas classes. Uma classe que será utilizada como leitura do Dataset e outra que será utilizada para o resultado da análise de sentimentos.

Vamos criar a classe que será utilizada para leitura dos dados do Dataset conforme código abaixo:

public class SentimentData
{
    [LoadColumn(0)]
    public string SentimentText;

    [LoadColumn(1), ColumnName("Label")]
    public bool Sentiment;
}

Note que estamos utilizando o atributos "LoadColumn" para indicar qual propriedade será utilizada para armazenar os dados do Dataset.

Agora vamos criar nossa segunda classe, ela será responsável por armazenar os resultados do analisador de sentimentos, crie a classe conforme código abaixo:

public class SentimentPrediction : SentimentData
{
     [ColumnName("PredictedLabel")]
     public bool Prediction { get; set; }

     public float Probability { get; set; }

     public float Score { get; set; }

     public float Percentage => Probability * 100;
}

Pronto com as nossas classes criadas, vamos criar nosso analisador.

Primeiro precisamos treinar nosso modelo, para isso crie uma nova classe conforme código abaixo:

public class SentimentAnalysis
{
        static readonly string _dataPath = Path.Combine(Environment.CurrentDirectory, "Data", "data.txt");

        private static MLContext Context { get; set; }

        private static ITransformer Model { get; set; }

        private static PredictionEngine<SentimentData, SentimentPrediction> Engine { get; set; }

        static SentimentAnalysis()
        {
            Context = new MLContext();

            TrainTestData splitDataView = LoadData();

            Model = BuildAndTrainModel(splitDataView.TrainSet);
        }

        private static TrainTestData LoadData()
        {
            IDataView dataView = Context.Data.LoadFromTextFile<SentimentData>(_dataPath, hasHeader: false);
            TrainTestData splitDataView = Context.Data.TrainTestSplit(dataView, testFraction: 0.35);
            return splitDataView;
        }

        private static ITransformer BuildAndTrainModel(IDataView splitTrainSet)
        {
            var estimator = Context.Transforms.Text.FeaturizeText(outputColumnName: "Features", inputColumnName: nameof(SentimentData.SentimentText))
                                                   .Append(Context.BinaryClassification.Trainers.SdcaLogisticRegression(labelColumnName: "Label", featureColumnName: "Features"));

            //Create and Train the model
            var model = estimator.Fit(splitTrainSet);
            return model;

        }
    }

Agora nosso modelo está pronto para ser treinado. Mas espere, ainda temos trabalho para fazer aqui.

Criando o Analisador de Sentimentos

Agora que nosso modelo está treinado, precisamos alterar nosso analisador. Para isso vamos voltar na classe SentimentAnalysis e adicionar mais dois métodos conforme código abaixo.

private static PredictionEngine<SentimentData, SentimentPrediction> GetEngine()
{
    if (Engine != null)
        return Engine;

    Engine = Context.Model.CreatePredictionEngine<SentimentData, SentimentPrediction>(Model);

    return Engine;

}

public static SentimentPrediction GetPrediction(string text)
{
    var engine = GetEngine();

    return engine.Predict(new SentimentData() { SentimentText = text });
}

Note que existe um método público e é neste método que iremos utilizar para retornar o resultado da análise de sentimentos.

Com isso nosso analisador de sentimentos está pronto. Agora precisamos criar a interface que irá consumir os resultados do nosso analisador de sentimentos.

Criando interfaces com o Blazor Server Side.

Para utilizar nosso analisador de sentimentos escolhemos o Blazor Server Side, ele tem uma ótima experiencia de interface e uma incrível integração com nosso código C#.

Vamos criar um novo componente chamado AnalysisSentimentScale.razor e insira o código conforme mostrado abaixo:

<div class="sentiment">
    <h4>You feel...</h4>
    <p>🤬🙁😐😃😍</p>

    <div class="marker">
        <div style="left: @Value.ToString().Replace(",", ".")%">
            <div><span class="oi oi-arrow-thick-top"></span></div>
            <label>@Value.ToString("0.0")%</label>
        </div>
    </div>
</div>


@functions {
    [Parameter] float Value { get; set; }
}

Neste componente iremos receber no parâmetro "Value" o resultado da análise de sentimentos.

Agora precisamos criar uma nova página que irá exibir nosso componente para isso adicione uma página chamada "Analysis.razor" e insira o código conforme mostrado abaixo:

@page "/analysis"

<h1>Analisador de sentimentos</h1>
<p>Diga como se sente.</p>

<p><textarea oninput=@UpdateScore cols="80"></textarea></p>

<AnalysisSentimentScale Value=@happiness />

@functions {
    float happiness = 50;

    void UpdateScore(UIChangeEventArgs evt)
    {
        var text = (string)evt.Value;
        happiness = AnalysisSentimental.Service.SentimentAnalysis.GetPrediction(text).Percentage;
    }
}

Note que na função "UpdateScore" estamos pegando o valor da caixa de texto e chamando nosso serviço de análise de sentimentos que criamos anteriormente.

Por último, vamos estilizar nossa página para que nosso analisador de sentimentos funcione corretamente. Para isso, abra a pasta wwwroot e no arquivo site.css adicione as seguintes regras de estilo no final do arquivo conforme mostrado abaixo:

.sentiment {
    background-color: #eee;
    position: relative;
    display: inline-block;
    padding: 1rem;
    padding-bottom: 0;
    border-radius: 1rem;
}

    .sentiment h4 {
        font-size: 16px;
        text-align: center;
        margin: 0;
        padding: 0;
    }

    .sentiment p {
        font-size: 50px;
    }

    .sentiment .marker {
        position: relative;
        left: 22px;
        width: calc(100% - 68px);
    }

        .sentiment .marker > div {
            transition: 0.3s ease-in-out;
            position: absolute;
            margin-left: -30px;
            text-align: center;
        }

            .sentiment .marker > div > div {
                font-size: 100px;
                line-height: 20px;
                color: green;
            }

            .sentiment .marker > div label {
                font-size: 30px;
                color: gray;
            }

Pronto! Agora vamos testar nosso analisador. Se tudo ocorrer bem, você deverá ver uma tela conforme a imagem abaixo

Não foi fornecido texto alternativo para esta imagem

Ao digitar, nosso analisador começará receber os inputs necessários para avaliar a frase, veja nas imagens abaixo:

Não foi fornecido texto alternativo para esta imagem
Não foi fornecido texto alternativo para esta imagem

Conforme mostramos neste post, o esforço para analisar um determinado bloco de texto e determinar qual seu sentimento é simples graças as APIs do ML.NET. Existem diversos modelos que o ML.NET nos fornece. Conheça mais sobre o ML.NET através deste link

O código deste post se encontra no meu github através deste link

O que achou deste post, deixe seu comentário =]

Abs e até a próxima

Vitor Fitzner

Software Engineer, Software Architect, Engineering Manager e Professor

5 a

Excelente!

WILSON CHEN

The world of 1s and 0s got injected into my DNA when I was 12, which turned interest into a software dev guru

5 a
Anderson Oliveira

Desenvolvedor .Net | CSharp | MAUI | UWP | Desktop

5 a

Ivo Dias aí a internet colaborando pra montarmos um projeto com ML

Entre para ver ou adicionar um comentário

Outras pessoas também visualizaram

Conferir tópicos