У нас воскресное утро, и я понятия не имею, как провести день впустую, наверное, мне следует посмотреть Netflix и расслабиться. Я не знаю, какой из них смотреть, обычно я смотрю первые 5 минут фильма/сериала, а потом решаю, продолжать или нет. Мой коэффициент конверсии ниже 5%. Поэтому я решил использовать набор данных Kaggle Netflix, проанализировать его и создать рекомендательную систему, чтобы найти подходящий мне фильм. Нажмите здесь, чтобы загрузить набор данных Netflix с Kaggle.

Анализ данных Нетфликс

Я скачал набор данных, и я начну анализировать набор данных. Поиск индийских фильмов на NetFlix.

import pyforest
data=pd.read_csv("netflix.csv")

Давайте проверим количество фильмов и шоу на Netflix

data.groupby('type').count()
print(data.type.value_counts())
sns.countplot(data.type,palette="pastel")

Мы проверим количество фильмов по странам.

print(data["country"].value_counts().head())
plt.figure(figsize=(20,6))
sns.countplot(x="country",data= data,hue= "type",order = data['country'].value_counts().index[0:15],palette="pastel")
plt.xticks(rotation=45)
plt.show()

Давайте проверим 5 лучших жанров.

print(netflix["listed_in"].value_counts()[:5])

Мы проанализировали и визуализировали имеющиеся у нас данные Netflix. Хотя иметь возможность знать ваши данные полезно, мне все еще нужен рекомендатель для себя, чтобы выбрать шоу для просмотра.

Векторизация функций фильма

Импорт всех библиотек, которые нам понадобятся для анализа набора данных и создания системы рекомендаций, и удаление столбцов, которые не требуются для нашего анализа фильмов в нашем наборе данных.

import numpy as np # linear algebra
import pandas as pd # data processing, CSV file I/O (e.g. pd.read_csv)
import re
import nltk
from nltk.corpus import stopwords
nltk.download('stopwords')
from nltk.tokenize import word_tokenize
data = data.dropna(subset=['cast','country','rating'])
movies = data[data['type']=='Movie'].reset_index()
movies = movies.drop(['index','show_id','type','date_added','release_year','duration','description'],axis=1)
movies.head()

Мы сделаем то же самое и для сериалов Netflix. Удаление лишних столбцов.

tv = data[data['type']=='TV Show'].reset_index()
tv = tv.drop(['index','show_id','date_added','release_year','duration','description','type'],axis=1)
tv.head()

Токенизация имен киноактеров. сначала мы разделим актеров одного и того же фильма.

actors =[]
for i in movies['cast']:
    actor=re.split(r',\s*',i)
    actors.append(actor)

Дальнейшая токенизация всех акторов и сортировка их по возрастанию. рассмотрите подсписок как один список (актеры от Демена Бишира до Кармен - это один список), а элемент - это каждый отдельный актер, который есть в подсписке. Итак, мы добавляем имена всех актеров в один список. Список преобразуется в набор всех актеров, отсортированных по возрастанию. Set используется для хранения всех значений в одной переменной.

flat_list=[]
for sublist in actors:
    for item in sublist:
        flat_list.append(item)
actor_list = sorted(set(flat_list))

binary_actor – это пустой набор с размерами актера_списка.

binary_actor = [[0] * 0 for i in range(len(set(flat_list)))]

Мы создаем фрейм данных с именем binary_actor, который будет иметь значение 0, если имя актера отсутствует в столбце приведения (в этом столбце будут все имена актеров) и 1, если имя присутствует.

for i in movies['cast']:
    k=0
    for j in actor_list:
        if j in i:
            binary_actor[k].append(1.0)
        else:
            binary_actor[k].append(0.0)
        k+=1
binary_actor = pd.DataFrame(binary_actor).transpose()

Мы повторим тот же процесс для директоров и стран и векторизируем их.

directors=[]
for i in movies['director']:
    if pd.notna(i):
        director=re.split(r',\s*',i)
        directors.append(director)
flat_list2=[]
for sublist in directors:
    for item in sublist:
        flat_list2.append(item)
directors_list=sorted(set(flat_list2))
binary_director = [[0]* 0 for i in range(len(set(flat_list2)))]
for i in movies['director']:
    k=0
    for j in directors_list:
        if pd.notna(j):
            binary_director[k].append(0.0)
        elif j in i:
            binary_director[k].append(1.0)
        else:
            binary_director[k].append(0.0)
        k+=1
            
binary_director = pd.DataFrame(binary_director).transpose()
countries=[]
for i in movies['country']:
    country=re.split(r',\s*',i)
    countries.append(country)
flat_list3=[]
for sublist in countries:
    for item in sublist:
        flat_list3.append(item)
country_list = sorted(set(flat_list3))
binary_country=[[0]*0 for i in range(len(set(flat_list3)))]
for i in movies['country']:
    k=0
    for j in country_list:
        if j in i:
            binary_country[k].append(1.0)
        else:
            binary_country[k].append(0.0)
        k+=1
binary_country = pd.DataFrame(binary_country).transpose()

Векторизация жанров.

genres=[]
for i in movies['listed_in']:
    genre=re.split(r',\s*',i)
    genres.append(genre)
flat_list4=[]
for sublist in genres:
    for item in sublist:
        flat_list4.append(item)
genre_list=sorted(set(flat_list4))
binary_genre=[[0] * 0 for i in range(len(set(flat_list4)))]
for i in movies['listed_in']:
    k = 0
    for j in genre_list:
        if j in i:
            binary_genre[k].append(1.0)
        else:
            binary_genre[k].append(0.0)
        k+=1
binary_genre=pd.DataFrame(binary_genre).transpose()

Векторизация оценок.

ratings = []
for i in movies['rating']:
    ratings.append(i)
rating_list = sorted(set(ratings))
binary_rating = [[0]*0 for i in range(len(set(rating_list)))]

Сейчас самое время создать фрейм данных, объединив все векторизованные объекты.

binary = pd.concat([binary_actor,binary_director,binary_country,binary_genre],axis=1,ignore_index=True)
binary

Векторизация функций телешоу

Мы векторизовали данные фильма. нам нужно сделать то же самое для сериалов Netflix. Мы будем использовать один и тот же код с разными именами переменных.

actors2=[]
for i in tv['cast']:
    actor=re.split(r',\s*',i)
    actors2.append(actor)
flat_list5 = []
for sublist in actors2:
    for item in sublist:
        flat_list5.append(item) 
actors_list2 = sorted(set(flat_list5))
binary_actor2 = [[0] * 0 for i in range(len(set(flat_list5)))]
for i in tv['cast']:
    k=0
    for j in actors_list2:
        if j in i:
            binary_actor2[k].append(1.0)
        else:
            binary_actor2[k].append(0.0)
        k+=1
binary_actor2 = pd.DataFrame(binary_actor2).transpose()
country2 = []
for i in tv['country']:
    
    countries2 = re.split(r',\s*',i)
    country2.append(countries2)
flat_list6 = []
for sublist in country2:
    for item in sublist:
        flat_list6.append(item)
country_list2 = sorted(set(flat_list6))
binary_country2 = [[0] * 0 for i in range(len(set(flat_list6)))]
for i in tv['country']:
    k=0
    for j in country_list2:
        if j in i:
            binary_country2[k].append(1.0)
        else:
            binary_country2[k].append(0.0)
            
        k+=1
binary_country2 = pd.DataFrame(binary_country2).transpose()
genres2=[]
for i in tv['listed_in']:
    genre2=re.split(r',\s*',i)
    genres2.append(genre2)
flat_list8=[]
for sublist in genres2:
    for item in sublist:
        flat_list8.append(item)
genres_list2 = sorted(set(flat_list8))
binary_genre2 = [[0] * 0 for i in range(len(set(flat_list8)))]
for i in tv['listed_in']:
    k=0
    for j in genres_list2:
        if j in i:
            binary_genre2[k].append(1.0)
        else:
            binary_genre2[k].append(0.0)
        k+=1
        
        
binary_genre2 = pd.DataFrame(binary_genre2).transpose()
ratings2 = []
for i in tv['rating']:
    ratings2.append(i)
    
rating_list2 = sorted(set(ratings2))
binary_rating2 = [[0] * 0 for i in range(len(set(rating_list2)))]
for i in tv['rating']:
    k=0
    for j in rating_list2:
        if j in i:
            binary_rating2[k].append(1.0)
        else:
            binary_rating2[k].append(0.0)
        k+=1
        
binary_rating2 = pd.DataFrame(binary_rating2).transpose()

Теперь все функции телешоу будут объединены.

binary2 = pd.concat([binary_actor2,binary_country2,binary_genre2],axis=1,ignore_index=True)
binary2

Рекомендательная система, использующая косинусное подобие

Теперь, когда у нас есть все объекты, векторизованные и объединенные. Нам нужно написать рекомендательный алгоритм. Мы будем использовать косинусное равенство, чтобы найти сходство между фильмами.

Косинусное сходство измеряет сходство между двумя векторами пространства внутреннего произведения. Он измеряется косинусом угла между двумя векторами и определяет, указывают ли два вектора примерно в одном направлении. Он используется для измерения сходства между текстом для анализа и рекомендательными системами.

Где A будет искомым фильмом/телешоу, а B будет всеми фильмами/телешоу в нашей базе данных

def recommender(search):
    cs_list = []
    binary_list = []
    if search in movies['title'].values:
        idx = movies[movies['title']==search].index.item()
        for i in binary.iloc[idx]:
            binary_list.append(i)
        point1=np.array(binary_list).reshape(1,-1)
        point1=[val for sublist in point1 for val in sublist]
        for j in range(len(movies)):
            binary_list2 = []
            for k in binary.iloc[j]:
                binary_list2.append(k)
            point2 = np.array(binary_list2).reshape(1,-1)
            point2 = [val for sublist in point2 for val in sublist]
            
            dot_product = np.dot(point1,point2)
            
            norm_1 = np.linalg.norm(point1)
            norm_2 = np.linalg.norm(point2)
            cos_sim = dot_product / (norm_1*norm_2)
            cs_list.append(cos_sim)
            
        movies_copy = movies.copy()
        movies_copy['cos_sim'] = cs_list
        results = movies_copy.sort_values('cos_sim',ascending=False)
        results = results[results['title']!=search]
        top_results = results.head(5)
        return(top_results)
    
    
    elif search in tv['title'].values:
        idx = tv[tv['title']==search].index.item()
        for i in binary2.iloc[idx]:
            binary_list.append(i)
            
        point1 = np.array(binary_list).reshape(1,-1)
        point1 = [val for sublist in point1 for val in sublist]
        for j in range(len(tv)):
            binary_list2=[]
            for k in binary2.iloc[j]:
                binary_list2.append(k)
            point2 = np.array(binary_list2).reshape(1,-1)
            point2 = [val for sublist in point2 for val in sublist]
            
            dot_product = np.dot(point1,point2)
            
            norm_1 = np.linalg.norm(point1)
            norm_2 = np.linalg.norm(point2)
            cos_sim = dot_product / (norm_1*norm_2)
            cs_list.append(cos_sim)
        tv_copy = tv.copy()
        tv_copy['cos_sim'] = cs_list
        results = tv_copy.sort_values('cos_sim',ascending=False)
        results = results[results['title']!=search]
        top_results = results.head(5)
        return(top_results)
    else:
        return("Title is not in dataset.Please check what's worng !!")

Я написал рекомендательный алгоритм. Позвольте мне проверить рекомендацию. Последнее шоу, которое я смотрел, было «GHOUL».

recommender('GHOUL')

Хорошо, ребята, я посмотрю «Дарр сабко лагта хай».