Análisis de sentimientos en una aplicación web con ML.NET
Tags: webdev, ai, machinelearning, csharp
Published: 2021-10-28 17:04:49

¡Hola! Un gusto saludarte. En este articulo tutorial aprenderemos paso a paso a generar un modelo de Machine Learning personalizado desde ML.NET para el análisis de sentimientos en texto, y luego aprender a consumir ese modelo desde una aplicación web sobre ASP.NET con el patrón MVVM (Modelo, Vista, VistaModelo).  

###**¿Qué es ML.NET y cómo funciona?**

ML.NET es una plataforma de Machine Learning open source que nos permite transformar datos de entrada en un modelo ML, para luego poder integrarlo en cualquier tipo de aplicación sobre el ecosistema de .NET, ya sean aplicaciones web, móviles, de escritorio, o cualquier otro tipo de aplicación.  

Estos son los tipos de modelos que podemos generar en ML.NET:

| Tipo de modelo| Objetivo |
| ------------- |:-------------:|
| Clasificación/Categorización | Dividir automáticamente los comentarios de los clientes en categorías positivas y negativas. |
| Regresión/Predicción de valores continuos | Predecir el precio de las casas en función del tamaño y la ubicación. |
| Detección de anomalías. | Detectar transacciones bancarias fraudulentas. |
| Recomendaciones | Sugerir productos que los compradores en línea quieran comprar, en función de sus compras anteriores. |
| Series temporales/datos secuenciales | Pronosticar el clima / ventas. |
| Clasificación de imágenes | Categorizar patologías en imágenes médicas. |

En nuestro caso nos enfocaremos en la clasificación/categorización de comentarios de texto. 

###**Análisis de sentimientos en texto**

Para el análisis de sentimientos, la intención es poder clasificar entradas de texto en dos grupos: comentarios positivos (1) y comentarios negativos (0). 

Para lograr este objetivo, realizaremos tres 
actividades en este articulo: 

+ 1. Cumplir con los requisitos necesarios y preparar nuestra solución en Visual Studio. 
+ 2. Crear nuestro modelo de Machine Learning con ML.NET. 
+ 3. Consumir el modelo generado desde ASP.NET. 

Con esto mencionado, ¡comencemos! 

##**Parte 1: Requisitos previos y preparación de la solución en Visual Studio**

Para poder generar nuestro modelo de Machine Learning, utilizaremos el intérprete Model Builder de ML.NET. Para esto, es necesario que contemos con la siguiente carga de trabajo en Visual Studio (Desarrollo multiplataforma de .NET): 

![](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/av5w0cfcd4n4m8e52pey.png)

Con esta carga de trabajo, ahora podemos crear nuestra solución. En este caso, la intención es consumir el modelo ML que vayamos a generar desde una aplicación web, para este propósito utilizaremos el framework DotVVM que nos permite trabajar con páginas HTML y clases C# sobre ASP.NET con el patrón MVVM (Modelo, Vista, VistaModelo).

![](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/csglgk3be7fkmto8m4ae.png)

##**Parte 2: Construcción del modelo de Machine Learning**

¡Llegó el momento de ver a ML.NET en acción! Como en cualquier otro proceso en el mundo del Machine Learning para generar un modelo, los pasos para construir el modelo de análisis sentimientos son los siguientes: 

+ Establecer el escenario ML.
+ Preparar el entorno para el entrenamiento de los datos. 
+ Cargar el dataset. 
+ Entrenar el modelo.
+ Evaluar el modelo. 
+ Consumir el modelo. 

Para empezar, en el proyecto principal de nuestra solución agregaremos un componente de tipo Machine Learning:

![](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/sves3lt3cmdqayrk7aht.png)

Con esta opción, el interprete de ML.NET Model Builder se inicializará y podremos comenzar a personalizar el modelo. 

**Escenario:**

El primer paso es seleccionar el escenario con el que deseamos trabajar, en este caso será *Text classification*:

![](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/c230u7rzvksroy41dyyf.png)

**Ambiente:**

Ahora, debemos seleccionar los recursos de cómputo para el entrenamiento de nuestro modelo. Para la clasificación de texto en particular solo podemos utilizar la CPU de nuestra computadora.

![](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/1casjjksgqvpeh2qnlcg.png)

**Fuente de datos:**

Esta es una de las partes más importantes, ya que con los datos podremos personalizar nuestro modelo. Para ello podemos seleccionar dos tipos de fuentes, ya sea realizando una conexión y a la vez una consulta hacia una base de datos SQL Server, o por medio de un archivo CSV. 

En este caso utilizaremos un archivo CSV con dos columnas, la primera con el texto en cuestión, y la segunda columna con el tipo de comentario (0 negativo – 1 positivo). 

Este es un ejemplo de dataset: [wikipedia-detox-250-line-data.tsv](https://raw.githubusercontent.com/dotnet/machinelearning/main/test/data/wikipedia-detox-250-line-data.tsv).

Al cargarlo podremos tener una previsualización de los datos, y seleccionar la columna que queremos predecir posteriormente. 

![](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/hzlnggkbm4sjdouzmzrk.png)

**Entrenamiento:**

Con todo lo que ya hemos establecido hasta este momento, ya podemos realizar el proceso de entrenamiento, y generar finalmente el modelo deseado. En esta sección lo único que podemos personalizar es el tiempo máximo en el que ML.NET puede buscar el modelo ideal para la clasificación de texto. 

Al finalizar el proceso de entrenamiento podemos visualizar cuantos modelos evaluó ML.NET, y la exactitud del mejor modelo encontrado.  

![](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/7o9sbvj0ka03fm4r6psl.png)

**Evaluación:**

Hasta este punto ya tenemos el modelo establecido, de todas maneras, desde el Model Builder de ML.NET podemos evaluar el modelo con un ejemplo en particular. 

![](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/j0mtlcggcy60h6jt7jms.png)

**Consumir:**

Finalmente, el intérprete nos brindará opciones para consumir el modelo creado, ya sea creando otros proyectos (por consola o con una web api), o indicándonos las llamadas que debemos hacer desde nuestra propia aplicación. 

![](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/n6zeoumqahcul755cg25.png)

En este caso, ya podemos consumir el modelo desde nuestra aplicación web con DotVVM sobre ASP.NET con el nuevo paquete generado: `MLModel.mbconfig`. 

##**Parte 2: Consumir el modelo generado desde ASP.NET**

Para consumir el modelo debemos hacer referencia a la clase MLModel, la cual fue generada por ML.NET en el grupo `MLModel.mbconfig`: 

![](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/kco3jipwhgpnx0lgdbw0.png)

En este sentido, es necesario establecer una instancia de ModelInput con el comentario que queremos predecir, para luego llamar al método Predict, y obtener un objeto de tipo ModelOutput con la predicción correspondiente (1 positivo, 0 negativo), y su probabilidad. 

**ViewModel:**

Para este propósito, y para poder establecer una página web con DotVVM, en un ViewModel, en este caso el `DefaultViewModel.cs`, definiremos tres atributos o variables globales:

```csharp
public string InputText { get; set; }
public string Result { get; set; } = null;
public decimal? Score { get; set; } = null;
```

Estas variables nos permitirán almacenar el texto ingresado por el usuario en `InputText`, y representar los resultados de la predicción en los atributos `Result` y `Score`.

Luego podemos establecer un método en esta clase, de tal manera que represente la acción de un botón para realizar la predicción:

```csharp
public void Predict()
{
	var sampleData = new MLModel.ModelInput()
	{
		Col0 = InputText,
	};

	//Load model and predict output
	var output = MLModel.Predict(sampleData);

	if ((int)output.Prediction == 0)
	{
		Result = "Negative.";
	}
	else
	{
		Result = "Positive.";
	}

	Score = decimal.Round((decimal)(output.Score[(int)output.Prediction] * 100), 2);
}
```

En este código tenemos tres partes importantes:

+ Inicializar un `MLModel.ModelInput` con el comentario ingresado por parte del usuario. 
+ Llamar al `MLModel.Predict` con el `ModelInput` como parámetro, obteniendo así el `ModelOutput` con los resultados.
+ Preparar el `Result` para visualizar el resultado posteriormente (positivo o negativo), y su exactitud en la predicción. 

**View:**

Muy bien, ahora podemos construir la vista al hacer referencia a los atributos y al método creado en el `ViewModel`. Esta vista la codificaremos en el archivo `Default.dothtml` de la siguiente manera:


```html
<table style="border: hidden">
    <tbody style="border: hidden">
        <tr style="border: hidden">
            <td style="border: hidden" align="center">
                <dot:TextBox Text="{value: InputText}" placeholder="Write your text..." />
            </td>
            <td style="border: hidden" align="center">
                <dot:Button Click="{command: Predict()}" Text="Predict" />
            </td>
            <td style="border: hidden" align="center">
                <b>{{value: Result}}</b> {{value: Score}}
            </td>
        </tr>
    </tbody>
</table>
```

Aquí lo más importante es el control `TextBox` para que el usuario ingrese su comentario y se almacene en el atributo `InputText`, la llamada al método `Predict()` con un `Button`, y la visualización de los resultados al mostrar los valores de las variables `Result`, y `Score`.
 
**Ejemplos en ejecución:** 

Con esta *View*, y su *ViewModel*, nuestra página web se encuentra lista. Aquí podemos ver dos ejemplos en tiempo de ejecución: 

![](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/fdebrfw1gh5kkqdjawg3.png)

![](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/xxpao6rn0gevgd5he39p.png)

El código fuente del ejemplo mostrado se puede encontrar en el siguiente repositorio: [github.com/esdanielgomez/MLNET_SentimentAnalysis](https://github.com/esdanielgomez/MLNET_SentimentAnalysis).

##**¡Gracias!**

Muchas gracias por leer, espero que este demo pueda serte de utilidad. Si tienes alguna pregunta o alguna idea que necesites discutir, será un gusto poder colaborarte y juntos intercambiar conocimientos entre sí.

¡Nos vemos en [Twitter](https://twitter.com/esDanielGomez)! O si gustas también puedes escribirme por [Facebook](https://www.facebook.com/esDanielGomez) o por correo: daniel@esdaniel.gomez.com. :=)