Aprendizaje automático de PNL

Tutorial de clasificador de aprendizaje automático de PNL paso a paso

El procesamiento del lenguaje natural influye en tu vida todos los días. Aquí tienes un tutorial que te ayudará a probarlo por ti mismo.

El procesamiento del lenguaje natural (PNL) es un subcampo del aprendizaje automático que hace posible que las computadoras comprendan, analicen, manipulen y generen el lenguaje humano. Se encuentra con la PNL en su vida cotidiana, desde la detección de spam hasta la autocorrección y su asistente digital («¿Oye, Siri?»). Incluso puede encontrar PNL y ni siquiera darse cuenta. En este artículo, le mostraré cómo desarrollar sus propios proyectos de PNL con Natural Language Toolkit (NLTK), pero antes de sumergirnos en el tutorial, veamos algunos ejemplos diarios de PNL. 

Ejemplos de aprendizaje automático de PNL Filtros de correo no deseado

  • Autocorrección
  • Texto predictivo
  • Reconocimiento de voz
  • Recuperación de información
  • Extracción de información
  • Máquina traductora
  • Simplificación de texto
  • Análisis de los sentimientos
  • Resumen de texto
  • Respuesta a la consulta
  • Generación de lenguaje natural

Empiece a utilizar PNL

NLTK es un popular conjunto de bibliotecas de Python de código abierto. En lugar de construir todas tus herramientas de PNL desde cero, NLTK proporciona todas las tareas comunes de PNL para que puedas entrar en acción. En este tutorial, te mostraré cómo realizar tareas básicas de PNL y utilizar un clasificador de aprendizaje automático para predecir si un SMS es spam (un mensaje dañino, malicioso o no deseado) o jamón (algo que realmente podrías querer leer). Puedes encontrar todo el código abajo en este Github Repo.

Lo primero es lo primero, querrá instalar NLTK.

Escriba !Pip install nltk en un Jupyter Notebook. Si no funciona en cmd, escriba conda install -c conda-forge nltk. No debería tener que solucionar muchos problemas más allá de eso.

Importación de la biblioteca NLTK

import nltk
nltk.download()

Este código nos proporciona una aplicación de descarga NLTK que es útil en todas las tareas de PNL. Como puede ver, ya instalé Stopwords Corpus en mi sistema, lo que ayuda a eliminar palabras redundantes. Podrá instalar los paquetes que sean más útiles para su proyecto.

Aprendizaje automático de PNL en 10 minutos

Prepare sus datos para la PNL

Lectura de datos en texto

Nuestros datos nos llegan en formato estructurado o no estructurado. Un formato estructurado tiene un patrón bien definido. Por ejemplo, Excel y Google Sheets son datos estructurados. Alternativamente, los datos no estructurados no tienen un patrón discernible (por ejemplo, imágenes, archivos de audio, publicaciones en redes sociales). Entre estos dos tipos de datos, podemos encontrar que tenemos un formato semiestructurado. El lenguaje es un gran ejemplo de datos semiestructurados.

Como podemos ver en el código anterior, cuando leemos datos semiestructurados, es difícil para una computadora (¡y un humano!) De interpretar. Podemos usar Pandas para ayudarnos a comprender nuestros datos.

Con la ayuda de Pandas, ahora podemos ver e interpretar nuestros datos semiestructurados con mayor claridad.

Cómo limpiar sus datos

Es necesario limpiar sus datos de texto para resaltar los atributos que queremos que nuestro sistema de aprendizaje automático detecte. La limpieza (o preprocesamiento) de los datos suele constar de tres pasos.

Cómo limpiar sus datos para NLP

  • Eliminar puntuación
  • Tokenizar
  • Eliminar palabras vacías
  • Stem
  • Lemmatizar

1. Quitar puntuación

La puntuación puede proporcionar contexto gramatical a una oración que respalda la comprensión humana. Pero para nuestro vectorizador, que cuenta la cantidad de palabras y no el contexto, la puntuación no agrega valor. Entonces necesitamos eliminar todos los caracteres especiales. Por ejemplo, «¿Cómo estás?» se convierte en: ¿Cómo estás?

A continuación, le indicamos cómo hacerlo:

En body_text_clean, puede ver que hemos eliminado todos los signos de puntuación. ¡Me he convertido en Ive y LO HARÉ! Se convierte en VOLUNTAD.

2. Tokenizar

La tokenización separa el texto en unidades como oraciones o palabras. En otras palabras, esta función le da estructura a un texto previamente no estructurado. Por ejemplo: Plata o Plomo se convierte en «Plata», «o», «Plomo». Accede al código sin procesar aquí.

En body_text_tokenized, hemos generado todas las palabras como tokens.

3. Eliminar palabras vacías

Las palabras vacías son palabras comunes que probablemente aparecerán en cualquier texto. No nos dicen mucho sobre nuestros datos, por lo que los eliminamos. Nuevamente, estas son palabras que son excelentes para la comprensión humana, pero confundirán su programa de aprendizaje automático. Por ejemplo: plata o plomo está bien para mí se convierte en plata, plomo, fina. Acceda al código sin procesar aquí.

En body_text_nostop, eliminamos todas las palabras innecesarias como «estado», «para» y «el».

4. Stem

La raíz ayuda a reducir una palabra a su forma de raíz. A menudo tiene sentido tratar las palabras relacionadas de la misma manera. Elimina sufijos como «ing», «ly», «s» mediante un enfoque simple basado en reglas. La derivación reduce el corpus de palabras, pero a menudo las palabras reales se pierden, en cierto sentido. Por ejemplo: «Titular» o «Titulado» se convierte en «Titular».

Nota: algunos motores de búsqueda tratan las palabras con la misma raíz como sinónimos. Accede al código sin procesar aquí.

En body_text_stemmed, palabras como entrada y va se derivan de entri y goe aunque no significan nada en inglés.

5. Lematizar

Lematizar deriva la forma raíz («lema») de una palabra. Esta práctica es más sólida que la derivación porque utiliza un enfoque basado en un diccionario (es decir, un análisis morfológico) de la palabra raíz. Por ejemplo, «Titular» o «Titulado» se convierte en «Titular».

En resumen, la derivación suele ser más rápida, ya que simplemente corta el final de la palabra, pero sin comprender el contexto de la palabra. Lematizar es más lento pero más preciso porque requiere un análisis informado teniendo en cuenta el contexto de la palabra. Acceda al código sin procesar aquí.

En body_text_stemmed, podemos ver que palabras como «chances» están lematizadas como «chance» pero derivadas como «chanc».

Vectorizar datos

La vectorización es el proceso de codificar texto como números enteros para crear vectores de características de modo que los algoritmos de aprendizaje automático puedan comprender el lenguaje.

Métodos de vectorización de datos para NLP

  1. Bolsa de palabras
  2. N-gramos
  3. TF-IDF

1. Bolsa de palabras

Bag-of-Words (BoW) o CountVectorizer describe la presencia de palabras dentro de los datos de texto. Este proceso da un resultado de uno si está presente en la oración y de cero si está ausente. Por lo tanto, este modelo crea una bolsa de palabras con un recuento de matrices de documentos en cada documento de texto.

from sklearn.feature_extraction.text import CountVectorizer

count_vect = CountVectorizer(analyzer=clean_text)
X_counts = count_vect.fit_transform(data['body_text'])
print(X_counts.shape)
print(count_vect.get_feature_names())

Aplicamos BoW al body_text para que el recuento de cada palabra se almacene en la matriz del documento. (Consulta el repositorio).

2. N-Grams

Los N-grams son simplemente todas las combinaciones de palabras o letras adyacentes de longitud n que encontramos en nuestro texto fuente. Los N-gramos con n=1 se denominan unigramas, n=2 son bigramas, etc.

Los unigramas generalmente no contienen mucha información en comparación con los bigramas o trigramas. El principio básico detrás de los N-gramas es que capturan qué letra o palabra es probable que siga a una palabra determinada. Cuanto más largo sea el N-grama (n más alto), más contexto tendrá para trabajar.

from sklearn.feature_extraction.text import CountVectorizer

ngram_vect = CountVectorizer(ngram_range=(2,2),analyzer=clean_text) # It applies only bigram vectorizer
X_counts = ngram_vect.fit_transform(data['body_text'])
print(X_counts.shape)
print(ngram_vect.get_feature_names())

Hemos aplicado N-Gram al body_text, por lo que el recuento de cada grupo de palabras en una oración se almacena en la matriz del documento. (Consulta el repositorio).

3. TF-IDF

TF-IDF calcula la frecuencia relativa con la que aparece una palabra en un documento en comparación con su frecuencia en todos los documentos. Es más útil que la frecuencia de términos para identificar palabras clave en cada documento (alta frecuencia en ese documento, baja frecuencia en otros documentos).

Nota: utilizamos TF-IDF para la puntuación de los motores de búsqueda, el resumen de texto y la agrupación de documentos. Consulte mi artículo sobre sistemas de recomendación para obtener más información sobre TF-IDF.

from sklearn.feature_extraction.text import TfidfVectorizer

tfidf_vect = TfidfVectorizer(analyzer=clean_text)
X_tfidf = tfidf_vect.fit_transform(data['body_text'])
print(X_tfidf.shape)
print(tfidf_vect.get_feature_names())

Hemos aplicado TF-IDF en el body_text, por lo que el recuento relativo de cada palabra en las oraciones se almacena en la matriz del documento. (Consulta el repositorio).

Nota: Los vectorizadores generan matrices dispersas en las que la mayoría de las entradas son cero. En aras de un almacenamiento eficiente, se almacenará una matriz dispersa si solo está almacenando ubicaciones de los elementos distintos de cero.

Ingeniería de funciones

Creación de funciones

La ingeniería de características es el proceso de utilizar el conocimiento de dominio de los datos para crear características que hacen que los algoritmos de aprendizaje automático funcionen. Debido a que la ingeniería de funciones requiere conocimientos de dominio, la creación de funciones puede ser difícil, pero sin duda vale la pena dedicarle tiempo.

  • Body_len muestra la longitud de las palabras excluyendo los espacios en blanco en el cuerpo del mensaje.
  • punct% muestra el porcentaje de signos de puntuación en el cuerpo de un mensaje.

¿Vale la pena su función?

Podemos ver claramente que los spam tienen un alto número de palabras en comparación con los radioaficionados. Así que body_len es una buena característica para distinguir.

Ahora echemos un vistazo a punct%

El spam tiene un porcentaje más alto de puntuación, pero no tan lejos del jamón. Esto es sorprendente dado que los correos electrónicos no deseados a menudo contienen muchos signos de puntuación. Sin embargo, dada la aparente diferencia, todavía podemos llamar a esto una característica útil.

Creación de clasificadores de aprendizaje automático 

Selección de modelo

Usamos un método conjunto de aprendizaje automático. Al usar múltiples modelos en concierto, su combinación produce resultados más sólidos que un solo modelo (por ejemplo, máquina de vectores de soporte, Naive Bayes). Los métodos de conjunto son la primera opción para muchas competencias de Kaggle. Construimos algoritmos de bosque aleatorios (es decir, múltiples árboles de decisión aleatorios) y usamos los agregados de cada árbol para la predicción final. Este proceso se puede utilizar tanto para la clasificación como para los problemas de regresión y sigue una estrategia de ensacado aleatorio.

  • Búsqueda de cuadrícula: este modelo busca de forma exhaustiva combinaciones de parámetros generales en una cuadrícula determinada para determinar el mejor modelo.
  • Validación cruzada: este modelo divide un conjunto de datos en k subconjuntos y repite el método k veces. Este modelo también utiliza un subconjunto diferente como el conjunto de prueba en cada iteración.

Mean_test_score para n_estimators = 150 y max_depth da el mejor resultado. Aquí, n_estimators es el número de árboles en el bosque (grupo de árboles de decisión) y max_depth es el número máximo de niveles en cada árbol de decisión.

De manera similar, el mean_test_score para n_estimators = 150 y max_depth = 90 da el mejor resultado.

Mejoras futuras

Puede usar GradientBoosting, XgBoost para clasificar. GradientBoosting llevará un tiempo porque requiere un enfoque iterativo al combinar estudiantes débiles para crear estudiantes fuertes, enfocándose así en los errores de iteraciones anteriores. En resumen, en comparación con el bosque aleatorio, GradientBoosting sigue un enfoque secuencial en lugar de un enfoque paralelo aleatorio.

Nuestro clasificador de aprendizaje automático de PNL

Combinamos todas las secciones discutidas anteriormente para construir un Clasificador de Spam-Ham.

El bosque aleatorio proporciona una precisión del 97,7 por ciento. Obtenemos una puntuación F1 de alto valor del modelo. Esta matriz de confusión nos dice que predijimos correctamente 965 radioaficionados y 123 spam. Identificamos incorrectamente cero radioaficionados como spam y 26 spam se predijeron incorrectamente como radioaficionados. Este margen de error es justificable dado que es preferible detectar spam como radioaficionados a perder radioaficionados importantes por un filtro de spam de SMS.

Los filtros de correo no deseado son solo un ejemplo de la PNL que se encuentra todos los días. Aquí hay otros que influyen en tu vida todos los días (¡y algunos quizás quieras probar!). Con suerte, este tutorial te ayudará a probar más de estos por ti mismo.

  • Filtros de correo no deseado: su carpeta «basura»
  • Autocorrección: mensajes de texto, procesadores de texto
  • Texto predictivo: motores de búsqueda, mensajes de texto
  • Reconocimiento de voz: asistentes digitales como Siri, Alexa
  • Recuperación de información: Google encuentra resultados relevantes y similares
  • Extracción de información: Gmail sugiere eventos de correos electrónicos para agregar a su calendario
  • Traducción automática: Google Translate traduce el idioma de un idioma a otro
  • Simplificación de texto: Rewordify simplifica el significado de las oraciones
  • Análisis de sentimiento: Hat News nos brinda el sentimiento del usuario
  • Resumen de texto: el autotldr de Reddit ofrece un resumen de un envío
  • Respuesta a la consulta: las respuestas de IBM Watson a una pregunta
  • Generación de lenguaje natural: generación de texto a partir de datos de imagen o video