top of page
Search

Detección de "FAKE NEWS" mediante Procesamiento de Lenguaje Natural y modelos de Machine Learning

  • Writer: Antonio Romero Camacho
    Antonio Romero Camacho
  • Oct 19, 2020
  • 8 min read

Por primera vez en la historia de la red social, Twitter etiquetó en Mayo de 2020 los tweets de Donald Trump como 'fake news', al twitear que el voto por correo era fraudulento.


En concreto, el presidente de los Estados Unidos hablaba en esos tweets sobre el robo y la falsificación del voto por correo. Además, no dudaba en atacar abiertamente la iniciativa del gobernador de California de permitir a todos sus electores el uso del voto por correo, criticando que , según él, "No hay forma de que las papeletas por correo sean nada menos que sustancialmente fraudulentas. Los buzones serán robados, las papeletas serán falsificadas e incluso impresas ilegalmente y firmadas de manera fraudulenta".


De inmediato la red social aplicó su nueva política de verificación de afirmaciones sobre los mensajes de Trump acerca del voto por correo. Fue entonces cuando Twitter respondió, poniéndole una etiqueta azul debajo de ambas publicaciones, la cual dice "Conoce los hechos sobre las papeletas de voto por correo". Este "warning" pretende guiar a los usuarios a una página donde hay noticias, artículos verificados e informes sobre el voto por correo emitidos por varios medios como CNN o el Washington Post.

Figure 1. Tweets de Donald Trump clasificados como "FAKE NEWS" por Twitter

Según dijo Twitter en un comunicado de prensa, en esos tweets "Trump hace una afirmación sin fundamento sobre que las tarjetas de voto por correo conducirán a un fraude electoral". Además, instó a los lectores a verificar la información sin dejarse llevar por lo dicho por el mandatario.


Desinformación y lucha contra las noticias falsas


La difusión de desinformación, en especial de noticias e informaciones falsas de dudosa veracidad no es algo nuevo. Sin embargo, la nuevas plataformas digitales, internet y las redes sociales en el contexto actual son el escenario perfecto para difundir masivamente contenidos que puedan tener algunos de los siguientes impactos:


- Daño a la reputación de personas, organizaciones o naciones

- Influencia en la opinión pública

- Respuesta desproporcionada y afectación a la integridad de personas


En Estados Unidos, con el 67% de la población norteamericana adulta recibiendo las noticias a través de las redes sociales y la propagación de las "Fake News", crece la presión sobre las empresas tecnológicas para que verifiquen la autenticidad del contenido publicado por los usuarios en sus plataformas.


Es por esto que desde Octubre 2018 empresas como Facebook, Google y Twitter pusieron en marcha un código de buenas prácticas de carácter autorregulador en materia de desinformación. Por ejemplo, Facebook cuenta con equipos de verificación e Inteligencia Artificial especializados en identificar noticias falsas. Cuando el verificador de información califica el contenido como falso, este aparecerá más abajo en la sección de noticias con el fin de reducir su visibilidad.


Figura 2. Facebook, Google y Twitter luchan contra la desinformación en las redes

Caso de Estudio: Procesamiento de Lenguaje Natural y Machine Learning como herramientas para combatir la desinformación


Introducción

Este post presenta la aplicación de técnicas de pre-procesado y extracción de características a un dataset compuesto de noticias falsas y verdaderas, escritas en inglés. Los datos se obtuvieron en el portal Kaggle, donde se pueden descargar dos datasets independientes: uno con noticias falsas (Fake.csv) y otro con noticias reales (True.csv).


Este artículo muestra cómo usar la información extraída de los titulares de las noticias a través de herramientas de procesado de lenguaje natural (Natural Language Processing, NLP) como entrada a distintos modelos de Machine Learning. El fin último es entrenar diferentes modelos de aprendizaje automático supervisado que determinen la veracidad de un conjunto de noticias independientes de las utilizadas para el entrenamiento de los modelos de aprendizaje automático. Finalmente se evaluarán las métricas de acierto para determinar qué modelos proporcionan los mejores resultados para resolver éste problema.


Preprocesado con NLTK

La limpieza y preparación de los datos es el primer paso y el más crítico en cualquier proyecto de Inteligencia Artificial y Machine Learning. En esta publicación se presenta un pre-procesamiento con Python usando la biblioteca NLTK.

Figura 3. Aspecto de los registros en los datasets True.csv y Fake.csv

Comenzamos leyendo los datos de los datasets descargados de Kaggle con la biblioteca pandas. Utilizaremos los titulares de las noticias (columna "title") como fuente de información de la que aprenderán los modelos de Machine Learning. Los registros de los datasets Fake.csv y True.csv se juntaron en la variable X.

Figura 4. Lectura de datos y selección de columnas

Después, se creo una serie de pandas que agrupara las etiquetas ("FAKE" para titulares falsos y "REAL" para los que son reales) que harán que el aprendizaje sea supervisado.

Figura 5. Creacción de serie de pandas para etiquetar los datos

Antes de comenzar a extraer características para alimentar a los modelos, realizaremos el pre-procesado sobre los dos subconjuntos de titulares. Para ello comenzaremos tokenizándolos en palabras. Tokenizar consiste en partir las frase en palabras, o lo que es lo mismo, generar una lista de palabras a partir de una frase. El participando en palabras se llevó a cabo mediante la función word_tokenize de la biblioteca NLTK.

Figura 6. Tokenización con NLTK word_tokenize

Tras esta primera operación eliminamos cualquier token que sea un que sea un signo de puntuación (.,?!), símbolo (@#£‰) y números (0 - 9).

Figura 7. Eliminación de números, signos de puntuación y símbolos

Continuamos eliminando las stopwords. Stopwords son aquellas palabras que no aportan información a la frase. Por ejemplo en inglés algunas de las stopwords son: I, when, only, all, again, on, in, out, ... . La biblioteca NLTK incluye la función stopwords para proceder al eliminado automático de esas palabras, que las tiene clasificadas dentro de un diccionario.

Figura 8. Eliminación de stopwords

Una vez eliminadas las palabras que no aportan información, los signos de puntuación, los símbolos y los números se puede hacer un primer análisis de los subconjuntos de datos Fake y True. Para ello se calculan, en base a su frecuencia, las 20 palabras más repetidas dentro de cada dataset. Los resultados se representarán en histogramas.

Figura 9. Top 20 de las palabras más repetidas en cada dataset

Estas son las 20 palabras más frecuentes en los titulares de las noticias reales del dataset:

Figura 10. Top 20 palabras más frecuentes en titulares reales

Estas son las 20 palabras más frecuentes en los titulares de las noticias falsas del dataset:

Figura 11. Top 20 palabras más frecuentes en titulares falsos

Es reseñable que en el caso de las noticias reales, la segunda palabra más repetidas es "says". Sin embargo, no es así en el caso de las noticias falsas. En el caso de las noticias falsas parece que entre las palabras más repetidas se encuentras adjetivos relacionados con el color de piel como "black", "white" o relativos a la religión como "muslim"


Este flujo de procesado lo vamos a aplicar sobre la variable X, que contenía los titulares tanto de las noticias verdaderas como de las falsas. Cómo último paso, antes de partir la base de datos en los subconjuntos de training y test, se llevó a cabo la legalización de los tokens.


Figura 12. Flujo de preparación de los datos antes de aplicar algoritmos de Machine Learning

A pesar de que ya tenemos una lista reducida de palabras, podemos simplificarla aun más. Cuando se trabaja con textos siempre encontramos que hay varias palabras diferentes en representación de una misma palabra. En inglés am, is, are son distintas formas del presente simple del verbo to be. A la hora de realizar análisis del lenguaje es interesante poder obviar las diferencias y juntar todas estas variantes en un mismo término. Y eso es precisamente lo que hace la lematización: relaciona una palabra flexionada o derivada con su forma canónica o lema (forma que tienen las palabras cuando las buscas en el diccionario). Para este propósito, la biblioteca NLTK pone a disposición del usuario la herramienta WordNetLemmatizer.

Figura 13. Lematización con WordNetLemmatizer

Subconjuntos de Training y Test

El método train_test_split de Scikit-Learn permite dividir fácilmente un conjunto de datos dos subconjuntos aleatorios con un tamaño dado. En este caso se estableció que el conjunto de test estuviera formado por un 20% de los registros del dataset y el de training por el 80% restante.

Figura 14. Subconjuntos de datos de Training y Test

Extracción de características

Las palabras deben codificarse como números enteros o valores de coma flotante para su uso como entrada a un algoritmo de aprendizaje automático. Es a esto a lo que se le llama extracción de características (o vectorización). La biblioteca scikit-learn ofrece herramientas fáciles de usar para realizar la extracción de características de datos de texto.


1. Count Vectorizer

El método CountVectorizer proporciona una manera simple de tokenizar una colección de

documentos de texto y construir un vocabulario de palabras conocidas. Genera un vector

codificado de la longitud del vocabulario, cuyas palabras van a acompañadas de un

número entero que indica el número de veces que cada palabra apareció en el documento.


Figura 15. Ejemplo de extracción de características con Scikit-Learn CountVectorizer

2. TfidfVectorizer Vectorizer

El recuento de palabras es un buen punto de partida, pero a veces presenta ciertas

limitaciones. Una alternativa es calcular las frecuencias de las palabras, y el método más

popular es el llamado TF-IDF. Este es un acrónimo que significa Frecuencia de Término –

Frecuencia Inversa de Documento que son los componentes de las puntuaciones resultantes

asignadas a cada palabra dentro del vocabulario. Las puntuaciones se normalizan a valores

entre 0 y 1.

Figura 16. Vocabulario de TfidfVectorizer_vectorizer y codificación de los dos primeros titulares (índices 0 y 1)

3. Hashing Vectorizer

Los recuentos y las frecuencias pueden ser muy útiles, pero una limitación de estos métodos

es que el vocabulario puede llegar a ser muy amplio. Esto, a su vez, requerirá grandes

vectores para codificar los documentos e impondrá grandes requisitos a la memoria y a los

algoritmos de ralentización. Un trabajo inteligente es usar un hash de palabras para

convertirlas en números enteros. La parte inteligente es que no se requiere vocabulario y se

puede elegir un vector de longitud fija arbitraria. Una desventaja es que el hash es una

función unidireccional, por lo que no hay forma de volver a convertir la codificación en una

palabra (lo que puede no ser importante para muchas tareas de aprendizaje supervisado).

Los valores de los titulares codificados corresponden a recuentos de palabras normalizados

por defecto en el rango de -1 a 1.

Figura 17. Ejemplo de extracción de características con Scikit-Learn HashingVectorizer

Una vez explicada la física detrás de estos codificadores, se muestra la forma de codificar los titulares en cuestión mediante los tres métodos. Durante la realización del caso de estudio, la codificación que mejores resultados proporcionó fue la primera (CountVectorizer). Es por esto que de aquí en adelante, en las fases de entrenamiento y sesteo, se emplearán las variables count_train y count_test.

Figura 18. Extracción de características con Scikit-Learn Vectorizers

Algoritmos de Machine Learning

El problema que estamos tratando de resolver en este post es un problema de clasificación binario, donde las clases a predecir son noticias reales (clase "REAL") o noticias falsas (clase "FAKE").


Se han generado distintos modelos: Multinomial Naïve-Bayes (model1), Regresión Logística (model2), Árboles de Decisión (model3), Support Vector Machine (SVM, model4), Clasificador Preceptrón Multicapa (MLP, model5), Pasive Agresive Classifier (model6), Gaussian Naïve-Bayes (model7) y Random Forest (model8). En la siguiente figura se muestra ordenado de mayor a menor la precisión de los modelos evaluados sobre el subconjunto de test.

Figura 19. Ranking de modelos de clasificación Scikit-Learn

De todos ellos, el que proporcionó los mejores resultados fue Support Vector Machine (modelo 4) con un accuracy del 95.7% sobre el subconjunto de test. A continuación se muestra el código del modelo SVM con el que se ha alcanzado este resultado.

Figura 20. Entrenamiento del modelo SVM con los datos del subconjunto train
Figura 21. Predicción sobre los datos del subconjunto test

Por último, mostramos gráficamente la matriz de confusión de los resultados obtenidos al aplicar el modelo SVM sobre el subconjunto de test con ayuda de la librería seaborn.

Figura 22. Matriz de confusión representada con seaborn

De la matriz de confusión se pueden extraer las siguientes conclusiones:

  • 4553 registros de los 4779 denominados como noticias falsas han sido predichos como noticias falsas (clase 0).

  • 4042 registros de los 4201 denominados como noticias reales han sido predichos como noticias reales (clase 1).

  • 226 registros de los 4779 denominados como noticias falsas han sido mal clasificados como noticias reales.

  • 159 registros de los 4201 denominados como noticias reales han sido mal clasificados como noticias falsas. 

Conclusiones

  • En este post se han utilizado técnicas de Procesado de Lenguaje Natural y Machine Learning de Aprendizaje Supervisado para clasificar noticias en base a ciertas características extraídas de los titulares de las mismas.

  • El objetivo de este post es resolver un problema de clasificación binario (dos clases: noticias reales y falsas).

  • La metodología aquí planteada se ha aplicado a un dataset de libre acceso que consta de 44898 registros.

  • De todos los modelos de clasificación utilizados, el que ha reportado mejores resultados al aplicarlo sobre el subconjunto de test es el modelo Support Vector Machine (SVM).

  • El Modelo SVM ha clasificado 4553 noticias reales y 4042 noticias falsas correctamente. La suma de aciertos es de 8595 aciertos de un total de 8980 registros en el subconjunto de test. Por tanto, la precisión del modelo se estimó en un 95.7%.

Agradecimientos

Agradezco a Kaggle y al propietario de los datos (Clément Risaillon) que hayan puesto a disposición de la comunidad esta bases de datos.


Espero que el tema os resulte interesante. Si tenéis cualquier duda o cuestión relacionada con lo arriba expuesto o en concreto con alguno de los modelos de los que no se ha mostrado el código por simplicidad, por favor poneros en contacto conmigo a través del formulario que encontraréis en la pestaña Contacto.

 
 
 

Comments


bottom of page