Capítulo 1. Lenguaje y cálculo Lenguaje y cálculo

Este trabajo se ha traducido utilizando IA. Agradecemos tus opiniones y comentarios: translation-feedback@oreilly.com

Las aplicaciones que aprovechan el procesamiento del lenguaje natural para comprender datos de texto y audio se están convirtiendo en elementos de nuestras vidas. En nuestro nombre, curan la miríada de información generada por el ser humano en la web, ofreciendo mecanismos nuevos y personalizados de interacción entre el ser humano y el ordenador. Estas aplicaciones están tan extendidas que nos hemos acostumbrado a una gran variedad de aplicaciones entre bastidores, desde filtros de spam que controlan el tráfico de nuestro correo electrónico, hasta motores de búsqueda que nos llevan justo donde queremos ir, pasando por asistentes virtuales que siempre están escuchando y listos para responder.

Las funciones conscientes del lenguaje son productos de datos construidos en la intersección de la experimentación, la investigación y el desarrollo práctico de software. La aplicación del análisis del texto y del habla es experimentada directamente por los usuarios, cuya respuesta proporciona una retroalimentación que adapta tanto la aplicación como el análisis. Este ciclo virtuoso suele comenzar de forma algo ingenua, pero con el tiempo puede convertirse en un sistema profundo con resultados gratificantes.

Irónicamente, mientras el potencial para integrar funciones basadas en el lenguaje en las aplicaciones sigue multiplicándose, un número desproporcionado está siendo desplegado por los "grandes". Entonces, ¿por qué no lo hace más gente? Quizá se deba en parte a que, a medida que estas funciones se hacen cada vez más frecuentes, también se hacen cada vez más invisibles, ocultando la complejidad necesaria para implantarlas. Pero también se debe a que la creciente marea de la ciencia de datos aún no ha calado en la cultura predominante del desarrollo de software.

Creemos que las aplicaciones que se basan en interfaces de lenguaje natural van a ser cada vez más comunes, sustituyendo a gran parte de lo que se hace actualmente con formularios y clics. Para desarrollar estas aplicaciones futuras, el desarrollo de software debe adoptar técnicas de ciencia de datos basadas en hipótesis. Para garantizar que los productos de datos conscientes del lenguaje sean más sólidos, los científicos de datos deben emplear prácticas de ingeniería de software que creen código de calidad de producción. Estos esfuerzos están integrados por un nuevo paradigma evolutivo de la ciencia de datos, que conduce a la creación de productos de datos conscientes del lenguaje, el objetivo principal de este libro.

El paradigma de la Ciencia de Datos

Gracias a las innovaciones en el aprendizaje automático y el procesamiento escalable de datos, en la última década "ciencia de datos" y "producto de datos" se han convertido rápidamente en términos familiares. También ha dado lugar a una nueva descripción del puesto, científico de datos: unaparte estadístico, una parte informático y una parte experto en la materia. Los científicos de datos son los creadores de valor fundamentales de la era de la información, por lo que esta nueva función se ha convertido en uno de los empleos más importantes, incluso sexy, del sigloXXI, pero también en uno de los más incomprendidos.

Los científicos de datos tienden un puente entre el trabajo tradicionalmente realizado en un contexto académico, de investigación y experimentación, y el flujo de trabajo de un producto comercial. Esto se debe, en parte, a que muchos científicos de datos han cursado previamente estudios de postgrado (lo que les ha proporcionado las habilidades creativas y multidisciplinares necesarias para la ciencia de datos), pero principalmente se debe a que el proceso de desarrollo de productos de datos es necesariamente experimental.

El reto, que voces destacadas en este campo han empezado a señalar, es que el flujo de trabajo de la ciencia de datos no siempre es compatible con las prácticas de desarrollo de software. Los datos pueden ser impredecibles, y la señal no siempre está garantizada. Como dice Hilary Mason sobre el desarrollo de productos de datos, la ciencia de los datos no siempre es especialmente ágil.1

O, dicho de otro modo:

Hay una diferencia fundamental entre entregar software de producción y conocimientos procesables como artefactos de un proceso ágil. La necesidad de que los conocimientos sean procesables crea un elemento de incertidumbre en torno a los artefactos de la ciencia de datos: pueden estar "completos" en un sentido de software y, sin embargo, carecer de valor porque no aportan conocimientos reales y procesables: las metodologías de software ágiles no gestionan bien esta incertidumbre.

Russell Jurney, Ciencia de datos ágil 2.0

Como resultado, los científicos de datos y los departamentos de ciencia de datos a menudo operan de forma autónoma del equipo de desarrollo en un paradigma de trabajo descrito en la Figura 1-1. En este contexto, el trabajo de la ciencia de datos produce análisis empresariales para la alta dirección, que comunica los cambios a la dirección de tecnología o producto; esos cambios se transmiten finalmente al equipo de desarrollo para su aplicación.

In organizations, data scientists often operate autonomously from the development team.
Figura 1-1. El paradigma actual de la ciencia de datos

Aunque esta estructura puede ser suficiente para algunas organizaciones, no es especialmente eficiente. Si los científicos de datos estuvieran integrados con el equipo de desarrollo desde el principio, como en la Figura 1-2, las mejoras del producto serían mucho más inmediatas y la empresa mucho más competitiva. ¡No hay muchas empresas que puedan permitirse construir las cosas dos veces! Y lo que es más importante, los esfuerzos de la práctica de la ciencia de datos se dirigen a los usuarios, lo que requiere un enfoque in-the-loop junto al desarrollo frontend.

While integrating data science directly into development is not straightforward, it presents tremendous potential.
Figura 1-2. Hacia un paradigma mejor para el desarrollo de la ciencia de datos

Uno de los impedimentos para un paradigma de desarrollo de la ciencia de datos más integrado es la falta de contenidos de ciencia de datos centrados en las aplicaciones. La mayoría de los recursos publicados sobre aprendizaje automático y procesamiento del lenguaje natural están escritos de forma que apoyen la investigación, pero no se adaptan bien al desarrollo de aplicaciones. Por ejemplo, aunque hay una serie de herramientas excelentes para el aprendizaje automático de texto, los recursos, la documentación, los tutoriales y las entradas de blog disponibles tienden a basarse en gran medida en conjuntos de datos de juguete, herramientas de exploración de datos y código de investigación. Existen pocos recursos que expliquen, por ejemplo, cómo construir un corpus lo suficientemente grande para apoyar una aplicación, cómo gestionar su tamaño y estructura a medida que crece con el tiempo, o cómo transformar documentos en bruto en datos utilizables. En la práctica, ésta es sin duda la mayor parte del trabajo que conlleva la creación de productos de datos escalables basados en la lengua.

Este libro pretende salvar esa distancia potenciando un enfoque de la analítica de texto orientado al desarrollo. En él, demostraremos cómo aprovechar las tecnologías de código abierto disponibles para crear productos de datos que sean modulares, comprobables, sintonizables y escalables. Junto con estas herramientas, esperamos que las técnicas aplicadas que se presentan en este libro permitan a los científicos de datos construir la próxima generación de productos de datos.

Este capítulo sirve de base para los capítulos más prácticos y centrados en la programación del resto del libro. Comienza definiendo lo que entendemos por productos de datos conscientes del lenguaje y explicando cómo empezar a detectarlos en la naturaleza. A continuación, hablaremos de los patrones de diseño arquitectónico más adecuados para las aplicaciones de análisis de texto. Por último, consideraremos las características del lenguaje que pueden utilizarse para modelarlo computacionalmente.

Productos de datos con conocimiento de idiomas

Los científicos de datos construyen productos de datos. Los productos de datos son aplicaciones que obtienen su valor de los datos y generan nuevos datos a cambio.2 En nuestra opinión, el objetivo de la analítica de texto aplicada es permitir la creación de "productos de datos conscientes del lenguaje", es decir, aplicaciones orientadas al usuario que no sólo respondan a las entradas humanas y puedan adaptarse a los cambios, sino que también sean impresionantemente precisas y relativamente sencillas de diseñar. En esencia, estas aplicaciones aceptan datos de texto como entrada, los analizan en partes compuestas, calculan sobre esas partes compuestas y las recombinan de forma que ofrezcan un resultado significativo y personalizado.

Uno de nuestros ejemplos favoritos de esto es "Yelpy Insights", una aplicación de filtrado de reseñas que aprovecha una combinación de análisis de sentimientos, colocaciones significativas (palabras que tienden a aparecer juntas) y técnicas de búsqueda para determinar si un restaurante es adecuado para tus gustos y restricciones dietéticas. Esta aplicación utiliza un corpus rico y específico del dominio y presenta los resultados a los usuarios de una forma intuitiva que les ayuda a decidir si frecuentan un restaurante determinado. Gracias a la identificación automática que hace la aplicación de las frases significativas en las reseñas y al resaltado de términos, permite a los posibles clientes de restaurantes digerir rápidamente una gran cantidad de texto y tomar decisiones gastronómicas con más facilidad. Aunque el análisis lingüístico no es la actividad principal de Yelp, el impacto que esta función tiene en la experiencia de sus usuarios es innegable. Desde que introdujo "Yelpy Insights" en 2012, Yelp no ha dejado de lanzar nuevas funciones basadas en el lenguaje y, durante ese mismo periodo, ha visto cómo sus ingresos anuales se multiplicaban por 6,5.3

Otro ejemplo sencillo de análisis lingüístico atornillado con efectos sobredimensionados es la función de "etiqueta sugerida" incorporada a los productos de datos de empresas como Stack Overflow, Netflix, Amazon, YouTube y otras. Las etiquetas son metainformación sobre un contenido esencial para la búsqueda y las recomendaciones, y desempeñan un papel importante a la hora de determinar qué contenido ven usuarios concretos. Las etiquetas identifican propiedades del contenido que describen, que pueden utilizarse para agrupar elementos similares y proponer nombres de temas descriptivos para un grupo.

Hay muchísimos más. Reverb ofrece un lector de noticias personalizado entrenado en el léxico Wordnik. El chatbot de Slack proporciona interacción automática contextual. Google Smart Reply puede sugerir respuestas basadas en el texto del correo electrónico al que estás respondiendo. Textra, iMessage y otras herramientas de mensajería instantánea intentan predecir lo que escribirás a continuación basándose en el texto que acabas de introducir, y el autocorrector intenta arreglar nuestras faltas de ortografía por nosotros. También hay un montón de nuevos asistentes virtuales activados por voz -Alexa, Siri, Google Assistant y Cortana- entrenados en datos de audio, que son capaces de analizar el habla y dar respuestas (normalmente) adecuadas.

Nota

¿Y qué pasa con los datos de voz? Aunque este libro se centra en el texto y no en el audio o el análisis del habla, los datos de audio suelen transcribirse a texto y luego se aplican a los análisis descritos en este libro. La transcripción en sí es un proceso de aprendizaje automático, ¡que cada vez es más común!

Características como éstas ponen de relieve la metodología básica de las aplicaciones lingüísticas: agrupar textos similares en grupos significativos o clasificar textos con etiquetas específicas, o dicho de otro modo: aprendizaje automático supervisado y no supervisado.

En la siguiente sección, exploraremos algunos patrones de diseño arquitectónico que apoyan el ciclo de vida del modelo de aprendizaje automático.

La cadena de productos de datos

La canalización estándar del producto de datos, que se muestra en la Figura 1-3, es un proceso iterativo que consta de dos fases -construcción e implementación- que reflejan la canalización del aprendizaje automático.4 Durante la fase de construcción, los datos se ingieren y se reúnen en una forma que permite ajustar los modelos y experimentar con ellos. Durante la fase de implementación, se seleccionan los modelos y se utilizan para realizar estimaciones o predicciones que afectan directamente al usuario.

The data product pipeline focuses on machine learning models, which are trained from data then generate new data that can be used as feedback to adapt the models.
Figura 1-3. Una cadena de productos de datos

Los usuarios responden a los resultados de los modelos, creando una retroalimentación, que a su vez se reingesta y se utiliza para adaptar los modelos. Las cuatro etapas -interacción, datos, almacenamiento y cálculo- describen los componentes arquitectónicos necesarios para cada fase. Por ejemplo, durante la interacción, la fase de construcción requiere un scraper o utilidad para ingerir datos, mientras que el usuario requiere algún frontend de aplicación. La fase de datos suele referirse a componentes internos que actúan como pegamento para la fase de almacenamiento, que suele ser una base de datos. La computación puede adoptar muchas formas, desde simples consultas SQL, cuadernos Jupyter o incluso computación en clúster mediante Spark.

La fase de implementación, aparte de requerir la selección y el uso de un modelo ajustado, no difiere significativamente de un desarrollo de software más sencillo. A menudo, los productos de trabajo de la ciencia de datos terminan en la API, que es consumida por otras API o por un frontend de usuario. Sin embargo, la fase de construcción de un producto de datos requiere más atención, y aún más en el caso del análisis de texto. Cuando construimos productos de datos que tienen en cuenta el lenguaje, creamos recursos léxicos y artefactos adicionales (como diccionarios, traductores, expresiones regulares, etc.) de los que dependerá nuestra aplicación desplegada.

En la Figura 1-4 se muestra una visión más detallada de la fase de construcción, una canalización que soporta aplicaciones de aprendizaje automático sólidas y conscientes del lenguaje. El proceso de pasar de los datos brutos al modelo implementado es esencialmente una serie de transformaciones incrementales de los datos. En primer lugar, transformamos los datos de su estado original en un corpus ingestado, almacenado y gestionado dentro de un almacén de datos persistente. A continuación, los datos ingeridos se agregan, se limpian, se normalizan y se transforman en vectores para que podamos realizar cálculos significativos. En la transformación final, un modelo o modelos se ajustan al corpus vectorizado y producen una visión generalizada de los datos originales, que puede emplearse desde dentro de la aplicación.

Data products that operate on text transform their data into a series of increasingly informed corpora then use machine learning models on vector representations of documents.
Figura 1-4. Productos de datos lingüísticos

La triple selección del modelo

Lo que diferencia la construcción de productos de aprendizaje automático es que la arquitectura debe apoyar y agilizar estas transformaciones de datos para que sean eficientemente comprobables y sintonizables. A medida que los productos de datos han tenido más éxito, ha aumentado el interés por definir en general un flujo de trabajo de aprendizaje automático para una construcción de modelos más rápida -o incluso automatizada-. Por desgracia, como el espacio de búsqueda es grande, las técnicas automáticas de optimización no son suficientes.

En cambio, el proceso de selección de un modelo óptimo es complejo e iterativo, e implica ciclos repetidos de ingeniería de características, selección de modelos y ajuste de hiperparámetros. Los resultados se evalúan después de cada iteración para llegar a la mejor combinación de características, modelo y parámetros que resuelva el problema en cuestión. Nos referimos a esto como el triple flujo de trabajo5 de selección de modelos. Este flujo de trabajo, que se muestra en la Figura 1-5, pretende tratar la iteración como algo central en la ciencia del aprendizaje automático, algo que debe facilitarse en lugar de limitarse.

The model selection triple is a generalization of the machine learning workflow that expresses an instance of a model as its feature engineering, algorithm, and hyperparameter components.
Figura 1-5. El triple flujo de trabajo de la selección de modelos

En un artículo de 2015, Wickham et al.6 desambiguan claramente el sobrecargado término "modelo" describiendo sus tres usos principales en el aprendizaje automático estadístico: familia de modelos, forma del modelo y modelo ajustado. La familia de modelos describe vagamente las relaciones de las variables con el objetivo de interés (por ejemplo, un "modelo lineal" o una "red neuronal tensorial recurrente"). La forma del modelo es una instanciación específica de la triple selección del modelo: un conjunto de características, un algoritmo y unos hiperparámetros específicos. Por último, el modelo ajustado es una forma de modelo que se ha ajustado a un conjunto específico de datos de entrenamiento y está disponible para hacer predicciones. Los productos de datos se componen de muchos modelos ajustados, construidos mediante el flujo de trabajo de selección de modelos, que crea y evalúa formas de modelos.

Como no estamos acostumbrados a pensar en el lenguaje como en datos, el principal reto del análisis de textos es interpretar lo que ocurre durante cada una de estas transformaciones. Con cada transformación sucesiva, el texto se vuelve cada vez menos directamente significativo para nosotros, porque se parece cada vez menos al lenguaje. Para ser eficaces en nuestra construcción de productos de datos conscientes del lenguaje, debemos cambiar nuestra forma de pensar sobre el lenguaje.

A lo largo del resto de este capítulo, enmarcaremos cómo pensar en el lenguaje como datos sobre los que se puede calcular. Por el camino, construiremos un pequeño vocabulario que nos permitirá articular los tipos de transformaciones que realizaremos sobre los datos textuales en los capítulos siguientes.

La lengua como dato

El lenguaje es datos no estructurados que han sido producidos por personas para ser entendidos por otras personas. En cambio, los datos estructurados o semiestructurados incluyen campos o marcas que permiten que un ordenador los analice fácilmente. Sin embargo, aunque no presentan una estructura fácilmente legible por una máquina, los datos no estructurados no son aleatorios. Al contrario, se rigen por propiedades lingüísticas que los hacen muy comprensibles para otras personas.

Las técnicas de aprendizaje automático, en particular el aprendizaje supervisado, son actualmente el medio más estudiado y prometedor de calcular sobre las lenguas. El aprendizaje automático nos permite entrenar (y volver a entrenar) modelos estadísticos sobre el lenguaje a medida que éste cambia. Al construir modelos del lenguaje sobre corpus específicos del contexto, las aplicaciones pueden aprovechar ventanas estrechas de significado para ser precisas sin necesidad de interpretación. Por ejemplo, crear una aplicación de prescripción automática que lea historiales médicos requiere un modelo muy distinto del de una aplicación que resuma y personalice noticias.

Un modelo computacional del lenguaje

Como científicos de datos que construyen productos de datos conscientes del lenguaje, nuestra tarea principal es crear un modelo que describa el lenguaje y pueda hacer inferencias basadas en esa descripción.

La definición formal de un modelo lingüístico intenta tomar como entrada una frase incompleta e inferir las palabras posteriores con mayor probabilidad de completar el enunciado. Este tipo de modelo lingüístico es enormemente influyente en el análisis de textos porque demuestra el mecanismo básico de una aplicación lingüística: el uso del contexto para adivinar el significado. Los modelos lingüísticos también revelan la hipótesis básica que subyace al aprendizaje automático aplicado al texto: el texto es predecible. De hecho, el mecanismo utilizado para puntuar los modelos lingüísticos en un contexto académico, la perplejidad, es una medida de lo predecible que es el texto mediante la evaluación de la entropía (el nivel de incertidumbre o sorpresa) de la distribución de probabilidad del modelo lingüístico.

Considera las siguientes frases parciales: "el mejor amigo del hombre..." o "la bruja voló en una...". Estas frases de baja entropía significan que los modelos lingüísticos adivinarían "amigo" y "palo de escoba", respectivamente, con una alta probabilidad (y, de hecho, los angloparlantes se sorprenderían si la frase no se completara así). Por otra parte, frases de alta entropía como "Voy a salir a cenar esta noche con mi..." se prestan a muchas posibilidades ("amigo", "madre" y "compañeros de trabajo" podrían ser todas igualmente probables). Los oyentes humanos pueden utilizar la experiencia, la imaginación y la memoria, así como el contexto situacional, para rellenar el espacio en blanco. Los modelos computacionales no tienen necesariamente el mismo contexto y, en consecuencia, deben estar más limitados.

Los modelos lingüísticos demuestran una capacidad para inferir o definir relaciones entre tokens, las cadenas de datos codificadas en UTF-8 que el modelo observa y que los oyentes y lectores humanos identifican como palabras con significado. En la definición formal, el modelo está aprovechando el contexto, definiendo un estrecho espacio de decisión en el que sólo existen unas pocas posibilidades.

Esta idea nos permite generalizar el modelo formal a otros modelos del lenguaje que funcionan en aplicaciones como la traducción automática o el análisis de sentimientos. Para aprovechar la predictibilidad del texto, necesitamos definir un espacio de decisión numérico y restringido sobre el que pueda calcular el modelo. Al hacer esto, podemos aprovechar las técnicas estadísticas de aprendizaje automático, tanto supervisadas como no supervisadas, para construir modelos del lenguaje que expongan el significado a partir de los datos.

El primer paso en el aprendizaje automático es la identificación de las características de los datos que predicen nuestro objetivo. Los datos de texto ofrecen muchas oportunidades para extraer características, ya sea a un nivel superficial simplemente utilizando la división de cadenas, hasta niveles más profundos que analizan el texto para extraer representaciones morfológicas, sintácticas e incluso semánticas de los datos.

En las siguientes secciones exploraremos algunas formas sencillas en que los datos lingüísticos pueden exponer características complejas con fines de modelización. En primer lugar, exploraremos cómo las propiedades lingüísticas de una lengua concreta (por ejemplo, el género en inglés) pueden darnos la capacidad rápida de realizar cálculos estadísticos sobre el texto. Luego profundizaremos en cómo el contexto modifica la interpretación, y cómo suele utilizarse para crear el modelo tradicional de "bolsa de palabras". Por último, exploraremos características más ricas que se analizan mediante el procesamiento morfológico, sintáctico y semántico del lenguaje natural.

Características lingüísticas

Considera un modelo sencillo que utiliza rasgos lingüísticos para identificar el género predominante en un texto. En 2013 Neal Caren, profesor adjunto de Sociología en la Universidad de Carolina del Norte Chapel Hill, escribió una entrada de blog7 que investigaba el papel del género en las noticias para determinar si hombres y mujeres aparecen en contextos diferentes. Aplicó un análisis del texto basado en el género a artículos del New York Times y determinó que, de hecho, las palabras masculinas y femeninas aparecían en contextos marcadamente diferentes, lo que podría reforzar los prejuicios de género.

Lo que resultaba especialmente interesante de este análisis era el uso de palabras de género para crear una puntuación basada en la frecuencia de masculinidad o feminidad. Para realizar un análisis similar en Python, podemos empezar construyendo conjuntos de palabras que diferencien las frases sobre hombres y sobre mujeres. Para simplificar, diremos que una frase puede tener uno de estos cuatro estados: puede ser sobre hombres, sobre mujeres, sobre hombres y mujeres, o desconocida (ya que las frases no pueden ser ni sobre hombres ni sobre mujeres, y también porque nuestros conjuntos MALE_WORDS y FEMALE_WORDS no son exhaustivos):

MALE = 'male'
FEMALE = 'female'
UNKNOWN = 'unknown'
BOTH = 'both'

MALE_WORDS = set([
    'guy','spokesman','chairman',"men's",'men','him',"he's",'his',
    'boy','boyfriend','boyfriends','boys','brother','brothers','dad',
    'dads','dude','father','fathers','fiance','gentleman','gentlemen',
    'god','grandfather','grandpa','grandson','groom','he','himself',
    'husband','husbands','king','male','man','mr','nephew','nephews',
    'priest','prince','son','sons','uncle','uncles','waiter','widower',
    'widowers'
])

FEMALE_WORDS = set([
    'heroine','spokeswoman','chairwoman',"women's",'actress','women',
    "she's",'her','aunt','aunts','bride','daughter','daughters','female',
    'fiancee','girl','girlfriend','girlfriends','girls','goddess',
    'granddaughter','grandma','grandmother','herself','ladies','lady',
    'lady','mom','moms','mother','mothers','mrs','ms','niece','nieces',
    'priestess','princess','queens','she','sister','sisters','waitress',
    'widow','widows','wife','wives','woman'
])

Ahora que tenemos conjuntos de palabras de género, necesitamos un método para asignar el género a una frase; crearemos una función genderize que examine el número de palabras de una frase que aparecen en nuestra lista MALE_WORDS y en nuestra lista FEMALE_WORDS. Si una frase sólo tiene MALE_WORDS, la llamaremos frase masculina, y si sólo tiene FEMALE_WORDS, la llamaremos frase femenina. Si una frase tiene recuentos distintos de cero tanto para palabras masculinas como femeninas, la llamaremos ambas; y si tiene cero palabras masculinas y cero femeninas, la llamaremos desconocida:

def genderize(words):

    mwlen = len(MALE_WORDS.intersection(words))
    fwlen = len(FEMALE_WORDS.intersection(words))

    if mwlen > 0 and fwlen == 0:
        return MALE
    elif mwlen == 0 and fwlen > 0:
        return FEMALE
    elif mwlen > 0 and fwlen > 0:
        return BOTH
    else:
        return UNKNOWN

Necesitamos un método para contar la frecuencia de palabras y frases con género dentro del texto completo de un artículo, lo que podemos hacer con la clase collections.Counters, una clase incorporada de Python. La función count_gender toma una lista de frases y aplica la función genderize para evaluar el número total de palabras y frases con género. Se cuenta el género de cada frase y se considera que todas las palabras de la frase pertenecen también a ese género:

from collections import Counter

def count_gender(sentences):

    sents = Counter()
    words = Counter()

    for sentence in sentences:
        gender = genderize(sentence)
        sents[gender] += 1
        words[gender] += len(sentence)

    return sents, words

Por último, para activar nuestros contadores de género, necesitamos algún mecanismo para analizar el texto en bruto de los artículos en frases y palabras componentes, y para ello utilizaremos la biblioteca NLTK (de la que hablaremos más adelante en este capítulo y en el siguiente) para dividir nuestros párrafos en frases. Una vez aisladas las frases, podemos tokenizarlas para identificar palabras individuales y signos de puntuación, y pasar el texto tokenizado a nuestros contadores de género para imprimir el porcentaje masculino, femenino, ambos o desconocido de un documento:

import nltk

def parse_gender(text):

    sentences = [
        [word.lower() for word in nltk.word_tokenize(sentence)]
        for sentence in nltk.sent_tokenize(text)
    ]

    sents, words = count_gender(sentences)
    total = sum(words.values())

    for gender, count in words.items():
        pcent = (count / total) * 100
        nsents = sents[gender]

        print(
            "{0.3f}% {} ({} sentences)".format(pcent, gender, nsents)
        )

Si ejecutamos nuestra función parse_gender en un artículo del New York Times titulado "Ensayar, pies de hielo, repetir: la vida de una bailarina del cuerpo de ballet de la ciudad de Nueva York", obtendremos los siguientes resultados, nada sorprendentes:

50.288% female (37 sentences)
42.016% unknown (49 sentences)
4.403% both (2 sentences)
3.292% male (3 sentences)

En este caso, la función de puntuación tiene en cuenta la longitud de la frase en función del número de palabras que contiene. Por tanto, aunque haya menos frases femeninas en total, más del 50% del artículo es femenino. Las extensiones de esta técnica pueden analizar las palabras que aparecen en las frases femeninas frente a las masculinas para ver si hay términos auxiliares que se asocien por defecto a los géneros masculino y femenino. Podemos ver que este análisis es relativamente fácil de implementar en Python, y Caren encontró sus resultados muy sorprendentes:

Si tu conocimiento de los papeles de hombres y mujeres en la sociedad proviniera sólo de la lectura del New York Times de la semana pasada, pensarías que los hombres practican deportes y dirigen el gobierno. Las mujeres hacen cosas femeninas y domésticas. Para ser sincera, me sorprendió un poco lo estereotipadas que eran las palabras utilizadas en las frases de los sujetos femeninos.

Neal Caren

Entonces, ¿qué ocurre exactamente aquí? Este mecanismo, aunque determinista, es un ejemplo muy bueno de cómo las palabras contribuyen a la previsibilidad en el contexto (por muy estereotipado que sea). Sin embargo, este mecanismo funciona específicamente porque el género es un rasgo que está codificado directamente en el lenguaje. En otras lenguas (como el francés, por ejemplo), el género es aún más pronunciado: las ideas, los objetos inanimados e incluso las partes del cuerpo pueden tener género (aunque a veces sea contraintuitivo). Los rasgos lingüísticos no transmiten necesariamente un significado definitorio, sino que a menudo transmiten otra información; por ejemplo, la pluralidad y el tiempo son otros rasgos que podemos extraer de una lengua; potencialmente podríamos aplicar un análisis similar para detectar el lenguaje pasado, presente o futuro. Sin embargo, los rasgos lingüísticos son sólo una parte de la ecuación cuando se trata de predecir el significado en un texto.

Características contextuales

Elanálisis de sentimientos, del que hablaremos más a fondo en el Capítulo 12, es una técnica de clasificación de textos muy popular porque el tono del texto puede transmitir mucha información sobre la perspectiva del sujeto y dar lugar a análisis agregados de las críticas, la polaridad de los mensajes o las reacciones. Se podría suponer que el análisis del sentimiento puede realizarse con una técnica similar al análisis del género de la sección anterior: reunir listas de palabras positivas ("impresionante", "bueno", "estupendo") y negativas ("horrible", "insípido", "soso") y calcular las frecuencias relativas de estos tokens en su contexto. Por desgracia, esta técnica es ingenua y suele producir resultados muy inexactos.

El análisis del sentimiento es fundamentalmente distinto de la clasificación por géneros, porque el sentimiento no es una característica lingüística, sino que depende del sentido de las palabras; por ejemplo, "esa patada voladora me sentó mal" es positivo, mientras que "la sopa de pescado me sentó mal" es negativo, y "tengo una iguana enferma como mascota" es algo ambiguo: la definición de la palabra "enferma" en estos ejemplos es cambiante. Además, el sentimiento depende del contexto incluso cuando las definiciones permanecen constantes; "soso" puede ser negativo cuando se habla de pimientos picantes, pero puede ser un término positivo cuando se describe el jarabe para la tos. Por último, a diferencia del género o el tiempo, el sentimiento puede negarse: "no bueno" significa malo. La negación puede invertir el significado de grandes cantidades de texto positivo; "Tenía grandes esperanzas y grandes expectativas en la película calificada de maravillosa y estimulante por los críticos, pero me decepcionó enormemente". Aquí, aunque las palabras que suelen indicar un sentimiento positivo, como "grandes esperanzas", "grandiosa", "maravillosa y estimulante" e incluso "enormemente", superan en número al único sentimiento negativo de "decepcionada", las palabras positivas no sólo no disminuyen el sentimiento negativo, sino que lo aumentan.

Sin embargo, todos estos ejemplos son predecibles; se comunica claramente un sentimiento positivo o negativo, y parece que un modelo de aprendizaje automático debería ser capaz de detectar el sentimiento y quizá incluso resaltar las expresiones ruidosas o ambiguas. Un enfoque determinista o estructural a priori pierde la flexibilidad del contexto y el sentido, por lo que, en su lugar, la mayoría de los modelos lingüísticos tienen en cuenta la localización de las palabras en su contexto, utilizando métodos de aprendizaje automático para crear predicciones.

La Figura 1-6 muestra el método principal para desarrollar modelos lingüísticos sencillos, a menudo denominado modelo de "bolsa de palabras". Este modelo evalúa la frecuencia con que las palabras co-ocurren consigo mismas y con otras palabras en un contexto específico y limitado. Las co-ocurrencias muestran qué palabras es probable que se sucedan y sucedan unas a otras y, al hacer inferencias sobre fragmentos limitados de texto, se pueden captar grandes cantidades de significado. A continuación, podemos utilizar métodos de inferencia estadística para hacer predicciones sobre el orden de las palabras.

A simple statistical view of language that counts the frequency of words occurring together in a simple context.
Figura 1-6. Una matriz de co-ocurrencia de palabras

Las extensiones del modelo de "bolsa de palabras" consideran no sólo las co-ocurrencias de una sola palabra, sino también las frases que están muy correlacionadas para indicar el significado. Si "sacar dinero en el banco" aporta mucha información al sentido de "banco", también lo hace "pescar en la orilla del río". Esto se denomina análisis de n-gramas, en el que n especifica una secuencia ordenada de caracteres o palabras para escanear (por ejemplo, un 3-grama es ('withdraw', 'money', 'at') frente al 5-grama ('withdraw', 'money', 'at', 'the', 'bank')). Los n-gramas presentan una oportunidad interesante porque la gran mayoría de los posibles n-gramas no tienen sentido (por ejemplo, ('bucket', 'jumps', 'fireworks')), ¡aunque la naturaleza evolutiva del lenguaje significa que incluso ese 3-grama podría llegar a tener sentido! Por tanto, los modelos lingüísticos que aprovechan el contexto de este modo requieren cierta capacidad para aprender la relación del texto con alguna variable objetivo.

Tanto los rasgos lingüísticos como los contextuales contribuyen a la previsibilidad general del lenguaje con fines analíticos. Pero la identificación de estos rasgos requiere la capacidad de analizar y definir el lenguaje según unidades. En la siguiente sección trataremos la coordinación de los rasgos lingüísticos y del contexto en el significado desde la perspectiva lingüística.

Características estructurales

Por último, los modelos lingüísticos y el análisis de textos se han beneficiado de los avances de la lingüística computacional. Tanto si estamos construyendo modelos con características contextuales como lingüísticas (o ambas), es necesario tener en cuenta las unidades de lenguaje de alto nivel utilizadas por los lingüistas, que nos darán un vocabulario para las operaciones que realizaremos en nuestro corpus de texto en capítulos posteriores. Las distintas unidades del lenguaje se utilizan para calcular a distintos niveles, y comprender el contexto lingüístico es esencial para entender las técnicas de procesamiento del lenguaje utilizadas en el aprendizaje automático.

La semántica se refiere al significado; está profundamente codificada en el lenguaje y es difícil de extraer. Si pensamos en un enunciado (una simple frase en lugar de un párrafo entero, como "Tomó prestado un libro de la biblioteca") en abstracto, podemos ver que hay una plantilla: un sujeto, el verbo principal, un objeto y un instrumento que se relaciona con el objeto (subject - predicate - object). Utilizando tales plantillas, se pueden construir ontologías que definan específicamente las relaciones entre entidades, pero tal trabajo requiere un conocimiento significativo del contexto y del dominio, y no suele escalar bien. No obstante, hay trabajos recientes prometedores sobre la extracción de ontologías de fuentes como Wikipedia o DBPedia (por ejemplo, la entrada de DBPedia sobre bibliotecas comienza "Una biblioteca es una colección de fuentes de información y recursos similares, accesibles a una comunidad definida para su consulta o préstamo").

El análisis semántico no consiste simplemente en comprender el significado del texto, sino en generar estructuras de datos a las que se pueda aplicar el razonamiento lógico. Las representaciones del significado del texto (o representaciones del significado temático, TMR) pueden utilizarse para codificar frases como estructuras de predicados a las que puede aplicarse la lógica de primer orden o el cálculo lambda. Otras estructuras, como las redes, pueden utilizarse para codificar interacciones de predicados de características interesantes del texto. A continuación, se puede utilizar el recorrido para analizar la centralidad de los términos o temas y razonar sobre las relaciones entre los elementos. Aunque no se trata necesariamente de un análisis semántico completo, el análisis de grafos puede aportar ideas importantes.

La sintaxis se refiere a las reglas de formación de oraciones definidas normalmente por la gramática. Las frases son lo que utilizamos para construir el significado y codifican mucha más información que las palabras, por lo que las trataremos como la unidad lógica más pequeña del lenguaje. El análisis sintáctico está diseñado para mostrar la relación significativa de las palabras, normalmente dividiendo la frase en trozos o mostrando la relación de los tokens en una estructura de árbol (similar a la diagramación de frases que probablemente hiciste en la escuela de gramática). La sintaxis es un requisito previo necesario para razonar sobre el discurso o la semántica, porque es una herramienta vital para comprender cómo las palabras se modifican entre sí en la formación de frases. Por ejemplo, el análisis sintáctico debería identificar la frase preposicional "de la biblioteca" y la frase sustantiva "un libro de la biblioteca" como subcomponentes de la frase verbal "tomó prestado un libro de la biblioteca".

La morfología se refiere a la forma de las cosas, y en el análisis de textos, a la forma de las palabras individuales o tokens. La estructura de las palabras puede ayudarnos a identificar la pluralidad(esposa frente a esposas), el género(prometido frente a prometida), el tiempo(corrió frente a corre), la conjugación(correr frente a corre), etc. La morfología es un reto porque la mayoría de las lenguas tienen muchas excepciones y casos especiales. La puntuación inglesa, por ejemplo, tiene tanto reglas ortográficas, que simplemente ajustan la terminación de una palabra(puppy - cachorros), como reglas morfológicas que son traducciones completas(goose - gansos). El inglés es una lengua afijal, lo que significa que simplemente añadimos caracteres al principio o al final de una palabra para modificarla. Otras lenguas tienen modos morfológicos diferentes: El hebreo utiliza plantillas de consonantes que se rellenan con vocales para crear significado, mientras que el chino utiliza símbolos pictográficos que no necesariamente se modifican directamente.

El objetivo principal de la morfología es comprender las partes de las palabras para poder asignarlas a clases, a menudo denominadas etiquetas de parte de palabra. Por ejemplo, queremos saber si una palabra es un sustantivo singular, un sustantivo plural o un nombre propio. También podemos querer saber si un verbo es infinitivo, pasado o gerundio. Estas partes de la oración se utilizan luego para construir estructuras mayores, como trozos o frases, o incluso árboles completos, que a su vez pueden utilizarse para construir estructuras de datos de razonamiento semántico.

La semántica, la sintaxis y la morfología nos permiten añadir datos a simples cadenas de texto con significado lingüístico. En el Capítulo 3 exploraremos cómo dividir el texto en unidades de razón, utilizando la tokenización y la segmentación para dividir el texto en sus unidades de lógica y significado, así como para asignar etiquetas de parte de habla. En el Capítulo 4 aplicaremos la vectorización a estas estructuras para crear espacios de rasgos numéricos, por ejemplo, normalizando el texto con stemming y lematización para reducir el número de rasgos. Por último, en el Capítulo 7, utilizaremos directamente las estructuras para codificar información en nuestros protocolos de aprendizaje automático para mejorar el rendimiento y dirigirnos a tipos más específicos de análisis.

Conclusión

El lenguaje natural es una de las formas de datos más desaprovechadas de la actualidad. Tiene la capacidad de hacer que los productos de datos sean aún más útiles e integrales en nuestras vidas de lo que ya son. Los científicos de datos están en una posición única para crear este tipo de productos de datos conscientes del lenguaje, y al combinar los datos de texto con el aprendizaje automático, tienen el potencial de crear aplicaciones potentes en un mundo en el que la información a menudo equivale a valor y a ventaja competitiva. Desde el correo electrónico hasta los mapas y las búsquedas, nuestra vida moderna se nutre de fuentes de datos de lenguaje natural, y los productos de datos con conciencia lingüística son los que hacen accesible su valor.

En los próximos capítulos, hablaremos de los precursores necesarios del aprendizaje automático sobre texto, a saber, la gestión de corpus (en el Capítulo 2), el preprocesamiento (en el Capítulo 3) y la vectorización (en el Capítulo 4). A continuación, experimentaremos formulando problemas de aprendizaje automático a los de clasificación (en el Capítulo 5) y agrupación(en el Capítulo 6). En el Capítulo 7 aplicaremos la extracción de características para maximizar la eficacia de nuestros modelos, y en el Capítulo 8 veremos cómo emplear la visualización de texto para aflorar resultados y diagnosticar errores de modelado. En el Capítulo 9, exploraremos un enfoque diferente del modelado del lenguaje, utilizando la estructura de datos de grafos para representar las palabras y sus relaciones. A continuación, en el Capítulo 10, exploraremos métodos más especializados de recuperación, extracción y generación para chatbots. Por último, en los Capítulos 11 y 12 investigaremos técnicas para escalar la potencia de procesamiento con Spark y escalar la complejidad de los modelos con redes neuronales artificiales.

Como veremos en el próximo capítulo, para realizar análisis escalables y aprendizaje automático sobre texto, primero necesitaremos tanto conocimiento del dominio como un corpus específico del dominio. Por ejemplo, si trabajas en el ámbito financiero, tu aplicación debe ser capaz de reconocer símbolos bursátiles, términos financieros y nombres de empresas, lo que significa que los documentos del corpus que construyas deben contener estas entidades. En otras palabras, el desarrollo de un producto de datos con conciencia lingüística comienza con la adquisición del tipo adecuado de datos de texto y la construcción de un corpus personalizado que contenga las características estructurales y contextuales del dominio en el que trabajas.

1 Hillary Mason, La próxima generación de productos de datos, (2017) http://bit.ly/2GOF894

2 Mike Loukides, ¿Qué es la ciencia de datos?, (2010) https://oreil.ly/2GJBEoj

3 Observación del Mercado, (2018) https://on.mktw.net/2suTk24

4 Benjamin Bengfort, La era del producto de datos, (2015) http://bit.ly/2GJBEEP

5 Arun Kumar, Robert McCann, Jeffrey Naughton y Jignesh M. Patel, Sistemas de gestión de selección de modelos: La próxima frontera de la analítica avanzada, (2015) http://bit.ly/2GOFa0G

6 Hadley Wickham, Dianne Cook y Heike Hofmann, Visualizar modelos estadísticos: Quitando la venda de los ojos, (2015) http://bit.ly/2JHq92J

7 Neal Caren, Using Python to see how the Times writes about men and women, (2013) http://bit.ly/2GJBGfV

Get Análisis de Texto Aplicado con Python now with the O’Reilly learning platform.

O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.