Guía avanzada para el Procesamiento del Lenguaje Natural
Guía avanzada PLN
Introducción
Bienvenido al mundo transformador del Procesamiento del Lenguaje Natural (NLP, por sus siglas en inglés). Aquí, la elegancia del lenguaje humano se encuentra con la precisión de la inteligencia artificial. La fuerza invisible del NLP impulsa muchas de las interacciones digitales en las que confiamos. Varias aplicaciones utilizan esta guía de Procesamiento del Lenguaje Natural, como los chatbots que responden a tus preguntas, los motores de búsqueda que adaptan los resultados según la semántica, y los asistentes de voz que te ayudan a establecer recordatorios.
En esta guía completa, nos sumergiremos en múltiples campos del NLP mientras destacamos sus aplicaciones de vanguardia que están revolucionando los negocios y mejorando las experiencias de los usuarios.
Comprendiendo los Contextual Embeddings: Las palabras no son simplemente unidades discretas; su significado cambia según el contexto. Analizaremos la evolución de los embeddings, desde los estáticos como Word2Vec hasta los interactivos que necesitan contexto.
- Training a un Agente para Dominar un Juego Simple a través de Juego Autónomo
- Microsoft Research lanza el ‘Cuarteto de Heavy Metal’ de los compiladores de IA Rammer, Roller, Welder y Grinder
- Las 50 mejores herramientas de escritura de IA para probar (septiembre de 2023)
Transformers y el arte de la resumen de textos: La resumen de textos es una tarea difícil que va más allá de la simple truncación del texto. Aprende sobre la arquitectura Transformer y cómo modelos como T5 están cambiando los criterios para una resumen de texto exitosa.
En la era del aprendizaje profundo, es desafiante analizar las emociones debido a las capas y la complejidad. Aprende cómo los modelos de aprendizaje profundo, especialmente aquellos basados en la arquitectura Transformer, son expertos en interpretar estas capas desafiantes para proporcionar un análisis de sentimientos más detallado.
Utilizaremos el conjunto de datos de Kaggle ‘Airline_Reviews’ para nuestras ideas útiles. Este conjunto de datos está lleno de datos de texto del mundo real.
Objetivos de Aprendizaje
- Reconocer el cambio de sistemas basados en reglas a arquitecturas de aprendizaje profundo, poniendo especial énfasis en los momentos cruciales.
- Aprender sobre el cambio de las representaciones estáticas de palabras, como Word2Vec, a los embeddings contextuales dinámicos, enfatizando la importancia del contexto para la comprensión del lenguaje.
- Aprender sobre el funcionamiento interno de la arquitectura Transformer en detalle y cómo los modelos T5 y otros están revolucionando la resumen de texto.
- Descubrir cómo el aprendizaje profundo, en particular los modelos basados en Transformer, pueden ofrecer ideas específicas sobre los sentimientos de un texto.
Este artículo fue publicado como parte del Data Science Blogathon.
Profundizando en el NLP
El Procesamiento del Lenguaje Natural (NLP, por sus siglas en inglés) es una rama de la inteligencia artificial que se enfoca en enseñar a las máquinas a entender, interpretar y responder al lenguaje humano. Esta tecnología conecta a los humanos con las computadoras, permitiendo interacciones más naturales. Utiliza el NLP en una amplia gama de aplicaciones, desde tareas simples como la corrección ortográfica y la búsqueda de palabras clave hasta operaciones más complejas como la traducción automática, el análisis de sentimientos y la funcionalidad de los chatbots. Es la tecnología que permite el funcionamiento de los asistentes virtuales activados por voz, los servicios de traducción en tiempo real e incluso los algoritmos de recomendación de contenido. Como campo multidisciplinario, el procesamiento del lenguaje natural (NLP) combina conocimientos de lingüística, informática y aprendizaje automático para crear algoritmos que puedan comprender datos textuales, convirtiéndolo en un pilar de las aplicaciones de inteligencia artificial de hoy en día.
Evolución de las Técnicas de NLP
El NLP ha evolucionado significativamente a lo largo de los años, avanzando desde sistemas basados en reglas hasta modelos estadísticos y, más recientemente, hacia el aprendizaje profundo. El viaje hacia la captura de los detalles del lenguaje se puede observar en el cambio desde los modelos convencionales de Bolsa de Palabras (BoW) a Word2Vec y luego a los embeddings contextuales. A medida que la potencia computacional y la disponibilidad de datos aumentaron, el NLP comenzó a utilizar redes neuronales sofisticadas para comprender la sutileza lingüística. Los avances modernos en el aprendizaje por transferencia permiten que los modelos mejoren en tareas específicas, garantizando eficiencia y precisión en aplicaciones del mundo real.
El Ascenso de los Transformers
Los Transformers son un tipo de arquitectura de redes neuronales y se han convertido en la base de muchos modelos de vanguardia en NLP. Los Transformers, en comparación con sus predecesores que dependían en gran medida de capas recurrentes o convolucionales, utilizan un mecanismo conocido como “atención” para establecer dependencias globales entre la entrada y la salida.
La arquitectura de un Transformer está compuesta por un codificador y un decodificador, cada uno de los cuales tiene múltiples capas idénticas. El codificador toma la secuencia de entrada y la comprime en un “contexto” o “memoria” que el decodificador utiliza para generar la salida. Los Transformers se distinguen por su mecanismo de “auto-atención”, que pondera diversas partes de la entrada al producir la salida, permitiendo que el modelo se centre en lo que es importante.
Se utilizan en tareas de NLP porque sobresalen en una variedad de tareas de transformación de datos, incluyendo pero no limitándose a la traducción automática, la resumen de texto y el análisis de sentimientos.
Reconocimiento Avanzado de Entidades Nombradas (NER) con BERT
El Reconocimiento de Entidades Nombradas (NER) es una parte importante de NLP que implica identificar y categorizar entidades nombradas en texto en categorías predefinidas. Los sistemas tradicionales de NER dependían en gran medida de enfoques basados en reglas y características. Sin embargo, con la llegada del aprendizaje profundo y, en particular, de las arquitecturas de Transformer como BERT (Codificaciones Bidireccionales de Encoder a Transformer), el rendimiento de NER ha aumentado sustancialmente.
BERT de Google está pre-entrenado en una gran cantidad de texto y puede generar incrustaciones contextuales para las palabras. Esto significa que BERT puede entender el contexto en el que aparece la palabra, lo que lo hace muy útil para tareas como NER donde el contexto es crítico.
Implementando NER Avanzado utilizando BERT
- Beneficiaremos de la capacidad de BERT para comprender el contexto utilizando sus incrustaciones como una capacidad en NER.
- El sistema NER de SpaCy es básicamente un mecanismo de etiquetado de secuencias. En lugar de a través de vectores de palabras comunes, lo entrenaremos con incrustaciones de BERT y la arquitectura de SpaCy.
import spacy
import torch
from transformers import BertTokenizer, BertModel
import pandas as pd
# Cargando el conjunto de datos de reseñas de aerolíneas en un DataFrame
df = pd.read_csv('/kaggle/input/airline-reviews/Airline_Reviews.csv')
# Inicializando el tokenizador y modelo de BERT
tokenizer = BertTokenizer.from_pretrained("bert-base-uncased")
model = BertModel.from_pretrained("bert-base-uncased")
# Inicializando el modelo de SpaCy para NER
nlp = spacy.load("en_core_web_sm")
# Definiendo una función para obtener entidades nombradas de un texto utilizando SpaCy
def get_entities(text):
doc = nlp(text)
return [(ent.text, ent.label_) for ent in doc.ents]
# Extrayendo e imprimiendo entidades nombradas de las primeras 4 reseñas en el DataFrame
for i, review in df.head(4).iterrows():
entities = get_entities(review['Review'])
print(f"Reseña #{i + 1}:")
for entity in entities:
print(f"Entidad: {entity[0]}, Etiqueta: {entity[1]}")
print("\n")
'''Este código carga un conjunto de datos de reseñas de aerolíneas, inicializa los modelos BERT y SpaCy,
y luego extrae e imprime las entidades nombradas de las primeras cuatro reseñas.
'''
Incrustaciones Contextuales y su Importancia
En las incrustaciones tradicionales como Word2Vec o GloVe, una palabra siempre tiene la misma representación vectorial independientemente de su contexto. No se representan con precisión los múltiples significados de las palabras. Las incrustaciones contextuales se han convertido en una forma popular de evitar esta limitación.
En contraste con Word2Vec, las incrustaciones contextuales capturan el significado de las palabras basado en su contexto, lo que permite representaciones flexibles de palabras. Por ejemplo, la palabra “banco” se ve de manera diferente en las oraciones “Me senté junto al banco del río” y “Fui al banco”. La ilustración que cambia constantemente produce teorías más precisas, especialmente para tareas que requieren una comprensión sutil. La capacidad de los modelos para comprender frases comunes, sinónimos y otros constructos lingüísticos que antes eran difíciles de entender para las máquinas está mejorando.
Transformers y Resumen de Texto con BERT y T5
La arquitectura Transformer cambió fundamentalmente el panorama de NLP, permitiendo el desarrollo de modelos como BERT, GPT-2 y T5. Estos modelos utilizan mecanismos de atención para evaluar los pesos relativos de las diferentes palabras en una secuencia, lo que resulta en una comprensión altamente contextual y matizada del texto.
T5 (Transformador de Transferencia de Texto a Texto) generaliza la idea al tratar cada problema de NLP como un problema de texto a texto, mientras que BERT es un modelo de resumen eficaz. La traducción, por ejemplo, implica convertir texto en inglés a texto en francés, mientras que el resumen implica reducir un texto largo. Como resultado, T5 es fácilmente adaptable. Entrena a T5 con una variedad de tareas debido a su sistema unificado, posiblemente utilizando información de una sola asignación para entrenar en otra.
Implementación con T5
import pandas as pd
from transformers import T5Tokenizer, T5ForConditionalGeneration
# Cargando el conjunto de datos de opiniones de aerolíneas en un DataFrame
df = pd.read_csv('/kaggle/input/airline-reviews/Airline_Reviews.csv')
# Inicializando el tokenizador y el modelo T5 (usando 't5-small' para la demostración)
nombre_modelo = "t5-small"
modelo = T5ForConditionalGeneration.from_pretrained(nombre_modelo)
tokenizador = T5Tokenizer.from_pretrained(nombre_modelo)
# Definiendo una función para resumir texto usando el modelo T5
def resumir_con_t5(texto):
texto_entrada = "resumir: " + texto
# Tokenizando el texto de entrada y generando un resumen
texto_tokenizado = tokenizador.encode(texto_entrada, return_tensors="pt",
max_length=512, truncation=True)
ids_resumen = modelo.generate(texto_tokenizado, max_length=100, min_length=5,
length_penalty=2.0, num_beams=4, early_stopping=True)
return tokenizador.decode(ids_resumen[0], skip_special_tokens=True)
# Resumiendo e imprimiendo las primeras 5 opiniones en el DataFrame para la demostración
for i, fila in df.head(5).iterrows():
resumen = resumir_con_t5(fila['Review'])
print(f"Resumen {i+1}:\n{resumen}\n")
print("-" * 50)
''' Este código carga un conjunto de datos de opiniones de aerolíneas, inicializa el modelo T5 y el tokenizador,
y luego genera e imprime resúmenes para las primeras cinco opiniones.
'''
Después de completar exitosamente el código, es claro que los resúmenes generados son concisos pero transmiten exitosamente los puntos principales de las opiniones originales. Esto demuestra la capacidad del modelo T5 para comprender y evaluar datos. Debido a su efectividad y capacidad para resumir texto, este modelo es uno de los más buscados en el campo del procesamiento del lenguaje natural (NLP por sus siglas en inglés).
Análisis de sentimientos avanzado con conocimientos de aprendizaje profundo
Yendo más allá de la simple categorización de sentimientos en categorías positivas, negativas o neutrales, podemos profundizar para extraer sentimientos más específicos e incluso determinar la intensidad de estos sentimientos. Combinando el poder de BERT con capas adicionales de aprendizaje profundo, podemos crear un modelo de análisis de sentimientos que brinde perspectivas más detalladas.
Ahora, analizaremos cómo varían los sentimientos en todo el conjunto de datos para identificar patrones y tendencias en la característica de opiniones del conjunto de datos.
Implementando un análisis de sentimientos avanzado utilizando BERT
Preparación de datos
Preparar los datos es crucial antes de comenzar el proceso de modelado. Esto implica cargar el conjunto de datos, tratar los valores faltantes y convertir los datos no procesados en un formato adecuado para el análisis de sentimientos. En este caso, traduciremos la columna Overall_Rating del conjunto de datos de opiniones de aerolíneas en categorías de sentimiento. Utilizaremos estas categorías como etiquetas de destino al entrenar el modelo de análisis de sentimientos.
import pandas as pd
# Cargando el conjunto de datos
df = pd.read_csv('/kaggle/input/airline-reviews/Airline_Reviews.csv')
# Convirtiendo los valores 'n' en NaN y luego convirtiendo la columna a tipo de dato numérico
df['Overall_Rating'] = pd.to_numeric(df['Overall_Rating'], errors='coerce')
# Eliminando filas con valores NaN en la columna Overall_Rating
df.dropna(subset=['Overall_Rating'], inplace=True)
# Convirtiendo las calificaciones en categorías de varias clases
def calificacion_a_categoria(calificacion):
if calificacion <= 2:
return "Muy Negativo"
elif calificacion <= 4:
return "Negativo"
elif calificacion == 5:
return "Neutral"
elif calificacion <= 7:
return "Positivo"
else:
return "Muy Positivo"
# Aplicando la función para crear una columna 'Sentimiento'
df['Sentimiento'] = df['Overall_Rating'].apply(calificacion_a_categoria)
Tokenización
La tokenización es el proceso de transformar el texto en tokens. El modelo utiliza estos tokens como entrada. Utilizaremos el tokenizador DistilBERT, mejorado para mayor precisión y rendimiento. Nuestras opiniones se transformarán en un formato que el modelo DistilBERT pueda entender con la ayuda de este tokenizador.
from transformers import DistilBertTokenizer
# Inicializando el tokenizador DistilBert con el modelo pre-entrenado 'distilbert-base-uncased'
tokenizer = DistilBertTokenizer.from_pretrained('distilbert-base-uncased')
Conjunto de datos y DataLoader
Debemos implementar las clases Dataset y DataLoader de PyTorch para entrenar y evaluar nuestro modelo de manera efectiva. El DataLoader nos permitirá agrupar nuestros datos en lotes, acelerando el proceso de entrenamiento, y la clase Dataset nos ayudará a organizar nuestros datos y etiquetas.
from torch.utils.data import Dataset, DataLoader
from sklearn.model_selection import train_test_split
# Definición de una clase Dataset personalizada para el análisis de sentimientos
class SentimentDataset(Dataset):
def __init__(self, reviews, labels):
self.reviews = reviews
self.labels = labels
self.label_dict = {"Muy Negativo": 0, "Negativo": 1, "Neutral": 2,
"Positivo": 3, "Muy Positivo": 4}
# Devuelve el número total de ejemplos
def __len__(self):
return len(self.reviews)
# Obtiene el ejemplo y la etiqueta en el índice dado
def __getitem__(self, idx):
review = self.reviews[idx]
label = self.label_dict[self.labels[idx]]
tokens = tokenizer.encode_plus(review, add_special_tokens=True,
max_length=128, pad_to_max_length=True, return_tensors='pt')
return tokens['input_ids'].view(-1), tokens['attention_mask'].view(-1),
torch.tensor(label)
# División del conjunto de datos en conjuntos de entrenamiento y prueba
train_df, test_df = train_test_split(df, test_size=0.2, random_state=42)
# Creación del DataLoader para el conjunto de entrenamiento
train_dataset = SentimentDataset(train_df['Review'].values, train_df['Sentiment'].values)
train_loader = DataLoader(train_dataset, batch_size=16, shuffle=True)
# Creación del DataLoader para el conjunto de prueba
test_dataset = SentimentDataset(test_df['Review'].values, test_df['Sentiment'].values)
test_loader = DataLoader(test_dataset, batch_size=16, shuffle=False)
'''Este código define una clase Dataset personalizada de PyTorch para el análisis de sentimientos y luego crea
DataLoaders para los conjuntos de entrenamiento y prueba.
'''
Inicialización del modelo y entrenamiento
Ahora podemos inicializar el modelo DistilBERT para la clasificación de secuencias con nuestros datos preparados. En base a nuestro conjunto de datos, entrenaremos este modelo y modificaremos sus pesos para predecir el tono de las críticas de las aerolíneas.
from transformers import DistilBertForSequenceClassification, AdamW
from torch.nn import CrossEntropyLoss
# Inicialización del modelo DistilBERT para la clasificación de secuencias con 5 etiquetas
model = DistilBertForSequenceClassification.from_pretrained('distilbert-base-uncased',
num_labels=5)
# Inicialización del optimizador AdamW para el entrenamiento
optimizer = AdamW(model.parameters(), lr=1e-5)
# Definición de la función de pérdida Cross-Entropy
loss_fn = CrossEntropyLoss()
# Bucle de entrenamiento durante 3 épocas
for epoch in range(3):
for batch in train_loader:
# Desempaquetar los tensores de entrada y etiquetas del lote DataLoader
input_ids, attention_mask, labels = batch
# Reiniciar los gradientes
optimizer.zero_grad()
# Pasada hacia adelante: Obtener las predicciones del modelo
outputs = model(input_ids, attention_mask=attention_mask)
# Cálculo de la pérdida entre las predicciones y la verdad fundamental
loss = loss_fn(outputs[0], labels)
# Pasada hacia atrás: Cálculo de los gradientes
loss.backward()
# Actualización de los parámetros del modelo
optimizer.step()
'''Este código inicializa un modelo DistilBERT para la clasificación de secuencias, configura
el optimizador AdamW y CrossEntropyLoss, y luego entrena el modelo durante 3 épocas.
'''
Evaluación
Después del entrenamiento, debemos evaluar el rendimiento de nuestro modelo en datos no probados. Esto nos ayudará a determinar qué tan bien funcionará nuestro modelo en situaciones prácticas.
correct_predictions = 0
total_predictions = 0
# Establecer el modelo en modo de evaluación
model.eval()
# Deshabilitar los cálculos de gradientes ya que solo estamos haciendo inferencia
with torch.no_grad():
# Recorriendo los lotes en el DataLoader de prueba
for batch in test_loader:
# Desempaquetar los tensores de entrada y etiquetas del lote DataLoader
input_ids, attention_mask, labels = batch
# Obtener las predicciones del modelo
outputs = model(input_ids, attention_mask=attention_mask)
# Obtener las etiquetas predichas
_, preds = torch.max(outputs[0], dim=1)
# Contar el número de predicciones correctas
correct_predictions += (preds == labels).sum().item()
# Contar el número total de predicciones
total_predictions += labels.size(0)
# Cálculo de la precisión
accuracy = correct_predictions / total_predictions
# Imprimir la precisión
print(f"Precisión: {accuracy * 100:.2f}%")
'''Este fragmento de código evalúa el modelo entrenado en el conjunto de datos de prueba e imprime
la precisión general.
'''
- SALIDA: Precisión: 87.23%
Implementación
Podemos guardar el modelo una vez que estemos satisfechos con su rendimiento. Esto permite utilizar el modelo en diversas plataformas o aplicaciones.
# Guardar el modelo entrenado en el disco
model.save_pretrained("/kaggle/working/")
# Guardar el tokenizador en el disco
tokenizer.save_pretrained("/kaggle/working/")
''' Este fragmento de código guarda el modelo entrenado y el tokenizador en el
directorio especificado para su uso futuro.
'''
Inferencia
Utilicemos el sentimiento de una muestra de reseña para entrenar nuestro modelo entrenado y predecirlo. Esto ejemplifica cómo se puede realizar un análisis de sentimiento en tiempo real utilizando el modelo.
# Función para predecir el sentimiento de una reseña dada
def predecir_sentimiento(reseña):
# Tokenizar la reseña de entrada
tokens = tokenizer.encode_plus(reseña, add_special_tokens=True, max_length=128,
pad_to_max_length=True, return_tensors='pt')
# Ejecutar el modelo para obtener las predicciones
with torch.no_grad():
outputs = model(tokens['input_ids'], attention_mask=tokens['attention_mask'])
# Obtener la etiqueta con el valor predicho máximo
_, etiqueta_predicha = torch.max(outputs[0], dim=1)
# Definir un diccionario para asignar etiquetas numéricas a etiquetas de texto
diccionario_etiquetas = {0: "Muy Negativo", 1: "Negativo", 2: "Neutral", 3: "Positivo",
4: "Muy Positivo"}
# Devolver la etiqueta predicha
return diccionario_etiquetas[etiqueta_predicha.item()]
# Muestra de reseña
muestra_reseña = "El vuelo fue increíble y el personal fue muy amable."
# Predecir el sentimiento de la muestra de reseña
sentimiento_muestra = predecir_sentimiento(muestra_reseña)
# Imprimir el sentimiento predicho
print(f"Sentimiento Predicho: {sentimiento_muestra}")
''' Este fragmento de código define una función para predecir el sentimiento de una
reseña dada y demuestra su uso en una muestra de reseña.
'''
- SALIDA: Sentimiento Predicho: Muy Positivo
Transfer Learning en NLP
El procesamiento del lenguaje natural (NLP) ha experimentado una revolución gracias al aprendizaje por transferencia, que permite a los modelos utilizar conocimientos previos de una tarea y aplicarlos a tareas nuevas y relacionadas. Los investigadores y desarrolladores ahora pueden ajustar modelos pre-entrenados para tareas específicas, como el análisis de sentimientos o el reconocimiento de entidades nombradas, en lugar de entrenar modelos desde cero, lo cual a menudo requiere enormes cantidades de datos y recursos computacionales. Entrenados frecuentemente en vastos corpus como la totalidad de Wikipedia, estos modelos pre-entrenados capturan patrones y relaciones lingüísticas complejas. El aprendizaje por transferencia permite que las aplicaciones de NLP funcionen más rápidamente, con menos datos necesarios y con frecuencia con un rendimiento de vanguardia, democratizando el acceso a modelos de lenguaje superiores para una gama más amplia de usuarios y tareas.
Conclusión
La fusión de métodos lingüísticos convencionales y técnicas de DL contemporáneas ha dado lugar a un período de avances sin precedentes en el campo de NLP en rápido desarrollo. Constantemente superamos los límites de lo que las máquinas pueden entender y procesar en lenguaje humano. Desde utilizar embeddings para comprender sutilezas de contexto hasta aprovechar el poder de arquitecturas basadas en Transformers como BERT y T5. En particular, el aprendizaje por transferencia ha facilitado el uso de modelos de alto rendimiento, reduciendo las barreras de entrada y fomentando la innovación. A medida que se plantean los temas, queda claro que la interacción continua entre la capacidad lingüística humana y el poder computacional de las máquinas promete un tiempo en el que las máquinas no solo comprenderán, sino que también podrán relacionarse con las sutilezas del lenguaje humano.
Puntos clave
- Los embeddings contextuales permiten que los modelos de NLP comprendan las palabras en relación a su contexto.
- La arquitectura Transformer ha avanzado significativamente las capacidades de las tareas de NLP.
- El aprendizaje por transferencia mejora el rendimiento del modelo sin necesidad de un entrenamiento extenso.
- Las técnicas de aprendizaje profundo, especialmente con modelos basados en Transformers, proporcionan ideas matizadas sobre los datos textuales.
Preguntas frecuentes
Los medios mostrados en este artículo no son propiedad de Analytics Vidhya y se utilizan a discreción del autor.
We will continue to update Zepes; if you have any questions or suggestions, please contact us!
Was this article helpful?
93 out of 132 found this helpful
Related articles
- Python en Excel Abriendo la puerta al análisis avanzado de datos
- Cómo StackOverflow se está adaptando frente a la IA generativa
- HubSpot presenta HubSpot AI y el nuevo Sales Hub en INBOUND 2023
- Aumentar la eficiencia matemática Navegando por las operaciones de matrices Numpy
- ¿Puede la IA realmente restaurar detalles faciales de imágenes de baja calidad? Conozca DAEFR un marco de doble rama para mejorar la calidad
- Este artículo de IA propone un método de generación de memoria recursivo para mejorar la consistencia conversacional a largo plazo en modelos de lenguaje grandes
- ¿Se entienden Do Flamingo y DALL-E? Explorando la simbiosis entre los modelos de generación de subtítulos de imágenes y síntesis de texto a imagen