I.Giới thiệu

1.Ứng dụng thông minh là gì?

Ứng dụng thông minh là quá trình sử dụng kỹ thuật học máy để tạo ra các ứng dụng sử dụng dữ liệu đã có hoặc dữ liệu thời gian thực để tạo ra các dự đoán, các quyết định nhằm phát triển các trải nghiệm phong phú, tiện ích cho người sử dụng.

Xu hướng phát triển phần mềm hiện tại là đầu tư vào phát tiển các ứng dụng thông minh. Thêm vào đó. tính sẵn có và khả năng tính toán của máy tính ngày nay là rất lớn, đồng thời chi phí lưu trữ thấp, thuận lợi để phát triển các mô hình học máy chạy trên server và được cung cấp cho người dùng dưới dạng dịch vụ (service).

2.Khái niệm học máy

Học máy là một kỹ thuật của khoa học dữ liệu, giúp cho máy tính học được từ dữ liệu đã có để dự đoán các hành vi, kết quả và xu thế trong tương lai.

Các dự báo hoặc dự đoán từ học máy có thể hỗ trợ xây dựng các ứng dụng và thiết bị thông minh hơn. Khi chúng ta mua sắm trực tuyến, học máy có thể giúp gợi ý các sản phẩm khác mà chúng ta có thể thích dựa trên những gì chúng ta đã mua. Khi robot lau dọn phòng cho bạn, học máy có thể giúp nó quyết định được công việc đã hoàn thành chưa.

Một ví dụ về học máy mà rất gần với chúng ta, đó là Facebook. Facebook sử dụng các kỹ thuật học máy để gợi ý cho chúng những người bạn mà chúng ta có thể quen. Chúng ta phải thừa nhận rằng, sự gợi ý này của Facebook là tương đối chính xác. Hay trong một báo cáo của mình, Facebook đã công bố, có thể nhận diện chính xác đến 97% khuôn mặt của những người dùng Facebook.

II.Module 1: Azure machine learning studio

1.Giới thiệu

Azure machine learning là dịch vụ phân tích dự đoán đám mây, nó cho phép người dùng tạo ra và triển khai các mô hình dự đoán cũng như các giải pháp phân tích một cách dễ dàng và nhanh chóng.

Từ chiếc máy tính có kết nối Internet, bạn có thể truy cập vào website azure machine learning studio để dùng các thư viện đã được xây dựng sẵn, bao gồm rất nhiều thuật toán học máy, và tạo ra các mô hình phân tích, dự đoán, rồi triển khai hoặc cung cấp dịch vụ cho người dùng sử dụng giải pháp của bạn một cách dễ dàng.

Azure machine learning không chỉ cung cấp các công cụ để tạo mô hình phân tích, dự đoán mà còn cung cấp dịch vụ quản lý đầy đủ, bạn có thể sử dụng để triển khai mô hình phân tích của mình như là một dịch vụ web.

Phân tích dự đoán là việc sử dụng các công thức toán học hay còn được gọi là các thuật toán để phân tích dữ liệu đã có hoặc dữ liệu hiện tại nhằm nhận diện mẫu, hoặc xu hướng để đưa ra dự đoán cho các sự kiện trong tương lai.

Microsoft Azure Machine Learning Studio là một công cụ kéo thả, bạn có thể sử đụng để xây dựng, kiểm thử và phát triển các giải pháp phân tích dự đoán dựa trên dữ liệu của mình.

Machine learning studio công bố các mô hình học máy dưới dạng web services cho phép người lập trình có thể dễ dàng tùy chỉnh, quản lý và phát triển ứng dụng của mình.

Machine learning studio là nơi hội tụ của khoa học dữ liệu, phân tích dự đoán, tài nguyên đám mây, và dữ liệu của người phát triển cũng như người sử dụng.

2. Luồng làm việc cơ bản

Luồng làm việc cơ bản để xây dựng các mô hình từ dữ liệu thu thập được và thực hiện các giải pháp học máy.

-Data collection and management: Người lập trình thực hiện việc thu thập dữ liệu về lĩnh vực mà mình muốn phát triển.

Ví dụ: Để phát triển ứng dụng gợi ý thuốc phù hợp với từng loại bệnh, người lập trình phải thu thập một lượng lớn các đơn thuốc mà các bác sĩ đã kê tương ứng với từng loại bệnh.

-Machine learning service: Người lập trình sử dụng các công cụ của Azure machine learning và dữ liệu mà mình đã thu thập, lựa chọn thuật toán học máy phù hợp để tạo ra được các mô hình phân tích, dự đoán, gợi ý có độ chính xác cao nhất.

-Embedded ML model: Bước cuối cùng là nhúng các mô hình thông minh này vào ứng dụng hoặc website mà mình đang phát triển. Người lập trình có thể dễ dàng tạo ra được một ứng dụng thông minh.

3.Thực nghiệm

3.1. Hoạt cảnh

Mô hình sẽ dự đoán thu nhập trong một năm của một người có vượt quá $ 50,000 hay không dựa trên một số tiêu chí:

-Tình trạng hôn nhân

-Giáo dục

-Tuổi

-Nghề nghiệp

-Một số tiêu chí khác

3.2.Tập dữ liệu

Tập dữ liệu sử dụng trong thực nghiệm là tập dữ liệu mẫu được cung cấp bởi Microsoft dưới dạng một file excel.

3.3 Các bước tạo Azure Machine Learning Web services
  • Tạo một thí nghiệm (experiment) trong Azure Machine Learning Studio

  • Tạo các mô hình dự đoán qua một số quá trình huấn luyện dữ liệu

  • Tạo web service

  • Tạo ứng dụng client sử dụng web service này

Hình 3.3.1: Create training experiment

Hình 3.3.2 : Create predictive experiment

Hình 3.3.3: deploy web service

Hình 3.3.4 : Test service in Machine learning studio

Hình 3.3.5: Kết quả test service in Machine learning studio

4.Mô hình huấn luyện và đánh giá

Mô hình học máy là sự trùy tượng hóa của câu hỏi bạn đang cố gắng trả lời hoặc là kết quả mà bạn muốn dự đoán. Các mô hình được huấn liệu và đánh giá từ dữ liệu đã có.

Huấn luyện dữ liệu: Khi bạn huấn luyện một mô hình từ tập dữ liệu, bạn sử dụng tập dữ liệu đã có, và thực hiện một số điều chỉnh dựa vào đặc tính đặc trưng của dữ liệu để có được câu trả lời chính xác nhất.

Đánh giá dữ liệu: Một khi bạn đã có mô hình đã được huấn luyện, đánh giá mô hình sử dụng tập dữ liệu còn lại (tập dữ liệu ban đầu được chia thành hai phần, một phần sử dụng cho giai đoạn huấn luyện và phần còn lại sử dụng cho giai đoạn đánh giá). Vì bạn đã biết chính xác kết quả của tập dữ liệu đó, do đó bạn có thể biết được mô hình dự đoán có đúng không.

5.Tạo ứng dụng client

Request mà ứng dụng client gửi đến server và response mà server trả về dưới dạng JSON.

Mã nguồn:

// This code requires the Nuget package Microsoft.AspNet.WebApi.Client to be installed.
// Instructions for doing this in Visual Studio:
// Tools -> Nuget Package Manager -> Package Manager Console
// Install-Package Microsoft.AspNet.WebApi.Client

using System;
using System.Collections.Generic;
using System.IO;
using System.Net.Http;
using System.Net.Http.Formatting;
using System.Net.Http.Headers;
using System.Text;
using System.Threading.Tasks;

namespace CallRequestResponseService
{

    public class StringTable
    {
        public string[] ColumnNames { get; set; }
        public string[,] Values { get; set; }
    }

    class Program
    {
        static void Main(string[] args)
        {
            InvokeRequestResponseService().Wait();
        }

        static async Task InvokeRequestResponseService()
        {
            using (var client = new HttpClient())
            {
                var scoreRequest = new
                {

                    Inputs = new Dictionary<string, StringTable>() { 
                        { 
                            "input1", 
                            new StringTable() 
                            {
                                ColumnNames = new string[] {"age", "workclass", "fnlwgt", "education", "education-num", "marital-status", "occupation", "relationship", "race", "sex", "capital-gain", "capital-loss", "hours-per-week", "native-country", "income"},
                                Values = new string[,] {  { "53", "self-emp-not-inc", "209642", "HS-grad", "12", "Married-civ-spouse", "Exec-managerial", "Husband", "white", "Male", "0", "0", "45", "United-States", "value" },  { "39", "state-gov", "77516", "Bacheloers", "13", "Divorced", "Exec-managerial", "wife", "white", "Female", "0", "0", "50", "United-states", "<=50K" },  }
                            }
                        },
                    },
                    GlobalParameters = new Dictionary<string, string>()
                    {
                    }
                };
                const string apiKey = "v3/+aQkGPT2NcssPJsz8HcHYLf1QVwuMU/7QKMgpsJoAhm/oA1JZYmC887oFcCvF4hwkTAMRMDKQuvzdrTAnng=="; // Replace this with the API key for the web service
                client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", apiKey);

                client.BaseAddress = new Uri("https://ussouthcentral.services.azureml.net/workspaces/f51dd9a7372c470d92b339e5768947cd/services/04a0aaa00c4a467598c848e860f165a6/execute?api-version=2.0&details=true");

                // WARNING: The 'await' statement below can result in a deadlock if you are calling this code from the UI thread of an ASP.Net application.
                // One way to address this would be to call ConfigureAwait(false) so that the execution does not attempt to resume on the original context.
                // For instance, replace code such as:
                //      result = await DoSomeTask()
                // with the following:
                //      result = await DoSomeTask().ConfigureAwait(false)


                HttpResponseMessage response = await client.PostAsJsonAsync("", scoreRequest);

                if (response.IsSuccessStatusCode)
                {
                    string result = await response.Content.ReadAsStringAsync();
                    Console.WriteLine("Result: {0}", result);
                }
                else
                {
                    Console.WriteLine(string.Format("The request failed with status code: {0}", response.StatusCode));

                    // Print the headers - they include the requert ID and the timestamp, which are useful for debugging the failure
                    Console.WriteLine(response.Headers.ToString());

                    string responseContent = await response.Content.ReadAsStringAsync();
                    Console.WriteLine(responseContent);
                }
            }
        }
    }
}

6.Khái niệm JSON

JSON (JavaScript Object Notation) là một định dạng trao đổi dữ liệu nhẹ. Nó cho phép người lập trình có thể dễ dàng đọc và ghi. Nó cũng là ngôn ngữ cho phép máy có thể dễ dàng phân tích và tạo ra một cách tự động. Nó được phát triển dựa trên ngôn ngữ lập trình JavaScript. JSON là một định dạng văn bản hoàn toàn độc lập nhưng nó sử dụng các quy ước quen thuộc với người lập trình của các ngôn ngữ họ C, bao gồm C, C++, C#, Java, JavaScript, Perl, Python và nhiều ngôn ngữ khác. Các thuộc tính này làm cho JSON trở thành ngôn ngữ lý tưởng để trao đổi dữ liệu.

JSON được xây dựng dựa trên hai cấu trúc:

-Một tập hợp của cặp tên và giá trị. Trong rất nhiều ngôn ngữ, nó được gọi là object, record, dictionary, hash table, keyed list, associative array.

-Một danh sách giá trị được sắp xếp. Trong hầu hết ngôn ngữ, nó được gọi là array, vector, list, sequence

Một đối tượng là một tập chưa sắp xếp của cặp tên và giá trị. Một đối tượng bắt đầu bằng “{” và kết thúc bằng “}”. Mỗi tên được theo sau bằng đấu “:” và các cặp tên/giá trị được phân cách bằng dấu “,”.

Một mảng là một tập các giá trị được sắp xếp. Một mảng bắt đầu bằng “[” và kết thúc bằng “]”. Các giá trị được phân cách bằng dấu “,”

Một giá trị có thể là một String, một số, giá trị Boolean hoặc là null, một đối được hoặc một mảng. Các cấu trúc này có thể lồng nhau.

Ví dụ:

{"name":"John","age":31,"city":"New York"};

{"employees":[
{"firstName":"John","lastName":"Doe"},
{"firstName":"Anna","lastName":"Smith"},
{"firstName":"Peter","lastName":"Jones"}
]}

III.Module 2: Text analysis

Trong module này, chúng ta sẽ sử dụng text analytics API để viết một ứng dụng thông minh, làm việc với Twitter và đưa ra cho chúng ta các phản hồi về cảm xúc.

Hoạt cảnh: Bạn muốn phân tích xem cảm xúc (tích cực hay tiêu cực) của người dùng Twetter về một chủ đề nào đó thông qua các bài viết mà họ đã đăng lên.

Xây dựng một ứng dụng, nhận đầu vào là một hashtag, nó sẽ dùng hashtag này như một tham số để tìm kiếm trên Twitter, gửi kết quả tìm kiếm được cho text analytics API, họ thống sẽ phân tích xem cảm xúc của người dùng trên bài tweet đấy là tích cực hay tiêu cực.

1.Cognitive Services

Microsoft Cognitive Services là một tập các APIs, SDKs và dịch vụ có sẵn để lập trình viên có thể tọa ra các ứng dụng thông minh hơn, hấp dẫn hơn.

1.1.Vision

Nó cho phép lập trình viên dễ dàng thêm vào các chức năng thông minh vào ứng dụng của mình như trích xuất cảm xúc, trích xuất video, nhận diện khuân mặt, hiểu lời nói và ngôn ngữ.

-Computer vision API: trích xuất thông tin từ ảnh

-Emotion API: Nâng cao trải nghiệm cá nhân với việc nhận diện cảm xúc

-Face API: Phát hiện, nhận diện, phân tích, tổ chức và gắn thẻ khuôn mặt và các bức ảnh

-Video API: Phân tích, chỉnh sửa, xử lý video trong ứng dụng

1.2.Speech

-Bing Speech API: Chuyển đổi giọng nói sang văn bản và ngược lại, hiểu ý định trong câu nói, văn bản

-Speaker recognition API: Cung cấp cho ứng dụng khả năng nhận biết được ai đang nói

1.3..Language

-Bing spell check API: Phát hiện và sửa lỗi chính tả trong ứng dụng

-Text analytics API: Phân tích, phát hiện cảm xúc, cụm từ khóa, chủ đề và ngôn ngữ trong văn bản

-Translator API: Dịch lời nói, văn bản với lời gọi REST API đơn giản

1.4.Search

-Bing autosuggest API: Cung cấp cho ứng dụng của bạn các gợi ý thông minh trong chức năng tìm kiếm

-Bing Image search API: Mang đến chức năng tìm kiếm hình ảnh nâng cao và siêu dữ liệu cho ứng dụng của bạn

-Bing Web search API: Kết nói các chức năng tìm kiếm mạnh mẽ

2.Text Analytics API

Gồm 4 chức năng chính:

  • Sentiment analysis: Chỉ ra suy nghĩ/cảm xúc của người dùng về sản phẩm hoặc chủ đề của bạn bằng cách phân tích đoạn văn bản (text)

  • Key phrase extraction: Tự động trích xuất từ khóa từ đoạn văn bản tiếng anh để hỗ trợ việc xác định các điểm chính, mấu chốt của đoạn văn

  • Topic detection: Tìm kiếm và trích xuất chủ đề của các bài báo tiếng anh

  • Language detection: Xác định ngôn ngữ được sử dụng trong đoạn văn bản là ngôn ngữ gì. Hỗ trợ tới 120 ngôn ngữ khác nhau.

Trước khi thực hiện quá trình phân tích, Text analytics API cần thực hiện một số tiền xử lý đối với đoạn văn bản đầu vào:

  • Chuẩn hóa (Normalization): Chuyển các từ viết hoa sang viết thường, chuyển về từ gốc….

  • Xác định ngôn ngữ (Language Detection)

  • Loại bỏ các từ dừng: the, a, to, with

  • Loại bỏ các ký tự đặc biệt, số, địa chỉ email, URLs

3.Thực hành

3.1.Ví dụ sử dụng các chức năng sentiment analysis, key phrase extraction, language detection

using System;
using System.Globalization;
using System.Net.Http.Headers;
using System.Text;
using System.Net.Http;
using System.Threading.Tasks;
using System.Web;

namespace TextAnalyticsAPIDemo
{
    /// <summary>
    /// This is a sample program that shows how to use the Azure ML Text Analytics app: key phrases, language and sentiment detection. 
    /// </summary>
    static class Program
    {
        /// <summary>
        /// Azure portal URL.
        /// </summary>
        private const string BaseUrl = "https://westus.api.cognitive.microsoft.com/";

        /// <summary>
        /// Your account key goes here.
        /// </summary>
        private const string AccountKey = "ba7f150c5a474b8aa8af6a38d1c0eafc";

        /// <summary>
        /// Maximum number of languages to return in language detection API.
        /// </summary>
        private const int NumLanguages = 1;

        static void Main()
        {
            MakeRequests();
            Console.WriteLine("Hit ENTER to exit...");
            Console.ReadLine();
        }

        static async void MakeRequests()
        {
            using (var client = new HttpClient())
            {
                client.BaseAddress = new Uri(BaseUrl);

                // Request headers.
                client.DefaultRequestHeaders.Add("Ocp-Apim-Subscription-Key", AccountKey);
                client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));

                // Request body. Insert your text data here in JSON format.
                byte[] byteData = Encoding.UTF8.GetBytes("{\"documents\":[" +
                    "{\"id\":\"1\",\"text\":\"Today is a beautiful day.\"}," +
                    "{\"id\":\"2\",\"text\":\"Viet nam la mot dat nuoc xinh dep.\"}," +
                    "{\"id\":\"three\",\"text\":\"나는 베트남입니다\"},]}");

                // Detect key phrases:
                var uri = "text/analytics/v2.0/keyPhrases";
                var response = await CallEndpoint(client, uri, byteData);
                Console.WriteLine("\nDetect key phrases response:\n" + response);

                // Detect language:
                var queryString = HttpUtility.ParseQueryString(string.Empty);
                queryString["numberOfLanguagesToDetect"] = NumLanguages.ToString(CultureInfo.InvariantCulture);
                uri = "text/analytics/v2.0/languages?" + queryString;
                response = await CallEndpoint(client, uri, byteData);
                Console.WriteLine("\nDetect language response:\n" + response);

                // Detect sentiment:
                uri = "text/analytics/v2.0/sentiment";
                response = await CallEndpoint(client, uri, byteData);
                Console.WriteLine("\nDetect sentiment response:\n" + response);
            }
        }

        static async Task<String> CallEndpoint(HttpClient client, string uri, byte[] byteData)
        {
            using (var content = new ByteArrayContent(byteData))
            {
                content.Headers.ContentType = new MediaTypeHeaderValue("application/json");
                var response = await client.PostAsync(uri, content);
                return await response.Content.ReadAsStringAsync();
            }
        }
    }
}

3.2. Ví dụ cho phép người dùng nhập vào 1 hashtag, ứng dụng sẽ sử dụng hashtag này như một tham số để search các tweet trên tweeter và phân tích sentiment của các đoạn text search được.

using System;
using System.Collections.Generic;
using System.Text;
using System.IO;
using System.Linq;
using System.Runtime.InteropServices.WindowsRuntime;
using Windows.Foundation;
using Windows.Foundation.Collections;
using Windows.UI.Xaml;
using Windows.UI.Xaml.Controls;
using Windows.UI.Xaml.Controls.Primitives;
using Windows.UI.Xaml.Data;
using Windows.UI.Xaml.Input;
using Windows.UI.Xaml.Media;
using Windows.UI.Xaml.Navigation;
using Tweetinvi;
using Tweetinvi.Core.Parameters;
using Tweetinvi.Models;
using Tweetinvi.Public.Models.Enum;
using System.Net.Http.Headers;
using Newtonsoft.Json;
using System.Net.Http;
using System.Threading.Tasks;
using Tweetinvi.Parameters;
// The Blank Page item template is documented at http://go.microsoft.com/fwlink/?LinkId=402352&clcid=0x409

namespace DAT211xLab2Starter
{
    /// <summary>
    /// An empty page that can be used on its own or navigated to within a Frame.
    /// </summary>
    public sealed partial class MainPage : Page
    {
        /// <summary>
        /// Azure portal URL.
        /// </summary>
        private const string BaseUrl = "https://westus.api.cognitive.microsoft.com/";
        /// <summary>
        /// Your account key goes here.
        /// </summary>
        private const string AccountKey = "ba7f150c5a474b8aa8af6a38d1c0eafc";
        /// <summary>
        /// Twitter Consumer Key
        /// </summary>
        private const string consumerKey = "8wF2PZ6yr3tVa9VAkW1irNxeD";
        private const string consumerSecretKey = "CBbTPU3Yh3rpLnSWWJ6edQuNMYrONyVXItER5H2TLu1xQrz20B";
        private const string accessToken = "850975784059535361-dR77sNPjEULMXms3YP5ATJJn7QQ6xls";
        private const string accessTokenSecretKey = "CMF5DZJkpvd6u5mXANjAeXOQ1dhxpDSs95hzfvQKogPge";
        public MainPage()
        {
            this.InitializeComponent();
        }
        public void AuthorizeTwitter()
        {
            Auth.SetUserCredentials(consumerKey, consumerSecretKey, accessToken, accessTokenSecretKey);
        }
        private List<String> SearchTwitter()
        {
            string input = txtInput.Text;
            string searchParam = input.Replace("#", "%23");
            var searchParameter = new SearchTweetsParameters(searchParam)
            {
                SearchType = Tweetinvi.Models.SearchResultType.Popular,
                MaximumNumberOfResults = 100
            };
            var results = Search.SearchTweets(searchParameter);
            List<String> tweets = new List<string>();
            foreach (var item in results)
            {
                tweets.Add(item.ToString());
            }
            return tweets;
        }
        private string FormatRequestJSON(List<String> values)
        {
            int idCounter = 1;
            StringBuilder reqJSON = new StringBuilder();
            reqJSON.Append("{\"documents\":[");
            foreach (string item in values)
            {
                reqJSON.Append("{\"id\":\"" + idCounter + "\",\"text\":\"" + item +
                "\"},"); idCounter++;
            }
            reqJSON.Append("]}");
            return reqJSON.ToString();
        }

        private async void MakeRequests(string request)
        {
            using (var client = new HttpClient())
            {
                client.BaseAddress = new Uri(BaseUrl);
                // Request headers.
                client.DefaultRequestHeaders.Add("Ocp-Apim-Subscription-Key", AccountKey);
                client.DefaultRequestHeaders.Accept.Add(new
                MediaTypeWithQualityHeaderValue("application/json"));
                // Request body. Insert your text data here in JSON format.
                byte[] byteData = Encoding.UTF8.GetBytes(request);
                // Detect sentiment:
                var uri = "text/analytics/v2.0/sentiment";
                var response = await CallEndpoint(client, uri, byteData);
                tbResults.Text = response;
            }
        }
        private async Task<String> CallEndpoint(HttpClient client, string uri, byte[]
        byteData)
        {
            using (var content = new ByteArrayContent(byteData))
            {
                content.Headers.ContentType = new
                MediaTypeHeaderValue("application/json");
                var response = await client.PostAsync(uri, content);
                return await response.Content.ReadAsStringAsync();
            }
        }
        private void AnalyzeSentiment(String value)
        {
            double total = 0;
            RootObject obj = JsonConvert.DeserializeObject<RootObject>(value);
            foreach (var item in obj.documents)
            {
                total += (Double.Parse(item.score) * 100);
            }
            double average = total / obj.documents.Count;
            Windows.UI.Xaml.Media.SolidColorBrush myBrush = new
            Windows.UI.Xaml.Media.SolidColorBrush();
            if (average > 0 && average <= 40)
            {
                myBrush.Color = Windows.UI.Colors.Red;
                rectSentiment.Fill = myBrush;
            }
            else if (average > 40 && average <= 65)
            {
                myBrush.Color = Windows.UI.Colors.Yellow;
                rectSentiment.Fill = myBrush;
            }
            else
            {
                myBrush.Color = Windows.UI.Colors.Green;
                rectSentiment.Fill = myBrush;
            }
        }

        private void btnGetSentiment_Click(object sender, RoutedEventArgs e)
        {
            AuthorizeTwitter();
            List<String> response = SearchTwitter();
            string request = FormatRequestJSON(response);
            MakeRequests(request);
        }

        private void btnAnalyze_Click(object sender, RoutedEventArgs e)
        {
            AnalyzeSentiment(tbResults.Text);
        }
    }
}

results matching ""

    No results matching ""