El análisis de sentimientos es una herramienta poderosa en el procesamiento del lenguaje natural (PNL) para explorar opiniones públicas y emociones en el texto. En el contexto de la salud mental, puede proporcionar información convincente sobre el bienestar integral de las personas. Como asociado de verano en ciencia de datos en la Fundación Rockefeller, llevó a cabo un proyecto de investigación utilizando técnicas de PNL para explorar las discusiones de Reddit sobre la depresión antes y después de la pandemia de COVID-19. Para comprender mejor los tabúes relacionados con el género en torno a la salud mental y la depresión, elegí analizar las distinciones entre publicaciones realizadas por hombres y mujeres.
Diferentes tipos de análisis de sentimiento
Tradicionalmente, el análisis de sentimientos clasifica las emociones generales expresadas en un texto en tres categorías: positivas, negativas o neutrales. Pero, ¿qué pasaría si estuviera interesado en explorar las emociones a un nivel más granular, como la anticipación, el miedo, la tristeza, la ira, etc.?
Hay formas de hacer esto utilizando modelos de opinión que hacen referencia a bibliotecas de palabras, como El léxico de emociones de la NRC, que asocia los textos con ocho emociones básicas (ira, miedo, anticipación, confianza, sorpresa, tristeza, alegría y disgusto). Sin embargo, la configuración para este tipo de análisis puede resultar complicada y es posible que la compensación no valga la pena.
Descubrí que la clasificación de disparo cero se puede utilizar fácilmente para producir resultados similares. El término «disparo cero» proviene del concepto de que un modelo puede clasificar datos sin exposición previa a las etiquetas que se le pide que clasifique. Esto elimina la necesidad de un conjunto de datos de entrenamiento, cuya creación suele consumir mucho tiempo y recursos. El modelo utiliza su comprensión general de las relaciones entre palabras, frases y conceptos para asignarlos en varias categorías.
Pude reutilizar el uso de modelos de clasificación de tiro cero para el análisis de sentimientos proporcionando emociones como etiquetas para clasificar la anticipación, la ira, el disgusto, el miedo, la alegría y la confianza.
En esta publicación, compartiré cómo comenzar rápidamente con el análisis de sentimientos utilizando la clasificación de tiro cero en 5 sencillos pasos.
Plataformas como HuggingFace simplifican la implementación de estos modelos. Puede explorar diferentes modelos y probar los resultados para encontrar cuál usar:
- Ir a https://huggingface.co
- Haga clic en la pestaña «Modelos» y seleccione el tipo de tarea de PNL que le interese
- Elija una de las tarjetas de modelo y esto le llevará a la interfaz del modelo.
- Pase una cadena de texto para ver cómo funciona el modelo.
A continuación se muestran un par de ejemplos de cómo se desempeñó un modelo de análisis de sentimiento en comparación con un modelo de tiro cero.
Análisis de los sentimientos
Estos modelos clasifican el texto en categorías negativas, neutrales y positivas.
Puedes ver aquí que el matiz es bastante limitado y no deja mucho espacio a la interpretación. El acceso al modelo mostrado arriba se puede encontrar aquí para probarlo o ejecutarlo.
Este tipo de modelos se utilizan mejor cuando se busca obtener una idea general del sentimiento, ya sea que el texto se incline positiva o negativamente.
Clasificación de tiro cero
Estos modelos clasifican el texto en las categorías que desee introduciéndolas como etiquetas. Como estaba mirando textos sobre salud mental, incluí emociones como etiquetas, incluidas urgencia, alegría, tristeza, fatiga y ansiedad.
Puede ver que con el modelo de clasificación de tiro cero, podemos categorizar fácilmente el texto en una representación más completa de las emociones humanas sin necesidad de datos etiquetados. El modelo puede discernir matices y cambios en las emociones dentro del texto proporcionando puntuaciones de precisión para cada etiqueta. Esto es útil en aplicaciones de salud mental, donde las emociones suelen existir en un espectro.
Ahora que he identificado que el modelo de clasificación de tiro cero se adapta mejor a mis necesidades, explicaré cómo aplicar el modelo a un conjunto de datos.
Implementación del modelo Zero-Shot
Estos son los requisitos para ejecutar este ejemplo:
torch>=1.9.0
transformers>=4.11.3
datasets>=1.14.0
tokenizers>=0.11.0
pandas
numpy
Paso 1. Importar bibliotecas utilizadas
En este ejemplo, estoy usando el DeBERTa-v3-base-mnli-fiebre-anli Clasificador de tiro cero de Hugging Face.
# load hugging face library and modelfrom transformers import pipeline
classifier = pipeline("zero-shot-classification", model="MoritzLaurer/DeBERTa-v3-base-mnli-fever-anli")
# load in pandas and numpy for data manipulation
import pandas as pd
import numpy as np
Pipeline es la función utilizada para llamar a modelos previamente entrenados desde HuggingFace. Aquí estoy transmitiendo dos argumentos. Puede obtener los valores de estos argumentos en la tarjeta modelo:
- `tarea`: el tipo de tarea que realiza el modelo, pasada como una cadena
- `model`: Nombre del modelo que estás usando, pasado como una cadena
Paso 2. Lee tus datos
Sus datos pueden tener cualquier forma, siempre que haya una columna de texto donde cada fila contenga una cadena de texto. Para seguir este ejemplo, puedes leer en el Conjunto de datos de depresión de Reddit aquí. Este conjunto de datos está disponible bajo la licencia y dedicación de dominio público v1.0.
#reading in data
df = pd.read_csv("https://raw.githubusercontent.com/akaba09/redditmentalhealth/main/code/dep.csv")
Aquí hay una vista previa del conjunto de datos que usaremos:
Paso 3: cree una lista de clases que desee utilizar para predecir la opinión
Esta lista se utilizará como etiquetas para que el modelo prediga cada fragmento de texto. Por ejemplo, ¿el texto explora emociones como la ira o el disgusto? En este caso, paso una lista de emociones como etiquetas. Puede utilizar tantas etiquetas como desee.
# Creating a list of emotions to use as labels
text_labels = ["anticipation", "anger", "disgust", "fear", "joy", "trust"]
Paso 4: primero ejecute la predicción del modelo en un fragmento de texto
Primero ejecute el modelo en un fragmento de texto para comprender qué devuelve el modelo y cómo desea darle forma para su conjunto de datos.
# Sample piece of text
sample_text = "still have depression symptoms not as bad as they used to be in fact my therapist says im improving a lot but for the past years ive been stuck in this state of emotional numbness feeling disconnected from myself others and the world and time doesnt seem to be passing"# Run the model on the sample text
classifier(sample_text, text_labels, multi_label = False)
El clasificador La función es parte de la biblioteca Transformers en HuggingFace y llama al modelo que desea usar. En este ejemplo, estamos usando “DeBERTa-V4-base-mnli-fiebre-anli” y se necesitan tres argumentos posicionales:
- Primera posición: un fragmento de texto en formato de cadena. su variable puede tener cualquier nombre. En este ejemplo, lo llamé `sample_text`
- Segunda posición: lista de etiquetas que desea predecir. Esta variable puede tener cualquier nombre. En este ejemplo, lo llamé `text_labels`
- Tercera posición: `multi_label` toma un argumento verdadero o falso. Esto determina si cada fragmento de texto puede tener varias etiquetas o solo una etiqueta por texto. En este ejemplo, solo me interesa una etiqueta por texto.
Este es el resultado que obtiene del texto de muestra:
#output
# {'sequence': ' still have depression symptoms not as bad as they used to be in fact my therapist says im improving a lot but for the past years ive been stuck in this state of emotional numbness feeling disconnected from myself others and the world and time doesnt seem to be passing',
# 'labels': ['anticipation', 'trust', 'joy', 'disgust', 'fear', 'anger'],
# 'scores': [0.6039842963218689,
#0.1163715273141861,
#0.074860118329525,
#0.07247171550989151,
#0.0699692890048027,
#0.0623430535197258]}
El modelo devuelve un diccionario con las siguientes claves y valores”
- “secuencia”: el fragmento de texto que pasamos
- “etiquetas”: la lista de etiquetas para las predicciones del modelo en orden descendente de confianza.
- “puntuaciones”: Esto devuelve una lista de puntuaciones que representan la confianza del modelo en sus predicciones en orden descendente. El orden está correlacionado con las etiquetas, por lo que el primer elemento de la lista de puntuaciones refleja el primer elemento de la lista de etiquetas. En este ejemplo, el modelo ha predicho la «anticipación» con un nivel de confianza de 0,604.
Paso 5: escriba una función personalizada para hacer predicciones en todo el conjunto de datos e incluya las etiquetas como parte del marco de datos
Al ver la estructura de la salida del diccionario del modelo, puedo escribir una función personalizada para aplicar las predicciones a todos mis datos. En este ejemplo, solo me interesa mantener un sentimiento para cada fragmento de texto. Esta función tomará su marco de datos y devolverá un nuevo marco de datos que incluye dos columnas nuevas: una para su etiqueta de sentimiento y otra para la puntuación del modelo.
def predict_sentiment(df, text_column, text_labels):"""
Predict the sentiment for a piece of text in a dataframe.
Args:
df (pandas.DataFrame): A DataFrame containing the text data to perform sentiment analysis on.
text_column (str): The name of the column in the DataFrame that contains the text data.
text_labels (list): A list of text labels for sentiment classification.
Returns:
pandas.DataFrame: A DataFrame containing the original data with additional columns for the predicted
sentiment label and corresponding score.
Raises:
ValueError: If the DataFrame (df) does not contain the specified text_column.
Example:
# Assuming df is a pandas DataFrame and text_labels is a list of text labels
result = predict_sentiment(df, "text_column_name", text_labels)
"""
result_list = []
for index, row in df.iterrows():
sequence_to_classify = row[text_column]
result = classifier(sequence_to_classify, text_labels, multi_label = False)
result['sentiment'] = result['labels'][0]
result['score'] = result['scores'][0]
result_list.append(result)
result_df = pd.DataFrame(result_list)[['sequence','sentiment', 'score']]
result_df = pd.merge(df, result_df, left_on = "text", right_on="sequence", how = "left")
return result_df
Esta función itera sobre su marco de datos y analiza el resultado del diccionario para cada fila. Como solo me interesa el sentimiento con la puntuación más alta, selecciono la primera etiqueta indexándola en la lista con el resultado.[‘labels’][0]. Si desea tomar los tres sentimientos principales, por ejemplo, puede actualizar con un resultado de rango[‘labels’][0:3]. De manera similar, si desea obtener las tres puntuaciones más altas, puede actualizar con un resultado de rango.[‘scores’][0:3].
¡Ahora puedes ejecutar la función en tu marco de datos!
# run prediction on dfresults_df = predict_sentiment(df=df, text_column ="text", text_labels= text_labels)
Aquí paso tres argumentos:
- `df`: El nombre de su marco de datos
- `text_column`: el nombre de la columna en el marco de datos que contiene texto. Pase este argumento como una cadena.
- `text_labels`: una lista de etiquetas de texto para la clasificación de sentimientos
Esta es una vista previa de cómo se ve el marco de datos devuelto:
Para cada fragmento de texto, puede obtener el sentimiento asociado junto con la puntuación del modelo.
Conclusión
Los modelos clásicos de análisis de sentimientos exploran sentimientos positivos o negativos en un fragmento de texto, lo que puede resultar limitante cuando se desea explorar más matices, como emociones, en el texto.
Si bien se pueden explorar las emociones con modelos de análisis de sentimientos, normalmente requiere un conjunto de datos etiquetados y más esfuerzo para implementarlo. Los modelos de clasificación de tiro cero son versátiles y pueden generalizarse a través de una amplia gama de sentimientos sin necesidad de datos etiquetados ni capacitación previa.
Como exploramos en este ejemplo, los modelos de tiro cero toman una lista de etiquetas y devuelven las predicciones para un fragmento de texto. Pasamos una lista de emociones como nuestras etiquetas y los resultados fueron bastante buenos considerando que el modelo no estaba entrenado con este tipo de datos emocionales. Este tipo de clasificación es una herramienta valiosa para analizar textos relacionados con la salud mental, lo que nos permite obtener una comprensión más completa del panorama emocional y contribuye a un mejor apoyo al bienestar mental.
Todas las imágenes, a menos que se indique lo contrario, son del autor.