L’analisi del sentiment è un potente strumento nell’elaborazione del linguaggio naturale (NLP) per esplorare le opinioni pubbliche e le emozioni nel testo. Nel contesto della salute mentale, può fornire spunti convincenti sul benessere olistico degli individui. In qualità di collaboratore estivo di data science presso la Fondazione Rockefeller, I condotto un progetto di ricerca utilizzando tecniche di PNL per esplorare le discussioni di Reddit sulla depressione prima e dopo la pandemia di COVID-19. Per comprendere meglio i tabù legati al genere in materia di salute mentale e depressione, ho scelto di analizzare le distinzioni tra post scritti da uomini e donne.
Diversi tipi di analisi del sentiment
Tradizionalmente, l’analisi del sentiment classifica le emozioni complessive espresse in un pezzo di testo in tre categorie: positive, negative o neutre. Ma cosa succederebbe se fossi interessato a esplorare le emozioni a un livello più granulare, come anticipazione, paura, tristezza, rabbia, ecc.
Esistono modi per farlo utilizzando modelli di sentiment che fanno riferimento a librerie di parole, come Il lessico delle emozioni dell’NRCche associa i testi a otto emozioni fondamentali (rabbia, paura, anticipazione, fiducia, sorpresa, tristezza, gioia e disgusto). Tuttavia, la configurazione di questo tipo di analisi può essere complicata e il compromesso potrebbe non valerne la pena.
Ho scoperto che la classificazione zero-shot può essere facilmente utilizzata per produrre risultati simili. Il termine “zero-shot” deriva dal concetto che un modello può classificare i dati senza alcuna esposizione precedente alle etichette che gli viene chiesto di classificare. Ciò elimina la necessità di un set di dati di addestramento, la cui creazione spesso richiede molto tempo e molte risorse. Il modello utilizza la sua comprensione generale delle relazioni tra parole, frasi e concetti per assegnarli a varie categorie.
Sono stato in grado di riproporre l’uso di modelli di classificazione zero-shot per l’analisi del sentiment fornendo emozioni come etichette per classificare anticipazione, rabbia, disgusto, paura, gioia e fiducia.
In questo post condividerò come iniziare rapidamente con l’analisi del sentiment utilizzando la classificazione zero-shot in 5 semplici passaggi.
Piattaforme come HuggingFace semplificano l’implementazione di questi modelli. Puoi esplorare diversi modelli e testare i risultati per trovare quale utilizzare in base a:
- Vai a https://huggingface.co
- Fai clic sulla scheda “Modelli” e seleziona il tipo di attività di PNL a cui sei interessato
- Scegli una delle carte modello e questo ti condurrà all’interfaccia del modello
- Passa una stringa di testo per vedere come si comporta il modello
Ecco un paio di esempi di come si è comportato un modello di analisi del sentiment rispetto a un modello zero-shot.
Analisi del sentimento
Questi modelli classificano il testo in categorie negative, neutre e positive.
Qui puoi vedere che la sfumatura è piuttosto limitata e non lascia molto spazio all’interpretazione. È possibile trovare l’accesso al modello mostrato sopra Qui per testarlo o eseguirlo.
Questi tipi di modelli sono utilizzati al meglio quando si desidera ottenere un’idea generale del sentiment, indipendentemente dal fatto che il testo sia positivo o negativo.
Classificazione a tiro zero
Questi modelli classificano il testo in tutte le categorie desiderate inserendole come etichette. Dato che stavo guardando il testo sulla salute mentale, ho incluso le emozioni come etichette, tra cui urgente, gioia, tristezza, stanchezza e ansia.
Puoi vedere che con il modello di classificazione zero-shot, possiamo facilmente classificare il testo in una rappresentazione più completa delle emozioni umane senza bisogno di dati etichettati. Il modello può discernere sfumature e cambiamenti nelle emozioni all’interno del testo fornendo punteggi di precisione per ciascuna etichetta. Ciò è utile nelle applicazioni di salute mentale, dove le emozioni spesso esistono in uno spettro.
Ora che ho identificato che il modello di classificazione zero-shot è più adatto alle mie esigenze, spiegherò come applicare il modello a un set di dati.
Implementazione del modello Zero-Shot
Ecco i requisiti per eseguire questo esempio:
torch>=1.9.0
transformers>=4.11.3
datasets>=1.14.0
tokenizers>=0.11.0
pandas
numpy
Passaggio 1. Importa le librerie utilizzate
In questo esempio, sto usando il file DeBERTa-v3-base-mnli-fever-anli classificatore a scatto zero di 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 è la funzione utilizzata per richiamare modelli pre-addestrati da HuggingFace. Qui sto portando avanti due argomenti. Puoi ottenere i valori per questi argomenti dalla scheda modello:
- `task`: il tipo di attività che il modello sta eseguendo, passato come stringa
- `model`: nome del modello che stai utilizzando, passato come stringa
Passaggio 2. Leggi i tuoi dati
I tuoi dati possono essere in qualsiasi formato, purché sia presente una colonna di testo in cui ogni riga contiene una stringa di testo. Per seguire questo esempio, puoi leggere il file Set di dati sulla depressione di Reddit qui. Questo set di dati è reso disponibile sotto la dedica e la licenza di dominio pubblico v1.0.
#reading in data
df = pd.read_csv("https://raw.githubusercontent.com/akaba09/redditmentalhealth/main/code/dep.csv")
Ecco un’anteprima del set di dati che utilizzeremo:
Passaggio 3: crea un elenco di classi che desideri utilizzare per prevedere il sentiment
Questo elenco verrà utilizzato come etichette per il modello per prevedere ogni parte di testo. Ad esempio, il testo esplora emozioni come la rabbia o il disgusto? In questo caso, sto trasmettendo un elenco di emozioni come etichette. Puoi utilizzare quante o quante etichette desideri.
# Creating a list of emotions to use as labels
text_labels = ("anticipation", "anger", "disgust", "fear", "joy", "trust")
Passaggio 4: esegui prima la previsione del modello su una parte di testo
Esegui prima il modello su una porzione di testo per capire cosa restituisce il modello e come vuoi modellarlo per il tuo set di dati.
# 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)
IL classificatore fa parte della libreria Transformers in HuggingFace e richiama il modello che desideri utilizzare. In questo esempio, stiamo utilizzando “DeBERTa-V4-base-mnli-febbre-anli” e richiede tre argomenti posizionali:
- Prima posizione: una porzione di testo in formato stringa. la sua variabile può avere qualsiasi nome. In questo esempio, l’ho chiamato “sample_text”.
- Seconda posizione: elenco delle etichette che vuoi prevedere. Questa variabile può avere qualsiasi nome. In questo esempio l’ho chiamato “text_labels”.
- Terza posizione: `multi_label` accetta un argomento vero o falso. Ciò determina se ogni porzione di testo può avere più etichette o solo un’etichetta per testo. In questo esempio mi interessa solo un’etichetta per testo.
Ecco l’output che ottieni dal testo di esempio:
#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)}
Il modello restituisce un dizionario con le seguenti chiavi e valori”
- “sequenza”: la parte di testo che abbiamo inserito
- “etichette”: l’elenco delle etichette per le previsioni del modello in ordine decrescente di confidenza.
- “punteggi”: restituisce un elenco di punteggi che rappresentano la fiducia del modello nelle sue previsioni in ordine decrescente. L’ordine è correlato alle etichette, quindi il primo elemento nell’elenco dei punteggi riflette il primo elemento nell’elenco delle etichette. In questo esempio, il modello ha previsto “anticipazione” con un livello di confidenza di 0,604.
Passaggio 5: scrivere una funzione personalizzata per effettuare previsioni sull’intero set di dati e includere le etichette come parte del dataframe
Vedendo la struttura dell’output del dizionario dal modello, posso scrivere una funzione personalizzata per applicare le previsioni a tutti i miei dati. In questo esempio, mi interessa mantenere solo un sentimento per ogni parte di testo. Questa funzione prenderà in considerazione il tuo dataframe e restituirà un nuovo dataframe che include due nuove colonne: una per l’etichetta del sentiment e una per il punteggio del modello.
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
Questa funzione esegue un’iterazione sul dataframe e analizza il risultato del dizionario per ogni riga. Poiché mi interessa solo il sentimento con il punteggio più alto, seleziono la prima etichetta indicizzandola nell’elenco con result(‘labels’)(0). Se vuoi prendere i primi tre sentimenti, ad esempio, puoi aggiornare con un intervallo result(‘labels’)(0:3). Allo stesso modo, se desideri i primi tre punteggi, puoi aggiornare con un intervallo di risultati(‘punteggi’)(0:3).
Ora puoi eseguire la funzione sul tuo dataframe!
# run prediction on dfresults_df = predict_sentiment(df=df, text_column ="text", text_labels= text_labels)
Qui passo in tre argomenti:
- `df`: il nome del tuo dataframe
- `text_column`: il nome della colonna nel dataframe che contiene testo. Passa questo argomento come una stringa.
- “text_labels”: un elenco di etichette di testo per la classificazione del sentiment
Questa è un’anteprima di come appare il frame di dati restituito:
Per ogni porzione di testo, puoi ottenere il sentiment associato insieme al punteggio del modello.
Conclusione
I modelli classici di analisi del sentiment esplorano il sentiment positivo o negativo in una porzione di testo, il che può essere limitante quando si desidera esplorare più sfumature, come le emozioni, nel testo.
Sebbene sia possibile esplorare le emozioni con i modelli di analisi del sentiment, di solito richiede un set di dati etichettato e uno sforzo maggiore per l’implementazione. I modelli di classificazione zero-shot sono versatili e possono essere generalizzati su un’ampia gamma di sentimenti senza bisogno di dati etichettati o di formazione preventiva.
Come abbiamo esplorato in questo esempio, i modelli zero-shot accettano un elenco di etichette e restituiscono le previsioni per una porzione di testo. Abbiamo inserito un elenco di emozioni come etichette e i risultati sono stati piuttosto buoni considerando che il modello non è stato addestrato su questo tipo di dati emotivi. Questo tipo di classificazione è uno strumento prezioso nell’analisi di testi relativi alla salute mentale, che ci consente di acquisire una comprensione più completa del panorama emotivo e contribuisce a migliorare il supporto per il benessere mentale.
Tutte le immagini, se non diversamente specificato, sono dell’autore.
Fonte: towardsdatascience.com