Gli embedding di testo sono uno strumento essenziale nel campo dell’elaborazione del linguaggio naturale (NLP). Sono rappresentazioni numeriche del testo in cui ogni parola o frase è rappresentata come un vettore denso di numeri reali.
Il grande vantaggio di questi embedding è la loro capacità di catturare i significati semantici e le relazioni tra parole o frasi, consentendo alle macchine di comprendere ed elaborare il linguaggio umano in modo efficiente.
Gli embedding di testo sono fondamentali in scenari come la classificazione del testo, il recupero di informazioni e il rilevamento di similarità semantica.
OpenAI, nota per i suoi notevoli contributi al campo dell’intelligenza artificiale, consiglia attualmente di usare il modello Ada V2 per creare embedding di testo. Questo modello deriva dalla serie GPT ed è stato addestrato per catturare ancora meglio il significato contestuale e le associazioni presenti nel testo.
Se non hai familiarità con l’API di OpenAI o con il pacchetto Python openai, ti consigliamo di leggere Usare GPT-3.5 e GPT-4 tramite l’API di OpenAI in Python prima di procedere. Questa guida ti aiuterà a configurare gli account e a capire i vantaggi dell’uso dell’API.
Questo tutorial prevede anche l’uso del clustering, una tecnica di machine learning utilizzata per raggruppare istanze simili. Se non conosci il clustering, in particolare il k-Means, prendi in considerazione la lettura di Introduzione al clustering k-Means con scikit-learn in Python.
A cosa servono gli embedding di testo?
Gli embedding di testo possono essere applicati a molteplici casi d’uso, tra cui:
- Classificazione del testo. Gli embedding aiutano a creare modelli accurati per attività come l’analisi del sentiment o l’identificazione degli argomenti.
- Recupero di informazioni. Possono essere utilizzati per recuperare informazioni rilevanti per una query specifica, in modo simile a quanto fa un motore di ricerca.
- Rilevamento della similarità semantica. Gli embedding possono identificare e quantificare la similarità semantica tra spezzoni di testo.
- Sistemi di raccomandazione. Possono migliorare la qualità delle raccomandazioni comprendendo le preferenze degli utenti in base alla loro interazione con i dati testuali.
- Generazione di testo. Gli embedding vengono usati per generare testo più coerente e contestualmente pertinente.
- Traduzione automatica. Gli embedding di testo possono catturare significati semantici tra lingue diverse, migliorando la qualità del processo di traduzione automatica.
Configurazione
Per lavorare con gli embedding di testo sono necessari diversi pacchetti Python, elencati di seguito:
- os: una libreria Python integrata per interagire con il sistema operativo.
- openai: il client Python per interagire con l’API di OpenAI.
- scipy.spatial.distance: fornisce funzioni per calcolare la distanza tra diversi punti dati.
- sklean.cluster.KMeans: usato per calcolare il clustering KMeans.
- umap.UMAP: una tecnica utilizzata per ridurre la dimensionalità di dati ad alta dimensionalità.
Prima di usarli, assicurati di installare openai, scipy, plotly sklearn e umap con il seguente comando. Il codice completo è disponibile in questo workbook DataLab.
pip install -U openai, scipy, plotly-express, scikit-learn, umap-learn
Dopo l’esecuzione corretta del comando precedente, puoi importare tutte le librerie come segue:
import os
import openai
from scipy.spatial import distance
import plotly.express as px
from sklearn.cluster import KMeans
from umap import UMAP
Ora possiamo configurare la chiave API di OpenAI come segue:
openai.api_key = "<YOUR_API_KEY_HERE>"
Nota: Dovrai impostare la tua chiave API. Quella presente nel codice sorgente non è disponibile ed era solo per uso individuale.
Il pattern di codice per chiamare GPT tramite API
La seguente funzione di supporto può essere utilizzata per incorporare una riga di testo usando l’API di OpenAI. Nel codice, usiamo l’attuale ada versione 2 per generare gli embedding.
def get_embedding(text_to_embed):
# Embed a line of text
response = openai.Embedding.create(
model= "text-embedding-ada-002",
input=[text_to_embed]
)
# Extract the AI output embedding as a list of floats
embedding = response["data"][0]["embedding"]
return embedding
Sul dataset
In questa sezione, considereremo i dati delle recensioni di strumenti musicali su Amazon disponibili gratuitamente su Kaggle. I dati possono anche essere scaricati dal mio account Github come segue:
import pandas as pd
data_URL = "https://raw.githubusercontent.com/keitazoumana/Experimentation-Data/main/Musical_instruments_reviews.csv"
review_df = pd.read_csv(data_URL)
review_df.head()

Tra tutte le colonne, ci interessa solo la colonna reviewText.
review_df = review_df[['reviewText']]
print("Data shape: {}".format(review_df.shape))
display(review_df.head())
Data shape: (10261, 1)
Nel dataset ci sono molte recensioni. Per ottimizzare i costi useremo solo 100 righe selezionate casualmente.

Ora possiamo generare gli embedding per ciascuna riga dell’intero dataset applicando la funzione precedente con un’espressione lambda:
review_df = review_df.sample(100)
review_df["embedding"] = review_df["reviewText"].astype(str).apply(get_embedding)
# Make the index start from 0
review_df.reset_index(drop=True)
review_df.head(10)

Prime 10 righe delle recensioni e degli embedding
Capire la similarità del testo
Per mostrare il concetto di similarità semantica, consideriamo due recensioni che potrebbero avere sentimenti simili:
«Questo prodotto è fantastico!»
«Ha davvero superato le mie aspettative!»
Usando pdist() da scipy.spatial.distance possiamo calcolare la distanza euclidea tra i loro embedding.
La distanza euclidea corrisponde alla radice quadrata della somma delle differenze al quadrato tra i due embedding, come illustrato di seguito:

Illustrazione della distanza euclidea (fonte)
Se queste recensioni sono davvero simili, la distanza dovrebbe essere relativamente piccola.
Ora considera due recensioni diverse:
«Questo prodotto è fantastico!»
«Non sono soddisfatto dell’articolo.»
La distanza tra gli embedding di queste recensioni sarà significativamente maggiore rispetto alla distanza tra recensioni simili.
Caso d’uso: usare gli embedding di testo per l’analisi dei cluster
Gli embedding di testo che abbiamo generato possono essere utilizzati per eseguire un’analisi dei cluster in modo da raggruppare insieme gli strumenti musicali più simili tra loro.
Esistono diversi algoritmi di clustering, come K-Means, DBSCAN, il clustering gerarchico e i Gaussian Mixture Models. In questo caso d’uso specifico useremo il clustering KMeans. Tuttavia, la nostra guida Un’introduzione al clustering gerarchico in Python offre un’ottima base per comprendere a fondo il clustering gerarchico e la sua implementazione in Python.
Raggruppare i dati testuali
Usare il clustering K-means richiede di predefinire il numero di cluster da usare; imposteremo quel numero a 3 con il parametro n_clusters come segue:
kmeans = KMeans(n_clusters=3)
kmeans.fit(review_df["embedding"].tolist())
Ridurre la dimensionalità dei dati testuali incorporati
In genere gli esseri umani riescono a visualizzare fino a tre dimensioni. In questa sezione useremo UMAP, uno strumento relativamente rapido e scalabile per la riduzione della dimensionalità.
Per prima cosa, definiamo un’istanza della classe UMAP e applichiamo la funzione fit_transform agli embedding, che genera una rappresentazione bidimensionale degli embedding delle recensioni che può essere tracciata.
reducer = UMAP()
embeddings_2d = reducer.fit_transform(review_df["embedding"].tolist())
Visualizzare i cluster
Infine, crea uno scatter plot degli embedding bidimensionali. Le coordinate x e y sono rispettivamente prese da embeddings_2d[: , 0] e embeddings_2d[: , 1]
I cluster saranno visivamente distinti:
fig = px.scatter(x=embeddings_2d[:, 0], y=embeddings_2d[:, 1], color=kmeans.labels_)
fig.show()

Visualizzazione dei cluster
Nel complesso sono presenti tre cluster principali di colori diversi. Il colore di ogni recensione nella figura è determinato dall’etichetta/numero di cluster assegnato dal modello K-Means. Inoltre, la posizione di ciascun punto offre una rappresentazione visiva di quanto una determinata recensione sia simile alle altre.
Fai un passo in più
Per approfondire la tua comprensione degli embedding di testo e dell’API di OpenAI, dai un’occhiata a questo materiale di DataCamp: Fine-tuning di GPT-3 con l’API di OpenAI e Python e The OpenAI API in Python Cheat Sheet. Ti aiuta a liberare tutto il potenziale di GPT-3 tramite il fine-tuning e mostra come usare l’API di OpenAI e Python per migliorare questo avanzato modello di rete neurale per il tuo caso d’uso specifico.
Un data scientist poliedrico che ama condividere le proprie conoscenze e restituire valore agli altri, Zoumana è un content creator su YouTube e un top writer tech su Medium. Trova soddisfazione nel parlare in pubblico, programmare e insegnare. Zoumana ha due lauree magistrali: la prima in informatica con specializzazione in Machine Learning conseguita a Parigi, Francia, e la seconda in Data Science alla Texas Tech University negli Stati Uniti. Ha iniziato la sua carriera come Software Developer presso Groupe OPEN in Francia, per poi passare a IBM come Machine Learning Consultant, dove ha sviluppato soluzioni di IA end-to-end per compagnie assicurative. Successivamente, è entrato in Axionable, la prima startup di Sustainable AI con sede a Parigi e Montréal. Lì ha lavorato come Data Scientist e ha implementato prodotti di IA, principalmente casi d’uso di NLP, per clienti in Francia, Montréal, Singapore e Svizzera. Inoltre, ha dedicato il 5% del suo tempo ad attività di Ricerca e Sviluppo. Attualmente lavora come Senior Data Scientist presso IFC - World Bank Group.


