Spaces:
Running
Running
File size: 3,190 Bytes
76ff603 15268e6 3a4bca3 15268e6 3a4bca3 15268e6 76ff603 a2715b3 76ff603 a90d223 3a4bca3 e97c50d 3a4bca3 a2715b3 01ef9ea a2715b3 c9f0096 15268e6 a2715b3 3a4bca3 a90d223 3a4bca3 5c168fa c6c3036 5c168fa 3a4bca3 5c168fa a2715b3 5c168fa a2715b3 5c168fa a2715b3 3a4bca3 a2715b3 3a4bca3 a2715b3 3a4bca3 3224af5 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 | 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) |