---
# System prepended metadata

title: BookCrossing

---

<style>
 text-align: justify;
</style>

# Báo cáo về Hệ thống gợi ý BookCrossing

- Tác giả:
    - Phù Phương Tuấn
    - Nguyễn Việt Tùng
    - Trần Thái Vỹ
    - Dương Ngọc Thịnh
    - Hồ Thị Hồng Lạc
- Trường THPT chuyên Trần Đại Nghĩa - 12CTin  

Mục lục
=================

 
* 1 [Giới thiệu](#1-Giới-thiệu)
    * 1.1 [Hiện trạng đọc sách hiện nay](#11-Hiện-trạng-đọc-sách-hiện-nay)
    * 1.2 [Mục tiêu của sản phẩm](#12-Mục-tiêu-của-sản-phẩm)
* 2 [Dữ liệu](#2-Dữ-liệu)
    * 2.1 [Dữ liệu thô](#21-Dữ-liệu-thô)
    * 2.2 [Xử lý dữ liệu](#22-Xử-lý-dữ-liệu)
* 3 [Xây dựng mô hình sản phẩm](#3-Xây-dựng-mô-hình-sản-phẩm)
    * 3.1 [Chuẩn bị ban đầu](#31-Chuẩn-bị-ban-đầu)
    * 3.2 [Chọn model tốt nhất](##32-Chọn-model-tốt-nhất)
    * 3.3 [Luyện model](#33-Luyện-model)
    * 3.4 [Kết quả](#34-Kết-quả)   
* 4 [Kết luận](#4-Kết-luận)
    * 4.1 [Ưu điểm](#41-Ưu-điểm)
    * 4.2 [Nhược điểm](#42-Nhược-điểm)


## 1.  Giới thiệu:




Hệ thống gợi ý (Recommender System) là công cụ được thiết kế nhằm cung cấp những khuyến nghị hữu ích về sản phẩm, dịch vụ,…cho người dùng. Hệ thống gợi ý dựa trên dữ liệu về mối quan hệ giữa người dùng, sản phẩm và các hành vi của người dùng trong quá khứ đối với sản phẩm để đưa ra những gợi ý thông minh, phù hợp với sở thích của từng khách hàng. Hệ thống gợi ý giúp khách hàng nhanh chóng định vị được những sản phẩm họ quan tâm để từ đó đưa ra quyết định đúng đắn khi mua sắm online.Hệ thống gợi ý nói chung được thiết kế để tăng trải nghiệm cho người dùng, sau đó là để tăng doanh thu cho website; bằng cách cân bằng giữa sự liên quan, sự mới lạ, sự bất ngờ và sự phong phú của sản phẩm được đề xuất giữa khối lượng thông tin khổng lồ, giúp định hướng người dùng trong trải nghiệm tiêu dùng, tăng mức độ tiếp cận của các sản phẩm.

Book-crossing là một định nghĩa xuất phát từ website bookcrossing.com - một câu lạc bộ đọc sách trực tuyến được thành lập để tạo thành một cộng đồng người dùng chia sẻ và đánh giá sách.

Bài báo cáo này tập trung vào việc phân tích và giải thích lý do phát triển một hệ thống gợi ý sách dựa trên BookCrossing, một nền tảng quốc tế của cộng đồng đọc sách. Sự xuất hiện của hệ thống này không chỉ mang lại những cơ hội mới cho việc đọc sách cá nhân mà còn tạo ra những động lực mạnh mẽ để thúc đẩy sự tương tác xã hội và tái sử dụng nguồn sách.

Book-crossing Recommender sẽ tiếp nhận phản hồi tường minh và phản hồi tiềm ẩn của người dùng để dự đoán và gợi ý sách theo sở thích đọc sách của họ. Sau đó dựa vào lượng phản hồi tích cực và tiếp tục đề xuất sách cho người khác.
### 1.1. Hiện trạng đọc sách hiện nay

**Tình Trạng Đọc Sách Toàn Cầu:**
Sự thay đổi đáng kể trong thế giới công nghệ đã tác động mạnh mẽ đến thói quen đọc sách trên toàn cầu. Xu hướng chuyển từ sách giấy sang sách điện tử và ứng dụng đọc sách trực tuyến đã mở ra nhiều cơ hội mới cho người đọc. Ngoài ra, sự phát triển của âm nhạc sách và nền văn hóa đọc sách ngày càng được đẩy mạnh qua các chiến dịch toàn cầu như Ngày Sách Thế Giới và các chiến dịch UNESCO khác.

Cộng đồng quốc tế ngày nay cũng chú trọng đến văn hóa đọc sách, thể hiện qua sự gia tăng của các sự kiện văn hóa, hội sách và các cộng đồng đọc sách trực tuyến. Những chiến dịch khuyến khích đọc sách và tạo ra không khí tích cực để chia sẻ sở thích và kiến thức từ sách.

**Tình Trạng Đọc Sách Tại Việt Nam:**
Ở Việt Nam, tình trạng đọc sách ngày càng được đánh giá cao và chú ý. Cộng đồng đọc sách đang trải qua một giai đoạn phát triển tích cực với sự xuất hiện của nhiều sự kiện văn hóa, hội sách và chiến dịch khuyến khích đọc sách. Thị trường sách trực tuyến đang mở rộng, mang lại sự tiện lợi và lựa chọn đa dạng cho người đọc.

Đặc biệt, các cộng đồng đọc sách trực tuyến ngày càng trở nên quan trọng, tạo ra môi trường giao lưu xã hội và chia sẻ trải nghiệm đọc sách. Các diễn đàn đọc sách và các cộng đồng trực tuyến cung cấp nơi cho người đọc thảo luận, đánh giá và chia sẻ suy nghĩ về những tác phẩm họ đã trải nghiệm. Điều này không chỉ thúc đẩy sự tương tác mà còn góp phần vào việc tạo ra một cộng đồng đọc sách đa dạng và sôi động ở Việt Nam.
![kk](https://hackmd.io/_uploads/S1C0iLrYa.png)


### 1.2. Mục tiêu của sản phẩm
Mục tiêu chính của sản phẩm là tối ưu hóa trải nghiệm cá nhân hóa cho người đọc bằng cách sử dụng thuật toán máy học để đề xuất sách dựa trên sở thích và lịch sử đọc cá nhân. Ngoài ra, sản phẩm cũng hướng đến việc tạo ra một môi trường kết nối và tái sử dụng sách trong cộng đồng.

BookCrossing Recommender không chỉ là một công cụ gợi ý sách thông thường mà còn là một phương tiện kết nối cộng đồng, giúp người đọc chia sẻ và giao lưu thông qua trải nghiệm đọc sách. Qua việc theo dõi hành trình của mỗi cuốn sách, sản phẩm không chỉ thúc đẩy tái sử dụng sách mà còn tạo ra một chuỗi giao lưu văn hóa độc đáo. Điều này giúp xây dựng sự đa dạng và sôi động trong cộng đồng đọc sách trực tuyến.

Bằng cách tối ưu hóa thuật toán và liên kết với cơ sở dữ liệu lớn của BookCrossing, sản phẩm hứa hẹn mang đến cho người đọc những trải nghiệm đọc sách cá nhân hóa và giúp thúc đẩy sự kết nối xã hội qua trải nghiệm đọc sách chung. Đây là một bước tiến quan trọng trong việc tận dụng công nghệ để tạo ra một cộng đồng đọc sách đa dạng và sôi động.
## 2. Dữ liệu:
### 2.1. Dữ liệu thô
The BookCrossing (BX) được thu thập bởi Cai-Nicolas Ziegler trong bản thu thập thông tin kéo dài 4 tuần (tháng 8/tháng 9 năm 2004) từ cộng đồng Book-Crossing với sự cho phép tử tế của Ron Hornbaker, CTO của Humankind Systems. Nó chứa 278.858 người dùng (ẩn danh nhưng có thông tin nhân khẩu học) cung cấp 1.149.780 đánh giá về 271.379 cuốn sách.

Bộ dữ liệu Book-Crossing bao gồm 3 bảng.

**BX-Users**
Chứa người dùng. Lưu ý rằng ID người dùng (`User-ID`) đã được ẩn danh và thay đổi toàn bộ ID thành số nguyên. Dữ liệu nhân khẩu học được cung cấp (`Location`, `Age`) nếu có. Mặt khác, các trường này chứa giá trị NULL.

![413902949_277899985002945_6152770371400794175_n](https://hackmd.io/_uploads/ry1qmHBYp.jpg)


**BX-Books**
Sách được xác định bằng ISBN tương ứng. ISBN không hợp lệ đã bị xóa khỏi tập dữ liệu. Ngoài ra, một số thông tin dựa trên nội dung được cung cấp (`Title`, `Author`, `Year of publication`, `Publisher`), được lấy từ Amazon Web Services. Lưu ý rằng trong trường hợp có nhiều tác giả thì chỉ có tác giả đầu tiên được cung cấp. Các URL liên kết đến ảnh bìa cũng được cung cấp, xuất hiện với ba loại khác nhau (`Image-URL-S`, `Image-URL-M`, `Image-URL-L`), tức là nhỏ, trung bình, lớn.

![k3](https://hackmd.io/_uploads/BJRxVrHKp.png)


**BX-Books Rating**
Chứa thông tin xếp hạng sách. Xếp hạng (`Book-Rating`) là rõ ràng, được biểu thị theo thang điểm từ 1-10 (giá trị cao hơn biểu thị mức độ đánh giá cao hơn) hoặc ngầm định, được biểu thị bằng 0.

![k4](https://hackmd.io/_uploads/SJfZ4rBF6.jpg)



### 2.2. Xử lý dữ liệu



Trước tiên ta sẽ duyệt qua độ tuổi của các người dùng để xem được mức độ đọc sách ở từng lứa tuổi khác nhau

![Screenshot 2024-01-17 213432](https://hackmd.io/_uploads/BJ7DPwSFp.png)

**Độ tuổi từ 0 đến 244 tuổi là một điều vô lý** vì vậy ta sẽ đặt tất cả độ tuổi dưới 5 và trên 100 tuổi thành NaN để cố gắng duy trì tính thực tế.
![Screenshot 2024-01-17 213446](https://hackmd.io/_uploads/BJAYPDBtT.png)


Số liệu đã trở nên thực tế hơn, từ đó ta có bảng phân phối dưới đây:
![age ko min](https://hackmd.io/_uploads/HkKDqPrtp.png)

![age](https://hackmd.io/_uploads/B1GBFPrF6.png)

Dưới đây là cùng một biểu đồ mà độ tuổi được thể hiện riêng lẻ chi tiết hơn.
![Screenshot 2024-01-17 213729](https://hackmd.io/_uploads/Bkw1jvHYp.png)
Ta có thể dễ dàng nhận ra những người viết đánh giá đa số là người ở độ tuổi từ 20 đến 30 tuổi.



Khi kiểm tra lại trong dataset các năm xuất bản có một số năm hiển thị "0", vì thế ta sẽ chuyển tất cả về NaN.
![test](https://hackmd.io/_uploads/rySvdw6ta.jpg)


![Screenshot 2024-01-17 220732](https://hackmd.io/_uploads/Sy8i6wrYT.png)

Đây là bản dữ liệu sau khi lọc về năm xuất bản
![ko](https://hackmd.io/_uploads/B1qDADHYT.png)

![yop](https://hackmd.io/_uploads/rJWuAPHFT.png)


Lưu ý rằng trong biểu đồ trên, chúng ta đã lọc ra số lượng sách nhỏ hơn 5, vì có một số cuốn sách trong tập dữ liệu có năm xuất bản là những năm 1300 và một số cuốn trong tương lai .Biểu đồ trên cho thấy xu hướng chung là những cuốn sách gần đây xuất hiện thường xuyên hơn nhiều.

Chúng ta hãy xem một số cuốn sách 'ngoại lệ' đó. Có lẽ chúng ta thậm chí sẽ giữ chúng dưới dạng một tập dữ liệu riêng biệt để có thể lọc chúng ra nếu cần trong quá trình phân tích sau này. Chúng ta sẽ tạm gác chúng lại và tìm cách xử lý chúng sau khi có thêm thông tin.
![Screenshot 2024-01-17 221541](https://hackmd.io/_uploads/HyCnkurtT.png)
Chúng ta có thể bỏ qua 'historical_books' vì chúng có thể làm sai lệch mô hình và dường như không liên quan nhiều đến cơ sở người dùng rộng hơn.

Một số cuốn sách 'tương lai' thực sự có vẻ có lỗi (ví dụ: Alice in Wonderland, Edgar Allen Poe, v.v.)...  Tuy nhiên, thay vì điều tra thêm về vấn đề này, vì có <20 cuốn sách ở đây nên ta sẽ xóa chúng khỏi bảng 'sách'.
![image](https://hackmd.io/_uploads/SJ6LguBY6.png)



Bảng phân phối số lượng đánh giá của người dùng:
![Screenshot 2024-01-17 222903](https://hackmd.io/_uploads/HyqdfdStp.png)
![Screenshot 2024-01-17 223008](https://hackmd.io/_uploads/BkejzOHK6.png)
Có vẻ như đa số người dùng đều chỉ đánh giá 1 hoặc 2 cuốn sách. Chúng ta có thể thấy rằng những 'siêu người dùng' với hàng nghìn xếp hạng là những ngoại lệ đáng kể.Điều này trở nên rõ ràng nếu chúng ta tạo biểu đồ tương tự với giới hạn dành cho người dùng có tối thiểu 1000 xếp hạng.
![Screenshot 2024-01-17 223334](https://hackmd.io/_uploads/ByAu7urKa.png)
![Screenshot 2024-01-17 223341](https://hackmd.io/_uploads/H1mKmOrKT.png)
Biểu đồ thể hiện số lượng đánh giá của user về các cuốn sách:
![Screenshot 2024-01-17 223708](https://hackmd.io/_uploads/SJv44dSFp.png)

![Screenshot 2024-01-17 223659](https://hackmd.io/_uploads/r1oNN_Bta.png)


Có vẻ như hầu hết các mục đều có xếp hạng bằng 0.

Sau khi thực hiện một số nghiên cứu trên internet về bộ dữ liệu này, có vẻ như thang đánh giá thực sự là từ 1 đến 10 và số 0 biểu thị xếp hạng 'rác' thay vì 'nghiêm túc'. Xếp hạng 'rác' thể hiện sự tương tác (có thể tích cực hoặc tiêu cực) giữa người dùng và sách. Các tương tác 'rác' thường cần được xử lý khác với các tương tác rõ ràng.

Đối với bước lập mô hình, chúng ta sẽ chỉ xem xét xếp hạng rõ ràng và do đó, các hàng mục nhập xếp hạng 0 sẽ bị xóa.
![Screenshot 2024-01-17 223957](https://hackmd.io/_uploads/SkNkSOSYp.png)


![Screenshot 2024-01-17 224058](https://hackmd.io/_uploads/BkqVSdBKT.png)

Bằng cách loại bỏ xếp hạng 'rác', chúng ta đã giảm hơn một nửa kích thước mẫu.

Biểu đồ sau khi thay đổi cách phân bổ xếp hạng:
![Screenshot 2024-01-17 224157](https://hackmd.io/_uploads/HJyuS_Hta.png)
![Screenshot 2024-01-17 224206](https://hackmd.io/_uploads/rkBOrdHYa.png)
Điều này đã được thể hiện rõ ràng hơn. Bây giờ chúng ta có thể thấy rằng 8 là xếp hạng thường xuyên nhất, trong khi người dùng có xu hướng cho xếp hạng > 5, với rất ít xếp hạng thấp được đưa ra.
![Screenshot 2024-01-17 224543](https://hackmd.io/_uploads/BJRSUdrta.png)

Có 49851 cuốn sách không có thông tin tên sách/tác giả.
Điều này đại diện cho 8,70% của tập dữ liệu xếp hạng.
Dường như có khá nhiều ISBN trong bảng xếp hạng không khớp với ISBN trong bảng sách, gần 9% tổng số mục nhập!

Ta thực sự không thể làm gì về điều đó, nhưng ta nên xóa chúng khỏi tập dữ liệu vì **chúng ta sẽ không thể truy cập tên sách để đưa ra đề xuất ngay cả khi mô hình có thể sử dụng chúng.**
![Screenshot 2024-01-17 224827](https://hackmd.io/_uploads/SyBTv_Bta.png)



Chúng ta sẽ chọn xóa các hàng có book_title trống vì đây là phần dữ liệu quan trọng nhất cần thiết để xác định sách.
![Screenshot 2024-01-17 224846](https://hackmd.io/_uploads/SJuRvdHYa.png)



Chúng ta hãy xem lại số lượng sách có số ISBN tương ứng với chúng.

![Screenshot 2024-01-17 230136](https://hackmd.io/_uploads/HyzMcOBFp.png)
Phần lớn sách chỉ có 1 số ISBN, tuy nhiên có khá nhiều sách có nhiều ISBN (nxb, nền tảng khác nhau). Ta muốn tạo một unique_isbn sao cho một cuốn sách sẽ **chỉ có 1 ISBN đặc trưng** khi được đưa vào mô hình đề xuất.
![Screenshot 2024-01-17 230255](https://hackmd.io/_uploads/r1xr5drY6.png)

Ta lập danh sách chứa cuốn sách có nhiều số ISBN.
![test](https://hackmd.io/_uploads/rJAdW92YT.jpg)




Chúng ta hãy xem nhanh mệnh lệnh mà chúng ta vừa tạo cho mục nhập 'Jane Eyre' - nó phải chứa danh sách 14 số ISBN.
![Screenshot 2024-01-17 230628](https://hackmd.io/_uploads/B1UGsdBFT.png)
Vì ta thực sự không biết mỗi số ISBN khác nhau đề cập đến điều gì (theo những gì ta hiểu thì mã thực sự biểu thị nhiều thứ khác nhau bao gồm nhà xuất bản, năm, loại bản in, v.v. nhưng việc giải mã điều này nằm ngoài phạm vi phân tích này), **ta sẽ chỉ chọn số ISBN đầu tiên** xuất hiện trong danh sách các giá trị để **đặt làm unique_isbn cho cuốn sách cụ thể đó**.

```
def add_unique_isbn_col(df):
    df['unique_isbn'] = df.apply(lambda row: multiple_isbn_dict[row.book_title][0] if row.book_title in multiple_isbn_dict.keys() else row.isbn, axis=1)
    return df

books_with_ratings = add_unique_isbn_col(books_with_ratings)
```


![test](https://hackmd.io/_uploads/HynvX93tT.jpg)



Kết hợp lại toàn bộ dữ liệu tạo một bộ dữ liệu chuẩn:
![Screenshot 2024-01-17 231014](https://hackmd.io/_uploads/r1cYndHKp.png)

![Screenshot 2024-01-17 231034](https://hackmd.io/_uploads/ByY63_HK6.png)

Có một số mục nhập về độ tuổi, năm xuất bản, nhà xuất bản và quốc gia bị thiếu, nhưng các biến chính của user_id, unique_isbn và book_rating đều đầy đủ, điều này là tốt.

![test](https://hackmd.io/_uploads/SymQHchYp.jpg)



Về mặt loại dữ liệu, user_id và book_rating là số nguyên, trong khi unique_isbn là chuỗi (ISBN cũng có thể chứa các chữ cái).

## 3. Xây dựng mô hình sản phẩm:
### 3.1. Chuẩn bị ban đầu
Nhập thư viện *surprise* và những model và chỉ số cần thiết.
```
from surprise import Reader, Dataset
from surprise import SVD,NMF, model_selection, accuracy
```
Đặt giới hạn phạm vi đánh giá của biến reader từ 1-10 (rating) và cho dữ liệu được tải từ thư viện *pandas* qua *surprise* cho việc xử lý thuật toán.
```
reader = Reader(rating_scale=(1, 10))
data = Dataset.load_from_df(user_item_rating, reader)
```

### 3.2. Chọn model tốt nhất

Ta so sánh hiệu quả giữa 2 model: NMF và SVD

* Với model NMF (5 folds Cross-Validation):
![test](https://hackmd.io/_uploads/H1PootrY6.jpg)

* Với model SVD (Train-Test split):
![test](https://hackmd.io/_uploads/S1cUiFrFp.jpg)

**Ta chọn thuật toán SVD vì có số RMSE thấp hơn (1.63 < 2.47)**



> **Thông số RMSE (Root Mean Squared Error)**: là một chỉ số đo độ hiệu quả của mô hình. Nó đo sự khác biệt giữa các giá trị dự đoán và giá trị thực tế. **RMSE nhỏ hơn càng tốt**, điều này cho thấy mô hình có mức độ ước lượng cao nhất.

**Tối ưu hóa thuật toán SV bằng parameter tuning**: Sử dụng *GridSearchCV* từ thư viện *Surprise*.
```
model = gs.best_estimator['rmse']

print(gs.best_params['rmse'])
```
Cho ra kết quả những parameters tối ưu.
![test](https://hackmd.io/_uploads/HJTf_chK6.jpg)






### 3.3. Luyện model
Do dataset của bookcrossing khá lớn (hơn 250k+ sách và người dùng đánh giá), ta sử dụng phương pháp *train - test split* và thuật toán SVD đã được tối ưu hóa để luyện model.
```
trainset, testset = model_selection.train_test_split(data, test_size=0.2)

model = SVD(n_factors=80, lr_all=0.005, reg_all=0.04)
model.fit(trainset)
predictions = model.test(testset)
print("SVD : Test Set")
accuracy.rmse(predictions, verbose=True)
```
### 3.4. Kết quả

Từ đây ta có thể recommend cho người dùng khác nhau theo đánh giá của họ, trích từ danh sách *predictions* được tạo ở trên.


Gợi ý môt số lượng cuốn sách cho người dùng, và đồng thời lấy lại tên của những cuốn sách (từ mã ISBN cuốn sách khi xử lý thông tin).
```
from collections import defaultdict

def get_top_n(predictions, n=10):

     # Tạo defaultdict để lưu trữ đề xuất hàng đầu cho mỗi người dùng
    top_n = defaultdict(list)
    
    for uid, iid, true_r, est, _ in predictions:
        top_n[uid].append((iid, est))  # Thêm BookID và BookRating của người dùng trong defaultdict

    for uid, user_ratings in top_n.items():
        user_ratings.sort(key=lambda x: x[1], reverse=True) # Sort danh sách gợi ý từ cao đến thấp
        top_n[uid] = user_ratings[:n]  # Giữ lại Top 10
        
    return top_n

def get_reading_list(userid):

    reading_list = defaultdict(list)
    top_n = get_top_n(predictions, n=10)
    for n in top_n[userid]:
        book, rating = n
        title = books_users_ratings.loc[books_users_ratings.unique_isbn==book].book_title.unique()[0]  # Tìm tựa sách tương ứng với BookID
        reading_list[title] = rating
    return reading_list
```

Đây là kết quả cuối cùng:
Danh sách Top 10 cuốn sách mà người dùng mã 11601 có thể quan tâm:

![test](https://hackmd.io/_uploads/H1uJiiAK6.jpg)
![test](https://hackmd.io/_uploads/rkXDioCta.jpg)





Ví dụ khác:
![test](https://hackmd.io/_uploads/rk2HCBHKT.jpg)

Tuy nhiên, model recommend vẫn còn nhược điểm. Đối với những người dùng có số đánh giá ít (không bao gồm đánh giá rác) thì thuật toán chỉ có thể gợi ý một số lượng sách có hạn phù hợp cho những người dùng đó. Ví dụ như đối với người dùng này:
![test](https://hackmd.io/_uploads/HkifCSHKa.jpg)

## 4. Kết luận:


Hệ thống gợi ý chéo sách đóng một vai trò quan trọng trong việc nâng cao trải nghiệm đọc cho các cá nhân bằng cách đưa ra các đề xuất sách được cá nhân hóa. Các hệ thống này tận dụng dữ liệu người dùng và thuật toán nâng cao để đề xuất sách phù hợp với sở thích của người dùng, từ đó tạo điều kiện thuận lợi cho việc khám phá và thúc đẩy trải nghiệm đọc đa dạng.
Trong hệ thống này, bộ dữ liệu từ trang web 'Book-Crossing' đã được sử dụng để tạo ra một hệ thống đề xuất, là thuật toán SVD - đã mang lại hiệu suất tốt nhất, được đánh giá bằng cách so sánh dự đoán đánh giá sách cho một người dùng cụ thể với đánh giá thực tế trong một tập kiểm tra mà mô hình không được huấn luyện.
Các dữ liệu duy nhất được sử dụng cho mô hình là "User ID", "Book ID" và “Rating". Có các dữ liệu khác có sẵn trong bộ dữ liệu như "tuổi", "địa điểm", "nhà xuất bản", "năm xuất bản", v.v., tuy nhiên, cho những loại hệ thống đề xuất này, thường thấy rằng **các dữ liệu bổ sung không tăng độ chính xác của mô hình đáng kể.**
Cuối cùng, chúng ta đã có thể xây dựng một hệ thống đề xuất có thể dự đoán tối đa 10 cuốn sách có khả năng cao được quan tâm bởi một người dùng cụ thể.

### 4.1. Ưu điểm:

* Cá nhân hóa: Ưu điểm chính của Hệ thống gợi ý chéo sách là khả năng cá nhân hóa các đề xuất. Bằng cách phân tích hành vi, sở thích và đánh giá của người dùng, các hệ thống này có thể đề xuất những cuốn sách mà người dùng cá nhân có thể quan tâm.

* Khám phá: Hệ thống gợi ý giúp người dùng khám phá những cuốn sách mà họ có thể chưa tìm thấy thông qua các phương tiện truyền thống. Điều này thúc đẩy phạm vi đọc rộng hơn và giới thiệu cho người dùng các thể loại, tác giả và chủ đề mới.

* Hiệu quả: Hệ thống gợi ý giúp người dùng tiết kiệm thời gian bằng cách thu hẹp số lượng lớn sách có sẵn xuống những sách có nhiều khả năng phù hợp với sở thích của họ hơn. Hiệu quả này đặc biệt có giá trị trong môi trường giàu thông tin ngày nay.

### 4.2. Nhược điểm:

* Quá phụ thuộc vào hành vi trong quá khứ: Hệ thống gợi ý có thể dựa nhiều vào hành vi trong quá khứ của người dùng và có thể gặp khó khăn trong việc giới thiệu những cuốn sách nằm ngoài sở thích thông thường của người dùng. Điều này có thể dẫn đến "bong bóng bộ lọc" trong đó người dùng được tiếp xúc với một phạm vi nội dung hạn chế.

* Vấn đề cold start: Đối với người dùng mới hoặc những người có lịch sử tương tác hạn chế, hệ thống đề xuất có thể gặp khó khăn trong việc đưa ra các đề xuất chính xác và phù hợp, hoặc đưa ra ít đề xuất do thiếu dữ liệu đầy đủ.

* Hiểu biết hạn chế về hoàn cảnh của người dùng: Hệ thống đề xuất có thể không hiểu đầy đủ hoàn cảnh của người dùng, dẫn đến đôi khi đưa ra đề xuất không chính xác. Các yếu tố như tâm trạng hiện tại, sở thích thời gian thực hoặc sở thích tạm thời có thể không được xem xét đầy đủ.
