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 | |