Olá, hoje eu irei demonstrar como você pode utilizar o framework de Machine Learning ML.NET em suas aplicações Xamarin.Forms de uma maneira bem simples.
Este post é feito em parceria com Microsoft MVP Gabriel Schade, onde no post ML .NET: Classificador de Sentimentos ele explica o que é o ML.NET e como treinar um modelo de classificação de comentários. Para este exemplo é de suma importância primeiro ler o post do Gabriel para que você entenda como criar e treinar o seu modelo.
Atualmente, o ML.NET 1.0 não é suportado na arquitetura de processador ARM, afetando aplicativos Xamarin (iOS, Android) e dispositivos IoT baseados em ARM, embora você sempre possa executar os modelos ML no “lado do servidor” – Microsoft Blog
Neste exemplo iremos executar o nosso modelo no servidor e consumir em nossas aplicações mobile.
Irei assumir que você acabou de criar um projeto Xamarin.Forms em branco.
O servidor irá retornar um JSON, então para desserialização do mesmo iremos utilizar o Plugin NewtonSoft.Json.
ADICIONANDO O NUGET PACKAGE
Instale o plugin em seu projeto compartilhado.
PredictionResult
Crie uma classe chamada PredictionResult, que será o objeto retornado pela api contendo as propriedades: Predicition, Probability e Score.
namespace DemoCommentary | |
{ | |
public class PredictionResult | |
{ | |
public bool Predicition { get; set; } | |
public float Probability { get; set; } | |
public float Score { get; set; } | |
} | |
} |
Emoji
Para este exemplo foi utilizado dois emojis, um para quando o comentário é considerado satisfatório e outro para quando o comentário é insatisfatório.
Satisfatório
Insatisfatório
Android
Em seu projeto .Android, adicione as imagens na pasta drawable que se encontra dentro de Resources.
iOS
Em seu projeto .iOS, adicione as imagens na Resources.
XAML
No arquivo xaml, crie os seguintes componentes:
- Entry – Para o usuário informar um comentário.
- Button – Para chamar o método GetResult que irá realizar a chamada para api.
- Image – Para demonstrar o emoji.
- Label – Para demonstrar o que foi retornado da api.
<?xml version="1.0" encoding="utf-8"?> | |
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms" | |
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" | |
xmlns:local="clr-namespace:DemoCommentary" | |
x:Class="DemoCommentary.MainPage"> | |
<StackLayout Margin="20"> | |
<Entry Placeholder="Texto" x:Name="Texto"/> | |
<Button Text="Resultado" Clicked="GetResult"/> | |
<Image x:Name="Emoji" WidthRequest="60" HorizontalOptions="Center"/> | |
<Label x:Name="LblResult" HorizontalOptions="Center"/> | |
</StackLayout> | |
</ContentPage> |
C#
Crie o método “GetResult” que será responsável de realizar a chamada ao método commentary da API concatenando o texto desejado.
Observação: Para este exemplo estou utilizando a API localmente, por isso que o endereço é um endereço de IP.
Após o retorno da API, será demonstrado o emoji de acordo com o a propriedade Predicition. Sendo true para satisfatório e false para insatisfatório.
using System; | |
using System.ComponentModel; | |
using System.Net.Http; | |
using Newtonsoft.Json; | |
using Xamarin.Forms; | |
namespace DemoCommentary | |
{ | |
[DesignTimeVisible(true)] | |
public partial class MainPage : ContentPage | |
{ | |
public MainPage() | |
{ | |
InitializeComponent(); | |
} | |
public async void GetResult(object sender, EventArgs e) | |
{ | |
if (String.IsNullOrWhiteSpace(Texto.Text)) | |
return; | |
using (var client = new HttpClient()) | |
{ | |
client.Timeout = new TimeSpan(0, 0, 0, 30); | |
var request = new HttpRequestMessage | |
{ | |
RequestUri = new Uri("http://192.168.0.3:5000/api/commentary/" + Texto.Text), | |
Method = HttpMethod.Get | |
}; | |
var result = await client.SendAsync(request); | |
if (!result.IsSuccessStatusCode) | |
throw new Exception(result.Content.ReadAsStringAsync().Result); | |
var json = result.Content.ReadAsStringAsync().Result; | |
var data = JsonConvert.DeserializeObject<PredictionResult>(json); | |
if (data.Predicition) | |
Emoji.Source = "happy.png"; | |
else | |
Emoji.Source = "sad.png"; | |
LblResult.Text = $"Predicition:{data.Predicition}\nScore:{data.Score}\nProbability: {data.Probability}"; | |
} | |
} | |
} | |
} |
Resultado
Esse e todos os exemplos deste blog encontram-se disponíveis no GitHub.