File size: 2,792 Bytes
84c40c4
f23fa4c
 
 
 
84c40c4
c6b30ed
84c40c4
f23fa4c
 
 
 
 
 
 
 
 
 
 
127e424
 
 
 
 
 
 
 
5175a15
f23fa4c
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
84c40c4
f23fa4c
 
 
 
 
 
 
 
 
 
 
 
 
 
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
import os
from fastapi import FastAPI
from pydantic import BaseModel
from transformers import pipeline

# Configurar la caché en un directorio accesible
os.environ["TRANSFORMERS_CACHE"] = "/tmp/huggingface"

# Inicializa la aplicación FastAPI
app = FastAPI()

# Modelo Hugging Face para NER
MODEL_NAME = "Davlan/bert-base-multilingual-cased-ner-hrl"  # Modelo para NER multilingüe
ner_pipeline = pipeline("ner", model=MODEL_NAME)

# Define el esquema de entrada
class JobOffer(BaseModel):
    texto: str

@app.get("/")
def read_root():
    """
    Endpoint de prueba para confirmar que el servidor está activo.
    """
    return {"message": "API funcionando correctamente. Usa /procesar_oferta/ para enviar datos."}


@app.post("/procesar_oferta")
async def procesar_oferta(oferta: JobOffer):
    """
    Procesa el texto de una oferta laboral y genera un JSON estructurado.
    """
    # Aplica el modelo para extraer entidades
    entities = ner_pipeline(oferta.texto)

    # Inicializa el resultado en formato JSON
    resultado = {
        "titulo": None,
        "empresa": None,
        "ubicacion": None,
        "salario": None,
        "expe_min": None,
        "tipo_contrato": None,
        "estudios_min": None,
        "skills": [],
        "descripcion": None,
    }

    # Procesa las entidades para rellenar las claves del JSON
    for entity in entities:
        palabra = entity['word']
        etiqueta = entity['entity']

        if etiqueta == "B-TITLE":
            resultado["titulo"] = palabra if not resultado["titulo"] else f"{resultado['titulo']} {palabra}"
        elif etiqueta == "B-ORG":
            resultado["empresa"] = palabra if not resultado["empresa"] else f"{resultado['empresa']} {palabra}"
        elif etiqueta == "B-LOC":
            resultado["ubicacion"] = palabra if not resultado["ubicacion"] else f"{resultado['ubicacion']} {palabra}"
        elif etiqueta == "B-SALARY":
            resultado["salario"] = palabra if not resultado["salario"] else f"{resultado['salario']} {palabra}"
        elif etiqueta == "B-EXP":
            resultado["expe_min"] = palabra if not resultado["expe_min"] else f"{resultado['expe_min']} {palabra}"
        elif etiqueta == "B-CONTRACT":
            resultado["tipo_contrato"] = palabra if not resultado["tipo_contrato"] else f"{resultado['tipo_contrato']} {palabra}"
        elif etiqueta == "B-STUDIES":
            resultado["estudios_min"] = palabra if not resultado["estudios_min"] else f"{resultado['estudios_min']} {palabra}"
        elif etiqueta == "B-SKILL":
            resultado["skills"].append(palabra)
        elif etiqueta == "B-DESCRIPTION":
            resultado["descripcion"] = palabra if not resultado["descripcion"] else f"{resultado['descripcion']} {palabra}"

    return resultado