CHƯƠNG 4 : THIẾT KẾ VÀ XÂY DỰNG GIAO DIỆN CHO CHATBOT
4.3 Xây dựng, thiết kế chương trình cho chatbot
4.3.2.1 Bước huấn luyện mơ hình
4.3.2.1.1 Dữ liệu huấn luyện
Để dữ liệu huấn luyện dể dàng kiểm soát và truy xuất ta thêm tất cả dữ liệu ý định mà ta muốn huấn luyện vào file json .
Để tạo dữ liệu huấn luyện ta cần tạo nhiều gói từ và mỗi gói từ đại diện cho một ý định và phải tuân theo ba thứ:
SVTH: LÊ TRUNG KIÊN 79 Thứ 1: Tên ý định (tag). Để máy tính có thể hiểu, trích xuất, phân biệt được dữ liệu ta cần đặt tên cho từng ý định nó giống như một nhãn mác hàng hóa, mỗi tên ý định phải khác nhau để máy tính khơng bị nhầm lẫn
Thứ 2: Câu hỏi đầu vào (patterns). Là những câu hỏi mà ta muốn máy tính học được, để tránh trường hợp máy tính khơng hiểu ta tạo thêm nhiều câu hỏi theo nhiều cách diễn đạt khác nhau.
Thứ 3: Câu phản hồi đầu ra (responses). Là những câu trả lời mà chúng ta muốn máy tính phản hồi. Để tăng thêm phong phú câu trả lời ta nên thêm nhiều câu trả lời cùng nội dung.
Hình 4.11: Cấu trúc dữ liệu intents
4.3.2.1.2 Tiền xử lý
Vì bước tiền xử lý đóng vai trị quan trọng trong hệ thống chatbot. Nếu tiền xử lý làm sạch và chuẩn hóa tốt dữ liệu đầu vào thì sẽ làm tăng khả độ chính xác cũng như độ thơng minh của chatbot.
SVTH: LÊ TRUNG KIÊN 80
Hình 4.12: Sơ đồ khối tiền xử lý huấn luyện
Để chuẩn hóa và làm sạch dữ liệu ta thực hiện các bước: Bước 1. Tách từ trong câu:
Để tách được từ trong một câu tôi sử dụng thư viện nltk trên python. Ví dụ: để tách câu “What are you doing?” ta thực hiện lệnh như hình().
Hình 4.13: Tách từ trong câu với nltk
Kết quả câu “What are you doing?” đã trở thành một mảng từ riêng lẻ ['What', 'are', 'you', 'doing', '?']
SVTH: LÊ TRUNG KIÊN 81 Sau khi tách câu ta chuyển các từ về nguyên mẫu và chuyển chữ hoa thành chữ thường bằng cách dùng thư viện nltk trên python
Hình 4.14: Chuyển từ về nguyên mẫu với nltk
4.3.2.1.3 Trích xuất đặc trưng
Hình 4.15: Sơ đồ khối trích xuất đặc trưng huấn luyện
Để sử dụng được các thuật tốn ta cần vector hóa các văn bản, các đoạn text đầu vào.
Có nhiều cách khác nhau có thể đưa dữ liệu văn bản thành dữ liệu dạng số:
+ Word2Vec
SVTH: LÊ TRUNG KIÊN 82 + Bag of Words
+ ….
Ở đây tôi sử dụng Bag of Words(BoW) để giải quyết vấn đề này vì lượng dữ liệu hiện tại cịn ít, đơn giản, dễ dàng cài đặt.
BoW hoạt động bằng cách đếm số lần xuất hiện của mỗi từ trong văn bản.
Ví dụ: có hai văn bản đơn giản
1. What your name ? 2. How are you.
Tiền xử lý văn bản này, ta có danh sách các từ được sử dụng, được gọi là từ điển để từ điển gọn gàng ta có thể xóa bỏ những từ trùng lặp thì ta có từ điển sáu từ như sau:
["are", "what","your","you","name","how"]
Vậy với mỗi văn bản tạo ra một vector đặc trưng với chiều dài bằng sáu, mỗi phần tử đại diện cho số từ tương ứng xuất hiện trong văn bản đó.
1. [0. 1. 1. 0. 1. 0.] 2. [1. 0. 0. 1. 0. 1.]
SVTH: LÊ TRUNG KIÊN 83
Hình 4.16: Tạo vector từ trên python
4.3.2.1.4 Huấn luyện mơ hình
Pha huấn luyện dữ liệu là pha mấu chốt, quan trọng nhất trong xây dựng mô hình chatbot. Sau bước tiền xử lý và trích xuất đặc trưng chỉ mang lại tác dụng làm cho kết quả của mơ hình được tốt hơn, thì pha huấn luyện này là pha khơng thể thiếu.
SVTH: LÊ TRUNG KIÊN 84
Hình 4.17: Lưu đồ giải thuật huấn luyện mơ hình chatbot
Đầu tiên của bước huấn luyện mơ hình ta tìm kiếm, lấy dữ liệu từ bước trích xuất đặc trưng bao gồm từ điển (all_words), tên ý định (tags), câu hỏi (patterns), câu trả lời (responese) và thiết lập số lần huấn luyện cho mơ hình (numEpoch) ở đây cho bằng 1000.
SVTH: LÊ TRUNG KIÊN 85 Ví dụ : Với dữ liệu ở hình 4.14 thì ta có từ điển câu hỏi với 24 từ: ["'s", 'a', 'anyon', 'are', 'bye', 'day', 'good', 'goodby', 'hello', 'help', 'hi', 'how', 'is', 'later', 'lot', 'name', 'see', 'thank', 'that', 'the', 'there', 'what', 'you', 'your'] tương ứng với với vector có chiều dài bằng 24.
Tiếp theo ta xử lý dữ liệu vào bằng thư viện numpy để tính tốn và trích xuất nhất, ta tiến hành tạo mảng ý định thì mảng sẽ là bốn ý định ['goodbye', 'greeting', 'my name', 'thanks'] và tạo mảng xy với x là câu hỏi (patterns) y là ý định (tags) thì mảng sẽ là [(['Hi'], 'greeting'), (['How', 'are', 'you'], 'greeting'), (['Is', 'anyone', 'there', '?'], 'greeting'), (['Hello'], 'greeting'), (['Good', 'day'], 'greeting'), (['Bye'], 'goodbye'), (['See', 'you', 'later'], 'goodbye'), (['Goodbye'], 'goodbye'), (['Thanks'], 'thanks'), (['Thank', 'you'], 'thanks'), (['That', "'s", 'helpful'], 'thanks'), (['Thanks', 'a', 'lot', '!'], 'thanks'), (['What', 'your', 'name', '?'], 'my name'), (['What', 'is', 'the', 'name'], 'my name')]. Đễ để nhìn ta xem (bảng 4.4)
Bảng 4.4: Bảng câu hỏi và ý định sau khi tạo mảng
x y
Hi greeting
How are you greeting
Is anyone there? greeting
Hello greeting
Good day greeting
Bye goodbye
See you later goodbye
Goodbye goodbye
Thanks thanks
Thank you thanks
That's helpful thanks
Thanks a lot! thanks
What your name my name What is the name my name Tiếp đến là tạo dữ liệu đào tạo:
SVTH: LÊ TRUNG KIÊN 86 - Tạo vector dữ liệu của từng câu hỏi (patterns) trên từ điển của từ (all_words) và đây cũng là dữ liệu đầu vào của huấn luyện mơ hình.
- Tạo vector dữ liệu của từng ý định (tags) trên từng câu hỏi.
Bảng 4.5: Dữ liệu đào tạo
x y Vector (patterns) Vector (tags) Hi greeting [0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 1. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.] 1 How are you greeting [0. 0. 0. 1. 0. 0. 0. 0. 0. 0. 0. 1. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 1. 0.] 1 Is anyone there? greeting [0. 0. 1. 0. 0. 0. 0. 0. 0. 0. 0. 0. 1. 0. 0. 0. 0. 0. 0. 0. 1. 0. 0. 0.] 1 Hello greeting [0. 0. 0. 0. 0. 0. 0. 0. 1. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.] 1
Good day greeting [0. 0. 0. 0. 0. 1. 1. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.
0. 0. 0. 0. 0.] 1 Bye goodbye [0. 0. 0. 0. 1. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.] 0 See you later goodbye [0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 1. 0. 0. 1. 0. 0. 0. 0. 0. 1. 0.] 0 Goodbye goodbye [0. 0. 0. 0. 0. 0. 0. 1. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.] 0 Thanks thanks [0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 1. 0. 0. 0. 0. 0. 0.] 3
Thank you thanks [0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 1. 0.
0. 0. 0. 1. 0.] 3 That's helpful thanks [1. 0. 0. 0. 0. 0. 0. 0. 0. 1. 0. 0. 0. 0. 0. 0. 0. 0. 1. 0. 0. 0. 0. 0.] 3 Thanks a lot! thanks [0. 1. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 1. 0. 0. 1. 0. 0. 0. 0. 0. 0.] 3 What your name my name [0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 1. 0. 0. 0. 0. 0. 1. 0. 1.] 2 What is the name my name [0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 1. 0. 0. 1. 0. 0. 0. 1. 0. 1. 0. 0.] 2
SVTH: LÊ TRUNG KIÊN 87 Tiếp theo là bước huấn luyện với mơ hình DeepLearing và mạng Neaural và được hỗ trợ bởi thư viện Pytorch. Đầu vào với 24 nơ ron tương ứng với vector câu hỏi đầu ra là 4 nơ ron ứng với 4 ý định và lớp ẩn, bias là lớp sẽ được training
Hình 4.18: Mơ hình học có giám sát
Để hiểu rõ hơn ta lấy một câu “hello” làm ví dụ thì input lúc này là 24 nơ ron [0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 1. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.] và đầu ra tuyến tính sẽ được tính tốn [-0.2731, 0.2611, -0.1122, -0.1210] để thấy sự chênh lệch ta đưa về dạng xác suất bằng cách tính softmax với cơng thức:
𝜎(𝑧)𝑗 = 𝑒 𝑧𝑖 ∑𝐾 𝑒𝑘𝑧 𝑘=1 𝑉ớ𝑖 𝑗 = 1, … , 𝐾 ( 4.5 ) 𝜎(𝑧)1 = 𝑒 −0.2731 𝑒−0.2731 + 𝑒0.2611+ 𝑒−0.1122+ 𝑒−0.1210 = 0,198217811
SVTH: LÊ TRUNG KIÊN 88 𝜎(𝑧)2 = 𝑒 0.2611 𝑒−0.2731 + 𝑒0.2611 + 𝑒−0.1122+ 𝑒−0.1210 = 0,338178372 𝜎(𝑧)3 = 𝑒 −0.1122 𝑒−0.2731+ 𝑒0.2611+ 𝑒−0.1122+ 𝑒−0.1210 = 0,23282183 𝜎(𝑧)4 = 𝑒 −0.1210 𝑒−0.2731+ 𝑒0.2611+ 𝑒−0.1122+ 𝑒−0.1210 = 0,230781987 Ta ra được dạng xác suất [0.19821892 0.3381779 0.23282151 0.23078167] từ đây ta thấy giá trị xác suất với giá trị dự đoán (label) [0,1,0,0] chưa gần với nhau để đánh giá sự khác biệt đó ta tính Cots function (cross entropy) với cơng thức:
𝐷(𝑌̂, 𝑌) = −𝑌𝑙𝑜𝑔𝑌̂
= −1 × log(0.3381779) ≈ 1.08
Với Y là giá trị dự đoán và 𝑌̂ là giá trị tính ra ta được cross entropy gần bằng 1.08
Để cross entropy thấp nhất ta lan truyền ngược nơ ron và cập nhật label và bias với số lần bằng numEpoch.
Sau khi cập nhật đến khi hết chu kỳ numEpoch và giá trị cross entropy thấp nhất thì ta lưu lại các dữ liệu lớp ẩn với file .pth
SVTH: LÊ TRUNG KIÊN 89
4.3.2.2 Bước phân lớp (xác định intent) mơ hình 4.3.2.2.1 Dữ liệu đầu vào 4.3.2.2.1 Dữ liệu đầu vào
Hình 4.19: Lưu đồ giải thuật phân tích
đầu vào là giọng nói (Tiếng Anh) Hình 4.20: Lưu đồ giải thuật phân tích đầu vào là giọng nói (Tiếng Việt)
Khâu nhận dạng giọng nói tự động là khối đầu vào giúp người dùng tương tác với trợ lý ảo bằng giọng nói. Các đầu vào là các vector đặc trưng đại diện cho đoạn nói, được tạo ra bời q trình tiền xử lý nhanh và trích xuất đặc tính của bài phát biểu. Thành phần của Automatic Speech Recognition dựa vào sự kết hợp của mơ hình Hidden Markov (HMM) và một mơ hình hỗn hợp Gaussian (GMM) hoặc một mạng nơ-ron sâu (DNN).
HMM xây dựng một cây các trạng thái cho khung lời nói hiện tại sử dụng vector tính năng đầu vào. GMM hoặc DNN đánh giá xác suất của sự chuyển đổi trạng thái trong cây, và thuật tốn Viterbi sau đó tìm kiếm con đường có nhiều khả năng nhất dựa trên các điểm này. Đường dẫn có xác suất cao nhất thể hiện kết xuất văn bản cuối
SVTH: LÊ TRUNG KIÊN 90 cùng. Điểm GMM đánh giá HMM trạng thái chuyển tiếp bằng cách ánh xạ một vector đối tượng đầu vào một hệ toạ độ đa chiều và lặp lại điểm số các đặc tính chống lại mơ hình âm thanh được đào tạo. DNN điểm số sử dụng xác suất từ một mạng thần kinh. Độ sâu của DNN được xác định bởi số lớp ẩn mà số điểm cho một chuyển tiếp đi qua mạng. Trong luận văn sẽ nghiên cứu chủ yếu về DNN vì nó có độ chính xác cao hơn.
Để nhận dạng giọng nói tự động ta dùng thư viện speech_recognition:
SVTH: LÊ TRUNG KIÊN 91
Hình 4.22: Nhận dạng giọng nói tự động tiếng việt
4.3.2.2.2 Tiền xử lý
Bước này giống với tiền xử lý của bước huấn luyện ta tách câu hỏi đầu vào dạng text thành các từ độc lập để xử lý dữ liệu trước khi trích xuất đặc trưng.
Hình 4.23: Sơ đồ khối tiền xử lý phân lớp
4.3.2.2.3 Trích xuất đặc trưng
SVTH: LÊ TRUNG KIÊN 92 Bước trích xuất đặc trưng trong phân lớp cũng giống trong bước đào tạo. Sau khi câu hỏi qua tiền xử lý thì dữ liệu sẽ được gán vector từ cho câu với từ điển là dữ liệu của bước training đã tạo.
4.3.2.2.4 Mơ hình phân lớp
Hình 4.25: Sơ đồ khối phân lớp của mơ hình
Ví dụ nếu ta nói “hello” thì đến Ở bước này ta dùng mạng nơ ron với dữ liệu nơ ron được huấn luyện trước đó để phân tích và đưa ra kết quả, ví dụ ta nói “hello” thì với đầu vào là 24 nơ ron [0. 0. 0. 0. 0. 0. 0. 0. 1. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.] và đầu ra là 4 giá trị tương ứng với 4 ý định (tags) [-2.7158, 4.7774, -2.1573, - 3.8762] ta thấy số lớn nhất là 4.7774 tương ứng với ý định “greeting”.
SVTH: LÊ TRUNG KIÊN 93
4.3.2.2.5 Kết quả
Hình 4.26: Sơ đồ khối tính tốn đầu ra cho kết quả
Để giá trị dự đốn được chính xác ta tính xác xuất đầu ra phân lớp nếu có giá trị nào trong mảng lớn hơn 85% thì sẽ trả kết quả là các câu trả lời của ý định có phần trăm lớn nhất như ví dụ của mơ hình phân lớp thì giá softmax cao nhất là 0.9983 của ý định “greeting” và kết quả là câu trả lời (responses) ["HI", "Hello"].
4.3.2.2.6 Dữ liệu đầu ra
Hình 4.27: Sơ đồ khối đầu ra âm thanh tiếng anh tiếng anh
Hình 4.28: Sơ đồ khối đầu ra âm thanh tiếng việt tiếng việt
SVTH: LÊ TRUNG KIÊN 94 Sau khi xác định được ý định thì bước tiếp theo là chọn ngẫu nhiên một câu trả lời rồi chuyển câu trả lời dạng text tiếng anh sang âm thanh với thư viện “pyttsx3” để người nghe có thể nghe được.
Đối với tiếng việt thì sau khi chọn ngẫu nhiên câu trả lời thì phải tiến hành thêm bước dịch từ tiếng anh sang tiếng việt bằng thư viện “Translator” rồi mới chuyển sang âm thanh bằng thư viện “gTTS” hỗ trợ đọc tiếng việt.
4.3.3 Xây dựng chương trình quản lý cơ sở dữ liệu người dùng.
Hình 4.29: Sơ đồ quản lý dữ liệu người dùng
Giải thích sơ đồ:
Để dễ dàng quản lý ta lưu dữ liệu vào ứng dụng Excel và để lưu được giá trị dữ liệu từ máy tính về excel ta dùng thư viện openpyxl.
SVTH: LÊ TRUNG KIÊN 95 - Nếu người dùng yêu cầu gửi tài liệu cho khoa cơ điện tử (ngăn chứa 1) hoặc khoa tự động hóa (ngăn chứa 2) thì máy tính sẽ lưu lại lịch sử gửi của người này.
Hình 4.30: Dữ liệu lịch sử người dùng gửi tài liệu
- Nếu người dùng hỏi mà máy tính khơng hiểu thì sẽ được lưu lại dữ liệu câu hỏi đó để có thể quản lý và đào tạo thêm những câu hỏi không trả lời được.
Hình 4.31: Dữ liệu lịch sử người dùng hỏi bị lỗi
- Nếu người quản lý truy cập vào cửa sau để lấy tài liệu thì máy tính cũng lưu lại lịch sử.
SVTH: LÊ TRUNG KIÊN 96
Hình 4.32: Dữ liệu lịch sử truy cập của người quản lý
4.4 Thiết kế giao diện người dùng 4.4.1 Hướng dẫn thao tác với giao diện 4.4.1 Hướng dẫn thao tác với giao diện
Hình 4.33: Giao diện người dùng hệ thống chatbot Bảng 4.6: Các nút chức năng Bảng 4.6: Các nút chức năng
Button Chức năng Ảnh minh họa
Chạy chương trình
SVTH: LÊ TRUNG KIÊN 97 - Cài đặt ngôn ngữ.
- Đăng nhập vào excel quản lý cơ sở dữ liệu người dùng.
- Truy cập mở cửa sau. Nhấn để đưa tài liệu vào ngăn dành cho khoa cơ điện tử
Nhấn để đưa tài liệu vào ngăn dành cho khoa tự động hóa
4.4.2 Xây dựng giao diện
Hình 4.34: Sơ đồ điều khiển từ giao diện
Nút RUN: Sau khi nhấn chương trình sẽ chạy lúc này máy tính sẽ nghe và xử lý giọng nói và dùng mơ hình phân loại ý định để xác định câu trả lời đầu ra nếu không nghe hoặc không xác định được ý định máy tính sẽ báo khơng hiểu và lưu câu hỏi khơng hiểu đó vào excel rồi bắt đầu lặp lại nghe lần nữa ngược lại nếu xác định được ý định thì máy tính sẽ trả lời khi ý định là yêu cầu mở ngăn một hoặc hai thì máy tính
SVTH: LÊ TRUNG KIÊN 98 sẽ trả lời, lưu dữ liệu vào excel và gửi tín hiệu xuống vi điều khiển để tiến hành hoạt động khi xong thì máy tính bắt đầu nghe tiếp tục.
Nút Mechatronic: Khi nhấn máy tính sẽ lưu dữ liệu lên excel truyền dữ liệu xuống vi điều khiển để tiến hành chạy cơ cấu đưa giấy vào ngăn của cơ điện tử khi xong thì máy tính bắt đầu nghe tiếp tục.
Nút Automation: Khi nhấn máy tính sẽ lưu dữ liệu lên excel truyền dữ liệu xuống vi điều khiển để tiến hành chạy cơ cấu đưa giấy vào ngăn của tự động hóa khi xong thì máy tính bắt đầu nghe tiếp tục.
Nút Setting: Khi nhấn sẽ hiện ra giao diện chuyển ngôn ngữ và đăng nhập, để