Go to the profile of Lino Alberto Urdaneta Fernández

Originalmente publicado por Lino Alberto Urdaneta Fernández en Medium

Hombre sentado tomando café
Fotografía cortesía de Chris Benson en Unsplash

Lo confieso. Soy un humanista de profesión y de vocación. Y me gusta serlo. Cuando me tomo un café con las personas con las que trabajo disfruto que me comenten cómo observarían los antiguos griegos tal o cual costumbre; o escuchar a los estudiantes de literatura hablar con entusiasmo sobre su próximo proyecto. Mi lugar de trabajo reúne músicos, poetas, periodistas, filósofos, cineastas, pintores, escritores, críticos, pedagogos, científicos deportivos, productores audiovisuales, traductores… y lingüistas. Y entre lingüistas la diversidad no se detiene: psicolingüistas, fonetistas, gramáticos, semiólogos, analistas del discurso, sociolingüistas y el raro del lingüista computacional (o sea, yo).

En las humanidades la tecnología puede jugar el rol de ayudante, protagonista, antagonista o extra dependiendo de la visión de cada profesional. Para todos es una herramienta imprescindible: cámaras, procesadores de textos, aulas virtuales, hojas de cálculo, programas para ingeniería de sonido, YouTube, y un etcétera tan largo como lo es mi desconocimiento de los detalles del trabajo de mis compañeros humanistas. Pero también, para cada uno, la tecnología se convierte en objeto de especulación personal, en un amigo o en un enemigo que nos arrebata lo humano (varios somos de la generación que creció viendo a Skynet o a la Matriz provocando el día del juicio final)

Gif
Espero que tu interés por aprender PLN no tenga por objetivo crear una malvada computadora (video cortesía de giphy)

Para exorcizar un poco esta idea de la tecnología antagonista, y para que los colegas que lean esto no me sigan viendo como la quinta columna al servicio de Hal 9000 o de Joshua (¿alguien recuerda Juegos de guerra, aquella película donde una computadora tiene que aprender a no ganar para no desencadenar al Armagedón?), me animé a empezar a escribir un poco sobre tecnología desde el punto de vista de un humanista (¿no se lo veían venir?). La perspectiva será, casi siempre, la de un insider, la de alguien que tiene un pie en el razonamiento del lenguaje como actividad social, y el otro pie en elaborar modelos formales lingüísticos porque secretamente quiere, desde niño, hacer un robot que lo acompañe en sus aventuras. Así las cosas, espero que una explicación sencilla y una serie de ejercicios le quiten lo “místico” a la relación lenguaje-máquina.

Manos a la obra

El primer paso que vamos a dar es entender qué es el Procesamiento de Lenguaje Natural.

Lenguaje, procesamiento, comprensión, computadoras.

Una de las definiciones más sencillas del Procesamiento de Lenguaje Natural (PLN) nos dice que se trata del estudio del tratamiento computacional del lenguaje humano. Simple, ¿no? Bueno, no, no tanto. Y no lo es por lo siguiente:

  • Trata del lenguaje, y por extensión, de las lenguas. En teoría, con una variedad que oscila entre las entre 5.000 y 6.500 lenguas humanas. Algunas muy conocidas, y otras apenas entrevistas, llenas de posibilidades y de formas de codificar el mundo que los usuarios de lenguas como el español o el inglés apenas conseguiríamos entrever.
  • Una lengua, un idioma, es un sistema complejo que permite la creación e interpretación de un conjunto enorme de mensajes. Imaginen la cantidad más grande que se les ocurra (un googolplex, el número, no la sede de Google) y es posible que se quede corta al lado del número de mensajes que teóricamente se puede construir con una lengua natural. Si intentan imaginarse el número de mensajes e interpretaciones distintas que se han hecho y se harán en español, por cada uno de los hablantes que ha existido, existe y existirá, a lo largo de toda la vida de cada uno, se acercarán bastante a la complejidad de la que hablo. Ahora, multipliquen eso por el número de idiomas. Da vértigos.
  • No hay tal cosa como una lengua homogénea que nos sirva como ejemplo de lo que hay que modelar. Hay, en cambio, una compleja red de modelos que usamos a lo largo de nuestras interacciones casi sin ser conscientes de ello: no hablamos exactamente igual con todo el mundo, ni en todas las circunstancias, ni escribimos como hablamos, ni hablamos como escribimos.
  • El tratamiento computacional implica el uso de herramientas matemáticas cada vez más abstractas (si eres humanista como yo, respira hondo tres veces y adelante, sigue leyendo). Deep Learning, Support Vector Machines, Tensors, regresión logística, clustering, aprendizaje por refuerzo, entre otros, son términos con los que nos vamos a encontrar muy frecuentemente. La buena noticia es que todo esto tiene mucho sentido, y se puede comprender con un poco de trabajo duro.
  • El Procesamiento de Lenguaje Natural es una disciplina y no una simple caja de herramientas para realizar tareas.

En esencia, entonces, el PLN está conformado por modelos que funcionan como una simplificación de las lenguas humanas. Estos modelos suelen ser distintos a los que estamos acostumbrados a manejar en las humanidades, ya que deben ser procesables por una computadora y tener un fundamento matemático o lógico. Estos modelos simplificados son útiles porque funcionan como una reducción a escala (igual que el mapa de un territorio) que mantiene las características esenciales de lo modelado, y además permite hacer predicciones de cómo se “comportaría” el lenguaje en una determinada situación. Los humanistas trabajamos con modelos todo el tiempo, lo escalofriante, lo terrorífico, lo aterrador es que la comprensión de estos modelos requiere recordar las matemáticas que algún día nos juramos olvidar por completo. Y, peor aún, aprender formulitas nuevas o entender los laberintos de la lógica formal.

My logic is undeniable, my logic is undeniable, myyy looogic is unndeenniabble…(V.I.K.I. en I Robot)

Pero, ¿para qué tomarse tantas molestias?

A ver… si el lenguaje es tan complejo, si los modelos están limitados a lo procesable por una computadora, si además tengo que estudiar (*suspiros de preocupación*) matemáticas, ¿qué salgo ganando con todo esto? Bueno, como con el ejercicio físico, en un principio todo parece trabajo de más, mucho sudor, y el cuerpo fofo de intelectual resistiéndose al cambio. Pero con el tiempo, el sacrificio vale la pena. ¿Por qué? Porque ganamos en control, cobertura, exactitud. Y porque nuestros modelos se pueden poner a prueba para resolver tareas prácticas, ¡tareas prácticas!

Y hablando de tareas, ya estamos listos para la primera.

Vamos a usar el terminal que viene con tu distribución de Linux o con MacOS para buscar las frecuencias de una palabra en un texto. En otras palabras, vamos a utilizar la terminal como campo de juegos.

Lo primero es abrir la terminal, esto dependerá del sistema operativo utilizado, pero debe verse más o menos así:

captura de terminal
La terminal de comandos (en mi computadora)

La terminal puede verse distinta en tu computadora. Es importante que si no la conoces, la conviertas en tu mejor amiga, porque hace magia. En la captura, puedes ver que después de mi nombre aparece el símbolo $. Esto se conoce como el prompt de la terminal y te indica que la misma está lista para recibir tus órdenes. Los ejemplos que vamos a usar se deben escribir justo después del prompt.

Luego vas a necesitar crear un directorio nuevo, y poner allí el texto que quieres utilizar. Debe tratarse de un archivo de texto (con extensión txt), no de un documento de Word. Puedes usar el texto que tú quieras, yo voy a usar el primer volumen de El libro de las mil noches y una nocheque se encuentra disponible de forma gratuita en la página del Proyecto Gutenberg. Voy a llamar a mi archivo Las_mil_y_una_noches_vol1.txt .

Antes de pasar a hacer pruebas en la terminal, es importante entender que, realmente, no usaremos un solo comando sino un pipeline de los mismos. Este pipeline funciona como una “tubería” que relaciona la entrada de un comando con la salida de otro; se trata, en otras palabras, de una cadena de comandos que producen una salida final (la que veremos como resultado en la terminal).

Ahora sí, pasemos a la acción.

Para obtener la frecuencia de una palabra en el texto, vamos a usar el comando grep (para obtener ayuda con cualquier comando en la terminal, podemos usar el comando man seguido del nombre del comando que queremos consultar, como man grep por ejemplo).

$ grep -o '\bniña\b' Las_mil_y_una_noches_vol1.txt | wc -w

Este comando busca la cadena niña (entre espacios en blanco, \b) y devuelve la frecuencia de la palabra en el texto. (recuerda que el $ es el prompt, así que eso no lo copies en tu terminal). En mi caso, la palabra niña aparece 9 veces. Podemos probar con un verbo conjugado muy común como eres. Fíjate que este verbo está entre dos \b, esto indica que se trata de una palabra que está entre dos espacios en blanco.

$ grep -o '\beres\b' Las_mil_y_una_noches_vol1.txt | wc -w

el cual aparece 50 veces en mi documento. Este comando no distingue mayúsculas de minúsculas, así que para obtener la frecuencia total de la forma debemos hacer la búsqueda también con una mayúscula inicial:

$ grep -o '\bEres\b' Las_mil_y_una_noches_vol1.txt | wc -w

El comando grep consigue 23 de estas (que por cierto son contadas con el comando wc -w). Y 50 + 23 = 73. Así que el verbo ser, conjugado en segunda persona del singular, aparece 73 veces en el texto. Para poder poner este número en perspectiva, podemos relacionarlo con el número de palabras total del texto. Para eso, vamos a usar el comando wc:

$ wc -w Las_mil_y_una_noches_vol1.txt

Obtenemos un total del 67.887 palabras. O sea, que eres representa un 73/67.887, más o menos el 0,1% del texto total. ¡No está mal para una historia tan extensa!

También podemos crear una lista de todas las palabras, con la frecuencia de cada una (aquí voy a seguir más o menos las instrucciones que Dan Jurafsky y Chris Manning proporcionan en un excelente curso de PLN). Para ello, vamos a usar otro comando:

$ tr -c a-zA-Zá-úñ '\n' < Las_mil_y_una_noches_vol1.txt

En este caso, el comando tr busca cadenas hechas de caracteres alfabéticos (esto lo conseguimos con a-zA-Zá-úñ), y convierte todo lo que no sea una de esas cadenas en un retorno de carro (\n), o sea, en una presión de la tecla enter. ¿El resultado? Una lista de las palabras del texto. Pero para poder calcular las frecuencias, vamos a ordenar las palabras alfabéticamente con el comando sort y vamos a contar cada caso repetido con uniq -c:

$ tr -c a-zA-Zá-úñ '\n' < Las_mil_y_una_noches_vol1.txt | sort | uniq -c

Ya tenemos una lista en la que cada palabra tiene su frecuencia, pero está ordenada alfabéticamente. Vamos a ordenarla de nuevo con sort pero utilizando la frecuencia como criterio (vamos a ver las palabras ordenadas de mayor a menor frecuencia):

$ tr -c a-zA-Zá-úñ '\n' < Las_mil_y_una_noches_vol1.txt | sort | uniq -c | sort -n -r

Ya casi terminamos. Si revisamos la lista con algo de cuidado notaremos que las palabras que usan mayúsculas se tratan como formas diferentes (lo mismo que nos pasó arriba con grep). Vamos a corregir esto. Para ello, vamos a usar de nuevo el comando tr, pero esta vez vamos a reemplazar todas las letras mayúsculas por minúsculas antes de sacar las cuentas, eso lo conseguimos con tr ‘A-Z’ ‘a-z’:

$ tr 'A-Z' 'a-z' < Las_mil_y_una_noches_vol1.txt | tr -c a-zA-Zá-úñ '\n' | sort | uniq -c | sort -n -r

El resultado de este último ejercicio debería verse en tu computadora más o menos así:

Lista ordenda de palabras por frecuencia
Algunos resultados de nuestra tarea

Con esto estamos listos. Hemos aprovechado algunas herramientas incorporadas en el sistema operativo para hacer un poco de PLN, (yeeeeiiii). La lista obtenida puede utilizarse, por ejemplo, para buscar las 20 palabras más frecuentes de un texto, para buscar palabras descriptivas del mismo, o con el propósito de hacer algo de ciencia de datos. Las frecuencias ordenadas de las palabras de un texto son reflejo de una ley empírica lingüística interesantísima llamada la Ley de Zipf, pero eso es un tema de otro artículo.

En la próxima entrega hablaremos de las diferencias entre el lenguaje natural y lenguajes artificiales como los lenguajes de programación.


Deja un comentario

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.

A %d blogueros les gusta esto: