Menu iconMenu icon
Procesamiento de Lenguaje Natural con Python Edición Actualizada

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.

evaluate.py:

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:

  1. Instalar Heroku CLI: Descarga e instala el Heroku CLI desde Heroku.
  2. Iniciar Sesión en Heroku: Abre una terminal e inicia sesión en tu cuenta de Heroku.
    heroku login
  3. Crear una App en Heroku: Crea una nueva app en Heroku.
    heroku create your-app-name
  4. Preparar el Proyecto para Despliegue: Crea un Procfile y un requirements.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:

  1. Crear una Página de Facebook: Crea una nueva página de Facebook para tu chatbot.
  2. Configurar una Cuenta de Desarrollador en Facebook: Regístrate como desarrollador en el portal de desarrolladores de Facebook.
  3. Crear una App en Facebook: Crea una nueva app y añade el producto Messenger.
  4. Generar un Token de Acceso: Genera un Token de Acceso de Página para tu app.
  5. 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.

evaluate.py:

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:

  1. Instalar Heroku CLI: Descarga e instala el Heroku CLI desde Heroku.
  2. Iniciar Sesión en Heroku: Abre una terminal e inicia sesión en tu cuenta de Heroku.
    heroku login
  3. Crear una App en Heroku: Crea una nueva app en Heroku.
    heroku create your-app-name
  4. Preparar el Proyecto para Despliegue: Crea un Procfile y un requirements.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:

  1. Crear una Página de Facebook: Crea una nueva página de Facebook para tu chatbot.
  2. Configurar una Cuenta de Desarrollador en Facebook: Regístrate como desarrollador en el portal de desarrolladores de Facebook.
  3. Crear una App en Facebook: Crea una nueva app y añade el producto Messenger.
  4. Generar un Token de Acceso: Genera un Token de Acceso de Página para tu app.
  5. 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.

evaluate.py:

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:

  1. Instalar Heroku CLI: Descarga e instala el Heroku CLI desde Heroku.
  2. Iniciar Sesión en Heroku: Abre una terminal e inicia sesión en tu cuenta de Heroku.
    heroku login
  3. Crear una App en Heroku: Crea una nueva app en Heroku.
    heroku create your-app-name
  4. Preparar el Proyecto para Despliegue: Crea un Procfile y un requirements.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:

  1. Crear una Página de Facebook: Crea una nueva página de Facebook para tu chatbot.
  2. Configurar una Cuenta de Desarrollador en Facebook: Regístrate como desarrollador en el portal de desarrolladores de Facebook.
  3. Crear una App en Facebook: Crea una nueva app y añade el producto Messenger.
  4. Generar un Token de Acceso: Genera un Token de Acceso de Página para tu app.
  5. 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.

evaluate.py:

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:

  1. Instalar Heroku CLI: Descarga e instala el Heroku CLI desde Heroku.
  2. Iniciar Sesión en Heroku: Abre una terminal e inicia sesión en tu cuenta de Heroku.
    heroku login
  3. Crear una App en Heroku: Crea una nueva app en Heroku.
    heroku create your-app-name
  4. Preparar el Proyecto para Despliegue: Crea un Procfile y un requirements.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:

  1. Crear una Página de Facebook: Crea una nueva página de Facebook para tu chatbot.
  2. Configurar una Cuenta de Desarrollador en Facebook: Regístrate como desarrollador en el portal de desarrolladores de Facebook.
  3. Crear una App en Facebook: Crea una nueva app y añade el producto Messenger.
  4. Generar un Token de Acceso: Genera un Token de Acceso de Página para tu app.
  5. 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.