Como programadores, estamos acostumbrados a inspeccionar glosarios de libros a la hora de documentarnos para alguna nueva tecnologÃa, software, hardware, framework, librerÃa, lo que sea... A decir verdad, son nuestros aliados cuando tenemos que leer un libro, porque sin ellos no llegarÃamos a la parte que nos interesa del mismo y tendrÃamos que estar hojeándolo hasta llegar a ella. No sé si alguna vez habéis escrito un libro o una documentación. Yo, que sà lo he hecho, y os diré que, aunque parezca sencillo, confeccionar el glosario de un libro es una de las tareas más laboriosas y más tediosas del mundo. No se lo deseo ni a mi peor enemigo.
En programacion.net solemos traer artÃculos sobre Python en los que te ayudamos a resolver problemas de manera sencilla. En esta ocasión vamos a realizar el glosario de un libro mediante Python.
Sin más dilación, vamos a empezar.
¿Qué es un glosario?
Estoy seguro que los hojeen libros todos los dÃas sabréis lo que es un glosario, pero me gustaria aclarar el concepto para el que no lo sepa.
Un glosario es simplemente una colección de palabras y/o frases que son consideradas importantes en el libro. Al lado de cada palabra y/o frase, se puede ver en qué página se puede encontrar. No todas las frases y/o palabras que aparecen en el libro tienen que estar en el glosario. A continuación, te damos la explicación a esto.
¿Cómo diferenciar un buen glosario?
¿Es un buen glosario aquel en el que aparecen TODAS las palabras y frases que componen un libro? Por supuesto que no.
Se considera un buen glosario aquel que contiene palabras y frases importantes del libro. Seguramente te preguntes por qué. Vamos a ver un ejemplo. Digamos que tenemos un libro que solo contiene esta frase:
My book is short
¿Qué pasarÃa si tratamos de indexar cada palabra y frase de dicha breve oración, suponiendo que la ubicación es la posición de la palabra en la oración? Este serÃa el glosario que obtendrÃamos en ese caso:
my book is short: 1 my book is: 1 my book: 1 my: 1 short: 4 is short: 3 is: 3 book is short: 2 book is: 2 book: 2
Como ves, ¡en este caso el glosario serÃa más grande que el propio libro! Asà que, por eso te digo que un buen glosario es aquel que contiene las palabras y frases más importantes para el lector.
Instalación
En este tutorial utilizaremos la librerÃa Natural Language Toolkit (NLTK). Como se menciona en la documentación, NLTK es “una magnÃfica herramienta para enseñar, y trabajar en lenguaje computacional con Python”.
Actualmente, escribo este tutorial con mi equipo Ubuntu, y los pasos para instalar NLTK en esta sección están explicados para el sistema operativo Ubuntu. No te preocupes si utilizas otro sistema operativo, puedes encontrar los pasos para instalar NLTK en otro SO en la web de NLTK.
Para instalar NLTK, voy a utilizar pip. Si aún no tienes pip instalado, puedes utilizar este comando en tu terminal.
sudo easy_install3 pip
Asegúrate que se ha instalado correctamente, escribiendo el siguiente comando:
pip --version
Obtendrás algo similar a lo siguiente:
pip 8.1.2 from /usr/local/lib/python3.5/dist-packages/pip-8.1.2-py3.5.egg (python 3.5)
Ahora, para instalar NLTK, simplemente ejecuta el siguiente comando en tu terminal:
sudo pip install -U nltk
Puedes probar la instalación de NLTK escribiendo el comando python, y luego importanfo nltk en tu terminal. Si obtienes ImportError: No module named nltk, este hilo puede ayudarte.
Archivo de ejemplo
Para el tutorial, necesitaremos un archivo de ejemplo (libro) para crear nuestro glosario. Para ello he cogido este libro: The Rate of Change of the Rate of Change de la EFF. Puedes descargar este archivo de texto desde Dropbox. Por supuesto, puedes utilizar cualquier libro que quieras.
Programa
Vamos a empezar con la parte interesante de este tutorial, el programa que nos ayudará a confeccionar el glosario de nuestro libro. Lo primero que tenemos que hacer es encontrar la frecuencia de las palabras del libro. Mostré cómo hacer esto en otro tutorial, pero hoy veremos cómo llevarlo a cabo mediante la librerÃa NLTK.
Se puede hacer tal que asÃ:
import nltk, collections from nltk.collocations import * frequencies = collections.Counter() with open('bigd10.txt') as book: read_book = book.read() words = nltk.word_tokenize(read_book) for w in words: frequencies[w] += 1 print (frequencies)
Cuando ejecutes el programa, obtendrás una larga lista de palabras y su frecuencia.e
Antes de avanzar, vamos a analizar el anterior código un poco. En la siguiente lÃnea:
frequencies = collections.Counter()
Utilizamos la función Counter() para obtener la frecuencia de palabras del libro (cuantas veces aparece esa palabra en el libro).
word_tokenize, por otro lado, divide las frases en partes constituyentes. Vamos a ver un ejemplo sencillo para ver cómo funciona word_tokenize.
from nltk.tokenize import word_tokenize sentence = 'My name is Jorge. I like Python. It's a pretty nice programming language' print (word_tokenize(sentence))
La salida al anterior script serÃa el siguiente:
['My', 'name', 'is', 'Jorge', '.', 'I', 'like', 'Python', '.', 'It', "'s", 'a', 'pretty', 'nice', 'programming', 'language']
A continuación, recorremos las palabras y obtenemos la frecuenia de cada una de ellas. Pero, ¿y que pasa con las frases? Llamamos colocaciones a las secuencias de palabras que aparecen juntas muy a menudo. Un ejemplo de colocación es un bigrama, es decir, dos palabras que aparecen juntas muy a a menudo. Similar a estas son los trigramas, que son tres palabras que aparecen juntas muy a menudo. Y asà sucesivamente...
Digamos que queremos extraer los bigramas de nuestro libro. Podemos hacer lo siguiente:
bigram = nltk.collocations.BigramAssocMeasures() finder = BigramCollocationFinder.from_words(words) finder.apply_freq_filter(2)
El número 2 en la función apply_freq_filter() nos está diciendo que ignoremos todos los bigramas que aparecen menos de dos veces en el libro.
Si queremos encontrar los bigramas del libro que aparecen más de 30 veces, podemos utilizar la siguiente sentencia:
print (finder.nbest(bigram.pmi, 30))
Finalmente, si queremos obtener la ubicación, que en nuestro caso es donde la frase o palabra aparece en el libro (no el número de la página), podemos hacer lo siguiente:
print (read_book.index('computer')) print (read_book.index('Assisted Reporting'))
Las sentencias anteriores devuelven la ubicación de las palabras en una oración, algo similar a lo que hemos visto en el ejemplo de la frase corta al principio del tutorial.
Poniéndolo todo junto
import nltk, collections from nltk.collocations import * frequencies = collections.Counter() with open('bigd10.txt') as book: read_book = book.read() words = nltk.word_tokenize(read_book) for w in words: frequencies[w] += 1 bigram = nltk.collocations.BigramAssocMeasures() finder = BigramCollocationFinder.from_words(words) finder.apply_freq_filter(2) print ('Those are the words and their frequency of occurrence in the book:') print (frequencies) print ('#################################################################') print ('Those are the 30 most bigrams occurring in the book:') print (finder.nbest(bigram.pmi, 30)) print (read_book.index('computer')) print (read_book.index('Assisted Reporting'))
Fuente: Abder-Rahman Ali