Crear un API rest de Análisis de sentimiento con SAM y Amazon Comprehend | NLP Series parte 3

Carlos E. Cortez Bazan
8 min readApr 8, 2021
Fuente: Imagen creada por Carlos Cortez, AWS Warrior Level 4

📢 Leveleando nuestro guerrero 3 niveles hoy!

Soy Carlos Cortez y bienvenidos a la tercera entrega de estas series, pero, ¿qué me estás contando? Vamos a por 3 niveles más!, hoy aprenderemos las bases de Comprehend y de cómo analizar sentimientos, así como extraer las entidades de los textos, usando un modelo pre entrenado de Amazon Comprehend.

Al mismo tiempo, hago Referencia a unas series en paralelo sobre Serverless, llamadas: Away from Servers, porque hoy también repasamos API rest en AWS y codificaremos una plantilla de AWS SAM, el marco de trabajo de amazon web services para gestionar la configuración de nuestras aplicaciones sin servidor.

Además de estos 4 servicios, aprenderemos más sobre boto3, y Python.

Fuente: Imagen creada por Carlos Cortez, NLP Series parte 3

🧩 Pasar a level 2 es tarea sencilla

Puedes elegir entre, desarrollar el nivel 2, nivel 3 o nivel 4 que veremos más abajo en este episodio, en los 3 lograrás el mismo resultado, que es aprender sobre Amazon Comprehend.

OJO: Siempre es necesario un rol, un permiso, una política cuando creamos un Lambda, en este caso estaremos usando Full Access para Comprehend en IAM.

El nivel 2, trata principalmente de crear una función lambda en la consola de AWS directamente y conectarla con Amazon Comprehend, luego definir un evento de prueba con un JSON y empezar a jugar.

Fuente: Imagen creada por Carlos Cortez, AWS Warrior Level 2

Usemos esta función para darle vida a nuestro Lambda,

Explicación:

  1. LÍNEA 12 extraemos el JSON del evento
  2. LÍNEA 20, detectamos el sentimiento sea positivo negativo o neutral
  3. LÍNEA 28: extraemos las entidades detectadas definidas por AWS

Las pruebas aquí son más sencillas, usando la IDE de Cloud9 en Lambda directo en la consola:

Y agregar el evento, es muy rápido, en el level 3 y 4 verán maneras más óptimas de realizar esta prueba. Pueden pasar directo allá.

🧩 Si pasaste el nivel 2, ahora en nivel 3 completamos el Backend

Al adicionar la capa de API rest vamos a darle más cuerpo a nuestra solución. Además como arquitectos de soluciones que somos o queremos ser, tenemos que construir aplicaciones resilientes, escalables y altamente disponibles. Para ello implementamos una capa de API que nos permita escalar. Más adelante nos servirá para agregar seguridad como Cognito, CORS, Caché, custom headers.

Fuente: Imagen creada por Carlos Cortez, AWS Warrior Level 3

No vamos a detallar esta etapa, porque será mucho más genial en nivel 4, pero sí mencionar que probar con API Gateway es mucho más eficiente desde un terminal o una aplicación como Postman. (https://www.postman.com/)

🧩 Nivel 4: ¡Evolucionando a SAM!

Llegó la hora, dejen de ver y pongámonos a trabajar aquí, que esta es la parte más interesante.

Los marcos de trabajo para aplicaciones sin servidor, están tomando un lugar más frecuente en el desarrollo de servicios, AWS SAM llegó algo tarde, y es la opción nativa dentro de los servicios de Amazon Web Services que compite con grandes como Serverless Framework, Chalice, Amplify, pulumi, etc.

No se preocupen, en las series dedicadas a Serverless, nos pelearemos con otros frameworks y veremos qué tan divertido es usarlos! Ahora, me enfocaré en subir a mi nivel 4!

Fuente: Imagen creada por Carlos Cortez, AWS Warrior Level 4

Cada vez que hago un cambio, se construye toda mi aplicación desde cero. Invierto menos tiempo configurando la consola, que no debería tocarla ni verla más, y me dedico a mejorar el código e integrarlo con más servicios.

🧩 Actualizar sam-cli

Puedes usar una versión más actual si lo prefieres, en este caso:

crear ambiente virtual de python 3.6, (yo tengo múltiples versiones)

Iniciamos un template vacío de SAM para Python 3.6

➜ comprehend-nlp01 source nlp01/bin/activate(nlp01) ➜ comprehend-nlp01 python — versionPython 3.6.5

🧩 Inicializamos SAM

(nlp01) ➜ comprehend-nlp01 sam init

Elegimos un template por default:

Which template source would you like to use?1 — AWS Quick Start Templates2 — Custom Template LocationChoice: 1Which runtime would you like to use?1 — nodejs12.x2 — python3.83 — ruby2.74 — go1.x5 — java116 — dotnetcore3.17 — nodejs10.x8 — python3.79 — python3.610 — python2.711 — ruby2.512 — java813 — dotnetcore2.114 — dotnetcore2.015 — dotnetcore1.0Runtime: 9Project name [sam-app]: comprehend-01-nlpseries-ep-3Cloning app templates from https://github.com/awslabs/aws-sam-cli-app-templates.gitAWS quick start application templates:1 — Hello World Example2 — EventBridge Hello World3 — EventBridge App from scratch (100+ Event Schemas)4 — Step Functions Sample App (Stock Trader)Template selection: 1 — — — — — — — — — — — -Generating application: — — — — — — — — — — — -Name: comprehend-01-nlpseries-ep-3Runtime: python3.6Dependency Manager: pipApplication Template: hello-worldOutput Directory: .Next steps can be found in the README file at ./comprehend-01-nlpseries-ep-3/README.md

Errores de compatibilidad a la hora de crear los templates

Error: Permission denied @ apply2files — /usr/local/lib/node_modules/@aws-amplify/cli/node_modules/extglob/lib/.DS_Store

No debemos darle permisos a todo, salvo lo necesario

Solución:

sudo chown -R ${LOGNAME}:staff /usr/local/lib/node_modules

Aquí vamos a modificar varios archivos,

App.py es el archivo principal, que será el Lambda que usamos, el mismo del nivel 2 y 3!

Luego, el template.yaml que es dónde se definirá la estructura de nuestra aplicación serverless con API Gateway y Lambda.

Puedes ir al archivo del repo aquí:

En este template, creamos el API, los recursos y los métodos, en este caso necesitamos hacer un POST a /sentiment que hará un proxy directo a nuestro Lambda para luego comunicarse con Comprehend

Events:

HttpPost:   Type: Api      Properties:         Path: ‘/sentiment’         Method: post

🧩 SAM Build:

Ejecutar lo siguiente:

(nlp01) ➜ comprehend-01-nlpseries-ep-3 sudo sam build

Resultado:

Building resource ‘Comprehend01nlpseriesep3Function’Running PythonPipBuilder:ResolveDependenciesRunning PythonPipBuilder:CopySourceBuild SucceededBuilt Artifacts : .aws-sam/buildBuilt Template : .aws-sam/build/template.yamlCommands you can use next=========================[*] Invoke Function: sam local invoke[*] Deploy: sam deploy — guided

🧩 SAM Deploy:

Haremos el Deploy directo desde la consola, para ejecutar nuestro Stack de CloudFormation de manera programática

Una vez esté 100% desplegado, si nos fijamos en los Outputs, tendremos todos los valores necesarios para empezar a testar.

CloudFormation outputs from deployed stack — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — Outputs — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — Key ComprehendApiDescription API Gateway endpoint URL for Prod stage for your functionValue https://{api}.execute-api.ca-central-1.amazonaws.com/Prod/sentiment/Key Comprehend01nlpseriesep3FunctionIamRoleDescription Implicit IAM Role created for comprehend_01_nlpseries_ep_3 functionValue arn:aws:iam::cuenta_aws:role/comprehend-01-nlp-03-Comprehend01nlpseriesep3Funct-1363JG49IXNQGKey Comprehend01nlpseriesep3FunctionDescription comprehend_01_nlpseries_ep_3 Function ARNValue arn:aws:lambda:ca-central-1:cuenta_aws:function:comprehend-01-nlp-03-Comprehend01nlpseriesep3Funct-BFO9E0QBGG47

🧩 Pruebas con API rest:

Vamos a probar con un simple request nuestra nueva API vía CuRL:

{“body”: “Hola a todos, estamos aprendiendo cómo usar servicios de inteligencia artificial en AWS para el entendimiento del lenguaje natural así que pongamos mucha atención”}

llamada a curl

y por qué no también por Postman, más interactivo:

Imagen: request desde Postman

Otro ejemplo:

{
“body”: “Me encanta aprender cosas nuevas, más aún si es sobre Ai o ML, la verdad es un tema muy interesante y lo explicas de manera entretenida”
}

Resultado a prueba de análisis de sentimiento

‘Sentiment’: ‘POSITIVE’, ‘SentimentScore’: {‘Positive’: 0.9948458671569824, ‘Negative’: 9.346976730739698e-05, ‘Neutral’

Mientras más se acerca a 1, la probabilidad de que sea positivo es mayor. así como mientras más se acerca a 0, la probabilidad de que NO lo sea, es casi nula.

Probemos de nuevo cambiando algunos términos, porque no obtuvimos ningún ENTITY reconocido por el API de Amazon Comprehend usando el lenguaje ‘es’, así que veamos:

{
“body”: “Hola, Soy Carlos y me encanta aprender lenguajes nuevos en internet, más aún si es sobre AI o ML, la verdad es un tema muy interesante y lo explicas de manera entretenida en tu web. visitalo en cortez.cloud a las 8pm de lunes a domingo y en youtube también. ¡ya tiene más de 30 suscriptores! que bueno”
}

Resultado a prueba para extracción de entidades:

[‘Carlos’, ‘AI’, ‘ML’, ‘8pm’, ‘lunes’, ‘domingo’, ‘youtube’, ’30 suscriptores’]
[‘PERSON’, ‘OTHER’, ‘OTHER’, ‘DATE’, ‘DATE’, ‘DATE’, ‘TITLE’, ‘QUANTITY’]

🧩 Conclusión

Estamos en la punta del iceberg, recién entendiendo NLP usando servicios auto administrados, lo cual nos da resultados aceptables y discutibles. Pero espera!Recién estamos empezando con Comprehend, y además también vamos a aprender librerías propias open source para poder compararlo y llevarlo a AWS Sagemaker luego. Eso ya suena como level 10 o 15 no? Vamos con calma y a paso seguro.

¡Estamos en la nube podemos romperlo todo y no pasa nada. (en desarrollo…)

Puedes revisar todo el código aquí en mi github:

Siguiente post: (Al Aire el 12 de Abril)

Parte 2: https://ccortezb.medium.com/ingestando-noticias-de-mi-propia-web-text-analytics-basics-nlp-series-parte-2-por-carlos-7899bedd0995

Parte 1: https://ccortezb.medium.com/empezando-con-nlp-en-aws-desde-cero-nlp-series-parte-1-por-carlos-cortez-breaking-the-cloud-13da2adc0151

Si te gustó este post, dale un like, comparte y comenta.

Estas series son parte de una nueva sección llamada AI for Mortals, donde me incluyo con ustedes para enseñarles lo que voy aprendiendo.

Visitar AI for Mortals: (https://aiformortals.cortez.cloud)

☢ Rompiendo se aprende

Suscríbete a mi canal, Breaking the Cloud y Al día con AWS en https://cortez.cloud

⭐Suscríbete a mi canal : http://bit.ly/aldiaconaws

videos, noticas de AWS, análisis, demos, workshops

🔥🔥 Sígueme en mis redes 🔥🔥

follow <- me()

🦜 Mi Twitter: https://twitter.com/ccortezb

📺 Youtube Channel: http://bit.ly/aldiaconaws

📺 AWSUGPerú: https://www.youtube.com/awsusergroupperuoficial

📟 Mi Facebook: https://www.facebook.com/ccortezb/

🤳 Mi Instagram: ccortezbazan

📜 Mis cursos de AWS: https://cennticloud.thinkific.com

🕮 Mi blog — cortez.cloud

Muchas gracias, espero nos volvamos a ver

🔥🔥 Acerca de mí 🔥🔥

Cortez.Cloud/whoami

Les presento mi pequeña web personal https://www.Cortez.Cloud llamado “Breaking the Cloud”.

Seguiré creando contenido cada semana de AWS sobre Al/ML, Serverless, Security y como romper las reglas!

También mis próximas iniciativas, talleres, cursos, videos gratuitos, awsugperu y más.

--

--

Carlos E. Cortez Bazan

AWS UG Leader Perú / AWS ML Community Builder / Senior Cloud Architect