desc_cleaner / app.py
joseluis12's picture
Update app.py
5175a15 verified
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