STT Tên thành phần Mô tả
1 Nút tắt tiếng Ngắt thu âm thanh
2 Đổi chiều camera Đổi chiều camera (trước hoặc sau) 3 Nút kết thúc cuộc
gọi
Tiến hành kết thúc cuộc gọi video
78 • Giao diện định vị Hình 3.33: Giao diện định vị STT Tên thành phần Mơ tả 1 Nút kích hoạt liên tục cập nhật vị trí
Cập nhật vị trí sau mỗi 20 giây
79
• Giao diện hiển thị các bài viết ẩm thực
Hình 3.34: Giao diện hiển thị các bài viết ẩm thực STT Tên thành phần Mô tả STT Tên thành phần Mô tả
1 Nút tạo bài viết mới
Điều hướng người dùng đến màn hình tạo bài viết mới
2 Nút tìm kiếm Tìm kiếm nhanh gia đình theo tên Bảng 3.55: Mơ tả giao diện hiển thị các bài viết ẩm thực
80
• Giao diện tạo bài viết mới
Hình 3.35: Giao diện tạo bài viết ẩm thực mới STT Tên thành phần Mô tả STT Tên thành phần Mơ tả
1 Ơ chọn ảnh đại diện
Chọn ảnh đại diện cho bài viết
81 3 Khung nhập nội
dung bài viết
Nhập nội dung bài viết
Bảng 3.56: Mô tả giao diện tạo bài viết ẩm thực mới
Chương 4. ÁP DỤNG THUẬT TOÁN
4.1. Một số định nghĩa
4.1.1. Utility matrix
Đây là một thành phần hết sức quan trọng trong hệ khuyến nghị, ta hầu như không thể thực hiện khuyến nghị mà không sử dụng tới utility matrix.
Trong hệ khuyến nghị sẽ bao gồm hai lớp thực thể tạm gọi là user và item. User sẽ có sự quan tâm đối với các item nhất định, và sự quan tâm đó sẽ được đúc kết thơng qua dữ liệu ta có. Và những dữ liệu ta có để có thể đúc kết được mối quan tâm của các user đối với các item sẽ được thể hiện trong utility matrix, với mỗi cặp user - item sẽ có một giá trị đại diện cho mức độ quan tâm của user tới item đó.
Hình 4.1: Ví dụ về Utility matrix [3]
Hình trên là một ví dụ về ma trận utility. Trong đó từ u[1] đến u[n] tương ứng với các user và từ i[1] đến i[m] tương ứng với các item. Giá trị từng cặp (u, i)
82
chính là giá trị rating (mức độ quan tâm của user u đến item i). Ma trận này được xây dựng từ dữ liệu. Tuy nhiên, có thể thấy rằng ma trận này có rất nhiều các giá trị chưa biết, đó là do giữa cặp user - item chưa có sự tương tác. Nhiệm vụ của hệ gợi ý chính là dựa vào các ơ đã có giá trị trong ma trận trên (dữ liệu thu được từ trong q khứ), thơng qua mơ hình đã được xây dựng, dự đốn các ơ cịn trống (của user hiện hành), sau đó dựa vào các kết quả dự đốn này, sắp xếp kết quả dự đốn (ví dụ, từ cao xuống thấp) và chọn ra những items có giá trị dự đốn cao nhất để gợi ý cho người dùng.
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: [4]
• Nhờ người dùng rate sản phẩm. Amazon luôn gửi mail nhắc nhở người dùng rate sản phẩm hay Baemin luôn nhắc nhở người dùng rate sản phẩm và người giao hàng mỗi khi nhận được sản phẩm. Tuy nhiên, cách này cũng sẽ có những hạn chế như người dùng rất ít khi rate sản phẩm hay việc rate sản phẩm đôi khi là những đánh giá thiên lệch của người dùng về sản phẩm như đối với người dùng khó tính, họ có thể đánh giá sản phẩm họ thích chỉ ở mức 3-4 sao và các sản phẩm họ khơng thích ở mức 1 sao, nhưng với người dùng dễ tính thì họ sẵn sàng đánh giá sản phẩm với 5 sao cho sản phẩm họ thích và 3 sao cho sản phẩm họ khơng thích.
• Một hướng tiếp cận khác là thu thập thông tin về hành vi của user. Nếu user mua một sản phẩm trên Amazon, hay xem một video trên youtube (có thể xem nhiều lần), hay click đọc một bài viết nào đó, thì có thể khẳng định rằng người dùng thích hay quan tâm đến sản phẩm đó.
83
4.1.2. Cosine similarity
Sau khi đã xây dựng được utility matrix, mỗi cột (user) là một vector với độ dài là số lượng item. Ta có thể sử dụng những vector này để thực hiện việc tính tốn độ tương ứng giữa các user bằng việc sử dụng hàm Cosine similarity.
Hình 4.2: Cơng thức tính cosine similarity trên góc θ
Độ tương quan giữa hai vector sẽ được xác định dựa trên cosine góc được hợp thành bởi hai vector, với 0° < θ < 180°, bởi đó độ similarity giữa hai vector sẽ là một số thuộc trong khoảng [-1, 1]. Giá trị bằng 1 thể hiện hai vector hoàn toàn similar nhau. Hàm số cos của một góc bằng 1 nghĩa là góc giữa hai vector bằng 0, tức một vector bằng tích của một số dương với vector cịn lại. Giá trị cos bằng -1 thể hiện hai vector này hoàn toàn trái ngược nhau, tức khi hành vi của hai users là hoàn toàn ngược nhau thi similarity giữa hai vector đó là thấp nhất.
Hình 4.3: Độ tương quan giữa hai vector Hệ khuyến nghị gồm 2 nhóm chính: Hệ khuyến nghị gồm 2 nhóm chính:
84
o Content-based Filtering: Gợi ý các item dựa vào hồ sơ (profiles) của người dùng hoặc dựa vào nội dung/thuộc tính (attributes) của những item tương tự như item mà người dùng đã chọn trong quá khứ.
o Collaborative Filtering: Gợi ý các items dựa trên sự tương quan (similarity) giữa các users và/hoặc items. Có thể hiểu rằng đây là cách gợi ý tới một user dựa trên những users có hành vi tương tự.
4.1.3. Reddit’s hot ranking
Hình 4.4: Mơ tả thuật tốn Reddit’s hot ranking [5]
4.1.3.1. Hiện tượng snowball
Hiện tượng snowball là hiện tượng sẽ xảy ra khi có một bài viết được xếp hạng đứng đầu và cứ mỗi ngày sẽ lại càng nhận được nhiều lượt vote hơn dẫn đến việc bài viết sẽ luôn nhận được một số lượt vote nhất định theo thời gian và sau một khoảng thời gian dài, bài viết vẫn sẽ xuất hiện trên top các bài viết được yêu thích nhiều nhất.
85
4.1.3.2. Ảnh hưởng của yếu tố thời gian
Thời gian đăng của bài viết có ảnh hưởng lơn đến độ phổ biến của bài viết và thuật toán sẽ xếp hạng bài viết mới cao hơn so với các bài viết cũ. Điểm số bài viết sẽ không bị giảm đi theo thời gian nhưng những bài viết mới hơn sẽ được chấm điểm xếp hạng cao hơn.
Hình 4.5: Minh họa về xếp hạng các bài viết có cùng số lượt upvote và downvote nhưng được đăng tải ở các mốc thời gian khác nhau [5]
4.1.3.3. The logarithm scale
Thuật toán của Reddit sử dụng hàm logarithm để đánh trọng số các lượt vote đầu tiên cao hơn các lượt vote sau.
86
Với tác dụng của hàm logarithm, các lượt vote sau sẽ được chấm điểm thấp hơn so với các lượt vote đầu, cụ thể:
• Với bài viết có 10 vote (tức số upvote - downvote), bài đó sẽ được cộng hẳn
log 10 = 1 điểm. [6]
• Với bài viết có gấp đơi số vote trên, tức 20 vote, bài đó lại chỉ nhận được
log 20 = 1.3 điểm. [6]
• Một bài viết khác có số vote gấp 10 bài viết đầu, tức tận 100 vote, bài đó lại chỉ nhận được log 100 = 2 điểm. [6]
Cũng một ví dụ khác, để bài viết đăng cách đây 3 ngày trước có hạng cao hơn một bài vừa mới đăng, nó cần phải có đến hơn 259200
45000 = 5.76 điểm từ
số vote, tức nó cần phải có đến gần 600000 lượt vote. [6]
Như vậy, nhờ vào hàm logarit mà các lượt vote đầu có giá trị cao nhất, các lượt vote về sau càng ngày càng có ít giá trị hơn và để bài viết càng cũ giữ được trên trending thì càng phải nhận được lượng vote cực lớn. Như vậy sẽ giải quyết được vấn đề snowball.
4.1.3.4. Ảnh hưởng của các lượt downvote
Có thể thấy từ thuật tốn, số điểm của bài viết được tính dựa trên số lượt upvote và downvote như sau:
Hình 4.7: Cách tính điểm cho bài viết dựa trên số lượt up và downvote [5] Điều có ảnh hưởng lớn đến các bài viết có số lượt upvote và downvote cao vì chúng sẽ có lượt xếp hạng thấp hơn so với các bài viết chỉ có lượt upvote.
87
Hình 4.8: Ảnh hưởng của số lượt downvote đến xếp hạng của bài viết [5]
4.1.3.5. Tính điểm bài viết từ thời gian đăng bài
Hình 4.9: Tính hiệu số giữa thời gian đăng bài và một mốc thời gian cố định trong quá khứ [5]
Một mốc thời gian trong quá khứ được chọn cố định và tính hiệu số giữa mốc thời gian đó với thời gian đăng bài. Hằng số 45000 tương ứng với số giây của khoảng thời gian 12.5 giờ. Như vậy từ cơng thức có thể thấy, cứ qua 12.5 giờ thì bài viết mới đăng sẽ được cộng thêm 1 điểm. Như được đề cập trong hình trên, mốc thời gian cố định được chọn là 7:46:43 sáng ngày 8 tháng 12, năm 2005 quy đổi sang UNIX timestamp sẽ là 1134028003. Ví dụ: [6]
• Chọn mốc thời gian cố định là 0:00 ngày 25/12/2019 quy đổi sang UNIX timestamp, ta có 1577206800.
• Bài viết đầu tiên được đăng vào 6h sáng (6h sau đó), Unix Timestamp là 1577228400, hiệu thời gian là 1577228400 − 1577206800 = 21600, vậy bài viết sẽ được cộng: 21600
45000 = 0.48 điểm.
• Bài viết thứ 2 được đăng vào 12h30, hiệu thời gian là 1577251800 −
1577206800 = 45000 , vậy bài viết được cộng: 45000
88
• Bài viết thứ 3 được đăng vào 1h sáng ngày tiếp theo (ngày 26), hiệu thời gian là 1577296800 − 1577206800 = 90000, vậy bài viết được cộng:
90000
45000= 2 điểm.
4.1.4. Root Mean Squared Error (RMSE)
Hình 4.10: Cơng thức tính RMSE [4]
• Dtest: tập kiểm tra
• rui: dự đoán của người dùng u trên item i trên tập kiểm tra.
• 𝑟̂𝑢𝑖: dự đốn của người dùng u trên item i theo kết quả gợi ý.
4.2. Thực nghiệm
4.2.1. Phương pháp
4.2.1.1. Neighborhood-based collaborative filtering
Trong các CFRSs, các thuật tốn neighborhood-based (ví dụ như k- Nearest Neighbors) là những thuật toán cơ bản giúp thực hiện việc khuyến nghị với ưu điểm dễ dàng cài đặt và hiệu năng tốt. Các thuật tốn này cịn được biết tới là các thuật toán memory-based, là một trong những thuật toán đầu tiên được phát triển cho phương thức khuyến nghị cộng tác (collaborative filtering). Những thuật toán này dựa trên cơ sở là các người dùng tương đồng nhau sẽ thể hiện các hành vi đánh giá và sở thích tương tự nhau. Các thuật toán neighborhood-based được phân làm hai loại chính:
89
• User-user collaborative filtering: Hệ thống sẽ 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 user cùng nhóm đến item đó.
• Item-item collaborative filtering: Hệ thống sẽ xác định mức độ được quan tâm của mỗi item bởi một user dựa trên các đánh giá của user đó lên các item cùng nhóm (được quan tâm bởi các user tương tự đã quan tâm item này) và từ đó đưa ra gợi ý về những item mà user có khả năng sẽ có mức độ quan tâm cao.
Hình 4.11: Phân loại các phương pháp khuyến nghị lọc cộng tác. [7] Các bước thực hiện:
• Tìm hiểu thuật tốn.
• Cài đặt thuật tốn, chạy trên bộ dữ liệu test.
• Tính RMSE và thực hiện việc so sánh, đánh giá.
Bộ dữ liệu test được sử dụng là MoviesLens 100K Dataset với năm bộ split được đánh tên từ u1 đến u5 gồm hai file .base và .test được chia ra từ dữ liệu tổng theo tỉ lệ 80% và 20%. Bộ split được chia sẵn với mục đích tiến hành đánh giá 5-fold cross-validation.
90
4.2.1.2. User-user collaborative filtering
Hình 4.12: Ví dụ về user-item utility matrix. [3]
Hình trên là 1 ví dụ về user-item utility matrix với các cột từ u0 đến u6 đại diện các user, các hàng từ i0 đến i4 đại diện các item. Giá trị của mỗi ô [i, j] đại diện số sao mà user i đã rate cho item j. Giá trị càng cao thể hiện mức độ quan tâm càng cao. Các dấu hỏi chấm là các giá trị mà hệ thống cần điền. Gọi mức độ giống nhau của hai user 𝑢𝑖 và 𝑢𝑗 là 𝑠𝑖𝑚(𝑢𝑖, 𝑢𝑗).
Từ utility matrix mẫu có thể thấy 𝑢0, 𝑢1 thích 𝑖0, 𝑖1, 𝑖2 và khơng thích
𝑖3, 𝑖4 cho lắm. Điều ngược lại xảy ra ở các user còn lại. Vậy, một similarity
function cần đảm bảo được:
𝑠𝑖𝑚(𝑢0, 𝑢1 ) > 𝑠𝑖𝑚(𝑢0, 𝑢𝑖), ∀ 𝑖 > 1
Bên cạnh đó, để đo similarity giữa hai user, cách thường làm là xây dựng feature vector cho mỗi user rồi đo similarity giữa 2 vector đó. Vector feature được xây dựng từ dữ liệu trong utility matrix. Trong trường hợp này là các cột trong utility matrix, tuy nhiên các cột này sẽ có những giá trị đánh giá bị khuyết
91
vì mỗi user chỉ đánh giá một số lượng item nhất định. Vậy, một bước xử lý cực kì quan trọng là ta cần phải chuẩn hóa dữ liệu bằng cách điền vào các ơ giá trị cịn khuyết nhưng đồng thời phải đảm bảo điền sao cho các giá trị được điền khơng làm ảnh hưởng nhiều tới việc tính tốn mức độ tương tự giữa hai vector. Lưu ý, bước xử lý này là nhằm giúp tính tốn similarity, khơng có tác dụng để thực hiện suy luận ra giá trị cuối cùng.
Chuẩn hóa dữ liệu:
Vậy mỗi dấu “?” nên được thay thế bằng giá trị nào để hạn chế ảnh hưởng của giá trị được điền đến việc xác định mức độ tương đồng giữa các user. Một lựa chọn có thể nghĩ tới đó là điền giá trị 0. Tuy nhiên giá trị 0 tương ứng với mức độ quan tâm thấp nhất vậy nên việc thay thế bằng giá trị 0 sẽ khiến hệ thống suy diễn rằng mức độ quan tâm của user đến item rất tiêu cực. Một lựa chọn khác là giá trị 2.5 bởi đây là giá trị trung bình cộng của 0 là mức thấp nhất và 5 là mức cao nhất. Tuy nhiên giá trị này có hạn chế trong trường hợp đối với user dễ tính thì có thể việc thích sẽ tương ứng với 5 sao, khơng thích có thể ứng với khoảng 3 sao, như vậy vơ hình chung giá trị 2.5 sẽ khiến cho các đánh giá về các item chưa biết là quá tiêu cực đối với những người dùng này. Cụ thể hơn, chúng ta sẽ xử lý chuẩn hóa dữ liệu như sau:
92
Hình 4.13: Ma trận utility ban đầu và trung bình cộng của các đánh giá đã biết theo từng cột. [3]
Như trong hình trên, ta thực hiện tính trung bình cộng các giá trị đánh giá đã có của mỗi user (theo từng cột). Tiếp đến ta thực hiện việc trừ từng giá trị rating đã biết của mỗi user cho giá trị trung bình rating tương ứng của user đó và điền giá trị 0 vào các ơ khuyết giá trị. Bước xử lý này cực kì quan trọng bởi việc trừ đi trung bình cộng của mỗi cột khiến xuất hiện giá trị dương và âm. Những giá trị dương thể hiện mức độ thích và âm thể hiện mức độ khơng thích. Qua đó có thể thấy lúc này những giá trị 0 mới thực sự có ý nghĩa là chưa xác định được sự quan tâm của user đối với item thay vì là giá trị ratings thấp nhất của user đối với item. Bên cạnh đó, những giá trị 0 này sẽ mang lại một lợi ích khác trong việc tối ưu tính tốn và lưu trữ, lí do là vì số chiều của utility matrix sẽ rất lớn khi số lượng user và item không ngừng gia tang. Độ phức tạp lưu trữ sẽ là O (m * n) với m đại diện cho số lượng user và n đại diện cho số lượng item. Việc lưu trữ một ma trận với kích thước m * n là cực kì tốn kém, vì vậy các giá trị 0 giúp ta tận dụng một phương pháp lưu trữ khác đó là sparse matrix. Lúc
93
này, thay vì sử dụng một mảng hai chiều có kích thước m * n, ta chỉ cần lưu trữ