Para no entrar a saco con ejemplos vamos a dar una pequeña definición de qué es el procesamiento del lenguaje natural, qué es y para que sirve NLTK y después vamos a comentar algunos ejemplos.
Como anécdota esto fue una pequeña parte del trabajo de la asignatura PL2 en la etsii, que realicé junto con mi compañero Carlos Marquez-
Según la wikipedia el procesamiento del lenguaje natural (PLN) es: Es una subdisciplina de la Inteligencia Artificial. El PLN se ocupa de la formulación e investigación de mecanismos eficaces computacionalmente para la comunicación entre personas o entre personas y máquinas por medio de lenguajes naturales.
El análisis automático de sentimiento es un paso más en el intento de traducir las emociones humanas a datos. Pero la espontaneidad y la inmediatez de la opinión en medios sociales hacen que estos sentimientos sean más auténticos y preserven su contenido emocional.
Para conseguir procesar el lenguaje natural existen muchas herramientas, una de ellas es NLTK que posee una colección de paquetes y objetos Python muy adaptados para tareas de PLN.
Primeros pasos
Para poder hacer uso de NLTK lo primero que debemos hacer es ir a su web http://www.nltk.org/ y hacer clic en “Download” y descargar e instalar Python 2.6 ya que es la versión recomendada para NLTK. Además se debe también instalar PyYAML y por último NLTK. Es recomendable también instalar las librerías Numpy y Matplotlib ya que servirán para realizar gráficas.
Empezando con NLTL
Una vez instalado todo esto solo queda abrir el interprete de Python (IDLE (Python GUI)) e instalar el que proporciona NLTK. Para ello se debe escribir en el interprete lo siguiente:
*Las líneas que tienen delante >>> son los comandos que deben introducirse en el intérprete. >>> import nltk >>> nltk.download()
Ahora hacemos clic en all-corpora y empezará a descargarse todo el corpus en nuestro PC. Una vez que este todo descargado, se puede empezar a trabajar con el interprete de Python, para ello lo primero será cargar algunos libros del corpus usando el siguiente comando:
>>> from nltk.book import * *** Introductory Examples for the NLTK Book *** Loading text1, ..., text9 and sent1, ..., sent9 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
**text1, text2,… son los indicadores de los textos.
Búsquedas con NLTK
Podemos examinar el contexto de un texto a partir de una simple lectura. Otra opción sería ver cuáles son las palabras más usadas en el texto, o ver si una cuantas veces aparece una palabra en un texto. Por ejemplo, la función concordance Nos muestra el numero de apariciones de una palabra en un texto. Su uso es el siguiente:
>>> text1.concordance("monstrous") Building index... Displaying 11 of 11 matches: ong the former , one was of a most monstrous size . ... This came towards us , ON OF THE PSALMS . " Touching that monstrous bulk of the whale or ork we have r ll over with a heathenish array of monstrous clubs and spears . Some were thick...
El text1 es un fragmento de Moby Dick, si buscamos en este texto la palabra monstruous aparece 12 veces.
En este punto, podemos preguntarnos que otras palabras son similares a monstruous. Esto podemos conseguirlo utilizando similar: >>> text1.similar("monstrous") abundant candid careful christian contemptible curious delightfully determined doleful domineering exasperate fearless few gamesome horrible impalpable imperial lamentable lazy loving
Con la función common_context se obtiene el contexto que comparten dos o más palabras. Si buscamos very y monstrous en text2 podemos ver que aparecen como resultados frases que tienen un contexto común
>>>text2.common_contexts(["very","monstrous"]) a_lucky a_pretty am_glad be_glad is_pretty
Ya sabemos mostrar el contexto de una palabra en un texto, pero llegados aquí, no sabemos en qué parte del texto se da esa concordancia. Esta información acerca de la posición puede darse mediante una grafica de dispersión con el comando dispersion_plot
- Usaremos como ejemplo un nuevo texto, realizado al unir todos y los discursos inaugurales de los presidentes de EEUU.
>>> text4.dispersion_plot(["citizens", "democracy", "freedom", "duties", "America"])
Podemos ver como al principio, en los primeros discursos se utiliza mucho la palabra citizens, también podemos observar como democracy solo se ha usado en la segunda mitad y que América se ha utilizado en los últimos discursos inaugurales con mucha frecuencia.
¿Cómo se puede identificar automáticamente las palabras que son más “identificativas” sobre el tema del que trata un texto?
Para contar las diferentes palabras de un texto, podemos realizar una distribución de frecuencias e ir anotando las veces que cada palabra aparece en el texto. NLTK ofrece soporte integrado para esta tarea. Vamos a usar un freqDist para encontrar las 50 palabras más frecuentes de Moby Dick .
>>> fdist1 = FreqDist(text1) >>> vocabulary1 = fdist1.keys() >>> vocabulary1[:50] [',', 'the', '.', 'of', 'and', 'a', 'to', ';', 'in', 'that', "'", '-', 'his', 'it', 'I', 's', 'is', 'he', 'with', 'was', 'as', '"', 'all', 'for', 'this', '!', 'at', 'by', 'but', 'not', '--', 'him', 'from', 'be', 'on', 'so', 'whale', 'one', 'you', 'had', 'have', 'there', 'But', 'or', 'were', 'now', 'which', '?', 'me', 'like'] >>> fdist1['whale'] 906
Sólo una palabra, la ballena , aparece más de 900 veces. El resto de las palabras no nos dicen nada sobre el texto, sino que son simplemente “palabras vacías. Podemos realizar una gráfica con las frecuencias de las 50 palabras que más veces aparecen con la función plol.
>>> fdist1.plot(50, cumulative=False)
Como podemos observar, la gráfica muestra las 50 palabras más usadas, aunque se debe tener en cuenta que estas palabras no son las más significativas ya que en este conjunto se encuentran muchas palabras vacías.
Vamos a ver cómo las palabras de América y ciudadano se utilizan en el tiempo. El corpus de los discursos Inaugurales está ordenado por fechas y por tanto puede ser interesante extraer datos correspondientes a como ha evolucionado el uso de algunas palabras durante el transcurso de los años. El siguiente código convierte las palabras en el corpus inaugural a minúsculas usando w.lower () , A continuación, comprueba si la palabra comienzan con uno de los «objetivos» América o ciudadano con startswith () .Por lo tanto, contará con palabras como estadounidense y los ciudadanos .
>>> cfd = nltk.ConditionalFreqDist(
... (target, fileid[:4])
... for fileid in inaugural.fileids()
... for w in inaugural.words(fileid)
... for target in ['america', 'citizen']
... if w.lower().startswith(target))
>>> cfd.plot()
Este es el resultado:
NLTK es una herramienta muy potente para el Procesamiento del Lenguaje natural y además es Open Source. Ahora se está utilizando NLTK para el “análisis de sentimientos o la “minería opinión”, estos conceptos se refieren a la aplicación de procesamiento de lenguaje natural , lingüística computacional y el análisis de textos para identificar y extraer la información subjetiva de los materiales básicos. El objetivo del análisis de los sentimientos es determinar la actitud de un orador o un escritor con respecto a algún tema o la tonalidad general de un documento.
Referencias
[1] http://docs.python.org/tutorial/
[2] Natural Language Processing with Python. Steven Bird, Ewan Klein, and Edward Loper. Ed. O’Really
[4] http://es.wikipedia.org/wiki/Python
[5] http://www.python.org/ [6] Python Text Processing with NLTK 2.0 Cookbook. Jacob Perkins. PACKT Publishing
[7] Python 2.6 Text Processing. Beginner’s Guide. Jeff McNeil. PACKT Publishing