Chuyển đến nội dung chính

Hướng dẫn Hệ thống Gợi ý cho Nền tảng Streaming

Trong hướng dẫn Python này, khám phá dữ liệu phim của các nền tảng streaming phổ biến và xây dựng hệ thống gợi ý.
Đã cập nhật 5 thg 10, 2026  · 10 phút đọc

Khám phá cùng AI

ChatGPTClaudePerplexity

Với văn hóa xem liền mạch (binge-watching) các chương trình TV và phim, người dùng đang tiêu thụ nội dung với tốc độ nhanh nhờ các dịch vụ như Netflix, Prime Video, Hulu và Disney+. Một số nền tảng mới, như Hulu và YouTube TV, cũng cung cấp phát trực tiếp các sự kiện như thể thao, hòa nhạc/lưu diễn trực tiếp và các kênh tin tức. Phát trực tiếp vẫn chưa được một số nền tảng streaming, như Netflix, áp dụng.

Các nền tảng streaming mang đến cho người dùng sự linh hoạt hơn để xem các chương trình TV và phim yêu thích của họ, vào bất kỳ lúc nào, trên bất kỳ thiết bị nào. Những dịch vụ này có thể thu hút nhiều người tiêu dùng trẻ và hiện đại nhờ sự đa dạng lớn về nội dung TV và phim. Chúng cho phép họ xem lại bất kỳ chương trình nào bị bỏ lỡ theo thời gian rảnh. Trong hướng dẫn này, bạn sẽ phân tích dữ liệu phim của các nền tảng streaming Netflix, Prime Video, Hulu và Disney+ và cố gắng hiểu khán giả của họ.

banner kỹ năng python xây dựng sự nghiệp với data camp

Tìm hiểu Bộ dữ liệu

Dữ liệu này chỉ bao gồm các phim có trên các nền tảng streaming như Netflix, Prime Video, Hulu và Disney+. Bạn có thể tải về từ Kaggle tại đây.

Hãy mô tả chi tiết các thuộc tính dữ liệu:

  • ID: Mã định danh duy nhất cho mỗi bản ghi.
  • Title: Tên của phim
  • Year: Năm phát hành của phim.
  • Age: Nhóm tuổi mục tiêu
  • IMDb: Điểm đánh giá IMDB của phim.
  • Rotten Tomatoes: Tỷ lệ % trên Rotten Tomatoes
  • Netflix: phim có trên Netflix hay không
  • Hulu: phim có trên Hulu hay không
  • Prime Video: phim có trên Prime Video hay không
  • Disney+: phim có trên Disney+ hay không
  • Type: Phim hoặc chương trình TV
  • Directors: Tên đạo diễn
  • Genres: Thể loại
  • Country: Quốc gia sản xuất
  • Language: Ngôn ngữ gốc
  • Runtime: Thời lượng phim

Hãy import các mô-đun cần thiết và nạp bộ dữ liệu:

 # Import required libraries
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
from sklearn.feature_extraction.text import TfidfVectorizer    
from nltk.tokenize import RegexpTokenizer
import numpy as np
from sklearn import preprocessing
from scipy.sparse import hstack
import pandas_profiling
# Load dataset
df = pd.read_csv("tvshow.csv")
df=df.iloc[:,1:] # removing in unnamed index column
df.head()
  Unnamed: 0 ID Title Year Age IMDb Rotten Tomatoes Netflix Hulu Prime Video Disney+ Type Directors Genres Country Language Runtime
0 0 1 Inception 2010 13+ 8.8 87% 1 0 0 0 0 Christopher Nolan Action,Adventure,Sci-Fi,Thriller United States,United Kingdom English,Japanese,French 148.0
1 1 2 The Matrix 1999 18+ 8.7 87% 1 0 0 0 0 Lana Wachowski,Lilly Wachowski Action,Sci-Fi United States English 136.0
2 2 3 Avengers: Infinity War 2018 13+ 8.5 84% 1 0 0 0 0 Anthony Russo,Joe Russo Action,Adventure,Sci-Fi United States English 149.0
3 3 4 Back to the Future 1985 7+ 8.5 96% 1 0 0 0 0 Robert Zemeckis Adventure,Comedy,Sci-Fi United States English 116.0
4 4 5 The Good, the Bad and the Ugly 1966 18+ 8.8 97% 1 0 1 0 0 Sergio Leone Western Italy,Spain,West Germany Italian 161.0
# Show initial information about the dataset
df.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 16744 entries, 0 to 16743
Data columns (total 16 columns):
 #   Column           Non-Null Count  Dtype  
---  ------           --------------  -----  
 0   ID               16744 non-null  object
 1   Title            16744 non-null  object
 2   Year             16744 non-null  int64  
 3   Age              7354 non-null   object
 4   IMDb             16173 non-null  float64
 5   Rotten Tomatoes  5158 non-null   object
 6   Netflix          16744 non-null  int64  
 7   Hulu             16744 non-null  int64  
 8   Prime Video      16744 non-null  int64  
 9   Disney+          16744 non-null  int64  
 10  Type             16744 non-null  int64  
 11  Directors        16018 non-null  object
 12  Genres           16469 non-null  object
 13  Country          16309 non-null  object
 14  Language         16145 non-null  object
 15  Runtime          16152 non-null  float64
dtypes: float64(2), int64(6), object(8)
memory usage: 2.0+ MB
df.Type.unique()
array([0])

Làm việc với Giá trị thiếu

Trong phần này, bạn sẽ xử lý các giá trị thiếu bằng hàm isnull(). Hãy xem ví dụ bên dưới:

 #Finding Missing values in all columns
miss = pd.DataFrame(df.isnull().sum())
miss = miss.rename(columns={0:"miss_count"})
miss["miss_%"] = (miss.miss_count/len(df.ID))*100
miss
  misscount miss%
ID 0 0.000000
Title 0 0.000000
Year 0 0.000000
Age 9390 56.079790
IMDb 571 3.410177
Rotten Tomatoes 11586 69.194935
Netflix 0 0.000000
Hulu 0 0.000000
Prime Video 0 0.000000
Disney+ 0 0.000000
Type 0 0.000000
Directors 726 4.335882
Genres 275 1.642379
Country 435 2.597946
Language 599 3.577401
Runtime 592 3.535595

Bạn có thể thấy các biến Age và Rotten tomatoes có hơn 50% giá trị thiếu, điều này đáng lo ngại.

Giờ chúng ta sẽ xử lý giá trị thiếu theo các bước sau:

  • Loại bỏ các cột có hơn 50% giá trị thiếu
  • Xóa NA khỏi các cột IMDb, Directors, Genres, Country, Language và Runtime
  • Reset chỉ mục
  • Chuyển cột Year về kiểu object
# Dropping values with missing % more than 50%
df.drop(['Rotten Tomatoes', 'Age'], axis = 1, inplace=True)
# Dropping Na's from the following columns
df.dropna(subset=['IMDb','Directors', 'Genres', 'Country', 'Language', 'Runtime'],inplace=True)
df.reset_index(inplace=True,drop=True)
# Converting into object type
df.Year = df.Year.astype("object")
df.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 15233 entries, 0 to 15232
Data columns (total 14 columns):
 #   Column       Non-Null Count  Dtype  
---  ------       --------------  -----  
 0   ID           15233 non-null  object
 1   Title        15233 non-null  object
 2   Year         15233 non-null  object
 3   IMDb         15233 non-null  float64
 4   Netflix      15233 non-null  int64  
 5   Hulu         15233 non-null  int64  
 6   Prime Video  15233 non-null  int64  
 7   Disney+      15233 non-null  int64  
 8   Type         15233 non-null  int64  
 9   Directors    15233 non-null  object
 10  Genres       15233 non-null  object
 11  Country      15233 non-null  object
 12  Language     15233 non-null  object
 13  Runtime      15233 non-null  float64
dtypes: float64(2), int64(5), object(7)
memory usage: 1.6+ MB

Biểu đồ Phân phối

Bạn có thể kiểm tra phân phối của cột Year bằng hàm distplot() của seaborn. Hãy vẽ biểu đồ phân phối Năm phim.

#checking Distribution of years
plt.figure(figsize=(20,5))
sns.distplot(df['Year'])
plt.show()
biểu đồ phân phối năm phát hành phim

Biểu đồ cho thấy phân phối năm xuất xứ của phim. Bạn có thể suy ra rằng phần lớn phim được sản xuất trong giai đoạn 2000 đến 2020. Hãy vẽ biểu đồ phân phối điểm IMDB.

# Distribution of IMDb Rating
plt.figure(figsize=(20,5))
sns.distplot(df['IMDb'])
plt.show()
biểu đồ phân phối điểm imdb

Biểu đồ phân phối trên hơi lệch. Bạn có thể diễn giải rằng điểm IMDB trung bình của đa số phim là 6,5.

Hãy vẽ biểu đồ phân phối Thời lượng phim.

# Distribution of runtime
sns.distplot(df['Runtime'])
plt.show()
biểu đồ phân phối thời lượng phim

Từ biểu đồ trên, bạn có thể suy ra rằng thời lượng trung bình của phim nằm trong khoảng 80 đến 120 phút.

Phân phối Phim theo từng Nền tảng Streaming

Trong phần này, bạn sẽ xem phân phối phim theo từng nền tảng streaming. Trước hết, bạn cần tạo hàm m_cnt() để đếm số phim trên một nền tảng streaming nhất định. Sau đó, bạn có thể vẽ biểu đồ tròn (Pie) và hiểu thị phần của các nền tảng.

# A function to calculate the movies in different Streaming platforms
def m_cnt(plat, count=False):
    if count==False:
        print('Platform {} Count: {}'. format(plat, df[plat].sum()))
    else:
        return df[plat].sum()
# Let's see count of movies/shows of each streaming platform
m_cnt('Netflix')
m_cnt('Hulu')
m_cnt('Prime Video')
m_cnt('Disney+')
Platform Netflix Count: 3152
Platform Hulu Count: 848
Platform Prime Video Count: 11289
Platform Disney+ Count: 542
# Movies on each platform
lab = 'Prime Video','Netflix', 'Hulu', 'Disney'
s = [m_cnt('Prime Video', count=True),
     m_cnt('Netflix', count=True),
     m_cnt('Hulu', count=True),
     m_cnt('Disney+', count=True)]

explode = (0.1, 0.1, 0.1, 0.1)

#plotting
fig1, ax1 = plt.subplots()
ax1.pie(s,
       labels = lab,
       autopct = '%1.1f%%',
       explode = explode,
       shadow = True,
       startangle = 100)

ax1.axis = ('equal')
plt.show()
nền tảng streaming

Từ biểu đồ trên, bạn có thể nói rằng Prime Videos đang lưu trữ số lượng tựa lớn nhất với thị phần 71% và Netflix lưu trữ 20% tựa. Disney+ và Hulu lưu trữ ít tựa nhất, lần lượt là 5,4% và 3,4%.

Phân phối Phim theo Thể loại

Trong phần này, bạn sẽ xem phân phối phim theo thể loại. Trước tiên, bạn cần chuẩn bị dữ liệu. Bạn cần xử lý nhiều thể loại xuất hiện trong một ô của dataframe. Để làm vậy, bạn có thể dùng các hàm split(), apply() và stack(). Hàm split() tách các giá trị bằng dấu phẩy và tạo danh sách. apply(pd.Series,1) để tạo nhiều cột cho mỗi thể loại và hàm stack() xếp chúng lại thành một cột duy nhất.

Sau ba thao tác này, một cột Genres mới sẽ được ghép vào dataframe hiện có và bạn sẵn sàng để vẽ. Bạn có thể hiển thị top 10 thể loại với số lượng phim của chúng bằng hàm value_counts() và dùng hàm plot() của thư viện pandas.

 ##split the genres by ',' & then stack it one after the other for easy analysis.
g = df['Genres'].str.split(',').apply(pd.Series, 1).stack()
g.index = g.index.droplevel(-1)
# Assign name to column
g.name = 'Genres'
# delete column
del df['Genres']
# join new column with the existing dataframe
df_genres = df.join(g)
# Count of movies according to genre
plt.figure(figsize=(15,5))
sns.countplot(x='Genres', data=df_genres)
plt.xticks(rotation=90)
plt.show()
thể loại phim

Từ biểu đồ trên, bạn có thể nói rằng đa số phim thuộc các thể loại phổ biến là Drama và Comedy.

Phân phối Phim theo Quốc gia

Trong phần này, bạn sẽ xem phân phối phim theo quốc gia. Trước tiên, bạn cần chuẩn bị dữ liệu. Bạn cần xử lý nhiều quốc gia xuất hiện trong một ô của dataframe. Để làm vậy, bạn có thể dùng các hàm split(), apply() và stack(). Hàm split() tách các giá trị bằng dấu phẩy và tạo danh sách. apply(pd.Series,1) để tạo nhiều cột cho mỗi quốc gia và hàm stack() xếp chúng lại thành một cột duy nhất.

Sau ba thao tác này, một cột Country mới sẽ được ghép vào dataframe hiện có và bạn sẵn sàng để vẽ. Bạn có thể hiển thị top 10 quốc gia với số lượng phim của họ bằng hàm value_counts() và dùng hàm plot() của thư viện pandas.

 # Split the Country by ',' & then stack it one after the other for easy analysis.
c = df['Country'].str.split(',').apply(pd.Series, 1).stack()
c.index = c.index.droplevel(-1)
# Assign name to column
c.name = 'Country'
# delete column
del df['Country']
# join new column with the existing dataframe
df_country = df.join(c)
# plotting top 10 country and movie count
df_country['Country'].value_counts()[:10].plot(kind='bar',figsize=(15,5))
plt.show()
các quốc gia sản xuất phim

Biểu đồ trên cho thấy phần lớn phim được sản xuất tại Hoa Kỳ.

Phân phối Phim theo Ngôn ngữ

Trong phần này, bạn sẽ xem phân phối phim theo ngôn ngữ. Trước tiên, bạn cần chuẩn bị dữ liệu. Bạn cần xử lý nhiều ngôn ngữ xuất hiện trong một ô của dataframe. Để làm vậy, bạn có thể dùng các hàm split(), apply() và stack(). Hàm split() tách các giá trị bằng dấu phẩy và tạo danh sách. apply(pd.Series,1) để tạo nhiều cột cho mỗi ngôn ngữ và hàm stack() xếp chúng lại thành một cột duy nhất.

Sau ba thao tác này, một cột Language mới sẽ được ghép vào dataframe hiện có và bạn sẵn sàng để vẽ. Bạn có thể hiển thị top 10 ngôn ngữ với số lượng phim của họ bằng hàm value_counts() và dùng hàm plot() của thư viện pandas.

 # perform stacking operation on language column
l = df['Language'].str.split(',').apply(pd.Series,1).stack()
l.index = l.index.droplevel(-1)
# Assign name to column
l.name = 'Language'
# delete column
del df['Language']
# join new column with the existing dataframe
df_language = df.join(l)
# plotting top 10 Language and movie count
df_language['Language'].value_counts()[:10].plot(kind='bar',figsize=(15,3))
plt.show()
biểu đồ ngôn ngữ phim

Từ biểu đồ trên, bạn có thể kết luận rằng phần lớn phim là bằng tiếng Anh.

Phân phối điểm IMDB theo từng Nền tảng

Trong phần này, bạn sẽ vẽ phân phối điểm IMDB theo từng nền tảng. Để có được các kết quả này, bạn cần áp dụng hàm melt() và vẽ biểu đồ FacetGrid. Hàm melt() chuyển một dataframe rộng thành dataframe dạng dài. Hãy xem ví dụ dưới đây:

 # melting platform columns to create visualization
df2 = pd.melt(df, id_vars=["ID","Title","Year","IMDb","Type","Runtime"], var_name="platform")
df2 = df2[df2.value==1]
df2.drop(columns=["value"],axis=1,inplace=True)
# Distribution of IMDB rating in different platform
g = sns.FacetGrid(df2, col = "platform")
g.map(plt.hist, "IMDb")
plt.show()
Phân phối điểm IMDB theo từng Nền tảng

Biểu đồ trên cho thấy phân phối điểm IMDB trung bình trên mỗi nền tảng.

banner khám phá thư viện khóa học python của datacamp

Thời lượng theo Nền tảng kèm Nhóm tuổi

Trong phần "Làm việc với Giá trị thiếu", tôi đã loại bỏ cột Age. Để có được kết quả Thời lượng theo Nền tảng kèm Nhóm tuổi, tôi cần nạp lại dữ liệu và áp dụng hàm melt().

# Load dataset
df = pd.read_csv("tvshow.csv")
df=df.iloc[:,1:]
df.ID = df.ID.astype("object")

# melting platform columns to create visualization
df2 = pd.melt(df, id_vars=["ID","Title","Year","Age","IMDb","Rotten Tomatoes","Type","Runtime"], var_name="platform")
df2 = df2[df2.value==1]
df2.drop(columns=["value"],axis=1,inplace=True)

Sau khi nạp lại bộ dữ liệu và thực hiện melt, đã đến lúc tạo biểu đồ thời lượng so với nền tảng streaming cho các nhóm tuổi khác nhau.

# Total of runtime in different platform
ax = sns.barplot(x="platform", y="Runtime",hue="Age", estimator=sum, data=df2)
Thời lượng theo Nền tảng kèm Nhóm tuổi

Biểu đồ trên cho thấy tổng thời lượng trên Prime Videos bởi nhóm người dùng 18+ cao hơn hẳn so với bất kỳ nền tảng nào khác. Bạn có thể diễn giải rằng nội dung trên Prime Videos phần lớn tập trung vào nhóm tuổi 18+.

Xây dựng Hệ thống Gợi ý

Trong vài năm qua, với bước nhảy vọt của YouTube, Walmart, Netflix và nhiều dịch vụ web khác, các hệ thống gợi ý đã tạo ra tác động to lớn trong ngành. Từ việc đề xuất sản phẩm/dịch vụ đến gia tăng giá trị công ty bằng kiếm tiền dựa trên quảng cáo trực tuyến và ghép khớp mức độ liên quan, sở thích của người dùng để thúc đẩy họ mua hàng. Hệ thống gợi ý là không thể thay thế trong các hành trình web hằng ngày của chúng ta.

Về tổng thể, đây là các khung dựa trên Toán học, tập trung đề xuất sản phẩm/dịch vụ cho người dùng cuối phù hợp với nhu cầu và mong muốn của họ. Ví dụ, phim để xem, bài viết để đọc, sản phẩm để mua, nhạc để nghe, hoặc bất cứ thứ gì tùy theo lĩnh vực. Có ba phương pháp chính để xây dựng Hệ thống gợi ý:

  1. Phương pháp dựa trên Nội dung (Content-Based): Xây dựng mô hình cho người dùng hoặc các mục mà họ tương tác dựa trên tập đặc trưng của mục để gợi ý các mục tương tự cho người dùng.
  2. Lọc cộng tác (Collaborative Filtering): Xây dựng mô hình cho điểm tương đồng tương tác giữa người dùng và mục hoặc điểm tương đồng giữa người dùng với người dùng dùng cho gợi ý mục.
  3. Lai (Hybrid): Kết hợp cả phương pháp dựa trên nội dung và cộng tác để đạt kết quả tốt hơn.

Trước tiên, hãy tiền xử lý bộ dữ liệu cho hệ thống gợi ý. Đầu tiên, bạn kiểm tra các giá trị thiếu:

# Reading Data Again
df = pd.read_csv("tvshow.csv")
df=df.iloc[:,1:]
#Finding Missing values in all columns
miss = pd.DataFrame(df.isnull().sum())
miss = miss.rename(columns={0:"miss_count"})
miss["miss_%"] = (miss.miss_count/len(df.ID))*100
miss
#Dropping values with missing % more than 50%
df.drop(['Rotten Tomatoes', 'Age'], axis = 1, inplace=True)
# Dropping Na's from the following columns
df.dropna(subset=['IMDb','Directors', 'Genres', 'Country', 'Language', 'Runtime'],inplace=True)
df.reset_index(inplace=True,drop=True)
# converting into object type
df.ID = df.ID.astype("object")
df.Year = df.Year.astype("object")

Bạn sẽ xây dựng hai hệ thống gợi ý dựa trên cosine similarity.

1. Using only the numerical variable
2. Using both numerical and categorical variable

Chỉ dùng cột số

Bước 1: Chọn biến số

ndf = df.select_dtypes(include=['float64',"int64"])

Bước 2: Chuẩn hóa biến số bằng min-max scaler để giảm độ phức tạp mô hình và thời gian huấn luyện

#importing minmax scaler
from sklearn import preprocessing

# Create MinMaxScaler Object
scaler = preprocessing.MinMaxScaler(feature_range=(0, 1))

# Create dataframe after transformation
ndfmx = pd.DataFrame((scaler.fit_transform(ndf)))

# assign column names
ndfmx.columns=ndf.columns

# Show initial 5 records
ndfmx.head()

Bước 3: Tính điểm tương đồng bằng cosine similarity

Bây giờ, bạn sẽ tính điểm tương đồng bằng cosine similarity.

# Import cosine similarity
from sklearn.metrics.pairwise import cosine_similarity

# Compute the cosine similarity
sig = cosine_similarity(ndfmx, ndfmx)

# Reverse mapping of indices and movie titles
indices = pd.Series(df.index, index=df['Title']).drop_duplicates()
indices.head()

Bước 4: Viết hàm để nhận gợi ý dựa trên điểm tương đồng

  • Hàm nhận hai tham số: tên phim và ma trận điểm tương đồng. Nó tìm chỉ số của tiêu đề tương ứng với original_titles trong series indices.
  • Lấy điểm tương đồng cặp giữa tất cả phim.
  • Sắp xếp điểm tương đồng giảm dần và chuyển thành danh sách.
  • Lấy top 10 điểm và chỉ số phim, trả về tiêu đề 10 phim hàng đầu từ dataframe.
def give_rec(title, sig=sig):

    # Get the index corresponding to original_title
    idx = indices[title]

    # Get the pairwise similarity scores
    sig_scores = list(enumerate(sig[idx]))

    # Sort the movies
    sig_scores = sorted(sig_scores, key=lambda x: x[1], reverse=True)

    # Scores of the 10 most similar movies
    sig_scores = sig_scores[1:11]

    # Movie indices
    movie_indices = [i[0] for i in sig_scores]

    # Top 10 most similar movies
    return df['Title'].iloc[movie_indices]
# Execute get_rec() function for getting recommendation
give_rec("The Matrix",sig = sig)

Ở đây, các phim được gợi ý chưa thực sự tốt. Lý do là bạn chỉ dùng điểm đánh giá phim, thời lượng phim và các biến nền tảng. Bạn có thể cải thiện bằng cách dùng thêm thông tin như thể loại, đạo diễn và quốc gia.

Dùng cả cột số và cột văn bản

Vì hệ thống gợi ý trước đó hoạt động ổn nhưng gợi ý chưa như mong đợi, bạn sẽ thử một cách tiếp cận mới, tốt hơn để cải thiện kết quả.

df.head()

Bước 1:

Bạn sẽ gộp các cột văn bản vào một cột rồi dùng tokenizer và TF-IDF Vectorizer để tạo ma trận thưa các điểm TF-IDF của tất cả từ. Sau đó bạn sẽ chọn và chuẩn hóa các biến số và thêm chúng vào ma trận thưa. Bạn cần thực hiện các bước sau để tiền xử lý:

  • Chọn tất cả kiểu dữ liệu object và lưu vào danh sách.
  • Loại bỏ cột ID và Title.
  • Nối tất cả các cột văn bản/object bằng dấu phẩy thành một cột duy nhất.
  • Tạo tokenizer để loại bỏ các thành phần không mong muốn như ký hiệu và số.
  • Chuyển văn bản thành TfidfVector. Sau đó thực hiện tiền xử lý cột số
  • Chọn các biến số vào một DataFrame
  • Chuẩn hóa biến số bằng minmax scaler (khoảng 0,1)
  • Thêm các biến số vào ma trận thưa TF-IDF bằng hàm hstack (hstack dùng để ghép ngang các mảng vào ma trận thưa).
#the function performs all the important preprocessing steps
def preprocess(df):
    #combining all text columns
    # Selecting all object data type and storing them in list
    s = list(df.select_dtypes(include=['object']).columns)
    # Removing ID and Title column
    s.remove("Title")
    s.remove("ID")
    # Joining all text/object columns using commas into a single column
    df['all_text']= df[s].apply(lambda x: ','.join(x.dropna().astype(str)),axis=1)

    # Creating a tokenizer to remove unwanted elements from our data like symbols and numbers
    token = RegexpTokenizer(r'[a-zA-Z]+')

    # Converting TfidfVector from the text
    cv = TfidfVectorizer(lowercase=True,stop_words='english',ngram_range = (1,1),tokenizer = token.tokenize)
    text_counts= cv.fit_transform(df['all_text'])

    # Aselecting numerical variables
    ndf = df.select_dtypes(include=['float64',"int64"])

    # Scaling Numerical variables
    scaler = preprocessing.MinMaxScaler(feature_range=(0, 1))

    # Applying scaler on our data and converting i into a data frame
    ndfmx = pd.DataFrame((scaler.fit_transform(ndf)))
    ndfmx.columns=ndf.columns    

    # Adding our adding numerical variables in the TF-IDF vector
    IMDb = ndfmx.IMDb.values[:, None]
    X_train_dtm = hstack((text_counts, IMDb))
    Netflix = ndfmx.Netflix.values[:, None]
    X_train_dtm = hstack((X_train_dtm, Netflix))
    Hulu = ndfmx.Hulu.values[:, None]
    X_train_dtm = hstack((X_train_dtm, Hulu))
    Prime = ndfmx["Prime Video"].values[:, None]
    X_train_dtm = hstack((X_train_dtm, Prime))
    Disney = ndfmx["Disney+"].values[:, None]
    X_train_dtm = hstack((X_train_dtm, Disney))
    Runtime = ndfmx.Runtime.values[:, None]
    X_train_dtm = hstack((X_train_dtm, Runtime))
    return X_train_dtm

Bước 2: Áp dụng hàm cho dữ liệu và tạo ma trận thưa

# Preprocessing data
mat =preprocess(df)
mat.shape

Bước 3: Tiếp tục áp dụng Cosine Similarity để tính điểm tương đồng

# using cosine similarity
from sklearn.metrics.pairwise import cosine_similarity

# Compute the sigmoid kernel
sig2 = cosine_similarity(mat, mat)

# Reverse mapping of indices and movie titles
indices = pd.Series(df.index, index=df['Title']).drop_duplicates()

Bước 4: Nhận gợi ý từ hệ thống đã cải thiện

give_rec("The Matrix",sig=sig2)

Lần này hệ thống gợi ý hoạt động tốt hơn nhiều so với hệ thống cũ, cho thấy rằng bằng cách thêm nhiều dữ liệu liên quan như văn bản mô tả, một hệ thống gợi ý dựa trên nội dung có thể được cải thiện đáng kể.

Kết luận

Chúc mừng bạn đã hoàn thành hướng dẫn này!

Trong hướng dẫn này, bạn đã thực hiện phân tích khám phá đối với bộ dữ liệu phim trên các nền tảng streaming. Bạn đã khám phá các giá trị thiếu, các biểu đồ phân phối riêng lẻ và phân phối phim trên mỗi nền tảng streaming. Bạn cũng đã phát hiện các thông tin chi tiết về thể loại, quốc gia, ngôn ngữ, điểm IMDB và thời lượng phim. Cuối cùng, bạn cũng đã xem cách xây dựng một hệ thống gợi ý bằng Python.

Hãy xem thêm hướng dẫn Hệ thống Gợi ý bằng Python của DataCamp.

banner thư viện khóa học python của datacamp
Chủ đề
Python
Khoa học Dữ liệu
Phân tích dữ liệu

Tìm hiểu thêm về Python

Khóa học

Xây dựng Recommendation Engine bằng Python

4 giờ
12.9K
Xem chi tiếtRight Arrow
Bắt Đầu Khóa Học
Xem thêmRight Arrow
Liên quan

blog

Claude Opus 4.6: Tính năng, Điểm chuẩn, Bài kiểm tra thực hành và hơn thế nữa

Mô hình mới nhất của Anthropic dẫn đầu ở mã hóa tác tử và lập luận phức tạp. Thêm vào đó, nó có cửa sổ ngữ cảnh 1M.
Matt Crabtree's photo

Matt Crabtree

10 phút

Xem ThêmXem Thêm