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)