Cómo hacer un glosario utilizando Python

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

COMPARTE ESTE ARTÍCULO

COMPARTIR EN FACEBOOK
COMPARTIR EN TWITTER
COMPARTIR EN LINKEDIN
COMPARTIR EN WHATSAPP