Решение реальных проблем с использованием текстовой аналитики и классического машинного обучения!

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

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

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

Бизнес-проблема

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

Гид пользователя

Блокноты Colab » доступны для этого реального варианта использования в моем репозитории GitHub !

Понимание данных

Вы можете загрузить набор данных для варианта использования из Kaggle.

Что такое фейковые новости? - Термин "фейковые новости" первоначально относится к ложной и часто сенсационной информации, распространяемой под видом соответствующих новостей. Однако использование этого термина изменилось и теперь считается синонимом распространения ложной информации в социальных сетях. Примечательно, что, по данным Google Trends, термин «фейковые новости» приобрел значительную популярность в 2017 году.

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

Обзор данных

Данные будут в файле train.csv. Всего имеется 20 800 наблюдений или строк. Он содержит 5 столбцов: id (уникальный идентификатор новостной статьи), title (заголовок новостной статьи), author (автор новостной статьи), текст ( текст статьи; может быть неполным), метка (метка, которая отмечает статью как потенциально ненадежную), обозначенную цифрой 1 (ненадежная или поддельная) или 0 (надежная).

import pandas as pd
df = pd.read_csv(r"/content/train.csv",error_bad_lines=False)
# error_bad_lines=False -- cause the offending lines to be skipped.
print(df.shape)
# first 10 lines of the data
print(df.head(10))

Тип проблемы машинного обучения

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

Базовый исследовательский анализ данных

Какое общее количество наблюдений для обучения? - - 20 800.

Есть ли в данных отсутствующие значения?

  • Процент пропущенных значений меньше, поэтому мы можем отбросить эти многие
    наблюдения.
# Count of missing values
print(pd.DataFrame(df.isnull().sum(),columns=['Count of missing values']))
# Percentage of missing values
print(pd.DataFrame(round(df.isnull().sum()*100/df.shape[0],2),columns=['Percentage of missing values']))
# Drop missing observations
df.dropna(inplace=True)
print(df.shape)
#resetting the index after dropping missing rows
df.reset_index(inplace=False,drop=True)
df.head(10)

Каково распределение ярлыков классов?

Количество ненадежных статей (поддельных или 1) составляет 7924, а количество надежных статей (0) - 10361, данные не соответствуют несбалансированной ситуации, но почти 43%. статей - ПОДДЕЛКА! 😥

import seaborn as sns
sns.countplot(x = df['label']);
print("1 : Unreliable or fake")
print("0 : Reliable")
print("\nDistribution of labels is:")
print(df.label.value_counts());
print(round(df.label.value_counts(normalize=True),2)*100);

Кто чаще всего создает фейковые новостные статьи?

from wordcloud import WordCloud, STOPWORDS
from os import path
import matplotlib.pyplot as plt
df_unreliable = df[df['label'] == 1]
df_reliable = df[df['label'] == 0]
textp_w = df_unreliable['author']
stopwords = set(STOPWORDS)
print ("Word Cloud for Authors of Fake news articles:")
wordcloud = WordCloud().generate(' '.join(textp_w))
plt.figure(figsize=(10,10))
# Generate plot
plt.imshow(wordcloud)
plt.axis("off")
plt.show()

Кто чаще всего является авторами надежных новостных статей?

textp_w = df_reliable['author']
stopwords = set(STOPWORDS)
print ("Word Cloud for Authors of Reliable news articles:")
wordcloud = WordCloud().generate(' '.join(textp_w))
plt.figure(figsize=(10,10))
# Generate plot
plt.imshow(wordcloud)
plt.axis("off")
plt.show()

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

Зачем нужно преобразовывать текстовые данные в числовые?

  • Компьютеры понимают только числа.
  • После преобразования нашего текста в вектор мы можем использовать всю красоту линейной алгебры.

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

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

Теперь все готово !!

Первым шагом в предварительной обработке текста является удаление специальных символов, выделения корней и стоп-слов из функции заголовок. Если вы хотите понять, как выполнить описанные выше действия по предварительной обработке текста, загляните в Блокноты Colab. Я объяснил эти шаги на примере!

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

import nltk
nltk.download('stopwords')
import re
from nltk.corpus import stopwords
STOP_WORDS = stopwords.words("english")
from tqdm import tqdm
def preprocess(documents):
    corpus=[]
    sentences=[]
    for i in tqdm(range(0,len(documents))):
         news = re.sub('[^a-zA-Z]',' ', documents['title'][i])
         news = news.lower()
         tokens = news.split()
         words = [PorterStemmer().stem(token) for token in tokens if    
         token not in set(stopwords.words('english'))]
         sentences =' '.join(words)
         corpus.append(sentences)
   return corpus
corpus = preprocess(df)

После выполнения вышеуказанных шагов предварительной обработки нам нужно преобразовать данные в числа. Для этого мы воспользуемся простым подходом Мешок слов (BoW).

Особенности извлечения с помощью мешка слов

Пакет слов - это представление текста, которое описывает появление слов в документе. Это включает в себя две вещи:

  • Словарь известных слов.
  • Мера присутствия известных слов.

Он называется «пакетом» слов, потому что всякая информация о порядке или структуре слов в документе отбрасывается. Модель заботится только о том, встречаются ли известные слова в документе, а не где в документе.

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

Давайте разберемся на следующем примере:

Здесь, cat, sat, in, hat, with - это 6 функций для 3 документов, а записи - частоты этих функций. Очень простой. Не правда ли?

from sklearn.feature_extraction.text import CountVectorizer
cv = CountVectorizer(max_features=5000,ngram_range=(1,3))
X = cv.fit_transform(corpus).toarray()
print(X.shape)
print(cv.get_featurbe_names()[0:7])

Мы получим 5000 функций от BoW.

Разделение на тренировку и тест

Здесь мы разделим наши данные на проверку (тест) в соотношении 75:25. Количество точек данных в данных поезда: 21141 и количество точек данных в данных проверки: 7048.

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

y_true = df['label']
from sklearn.model_selection import train_test_split
X_train,X_test, y_train, y_test = train_test_split(X, y_true, test_size=0.25, random_state=42)
print("Number of data points in train data :",X_train.shape)
print("Number of data points in validation data :",X_test.shape)
from collections import Counter
print("-"*10, "Distribution of output variable in train data", "-"*10)
train_distr = Counter(y_train)
train_len = len(y_train)
print("Class 0: ",round(int(train_distr[0])*100/train_len,2),"Class 1: ", round(int(train_distr[1])*100/train_len,2))
print("-"*10, "Distribution of output variable in validation data", "-"*10)
test_distr = Counter(y_test)
test_len = len(y_test)
print("Class 0: ",round(int(test_distr[0])*100/test_len,2), "Class 1: ",round(int(test_distr[1])*100/test_len,2))

Случайная базовая модель

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

Точность данных проверки с использованием случайной модели составляет 50%. Много областей для повышения точности!

from sklearn import metrics
from sklearn.metrics import confusion_matrix
from sklearn.metrics.classification import accuracy_score
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
# we create a output array that has exactly same size as the CV data
predicted_y = np.zeros((test_len,2))
for i in range(test_len):
    rand_probs = np.random.rand(1,2)
    predicted_y[i] = ((rand_probs/sum(sum(rand_probs)))[0])
predicted_y =np.argmax(predicted_y, axis=1)
print("Accuracy on Validation Data using Random Model",round(accuracy_score(y_test, predicted_y),2))
plot_confusion_matrix(y_test, predicted_y)

Полиномиальный наивный байесовский классификатор

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

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

Точность данных поездов с использованием модели MNB составляет 92%

Точность данных проверки с использованием модели MNB составляет 90%

from sklearn.naive_bayes import MultinomialNB
classifier=MultinomialNB()
classifier.fit(X_train,y_train)
predicted_y_train = classifier.predict_proba(X_train)
predicted_y_train = np.argmax(predicted_y_train,axis=1)
print("Accuracy on Train Data using NB Model",round(metrics.accuracy_score(y_train, predicted_y_train),2))
predict_y = classifier.predict_proba(X_test)
predicted_y =np.argmax(predict_y,axis=1)
#print("Total number of validation data points :", len(predicted_y))
print("Accuracy on Validation Data using NB Model",round(metrics.accuracy_score(y_test,predicted_y),2))
# Go to Colab notebook for plot_confusion_matrix function
plot_confusion_matrix(y_test, predicted_y)

Пассивно-агрессивный классификатор

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

Как работает этот алгоритм?

Проще говоря:

  • Пассивный: для правильного прогноза сохраните модель и не вносите никаких изменений.
  • Агрессивный: в случае неверного прогноза внесение изменений в модель может быть некоторым изменением модели, которое может исправить это.

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

Точность данных обучения с использованием пассивно-прогрессивной модели составляет 100%

Точность данных проверки с использованием пассивно-прогрессивной модели составляет 96%

from sklearn.linear_model import PassiveAggressiveClassifier
linear_clf=PassiveAggressiveClassifier()
# Fitting model
linear_clf.fit(X_train, y_train)
predictions=linear_clf.predict(X_test)
predicted_y_train = linear_clf.predict(X_train)
print("Accuracy on Train Data using PassiveAgressive Model",round(metrics.accuracy_score(y_train, predicted_y_train),2))
pred = linear_clf.predict(X_test)
print("Total number of validation data points :", len(predicted_y))
print("Accuracy on Validation Data using PassiveAgressive Model",round(metrics.accuracy_score(y_test,pred),2))
plot_confusion_matrix(y_test, pred)

Спасибо за чтение ❤

использованная литература

Ресурсы

__________________________________________________________________

С любыми предложениями или вопросами оставляйте свои комментарии ниже и следите за обновлениями.

Если вам понравилась статья, нажмите значок 👏, чтобы поддержать ее. Это поможет другим пользователям Medium найти его. Поделитесь им, чтобы другие могли его прочитать!

Удачного обучения! 😊