Spaces:
Sleeping
Sleeping
| 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") | |
| 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} | |
| 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) |