René Cano
Todos los proyectos

Núm. 9

FakeNewsDetector AI

Clasificador de noticias con DistilBERT y heurísticas

Mi rol
Autor único
Periodo
Mar 2026

El problema

La desinformación más difícil de detectar no es el clickbait evidente, sino el texto que imita el lenguaje de la ciencia: "investigadores de una universidad europea", "el estudio aún no se publica". Un clasificador entrenado solo con noticias falsas obvias tiende a marcar esos textos como confiables.

Qué construí

Lo hice solo y lo publiqué el 30 de marzo de 2026.

  • La preparación de datos: 5,000 artículos por clase del dataset ISOT de Kaggle (Fake.csv y True.csv), con título y cuerpo unidos y recortados a 1,800 caracteres.
  • El fine-tune de DistilBERT con el Trainer de Hugging Face, como clasificador de 2 clases, REAL y FAKE, con early stopping.
  • Reglas heurísticas: patrones de pseudociencia (protección total, estudio sin publicar, universidad sin nombre), señales de alarma y señales de fuente verificable.
  • La fusión del modelo con las reglas en 3 etiquetas: Confiable, Dudosa y Falsa. Dudosa aparece cuando el modelo no separa bien las 2 clases, y 2 o más patrones de pseudociencia fuerzan Falsa.
  • Una interfaz Gradio que explica el veredicto. Si no hay modelo local, usa modelos públicos de Hugging Face y, como último recurso, solo las reglas.

Arquitectura

Diagrama del flujo: el dataset ISOT se prepara con 5,000 artículos por clase y entrena un DistilBERT de 2 clases, REAL y FAKE; en la app, el texto de la noticia pasa por limpieza y detección de señales y de patrones de pseudociencia; la salida del modelo se fusiona con esas reglas, con modelos públicos o solo reglas como respaldo, y la interfaz Gradio muestra Confiable, Dudosa o Falsa.

Resultados

No publico una cifra de exactitud. El README reporta una exactitud muy alta, pero no la considero válida por dos razones que detallo abajo: se mide sobre el mismo conjunto con el que se eligió el modelo, y el dataset le da pistas de la respuesta. Una evaluación honesta necesita un conjunto de prueba separado y limpio, y está pendiente.

Límites conocidos

  • El README dice que el modelo es RoBERTa, pero train.py ajusta DistilBERT. El README está mal.
  • El conjunto de evaluación es el mismo que decide el early stopping y el mejor checkpoint, así que la métrica es optimista.
  • En ISOT las noticias reales llevan el encabezado "(Reuters)" y el código no lo quita: el modelo puede aprender a reconocer la agencia en lugar de la veracidad.
  • El modelo entrenado no está en el repositorio, y el README cita un notebook y un CSV de ejemplos de pseudociencia que tampoco están.
  • Uno de los modelos de respaldo es de análisis de sentimiento (SST-2), no de noticias.
  • El dataset es solo en inglés y no hay tests.

Links