Esercitazione: Analizzare il sentiment dei commenti dei siti Web in un'applicazione Web usando ML.NET Model Builder

Informazioni su come analizzare il sentiment dai commenti in tempo reale all'interno di un'applicazione Web.

Questa esercitazione illustra come creare un'applicazione Razor Pages ASP.NET Core che classifica il sentiment dai commenti del sito Web in tempo reale.

In questa esercitazione verranno illustrate le procedure per:

  • Creare un'applicazione Razor Pages ASP.NET Core
  • Preparare e identificare i dati
  • Scegliere uno scenario
  • Caricare i dati
  • Eseguire il training del modello
  • Valutare il modello
  • Usare il modello per le stime

È possibile trovare il codice sorgente per questa esercitazione nel repository dotnet/machinelearning-samples .

Prerequisiti

Per un elenco di prerequisiti e istruzioni di installazione, vedere la Guida all'installazione del generatore di modelli.

Creare un'applicazione Razor Pages

Creare un'applicazione Razor Pages ASP.NET Core.

  1. In Visual Studio aprire la finestra di dialogo Crea un nuovo progetto .
  2. Nella finestra di dialogo "Crea un nuovo progetto" selezionare il modello di progetto ASP.NET Core app Web.
  3. Nella casella di testo Nome digitare "SentimentRazor" e selezionare il pulsante Avanti .
  4. Nella finestra di dialogo Informazioni aggiuntive lasciare invariate tutte le impostazioni predefinite e selezionare il pulsante Crea .

Preparare e identificare i dati

Scaricare il set di dati di Wikipedia detox. Quando si apre la pagina Web, fare clic con il pulsante destro del mouse sulla pagina, scegliere Salva con nome e salvare il file in qualsiasi punto del computer.

Ogni riga nel set di dati wikipedia-detox-250-line-data.tsv rappresenta una recensione diversa lasciata da un utente su Wikipedia. La prima colonna rappresenta il sentiment del testo (0 è non tossico, 1 è tossico) e la seconda colonna rappresenta il commento lasciato dall'utente. Le colonne sono separate dalle schede. I dati sono simili ai seguenti:

Valutazione SentimentText
1 ==RUDE== Dude, sei scortese caricamento che carl picture back, o altro.
1 == OK! == IM ANDANDO A VANDALIZZARE WILD ONES WIKI THEN!!!
0 Spero che questo aiuti.

Creare un file di configurazione di Model Builder

Quando si aggiunge per la prima volta un modello di Machine Learning alla soluzione, verrà richiesto di creare un mbconfig file. Il mbconfig file tiene traccia di tutto ciò che si esegue in Generatore modelli per consentire di riaprire la sessione.

  1. In Esplora soluzioni fare clic con il pulsante destro del mouse sul progetto SentimentRazor e scegliere Aggiungi>modello di Machine Learning....
  2. Nella finestra di dialogo assegnare al progetto Model Builder il nome SentimentAnalysis.mbconfig e selezionare Aggiungi.

Scegliere uno scenario

Schermata scenario di Generatore modelli

Per eseguire il training del modello, è necessario scegliere uno scenario di Machine Learning disponibile nell'elenco del generatore di modelli.

Per questo esempio, l'attività è la classificazione del testo. Nel passaggio Scenario dell'estensione Generatore modelli selezionare lo scenario di classificazione del testo .

Selezionare un ambiente

Generatore modelli può eseguire il training in ambienti diversi a seconda dello scenario selezionato.

Selezionare Locale (GPU) come ambiente e fare clic sul pulsante Passaggio successivo .

Nota

Questo scenario usa tecniche di Deep Learning che funzionano meglio negli ambienti GPU. Se non si ha una GPU, scegliere l'ambiente locale (CPU), ma si noti che il tempo previsto per il training sarà notevolmente più lungo. Per altre informazioni sull'uso di GPU con Generatore modelli, vedere la guida al supporto della GPU in Generatore modelli.

Caricare i dati

Model Builder accetta dati da due origini, un database SQL Server o un file locale in o tsv in csv formato.

  1. Nel passaggio dati dello strumento Generatore modelli selezionare File dalle opzioni dell'origine dati.
  2. Selezionare il pulsante accanto alla casella di testo Seleziona un file e usare Esplora file per esplorare e selezionare il file wikipedia-detox-250-line-data.tsv.
  3. Scegliere Sentiment dall'elenco a discesa Colonna per stimare (Etichetta).
  4. Scegliere SentimentText dall'elenco a discesa Colonna di testo .
  5. Selezionare il pulsante Passaggio successivo per passare al passaggio successivo in Generatore modelli.

Eseguire il training del modello

L'attività di Machine Learning usata per eseguire il training del modello di analisi del sentiment in questa esercitazione è la classificazione del testo. Durante il processo di training del modello, Model Builder esegue il training di un modello di classificazione del testo per il set di dati usando l'architettura di rete neurale NAS-BERT .

  1. Selezionare Start Training (Avvia training).

  2. Al termine del training, i risultati del processo di training vengono visualizzati nella sezione Risultati training della schermata Training . Oltre a fornire risultati di training, vengono creati tre file code-behind nel file SentimentAnalysis.mbconfig .

    • SentimentAnalysis.consumption.cs : questo file contiene gli ModelInput schemi e ModelOutput e la Predict funzione generata per l'utilizzo del modello.
    • SentimentAnalysis.training.cs : questo file contiene la pipeline di training (trasformazioni dei dati, trainer, iperparametri di training) scelta da Generatore modelli per eseguire il training del modello. È possibile usare questa pipeline per ripetere il training del modello.
    • *SentimentAnalysis.zip : si tratta di un file ZIP serializzato che rappresenta il modello di ML.NET sottoposto a training.
  3. Selezionare il pulsante Passaggio successivo per passare al passaggio successivo.

Valutare il modello

Il risultato del passaggio di training sarà un modello con prestazioni ottimali. Nel passaggio di valutazione dello strumento Generatore modelli la sezione di output conterrà il formatore usato dal modello con prestazioni migliori, nonché le metriche di valutazione.

Se non si è soddisfatti delle metriche di valutazione, alcuni modi semplici per provare a migliorare le prestazioni del modello sono l'uso di più dati.

In caso contrario, selezionare il pulsante Passaggio successivo per passare al passaggio Utilizzo in Generatore modelli.

Aggiungere modelli di progetto a consumo (facoltativo)

Nel passaggio Utilizzo Generatore modelli fornisce modelli di progetto che è possibile usare per utilizzare il modello. Questo passaggio è facoltativo ed è possibile scegliere il metodo più adatto alle proprie esigenze per l'uso del modello.

  • Applicazione console
  • API Web

Aggiungere il codice per eseguire stime

Configurare il pool PredictionEngine

Per eseguire una singola stima, è necessario creare un oggetto PredictionEngine<TSrc,TDst>. PredictionEngine<TSrc,TDst> non è thread-safe. Inoltre, è necessario crearne un'istanza ovunque sia necessaria all'interno dell'applicazione. Man mano che l'applicazione cresce, la gestione di questo processo può rivelarsi difficile. Per migliorare le prestazioni e la sicurezza dei thread, usare una combinazione di inserimento delle dipendenze e del servizio PredictionEnginePool, che crea un ObjectPool<T> di oggetti PredictionEngine<TSrc,TDst> da usare in tutta l'applicazione.

  1. Installare il pacchetto NuGet Microsoft.Extensions.ML :

    1. In Esplora soluzioni fare clic con il pulsante destro del mouse sul progetto e scegliere Gestisci pacchetti NuGet.
    2. Scegliere "nuget.org" come origine pacchetto.
    3. Selezionare la scheda Sfoglia e cercare Microsoft.Extensions.ML.
    4. Selezionare il pacchetto nell'elenco e selezionare il pulsante Installa .
    5. Selezionare il pulsante OK nella finestra di dialogo Anteprima modifiche
    6. Selezionare il pulsante Accetto nella finestra di dialogo Accettazione licenza se si accettano le condizioni di licenza per i pacchetti elencati.
  2. Aprire il file Program.cs nel progetto SentimentRazor .

  3. Aggiungere le istruzioni using seguenti per fare riferimento al pacchetto NuGet Microsoft.Extensions.ML e al progetto SentimentRazorML.Model :

    using Microsoft.Extensions.ML;
    using static SentimentRazor.SentimentAnalysis;
    
  4. Configurare l'oggetto PredictionEnginePool<TData,TPrediction> per l'applicazione nel file Program.cs :

    builder.Services.AddPredictionEnginePool<ModelInput, ModelOutput>()
        .FromFile("SentimentAnalysis.zip");
    

Creare un gestore di analisi del sentiment

Le stime verranno effettuate all'interno della pagina principale dell'applicazione. Pertanto, un metodo che accetta l'input dell'utente e usa l'oggetto PredictionEnginePool<TData,TPrediction> per restituire una stima deve essere aggiunto.

  1. Aprire il file Index.cshtml.cs che si trova nella directory Pages e aggiungere le istruzioni using seguenti:

    using Microsoft.Extensions.ML;
    using static SentimentRazor.SentimentAnalysis;
    

    Per usare il PredictionEnginePool<TData,TPrediction> file Program.cs configurato, è necessario inserirlo nel costruttore del modello in cui si vuole usarlo.

  2. Aggiungere una variabile per fare riferimento all'interno PredictionEnginePool<TData,TPrediction> della classe all'interno del IndexModel file Pages/Index.cshtml.cs .

    private readonly PredictionEnginePool<ModelInput, ModelOutput> _predictionEnginePool;
    
  3. Modificare il costruttore nella IndexModel classe e inserire il PredictionEnginePool<TData,TPrediction> servizio in esso.

    public IndexModel(ILogger<IndexModel> logger, PredictionEnginePool<ModelInput, ModelOutput> predictionEnginePool)
    {
        _logger = logger;
        _predictionEnginePool = predictionEnginePool;
    }
    
  4. Creare un gestore di metodi che usa per PredictionEnginePool effettuare stime dall'input utente ricevuto dalla pagina Web.

    1. Sotto il OnGet metodo creare un nuovo metodo denominato OnGetAnalyzeSentiment

      public IActionResult OnGetAnalyzeSentiment([FromQuery] string text)
      {
      
      }
      
    2. All'interno del OnGetAnalyzeSentiment metodo, restituire sentiment neutrale se l'input dell'utente è vuoto o Null.

      if (String.IsNullOrEmpty(text)) return Content("Neutral");
      
    3. Dato un input valido, creare una nuova istanza di ModelInput.

      var input = new ModelInput { SentimentText = text };
      
    4. Usare per stimare il PredictionEnginePool<TData,TPrediction> sentiment.

      var prediction = _predictionEnginePool.Predict(input);
      
    5. Convertire il valore stimato bool in tossico o non tossico con il codice seguente.

      var sentiment = Convert.ToBoolean(prediction.PredictedLabel) ? "Toxic" : "Not Toxic";
      
    6. Infine, restituire il sentiment alla pagina Web.

      return Content(sentiment);
      

Configurare la pagina Web

I risultati restituiti dall'oggetto OnGetAnalyzeSentiment verranno visualizzati dinamicamente nella Index pagina Web.

  1. Aprire il file Index.cshtml nella directory Pages e sostituirlo con il codice seguente:

    @page
    @model IndexModel
    @{
        ViewData["Title"] = "Home page";
    }
    
    <div class="text-center">
        <h2>Live Sentiment</h2>
    
        <p><textarea id="Message" cols="45" placeholder="Type any text like a short review"></textarea></p>
    
        <div class="sentiment">
            <h4>Your sentiment is...</h4>
            <p>😡 😐 😍</p>
    
            <div class="marker">
                <div id="markerPosition" style="left: 45%;">
                    <div>▲</div>
                    <label id="markerValue">Neutral</label>
                </div>
            </div>
        </div>
    </div>    
    
  2. Aggiungere quindi codice di stile css alla fine della pagina site.css nella directory wwwroot\css :

    /* Style for sentiment display */
    
    .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: 50px;
        line-height: 20px;
        color: green;
    }
    
    .sentiment .marker > div label {
        font-size: 30px;
        color: gray;
    }
    
  3. Successivamente, aggiungere codice per inviare input dalla pagina Web al OnGetAnalyzeSentiment gestore.

    1. Nel file site.js che si trova nella directory wwwroot\js creare una funzione chiamata getSentiment per eseguire una richiesta HTTP GET con l'input dell'utente al OnGetAnalyzeSentiment gestore.

      function getSentiment(userInput) {
          return fetch(`Index?handler=AnalyzeSentiment&text=${userInput}`)
              .then((response) => {
                  return response.text();
              })
      }
      
    2. Di seguito, aggiungere un'altra funzione chiamata updateMarker per aggiornare dinamicamente la posizione del marcatore nella pagina Web in base alla stima del sentiment.

      function updateMarker(markerPosition, sentiment) {
          $("#markerPosition").attr("style", `left:${markerPosition}%`);
          $("#markerValue").text(sentiment);
      }
      
    3. Creare una funzione del gestore eventi chiamata updateSentiment per ottenere l'input dall'utente, inviarla alla OnGetAnalyzeSentiment funzione usando la funzione e aggiornare il marcatore con la getSentimentupdateMarker funzione.

      function updateSentiment() {
      
          var userInput = $("#Message").val();
      
          getSentiment(userInput)
              .then((sentiment) => {
                  switch (sentiment) {
                      case "Not Toxic":
                          updateMarker(100.0, sentiment);
                          break;
                      case "Toxic":
                          updateMarker(0.0, sentiment);
                          break;
                      default:
                          updateMarker(45.0, "Neutral");
                  }    
              });
      }        
      
    4. Registrare infine il gestore eventi e associarlo all'elemento con l'attributo textareaid=Message .

      $("#Message").on('change input paste', updateSentiment)        
      

Eseguire l'applicazione

Ora che l'applicazione è configurata, eseguire l'applicazione, che deve essere avviata nel browser.

Quando l'applicazione viene avviata, immettere Questo modello non dispone di dati sufficienti! nell'area di testo. Il sentiment stimato visualizzato deve essere Tossico.

Finestra in esecuzione con la finestra di sentiment stimata

Nota

PredictionEnginePool<TData,TPrediction> crea più istanze di PredictionEngine<TSrc,TDst>. A causa delle dimensioni del modello, la prima volta che si usa per effettuare una stima, può richiedere un paio di secondi. Le stime successive devono essere istantanee.

Passaggi successivi

In questa esercitazione sono state illustrate le procedure per:

  • Creare un'applicazione Razor Pages ASP.NET Core
  • Preparare e identificare i dati
  • Scegliere uno scenario
  • Caricare i dati
  • Eseguire il training del modello
  • Valutare il modello
  • Usare il modello per le stime

Risorse aggiuntive

Per altre informazioni sugli argomenti presentati in questa esercitazione, vedere le risorse seguenti: