Costruire un feed informativo personalizzato senza scivolare nelle echo chamber è possibile. La chiave è combinare RSSfiltri bayesiani e liste federate con regole esplicite di diversificazione. Questo approccio mette l’utente al centro, rende trasparenti i criteri di selezione e abilita una sperimentazione replicabile grazie a tool open-source e snippet di codice minimi ma efficaci.
L’obiettivo non è solo ridurre il rumore, ma calibrare pesi e soglie per bilanciare pertinenza e pluralità. Un feed etico valorizza la scelta consapevole: fonti molteplici, filtri misurabili, logica di ranking auditabile. Di seguito, un percorso in quattro passaggi con esempi pratici e componenti riusabili.
1) Aggregare le fonti: RSS come spina dorsale
Gli RSS offrono controllo granulare e interoperabilità. Si parte con un file OPML per importare rapidamente decine di feed divisi per categorie (politica, scienza, cultura, tecnologia). Un aggregatore come Miniflux o FreshRSS consente filtraggio server-side e un’API pulita per l’elaborazione successiva. L’idea è separare raccolta e classificazione il primo livello normalizza i dati, il secondo li ordina e li valuta.
Struttura minima di un OPML di partenza, pronta per l’import in qualsiasi lettore compatibile:
<opml version="2.0">
<head><title>Feed etico base</title></head>
<body>
<outline text="Tecnologia">
<outline type="rss" text="Fonte A" xmlUrl="https:///tech/rss" />
<outline type="rss" text="Fonte B" xmlUrl="https:///it/rss" />
</outline>
<outline text="Scienza">
<outline type="rss" text="Fonte C" xmlUrl="https:///science.xml" />
</outline>
</body>
</opml>
Lato server, FreshRSS espone una API JSON. Questo permette di estrarre titoli, riassunti e link per alimentarli in un classificatore. L’API funge da punto unico d’ingresso, semplificando cache, quote e log.
2) Filtri bayesiani: segnali, pesi e soglie
Un filtro Naive Bayes offre un baseline robusto per stimare la pertinenza degli articoli. Si etichetta un piccolo set di training (pertinente/non pertinente, o più classi tematiche) e si applicano pesi per promuovere termini rari e penalizzare ripetizioni. Con scikit-learn bastano poche righe per ottenere uno score e fissare una soglia di pubblicazione nel feed finale.
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.naive_bayes import MultinomialNB
from sklearn.pipeline import make_pipeline
model = make_pipeline(TfidfVectorizer(ngram_range=(1,2), min_df=2),
MultinomialNB(alpha=0.5))
# X_text: titoli+riassunti, y: etichette 0/1
model.fit(X_text_train, y_train)
proba = model.predict_proba(X_text_new)[:,1]
# soglia di pubblicazione
THRESHOLD = 0.62
mask = proba >= THRESHOLD
Lo score bayesiano va integrato con altri segnali: freschezza, lunghezza, reputazione della fonte. Un semplice ranking lineare può sommare questi contributi con pesi espliciti. Valori consigliati per iniziare: 0,6 al modello, 0,3 alla diversità di fonte, 0,1 alla novità. La soglia regola quantità/qualità; si alza se il feed diventa rumoroso, si abbassa per ampliare la scoperta.
3) Liste federate: aprire finestre sul Fediverse
Le liste federate (ad esempio su istanze Mastodon) ampliano l’orizzonte oltre i media tradizionali. Tramite l’API pubblica si possono estrarre i post di liste tematiche, convertirli in pseudo-feed e farli passare nello stesso pipeline bayesiano. Questo integra voci professionali, comunità e ricercatori, riducendo l’effetto bolla tipico dei soli siti noti.
# Esempio di fetch (pseudo)
GET https://mastodon.instance/api/v1/lists/<LIST_ID>/statuses
# Normalizzare: titolo = primi 120 char, link = url del post, fonte = account
Per garantire trasparenza, ogni elemento importato dalla rete federata include fonte e lista di provenienza. Un log giornaliero registra numero di post per istanza e tasso di accettazione dopo il filtro, utile per audit e ribilanciamento periodico dei pesi.
4) Diversificazione attiva: pesi e quote anti-bolla
Per ridurre le echo chamber serve una regola chiara: limitare il dominio dominante e garantire un mix minimo di prospettive. Si applica una quota per dominio e per categoria a ogni batch, penalizzando con un malus gli item che provengono da fonti già sovra-rappresentate. La penalità si somma al ranking, spingendo in alto contenuti equivalenti ma provenienti da fonti diverse.
# Ranking lineare con diversità
def score(item):
s_bayes = item.proba
s_recency = decay(item.age_hours)
s_div = diversity_bonus(item.domain, item.topic)
return 0.6*s_bayes + 0.3*s_div + 0.1*s_recency
# Malus per eccesso di dominio
def diversity_bonus(domain, topic):
if count_in_batch(domain) > QUOTA_DOMAIN:
return -0.25
if count_in_batch(topic) < MIN_TOPIC_MIX:
return +0.15
return 0.0
Due accorgimenti pratici: 1) introdurre una piccola quota di esplorazione (ad esempio il 10% di item con score sotto soglia ma di fonti rare); 2) applicare de-dup semantico su titolo e URL per evitare ripetizioni tra syndication e comunicati ripubblicati.
5) Tool open-source e orchestrazione replicabile
Una pipeline minima e ripetibile si può ottenere con docker-compose un servizio per l’aggregazione RSS, uno per il classificatore, uno per l’API/renderer. La persistenza su PostgreSQL facilita query e audit. Cron job quotidiani rieseguono il training con feedback esplicito (click, salvataggi) per aggiornare il modello in modo controllato.
version: '3.9'
services:
freshrss:
image: freshrss/freshrss
ports: ["8080:80"]
classifier:
build:./classifier
api:
build:./api
environment:
- THRESHOLD=0.62
- WEIGHTS=0.6,0.3,0.1
Per l’interfaccia, un semplice frontend statico consuma l’API e mostra badge di provenienza, motivazioni del ranking e pulsanti di feedback. Pubblicare su GitHub o piattaforme equivalenti con istruzioni, seed OPML e set di etichette iniziali rende la soluzione replicabile e verificabile da chiunque.
6) Valutare e calibrare: metriche trasparenti
Un feed etico va misurato con metriche che uniscano rilevanza e pluralità. Oltre al CTR, si monitora l’Indice di diversità di fonte (es. entropia dei domini), la Copertura tematica per categoria e la Stabilità del ranking al variare delle soglie. Un report settimanale confronta l’attuale configurazione con una baseline casuale, per quantificare il guadagno di qualità senza sacrificare la varietà.
Regola operativa: quando l’entropia di dominio cala sotto una soglia prefissata, si aumenta il peso della diversità o si amplia il set di RSS e liste federate. Quando il rumore cresce, si alza la soglia bayesiana di pochi punti e si rinsalda il de-dup. Iterazioni piccole e frequenti migliorano stabilità e comprensibilità dell’intero sistema.



