• Saltar al contenido principal
  • Skip to secondary menu
  • Saltar a la barra lateral principal
  • Saltar al pie de página
  • Inicio
  • Secciones
    • Ciencia de datos
    • Criptografía
    • Herramientas
    • Machine Learning
    • Noticias
    • Opinión
    • Productividad
    • Programación
      • JavaScript
      • Julia
      • Matlab
      • Python
      • R
  • Programación
    • JavaScript
    • Julia
    • Matlab
    • Python
    • R
  • Noticias
  • Boletín
  • Contacto
  • Tienda
    • Libros
    • Equipamiento de oficina
    • Equipamiento en movilidad
    • Tiendas afiliadas
      • AliExpress
      • Amazon
      • Banggood
      • GeekBuying
      • Lenovo

Analytics Lane

Ciencia e ingeniería de datos aplicada

  • Ciencia de datos
  • Machine Learning
  • Python
  • Pandas
  • NumPy
  • Matlab
  • Julia
  • JavaScript
  • Excel

Análisis de sentimientos con NLTK en Python

mayo 22, 2023 Por Daniel Rodríguez Deja un comentario
Tiempo de lectura: 7 minutos

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).

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:

  1. Tokenización: proporciona métodos para dividir el texto en unidades más pequeñas llamadas “tokens”.
  2. 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.
  3. 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.
  4. 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.
  5. 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.
  6. 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.
  7. 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.

Publicidad


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.

Publicidad


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.

Publicidad


# 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.

Publicidad


Image by Brentt from Pixabay

¿Te ha parecido de utilidad el contenido?

¡Puntúalo entre una y cinco estrellas!

Puntuación promedio 0 / 5. Votos emitidos: 0

Ya que has encontrado útil este contenido...

¡Síguenos en redes sociales!

¡Siento que este contenido no te haya sido útil!

¡Déjame mejorar este contenido!

Dime, ¿cómo puedo mejorar este contenido?

Publicaciones relacionadas

  • Calculadora básica implementada con PySimpleGUI
    Creación básicas de GUI en Python con PySimpleGUI
  • Inclusión de texto en Matplotlib
    Inclusión de texto en Matplotlib
  • Codificación JSON
    Archivos JSON con Python: lectura y escritura
  • La exactitud y la precisión en modelos de clasificación
    La exactitud y la precisión en modelos de clasificación
  • Cuatro aplicaciones de la Inteligencia Artificial en Política
    Cuatro aplicaciones de la Inteligencia Artificial en…
  • pandas
    Pandas: Conversion de texto a fecha

Publicado en: Ciencia de datos, Python Etiquetado como: Machine learning, PLN, Sentiment analysis

Interacciones con los lectores

Deja una respuesta Cancelar la respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

I accept the Terms and Conditions and the Privacy Policy

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.

Publicidad




Barra lateral principal

Suscríbete a nuestro boletín

Suscríbete al boletín semanal para estar al día de todas las publicaciones.

Política de Privacidad

Analytics Lane en redes sociales

  • Amazon
  • Facebook
  • GitHub
  • Instagram
  • Pinterest
  • RSS
  • Twitter
  • Tumblr
  • YouTube

Publicidad

Entradas recientes

El método de Hare-Niemeyer y su implementación en Python

septiembre 29, 2023 Por Daniel Rodríguez

Redimensionar una partición de disco LVM con espacio no asignado en Linux

septiembre 27, 2023 Por Daniel Rodríguez

¿Cómo saber la versión de Pandas o cualquier otra librería en Python?

septiembre 25, 2023 Por Daniel Rodríguez

Publicidad

Es tendencia

  • ¿Cómo cambiar el nombre de las columnas en Pandas? publicado el mayo 6, 2019 | en Python
  • Seleccionar filas y columnas en Pandas con iloc y loc publicado el junio 21, 2019 | en Python
  • pandas Pandas: Cambiar los tipos de datos en los DataFrames publicado el julio 15, 2021 | en Python
  • Numpy básico: valores mínimos y máximos en arrays Numpy publicado el octubre 23, 2019 | en Python
  • Unir y combinar dataframes con pandas en Python publicado el septiembre 10, 2018 | en Python

Publicidad

Lo mejor valorado

4.9 (22)

Seleccionar filas y columnas en Pandas con iloc y loc

4.7 (12)

Operaciones de filtrado de DataFrame con Pandas en base a los valores de las columnas

4.6 (15)

Archivos JSON con Python: lectura y escritura

4.5 (10)

Diferencias entre var y let en JavaScript

4.3 (12)

Ordenación de diccionarios en Python mediante clave o valor

Publicidad

Comentarios recientes

  • Daniel Rodríguez en ¿Cómo eliminar columnas y filas en un dataframe pandas?
  • Miguel en ¿Cómo eliminar columnas y filas en un dataframe pandas?
  • alberto en Resolver problema de credenciales en Bitbucket
  • Pablo en Aplicar el método D’Hondt en Excel
  • Agapito en Creación de un EXE desde un archivo Python en Windows

Publicidad

Footer

Analytics Lane

  • Acerca de Analytics Lane
  • Boletín de noticias
  • Contacto
  • Libros
  • Lo más popular
  • Noticias
  • Tienda
  • Tiendas afiliadas

Secciones

  • Ciencia de datos
  • Criptografía
  • Herramientas
  • Machine Learning
  • Opinión
  • Productividad
  • Programación
  • Reseñas

Sobre de Analytics Lane

En Analytics Lane tratamos de explicar los principales conceptos de la ciencia e ingeniería de datos con un enfoque práctico. Los principales temas tratados son ciencia de datos, ingeniería de datos, inteligencia artificial, machine learning, deep learning y criptografía. Además, también se habla de los principales lenguajes de programación y herramientas utilizadas por los científicos e ingenieros de datos.

Copyright © 2018-2023 Analytics Lane ·Términos y condiciones ·Política de Cookies ·Política de Privacidad ·Herramientas de privacidad ·Contacto