La librería de referencia el Python para realizar procesado del lenguaje natural (PLN) es NLTK (Natural Language Toolkit). Lo que se debe a que prácticamente incluye todas las herramientas necesarias para trabajar con PLN, entre las que se incluyen tokenización, lematización, etiquetado gramatical, análisis sintáctico y análisis de sentimientos. Facilitando de esta manera el trabajo de sus usuarios. Veamos cómo se puede implementar fácilmente el análisis de sentimientos con NLTK con la que es posible determinar la polaridad emocional de un texto (positivo, negativo o neutro).
Tabla de contenidos
La librería NLTK
NLTK es una librería de Python que se incluye por defecto en Anaconda. Por lo que, para aquellos que trabajan con esta distribución, ya la tienen instalada en el sistema. Si no es así, se puede agregar a cualquier instalación de Python mediante la ejecución del siguiente comando
pip install nltk
Lo descargará e instalará la última versión.
NLTK es una biblioteca muy versátil y útil para aquellos interesados en el procesado del lenguaje natural. Algunas de sus principales características son:
- Tokenización: proporciona métodos para dividir el texto en unidades más pequeñas llamadas “tokens”.
- Lematización y derivación: ofrece herramientas para realizar la lematización, la reducción de las palabras a su forma base (lemas), y también la derivación, la obtención de las raíces de las palabras.
- Etiquetado gramatical: incluye modelos y algoritmos para etiquetar las palabras con información gramatical, como partes del discurso (sustantivos, verbos, adjetivos, etc.) y categorías gramaticales.
- Análisis sintáctico: proporciona métodos para realizar el análisis sintáctico de oraciones y textos, lo que permite comprender las estructuras gramaticales y las relaciones entre las palabras.
- Modelos de lenguaje: incluye una variedad de modelos de lenguaje pre-entrenados que se pueden utilizar para tareas como análisis de sentimientos, clasificación de texto y generación de texto.
- Recursos lingüísticos: ofrece acceso a una amplia gama de recursos lingüísticos, como diccionarios, corpus etiquetados, listas de palabras comunes y stopwords en varios idiomas.
- Aprendizaje automático: proporciona una interfaz para entrenar y utilizar modelos de aprendizaje automático en tareas de PLN, como clasificación de texto, agrupación de temas y análisis de sentimientos.
Implementación de análisis de sentimientos con NLTK
Los pasos para realizar análisis de sentimientos con NLTK son relativamente sencillos, ya que la librería ofrece todos los recursos necesarios.
Primera ejecución de NLTK
En la instalación de NLTK no se incluyen los recursos necesarios para trabajar en PLN tales como las reglas de puntuación o las stowords. Por lo que la primera vez que se ejecute las funciones de librería se solicitará que se descarguen estos recursos. Afortunadamente esto es algo que se puede hacer fácilmente simplemente indicando a la función download()
de NLTK los recursos requeridos. Para realizar análisis de sentimientos con NLTK es necesario importar el siguiente código.
import nltk nltk.download('punkt') nltk.download('stopwords') nltk.download('wordnet') nltk.download('omw-1.4')
Preprocesamiento de datos
Antes de poder realizar el análisis de sentimiento con NLTK es necesario preprocesar los mensajes de texto para normalizar. Básicamente lo que se debe hacer es:
- Tokenización: dividir el texto en palabras o frases más pequeñas llamadas tokens.
- Eliminación de signos de puntuación y caracteres especiales.
- Conversión de texto a minúsculas para normalizar el texto.
- Eliminación de las stopwords o palabras irrelevantes para el mensaje tales como “a”, “el”, “y”, etc.
- Reducción de las palabras a su forma base (lemas).
Estos cuatro pasos se pueden implementar con funciones de NLTK, tal como se muestra en el siguiente ejemplo.
# Procesado de texto from nltk.corpus import stopwords from nltk.tokenize import word_tokenize from nltk.stem import WordNetLemmatizer import string text = "I love the content on the Analytics Lane blog, articles are fantastic." # Tokenización tokens = word_tokenize(text) # Eliminación de signos de puntuación tokens = [token for token in tokens if token not in string.punctuation] # Conversión a minúsculas tokens = [token.lower() for token in tokens] # Eliminación de stopwords stop_words = set(stopwords.words('english')) tokens = [token for token in tokens if token not in stop_words] # Lematización lemmatizer = WordNetLemmatizer() tokens = [lemmatizer.lemmatize(token) for token in tokens] # Reconstrucción del texto preprocesado preprocessed_text = ' '.join(tokens) preprocessed_text
'love content analytics lane blog article fantastic'
En primer lugar se debe tokenizar las frase mediante la función word_tokenize()
, lo que divide está en una lista de palabras y signos de puntuación. Posteriormente, mediante con herramientas estándar de Python, se eliminan los tokens que estén en la lista de signos de puntuación (string.punctuation
) y se convierten los todo el texto a minúsculas. Una vez homogeneizado el texto, se eliminan las stopwords que incluye NLTK. A la hora de importar las stopwords es necesario indicar el idioma con el que se está trabajando ya que estas son diferentes. Finalmente se lematiza los tokens para eliminar plurales y derivaciones.
El resultado de este proceso es el listado de palabras de la frase en su forma base.
Extracción de características
Una vez preprocesado el texto, es necesario extraer las características de este antes de poder entrenar un modelo. Siendo lo más habitual emplear la frecuencia de las palabras como características. Algo que en NLTK se implementa mediante la clase FreqDist
y se muestra en el siguiente código de ejemplo.
from nltk import FreqDist features = {} words = word_tokenize(preprocessed_text) word_freq = FreqDist(words) for word, freq in word_freq.items(): features[word] = freq features
{'love': 1, 'content': 1, 'analytics': 1, 'lane': 1, 'blog': 1, 'article': 1, 'fantastic': 1}
Lo que da como resultado un diccionario con la palabra clave y el valor es el número de ocurrencias.
Conjunto de datos de entrenamiento
Para entrenar un modelo es necesario contar con un conjunto de datos de entrenamiento, para eso se puede crear una lista de tuplas con el mensaje y la etiqueta que se desea entrenar. A modo de ejemplo se puede probar con un listado de siete mensajes como el siguiente.
training_data = [ ("I love the content on the Analytics Lane blog, articles are fantastic.", "positive"), ("The code does not work, it gave me an error when executing it.", "negative"), ("I love this product!", "positive"), ("This movie was terrible.", "negative"), ("The weather is nice today.", "positive"), ("I feel so sad about the news.", "negative"), ("It's just an average book.", "neutral") ]
Factorización del código
Antes de continuar se puede factorizar el código anterior para facilitar su uso a la hora de entrenar un modelo. Para lo que se pueden crear dos funciones: preprocess_text()
para el preprocesado de texto y extract_features()
para la extracción de características.
from nltk import FreqDist from nltk.corpus import stopwords from nltk.tokenize import word_tokenize from nltk.stem import WordNetLemmatizer import string def preprocess_text(text): """ Realiza el preprocesamiento básico de un texto en inglés utilizando NLTK. Args: text (str): El texto a ser preprocesado. Returns: str: El texto preprocesado. """ # Tokenización tokens = word_tokenize(text) # Eliminación de signos de puntuación tokens = [token for token in tokens if token not in string.punctuation] # Conversión a minúsculas tokens = [token.lower() for token in tokens] # Eliminación de stopwords stop_words = set(stopwords.words('english')) tokens = [token for token in tokens if token not in stop_words] # Lematización lemmatizer = WordNetLemmatizer() tokens = [lemmatizer.lemmatize(token) for token in tokens] # Reconstrucción del texto preprocesado preprocessed_text = ' '.join(tokens) return preprocessed_text def extract_features(text): """ Extrae las características del texto utilizando NLTK y devuelve un diccionario de características. Args: text (str): El texto del cual extraer características. Returns: dict: Un diccionario que representa las características extraídas del texto. """ features = {} words = word_tokenize(text) word_freq = FreqDist(words) for word, freq in word_freq.items(): features[word] = freq return features
Entrenamiento del modelo
El análisis de sentimientos con NLTK se puede realizar usando un clasificador basado en Naive Bayes. NLTK proporciona una clase en la que se implementa este tipo de clarificadores. Empleando esta clase y las funciones creadas en la sección anterior se puede entrenar un modelo con los datos de ejemplo en pocas líneas de código, tal como se puede ver a continuación.
from nltk.classify import NaiveBayesClassifier # Preprocesamiento de los datos de entrenamiento preprocessed_training_data = [(preprocess_text(text), label) for text, label in training_data] # Extracción de características de los datos de entrenamiento training_features = [(extract_features(text), label) for text, label in preprocessed_training_data] # Entrenamiento del clasificador Naive Bayes classifier = NaiveBayesClassifier.train(training_features)
Clasificación de nuevos textos
Una vez que el modelo está entrando se puede usar para clasificar nuevos textos. Simplemente es necesario preprocesar y extraer las características de la nueva cadena de texto para realizar la predicción con el clasificador.
# Nuevo texto para clasificar new_text = "I really enjoyed the concert!" # Preprocesamiento del nuevo texto preprocessed_text = preprocess_text(new_text) # Extracción de características del nuevo texto features = extract_features(preprocessed_text) # Clasificación del nuevo texto sentiment = classifier.classify(features) print("Sentiment:", sentiment)
Sentiment: positive
Como resultado se puede ver que la nueva cadena es positiva.
Análisis de sentimientos en español
En esta entrada se ha explicado cómo hacer análisis de sentimiento en inglés. Si se usa el ejemplo para trabajar con texto en español, u otros idiomas, el resultado no será satisfactorio dado que se ha usado el listado de stopwords del inglés un lematizador (WordNetLemmatizer
) que no es adecuado para el español.
Por eso, para realizar análisis de sentimientos en español es mejor usar otras herramientas que explicaré la semana que viene.
Conclusiones
NLTK es la librería de referencia para el procesado del lenguaje natural (PLN). Una librería que facilita el trabajo de los científicos de datos cuando se desea realizar análisis de sentimiento. Aunque, funciones clave como la lematización solamente funcionan en inglés, el uso de NLTK facilita comprender los pasos necesarios para realizar este tipo de análisis.
En la publicación de la semana que viene se explicará cómo se puede hacer análisis de sentimientos en español con otra librería.
Deja una respuesta