adsumMatching / app.py
Alexander CARNET
modifications de etiquettes pour l'experience passée
c6c3036
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)