Решая различные задачи классификации и регрессии в рамках моего путешествия # 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
- Удаление стоп-слов: стоп-слова - это слова на любом языке, которые не добавляют особого смысла предложению. Их можно спокойно игнорировать, не жертвуя смыслом предложения. Вы можете прочитать больше об этом здесь."
- Токенизация: Токенизация - это процесс разметки или разделения строки текста на список токенов. Можно рассматривать токен как части, например слово - это токен в предложении, а предложение - это токен в абзаце. Например:
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.
- Логистическая регрессия
#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%.
Мы можем напечатать матрицу неточностей, чтобы получить представление о количестве ложных, истинных отрицательных и положительных результатов.
Ознакомьтесь с кодом здесь.
ВЫВОДЫ
Методы обнаружения фейковых новостей можно разделить на методы, основанные на стиле, и методы, основанные на содержании или проверке фактов. Слишком часто считается, что плохой стиль (неправильная орфография, неправильная пунктуация, ограниченный словарный запас, злоупотребление терминами, грамматичность и т. Д.) Является надежным индикатором фейковых новостей.
Более чем когда-либо, это тот случай, когда мнение машины должно быть подкреплено четкими и полностью проверяемыми указаниями на основе ее решения с точки зрения проверенных фактов и авторитета, с помощью которого была установлена истинность каждого факта.
Единовременный сбор данных никуда не годится, учитывая, как быстро информация распространяется в современном подключенном мире и количество публикуемых статей.
Я надеюсь, вы найдете это полезным. Вы можете оставлять комментарии в разделах комментариев для любых запросов.