24 septiembre, 2026

GENERAR NUBE DE PALABRAS CON AZURE FUNCTIONS EN POWER APPS

Hola a todos!

Hoy toca un poco de Azure Functions pero para generar una nube de palabras en Power Apps. El objetivo es generar la nube de palabras del contenido de las opiniones de 20 empleados que han cargado en una lista de SharePoint de la empresa:

Pues bien, ahora que tenemos nuestra lista de SP ya podemos ir a nuestro editor de Python, en este caso es VSC y vamos a utilizar este código:

import azure.functions as func
import logging
import json
import base64
from io import BytesIO
from wordcloud import WordCloud

STOPWORDS_ES = set([
    # Artículos y determinantes
    "un", "una", "unas", "unos", "uno", "sobre", "todo", "también", "tras",
    "otro", "algún", "alguno", "alguna", "algunos", "algunas", "ser", "es",
    "soy", "eres", "somos", "sois", "estoy", "esta", "estamos", "estais",
    "estan", "como", "en", "para", "atras", "porque", "por qué", "estado",
    "estaba", "ante", "antes", "siendo", "ambos", "pero", "por", "poder",
    "puede", "podria", "pueden", "puedo", "podríamos", "mientras", "sin",
    "sobre", "también", "tras", "otro", "otros", "otras", "al", "del", "la",
    "las", "lo", "los", "de", "el", "que", "se", "y", "a", "o", "u", "e", "ni",

    # Pronombres
    "yo", "tú", "usted", "él", "ella", "ello", "nosotros", "nosotras",
    "vosotros", "vosotras", "ellos", "ellas", "me", "te", "se", "nos", "os",
    "mi", "mis", "tu", "tus", "su", "sus", "nuestro", "nuestra", "vuestro",
    "vuestra", "éstos", "éstas", "esto", "estos", "estas", "ese", "esa",
    "esos", "esas", "aquel", "aquella", "aquellos", "aquellas", "quien",
    "quienes", "cual", "cuales", "cuyo", "cuya", "cuyos", "cuyas",

    # Verbos auxiliares y genéricos
    "haber", "ha", "han", "he", "hemos", "haya", "había", "hubo", "hube",
    "fue", "fueron", "era", "eran", "sería", "serían", "está", "están",
    "estuve", "estuvo", "estuvimos", "estuvieron", "estar", "tenido",
    "tenía", "tenido", "tiene", "tenemos", "tienen", "tuvo", "tener",
    "hacer", "hacía", "hace", "hacen", "hizo", "hecho", "decir", "dicho",
    "debe", "deben", "debemos", "dar", "dado", "ver", "visto", "ir", "ido",
    "venir", "viene", "venimos", "puede", "pueden", "podría", "quiere",
    "querer", "sabemos", "saber", "trabaja", "trabajar", "hablar", "siento",
    "creo", "son",

    # Conectores y adverbios neutros
    "entonces", "pues", "aunque", "además", "así", "aquí", "allí", "ahora",
    "después", "antes", "hoy", "ayer", "mañana", "nunca", "siempre", "ya",
    "ya que", "entonces", "pues", "tan", "tanto", "como", "donde", "cuando",
    "mientras", "sin embargo", "por tanto", "por eso", "por lo tanto", "de ahí",
    "cada", "todo", "toda", "todos", "todas", "algo", "nada", "mucho", "mucha",
    "muchos", "muchas", "poco", "poca", "pocos", "pocas", "demasiado",
    "bastante", "algún", "ningún", "ninguna", "varios", "varias",
    "ciertos", "ciertas", "respecto", "mismo", "misma", "mismos", "mismas",
    "inclusive", "quizás", "tal", "casi", "aproximadamente", "etc", "etcétera",
    "según", "en cuanto", "igual", "cerca", "lejos",
    "hay", "con", "más", "muy", "no", "entre", "desde", "eso",

    # Neutros de contexto empresarial (poco informativos)
    "empresa", "trabajo", "laboral", "oficina", "puesto", "área", "departamento",
    "departamentos", "organización", "cargo", "personal", "compañero", 
    "compañeros", "colaborativo", "colaboración", "grupo", "dirección", 
    "superior", "empleado", "empleados", "reunión", "reuniones", "equipo", 
    "jefe", "liderazgo", "gerente", "coordinador", "miembro", "entorno", 
    "ambiente", "clima", "áreas", "personas", "nuestras",

    # Palabras redundantes y expresiones genéricas
    "últimamente", "actualmente", "general", "genera", "forma", "nivel",
    "modo", "tipo", "caso", "situación", "momento", "parte", "veces",
    "último", "últimos", "última", "últimas", "época", "épocas", "tiempo",
    "días", "años", "meses", "día", "año", "mes", "hora", "horas", "minutos",
    "segundos", "espacio", "espacios", "aspecto", "aspectos", "contexto",
    "problema", "problemas", "cosa", "cosas", "tema", "temas", "asunto",
    "asuntos", "manera", "forma", "motivo", "motivos", "motivo", "motivos",

    # Extras detectadas visualmente en la nube
    "mejor", "extra", "bueno", "buen", "excelente", "positivo", "buena",
    "mejora", "mejorado"
])

def main(req: func.HttpRequest) -> func.HttpResponse:
    logging.info(" Función de nube de palabras iniciada.")

    try:
        req_body = req.get_json()
        texto = req_body.get("texto")

        if not texto:
            return func.HttpResponse(
                "El campo 'texto' es obligatorio.",
                status_code=400
            )

        # Generar la nube de palabras
        wc = WordCloud(
            width=800,
            height=400,
            background_color="white",
            stopwords=STOPWORDS_ES,
            colormap="plasma"
        ).generate(texto)

        # Convertir la imagen a base64
        buffer = BytesIO()
        wc.to_image().save(buffer, format="PNG")
        imagen_b64 = base64.b64encode(buffer.getvalue()).decode("utf-8")

        resultado = {"imagen": imagen_b64}
        logging.info(" Nube de palabras generada correctamente.")

        return func.HttpResponse(
            json.dumps(resultado),
            mimetype="application/json",
            status_code=200
        )

    except Exception as e:
        logging.error(f" Error interno: {str(e)}")
        return func.HttpResponse(f"Error interno: {str(e)}", status_code=500)

Una vez que tenemos la función que vamos a utilizar, la debemos incluir en nuestro modelo de Azure, este caso esta función está incluida con otras 3 funciones que también utilizo:

Además de copiarla en el init, debéis crear la estructura de carpetas en la raíz del proyecto o utilizar una función en VSC:

func new --name miFuncionNubePalabras --template "HTTP trigger" --authlevel "function"

y se generará la carpeta de la función:

Y por último, y dado que lo vamos a utilizar en Power Apps a través de Automate, vamos a desplegar la función en Azure:

Una vez que la tenemos desplegada en Azure, ya podemos obtener una URI y la clave de función, que será necesaria para nuestro flujo de Automate.

Llegados a este punto, vamos a crear una apps sencillísima. En un lienzo en blanco incluimos un botón y un control de imagen, y en el botón:

El código:

Set(
    resultado;
    GenerarNubeClima.Run()
);;
Set(
    ImagenNube;
    "data:image/png;base64," & resultado.imagen
)

Y ahora vamos a generar el flujo para que se ejecute desde el botón:

Y esto es:

En seleccionar lo obtendréis con el contenido dinámico, pero en Redactar debéis utilizar una expresión:

join(body('Seleccionar'), ' ')

Y seguimos:

El Cuerpo del HTTP que se pega directamente (no expresión):

{
  "texto": "@{outputs('Redactar')}"
}

Y la respuesta como expresión:

body('HTTP')?['imagen']

Y con esto, si pulsamos veremos esto en el control de imagen de nuestra App:

Comparte este post

Este sitio web utiliza cookies para que usted tenga la mejor experiencia de usuario. Si continúa navegando está dando su consentimiento para la aceptación de las mencionadas cookies y la aceptación de nuestra política de cookies, pinche el enlace para mayor información.plugin cookies

ACEPTAR
Aviso de cookies