Будь то Web 1.0, 2.0 или Web3.0, сфабрикованные новости существовали всегда, даже до появления Интернета. Поддельные новости можно определить как статьи, специально созданные для обмана читателей. Эти статьи используются в качестве тактики для увеличения читательской аудитории или как часть психологической войны для получения прибыли с помощью кликбейта. Заманчиво-преувеличенно-яркие заголовки и кликбейт используются для того, чтобы вызвать любопытство и увеличить доходы от рекламы.

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

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

Не знаете, что такое НЛП? Справедливо, я тебя понял!

Обработка естественного языка

НЛП — это, по сути, нечто среднее между информатикой и компьютерной лингвистикой. Компьютеры используют двоичные цифры (0,1) для общения даже для самых простых задач, у людей есть 6500 различных типов языков со своим собственным синтаксисом. NPL используются для языковых переводчиков, мониторинга социальных сетей, чат-ботов и анализа опросов.

Пройдемся по основам

  • Токенизация. Это процесс разделения текстовых объектов на более мелкие единицы, называемые токенами. Токены могут быть числами, текстами или символами.
  • Тегирование частей речи. POS классифицирует тексты по спискам слов, где они разделены в зависимости от того, является ли слово существительным, прилагательным, глаголом и т. д.
  • Выделение корней и лемматизация. Процесс удаления префиксов и суффиксов для извлечения основной формы слова. Лемматизация учитывает контекст и преобразует слово в его осмысленную базовую форму, в то время как при выделении корней удаляются только последние несколько символов, что приводит к неточным интерпретациям и орфографическим ошибкам.
  • Удаление стоп-слова. Как следует из названия, это удаление слов, которые встречаются в большом количестве документов в корпусе. Например, артикли и местоимения обычно характеризуются как стоп-слова.

Настройка среды

Для начала для настройки среды я буду использовать google colab, потому что это фантастический инструмент для задач, требующих глубокого обучения. Это размещенный на хостинге ноутбук Jupyter, который не требует установки и имеет отличную бесплатную версию, которая дает вам бесплатный доступ к вычислительным ресурсам Google, таким как GPU и TPU.

Давайте рассмотрим код

Я разберу код ниже, но вот ссылка на colab!

Начните с импортабиблиотек:

#importing libraries 
import numpy as np
import pandas as pd
import re
from nltk.corpus import stopwords
from nltk.stem.porter import PorterStemmer
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: Numerical Python — это библиотека Python, включающая многомерные массивы и матричные структуры данных. Я использовал его для создания массивов данных и управления ими. В основном он делал все математические вещи, которые мы на самом деле не хотим делать.

Pandas: еще одна библиотека с открытым исходным кодом, которую мы используем для анализа данных.

re: Регулярное выражение используется для поиска слов в строках.

Другое основное

Стоп-слова: удаляются такие слова, как артикли, предлоги («the», «a», «an», «in»), которые не добавляют особой ценности.

PorterStemmer : Он реализует метод стемминга Портера. Это процедура удаления префиксов из слова для выявления корня слова.

TfidfVectorizer() : это векторизатор текста, который использует частоту терминов (TF) и частоту документов (DF) для преобразования текста в пригодные для использования векторы (DF). Количество вхождений определенного термина в документе называется TF и ​​указывает, насколько важен этот термин в этом документе. Количество документов, содержащих определенный термин, обозначается как (Idf). Частота термина в документе показывает, насколько он распространен.

LogisticRegression() : это алгоритм классификации, который предсказывает вероятность категориальной зависимой переменной с использованием машинного обучения. Другими словами, в зависимости от X модель логистической регрессии предсказывает P(Y=1). [Я свяжу это с простой для понимания документацией]

Теория, лежащая в основе логистической регрессии и TfidfVectorizer, обширна и сложна, и для ее полного объяснения потребуется не один блог. Кроме того, я все равно не смог бы объяснить их так же точно, как их создатели, поэтому воздержусь от этого.

Импорт наборов данных

Импорт наборов данных очень важен при работе с моделью машинного обучения. Набор данных — это набор данных, который обычно представлен в табличном формате. Каждый столбец обозначает отдельную переменную. Используемый нами набор данных имеет 4 переменные: идентификатор, заголовок, автор, текст и метка. Метка означает, является ли новость реальной или фальшивой.

0 = real

1 = fake

Вот набор данных, который я использовал! Kaggle предоставил набор данных для этого проекта в виде CSV-файла.

# loading the dataset to a pandas DataFrame
news_dataset = pd.read_csv('train.csv')
news_dataset.shape

Функция read_csv() в Pandas импортирует файл CSV в DataFrame.

Пришло время предварительно обработать данные

1. Замена пустых строк отсутствующими значениями

Цель: удалить все пробелы из наших наборов данных, поскольку они не добавляют никакой ценности.

2. Объединение имени автора и заголовка новости

Создайте новую переменную с именем «контент», объединив столбцы автора и заголовка. Затем отделите данные (контент) от метки и назначьте переменные x и y соответственно.

# merging the author name and news title
news_dataset['content'] = news_dataset['author']+' '+news_dataset ['title']
print(news_dataset['content'])
# separating the data & label
X = news_dataset.drop(columns='label', axis=1)
Y = news_dataset['label']
print(X)
print(Y)

Цель: вместо того, чтобы сосредоточиться на столбце «текст» из набора данных, я решил объединить «автор» и «название», которые я буду использовать для прогнозирования, поскольку они короче, чем «текст».

3. Время стемминга!

Как я уже объяснял ранее, стемминг — это процесс сведения слова к его корневому слову.

Например: Воспроизведение , Воспроизведение, Воспроизведение → Воспроизведение

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

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

Мы создаем новую функцию с названием «стемминг».

re.sub('[^a-zA-Z]','’,content): мы используем команду .sub для подстановки определенных значений и библиотеку регулярных выражений (re.)для помощи в поиске слов в данных. -буквенные данные.

stemmed_content.lower(): переводит все данные в строчные буквы

stemmed_content.split() : дает вам список всех слов в строке или строке.

port_stem.stem(word) for word in stemmed_content if not word in stopwords.words(‘english’)]: Фрейм данных передается в цикл for, все стоп-слова удаляются, а затем выполняется поиск оставшихся данных.

Наконец, с помощью .join все данные объединяются

4. Стемминг применяется ко всем данным

# applying stemming to the data
news_dataset[‘content’] = news_dataset[‘content’].apply(stemming)

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

5. Разделение содержимого (данных) и метки и назначение переменных x и y

6. Преобразование текстов в числа

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

#converting the textual data to #
vectorizer = TfidfVectorizer()
vectorizer.fit(x)
x = vectorizer.transform(x)
print(x)

Создайте переменную с именем «vectorizer» и сохраните в ней функцию. Затем функции векторизатора снабжаются(.fit)значением x, что означает, что все данные в переменной x проходят через функцию векторизатора. Затем .transform преобразует все значения в соответствующие функции.

Цель: поскольку наш компьютер не может понимать текстовые данные, КРАЙНЕ ВАЖНО преобразовать их в числовые данные для их обработки.

7. Затем мы разделяем набор данных на данные для обучения и тестирования.

# split between train and test
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size = 0.2, stratify=y, random_state=2 )

Наборы данных разделены на две части

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

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

test size = 0.2 означает, что 20% всего набора данных выделено для тестирования.

Staritfy = y будет разделять поддельные и настоящие новости так же, как в исходном наборе данных

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

8. Наконец-то пришло время обучить модель с помощью логистической регрессии

Переменная «модель» назначена функции logisticRegression()

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

Как указывалось ранее, эта модель классификации машинного обучения помогает прогнозировать вероятность категориальной зависимой переменной, где зависимая переменная представляет собой двоичную переменную с данными, закодированными как 1 (истина) или 0 (ложь).

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

9. Давайте проверим точность набора данных для обучения и тестирования

Как видите, точность довольно высока, так что молодец!

9. Система прогнозирования

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

Мы собираемся сохранить первую строку [0] из набора данных x _test в новой переменной с именем x _new. Затем мы используем ранее обученную модель (model.predict), чтобы предсказать метку x _new..

Затем мы вводим оператор if, который запрашивает вывод «новости реальны», если прогноз равен 0, или «фальшивые новости», если вывод прогноза равен 1.

Вот и все, видите ли, это было довольно просто!

Заключение ивыводы

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

  • Это не принесет никакой пользы, если вы просто копируете все шаги, понимая КАЖДУЮ строчку кода, который пишете. Делайте заметки, потому что вы забудете о них позже. Искренне понимайте, что вы делаете!
  • Не делайте проект (как и все остальное) просто ради того, чтобы сделать его, делайте это для обучения и расширения своих навыков.
  • Делайте перерывы! Если вы застряли на одном и том же в течение длительного времени, вероятно, пришло время отступить и поработать над чем-то другим. Когда вы вернетесь к отладке, вы посмотрите на нее с другой точки зрения.

Аааа мы закончили!!!!!

S/O к уроку YouTube я следил!

Я очень надеюсь, что вы нашли эту статью интересной. Если это так, вы можете найти больше моих увлекательных вещей здесь:



Привет! Спасибо, что дочитали до конца :) Мне 16 лет, энтузиаст ИИ и новатор в The Knowledge Society (TKS).

Мой LinkedIn:https://www.linkedin.com/in/serjan-kaur-

Мой Твиттер: https://twitter.com/serjannnnnnn

Подпишитесь на мои ежемесячные информационные бюллетени:https://serjan.substack.com/