Thứ Tư, 14 tháng 9, 2016

Giới thiệu về Natural Language Processing (NLP) và API.ai – Công nghệ tích hợp xử lí ngôn ngữ tự nhiên

Giới thiệu về Natural Language Processing (NLP) và API.ai – Công nghệ tích hợp xử lí ngôn ngữ tự nhiên.

Tác giả:Huỳnh Thành Đạt

Mục đích: Chủ đề của bài này giới thiệu về Xử Lý Ngôn Ngữ Tự Nhiên (Tiếng Việt) – Một phương pháp mới để giúp cho máy có thể hiểu và phân tích được câu nói của con người và có thể chắc lọc ra những thông tin cần thiết. Bên cạnh đó, chủ đề này còn giới thiệu về công nghệ API.ai – công nghệ xử lý ngôn ngữ tự nhiên và giúp lập trình viên tương tác trao đổi thông qua RESTful Web Services.

Yêu cầu về các kiến thức cơ bản cho các khái niệm về NLP và API.ai:

·        Nắm vững kiến thức về Web Services – RESTful (có thể tham khảo bài tại địa chỉ http://www.kieutrongkhanh.net/2016/08/gioi-thieu-ve-restful-web-services-cong.html)

·        Nắm vững về cấu trúc từ vựng tiếng Việt

·        Nắm vững về ngôn ngữ lập trình JAVA, lập trình thao tác đối tượng

 

       I.            Khái niệm về Natural Language Processing

Natural Language Processing (NLP) – Xử lý ngôn ngữ tự nhiên là một nhánh của trí tuệ nhân tạo, tập trung vào việc tương tác giữa máy tính và ngôn ngữ tự nhiên của con người (ở chủ đề này là tiếng việt) để từ đó máy tính có thể hiểu và thực thi đúng yêu cầu của con người.

Vậy làm thế nào để máy tính có thể hiểu được câu nói của con người?

Sau đây, chúng tôi sẽ hướng dẫn bạn đọc cách giúp máy tính hiểu được ngữ nghĩa của một câu nói.

Đầu tiên chúng tôi có một vài khái niệm:

·        Lexical Category – Nhóm từ vựng học

o   Khái niệm này giúp định danh cho một tập các từ hoặc cụm từ cùng mang một ý nghĩa hay đề cập đến một nội dung cụ thể.

o   Khái niệm này giúp chúng ta có thể phân tích các thành phần trong một câu thành dạng tổng quát để có người khác có thể diễn đạt bằng nhiều cách hay sử dụng từ địa phương, từ lóng, … thì nó cũng cùng chung một ngữ nghĩa.

o   Ví du: Food là một Lexical Category bao gồm các từ như bún bò, hủ tiếu, …

o   Để hiểu rõ khái niệm này, chúng ta cùng phân tích một câu hỏi đơn giản như sau:

§  Câu hỏi trên được phân tích thành các Lexical Category như sau

 

§  Action: dùng để chỉ các hành động của con người có liên quan tới thức ăn.

§  Food: dùng để chỉ các món ăn.

§  Where: dùng để xác định các từ để hỏi địa điểm.

§  Delicious: là tập hợp các từ chỉ độ ngon của thức ăn.

§  …: các lexical category khác tùy theo sự phức tạp của của một câu được phân tích

§  Từ câu ví dụ trên chúng ta có thể gom lại thành một chuỗi các Lexical Category như sau:

[Action][Food][Where][Delicious]

·        Pattern – cú pháp hay ngữ pháp hình thành trong một câu

o   Vi dụ:  [Action][Food][Where][Delicious].

o   Mục đích của pattern giúp xác định mẫu câu được dùng trong giao tiếp.

Đến đây, chúng ta đã hình thành nên khái niệm mẫu câu, ngữ pháp của câu để sử dụng trong giao tiếp và truyền đạt theo kiểu chúng ta được học trong ngôn ngữ tiếng Việt hay tiếng Anh.

Tuy nhiên, ngôn ngữ tự nhiên được hiểu theo ngữ cảnh – các câu giao tiếp có ý nghĩa khác nhau tùy theo không gian, địa điểm và nội dung đang được trao đổi, và không theo một một quy tắc nào. Vì vậy, pattern chưa đảm bảo việc xác định chính xác nghĩa một câu.

·        Intent: xác định ý định, hay mục đích của câu được phân tích dựa trên ngữ cảnh giao tiếp.

o   Ví dụ:  với câu hỏi “Ăn phở ở đâu ngon?”, chúng ta hiểu intent “câu nói mong muốn xác định vị trí quán phở ở đâu là ngon”.

Tổng kết: muốn xử lý ngôn ngữ tự nhiên chúng ta cần phải xác định 03 thành phần cơ bản lần lượt là Lexical Category, Pattern, Intent để thông qua đó chúng ta sẽ dạy cho máy hiểu được các câu được chuyển tải trong quá trình giao tiếp

   II.            API.ai

·        Api.ai là một framework hỗ trợ xử lý ngôn ngữ tự nhiên (hiện tại, bộ này chưa hỗ trợ tiếng Việt) nhằm hỗ trợ người lập trình xây dựng một công cụ liên quan đến giao tiếp tự động giữa người và máy tính.

·        Các tính năng

§  Api.ai’s Speech Recognition: Hỗ trợ nhận diện giọng nói, chuyển đổi âm thanh – sound thành dạng văn bản – text.

§  Natural Language Understanding and Conversation Management: Xử lý ngôn ngữ tự nhiên và hỗ trợ giao tiếp.

§  Một số khái niệm cơ bản trong API.ai mà chúng ta sẽ sử dụng trong lúc cài đặt ứng dụng:

Khái niêm

Mô tả

Agent

Tương đương như một ứng dụng trong api.ai. Đây cũng là nơi chúng ta tích hợp vào ứng dụng của mình để có thể dạy và test bot.

Entity

Khái niệm tương tự như Lexical Category đã nói trên.

Intent

Xác định ngữ cảnh của câu và ứng xử trong giao tiếp. Có ý nghĩa tương tự như phần giải thích về intent trên

Action

Khi một intent được trigger thì action sẽ được thực hiện. Action đỏi hỏi các thông tin (parameter) tương ứng được tổng hợp từ các pattern kết hợp với các intent.

Context

Xác định ngữ cảnh của câu được phân tích hay giao tiếp. Context bao gồm các intent, cho biết các câu nói đó thuộc những ngữ cảnh tương ứng để có cách ứng xử cho phù hợp.

·        Cách sử dụng: chúng ta có thể tích hợp api với ứng dụng của chúng ta bằng cách sử dụng REST-like API.

·        Lý do sử dụng api: Tuy API.ai không hỗ trợ tiếng việt, API.ai hỗ trợ việc quản lý giao tiếp cực kỳ tốt với hiệu xuất xử lý cao. Bên cạnh đó, api.ai hỗ trợ đầy đủ cách thức xử lý ngôn ngữ tự nhiên tiệm cận theo đúng các khái niệm trong xử lý ngôn tự nhiên.

·        Ứng dụng api.ai vào ứng dụng “tìm món ăn”

o   Các bước để phát triển ứng dụng

§  Bước 1: tạo account trên trang api.ai

§  Bước 2: tạo một Agent (một ứng dụng trong api.ai)

§  Bước 3: tạo entity

·        Chúng ta tiến hành xây dựng bộ từ vựng cho ứng dụng thông qua entity.

·        Khởi tạo đầy đủ các bộ entities cho ứng dụng của mình.

·        Ở bước này, chúng ta cần xác định rõ nghiệp vụ - business của ứng dụng cần xây dựng để từ đó xác định tập tự vựng tương ứng

·        Trong ví dụ này chúng ta đang xây dựng ứng dụng “tìm món ăn”, chúng ta sẽ có các nhóm từ vựng (entity name – lexical category trong khái niệm của xử lý ngôn ngữ tự nhiên) như sau:

o   Food; Action; Delicious, Feeling, Hungry, Location, Nearby, Where, Hello.

o   Chi tiết bên trong bộ entity, quí vị có thể download theo địa chỉ http://img.tobebetter.info/khanhkt/Advanced/final/NLP-API_Edited_files/entities.rar

§  Bước 4: tạo intent

·        Intent trong api.ai là nơi lưu trữ các pattern hoặc các dạng example (example – còn gọi là example mode, nội dung này sẽ được trình bày rõ ràng hơn ở các phần tiếp theo) - để thực hiện dạy cho hệ thống biết cách ứng xử phù hợp – machine learning)

·        Trước tiên, chúng ta xác định các intent cần thiết cho ứng dụng.

·        Ví dụ: một vài intent sẽ sử dụng trong ứng dụng “tìm món ăn” được mô tả ở trên như sau

o   Unknown: là intent mô tả hành động mà hệ thống sẽ ứng xử với những câu nói mà bot chưa có cách ứng xử.

o   RatingRequestLocation_HaveFood: là intent mô tả hành động mà hệ thống sẽ ứng xử với những câu nói liên quan tới việc xác định địa điểm của những món ăn ngon.

o   Greeting: là intent mô tả hành động mà hệ thống sẽ ứng xử với những câu chào hỏi của người dùng.

o   Bên dưới là cách tạo intent bằng cách chọn Intents bên menu trái, click vào dấu +, nhập tên Intent, xác định các pattern tại mục User says và định nghĩa các parameter lên quan tại New Parameter, nhấn Save để lưu trữ

·        Api.ai có 2 định dạng:

o   Example mode (“): là nơi chứa các câu nói thông thường kết hợp với các lexical category (entity) nhằm huấn luyện hay dạy cho hệ thống cách thức hiểu và ứng xử à đây cũng là nơi machine learning được áp dụng. Tuy nhiên, điều này chỉ có hiệu lực đối với những ngôn ngữ mà api.ai hỗ trợ.

§  Ở ô vuông số (1) trên hình, chúng ta nhập một câu, ví dụ như “tôi muốn ăn mì”, Api sẽ tự động tô màu và nhận biết được các parameter name như ở ô vuông số (2). Điều này sẽ cực kì hay khi sử dụng machine learning ở cái công tắc phía trên hình. Tuy nhiên, khi sử dụng Tiếng Việt, chúng ta không nên sử dụng tính năng này vì api.ai không hỗ trợ dẫn đến giới hạn sự hiểu biết của hệ thống khi ứng xử với tính đa dạng khác nhau trong câu nói trong quá trình giao tiếp

o   Templete mode (@): đây là nơi chứa pattern. Chúng ta sẽ quản lý tập câu nói của người dùng dưới dạng pattern và lưu trữ lại.

§  Chúng ta thực hiện tạo pattern bằng cách

·        Click vào số (1). Sau đó ghi một pattern mình muốn vào dưới dạng: @[Entity_Name]:[Parameter_Name].

·        Trong quá trình thực hiện, Api.ai sẽ hỗ trợ chúng ta auto complete các entity tương ứng.

·        Tương tự như vậy, các bạn tạo cho mình bộ pattern trong các intent đã phân tích trên hoặc có thể download bộ intent tại địa chỉ http://img.tobebetter.info/khanhkt/Advanced/final/NLP-API_Edited_files/intents.rar

·        Chúng ta đã tạo xong bộ xử lý ngôn ngữ tự nhiên kết hợp với api.ai

·        Bên cạnh đó, API.ai hỗ trợ chúng ta việc test ứng dụng như mô tả trong hình bên dưới

 

·        Ngoài ra, chúng ta có thể sử dụng RESTful để tương tác với api.

·        Tiếp theo, chúng tôi sẽ hướng dẫn quí vị bổ sung các từ, cụm từ vào entities và đồng thời bổ sung thêm pattern vào intent.

o   Đầu tiên, chúng ta cần lấy access key tương tác với api. Quá trình được thực hiện như chú thích của hình bên dưới

o   Chúng ta sẽ sử dụng Restful để tương tác với API (Quí vị có thể tham khảo các khái niệm và cách thức sử dụng Restful tại đia chị http://www.kieutrongkhanh.net/2016/08/gioi-thieu-ve-restful-web-services-cong.html )

o   Tạo java class để tương tác với api như hình vẽ bên dưới

o   Tạo tiếp một class thừa kế từ AbstractBuilder để tạo sự tương tác với entity của agent.

o   Sau khi hoàn tất việc tương tác với entity, chúng ta thực hiện chạy thử bằng cách bổ sung vào Entity Delicious từ khóa “ăn được”

§  api.ai trước khi thực hiện:

§  Tạo một java main class để thực hiện việc bổ sung từ khóa “ăn được” vào entity Delicious

§  Kết quả trên api.ai sau khi chượng trình test chạy

o   Tương tự, chúng ta sẽ insert pattern cho câu “Quán phở ở đâu ngon”

§  Api.ai trước khi thực hiện bổ sung

§  Tạo class IntentBuilders kế thừa thừa AbstractBuilder để tương tác với api

§  Tạo Java main class để test thử việc insert một pattern cho câu “Quán phở ở đâu ngon”

§  Trong các ví dụ trên, json của intent RatingRequestLocation_HaveFood  được lấy về bởi vì toàn bộ pattern được lưu trong chuỗi đó. Ngoài ra, một khi chúng ta thêm pattern vào templetes thì chúng ta cũng cần xóa đi một số thành phần (userSays, auto, lastUpdate,..) để đảm bảo thông tin trong chuỗi json sẽ được cập nhật.

Chúc mừng quí vị đã hoàn tất và nắm vững khái niệm sơ bộ về xử lý ngôn ngữ tự nhiên và cách sử dụng API.ai – Framework hỗ trợ xử lý ngôn ngữ tự nhiên.

Quí vị có thể tìm hiểu thêm về API.ai tại địa chỉ https://docs.api.ai

Chúng tôi hy vọng nội dung của bài này giúp ích quí vị trong việc thao thác với các ứng dụng có xử lý ngôn ngữ tự nhiên và có thể vận dụng api.ai linh hoạt trong quá trình xử lý và hiện thực ứng dụng.

Rất mong sự đóng góp của quí vị và hẹn gặp lại quí vị ở một chủ đề khác.

1 nhận xét: