Ingestando noticias de mi propia web (Text Analytics basics ) — NLP Series parte 2 | por Carlos…

Ingestando noticias de mi propia web (Text Analytics basics ) — NLP Series parte 2 | por Carlos…

📢 📢 Let’s DIY (do it yourself):

De quiénes se ensucian las manos, ruedan en el barro, y se llenan de esa adrenalina de hacer las cosas tú mismo y no por un managed service de algún cloud provider. De quiénes pueden inventar sus propios métodos, sus propios principios y su propio camino. Yo te pregunto, ¿aún puedes seguir inventando si mezclas lo mejor de ambos mundos no?

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)

🧩 Primero lo primero: A ingestar con nuestras propias manos

Generaremos una ingesta de datos con información propia, tomada de mi blog https://cortez.cloud, para obtener categorías, títulos, y descripciones de los posts publicados.

Si estuviésemos en un MMORPG , nuestro guerrero aún estaría en Level 1:

Hagámoslo lo más simple posible pero no Simplón — Albert Einstein

y recordando dónde nos encontramos en nuestro viaje en este mundo:

🧩 ¿Que usaremos?

Beautiful Soap, una librería de Python que nos ayudará a extraer data de la web, lo que llamamos “Web Scraping”

Veamos paso a paso que es lo que estamos haciendo aquí,

  1. Importamos nuestras librerías que usaremos durante todos los ejemplos desde hoy en adelante:
import requests
from bs4 import BeautifulSoup
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
import os
  1. Definimos cuáles URLs vamos a usar:
cortezcloud_urls = ['https://www.cortez.cloud/categories/fundamentals',
             'https://www.cortez.cloud/categories/serverless',
             'https://www.cortez.cloud/categories/awsugperu']
  1. Inspeccionamos y entendamos las etiquetas que existen en la web:

En una de las URLS, https://www.cortez.cloud/categories/awsugperu

Los títulos están en un <div class=”blog-title”>, y esto es lo que tenemos que ir buscando

  1. Obtenemos palabras clave de las URLS como las categorías
cloud_category = url.split('/')[4]
  1. Ahora bajamos toda la info y parseamos todo el HTML con Beautiful Soap. Parsing es un método de programación que nos permite analizar el HTML, pero también diferentes tipos de archivos como json.
data = requests.get(url)
soup = BeautifulSoup(data.content, 'html.parser')
  1. Buscamos todo los divs que hemos ido encontrando para los títulos “headlines”, los blog posts “news_blog” y las categorías ya las tenemos .

news_blogs = [{'news_headline': headline.find('div', 
                                                         attrs={"class": "blog-title"}).string,
                          'news_blog': blog.find('div', 
                                                       attrs={"class": "preview-text"}).string,
                          'cloud_category': cloud_category}
  1. Creamos nuestro Data Frame y colocamos toda la data encontrada y segmentada en 3 columnas:

df =  pd.DataFrame(cortezcloud_data)
    df = df[['news_headline', 'news_blog', 'cloud_category']]
  1. Revisamos nuestra data recién salida del horno:

ultimos_posts = ingestar_noticias(cortezcloud_urls)
ultimos_posts.head(10)

🧩 Ejercicio completo de este tutorial:

El código completo es el siguiente y lo puedes encontrar en mi github en Colab para que puedan editarlo y usarlo:

jupyter notebook { "nbformat": 4, "nbformat_minor": 0, "metadata": { "colab": { "name": "Ingestando noticias de mi propia web.ipynb", "provenance": [], "authorship_tag": "ABX9TyPpymjo5tVL1p5qAm0AbRN5", "include_colab_link": true }, "kernelspec": { "name": "python3", "display_name": "Python 3" }, "language_info": { "name": "python" } }, "cells": [ { "cell_type": "markdown", "metadata": { "id": "view-in-github", "colab_type": "text" }, "source": [ "<a href=\"https://colab.research.google.com/gist/ccortezb/315c16d6a61208229e0db3ffd095affe/ingestando-noticias-de-mi-propia-web.ipynb\" target=\"_parent\"><img src=\"https://colab.research.google.com/assets/colab-badge.svg\" alt=\"Open In Colab\"/></a>" ] }, { "cell_type": "code", "metadata": { "id": "BBWvh-jVtn8J" }, "source": [ "import requests\n", "from bs4 import BeautifulSoup\n", "import pandas as pd\n", "import numpy as np\n", "import matplotlib.pyplot as plt\n", "import seaborn as sns\n", "import os\n", "%matplotlib inline\n", "\n", "cortezcloud_urls = ['https://www.cortez.cloud/categories/fundamentals',\n", " 'https://www.cortez.cloud/categories/serverless',\n", " 'https://www.cortez.cloud/categories/awsugperu']\n", "\n", "def ingestar_noticias(cortezcloud_urls):\n", " cortezcloud_data = []\n", " for url in cortezcloud_urls:\n", " cloud_category = url.split('/')[4]\n", " data = requests.get(url)\n", " soup = BeautifulSoup(data.content, 'html.parser')\n", " \n", " news_blogs = [{'news_headline': headline.find('div', \n", " attrs={\"class\": \"blog-title\"}).string,\n", " 'news_blog': blog.find('div', \n", " attrs={\"class\": \"preview-text\"}).string,\n", " 'cloud_category': cloud_category}\n", " \n", " for headline, blog in \n", " zip(soup.find_all('div', \n", " class_=[\"thumbnail-text\"]),\n", " soup.find_all('div', \n", " class_=[\"thumbnail-text\"]))\n", " ]\n", " cortezcloud_data.extend(news_blogs)\n", " \n", " df = pd.DataFrame(cortezcloud_data)\n", " df = df[['news_headline', 'news_blog', 'cloud_category']]\n", " return df\n" ], "execution_count": 1, "outputs": [] }, { "cell_type": "code", "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 162 }, "id": "ERIXIl2ewiwn", "outputId": "eb1495a0-7d4c-4671-b00f-c10b67558ebf" }, "source": [ "ultimos_posts = ingestar_noticias(cortezcloud_urls)\n", "ultimos_posts.head(10)" ], "execution_count": 2, "outputs": [ { "output_type": "execute_result", "data": { "text/html": [ "<div>\n", "<style scoped>\n", " .dataframe tbody tr th:only-of-type {\n", " vertical-align: middle;\n", " }\n", "\n", " .dataframe tbody tr th {\n", " vertical-align: top;\n", " }\n", "\n", " .dataframe thead th {\n", " text-align: right;\n", " }\n", "</style>\n", "<table border=\"1\" class=\"dataframe\">\n", " <thead>\n", " <tr style=\"text-align: right;\">\n", " <th></th>\n", " <th>news_headline</th>\n", " <th>news_blog</th>\n", " <th>cloud_category</th>\n", " </tr>\n", " </thead>\n", " <tbody>\n", " <tr>\n", " <th>0</th>\n", " <td>2 Trabajando con Amazon DocumentDB desde mi local</td>\n", " <td>Seguimos en las series de Docdb, esta vez, 2da...</td>\n", " <td>fundamentals</td>\n", " </tr>\n", " <tr>\n", " <th>1</th>\n", " <td>5 cosas que necesitas empezar a aprender para ...</td>\n", " <td>Aún no entiendes bien cómo empezar a migrar tu...</td>\n", " <td>fundamentals</td>\n", " </tr>\n", " <tr>\n", " <th>2</th>\n", " <td>Primeros pasos con Amazon DocumentDB y AWS CLI</td>\n", " <td>Estas serán unas series donde hablaremos de un...</td>\n", " <td>fundamentals</td>\n", " </tr>\n", " <tr>\n", " <th>3</th>\n", " <td>Cómo me convierto en un AWS Community Builder ...</td>\n", " <td>Empieza tu travesía para educar AWS en el Perú</td>\n", " <td>awsugperu</td>\n", " </tr>\n", " </tbody>\n", "</table>\n", "</div>" ], "text/plain": [ " news_headline ... cloud_category\n", "0 2 Trabajando con Amazon DocumentDB desde mi local ... fundamentals\n", "1 5 cosas que necesitas empezar a aprender para ... ... fundamentals\n", "2 Primeros pasos con Amazon DocumentDB y AWS CLI ... fundamentals\n", "3 Cómo me convierto en un AWS Community Builder ... ... awsugperu\n", "\n", "[4 rows x 3 columns]" ] }, "metadata": { "tags": [] }, "execution_count": 2 } ] } ] }

🧩 Casos de uso distintos y automatización

Pasémoslo a Funciones como Servicio usando AWS Lambda y empecemos a automatizar y crear nuestros propios pipelines de ingesta de datos.

Lo puedes replicar para hacer ingesta en Twitter o de cualquier otra red social y empezar a generar tus propios análisis.

Nosotros nos iremos por la rama de Procesamiento de lenguaje natural tanto con librerías open source como con Amazon Web Services

🧩 ¿Con qué continuamos?

Si en el próximo episodio, cambiamos de aires y nos vamos a Amazon Comprehend?

No se preocupen vamos paso a paso y alternando entre ambos caminos.

📢 📢 Spoiler alert:

Doble click a nuestro MMORPG , nuestro guerrero tiene la meta de llegar a level 5:

Siguiente post: (Al Aire el 05 de Abril)

Post Anterior: Empezando con nlp en AWS desde cero

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.