Решая различные задачи классификации и регрессии в рамках моего путешествия # 100DaysOfMLCode, я работал над проектом НЛП, который обнаруживает фальшивые новости.

В следующем посте вы узнаете, как создать собственный классификатор фейковых новостей.

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

Фальшивые новости - это любые новости, которые либо фактически неверны, либо искажают факты, и которые распространяются вирусным путем (или, возможно, среди целевой аудитории). Его можно распространять как через обычные средства массовой информации, так и через социальные сети, такие как Facebook, Twitter, WhatsApp и т. Д.

Что действительно отличает Fake News от простых мистификаций, таких как «Посадка на Луну была фальшивкой» и т. Д., Так это то, что они тщательно имитируют «стиль» и «шаблоны», которым обычно следуют настоящие новости. Вот почему неподготовленному человеческому глазу так трудно различить.

НАБОР ДАННЫХ

Набор данных, который я использовал для этого проекта Python, - news.csv. Этот набор данных содержит в качестве атрибутов новости, заголовок, текст и метку. Вы можете скачать его здесь.

ЧТЕНИЕ НАБОРЫ ДАННЫХ

#Reading the data 
df=pd.read_csv('/home/femme_js/Hoaxify/news.csv')
df.head(10)

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

# checking if column have NaN values
check_nan_in_df = df.isnull()
print (check_nan_in_df)

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

df = df.fillna(' ')

Как мы видим, обе функции «Заголовок» и «Текст» важны, поэтому мы можем объединить их в одну функцию с именем «Итого».

df['total'] = df['title'] + ' ' + df['text']
df.head()

ПРЕДВАРИТЕЛЬНАЯ ОБРАБОТКА ДАННЫХ

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

import nltk
from nltk.corpus import stopwords
from nltk.stem import WordNetLemmatizer
from nltk import sent_tokenize, word_tokenize
  1. Удаление стоп-слов: стоп-слова - это слова на любом языке, которые не добавляют особого смысла предложению. Их можно спокойно игнорировать, не жертвуя смыслом предложения. Вы можете прочитать больше об этом здесь."
  2. Токенизация: Токенизация - это процесс разметки или разделения строки текста на список токенов. Можно рассматривать токен как части, например слово - это токен в предложении, а предложение - это токен в абзаце. Например:
from nltk.tokenize import word_tokenize
text = "Hello everyone. You are reading NLP article."
word_tokenize(text)

Результат выглядел так:

['Hello', 'everyone', '.', 'You', 'are', 'reading', 'NLP', 'article', '.']

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

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

Примеры лемматизации:
плавание → плавание
камни → камень
лучше → хорошо

За глубокое погружение в Stemming Vs. Лемматизация, отметьте здесь.

Следующий код выполняет всю предварительную обработку.

stop_words = stopwords.words('english')
lemmatizer = WordNetLemmatizer()
for index, row in df.iterrows():
    filter_sentence = ''
    sentence = row['total']
    # Cleaning the sentence with regex
    sentence = re.sub(r'[^\w\s]', '', sentence)
    # Tokenization
    words = nltk.word_tokenize(sentence)
    # Stopwords removal
    words = [w for w in words if not w in stop_words]
    # Lemmatization
    for words in words:
        filter_sentence = filter_sentence  + ' ' + str(lemmatizer.lemmatize(words)).lower()
    
    df.loc[index, 'total'] = filter_sentence
df.head()

ПРЕОБРАЗОВАНИЕ ЭТИКЕТОВ

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

df.label = df.label.astype(str)
df.label = df.label.str.strip()

dict = { 'REAL' : '1' , 'FAKE' : '0'}
df['label'] = df['label'].map(dict)
df.head()

Для дальнейшей работы мы разделяем наш набор данных на входные и выходные функции как «x_df» и «y_df».

x_df = df['total']
y_df = df['label']

ВЕКТОРИЗАЦИЯ

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

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

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

Здесь мы используем объекты векторизатора, предоставленные Scikit-Learn, которые довольно надежны прямо из коробки.

from sklearn.feature_extraction.text import TfidfTransformer
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.feature_extraction.text import TfidfVectorizer



count_vectorizer = CountVectorizer()
count_vectorizer.fit_transform(x_df)
freq_term_matrix = count_vectorizer.transform(x_df)

tfidf = TfidfTransformer(norm = "l2")
tfidf.fit(freq_term_matrix)
tf_idf_matrix = tfidf.fit_transform(freq_term_matrix)

print(tf_idf_matrix)

Здесь с помощью «Tfidftransformer» мы вычисляем количество слов с помощью «CountVectorizer», а затем вычисляем значения IDF, а затем оценки Tf-IDF. С «Tfidfvectorizer» мы можем выполнить все три шага одновременно.

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

Наиболее часто используемые векторизаторы:

  • Векторизатор подсчета: самый простой, он подсчитывает, сколько раз токен появляется в документе, и использует это значение в качестве веса.
  • Хеш-векторизатор: он разработан для максимально эффективного использования памяти. Вместо того, чтобы хранить токены в виде строк, векторизатор применяет трюк хеширования, чтобы кодировать их как числовые индексы. Обратной стороной этого метода является то, что после векторизации имена функций больше не могут быть получены.
  • Векторизатор TF-IDF: TF-IDF означает термин, обратно пропорциональный частоте документа, что означает, что вес, присвоенный каждому токену, зависит не только от его частоты в документе, но и от того, насколько часто этот термин встречается в весь корпус. Подробнее об этом здесь.

МОДЕЛИРОВАНИЕ

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

# Splitting the data into test data and train data
x_train, x_test, y_train, y_test = train_test_split(tf_idf_matrix,
                                   y_df, random_state=0)

Я подгоняю к данным четыре модели машинного обучения,

Логистическая регрессия, наивный байесовский анализ, дерево решений и пассивно-агрессивный классификатор.

После этого спрогнозировал на тестовом наборе из TfidfVectorizer и рассчитал точность с помощью precision_score () из sklearn.metrics.

  1. Логистическая регрессия
#LOGISTIC REGRESSION


from sklearn.linear_model import LogisticRegression

logreg = LogisticRegression()
logreg.fit(x_train, y_train)
Accuracy = logreg.score(x_test, y_test)

print(Accuracy*100)

Точность: 91,73%

2. Наивно-байесовский

#NAIVE BAYES

from sklearn.naive_bayes import MultinomialNB


NB = MultinomialNB()
NB.fit(x_train, y_train)
Accuracy = NB.score(x_test, y_test)

print(Accuracy*100)

Точность: 82,32%

3. Дерево решений

# DECISION TREE

from sklearn.tree import DecisionTreeClassifier


clf = DecisionTreeClassifier()
clf.fit(x_train, y_train)
Accuracy = clf.score(x_test, y_test)

print(Accuracy*100)

Точность: 80,49%

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

# PASSIVE-AGGRESSIVE CLASSIFIER  
from sklearn.metrics import accuracy_score  
from sklearn.linear_model import PassiveAggressiveClassifier  
pac=PassiveAggressiveClassifier(max_iter=50) pac.fit(x_train,y_train) 
#Predict on the test set and calculate accuracy 
y_pred=pac.predict(x_test) score=accuracy_score(y_test,y_pred)  
print(f'Accuracy: {round(score*100,2)}%')

Выход:

Точность: 93,12%

ВЫВОДЫ

Лучше всего показал себя пассивно-агрессивный классификатор с точностью 93,12%.

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

Ознакомьтесь с кодом здесь.

ВЫВОДЫ

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

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

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

Я надеюсь, вы найдете это полезным. Вы можете оставлять комментарии в разделах комментариев для любых запросов.