Capítulo 12: Proyecto: Agregador de Noticias
12.5 Evaluación y Despliegue del Agregador
En esta sección, nos centraremos en evaluar el rendimiento del chatbot agregador de noticias y desplegarlo en una plataforma adecuada. La evaluación ayuda a garantizar que el chatbot cumpla con las expectativas de los usuarios y funcione bien en diversas condiciones. El despliegue hace que el chatbot sea accesible para los usuarios, permitiéndoles beneficiarse de sus funcionalidades.
12.5.1 Evaluación del Agregador
La evaluación implica medir el rendimiento del chatbot en términos de precisión, capacidad de respuesta y satisfacción del usuario. Utilizaremos diferentes métricas y métodos para evaluar estos aspectos.
1. Métricas de Precisión
Las métricas de precisión evalúan qué tan bien el chatbot categoriza y resume los artículos de noticias. Las métricas comunes incluyen precisión, recall y F1-score para la precisión de la categorización y comentarios de los usuarios para la calidad del resumen.
Ejemplo: Evaluación de la Precisión de la Categorización
Podemos usar la biblioteca sklearn para calcular precisión, recall y F1-score para el modelo de categorización.
from sklearn.metrics import classification_report
from nlp_engine import categorize_article
# Load test articles and their true categories
with open('data/test_articles.json', 'r') as file:
test_articles = json.load(file)
# Prepare data for evaluation
true_categories = [article['category'] for article in test_articles]
predicted_categories = [categorize_article(article['content']) for article in test_articles]
# Flatten lists for multi-label classification
true_categories_flat = [item for sublist in true_categories for item in sublist]
predicted_categories_flat = [item for sublist in predicted_categories for item in sublist]
# Print classification report
print(classification_report(true_categories_flat, predicted_categories_flat))
En este script, cargamos artículos de prueba y sus categorías verdaderas, predecimos las categorías utilizando el modelo entrenado y mostramos un informe de clasificación que incluye precisión, recall y F1-score.
2. Comentarios de Usuarios sobre el Resumen
Los comentarios de los usuarios son esenciales para evaluar la calidad de los resúmenes generados por el chatbot. Podemos recopilar comentarios de los usuarios a través de encuestas o calificaciones directas.
Ejemplo: Recopilación de Comentarios de Usuarios
Podemos modificar nuestra aplicación Flask para incluir un formulario de comentarios donde los usuarios puedan calificar la calidad de los resúmenes.
app.py (continuación):
feedback_data = []
@app.route('/feedback', methods=['POST'])
def feedback():
user_feedback = request.json
feedback_data.append(user_feedback)
return jsonify({'message': 'Thank you for your feedback!'})
# HTML template for feedback form
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>News Aggregator Chatbot</title>
<link rel="stylesheet" href="<https://stackpath.bootstrapcdn.com/bootstrap/4.5.2/css/bootstrap.min.css>">
</head>
<body>
<div class="container">
<h1 class="mt-5">News Aggregator Chatbot</h1>
<form id="news-form" class="mt-4">
<div class="form-group">
<label for="category">Select News Category</label>
<select class="form-control" id="category" name="category">
<option value="general">General</option>
<option value="business">Business</option>
<option value="technology">Technology</option>
<option value="sports">Sports</option>
<option value="entertainment">Entertainment</option>
</select>
</div>
<button type="submit" class="btn btn-primary">Get News</button>
</form>
<div id="news-articles" class="mt-4"></div>
</div>
<script src="<https://code.jquery.com/jquery-3.5.1.min.js>"></script>
<script>
$(document).ready(function() {
$('#news-form').on('submit', function(event) {
event.preventDefault();
const category = $('#category').val();
$.post('/get_news', { category: category }, function(data) {
let articlesHtml = '<div class="list-group">';
data.forEach(article => {
articlesHtml += `
<div class="list-group-item">
<h5 class="mb-1">${article.title}</h5>
<p class="mb-1">${article.description}</p>
<small>${article.source} - ${article.publishedAt}</small>
<button class="btn btn-secondary btn-sm mt-2" onclick="categorizeArticle('${article.content}')">Categorize</button>
<div class="category mt-2" id="category-${article.title}"></div>
<button class="btn btn-secondary btn-sm mt-2" onclick="summarizeArticle('${article.content}')">Summarize</button>
<div class="summary mt-2" id="summary-${article.title}"></div>
<form id="feedback-form-${article.title}" class="mt-2">
<label for="rating">Rate this summary:</label>
<select class="form-control" id="rating-${article.title}">
<option value="1">1 - Poor</option>
<option value="2">2 - Fair</option>
<option value="3">3 - Good</option>
<option value="4">4 - Very Good</option>
<option value="5">5 - Excellent</option>
</select>
<button type="submit" class="btn btn-primary btn-sm mt-2">Submit Feedback</button>
</form>
</div>
`;
});
articlesHtml += '</div>';
$('#news-articles').html(articlesHtml);
});
});
function summarizeArticle(article) {
const summaryType = 'extractive'; // or 'abstractive'
$.post('/summarize_article', { article: article, summary_type: summaryType }, function(data) {
$('#summary-' + article.title).html('<p>' + data.summary + '</p>');
});
}
function categorizeArticle(article) {
$.post('/categorize_article', { article: article }, function(data) {
$('#category-' + article.title).html('<p>' + data.category.join(', ') + '</p>');
});
}
$('body').on('submit', 'form[id^="feedback-form-"]', function(event) {
event.preventDefault();
const articleTitle = $(this).attr('id').replace('feedback-form-', '');
const rating = $(`#rating-${articleTitle}`).val();
const feedback = {
article: articleTitle,
rating: rating
};
$.post('/feedback', feedback, function(response) {
alert(response.message);
});
});
});
</script>
</body>
</html>
En esta plantilla actualizada, añadimos un formulario de comentarios para cada artículo, permitiendo a los usuarios calificar la calidad de los resúmenes. Los comentarios se envían al endpoint /feedback
y se almacenan para análisis posterior.
3. Tiempo de Respuesta
El tiempo de respuesta es crítico para la experiencia del usuario. Necesitamos asegurarnos de que el chatbot responda rápidamente a las consultas de los usuarios.
Ejemplo: Medición del Tiempo de Respuesta
Podemos medir el tiempo de respuesta para diferentes consultas usando el módulo time
de Python.
evaluate.py:
import time
# Function to measure response time
def measure_response_time(endpoint, data):
start_time = time.time()
response = requests.post(endpoint, json=data)
end_time = time.time()
response_time = end_time - start_time
return response_time
# Measure response time for summarization
article = "Sample news article content..."
data = {"article": article, "summary_type": "extractive"}
response_time = measure_response_time("<http://localhost:5000/summarize_article>", data)
print(f"Summarization Response Time: {response_time} seconds")
Al medir el tiempo de respuesta, podemos asegurarnos de que el chatbot cumpla con los criterios de rendimiento deseados.
12.5.2 Despliegue del Agregador
Una vez que el chatbot se evalúa y tiene un rendimiento satisfactorio, el siguiente paso es el despliegue. Desplegaremos el chatbot en una plataforma adecuada donde los usuarios puedan interactuar con él.
1. Despliegue de la Aplicación Web
Podemos desplegar el chatbot como una aplicación web utilizando una plataforma en la nube como Heroku, AWS o Google Cloud.
Ejemplo: Despliegue en Heroku
Para desplegar el chatbot en Heroku, sigue estos pasos:
- Instalar Heroku CLI: Descarga e instala el Heroku CLI desde Heroku.
- Iniciar Sesión en Heroku: Abre una terminal e inicia sesión en tu cuenta de Heroku.
heroku login
- Crear una App en Heroku: Crea una nueva app en Heroku.
heroku create your-app-name
- Preparar el Proyecto para Despliegue: Crea un
Procfile
y unrequirements.txt
en el directorio del proyecto.
Procfile:
```txt
web: python app.py
```
requirements.txt:
```txt
Flask
requests
nltk
gensim
transformers
```
5. Enviar el Proyecto a Heroku: Inicializa un repositorio Git, añade los archivos del proyecto y envíalos a Heroku.
```sh
git init
git add .
git commit -m "Initial commit"
git push heroku master
```
6. Abrir la App en Heroku: Abre la app desplegada en tu navegador.
```sh
heroku open
```
Siguiendo estos pasos, el chatbot se desplegará en Heroku y será accesible mediante una URL pública.
2. Integración con Apps de Mensajería
También podemos integrar el chatbot con aplicaciones de mensajería como Facebook Messenger, Slack o WhatsApp. Cada plataforma proporciona APIs para la integración de chatbots.
Ejemplo: Integración con Facebook Messenger
Para integrar el chatbot con Facebook Messenger, sigue estos pasos:
- Crear una Página de Facebook: Crea una nueva página de Facebook para tu chatbot.
- Configurar una Cuenta de Desarrollador en Facebook: Regístrate como desarrollador en el portal de desarrolladores de Facebook.
- Crear una App en Facebook: Crea una nueva app y añade el producto Messenger.
- Generar un Token de Acceso: Genera un Token de Acceso de Página para tu app.
- Configurar un Webhook: Configura un webhook para recibir mensajes de los usuarios.
Ejemplo de Configuración de Webhook:
from flask import Flask, request
import requests
app = Flask(__name__)
PAGE_ACCESS_TOKEN = 'your_facebook_page_access_token'
def send_message(recipient_id, message_text):
url = f"<https://graph.facebook.com/v11.0/me/messages?access_token={PAGE_ACCESS_TOKEN}>"
headers = {"Content-Type": "application/json"}
payload = {
"recipient": {"id": recipient_id},
"message": {"text": message_text}
}
requests.post(url, headers=headers, json=payload)
@app.route('/webhook', methods=['GET'])
def webhook_verification():
mode = request.args.get('hub.mode')
token = request.args.get('hub.verify_token')
challenge = request.args.get('hub.challenge')
if mode == 'subscribe' and token == 'your_verify_token':
return challenge
return 'Verification failed', 403
@app.route('/webhook', methods=['POST'])
def webhook():
data = request.json
if data['object'] == 'page':
for entry in data['entry']:
for messaging_event in entry['messaging']:
sender_id = messaging_event['sender']['id']
if 'message' in messaging_event:
message_text = messaging_event['message']['text']
response_text = summarize_text(message_text) # Modify to call appropriate summarization function
send_message(sender_id, response_text)
return 'OK', 200
if __name__ == '__main__':
app.run(debug=True)
En este script, definimos un endpoint webhook para recibir mensajes de Facebook Messenger y responder utilizando la función send_message
.
En esta sección, cubrimos la evaluación y el despliegue de nuestro chatbot agregador de noticias. Discutimos varias métricas y métodos para evaluar el rendimiento del chatbot, incluyendo métricas de precisión, comentarios de usuarios y tiempo de respuesta. También proporcionamos ejemplos de cómo desplegar el chatbot como una aplicación web utilizando Heroku e integrarlo con Facebook Messenger.
Siguiendo estos pasos, puedes asegurarte de que tu chatbot funcione bien en escenarios del mundo real y sea accesible para los usuarios en diferentes plataformas. El proceso de despliegue hace que el chatbot esté disponible para los usuarios, permitiéndoles interactuar con él y beneficiarse de sus funcionalidades.
12.5 Evaluación y Despliegue del Agregador
En esta sección, nos centraremos en evaluar el rendimiento del chatbot agregador de noticias y desplegarlo en una plataforma adecuada. La evaluación ayuda a garantizar que el chatbot cumpla con las expectativas de los usuarios y funcione bien en diversas condiciones. El despliegue hace que el chatbot sea accesible para los usuarios, permitiéndoles beneficiarse de sus funcionalidades.
12.5.1 Evaluación del Agregador
La evaluación implica medir el rendimiento del chatbot en términos de precisión, capacidad de respuesta y satisfacción del usuario. Utilizaremos diferentes métricas y métodos para evaluar estos aspectos.
1. Métricas de Precisión
Las métricas de precisión evalúan qué tan bien el chatbot categoriza y resume los artículos de noticias. Las métricas comunes incluyen precisión, recall y F1-score para la precisión de la categorización y comentarios de los usuarios para la calidad del resumen.
Ejemplo: Evaluación de la Precisión de la Categorización
Podemos usar la biblioteca sklearn para calcular precisión, recall y F1-score para el modelo de categorización.
from sklearn.metrics import classification_report
from nlp_engine import categorize_article
# Load test articles and their true categories
with open('data/test_articles.json', 'r') as file:
test_articles = json.load(file)
# Prepare data for evaluation
true_categories = [article['category'] for article in test_articles]
predicted_categories = [categorize_article(article['content']) for article in test_articles]
# Flatten lists for multi-label classification
true_categories_flat = [item for sublist in true_categories for item in sublist]
predicted_categories_flat = [item for sublist in predicted_categories for item in sublist]
# Print classification report
print(classification_report(true_categories_flat, predicted_categories_flat))
En este script, cargamos artículos de prueba y sus categorías verdaderas, predecimos las categorías utilizando el modelo entrenado y mostramos un informe de clasificación que incluye precisión, recall y F1-score.
2. Comentarios de Usuarios sobre el Resumen
Los comentarios de los usuarios son esenciales para evaluar la calidad de los resúmenes generados por el chatbot. Podemos recopilar comentarios de los usuarios a través de encuestas o calificaciones directas.
Ejemplo: Recopilación de Comentarios de Usuarios
Podemos modificar nuestra aplicación Flask para incluir un formulario de comentarios donde los usuarios puedan calificar la calidad de los resúmenes.
app.py (continuación):
feedback_data = []
@app.route('/feedback', methods=['POST'])
def feedback():
user_feedback = request.json
feedback_data.append(user_feedback)
return jsonify({'message': 'Thank you for your feedback!'})
# HTML template for feedback form
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>News Aggregator Chatbot</title>
<link rel="stylesheet" href="<https://stackpath.bootstrapcdn.com/bootstrap/4.5.2/css/bootstrap.min.css>">
</head>
<body>
<div class="container">
<h1 class="mt-5">News Aggregator Chatbot</h1>
<form id="news-form" class="mt-4">
<div class="form-group">
<label for="category">Select News Category</label>
<select class="form-control" id="category" name="category">
<option value="general">General</option>
<option value="business">Business</option>
<option value="technology">Technology</option>
<option value="sports">Sports</option>
<option value="entertainment">Entertainment</option>
</select>
</div>
<button type="submit" class="btn btn-primary">Get News</button>
</form>
<div id="news-articles" class="mt-4"></div>
</div>
<script src="<https://code.jquery.com/jquery-3.5.1.min.js>"></script>
<script>
$(document).ready(function() {
$('#news-form').on('submit', function(event) {
event.preventDefault();
const category = $('#category').val();
$.post('/get_news', { category: category }, function(data) {
let articlesHtml = '<div class="list-group">';
data.forEach(article => {
articlesHtml += `
<div class="list-group-item">
<h5 class="mb-1">${article.title}</h5>
<p class="mb-1">${article.description}</p>
<small>${article.source} - ${article.publishedAt}</small>
<button class="btn btn-secondary btn-sm mt-2" onclick="categorizeArticle('${article.content}')">Categorize</button>
<div class="category mt-2" id="category-${article.title}"></div>
<button class="btn btn-secondary btn-sm mt-2" onclick="summarizeArticle('${article.content}')">Summarize</button>
<div class="summary mt-2" id="summary-${article.title}"></div>
<form id="feedback-form-${article.title}" class="mt-2">
<label for="rating">Rate this summary:</label>
<select class="form-control" id="rating-${article.title}">
<option value="1">1 - Poor</option>
<option value="2">2 - Fair</option>
<option value="3">3 - Good</option>
<option value="4">4 - Very Good</option>
<option value="5">5 - Excellent</option>
</select>
<button type="submit" class="btn btn-primary btn-sm mt-2">Submit Feedback</button>
</form>
</div>
`;
});
articlesHtml += '</div>';
$('#news-articles').html(articlesHtml);
});
});
function summarizeArticle(article) {
const summaryType = 'extractive'; // or 'abstractive'
$.post('/summarize_article', { article: article, summary_type: summaryType }, function(data) {
$('#summary-' + article.title).html('<p>' + data.summary + '</p>');
});
}
function categorizeArticle(article) {
$.post('/categorize_article', { article: article }, function(data) {
$('#category-' + article.title).html('<p>' + data.category.join(', ') + '</p>');
});
}
$('body').on('submit', 'form[id^="feedback-form-"]', function(event) {
event.preventDefault();
const articleTitle = $(this).attr('id').replace('feedback-form-', '');
const rating = $(`#rating-${articleTitle}`).val();
const feedback = {
article: articleTitle,
rating: rating
};
$.post('/feedback', feedback, function(response) {
alert(response.message);
});
});
});
</script>
</body>
</html>
En esta plantilla actualizada, añadimos un formulario de comentarios para cada artículo, permitiendo a los usuarios calificar la calidad de los resúmenes. Los comentarios se envían al endpoint /feedback
y se almacenan para análisis posterior.
3. Tiempo de Respuesta
El tiempo de respuesta es crítico para la experiencia del usuario. Necesitamos asegurarnos de que el chatbot responda rápidamente a las consultas de los usuarios.
Ejemplo: Medición del Tiempo de Respuesta
Podemos medir el tiempo de respuesta para diferentes consultas usando el módulo time
de Python.
evaluate.py:
import time
# Function to measure response time
def measure_response_time(endpoint, data):
start_time = time.time()
response = requests.post(endpoint, json=data)
end_time = time.time()
response_time = end_time - start_time
return response_time
# Measure response time for summarization
article = "Sample news article content..."
data = {"article": article, "summary_type": "extractive"}
response_time = measure_response_time("<http://localhost:5000/summarize_article>", data)
print(f"Summarization Response Time: {response_time} seconds")
Al medir el tiempo de respuesta, podemos asegurarnos de que el chatbot cumpla con los criterios de rendimiento deseados.
12.5.2 Despliegue del Agregador
Una vez que el chatbot se evalúa y tiene un rendimiento satisfactorio, el siguiente paso es el despliegue. Desplegaremos el chatbot en una plataforma adecuada donde los usuarios puedan interactuar con él.
1. Despliegue de la Aplicación Web
Podemos desplegar el chatbot como una aplicación web utilizando una plataforma en la nube como Heroku, AWS o Google Cloud.
Ejemplo: Despliegue en Heroku
Para desplegar el chatbot en Heroku, sigue estos pasos:
- Instalar Heroku CLI: Descarga e instala el Heroku CLI desde Heroku.
- Iniciar Sesión en Heroku: Abre una terminal e inicia sesión en tu cuenta de Heroku.
heroku login
- Crear una App en Heroku: Crea una nueva app en Heroku.
heroku create your-app-name
- Preparar el Proyecto para Despliegue: Crea un
Procfile
y unrequirements.txt
en el directorio del proyecto.
Procfile:
```txt
web: python app.py
```
requirements.txt:
```txt
Flask
requests
nltk
gensim
transformers
```
5. Enviar el Proyecto a Heroku: Inicializa un repositorio Git, añade los archivos del proyecto y envíalos a Heroku.
```sh
git init
git add .
git commit -m "Initial commit"
git push heroku master
```
6. Abrir la App en Heroku: Abre la app desplegada en tu navegador.
```sh
heroku open
```
Siguiendo estos pasos, el chatbot se desplegará en Heroku y será accesible mediante una URL pública.
2. Integración con Apps de Mensajería
También podemos integrar el chatbot con aplicaciones de mensajería como Facebook Messenger, Slack o WhatsApp. Cada plataforma proporciona APIs para la integración de chatbots.
Ejemplo: Integración con Facebook Messenger
Para integrar el chatbot con Facebook Messenger, sigue estos pasos:
- Crear una Página de Facebook: Crea una nueva página de Facebook para tu chatbot.
- Configurar una Cuenta de Desarrollador en Facebook: Regístrate como desarrollador en el portal de desarrolladores de Facebook.
- Crear una App en Facebook: Crea una nueva app y añade el producto Messenger.
- Generar un Token de Acceso: Genera un Token de Acceso de Página para tu app.
- Configurar un Webhook: Configura un webhook para recibir mensajes de los usuarios.
Ejemplo de Configuración de Webhook:
from flask import Flask, request
import requests
app = Flask(__name__)
PAGE_ACCESS_TOKEN = 'your_facebook_page_access_token'
def send_message(recipient_id, message_text):
url = f"<https://graph.facebook.com/v11.0/me/messages?access_token={PAGE_ACCESS_TOKEN}>"
headers = {"Content-Type": "application/json"}
payload = {
"recipient": {"id": recipient_id},
"message": {"text": message_text}
}
requests.post(url, headers=headers, json=payload)
@app.route('/webhook', methods=['GET'])
def webhook_verification():
mode = request.args.get('hub.mode')
token = request.args.get('hub.verify_token')
challenge = request.args.get('hub.challenge')
if mode == 'subscribe' and token == 'your_verify_token':
return challenge
return 'Verification failed', 403
@app.route('/webhook', methods=['POST'])
def webhook():
data = request.json
if data['object'] == 'page':
for entry in data['entry']:
for messaging_event in entry['messaging']:
sender_id = messaging_event['sender']['id']
if 'message' in messaging_event:
message_text = messaging_event['message']['text']
response_text = summarize_text(message_text) # Modify to call appropriate summarization function
send_message(sender_id, response_text)
return 'OK', 200
if __name__ == '__main__':
app.run(debug=True)
En este script, definimos un endpoint webhook para recibir mensajes de Facebook Messenger y responder utilizando la función send_message
.
En esta sección, cubrimos la evaluación y el despliegue de nuestro chatbot agregador de noticias. Discutimos varias métricas y métodos para evaluar el rendimiento del chatbot, incluyendo métricas de precisión, comentarios de usuarios y tiempo de respuesta. También proporcionamos ejemplos de cómo desplegar el chatbot como una aplicación web utilizando Heroku e integrarlo con Facebook Messenger.
Siguiendo estos pasos, puedes asegurarte de que tu chatbot funcione bien en escenarios del mundo real y sea accesible para los usuarios en diferentes plataformas. El proceso de despliegue hace que el chatbot esté disponible para los usuarios, permitiéndoles interactuar con él y beneficiarse de sus funcionalidades.
12.5 Evaluación y Despliegue del Agregador
En esta sección, nos centraremos en evaluar el rendimiento del chatbot agregador de noticias y desplegarlo en una plataforma adecuada. La evaluación ayuda a garantizar que el chatbot cumpla con las expectativas de los usuarios y funcione bien en diversas condiciones. El despliegue hace que el chatbot sea accesible para los usuarios, permitiéndoles beneficiarse de sus funcionalidades.
12.5.1 Evaluación del Agregador
La evaluación implica medir el rendimiento del chatbot en términos de precisión, capacidad de respuesta y satisfacción del usuario. Utilizaremos diferentes métricas y métodos para evaluar estos aspectos.
1. Métricas de Precisión
Las métricas de precisión evalúan qué tan bien el chatbot categoriza y resume los artículos de noticias. Las métricas comunes incluyen precisión, recall y F1-score para la precisión de la categorización y comentarios de los usuarios para la calidad del resumen.
Ejemplo: Evaluación de la Precisión de la Categorización
Podemos usar la biblioteca sklearn para calcular precisión, recall y F1-score para el modelo de categorización.
from sklearn.metrics import classification_report
from nlp_engine import categorize_article
# Load test articles and their true categories
with open('data/test_articles.json', 'r') as file:
test_articles = json.load(file)
# Prepare data for evaluation
true_categories = [article['category'] for article in test_articles]
predicted_categories = [categorize_article(article['content']) for article in test_articles]
# Flatten lists for multi-label classification
true_categories_flat = [item for sublist in true_categories for item in sublist]
predicted_categories_flat = [item for sublist in predicted_categories for item in sublist]
# Print classification report
print(classification_report(true_categories_flat, predicted_categories_flat))
En este script, cargamos artículos de prueba y sus categorías verdaderas, predecimos las categorías utilizando el modelo entrenado y mostramos un informe de clasificación que incluye precisión, recall y F1-score.
2. Comentarios de Usuarios sobre el Resumen
Los comentarios de los usuarios son esenciales para evaluar la calidad de los resúmenes generados por el chatbot. Podemos recopilar comentarios de los usuarios a través de encuestas o calificaciones directas.
Ejemplo: Recopilación de Comentarios de Usuarios
Podemos modificar nuestra aplicación Flask para incluir un formulario de comentarios donde los usuarios puedan calificar la calidad de los resúmenes.
app.py (continuación):
feedback_data = []
@app.route('/feedback', methods=['POST'])
def feedback():
user_feedback = request.json
feedback_data.append(user_feedback)
return jsonify({'message': 'Thank you for your feedback!'})
# HTML template for feedback form
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>News Aggregator Chatbot</title>
<link rel="stylesheet" href="<https://stackpath.bootstrapcdn.com/bootstrap/4.5.2/css/bootstrap.min.css>">
</head>
<body>
<div class="container">
<h1 class="mt-5">News Aggregator Chatbot</h1>
<form id="news-form" class="mt-4">
<div class="form-group">
<label for="category">Select News Category</label>
<select class="form-control" id="category" name="category">
<option value="general">General</option>
<option value="business">Business</option>
<option value="technology">Technology</option>
<option value="sports">Sports</option>
<option value="entertainment">Entertainment</option>
</select>
</div>
<button type="submit" class="btn btn-primary">Get News</button>
</form>
<div id="news-articles" class="mt-4"></div>
</div>
<script src="<https://code.jquery.com/jquery-3.5.1.min.js>"></script>
<script>
$(document).ready(function() {
$('#news-form').on('submit', function(event) {
event.preventDefault();
const category = $('#category').val();
$.post('/get_news', { category: category }, function(data) {
let articlesHtml = '<div class="list-group">';
data.forEach(article => {
articlesHtml += `
<div class="list-group-item">
<h5 class="mb-1">${article.title}</h5>
<p class="mb-1">${article.description}</p>
<small>${article.source} - ${article.publishedAt}</small>
<button class="btn btn-secondary btn-sm mt-2" onclick="categorizeArticle('${article.content}')">Categorize</button>
<div class="category mt-2" id="category-${article.title}"></div>
<button class="btn btn-secondary btn-sm mt-2" onclick="summarizeArticle('${article.content}')">Summarize</button>
<div class="summary mt-2" id="summary-${article.title}"></div>
<form id="feedback-form-${article.title}" class="mt-2">
<label for="rating">Rate this summary:</label>
<select class="form-control" id="rating-${article.title}">
<option value="1">1 - Poor</option>
<option value="2">2 - Fair</option>
<option value="3">3 - Good</option>
<option value="4">4 - Very Good</option>
<option value="5">5 - Excellent</option>
</select>
<button type="submit" class="btn btn-primary btn-sm mt-2">Submit Feedback</button>
</form>
</div>
`;
});
articlesHtml += '</div>';
$('#news-articles').html(articlesHtml);
});
});
function summarizeArticle(article) {
const summaryType = 'extractive'; // or 'abstractive'
$.post('/summarize_article', { article: article, summary_type: summaryType }, function(data) {
$('#summary-' + article.title).html('<p>' + data.summary + '</p>');
});
}
function categorizeArticle(article) {
$.post('/categorize_article', { article: article }, function(data) {
$('#category-' + article.title).html('<p>' + data.category.join(', ') + '</p>');
});
}
$('body').on('submit', 'form[id^="feedback-form-"]', function(event) {
event.preventDefault();
const articleTitle = $(this).attr('id').replace('feedback-form-', '');
const rating = $(`#rating-${articleTitle}`).val();
const feedback = {
article: articleTitle,
rating: rating
};
$.post('/feedback', feedback, function(response) {
alert(response.message);
});
});
});
</script>
</body>
</html>
En esta plantilla actualizada, añadimos un formulario de comentarios para cada artículo, permitiendo a los usuarios calificar la calidad de los resúmenes. Los comentarios se envían al endpoint /feedback
y se almacenan para análisis posterior.
3. Tiempo de Respuesta
El tiempo de respuesta es crítico para la experiencia del usuario. Necesitamos asegurarnos de que el chatbot responda rápidamente a las consultas de los usuarios.
Ejemplo: Medición del Tiempo de Respuesta
Podemos medir el tiempo de respuesta para diferentes consultas usando el módulo time
de Python.
evaluate.py:
import time
# Function to measure response time
def measure_response_time(endpoint, data):
start_time = time.time()
response = requests.post(endpoint, json=data)
end_time = time.time()
response_time = end_time - start_time
return response_time
# Measure response time for summarization
article = "Sample news article content..."
data = {"article": article, "summary_type": "extractive"}
response_time = measure_response_time("<http://localhost:5000/summarize_article>", data)
print(f"Summarization Response Time: {response_time} seconds")
Al medir el tiempo de respuesta, podemos asegurarnos de que el chatbot cumpla con los criterios de rendimiento deseados.
12.5.2 Despliegue del Agregador
Una vez que el chatbot se evalúa y tiene un rendimiento satisfactorio, el siguiente paso es el despliegue. Desplegaremos el chatbot en una plataforma adecuada donde los usuarios puedan interactuar con él.
1. Despliegue de la Aplicación Web
Podemos desplegar el chatbot como una aplicación web utilizando una plataforma en la nube como Heroku, AWS o Google Cloud.
Ejemplo: Despliegue en Heroku
Para desplegar el chatbot en Heroku, sigue estos pasos:
- Instalar Heroku CLI: Descarga e instala el Heroku CLI desde Heroku.
- Iniciar Sesión en Heroku: Abre una terminal e inicia sesión en tu cuenta de Heroku.
heroku login
- Crear una App en Heroku: Crea una nueva app en Heroku.
heroku create your-app-name
- Preparar el Proyecto para Despliegue: Crea un
Procfile
y unrequirements.txt
en el directorio del proyecto.
Procfile:
```txt
web: python app.py
```
requirements.txt:
```txt
Flask
requests
nltk
gensim
transformers
```
5. Enviar el Proyecto a Heroku: Inicializa un repositorio Git, añade los archivos del proyecto y envíalos a Heroku.
```sh
git init
git add .
git commit -m "Initial commit"
git push heroku master
```
6. Abrir la App en Heroku: Abre la app desplegada en tu navegador.
```sh
heroku open
```
Siguiendo estos pasos, el chatbot se desplegará en Heroku y será accesible mediante una URL pública.
2. Integración con Apps de Mensajería
También podemos integrar el chatbot con aplicaciones de mensajería como Facebook Messenger, Slack o WhatsApp. Cada plataforma proporciona APIs para la integración de chatbots.
Ejemplo: Integración con Facebook Messenger
Para integrar el chatbot con Facebook Messenger, sigue estos pasos:
- Crear una Página de Facebook: Crea una nueva página de Facebook para tu chatbot.
- Configurar una Cuenta de Desarrollador en Facebook: Regístrate como desarrollador en el portal de desarrolladores de Facebook.
- Crear una App en Facebook: Crea una nueva app y añade el producto Messenger.
- Generar un Token de Acceso: Genera un Token de Acceso de Página para tu app.
- Configurar un Webhook: Configura un webhook para recibir mensajes de los usuarios.
Ejemplo de Configuración de Webhook:
from flask import Flask, request
import requests
app = Flask(__name__)
PAGE_ACCESS_TOKEN = 'your_facebook_page_access_token'
def send_message(recipient_id, message_text):
url = f"<https://graph.facebook.com/v11.0/me/messages?access_token={PAGE_ACCESS_TOKEN}>"
headers = {"Content-Type": "application/json"}
payload = {
"recipient": {"id": recipient_id},
"message": {"text": message_text}
}
requests.post(url, headers=headers, json=payload)
@app.route('/webhook', methods=['GET'])
def webhook_verification():
mode = request.args.get('hub.mode')
token = request.args.get('hub.verify_token')
challenge = request.args.get('hub.challenge')
if mode == 'subscribe' and token == 'your_verify_token':
return challenge
return 'Verification failed', 403
@app.route('/webhook', methods=['POST'])
def webhook():
data = request.json
if data['object'] == 'page':
for entry in data['entry']:
for messaging_event in entry['messaging']:
sender_id = messaging_event['sender']['id']
if 'message' in messaging_event:
message_text = messaging_event['message']['text']
response_text = summarize_text(message_text) # Modify to call appropriate summarization function
send_message(sender_id, response_text)
return 'OK', 200
if __name__ == '__main__':
app.run(debug=True)
En este script, definimos un endpoint webhook para recibir mensajes de Facebook Messenger y responder utilizando la función send_message
.
En esta sección, cubrimos la evaluación y el despliegue de nuestro chatbot agregador de noticias. Discutimos varias métricas y métodos para evaluar el rendimiento del chatbot, incluyendo métricas de precisión, comentarios de usuarios y tiempo de respuesta. También proporcionamos ejemplos de cómo desplegar el chatbot como una aplicación web utilizando Heroku e integrarlo con Facebook Messenger.
Siguiendo estos pasos, puedes asegurarte de que tu chatbot funcione bien en escenarios del mundo real y sea accesible para los usuarios en diferentes plataformas. El proceso de despliegue hace que el chatbot esté disponible para los usuarios, permitiéndoles interactuar con él y beneficiarse de sus funcionalidades.
12.5 Evaluación y Despliegue del Agregador
En esta sección, nos centraremos en evaluar el rendimiento del chatbot agregador de noticias y desplegarlo en una plataforma adecuada. La evaluación ayuda a garantizar que el chatbot cumpla con las expectativas de los usuarios y funcione bien en diversas condiciones. El despliegue hace que el chatbot sea accesible para los usuarios, permitiéndoles beneficiarse de sus funcionalidades.
12.5.1 Evaluación del Agregador
La evaluación implica medir el rendimiento del chatbot en términos de precisión, capacidad de respuesta y satisfacción del usuario. Utilizaremos diferentes métricas y métodos para evaluar estos aspectos.
1. Métricas de Precisión
Las métricas de precisión evalúan qué tan bien el chatbot categoriza y resume los artículos de noticias. Las métricas comunes incluyen precisión, recall y F1-score para la precisión de la categorización y comentarios de los usuarios para la calidad del resumen.
Ejemplo: Evaluación de la Precisión de la Categorización
Podemos usar la biblioteca sklearn para calcular precisión, recall y F1-score para el modelo de categorización.
from sklearn.metrics import classification_report
from nlp_engine import categorize_article
# Load test articles and their true categories
with open('data/test_articles.json', 'r') as file:
test_articles = json.load(file)
# Prepare data for evaluation
true_categories = [article['category'] for article in test_articles]
predicted_categories = [categorize_article(article['content']) for article in test_articles]
# Flatten lists for multi-label classification
true_categories_flat = [item for sublist in true_categories for item in sublist]
predicted_categories_flat = [item for sublist in predicted_categories for item in sublist]
# Print classification report
print(classification_report(true_categories_flat, predicted_categories_flat))
En este script, cargamos artículos de prueba y sus categorías verdaderas, predecimos las categorías utilizando el modelo entrenado y mostramos un informe de clasificación que incluye precisión, recall y F1-score.
2. Comentarios de Usuarios sobre el Resumen
Los comentarios de los usuarios son esenciales para evaluar la calidad de los resúmenes generados por el chatbot. Podemos recopilar comentarios de los usuarios a través de encuestas o calificaciones directas.
Ejemplo: Recopilación de Comentarios de Usuarios
Podemos modificar nuestra aplicación Flask para incluir un formulario de comentarios donde los usuarios puedan calificar la calidad de los resúmenes.
app.py (continuación):
feedback_data = []
@app.route('/feedback', methods=['POST'])
def feedback():
user_feedback = request.json
feedback_data.append(user_feedback)
return jsonify({'message': 'Thank you for your feedback!'})
# HTML template for feedback form
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>News Aggregator Chatbot</title>
<link rel="stylesheet" href="<https://stackpath.bootstrapcdn.com/bootstrap/4.5.2/css/bootstrap.min.css>">
</head>
<body>
<div class="container">
<h1 class="mt-5">News Aggregator Chatbot</h1>
<form id="news-form" class="mt-4">
<div class="form-group">
<label for="category">Select News Category</label>
<select class="form-control" id="category" name="category">
<option value="general">General</option>
<option value="business">Business</option>
<option value="technology">Technology</option>
<option value="sports">Sports</option>
<option value="entertainment">Entertainment</option>
</select>
</div>
<button type="submit" class="btn btn-primary">Get News</button>
</form>
<div id="news-articles" class="mt-4"></div>
</div>
<script src="<https://code.jquery.com/jquery-3.5.1.min.js>"></script>
<script>
$(document).ready(function() {
$('#news-form').on('submit', function(event) {
event.preventDefault();
const category = $('#category').val();
$.post('/get_news', { category: category }, function(data) {
let articlesHtml = '<div class="list-group">';
data.forEach(article => {
articlesHtml += `
<div class="list-group-item">
<h5 class="mb-1">${article.title}</h5>
<p class="mb-1">${article.description}</p>
<small>${article.source} - ${article.publishedAt}</small>
<button class="btn btn-secondary btn-sm mt-2" onclick="categorizeArticle('${article.content}')">Categorize</button>
<div class="category mt-2" id="category-${article.title}"></div>
<button class="btn btn-secondary btn-sm mt-2" onclick="summarizeArticle('${article.content}')">Summarize</button>
<div class="summary mt-2" id="summary-${article.title}"></div>
<form id="feedback-form-${article.title}" class="mt-2">
<label for="rating">Rate this summary:</label>
<select class="form-control" id="rating-${article.title}">
<option value="1">1 - Poor</option>
<option value="2">2 - Fair</option>
<option value="3">3 - Good</option>
<option value="4">4 - Very Good</option>
<option value="5">5 - Excellent</option>
</select>
<button type="submit" class="btn btn-primary btn-sm mt-2">Submit Feedback</button>
</form>
</div>
`;
});
articlesHtml += '</div>';
$('#news-articles').html(articlesHtml);
});
});
function summarizeArticle(article) {
const summaryType = 'extractive'; // or 'abstractive'
$.post('/summarize_article', { article: article, summary_type: summaryType }, function(data) {
$('#summary-' + article.title).html('<p>' + data.summary + '</p>');
});
}
function categorizeArticle(article) {
$.post('/categorize_article', { article: article }, function(data) {
$('#category-' + article.title).html('<p>' + data.category.join(', ') + '</p>');
});
}
$('body').on('submit', 'form[id^="feedback-form-"]', function(event) {
event.preventDefault();
const articleTitle = $(this).attr('id').replace('feedback-form-', '');
const rating = $(`#rating-${articleTitle}`).val();
const feedback = {
article: articleTitle,
rating: rating
};
$.post('/feedback', feedback, function(response) {
alert(response.message);
});
});
});
</script>
</body>
</html>
En esta plantilla actualizada, añadimos un formulario de comentarios para cada artículo, permitiendo a los usuarios calificar la calidad de los resúmenes. Los comentarios se envían al endpoint /feedback
y se almacenan para análisis posterior.
3. Tiempo de Respuesta
El tiempo de respuesta es crítico para la experiencia del usuario. Necesitamos asegurarnos de que el chatbot responda rápidamente a las consultas de los usuarios.
Ejemplo: Medición del Tiempo de Respuesta
Podemos medir el tiempo de respuesta para diferentes consultas usando el módulo time
de Python.
evaluate.py:
import time
# Function to measure response time
def measure_response_time(endpoint, data):
start_time = time.time()
response = requests.post(endpoint, json=data)
end_time = time.time()
response_time = end_time - start_time
return response_time
# Measure response time for summarization
article = "Sample news article content..."
data = {"article": article, "summary_type": "extractive"}
response_time = measure_response_time("<http://localhost:5000/summarize_article>", data)
print(f"Summarization Response Time: {response_time} seconds")
Al medir el tiempo de respuesta, podemos asegurarnos de que el chatbot cumpla con los criterios de rendimiento deseados.
12.5.2 Despliegue del Agregador
Una vez que el chatbot se evalúa y tiene un rendimiento satisfactorio, el siguiente paso es el despliegue. Desplegaremos el chatbot en una plataforma adecuada donde los usuarios puedan interactuar con él.
1. Despliegue de la Aplicación Web
Podemos desplegar el chatbot como una aplicación web utilizando una plataforma en la nube como Heroku, AWS o Google Cloud.
Ejemplo: Despliegue en Heroku
Para desplegar el chatbot en Heroku, sigue estos pasos:
- Instalar Heroku CLI: Descarga e instala el Heroku CLI desde Heroku.
- Iniciar Sesión en Heroku: Abre una terminal e inicia sesión en tu cuenta de Heroku.
heroku login
- Crear una App en Heroku: Crea una nueva app en Heroku.
heroku create your-app-name
- Preparar el Proyecto para Despliegue: Crea un
Procfile
y unrequirements.txt
en el directorio del proyecto.
Procfile:
```txt
web: python app.py
```
requirements.txt:
```txt
Flask
requests
nltk
gensim
transformers
```
5. Enviar el Proyecto a Heroku: Inicializa un repositorio Git, añade los archivos del proyecto y envíalos a Heroku.
```sh
git init
git add .
git commit -m "Initial commit"
git push heroku master
```
6. Abrir la App en Heroku: Abre la app desplegada en tu navegador.
```sh
heroku open
```
Siguiendo estos pasos, el chatbot se desplegará en Heroku y será accesible mediante una URL pública.
2. Integración con Apps de Mensajería
También podemos integrar el chatbot con aplicaciones de mensajería como Facebook Messenger, Slack o WhatsApp. Cada plataforma proporciona APIs para la integración de chatbots.
Ejemplo: Integración con Facebook Messenger
Para integrar el chatbot con Facebook Messenger, sigue estos pasos:
- Crear una Página de Facebook: Crea una nueva página de Facebook para tu chatbot.
- Configurar una Cuenta de Desarrollador en Facebook: Regístrate como desarrollador en el portal de desarrolladores de Facebook.
- Crear una App en Facebook: Crea una nueva app y añade el producto Messenger.
- Generar un Token de Acceso: Genera un Token de Acceso de Página para tu app.
- Configurar un Webhook: Configura un webhook para recibir mensajes de los usuarios.
Ejemplo de Configuración de Webhook:
from flask import Flask, request
import requests
app = Flask(__name__)
PAGE_ACCESS_TOKEN = 'your_facebook_page_access_token'
def send_message(recipient_id, message_text):
url = f"<https://graph.facebook.com/v11.0/me/messages?access_token={PAGE_ACCESS_TOKEN}>"
headers = {"Content-Type": "application/json"}
payload = {
"recipient": {"id": recipient_id},
"message": {"text": message_text}
}
requests.post(url, headers=headers, json=payload)
@app.route('/webhook', methods=['GET'])
def webhook_verification():
mode = request.args.get('hub.mode')
token = request.args.get('hub.verify_token')
challenge = request.args.get('hub.challenge')
if mode == 'subscribe' and token == 'your_verify_token':
return challenge
return 'Verification failed', 403
@app.route('/webhook', methods=['POST'])
def webhook():
data = request.json
if data['object'] == 'page':
for entry in data['entry']:
for messaging_event in entry['messaging']:
sender_id = messaging_event['sender']['id']
if 'message' in messaging_event:
message_text = messaging_event['message']['text']
response_text = summarize_text(message_text) # Modify to call appropriate summarization function
send_message(sender_id, response_text)
return 'OK', 200
if __name__ == '__main__':
app.run(debug=True)
En este script, definimos un endpoint webhook para recibir mensajes de Facebook Messenger y responder utilizando la función send_message
.
En esta sección, cubrimos la evaluación y el despliegue de nuestro chatbot agregador de noticias. Discutimos varias métricas y métodos para evaluar el rendimiento del chatbot, incluyendo métricas de precisión, comentarios de usuarios y tiempo de respuesta. También proporcionamos ejemplos de cómo desplegar el chatbot como una aplicación web utilizando Heroku e integrarlo con Facebook Messenger.
Siguiendo estos pasos, puedes asegurarte de que tu chatbot funcione bien en escenarios del mundo real y sea accesible para los usuarios en diferentes plataformas. El proceso de despliegue hace que el chatbot esté disponible para los usuarios, permitiéndoles interactuar con él y beneficiarse de sus funcionalidades.