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
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:
Los pasos para realizar análisis de sentimientos con NLTK son relativamente sencillos, ya que la librería ofrece todos los recursos necesarios.
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') 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:
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.
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.
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")
] 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 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)
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.
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.
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.
En la era del dato, las organizaciones se enfrentan al reto de gestionar volúmenes masivos…
En la serie Creación de una API REST con Express y TypeScript construimos una API…
Durante la Segunda Guerra Mundial, la Fuerza Aérea de Estados Unidos quería reforzar sus aviones…
En muchas situaciones —ya sea para grabar un tutorial, tomar capturas de pantalla profesionales, probar…
Imagínate en una sala con un grupo de personas, por ejemplo, en una oficina, un…
En el trabajo diario con ordenadores, es común encontrarse con tareas repetitivas: realizar copias de…
This website uses cookies.