from fastapi import FastAPI from sentence_transformers import SentenceTransformer from gliner import GLiNER from pydantic import BaseModel from typing import List import uvicorn print("Démarrage de l'application...") app = FastAPI() class TextRequest(BaseModel): text: str class TextRequestAvecEtiquettes(BaseModel): text: str etiquettes: List[str] # Chargement de SBERT print("Chargement de SBERT...") modele_sbert = SentenceTransformer('paraphrase-multilingual-mpnet-base-v2') #modele_sbert = SentenceTransformer('alex246879/sbert-professionnel-2026') print("SBERT chargé avec succès") print("Chargement de GLiNER...") modele_gliner = GLiNER.from_pretrained("urchade/gliner_multi_pii-v1") print("GLiNER chargé avec succès") @app.post("/vecteur") def creat_vector(data: TextRequest): print(f"Requête /vecteur reçue : {data.text}") vecteur = modele_sbert.encode(data.text).tolist() print(f"Taille vecteur envoyé : {len(vecteur)}") return {"vecteur": vecteur} SYNONYMES_ETIQUETTES: dict[str, List[str]] = { "role": ["job title", "professional role", "occupation", "position"], "skills": ["skill", "competency", "expertise", "ability", "professional knowledge", "technique"], "experience_passée": ["past employer", "former company", "duration of experience", "years of experience"], "company_type": ["company type", "industry", "sector", "type of organization"], } def extraire_entites(text: str, etiquettes: List[str]) -> dict[str, List[str]]: groupes: dict[str, List[str]] = {label: [] for label in etiquettes} deja_vus: set[str] = set() for label in etiquettes: synonymes = SYNONYMES_ETIQUETTES.get(label, [label]) entites = modele_gliner.predict_entities(text, synonymes) for entite in entites: val = entite["text"].strip() if val.lower() not in deja_vus: groupes[label].append(val) deja_vus.add(val.lower()) return {k: v for k, v in groupes.items() if v} @app.post("/vecteurs") def creat_vectors(data: TextRequestAvecEtiquettes): text = data.text.strip() if text and text[-1] not in ".!?": text += "." print(f"Requête /vecteurs reçue : {text}") print(f"Étiquettes demandées : {data.etiquettes}") # Extraction des entités par étiquette via GLiNER (un appel par étiquette avec ses synonymes) print("Extraction des entités via GLiNER...") entites_par_etiquette = extraire_entites(text, data.etiquettes) print(f"Regroupement par étiquette : {entites_par_etiquette}") # Génération d'un vecteur SBERT par étiquette resultat = {} for label, textes in entites_par_etiquette.items(): print(f"Encodage SBERT pour '{label}' : {textes}") vecteur = modele_sbert.encode(" ".join(textes)).tolist() resultat[label] = vecteur print(f"Étiquette '{label}' : {len(textes)} entité(s), taille vecteur : {len(vecteur)}") print("Résultat prêt, envoi de la réponse") return resultat if __name__ == "__main__": # Hugging Face utilise le port 7860 par défaut uvicorn.run(app, host="0.0.0.0", port=7860)