16. Búsqueda en Wikipedia

 

16. Búsqueda en Wikipedia - Tu Asistente se Convierte en una Enciclopedia

Explicación para principiantes:
¡Tu asistente está a punto de volverse mucho más inteligente! Ahora vamos a enseñarle a buscar información en Wikipedia, la enciclopedia más grande del mundo. Es como darle acceso a una biblioteca gigante donde puede encontrar respuestas sobre casi cualquier tema.

Objetivo de esta lección:

  • Instalar y usar la librería Wikipedia

  • Extraer el tema de búsqueda del comando del usuario

  • Obtener resúmenes concisos de Wikipedia

  • Formatear y presentar la información claramente

Analogía:
Tu asistente ahora es como un bibliotecario experto:

  • Escucha: "Busca en Wikipedia dinosaurios"

  • Procesa: Va a la sección de dinosaurios en la biblioteca

  • Resume: Te da la información más importante

  • Presenta: Te lo explica claramente


📚 Paso 1: Instalar la Librería Wikipedia

¿Qué es la librería Wikipedia?

Es un "puente" entre Python y Wikipedia que permite buscar y obtener información automáticamente.

Instalación:

bash

# En tu terminal/CMD, escribe:

pip install wikipedia

Verificación:

bash

pip show wikipedia

Deberías ver algo como:

text

Name: wikipedia

Version: 1.4.0

Summary: Wikipedia API for Python

Si no se reconoce en VSCode:

  1. Cierra VSCode completamente

  2. Vuelve a abrirlo

  3. Abre tu proyecto

  4. Ahora debería reconocer import wikipedia


🔍 Paso 2: Entender Cómo Funciona replace()

El problema:

text

Usuario dice: "busca en Wikipedia dinosaurios"

Comando completo: "busca en wikipedia dinosaurios"

Necesitamos solo: "dinosaurios"

Solución con replace():

python

comando = "busca en wikipedia dinosaurios"


# Quitar "busca en wikipedia" y dejar solo el tema

tema = comando.replace("busca en wikipedia", "")

# resultado: " dinosaurios" (con espacio al inicio)


# Limpiar espacios extra

tema = tema.strip()  # Quita espacios al inicio y final

# resultado: "dinosaurios"

Visualización de replace():

text

"busca en wikipedia dinosaurios"

         ↓ replace("busca en wikipedia", "")

" dinosaurios"  ← Espacio al inicio

         ↓ .strip()

"dinosaurios"   ← ¡Perfecto!

Otros ejemplos:

python

# Ejemplo 1

texto = "hola mundo hola"

nuevo = texto.replace("hola", "adiós")

# Resultado: "adiós mundo adiós"


# Ejemplo 2 - Solo primera ocurrencia

texto = "manzana manzana manzana"

nuevo = texto.replace("manzana", "naranja", 1)

# Resultado: "naranja manzana manzana"


🎯 Paso 3: Crear la Función busqueda_wikipedia()

Versión básica:

python

import wikipedia


def busqueda_wikipedia_basica(comando):

    """Busca en Wikipedia usando un comando de voz"""

    

    # 1. Extraer el tema de búsqueda

    tema = comando.replace("busca en wikipedia", "").strip()

    

    # 2. Configurar idioma español

    wikipedia.set_lang("es")

    

    # 3. Buscar y obtener resumen

    resultado = wikipedia.summary(tema, sentences=2)

    

    # 4. Mostrar resultado

    print(f"📚 Wikipedia dice: {resultado}")

    hablar(f"Según Wikipedia: {resultado}")

Versión mejorada con manejo de errores:

python

def busqueda_wikipedia(comando):

    """

    Busca en Wikipedia con manejo robusto de errores

    

    Args:

        comando (str): Comando completo del usuario

    """

    

    print("🔍 Iniciando búsqueda en Wikipedia...")

    

    try:

        # 1. EXTRAER TEMA

        # Quitar diferentes formas de pedir búsqueda

        comando = comando.lower()

        

        # Lista de frases a quitar

        frases_a_quitar = [

            "busca en wikipedia",

            "busca wikipedia",

            "wikipedia",

            "busca en la wikipedia",

            "busca información sobre"

        ]

        

        tema = comando

        for frase in frases_a_quitar:

            if frase in tema:

                tema = tema.replace(frase, "")

        

        # Limpiar espacios y signos

        tema = tema.strip()

        tema = tema.replace("¿", "").replace("?", "")

        

        # Verificar que quedó algo para buscar

        if not tema:

            hablar("¿Qué quieres que busque en Wikipedia?")

            return

        

        print(f"🎯 Tema a buscar: '{tema}'")

        

        # 2. CONFIGURAR WIKIPEDIA

        wikipedia.set_lang("es")

        print("🌐 Idioma configurado: español")

        

        # 3. REALIZAR BÚSQUEDA

        print("⏳ Buscando información...")

        

        # Obtener resumen (3 oraciones máximo)

        resultado = wikipedia.summary(tema, sentences=3)

        

        # 4. PRESENTAR RESULTADO

        print("\n" + "=" * 60)

        print(f"📚 WIKIPEDIA: {tema.title()}")

        print("=" * 60)

        

        # Dividir en párrafos para mejor lectura

        oraciones = resultado.split(". ")

        for i, oracion in enumerate(oraciones[:3], 1):  # Máximo 3 oraciones

            if oracion:  # Evitar oraciones vacías

                print(f"{i}. {oracion}.")

        

        print("=" * 60)

        

        # 5. DECIR RESUMEN

        hablar(f"Según Wikipedia, {tema}: {oraciones[0]}")

        

        # Preguntar si quiere más información

        time.sleep(1)

        hablar("¿Quieres que te dé más información?")

        

    except wikipedia.exceptions.DisambiguationError as e:

        # Wikipedia encontró múltiples opciones

        print("❌ Hay múltiples opciones. Las más comunes son:")

        for opcion in e.options[:5]:  # Mostrar solo 5 opciones

            print(f"   • {opcion}")

        

        hablar(f"Hay varias opciones para '{tema}'. Por favor, sé más específico.")

        

    except wikipedia.exceptions.PageError:

        # La página no existe

        print(f"❌ No encontré información sobre '{tema}'")

        hablar(f"No encontré información sobre {tema} en Wikipedia.")

        

    except Exception as e:

        # Cualquier otro error

        print(f"❌ Error inesperado: {e}")

        hablar("Hubo un problema al buscar en Wikipedia. Inténtalo de nuevo.")


📖 Paso 4: Entender los Parámetros de wikipedia.summary()

Sintaxis básica:

python

resumen = wikipedia.summary(tema, sentences=3)

Parámetros importantes:

python

# sentences: Cantidad de oraciones del resumen

resumen_corto = wikipedia.summary("Python", sentences=1)

resumen_medio = wikipedia.summary("Python", sentences=3)

resumen_largo = wikipedia.summary("Python", sentences=10)


# chars: Cantidad máxima de caracteres

resumen_breve = wikipedia.summary("Python", chars=200)  # Máximo 200 caracteres


# auto_suggest: Corrección automática

resumen = wikipedia.summary("piton", auto_suggest=True)  # Corrige a "Python"

Ejemplos prácticos:

python

# Buscar información sobre diferentes temas

temas = ["Inteligencia Artificial", "Marte", "Pizza", "Fútbol"]


for tema in temas:

    print(f"\n🔍 Buscando: {tema}")

    

    try:

        resumen = wikipedia.summary(tema, sentences=2)

        print(f"📝 {resumen[:100]}...")  # Mostrar primeros 100 caracteres

    except:

        print("❌ No se pudo encontrar información")


🔄 Paso 5: Integrar Wikipedia en el Asistente Principal

Código completo integrado:

python

"""

ASISTENTE VIRTUAL CON BÚSQUEDA EN WIKIPEDIA

Versión mejorada con múltiples funcionalidades

"""


import speech_recognition as sr

import pyttsx3

import datetime

import wikipedia

import time


# ========== CONFIGURACIÓN INICIAL ==========

listener = sr.Recognizer()

engine = pyttsx3.init()


# Configurar voz en español

voces = engine.getProperty('voices')

for voz in voces:

    if 'spanish' in voz.name.lower() or 'español' in voz.name.lower():

        engine.setProperty('voice', voz.id)

        break


engine.setProperty('rate', 175)

engine.setProperty('volume', 0.9)


# ========== FUNCIONES BÁSICAS ==========

def hablar(texto, nivel='info'):

    """Hace que el asistente hable con diferentes niveles"""

    iconos = {'info': '💬', 'wikipedia': '📚', 'error': '❌', 'success': '✅'}

    icono = iconos.get(nivel, '💬')

    

    print(f"{icono} Asistente: {texto}")

    engine.say(texto)

    engine.runAndWait()


def bienvenida():

    """Da la bienvenida personalizada"""

    hora = datetime.datetime.now().hour

    

    if 5 <= hora < 12:

        saludo = "Buenos días"

    elif 12 <= hora < 19:

        saludo = "Buenas tardes"

    else:

        saludo = "Buenas noches"

    

    mensaje = f"{saludo}. Soy tu asistente virtual. Puedo decirte la hora, la fecha o buscar información en Wikipedia."

    hablar(mensaje, nivel='info')


def escuchar():

    """Escucha comandos del usuario"""

    try:

        with sr.Microphone() as source:

            print("\n🎤 Escuchando... (habla ahora)")

            listener.adjust_for_ambient_noise(source, duration=0.5)

            audio = listener.listen(source, phrase_time_limit=7)  # Más tiempo para búsquedas

            

            texto = listener.recognize_google(audio, language='es-ES')

            texto = texto.lower()

            

            print(f"👤 Tú: {texto}")

            return texto

    except sr.UnknownValueError:

        hablar("No te entendí, ¿puedes repetirlo?", nivel='error')

        return ""

    except sr.RequestError:

        hablar("Hay un problema de conexión a internet", nivel='error')

        return ""

    except Exception as e:

        print(f"Error: {e}")

        return ""


# ========== FUNCIONES DE WIKIPEDIA ==========

def extraer_tema_busqueda(comando):

    """Extrae el tema de búsqueda del comando completo"""

    # Lista de frases que indican búsqueda en Wikipedia

    frases_busqueda = [

        "busca en wikipedia",

        "busca wikipedia", 

        "wikipedia",

        "busca en la wikipedia",

        "busca información sobre",

        "busca sobre",

        "dime sobre",

        "qué es"

    ]

    

    tema = comando

    

    # Quitar cada frase de búsqueda si está presente

    for frase in frases_busqueda:

        if frase in tema:

            tema = tema.replace(frase, "")

    

    # Limpiar el resultado

    tema = tema.strip()

    tema = tema.replace("¿", "").replace("?", "").replace(".", "")

    

    return tema


def buscar_wikipedia(comando):

    """Realiza búsqueda en Wikipedia"""

    

    hablar("Buscando en Wikipedia...", nivel='wikipedia')

    

    # 1. Extraer tema

    tema = extraer_tema_busqueda(comando)

    

    if not tema:

        hablar("¿Qué quieres que busque en Wikipedia?", nivel='error')

        return

    

    print(f"🎯 Tema: {tema}")

    

    try:

        # 2. Configurar Wikipedia en español

        wikipedia.set_lang("es")

        

        # 3. Obtener resumen (máximo 4 oraciones)

        resumen = wikipedia.summary(tema, sentences=4, auto_suggest=True)

        

        # 4. Formatear para mejor presentación

        print("\n" + "=" * 70)

        print(f"📚 WIKIPEDIA: {tema.upper()}")

        print("=" * 70)

        

        # Dividir en oraciones y numerarlas

        oraciones = resumen.split(". ")

        for i, oracion in enumerate(oraciones, 1):

            if oracion and i <= 3:  # Máximo 3 oraciones

                print(f"{i}. {oracion}.")

        

        print("=" * 70)

        

        # 5. Decir el resumen (solo primera oración para no ser muy largo)

        primera_oracion = oraciones[0] if oraciones else resumen

        hablar(f"Según Wikipedia: {primera_oracion}", nivel='wikipedia')

        

        # 6. Preguntar si quiere escuchar más

        if len(oraciones) > 1:

            time.sleep(1)

            hablar("¿Quieres que te lea más información?", nivel='info')

            

            respuesta = escuchar()

            if respuesta and "sí" in respuesta:

                # Decir segunda oración

                if len(oraciones) > 1:

                    hablar(f"Además: {oraciones[1]}", nivel='wikipedia')

        

        return True

        

    except wikipedia.exceptions.DisambiguationError as e:

        # Múltiples opciones encontradas

        print(f"❌ Hay múltiples opciones para '{tema}':")

        

        opciones = e.options[:5]  # Mostrar solo 5 opciones

        for i, opcion in enumerate(opciones, 1):

            print(f"   {i}. {opcion}")

        

        hablar(f"Hay varias opciones para '{tema}'. Por ejemplo: {opciones[0]}, {opciones[1]}. Por favor, sé más específico.", nivel='error')

        return False

        

    except wikipedia.exceptions.PageError:

        hablar(f"No encontré información sobre '{tema}' en Wikipedia.", nivel='error')

        return False

        

    except Exception as e:

        print(f"❌ Error: {e}")

        hablar("Hubo un problema al buscar en Wikipedia.", nivel='error')

        return False


# ========== OTRAS FUNCIONALIDADES ==========

def dar_hora():

    """Da la hora actual"""

    ahora = datetime.datetime.now()

    hora = ahora.strftime("%H:%M")

    hablar(f"Son las {hora}", nivel='info')


def dar_fecha():

    """Da la fecha actual"""

    ahora = datetime.datetime.now()

    

    meses = {

        1: "enero", 2: "febrero", 3: "marzo", 4: "abril",

        5: "mayo", 6: "junio", 7: "julio", 8: "agosto",

        9: "septiembre", 10: "octubre", 11: "noviembre", 12: "diciembre"

    }

    

    dias_semana = {

        0: "lunes", 1: "martes", 2: "miércoles", 3: "jueves",

        4: "viernes", 5: "sábado", 6: "domingo"

    }

    

    dia_num = ahora.day

    mes_nombre = meses[ahora.month]

    año = ahora.year

    dia_semana = dias_semana[ahora.weekday()]

    

    mensaje = f"Hoy es {dia_semana}, {dia_num} de {mes_nombre} de {año}"

    hablar(mensaje, nivel='info')


def despedirse():

    """Función de despedida"""

    import random

    despedidas = [

        "¡Hasta luego! Fue un placer ayudarte",

        "Adiós, que tengas un excelente día",

        "Nos vemos pronto, cuídate",

        "Hasta la próxima, espero haberte sido útil"

    ]

    hablar(random.choice(despedidas), nivel='success')


# ========== PROGRAMA PRINCIPAL ==========

def main():

    """Función principal del asistente"""

    print("=" * 70)

    print("             🤖 ASISTENTE VIRTUAL CON WIKIPEDIA")

    print("=" * 70)

    print("Comandos disponibles:")

    print("  • 'hora' - Para saber la hora actual")

    print("  • 'fecha' o 'día' - Para saber la fecha")

    print("  • 'busca en Wikipedia [tema]' - Para buscar información")

    print("  • 'adiós' o 'salir' - Para terminar")

    print("=" * 70)

    

    # Bienvenida

    bienvenida()

    

    # Estadísticas

    busquedas_realizadas = 0

    

    # Bucle principal

    while True:

        print("\n" + "-" * 70)

        

        # Escuchar comando

        comando = escuchar()

        

        if not comando:

            continue

        

        # Detectar tipo de comando

        if any(palabra in comando for palabra in ['hora', 'horas', 'qué hora']):

            print("⏰ Procesando solicitud de hora...")

            dar_hora()

        

        elif any(palabra in comando for palabra in ['fecha', 'día', 'qué día']):

            print("📅 Procesando solicitud de fecha...")

            dar_fecha()

        

        elif any(palabra in comando for palabra in ['wikipedia', 'busca', 'buscar', 'información']):

            print("🌐 Procesando búsqueda en Wikipedia...")

            exito = buscar_wikipedia(comando)

            if exito:

                busquedas_realizadas += 1

                print(f"✅ Búsquedas realizadas hoy: {busquedas_realizadas}")

        

        elif any(palabra in comando for palabra in ['adiós', 'salir', 'chao', 'hasta luego']):

            print(f"📊 Resumen de sesión:")

            print(f"   • Búsquedas en Wikipedia: {busquedas_realizadas}")

            despedirse()

            break

        

        else:

            print("❌ Comando no reconocido")

            hablar("No entendí ese comando. Puedo ayudarte con hora, fecha o buscar en Wikipedia.", nivel='error')


# ========== EJECUCIÓN ==========

if __name__ == "__main__":

    try:

        main()

    except KeyboardInterrupt:

        print("\n\n⚠️  Programa interrumpido por el usuario")

        hablar("Programa interrumpido", nivel='error')

    except Exception as e:

        print(f"\n❌ Error crítico: {e}")

    finally:

        print("\n✨ ¡Gracias por usar el asistente virtual!")


🎮 Paso 6: Pruebas y Ejemplos de Uso

Pruebas sugeridas:

python

# Prueba diferentes formas de pedir búsquedas

comandos_prueba = [

    "busca en wikipedia inteligencia artificial",

    "wikipedia el sol",

    "busca información sobre python",

    "qué es la fotosíntesis",

    "dime sobre la luna"

]


for comando in comandos_prueba:

    print(f"\n🎤 Comando: '{comando}'")

    buscar_wikipedia(comando)

    time.sleep(2)  # Pausa entre pruebas

Ejercicio 1: Mejorar la Extracción de Temas

python

def extraer_tema_mejorado(comando):

    """Extrae el tema de forma más inteligente"""

    # Tu código aquí:

    # 1. Quitar palabras comunes como "por favor", "podrías", etc.

    # 2. Manejar signos de puntuación

    # 3. Corregir errores comunes de escritura

    # 4. Devolver el tema capitalizado correctamente

    pass

Ejercicio 2: Añadir Búsqueda por Categorías

python

def buscar_por_categoria(tema, categoria):

    """Busca un tema dentro de una categoría específica"""

    # Tu código aquí:

    # 1. Usar wikipedia.search() para encontrar páginas

    # 2. Filtrar por categoría

    # 3. Obtener información específica

    # Ejemplo: "historia de roma" vs "geografía de roma"

    pass


📊 Diagrama de Flujo de la Búsqueda en Wikipedia

text

┌─────────────────────────────────────────────────────────┐

│        USUARIO DICE: "busca en wikipedia X"            │

├─────────────────────────────────────────────────────────┤

│ 1. Reconocimiento de voz → Texto: "busca en wikipedia X"│

│    ↓                                                    │

│ 2. Extraer tema:                                        │

│    • replace("busca en wikipedia", "") → " X"           │

│    • strip() → "X"                                      │

│    ↓                                                    │

│ 3. Configurar Wikipedia:                                │

│    • wikipedia.set_lang("es")                           │

│    ↓                                                    │

│ 4. Realizar búsqueda:                                   │

│    • wikipedia.summary("X", sentences=3)                │

│    ↓                                                    │

│ 5. Manejar resultados:                                  │

│    • ✅ Éxito → Mostrar resumen                         │

│    • ❌ Múltiples opciones → Sugerir alternativas       │

│    • ❌ No encontrado → Mensaje de error                │

│    ↓                                                    │

│ 6. Presentar al usuario:                                │

│    • Imprimir formateado                                │

│    • Decir resumen por voz                              │

└─────────────────────────────────────────────────────────┘


❓ Cuestionario de Repaso

Pregunta 1:

¿Qué hace la línea tema = comando.replace("busca en wikipedia", "").strip()?

  • A) Añade "busca en wikipedia" al tema

  • B) Quita "busca en wikipedia" y espacios extras del comando

  • C) Cambia el idioma de Wikipedia

  • D) Aumenta la velocidad de búsqueda

Respuesta correcta: B
Explicación: replace() quita la frase de búsqueda y .strip() elimina los espacios en blanco al inicio y final, dejando solo el tema a buscar.


Pregunta 2:

¿Para qué sirve wikipedia.set_lang("es")?

  • A) Establece el idioma de búsqueda a español

  • B) Cambia el idioma del asistente

  • C) Traduce el resultado al inglés

  • D) Aumenta la cantidad de resultados

Respuesta correcta: A
Explicación: Configura la librería Wikipedia para buscar y devolver información en español. Sin esto, podría devolver información en inglés.


Pregunta 3:

¿Qué significa el parámetro sentences=3 en wikipedia.summary()?

  • A) Busca durante 3 segundos

  • B) Devuelve un resumen de máximo 3 oraciones

  • C) Busca en 3 sitios web diferentes

  • D) Espera 3 segundos antes de responder

Respuesta correcta: B
Explicación: Limita el resumen a 3 oraciones completas, evitando respuestas demasiado largas. Puedes cambiar este número según tus necesidades.


Pregunta 4:

¿Qué error ocurre si Wikipedia encuentra múltiples páginas para un tema?

  • A) PageError

  • B) DisambiguationError

  • C) ConnectionError

  • D) TimeoutError

Respuesta correcta: B
Explicación: DisambiguationError ocurre cuando hay varias opciones (ej: "Python" puede ser el lenguaje de programación o la serpiente). Debemos manejar este caso sugiriendo opciones al usuario.


Pregunta 5:

¿Por qué es útil tener una función extraer_tema_busqueda() separada?

  • A) Para hacer el código más complicado

  • B) Para manejar diferentes formas en que el usuario puede pedir búsquedas

  • C) Para obligar al usuario a ser específico

  • D) Para traducir automáticamente al inglés

Respuesta correcta: B
Explicación: Los usuarios pueden decir "busca en wikipedia", "wikipedia", "busca información sobre", etc. Una función dedicada maneja todas estas variantes consistentemente.


Pregunta 6 (Bonus):

Si el usuario dice "busca en wikipedia la historia de roma antigua", ¿qué devolverá extraer_tema_busqueda()?

  • A) "busca en wikipedia"

  • B) "la historia de roma antigua"

  • C) "roma"

  • D) "historia"

Respuesta correcta: B
Explicación: La función quitará "busca en wikipedia" y dejará "la historia de roma antigua", luego .strip() quitará espacios, resultando en "historia de roma antigua".


🌟 ¡Tu Asistente Ahora es una Enciclopedia Parlante!

Has aprendido a:

  1. ✅ Instalar y usar la librería Wikipedia

  2. ✅ Extraer temas de búsqueda de comandos de voz

  3. ✅ Obtener resúmenes concisos de Wikipedia

  4. ✅ Manejar errores comunes (múltiples opciones, no encontrado)

  5. ✅ Presentar información de forma clara y organizada

  6. ✅ Integrar esta funcionalidad con el asistente existente

Próximos pasos sugeridos:

  1. Añadir más fuentes: Google, noticias, YouTube

  2. Mejorar presentación: Tablas, listas, imágenes

  3. Añadir caché: Guardar búsquedas frecuentes localmente

  4. Personalizar: Temas favoritos, historial de búsquedas

📌 Tarea práctica:

  1. Prueba búsquedas de diferentes temas

  2. Añade la funcionalidad de buscar imágenes relacionadas

  3. Crea un historial de las últimas 10 búsquedas

  4. Comparte en los comentarios qué temas interesantes buscaste

🎉 ¡Tu asistente ahora tiene acceso a todo el conocimiento de Wikipedia!
En la próxima lección, enseñaremos a tu asistente a reproducir música y videos de YouTube.


https://www.youtube.com/watch?v=Pj9KbAKpQyk

https://www.youtube.com/watch?v=-0tIy8wWtzE

https://www.youtube.com/watch?v=YqSSId7xfwU

https://www.youtube.com/watch?v=MjK-j7YJ5YI


https://www.youtube.com/watch?v=l2G8-iQYfoA



https://www.youtube.com/watch?v=t-YO0XeHczU


Comentarios

Entradas más populares de este blog

1-7. Transforma tu audio a texto

10. Haz que tu asistente hable

8. NUEVO - Solución si tu micrófono no está captando tu audio