23/12/2018, 23:13

Áp dụng Machine learning, xây dựng ứng dụng chatbot của riêng bạn

Người viết: Lavender Cuộc đại chiến giữa các ChatBot và các trợ lý ảo chưa bao giờ có hồi kết. Trong khi Apple, Microsoft đang rất tự hào với những cô nàng trợ lý ảo dễ thương Siri, Cortana, thì các ông lớn khác như Facebook, Amazon cũng trình làng những trợ lý riêng của họ. Khái ...

Người viết: Lavender

Cuộc đại chiến giữa các ChatBot và các trợ lý ảo chưa bao giờ có hồi kết.

Trong khi Apple, Microsoft đang rất tự hào với những cô nàng trợ lý ảo dễ thương Siri, Cortana, thì các ông lớn khác như Facebook, Amazon cũng trình làng những trợ lý riêng của họ. Khái niệm chatbot cũng nhờ đó mà trở lên quen thuộc với con người.

Một người anh trong team của tôi, dùng Amazon Alexa để biến ngôi nhà của anh ấy thành Smart Home, một người bạn khác của tôi lại dùng ChatBot Messager để hỗ trợ bán hàng. Có vẻ như việc sử dụng chatbot giúp lượng khách hàng của cô ấy tăng lên một cách đáng kể và đem lại lợi nhuận đáng mong ước của những người kinh doanh online. Nhưng đó là khi bạn sử dụng một Chatbot một ông lớn nào đó, Và đôi khi cũng phải trả phí khá cao để có thể sử dụng được lâu dài. Vậy tại sao bạn không xây dựng một ứng dụng chatbot của riêng mình nhỉ. Điều này có thể giúp bạn tiết kiệm được chi phí và thậm chí có thể phát triển lên thành các ứng dụng khác tuyệt vời hơn, cạnh tranh với chính các ông lớn đó (yaoming)

Bài viết hôm nay, tôi sẽ hướng dẫn bạn xây dựng một ứng dụng ChatBot đơn giản. Việc làm đầu tiên và khá là quan trọng đó là bạn cần phải xác định được scope của ứng dụng. Bạn cần phải biết mục đích xây dựng chatbot của bạn là gì, và hãy bắt đầu bằng những chủ đề cụ thể và có thể thực hiện. Ví dụ, trong bài viết này tôi sẽ xây dựng ứng dụng ChatBot hỗ trợ order thức ăn trong một nhà hàng. Nào ta cùng bắt đầu.

ChatBot trong lĩnh vực học máy

Trong lĩnh vực học máy, ChatBot hay các cô nàng trợ lý ảo đều được quy chung về một loại đó là Question and Answering system. Đối với các hệ chuyên gia như vậy, công việc bạn cần làm bao gồm

  • Phân loại câu hỏi
  • Mapping câu trả lời ( Trích chọn tài liệu liên quan)
  • Trích xuất câu trả lời.

Việc phân loại câu hỏi là bước khó nhất trong hệ thống hỏi đáp, Tuy nhiên, như chính cái tên của nó, bạn hoàn toàn có thể chuyển bài toán này về các bài toán phân lớp đã biết. Đến đây, có lẽ các bạn đã hình dung ra được các bước xây dựng chatBot không hề khó như những gì ta nghĩ phải không?

Chuẩn bị dữ liệu

Một bộ dữ liệu training đủ nhiều và chuẩn chỉnh có thể nâng cao độ chính xác lên rất nhiều. Mặc dù trong bài viết này dữ liệu tôi sử dụng là rất ít nhưng một phần nào đó có thể giúp các bạn hình dung cấu trúc của dữ liệu training mà bạn cần có. Bạn có thể định nghĩa cấu trúc dữ liệu của bạn theo dạng json dưới đây:

Như mình đã nói bên trên, việc quan trọng trong hệ thống chatbot là xác định được câu hỏi hay nội dung mà người dùng nhập.

  • Bạn cần một tag (nhãn lớp cho nội dung nhập của người dùng)
  • patterns – mẫu câu đầu vào được training để phân lớp
  • responses – các câu trả lời (bot) được mapping để hồi đáp những request trước đó.

Training model

Trong hướng dẫn này, chúng ta sẽ sử dụng TFlearn – High level API của Tensorflow, và dĩ nhiên ngôn ngữ sử dụng là Python. Đầu tiên, hãy import các thư viện cần thiết, đặc biệt là các thư viện được xử dụng trong NLP như NLTK, tensorflow…

Loading data training. Vì dữ liệu traning của chúng ta đang ở dạng json nên đừng quên import json nhé.

Với intents.json vừa được đưa vào bộ training, bạn cần tổ chức lại nó, Xác định cho công cụ của bạn biết đâu là documents dùng để training, các từ, các classes để phân lớp. Bạn nên sử dụng thêm bộ công cụ của xử lý ngôn ngữ tự nhiên nltk để tiền xử lý dữ liệu. Bộ công cụ này cho phép bạn thực hiện các quá trình tokenizer, POS stagging, word segmentation, remove stopword….

Bổ sung thêm stopwords vào stop_words array hoặc tạo một file text để list danh sách các stopwords nhé. Nói nhiều như vậy mình cũng quên mất không biết là các bạn có hiểu stopwords là gì không? Nhưng đại khái thì nó là danh sách các từ xuất hiện nhiều trong văn bản nhưng lại không có giá trị trong việc phân lớp. Vì vậy trước khi training, chúng ta cần làm sạch văn bản, loại bỏ những từ ngữ không có ý nghĩa này để tránh overfiting ảnh hưởng đến kết quả training.

Thật không may, nếu chúng ta sử dụng dự liệu dạng word như vậy thì sẽ không thể hoạt động được với tensorflow, vì vậy việc cần thiết bây giờ là chuyển dữ liệu này sang dạng tensor number

Lưu ý rằng, dữ liệu của chúng ta bị xáo trộn. Tensorflow sẽ lấy một số dữ liệu trong tập intents.json để làm dữ liệu thử nghiệm để đo độ chính xác cho mô hình. Sau khi chuyển word -> number, bạn có thể thấy các “bag-of-words” array dạng như sau:

Với dữ liệu như trên, tensorflow đã có thể hiểu được nội dung bạn muốn training và bây giờ cần phải build neural network để training model ngay thôi. Ở đây tôi dùng hàm activation là softmax và optimizer function là Adam. Bạn có thể thay đổi 2 hàm này để có thể đưa ra kết quả training cao nhất và phù hợp nhất.

Với cấu trúc như trên, chúng ta đang xây dựng mạng neural 2 lớp để traning, bạn có thể xem thêm trong tài liệu của TFlearn Nếu muốn tặng thêm số lớp ẩn. Để hoàn thành quá trình này, bạn cần lưu lại (pickle) model và document để có thể sử dụng lại nó trong quá trình predict ở bước tiếp theo.

Predict (Xây dựng ChatBot)

Ở bước này chúng ta sẽ xây dựng hệ thống phản hồi của Chatbot, sử dụng intents model đã được training ở bước trên. Sau khi import các thư viện giống như bước training ở trên, Bạn cần un-pickle model và documents, cũng như cần phải load lại intents.json (cái này để lấy các response đã được định nghĩa trước đó thôi mờ )