> ## Content Index
> Fetch the complete content index at: https://www.alessiopomaro.it/llms.txt
> Use this file to discover other available public pages before exploring further.

# Embeddings e GPT-4 per clusterizzare le recensioni dei prodotti sfruttando l'AI
- URL: https://www.alessiopomaro.it/embeddings-gpt4-clusterizzare-ai/
- Published: 2023-04-12T06:00:22.000Z
- Updated: 2023-04-18T06:15:57.000Z
- Description: Come si possono raggruppare automaticamente centinaia di migliaia di recensioni per poterle analizzare? L'intelligenza artificiale ci può aiutare! Possiamo generate gli embeddings e clusterizzarli attraverso K-means. GPT-4, infine, può descriverli automaticamente. Vediamo come.
- Author: Alessio Pomaro
- Tags: AI, GPT

Prima di tutto un piccolo ripasso.

> Nel campo della statistica, il **clustering** si riferisce a un insieme di metodi di esplorazione dei dati che mirano a **identificare e raggruppare elementi simili all'interno di un dataset**.

Raggruppare stringhe attraverso **ChatGPT** o le **API di OpenAI** (*con i modelli di GPT-3, gpt-3.5-turbo o gpt-4*) è relativamente semplice.   
La tabella che segue, mostra un esempio di clusterizzazione di alcune recensioni di prodotti di Amazon ottenuta da ChatGPT attraverso **GPT-4**.

![Un esempio di tabella di cluster ottenuta da ChatGPT attraverso GPT-4](https://storage.ghost.io/c/d7/3a/d73a3886-5e95-4e08-9255-a08eb51bb37b/content/images/2023/03/gpt4-tabella-clustering-recensioni.webp)

Un esempio di tabella di cluster ottenuta da ChatGPT attraverso GPT-4

Il **prompt**? Quello che segue è esattamente l'input che ho utilizzato.

> Clusterizza le seguenti recensioni in base all'argomento e al sentiment.  
> Crea una tabella con le seguenti colonne: "Numero Cluster", "Nome del cluster", "Recensione (esempio)".  
> Crea 5 cluster. Nella colonna "Recensione (esempio)" indica una recensione d'esempio.  
>  
> RECENSIONI  
> <recensione 1>  
> <recensione 2>  
> < ... >

Chiaramente si tratta di un esempio: il prompt potrebbe essere ottimizzato e molto più dettagliato nelle istruzioni.  
Tuttavia, anche se il modello "*32k*" di GPT-4 (*[gpt-4-32k](https://platform.openai.com/docs/models/gpt-4?ref=alessiopomaro.it)*) consente di elaborare un input molto ampio, procedere in questo modo non sarebbe consigliabile se dovessimo processare decine di migliaia o centinaia di migliaia di recensioni. La soluzione migliore, prevede l'utilizzo degli **[embeddings](https://platform.openai.com/docs/guides/embeddings?ref=alessiopomaro.it)**.

## Cosa sono gli embeddings

Gli **embeddings**, di fatto rappresentano una **vettorializzazione di stringhe**. Per dirlo in termini più semplici, possiamo dire che si tratta di rappresentazioni numeriche (*sequenze*) di una o più parole che facilitano alle macchine la comprensione delle relazioni tra i concetti espressi.

![La trasformazione di una stringa in embedding](https://storage.ghost.io/c/d7/3a/d73a3886-5e95-4e08-9255-a08eb51bb37b/content/images/2023/04/schema-embeddings-openai.webp)

La trasformazione di una stringa in embedding

Sono utili per lavorare con il **linguaggio naturale** e il **codice**, perché possono essere facilmente utilizzati e confrontati da altri modelli e algoritmi di **machine learning** per effettuare operazioni come:

- la **ricerca**, dove i risultati vengono ordinati in base alla pertinenza rispetto a una query di ricerca;
- il **clustering**, dove le stringhe di testo vengono raggruppate per somiglianza (*e ne vedremo un esempio in questo post*);
- le **raccomandazioni**, per suggerire elementi correlati in base ai contenuti che li caratterizza;
- la **similarità**, in cui dove vengono analizzate le distribuzioni di somiglianza;
- la **classificazione**, dove le stringhe di testo vengono etichettate in base alle loro caratteristiche.

La distanza tra due vettori (*le sequenze numeriche*) misura il loro legame. Piccole distanze suggeriscono un legame forte, mentre grandi distanze suggeriscono un legame debole.

> **Gli embeddings che sono numericamente simili, inoltre, sono anche semanticamente simili.** 

Ad esempio, il vettore che corrisponde alla frase "*i nostri amici cani aman*o" sarà più simile al vettore della parole di "*abbaiare*" rispetto a quello del termine "*miagolare*".

### La creazione degli embeddings con OpenAI

La generazione degli embeddings con i modelli OpenAI è abbastanza semplice: esiste un endpoint dedicato. Utilizzando la **libreria Python** ufficiale ([*OpenAI Python Library*](https://github.com/openai/openai-python?ref=alessiopomaro.it)), si tratta di poche righe di codice. Quello che segue è l'esempio della documentazione.

import openai
response = openai.Embedding.create(
  input="porcine pals say",
  model="text-embedding-ada-002"
)

print(response)

La risposta conterrà proprio la sequenza di valori numerici corrispondenti.

{
  "data": [
    {
      "embedding": [
        -0.0108,
        -0.0107,
        0.0323,
        ...
        -0.0114
      ],
      "index": 0,
      "object": "embedding"
    }
  ],
  "model": "text-embedding-ada-002",
  "object": "list"
}

## La clusterizzazione delle recensioni

Quello che vedremo è un semplice esempio di utilizzo degli embeddings per **raggruppare le recensioni degli utenti ai prodotti di un e-commerce**.

Userò un set di dati pubblico, che raccoglie circa 500.000 recensioni di Amazon in ambito food (*[Amazon fine-food reviews dataset](https://www.kaggle.com/snap/amazon-fine-food-reviews?ref=alessiopomaro.it)*), dal quale ho estratto le 1000 più recenti a scopo dimostrativo.  
Ogni recensione ha un codice del prodotto (*ProductId*), l'id dell'utente (*UserId*), la valutazione (*Score*), il riepilogo (*Summarize*) e il testo (*Text*).

Per la valutazione di tutti i dati, è stata aggiunta una colonna che combina il riepilogo al testo; l'embedding verrà calcolato su quel testo.

### Preparazione del dataset e generazione degli embeddings

La pagina web che segue, illustra gli step per preparare il dataset in Python. Le librerie necessarie sono: **pandas**, **openai**, **transformers**, **plotly**, **matplotlib**, **scikit-learn**, **torch** (*transformer dep*), **torchvision**, **scipy**.  
Le operazioni che vengono svolte sono le seguenti:

- caricamento e lettura del [file CSV](https://github.com/openai/openai-cookbook/blob/main/examples/data/fine%5Ffood%5Freviews%5F1k.csv?ref=alessiopomaro.it) vi partenza con le 1000 recensioni;
- concatenazione del riepilogo al testo nella colonna *combined*;
- generazione degli embeddings e creazione del file CSV con la nuova colonna dedicata.

[openai-cookbook/Obtain\_dataset.ipynb at main · openai/openai-cookbookExamples and guides for using the OpenAI API. Contribute to openai/openai-cookbook development by creating an account on GitHub.![](https://github.com/fluidicon.png)GitHubopenai![](https://opengraph.githubassets.com/b9a2042feebf65fd9bf490d66251138a08ad17b449736849d826031168a2a086/openai/openai-cookbook)](https://github.com/openai/openai-cookbook/blob/main/examples/Obtain%5Fdataset.ipynb?ref=alessiopomaro.it)

L'immagine mostra un'estrazione del file che si ottiene dall'elaborazione.

![Un'estrazione del file che contiene le recensioni e gli embeddings](https://storage.ghost.io/c/d7/3a/d73a3886-5e95-4e08-9255-a08eb51bb37b/content/images/2023/04/recensioni-ecommerce-embeddings.webp)

Un'estrazione del file che contiene le recensioni e gli embeddings

Cliccando o toccando il bottone che segue è possibile creare una copia su drive del file contenente le mille recensioni con gli embeddings.

[Crea una copia del Foglio Google](https://bit.ly/recensioni-embeddings?ref=alessiopomaro.it)

### Clusterizzazione attraverso K-means

Come detto in precedenza, **la similarità tra vettori** (*tra embeddings*) **determina la similarità semantica tra le stringhe che rappresentano**. Questo significa che, a questo punto, possiamo usare un semplice algoritmo di clusterizzazione per raggruppare gli embeddings, e di conseguenza le recensioni. In questo caso, viene utilizzato [**K-means**](https://it.wikipedia.org/wiki/K-means?ref=alessiopomaro.it). e la seguente pagina web ne spiega i diversi step sfruttando le molto note librerie Python **numpy**, **pandas**, **sklearn** e **matplotlib**. Nello specifico, vengono effettuate le seguenti operazioni:

- lettura del file CSV preparato;
- impostazione dei **parametri di K-means**, tra i quali il numero dei cluster che si desiderano produrre;
- riduzione della dimensionalità attraverso [**T-SNE**](https://it.wikipedia.org/wiki/T-distributed%5Fstochastic%5Fneighbor%5Fembedding?ref=alessiopomaro.it);
- rappresentazione grafica dei cluster,
- stampa dei cluster con una selezione di recensioni per ognuno.

[openai-cookbook/Clustering.ipynb at main · openai/openai-cookbookExamples and guides for using the OpenAI API. Contribute to openai/openai-cookbook development by creating an account on GitHub.![](https://github.com/fluidicon.png)GitHubopenai![](https://opengraph.githubassets.com/09f90f8073e9627ecfa50e5cd4454f1d46763b8cf88502e347916c1a669581bf/openai/openai-cookbook)](https://github.com/openai/openai-cookbook/blob/main/examples/Clustering.ipynb?ref=alessiopomaro.it)

Quella che segue è la **rappresentazione dei cluster in un piano cartesiano**, in cui i pallini dello stesso colore corrispondono alle recensioni dello stesso cluster. Eseguendo il codice nella pagina indicata in precedenza, si otterrà anche questa visualizzazione.

 A differenza del codice proposto, in cui vengono generati 4 cluster, nel mio caso ne ho prodotti 5.

![La rappresentazione grafica dei cluster generati da K-means](https://storage.ghost.io/c/d7/3a/d73a3886-5e95-4e08-9255-a08eb51bb37b/content/images/2023/04/cluster-recensioni-GPT-4-kmeans-tsne.webp)

La rappresentazione grafica dei cluster generati da K-means

### L'argomento dei cluster determinato da GPT-4 

Una volta ottenuti i cluster, quindi i gruppi delle recensioni, per completare l'analisi possiamo **sfruttare GPT-4 per ottenere una descrizione automatizzata di ognuno**. 

La tecnica è molto semplice. Per ogni cluster vengono estratte alcune recensioni, le quali vengono usate per comporre **un prompt che richiede a GPT-4 di analizzare la similarità e di generare, di conseguenza, un titolo o una descrizione**.

Quelli che seguono sono le descrizioni che ho ottenuto nella mia elaborazione (*che si può visualizzare integralmente nel video*).

- **CLUSTER 1**: Recensioni positive su dolciumi e snack vari
- **CLUSTER 2**: Recensioni miste su varietà di K-cups per macchine Keurig
- **CLUSTER 3**: Recensioni prevalentemente positive su cibi e bevande di vario genere
- **CLUSTER 4**: Recensioni miste su cibo e snack per animali domestici
- **CLUSTER 5**: Recensioni variegate su tè e bevande calde

---

### L'esecuzione degli script

Nel video, si può vedere l'esecuzione delle logiche descritte direttamente nella mia console, nella quale eseguo gli script Python necessari. 

Clusterizzazione attraverso KMeans e naming sfruttando GPT-4

## Conclusioni

Abbiamo visto come, sfruttando l'endpoint specifico di OpenAI, sia semplice **convertire stringhe** (*le recensioni in questo esempio*) **in vettori**, **quindi in sequenze numeriche che conservano un valore semantico**. Facendo agire un algoritmo di clusterizzazione come K-means sugli embeddings, possiamo facilmente raggruppare le recensioni simili. Infine, attraverso un modello di linguaggio come GPT-4 abbiamo etichettato i cluster.

> **In pochi minuti, possiamo analizzare con precisione centinaia di migliaia di recensioni o altri contenuti generati dagli utenti, trasformandoli in dati utili a migliorare le performance degli e-commerce.**

Anche se le recensioni sono contenuti che non comportano una grande complessità in fase di analisi, è necessario sottolineare che il modello di OpenAI dedicato agli embeddings (*text-embedding-ada-002*), è molto performante per la lingua inglese, ma molto meno per quella italiana. A questo proposito consiglio di fare dei test anche usando **[Cohere](https://docs.cohere.ai/docs/embeddings?ref=alessiopomaro.it)** e **[Muse](https://muse-docs.lighton.ai/api/endpoints/embed/?ref=alessiopomaro.it)**. 

---

### Per approfondire

[New and improved embedding modelWe are excited to announce a new embedding model which is significantly more capable, cost effective, and simpler to use.![](https://openai.com/favicon.ico)![](https://openaicom.imgix.net/34ae00a4-a048-4301-8d80-61a8b267484a/new-and-improved-embeddings-api-og.jpg?auto=compress%2Cformat&fit=min&fm=jpg&q=80&rect=432%2C0%2C576%2C576)](https://openai.com/blog/new-and-improved-embedding-model?ref=alessiopomaro.it)

[EmbeddingsUse the API to generate completions, distill text into semantically meaningful vectors, and more. Get state-of-the-art natural language processing without the need for expensive supercomputing infrastructure.![](https://files.readme.io/8028ad6-small-cohere-icon.png)Cohere AI![](https://files.readme.io/5b9a1f6-Embeddings_Visual_1.svg)](https://docs.cohere.ai/docs/embeddings?ref=alessiopomaro.it)

[🔢 Embed | LightOn Muse DocumentationStatus:![](https://muse-docs.lighton.ai/favicon.ico)LightOn Logo![](https://muse-docs.lighton.ai/img/muse-logo.svg)](https://muse-docs.lighton.ai/api/endpoints/embed/?ref=alessiopomaro.it)