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)