¿Qué es NLP?…procesamiento de lenguaje natural

Las entradas de esta categoría contienen ejemplos de NLP, pero en general la implementación de la librería NLTK de python y su contra parte en tm en R project, pero principalmente los ejemplos son en Python. La idea es compartir de manera breve algunos detalles y ejemplos que en buena parte provienen de la referencia [1] y están disponibles en línea en la referencia [2].

Agrego algunos comentarios o variaciones, la intención con estas entradas es motivar a que se consulten otras fuentes y  comentar más adelante sobre lo avances recientes en Deep Learning en NLP, sobre lo cual se puede consultar la referencia [3].

También comparto unos ejemplos haciendo uso de otros módulo, scikit-learn, para implementar algunas técnicas de Machine Learning.

En caso de estar interesado en investigar sobre una breve introducción teórica y con muchos detalles en explicación,  para mi gusto una buena referencia son los capítulos 22 y 23 de la referencia [4], en el cual se  desarrolla el marco teórico sobre el cual hasta ahora es en parte vigente la investigación en este tipo de temas. Existen nuevas metodologías y nuevas técnicas, sobre material de investigación por la relevancia que se tienen de mejorar los sistemas y técnicas para el procesamiento de lenguaje natural.

Un ejemplo vistoso….qué no me quedó.

Dejo la liga donde puede visualizar un ejemplo de nubes de palabras hechas con el módulo wordcloud de python. Tuve algunos problemas con las fuentes  para poder correrlos en windows y el código para poder hacer que funcione correctamente, así que posteriormente comparto los detalles del ejemplo que tenía pensado compartir. Puede verse el código de ejemplo de Alicia en el mismo repositorio.

alice

Liga del repositorio: https://github.com/amueller/word_cloud

Comentario: Espero posteriormente corregir los problemas del código con las fuentes de windows.

Un ejemplo no tan vistoso

Algunos conceptos que no menciono a detalle son las listas, tuplas y cadenas. Estas son estructuras de datos de python, se cuenta con mucha información sobre cómo se opera con ellas o qué métodos funcionan.

Un ejemplo sencilla para conocer cómo se trabaja con ellas es usar Ipython  es lo siguiente:

#Listas
a=['1','2','3','4']
#type() dice el tipo de datos que es
type(a)
#En Ipython 
a.<taps>
#Despliega una lista de métodos básicos para las listas

#Cadena
b='1234'
type(b)

b.<tabs>
#Despliega una lista de métodos básicos para las cadenas

#Define una tupla
c=("1","2","3","4")
type(c)
c.<tabs> 
#Despliega dos métodos básicos con las tuplas

En las referencias se pueden consultar operaciones con los métodos o con otras funciones de python. Estas estructuras de datos son importantes, debido a que muchos de los textos con cargados como listas o como cadenas  y se opera con ellos mediante sus operaciones naturales.

Debido a que hablar de listas, tuplas y diccionario requiere mucho detalle recomiendo consultar una breve introducción en línea proporcionada por el grupo de Stanford, el cual es breve y preciso respecto a lo que se necesita saber de esos temas:

Liga del tutorial de Stanford: Introducción a Python

Lo siguientes ejemplos pueden ser enriquecidos consultando la referencia [1] y [2], las cuales son sumamente buenas y contienen prácticamente todo lo que uno debe de saber de NLP, sobre todo del manejo de la librería NLTK.

Lo primero es tener el módulo instalado en python, ya que se tenga instalado lo importante es usar los textos o corpus con los que cuenta la librería.

Para instalar el módulo depende de la distribución de python que se instala pero sobre en general se puede usar el módulo pip para instalar cualquier módulo.

Lo básico es lo siguiente:

#NLTK
import nltk
nltk.download()
#Cargar los libros

nltk.book()
*** Introductory Examples for the NLTK Book ***
Loading text1, ..., text9 and sent1, ..., sent9
Type the name of the text or sentence to view it.
Type: 'texts()' or 'sents()' to list the materials.
text1: Moby Dick by Herman Melville 1851
text2: Sense and Sensibility by Jane Austen 1811
text3: The Book of Genesis
text4: Inaugural Address Corpus
text5: Chat Corpus
text6: Monty Python and the Holy Grail
text7: Wall Street Journal
text8: Personals Corpus
text9: The Man Who Was Thursday by G . K . Chesterton 1908

Ya que se tiene esto, se cuenta con 9 textos con los cuales se puede trabajar o aprender a usar las funciones básicas de NLTK.

En la lógica de procesar textos está en medio el concepto central de Corpus, esto en el fondo significa que es un conjunto de textos. La intención en general es estudiar o construir Corpus y analizarlos.

En los libros disponibles en NLTK en algunos casos son un textos y no una colección, pero por ejemplo, el el texto 3, 4 y 8 son Corpus, en otro caso está formado el Corpus por un solo texto. Pero siendo abstracto, un conjunto es no vacío si cuenta por lo menos con un elemento( distinto al vacío, cosa de teoría de conjunto). Pero en resumen el conecto de Corpus en cualquiera de las notaciones del procesamiento de textos significa un conjunto de textos.

Algunas operaciones sencillas son identificar concordancias, cuando una palabra tiene contextos similares o cuando tienen un contexto común. La diferencia entre similar y común, es que en la primera se explora qué otras palabras tienen el mismo contexto y en común se toman dos palabras y se explora si tienen algo en común en el contexto.

Un tema delicado es la definición de “contexto”, esto para un sentido práctica en el procesamiento tienen la idea de identificar al derredor de que palabras aparece la palabra que buscamos.

Entonces como ejemplo, suponiendo que elegimos el Corpus de discursos, aún que están en inglés una palabra que posiblemente aparezca es ‘nation’, así que podemos explorar su concordancia, las palabras similares y eligiendo alguna de las similares podemos explorar si tienen un contexto común.

#Ejemplo
text4.concordance('nation')

#Lo que se vería en la consola es:
#Displaying 25 of 302 matches:
# to the character of an independent nation seems to have been distinguished by
#f Heaven can never be expected on a nation that disregards the eternal rules o
#first , the representatives of this nation , then consisting of little more th.....

#Reviso las palabras similares en el Corpus
text4.similar('nation')

#Lo que se vería es:

#people country government world union time constitu#tion states
#republic law land party earth future other presiden#t strength war
#congress spirit

#Elijo la palabra 'country' para explorar el contexto común con la palabra 'nation'
# Se debe de ingresar en la función como lista , es decir se usa:[]
text4.common_contexts(["nation","country"])

#our_by of_and no_can the_now and_the our_from the_t#he no_has whole_in
#our_that the_in our_i this_to our_today the_for a_w#e our_in the_are
#the_i the_and

Ahora en  breve lo que hacen las funciones anteriores es encontrar el contexto, las palabras que tienen “contexto similar” y compara el contexto común.

Algo que siempre está presente en el análisis de datos es hacer gráficas, entonces una gráfica fácil de hacer es explorar la dispersión de un conjunto de palabras o como se comporta la frecuencia con la cual aparecen ciertas palabras en un Corpus.

El ejemplo lo hago con el Corpus text4 que son discursos.

#Gráfica de dispersión
text4.dispersion_plot(["nation","people","government","law"])

#Gráfica de la frecuencia de las palabras

fdist=FreqDist(text4)
fdist.plot(50,cumulative=True)

Las gráficas que se obtienen son la siguientes:

Dispersión

Frecuencia_de_Palabras

La primera gráfica es similar a la que se construye para hacer una gráfica  “jitter” de un conjunto de datos, de cierto modo muestra las apariciones de las palabras en el texto y la segunda gráfica muestra cuales palabras domina la distribución de la frecuencia de 50 palabras.

Otro aspecto básico cuando se analizan datos, es conocer información numérica, es decir; en este caso sería importante conocer la cantidad de palabras de un texto, cuantas se usaron sin contar repeticiones y quitar las palabras o puntuaciones que puedan ser contadas como caracteres. Esto último está relacionado con el concepto de “tokenización”  del texto.

El código siguiente hace las operaciones anteriores:

#Conteo
len(text4)
145735
#Contando las palabras y símbolos , sin repetición
len(set(text4))
9754
#Porcentaje en el que aparecen las palabras
from __future__ import division

len(text4)/lent(set(text4))

14.941049825712529

#Conteo de apariciones de una palabra en el texto

text4.count('nation')
235

#Porcentaje de apariciones en todo el texto

text4.count('nation')/len(text4)
0.0016125158678423166
text4.count('and')/len(text4)
0.03424709232511065

Esto último no tienen mucha relevancia cuando se piensa en un solo texto, pero pensando que se tienen varios textos que analizar puede resultar interesante como se comporta la densidad de los textos y comparar entre ellos.

Un ejemplo den R.

Para hacer el ejemplo en R uso algunos librerías y un texto; Alicia en el país de las maravillas. Para el ejemplo hago uso de las librerías tm, languageR y ggplot2.

Lo siguiente es más normal a lo que se hace, en el ejemplo en Python ya se contaba con Corpus de ejemplo y se analizaban algunas cosas sobre las palabras, contexto, distribución, etc. En este ejemplo, se construye a partir de un texto un Corpus  y su matriz de términos.También se construye una tabla con información básica de las frecuencias.

No explico a detalle lo que hacen las funciones pero pueden leer un poco respecto a como las uso en las entradas ¿Cuánto se puede saber de los discursos? y Clasificación Binaria.

Las funciones que uso son las siguientes:

library(tm)
library(ggplot2)
library(languageR)

tdm2<-function(doc){
 docCor<-Corpus(VectorSource(doc))
 docs <- tm_map(docCor, stripWhitespace)
 docs <- tm_map(docs, removeWords, stopwords("english"))
 docs <- tm_map(docs, removePunctuation)
 docs <-tm_map(docs,removeNumbers)
 docs <- tm_map(docs,content_transformer(tolower))
 DocsTDM <- TermDocumentMatrix(docs) 
 return(DocsTDM)
}

TablaFreq<-function(TDM){
 docmatrix <- as.matrix(TDM)
 doc.counts <- rowSums(docmatrix)
 doc.df <- data.frame(cbind(names(doc.counts),as.numeric(doc.counts)),stringsAsFactors = FALSE)
 names(doc.df) <- c("Términos", "Frecuencia")
 doc.df$Frecuencia <- as.numeric(doc.df$Frecuencia)
 doc.occurrence <- sapply(1:nrow(docmatrix),
 function(i)
 {
 length(which(docmatrix[i, ] > 0)) / ncol(docmatrix)
 })
 doc.density <- doc.df$Frecuencia / sum(doc.df$Frecuencia)
 
 # Add the term density and occurrence rate
 doc.df <- transform(doc.df,density = doc.density,ocurrencia =doc.occurrence)
 S=head(doc.df[with(doc.df, order(-Frecuencia)),], n=50)
 return(S)
}
 
data(alice)
L=tmd2(alice)
L1=TablaFreq(L)

#Gráfica de frecuencia de palabras.

ggplot(L1,aes(L1$Frecuencia,factor(L1$Términos,levels=L1$Términos)))+geom_point(stat="identity", colour="red")+ggtitle("Tabla de Frecuencias")+xlab("Frecuencia de la palabra")+ylab("Las 50 alabra más frecuentes")

Lo que se hace es construir un Corpus del texto de Alicia en el país de las maravillas, luego se construye una tabla con las frecuencias de las palabras respecto a los que se llama Matriz de términos del texto o corpus, por último se grafica el comportamiento de las 50 palabras más frecuentes.

La gráfica que se obtiene es la siguiente:

Alice_plot

En esta pequeña entrada solo traté de mostrar que existen varias herramientas para el procesamiento del lenguaje natural y de text mining. Si bien no es una entrada muy vistosa, la intención es en las siguientes entradas explicar más detalles y técnicas. En las referencias se encuentra suficiente información para aprender respecto al tema.

Referencias:

1.-http://www.nltk.org/book_1ed/

2.-http://www.nltk.org/book/

3.-http://nlp.stanford.edu/courses/NAACL2013/

4.-http://cs224d.stanford.edu/syllabus.html

5.-http://www.gandhi.com.mx/inteligencia-artificial-un-enfoque-moderno

Anuncios