Spaces:
Running
Running
Creazione Appunti del progetto
Browse files- .github/workflows/mlops_pipeline.yaml +2 -2
- Appunti_Progetto.doc +197 -0
- reputation_logs.csv +0 -61
.github/workflows/mlops_pipeline.yaml
CHANGED
|
@@ -66,11 +66,11 @@ jobs:
|
|
| 66 |
# 2. Build e Push vero e proprio
|
| 67 |
- name: Build and Push
|
| 68 |
run: |
|
| 69 |
-
# Usa la variabile ${{ secrets.DOCKER_USERNAME }}
|
| 70 |
IMAGE_TAG=${{ secrets.DOCKER_USERNAME }}/reputation-monitor:latest
|
| 71 |
|
| 72 |
echo "Building image: $IMAGE_TAG"
|
| 73 |
-
docker build -t $IMAGE_TAG .
|
| 74 |
|
| 75 |
echo "Pushing image to Docker Hub..."
|
| 76 |
docker push $IMAGE_TAG
|
|
|
|
| 66 |
# 2. Build e Push vero e proprio
|
| 67 |
- name: Build and Push
|
| 68 |
run: |
|
| 69 |
+
# Usa la variabile ${{ secrets.DOCKER_USERNAME }} creata nel repository
|
| 70 |
IMAGE_TAG=${{ secrets.DOCKER_USERNAME }}/reputation-monitor:latest
|
| 71 |
|
| 72 |
echo "Building image: $IMAGE_TAG"
|
| 73 |
+
docker build -t $IMAGE_TAG . # Il punto finale indica di usare il Dockerfile nella root della repo, cioè il punto sta a significare "cartella corrente" e va a cercare in automatico il Dockerfile
|
| 74 |
|
| 75 |
echo "Pushing image to Docker Hub..."
|
| 76 |
docker push $IMAGE_TAG
|
Appunti_Progetto.doc
ADDED
|
@@ -0,0 +1,197 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
📚 Parte 1: Anatomia del Progetto (File Structure)
|
| 2 |
+
|
| 3 |
+
ROOT_PROJECT/
|
| 4 |
+
│
|
| 5 |
+
├── .github/
|
| 6 |
+
│ └── workflows/
|
| 7 |
+
│ └── mlops_pipeline.yaml # 🤖 Configurazione CI/CD (GitHub Actions)
|
| 8 |
+
│
|
| 9 |
+
├── app/ # 🧠 BACKEND (Logica e API)
|
| 10 |
+
│ ├── api/
|
| 11 |
+
│ │ ├── __init__.py
|
| 12 |
+
│ │ └── main.py # Endpoint FastAPI (/analyze, /predict)
|
| 13 |
+
│ ├── model/
|
| 14 |
+
│ │ ├── __init__.py
|
| 15 |
+
│ │ └── loader.py # Caricamento Modello RoBERTa (Singleton)
|
| 16 |
+
│ └── services/
|
| 17 |
+
│ ├── __init__.py
|
| 18 |
+
│ └── news_client.py # Scraper Google News
|
| 19 |
+
│
|
| 20 |
+
├── data/
|
| 21 |
+
│ └── new_data.csv # 💾 Dati grezzi per il Retraining (Vuoto)
|
| 22 |
+
│
|
| 23 |
+
├── src/
|
| 24 |
+
│ └── train.py # 🎓 Script di Retraining (Simulazione)
|
| 25 |
+
│
|
| 26 |
+
├── streamlit_app/ # 🎨 FRONTEND
|
| 27 |
+
│ └── app.py # Dashboard Interattiva
|
| 28 |
+
│
|
| 29 |
+
├── tests/ # 🧪 QUALITY ASSURANCE
|
| 30 |
+
│ └── test_api.py # Test automatici (Pytest)
|
| 31 |
+
│
|
| 32 |
+
├── Dockerfile # 🐳 Istruzioni per costruire l'immagine
|
| 33 |
+
├── entrypoint.sh # 🚦 Script di avvio (FastAPI + Streamlit)
|
| 34 |
+
├── requirements.txt # 📦 Lista librerie (dipendenze)
|
| 35 |
+
├── reputation_logs.csv # 📝 Log monitoraggio (generato a runtime)
|
| 36 |
+
└── README.md # 📄 Documentazione pubblica
|
| 37 |
+
|
| 38 |
+
🛠️ 1. MLOps & Automazione (Root & Github)
|
| 39 |
+
Questi file trasformano il codice in un prodotto "vivo" e automatizzato.
|
| 40 |
+
|
| 41 |
+
.github/workflows/mlops_pipeline.yaml: È il "Direttore d'Orchestra". È un file di configurazione per GitHub Actions. Ogni volta che fai git push, questo file dice a GitHub di accendere un computer, scaricare il tuo codice, lanciare i test, provare ad addestrare il modello, costruire il container Docker e spedirlo su Hugging Face.
|
| 42 |
+
|
| 43 |
+
Dockerfile: È la "Ricetta". Dice a Docker come costruire il computer virtuale (Container). Specifica: "Usa Python 3.9, installa queste librerie, copia i miei file, dai i permessi all'utente".
|
| 44 |
+
|
| 45 |
+
entrypoint.sh: È il "Semaforo". Docker di solito lancia un solo programma. Dato che noi vogliamo sia l'API che Streamlit, questo script Bash li avvia entrambi: prima FastAPI in background (&), poi Streamlit in primo piano.
|
| 46 |
+
|
| 47 |
+
requirements.txt: La "Lista della Spesa". Elenca tutte le librerie necessarie (fastapi, streamlit, torch, GoogleNews, etc.) per far girare il progetto.
|
| 48 |
+
|
| 49 |
+
🧠 2. Il Backend (Cartella app/)
|
| 50 |
+
Il cervello del sistema che fa i calcoli.
|
| 51 |
+
|
| 52 |
+
app/api/main.py: Il "Centralino". Crea l'API con FastAPI. Definisce gli endpoint (es. /analyze, /health). Riceve le richieste dal frontend, coordina lo scraper e il modello, salva i log e risponde con i dati JSON.
|
| 53 |
+
|
| 54 |
+
app/services/news_client.py: L' "Investigatore". Contiene la classe che usa GoogleNews. Cerca le notizie, gestisce la paginazione, prova prima in inglese e poi fa fallback in italiano se non trova nulla.
|
| 55 |
+
|
| 56 |
+
app/model/loader.py: Il "Magazziniere". Si occupa di caricare il pesante modello RoBERTa in memoria una volta sola all'avvio (Singleton Pattern), evitando che il server esploda ricaricandolo a ogni richiesta.
|
| 57 |
+
|
| 58 |
+
🎨 3. Il Frontend (Cartella streamlit_app/)
|
| 59 |
+
La faccia che vede l'utente.
|
| 60 |
+
|
| 61 |
+
streamlit_app/app.py: L' "Interfaccia". È il sito web. Disegna i grafici, le barre di input e le tabelle. Non fa calcoli pesanti: prende l'input dell'utente, lo manda all'API (requests.post) e visualizza la risposta.
|
| 62 |
+
|
| 63 |
+
🎓 4. Continuous Training (Cartella src/ & data/)
|
| 64 |
+
La parte che gestisce l'evoluzione del modello.
|
| 65 |
+
|
| 66 |
+
src/train.py: Il "Simulatore". È lo script che verrebbe lanciato per ri-addestrare il modello. Controlla se ci sono nuovi dati e simula il processo di fine-tuning (poiché su GitHub non abbiamo GPU).
|
| 67 |
+
|
| 68 |
+
data/new_data.csv: Il "Carburante". È il file (attualmente vuoto) dove dovrebbero finire i dati etichettati per il retraining.
|
| 69 |
+
|
| 70 |
+
🧪 5. Testing & Logs
|
| 71 |
+
tests/: Contiene i test automatici (test_api.py) che verificano se l'API risponde correttamente.
|
| 72 |
+
|
| 73 |
+
reputation_logs.csv: Il "Diario di Bordo". Viene creato automaticamente dall'API. Ogni volta che qualcuno fa una previsione, viene scritta una riga qui. Streamlit legge questo file per la tab "Monitoring".
|
| 74 |
+
|
| 75 |
+
🔄 Parte 2: I Flussi Logici (Architettura)
|
| 76 |
+
|
| 77 |
+
Qui disegniamo come si muovono i dati e le decisioni.
|
| 78 |
+
|
| 79 |
+
|
| 80 |
+
A. Architettura del Container (Come girano insieme)
|
| 81 |
+
|
| 82 |
+
|
| 83 |
+
Questo schema mostra come abbiamo risolto il problema di avere due programmi (Backend e Frontend) nello stesso spazio.
|
| 84 |
+
|
| 85 |
+
Snippet di codice
|
| 86 |
+
|
| 87 |
+
graph TD
|
| 88 |
+
User((Utente su Internet))
|
| 89 |
+
|
| 90 |
+
subgraph "Docker Container (Hugging Face Space)"
|
| 91 |
+
direction TB
|
| 92 |
+
Entry[entrypoint.sh]
|
| 93 |
+
|
| 94 |
+
subgraph "Processo 1 (Backend)"
|
| 95 |
+
FastAPI[FastAPI Server :8000]
|
| 96 |
+
Model[RoBERTa AI]
|
| 97 |
+
Scraper[Google News Scraper]
|
| 98 |
+
end
|
| 99 |
+
|
| 100 |
+
subgraph "Processo 2 (Frontend)"
|
| 101 |
+
Streamlit[Streamlit App :7860]
|
| 102 |
+
end
|
| 103 |
+
|
| 104 |
+
Entry -->|Avvia in background| FastAPI
|
| 105 |
+
Entry -->|Avvia in primo piano| Streamlit
|
| 106 |
+
|
| 107 |
+
Streamlit <-->|HTTP Request (localhost)| FastAPI
|
| 108 |
+
FastAPI <--> Model
|
| 109 |
+
FastAPI --> Scraper
|
| 110 |
+
end
|
| 111 |
+
|
| 112 |
+
User <-->|Vede solo porta 7860| Streamlit
|
| 113 |
+
Scraper <-->|Cerca Info| Google(Google Web)
|
| 114 |
+
|
| 115 |
+
Come fanno a convivere due programmi nello stesso container su Hugging Face?
|
| 116 |
+
|
| 117 |
+
**Spiegazione del processo**
|
| 118 |
+
|
| 119 |
+
- **Panoramica:** L'app è composta da due processi che convivono nello stesso container: un backend che espone un'API per l'analisi dei testi e un frontend Streamlit che fornisce l'interfaccia utente. Lo scopo è permettere allo user-facing frontend di richiedere analisi al backend in locale, mantenendo il modello in memoria per efficienza.
|
| 120 |
+
|
| 121 |
+
- **Esecuzione nel container:** Al container viene eseguito uno script di avvio che:
|
| 122 |
+
- avvia il server API in background;
|
| 123 |
+
- avvia l'app Streamlit in primo piano;
|
| 124 |
+
- mantiene Streamlit come processo principale esposto all'utente (porta pubblica), mentre l'API è raggiungibile in locale (porta interna).
|
| 125 |
+
|
| 126 |
+
- **Flusso dell'API (/analyze):**
|
| 127 |
+
- **Input:** richiesta JSON contenente la query e il numero massimo di risultati.
|
| 128 |
+
- **Scraping:** il servizio ricerca notizie (prima in inglese, poi fallback in italiano), raccoglie titoli e descrizioni e pre-processa il testo.
|
| 129 |
+
- **Inference:** ogni testo viene passato al modello (caricato una sola volta all'avvio) per ottenere la predizione di sentimento e la probabilità.
|
| 130 |
+
- **Logging:** ogni previsione viene registrata in un log (CSV) con timestamp, input e risultato per monitoring e retraining.
|
| 131 |
+
- **Output:** la risposta JSON contiene le statistiche aggregate (conteggi, percentuali) e la lista di risultati analizzati.
|
| 132 |
+
|
| 133 |
+
- **Retraining continuo (simulato):**
|
| 134 |
+
- Periodicamente o a seguito di nuovi dati, lo script di retraining verifica la presenza di dati etichettati.
|
| 135 |
+
- Se non ci sono dati nuovi, il retraining viene saltato senza interrompere la pipeline.
|
| 136 |
+
- Se ci sono dati, viene eseguita una simulazione di fine-tuning e i risultati vengono testati automaticamente.
|
| 137 |
+
|
| 138 |
+
- **Pipeline CI/CD (sintesi):**
|
| 139 |
+
- **Trigger:** un push sul repository avvia la pipeline.
|
| 140 |
+
- **Job 1 — Qualità & Training:** installa dipendenze, lancia la simulazione di retraining (se necessario) e poi esegue i test automatici. Se i test falliscono, la pipeline si blocca.
|
| 141 |
+
- **Job 2 — Packaging:** solo se i test passano, viene costruita l'immagine Docker e (opzionalmente) pubblicata su un registry.
|
| 142 |
+
- **Job 3 — Deploy:** se il packaging ha successo, l'immagine viene distribuita alla piattaforma di hosting (es. Space). Al termine l'app aggiornata è disponibile online.
|
| 143 |
+
- **Precisione operativa:** il retraining è condizionale (salta se mancano dati); l'esecuzione dei test è il gate principale che previene il deploy di codice rotto.
|
| 144 |
+
|
| 145 |
+
|
| 146 |
+
B. Il Flusso dell'API (/analyze)
|
| 147 |
+
|
| 148 |
+
|
| 149 |
+
|
| 150 |
+
Cosa succede esattamente quando l'utente clicca "Analyze"?
|
| 151 |
+
|
| 152 |
+
1. INPUT: Arriva richiesta JSON {"query": "Tesla", "limit": 5}.
|
| 153 |
+
|
| 154 |
+
2. SCRAPING:
|
| 155 |
+
|
| 156 |
+
Cerco "Tesla" su Google News (EN).
|
| 157 |
+
|
| 158 |
+
Scarico Titoli + Descrizioni.
|
| 159 |
+
|
| 160 |
+
LOOP (Ciclo For): Per ogni notizia trovata:
|
| 161 |
+
|
| 162 |
+
Pulisco il testo.
|
| 163 |
+
|
| 164 |
+
Inference: Passo il testo a RoBERTa -> Ottengo "Positive" (0.98).
|
| 165 |
+
|
| 166 |
+
Logging: Scrivo su reputation_logs.csv.
|
| 167 |
+
|
| 168 |
+
Aggiorno i contatori (es. Positive +1).
|
| 169 |
+
|
| 170 |
+
3. OUTPUT: Restituisco JSON con statistiche e lista risultati.
|
| 171 |
+
|
| 172 |
+
C. La Pipeline CI/CD (Il file YAML)
|
| 173 |
+
Cosa succede su GitHub quando fai git push? È una catena di montaggio.
|
| 174 |
+
|
| 175 |
+
Snippet di codice
|
| 176 |
+
|
| 177 |
+
Push[Git Push] -->|Trigger| GitHubActions Questo è il trigger, quando fascio push sul ramo main.
|
| 178 |
+
|
| 179 |
+
subgraph "Job 1: Quality & Training" Job centrale per il controllo e retraining del modello (se non passa i test questo viene bloccato il commit)
|
| 180 |
+
Install[Install Dependencies] --> Retrain[Simulazione Retraining] Prima di tutto installa le dipendenze, poi fa il retrain
|
| 181 |
+
Retrain --> Test[Run Pytest] Fatto il retrain, eseguiamo il test con pytest (Se fallisce qui, BLOCCA TUTTO 🛑).
|
| 182 |
+
end
|
| 183 |
+
|
| 184 |
+
subgraph "Job 2: Packaging"
|
| 185 |
+
Test -->|Se Verde| Build[Docker Build]
|
| 186 |
+
Build --> PushHub[Push to DockerHub]
|
| 187 |
+
end
|
| 188 |
+
|
| 189 |
+
subgraph "Job 3: Deploy"
|
| 190 |
+
PushHub -->|Se Verde| Deploy[Deploy to Hugging Face]
|
| 191 |
+
end
|
| 192 |
+
|
| 193 |
+
Deploy -->|Fine| LiveApp((App Aggiornata))
|
| 194 |
+
|
| 195 |
+
Punto Critico: Se Run Pytest fallisce (X Rossa), il Docker Build non parte nemmeno. Questo protegge la produzione da codice rotto.
|
| 196 |
+
|
| 197 |
+
Punto Intelligente: Il retraining (Job 1) controlla se new_data.csv è vuoto. Se è vuoto, dice "Skipping" e prosegue senza rompere nulla.
|
reputation_logs.csv
CHANGED
|
@@ -1,62 +1 @@
|
|
| 1 |
timestamp,query,text,sentiment,confidence
|
| 2 |
-
2025-12-11 23:33:12.555398,Elettromedia Spa,"Kia EV6 Owner Discovers Factory Wiring Error in Subwoofer, Fixes Weak Sound in Minutes. The EV6's weak sound system has frustrated owners, but reversing a few wires running to the Meridian subwoofer is all it takes to boost bass dramatically.",negative,0.6096141934394836
|
| 3 |
-
2025-12-11 23:33:12.740590,Elettromedia Spa,"Automotive Audio Speakers Market to Grow by USD 9.02 Billion (2024-2028) with Cost-Effective Aftermarket Speakers Boosting the Market, Report on Market Evolution Powered by AI - Technavio. Report on how AI is driving market transformation - The global automotive audio speakers market size is estimated to grow by USD 9.02 billion from 2024-2028...",positive,0.6643907427787781
|
| 4 |
-
2025-12-11 23:33:12.872823,Elettromedia Spa,"Lavoce Italiana Comes to North America. Italian transducer company Lavoce Italiana has established its first U.S. division, Elettromedia Corporation, based in Old Hickory, TN.",neutral,0.7901442050933838
|
| 5 |
-
2025-12-11 23:33:13.005912,Elettromedia Spa,"Elettromedia Training at KnowledgeFest. Press Release: Irvine, CA – Elettromedia USA is hosting several training sessions at KnowledgeFest Las Vegas February 3rd-5th.",neutral,0.8425894975662231
|
| 6 |
-
2025-12-11 23:40:24.248518,Ferrari,Ferrari crash: Luxury car had a history of speeding. Kolkata: Kolkata Police will seek help of engineers from Ferrari to study the reasons that led to one of their cars getting involved in an accident on.,negative,0.62410968542099
|
| 7 |
-
2025-12-11 23:40:24.383238,Ferrari,"Adrian Newey or Max Verstappen: what would Ferrari’s former key figures choose?. Maurizio Arrivabene and Luigi Mazzola reveal whether Ferrari should choose Adrian Newey or Max Verstappen, highlighting why technical excellence is more...",neutral,0.9174836277961731
|
| 8 |
-
2025-12-11 23:40:24.498802,Ferrari,60 Years Of The Dino: How Ferrari Turned A “Junior” Into A Legend. Ferrari's new feature on the Dino's 60th anniversary reveals how its first mid-engined V6 road car was hand-shaped into an icon that is now a blue-chip...,neutral,0.566238284111023
|
| 9 |
-
2025-12-11 23:40:24.606439,Ferrari,Former Ferrari boss weighs in on departing engine specialists: what Maranello should worry about. Maurizio Arrivabene discusses the departure of key Ferrari engine specialists and the potential impact on the team's 2026 F1 season as rivals prepare for...,neutral,0.9085403680801392
|
| 10 |
-
2025-12-11 23:40:24.708324,Ferrari,"Lewis Hamilton warned his F1 legacy is at risk after disastrous first season with Ferrari. Lewis Hamilton faces growing concerns about damaging his Formula 1 legacy after a difficult first season with Ferrari, as his ongoing struggles and lack of...",negative,0.7664820551872253
|
| 11 |
-
2025-12-11 23:40:24.824364,Ferrari,"While confident he made the most of what Ferrari gave him this year, Leclerc hopes for a lot more from 2026. After Ferrari's promising form of 2024 faded in 2025, Charles Leclerc is staying cautious about the team's chances of a quick rebound under the incoming...",positive,0.6923292875289917
|
| 12 |
-
2025-12-11 23:40:24.913603,Ferrari,"Bookies open betting on Lewis Hamilton retiring after nightmare season at Ferrari. When Lewis Hamilton announced he was joining Ferrari for the 2025 season, everything seemed to be lined up for a title charge.",neutral,0.7515650391578674
|
| 13 |
-
2025-12-11 23:40:25.015110,Ferrari,"Representing Ferrari, Alba Larsen is living a ""dream come true"".. Every racing driver dreams of racing in the famous Ferrari red, and at just 16 years old, Alba Larsen is about to achieve this feat.",positive,0.9591248035430908
|
| 14 |
-
2025-12-11 23:40:25.173862,Ferrari,"Ferrari: Fred Vasseur cautions Lewis Hamilton and Charles Leclerc about a key pitfall ahead of 2026 F1 campaign. Ferrari enter the 2026 Formula 1 season under huge pressure, with Lewis Hamilton and Charles Leclerc urged to push the team relentlessly rather than offer...",neutral,0.897258996963501
|
| 15 |
-
2025-12-11 23:40:25.289483,Ferrari,"""Lewis Hamilton isn't finished"": Former Ferrari boss tries to knock 'common sense' into the team's driver decisions. Former Ferrari F1 team principal Maurizio Arrivabene has lent support to Lewis Hamilton after his nightmare first season with the Scuderia.",neutral,0.681147038936615
|
| 16 |
-
2025-12-11 23:40:25.392379,Ferrari,"Lewis Hamilton’s dire first Ferrari season keeps drawing the same comparison to Michael Schumacher. Lewis Hamilton joining Ferrari sparked pandemonium in Maranello ahead of the 2025 F1 season, but bitter disappointment and even anger quickly replaced any...",negative,0.7126820683479309
|
| 17 |
-
2025-12-11 23:40:25.496356,Ferrari,Lewis Hamilton urged to study Max Verstappen’s radio craft to help drive Ferrari forward. Lewis Hamilton is urged to adopt Max Verstappen's motivational style as Ferrari seek stronger leadership after a difficult 2025 F1 season.,neutral,0.6595488786697388
|
| 18 |
-
2025-12-11 23:40:25.642155,Ferrari,Recon 2022 Ferrari Roma 3.9 Coupe SURROUND VIEW / CARBON / JBL / ELECTRIC SEAT / INCOMING STOCK. 2022 Ferrari Roma 3.9 Coupe SURROUND VIEW / CARBON / JBL / ELECTRIC SEAT / INCOMING STOCK. Find all the best used / second hand and new cars from trusted...,neutral,0.69819575548172
|
| 19 |
-
2025-12-11 23:40:25.788479,Ferrari,"Ghost in white: a nearly-new, 986 HP Ferrari SF90 Stradale hits the market. This impeccably specced SF90 Stradale comes with a clean Carfax report and is now ready to find a new home. Ferrari SF90 Stradale.",positive,0.8663274645805359
|
| 20 |
-
2025-12-11 23:40:25.889634,Ferrari,Lewis Hamilton gets response from Ferrari after joint complaints with Charles Leclerc. Lewis Hamilton and Charles Leclerc spent the Formula 1 season complaining about how uncompetitive their Ferrari cars were compared to their championship...,neutral,0.6231443285942078
|
| 21 |
-
2025-12-11 23:40:26.000135,Ferrari,"214-Mile 2025 Ferrari 12Cilindri For Sale. Grab the keys to Ferrari's latest and greatest supercar! While most Ferraris have historically been recognized for their mid-engine configurations, Enzo.",positive,0.797694981098175
|
| 22 |
-
2025-12-11 23:40:26.115016,Ferrari,"Dubai Police Force Commits Crime Against Sanity With Mansory Purosangue. Dubai's police force is all about putting on a show. Its fleet is legendary for its collection of supercars, hypercars, and even four-rotor flying...",neutral,0.5327199101448059
|
| 23 |
-
2025-12-11 23:40:26.236435,Ferrari,"Carlos Sainz silences Williams ‘doubts’ after Ferrari departure. Carlos Sainz admitted ""there were doubts"" from outside about his move to Williams in 2025, but he believes the team is on an upward trend.",neutral,0.8175623416900635
|
| 24 |
-
2025-12-11 23:40:26.336150,Ferrari,"Europe cracks down on rule-breaking Ferrari, Rolls-Royce owners. Authorities in London and Vienna recently took these rich dweebs down a peg and let them know they can't just do whatever they want.",negative,0.7607141733169556
|
| 25 |
-
2025-12-11 23:40:26.446514,Ferrari,Lewis Hamilton's Dad may have just set up Ferrari star's F1 retirement. Seven-time F1 world champion Lewis Hamilton may just have been given a retirement plan from his father Anthony Hamilton.,neutral,0.5159865617752075
|
| 26 |
-
2025-12-11 23:40:44.616365,Elettromedia,Elettromedia USA Names New President. Rob Wempe to President of Mobile Audio for Advanced Marketing companies. Wempe was previously VP of Sales & Marketing at the company for fifteen years.,neutral,0.7228948473930359
|
| 27 |
-
2025-12-11 23:40:44.727524,Elettromedia,"Elettromedia USA Parent Buys Biketronics. Advanced Marketing, the parent company of Elettromedia USA, American Hard Bag and Velocity brands is proud to announce the acquisition of Biketronics located...",positive,0.8176090717315674
|
| 28 |
-
2025-12-11 23:40:44.818475,Elettromedia,"Elettromedia Elevated in MESA Role. Elettromedia, takes an elevated position as a vendor for the car audio Mobile Electronics Specialists of America buying group.",positive,0.6863150596618652
|
| 29 |
-
2025-12-11 23:40:44.936782,Elettromedia,"Elettromedia Adds Automated DSP Tuning. Elettromedia Adds Automated DSP Tuning ... Elettromedia, maker of Hertz and Audison, is offering the next generation of its tuning software, bit Drive 2.0. It...",neutral,0.5924315452575684
|
| 30 |
-
2025-12-11 23:40:45.039521,Elettromedia,"Elettromedia USA Owner Buys This Company. Elettromedia USA Owner Buys This Company ... Advanced Marketing, the US Distributor of Hertz, Audison and other brands, announced it is taking over the operations...",neutral,0.7651730179786682
|
| 31 |
-
2025-12-11 23:40:45.137103,Elettromedia,"Former JL Exec Joins Hertz/Audison Marine. Elettromedia announced the appointment of Brian Power as Vice President of its Marine Division, which includes both the Hertz and Audison marine audio...",neutral,0.8856467008590698
|
| 32 |
-
2025-12-11 23:40:45.252198,Elettromedia,"Elettromedia Names New Rep. Press Release (UNEDITED): IRVINE, CA– Elettromedia-USA, manufacturer of premium electronics and speaker systems for the automotive, marine, and motorsports...",neutral,0.9273980855941772
|
| 33 |
-
2025-12-11 23:40:45.397305,Elettromedia,"Lavoce Italiana Comes to North America. Italian transducer company Lavoce Italiana has established its first U.S. division, Elettromedia Corporation, based in Old Hickory, TN.",neutral,0.7901442050933838
|
| 34 |
-
2025-12-11 23:40:45.510152,Elettromedia,Audison Announces Wide Availability of Forza Amps. Press Release (UNEDITED): LAS VEGAS– Audison announces wide availability for award-winning Forza DSP amplifiers. “After a very successful launch of AF Forza...,positive,0.5248441100120544
|
| 35 |
-
2025-12-11 23:40:45.602417,Elettromedia,"Elettromedia Training at KnowledgeFest. Press Release: Irvine, CA – Elettromedia USA is hosting several training sessions at KnowledgeFest Las Vegas February 3rd-5th.",neutral,0.8425894975662231
|
| 36 |
-
2025-12-11 23:40:45.700735,Elettromedia,Elettromedia Names Reps of the Year 2021. Press Release: Elettromedia is proud to announce the following reps and rep firms that were named Elettromedia Reps of the Year for 2021.,positive,0.9222844839096069
|
| 37 |
-
2025-12-11 23:40:45.802643,Elettromedia,"Elettromedia Hosts Reps in Italy. Press Release: Elettromedia will be conducting a sales rep training in Potenza Picena, Italy in March. Forty USA field reps will be trained on new products,...",neutral,0.8989458084106445
|
| 38 |
-
2025-12-11 23:40:45.897368,Elettromedia,"Elettromedia Appoints New Executive. Effectively immediately, Pilgrim will work with dealers to supply marketing support and materials and help drive sales. He will also keep a hand technical...",neutral,0.7104781270027161
|
| 39 |
-
2025-12-11 23:40:45.998556,Elettromedia,Advanced Marketing Exits Full Line 12 Volt Distribution. Advanced Marketing (AM) announced it is ceasing its full-line car audio wholesale distribution business. Instead it will devote its full efforts to growing...,neutral,0.7373328804969788
|
| 40 |
-
2025-12-11 23:40:46.081800,Elettromedia,"Elettromedia Names New Rep. Elettromedia has appointed Current Marketing as its representative for the Arizona and southern Nevada territories, effective immediately.",neutral,0.9036652445793152
|
| 41 |
-
2025-12-11 23:40:46.176913,Elettromedia,Elettromedia Promotes Wempe and Delgado. Elettromedia-USA has promoted Rob Wempe to Vice President of the company from his former post as Director of Sales and Marketing.,neutral,0.4994317293167114
|
| 42 |
-
2025-12-11 23:40:46.264677,Elettromedia,"Larry Frederick Leaves Elettromedia. Prominent, veteran car audio product developer Larry Frederick has left Elettromedia and is entertaining other possibilities in car electronics.",neutral,0.5087681412696838
|
| 43 |
-
2025-12-11 23:42:09.006472,Celaschi,Charleroi will pursue funding from restitution in Ha case. Councilman Larry Celaschi said the borough was harmed by the failure to pay taxes on illegal aliens.,negative,0.6671392917633057
|
| 44 |
-
2025-12-11 23:42:09.109556,Celaschi,"Charleroi councilman claims glass plant will reopen, but other officials cannot confirm. The closed Corelle Brands plant in Charleroi, shown on Friday. After it closed in April, production was moved to Lancaster, Ohio.",neutral,0.85775226354599
|
| 45 |
-
2025-12-11 23:42:09.233219,Celaschi,"Perryopolis man held for court in vehicular death case. John Delbert Celaschi Jr., 25, of Perryopolis, was held for court on all but one charge filed against him in Fayette County in relation to the vehicular...",neutral,0.715713381767273
|
| 46 |
-
2025-12-11 23:42:09.340242,Celaschi,"Immigrants Rebuilt a Pennsylvania Town — Then Became Targets. Larry Celaschi summons me to look at his cell phone, which displays a photo of a truck. The picture, which someone shared with Celaschi, features the...",neutral,0.945743203163147
|
| 47 |
-
2025-12-11 23:42:09.465843,Celaschi,"Andrew Celaschi Obituary (2025) - Carmichaels, PA - Observer-Reporter. Andrew Celaschi Obituary. Andrew Michael Celaschi, 25, died Tuesday, April 29, 2025, from injuries sustained when he was struck by a tree...",neutral,0.7802605032920837
|
| 48 |
-
2025-12-11 23:42:09.576318,Celaschi,"Greene man killed Tuesday when tree falls on car. Andrew Celaschi, 25, was the passenger in a Toyota Corolla that was headed westbound on Jefferson Road in Franklin Township, about 150 feet north of the...",negative,0.5343117713928223
|
| 49 |
-
2025-12-11 23:42:09.678246,Celaschi,"Perryopolis man charged with homicide by vehicle. A Perryopolis man faces homicide by vehicle while driving under the influence charges following a two-vehicle head-on crash Sept. 21, 2024.",negative,0.7082436680793762
|
| 50 |
-
2025-12-11 23:42:09.781644,Celaschi,"Fayette County man charged with vehicular homicide in crash that killed Ringgold grad. John Celaschi, 25, was leaving a wedding when the truck he was driving allegedly crossed the center line on Brownsville Road in Jefferson Township, hitting a...",negative,0.6681841015815735
|
| 51 |
-
2025-12-11 23:42:09.877497,Celaschi,"Perryopolis man charged with homicide by vehicle. A Perryopolis man faces homicide by vehicle while driving under the influence charges following a two-vehicle head-on accident on Sept. 21, 2024.",negative,0.695264458656311
|
| 52 |
-
2025-12-11 23:42:09.992874,Celaschi,"Victor Celaschi. He is survived by his beloved wife of 67 years, Alberta E. Celaschi (nee: Miller); his children, Victoria Aring (Lee) of Avon, and Victor Celaschi (Marie) of...",neutral,0.6017436981201172
|
| 53 |
-
2025-12-11 23:42:10.093366,Celaschi,"Bearcats grapplers pin down ’Dores. Bentworth dug deep to secure a hard-fought 42-26 victory over Frazier Wednesday night, using timely wins, clutch performances and key forfeits to pull away...",neutral,0.5737037062644958
|
| 54 |
-
2025-12-11 23:42:10.183541,Celaschi,"Charleroi council president statement draws ire of fellow council member. Councilman Larry Celaschi expressed his displeasure, taking issue with a statement concerning the plant property and its possible availability.",negative,0.6969603896141052
|
| 55 |
-
2025-12-11 23:42:10.289656,Celaschi,"Donora man killed in head-on collision in Fayette County. Quinte Lamar Brown, 26, of Donora, was traveling in the 800 block of Brownsville Road in Jefferson Township shortly before 11 pm when a vehicle being driven by...",neutral,0.5457555055618286
|
| 56 |
-
2025-12-11 23:42:10.385365,Celaschi,"Donora man dies in Fayette County crash. Troopers said Quinte Lamar Brown, 26, was driving a Chevrolet Cobalt on Brownsville Road in Jefferson Township just before 11 pm when an oncoming Chevrolet...",neutral,0.588758647441864
|
| 57 |
-
2025-12-11 23:42:10.478229,Celaschi,Efforts underway to save Charleroi plant. The company announced last week that it plans to shut down the facility by the end of the year. It's not over until it's over.,neutral,0.5509985089302063
|
| 58 |
-
2025-12-11 23:42:10.611811,Celaschi,"Tracy Lynn Herrada Obituary - Wolverine Lake , MI (1962-2024). Tracy Lynn Herrada (Celaschi) OBITUARY. Beloved wife of 20 years to Randall Herrada. Loving mother of Michelle (Abraham) Handgis, Jennifer (Stan) Sebastian,...",neutral,0.5667412877082825
|
| 59 |
-
2025-12-11 23:42:10.714440,Celaschi,"Linda Bailey Obituary (2023) - Carmichaels, PA - Observer-Reporter. Linda Joyce Bailey, 77, of Rices Landing, died Thursday, October 12, 2023, in Premier Care, Washington.",neutral,0.7752928137779236
|
| 60 |
-
2025-12-11 23:42:10.829393,Celaschi,"Claire Elizabeth Kolt Obituary. In Loving Memory of Claire Elizabeth Kolt A Bright Light Taken Too Soon It is with heavy hearts that we mourn the loss of our beloved Claire, a...",neutral,0.47717931866645813
|
| 61 |
-
2025-12-11 23:42:10.923217,Celaschi,"Clearview FCU's former CEO at helm of credit union in Chambersburg. Ron Celaschi, president and CEO at Clearview FCU for five years, joined Patriot FCU last month.",neutral,0.9147176742553711
|
| 62 |
-
2025-12-11 23:42:11.007703,Celaschi,"Patriot Federal Credit Union in Pennsylvania names new CEO. Ronald Celaschi will succeed Brad Warner, who announced his intention to retire last year.",neutral,0.8869218826293945
|
|
|
|
| 1 |
timestamp,query,text,sentiment,confidence
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|