Обнаружение фейковых новостей с помощью sci-kit Learn и глубокого обучения

После президентских выборов 2016 года фейковые новости стали обычным термином в лексиконе каждого. Даже самый популярный твит Дональда Трампа посвящен фейковым новостям.

Дезинформация, обычно распространяемая в социальных сетях и традиционных новостных агентствах, по-прежнему широко распространена из-за использования заголовков кликбейтов и поляризующего контента.

Изучая недавние мировые события, мы увидели, насколько новости влияют на нашу жизнь. От понимания того, что происходит вокруг пандемии до движения фондового рынка, я знаю, что сильно полагаюсь на новости, и я уверен, что все остальные тоже. Однако часто бывает трудно отличить статьи с ложной информацией от статей, содержащих реальные, проверенные факты. Учитывая, что такие компании, как Facebook и Twitter, применяют алгоритмы, гарантирующие, что люди получают правильную и правильную информацию в своих лентах, я хотел изучить возможность использования обработки естественного языка и анализа текста для создания классификатора фейковых новостей.

Код для этого анализа можно найти на моем Github.

Источники данных

Используемые данные поступают из двух источников: а) 7 веб-сайтов и
б) Kaggle. Набор данных Kaggle содержит ложные и правдивые новостные статьи за 2015–2018 годы.

Очистка

Помимо набора данных Kaggle, я скопировал статьи со следующих веб-сайтов, чтобы получить больше статей и свежие новости:

Для этого я установил следующие пакеты (feedparser, газета), так как некоторые статьи извлекаются из RSS-каналов основных новостных сайтов. Дополнительный код можно найти на моем Github.

Я получил 24 194 фальшивых новостных статей и 22 506 настоящих новостных статей. Это было идеально, так как это относительно сбалансированный набор данных. После удаления ненужных столбцов, переформатирования и добавления меток ниже показан образец обоих фреймов данных.

Исследовательский анализ

На диаграмме ниже показан период времени, за который были собраны мои новостные статьи. Поскольку для получения последних новостей я скопировал в Интернете дополнительные статьи, помимо тех, что есть в наборе данных Kaggle, в приведенной ниже диаграмме наблюдается резкий пик в апреле 2020 года. Скребок не смог извлечь статьи за период с 2018 по 2020 год.

Из статей в наборе данных Kaggle (2015–2018 гг.) Я могу отметить резкое увеличение количества фейковых новостей в январе 2016 года. Я предполагаю, что это результат начала года президентских выборов в США. Также наблюдается всплеск достоверных новостей в ноябре 2016 года, когда объявляются результаты выборов.

Поскольку в этом проекте я использую текстовый анализ, расхождения в датах не будут проблемой. Цель использования статей из двух совершенно разных периодов новостей (например, в 2016 году преобладают новости о выборах, в 2020 году преобладают новости о коронавирусе) состоит в том, чтобы иметь разнообразный набор слов для обучения моего классификатора работе с .

Текст статьи

Длина статьи может сыграть роль в определении того, является ли она фальшивкой или настоящей.

Фейковые новостные статьи в среднем длиннее на 30 слов. Также имеется большее различие в их длине, о чем свидетельствует более высокое стандартное отклонение и большее количество статей на правом хвосте. Бывают выбросы: некоторые настоящие и фальшивые новостные статьи содержат ›4000 слов.

Интересно, что нет большой разницы в настроениях между фальшивыми новостями и настоящими новостями для статей в этом наборе данных. При использовании функции тональности TextBlob, где -1 означает отрицательное настроение, а 1 означает положительное настроение, средняя тональность составляет 0,055 для реальных новостей и 0,059 для фальшивых новостей. Это также указывает на то, что большинство статей в этом наборе данных нейтральны, что показано в распределении ниже.

Текст заголовка статьи

Длина заголовка также может сыграть роль в определении того, является ли он фальшивым или настоящим.

Текст заголовка следует той же тенденции, что и текст в основной части статей. У фейковых новостей в среднем немного более длинные заголовки. Также имеется большая дисперсия, о чем свидетельствует более высокое стандартное отклонение и более длинный хвост на графике. Заголовки реальных новостей распространяются относительно нормально.

В этом наборе данных у реальных новостей несколько более поляризующие заголовки: средняя тональность фальшивых заголовков составляет 0,003 по сравнению с тональностью заголовков реальных новостей, равной 0,026. Это по-прежнему указывает на преимущественно нейтральные заголовки.

Ниже приведены некоторые примеры поляризующих заголовков. Большинство негативных заголовков сигнализируют о страхе и смерти, а положительные - о надежде и гордости.

Хотя заголовки могут дать интересные и важные результаты, я решил включить только основной текст для классификации. Заголовки намного короче, поэтому для классификации используется меньше слов. Я мог бы объединить заголовки и основной текст, но хотел отточить фокус своего анализа. Еще одним интересным применением этого анализа будет анализ различий в настроениях между фальшивыми и реальными новостями.

Предварительная обработка

Токенизация

Как и в случае с любым текстом, первым шагом является разделение текста тела каждой статьи на токены для получения корпуса. Используя корпус, я могу получить особенности слов. Для токенизации каждой статьи я использовал пакет NLTK, чтобы сделать следующее:

  • Импортированы стоп-слова на английском и арабском языках и добавлены дополнительные слова в список стоп-слов (например, удален CNN, потому что названия газеты не должно быть в корпусе)
  • Разделил каждую статью на токены (удаляет пробелы)
  • Все слова в нижнем регистре
  • Удалены пунктуация и стоп-слова.
  • Удалены числа
  • Лемматизированные (преобразованные в корневую форму) слова
  • Создано н-граммов

После создания корпуса я нашел 20 самых популярных слов в каждом классе статей. Размеры каждого слова масштабируются по частоте (например, trump появляется в 2–3 раза чаще, чем один). Из 20 самых популярных слов в каждом классе 9 совпадают. Кроме того, trump, как и ожидалось, в подавляющем большинстве случаев является самым распространенным словом в каждом корпусе. Учитывая, что большая часть новостей в этом наборе данных относится примерно к годам выборов и коронавирусу, неудивительно, что 20 самых популярных слов почти все имеют политическое значение.

Это верхние n-граммы, обнаруженные после токенизации статей, разделенные на настоящие и фальшивые новости.

Проанализировав эти n-граммы, я закончил тем, что не использовал их в процессе моделирования, потому что 1) время обработки было умножено за счет использования n-граммов поверх одиночных токенов 2) n-граммы были довольно похожи между двумя классами статей и 3) показатели по результатам моделирования (см. ниже) уже были сильными без добавления n-граммов.

TF-IDF

После обработки текста я преобразовал его в функции с помощью Tfidfvectorizer. Этот векторизатор сначала вычисляет частоту термина (TF) - количество раз, когда слово появляется в документе, деленное на общее количество слов в документе. Затем он вычисляет обратную частоту данных (IDF) - журнал количества документов, деленный на количество документов, содержащих слово. Наконец, показатель TF-IDF для слова - это TF x IDF.

После разделения данных на обучающие и тестовые наборы я использовал векторизатор, чтобы сохранить только слова в более чем 10% документов (уменьшает количество функций, чтобы сделать матрицу управляемой. ) и переопределить препроцессор, чтобы в качестве функций использовались только слова, созданные в результате токенизации (см. выше).

Результатом является Матрица условий документа - одна для набора поездов, одна для набора тестов. У меня было 215 слов (функций) с 37 368 статьями в наборе и 9 343 статьями в тестовом наборе. Эти матрицы служат исходными данными для процесса моделирования!

Моделирование: модели машинного обучения

Я подбирал к данным 4 модели машинного обучения, предсказывая, попадает ли каждая статья в одну из двух категорий: фальшивые или правдивые новости. Результаты показаны ниже.

Биномиальная логистическая регрессия

Сначала я начал с базовой регрессии.

Наивный байесовский классификатор

Это очень распространенная модель, используемая для классификации текстов, построенная на теореме Байеса. Поскольку это наивно, предполагается, что каждое слово является независимым - одно слово не влияет на вероятность появления другого слова. Это может быть обратной стороной; например, слова donald и trump будут рассматриваться как не связанные с этим набором данных, если мы знаем, что присутствие donald почти всегда указывает на наличие козыря. Однако классификатор по-прежнему работает хорошо.

Наивный Байес позволяет мне вычислять слова, которые больше всего указывают на то, что они находятся в фейковых новостях, и слова, которые имеют больше всего признаков присутствия в настоящих новостях. Это было сделано путем подсчета количества раз, когда слово появилось во всех статьях внутри класса, а затем деления на общее количество статей в классе.

Такие слова, как Хиллари и видео, по-видимому, наиболее характерны для фейковых новостей. Учитывая характер статей в этом наборе данных и зная, что мы знаем о фейковых новостях, имеет смысл, что большинство статей ориентировано на Хиллари Клинтон (президентские выборы 2016 года подверглись широкой критике за фейковые новостные кампании) и видео (deepfake видео огромная проблема). Популярность видео может быть также вызвана тем фактом, что многие сайты фейковых новостей прикрепляют видео к своим статьям. В реальных новостях используются более общие слова, такие как дни недели, и общие новостные термины, такие как сенат и иностранный.

Машины опорных векторов

Учитывая, что у этой задачи есть два класса, которые могут быть разделены линейным классификатором, машины опорных векторов - еще одна хорошая модель машинного обучения для использования. Я использую линейное ядро ​​.

Случайный лес

Затем я обучил случайный лес, используя GridSearch для настройки гиперпараметров. Я остановился на max_depth 60 с помощью 200 оценок.

Ложные срабатывания обозначают неверно классифицированные настоящие новости, а ложноотрицательные - неверно классифицированные фальшивые новости. В этом анализе ложноотрицательные результаты вызывают большее беспокойство, поскольку мы не хотим, чтобы читатель полагал, что поддельная статья предоставляет им реальную и точную информацию.

Из этих моделей Случайный лес работает лучше всего, с наивысшей точностью и наименьшим количеством ложноотрицательных результатов. Машины опорных векторов (SVM) и биномиальная логистическая регрессия имеют одинаковую точность и ложноотрицательные результаты. Кроме того, их точность, отзывчивость и оценка F1 абсолютно одинаковы. Поэтому, основываясь на AUC, я бы рекомендовал модель логистической регрессии вместо SVM. Наивный байесовский метод работает хуже всего. Возможной причиной может быть обратная сторона, о которой я говорил выше - поскольку я не использовал биграммы и триграммы из-за проблем с памятью, многие зависимые слова не распознавались.

Важность функций из модели случайного леса показана ниже.

Хотя Random Forest работает хорошо, глубокое обучение может работать лучше.

Моделирование: нейронная сеть BERT (представления двунаправленного кодера из трансформаторов)

Это нейронная сеть, выпущенная Google - BERT стала активна совсем недавно, в 2019 году. Более подробную информацию можно найти здесь. Это метод, который использует предварительно обученные модели глубокого обучения, которые могут быть загружены пользователем (мной) для двух целей: 1) извлечения функций из текстовых данных (аналогично методу TF-IDF, который я использовал. выше) или 2) настроить существующую модель для получения прогнозов на основе текстовых данных. Поскольку я уже извлек функции, я сосредоточусь на втором варианте использования BERT. Я изменяю и настраиваю BERT для создания классификатора.

Так зачем использовать BERT вместо других форм глубокого обучения (например, BiLSTM, другой текстовой модели или CNN)?

  1. BERT можно развивать быстрее, поскольку нижние уровни нейронной сети уже обучены. Все, что мне нужно было сделать, это настроить их. Кроме того, рекомендуется только 2–4 эпохи обучения. Это намного меньше времени и эпох, необходимых для обучения других моделей!
  2. Для построения модели глубокого обучения с нуля обычно требуется большой набор данных. Веса BERT предварительно обучены, поэтому мой относительно небольшой набор данных работает.
  3. BERT доказал результаты простой тонкой настройки. Спасибо, Google 😀

Я использовал pytorch и библиотеку transformers в качестве интерфейса для запуска BERT. Я также запустил предварительно обученную модель BertForSequenceClassification, одну из нескольких предварительно обученных моделей в библиотеке BERT. Эта модель имеет линейный слой поверх объединенного вывода, который используется для классификации.

Я разделил данные на новые наборы проверочных проверок из-за спецификаций форматирования данных и повторно токенизировал статьи с помощью BertTokenizer. Я не использовал исходную токенизацию, которую я выполнил, потому что: 1) BERT имеет особый словарь, который нельзя изменить, и 2) BERT имеет особый способ обработки слов, которых нет в его словаре.

Максимальная длина статьи в BERT - 512 токенов. Однако у меня не хватало памяти, когда я увеличивал количество токенов (или мне пришлось значительно уменьшить размер пакета, что привело к очень долгому времени выполнения). В итоге я остановился на 64 токена на статью, так как получал довольно хорошие результаты.

Я также использовал оптимизатор Adam и планировщик скорости обучения, чтобы снизить скорость обучения по мере увеличения эпох обучения. Планировщик гарантирует, что модель не сойдется в неоптимальном решении и не застрянет. Обучение модели с batch_size из 16 и 4 эпохи заняло ~ 36 минут.

Как показано выше, модель отлично работает на проверочном наборе с точностью 99%. Я решил использовать для оценки 4 эпохи.

Результаты модели BERT просто фантастические! Модель имеет точность 99,8% и показывает значительное сокращение ложноположительных и ложноотрицательных результатов по сравнению с любой из моделей машинного обучения. Матрица неточностей приведена ниже.

Выводы

Модель BERT работает лучше всего, и я буду использовать ее в качестве последнего классификатора. Преимущества использования этой модели включают встроенный токенизатор, который избавляет от необходимости выполнять предварительную обработку текста вручную. Кроме того, BERT имеет очень обширный словарный запас и глубокую сеть слоев.

Однако BERT требует гораздо больших вычислительных ресурсов, чем модели машинного обучения, для которых требуется графический процессор. Кроме того, количество токенов на статью ограничено 512, в то время как модели машинного обучения можно масштабировать в зависимости от доступной памяти или использования облака. Следовательно, в зависимости от доступности ресурсов можно также использовать случайный лес для этого набора данных.

Вызовы

Это был мой первый раз, когда я завершал проект на основе НЛП, в котором использовалось глубокое обучение. Я думаю, что анализ текста - это особенно интересное приложение машинного обучения, поскольку оно позволяет компьютерам разбираться в нечисловых данных. Особенно интересным приложением является то, как нетрадиционные данные клиента (геолокация, социальные сети и т. Д.) Могут быть проанализированы для определения их кредитоспособности, когда у них изначально небольшая кредитная история.

Я много узнал о предварительной обработке текста. Сначала мне было сложно определить лучший пакет токенизации для использования - я начал с spacy, но понял, что NLTK был лучший способ получить желаемый результат. Я также экспериментировал с различными векторизаторами, прежде чем остановился на TFidfvectorizer.

С точки зрения построения моделей обучение BERT было сложной задачей. В какой-то момент я также столкнулся с проблемой прямого распространения, которую можно было исправить, только если я использовал записные книжки Jupyter, но мой проект был построен на Google Colab. Поэтому я пробовал несколько методов обучения, комбинируя ресурсы из разных руководств. Тем не менее, у меня часто не хватало памяти графического процессора, и мне приходилось начинать заново. Обеспечение данных в правильном формате и понимание того, где настроить существующую модель BERT, также было препятствием, которое мне пришлось преодолеть.

Следующие шаги

Мой анализ можно было улучшить следующими способами:

  • Большой набор данных за более длительный период времени
  • Выполнение скрытого распределения Дирихле (LDA) для данных для определения тем
  • Использование биграмм и триграмм при обучении моделей машинного обучения
  • Включая заголовки, поскольку они могут предоставить ценную информацию о типе статьи.
  • Увеличение количества токенов, используемых для каждой статьи в BERT
  • Пробуем другие модели глубокого обучения НЛП
  • Включение настроений как фактора прогноза

Спасибо за прочтение! 😸

Ознакомьтесь с кодом здесь.