Logo de CursoIA
CursoIA Curso de Inteligencia Artificial

NLP desde cero, Unidad 12 — Mini-proyecto de NLP clásico, 12.1 — Proyecto guiado ·

Preprocesado completo

Preprocesado completo

Introducción

El preprocesado es un paso crítico en cualquier proyecto de NLP. Es aquí donde transformamos los datos brutos y ambiguos del texto en una forma estructurada que las máquinas pueden entender. El buen preprocesamiento no solo mejora la precisión del modelo, sino que también puede ahorra tiempo en ajustes laterales. Este artículo te guiará a través de un proyecto guiado de preprocesado completo para NLP clásico.

Explicación principal

Supongamos que estamos trabajando con un conjunto de datos de reseñas de productos, y nuestro objetivo es clasificar las reseñas como positivas o negativas. Comenzaremos por importar los datos y ver cómo se encuentran en su estado original:

import pandas as pd

# Cargar el dataset
df = pd.read_csv('reviews.csv')

# Mostrar las primeras filas del dataframe para inspeccionarlo
print(df.head())

Errores típicos / trampas

  1. Falta de normalización: Los datos brutos pueden contener mayúsculas y minúsculas, acentos y otros caracteres especiales que podrían afectar el análisis. Para resolver esto, convertimos todo al mismo formato:
    df['review'] = df['review'].str.lower()
  1. Ambigüedad de emojis: Los emojis pueden tener significados diferentes en distintas culturas o contextos. Si no los eliminamos o reemplazamos adecuadamente, podrían confundir a nuestro modelo:
    import re

    def remove_emojis(text):
        emoji_pattern = re.compile("["
                                   u"\U0001F600-\U0001F64F"  # Emoticones
                                   u"\U0001F300-\U0001F5FF"  # Simbolos y íconos
                                   u"\U0001F680-\U0001F6FF"  # Transporte y medios de comunicación
                                   u"\U0001F1E0-\U0001F1FF"  # banderas (country code)
                                   "]+", flags=re.UNICODE)
        return emoji_pattern.sub(r'', text)

    df['review'] = df['review'].apply(remove_emojis)
  1. Preservación de URLs: Dependiendo del contexto, las URLs pueden ser útiles o no. Si se mantiene el texto sin procesar, podrían introducir ruido en nuestros modelos:
    def remove_urls(text):
        return re.sub(r'http\S+', '', text)

    df['review'] = df['review'].apply(remove_urls)

Checklist accionable

  1. Convertir a minúsculas: df['review'] = df['review'].str.lower()
  2. Eliminar emojis y caracteres especiales:
    def remove_emojis(text):
        emoji_pattern = re.compile("["
                                   u"\U0001F600-\U0001F64F"  # Emoticones
                                   u"\U0001F300-\U0001F5FF"  # Simbolos y íconos
                                   u"\U0001F680-\U0001F6FF"  # Transporte y medios de comunicación
                                   u"\U0001F1E0-\U0001F1FF"  # banderas (country code)
                                   "]+", flags=re.UNICODE)
        return emoji_pattern.sub(r'', text)

    df['review'] = df['review'].apply(remove_emojis)
  1. Eliminar URLs: def remove_urls(text): return re.sub(r'http\S+', '', text) df['review'] = df['review'].apply(remove_urls)
  2. Tokenización básica: Dividir el texto en palabras individuales.
  3. Remover stopwords y aplicar stemming o lemmatización:
    from nltk.corpus import stopwords
    from nltk.stem import PorterStemmer

    ps = PorterStemmer()
    stop_words = set(stopwords.words('english'))

    def clean_text(text):
        text = remove_urls(text)
        words = word_tokenize(text.lower())
        filtered_sentence = [w for w in words if not w in stop_words]
        return ' '.join(filtered_sentence)

    df['review'] = df['review'].apply(clean_text)
  1. Remover palabras cortas y numéricas:
    import string

    def remove_short_words_and_numbers(text):
        tokens = word_tokenize(text)
        filtered_tokens = [token for token in tokens if not token.isnumeric() and len(token) > 2]
        return ' '.join(filtered_tokens)

    df['review'] = df['review'].apply(remove_short_words_and_numbers)

Cierre

Siguientes pasos

  • Analizar las reseñas limpias: Utiliza df.head() para revisar el resultado.
  • Vectorización del texto: Convertir los textos en representaciones numéricas usando métodos como TF-IDF o modelos de bolsa de palabras.
  • Entrenamiento de clasificador: Utiliza técnicas como Naive Bayes, SVM, o Random Forest dependiendo de tu problema.
  • Evaluación inicial: Comprueba la precisión y otros métricas básicas para asegurarte de que el modelo está funcionando correctamente.

El preprocesado es una parte integral del análisis de texto. Cada paso aporta un valor significativo al dataset y ayuda a construir modelos más robustos y precisos.

Contacto

Indica tu objetivo (ChatGPT, RAG, agentes, automatización) y tu stack (web/backend).