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

Capítulo 10: Introducción a los Chatbots

Ejercicios Prácticos

Ejercicio 1: Chatbot Basado en Reglas

Tarea: Implementar un chatbot basado en reglas que pueda responder preguntas básicas sobre la información de contacto de una empresa ficticia, horarios de operación y servicios ofrecidos.

Solución:

def rule_based_chatbot(user_input):
    responses = {
        "hello": "Hello! How can I assist you today?",
        "hi": "Hi there! What can I do for you?",
        "what are your hours of operation?": "Our office is open from 9 AM to 5 PM, Monday to Friday.",
        "where are you located?": "We are located at 123 Main Street, Anytown, USA.",
        "what services do you offer?": "We offer web development, mobile app development, and digital marketing services.",
        "bye": "Goodbye! Have a great day!"
    }

    user_input = user_input.lower()
    return responses.get(user_input, "I'm sorry, I don't understand that. Can you please rephrase?")

# Test the chatbot
while True:
    user_input = input("You: ")
    if user_input.lower() == "exit":
        print("ChatBot: Goodbye! Have a great day!")
        break
    response = rule_based_chatbot(user_input)
    print(f"ChatBot: {response}")

Ejercicio 2: Retrieval-Based Chatbot

Tarea: Implementar un chatbot basado en recuperación que use el vectorizador TF-IDF y la similitud coseno para coincidir las consultas de los usuarios con respuestas predefinidas.

Solución:

from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.metrics.pairwise import cosine_similarity

corpus = [
    "Our office is open from 9 AM to 5 PM, Monday to Friday.",
    "We are located at 123 Main Street, Anytown, USA.",
    "We offer web development, mobile app development, and digital marketing services."
]

vectorizer = TfidfVectorizer()
X = vectorizer.fit_transform(corpus)

def retrieval_based_chatbot(user_input):
    user_input_vector = vectorizer.transform([user_input])
    similarities = cosine_similarity(user_input_vector, X)
    response_index = similarities.argmax()
    return corpus[response_index]

# Test the chatbot
while True:
    user_input = input("You: ")
    if user_input.lower() == "exit":
        print("ChatBot: Goodbye! Have a great day!")
        break
    response = retrieval_based_chatbot(user_input)
    print(f"ChatBot: {response}")

Ejercicio 3: Generative Chatbot

Tarea: Implementar un chatbot generativo simple utilizando un modelo Seq2Seq existente para generar respuestas. Para este ejercicio, simularemos el uso de un modelo preentrenado.

Solución:
Dado que entrenar un modelo Seq2Seq desde cero es complejo y requiere una cantidad significativa de datos, simularemos las respuestas como si fueran generadas por un modelo Seq2Seq preentrenado.

# Simulated pre-trained Seq2Seq model responses
pretrained_responses = {
    "hello": "Hello! How can I help you today?",
    "how are you?": "I'm just a chatbot, but I'm here to assist you!",
    "what is your name?": "I am ChatBot, your virtual assistant.",
    "bye": "Goodbye! Take care!"
}

def generative_chatbot(user_input):
    user_input = user_input.lower()
    return pretrained_responses.get(user_input, "I'm still learning. Can you please rephrase?")

# Test the chatbot
while True:
    user_input = input("You: ")
    if user_input.lower() == "exit":
        print("ChatBot: Goodbye! Take care!")
        break
    response = generative_chatbot(user_input)
    print(f"ChatBot: {response}")

Ejercicio 4: Hybrid Chatbot

Tarea: Implementar un chatbot híbrido que utilice respuestas basadas en reglas para saludos comunes y respuestas basadas en autoaprendizaje (basadas en recuperación) para otras consultas.

Solución:

from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.metrics.pairwise import cosine_similarity

corpus = [
    "Our office is open from 9 AM to 5 PM, Monday to Friday.",
    "We are located at 123 Main Street, Anytown, USA.",
    "We offer web development, mobile app development, and digital marketing services."
]

vectorizer = TfidfVectorizer()
X = vectorizer.fit_transform(corpus)

def hybrid_chatbot(user_input):
    rule_based_responses = {
        "hello": "Hello! How can I assist you today?",
        "hi": "Hi there! What can I do for you?",
        "bye": "Goodbye! Have a great day!"
    }

    user_input_lower = user_input.lower()
    if user_input_lower in rule_based_responses:
        return rule_based_responses[user_input_lower]
    else:
        user_input_vector = vectorizer.transform([user_input])
        similarities = cosine_similarity(user_input_vector, X)
        response_index = similarities.argmax()
        return corpus[response_index]

# Test the chatbot
while True:
    user_input = input("You: ")
    if user_input.lower() == "exit":
        print("ChatBot: Goodbye! Have a great day!")
        break
    response = hybrid_chatbot(user_input)
    print(f"ChatBot: {response}")

Ejercicio 5: Mejorar el Chatbot Híbrido con Más Respuestas

Tarea: Mejora el chatbot híbrido añadiendo más respuestas basadas en reglas y ampliando el corpus de respuestas basadas en recuperación.

Solución:

from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.metrics.pairwise import cosine_similarity

corpus = [
    "Our office is open from 9 AM to 5 PM, Monday to Friday.",
    "We are located at 123 Main Street, Anytown, USA.",
    "We offer web development, mobile app development, and digital marketing services.",
    "You can contact us at support@company.com.",
    "Our phone number is (123) 456-7890."
]

vectorizer = TfidfVectorizer()
X = vectorizer.fit_transform(corpus)

def enhanced_hybrid_chatbot(user_input):
    rule_based_responses = {
        "hello": "Hello! How can I assist you today?",
        "hi": "Hi there! What can I do for you?",
        "what is your phone number?": "Our phone number is (123) 456-7890.",
        "what is your email address?": "You can contact us at support@company.com.",
        "bye": "Goodbye! Have a great day!"
    }

    user_input_lower = user_input.lower()
    if user_input_lower in rule_based_responses:
        return rule_based_responses[user_input_lower]
    else:
        user_input_vector = vectorizer.transform([user_input])
        similarities = cosine_similarity(user_input_vector, X)
        response_index = similarities.argmax()
        return corpus[response_index]

# Test the chatbot
while True:
    user_input = input("You: ")
    if user_input.lower() == "exit":
        print("ChatBot: Goodbye! Have a great day!")
        break
    response = enhanced_hybrid_chatbot(user_input)
    print(f"ChatBot: {response}")

Estos ejercicios proporcionan una experiencia práctica con diferentes tipos de chatbots, reforzando los conceptos cubiertos en este capítulo.

Ejercicios Prácticos

Ejercicio 1: Chatbot Basado en Reglas

Tarea: Implementar un chatbot basado en reglas que pueda responder preguntas básicas sobre la información de contacto de una empresa ficticia, horarios de operación y servicios ofrecidos.

Solución:

def rule_based_chatbot(user_input):
    responses = {
        "hello": "Hello! How can I assist you today?",
        "hi": "Hi there! What can I do for you?",
        "what are your hours of operation?": "Our office is open from 9 AM to 5 PM, Monday to Friday.",
        "where are you located?": "We are located at 123 Main Street, Anytown, USA.",
        "what services do you offer?": "We offer web development, mobile app development, and digital marketing services.",
        "bye": "Goodbye! Have a great day!"
    }

    user_input = user_input.lower()
    return responses.get(user_input, "I'm sorry, I don't understand that. Can you please rephrase?")

# Test the chatbot
while True:
    user_input = input("You: ")
    if user_input.lower() == "exit":
        print("ChatBot: Goodbye! Have a great day!")
        break
    response = rule_based_chatbot(user_input)
    print(f"ChatBot: {response}")

Ejercicio 2: Retrieval-Based Chatbot

Tarea: Implementar un chatbot basado en recuperación que use el vectorizador TF-IDF y la similitud coseno para coincidir las consultas de los usuarios con respuestas predefinidas.

Solución:

from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.metrics.pairwise import cosine_similarity

corpus = [
    "Our office is open from 9 AM to 5 PM, Monday to Friday.",
    "We are located at 123 Main Street, Anytown, USA.",
    "We offer web development, mobile app development, and digital marketing services."
]

vectorizer = TfidfVectorizer()
X = vectorizer.fit_transform(corpus)

def retrieval_based_chatbot(user_input):
    user_input_vector = vectorizer.transform([user_input])
    similarities = cosine_similarity(user_input_vector, X)
    response_index = similarities.argmax()
    return corpus[response_index]

# Test the chatbot
while True:
    user_input = input("You: ")
    if user_input.lower() == "exit":
        print("ChatBot: Goodbye! Have a great day!")
        break
    response = retrieval_based_chatbot(user_input)
    print(f"ChatBot: {response}")

Ejercicio 3: Generative Chatbot

Tarea: Implementar un chatbot generativo simple utilizando un modelo Seq2Seq existente para generar respuestas. Para este ejercicio, simularemos el uso de un modelo preentrenado.

Solución:
Dado que entrenar un modelo Seq2Seq desde cero es complejo y requiere una cantidad significativa de datos, simularemos las respuestas como si fueran generadas por un modelo Seq2Seq preentrenado.

# Simulated pre-trained Seq2Seq model responses
pretrained_responses = {
    "hello": "Hello! How can I help you today?",
    "how are you?": "I'm just a chatbot, but I'm here to assist you!",
    "what is your name?": "I am ChatBot, your virtual assistant.",
    "bye": "Goodbye! Take care!"
}

def generative_chatbot(user_input):
    user_input = user_input.lower()
    return pretrained_responses.get(user_input, "I'm still learning. Can you please rephrase?")

# Test the chatbot
while True:
    user_input = input("You: ")
    if user_input.lower() == "exit":
        print("ChatBot: Goodbye! Take care!")
        break
    response = generative_chatbot(user_input)
    print(f"ChatBot: {response}")

Ejercicio 4: Hybrid Chatbot

Tarea: Implementar un chatbot híbrido que utilice respuestas basadas en reglas para saludos comunes y respuestas basadas en autoaprendizaje (basadas en recuperación) para otras consultas.

Solución:

from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.metrics.pairwise import cosine_similarity

corpus = [
    "Our office is open from 9 AM to 5 PM, Monday to Friday.",
    "We are located at 123 Main Street, Anytown, USA.",
    "We offer web development, mobile app development, and digital marketing services."
]

vectorizer = TfidfVectorizer()
X = vectorizer.fit_transform(corpus)

def hybrid_chatbot(user_input):
    rule_based_responses = {
        "hello": "Hello! How can I assist you today?",
        "hi": "Hi there! What can I do for you?",
        "bye": "Goodbye! Have a great day!"
    }

    user_input_lower = user_input.lower()
    if user_input_lower in rule_based_responses:
        return rule_based_responses[user_input_lower]
    else:
        user_input_vector = vectorizer.transform([user_input])
        similarities = cosine_similarity(user_input_vector, X)
        response_index = similarities.argmax()
        return corpus[response_index]

# Test the chatbot
while True:
    user_input = input("You: ")
    if user_input.lower() == "exit":
        print("ChatBot: Goodbye! Have a great day!")
        break
    response = hybrid_chatbot(user_input)
    print(f"ChatBot: {response}")

Ejercicio 5: Mejorar el Chatbot Híbrido con Más Respuestas

Tarea: Mejora el chatbot híbrido añadiendo más respuestas basadas en reglas y ampliando el corpus de respuestas basadas en recuperación.

Solución:

from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.metrics.pairwise import cosine_similarity

corpus = [
    "Our office is open from 9 AM to 5 PM, Monday to Friday.",
    "We are located at 123 Main Street, Anytown, USA.",
    "We offer web development, mobile app development, and digital marketing services.",
    "You can contact us at support@company.com.",
    "Our phone number is (123) 456-7890."
]

vectorizer = TfidfVectorizer()
X = vectorizer.fit_transform(corpus)

def enhanced_hybrid_chatbot(user_input):
    rule_based_responses = {
        "hello": "Hello! How can I assist you today?",
        "hi": "Hi there! What can I do for you?",
        "what is your phone number?": "Our phone number is (123) 456-7890.",
        "what is your email address?": "You can contact us at support@company.com.",
        "bye": "Goodbye! Have a great day!"
    }

    user_input_lower = user_input.lower()
    if user_input_lower in rule_based_responses:
        return rule_based_responses[user_input_lower]
    else:
        user_input_vector = vectorizer.transform([user_input])
        similarities = cosine_similarity(user_input_vector, X)
        response_index = similarities.argmax()
        return corpus[response_index]

# Test the chatbot
while True:
    user_input = input("You: ")
    if user_input.lower() == "exit":
        print("ChatBot: Goodbye! Have a great day!")
        break
    response = enhanced_hybrid_chatbot(user_input)
    print(f"ChatBot: {response}")

Estos ejercicios proporcionan una experiencia práctica con diferentes tipos de chatbots, reforzando los conceptos cubiertos en este capítulo.

Ejercicios Prácticos

Ejercicio 1: Chatbot Basado en Reglas

Tarea: Implementar un chatbot basado en reglas que pueda responder preguntas básicas sobre la información de contacto de una empresa ficticia, horarios de operación y servicios ofrecidos.

Solución:

def rule_based_chatbot(user_input):
    responses = {
        "hello": "Hello! How can I assist you today?",
        "hi": "Hi there! What can I do for you?",
        "what are your hours of operation?": "Our office is open from 9 AM to 5 PM, Monday to Friday.",
        "where are you located?": "We are located at 123 Main Street, Anytown, USA.",
        "what services do you offer?": "We offer web development, mobile app development, and digital marketing services.",
        "bye": "Goodbye! Have a great day!"
    }

    user_input = user_input.lower()
    return responses.get(user_input, "I'm sorry, I don't understand that. Can you please rephrase?")

# Test the chatbot
while True:
    user_input = input("You: ")
    if user_input.lower() == "exit":
        print("ChatBot: Goodbye! Have a great day!")
        break
    response = rule_based_chatbot(user_input)
    print(f"ChatBot: {response}")

Ejercicio 2: Retrieval-Based Chatbot

Tarea: Implementar un chatbot basado en recuperación que use el vectorizador TF-IDF y la similitud coseno para coincidir las consultas de los usuarios con respuestas predefinidas.

Solución:

from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.metrics.pairwise import cosine_similarity

corpus = [
    "Our office is open from 9 AM to 5 PM, Monday to Friday.",
    "We are located at 123 Main Street, Anytown, USA.",
    "We offer web development, mobile app development, and digital marketing services."
]

vectorizer = TfidfVectorizer()
X = vectorizer.fit_transform(corpus)

def retrieval_based_chatbot(user_input):
    user_input_vector = vectorizer.transform([user_input])
    similarities = cosine_similarity(user_input_vector, X)
    response_index = similarities.argmax()
    return corpus[response_index]

# Test the chatbot
while True:
    user_input = input("You: ")
    if user_input.lower() == "exit":
        print("ChatBot: Goodbye! Have a great day!")
        break
    response = retrieval_based_chatbot(user_input)
    print(f"ChatBot: {response}")

Ejercicio 3: Generative Chatbot

Tarea: Implementar un chatbot generativo simple utilizando un modelo Seq2Seq existente para generar respuestas. Para este ejercicio, simularemos el uso de un modelo preentrenado.

Solución:
Dado que entrenar un modelo Seq2Seq desde cero es complejo y requiere una cantidad significativa de datos, simularemos las respuestas como si fueran generadas por un modelo Seq2Seq preentrenado.

# Simulated pre-trained Seq2Seq model responses
pretrained_responses = {
    "hello": "Hello! How can I help you today?",
    "how are you?": "I'm just a chatbot, but I'm here to assist you!",
    "what is your name?": "I am ChatBot, your virtual assistant.",
    "bye": "Goodbye! Take care!"
}

def generative_chatbot(user_input):
    user_input = user_input.lower()
    return pretrained_responses.get(user_input, "I'm still learning. Can you please rephrase?")

# Test the chatbot
while True:
    user_input = input("You: ")
    if user_input.lower() == "exit":
        print("ChatBot: Goodbye! Take care!")
        break
    response = generative_chatbot(user_input)
    print(f"ChatBot: {response}")

Ejercicio 4: Hybrid Chatbot

Tarea: Implementar un chatbot híbrido que utilice respuestas basadas en reglas para saludos comunes y respuestas basadas en autoaprendizaje (basadas en recuperación) para otras consultas.

Solución:

from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.metrics.pairwise import cosine_similarity

corpus = [
    "Our office is open from 9 AM to 5 PM, Monday to Friday.",
    "We are located at 123 Main Street, Anytown, USA.",
    "We offer web development, mobile app development, and digital marketing services."
]

vectorizer = TfidfVectorizer()
X = vectorizer.fit_transform(corpus)

def hybrid_chatbot(user_input):
    rule_based_responses = {
        "hello": "Hello! How can I assist you today?",
        "hi": "Hi there! What can I do for you?",
        "bye": "Goodbye! Have a great day!"
    }

    user_input_lower = user_input.lower()
    if user_input_lower in rule_based_responses:
        return rule_based_responses[user_input_lower]
    else:
        user_input_vector = vectorizer.transform([user_input])
        similarities = cosine_similarity(user_input_vector, X)
        response_index = similarities.argmax()
        return corpus[response_index]

# Test the chatbot
while True:
    user_input = input("You: ")
    if user_input.lower() == "exit":
        print("ChatBot: Goodbye! Have a great day!")
        break
    response = hybrid_chatbot(user_input)
    print(f"ChatBot: {response}")

Ejercicio 5: Mejorar el Chatbot Híbrido con Más Respuestas

Tarea: Mejora el chatbot híbrido añadiendo más respuestas basadas en reglas y ampliando el corpus de respuestas basadas en recuperación.

Solución:

from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.metrics.pairwise import cosine_similarity

corpus = [
    "Our office is open from 9 AM to 5 PM, Monday to Friday.",
    "We are located at 123 Main Street, Anytown, USA.",
    "We offer web development, mobile app development, and digital marketing services.",
    "You can contact us at support@company.com.",
    "Our phone number is (123) 456-7890."
]

vectorizer = TfidfVectorizer()
X = vectorizer.fit_transform(corpus)

def enhanced_hybrid_chatbot(user_input):
    rule_based_responses = {
        "hello": "Hello! How can I assist you today?",
        "hi": "Hi there! What can I do for you?",
        "what is your phone number?": "Our phone number is (123) 456-7890.",
        "what is your email address?": "You can contact us at support@company.com.",
        "bye": "Goodbye! Have a great day!"
    }

    user_input_lower = user_input.lower()
    if user_input_lower in rule_based_responses:
        return rule_based_responses[user_input_lower]
    else:
        user_input_vector = vectorizer.transform([user_input])
        similarities = cosine_similarity(user_input_vector, X)
        response_index = similarities.argmax()
        return corpus[response_index]

# Test the chatbot
while True:
    user_input = input("You: ")
    if user_input.lower() == "exit":
        print("ChatBot: Goodbye! Have a great day!")
        break
    response = enhanced_hybrid_chatbot(user_input)
    print(f"ChatBot: {response}")

Estos ejercicios proporcionan una experiencia práctica con diferentes tipos de chatbots, reforzando los conceptos cubiertos en este capítulo.

Ejercicios Prácticos

Ejercicio 1: Chatbot Basado en Reglas

Tarea: Implementar un chatbot basado en reglas que pueda responder preguntas básicas sobre la información de contacto de una empresa ficticia, horarios de operación y servicios ofrecidos.

Solución:

def rule_based_chatbot(user_input):
    responses = {
        "hello": "Hello! How can I assist you today?",
        "hi": "Hi there! What can I do for you?",
        "what are your hours of operation?": "Our office is open from 9 AM to 5 PM, Monday to Friday.",
        "where are you located?": "We are located at 123 Main Street, Anytown, USA.",
        "what services do you offer?": "We offer web development, mobile app development, and digital marketing services.",
        "bye": "Goodbye! Have a great day!"
    }

    user_input = user_input.lower()
    return responses.get(user_input, "I'm sorry, I don't understand that. Can you please rephrase?")

# Test the chatbot
while True:
    user_input = input("You: ")
    if user_input.lower() == "exit":
        print("ChatBot: Goodbye! Have a great day!")
        break
    response = rule_based_chatbot(user_input)
    print(f"ChatBot: {response}")

Ejercicio 2: Retrieval-Based Chatbot

Tarea: Implementar un chatbot basado en recuperación que use el vectorizador TF-IDF y la similitud coseno para coincidir las consultas de los usuarios con respuestas predefinidas.

Solución:

from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.metrics.pairwise import cosine_similarity

corpus = [
    "Our office is open from 9 AM to 5 PM, Monday to Friday.",
    "We are located at 123 Main Street, Anytown, USA.",
    "We offer web development, mobile app development, and digital marketing services."
]

vectorizer = TfidfVectorizer()
X = vectorizer.fit_transform(corpus)

def retrieval_based_chatbot(user_input):
    user_input_vector = vectorizer.transform([user_input])
    similarities = cosine_similarity(user_input_vector, X)
    response_index = similarities.argmax()
    return corpus[response_index]

# Test the chatbot
while True:
    user_input = input("You: ")
    if user_input.lower() == "exit":
        print("ChatBot: Goodbye! Have a great day!")
        break
    response = retrieval_based_chatbot(user_input)
    print(f"ChatBot: {response}")

Ejercicio 3: Generative Chatbot

Tarea: Implementar un chatbot generativo simple utilizando un modelo Seq2Seq existente para generar respuestas. Para este ejercicio, simularemos el uso de un modelo preentrenado.

Solución:
Dado que entrenar un modelo Seq2Seq desde cero es complejo y requiere una cantidad significativa de datos, simularemos las respuestas como si fueran generadas por un modelo Seq2Seq preentrenado.

# Simulated pre-trained Seq2Seq model responses
pretrained_responses = {
    "hello": "Hello! How can I help you today?",
    "how are you?": "I'm just a chatbot, but I'm here to assist you!",
    "what is your name?": "I am ChatBot, your virtual assistant.",
    "bye": "Goodbye! Take care!"
}

def generative_chatbot(user_input):
    user_input = user_input.lower()
    return pretrained_responses.get(user_input, "I'm still learning. Can you please rephrase?")

# Test the chatbot
while True:
    user_input = input("You: ")
    if user_input.lower() == "exit":
        print("ChatBot: Goodbye! Take care!")
        break
    response = generative_chatbot(user_input)
    print(f"ChatBot: {response}")

Ejercicio 4: Hybrid Chatbot

Tarea: Implementar un chatbot híbrido que utilice respuestas basadas en reglas para saludos comunes y respuestas basadas en autoaprendizaje (basadas en recuperación) para otras consultas.

Solución:

from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.metrics.pairwise import cosine_similarity

corpus = [
    "Our office is open from 9 AM to 5 PM, Monday to Friday.",
    "We are located at 123 Main Street, Anytown, USA.",
    "We offer web development, mobile app development, and digital marketing services."
]

vectorizer = TfidfVectorizer()
X = vectorizer.fit_transform(corpus)

def hybrid_chatbot(user_input):
    rule_based_responses = {
        "hello": "Hello! How can I assist you today?",
        "hi": "Hi there! What can I do for you?",
        "bye": "Goodbye! Have a great day!"
    }

    user_input_lower = user_input.lower()
    if user_input_lower in rule_based_responses:
        return rule_based_responses[user_input_lower]
    else:
        user_input_vector = vectorizer.transform([user_input])
        similarities = cosine_similarity(user_input_vector, X)
        response_index = similarities.argmax()
        return corpus[response_index]

# Test the chatbot
while True:
    user_input = input("You: ")
    if user_input.lower() == "exit":
        print("ChatBot: Goodbye! Have a great day!")
        break
    response = hybrid_chatbot(user_input)
    print(f"ChatBot: {response}")

Ejercicio 5: Mejorar el Chatbot Híbrido con Más Respuestas

Tarea: Mejora el chatbot híbrido añadiendo más respuestas basadas en reglas y ampliando el corpus de respuestas basadas en recuperación.

Solución:

from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.metrics.pairwise import cosine_similarity

corpus = [
    "Our office is open from 9 AM to 5 PM, Monday to Friday.",
    "We are located at 123 Main Street, Anytown, USA.",
    "We offer web development, mobile app development, and digital marketing services.",
    "You can contact us at support@company.com.",
    "Our phone number is (123) 456-7890."
]

vectorizer = TfidfVectorizer()
X = vectorizer.fit_transform(corpus)

def enhanced_hybrid_chatbot(user_input):
    rule_based_responses = {
        "hello": "Hello! How can I assist you today?",
        "hi": "Hi there! What can I do for you?",
        "what is your phone number?": "Our phone number is (123) 456-7890.",
        "what is your email address?": "You can contact us at support@company.com.",
        "bye": "Goodbye! Have a great day!"
    }

    user_input_lower = user_input.lower()
    if user_input_lower in rule_based_responses:
        return rule_based_responses[user_input_lower]
    else:
        user_input_vector = vectorizer.transform([user_input])
        similarities = cosine_similarity(user_input_vector, X)
        response_index = similarities.argmax()
        return corpus[response_index]

# Test the chatbot
while True:
    user_input = input("You: ")
    if user_input.lower() == "exit":
        print("ChatBot: Goodbye! Have a great day!")
        break
    response = enhanced_hybrid_chatbot(user_input)
    print(f"ChatBot: {response}")

Estos ejercicios proporcionan una experiencia práctica con diferentes tipos de chatbots, reforzando los conceptos cubiertos en este capítulo.