Capítulo 12: Proyecto: Agregador de Noticias
12.2 Recolección y Preprocesamiento de Datos
La recolección y el preprocesamiento de datos son pasos cruciales y fundamentales para construir un chatbot agregador de noticias altamente eficiente y confiable. La calidad de los datos recolectados y cómo se procesan impactan directamente en el rendimiento, la precisión y la confiabilidad general del chatbot.
En esta sección, profundizaremos en las complejidades de cómo recolectar artículos de noticias de una variedad de fuentes confiables y preprocesarlos meticulosamente para asegurar que sean adecuados para las tareas de categorización y resumen.
Este proceso implica no solo recopilar una variedad de artículos, sino también limpiar, organizar y estructurar los datos para mejorar la capacidad del chatbot de proporcionar resultados precisos y significativos a los usuarios.
12.2.1 Recolección de Datos
Para construir un agregador de noticias completo, necesitamos recolectar artículos de noticias de múltiples fuentes confiables. Utilizaremos las API proporcionadas por organizaciones de noticias y agregadores para obtener los últimos artículos. Una opción popular es NewsAPI, que agrega noticias de varias fuentes y proporciona una interfaz simple para acceder a ellas.
Configuración de NewsAPI
Primero, regístrate para obtener una clave de API en NewsAPI. Esta clave se utilizará para autenticar nuestras solicitudes.
news_sources.json:
{
"sources": [
{"name": "BBC News", "url": "<https://newsapi.org/v2/top-headlines?sources=bbc-news&apiKey=your_newsapi_api_key>"},
{"name": "CNN", "url": "<https://newsapi.org/v2/top-headlines?sources=cnn&apiKey=your_newsapi_api_key>"},
{"name": "TechCrunch", "url": "<https://newsapi.org/v2/top-headlines?sources=techcrunch&apiKey=your_newsapi_api_key>"},
{"name": "The Verge", "url": "<https://newsapi.org/v2/top-headlines?sources=the-verge&apiKey=your_newsapi_api_key>"}
]
}
Este archivo contiene una lista de fuentes de noticias junto con sus endpoints de API correspondientes. Reemplaza your_newsapi_api_key
con la clave de API que obtuviste de NewsAPI.
Si deseas una comprensión más profunda sobre cómo manejar archivos JSON, te recomendamos leer esta publicación de blog: https://www.cuantum.tech/post/mastering-json-creating-handling-and-working-with-json-files
Obteniendo Artículos de Noticias
Crearemos un script para obtener artículos de noticias de estas fuentes y almacenarlos en un archivo JSON.
news_fetcher.py:
import json
import requests
# Load news sources
with open('data/news_sources.json', 'r') as file:
news_sources = json.load(file)["sources"]
def fetch_news():
articles = []
for source in news_sources:
response = requests.get(source["url"])
if response.status_code == 200:
news_data = response.json()
for article in news_data["articles"]:
articles.append({
"source": source["name"],
"title": article["title"],
"description": article["description"],
"content": article["content"],
"url": article["url"],
"publishedAt": article["publishedAt"]
})
else:
print(f"Failed to fetch news from {source['name']}")
# Save articles to file
with open('data/articles.json', 'w') as file:
json.dump(articles, file, indent=4)
# Fetch news articles
fetch_news()
Este script obtiene artículos de noticias de varias fuentes listadas en un archivo JSON y guarda los artículos recopilados en otro archivo JSON. Utiliza la biblioteca requests
para obtener datos de cada URL de fuente de noticias y procesa la respuesta si es exitosa.
El script extrae detalles como el nombre de la fuente, el título del artículo, la descripción, el contenido, la URL y la fecha de publicación de cada artículo y los almacena en una lista. Esta lista se guarda luego en un archivo llamado articles.json
.
12.2.2 Preprocesamiento de Datos
El preprocesamiento es esencial para convertir artículos de noticias en bruto en un formato adecuado para la categorización y el resumen. La tubería de preprocesamiento incluye normalización de texto, tokenización, eliminación de palabras vacías, lematización y vectorización.
Normalización de Texto y Tokenización
La normalización de texto implica convertir el texto a minúsculas y eliminar la puntuación. La tokenización es el proceso de dividir el texto en palabras o tokens individuales.
Eliminación de Palabras Vacías
Las palabras vacías son palabras comunes que no contribuyen significativamente al significado del texto. Eliminarlas ayuda a enfocarse en las palabras importantes.
Lematización
La lematización reduce las palabras a su forma base o raíz, asegurando que diferentes formas de una palabra se traten como la misma.
Vectorización
La vectorización convierte el texto en representaciones numéricas, que se utilizan como entrada para modelos de aprendizaje automático. Usaremos el vectorizador TF-IDF para este propósito.
Implementación del Preprocesamiento
Implementemos los pasos de preprocesamiento en Python.
nlp_engine.py:
import json
import nltk
from nltk.corpus import stopwords
from nltk.stem import WordNetLemmatizer
from sklearn.feature_extraction.text import TfidfVectorizer
import string
import pickle
# Download NLTK resources
nltk.download('punkt')
nltk.download('stopwords')
nltk.download('wordnet')
# Initialize lemmatizer
lemmatizer = WordNetLemmatizer()
# Define preprocessing function
def preprocess_text(text):
# Convert text to lowercase
text = text.lower()
# Tokenize text
tokens = nltk.word_tokenize(text)
# Remove punctuation and stop words
tokens = [word for word in tokens if word not in string.punctuation and word not in stopwords.words('english')]
# Lemmatize tokens
tokens = [lemmatizer.lemmatize(word) for word in tokens]
return ' '.join(tokens)
# Load news articles
with open('data/articles.json', 'r') as file:
articles = json.load(file)
# Preprocess articles
preprocessed_articles = []
for article in articles:
content = article["content"] if article["content"] else article["description"]
preprocessed_content = preprocess_text(content)
preprocessed_articles.append({
"source": article["source"],
"title": article["title"],
"content": preprocessed_content,
"url": article["url"],
"publishedAt": article["publishedAt"]
})
# Save preprocessed articles to file
with open('data/preprocessed_articles.json', 'w') as file:
json.dump(preprocessed_articles, file, indent=4)
# Vectorize the preprocessed content
vectorizer = TfidfVectorizer()
contents = [article["content"] for article in preprocessed_articles]
X = vectorizer.fit_transform(contents)
# Save the vectorizer and vectorized data
with open('models/vectorizer.pickle', 'wb') as file:
pickle.dump(vectorizer, file)
with open('data/vectorized_articles.pickle', 'wb') as file:
pickle.dump(X, file)
Este script está enfocado en el preprocesamiento y vectorización de artículos de noticias, que son pasos cruciales en la preparación de datos de texto para tareas de aprendizaje automático. A continuación se explica detalladamente cada componente del script:
Importación de Bibliotecas
El script comienza importando varias bibliotecas esenciales:
import json
import nltk
from nltk.corpus import stopwords
from nltk.stem import WordNetLemmatizer
from sklearn.feature_extraction.text import TfidfVectorizer
import string
import pickle
json
: Para cargar y guardar archivos JSON que contienen los artículos de noticias.nltk
: El Toolkit de Lenguaje Natural, usado para varias tareas de PLN.stopwords
: Para filtrar palabras comunes que no contribuyen mucho al significado.WordNetLemmatizer
: Para lematizar palabras a sus formas raíz.TfidfVectorizer
: Desklearn
, usado para convertir texto en características numéricas.string
: Para manejar operaciones de cadenas, como eliminar puntuación.pickle
: Para guardar objetos de Python en archivos.
Descarga de Recursos de NLTK
El script descarga los recursos necesarios de NLTK, como tokenizadores, stopwords y el lematizador WordNet:
nltk.download('punkt')
nltk.download('stopwords')
nltk.download('wordnet')
Inicialización del Lematizador
Se crea una instancia de WordNetLemmatizer
:
lemmatizer = WordNetLemmatizer()
Definición de la Función de Preprocesamiento
Se define la función preprocess_text
para limpiar y preprocesar los datos de texto:
def preprocess_text(text):
text = text.lower() # Convertir texto a minúsculas
tokens = nltk.word_tokenize(text) # Tokenizar el texto
tokens = [word for word in tokens if word not in string.punctuation and word not in stopwords.words('english')] # Eliminar puntuación y stopwords
tokens = [lemmatizer.lemmatize(word) for word in tokens] # Lemmatizar los tokens
return ' '.join(tokens) # Unir los tokens de nuevo en una sola cadena
Carga de Artículos de Noticias
Se cargan los artículos de noticias desde un archivo JSON:
with open('data/articles.json', 'r') as file:
articles = json.load(file)
Preprocesamiento de Artículos
El contenido de cada artículo se preprocesa usando la función preprocess_text
. Si el contenido falta, se usa la descripción:
preprocessed_articles = []
for article in articles:
content = article["content"] if article["content"] else article["description"]
preprocessed_content = preprocess_text(content)
preprocessed_articles.append({
"source": article["source"],
"title": article["title"],
"content": preprocessed_content,
"url": article["url"],
"publishedAt": article["publishedAt"]
})
Guardar Artículos Preprocesados
Los artículos preprocesados se guardan en un nuevo archivo JSON:
with open('data/preprocessed_articles.json', 'w') as file:
json.dump(preprocessed_articles, file, indent=4)
Vectorización del Contenido Preprocesado
Se utiliza el vectorizador TF-IDF para convertir el texto preprocesado en características numéricas:
vectorizer = TfidfVectorizer()
contents = [article["content"] for article in preprocessed_articles]
X = vectorizer.fit_transform(contents)
Guardar el Vectorizador y los Datos Vectorizados
Tanto el vectorizador TF-IDF como los datos vectorizados se guardan en archivos usando pickle
:
with open('models/vectorizer.pickle', 'wb') as file:
pickle.dump(vectorizer, file)
with open('data/vectorized_articles.pickle', 'wb') as file:
pickle.dump(X, file)
En resumen, este script realiza las siguientes tareas:
- Importa bibliotecas necesarias: Para procesamiento de texto, vectorización y manejo de archivos.
- Descarga recursos de NLTK: Asegura que todos los conjuntos de datos necesarios de NLTK estén disponibles.
- Inicializa el lematizador: Prepara el lematizador para su uso en el preprocesamiento de texto.
- Define una función de preprocesamiento: Limpia y preprocesa el texto convirtiéndolo a minúsculas, tokenizando, eliminando puntuación y stopwords, y lematizando.
- Carga artículos de noticias: Lee artículos desde un archivo JSON.
- Preprocesa artículos: Aplica la función de preprocesamiento al contenido o descripción de cada artículo.
- Guarda artículos preprocesados: Escribe los artículos limpiados en un nuevo archivo JSON.
- Vectoriza el contenido: Convierte el texto preprocesado en características numéricas usando TF-IDF.
- Guarda el vectorizador y los datos vectorizados: Almacena el vectorizador y los vectores de características resultantes para su uso futuro.
En esta sección, cubrimos los pasos esenciales de recolección y preprocesamiento de datos para construir un chatbot agregador de noticias. Discutimos cómo recolectar artículos de noticias de múltiples fuentes utilizando la NewsAPI e implementamos un script para obtener y almacenar los artículos.
También implementamos una completa canalización de preprocesamiento que incluye normalización de texto, tokenización, eliminación de stopwords, lematización y vectorización. Estos pasos aseguran que los datos de noticias estén limpios y sean adecuados para un procesamiento, categorización y resumen posteriores.
12.2 Recolección y Preprocesamiento de Datos
La recolección y el preprocesamiento de datos son pasos cruciales y fundamentales para construir un chatbot agregador de noticias altamente eficiente y confiable. La calidad de los datos recolectados y cómo se procesan impactan directamente en el rendimiento, la precisión y la confiabilidad general del chatbot.
En esta sección, profundizaremos en las complejidades de cómo recolectar artículos de noticias de una variedad de fuentes confiables y preprocesarlos meticulosamente para asegurar que sean adecuados para las tareas de categorización y resumen.
Este proceso implica no solo recopilar una variedad de artículos, sino también limpiar, organizar y estructurar los datos para mejorar la capacidad del chatbot de proporcionar resultados precisos y significativos a los usuarios.
12.2.1 Recolección de Datos
Para construir un agregador de noticias completo, necesitamos recolectar artículos de noticias de múltiples fuentes confiables. Utilizaremos las API proporcionadas por organizaciones de noticias y agregadores para obtener los últimos artículos. Una opción popular es NewsAPI, que agrega noticias de varias fuentes y proporciona una interfaz simple para acceder a ellas.
Configuración de NewsAPI
Primero, regístrate para obtener una clave de API en NewsAPI. Esta clave se utilizará para autenticar nuestras solicitudes.
news_sources.json:
{
"sources": [
{"name": "BBC News", "url": "<https://newsapi.org/v2/top-headlines?sources=bbc-news&apiKey=your_newsapi_api_key>"},
{"name": "CNN", "url": "<https://newsapi.org/v2/top-headlines?sources=cnn&apiKey=your_newsapi_api_key>"},
{"name": "TechCrunch", "url": "<https://newsapi.org/v2/top-headlines?sources=techcrunch&apiKey=your_newsapi_api_key>"},
{"name": "The Verge", "url": "<https://newsapi.org/v2/top-headlines?sources=the-verge&apiKey=your_newsapi_api_key>"}
]
}
Este archivo contiene una lista de fuentes de noticias junto con sus endpoints de API correspondientes. Reemplaza your_newsapi_api_key
con la clave de API que obtuviste de NewsAPI.
Si deseas una comprensión más profunda sobre cómo manejar archivos JSON, te recomendamos leer esta publicación de blog: https://www.cuantum.tech/post/mastering-json-creating-handling-and-working-with-json-files
Obteniendo Artículos de Noticias
Crearemos un script para obtener artículos de noticias de estas fuentes y almacenarlos en un archivo JSON.
news_fetcher.py:
import json
import requests
# Load news sources
with open('data/news_sources.json', 'r') as file:
news_sources = json.load(file)["sources"]
def fetch_news():
articles = []
for source in news_sources:
response = requests.get(source["url"])
if response.status_code == 200:
news_data = response.json()
for article in news_data["articles"]:
articles.append({
"source": source["name"],
"title": article["title"],
"description": article["description"],
"content": article["content"],
"url": article["url"],
"publishedAt": article["publishedAt"]
})
else:
print(f"Failed to fetch news from {source['name']}")
# Save articles to file
with open('data/articles.json', 'w') as file:
json.dump(articles, file, indent=4)
# Fetch news articles
fetch_news()
Este script obtiene artículos de noticias de varias fuentes listadas en un archivo JSON y guarda los artículos recopilados en otro archivo JSON. Utiliza la biblioteca requests
para obtener datos de cada URL de fuente de noticias y procesa la respuesta si es exitosa.
El script extrae detalles como el nombre de la fuente, el título del artículo, la descripción, el contenido, la URL y la fecha de publicación de cada artículo y los almacena en una lista. Esta lista se guarda luego en un archivo llamado articles.json
.
12.2.2 Preprocesamiento de Datos
El preprocesamiento es esencial para convertir artículos de noticias en bruto en un formato adecuado para la categorización y el resumen. La tubería de preprocesamiento incluye normalización de texto, tokenización, eliminación de palabras vacías, lematización y vectorización.
Normalización de Texto y Tokenización
La normalización de texto implica convertir el texto a minúsculas y eliminar la puntuación. La tokenización es el proceso de dividir el texto en palabras o tokens individuales.
Eliminación de Palabras Vacías
Las palabras vacías son palabras comunes que no contribuyen significativamente al significado del texto. Eliminarlas ayuda a enfocarse en las palabras importantes.
Lematización
La lematización reduce las palabras a su forma base o raíz, asegurando que diferentes formas de una palabra se traten como la misma.
Vectorización
La vectorización convierte el texto en representaciones numéricas, que se utilizan como entrada para modelos de aprendizaje automático. Usaremos el vectorizador TF-IDF para este propósito.
Implementación del Preprocesamiento
Implementemos los pasos de preprocesamiento en Python.
nlp_engine.py:
import json
import nltk
from nltk.corpus import stopwords
from nltk.stem import WordNetLemmatizer
from sklearn.feature_extraction.text import TfidfVectorizer
import string
import pickle
# Download NLTK resources
nltk.download('punkt')
nltk.download('stopwords')
nltk.download('wordnet')
# Initialize lemmatizer
lemmatizer = WordNetLemmatizer()
# Define preprocessing function
def preprocess_text(text):
# Convert text to lowercase
text = text.lower()
# Tokenize text
tokens = nltk.word_tokenize(text)
# Remove punctuation and stop words
tokens = [word for word in tokens if word not in string.punctuation and word not in stopwords.words('english')]
# Lemmatize tokens
tokens = [lemmatizer.lemmatize(word) for word in tokens]
return ' '.join(tokens)
# Load news articles
with open('data/articles.json', 'r') as file:
articles = json.load(file)
# Preprocess articles
preprocessed_articles = []
for article in articles:
content = article["content"] if article["content"] else article["description"]
preprocessed_content = preprocess_text(content)
preprocessed_articles.append({
"source": article["source"],
"title": article["title"],
"content": preprocessed_content,
"url": article["url"],
"publishedAt": article["publishedAt"]
})
# Save preprocessed articles to file
with open('data/preprocessed_articles.json', 'w') as file:
json.dump(preprocessed_articles, file, indent=4)
# Vectorize the preprocessed content
vectorizer = TfidfVectorizer()
contents = [article["content"] for article in preprocessed_articles]
X = vectorizer.fit_transform(contents)
# Save the vectorizer and vectorized data
with open('models/vectorizer.pickle', 'wb') as file:
pickle.dump(vectorizer, file)
with open('data/vectorized_articles.pickle', 'wb') as file:
pickle.dump(X, file)
Este script está enfocado en el preprocesamiento y vectorización de artículos de noticias, que son pasos cruciales en la preparación de datos de texto para tareas de aprendizaje automático. A continuación se explica detalladamente cada componente del script:
Importación de Bibliotecas
El script comienza importando varias bibliotecas esenciales:
import json
import nltk
from nltk.corpus import stopwords
from nltk.stem import WordNetLemmatizer
from sklearn.feature_extraction.text import TfidfVectorizer
import string
import pickle
json
: Para cargar y guardar archivos JSON que contienen los artículos de noticias.nltk
: El Toolkit de Lenguaje Natural, usado para varias tareas de PLN.stopwords
: Para filtrar palabras comunes que no contribuyen mucho al significado.WordNetLemmatizer
: Para lematizar palabras a sus formas raíz.TfidfVectorizer
: Desklearn
, usado para convertir texto en características numéricas.string
: Para manejar operaciones de cadenas, como eliminar puntuación.pickle
: Para guardar objetos de Python en archivos.
Descarga de Recursos de NLTK
El script descarga los recursos necesarios de NLTK, como tokenizadores, stopwords y el lematizador WordNet:
nltk.download('punkt')
nltk.download('stopwords')
nltk.download('wordnet')
Inicialización del Lematizador
Se crea una instancia de WordNetLemmatizer
:
lemmatizer = WordNetLemmatizer()
Definición de la Función de Preprocesamiento
Se define la función preprocess_text
para limpiar y preprocesar los datos de texto:
def preprocess_text(text):
text = text.lower() # Convertir texto a minúsculas
tokens = nltk.word_tokenize(text) # Tokenizar el texto
tokens = [word for word in tokens if word not in string.punctuation and word not in stopwords.words('english')] # Eliminar puntuación y stopwords
tokens = [lemmatizer.lemmatize(word) for word in tokens] # Lemmatizar los tokens
return ' '.join(tokens) # Unir los tokens de nuevo en una sola cadena
Carga de Artículos de Noticias
Se cargan los artículos de noticias desde un archivo JSON:
with open('data/articles.json', 'r') as file:
articles = json.load(file)
Preprocesamiento de Artículos
El contenido de cada artículo se preprocesa usando la función preprocess_text
. Si el contenido falta, se usa la descripción:
preprocessed_articles = []
for article in articles:
content = article["content"] if article["content"] else article["description"]
preprocessed_content = preprocess_text(content)
preprocessed_articles.append({
"source": article["source"],
"title": article["title"],
"content": preprocessed_content,
"url": article["url"],
"publishedAt": article["publishedAt"]
})
Guardar Artículos Preprocesados
Los artículos preprocesados se guardan en un nuevo archivo JSON:
with open('data/preprocessed_articles.json', 'w') as file:
json.dump(preprocessed_articles, file, indent=4)
Vectorización del Contenido Preprocesado
Se utiliza el vectorizador TF-IDF para convertir el texto preprocesado en características numéricas:
vectorizer = TfidfVectorizer()
contents = [article["content"] for article in preprocessed_articles]
X = vectorizer.fit_transform(contents)
Guardar el Vectorizador y los Datos Vectorizados
Tanto el vectorizador TF-IDF como los datos vectorizados se guardan en archivos usando pickle
:
with open('models/vectorizer.pickle', 'wb') as file:
pickle.dump(vectorizer, file)
with open('data/vectorized_articles.pickle', 'wb') as file:
pickle.dump(X, file)
En resumen, este script realiza las siguientes tareas:
- Importa bibliotecas necesarias: Para procesamiento de texto, vectorización y manejo de archivos.
- Descarga recursos de NLTK: Asegura que todos los conjuntos de datos necesarios de NLTK estén disponibles.
- Inicializa el lematizador: Prepara el lematizador para su uso en el preprocesamiento de texto.
- Define una función de preprocesamiento: Limpia y preprocesa el texto convirtiéndolo a minúsculas, tokenizando, eliminando puntuación y stopwords, y lematizando.
- Carga artículos de noticias: Lee artículos desde un archivo JSON.
- Preprocesa artículos: Aplica la función de preprocesamiento al contenido o descripción de cada artículo.
- Guarda artículos preprocesados: Escribe los artículos limpiados en un nuevo archivo JSON.
- Vectoriza el contenido: Convierte el texto preprocesado en características numéricas usando TF-IDF.
- Guarda el vectorizador y los datos vectorizados: Almacena el vectorizador y los vectores de características resultantes para su uso futuro.
En esta sección, cubrimos los pasos esenciales de recolección y preprocesamiento de datos para construir un chatbot agregador de noticias. Discutimos cómo recolectar artículos de noticias de múltiples fuentes utilizando la NewsAPI e implementamos un script para obtener y almacenar los artículos.
También implementamos una completa canalización de preprocesamiento que incluye normalización de texto, tokenización, eliminación de stopwords, lematización y vectorización. Estos pasos aseguran que los datos de noticias estén limpios y sean adecuados para un procesamiento, categorización y resumen posteriores.
12.2 Recolección y Preprocesamiento de Datos
La recolección y el preprocesamiento de datos son pasos cruciales y fundamentales para construir un chatbot agregador de noticias altamente eficiente y confiable. La calidad de los datos recolectados y cómo se procesan impactan directamente en el rendimiento, la precisión y la confiabilidad general del chatbot.
En esta sección, profundizaremos en las complejidades de cómo recolectar artículos de noticias de una variedad de fuentes confiables y preprocesarlos meticulosamente para asegurar que sean adecuados para las tareas de categorización y resumen.
Este proceso implica no solo recopilar una variedad de artículos, sino también limpiar, organizar y estructurar los datos para mejorar la capacidad del chatbot de proporcionar resultados precisos y significativos a los usuarios.
12.2.1 Recolección de Datos
Para construir un agregador de noticias completo, necesitamos recolectar artículos de noticias de múltiples fuentes confiables. Utilizaremos las API proporcionadas por organizaciones de noticias y agregadores para obtener los últimos artículos. Una opción popular es NewsAPI, que agrega noticias de varias fuentes y proporciona una interfaz simple para acceder a ellas.
Configuración de NewsAPI
Primero, regístrate para obtener una clave de API en NewsAPI. Esta clave se utilizará para autenticar nuestras solicitudes.
news_sources.json:
{
"sources": [
{"name": "BBC News", "url": "<https://newsapi.org/v2/top-headlines?sources=bbc-news&apiKey=your_newsapi_api_key>"},
{"name": "CNN", "url": "<https://newsapi.org/v2/top-headlines?sources=cnn&apiKey=your_newsapi_api_key>"},
{"name": "TechCrunch", "url": "<https://newsapi.org/v2/top-headlines?sources=techcrunch&apiKey=your_newsapi_api_key>"},
{"name": "The Verge", "url": "<https://newsapi.org/v2/top-headlines?sources=the-verge&apiKey=your_newsapi_api_key>"}
]
}
Este archivo contiene una lista de fuentes de noticias junto con sus endpoints de API correspondientes. Reemplaza your_newsapi_api_key
con la clave de API que obtuviste de NewsAPI.
Si deseas una comprensión más profunda sobre cómo manejar archivos JSON, te recomendamos leer esta publicación de blog: https://www.cuantum.tech/post/mastering-json-creating-handling-and-working-with-json-files
Obteniendo Artículos de Noticias
Crearemos un script para obtener artículos de noticias de estas fuentes y almacenarlos en un archivo JSON.
news_fetcher.py:
import json
import requests
# Load news sources
with open('data/news_sources.json', 'r') as file:
news_sources = json.load(file)["sources"]
def fetch_news():
articles = []
for source in news_sources:
response = requests.get(source["url"])
if response.status_code == 200:
news_data = response.json()
for article in news_data["articles"]:
articles.append({
"source": source["name"],
"title": article["title"],
"description": article["description"],
"content": article["content"],
"url": article["url"],
"publishedAt": article["publishedAt"]
})
else:
print(f"Failed to fetch news from {source['name']}")
# Save articles to file
with open('data/articles.json', 'w') as file:
json.dump(articles, file, indent=4)
# Fetch news articles
fetch_news()
Este script obtiene artículos de noticias de varias fuentes listadas en un archivo JSON y guarda los artículos recopilados en otro archivo JSON. Utiliza la biblioteca requests
para obtener datos de cada URL de fuente de noticias y procesa la respuesta si es exitosa.
El script extrae detalles como el nombre de la fuente, el título del artículo, la descripción, el contenido, la URL y la fecha de publicación de cada artículo y los almacena en una lista. Esta lista se guarda luego en un archivo llamado articles.json
.
12.2.2 Preprocesamiento de Datos
El preprocesamiento es esencial para convertir artículos de noticias en bruto en un formato adecuado para la categorización y el resumen. La tubería de preprocesamiento incluye normalización de texto, tokenización, eliminación de palabras vacías, lematización y vectorización.
Normalización de Texto y Tokenización
La normalización de texto implica convertir el texto a minúsculas y eliminar la puntuación. La tokenización es el proceso de dividir el texto en palabras o tokens individuales.
Eliminación de Palabras Vacías
Las palabras vacías son palabras comunes que no contribuyen significativamente al significado del texto. Eliminarlas ayuda a enfocarse en las palabras importantes.
Lematización
La lematización reduce las palabras a su forma base o raíz, asegurando que diferentes formas de una palabra se traten como la misma.
Vectorización
La vectorización convierte el texto en representaciones numéricas, que se utilizan como entrada para modelos de aprendizaje automático. Usaremos el vectorizador TF-IDF para este propósito.
Implementación del Preprocesamiento
Implementemos los pasos de preprocesamiento en Python.
nlp_engine.py:
import json
import nltk
from nltk.corpus import stopwords
from nltk.stem import WordNetLemmatizer
from sklearn.feature_extraction.text import TfidfVectorizer
import string
import pickle
# Download NLTK resources
nltk.download('punkt')
nltk.download('stopwords')
nltk.download('wordnet')
# Initialize lemmatizer
lemmatizer = WordNetLemmatizer()
# Define preprocessing function
def preprocess_text(text):
# Convert text to lowercase
text = text.lower()
# Tokenize text
tokens = nltk.word_tokenize(text)
# Remove punctuation and stop words
tokens = [word for word in tokens if word not in string.punctuation and word not in stopwords.words('english')]
# Lemmatize tokens
tokens = [lemmatizer.lemmatize(word) for word in tokens]
return ' '.join(tokens)
# Load news articles
with open('data/articles.json', 'r') as file:
articles = json.load(file)
# Preprocess articles
preprocessed_articles = []
for article in articles:
content = article["content"] if article["content"] else article["description"]
preprocessed_content = preprocess_text(content)
preprocessed_articles.append({
"source": article["source"],
"title": article["title"],
"content": preprocessed_content,
"url": article["url"],
"publishedAt": article["publishedAt"]
})
# Save preprocessed articles to file
with open('data/preprocessed_articles.json', 'w') as file:
json.dump(preprocessed_articles, file, indent=4)
# Vectorize the preprocessed content
vectorizer = TfidfVectorizer()
contents = [article["content"] for article in preprocessed_articles]
X = vectorizer.fit_transform(contents)
# Save the vectorizer and vectorized data
with open('models/vectorizer.pickle', 'wb') as file:
pickle.dump(vectorizer, file)
with open('data/vectorized_articles.pickle', 'wb') as file:
pickle.dump(X, file)
Este script está enfocado en el preprocesamiento y vectorización de artículos de noticias, que son pasos cruciales en la preparación de datos de texto para tareas de aprendizaje automático. A continuación se explica detalladamente cada componente del script:
Importación de Bibliotecas
El script comienza importando varias bibliotecas esenciales:
import json
import nltk
from nltk.corpus import stopwords
from nltk.stem import WordNetLemmatizer
from sklearn.feature_extraction.text import TfidfVectorizer
import string
import pickle
json
: Para cargar y guardar archivos JSON que contienen los artículos de noticias.nltk
: El Toolkit de Lenguaje Natural, usado para varias tareas de PLN.stopwords
: Para filtrar palabras comunes que no contribuyen mucho al significado.WordNetLemmatizer
: Para lematizar palabras a sus formas raíz.TfidfVectorizer
: Desklearn
, usado para convertir texto en características numéricas.string
: Para manejar operaciones de cadenas, como eliminar puntuación.pickle
: Para guardar objetos de Python en archivos.
Descarga de Recursos de NLTK
El script descarga los recursos necesarios de NLTK, como tokenizadores, stopwords y el lematizador WordNet:
nltk.download('punkt')
nltk.download('stopwords')
nltk.download('wordnet')
Inicialización del Lematizador
Se crea una instancia de WordNetLemmatizer
:
lemmatizer = WordNetLemmatizer()
Definición de la Función de Preprocesamiento
Se define la función preprocess_text
para limpiar y preprocesar los datos de texto:
def preprocess_text(text):
text = text.lower() # Convertir texto a minúsculas
tokens = nltk.word_tokenize(text) # Tokenizar el texto
tokens = [word for word in tokens if word not in string.punctuation and word not in stopwords.words('english')] # Eliminar puntuación y stopwords
tokens = [lemmatizer.lemmatize(word) for word in tokens] # Lemmatizar los tokens
return ' '.join(tokens) # Unir los tokens de nuevo en una sola cadena
Carga de Artículos de Noticias
Se cargan los artículos de noticias desde un archivo JSON:
with open('data/articles.json', 'r') as file:
articles = json.load(file)
Preprocesamiento de Artículos
El contenido de cada artículo se preprocesa usando la función preprocess_text
. Si el contenido falta, se usa la descripción:
preprocessed_articles = []
for article in articles:
content = article["content"] if article["content"] else article["description"]
preprocessed_content = preprocess_text(content)
preprocessed_articles.append({
"source": article["source"],
"title": article["title"],
"content": preprocessed_content,
"url": article["url"],
"publishedAt": article["publishedAt"]
})
Guardar Artículos Preprocesados
Los artículos preprocesados se guardan en un nuevo archivo JSON:
with open('data/preprocessed_articles.json', 'w') as file:
json.dump(preprocessed_articles, file, indent=4)
Vectorización del Contenido Preprocesado
Se utiliza el vectorizador TF-IDF para convertir el texto preprocesado en características numéricas:
vectorizer = TfidfVectorizer()
contents = [article["content"] for article in preprocessed_articles]
X = vectorizer.fit_transform(contents)
Guardar el Vectorizador y los Datos Vectorizados
Tanto el vectorizador TF-IDF como los datos vectorizados se guardan en archivos usando pickle
:
with open('models/vectorizer.pickle', 'wb') as file:
pickle.dump(vectorizer, file)
with open('data/vectorized_articles.pickle', 'wb') as file:
pickle.dump(X, file)
En resumen, este script realiza las siguientes tareas:
- Importa bibliotecas necesarias: Para procesamiento de texto, vectorización y manejo de archivos.
- Descarga recursos de NLTK: Asegura que todos los conjuntos de datos necesarios de NLTK estén disponibles.
- Inicializa el lematizador: Prepara el lematizador para su uso en el preprocesamiento de texto.
- Define una función de preprocesamiento: Limpia y preprocesa el texto convirtiéndolo a minúsculas, tokenizando, eliminando puntuación y stopwords, y lematizando.
- Carga artículos de noticias: Lee artículos desde un archivo JSON.
- Preprocesa artículos: Aplica la función de preprocesamiento al contenido o descripción de cada artículo.
- Guarda artículos preprocesados: Escribe los artículos limpiados en un nuevo archivo JSON.
- Vectoriza el contenido: Convierte el texto preprocesado en características numéricas usando TF-IDF.
- Guarda el vectorizador y los datos vectorizados: Almacena el vectorizador y los vectores de características resultantes para su uso futuro.
En esta sección, cubrimos los pasos esenciales de recolección y preprocesamiento de datos para construir un chatbot agregador de noticias. Discutimos cómo recolectar artículos de noticias de múltiples fuentes utilizando la NewsAPI e implementamos un script para obtener y almacenar los artículos.
También implementamos una completa canalización de preprocesamiento que incluye normalización de texto, tokenización, eliminación de stopwords, lematización y vectorización. Estos pasos aseguran que los datos de noticias estén limpios y sean adecuados para un procesamiento, categorización y resumen posteriores.
12.2 Recolección y Preprocesamiento de Datos
La recolección y el preprocesamiento de datos son pasos cruciales y fundamentales para construir un chatbot agregador de noticias altamente eficiente y confiable. La calidad de los datos recolectados y cómo se procesan impactan directamente en el rendimiento, la precisión y la confiabilidad general del chatbot.
En esta sección, profundizaremos en las complejidades de cómo recolectar artículos de noticias de una variedad de fuentes confiables y preprocesarlos meticulosamente para asegurar que sean adecuados para las tareas de categorización y resumen.
Este proceso implica no solo recopilar una variedad de artículos, sino también limpiar, organizar y estructurar los datos para mejorar la capacidad del chatbot de proporcionar resultados precisos y significativos a los usuarios.
12.2.1 Recolección de Datos
Para construir un agregador de noticias completo, necesitamos recolectar artículos de noticias de múltiples fuentes confiables. Utilizaremos las API proporcionadas por organizaciones de noticias y agregadores para obtener los últimos artículos. Una opción popular es NewsAPI, que agrega noticias de varias fuentes y proporciona una interfaz simple para acceder a ellas.
Configuración de NewsAPI
Primero, regístrate para obtener una clave de API en NewsAPI. Esta clave se utilizará para autenticar nuestras solicitudes.
news_sources.json:
{
"sources": [
{"name": "BBC News", "url": "<https://newsapi.org/v2/top-headlines?sources=bbc-news&apiKey=your_newsapi_api_key>"},
{"name": "CNN", "url": "<https://newsapi.org/v2/top-headlines?sources=cnn&apiKey=your_newsapi_api_key>"},
{"name": "TechCrunch", "url": "<https://newsapi.org/v2/top-headlines?sources=techcrunch&apiKey=your_newsapi_api_key>"},
{"name": "The Verge", "url": "<https://newsapi.org/v2/top-headlines?sources=the-verge&apiKey=your_newsapi_api_key>"}
]
}
Este archivo contiene una lista de fuentes de noticias junto con sus endpoints de API correspondientes. Reemplaza your_newsapi_api_key
con la clave de API que obtuviste de NewsAPI.
Si deseas una comprensión más profunda sobre cómo manejar archivos JSON, te recomendamos leer esta publicación de blog: https://www.cuantum.tech/post/mastering-json-creating-handling-and-working-with-json-files
Obteniendo Artículos de Noticias
Crearemos un script para obtener artículos de noticias de estas fuentes y almacenarlos en un archivo JSON.
news_fetcher.py:
import json
import requests
# Load news sources
with open('data/news_sources.json', 'r') as file:
news_sources = json.load(file)["sources"]
def fetch_news():
articles = []
for source in news_sources:
response = requests.get(source["url"])
if response.status_code == 200:
news_data = response.json()
for article in news_data["articles"]:
articles.append({
"source": source["name"],
"title": article["title"],
"description": article["description"],
"content": article["content"],
"url": article["url"],
"publishedAt": article["publishedAt"]
})
else:
print(f"Failed to fetch news from {source['name']}")
# Save articles to file
with open('data/articles.json', 'w') as file:
json.dump(articles, file, indent=4)
# Fetch news articles
fetch_news()
Este script obtiene artículos de noticias de varias fuentes listadas en un archivo JSON y guarda los artículos recopilados en otro archivo JSON. Utiliza la biblioteca requests
para obtener datos de cada URL de fuente de noticias y procesa la respuesta si es exitosa.
El script extrae detalles como el nombre de la fuente, el título del artículo, la descripción, el contenido, la URL y la fecha de publicación de cada artículo y los almacena en una lista. Esta lista se guarda luego en un archivo llamado articles.json
.
12.2.2 Preprocesamiento de Datos
El preprocesamiento es esencial para convertir artículos de noticias en bruto en un formato adecuado para la categorización y el resumen. La tubería de preprocesamiento incluye normalización de texto, tokenización, eliminación de palabras vacías, lematización y vectorización.
Normalización de Texto y Tokenización
La normalización de texto implica convertir el texto a minúsculas y eliminar la puntuación. La tokenización es el proceso de dividir el texto en palabras o tokens individuales.
Eliminación de Palabras Vacías
Las palabras vacías son palabras comunes que no contribuyen significativamente al significado del texto. Eliminarlas ayuda a enfocarse en las palabras importantes.
Lematización
La lematización reduce las palabras a su forma base o raíz, asegurando que diferentes formas de una palabra se traten como la misma.
Vectorización
La vectorización convierte el texto en representaciones numéricas, que se utilizan como entrada para modelos de aprendizaje automático. Usaremos el vectorizador TF-IDF para este propósito.
Implementación del Preprocesamiento
Implementemos los pasos de preprocesamiento en Python.
nlp_engine.py:
import json
import nltk
from nltk.corpus import stopwords
from nltk.stem import WordNetLemmatizer
from sklearn.feature_extraction.text import TfidfVectorizer
import string
import pickle
# Download NLTK resources
nltk.download('punkt')
nltk.download('stopwords')
nltk.download('wordnet')
# Initialize lemmatizer
lemmatizer = WordNetLemmatizer()
# Define preprocessing function
def preprocess_text(text):
# Convert text to lowercase
text = text.lower()
# Tokenize text
tokens = nltk.word_tokenize(text)
# Remove punctuation and stop words
tokens = [word for word in tokens if word not in string.punctuation and word not in stopwords.words('english')]
# Lemmatize tokens
tokens = [lemmatizer.lemmatize(word) for word in tokens]
return ' '.join(tokens)
# Load news articles
with open('data/articles.json', 'r') as file:
articles = json.load(file)
# Preprocess articles
preprocessed_articles = []
for article in articles:
content = article["content"] if article["content"] else article["description"]
preprocessed_content = preprocess_text(content)
preprocessed_articles.append({
"source": article["source"],
"title": article["title"],
"content": preprocessed_content,
"url": article["url"],
"publishedAt": article["publishedAt"]
})
# Save preprocessed articles to file
with open('data/preprocessed_articles.json', 'w') as file:
json.dump(preprocessed_articles, file, indent=4)
# Vectorize the preprocessed content
vectorizer = TfidfVectorizer()
contents = [article["content"] for article in preprocessed_articles]
X = vectorizer.fit_transform(contents)
# Save the vectorizer and vectorized data
with open('models/vectorizer.pickle', 'wb') as file:
pickle.dump(vectorizer, file)
with open('data/vectorized_articles.pickle', 'wb') as file:
pickle.dump(X, file)
Este script está enfocado en el preprocesamiento y vectorización de artículos de noticias, que son pasos cruciales en la preparación de datos de texto para tareas de aprendizaje automático. A continuación se explica detalladamente cada componente del script:
Importación de Bibliotecas
El script comienza importando varias bibliotecas esenciales:
import json
import nltk
from nltk.corpus import stopwords
from nltk.stem import WordNetLemmatizer
from sklearn.feature_extraction.text import TfidfVectorizer
import string
import pickle
json
: Para cargar y guardar archivos JSON que contienen los artículos de noticias.nltk
: El Toolkit de Lenguaje Natural, usado para varias tareas de PLN.stopwords
: Para filtrar palabras comunes que no contribuyen mucho al significado.WordNetLemmatizer
: Para lematizar palabras a sus formas raíz.TfidfVectorizer
: Desklearn
, usado para convertir texto en características numéricas.string
: Para manejar operaciones de cadenas, como eliminar puntuación.pickle
: Para guardar objetos de Python en archivos.
Descarga de Recursos de NLTK
El script descarga los recursos necesarios de NLTK, como tokenizadores, stopwords y el lematizador WordNet:
nltk.download('punkt')
nltk.download('stopwords')
nltk.download('wordnet')
Inicialización del Lematizador
Se crea una instancia de WordNetLemmatizer
:
lemmatizer = WordNetLemmatizer()
Definición de la Función de Preprocesamiento
Se define la función preprocess_text
para limpiar y preprocesar los datos de texto:
def preprocess_text(text):
text = text.lower() # Convertir texto a minúsculas
tokens = nltk.word_tokenize(text) # Tokenizar el texto
tokens = [word for word in tokens if word not in string.punctuation and word not in stopwords.words('english')] # Eliminar puntuación y stopwords
tokens = [lemmatizer.lemmatize(word) for word in tokens] # Lemmatizar los tokens
return ' '.join(tokens) # Unir los tokens de nuevo en una sola cadena
Carga de Artículos de Noticias
Se cargan los artículos de noticias desde un archivo JSON:
with open('data/articles.json', 'r') as file:
articles = json.load(file)
Preprocesamiento de Artículos
El contenido de cada artículo se preprocesa usando la función preprocess_text
. Si el contenido falta, se usa la descripción:
preprocessed_articles = []
for article in articles:
content = article["content"] if article["content"] else article["description"]
preprocessed_content = preprocess_text(content)
preprocessed_articles.append({
"source": article["source"],
"title": article["title"],
"content": preprocessed_content,
"url": article["url"],
"publishedAt": article["publishedAt"]
})
Guardar Artículos Preprocesados
Los artículos preprocesados se guardan en un nuevo archivo JSON:
with open('data/preprocessed_articles.json', 'w') as file:
json.dump(preprocessed_articles, file, indent=4)
Vectorización del Contenido Preprocesado
Se utiliza el vectorizador TF-IDF para convertir el texto preprocesado en características numéricas:
vectorizer = TfidfVectorizer()
contents = [article["content"] for article in preprocessed_articles]
X = vectorizer.fit_transform(contents)
Guardar el Vectorizador y los Datos Vectorizados
Tanto el vectorizador TF-IDF como los datos vectorizados se guardan en archivos usando pickle
:
with open('models/vectorizer.pickle', 'wb') as file:
pickle.dump(vectorizer, file)
with open('data/vectorized_articles.pickle', 'wb') as file:
pickle.dump(X, file)
En resumen, este script realiza las siguientes tareas:
- Importa bibliotecas necesarias: Para procesamiento de texto, vectorización y manejo de archivos.
- Descarga recursos de NLTK: Asegura que todos los conjuntos de datos necesarios de NLTK estén disponibles.
- Inicializa el lematizador: Prepara el lematizador para su uso en el preprocesamiento de texto.
- Define una función de preprocesamiento: Limpia y preprocesa el texto convirtiéndolo a minúsculas, tokenizando, eliminando puntuación y stopwords, y lematizando.
- Carga artículos de noticias: Lee artículos desde un archivo JSON.
- Preprocesa artículos: Aplica la función de preprocesamiento al contenido o descripción de cada artículo.
- Guarda artículos preprocesados: Escribe los artículos limpiados en un nuevo archivo JSON.
- Vectoriza el contenido: Convierte el texto preprocesado en características numéricas usando TF-IDF.
- Guarda el vectorizador y los datos vectorizados: Almacena el vectorizador y los vectores de características resultantes para su uso futuro.
En esta sección, cubrimos los pasos esenciales de recolección y preprocesamiento de datos para construir un chatbot agregador de noticias. Discutimos cómo recolectar artículos de noticias de múltiples fuentes utilizando la NewsAPI e implementamos un script para obtener y almacenar los artículos.
También implementamos una completa canalización de preprocesamiento que incluye normalización de texto, tokenización, eliminación de stopwords, lematización y vectorización. Estos pasos aseguran que los datos de noticias estén limpios y sean adecuados para un procesamiento, categorización y resumen posteriores.