Capítulo 13: Proyecto: Panel de Análisis de Sentimientos
13.2 Recopilación y Preprocesamiento de Datos
La recopilación y el preprocesamiento de datos son pasos cruciales en la construcción de un panel de análisis de sentimientos. La calidad de los datos recopilados y cómo se procesan impactan directamente en el rendimiento y la fiabilidad del modelo de análisis de sentimientos. En esta sección, discutiremos cómo recopilar datos textuales de varias fuentes y preprocesarlos para hacerlos adecuados para el análisis de sentimientos.
13.2.1 Recopilación de Datos
Para realizar un análisis de sentimientos, necesitamos un conjunto de datos que consista en muestras de texto con sentimientos etiquetados (positivo, negativo o neutral). Hay varias fuentes donde podemos recopilar dichos datos:
- Conjuntos de Datos Públicos: Hay muchos conjuntos de datos disponibles públicamente para el análisis de sentimientos. Algunos populares incluyen el conjunto de datos de Reseñas de Películas de IMDB, el conjunto de datos Twitter Sentiment140 y el conjunto de datos de Reseñas de Yelp.
- Datos Generados por Usuarios: Permitir a los usuarios subir sus propios datos textuales para el análisis de sentimientos. Esto podría incluir reseñas de clientes, publicaciones en redes sociales, respuestas de encuestas, etc.
Ejemplo: Usando el Conjunto de Datos de Reseñas de Películas de IMDB
Para este proyecto, utilizaremos el conjunto de datos de Reseñas de Películas de IMDB, que contiene 50,000 reseñas de películas etiquetadas como positivas o negativas. Puedes descargar el conjunto de datos desde Kaggle.
Descargar y Cargar el Conjunto de Datos
Descarguemos el conjunto de datos y carguémoslo en nuestro proyecto.
data_preprocessing.py:
import pandas as pd
from sklearn.model_selection import train_test_split
# Load the IMDB Movie Reviews dataset
data = pd.read_csv('data/raw_data/IMDB_Dataset.csv')
# Display the first few rows of the dataset
print(data.head())
# Split the dataset into training and test sets
train_data, test_data = train_test_split(data, test_size=0.2, random_state=42)
# Save the training and test sets
train_data.to_csv('data/processed_data/train_data.csv', index=False)
test_data.to_csv('data/processed_data/test_data.csv', index=False)
En este script, cargamos el conjunto de datos de Reseñas de Películas de IMDB, mostramos las primeras filas para entender su estructura y lo dividimos en conjuntos de entrenamiento y prueba. El conjunto de entrenamiento se utilizará para entrenar el modelo de análisis de sentimientos, mientras que el conjunto de prueba se utilizará para evaluar su rendimiento.
13.2.2 Preprocesamiento de Datos
El preprocesamiento es esencial para convertir datos textuales sin procesar en un formato adecuado para entrenar modelos de aprendizaje automático. La canalización de preprocesamiento incluye normalización de texto, tokenización, eliminación de palabras vacías, lematización y vectorización.
Normalización de Texto y Tokenización
La normalización de texto implica convertir el texto a minúsculas y eliminar la puntuación. La tokenización es el proceso de dividir el texto en palabras o tokens individuales.
Eliminación de Palabras Vacías
Las palabras vacías son palabras comunes que no contribuyen significativamente al significado del texto. Eliminarlas ayuda a centrarse en las palabras importantes.
Lematización
La lematización reduce las palabras a su forma base o raíz, asegurando que las diferentes formas de una palabra se traten como la misma.
Vectorización
La vectorización convierte el texto en representaciones numéricas, que se utilizan como entrada para los modelos de aprendizaje automático. Usaremos el vectorizador TF-IDF para este propósito.
Implementación del Preprocesamiento
Implementemos los pasos de preprocesamiento en Python.
data_preprocessing.py (continuación):
import nltk
from nltk.corpus import stopwords
from nltk.stem import WordNetLemmatizer
from sklearn.feature_extraction.text import TfidfVectorizer
import string
import pickle
# Download NLTK resources
nltk.download('punkt')
nltk.download('stopwords')
nltk.download('wordnet')
# Initialize lemmatizer
lemmatizer = WordNetLemmatizer()
# Define preprocessing function
def preprocess_text(text):
# Convert text to lowercase
text = text.lower()
# Tokenize text
tokens = nltk.word_tokenize(text)
# Remove punctuation and stop words
tokens = [word for word in tokens if word not in string.punctuation and word not in stopwords.words('english')]
# Lemmatize tokens
tokens = [lemmatizer.lemmatize(word) for word in tokens]
return ' '.join(tokens)
# Apply preprocessing to training and test sets
train_data['review'] = train_data['review'].apply(preprocess_text)
test_data['review'] = test_data['review'].apply(preprocess_text)
# Save preprocessed data
train_data.to_csv('data/processed_data/train_data_preprocessed.csv', index=False)
test_data.to_csv('data/processed_data/test_data_preprocessed.csv', index=False)
# Vectorize the preprocessed text
vectorizer = TfidfVectorizer(max_features=5000)
X_train = vectorizer.fit_transform(train_data['review']).toarray()
X_test = vectorizer.transform(test_data['review']).toarray()
# Save the vectorizer and vectorized data
with open('models/vectorizer.pickle', 'wb') as file:
pickle.dump(vectorizer, file)
with open('data/processed_data/X_train.pickle', 'wb') as file:
pickle.dump(X_train, file)
with open('data/processed_data/X_test.pickle', 'wb') as file:
pickle.dump(X_test, file)
En este script, definimos una función de preprocesamiento que normaliza, tokeniza, elimina las palabras vacías y lematiza el texto. Aplicamos esta función a los conjuntos de entrenamiento y prueba, luego vectorizamos el texto preprocesado utilizando el vectorizador TF-IDF. Los datos vectorizados y el vectorizador se guardan para su uso futuro.
13.2.3 Manejo de Datos Desbalanceados
En los conjuntos de datos del mundo real, la distribución de las etiquetas de sentimiento puede estar desbalanceada, lo que significa que hay más instancias de un sentimiento (por ejemplo, positivo) que de otro (por ejemplo, negativo). Manejar datos desbalanceados es crucial para entrenar un modelo de análisis de sentimientos robusto.
Ejemplo: Manejo de Datos Desbalanceados usando SMOTE
Podemos usar la Técnica de Sobremuestreo de Minorías Sintéticas (SMOTE) para balancear el conjunto de datos generando muestras sintéticas para la clase minoritaria.
data_preprocessing.py (continuación):
from imblearn.over_sampling import SMOTE
# Load preprocessed data
train_data = pd.read_csv('data/processed_data/train_data_preprocessed.csv')
test_data = pd.read_csv('data/processed_data/test_data_preprocessed.csv')
# Extract features and labels
X_train = train_data['review']
y_train = train_data['sentiment']
X_test = test_data['review']
y_test = test_data['sentiment']
# Vectorize the preprocessed text
X_train_vectorized = vectorizer.fit_transform(X_train).toarray()
X_test_vectorized = vectorizer.transform(X_test).toarray()
# Balance the dataset using SMOTE
smote = SMOTE(random_state=42)
X_train_balanced, y_train_balanced = smote.fit_resample(X_train_vectorized, y_train)
# Save the balanced data
with open('data/processed_data/X_train_balanced.pickle', 'wb') as file:
pickle.dump(X_train_balanced, file)
with open('data/processed_data/y_train_balanced.pickle', 'wb') as file:
pickle.dump(y_train_balanced, file)
En este script, utilizamos SMOTE para equilibrar el conjunto de datos de entrenamiento generando muestras sintéticas para la clase minoritaria. El conjunto de datos equilibrado se guarda para su uso futuro.
Hasta este punto, cubrimos los pasos esenciales de recopilación y preprocesamiento de datos para construir un panel de análisis de sentimientos. Discutimos cómo recopilar datos textuales de varias fuentes, utilizando el conjunto de datos de Reseñas de Películas de IMDB como ejemplo.
Implementamos una canalización de preprocesamiento integral que incluye normalización de texto, tokenización, eliminación de palabras vacías, lematización y vectorización. Además, abordamos el manejo de datos desbalanceados utilizando SMOTE para asegurar que nuestro modelo de análisis de sentimientos se entrene en un conjunto de datos equilibrado.
Estos pasos aseguran que los datos textuales estén limpios, equilibrados y sean adecuados para entrenar un modelo de análisis de sentimientos.
13.2 Recopilación y Preprocesamiento de Datos
La recopilación y el preprocesamiento de datos son pasos cruciales en la construcción de un panel de análisis de sentimientos. La calidad de los datos recopilados y cómo se procesan impactan directamente en el rendimiento y la fiabilidad del modelo de análisis de sentimientos. En esta sección, discutiremos cómo recopilar datos textuales de varias fuentes y preprocesarlos para hacerlos adecuados para el análisis de sentimientos.
13.2.1 Recopilación de Datos
Para realizar un análisis de sentimientos, necesitamos un conjunto de datos que consista en muestras de texto con sentimientos etiquetados (positivo, negativo o neutral). Hay varias fuentes donde podemos recopilar dichos datos:
- Conjuntos de Datos Públicos: Hay muchos conjuntos de datos disponibles públicamente para el análisis de sentimientos. Algunos populares incluyen el conjunto de datos de Reseñas de Películas de IMDB, el conjunto de datos Twitter Sentiment140 y el conjunto de datos de Reseñas de Yelp.
- Datos Generados por Usuarios: Permitir a los usuarios subir sus propios datos textuales para el análisis de sentimientos. Esto podría incluir reseñas de clientes, publicaciones en redes sociales, respuestas de encuestas, etc.
Ejemplo: Usando el Conjunto de Datos de Reseñas de Películas de IMDB
Para este proyecto, utilizaremos el conjunto de datos de Reseñas de Películas de IMDB, que contiene 50,000 reseñas de películas etiquetadas como positivas o negativas. Puedes descargar el conjunto de datos desde Kaggle.
Descargar y Cargar el Conjunto de Datos
Descarguemos el conjunto de datos y carguémoslo en nuestro proyecto.
data_preprocessing.py:
import pandas as pd
from sklearn.model_selection import train_test_split
# Load the IMDB Movie Reviews dataset
data = pd.read_csv('data/raw_data/IMDB_Dataset.csv')
# Display the first few rows of the dataset
print(data.head())
# Split the dataset into training and test sets
train_data, test_data = train_test_split(data, test_size=0.2, random_state=42)
# Save the training and test sets
train_data.to_csv('data/processed_data/train_data.csv', index=False)
test_data.to_csv('data/processed_data/test_data.csv', index=False)
En este script, cargamos el conjunto de datos de Reseñas de Películas de IMDB, mostramos las primeras filas para entender su estructura y lo dividimos en conjuntos de entrenamiento y prueba. El conjunto de entrenamiento se utilizará para entrenar el modelo de análisis de sentimientos, mientras que el conjunto de prueba se utilizará para evaluar su rendimiento.
13.2.2 Preprocesamiento de Datos
El preprocesamiento es esencial para convertir datos textuales sin procesar en un formato adecuado para entrenar modelos de aprendizaje automático. La canalización de preprocesamiento incluye normalización de texto, tokenización, eliminación de palabras vacías, lematización y vectorización.
Normalización de Texto y Tokenización
La normalización de texto implica convertir el texto a minúsculas y eliminar la puntuación. La tokenización es el proceso de dividir el texto en palabras o tokens individuales.
Eliminación de Palabras Vacías
Las palabras vacías son palabras comunes que no contribuyen significativamente al significado del texto. Eliminarlas ayuda a centrarse en las palabras importantes.
Lematización
La lematización reduce las palabras a su forma base o raíz, asegurando que las diferentes formas de una palabra se traten como la misma.
Vectorización
La vectorización convierte el texto en representaciones numéricas, que se utilizan como entrada para los modelos de aprendizaje automático. Usaremos el vectorizador TF-IDF para este propósito.
Implementación del Preprocesamiento
Implementemos los pasos de preprocesamiento en Python.
data_preprocessing.py (continuación):
import nltk
from nltk.corpus import stopwords
from nltk.stem import WordNetLemmatizer
from sklearn.feature_extraction.text import TfidfVectorizer
import string
import pickle
# Download NLTK resources
nltk.download('punkt')
nltk.download('stopwords')
nltk.download('wordnet')
# Initialize lemmatizer
lemmatizer = WordNetLemmatizer()
# Define preprocessing function
def preprocess_text(text):
# Convert text to lowercase
text = text.lower()
# Tokenize text
tokens = nltk.word_tokenize(text)
# Remove punctuation and stop words
tokens = [word for word in tokens if word not in string.punctuation and word not in stopwords.words('english')]
# Lemmatize tokens
tokens = [lemmatizer.lemmatize(word) for word in tokens]
return ' '.join(tokens)
# Apply preprocessing to training and test sets
train_data['review'] = train_data['review'].apply(preprocess_text)
test_data['review'] = test_data['review'].apply(preprocess_text)
# Save preprocessed data
train_data.to_csv('data/processed_data/train_data_preprocessed.csv', index=False)
test_data.to_csv('data/processed_data/test_data_preprocessed.csv', index=False)
# Vectorize the preprocessed text
vectorizer = TfidfVectorizer(max_features=5000)
X_train = vectorizer.fit_transform(train_data['review']).toarray()
X_test = vectorizer.transform(test_data['review']).toarray()
# Save the vectorizer and vectorized data
with open('models/vectorizer.pickle', 'wb') as file:
pickle.dump(vectorizer, file)
with open('data/processed_data/X_train.pickle', 'wb') as file:
pickle.dump(X_train, file)
with open('data/processed_data/X_test.pickle', 'wb') as file:
pickle.dump(X_test, file)
En este script, definimos una función de preprocesamiento que normaliza, tokeniza, elimina las palabras vacías y lematiza el texto. Aplicamos esta función a los conjuntos de entrenamiento y prueba, luego vectorizamos el texto preprocesado utilizando el vectorizador TF-IDF. Los datos vectorizados y el vectorizador se guardan para su uso futuro.
13.2.3 Manejo de Datos Desbalanceados
En los conjuntos de datos del mundo real, la distribución de las etiquetas de sentimiento puede estar desbalanceada, lo que significa que hay más instancias de un sentimiento (por ejemplo, positivo) que de otro (por ejemplo, negativo). Manejar datos desbalanceados es crucial para entrenar un modelo de análisis de sentimientos robusto.
Ejemplo: Manejo de Datos Desbalanceados usando SMOTE
Podemos usar la Técnica de Sobremuestreo de Minorías Sintéticas (SMOTE) para balancear el conjunto de datos generando muestras sintéticas para la clase minoritaria.
data_preprocessing.py (continuación):
from imblearn.over_sampling import SMOTE
# Load preprocessed data
train_data = pd.read_csv('data/processed_data/train_data_preprocessed.csv')
test_data = pd.read_csv('data/processed_data/test_data_preprocessed.csv')
# Extract features and labels
X_train = train_data['review']
y_train = train_data['sentiment']
X_test = test_data['review']
y_test = test_data['sentiment']
# Vectorize the preprocessed text
X_train_vectorized = vectorizer.fit_transform(X_train).toarray()
X_test_vectorized = vectorizer.transform(X_test).toarray()
# Balance the dataset using SMOTE
smote = SMOTE(random_state=42)
X_train_balanced, y_train_balanced = smote.fit_resample(X_train_vectorized, y_train)
# Save the balanced data
with open('data/processed_data/X_train_balanced.pickle', 'wb') as file:
pickle.dump(X_train_balanced, file)
with open('data/processed_data/y_train_balanced.pickle', 'wb') as file:
pickle.dump(y_train_balanced, file)
En este script, utilizamos SMOTE para equilibrar el conjunto de datos de entrenamiento generando muestras sintéticas para la clase minoritaria. El conjunto de datos equilibrado se guarda para su uso futuro.
Hasta este punto, cubrimos los pasos esenciales de recopilación y preprocesamiento de datos para construir un panel de análisis de sentimientos. Discutimos cómo recopilar datos textuales de varias fuentes, utilizando el conjunto de datos de Reseñas de Películas de IMDB como ejemplo.
Implementamos una canalización de preprocesamiento integral que incluye normalización de texto, tokenización, eliminación de palabras vacías, lematización y vectorización. Además, abordamos el manejo de datos desbalanceados utilizando SMOTE para asegurar que nuestro modelo de análisis de sentimientos se entrene en un conjunto de datos equilibrado.
Estos pasos aseguran que los datos textuales estén limpios, equilibrados y sean adecuados para entrenar un modelo de análisis de sentimientos.
13.2 Recopilación y Preprocesamiento de Datos
La recopilación y el preprocesamiento de datos son pasos cruciales en la construcción de un panel de análisis de sentimientos. La calidad de los datos recopilados y cómo se procesan impactan directamente en el rendimiento y la fiabilidad del modelo de análisis de sentimientos. En esta sección, discutiremos cómo recopilar datos textuales de varias fuentes y preprocesarlos para hacerlos adecuados para el análisis de sentimientos.
13.2.1 Recopilación de Datos
Para realizar un análisis de sentimientos, necesitamos un conjunto de datos que consista en muestras de texto con sentimientos etiquetados (positivo, negativo o neutral). Hay varias fuentes donde podemos recopilar dichos datos:
- Conjuntos de Datos Públicos: Hay muchos conjuntos de datos disponibles públicamente para el análisis de sentimientos. Algunos populares incluyen el conjunto de datos de Reseñas de Películas de IMDB, el conjunto de datos Twitter Sentiment140 y el conjunto de datos de Reseñas de Yelp.
- Datos Generados por Usuarios: Permitir a los usuarios subir sus propios datos textuales para el análisis de sentimientos. Esto podría incluir reseñas de clientes, publicaciones en redes sociales, respuestas de encuestas, etc.
Ejemplo: Usando el Conjunto de Datos de Reseñas de Películas de IMDB
Para este proyecto, utilizaremos el conjunto de datos de Reseñas de Películas de IMDB, que contiene 50,000 reseñas de películas etiquetadas como positivas o negativas. Puedes descargar el conjunto de datos desde Kaggle.
Descargar y Cargar el Conjunto de Datos
Descarguemos el conjunto de datos y carguémoslo en nuestro proyecto.
data_preprocessing.py:
import pandas as pd
from sklearn.model_selection import train_test_split
# Load the IMDB Movie Reviews dataset
data = pd.read_csv('data/raw_data/IMDB_Dataset.csv')
# Display the first few rows of the dataset
print(data.head())
# Split the dataset into training and test sets
train_data, test_data = train_test_split(data, test_size=0.2, random_state=42)
# Save the training and test sets
train_data.to_csv('data/processed_data/train_data.csv', index=False)
test_data.to_csv('data/processed_data/test_data.csv', index=False)
En este script, cargamos el conjunto de datos de Reseñas de Películas de IMDB, mostramos las primeras filas para entender su estructura y lo dividimos en conjuntos de entrenamiento y prueba. El conjunto de entrenamiento se utilizará para entrenar el modelo de análisis de sentimientos, mientras que el conjunto de prueba se utilizará para evaluar su rendimiento.
13.2.2 Preprocesamiento de Datos
El preprocesamiento es esencial para convertir datos textuales sin procesar en un formato adecuado para entrenar modelos de aprendizaje automático. La canalización de preprocesamiento incluye normalización de texto, tokenización, eliminación de palabras vacías, lematización y vectorización.
Normalización de Texto y Tokenización
La normalización de texto implica convertir el texto a minúsculas y eliminar la puntuación. La tokenización es el proceso de dividir el texto en palabras o tokens individuales.
Eliminación de Palabras Vacías
Las palabras vacías son palabras comunes que no contribuyen significativamente al significado del texto. Eliminarlas ayuda a centrarse en las palabras importantes.
Lematización
La lematización reduce las palabras a su forma base o raíz, asegurando que las diferentes formas de una palabra se traten como la misma.
Vectorización
La vectorización convierte el texto en representaciones numéricas, que se utilizan como entrada para los modelos de aprendizaje automático. Usaremos el vectorizador TF-IDF para este propósito.
Implementación del Preprocesamiento
Implementemos los pasos de preprocesamiento en Python.
data_preprocessing.py (continuación):
import nltk
from nltk.corpus import stopwords
from nltk.stem import WordNetLemmatizer
from sklearn.feature_extraction.text import TfidfVectorizer
import string
import pickle
# Download NLTK resources
nltk.download('punkt')
nltk.download('stopwords')
nltk.download('wordnet')
# Initialize lemmatizer
lemmatizer = WordNetLemmatizer()
# Define preprocessing function
def preprocess_text(text):
# Convert text to lowercase
text = text.lower()
# Tokenize text
tokens = nltk.word_tokenize(text)
# Remove punctuation and stop words
tokens = [word for word in tokens if word not in string.punctuation and word not in stopwords.words('english')]
# Lemmatize tokens
tokens = [lemmatizer.lemmatize(word) for word in tokens]
return ' '.join(tokens)
# Apply preprocessing to training and test sets
train_data['review'] = train_data['review'].apply(preprocess_text)
test_data['review'] = test_data['review'].apply(preprocess_text)
# Save preprocessed data
train_data.to_csv('data/processed_data/train_data_preprocessed.csv', index=False)
test_data.to_csv('data/processed_data/test_data_preprocessed.csv', index=False)
# Vectorize the preprocessed text
vectorizer = TfidfVectorizer(max_features=5000)
X_train = vectorizer.fit_transform(train_data['review']).toarray()
X_test = vectorizer.transform(test_data['review']).toarray()
# Save the vectorizer and vectorized data
with open('models/vectorizer.pickle', 'wb') as file:
pickle.dump(vectorizer, file)
with open('data/processed_data/X_train.pickle', 'wb') as file:
pickle.dump(X_train, file)
with open('data/processed_data/X_test.pickle', 'wb') as file:
pickle.dump(X_test, file)
En este script, definimos una función de preprocesamiento que normaliza, tokeniza, elimina las palabras vacías y lematiza el texto. Aplicamos esta función a los conjuntos de entrenamiento y prueba, luego vectorizamos el texto preprocesado utilizando el vectorizador TF-IDF. Los datos vectorizados y el vectorizador se guardan para su uso futuro.
13.2.3 Manejo de Datos Desbalanceados
En los conjuntos de datos del mundo real, la distribución de las etiquetas de sentimiento puede estar desbalanceada, lo que significa que hay más instancias de un sentimiento (por ejemplo, positivo) que de otro (por ejemplo, negativo). Manejar datos desbalanceados es crucial para entrenar un modelo de análisis de sentimientos robusto.
Ejemplo: Manejo de Datos Desbalanceados usando SMOTE
Podemos usar la Técnica de Sobremuestreo de Minorías Sintéticas (SMOTE) para balancear el conjunto de datos generando muestras sintéticas para la clase minoritaria.
data_preprocessing.py (continuación):
from imblearn.over_sampling import SMOTE
# Load preprocessed data
train_data = pd.read_csv('data/processed_data/train_data_preprocessed.csv')
test_data = pd.read_csv('data/processed_data/test_data_preprocessed.csv')
# Extract features and labels
X_train = train_data['review']
y_train = train_data['sentiment']
X_test = test_data['review']
y_test = test_data['sentiment']
# Vectorize the preprocessed text
X_train_vectorized = vectorizer.fit_transform(X_train).toarray()
X_test_vectorized = vectorizer.transform(X_test).toarray()
# Balance the dataset using SMOTE
smote = SMOTE(random_state=42)
X_train_balanced, y_train_balanced = smote.fit_resample(X_train_vectorized, y_train)
# Save the balanced data
with open('data/processed_data/X_train_balanced.pickle', 'wb') as file:
pickle.dump(X_train_balanced, file)
with open('data/processed_data/y_train_balanced.pickle', 'wb') as file:
pickle.dump(y_train_balanced, file)
En este script, utilizamos SMOTE para equilibrar el conjunto de datos de entrenamiento generando muestras sintéticas para la clase minoritaria. El conjunto de datos equilibrado se guarda para su uso futuro.
Hasta este punto, cubrimos los pasos esenciales de recopilación y preprocesamiento de datos para construir un panel de análisis de sentimientos. Discutimos cómo recopilar datos textuales de varias fuentes, utilizando el conjunto de datos de Reseñas de Películas de IMDB como ejemplo.
Implementamos una canalización de preprocesamiento integral que incluye normalización de texto, tokenización, eliminación de palabras vacías, lematización y vectorización. Además, abordamos el manejo de datos desbalanceados utilizando SMOTE para asegurar que nuestro modelo de análisis de sentimientos se entrene en un conjunto de datos equilibrado.
Estos pasos aseguran que los datos textuales estén limpios, equilibrados y sean adecuados para entrenar un modelo de análisis de sentimientos.
13.2 Recopilación y Preprocesamiento de Datos
La recopilación y el preprocesamiento de datos son pasos cruciales en la construcción de un panel de análisis de sentimientos. La calidad de los datos recopilados y cómo se procesan impactan directamente en el rendimiento y la fiabilidad del modelo de análisis de sentimientos. En esta sección, discutiremos cómo recopilar datos textuales de varias fuentes y preprocesarlos para hacerlos adecuados para el análisis de sentimientos.
13.2.1 Recopilación de Datos
Para realizar un análisis de sentimientos, necesitamos un conjunto de datos que consista en muestras de texto con sentimientos etiquetados (positivo, negativo o neutral). Hay varias fuentes donde podemos recopilar dichos datos:
- Conjuntos de Datos Públicos: Hay muchos conjuntos de datos disponibles públicamente para el análisis de sentimientos. Algunos populares incluyen el conjunto de datos de Reseñas de Películas de IMDB, el conjunto de datos Twitter Sentiment140 y el conjunto de datos de Reseñas de Yelp.
- Datos Generados por Usuarios: Permitir a los usuarios subir sus propios datos textuales para el análisis de sentimientos. Esto podría incluir reseñas de clientes, publicaciones en redes sociales, respuestas de encuestas, etc.
Ejemplo: Usando el Conjunto de Datos de Reseñas de Películas de IMDB
Para este proyecto, utilizaremos el conjunto de datos de Reseñas de Películas de IMDB, que contiene 50,000 reseñas de películas etiquetadas como positivas o negativas. Puedes descargar el conjunto de datos desde Kaggle.
Descargar y Cargar el Conjunto de Datos
Descarguemos el conjunto de datos y carguémoslo en nuestro proyecto.
data_preprocessing.py:
import pandas as pd
from sklearn.model_selection import train_test_split
# Load the IMDB Movie Reviews dataset
data = pd.read_csv('data/raw_data/IMDB_Dataset.csv')
# Display the first few rows of the dataset
print(data.head())
# Split the dataset into training and test sets
train_data, test_data = train_test_split(data, test_size=0.2, random_state=42)
# Save the training and test sets
train_data.to_csv('data/processed_data/train_data.csv', index=False)
test_data.to_csv('data/processed_data/test_data.csv', index=False)
En este script, cargamos el conjunto de datos de Reseñas de Películas de IMDB, mostramos las primeras filas para entender su estructura y lo dividimos en conjuntos de entrenamiento y prueba. El conjunto de entrenamiento se utilizará para entrenar el modelo de análisis de sentimientos, mientras que el conjunto de prueba se utilizará para evaluar su rendimiento.
13.2.2 Preprocesamiento de Datos
El preprocesamiento es esencial para convertir datos textuales sin procesar en un formato adecuado para entrenar modelos de aprendizaje automático. La canalización de preprocesamiento incluye normalización de texto, tokenización, eliminación de palabras vacías, lematización y vectorización.
Normalización de Texto y Tokenización
La normalización de texto implica convertir el texto a minúsculas y eliminar la puntuación. La tokenización es el proceso de dividir el texto en palabras o tokens individuales.
Eliminación de Palabras Vacías
Las palabras vacías son palabras comunes que no contribuyen significativamente al significado del texto. Eliminarlas ayuda a centrarse en las palabras importantes.
Lematización
La lematización reduce las palabras a su forma base o raíz, asegurando que las diferentes formas de una palabra se traten como la misma.
Vectorización
La vectorización convierte el texto en representaciones numéricas, que se utilizan como entrada para los modelos de aprendizaje automático. Usaremos el vectorizador TF-IDF para este propósito.
Implementación del Preprocesamiento
Implementemos los pasos de preprocesamiento en Python.
data_preprocessing.py (continuación):
import nltk
from nltk.corpus import stopwords
from nltk.stem import WordNetLemmatizer
from sklearn.feature_extraction.text import TfidfVectorizer
import string
import pickle
# Download NLTK resources
nltk.download('punkt')
nltk.download('stopwords')
nltk.download('wordnet')
# Initialize lemmatizer
lemmatizer = WordNetLemmatizer()
# Define preprocessing function
def preprocess_text(text):
# Convert text to lowercase
text = text.lower()
# Tokenize text
tokens = nltk.word_tokenize(text)
# Remove punctuation and stop words
tokens = [word for word in tokens if word not in string.punctuation and word not in stopwords.words('english')]
# Lemmatize tokens
tokens = [lemmatizer.lemmatize(word) for word in tokens]
return ' '.join(tokens)
# Apply preprocessing to training and test sets
train_data['review'] = train_data['review'].apply(preprocess_text)
test_data['review'] = test_data['review'].apply(preprocess_text)
# Save preprocessed data
train_data.to_csv('data/processed_data/train_data_preprocessed.csv', index=False)
test_data.to_csv('data/processed_data/test_data_preprocessed.csv', index=False)
# Vectorize the preprocessed text
vectorizer = TfidfVectorizer(max_features=5000)
X_train = vectorizer.fit_transform(train_data['review']).toarray()
X_test = vectorizer.transform(test_data['review']).toarray()
# Save the vectorizer and vectorized data
with open('models/vectorizer.pickle', 'wb') as file:
pickle.dump(vectorizer, file)
with open('data/processed_data/X_train.pickle', 'wb') as file:
pickle.dump(X_train, file)
with open('data/processed_data/X_test.pickle', 'wb') as file:
pickle.dump(X_test, file)
En este script, definimos una función de preprocesamiento que normaliza, tokeniza, elimina las palabras vacías y lematiza el texto. Aplicamos esta función a los conjuntos de entrenamiento y prueba, luego vectorizamos el texto preprocesado utilizando el vectorizador TF-IDF. Los datos vectorizados y el vectorizador se guardan para su uso futuro.
13.2.3 Manejo de Datos Desbalanceados
En los conjuntos de datos del mundo real, la distribución de las etiquetas de sentimiento puede estar desbalanceada, lo que significa que hay más instancias de un sentimiento (por ejemplo, positivo) que de otro (por ejemplo, negativo). Manejar datos desbalanceados es crucial para entrenar un modelo de análisis de sentimientos robusto.
Ejemplo: Manejo de Datos Desbalanceados usando SMOTE
Podemos usar la Técnica de Sobremuestreo de Minorías Sintéticas (SMOTE) para balancear el conjunto de datos generando muestras sintéticas para la clase minoritaria.
data_preprocessing.py (continuación):
from imblearn.over_sampling import SMOTE
# Load preprocessed data
train_data = pd.read_csv('data/processed_data/train_data_preprocessed.csv')
test_data = pd.read_csv('data/processed_data/test_data_preprocessed.csv')
# Extract features and labels
X_train = train_data['review']
y_train = train_data['sentiment']
X_test = test_data['review']
y_test = test_data['sentiment']
# Vectorize the preprocessed text
X_train_vectorized = vectorizer.fit_transform(X_train).toarray()
X_test_vectorized = vectorizer.transform(X_test).toarray()
# Balance the dataset using SMOTE
smote = SMOTE(random_state=42)
X_train_balanced, y_train_balanced = smote.fit_resample(X_train_vectorized, y_train)
# Save the balanced data
with open('data/processed_data/X_train_balanced.pickle', 'wb') as file:
pickle.dump(X_train_balanced, file)
with open('data/processed_data/y_train_balanced.pickle', 'wb') as file:
pickle.dump(y_train_balanced, file)
En este script, utilizamos SMOTE para equilibrar el conjunto de datos de entrenamiento generando muestras sintéticas para la clase minoritaria. El conjunto de datos equilibrado se guarda para su uso futuro.
Hasta este punto, cubrimos los pasos esenciales de recopilación y preprocesamiento de datos para construir un panel de análisis de sentimientos. Discutimos cómo recopilar datos textuales de varias fuentes, utilizando el conjunto de datos de Reseñas de Películas de IMDB como ejemplo.
Implementamos una canalización de preprocesamiento integral que incluye normalización de texto, tokenización, eliminación de palabras vacías, lematización y vectorización. Además, abordamos el manejo de datos desbalanceados utilizando SMOTE para asegurar que nuestro modelo de análisis de sentimientos se entrene en un conjunto de datos equilibrado.
Estos pasos aseguran que los datos textuales estén limpios, equilibrados y sean adecuados para entrenar un modelo de análisis de sentimientos.