Spaces:
Sleeping
Sleeping
| 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 | |
| def read_root(): | |
| """ | |
| Endpoint de prueba para confirmar que el servidor está activo. | |
| """ | |
| return {"message": "API funcionando correctamente. Usa /procesar_oferta/ para enviar datos."} | |
| 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 | |