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.

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.
'''
SALIDA

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.
'''
SALIDA

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!

Share:

Was this article helpful?

93 out of 132 found this helpful

Discover more

Inteligencia Artificial

Las Nuevas Implicaciones Éticas de la Inteligencia Artificial Generativa

El rápido progreso del IA generativa hace necesario implementar urgentemente salvaguardias éticas contra los riesgos ...

Inteligencia Artificial

EE. UU. y la UE completan el tan esperado acuerdo sobre el intercambio de datos

El acuerdo pone fin a la incertidumbre legal para Meta, Google y decenas de empresas, al menos por ahora.

Inteligencia Artificial

Más desarrolladores están utilizando el lenguaje Rust

La encuesta Estado de Rust 2022 publicada a principios de este mes encontró a más desarrolladores utilizando el lengu...

Inteligencia Artificial

Meet LLMWare Un marco de Inteligencia Artificial todo en uno para agilizar el desarrollo de aplicaciones basadas en LLM para aplicaciones de IA generativa

A pesar del gran interés en los Modelos de Lenguaje Grande LLM (por sus siglas en inglés) durante el último año, much...

Inteligencia Artificial

Esta investigación de IA propone SMPLer-X Un modelo de base generalista para captura de movimiento humano en 3D/4D a partir de entradas monoculares.

Los sectores de animación, videojuegos y moda pueden beneficiarse del campo de vanguardia de la estimación expresiva ...

Inteligencia Artificial

Investigadores de Google presentan 𝗦𝘆𝗻𝘁𝗵𝗜𝗗 una herramienta digital para marcar con marcas de agua e identificar imágenes generadas por IA

En el panorama en constante evolución de la inteligencia artificial (IA), los modelos generativos están creando imáge...