Procesamiento de Lenguaje Natural


El Procesamiento del Lenguaje Natural (PLN) es una diciplina de la computación que se enfoca a desarrollar algoritmos para la manipulación computacional del lenguaje (natural/humano). Existen varios razones por las cuales es deseable que las computadoras manipulen el lenguaje como lo es el análisis de datos o identificar el significado de lo que se dice o escribe. Existen varias aplicaciones de PLN como lo son la traducción automática, el análisis de sentimientos, etc.

Instalación de NLTK

NLTK es una librería de PLN para python. Para el correcto funcionamiento además instalaremos pip pensando que lo haremos desde una distribución Ubuntu:

	sudo apt-get install python-pip
	sudo sudo pip install -U nltk

Datos

Para comenzar a trabajar el lenguaje necesitamos un conjunto de datos. Para esto utilizaremos datos del proyecto Gutenberg que ofrece una coleción de libros historicos. El catálogo en español está disponible aquí. En esta ocasión estaremos usando el Quijote para bajarlo pueden usar la siguiente instrucción:

	wget http://www.gutenberg.org/cache/epub/2000/pg2000.txt

Importando las librerias

Para importar la librería solo hay que hacer:

	from __future__ import division  # Python 2 users only
	import nltk, re, pprint
	from nltk import word_tokenize

Leyendo los datos

Para leer los datos utilizamos instrucciones normales de python:

	raw = open('pg2000.txt').read().decode('utf8')                                   
	print type(raw)                                                                  
	print len(raw)  

La primera línea abre el archivo y lo pasa a unicode. La siguiente línea nos imprime el tipo de archivo, y finalmente la última imprime la cuenta de caracteres en todo el archivo.

Extrayendo tokens

Tokens son la nomenclatura que le damos a las palabras presentes en el texto.
Usamos token en lugar de palabra porque lo que obtenemos es algo más técnico.
Un token es distinto aunque sea la misma palabra, por ejemplo: caballo y caballos cuentan como la misma palabra, mientras que son dos tokens diferentes. También algunos elementos que no consideramos palabras son contados como tokens, por ejemplos fechas en formato seguido, por ejemplo: 09/11/1978 es un sólo token; direcciones URL, cantidades, etc son considerados tokens.

	tokens = word_tokenize(raw)
	print type(tokens)
	print len(tokens)
	print tokens[:10]

La primera línea, convierte el archivo en tokens, la segunda imprime el tipo de tokens, la tecera imprime el total de tokens, y la cuarta línea imprime los primeros diez tokens. Si marca un error que no encontró el tokenizer es necesario instalarlo, para eso hay que ejecutar python, y en modo terminal ejecuar el siguiente código

	import nltk
	nltk.download()

Se abrirá una ventana, hay que escoger la opción de Models y la de punkt y oprimier el botón download que instalará el paquete deseado. Hay que cerrar python y volver a intentarlo.

Creación de objeto texto

El objeto Text provee una interfaz para el acceso de varias funciones de texto.

	text = nltk.Text(tokens)                                                         
	print type(text)                                                                 
	print text[1000:1020]

La primera línea obtiene el objeto text, en la segunda línea imprimimos el tipo y finalmente imprimimos 20 tokens apartir del token 1000. Si marca un error, hay que ejecutar download, en esta ocasión se escoje la opción de corpus y el recurso de stopwords.

Estadísticas básicas

Es hora de obtener algunas estadísticas básicas:

	print len(set(text))                                                              
	print text.count('Sancho')                                                        
	fd = nltk.FreqDist(text)                                                          
	print fd['Dulcinea']                                                              
	print fd.keys()[0:50]                                                             
	print fd.plot(50,cumulative=False)                                                
	lengths= [len(w) for w in text]                                                  
	fd2= nltk.FreqDist(lengths)                                                      
	fd2.tabulate()  

La primera línea el número de palabras únicas, la segunda imprime cuantas veces aparece la palabra Sancho. En la tercera creamos el objeto tipo FreqDist que cotiene cuantas veces aparece cada token. En la cuarta línea averiguamos cuantas veces aparece la palabra Dulcinea. En la quinta palabra imprimimos las 50 palabras más comunes, en la sexta línea se dibuja un gráfico con las fecuencia de estos términos. En la septima línea vemos las longitudes de cada palabra, para lo cual se crea otro objeto de tipo FreqDist que contiene cuantas veces ocurren las longitudes de las palabras, que finalmente se tabulan.

Colocaciones

Colocaciones son secuencias de palabras que ocurren comúnmente en el texto.
Para calcularlas ejecutar la siguiente instrucciones:

	print text.collocations() 

N-gramas

Continuando con el tema de secuencias de palabras, n-gramas son secuencias de n palabras siendo las más comunes:

  • unigrama, n=1, secuencias de una soloa palabra, osea tokens
  • bigrama, n=2, secuencias de dos palabras
  • trigrama, n=3, secuencias de tres palabras

Para calcularlas se puede ejecutar el siguiente código:

	from nltk.util import ngrams
	bigrams = ngrams(sentence.split(), 2)
	fd3= nltk.FreqDist(bigram)                                                      
	trigrams = ngrams(sentence.split(), 3)
	fd4= nltk.FreqDist(trigram)                                                      
	sixgrams = ngrams(sentence.split(), 6)
	fd5= nltk.FreqDist(sixgram)                                                      
	print fd3.most_common(20)
	print fd3.most_common(20)
	print fd3.most_common(20)