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

ВУЗ: Не указан

Категория: Не указан

Дисциплина: Не указана

Добавлен: 11.01.2024

Просмотров: 28

Скачиваний: 1

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.

Обнаружение поддельных новостей с помощью машинного обучения

  • https://www.geeksforgeeks.org/fake-news-detection-using-machine-learning/?ref=rp



  • Последнее обновление : 26 октября 2022 г.

 Читать

 Обсудить

 Курсы

 Практика

 Видео

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

Здесь мы попытаемся решить эту проблему с помощью машинного обучения на Python.

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

Шаги, которые необходимо выполнить

  1. Импорт библиотек и наборов данных

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

  3. Предварительная обработка и анализ новостной колонки

  4. Преобразование текста в векторы

  5. Обучение, оценка и прогнозирование моделей

Импорт библиотек и наборов данных

Используемые библиотеки :

  • Pandas: Для импорта набора данных.

  • Seaborn / Matplotlib: для визуализации данных.

  • Python3

import pandas as pd

import seaborn as sns

import matplotlib.pyplot as plt

Давайте импортируем загруженный набор данных.

  • Python3

data = pd.read_csv('News.csv',index_col=0)

data.head()

Вывод :



 

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

Форму набора данных можно найти по приведенному ниже коду.

  • Python3

data.shape

Вывод:

(44919, 5)

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

  • Python3

data = data.drop(["title", "subject","date"], axis = 1)


Теперь нам нужно проверить, есть ли какое-либо нулевое значение (мы удалим эти строки)

  • Python3

data.isnull().sum()

Вывод:

текст 0

класс 0

Таким образом, нулевого значения нет.

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

  • Python3

# Shuffling

data = data.sample(frac=1)

data.reset_index(inplace=True)

data.drop(["index"], axis=1, inplace=True)

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

  • Python3

sns.countplot(data=data,

              x='class',

              order=data['class'].value_counts().index)

Вывод:



 

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

Во-первых, мы удалим из текста все стоп-слова, знаки препинания и любые неуместные пробелы. Для этого требуется библиотека NLTK, и некоторые из ее модулей необходимо загрузить. Итак, для этого выполните приведенный ниже код.

  • Python3

from tqdm import tqdm

import re

import nltk

nltk.download('punkt')

nltk.download('stopwords')

from nltk.corpus import stopwords

from nltk.tokenize import word_tokenize

from nltk.stem.porter import PorterStemmer

from wordcloud import WordCloud

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

  • Python3

def preprocess_text(text_data):

    preprocessed_text = []

      

    for sentence in tqdm(text_data):

        sentence = re.sub(r'[^\w\s]', '', sentence)

        preprocessed_text.append(' '.join(token.lower()

                                  for token in str(sentence).split()

                                  if token not in stopwords.words('english')))

  

    return preprocessed_text

Чтобы реализовать эту функцию во всех новостях в текстовом столбце, выполните приведенную ниже команду.



  • Python3

preprocessed_review = preprocess_text(data['text'].values)

data['text'] = preprocessed_review

Эта команда займет некоторое время (поскольку взятый набор данных очень большой).

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

  • Python3

# Real

consolidated = ' '.join(

    word for word in data['text'][data['class'] == 1].astype(str))

wordCloud = WordCloud(width=1600,

                      height=800,

                      random_state=21,

                      max_font_size=110,

                      collocations=False)

plt.figure(figsize=(15, 10))

plt.imshow(wordCloud.generate(consolidated), interpolation='bilinear')

plt.axis('off')

plt.show()

Вывод :



 

  • Python3

# Fake

consolidated = ' '.join(

    word for word in data['text'][data['class'] == 0].astype(str))

wordCloud = WordCloud(width=1600,

                      height=800,

                      random_state=21,

                      max_font_size=110,

                      collocations=False)

plt.figure(figsize=(15, 10))

plt.imshow(wordCloud.generate(consolidated), interpolation='bilinear')

plt.axis('off')

plt.show()

Вывод :



 

Теперь давайте построим гистограмму 20 самых часто встречающихся слов.

  • Python3

from sklearn.feature_extraction.text import CountVectorizer

  

  

def get_top_n_words(corpus, n=None):

    vec = CountVectorizer().fit(corpus)

    bag_of_words = vec.transform(corpus)

    sum_words = bag_of_words.sum(axis=0)

    words_freq = [(word, sum_words[0, idx])

                  for word, idx in vec.vocabulary_.items()]

    words_freq = sorted(words_freq, key=lambda x: x[1],

                        reverse=True)

    return words_freq[:n]

  

  

common_words = get_top_n_words(data['text'], 20)

df1 = pd.DataFrame(common_words, columns=['Review', 'count'])

  

df1.groupby('Review').sum()['count'].sort_values(ascending=False).plot(

    kind='bar',

    figsize=(10, 6),

    xlabel="Top Words",

    ylabel="Count",

    title="Bar Chart of Top Words Frequency"

)

Вывод :



 

Преобразование текста в векторы

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

  • Python3

from sklearn.model_selection import train_test_split

from sklearn.metrics import accuracy_score

from sklearn.linear_model import LogisticRegression

  

x_train, x_test, y_train, y_test = train_test_split(data['text'], 

                                                    data['class'], 

                                                    test_size=0.25)


Теперь мы можем преобразовать обучающие данные в векторы с помощью TfidfVectorizer.

  • Python3

from sklearn.feature_extraction.text import TfidfVectorizer

  

vectorization = TfidfVectorizer()

x_train = vectorization.fit_transform(x_train)

x_test = vectorization.transform(x_test)

Обучение, оценка и прогнозирование моделей

Теперь набор данных готов к обучению модели.

Для обучения мы будем использовать логистическую регрессию и оценивать точность прогнозирования с помощью accuracy_score.

  • Python3

from sklearn.linear_model import LogisticRegression

  

model = LogisticRegression()

model.fit(x_train, y_train)

  

# testing the model

print(accuracy_score(y_train, model.predict(x_train)))

print(accuracy_score(y_test, model.predict(x_test)))

Вывод :

0.993766511324171

0.9893143365983972

Давайте потренируемся с классификатором дерева решений.

  • Python3

from sklearn.tree import DecisionTreeClassifier

  

model = DecisionTreeClassifier()

model.fit(x_train, y_train)

  

# testing the model

print(accuracy_score(y_train, model.predict(x_train)))

print(accuracy_score(y_test, model.predict(x_test)))

Вывод :

0.9999703167205913

0.9951914514692787

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

  • Python3

# Confusion matrix of Results from Decision Tree classification

from sklearn import metrics

cm = metrics.confusion_matrix(y_test, model.predict(x_test))

  

cm_display = metrics.ConfusionMatrixDisplay(confusion_matrix=cm,

                                            display_labels=[False, True])

  

cm_display.plot()

plt.show()

Вывод :



 

Заключение

Классификатор дерева решений и логистическая регрессия работают хорошо.