o. Đặc tả Use-case Chatbot hỗ trợ người dùng
5.3.16. Màn hình Chat
Đây là Màn hình Chat với chatbot của ứng dụng. Ở màn hình này người dùng có thể nhập câu hỏi và gửi cho server, sau đó server sẽ trả về câu trả lời tương ứng
Chương 6. ÁP DỤNG GỢI Ý SẢN PHẨM BẰNG THUẬT TOÁN RECOMMENDDATION SYSTEMS 6.1. Thực nghiệm 6.1.1. Một số định nghĩa a. Utility Matrix
Trong các Recommendation Systems, có hai thực thể chính là users và items. Mỗi user sẽ có mức độ quan tâm (degree of preference) tới từng item khác nhau. Mức độ quan tâm này, nếu đã biết trước, được gán cho một giá trị ứng với mỗi cặp user – item. Giả sử rằng mức độ quan tâm được đo bằng giá trị user rate cho item, ta tạm gọi giá trị này là rating. Tập hợp tất cả các ratings, bao gồm cả những giá trị chưa biết cần được dự đoán, tạo nên một ma trận gọi là utility matrix.
Hình 6.1: Utility Matrix
các items. Giá trị từng cặp (u, i) là giá trị rating của user thứ u đối với item thứ i (từ 0 là không thích, đến 5 là rất thích). Các ô có dấu “?” tương ứng với các ô chưa có dữ liệu. Công việc của một Recommendation System là dự đoán giá trị tại các ô chưa có dữ liệu này, từ đó đưa ra gợi ý cho người dùng.
Có hai hướng tiếp cận phổ biến để xác định giá trị rating cho mỗi cặp user – item trong khi xây dựng Utility Matrix:
- Thứ nhất, nhờ người dùng rate sản phẩm (items). Ví dụ như Shopee luôn nhờ người dùng rate các sản phẩm của họ bằng cách gửi các mail nhắc nhở nhiều lần sau khi đơn hàng tới trạng thái Đã nhận hàng. Tuy nhiên, cách tiếp cận này có một vài hạn chế vì thường thì người dùng ít khi rate sản phẩm. Và nếu có, đó có thể là những đánh giá thiên lệch bởi những người sẵn sàng rate.
- Thứ hai, dựa trên hành vi của người dùng (users) like, mua, xem, ... một item. Thường thì với cách này chỉ xây dựng được một ma trận với các thành phần là 1 và 0, với 1 là thể hiện người dùng thích sản phẩm, 0 là thể hiện chưa có thông tin. Trong trường hợp này, 0 không có nghĩa là thấp hơn 1, nó chỉ có nghĩa là người dùng chưa cung cấp thông tin. Chúng ta cũng có thể xây dựng ma trận với các giá trị cao hơn 1 thông qua thời gian hoặc số lượt mà người dùng xem một sản phẩm nào đó. Đôi khi, nút dislike cũng mang lại những lợi ích nhất định cho hệ thống, lúc này có thể gán giá trị tương ứng bằng -1 chẳng hạn.
b. Similarity Metrics (Các chỉ số tương tự)
Sau khi biểu diễn các rating thành Utility Matrix, mỗi cột (user) là một vector với độ dài là số lượng item. Để dự đoán được u0 có thích i2 hay không (hình 4.1), ta sẽ tìm user có sở thích gần giống với u0, từ đó dựa trên đánh giá của user gần giống đó về i2 để dự đoán u0 có thích i2 hay không. Bài toán đưa về dạng xác định mức độ tương tự của một vector với một vector đã cho.
Có 4 cách để tính mức độ tương tự chủ yếu sau: - Cosine Similarity
- Euclidian Distance - Dot Product - Pearson Similarity
D Cosine Similarity
Hình 6.2: Cosine Similarity
Cosine Similarity là phương pháp tính mức độ tương tự của hai vector bằng việc tính cosin của góc giữa hai vector đó.
Công thức:
Độ similarity của hai vector là một số trong đoạn [-1, 1]. Cosin của một góc bằng 1 nghĩa là góc giữa hai vector bằng 0, thể hiện hai vector hoàn toàn tương tự nhau. Cosin của một góc bằng
-1 thể hiện hai vector này hoàn toàn trái ngược nhau. Do đó, hai users càng tương tự nhau thì similarity giữa hai vector đó là cao nhất và ngược lại.
Hình 6.3: Sự tương đồng giữa hai vector
c. Root Mean Squared Error (RMSE)
Sử dụng RootMean Squared Error để đánh giá hiệu quả của thuật toán, RMSE được tính bằng công thức:
Các bước thực hiện bao gồm: - Chuẩn bị dữ liệu
- Tìm hiểu thuật toán
- Cài đặt thuật toán, chạy trên dữ liệu test
- Tính RMSE của các thuật toán và so sánh, đánh giá
a. Chuẩn bị dữ liệu
Bộ dữ liệu sử dụng: MovieLens 100K Dataset được công bố năm 1998 bởi GroupLens, bao gồm 100 000 ratings từ 943 users cho 1682 bộ phim.
Các file cần quan tâm:
- u.data: Chứa toàn bộ các ratings của 943 users cho 1682 movies. Mỗi user rate ít nhất 20 movies.
- ua.base, ua.test, ub.base, ub.test: là hai tập dữ liệu một cho training, một cho test. - u.user: Chứa thông tin về users, bao gồm: id, tuổi, giới tính, nghề nghiệp, zipcode (vùng miền), vì những thông tin này cũng có thể ảnh hưởng tới sở thích của các users. Tuy nhiên ở đây sẽ không sử dụng các thông tin này, trừ thông tin về id để xác định các user khác nhau.
- u.genre: Chứa tên của 19 thể loại phim. Các thể loại bao gồm: unknown, Action, Adventure, Animation, Children's, Comedy, Crime, Documentary, Drama, Fantasy, Film-Noir, Horror, Musical, Mystery, Romance, Sci-Fi, Thriller, War, Western.
- u.item: thông tin về mỗi bộ phim. Trong mỗi dòng sẽ có id của phim, tên phim, ngày phát hành, link trên imdb, và các số nhị phân 0, 1 phía cuối để chỉ ra bộ phim thuộc các thể loại nào trong 19 thể loại đã cho trong u.genre. Một bộ phim có thể thuộc nhiều thể loại khác nhau. Thông tin về thể loại này sẽ được dùng để xây dựng item profiles.
b. Content-based Recommender System
Trong các hệ thống content-based, tức dựa trên nội dung của mỗi item, chúng ta cần xây dựng một bộ hộ sơ (profile) cho mỗi item. Profile này được biểu diễn dưới dạng toán học là một feature vector. Trong những trường hợp đơn giản, feature vector được trực tiếp trích xuất từ item.
Các bước thực hiện: - Đọc dữ liệu items
- Xây dựng item profiles - Tìm mô hình cho mỗi user
Đọc dữ liệu items: đọc dữ liệu items từ file u.item, dữ liệu train từ ua.base, dữ liệu test từ ua.test.
Hình 6.4: Kết quả load dữ liệu Content-based
Xây dựng item profile: Vì đang dựa trên thể loại của phim để xây dựng profile nên sẽ chỉ
quan tâm tới 19 giá trị nhị phân ở cuối mỗi item.
Sau đó, xây dựng feature vector cho mỗi item dựa trên ma trận thể loại phim và feature TF – IDF.
Hình 6.5: Ví dụ feature vector của các item Mỗi hàng trên tương ứng với feature vector của một bộ phim.
Kết quả dự đoán: Dự đoán rating cho user có id là 100, kết quả dự đoán là:
Hình 6.6: Kết quả dự đoán theo Content – based Tính toán RMSE cho tập dữ liệu train và dữ liêu test, kết quả là:
Hình 6.7: RMSE của Content – based
c. Neighborhood - based Recommendation System
Neighborhood – based là một trong hai phương pháp phổ biển của Collaborative Filtering. Ý tưởng cơ bản là xác định mức độ quan tâm của một user tới một item dựa trên các users khác gần giống với user này. Việc gần giống nhau giữa các users có thể được xác định thông qua mức độ quan tâm của các users này tới các items khác mà hệ thống đã biết. Ví dụ, A và B đều thích phim Cô bé lọ lem, tức đều rate bộ phim này 5 sao. Đồng thời cũng đã biết A thích phim Hoa Mộc Lan, vậy nhiều khả năng B cũng thích bộ phim này.
Ở đây, trong hệ thống gợi ý Neighborhood – based Collaborative Filtering hai câu hỏi quan trọng nhất đó là:
- Làm thế nào xác định được mức độ giống nhau giữa các users?
- Khi đã xác định được các users gần giống nhau rồi, làm thế nào dự đoán được mức độ quan tâm của một user lên một item?
Việc xác định mức độ quan tâm của mỗi user tới một item dựa trên mức độ quan tâm của các users tương tự tới item đó còn được gọi là User – user Collaborative Filtering. Có một hướng tiếp cận khác là Item – item Collaborative Filtering. Trong hướng tiếp cận này, thay vì xác định sự giống nhau giữa các users, hệ thống sẽ xác định sự giống nhau giữa các item. Từ đó, hệ thống gợi ý những items gần giống với những items mà user có mức độ quan tâm cao.
Hình 6.8: Bảng số sao user u rate cho item i
Giả sử có các user từ u0 đến u6 và các item từ i0 đến i4, trong đó các số trong mỗi ô vuông thể hiện số sao mà mỗi user đã rate cho item với giá trị càng cao thể hiện mức độ quan tâm cao. Các dấu hỏi chấm là các giá trị mà hệ thống cần phải đi tìm. Đặt mức độ giống nhau của 2 user ui, uj là sim(ui, uj)
Quan sát qua ta có thể nhận thấy là u0 , u1 thích i0, i1, i2 và không thích i3 , i4 cho lắm. Điều ngược lại xảy ra ở các user còn lại. Vì vậy, một similarity function tốt cần được đảm bảo: sim(u0, u1) > sim(u0, ui), ∀i > 1.
Từđó, để xác định mức độ quan tâm của u0 lên i2, chúng ta nên dựa trên hành vi của u1 lên sản phẩm này. Vì u1 thích i2 nên hệ thống cần gợi ý i2 cho u0.
Câu hỏi đặt ra là: hàm số similarity như thế nào là tốt? Để đo similarity giữa 2 user, cách thường làm là xây dựng feature vector cho mỗi user rồi áp dụng 1 hàm có khả năng đo similarity giữa 2 vector đó. Chú ý rằng việc feature vector này khác với việc xây dựng item profile như trong Content-based System. Các vector này được xây dựng trực tiếp dựa trên utility matrix chứ không dùng dữ liệu ngoài như item profile. Với mỗi user, thông tin duy nhất mà chúng ta biết là các rating mà user đó đã thực hiện, tức cột tương ứng vì mỗi user thường chỉ rate một số lượng rất nhỏ các item. Cách khắc phục là bằng cách nào đó, ta giúp hệ thống điền các giá trị này sao cho việc điền không làm ảnh hưởng nhiều tới sự giống nhau giữa 2 vector. Việc điền này chỉ phục vụ cho việc tính similarity chứ không phải là suy luận ra giá trị cuối cùng.
Vậy mỗi dấu ‘?’ nên được thay bằng giá trị nào để hạn chế việc sai lệch quá nhiều? Một lựa chọn có thể nghĩ tới là thay các dấu ‘?’ bằng giá trị ‘0’. Điều này không thực sự tốt vì giá trị ‘0’ tương ứng với mức độ quan tâm thấp nhất. Một giá trị an toàn hơn là 2.5 vì nó là trung bình cộng của 0, mức thấp nhất, và 5, mức cao nhất. Tuy nhiên, giá trị này có hạn chế đối với những user dễ tính hoặc khó tính. Với các user dễ tính, thích tương ứng với 5 sao, không thích có thể ít sao hơn 1 chút, 3 sao chẳng hạn. Việc chọn giá trị 2.5 sẽ khiến cho các item còn lại là negative đối với user đó. Điều ngược lại xảy ra với những user khó tính hơn khi chỉ cho 3 sao cho các item họ thích và ít sao hơn cho những item họ không thích. Để giải quyết vấn đề này, ta có thể chọn 1 giá trị khả dĩ hơn là trung bình cộng các rating mà user tương ứng đã thực hiện. Việc này tránh được việc user quá khó tính hoặc quá dễ tính, tức lúc nào cũng có những item mà 1 user thích hơn so với những item khác.
Các bước thực hiện:
- Xây dựng Utility Matrix ban đầu (Hình 6.9 a) - Chuẩn hóa Utility Matrix (Hình 6.9 b)
- Xây dựng User Similarity Matrix (Hình 6.9 c)
- Dự đoán các rating (normalized) còn thiếu (Hình 6.9 d) - Ví dụ về cách dự đoán normalized rating của u1 cho i1. - Dự đoán các rating (denormalized) còn thiếu (Hình 6.9 f)
Hình 6.9: Mô tả các bước thực hiện User – user Collaborative Filtering
Xây dựng Utility Matrix ban đầu: Đọc dữ liệu items từ file u.item, dữ liệu train từ ub.base, dữ liệu test từ ub.test. Thứ tự của các cột trong mỗi dòng dữ liệu là user_id, item_id, rating.
Chuẩn hóa dữ liệu: Hàng cuối cùng trong Hình 4.10 a) là giá trị trung bình của rating cho mỗi user. Giá trị cao tương ứng với các user dễ tính và ngược lại. Khi đó nếu tiếp tục trừ từ mỗi rating đi giá trị này và thay các giá trị chưa biết bằng 0, ta sẽ được ma trận chuẩn hoá như Hình 4.10 b). Đây là một bước quan trọng vì:
- Việc trừ đi trung bình cộng của mỗi cột khiến trong mỗi cột có những giá trị dương và âm. Những giá trị dương tương ứng với việc user thích item, những giá trị âm tương ứng với việc user
không thích item. Những giá trị bằng 0 tương ứng với việc chưa xác định được liệu user có thích item hay không.
- Về mặt kỹ thuật, số chiều của Utility Matrix là rất lớn với hàng triệu users và items, nếu lưu toàn bộ các giá trị này trong một ma trận thì khả năng cao là sẽ không đủ bộ nhớ. Quan sát lưu toàn bộ các giá trị này trong một ma trận thì khả năng cao là sẽ không đủ bộ nhớ. Quan sát thấy rằng vì số lượng ratings biết trước thường là một số rất nhỏ so với kích thước của Utility Matrix, sẽ tốt hơn nếu chúng ta lưu ma trận này dưới dạng sparse matrix, tức chỉ lưu các giá trị khác không và vị trí của chúng. Vì vậy, tốt hơn hết, các dấu ‘?’ nên được thay bằng giá trị “0”, tức chưa xác định liệu user có thích item hay không. Việc này không những tối ưu bộ nhớ mà việc tính toán Similarity Matrix sau này cũng hiệu quả hơn.
Xây dựng User Similarity Matrix: Áp dụng phương pháp tính độ tương tự Cosine Similarity, lần lượt đi tính độ tương tự giữa các user vector ở Hình 6.9 b) ta được ma trận User similarity matrix S như Hình 6.9 c).
User similarity matrix S là một ma trận đối xứng vì cos là một hàm chẵn, và nếu user A giống user B thì điều ngược lại cũng đúng. Các ô màu xanh trên đường chéo đều bằng 1 vì đó là cos của góc giữa một vector và chính nó, tức cos(0) = 1. Khi tính toán ở các bước sau, ta không cần quan tâm tới các giá trị 1 này. Tiếp tục quan sát các vector hàng tương ứng với u0, u1, u2 ta sẽ thấy một vài điều thú vị:
- u0 gần với u1 và u5 (độ giống nhau là dương) hơn các user còn lại. Việc similarity cao giữa u0 và u1 là dễ hiểu vì cả 2 đều có xu hướng quan tâm tới i0, i1, i2 hơn cái item còn lại. Việc u0 gần với u5 thoạt đầu có vẻ vô lý vì u5 đánh giá thấp các item mà u0 đánh giá cao; tuy nhiên khi nhìn vào ma trận đã chuẩn hoá ở hình b), ta thấy rằng điều này là hợp lý.Vì item duy nhất mà cả 2 đã cung cấp thông tin là i1 với các giá trị tương ứng đều là tích cực.
-u1 gần với u0 và xa các user còn lại.
-u2 gần với u3, u4, u5, u6 và xa các user còn lại.
Dự đoán các rating (normalized) còn thiếu: Công thức phổ biến được sử dụng để dự đoán
Trong đó: N(u,i) là tập hợp k users trong neighborhood (có similarity cao nhất) của u mà đã rated i.
Ví dụ: Tính normalize rating của u1 cho i1 được cho trong hình e) với số nearest neighbors là k = 2. Các bước thực hiện như sau:
- Xác định các user đã rate i1, đó là u0, u3, u5.
- Xác định similarity của u1 và các user này, ta nhận được 0.83, -0.40, -0.23. Hai (k = 2) giá trị lớn nhất là 0.83 và -0.23 tương ứng với u0 và u5.
- Xác định các normalized rating của u0 và u5 cho i1, ta thu được 2 giá trị lần lượt là 0.75 và 0.5.
- Dự đoán kết quả:
Dự đoán các rating (denormalized) còn thiếu: Việc quy đổi các giá trị ratings đã chuẩn
hoá về thang 5 có thể được thực hiện bằng cách cộng các cột của ma trận Hình 6.9 d) với giá trị rating trung bình của mỗi user như đã tính trong Hình 6.9 a).
Kết quả dự đoán: