Hướng dẫn làm chatbot đơn giản

Tram Ho

Mở đầu

Nhân một ngày đẹp trời, tôi ngồi đây viết một bài hướng dẫn làm một con chatbot đơn giản, nói không với framework chatbot như Rasa 😃. Con bot này tôi sẽ code theo hướng NLU, tức là no stories, no dialogue memory, no slotfilling, no action, bla bla …

Ngôn ngữ: Python
Hệ điều hành: Ubuntu 16.04
Kỹ thuật: Database, Intent Classification

Database

DB: Postgres

Để tiện code và run sản phẩm, tôi có tạo 1 file shell auto chạy các lệnh cài đặt run.sh as below:

File requirements.txt chứa các packages của python, trc hết cài postgres đã:

Để chạy file run.sh bạn dùng lệnh này sh run.sh

Sau khi cài xong, bạn tạo 1 database, ờ thì tôi cũng viết thêm 1 file shell cho tiện cài 😄create_db.sh:

Sau khi tạo xong db, bạn tạo 1 function kết nối với db funnybot:

Sau khi kết nối với db funnybot xong, bạn tạo table:

Thêm tí dữ liệu vào table:

  1. Thêm bot

  1. Thêm intents

  1. Thêm dữ liệu training cho intents

  1. Thêm câu trả lời

Chắc các bạn cảm thấy có tí ti dữ liệu thế này thì cần gì DB, nhưng không khi làm một dự án thực tế, các bạn sẽ gặp rất nhiều vấn đề về dữ liệu: số lượng dữ liệu lớn, tính bảo mật của dữ liệu, dung lượng lưu trữ dữ liệu, dữ liệu có cấu trúc, truy xuất dữ liệu, bla bla … Không phải chỉ cần import một file csv là được 😦 . Ok hơi bị lan man, sau khi có dữ liệu ta cần xử lý nó để đưa vào model của Machine Learning nhằm phân loại Intent của người dùng

Intent Classification

Xin các bạn thông cảm tôi không hướng dẫn cách lấy data từ db postgres do bài viết sẽ bị loãng và dài. Nói chung nếu bạn muốn truy xuất dữ liệu thì đổi câu lệnh sql thành
SELECT * FROM table_name; là được.

Import package cần, ở đây tôi sử dụng mô hình xác suất MultinomialNB và kỹ thuật biến text thành vector (Bag of words, TFIDF) của scikit-learn

Chuẩn bị dữ liệu

Sau khi đã chuẩn bị xong dữ liệu thô bên trên, chúng ta chia tập train test

Ở đây tôi dùng module Pipeline của sklearn để đơn giản hóa cũng như gói gọn quá trình tiền xử lý và define model. model chỉ cần fit dữ liệu => dữ liệu sẽ đi qua pipeline. Train xong thì predict thôi, thêm vài bước xử lý logic nữa

Kết quả

Kết

Thôi đến đây thôi, mình còn tính làm thêm cái Entity Extraction nhưng do bận việc quá nên tạm thời gác lại, có lẽ trong tương lai sẽ làm sau

Cám ơn các bạn đã xem bài viết này 🙇

Chia sẻ bài viết ngay

Nguồn bài viết : Viblo