Spaces:
Runtime error
Runtime error
| import pandas as pd | |
| import numpy as np | |
| from scipy.spatial.distance import pdist, squareform | |
| from sklearn.metrics.pairwise import cosine_similarity | |
| import os | |
| import google.generativeai as genai | |
| import config | |
| from dotenv import load_dotenv | |
| load_dotenv() | |
| def prediction(liste_parfums, df): | |
| """ | |
| Cette fonction effectue une prédiction de recommandation de parfums basée sur la similarité de Jaccard. | |
| Elle prend en entrée une liste de parfums aimés par un utilisateur, | |
| calcule un nouveau profil utilisateur en agrégeant les embeddings correspondants à ces parfums, | |
| puis calcule la similarité de Jaccard entre ce nouveau profil utilisateur et les autres profils de parfums. | |
| Enfin, elle retourne les parfums recommandés triés par ordre décroissant de similarité de Jaccard. | |
| Args: | |
| liste_parfums (list): La liste des parfums aimés par l'utilisateur. | |
| df (pandas.DataFrame): Le DataFrame contenant les embeddings des parfums. | |
| Returns: | |
| pandas.DataFrame: Un DataFrame contenant les parfums recommandés et leur probabilité de similarité. | |
| Raises: | |
| ValueError: Si la liste des parfums est vide ou si le DataFrame des embeddings est vide. | |
| KeyError: Si la colonne 'Embeddings' n'est pas présente dans le DataFrame. | |
| """ | |
| new_user = np.zeros(df.shape[1]) # Initialisation d'une série de zéros pour un nouveau profil utilisateur | |
| # Calcul du nouveau profil utilisateur | |
| for parfum in liste_parfums: | |
| new_user += df.loc[parfum] | |
| new_user[new_user > 1] = 1 | |
| df.loc['new_user'] = new_user | |
| # Calcul de la similarité de Jaccard | |
| jaccard_distances = pdist(df.values, metric='jaccard') | |
| jaccard_similarity_array = 1 - squareform(jaccard_distances) | |
| jaccard_similarity_df = pd.DataFrame(jaccard_similarity_array, index=df.index, columns=df.index) | |
| # Récupération des similarités pour le nouvel utilisateur | |
| jaccard_similarity_series = jaccard_similarity_df.loc['new_user'] | |
| # Suppression des parfums d'entrée | |
| jaccard_similarity_series = jaccard_similarity_series.drop(list(liste_parfums)) | |
| # Trier les valeurs de similarité de la plus élevée à la plus basse | |
| ordered_similarities = jaccard_similarity_series.sort_values(ascending=False) | |
| # Supprimer le profil utilisateur après la prédiction | |
| df = df.drop(index='new_user') | |
| dict_of_dicts = ordered_similarities.to_dict() | |
| data = pd.DataFrame(list(dict_of_dicts.values()), index=list(dict_of_dicts.keys()), columns=['probabilite']) | |
| return data.iloc[1:] | |
| ma_cle = os.environ.get('Gemini') | |
| genai.configure(api_key=ma_cle) | |
| model = config.model | |
| def calcul_emb(description_utilisateur, model): | |
| """ | |
| Calcule l'embedding d'une description utilisateur en utilisant un modèle spécifié. | |
| Args: | |
| description_utilisateur (str): La description de l'utilisateur pour laquelle l'embedding doit être calculé. | |
| model (str): Le modèle utilisé pour calculer l'embedding. | |
| Returns: | |
| numpy.ndarray: L'embedding de la description utilisateur, représenté sous forme de tableau NumPy. | |
| Raises: | |
| ValueError: Si le modèle spécifié n'est pas valide ou si la description utilisateur est vide. | |
| """ | |
| embedding = genai.embed_content(model=model, | |
| content=description_utilisateur, | |
| task_type="retrieval_document") | |
| return np.array(embedding["embedding"]).reshape(1, -1) | |
| def calcul_similarite(embedding_utilisateur, embedding): | |
| """ | |
| Calcule la similarité cosinus entre deux vecteurs d'embeddings. | |
| Args: | |
| embedding_utilisateur (numpy.ndarray): L'embedding de la desciption de l'utilisateur, représenté sous forme de tableau NumPy. | |
| embedding (numpy.ndarray): L'embedding à comparer avec l'embedding de l'utilisateur, représenté sous forme de tableau NumPy. | |
| Returns: | |
| float: La similarité cosinus entre les deux embeddings. | |
| Raises: | |
| ValueError: Si l'une des embeddings n'est pas valide ou si elles n'ont pas la même dimension. | |
| """ | |
| embedding = np.array(embedding).reshape(1, -1) # Convertir en tableau NumPy avant de remodeler | |
| return cosine_similarity(embedding, np.array(embedding_utilisateur).reshape(1, -1))[0][0] | |
| def prediction_embe(description_utilisateur, df, model): | |
| """ | |
| Cette fonction effectue une prédiction basée sur l'embedding de la description utilisateur. | |
| Elle calcule l'embedding de la description utilisateur en utilisant le modèle spécifié, | |
| puis calcule la similarité cosinus entre cet embedding et les embeddings stockés dans le DataFrame. | |
| Enfin, elle classe les résultats par ordre décroissant de similarité. | |
| Args: | |
| description_utilisateur (str): La description de l'utilisateur pour laquelle la prédiction doit être effectuée. | |
| df (pandas.DataFrame): Le DataFrame contenant les embeddings des parfums et d'autres informations. | |
| model (str): Le modèle utilisé pour calculer l'embedding de la description utilisateur. | |
| Returns: | |
| pandas.DataFrame: Un DataFrame contenant les noms des parfums et les probabilités de similarité, classés par ordre décroissant de similarité. | |
| Raises: | |
| ValueError: Si le modèle spécifié n'est pas valide ou si la description utilisateur est vide. | |
| KeyError: Si la colonne 'Embeddings' n'est pas présente dans le DataFrame. | |
| """ | |
| vecteur_utilisateur = calcul_emb(description_utilisateur, model) | |
| df['probabilite'] = df['Embeddings'].map(lambda emb: calcul_similarite(emb, vecteur_utilisateur)) | |
| data = df[['nom_parfum', 'probabilite']] | |
| data.set_index('nom_parfum', inplace=True) | |
| data = data.sort_values(by='probabilite', ascending=False) | |
| return data | |