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:
Cierra VSCode completamente
Vuelve a abrirlo
Abre tu proyecto
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:
✅ Instalar y usar la librería Wikipedia
✅ Extraer temas de búsqueda de comandos de voz
✅ Obtener resúmenes concisos de Wikipedia
✅ Manejar errores comunes (múltiples opciones, no encontrado)
✅ Presentar información de forma clara y organizada
✅ Integrar esta funcionalidad con el asistente existente
Próximos pasos sugeridos:
Añadir más fuentes: Google, noticias, YouTube
Mejorar presentación: Tablas, listas, imágenes
Añadir caché: Guardar búsquedas frecuentes localmente
Personalizar: Temas favoritos, historial de búsquedas
📌 Tarea práctica:
Prueba búsquedas de diferentes temas
Añade la funcionalidad de buscar imágenes relacionadas
Crea un historial de las últimas 10 búsquedas
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
Publicar un comentario