В этой статье мы попытаемся построить модель классификации BERT для обнаружения фейковых новостей с помощью Python.
Рост социальных сетей усилил влияние фейковых новостей в нашем обществе. Люди часто воспринимают все, что они читают/слышат, как правду, и это влияет на мир в больших масштабах, как в политическом, так и в финансовом плане. Поэтому сегодня мы разработаем приложение, которое может автоматически определять фейковые новости с помощью модели BERT и Python.
Загрузка данных
Данные, использованные в этой статье, можно найти здесь . Скопируйте данные, разархивируйте их и вставьте в свою папку. Давайте начнем наш код с импорта библиотек —
import pandas as pd
import csv
После того, как вы скопировали данные —
df_fake = pd.read_csv("Fake.csv") df_true = pd.read_csv("True.csv")
Мы импортировали данные и создали два DataFrames. Теперь давайте сделаем очистку и анализ данных —
Начнем с создания фрейма данных путем слияния обоих фреймов данных, представленных выше.
df_fake["Label"] = "Fake"
df_true["Label"] = "True"
Чтобы отличить фейковые новости от правдивых, мы добавили новую колонку — Метка. Которая будет нашей зависимой колонкой.
df = pd.concat([df_fake,df_true]) df = df.sample(frac=1).reset_index(drop=True)
Выше мы объединяем оба DataFrames и перемешиваем их.
Наконец, наши данные готовы —
df.head(5)
Давайте проверим, есть ли у нас пропущенные значения —
df.isnull().sum()
Анализ данных
Итак, теперь давайте попробуем проанализировать некоторые столбцы в наших данных — Как мы знаем, заголовок и текст необходимы, так как мы должны предсказать метки в зависимости от них; И очевидно, что дата не играет большой роли в предсказании того, является ли новость фейком или правдой. Давайте визуализируем столбец темы с помощью библиотеки Seaborn —
import matplotlib.pyplot as plt import seaborn as sns#Creating Figure fig, axes = plt.subplots(1,2, figsize = (15,6)) #Adding the histogram1 - Fake News sns.histplot(df_fake.subject, palette = 'Set1', alpha = 0.5, ax = axes[0]) axes[0].tick_params(axis = 'x', rotation = 90) axes[0].set_title('Fake News Subject') #Adding the histogram2 - True News sns.histplot(df_true.subject, palette = 'Set1', alpha = 0.5, ax = axes[1]) axes[1].tick_params(axis = 'x', rotation = 90) axes[1].set_title('True News Subject') #Printing the count of Subject print("Fake News Subject : ",dict(df_fake.subject.value_counts())) print("True News Subject : ",dict(df_true.subject.value_counts()))
Как мы видим, столбец субъекта имеет разные значения в обоих DataFrames. Поэтому мы не можем включить этот столбец в дальнейшее рассмотрение.
Давайте посмотрим, сбалансированы ли данные или нет.
sns.histplot(df.Label, palette = 'Set1', alpha = 0.5) plt.tick_params(axis = 'x', rotation = 90) plt.title('True VS Fake News') df.Label.value_counts()
df["text"] = df["title"]+df["text"] #considering text and title as X
Как мы видим, столбец «Метка» имеет формат объекта, давайте закодируем его в числовой формат.
df['Label'] = df['Label'].map({'True':1, 'Fake':0})
Здесь, поскольку нам нужно закодировать только два значения, я использовал метод map() из DataFrame Python.
Итак, наши данные готовы. Давайте выполним train-test-split данных —
from sklearn.model_selection import train_test_splitX_train, X_test, y_train, y_test = train_test_split(X, y, stratify = y, test_size = 0.2, random_state = 10)
У нас готовы данные для обучения и тестирования, поэтому давайте теперь узнаем больше о модели BERT.
МОДЕЛЬ БЕРТА
BERT означает двунаправленные представления кодировщиков от Transformers . Он состоит из нескольких кодировщиков Transformer, сложенных вместе. Он использует Transformers для понимания контекстной связи между словами в предложении/тексте. BERT Transformer обычно имеет два механизма: кодировщик, который считывает текстовый ввод, и декодер, который прогнозирует для данной задачи.
Одной из главных причин хорошей производительности BERT в различных задачах обработки естественного языка было использование полуконтролируемого обучения . Это означает, что модель обучается для определенной задачи, которая позволяет ей понимать шаблоны языка. После обучения модель (BERT) имеет возможности обработки языка, которые можно использовать для расширения возможностей других моделей, которые мы создаем и обучаем с помощью контролируемого обучения.
Первоначально BERT выпускается в двух размерах — базовой и большой модели. BERT(BASE) имеет 1 2 слоя в стеке кодировщика, тогда как BERT(LARGE) имеет 24 слоя в стеке кодировщика .
Модель BERT сначала принимает токен классификации (CLS) в качестве входных данных, а затем последовательность слов. Затем она передает входные данные на вышестоящие слои. Каждый слой применяет внутреннее внимание и передает результат через сеть прямой связи, после чего он передает его следующему кодировщику. Модель выводит вектор размера, соответствующего размеру BERT. Если мы хотим вывести классификатор из этой модели, мы можем взять выходные данные, соответствующие токену CLS.
Этот обученный вектор может быть использован для выполнения ряда задач, таких как классификация, перевод и т. д.
Обнаружение фейковых новостей
Итак, давайте сосредоточимся на нашей задаче и начнем классификацию — Как уже было сказано, нам нужно передать токенизированные значения в качестве входных данных в модель BERT. Итак, давайте воспользуемся токенизатором из библиотеки transformers.
Токенизация
Начнем с установки трансформаторов, обеспечивающих модель BERT.
!pip install transformers
Давайте начнем токенизацию —
В этом методе мы будем использовать AutoTokenizer из BERT (базовой) модели —
Подобно всем нейронным сетям, трансформаторы не могут обрабатывать необработанный входной текст напрямую, поэтому нам нужно токенизировать входные данные и преобразовать их в числа. Токенизация выполняет следующие функции: — Она разбивает входной текст на токены (слова, буквы и т. д.), сопоставляет каждый токен с уникальным целым числом и упорядочивает их в соответствии с моделью.
Поскольку мы используем модель BERT BASE для нашего приложения, мы также использовали соответствующий AutoTokenizer для токенизации.
from transformers import AutoTokenizerdef tokenize(X): X = tokenizer( text = list(X), add_special_tokens = True, max_length = 100, truncation = True, padding = 'max_length', return_tensors = 'tf', return_token_type_ids = False, return_attention_mask = True, verbose = True ) return X tokenizer = AutoTokenizer.from_pretrained('bert-base-uncased')
Давайте токенизируем ценности —
X_train_tokens = tokenize(X_train)
X_test_tokens = tokenize(X_test)
Проектирование модели
Импорт необходимых библиотек —
import tensorflow as tf
from keras.models import Model, Sequential
from keras.layers import Input, Dense, Dropout, Embedding
from tensorflow.keras.optimizers import Adam
from transformers import TFBertModel
Проектирование функции BERT —
Length = 100 def get_model(): dropout_rate = 0.2 input_ids = Input(shape = (Length,), dtype = tf.int32, name = 'input_ids') input_mask = Input(shape = (Length,), dtype = tf.int32, name = 'input_mask') embeddings = bert([input_ids, input_mask])[1] #pooler output print(embeddings) out = Dropout(0.2)(embeddings) #64 units dense layer out = Dense(64,activation = 'relu')(out) out = Dropout(0.2)(out) y = Dense(1,activation = 'sigmoid')(out) model = Model(inputs=[input_ids, input_mask], outputs=y) model.layers[2].trainable = True #define optimizer optimizer = Adam(learning_rate=1e-05, epsilon=1e-08, decay=0.01,clipnorm=1.0) #complile the model model.compile(optimizer = optimizer, loss = 'binary_crossentropy', metrics = 'accuracy') return model
Загрузка модели BERT —
bert = TFBertModel.from_pretrained('bert-base-uncased')
Давайте построим график созданной модели BERT —
model = get_model()
tf.keras.utils.plot_model(model)
Мы создали Модель в соответствии с приведенным выше объяснением.
Обучение нашей модели
from keras.callbacks import EarlyStopping history = model.fit(x = {'input_ids':X_train_tokens['input_ids'],'input_mask':X_train_tokens['attention_mask']}, y = y_train, epochs=3, validation_split = 0.2, batch_size = 64, callbacks=[EarlyStopping( monitor='val_accuracy' ,mode='max', patience=3,verbose=False,restore_best_weights=True)])
Как мы видим, мы получили точность обучения 99,9%. Давайте оценим нашу модель —
yhat = np.where(model.predict({ 'input_ids' : X_test_seq['input_ids'] , 'input_mask' : X_test_seq['attention_mask']}) >=0.5,1,0) print(classification_report(y_test,yhat))
Мы видим, что наша модель работает очень хорошо даже на оценочных данных.
Мы можем использовать эту модель даже для оценки любых ежедневных новостей, которые мы видим.
Вот и все, ребята… Чтобы следить за моим контентом и узнать обо мне больше, ознакомьтесь с моей статьей ниже —
Источник:
https://pub.towardsai.net/fake-news-detection-using-bert-model-python-de005c5809ed