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

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

Логистическая регрессия

Прежде чем погрузиться в код, давайте пересмотрим концепцию логистической регрессии. Логистическая регрессия — это метод статистического анализа для прогнозирования бинарного результата, такого как «да» или «нет» (бинарная классификация), на основе предыдущих наблюдений за набором данных. Это контролируемый статистический метод для определения вероятности зависимой переменной. Показанный ниже график представляет собой сигмоидальную функцию, которую мы также называем логитом. Эта функция преобразует вероятности в двоичные значения, которые в дальнейшем можно использовать для прогнозов.

Согласно этому графику, если мы получаем значение вероятности меньше 0,5, то оно считается относящимся к классу 0, а если значение более чем 0,5, то он будет частью класса 1.

Если вы хотите более подробно изучить эту концепцию, вы можете проверить эту ссылку или даже посмотреть это видео. сильный>»!

Код

Теперь, наконец, начав с нашего кода, вы можете написать его либо в Jupyter Notebook, либо в Google Colab, либо на любой другой платформе, которая вам нравится.

Также загрузите набор данных здесь. (Я использовал только обучающий набор данных, так что вы также можете скачать его сам.)

Импорт библиотек/зависимостей

import numpy as np
import pandas as pd
import re
import nltk
from nltk.corpus import stopwords
from nltk.stem.porter import PorterStemmer
import sklearn
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score

Освещение важности каждой библиотеки/модуля/функции, которую мы импортировали:

  • NumPy: это универсальный пакет для обработки массивов и матриц.
  • Pandas: позволяет нам выполнять различные операции с наборами данных.
  • re : это встроенный пакет RegEx, который можно использовать для работы с регулярными выражениями.
  • NLTK: это набор библиотек и программ для символической и статистической обработки естественного языка (NLP).
  • nltk.corpus:Этот пакет определяет набор классов чтения корпусов, которые можно использовать для доступа к содержимому различных наборов корпусов.
  • стоп-слова. Слова, которые обычно отфильтровываются перед обработкой естественного языка, называются стоп-словами. На самом деле это самые распространенные слова в любом языке (такие как артикли, предлоги, местоимения, союзы и т. д.), и они не добавляют много информации к тексту. (Пример-и, из, есть и т. д.)
  • PorterStemmer: пакет, помогающий нам определять корни слов. (Подробнее о стемминге в разделе «Предварительная обработка данных»)
  • Sci-kit Learn (sklearn): он предоставляет набор эффективных инструментов для машинного обучения и статистического моделирования, включая классификацию, регрессию, кластеризацию и уменьшение размерности, через интерфейс согласованности в Python.
  • feature_extraction.text: используется для извлечения функций в формате, поддерживаемом алгоритмами машинного обучения, из наборов данных, состоящих из текста.
  • TfidfVectorizer: преобразует текст в векторы признаков, которые можно использовать в качестве входных данных для оценщика. (Подробнее о TfidfVectorizer в разделе Предварительная обработка данных)
  • train_test_split: это функция выбора модели Sklearn для разделения массивов данных на два подмножества — для данных обучения и для данных тестирования.
  • Логистическая регрессия: довольно понятная часть кода, используемая для импорта классификатора логистической регрессии.
  • Показатели и Показатель точности: чтобы импортировать показатель классификации точности из модуля показателей.

Загрузка набора данных

Надеюсь, вы уже загрузили набор данных. Теперь вы можете загрузить набор данных как,

data = pd.read_csv('fakenews.csv')
data.head()

Здесь я переименовал свой файл csv в fakenews.csv и сохранил его в той же папке, что и блокнот Jupyter. Если вы сохранили свой набор данных и блокнот Jupyter в 2 разных папках, вы можете добавить путь к файлу набора данных в качестве префикса в коде, например:

data = pd.read_csv('/Users/chandana/Documents/fakenews.csv')

(Это путь к macbook, поэтому, если вы используете Windows или любую другую ОС, путь может выглядеть иначе.)

Фрейм данных будет выглядеть так,

Здесь Label указывает, является ли новостная статья фальшивой или нет, 0 означает, что она настоящая, а 1 означает, что это фейк.

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

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

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

data.shape

Это дает нам (20800, 5), что означает, что у нас есть 20800 записей и 5 столбцов (функций).

Проверка общего количества пропущенных значений в каждом из столбцов.

data.isnull().sum()  

Из этого мы видим, что нам придется удалить как минимум 1957 строк, чтобы удалить все нулевые значения, поэтому было бы лучше заполнить эти нулевые значения пустой строкой. Для этого мы можем использовать fillna.

df1 = data.fillna('')

После этого шага у нас больше нет отсутствующих точек данных, вы можете проверить это с помощью методаisnull().sum()

Теперь мы попробуем сократить эти 5 столбцов до 2, так как нам будет легче обучать модель. Для этого мы объединим столбцы title и author в один, назвав его content. Мы можем опустить остальные столбцы, так как они не сильно влияют на определение того, фальшивая статья или нет. На этом этапе у нас останется 2 столбца — content и label.

df1['content'] = df1['author'] + ' ' + df1['title']

Вывод

Теперь, переходя к части основы, это в основном процесс сокращения слова до его основы слова, которая прикрепляется к суффиксам и префиксам или к корням слов.

Основа слов может заканчиваться или не заканчиваться корневым словом со значением, например, в этом примере chang не означает изменение или что-то еще на самом деле. Чтобы корневое слово имело значение, мы используем лемматизацию. Но для этого проекта стемминг работает просто отлично.

stemmer = PorterStemmer()

Мы создаем для нас новый стеммер Porter, чтобы мы могли использовать функцию без явного ввода PorterStemmer() каждый раз.

def stemming(content):
    stemmed_content = re.sub('[^a-zA-Z]',' ', content) #1
    stemmed_content = stemmed_content.lower() #2
    stemmed_content = stemmed_content.split() #3
    stemmed_content = [stemmer.stem(word) for word in stemmed_content if not word in stopwords.words('english')] #4
    stemmed_content = ' '.join(stemmed_content) #5
    return stemmed_content #6

Итак, давайте углубимся и посмотрим, что на самом деле делает эта функция. Я пронумеровал каждую строку от 1 до 6, чтобы вы могли легко различать разные строки кода и понимать использование каждой строки.

#1 Сначала мы используем пакет re и удаляем все, что не является буквой (строчные или прописные буквы).

# 2 Затем мы преобразуем каждую прописную букву в строчную.

# 3 Затем мы разбиваем каждое предложение на список слов.

# 4 Затем мы используем стеммер и вырезаем каждое слово, которое существует в столбце, и удаляем все английские стоп-слова, присутствующие в списке.

# 5 Затем мы объединяем все эти слова, которые присутствовали в виде списка, и преобразуем их обратно в предложение.

#6 Наконец, мы возвращаем предварительно обработанный файл temmed_content.

Применив эту функцию к нашему набору данных,

df1['content'] = df1['content'].apply(stemming)
df1['content'].head()

Следующий шаг — назвать наши входные и выходные функции.

X = df1.content.values
y = df1.label.values

Нашим последним шагом предварительной обработки было бы преобразование нашего текстового X в числовое, чтобы наша модель ML могла понять его и могла работать с ним. Здесь в игру вступает TfidfVectorizer. Вот картинка, объясняющая это вкратце,

Чтобы понять это глубже, посетите эту ссылку.

X = TfidfVectorizer().fit_transform(X)
print(X)

Вывод этого кода должен выглядеть следующим образом:

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

Разделение набора данных

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.2, stratify = y, random_state = 2)

Это означает, что мы разделили наш набор данных на 80% в качестве обучающего набора и 20% в качестве тестового набора. stratify = y подразумевает, что мы удостоверились, что разделение на наборы обучающих тестов имеет примерно одинаковое распределение обоих классов (0 и 1 или Real и Fake). random_state = 2 гарантирует, что разделение всегда будет одинаковым.

Обучение модели

Подгонка модели к нашему набору данных

model = LogisticRegression()
model.fit(X_train, y_train)

Теперь, когда мы обучили его, давайте проверим точность наших прогнозов обучающего набора,

X_train_prediction = model.predict(X_train)
training_accuracy = accuracy_score(X_train_prediction, y_train)
print(training_accuracy)

Так что я получил около 98,66%, что довольно хорошо. Аналогично для тестового набора данных.

X_test_prediction = model.predict(X_test)
testing_accuracy = accuracy_score(X_test_prediction, y_test)
print(testing_accuracy)

Так что точность теста тоже неплохая.

(Примечание: оценка может отличаться для вас, если вы внесете какие-либо изменения в этот код)

Благодаря этому мы успешно обучили нашу модель машинного обучения!

Построение системы

Наконец, чтобы сделать эту модель полезной, нам нужно создать систему. Взяв образец из тестового набора (я взял первый образец),

X_sample = X_test[0]

Проверяя наш прогноз для этого образца,

prediction = model.predict(X_sample)
if prediction == 0:
    print('The NEWS is Real!')
else:
    print('The NEWS is Fake!')

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

Ссылки