Поделиться через


Руководство. Анализ тональности комментариев веб-сайта в веб-приложении с помощью построителя моделей ML.NET

Узнайте, как анализировать тональность из комментариев в режиме реального времени в веб-приложении.

В этом руководстве показано, как создать приложение ASP.NET Core Razor Pages, которое классифицирует тональность от комментариев веб-сайта в режиме реального времени.

В этом руководстве вы узнаете, как:

  • Создание приложения ASP.NET Core Razor Pages
  • Подготовка и понимание данных
  • Выбор сценария
  • Загрузка данных
  • Обучение модели
  • Оценка модели
  • Использование модели для прогнозирования

Исходный код этого руководства можно найти в репозитории dotnet/machinelearning-samples .

Prerequisites

Список необходимых компонентов и инструкций по установке см. в руководстве по установке конструктора моделей .

Создание приложения Razor Pages

Создайте приложение ASP.NET Core Razor Pages.

  1. В Visual Studio откройте диалоговое окно "Создание проекта ".
  2. В диалоговом окне "Создание проекта" выберите шаблон проекта ASP.NET Core Web App .
  3. В текстовом поле "Имя " введите "SentimentRazor" и нажмите кнопку "Далее".
  4. В диалоговом окне "Дополнительные сведения" оставьте все значения по умолчанию и нажмите кнопку "Создать".

Подготовка и понимание данных

Скачайте набор данных для детоксикации Википедии. Когда откроется веб-страница, щелкните правой кнопкой мыши страницу, выберите "Сохранить как " и сохраните файл в любом месте компьютера.

Каждая строка в наборе данных wikipedia-detox-250-line-data.tsv представляет другой обзор, оставленный пользователем в Википедии. Первый столбец представляет тональность текста (0 не является токсичным, 1 является токсичным), а второй столбец представляет комментарий, оставленный пользователем. Столбцы разделены вкладками. Данные выглядят следующим образом:

Sentiment SentimentText
1 ==RUDE== Чувак, вы грубо отправьте эту карловую фотографию обратно или еще.
1 == OK! == IM СОБИРАЕТСЯ ВАНДАЛИЗОВАТЬ ДИКИЕ ВИКИ-САЙТ!!
0 Надеюсь, это поможет.

Создание файла конфигурации построителя моделей

При первом добавлении модели машинного обучения в решение вам будет предложено создать mbconfig файл. Файл mbconfig отслеживает все, что вы делаете в построителе моделей, чтобы разрешить повторно открыть сеанс.

  1. В обозревателе решений щелкните правой кнопкой мыши проект SentimentRazor и выберите "Добавить>модель машинного обучения".
  2. В диалоговом окне назовите проект Конструктора моделей SentimentAnalysis.mbconfig и нажмите кнопку "Добавить".

Выбор сценария

Экран сценария построителя моделей

Чтобы обучить модель, необходимо выбрать из списка доступных сценариев машинного обучения, предоставляемых Конструктором моделей.

Для этого примера задача — это классификация текста. На шаге сценария расширения Конструктора моделей выберите сценарий классификации текста .

Выберите среду

Конструктор моделей может обучаться в разных средах в зависимости от выбранного сценария.

Выберите локальный (GPU) в качестве среды и нажмите кнопку "Далее".

Note

В этом сценарии используются методы глубокого обучения, которые лучше всего работают в средах GPU. Если у вас нет GPU, выберите локальную среду (ЦП), но обратите внимание, что ожидаемое время обучения будет значительно длиннее. Дополнительные сведения об использовании графических процессоров с конструктором моделей см. в руководстве по построителю моделей.

Загрузка данных

Построитель моделей принимает данные из двух источников, базы данных SQL Server или локального файла в csv или tsv формате.

  1. На шаге данных средства построителя моделей выберите файл из параметров источника данных.
  2. Нажмите кнопку рядом с текстовым полем "Выбор файла " и используйте проводник для просмотра и выбора файла wikipedia-детоксикации-250-line-data.tsv .
  3. Выберите тональность из раскрывающегося списка "Столбец", чтобы прогнозировать (метку).
  4. Выберите "Тональность" в раскрывающемся списке "Текстовый столбец ".
  5. Нажмите кнопку "Далее" , чтобы перейти к следующему шагу в построителе моделей.

Обучение модели

Задача машинного обучения, используемая для обучения модели анализа тональности в этом руководстве, — это классификация текста. Во время обучения модели построитель моделей обучает модель классификации текста для набора данных с помощью архитектуры нейронной сети NAS-BERT .

  1. Выберите Начать обучение.

  2. После завершения обучения результаты процесса обучения отображаются в разделе "Результаты обучения " на экране "Обучение ". Помимо предоставления результатов обучения, в файле SentimentAnalysis.mbconfig создаются три файла кода программной части.

    • SentimentAnalysis.consumption.cs . Этот файл содержит ModelInput схемы и ModelOutput схемы Predict , созданные для использования модели.
    • SentimentAnalysis.training.cs — этот файл содержит конвейер обучения (преобразования данных, обучающий, гиперпараметры тренера), выбранные конструктором моделей для обучения модели. Этот конвейер можно использовать для повторного обучения модели.
    • * SentimentAnalysis.mlnet — этот файл содержит метаданные и сведения о конфигурации для модели ML.NET.
  3. Нажмите кнопку "Далее" , чтобы перейти к следующему шагу.

Оценка модели

Результатом шага обучения будет одна модель, которая имеет лучшую производительность. На шаге оценки средства построителя моделей выходной раздел будет содержать обучающий элемент, используемый наиболее производительной моделью, а также метрики оценки.

Если вы не удовлетворены метриками оценки, некоторые простые способы повышения производительности модели — использовать больше данных.

В противном случае нажмите кнопку "Далее" , чтобы перейти к шагу "Использование " в построителе моделей.

Добавление шаблонов проектов потребления (необязательно)

На шаге "Использование " построитель моделей предоставляет шаблоны проектов, которые можно использовать для использования модели. Этот шаг является необязательным, и вы можете выбрать метод, который лучше всего подходит для использования модели.

  • Console application
  • Web API

Добавление кода для создания прогнозов

Настройка пула PredictionEngine

Для формирования одного прогноза необходимо создать PredictionEngine<TSrc,TDst>. PredictionEngine<TSrc,TDst> не является потокобезопасным. Кроме того, необходимо создать экземпляр везде, где он необходим в приложении. По мере увеличения размера приложения этот процесс может стать неуправляемым. Для улучшенной производительности и потокобезопасности используйте сочетание внедрения зависимостей и службы PredictionEnginePool, которое создает объекты ObjectPool<T> (PredictionEngine<TSrc,TDst>) для использования во всем приложении.

  1. Установите пакет NuGet Microsoft.Extensions.ML :

    1. В обозревателе решений щелкните проект правой кнопкой мыши и выберите Управление пакетами NuGet.
    2. Выберите nuget.org в качестве источника пакета.
    3. Перейдите на вкладку "Обзор " и найдите Microsoft.Extensions.ML.
    4. Выберите пакет в списке и нажмите кнопку "Установить".
    5. Нажмите кнопку ОК в диалоговом окне Предварительный просмотр изменений.
    6. Нажмите кнопку 'Принять' в диалоговом окне принятия лицензии, если вы согласны с условиями лицензии для указанных пакетов.
  2. Откройте файл Program.cs в проекте SentimentRazor .

  3. Добавьте следующие using директивы, чтобы ссылаться на пакет NuGet Microsoft.Extensions.ML и проект SentimentRazorML.Model :

    using Microsoft.Extensions.ML;
    using static SentimentRazor.SentimentAnalysis;
    
  4. PredictionEnginePool<TData,TPrediction> Настройте приложение в файле Program.cs:

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

Создание обработчика анализа тональности

Прогнозы будут сделаны на главной странице приложения. Таким образом, метод, принимающий входные данные пользователя и использующий PredictionEnginePool<TData,TPrediction> возвращающий прогноз, необходимо добавить.

  1. Откройте файл Index.cshtml.cs , расположенный в каталоге Pages , и добавьте следующие using директивы:

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

    Чтобы использовать настроенный PredictionEnginePool<TData,TPrediction> в файле Program.cs , необходимо внедрить его в конструктор модели, в которую вы хотите его использовать.

  2. Добавьте переменную, чтобы ссылаться PredictionEnginePool<TData,TPrediction>IndexModel на класс внутри файла Pages/Index.cshtml.cs .

    private readonly PredictionEnginePool<ModelInput, ModelOutput> _predictionEnginePool;
    
  3. Измените конструктор в IndexModel классе и внесите PredictionEnginePool<TData,TPrediction> в него службу.

    public IndexModel(ILogger<IndexModel> logger, PredictionEnginePool<ModelInput, ModelOutput> predictionEnginePool)
    {
        _logger = logger;
        _predictionEnginePool = predictionEnginePool;
    }
    
  4. Создайте обработчик метода, который использует PredictionEnginePool прогнозы из входных данных пользователя, полученных с веб-страницы.

    1. Под методом OnGet создайте новый метод с именем OnGetAnalyzeSentiment

      public IActionResult OnGetAnalyzeSentiment([FromQuery] string text)
      {
      
      }
      
    2. В методе OnGetAnalyzeSentimentвозвращается нейтральное тональность, если входные данные пользователя пусты или null.

      if (String.IsNullOrEmpty(text)) return Content("Neutral");
      
    3. При наличии допустимых входных данных создайте новый экземпляр ModelInput.

      var input = new ModelInput { SentimentText = text };
      
    4. Используйте для прогнозирования PredictionEnginePool<TData,TPrediction> тональности.

      var prediction = _predictionEnginePool.Predict(input);
      
    5. Преобразуйте прогнозируемое bool значение в токсичный или не токсичный с помощью следующего кода.

      var sentiment = Convert.ToBoolean(prediction.PredictedLabel) ? "Toxic" : "Not Toxic";
      
    6. Наконец, верните тональность обратно на веб-страницу.

      return Content(sentiment);
      

Настройка веб-страницы

Результаты, возвращаемые приложением OnGetAnalyzeSentiment , будут динамически отображаться на Index веб-странице.

  1. Откройте файл Index.cshtml в каталоге Pages и замените его содержимое следующим кодом:

    @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. Затем добавьте код стилей css в конец страницы site.css в каталоге 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. После этого добавьте код для отправки входных данных из веб-страницы обработчику OnGetAnalyzeSentiment .

    1. В файлеsite.js , расположенном в каталоге wwwroot\js , создайте функцию, вызываемую getSentiment для создания HTTP-запроса GET с входными данными пользователя в OnGetAnalyzeSentiment обработчик.

      function getSentiment(userInput) {
          return fetch(`Index?handler=AnalyzeSentiment&text=${userInput}`)
              .then((response) => {
                  return response.text();
              })
      }
      
    2. Ниже добавьте еще одну функцию, вызываемую updateMarker для динамического обновления положения маркера на веб-странице по мере прогнозирования тональности.

      function updateMarker(markerPosition, sentiment) {
          $("#markerPosition").attr("style", `left:${markerPosition}%`);
          $("#markerValue").text(sentiment);
      }
      
    3. Создайте функцию обработчика событий, вызываемую updateSentiment для получения входных данных от пользователя, отправьте ее OnGetAnalyzeSentiment в функцию с помощью getSentiment функции и обновите маркер с updateMarker помощью функции.

      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. Наконец, зарегистрируйте обработчик событий и привязать его к textarea элементу с помощью атрибута id=Message .

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

Запуск приложения

Теперь, когда приложение настроено, запустите приложение, которое должно запуститься в браузере.

Когда приложение запускается, введите эту модель не хватает данных! в текстовой области. Прогнозируемые настроения должны быть токсичными.

Выполнение окна с прогнозируемым окном тональности

Note

PredictionEnginePool<TData,TPrediction> создает несколько экземпляров PredictionEngine<TSrc,TDst>. Из-за размера модели в первый раз, когда вы используете ее для прогнозирования, это может занять несколько секунд. Последующие прогнозы должны быть мгновенными.

Next steps

Из этого руководства вы узнали, как:

  • Создание приложения ASP.NET Core Razor Pages
  • Подготовка и понимание данных
  • Выбор сценария
  • Загрузка данных
  • Обучение модели
  • Оценка модели
  • Использование модели для прогнозирования

Additional Resources

Дополнительные сведения о разделах, упомянутых в этом руководстве, см. в следующих ресурсах: