Chương 1. Phần mở đầu Chương này sẽ đưa ra lý do em chọn đề tài là tìm hiểu và xây dựng hệ thống gợi ý người dùng ứng dụng trong đề xuất phim các mục tiêu đề ra trong đề tài và bố cục các chương của đề tài. Chương 2. Cơ sở lý thuyết và các công cụ được sử dụng trong đề tài Chương này trình bày tổng quan về các hệ thống gợi ý hiện nay, cũng như một số phương pháp gợi ý được sử dụng nhiều trong các bài toán gợi ý, so sánh các phương pháp và từ đó lựa chọn một phương pháp phù hợp nhất để ứng dụng trong đề xuất phim. Đây sẽ là cơ sở lý thuyết cho các chương tiếp theo. Chương 3. Xây dựng cơ sở dữ liệu về phim và TV series Chương này sẽ trình bày về cách thức tạo ra bộ dữ liệu, cũng như các bước phân tích dữ liệu đầu vào trước khi đưa vào huấn luyện trong hệ thống gợi ý phim. Trong đề tài này, em sẽ sử dụng bộ dữ liệu được lấy từ trang web TMDB. Chương 4. Tìm kiếm thuật toán và xây dựng hệ thống Từ tập dữ liệu thu thập được ở chương 3, chương này sẽ trình bày cách xây dựng mô hình hệ thống gợi ý người dùng các bộ phim cùng với TV series. Ở đây ta sử dụng hai phương thức chính là Demographic Filtering và Cosin Similarity. Chương 5. Xây dựng trang web đề xuất phimxii Từ tập dữ liệu và các thuật toán đã thu thập được ở chương 3 và 4, chương này sẽ trình bày cách xây dựng trang web đề xuất phim. Ở đây ta sẽ dùng MongoDB và React Native Chương 6. Kết quả thực nghiệm Trình bày các kết quả sau khi huấn luyện cũng như đánh giá dộ chính xác của thuật toán, đưa ra nhận xét đánh giá từ các biểu đồ thu được và rút ra các kết luận cụ thể
Mục đích nghiên cứu
Mục đích của đề tài là nghiên cứu lý thuyết về Recommendation System và các uật toán liên quan, sau đó áp dụng lý thuyết vừa được tìm hiểu vào quá trình đưa ra gợi ý về các bộ phim, so sánh chọn ra các thuật toán phù hợp Mục đích chính của đề tài là thiết kế một trang web xem phim trực tuyến tích hợp các thuật toán recommendation system nhằm đưa ra cho người dùng những bộ phim phù hợp với họ dựa trên phim vừa xem Đồng thời trang web cũng phải đưa ra được danh sách các bộ phim thịnh hành cũng như phim có số điểm đánh giá cao và trong mỗi bộ phim cần cung cấp đầy đủ thôg tin về các diễn viên, thể loại, nội dung tòm tắt phim, xvi
Nhiệm vụ nghiên cứu
• Tìm hiểu về Recommendation System và những lý thuyết liên quan để ứng dụng vào hệ thống gợi ý phim
• Tìm kiếm bộ dữ liệu phù hơp có đầy đủ các phim được ra mắt cho đến thời điểm hiện tại scrapt
• Phân loại các thành phần và làm sạch dữ liệu vừa scrapt từ web
• Lựa chọn các thuật toán gợi ý phù hợp
• Vận dụng những kiến thức để xây dựng, phát triển một web cung cấp thông tin phim có tích hợp gợi ý
• Đánh giá trang web vừa xây dựng được cũng như kết quả gợi ý mà thuật toán đưa ra.
Phương pháp nghiên cứu
Sử dụng chủ yếu hai Demographic Filtering và Content Base Filtering với cơ sở là cosin similarity để xây dựng thuật toán đề xuất
Sử dụng MongoDB, và React Native để xây dựng trang web đề xuất phim.
Kết quả đã đạt được
• Đã tìm hiểu được về Recommendation System và những lý thuyết liên quan để ứng dụng vào hệ thống gợi ý phim
• Scrapt dữ liệu từ trang web TMDB, xử lý và chia làm các bộ dữ liệu riêng biệt
• Đánh giá tham số RMSE và MAE của các thuật toán từ đó tìm được thuật toán phù hợp với đề xuất phim
• Xây dựng được trang web đề xuất phim cho người dùng kèm theo các thông tin liên quan.
TỔNG QUAN VỀ CƠ SỞ DỮ LIỆU VỀ PHIM ĐƯỢC SỬ DỤNG
Bộ dữ liệu dùng để đánh giá giải thuật lọc cộng tác
Ở đây ta sử dụng hai bộ dữ liệu về phim là MovieLens 100k và EachMovie là hai bộ dữ liệu chuẩn dùng để đánh giá hiệu quả của các thuật toán lọc cộng tác
Hình 3.1 mô tả trang web movielens.org dùng để lấy tập dữ liệu chuẩn chứa chứa các đánh giá (rating) của 943 người dùng cho 1682 bộ phim, mỗi người dùng đánh giá ít nhất 20 bộ phim Các bộ dữ liệu trong tập này bao gồm thông tin đánh giá xếp hạng của người dùng tới các bộ phim Những thông tin về người dùng hay các bộ phim cũng được cung cấp
Hình 3-1 Giao diện trang web movielens.org
Hình 3.2 mô tả trang web dùng để download bộ dữ liệu EachMovie bao gồm 72916 người dùng được đánh giá tổng số 2811983 cho 1628 bộ phim khác nhau
Hình 3-2 Giao diện trang web download bộ dữ liệu EachMovie
Thu Thập cơ sở dữ liệu dùng cho hệ thống gợi ý
3.2.1 Thu thập dữ liệu từ TMDB a Giới thiệu VỀ TMDB
Cơ sở dữ liệu phim (TMDB) là cơ sở dữ liệu phổ biến do cộng đồng xây dựng dành cho phim và chương trình truyền hình Tất cả nội dung đã được người dùng thêm và cập nhật từ năm 2008 TMDB tập trung mạnh vào việc thu thập dữ liệu từ khắp nơi trên thế giới và bao gồm nhiều loại dữ liệu, hầu hết chỉ có thể tìm thấy trên TMDB Ta có thể thấy giao diện web TMDB qua Hình 3.3
Hình 3-3 Giao diện web TMDB b Lý do sử dụng TMDB làm cơ sở dữ liệu
Sau đây là những lý do khuyến khích hoặc thuyết phục chúng tôi sử dụng TMDB:
• Mỗi năm kể từ năm 2008, số lượng đóng góp cho TMDB đã tăng lên Điều này khiến cho hơn 400.000 nhà phát triển và công ty hiện đang sử dụng TMDB, khiến nó trở thành nguồn dữ liệu hàng đầu
• TMDB không chỉ cung cấp cho người dùng siêu dữ liệu mở rộng cho phim, chương trình truyền hình và con người mà còn cung cấp một trong những lựa chọn tốt nhất về áp phích có độ phân giải cao và tác phẩm nghệ thuật của người hâm mộ Gần 1.000 hình ảnh mới được thêm vào bộ sưu tập hàng ngày
• TMDB là cơ sở dữ liệu quốc tế Mặc dù nó chính thức hỗ trợ 39 ngôn ngữ, nhưng nó có nhiều dữ liệu khu vực Mỗi ngày, nền tảng được sử dụng ở hơn 180 quốc gia
• Cộng đồng TMDB luôn là một trong những cộng đồng hàng đầu trong lĩnh vực đánh giá phim ảnh Nhân viên và người điều hành cộng đồng của TMDB luôn sẵn sàng trợ giúp cho người dùng Nhóm rất tâm huyết với việc đảm bảo rằng người dùng có được trải nghiệm tốt nhất trên TMDB
• TMDB là một nền tảng đáng tin cậy Nó xử lý hơn 3 tỷ yêu cầu mỗi ngày Từ đó đã chứng minh trong nhiều năm rằng đây là một dịch vụ có độ tin cậy cao c Tổng quan về endpoint của TMDB
Hình 3.4 dưới đây minh họa hầu hết tất cả các API endpoint của nền tảng TMDB
3.2.2 Kỹ thuật scrap data từ TMDB
Web scraping, web harvesting hay còn gọi là web data extraction là quá trình “cào” dữ liệu được sử dụng để trích xuất dữ liệu từ các website Hình 3.5 đã mô tả lạiquas trình tạo cơ sở dữ liệu bằng kĩ thuật scrap
Hình 3-5 Mô tả quá trình tạo cơ sở dữ liệu bằng kĩ thuật scrap a Thư viện Selenium
Selenium được định nghĩa đơn giản là một công cụ kiểm thử phần mềm hay duyệt web tự động
Bước 1: Cài thư viện bằng lệnh pip install selenium
Bước 2: Tải chromedriver về máy tính và giải nén
#Access Themoviedb browser = webdriver.Chrome(executable_path=”chromedriver.exe”) browser.maximize_window() browser.get(“https://www.themoviedb.org/tv/100088-the-last-of- us?language=vi”) sleep(random.randint(5,10)) b Thu thập dữ liệu
37 Để thu thập được dữ liệu từ trang web, ta cần có className của đối tượng cần thu thập Chẳng hạn như muốn thu thập tên các địa diểm, ta cần classname của thẻ div chứa tên địa điểm ấy, như Hình 3.6, 3.7 và 3.8
Hình 3-6 Mô tả quá trình thu thập tên phim
Hình 3-7 Mô tả quá trình thu thập đánh giá và số lượt đánh giá
Hình 3-8 Mô tả quá trình thu thập thể loại phim Đối với dữ liệu ảnh đại diện cho các bộ phim, em sẽ sử dung API của google image để có thể tải ảnh các địa điểm def get_image(name): name = name.split(",")[0] response = google_images_download.googleimagesdownload() args_list = ["keywords", "keywords_from_file"] args = {} for i in args_list: args[i] = None args["keywords"] = name args['limit'] = 1 params = response.build_url_parameters(args) url = 'https://www.google.com/search?q=' + quote( name) +
'&espv=2&biw66&bihf7&site=webhp&source=lnms&tbm=isch' + params +
'&sa=X&ei=XosDVaCXD8TasATItgE&vedAcQ_AUoAg' try: response.download(args) for filename in glob.glob("D:\Download\IMG_ĐATN/{name}/*jpg".format(name=name)) + glob.glob("downloads/{name}/*png".format(name=name)): return filename
39 except: for… filenamein glob.glob("D:\Download\IMG_ĐATN/*jpg"): return filename
Hình 3.9 dưới đây là sơ đồ khối mô tả tóm tắt quá trình scraping data từ trang web
Hình 3-9 Sơ đồ khối quá trình scraping data từ web c Xử lý dữ liệu Để xử lý dữ liệu một cách dễ dàng, em sử dụng thư viện BeautifulSoup giúp hỗ trợ phân tích cú pháp HTML
Def get_info(): html_txt = broswer.page_source soup = BeautifulSoup(html_txt, ‘html_parser’ places = soup.find_all(‘div’, class_=”bUshh o csemS”) ratings = soup.find_all(‘div’, class_=”RTVWf o W f u w dYMOQ”) for rating in ratings: count = rating.find(‘span’).getText() star = rating.find(‘svg’) vote = star[‘arial-label’] rating_list.append(count) starting_list.append(handle_star(vote)) Đến đây ta đã thu được dữ liệu thô dạng:
Tiến hành xử lý dữ liệu thô bằng hai hàm xử lý sau:
Hàm xử lý tên địa điểm: def handle_string(arr): a = arr.find(“.”, 0,len(arr)) b = arr[a +1 : len(arr)] c = b.strip() return c
### output >>> The last of us
Hàm xử lý đánh giá: def handle_star(arr): a = arr.find(“t”, 0,len(arr)) b = arr[0 : a -1] c = b.strip() return c
Ta áp dụng scrap data tương tự như trên đối với các thông số cast, crew, gerne, budget, Sau khi export kết quả sang file excel ta thu được kết quả như Hình 3.10:
Hình 3-10 Kết quả được ghi vào file Excel
3.2.3 Phân loại dữ liệu và các thuộc tính
Ta chia tập dữ liệu thu được vào 2 file csv như sau:
• Tập dữ liệu đầu tiên chứa các thuộc tính: o movie_id - A unique identifier for each movie
41 o cast - The name of lead and supporting actors o crew - The name of Director, Editor, Composer, Writer etc
• Bộ dữ liệu thứ hai tmdb_5000_credits có các thuộc tính sau: o budget - The budget in which the movie was made o genre - The genre of the movie, Action, Comedy ,Thriller etc o homepage - A link to the homepage of the movie o id - This is infact the movie_id as in the first dataset o keywords - The keywords or tags related to the movie o original_language - The language in which the movie was made o original_title - The title of the movie before translation or adaptation o overview - A brief description of the movie o popularity - A numeric quantity specifying the movie popularity o production_companies - The production house of the movie o production_countries - The country in which it was produced o release_date - The date on which it was released o revenue - The worldwide revenue generated by the movie o runtime - The running time of the movie in minutes o status - "Released" or "Rumored" o tagline - Movie's tagline o title - Title of the movie o vote_average - average ratings the movie recieved o vote_count - the count of votes recieved.
Kết luận chương
Như vậy, trong chương này em đã trình bày chi tiết cách lấy dữ liệu từ trang web TMDB và cách xử lý dữ liệu đầu vào Tập dữ liệu này sẽ dược sử dụng trong những chương sau
TÌM KIẾM THUẬT TOÁN PHÙ HỢP VÀ ÁP DỤNG CHO FILM
Đánh giá và lựa chọn giải thuật phù hợp
4.1.1 Quá trình train các bộ dữ liệu
Trong quá trình training mỗi tập dữ liệu chúng ta chia ra làm 2 phần, phần thứ nhất chọn ngẫu nhiên 80% tập dữ liệu làm dữ liệu đầu vào và phần còn lại là 20% ta sẽ dùng để test Để chứng minh độ tin cậy của thuật toán cho ra kết quả tốt nhất, ta tiến hành thí nghiệm trên bộ dữ liệu MovieLens bằng cách thay đổi tỷ lệ tập dữ liệu huấn luyện là 70% và 30% còn lại dùng để test Ta ký hiệu các thuật toán như sau để hiển thị trên kết quả thí nghiệm:
• Spearman rank Correlation coefficient(Spearman)
4.1.2 Đánh giá kết quả và lựa chọn giải thuật phù hợp
Trong thí nghiệm ta chọn người sử dụng gần nhất với N 0 Ở đấy chúng ta sử dụng 2 thông số MAE và RMSE để đánh giá hiệu quả của các giải thuật Thuật toán nào có 2 thông số trên càng thấp thì hiệu quả càng cao Ở Hình 4.1 và 4.2 ta thấy được thông số MAE và RMSE ứng với tỷ lệ trainning đối với bộ dữ liệu MovieLens còn ở Hình 4.3 và 4.4 là đối với bộ dữ liệu EachMovie
Hình 4-1 Thông số MAE đối với bộ dữ liệu Movielens
Hình 4-2 Thông số RMSE đối với bộ dữ liệu Movielens
Hình 4-3 Thông số MAE đối với bộ dữ liệu EachMovie
Hình 4-4 Thông số RMSE đối với bộ dữ liệu EachMovie
Từ 4 hình trên ta có thể tính ra thông số RMSE và MAE trung bình sau đó tổng hợp lại dưới dạng Bảng 4.1 sau
Bảng 4-1 Bảng tổng hợp giá trị MAE và RMSE trung bình
Có thể thấy rằng với cả 2 bộ dữ liệu giải thuật Cosine similarity luôn có thông số lỗi trung bình RMSE thấp nhất (1.0069 và 1.0024), thông số MAE nằm trong số 2 giải thuật thấp nhất Có thể thấy giải thuật Cosine Similarity là giải thuật phù hợp nhất đối với tập dữ liệu là phim ảnh, đồng thời giải thuật này cũng rất nhanh chóng trong việc xử lý dữ liệu Từ các kết quả nêu trên ta sẽ sử dụng giải thuật Cosin similarity (CS) vào hệ thống gợi ý phim
Architecture và Similarity Score
4.2.2 Similarity Score Đó là một giá trị số nằm trong khoảng từ 0 đến 1, giúp xác định mức độ hai mục giống nhau trên thang điểm từ 0 đến 1 Điểm tương đồng này thu được đo lường mức độ giống nhau giữa các chi tiết văn bản của cả hai mục Vì vậy, điểm tương đồng là thước đo mức độ giống nhau giữa các chi tiết văn bản nhất định của hai mục Điều này có thể được thực hiện bằng tính tương tự cosine
4.2.3 Cosine Similarity Độ tương tự cosin là một cách đo độ tương tự (measure of similarity) giữa hai vectơ khác không của một không gian tích vô hướng Độ tương tự này được định nghĩa bằng giá trị cosine của góc giữa hai vectơ, và cũng là tích vô hướng của cùng các vectơ đơn vị để cả hai đều có chiều dài 1 Giá trị cosine của 0° là 1, và bé hơn 1 với bất kỳ góc nào trong khoảng các radian (0, π] Độ tương tự cosin là một thẩm định có tính định hướng chứ không phải về độ lớn (to nhỏ): hai vectơ cùng hướng có độ tương tự cosin là 1, hai vectơ vuông góc nhau (hay có hướng 90°) có độ tương tự là 0, và hai vectơ đối nhau theo đường kính có độ tương tự (hay 180°) là -1 Độ tương tự cosin đặc biệt được sử dụng trong không gian dương với kết quả được giới hạn chặt chẽ trong biên độ [0,1] Cái tên "độ tương tự cosin" bắt
47 nguồn từ thuật ngữ "cosin có hướng": trong trường hợp này, các vectơ đơn vị có độ
"tương tự" tối đa nếu chúng song song và "khác nhau" cực đại nếu chúng là trực giao (vuông góc) Điều này tương tự với cosin, có giá trị lớn nhất khi các phân đoạn tạo thành một góc bằng 0, và giá trị bằng 0 (không liên quan) khi các đoạn thẳng vuông góc.
Thuật toán được sử dụng trong hệ thống
Để xây dựng hệ thống đề xuất phim ta chúng ta cần 3 loại thuật toán gợi ý:
• Demographic Filtering: Thuật toán đưa ra các đề xuất tổng quát cho mọi người dùng, dựa trên mức độ phổ biến và/hoặc thể loại phim Hệ thống đề xuất các bộ phim giống nhau cho người dùng có các đặc điểm nhân khẩu học tương tự Ý tưởng cơ bản đằng sau hệ thống này là những bộ phim nổi tiếng hơn và được giới phê bình đánh giá cao hơn sẽ có xác suất được khán giả trung bình yêu thích cao hơn
• Cosin Similarity: Họ đề xuất các mục tương tự dựa trên một mục cụ thể Hệ thống này sử dụng metadata, chẳng hạn như thể loại, đạo diễn, mô tả, diễn viên, v.v cho phim để đưa ra các đề xuất này Ý tưởng chung đằng sau các hệ thống giới thiệu này là nếu một người thích một mặt hàng cụ thể, người đó cũng sẽ thích một mặt hàng tương tự như vậy.
Áp dụng các thuật toán vào film recomendation system
Ta xây dựng mô hình dự đoán như Hình 4.6
Hình 4-6 Mô hình dự đoán phim
4.4.1 Load dữ liệu từ dataset import pandas as pd import numpy as np df1=pd.read_csv(' /input/tmdb-movie-metadata/tmdb_5000_credits.csv')
48 df2=pd.read_csv(' /input/tmdb-movie-metadata/tmdb_5000_movies.csv')
Trước khi bắt đầu với điều này:
• Ta cần một số liệu để chấm điểm hoặc xếp hạng phim
• Tính điểm cho mỗi bộ phim
• Sắp xếp điểm số và đề xuất bộ phim được đánh giá tốt nhất cho người dùng
Chúng ta có thể sử dụng xếp hạng trung bình của bộ phim làm điểm số nhưng sử dụng điều này sẽ không đủ công bằng vì một bộ phim có xếp hạng trung bình 8,9 và chỉ có 3 phiếu bầu không thể được coi là hay hơn bộ phim có xếp hạng trung bình là 7,8 nhưng có 40 phiếu bầu Vì vậy, tôi sẽ sử dụng xếp hạng trọng số của IMDB (wr) được cho là:
• v là số lượt bình chọn cho phim
• m là số phiếu tối thiểu cần thiết để được liệt kê trong biểu đồ
• R là xếp hạng trung bình của bộ phim
• C là bình chọn trung bình trên toàn bộ báo cáo
Theo Hình 4.7 cho ta thấy sơ đồ khối tổng quan của của thuật toán Demographic filtering
Hình 4-7 Sơ dồ khối quá trình Demographic Filtering
Chúng ta đã có v (vote_count) và R (vote_average) và C có thể được tính như sau:
Vì vậy, xếp hạng trung bình cho tất cả các phim là xấp xỉ 6 trên thang điểm 10 Bước tiếp theo là xác định giá trị thích hợp cho m, số phiếu bầu tối thiểu cần thiết để được liệt kê trong biểu đồ Chúng tôi sẽ sử dụng phân vị thứ 90 làm điểm cắt Nói cách khác, để một bộ phim có mặt trong bảng xếp hạng, nó phải có nhiều phiếu bầu hơn ít nhất 90% số phim trong danh sách m= df2['vote_count'].quantile(0.9) m >> 1838.4000000000015
Bây giờ, chúng tôi có thể lọc ra những bộ phim đủ điều kiện cho bảng xếp hạng q_movies = df2.copy().loc[df2['vote_count'] >= m] q_movies.shape >> (481, 23)
Chúng ta thấy rằng có 481 phim đủ điều kiện để lọt vào danh sách Bây giờ, chúng tôi cần tính toán số liệu của mình cho từng phim đủ điều kiện Để làm điều này, ta sẽ xác định một hàm, weighted_rating() và xác định một điểm tính năng mới, trong đó sẽ tính toán giá trị bằng cách áp dụng hàm này cho DataFrame của các phim đủ điều kiện: def weighted_rating(x, m=m, C=C): v = x['vote_count']
# Calculation based on the IMDB formula return (v/(v+m) * R) + (m/(m+v) * C)
# Define a new feature 'score' and calculate its value with `weighted_rat ing()` q_movies['score'] = q_movies.apply(weighted_rating, axis=1)
Cuối cùng, hãy sắp xếp DataFrame dựa trên tính năng điểm số và xuất tiêu đề, số lượt bình chọn, bình chọn bình chọn và xếp hạng hoặc điểm số có trọng số của 10 bộ phim hàng đầu (Hình 4.8)
#Sort movies based on score calculated above q_movies = q_movies.sort_values('score', ascendingse)
#Print the top 10 movies q_movies[['title', 'vote_count', 'vote_average', 'score']].head(10)
Hình 4-8 Top 10 phim có số điểm cao nhất
Chúng ta đã đưa ra đề xuất đầu tiên Trong tab xu hướng hiện hành của các hệ thống này, chúng tôi tìm thấy những bộ phim rất phổ biến và chỉ có thể lấy được chúng bằng cách sắp xếp tập dữ liệu theo cột phổ biến như Hình 4.9 pop= df2.sort_values('popularity', ascendingse) import matplotlib.pyplot as plt plt.figure(figsize=(12,4))
51 plt.barh(pop['title'].head(6),pop['popularity'].head(6), align='center', color='skyblue') plt.gca().invert_yaxis() plt.xlabel("Popularity") plt.title("Popular Movies")
Hình 4-9 Thống kê độ phổ biến của các bộ phim đạt cao nhất
Bây giờ, một điều cần lưu ý là những người giới thiệu nhân khẩu học này cung cấp một biểu đồ chung về các bộ phim được đề xuất cho tất cả người dùng.Nó không phù hợp với sở thích và thị hiếu của một người dùng cụ thể Do đó ta phải sử dụng phương pháp tìm điểm tương đồng giựa theo giải thuật cosine
Trong hệ thống gợi ý này, nội dung của phim (tổng quan, dàn diễn viên, đoàn làm phim, từ khóa, dòng giới thiệu, v.v.) được sử dụng để tìm điểm tương đồng của nó với các phim khác Sau đó, những bộ phim có nhiều khả năng giống nhau nhất được đề xuất a Plot description based Recommender
Chúng ta sẽ tính điểm tương đồng theo cặp cho tất cả các phim dựa trên mô tả cốt truyện của chúng và đề xuất phim dựa trên điểm tương đồng đó.(Hình 4.10)
Hình 4-10 Sơ đồ khối quá trình tổng hợp tất cả overview của phim
Mô tả cốt truyện được đưa ra trong tính năng tổng quan của bộ dữ liệu Chúng ta hãy xem dữ liệu df2['overview'].head(5)
0 In the 22nd century, a paraplegic Marine is di
1 Captain Barbossa, long believed to be dead, ha
2 A cryptic message from Bond’s past sends him o
3 Following the death of District Attorney Harve
4 John Carter is a war-weary, former military ca
Bây giờ, chúng ta sẽ tính toán các vectơ Tần suất Nghịch đảo Thuật ngữ (TF-IDF) cho mỗi tổng quan Tần suất thuật ngữ tương đối của một từ trong tài liệu và được đưa ra dưới dạng (số trường hợp thuật ngữ/tổng số trường hợp) Nghịch đảo Tần suất là số lượng tương đối của các tài liệu có chứa thuật ngữ được đưa ra dưới dạng nhật ký (số lượng tài liệu/tài liệu có thuật ngữ) Tầm quan trọng tổng thể của mỗi từ đối với các tài liệu mà chúng xuất hiện bằng TF * IDF Điều này sẽ cung cấp cho bạn một ma trận trong đó mỗi cột đại diện cho một từ trong từ vựng tổng quan (tất cả các từ xuất hiện trong ít nhất một tài liệu) và mỗi hàng đại diện cho một bộ phim, như trước đây Điều này được thực hiện để giảm tầm quan trọng của các từ xuất hiện thường xuyên trong tổng quan về cốt truyện và do đó, tầm quan trọng của chúng trong việc tính toán điểm tương đồng cuối cùng
Scikit-learning cung cấp một lớp TfIdfVectorizer tích hợp sẵn để tạo ra ma trận TF- IDF trong một vài dòng
#Import TfIdfVectorizer from scikit-learn from sklearn.feature_extraction.text import TfidfVectorizer
#Define a TF-IDF Vectorizer Object Remove all english stop words such as 'the', 'a'
53 tfidf = TfidfVectorizer(stop_words='english')
#Replace NaN with an empty string df2['overview'] = df2['overview'].fillnắ')
#Construct the required TF-IDF matrix by fitting and transforming the dat a tfidf_matrix = tfidf.fit_transform(df2['overview'])
#Output the shape of tfidf_matrix tfidf_matrix.shape
Ta thấy rằng hơn 20.000 từ khác nhau đã được sử dụng để mô tả 4800 bộ phim trong bộ dữ liệu Với ma trận này trong tay, giờ đây chúng ta có thể tính toán điểm tương đồng
Chúng ta sẽ sử dụng độ tương tự cosin để tính toán một đại lượng biểu thị độ giống nhau giữa hai bộ phim Về mặt toán học, nó được định nghĩa như sau: similarity = cos (𝜃) = 𝑨⋅𝑩
Vì chúng ta đã sử dụng trình tạo véc tơ TF-IDF, nên việc tính toán tích vô hướng sẽ trực tiếp cung cấp cho chúng ta điểm tương tự cosine Do đó, chúng tôi sẽ sử dụng linear_kernel() của sklearn thay vì cosine_similarities() vì nó nhanh hơn
# Import linear_kernel from sklearn.metrics.pairwise import linear_kernel
# Compute the cosine similarity matrix cosine_sim = linear_kernel(tfidf_matrix, tfidf_matrix)
#Construct a reverse map of indices and movie titles indices = pd.Series(df2.index, index['title']).drop_duplicates()
Chúng ta sẽ định nghĩa một hàm lấy tiêu đề phim làm đầu vào và xuất ra danh sách
10 phim giống nhau nhất Đầu tiên, đối với điều này, chúng ta cần ánh xạ ngược các tiêu đề phim và chỉ số DataFrame Nói cách khác, chúng tôi cần một cơ chế để xác định chỉ mục của một bộ phim trong DataFrame siêu dữ liệu của chúng tôi, dựa trên tiêu đề của nó Bây giờ chúng tôi đang ở một vị trí tốt để xác định chức năng đề xuất của mình Ta sẽ làm theo trình tự các bước sau: (Được mô tả đơn giản tại Hình 4.11)
Hình 4-11 Sơ đồ khối quá trình đưa ra phim tương đồng
• Nhận chỉ mục của bộ phim với tiêu đề của nó
• Nhận danh sách các điểm tương tự cosine cho bộ phim cụ thể đó với tất cả các bộ phim Chuyển đổi nó thành một danh sách các bộ trong đó phần tử đầu tiên là vị trí của nó và phần tử thứ hai là điểm tương đồng
• Sắp xếp danh sách các bộ dữ liệu đã nói ở trên dựa trên điểm số tương tự; đó là, yếu tố thứ hai
• Lấy 10 yếu tố hàng đầu của danh sách này Bỏ qua yếu tố đầu tiên vì nó đề cập đến bản thân (bộ phim giống nhất với một bộ phim cụ thể là chính bộ phim đó)
• Trả về các tiêu đề tương ứng với các chỉ số của các yếu tố hàng đầu
# Function that takes in movie title as input and outputs most similar movies def get_recommendations(title, cosine_sim=cosine_sim):
# Get the index of the movie that matches the title idx = indices[title]
# Get the pairwsie similarity scores of all movies with that movie sim_scores = list(enumerate(cosine_sim[idx]))
# Sort the movies based on the similarity scores sim_scores = sorted(sim_scores, key=lambda x: x[1], reverse=True)
# Get the scores of the 10 most similar movies sim_scores = sim_scores[1:11]
# Get the movie indices movie_indices = [i[0] for i in sim_scores]
# Return the top 10 most similar movies return df2['title'].iloc[movie_indices] b Credits, Genres and Keywords Based Recommender
XÂY DỰNG ỨNG DỤNG ĐỀ XUẤT PHIM
Use case và Diagram
Hình 5-2 Sơ đồ UML diagram của website
Xây dựng web xem phim trực tuyến Moonflix
5.2.1 Chức năng tạo tài khoản và đăng nhập
Hình 5-3 Usecase mức 1 đăng kí, đăng nhập
Hình 5.3 mô tả usecase mức 1 thể hiện chức năng tạo tài khoản và đăng nhập của người dùng Ta có bảng 5.1 đặc tả chức năng đăng nhập và Hình 5.4 mô tả hoạt động đăng nhập của người dùng
Bảng 5-1 Đặc tả chức năng đăng nhập
Tác nhân Người dùng Điều kiện trước Chưa ở trạng thái đăng nhập ứng dụng Điều kiện sau
Mô tả Người dùng đăng nhập vào ứng dụng, để sử dụng ứng dụng Kịch bản Hành động của tác nhân Hành động của hệ thống
Nhập tên tài khoản và mật khẩu Lấy thông tin và kiểm tra
Nếu thành công thì đăng nhập vào ứng dụng Nếu thất bại thì trả về lỗi
Hình 5-4 Biểu đồ hoạt động đăng nhập người dùng
Từ đó ta có giao diện cho chức năng đăng nhập như hình 5.5
Hình 5-5 Giao diện chức năng đăng nhập
5.2.2 Chức năng cập nhật thông tin
Hình 5-6 Usecase đặc tả chức năng cập nhật thông tin người dùng
Hình 5.6 mô tả usecase mức 1 thể hiện chức năng cập nhật thông tin người dùng Ta có bảng 5.2 đặc tả chức năng cập nhật mật khẩu
Bảng 5-2 Đặc tả chức năng cập nhật mật khẩu
Chức năng Quản lý thông tin người dùng
Tác nhân Người quản trị Điều kiện trước Đăng nhập thành công ứng dụng Điều kiện sau Cập nhật vào cơ sở dữ liệu người dùng
Mô tả Chỉnh sửa password người sử dụng
Kịch bản Hành động của tác nhân Hành động của hệ thống Nhập tên mật khẩu mới Kiểm tra tính hợp lệ
Nếu thành công thì thông báo kết quả cập nhật
Hình 5-7 Sơ đồ hoạt động chức năng cập nhật mật khẩu
Từ đó ta có giao diện cho thao tác cập nhật mật khẩu như hình 5.8
Hình 5-8 Giao diện chức năng cập nhật mật khẩu
5.2.3 Chức năng hiển thị phim và TV series thịnh hành và top rate
Bảng 5.3 mô tả hoạt động đề xuất phim dựa theo độ thịnh hành và phim nằm trong Top rate Sau khi scrap data từ TMDB hệ thống sẽ tính toán và sắp phim theo số điểm từ cao tới thấp Từ đó ta có giao diện hoạt động trên như Hình 5.9 và 5.10
Bảng 5-3 Bảng đặc tả chức năng hiển thị phim thịnh hành và top rate
Chức năng Hiển thị phim và TV series thịnh hành và top rate
Tác nhân Người quản trị Điều kiện trước Đăng nhập thành công ứng dụng Điều kiện sau
Mô tả Đưa các phim và TV series thịnh hành và top rate dưới dạng thanh Kịch bản Hành động của tác nhân Hành động của hệ thống
Cập nhật danh sách phim Xử lý tính theo thang diểm
Câp nhật lại thanh hiển thị
Hình 5-9 Giao diện đề xuất phim và TV series thịnh hành
Hình 5-10 Giao diện đề xuất phim và TV series top rate
5.2.4 Chức năng xem thông tin phim
Bảng 5.4 mô tả chức năng xem thông tin phim của trang web Sau khi click vào một bộ phim ta có thể thấy được số điểm trung bình, thể loại, tóm tắt nội dung, trailer poster cũng như dàn cast của phim Qua đó ta có Hình 5.11 là giao diện thông tin phim
Bảng 5-4 Bảng đặc tả chức năng xem thông tin phim
Chức năng Hiển thị thông tin phim
Tác nhân Người dùng Điều kiện trước Đăng nhập thành công ứng dụng
Mô tả Đưa ra thông tin phim: Nội dung, thể loại, dàn cast, poster,
Kịch bản Hành động của tác nhân Hành động của hệ thống
Nhấn vào hình đại diện của một bộ phim Đưa ra giao diện cung cấp thông tin cần thiết
Hình 5-11 Giao diện cung cấp thông tin phim
5.2.5 Chức năng viết bình luận, đánh giá
Bảng 5.5 mô tả chức năng đánh giá phim của trang web Người dùng có thể viết bình luận bên dưới bộ phim đồng thời người dùng cũng có thể xem lại các bình luận của mình tai; My Review do hệ thống tổng hợp lại Từ đó ta có giao diện như hình 5.12
Bảng 5-5 Bảng đặc tả chức năng đánh giá phim
Chức năng Viết bình luận đánh giá
67 Điều kiện trước Nhấp vào avt của bộ phim Điều kiện sau
Mô tả Hiển thị nội dung đánh giá bên dưới phim, tổng hợp thành danh sách cho từng người dùng
Kịch bản Hành động của tác nhân Hành động của hệ thống
Nhập bình luận và thực hiện thao tác gửi
Hiển thị nội dung đánh giá bên dưới phim, tổng hợp thành danh sách cho từng người dùng
Hình 5-12 Giao diện chức năng bình luận, đánh giá
5.2.6 Chức năng tạo list các bộ phim yêu thích
Bảng 5.7 mô tả chức năng tạo ra list các bộ phim yêu thích của người dùng Khi người dùng click vào biểu tượng trái tim bên phải của avt phim thì phim đó sẽ được tự động thêm vào danh sách Người dùng có thể tùy ý thêm hoặc xóa các phim trong list này Hình 5.13 là giao diện của chức năng trên
Bảng 5-6 Bảng đặc tả chức năng tạo list yêu thích
Chức năng Tạo list các bộ phim yêu thích
Tác nhân Người dùng Điều kiện trước Nhấp vào avt của bộ phim Điều kiện sau
Mô tả Thay đổi trạng thái nút thích, tổng hợp danh sách phim
Kịch bản Hành động của tác nhân Hành động của hệ thống
Nhấp vào biểu tượng thích bên cạnh avt phim
Thay đổi trạng thái nút thích, tổng hợp danh sách phim
Hình 5-13 Giao diện list phim yêu thích
5.2.7 Chức năng gợi ý các bộ phim liên quan
Bảng 5.7 mô tả hoạt động gợi ý các bộ phim liên quan tới phim mà người dùng vừa chọn Khi chọn 1 phim người dùng có thể cuộn xuống dưới cùng để xem xác phim được đề xuất dựa theo thuật toán lọc cosin similarity Hình 5.14 là giao diện cho chức năng này
Bảng 5-7 Bảng đặc tả chức năng gợi ý các bộ phim liên quan
Chức năng Gợi ý các bộ phim liên quan
Tác nhân Người dùng Điều kiện trước Nhấp vào avt của bộ phim Điều kiện sau
Mô tả Đưa ra gợi ý các bộ phim liên quan tới phim vừa được chọn
Kịch bản Hành động của tác nhân Hành động của hệ thống
Nhấp vào avt bộ phim Đưa ra gợi ý các bộ phim liên quan tới phim vừa được chọn
Hình 5-14 Giao diện gợi ý phim liên quan
5.2.8 Chức năng tìm kiếm phim dựa theo tiêu đề
Bảng 5.8 mô tả chức năng tìm kiếm phim dựa theo từ khóa Hệ thống sẽ đưa ra các phim có tiêu đề liên quan đến từ khóa vừa nhập và hiển thị ra một danh sách Hình 2.15 mô tả giao diện cho chức năng tìm kiếm này
Bảng 5-8 Bảng đặc tả chức năng tìm kiếm phim
Chức năng Tìm kiếm phim dựa theo từ khóa
Tác nhân Người dùng Điều kiện trước Nhấp ào nút search Điều kiện sau
Mô tả Đưa ra danh sách phim theo từ khóa vừa nhập
Kịch bản Hành động của tác nhân Hành động của hệ thống
Nhập từ khóa vào ô tìm kiếm Đưa ra danh sách phim theo từ khóa vừa nhập
Hình 5-15 Giao diện tìm kiếm phim
Kết luận chương
Như vậy, trong chương 5 tôi đã đưa ra usecase chung cũng như UML diagram của website Đồng thời đưa ra bảng đặc tả của từng chức năng từ đó đưa ra giao diện các chức năng của web
KẾT QUẢ THỰC NGHIỆM
Kết quả khi thực hiện thuật toán gợi ý
6.1.1 Kết quả khi thực hiện Demographic Filtering
Hình 6-1 Thống kê số lượng phim ứng với từng số lượng vote trung bình
Theo Hình 6.1 ta thấy số lượng vote trung bình cho mỗi phim dao động từ 0 đến
13752 Vì hầu như không nhìn thấy phần đuôi của những bộ phim có hơn 5.000 lượt bình chọn nên tôi chỉ hiển thị biểu đồ cho những bộ phim có ít hơn 5.000 lượt bình chọn
Hình 6-2 Thống kê số lượng phim có số lượt vote cao nhất
Hình 6-3 Thống kê số lượng phim ứng với số điểm trung bình
Hình 6 3 Thống kê số lượng phim ứng với số điểm trung bình
Có thể thấy, vote_average bị lệch trái và độ lệch là -1,96 Tuy nhiên, chúng ta nên nhận ra rằng số vote_average rất cao hoặc rất thấp thường dựa trên số lượng nhỏ phiếu bầu cho mỗi phim Có 62 phim với 0 phiếu bầu và vote_average là 0,0.Dưới đây, tôi
73 đang lọc các phim có vote_average dưới 4.5 hoặc trên 8.5 Theo Bảng 6.1 dưới đây, chỉ có 11 phim “đạt được” vote_average trong phạm vi này với số vote_count ít nhất là 400
Bảng 6-1 Số lượng phim có vote count dưới 400 phù hợp id title vote_average vote_count
Như vây có thể thấy số điểm trung bình của 1 bộ phim chưa thể đánh giá một cách khách quan độ hấp dẫn cũng như phổ biến của chúng Vì vậy ta sẽ sử dụng công thức tính điểm IMDB để xếp hạng top phim được yêu thích nhất Hình 6.4 đưa ra các bộ phim có số điểm cao nhất theo cách tính điểm IMDB Những phim có số điểm cao hơn sẽ được xếp cao hơn kể cả nó có vote_average thấp hơn một số bộ phim đứng dưới
Hình 6-4 Top 20 phim có số điểm cao nhất theo thang IMDB
Kết quả này sẽ được dùng vào trang web của tôi trong phần Top rate
6.1.2 Kết quả khi sử dụng cosin similarity a Kết quả gợi ý khi chỉ dựa trên độ tương đồng về tiêu đề, và nội dung
Sau khi tiến hành lấy các tóm tắt và mô tả về nội dung phim ta đưa tập dữ liệu bao gòm id phim và mô tả nội dung phim vào model train Sau đó ta được ma trận cosine_sim như Hình 6.5
Hình 6-5 Ma trận cosine_sim
Có thể thấy ma trận cosine_sim là một mảng numpy với độ tương tự cosine được tính toán giữa mỗi phim Ta thấy độ tương tự cosin của phim 0 với phim 0 là 1 do chúng giống nhau 100% Tương tự, độ tương tự cosine giữa phim 0 và phim 1 là 0,105409 (điểm giống nhau giữa phim 1 và phim 0 - không quan trọng thứ tự) Phim 0 và 4 giống nhau hơn (với điểm tương đồng là 0,23094) so với phim 0 và 3 (điểm = 0,0377426) Ma trận có đường chéo luôn có giá trị là 1 ứng với mỗi phim x luôn giống 100% với chính nó
Sau khi có ma trận mô tả độ tương đồng về nội dung, chúng ta sẽ dùng để gợi ý các phim liên quan đối với tường phim cụ thể Ví dụ với bộ phim “Dead Poet Sociaty”, ta tiến hành tìm kiếm id của phim này (Hình 6.6)
Hình 6-6 Movie id của Dead Poet Sociaty
Sau khi có movie id ta sẽ tiến hành đánh giá độ tương đồng dựa trên nội dung Sau khi trainning model ta sẽ có kết quả như Hình 6.7
Hình 6-7 Kết quả đánh giá độ trương đồng đối với phim id 2453
Có thể thấy rằng đối với phim có id 2453 có đô tương đồng cao nhất là 0.999999999999993 cũng chính là phim đầu vào Ta sẽ sắp xếp lại thứ tự các phim theo thứ tự từ cao đến thấp của dộ tương đồng (Hình 6.8)
Hình 6-8 Kết quả sắp xếp theo độ tương đồng về nội dung
Ta sẽ tiến hành đưa ra các phim có số điểm cao nhất dựa theo id phim (Hình 6.9) Mặc dù hệ thống của chúng ta đã thực hiện tốt công việc tìm kiếm các bộ phim có mô tả cốt truyện tương tự, nhưng chất lượng của các đề xuất không được tốt lắm "The Dark Knight Rises" chiếu lại tất cả các phim về Người Dơi trong khi nhiều khả năng những người thích phim đó sẽ có xu hướng thưởng thức các phim khác của Christopher Nolan hơn Đây là điều mà hệ thống hiện tại không thể nắm bắt được (Hình 6.10)
Hình 6-9 Gợi ý đối với phim Dead Poets Sociaty
Hình 6-10 Kết quả gợi ý đối với phim The Dark Knight Rise b Kết quả gợi ý khi có thêm sự dựa trên độ tương đồng về thể loại, dàn cast, đạo diễn
Hình 6-11 Kết quả gợi ý khi thêm các yếu tố dàn cast, thể loại, đạo diễn
Chúng ta thấy rằng hệ thống giới thiệu đã thành công trong việc thu thập nhiều thông tin hơn do có nhiều metadata hơn và đã đưa ra cho ta các đề xuất tốt hơn Nhiều khả năng những người hâm mộ truyện tranh Marvel hoặc DC sẽ thích những bộ phim của cùng một nhà sản xuất Do đó, đối với các tính năng ở trên, chúng ta có thể thêm production_company Chúng ta cũng có thể tăng tỷ trọng của yếu tố đạo diễn bằng cách thêm tính năng này nhiều lần vào soup Áp dụng đối với ứng dụng đề xuất phim (Hình 6.12)
Hình 6-12 Gợi ý cho phim Breaking Bad
6.1.3 Kết quả gợi ý sử dụng Collaborative Filtering
Ta train model dựa trên data split sau đó ta được kết quả train 5 epoch như Hình 6.7 history = model.fit( x=x_train, y=y_train, batch_sized, epochs=5, verbose=1, validation_data=(x_val, y_val),
Hình 6-13 Kết quả sau khi traing model bằng bộ dữ liệu MovieLens
Sau đó ta tiến hành tính toán Validation loss Kết quả được đưa ra ở Hình 6.14:
Hình 6-14 Model los của bộ train và test theo lượng epoch
Sau đó ta tiến hành đưa ra gợi ý những phim chưa xem cho một người dùng cụ thể dựa theo các phim đã được người dùng này đã xem và đánh giá cao trước đó user_id = df.userId.sample(1).iloc[0] movies_watched_by_user = df[df.userId == user_id] movies_not_watched = movie_df[
~movie_df["movieId"].isin(movies_watched_by_user.movieId.values)
]["movieId"] movies_not_watched = list( set(movies_not_watched).intersection(set(movie2movie_encoded.keys())) ) movies_not_watched = [[movie2movie_encoded.get(x)] for x in movies_not_wa tched] user_encoder = user2user_encoded.get(user_id) user_movie_array = np.hstack(
([[user_encoder]] * len(movies_not_watched), movies_not_watched)
) ratings = model.predict(user_movie_array).flatten() top_ratings_indices = ratings.argsort()[-10:][::-1] recommended_movie_ids = [ movie_encoded2movie.get(movies_not_watched[x][0]) for x in top_rating s_indices
Với ví dụ là một người dùng mang id 213 trước đó đã xem và đưa ra rating cao(rating
= 5) là đối với các phim:
• Terminator 2: Judgment Day (1991) : Action|Sci-Fi
• Big Fish (2003) : Drama|Fantasy|Romance
• Shrek 2 (2004) : Adventure|Animation|Children|Comedy|Musical|Romance
• 13 Assassins (Jûsan-nin no shikaku) (2010) : Action
Kết quả sẽ đưa ra top 10 phim mà người dùng này có thể sẽ thích (Hình 6.15)
Hình 6-15 Kết quả gợi ý đối với người dùng mang id 213
6.1.4 Đánh giá sai số Ở đây ta sử dụng tham số Lỗi bình phương trung bình gốc (RMSE) RMSE càng thấp, hiệu suất càng tốt
Bây giờ nói về yếu tố tiềm ẩn, bạn có thể tự hỏi nó là gì? Đó là một ý tưởng rộng mô tả một thuộc tính hoặc khái niệm mà người dùng hoặc một mục có Chẳng hạn, đối với âm nhạc, yếu tố tiềm ẩn có thể đề cập đến thể loại mà âm nhạc thuộc về SVD giảm kích thước của ma trận tiện ích bằng cách trích xuất các yếu tố tiềm ẩn của nó Về cơ bản, chúng ta ánh xạ từng người dùng và từng mục vào một không gian tiềm ẩn có kích thước r Do đó, nó giúp hiểu rõ hơn về mối quan hệ giữa người dùng và các mặt hàng khi chúng có thể so sánh trực tiếp from surprise import Reader, Dataset, SVD, evaluate reader = Reader() ratings = pd.read_csv(' /input/the-movies-dataset/ratings_small.csv') ratings.head()
Trước tiên áp dụng với 1 tập csv nhỏ bao gồm 5 movie (Bảng 6.2):
Bảng 6-2 Tập csv nhỏ gồm 5 phim userId movieId rating timestamp
Đánh giá kết quả
Có thể thấy mô hình gợi ý đã thực hiện tốt trong việc đưa ra gợi ý các bộ phim có số điểm cao cùng với các phim có độ tương đồng cao với phim vừa được chọn Đánh giá một bộ phim là hay hay dở qua ượng rating trung bình là chưa đủ trực quan mà còn cần phải kết hợp với các yếu tố vote count,
Thông qua các tham số lỗi cho thấy thuật toán thực hiện tốt trong việc đưa ra gợi ý với tập dữ liệu là phim
Có thể tăng hoặc giảm trọng số các yếu tố trong similarity cosin để ưu tiên gợi ý theo thuộc tính nào.
Kết luận chương
Chương 6 đã cho chúng ta thấy kết quả thực nghiệm cùng với sai số để đánh giá hiệu suất của thuật toán gợi ý