agrigento capitale della cultura 2025

Come ti analizzo la Capitale della Cultura con l’AI

Ciao a tuttə e benvenutə su questo blog; vogliate scusarmi per la lunga assenza.

Quest’oggi tratteremo uno dei temi caldi del momento: l’Intelligenza Artificiale Generativa (AGI) basata sui Large Language Model (LLM).

Voglio premettere che, sebbene la soluzione presentata sarà perfettamente funzionante, è praticamente poco più di una demo delle enormi potenzialità offerte da questi strumenti.

Introduzione

Nello specifico useremo Python e MySQL con un semplice script di poche righe che permette di:

  1. Collegarsi a Twitter e scaricare gli ultimi tweet che parlano della Capitale della Cultura
  2. Interrogare OpenAI riguardo il sentiment di questi tweet
  3. Conservare il risultato nel database MySQL
  4. Effettuare analisi successive tramite la creazione di grafici

Creazione delle Utenze

Come prima cosa dovremo creare un’utenza developer su Twitter e un account a pagamento (servirà una carta di credito) su OpenAI.

Twitter Developer

La prima cosa che dobbiamo fare è andare sul portale sviluppatori di Twitter per iscriverci, generare un’app e generare il nostro Bearer Token (che andrà messo nel codice Python); grazie a questo potremo scaricare sino a 500.000 tweet al mese (esistono piani a pagamento che permettono quote maggiori, eh).

Registrazione su OpenAI

Successivamente c’è da registrarsi su OpenAI: servità una carta di credito (queste API non sono free) ma, se non si fanno elaborazioni troppo massicce, il costo è veramente contenuto (credo di avere speso un dollaro e qualcosa per circa 200 tweet).

Preparazione dell’Ambiente di Lavoro

Devo dire che io mi sono trovato benissimo con PyCharm Community Edition (scaricabile qui in maniera totalmente free) e questo tutorial si riferirà a quest’IDE ma la scelta di VS Code non sarebbe affatto peregrina.

Installazione di Python e dell’IDE

Il primo step (se non l’avete già fatto) è andare su https://www.python.org/, scaricare e installare la versione adatta alla vostra piattaforma (c’è da tenere conto che, normalmente, questo va fatto solo su Windows perché di solito è già presente sia su Mac OS che su Linux).

A questo punto si crea un nuovo progetto con PyCharm (che genera automaticamente un ambiente virtuale con venv; cosa che, invece, andrebbe fatta manualmente con VS Code).

Il passo successivo è l’installazione delle dipendenze con pip e quindi apriamo il terminale integrato di PyCharm e diamo questi 3 comandi (per ognuno aspettiamo il completamento del download e il messaggio di corretta esecuzione):

pip install tweepy

pip install mysql-connector-python

pip install openai

questi tre moduli Python sono necessari al progetto e sono rispettivamente:

  • la libreria per interagire con le API di Twitter (homepage: https://www.tweepy.org/)
  • il modulo per utilizzare MySQL con Python
  • il modulo per utilizzare OpenAI (l’AI che ci siamo preposti di utilizzare per estrarre il sentiment)

Codice Python

A questo punto ecco il codice Python da copincollare in PyCharm:

import openai
import tweepy
import mysql.connector
from mysql.connector import errorcode

# OpenAI API KEY
openai.api_key = "INSERT-YOUR-API-KEY-HERE"

# Twitter Bearer Token
client = tweepy.Client(
    bearer_token='INSERT-YOUR-TWITTER-BEARER-TOKEN-HERE')

# Twitter search query
query = "#capitaledellacultura OR #capitalecultura OR (capitale cultura)"
tweets = tweepy.Paginator(client.search_recent_tweets, query=query,
                          tweet_fields=['created_at', 'id'], max_results=100).flatten(limit=1000)


try:
    cnx = mysql.connector.connect(user='YOUR-USER-HERE', password='YOUR-PASSWORD-HERE',
                                  host='127.0.0.1',
                                  database='tweetsopenai')
    cursor = cnx.cursor()
except mysql.connector.Error as err:
    if err.errno == errorcode.ER_ACCESS_DENIED_ERROR:
        print("Something is wrong with your user name or password")
    elif err.errno == errorcode.ER_BAD_DB_ERROR:
        print("Database does not exist")
    else:
        print(err)
else:
    for tweet in tweets:
        try:
            cursor.execute("SELECT * FROM tweets WHERE tweet_id = (%s);", (tweet.id,))
            if cursor.fetchone() is None:
                response = openai.Completion.create(
                model = "text-davinci-003",
                prompt = "Decide whether a Tweet's sentiment is positive, neutral, or negative.\n\nTweet: \"" + tweet.text + "\"",
                temperature = 0,
                max_tokens = 60,
                top_p = 1.0,
                frequency_penalty = 0.5,
                presence_penalty = 0.0
                )

                sql = "INSERT INTO tweets (tweet_id, tweet_created_at, tweet_text, tweet_sentiment) VALUES (%s, %s, %s, %s);"
                val = (tweet.id, tweet.created_at, tweet.text, response['choices'][0]['text'])
                cursor.execute(sql, val)
                cnx.commit()
                print("Insert tweet with id", tweet.id, "in database.")

            else:
                print("Tweet already in database.")

        except:
            print('Something went wrong.')

    cursor.close()
    cnx.close()

Mi permetto di aggiungere un pastebin casomai la visualizzazione del codice di WordPress risulti confusa.

La query di ricerca (inclusi i vari parametri passati) è presa esattamente da uno degli esempi presenti in OpenAI (e, quindi, presumo che sia corretta).

Modificare la query di ricerca

Mi rendo conto che qualcuno potrebbe volere utilizzare questo codice cambiando la query e, così, lascio una simpatica guida che ho consultato: https://github.com/twitterdev/getting-started-with-the-twitter-api-v2-for-academic-research/blob/main/modules/5-how-to-write-search-queries.md

Installazione di MySQL

Qui non mi dilungo troppo; ognuno può seguire la strada che preferisce: io ho preferito utilizzare Docker Desktop (a cui rimando per la documentazione).

Se anche voi voleste seguire questa strada vi basterà, dopo avere scaricato e installato Docker Desktop, dare questi due comandi per avere il database già pronto e funzionante:

docker pull mysql

docker run -d -p 3306:3306 -e MYSQL_ROOT_PASSWORD=YOUR-PASSWORD-HERE --name mysql --restart unless-stopped mysql

Creazione del Database

A questo punto avrete un db MySQL funzionante sulla vostra macchina di sviluppo e dobbiamo creare il database.

Io personalmente mi sono trovato bene a disegnarlo prima con MySQL Workbench e successivamente ad esportare lo script che vi riporto di seguito.

CREATE DATABASE  IF NOT EXISTS `tweetsopenai` /*!40100 DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci */ /*!80016 DEFAULT ENCRYPTION='N' */;
USE `tweetsopenai`;
-- MySQL dump 10.13  Distrib 8.0.33, for Win64 (x86_64)
--
-- Host: 127.0.0.1    Database: tweetsopenai
-- ------------------------------------------------------
-- Server version	8.0.33

/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!50503 SET NAMES utf8 */;
/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */;
/*!40103 SET TIME_ZONE='+00:00' */;
/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;

--
-- Table structure for table `tweets`
--

DROP TABLE IF EXISTS `tweets`;
/*!40101 SET @saved_cs_client     = @@character_set_client */;
/*!50503 SET character_set_client = utf8mb4 */;
CREATE TABLE `tweets` (
  `tweet_id` bigint unsigned NOT NULL,
  `tweet_created_at` datetime NOT NULL,
  `tweet_text` varchar(1024) COLLATE utf8mb4_unicode_ci NOT NULL,
  `tweet_sentiment` varchar(10) COLLATE utf8mb4_unicode_ci NOT NULL,
  PRIMARY KEY (`tweet_id`),
  UNIQUE KEY `tweet.id_UNIQUE` (`tweet_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
/*!40101 SET character_set_client = @saved_cs_client */;
/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;

/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;

Anche qui mi permetto di lasciare un pastebin casomai la visualizzazione di codice di WordPress non vi soddisfacesse 🙂

Spiegazione del DB

Come vedete il database è veramente semplice: mi sono attenuto al principio KISS 🙂 (anche perché non posso esattamente definirmi una cima nel linguaggio SQL).

Siccome ogni tweet ha un suo id l’ho usato come chiave primaria del db e da questo nascono i vincoli imposti a questo campo (è possibile accedere ad un tweet esclusivamente tramite il suo id come si vede bene qui).

In aggiunta conservo: la data di creazione, il tweet stesso e il sentiment espresso come Positive, Negative o Neutral.

Analisi successive

A questo punto avremo un database con i campi sopradetti; in particolare avremo i campi che indicano la data di creazione e il sentiment: basterebbe creare un istogramma in pila (mettendo il sentiment positivo in verde, il neutral in giallo e il negative in rosso) per analizzare l’andamento della percezione della Capitale della Cultura su Twitter giorno per giorno.

Io, a questo scopo, avevo selezionato Microsoft Power BI Desktop perché completamente gratuito (ma esistono svariati altri strumenti anche web-based).

Conclusione

Come avete visto con circa 70 righe di codice Python e anche meno in SQL è possibile fare un’analisi che, fino a poco tempo fa, era esclusivo appannaggio di un data scientist.

C’è da dire che l’analisi del sentiment è ormai un compito abbastanza semplice (e qui sto pensando sia ad altri strumenti proprietari come le Google Natural Language API che a strumenti free tipo quelli offerti da Hugging Face).

Detto questo vi saluto, se l’articolo vi è piaciuto vi invito a farlo leggere ad altri e, se riscontraste problemi, vi invito a commentare il pezzo su questo blog così che possa aggiungere ulteriori dettagli.


Pubblicato

in

,

da

Commenti

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *

Questo sito usa Akismet per ridurre lo spam. Scopri come i tuoi dati vengono elaborati.