Spaces:
Sleeping
Sleeping
| import sqlite3 | |
| import pandas as pd | |
| import pickle | |
| from sentence_transformers import SentenceTransformer | |
| from sklearn.metrics.pairwise import cosine_similarity | |
| class EduRecommender: | |
| def __init__(self, db_path="bourses_reco.db", vector_path="bourses_vectors.pkl"): | |
| self.db_path = db_path | |
| # 1. Chargement du modèle IA (Une seule fois) | |
| print("⏳ Chargement du modèle multilingue...") | |
| self.model = SentenceTransformer('paraphrase-multilingual-MiniLM-L12-v2') | |
| # 2. Chargement des vecteurs de bourses | |
| with open(vector_path, "rb") as f: | |
| data = pickle.load(f) | |
| self.bourse_ids = data["ids"] | |
| self.bourse_vectors = data["vectors"] | |
| def _get_connection(self): | |
| return sqlite3.connect(self.db_path) | |
| def recommander_tout(self, user_id, top_n=3): | |
| conn = self._get_connection() | |
| # --- RÉCUPÉRATION ÉTUDIANT --- | |
| user = pd.read_sql(f"SELECT * FROM etudiants WHERE user_id = '{user_id}'", conn).iloc[0] | |
| print(f"\n🎯 Analyse pour : {user['nom']} ({user['interet_majeur']})") | |
| # --- PARTIE 1 : BOURSES (Matching Sémantique) --- | |
| # On crée un texte riche pour la recherche | |
| texte_recherche = f"Bourse en {user['interet_majeur']} pour niveau {user['niveau_actuel']}" | |
| user_vector = self.model.encode([texte_recherche]) | |
| sim_bourses = cosine_similarity(user_vector, self.bourse_vectors)[0] | |
| df_bourses_res = pd.DataFrame({'bourse_id': self.bourse_ids, 'score_ia': sim_bourses}) | |
| # Jointure SQL pour avoir les détails et filtrer par Statut OUVERT | |
| bourses_final = pd.merge(df_bourses_res, pd.read_sql("SELECT * FROM bourses WHERE statut='OUVERT'", conn), on='bourse_id') | |
| top_bourses = bourses_final.sort_values(by='score_ia', ascending=False).head(top_n) | |
| # --- PARTIE 2 : FORMATIONS (Gap Filling) --- | |
| df_form = pd.read_sql("SELECT * FROM formations", conn) | |
| form_vectors = self.model.encode(df_form['competence_cible'].tolist()) | |
| sim_form = cosine_similarity(user_interest_vec := self.model.encode([user['interet_majeur']]), form_vectors)[0] | |
| df_form['score_formation'] = sim_form | |
| top_formations = df_form.sort_values(by='score_formation', ascending=False).head(top_n) | |
| conn.close() | |
| return top_bourses, top_formations | |
| # --- EXÉCUTION DU SYSTÈME --- | |
| if __name__ == "__main__": | |
| # ICI : tu l'as appelé 'recommender' (anglais) | |
| recommender = EduRecommender() | |
| conn = sqlite3.connect("bourses_reco.db") | |
| test_user_id = pd.read_sql("SELECT user_id FROM etudiants LIMIT 1", conn).iloc[0]['user_id'] | |
| conn.close() | |
| # ERREUR ICI : Change 'recommander' en 'recommender' pour matcher l'objet ci-dessus | |
| bourses, formations = recommender.recommander_tout(test_user_id) | |
| print("\n🏆 TOP BOURSES TROUVÉES :") | |
| print(bourses[['institution', 'domaine_principal', 'score_ia']]) | |
| print("\n📚 FORMATIONS SUGGÉRÉES POUR VOTRE PROFIL :") | |
| print(formations[['titre', 'plateforme', 'score_formation']]) |