From bf128f1a0b1d002d69f10fcc91b577d006cacefe Mon Sep 17 00:00:00 2001 From: Adrienucl <adrien.payen@student.uclouvain.be> Date: Wed, 13 Dec 2023 12:38:59 +0100 Subject: [PATCH] last iupdate with the recommandation system --- .DS_Store | Bin 6148 -> 6148 bytes Data_Base.xlsx | Bin 0 -> 29822 bytes projet_en_groupe/.DS_Store | Bin 6148 -> 6148 bytes projet_en_groupe/algorithme_netflix.py | 184 +++++++++++-------------- projet_en_groupe/recom_sys.py | 5 +- 5 files changed, 86 insertions(+), 103 deletions(-) create mode 100644 Data_Base.xlsx diff --git a/.DS_Store b/.DS_Store index 476cff3271cdbbab862a81ad2a8e56af759ca6b7..a05bdbf17207db37fd9f7d4ef9dab08547ed1654 100644 GIT binary patch delta 118 zcmZoMXfc@JFUrBdz`)4BAi%&7&)~$6$WY9X%AmJdkYhQsAxMgk!38K-0>ntt3>6GH zK!p{aIr+&+Ir&LIbwK@$-IE<y3?>_}9N;iEG}citGBlhVz~(<$o<(qT1Zy$VW_FIh F`~V$v7_9&R delta 64 zcmZoMXfc@JFUroqz`)4BAi%(o%22`(4<z##;x`L&EN5n9pIpGIGC7Ckz~mOT@X66E Tf}5wX7Bfw3u-VMc@s}R}%L)*m diff --git a/Data_Base.xlsx b/Data_Base.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..467cf6659b1278f0a87da721fbdd0895369da3f1 GIT binary patch literal 29822 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	wHYVRNZH6&3ew zx2|u8`qAbGF;GKbf^{Q$Yqj8Lh`Vg<etxYgziNq?D%wDzpoO`{@fg%^!@PP0sgOc& zxXdepdCA+rfJy|^ZH5uh6m~7p!MMob*wtN;xQ9Wk326rDzEyWok#NIAfrJqdwBsWr zgTu_Y1{+X57e_c}MOoe1fE)c(V*c4j*Jm6f`A%+6<JqW-QuE~`+|DA`irRVl6-@}V zdsUaY16u(y3ro?RKsco*%1xslQ&gzxJNj5cgd`Irs>zc<WR*vXy6m^S)+bO{5cTiS z4L0?gLoUc|`c>u6Ac;Ey;jUVhaD@VPezY_p>s`^}e2s`mC=v};LJ7IYK>^WCu`#XC zFQJD{!&iJ?g?p{$S)0~V?Q&z@jE>9Q>SD2|akJb6zePn5F9-;kn3Fi)^OXbK1uV{C zVy5aAiOjsVq%?4+x?iy8DIO)>i!ZL8PP99z_=S8fUOZtntJb`1x{1#~Mo=-;_;E{B z)b1AjMZhb1RvL7Yo`_+*I|wM=gAm2O8x>i{;}EaafKv)QZdn10CIzblajMnevlwI2 zie(hH-te`r!d%h}e3iGb9KISY9t7;p9e4KDlP<aU=i2L}c8IdiTdY}tI%MF5kt?$1 zZ9k0|uWWB|bv28^15nMZ??$X^F}#R(s^~7^L;YiXFA(CUFE-v*mgcz?lKSF}WS`84 zKY1im9xp`rel&GK<>)`Y<|WKf43_4X$l;jL+xSrvgCKcztmBhMB2I1Dqi;!q0ZU(( zMU9A}f}4rgG(!ewRVLttxO;B^^OCIG;WpS)@aUhU7cv9`O-8cl8s3H{QEYw+?zz_x ziZ<f|*ug)+*)TQ=cj#eM)PJcb7n0k8y~{9&GLg(4R(F*ovy|npXI*l=N+ag7H5Jbz zPGOZMP~aIo#hC)<Z;eN!iiUkN{3LCS+$@4|5mK`o+^obrz%fRUw%4BY?X?HioBP@t zyY{G9?)1dN-CBp$#fG>xok9+U*2_~Ph0a-N8uT^vEhk{>8@|f;Wyi1+U|J4*)HKhl zgc+v*;Rq@K9UO|+GAETftGJxdC`)vkd<sce$}KDu!#aDJGzYuga)P442<)aDFLEJ; zVxQM!3Sn&^l7JY19CGDraVmmmCh{8a4dlC^&;Y7FiXq;;Q@DE=Aq=0tfz&TyKv112 zLR}uyPT&L?+ENWT6ga<oP&KcKRop;7$BiN8#kL!nEqEB_Hr;Fs&80}yZrFC9#t~8n zhS3{f8a9AJ31tDr=(EnS2k7HQsW*O5%z;(rj4$+W@6WcoG7g}J=SDIR+ip{GJ$E>{ zJ-qrdVbFbkC>H{OdEmVx+x(aGbke}LgzgRTjOx8_79mW+L(cN<e-MxglLO6w+;lF| z(Vvz9;T+=w?<=ngr~|J8zm%>@z_AWzM*WNcHlV;oqPmVAxCMJInKXgnebvD>vz{1F zfL7M3N-B71R&@#XxkTjrGKtPt;7WS$D{K^H(l_rg=43XSO~^^GLgTnd;F?x?eAa=9 zi6VsTi351>yL8M$eZCF%hH!u&fd}crFbfWt<bp8k&By_;BEKL%;tl#w!tzCWi_5}M z^Y>&3>~*as02<k5(|X#>3S&XgHL$iNL`g_3tg`U~n#0^fneB;w#mf%^XuO~KF#YmN zZ>4=;JR&}k5cRBsHoFx0oU|tqlawUSjkqKC=9I58_P2e~;_q<@JQ!H@`^*FDJM)C~ zE8N_7hAVV<N3zVZwSpZc6Vy!5AVcX2DT`pJLbuP+v&QVK-$UnZl}kgM&d&;0&MV!e z!Vm4N>LMZBgr>b^u~IzbmtWUcAM@LS<*(+@x;5!^x3O8{&	jALm<IgHHa~rGt`t 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 literal 0 HcmV?d00001 diff --git a/projet_en_groupe/.DS_Store b/projet_en_groupe/.DS_Store index cee0b65dddcd5835972253a55dd2037bd4548c61..002561828bb5df759e0eb963818a54096c654419 100644 GIT binary patch delta 21 ccmZoMXffEJ#mZr9Xsn}PWN5hAi1m^X06ygfl>h($ delta 21 ccmZoMXffEJ#mZr1ZmOeTY-Y6Ci1m^X06%91qW}N^ diff --git a/projet_en_groupe/algorithme_netflix.py b/projet_en_groupe/algorithme_netflix.py index a1dfdc1..911459a 100644 --- a/projet_en_groupe/algorithme_netflix.py +++ b/projet_en_groupe/algorithme_netflix.py @@ -474,32 +474,12 @@ def save_to_csv(data, default_filename='output.csv'): # début de l'algorithme de recommandation # Load the CSV file -""" -def print_matrix(data_1): - # Initialize the category matrix with zeros - unique_categories = set(category for categories in data_1['listed_in'].str.split(', ') for category in categories) - category_matrix = {category: {other_category: 0 for other_category in unique_categories} for category in unique_categories} +categories = [] - # Fill the matrix with the number of movies/series for each category pair - for categories in data_1['listed_in'].str.split(', '): - for category1 in categories: - for category2 in categories: - category_matrix[category1][category2] += 1 - category_df = pd.DataFrame(category_matrix) - - # Save the DataFrame to an Excel file - output_file = 'category_matrix.xlsx' - category_df.to_excel(output_file, index_label='Categories') - - print(f"Category matrix saved to {output_file}") - return category_matrix""" - - - -def read_movie_series_info(file_path_1): +def read_movie_series_info(file_path): catalog = {} - with open(file_path_1, 'r') as info_file: + with open(file_path, 'r', encoding='utf-8') as info_file: info_reader = csv.reader(info_file) next(info_reader) # Skip header row for row in info_reader: @@ -507,57 +487,106 @@ def read_movie_series_info(file_path_1): catalog[show_id] = [title, listed_in.split(', ')] return catalog -def read_user_ratings(file_path_2): +def read_user_ratings(file_path): ratings = {} - user_ids = [] # Assurez-vous d'initialiser la liste user_ids - with open(file_path_2, 'r') as ratings_file: + with open(file_path, 'r', encoding='utf-8') as ratings_file: ratings_reader = csv.reader(ratings_file) - header = next(ratings_reader) # Lire la première ligne pour obtenir les ID des utilisateurs - user_ids = header[1:] # Les ID des utilisateurs sont dans la première ligne, sauf la première colonne (show_id) + header = next(ratings_reader) # Skip header row + user_ids = list(map(int, header[1:])) + for row in ratings_reader: show_id = row[0] user_ratings = list(map(int, row[1:])) - ratings[show_id] = user_ratings - return ratings, user_ids + ratings[show_id] = dict(zip(user_ids, user_ratings)) + + return ratings -def create_category_matrix(catalog, ratings, categories): - category_matrix = [[0 for _ in range(len(categories))] for _ in range(len(categories))] +def create_category_matrix(catalog, categories): + # Créez la matrice avec une rangée et une colonne supplémentaires pour les noms de catégories + category_matrix = [[0 for _ in range(len(categories) + 1)] for _ in range(len(categories) + 1)] + # Ajoutez les noms de catégories à la première ligne et à la première colonne + for i in range(len(categories)): + category_matrix[0][i + 1] = categories[i] # Ajoutez les noms de catégories à la première ligne + category_matrix[i + 1][0] = categories[i] # Ajoutez les noms de catégories à la première colonne + + # Remplissez la matrice avec les données for show_id, movie_categories in catalog.items(): for i in range(len(categories)): if categories[i] in movie_categories[1]: for j in range(len(categories)): if categories[j] in movie_categories[1]: - category_matrix[i][j] += ratings[show_id][j] - + category_matrix[i + 1][j + 1] += 1 # Commencez à remplir à partir de la deuxième ligne et de la deuxième colonne + # Ajoutez les noms de catégories à la première colonne et les données de la matrice return category_matrix -def calculate_user_preferences(category_matrix, user_preferences, categories): - user_vector = [] - print("Length of user_preferences:", len(user_preferences)) - print("Length of categories:", len(categories)) +def recommend_movies(user_id, catalog, user_ratings, category_matrix, threshold=0.5): + global categories # Déclarer categories en tant que variable globale + categories = list(set(category for _, movie_info in catalog.items() for category in movie_info[1])) # permet d'actualiser la variable catégories global au niveau local - # Check if user_preferences is not empty and has the same length as categories - if len(user_preferences) != len(categories) or not user_preferences: - print("Error: Invalid user preferences") - return [] + user_id = int(user_id) # Convertir user_id en entier - for i in range(len(categories)): - user_vector.append(sum(category_matrix[i][j] * user_preferences[j] for j in range(len(categories)))) + suggestions = {} + category_index = {} + + # Créer le dictionnaire pour stocker les indices des catégories + category_index = {category: i + 1 for i, category in enumerate(categories)} + for show_id, categories in catalog.items(): + # Check if the user has rated the show + if show_id in user_ratings and user_id in user_ratings[show_id] and user_ratings[show_id][user_id] == 0: + # Liste des catégories communes entre le film/série et les films/séries notés par l'utilisateur + common_categories = [category for category in categories[1] if category in catalog[show_id][1]] + if common_categories: + # Calculez la similarité entre le film/série et les films/séries notés par l'utilisateur + similarity = sum( + min(category_matrix[category_index[category]][category_index[user_category]] for user_category in common_categories) + for category in categories[1] + ) + + # Ne recommandez que des films/séries dont la similarité dépasse le seuil spécifié + if similarity > threshold: + suggestions[show_id] = {'title': catalog[show_id][0], 'similarity': similarity} + + # Triez les suggestions par similarité décroissante + sorted_suggestions = sorted(suggestions.items(), key=lambda x: x[1]['similarity'], reverse=True) + + return sorted_suggestions[:5] + +def recommandation_algorithm() : + + # Replace file_path_1 and file_path_2 with the actual file paths + file_path_1 = "/Users/adrien/vscodeworkspace/coding-project/projet_en_groupe/data_cp_2023/netflix_titles-2.csv" + file_path_2 = "/Users/adrien/vscodeworkspace/coding-project/projet_en_groupe/data_cp_2023/ratings.csv" + + user_id = input("quel est ton user ? ") + + try: + user_id = int(user_id) + except ValueError: + print("Veuillez entrer un identifiant d'utilisateur valide.") + exit() - return user_vector + # Read data from CSV files + catalog = read_movie_series_info(file_path_1) + ratings = read_user_ratings(file_path_2) + # Create category matrix + categories = list(set(category for _, movie_info in catalog.items() for category in movie_info[1])) + category_matrix = create_category_matrix(catalog, categories) -def recommend_movies(catalog, ratings, category_matrix, user_preferences, categories): - recommended_movies = [] + # Display movies already viewed by the user + print("Films déjà vus par l'utilisateur:") + for show_id, user_rating in ratings.items(): + if user_id in user_rating and user_rating[user_id] > 0: + print(f"- {catalog[show_id][0]}") - for show_id, (title, movie_categories) in catalog.items(): - if show_id not in ratings: - movie_score = sum(category_matrix[i][j] * user_preferences[j] for i, j in enumerate(categories) if categories[i] in movie_categories[1]) - recommended_movies.append((title, movie_score)) + # Recommend movies + recommended_movies = recommend_movies(user_id, catalog, ratings, category_matrix, threshold=0.5) - recommended_movies.sort(key=lambda x: x[1], reverse=True) - return recommended_movies[:5] + # Display top 5 recommendations + print("\nTop 5 recommandations:") + for show_id, info in recommended_movies: + print(f"Title: {info['title']}, Similarity: {info['similarity']}") # Création du menu @@ -618,55 +647,8 @@ def action() : directors_nationality(data_1) elif command == "17" : basic_statistics(data_1) - elif command == "test" : - # Read data from CSV files - catalog = read_movie_series_info(file_path_1) - ratings, user_ids = read_user_ratings(file_path_2) - - transposed_ratings = {user_id: {} for user_id in user_ids} - for show_id, user_ratings in ratings.items(): - for i, user_id in enumerate(user_ids): - transposed_ratings[user_id][show_id] = user_ratings[i] - - print("User IDs in ratings:", transposed_ratings.keys()) - # Check if the user ID exists in the ratings dictionary - user_id_to_recommend = input("Enter your user ID: ") - user_id_to_recommend = str(user_id_to_recommend) - - # Check if the user ID exists in the ratings dictionary - if user_id_to_recommend not in transposed_ratings: - print(f"User with ID '{user_id_to_recommend}' not found in ratings.") - else: - # Get categories that exist in both catalog and user ratings - unique_types = file_path_1['listed_in'].unique() - - print("Common Categories:", unique_types) - - # Create category matrix - categories = list(common_categories) - print("Categories:", categories) - - category_matrix = create_category_matrix(catalog, transposed_ratings, categories) - - - # Use user ratings as preferences - user_preferences = [transposed_ratings[user_id_to_recommend][category] for category in categories] - print("User Preferences:", user_preferences) - - # Calculate user preferences - user_vector = calculate_user_preferences(category_matrix, user_preferences, categories) - - # Recommend movies - recommended_movies = recommend_movies(catalog, transposed_ratings, category_matrix, user_vector, categories) - - # Display top 5 recommendations - print(recommended_movies) - elif command == "18" : - user_id_to_recommend = input("Enter your user ID: ") - # Assuming 'catalog', 'ratings', 'category_matrix', 'categories' are available from your data loading - recommended_movies = recommend_movies(catalog, ratings, category_matrix, user_preferences, categories) - print(recommended_movies) + recommandation_algorithm() elif command == "..." : return False diff --git a/projet_en_groupe/recom_sys.py b/projet_en_groupe/recom_sys.py index f61d2a2..28a982b 100644 --- a/projet_en_groupe/recom_sys.py +++ b/projet_en_groupe/recom_sys.py @@ -56,6 +56,7 @@ def recommend_movies(user_id, catalog, user_ratings, category_matrix, threshold= # Créer le dictionnaire pour stocker les indices des catégories category_index = {category: i + 1 for i, category in enumerate(categories)} + print(category_index) for show_id, categories in catalog.items(): # Check if the user has rated the show @@ -100,10 +101,10 @@ if __name__ == "__main__": category_matrix = create_category_matrix(catalog, categories) # Display movies already viewed by the user - print("Films déjà vus par l'utilisateur:") + """print("Films déjà vus par l'utilisateur:") for show_id, user_rating in ratings.items(): if user_id in user_rating and user_rating[user_id] > 0: - print(f"- {catalog[show_id][0]}") + print(f"- {catalog[show_id][0]}")""" # Recommend movies recommended_movies = recommend_movies(user_id, catalog, ratings, category_matrix, threshold=0.5) -- GitLab