Una guía paso a paso para construir una herramienta de búsqueda de tendencias con Python: raspado web, PNL (análisis de sentimientos y modelado de temas) y visualización de Word Cloud

Monitorear y extraer tendencias del contenido web se ha vuelto esencial para la investigación de mercado, la creación de contenido o mantenerse a la vanguardia en su campo. En este tutorial, proporcionamos una guía práctica para construir su herramienta de búsqueda de tendencias con Python. Sin necesidad de API externas o configuraciones complejas, aprenderá cómo raspar sitios web de acceso público, aplicar técnicas poderosas NLP (procesamiento del lenguaje natural) como el análisis de sentimientos y el modelado de temas, y visualizar tendencias emergentes utilizando nubes de palabras dinámicas.

import requests
from bs4 import BeautifulSoup


# List of URLs to scrape
urls = ["https://en.wikipedia.org/wiki/Natural_language_processing",
        "https://en.wikipedia.org/wiki/Machine_learning"]  


collected_texts = []  # to store text from each page


for url in urls:
    response = requests.get(url, headers={"User-Agent": "Mozilla/5.0"})
    if response.status_code == 200:
        soup = BeautifulSoup(response.text, 'html.parser')
        # Extract all paragraph text
        paragraphs = [p.get_text() for p in soup.find_all('p')]
        page_text = " ".join(paragraphs)
        collected_texts.append(page_text.strip())
    else:
        print(f"Failed to retrieve {url}")

Primero con el fragmento de código anterior, demostramos una forma directa de raspar datos textuales de sitios web de acceso público utilizando las solicitudes de Python y BeautifulSoup. Obtiene contenido de URL especificadas, extrae párrafos del HTML y los prepara para un análisis adicional de PNL combinando datos de texto en cadenas estructuradas.

import re
import nltk
nltk.download('stopwords')
from nltk.corpus import stopwords


stop_words = set(stopwords.words('english'))


cleaned_texts = []
for text in collected_texts:
    # Remove non-alphabetical characters and lower the text
    text = re.sub(r'[^A-Za-z\s]', ' ', text).lower()
    # Remove stopwords
    words = [w for w in text.split() if w not in stop_words]
    cleaned_texts.append(" ".join(words))

Luego, limpiamos el texto raspado convirtiéndolo en minúsculas, eliminando la puntuación y los caracteres especiales, y filtrando palabras de parada en inglés comunes usando NLTK. Este preprocesamiento garantiza que los datos de texto estén limpios, enfocados y listos para un análisis NLP significativo.

from collections import Counter


# Combine all texts into one if analyzing overall trends:
all_text = " ".join(cleaned_texts)
word_counts = Counter(all_text.split())
common_words = word_counts.most_common(10)  # top 10 frequent words
print("Top 10 keywords:", common_words)

Ahora, calculamos las frecuencias de palabras a partir de los datos textuales limpios, identificando las 10 palabras clave más frecuentes. Esto ayuda a resaltar las tendencias dominantes y los temas recurrentes en los documentos recopilados, proporcionando información inmediata sobre temas populares o significativos dentro del contenido raspado.

!pip install textblob
from textblob import TextBlob


for i, text in enumerate(cleaned_texts, 1):
    polarity = TextBlob(text).sentiment.polarity
    if polarity > 0.1:
        sentiment = "Positive 😀"
    elif polarity < -0.1:
        sentiment = "Negative 🙁"
    else:
        sentiment = "Neutral 😐"
    print(f"Document {i} Sentiment: {sentiment} (polarity={polarity:.2f})")

Realizamos un análisis de sentimientos en cada documento de texto limpio usando TextBlob, una biblioteca de Python construida sobre NLTK. Evalúa el tono emocional general de cada documento, positivo, negativo o neutral, e imprime el sentimiento junto con una puntuación de polaridad numérica, proporcionando una indicación rápida del estado de ánimo o actitud general dentro de los datos de texto.

from sklearn.feature_extraction.text import CountVectorizer
from sklearn.decomposition import LatentDirichletAllocation


# Adjust these parameters
vectorizer = CountVectorizer(max_df=1.0, min_df=1, stop_words="english")
doc_term_matrix = vectorizer.fit_transform(cleaned_texts)


# Fit LDA to find topics (for instance, 3 topics)
lda = LatentDirichletAllocation(n_components=3, random_state=42)
lda.fit(doc_term_matrix)


feature_names = vectorizer.get_feature_names_out()


for idx, topic in enumerate(lda.components_):
    print(f"Topic {idx + 1}: ", [vectorizer.get_feature_names_out()[i] for i in topic.argsort()[:-11:-1]])

Luego, aplicamos la Asignación de Dirichlet latente (LDA), un algoritmo de modelado de temas popular, para descubrir temas subyacentes en el corpus de texto. Primero transforma los textos limpios en una matriz numérica a plazo de documentos utilizando el Condevectorizador de Scikit-Learn, luego se adapta a un modelo LDA para identificar los temas primarios. La salida enumera las principales palabras clave para cada tema descubierto, resumiendo concisas conceptos clave en los datos recopilados.

# Assuming you have your text data stored in combined_text
from wordcloud import WordCloud
import matplotlib.pyplot as plt
import nltk
from nltk.corpus import stopwords
import re


nltk.download('stopwords')
stop_words = set(stopwords.words('english'))


# Preprocess and clean the text:
cleaned_texts = []
for text in collected_texts:
    text = re.sub(r'[^A-Za-z\s]', ' ', text).lower()
    words = [w for w in text.split() if w not in stop_words]
    cleaned_texts.append(" ".join(words))


# Generate combined text
combined_text = " ".join(cleaned_texts)


# Generate the word cloud
wordcloud = WordCloud(width=800, height=400, background_color="white", colormap='viridis').generate(combined_text)


# Display the word cloud
plt.figure(figsize=(10, 6))  # <-- corrected numeric dimensions
plt.imshow(wordcloud, interpolation='bilinear')
plt.axis('off')
plt.title("Word Cloud of Scraped Text", fontsize=16)
plt.show()

Finalmente, generamos una visualización de Word Cloud que muestra palabras clave prominentes a partir de los datos de texto combinados y limpios. Al enfatizar visualmente los términos más frecuentes y relevantes, este enfoque permite la exploración intuitiva de las principales tendencias y temas en el contenido web recopilado.

Salida de nubes de palabras del sitio raspado

En conclusión, hemos construido con éxito una herramienta robusta e interactiva de búsqueda de tendencias. Este ejercicio lo equipó con experiencia práctica en raspado web, análisis de PNL, modelado de temas y visualizaciones intuitivas utilizando nubes de palabras. Con este enfoque poderoso pero directo, puede rastrear continuamente las tendencias de la industria, obtener información valiosa del contenido social y de blog, y tomar decisiones informadas basadas en datos en tiempo real.


Aquí está el Cuaderno de colab. Además, no olvides seguirnos Gorjeo y únete a nuestro Canal de telegrama y LinkedIn GRsalpicar. No olvides unirte a nuestro Subreddit de 80k+ ml.

🚨 Conozca a Parlant: un marco de IA conversacional LLM de LLM diseñado para proporcionar a los desarrolladores el control y la precisión que necesitan sobre sus agentes de servicio al cliente de IA, utilizando pautas de comportamiento y supervisión de tiempo de ejecución. 🔧a 🎛️ Se funciona utilizando una CLI fácil de usar 📟 y SDK de clientes nativos en Python y TypeScript 📦.


Asif Razzaq es el CEO de MarktechPost Media Inc .. Como empresario e ingeniero visionario, ASIF se compromete a aprovechar el potencial de la inteligencia artificial para el bien social. Su esfuerzo más reciente es el lanzamiento de una plataforma de medios de inteligencia artificial, MarktechPost, que se destaca por su cobertura profunda de noticias de aprendizaje automático y de aprendizaje profundo que es técnicamente sólido y fácilmente comprensible por una audiencia amplia. La plataforma cuenta con más de 2 millones de vistas mensuales, ilustrando su popularidad entre el público.