Contesto e obiettivo
Il problema delle fake news è diventato una minaccia significativa nel mondo moderno, alimentato dalla crescente diffusione dei social media e dalla velocità con cui le informazioni possono viaggiare. Questo fenomeno ha portato a disinformazione diffusa e ha creato problemi nella società e nelle istituzioni.
Ho proposto questa soluzione a un’importante ente regolatorio del settore media e informazione, che era alla ricerca di strumenti efficaci per contrastare la disinformazione. La mia proposta consisteva nello sviluppo di un plug-in per Chrome in grado di identificare se una notizia è falsa o veritiera. Il sistema avrebbe avuto lo scopo di proteggere gli utenti dalla disinformazione, migliorando la qualità delle informazioni online.
Soluzione implementata
Per affrontare questa sfida, ho sviluppato un modello di Machine Learning utilizzando tecniche di Natural Language Processing (NLP) per analizzare e classificare le notizie come vere o false. Il modello è stato integrato in un plug-in per il browser Chrome, offrendo agli utenti un’indicazione in tempo reale sulla veridicità delle notizie che stanno leggendo.
Tecnologie e strumenti utilizzati
- Linguaggio di Programmazione: Python
- Librerie: scikit-learn, pandas, numpy, nltk
- Strumenti di Sviluppo: Jupyter Notebook per lo sviluppo e la sperimentazione del modello; pickle per la serializzazione del modello addestrato
- Dataset: Due raccolte di notizie fornite, una contenente solo notizie false e l’altra solo notizie vere
- Modello ML: Naive Bayes per la classificazione del testo
- Estrazione delle feature: TF-IDF (Term Frequency-Inverse Document Frequency)
Processo di sviluppo
1. Analisi eplorativa dei dati
Ho iniziato con un’analisi approfondita dei dataset per comprendere le caratteristiche distintive delle notizie vere e false. Alcune delle domande chiave analizzate:
- Le fake news sono più frequenti in una determinata categoria?
- Esistono argomenti che sono più soggetti alle fake news?
- I titoli delle fake news presentano dei pattern ricorrenti?
2. Preprocessing dei dati
Ho effettuato diversi passaggi di pulizia del testo:
- Rimozione di punteggiatura e stop words
- Conversione del testo in minuscolo
- Tokenizzazione e lemmatizzazione per uniformare le parole
3. Estrazione delle caratteristiche
Per convertire il testo in una rappresentazione numerica utilizzabile dal modello, ho adottato la tecnica TF-IDF, che misura l’importanza delle parole nei documenti.
from sklearn.feature_extraction.text import TfidfVectorizer
vectorizer = TfidfVectorizer(stop_words="english", max_df=0.7)
X_train_tfidf = vectorizer.fit_transform(X_train)
X_test_tfidf = vectorizer.transform(X_test)
4. Addestramento del modello
Il modello è stato addestrato con il classificatore Naive Bayes, noto per la sua efficacia nella classificazione di testi.
from sklearn.naive_bayes import MultinomialNB
from sklearn.metrics import accuracy_score
classifier = MultinomialNB()
classifier.fit(X_train_tfidf, y_train)
predictions = classifier.predict(X_test_tfidf)
accuracy = accuracy_score(y_test, predictions)
print(f"Accuracy del modello: {accuracy:.2f}")
L’accuratezza del modello ha superato il 90%, dimostrando un’elevata capacità di distinguere notizie vere da fake news.
5. Validazione e ottimizzazione
Ho valutato il modello con metriche standard come accuracy, precision, recall e F1-score, migliorando le prestazioni con tecniche di ottimizzazione.
from sklearn.metrics import classification_report
print(classification_report(y_test, predictions))
6. Esportazione del modello
Una volta ottenuti risultati soddisfacenti, ho salvato il modello in formato pickle per l’integrazione nel plug-in Chrome.
import pickle
with open("fake_news_model.pkl", "wb") as model_file:
pickle.dump(classifier, model_file)
Integrazione nel Plug-in Chrome
Il plug-in per Chrome utilizza JavaScript per inviare il testo della notizia a un server Python Flask, che carica il modello ML e restituisce un’indicazione visiva all’utente.
Esempio di chiamata API nel plug-in:
fetch("http://localhost:5000/predict", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({ text: newsText })
})
.then(response => response.json())
.then(data => {
if (data.is_fake) {
alert("⚠️ Questa notizia potrebbe essere falsa!");
} else {
alert("✅ Notizia verificata!");
}
});
Mentre il backend Flask elabora la richiesta:
from flask import Flask, request, jsonify
import pickle
app = Flask(__name__)
with open("fake_news_model.pkl", "rb") as model_file:
model = pickle.load(model_file)
@app.route("/predict", methods=["POST"])
def predict():
data = request.json["text"]
vectorized_text = vectorizer.transform([data])
prediction = model.predict(vectorized_text)[0]
return jsonify({"is_fake": bool(prediction)})
if __name__ == "__main__":
app.run(port=5000)
Risultati e benefici
Il mio sistema di rilevamento delle fake news ha avuto un impatto significativo:
- Riduzione della disinformazione: aiuta gli utenti a identificare tempestivamente notizie non attendibili.
- Miglioramento della fiducia nei media: fornisce strumenti tecnologici avanzati per contrastare il problema della disinformazione.
- Supporto decisionale: utenti e istituzioni possono prendere decisioni basate su informazioni più affidabili.
Conclusione e futuri miglioramenti
Questo mio progetto rappresenta un passo importante verso la lotta alla disinformazione online. Alcune possibili evoluzioni future che sto considerando includono:
- Utilizzo di modelli avanzati come BERT per migliorare l’accuratezza della classificazione.
- Estensione del sistema per analizzare anche immagini e video, oltre ai testi.
- Creazione di una dashboard per monitorare le tendenze delle fake news nel tempo.