Chương 4 XÂY DỰNG HỆ THỐNG
4.4. Thiết kế giao diện
4.4.10. Tìm kiếm sản phẩm
Một chức năng không thể thiếu đối với các ứng dụng mua hàng online đó chính là tìm kiếm sản phẩm.
Tại VIEHO, bên cạnh thanh search bar để tìm kiếm thơng thường, ứng dụng cịn hiển thị cho khách hàng lịch sử tìm kiếm, và gợi ý những tìm kiếm phổ biển
4.4.11. Quản lý đơn hàng
Màn hình quản lý đơn hàng giúp khách hàng theo dõi tình trạng đơn hàng, hủy hoặc trả hàng với nhiều lý do khác nhau
4.4.12. Quản lý địa chỉ
Khách hàng có thể tùy chỉnh thêm, xóa, sửa và đặt 1 địa chỉ làm địa chỉ giao hàng mặc định
4.4.13. Quản lý hồ sơ
Khách hàng cập nhật thông tin cá nhân ở màn hình quản lý hồ sơ
Chương 5. ÁP DỤNG GỢI Ý SẢN PHẨM 5.1. Thực nghiệm
5.1.1. Một số định nghĩa 5.1.1.1. Utility matrix
Như đã đề cập, có hai thực thể chính trong các Recommendation Systems 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 5-1 Utility matrix
Hình trên là ví dụ về Utility matrix. Trong đó, u0 -> u6 tương ứng với các
users, i0 -> i6 tương ứng với các items. Giá trị từng cặp (u, i) là giá trị rating
của user u đối với item i.
Thơng thường, có rất nhiều users và items trong hệ thống, và mỗi user thường chỉ rate một số lượng rất nhỏ các item, thậm chí có những user khơng rate item nào (với những users này thì cách tốt nhất là gợi ý các items phổ
biến nhất). Vì vậy, lượng ơ màu xám của utility matrix trong các bài tốn đó thường là rất lớn, và lượng các ô đã được điền là một số rất nhỏ.
Rõ ràng rằng càng nhiều ơ được điền thì độ chính xác của hệ thống sẽ càng được cải thiện. Vì vậy, các hệ thống luôn luôn hỏi người dùng về sự quan tâm của họ tới sản phẩm, và muốn người dùng đánh giá càng nhiều sản phẩm càng tốt. Việc đánh giá các sản phẩm, vì thế, khơng những giúp các người dùng khác biết được chất lượng sản phẩm mà còn giúp hệ thống biết được sở thích của người dùng, qua đó có chính sách quảng cáo hợp lý.
Xây dựng utility matrix: Khơng có Utility matrix, gần như khơng thể gợi ý được sản phẩm tới người dùng, ngồi cách ln ln gợi ý các sản phẩm phổ biến nhất. Vì vậy, trong các Recommender Systems, việc xây dựng Utility Matrix là tối quan trọng. Tuy nhiên, việc xây dựng ma trận này thường có gặp nhiều khó khăn. 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 Utility Matrix:
+ Nhờ người dùng rate sản phẩm. Rất nhiều hệ thống khác áp dụng cách này.
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.
+ Hướng tiếp cận thứ hai là dựa trên hành vi của users. Rõ ràng, nếu một người dùng mua một sản phẩm trên Amazon, xem một clip trên Youtube (có thể là nhiều lần), hay đọc một bài báo, thì có thể khẳng định rằng người dùng đó thích sản phẩm đó. Thường thì với cách này, ta 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 thể hiện người dùng thích sản phẩm, 0 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. 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.
5.1.1.2. Cosine Similarity
Sau khi biểu diễn các rating thành utility matrix, mỗi hàng(item) là một vector với độ dài là số lượng user. Để tính độ tương tự giữa các user thì Cosine similarity chính là hàm được sử dụng nhiều nhất
Hình 5-2 Consine similarity
Để tính độ tương quan giữa 2 vector, ta thực hiện phép tính tích vơ hướng giữa 2 vector, hay nói cách khác là tính giá trị góc cosin được hợp bởi 2 vector, với 0° < α < 180°
Hình 5-3 Cơng thức tính cosin similarity giữa u1 và u2
Nếu tích vơ hướng cho ra kết quả càng gần về 0, khi đó 2 vector gần như vng góc với nhau, đồng nghĩa với việc 2 vector khơng có sự tương đồng
với nhau. Ngược lại, nếu tích vơ hướng càng tiến về 1, khi đó 2 vector gần như trùng nhau, nghĩa là sự tương đồng giữa 2 vector rất cao.
5.1.1.3. TF-IDF
TF-IDF (Term Frequency – Inverse Document Frequency) là 1 kĩ thuật
sử dụng trong khai phá dữ liệu văn bản. Trọng số này được sử dụng để đánh giá tầm quan trọng của một từ trong một văn bản. Giá trị cao thể hiện độ quan trọng cao và nó phụ thuộc vào số lần từ xuất hiện trong văn bản nhưng bù lại bởi tần suất của từ đó trong tập dữ liệu. Một vài biến thể của TF-IDF thường được sử dụng trong các hệ thống tìm kiếm như một cơng cụ chính để đánh giá và sắp xếp văn bản dựa vào truy vấn của người dùng. TF-IDF cũng được sử dụng để lọc những từ stopwords trong các bài tốn như tóm tắt văn bản và phân loại văn bản.
TF: Term Frequency (Tần suất xuất hiện của từ) là số lần từ xuất hiện
trong văn bản. Vì các văn bản có thể có độ dài ngắn khác nhau nên một số từ có thể xuất hiện nhiều lần trong một văn bản dài hơn là một văn bản ngắn. Như vậy, term frequency thường được chia cho độ dài văn bản (tổng số từ trong một văn bản).
Hình 5-5. Cơng thức tính TF Trong đó: Trong đó:
• tf(t, d): tần suất xuất hiện của từ t trong văn bản d.
• f(t, d): Số lần xuất hiện của từ t trong văn bản d.
• max({f(w, d) : w ∈ d}): Số lần xuất hiện của từ có số lần xuất hiện
IDF: Inverse Document Frequency (Nghịch đảo tần suất của văn bản),
giúp đánh giá tầm quan trọng của một từ. Khi tính tốn TF, tất cả các từ được coi như có độ quan trọng bằng nhau. Nhưng một số từ như “is”, “of” và “that” thường xuất hiện rất nhiều lần nhưng độ quan trọng là không cao. Như thế cần giảm độ quan trọng của những từ này xuống.
Hình 5-6. Cơng thức tính IDF
- Trong đó:
• idf(t, D): giá trị IDF của từ t trong tập văn bản.
• |D|: Tổng số văn bản trong tập D.
• |{d ∈ D : t ∈ d}|: thể hiện số văn bản trong tập D có chứa từ t. Cơ số logarit trong công thức này không thay đổi giá trị IDF của từ mà chỉ thu hẹp khoảng giá trị của từ đó. Việc sử dụng logarit nhằm giúp giá trị TF-IDF của một từ nhỏ hơn, do đó có cơng thức tính TF-IDF của một từ trong 1 văn bản là tích của TF và IDF của từ đó.
Cụ thể, cơng thức tính TF-IDF hoàn chỉnh như sau
TF-IDF(t, d, D) = TF(t, d) x IDF(t, D)
Khi đó: Những từ có giá trị TF-IDF cao là những từ xuất hiện nhiều trong văn bản này, và xuất hiện ít trong các văn bản khác. Việc này giúp lọc ra những từ phổ biến và giữ lại những từ có giá trị cao (từ khoá của văn bản đó)
5.1.1.4. Weighted Rating (WR)
- Sử dụng cơng thức xếp hạng có trọng số của nó làm số liệu / điểm số, công thức này được IMDB sử dụng để xếp hạng top 250 phim.
Hình 5-7. Cơng thức weighted rating
- Trong đó:
• v là đánh giá 1 bộ phim
• m là số đánh giá tối thiểu cần thiết để được liệt kê trong biểu đồ
• R là điểm đánh giá trung bình của bộ phim.
• C là bình chọn trung bình trên tồn bộ phim.
5.1.1.5. Root Mean Squared Error (RMSE)
- Sử dụng RootMean Squared Error để đánh giá hiệu quả của thuật tốn, RMSE được tính bằng cơng thức:
Hình 5-8. Cơng thức tính RMSE
- Trong đó:
• Dtest : tập kiểm tra
• rui: dự đốn của người dùng u trên item i trên tập kiểm tra
5.1.2. Phương pháp
- Các bước thực hiện bao gồm:
+ Tìm hiểu thuật tố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 tốn và so sánh, đánh giá.
- Dữ liệu test sử dụng: MoviesLens 100K Dataset (https://grouplens.org/datasets/movielens/100k/)
- MoviesLens 100K Dataset:
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. Thơng tin về thời gian rate cũng được cho không sử dụng trong bài viết này.
ua.base, ua.test, ub.base, ub.test: là hai cách chia toàn bộ dữ liệu ra thành hai tập con, 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, trong bài viết 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
5.1.2.1. 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, 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 5-9. Kết quả load dữ liệu Content-based
Xây dựng items profile: xây dựng items profile dựa trên thể loại và
TF-IDF.
Hình 5-10. 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 item (ở đây là một bộ phim).
Kết quả dự đoán: dự đoán rating cho user có id là 120, kết quả tìm
được là:
Hình 5-11. Kết quả dự đốn content-based
Tính tốn RMSE cho tập dữ liệu train và dữ liệu test, kết quả là:
5.1.2.2. Neighborhood-based Collaborative Filtering
Hình 5-13. 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, 1 similarity function tốt cần đả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, 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 ngồi như item profile. Với mỗi user, thơng tin duy nhất mà 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.
Hình 5-14. Các bước thực hiện Neighborhood-based CF
Ví dụ mơ tả User-user CF: a) utility matrix (UM) ban đầu. b) UM đã được chuẩn hoá. c) User similarity matrix. d) Dự đốn các (normalized) rating cịn thiếu. e) Vd về cách dự đoán normalized rating của u1 cho i1. f) Dự đốn các (denormalized) rating cịn thiếu
Chuẩn hoá dữ liệu:
Hàng cuối cùng trong hình 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 hố như hình b). Vì sao bước chuẩn hố này lại quan trọng?
Việc trừ đi trung bình cộng của mỗi cột khiến trong mỗi cột có giá trị dương và âm. Những giá trị dương tương ứng với việc user thích item,
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 user và item, nếu lưu tồn bộ giá trị trong 1 ma trận thì khả năng cao sẽ khơng đủ bộ nhớ. Thấy rằng số lượng rating 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 lưu ma trận này dưới dạng sparse matrix, tức là chỉ lưu các giá trị khác 0 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 tốn similarity matrix sau này cũng hiệu quả hơn.
Sau khi đã chuẩn hoá dữ liệu như trên, một vài similarity function thường được sử dụng là:
• Cosine Similarity: Đây là hàm được sử dụng nhiều nhất, và nó cũng quen thuộc nhất vì nó giống với cơng thức tính cos của góc giữa 2 vector u1, u2.
cosine_similarity(u1, u2) = cos(u1, u2) = 𝑢1⋅𝑢2
‖𝑢1‖.‖𝑢2‖
Trong đó, u1,2 là vector tương ứng với user 1, 2 đã được chuẩn hoá như ở trên. Độ similarity của 2 vector là 1 số trong đoạn [-1, 1]. Giá trị bằng 1 thể hiện 2 vector hoàn toàn giống nhau. Hàm số cos của 1 góc bằng 1 nghĩa là góc giữa 2 vector bằng 0, tức 1 vector bằng tích của 1 số dương với vector còn lại. Giá trị cos = -1 thể hiện 2 vector này hoàn toàn trái ngược nhau.
Ví dụ về cosine_similarity của các user trong hình b) được cho trong hình c). Similarity matrix S là 1 ma trận đối xứng vì cos là 1 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 1 vector và chính nó, tức cos(0) = 1. Khi tính tố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.