Programar Juegos Arcade
con Python y PygameLab 15: Corrector Ortográfico
En este taller te mostraremos como crear un corrector ortográfico. Para prepararlo, vete a:
ProgramArcadeGames.com/index.php?lang=es&chapter=examples list
...y
descarga los siguientes archivos. También los puedes encontrar en la sección
“Ejemplos de Búsquedas y Ordenamientos”.
- AliceInWonderLand.txt - Texto en inglés de “Alicia en el País de las Maravillas”
- AliceInWonderLand200.txt - Primer capítulo (en inglés) de “Alicia en el País de las Maravillas”
- dictionary.txt - Una lista de palabras
Si estás trabajando con el repositorio de BitBucket, entonces, los archivos los encontrarás allí y no tendrás que descargarlos.
15.1 Requisitos
Escribe un sencillo programa en Python que compruebe la ortografía del primer capítulo de “Alicia en el País de las Maravillas.” Utiliza primero una búsqueda lineal y luego una binaria. Imprime el número de línea junto con la palabra que no existe en el diccionario.
Sigue exactamente los siguientes pasos. Si no sabes como completar uno de ellos, pregunta antes de seguir avanzando al siguiente.
15.2 Pasos a completar:
- Si trabajas con la plantilla de BitBucket template, salta hasta el punto 6.
- Encuentra o créate una carpeta para tu proyecto.
- Descarga el diccionario a esa carpeta.
- Descarga las 200 primeras líneas de Alicia en el País de las Maravillas a tu carpeta.
- Abre un archivo nuevo de Python para tu proyecto.
- Es necesario separar las palabras del cuento para que puedan ser comprobadas individualmente.
También es necesario eliminar todos los signos de puntuación y espacios en blanco extras. De momento,
con lo que llevamos del libro, no existe una forma sencilla de hacer esto. El código para conseguirlo
es corto, pero una explicación completa del mismo está más allá del objetivo de esta clase. Incluye
la siguiente función en tu programa. Recuerda, las definiciones de funciones deben ir en la parte
superior de tu programa, justo después de los “import.” A esta función la llamaremos en el último paso.
import re # Esta función toma una línea de texto y devuelve # una lista de las palabras en la línea. def separar_linea(linea): return re.findall('[A-Za-z]+(?:\'[A-Za-z]+)?',linea)
Este código emplea expresiones regulares para separar el texto. Las expresiones regulares son muy potentes y relativamente fáciles de aprender. Si quieres aprender más sobre ellas mira:
http://regexone.com/ - Pasa el archivo dictionary.txt a un array. Revisa el capítulo sobre Búsquedas o mira searching_example_es.py para que veas un ejemplo de código de cómo hacer esto. Esto no tiene nada que ver con comandos import, bibliotecas o módulos. No llames al diccionario con algo como lista_palabras o algo así de genérico, ya que podría llevarnos a confusión. Llámalo dictionario_lista o similar.
- Cierra el archivo.
- Imprime --- Búsqueda Lineal ---
- Abre el archivo AliceInWonderLand200.txt
- No vamos a pasar el cuento a una lista. No vayas a hacer una lista nueva como hicimos con el diccionario.
- Empieza un bucle for que itere a través de cada línea.
- llama a la función separar_linea para que separe las líneas de texto que son leídas. Almacena la lista que devuelve la función en una nueva variable llamada palabras. Recuerda, con solo llamar a la función no hacemos nada de utilidad. Necesitas asignarle a una variable (palabras) el resultado. Si has olvidado como capturar el valor devuelto (return) por una función, vuelve al capítulo de funciones y encuéntralo.
- Empieza un bucle anidado for para que itere a través de cada palabra de la línea. Este bucle debería ir dentro del bucle for que itera a través de cada línea del archivo. (Un bucle para cada línea, y otro bucle para cada palabra en esa línea.)
- Usando una búsqueda lineal, confronta la palabra actual con las palabras que hay en el diccionario. Mírate el capítulo sobre búsquedas o el ejemplo searching_example_es.py para que te hagas una idea. La búsqueda lineal son solo tres líneas de código. Convierte a mayúsculas la palabra confrontada con las del diccionario. Para ello, en tu bucle while, basta con usar palabra.upper() en lugar de palabra para la clave. La búsqueda lineal existirá dentro del bucle for creado en el paso anterior. Estamos iterando a través de cada palabra del diccionario, buscando la palabra actual en la línea que acabamos de leer.
- Si la palabra extraña no aparece en el diccionario, imprímela. No vayas a imprimir nada si la encuentras, el resultado podría ser muy molesto
- Cierra el archivo.
- Asegúrate de que el programa se ejecuta correctamente antes de seguir avanzando.
- Crea una nueva variable que lleve la cuenta de la línea sobre la que te encuentras. Imprime ese número de línea junto con la palabra mal escrita encontrada en el paso anterior.
- Asegúrate de que el programa se ejecuta correctamente antes de seguir avanzando.
- Imprime --- Búsqueda Binaria ---
- La búsqueda lineal toma bastante tiempo hasta completarse. Para inhabilitarla temporalmente, podrías comentarla usando comillas triples al principio y final del código. Pregunta si no estás segura de cómo hacerlo.
- Repite el mismo patrón de código anterior, pero esta vez usando una búsqueda binaria. Gran parte del código de la búsqueda lineal puedes copiarlo, sustituyendo tan solo, las líneas de código que representan la búsqueda lineal con las de la búsqueda binaria.
- Observa la diferencia de velocidad entre los dos tipos de búsqueda.
- Comprueba que la búsqueda lineal vuelva a estar habilitada (si es que fue inhabilitada mientras probabas la búsqueda binaria.)
- Sube el programa final. Observación: si estás usando el procedimiento de BitBucket, haz un “commit” por separado del diccionario y de la historia. Esto permite hacer un mejor feedback línea a línea.
15.3 Ejemplo de Ejecución
--- Búsqueda Lineal --- Línea 3 posible palabra mal escrita: Lewis Línea 3 posible palabra mal escrita: Carroll Línea 46 posible palabra mal escrita: labelled Línea 46 posible palabra mal escrita: MARMALADE Línea 58 posible palabra mal escrita: centre Línea 59 posible palabra mal escrita: learnt Línea 69 posible palabra mal escrita: Antipathies Línea 73 posible palabra mal escrita: curtsey Línea 73 posible palabra mal escrita: CURTSEYING Línea 79 posible palabra mal escrita: Dinah'll Línea 80 posible palabra mal escrita: Dinah Línea 81 posible palabra mal escrita: Dinah Línea 89 posible palabra mal escrita: Dinah Línea 89 posible palabra mal escrita: Dinah Línea 149 posible palabra mal escrita: flavour Línea 150 posible palabra mal escrita: toffee Línea 186 posible palabra mal escrita: croquet --- Búsqueda Binaria --- Línea 3 posible palabra mal escrita: Lewis Línea 3 posible palabra mal escrita: Carroll Línea 46 posible palabra mal escrita: labelled Línea 46 posible palabra mal escrita: MARMALADE Línea 58 posible palabra mal escrita: centre Línea 59 posible palabra mal escrita: learnt Línea 69 posible palabra mal escrita: Antipathies Línea 73 posible palabra mal escrita: curtsey Línea 73 posible palabra mal escrita: CURTSEYING Línea 79 posible palabra mal escrita: Dinah'll Línea 80 posible palabra mal escrita: Dinah Línea 81 posible palabra mal escrita: Dinah Línea 89 posible palabra mal escrita: Dinah Línea 89 posible palabra mal escrita: Dinah Línea 149 posible palabra mal escrita: flavour Línea 150 posible palabra mal escrita: toffee Línea 186 posible palabra mal escrita: croquet
You are not logged in. Log in here and track your progress.
English version by Paul Vincent Craven
Spanish version by Antonio Rodríguez Verdugo
Russian version by Vladimir Slav
Turkish version by Güray Yildirim
Portuguese version by Armando Marques Sobrinho and Tati Carvalho
Dutch version by Frank Waegeman
Hungarian version by Nagy Attila
Finnish version by Jouko Järvenpää
French version by Franco Rossi
Korean version by Kim Zeung-Il
Chinese version by Kai Lin