{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Text Classification Application: Fake News detection\n", "* Author: Johannes Maucher and Marcel Heisler\n", "* Last update: 13.12.2022\n", "\n", "In this notebook conventional Machine Learning algorithms are applied to learn a discriminator-model for distinguishing fake- and non-fake news.\n", "\n", "What you will learn:\n", "* Access text from .csv file\n", "* Preprocess text for classification\n", "* Calculate BoW matrix\n", "* Apply conventional machine learning algorithms for fake news detection\n", "* Evaluation of classifiers" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Access Data\n", "In this notebook a [fake-news corpus from Kaggle](https://www.kaggle.com/c/fake-news/data) is applied for training and testing Machine Learning algorithms. Download the train file and save it in a directory. Load it into a pandas dataframe.\n", "\n", "Then inspect the data." ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "import pandas as pd\n", "import numpy as np\n", "from sklearn.naive_bayes import MultinomialNB" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "(20800, 4)\n" ] }, { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
titleauthortextlabel
id
0House Dem Aide: We Didn’t Even See Comey’s Let...Darrell LucusHouse Dem Aide: We Didn’t Even See Comey’s Let...1
1FLYNN: Hillary Clinton, Big Woman on Campus - ...Daniel J. FlynnEver get the feeling your life circles the rou...0
2Why the Truth Might Get You FiredConsortiumnews.comWhy the Truth Might Get You Fired October 29, ...1
315 Civilians Killed In Single US Airstrike Hav...Jessica PurkissVideos 15 Civilians Killed In Single US Airstr...1
4Iranian woman jailed for fictional unpublished...Howard PortnoyPrint \\nAn Iranian woman has been sentenced to...1
\n", "
" ], "text/plain": [ " title author \\\n", "id \n", "0 House Dem Aide: We Didn’t Even See Comey’s Let... Darrell Lucus \n", "1 FLYNN: Hillary Clinton, Big Woman on Campus - ... Daniel J. Flynn \n", "2 Why the Truth Might Get You Fired Consortiumnews.com \n", "3 15 Civilians Killed In Single US Airstrike Hav... Jessica Purkiss \n", "4 Iranian woman jailed for fictional unpublished... Howard Portnoy \n", "\n", " text label \n", "id \n", "0 House Dem Aide: We Didn’t Even See Comey’s Let... 1 \n", "1 Ever get the feeling your life circles the rou... 0 \n", "2 Why the Truth Might Get You Fired October 29, ... 1 \n", "3 Videos 15 Civilians Killed In Single US Airstr... 1 \n", "4 Print \\nAn Iranian woman has been sentenced to... 1 " ] }, "execution_count": 2, "metadata": {}, "output_type": "execute_result" } ], "source": [ "data = pd.read_csv('../Data/fake-news/train.csv',index_col=0)\n", "print(data.shape)\n", "data.head()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Above we see that we have 20800 documents (rows in the dataframe) and for each document we (should) have a title, the author the text and a label.\n", "\n", "Below we can see that the dataset seems to be pretty balanced with about 10400 documents belonging to each category." ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[0 1] [10387 10413]\n" ] } ], "source": [ "bins, counts = np.unique(data.label, return_counts=True)\n", "print(bins, counts)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "If we check for missing values we can find them in each of the columns except for the label." ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "scrolled": true }, "outputs": [ { "data": { "text/plain": [ "title 558\n", "author 1957\n", "text 39\n", "label 0\n", "dtype: int64" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "data.isnull().sum(axis=0)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Data Preparation\n", "\n", "In the following code cells, we rearrange the input texts. First we replace missing values with spaces (`' '`). Then we concatenate `title`, `author` and `text` to a single column of text, called `total`. So far the operations can be applied to *train* and *test* data at once. Now we need to split the data and process each set independently." ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [], "source": [ "from sklearn.model_selection import train_test_split" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [], "source": [ "data = data.fillna(' ')\n", "data['total'] = data['title'] + ' ' + data['author'] + ' ' + data['text']" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
totallabel
id
0House Dem Aide: We Didn’t Even See Comey’s Let...1
1FLYNN: Hillary Clinton, Big Woman on Campus - ...0
2Why the Truth Might Get You Fired Consortiumne...1
315 Civilians Killed In Single US Airstrike Hav...1
4Iranian woman jailed for fictional unpublished...1
\n", "
" ], "text/plain": [ " total label\n", "id \n", "0 House Dem Aide: We Didn’t Even See Comey’s Let... 1\n", "1 FLYNN: Hillary Clinton, Big Woman on Campus - ... 0\n", "2 Why the Truth Might Get You Fired Consortiumne... 1\n", "3 15 Civilians Killed In Single US Airstrike Hav... 1\n", "4 Iranian woman jailed for fictional unpublished... 1" ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "data = data[['total', 'label']]\n", "data.head()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Preprocessing\n", "The input texts in column `total` shall be preprocessed as follows:\n", "* stopwords shall be removed\n", "* all characters, which are neither alpha-numeric nor whitespaces, shall be removed\n", "* all characters shall be represented in lower-case.\n", "* for all words, the lemma (base-form) shall be applied" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [], "source": [ "import nltk\n", "from nltk.corpus import stopwords\n", "from nltk.stem import WordNetLemmatizer\n", "import re" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [], "source": [ "stop_words = stopwords.words('english')\n", "lemmatizer = WordNetLemmatizer()" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [], "source": [ "for index in data.index:\n", " sentence = data.loc[index,'total']\n", " # Cleaning the sentence with regex\n", " sentence = re.sub(r'[^\\w\\s]', '', sentence)\n", " # Tokenization\n", " words = nltk.word_tokenize(sentence)\n", " # Stopwords removal\n", " words = [lemmatizer.lemmatize(w).lower() for w in words if not w in stop_words]\n", " filter_sentence = \" \".join(words)\n", " data.loc[index, 'total'] = filter_sentence" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "First 5 cleaned texts in the training-dataframe:" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
totallabel
id
0house dem aide we didnt even see comeys letter...1
1flynn hillary clinton big woman campus breitba...0
2why truth might get you fired consortiumnewsco...1
315 civilians killed in single us airstrike hav...1
4iranian woman jailed fictional unpublished sto...1
\n", "
" ], "text/plain": [ " total label\n", "id \n", "0 house dem aide we didnt even see comeys letter... 1\n", "1 flynn hillary clinton big woman campus breitba... 0\n", "2 why truth might get you fired consortiumnewsco... 1\n", "3 15 civilians killed in single us airstrike hav... 1\n", "4 iranian woman jailed fictional unpublished sto... 1" ] }, "execution_count": 11, "metadata": {}, "output_type": "execute_result" } ], "source": [ "data.head()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Clean data in the test-dataframe in the same way as done for the training-dataframe above:" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "First 5 cleaned texts in the test-dataframe:" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Determine Bag-of-Word Matrix for Training- and Test-Data\n", "In the code-cells below two different types of Bag-of-Word matrices are calculated. The first type contains the **term-frequencies**, i.e. the entry in row $i$, column $j$ is the frequency of word $j$ in document $i$. In the second type, the matrix-entries are not the term-frequencies, but the **tf-idf-values**. \n", "\n", "We also need to split the data now into train and test. Then for a each type of matrix (term-frequency or tf-idf) a separate one must be calculated for training and testing. Since we always pretend, that only training-data is known in advance, the matrix-structure, i.e. the columns (= words) depends only on the training-data. This matrix structure is calculated in the row:\n", "\n", "```\n", "count_vectorizer.fit(X_train)\n", "```\n", "and\n", "```\n", "tfidf.fit(freq_term_matrix_train),\n", "```\n", "respectively. An important parameter of the `CountVectorizer`-class is `min_df`. The value, which is assigned to this parameter is the minimum frequency of a word, such that it is regarded in the BoW-matrix. Words, which appear less often are disregarded.\n", "\n", "The training data is then mapped to this structure by \n", "```\n", "count_vectorizer.transform(X_train)\n", "```\n", "and\n", "```\n", "tfidf.transform(X_train),\n", "```\n", "respectively.\n", "\n", "For the test-data, however, no new matrix-structure is calculated. Instead the test-data is transformed to the structure of the matrix, defined by the training data." ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [], "source": [ "from sklearn.feature_extraction.text import TfidfTransformer\n", "from sklearn.feature_extraction.text import CountVectorizer\n", "from sklearn.metrics import confusion_matrix, classification_report, accuracy_score, ConfusionMatrixDisplay\n", "import matplotlib.pyplot as plt" ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Training data size: 16640\n", "Test data size: 4160\n" ] } ], "source": [ "train_data, test_data, train_labels, test_labels = train_test_split(data['total'], data['label'], train_size=0.8, random_state=1) \n", "print('Training data size: {}'.format(len(train_data)))\n", "print('Test data size: {}'.format(len(test_data)))\n", "train_data = train_data.values\n", "test_data = test_data.values\n", "train_labels = train_labels.values\n", "test_labels = test_labels.values" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Train BoW-models and transform training-data to BoW-matrix:" ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [], "source": [ "count_vectorizer = CountVectorizer(min_df=4)\n", "count_vectorizer.fit(train_data)\n", "freq_term_matrix_train = count_vectorizer.transform(train_data)\n", "tfidf = TfidfTransformer(norm = \"l2\")\n", "tfidf.fit(freq_term_matrix_train)\n", "tf_idf_matrix_train = tfidf.transform(freq_term_matrix_train)" ] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "(16640, 49086)\n", "(16640, 49086)\n" ] } ], "source": [ "print(freq_term_matrix_train.toarray().shape)\n", "print(tf_idf_matrix_train.toarray().shape)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Transform test-data to BoW-matrix:" ] }, { "cell_type": "code", "execution_count": 16, "metadata": {}, "outputs": [], "source": [ "freq_term_matrix_test = count_vectorizer.transform(test_data)\n", "tf_idf_matrix_test = tfidf.transform(freq_term_matrix_test)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Train a Naive Bayes calssifier\n", "\n", "We train on *term-frequencies* first, make predictions on the test set with this classifier and calculate the accuracy. Then we compare to the usage of *tf-idf-values*." ] }, { "cell_type": "code", "execution_count": 17, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "{'alpha': 1.0, 'class_prior': None, 'fit_prior': True, 'force_alpha': 'warn'}" ] }, "execution_count": 17, "metadata": {}, "output_type": "execute_result" } ], "source": [ "nb_tf_classifier = MultinomialNB()\n", "nb_tf_classifier.fit(freq_term_matrix_train, train_labels)\n", "nb_tf_classifier.get_params()" ] }, { "cell_type": "code", "execution_count": 18, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "0.9276442307692307" ] }, "execution_count": 18, "metadata": {}, "output_type": "execute_result" } ], "source": [ "tf_predictions = nb_tf_classifier.predict(freq_term_matrix_test)\n", "accuracy_score(test_labels, tf_predictions)" ] }, { "cell_type": "code", "execution_count": 19, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "0.9055288461538461" ] }, "execution_count": 19, "metadata": {}, "output_type": "execute_result" } ], "source": [ "nb_tfidf_classifier = MultinomialNB()\n", "nb_tfidf_classifier.fit(tf_idf_matrix_train, train_labels)\n", "tfidf_predictions = nb_tfidf_classifier.predict(tf_idf_matrix_test)\n", "accuracy_score(test_labels, tfidf_predictions)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Further evaluation" ] }, { "cell_type": "code", "execution_count": 20, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " precision recall f1-score support\n", "\n", " 0 0.85 0.99 0.91 2038\n", " 1 0.99 0.83 0.90 2122\n", "\n", " accuracy 0.91 4160\n", " macro avg 0.92 0.91 0.91 4160\n", "weighted avg 0.92 0.91 0.91 4160\n", "\n" ] } ], "source": [ "print(classification_report(test_labels, tfidf_predictions))" ] }, { "cell_type": "code", "execution_count": 21, "metadata": {}, "outputs": [ { "data": { "image/png": "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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "fig, ax = plt.subplots(figsize=(5, 5))\n", "disp = ConfusionMatrixDisplay.from_estimator(nb_tfidf_classifier, tf_idf_matrix_test, test_labels, display_labels=['reliable', 'fake'], xticks_rotation='vertical', ax=ax)\n", "#disp = ConfusionMatrixDisplay.from_estimator(nb_classifier, tf_idf_matrix_test, test_labels, normalize='true', display_labels=['reliable', 'fake'], xticks_rotation='vertical', ax=ax)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Train a linear classifier\n", "\n", "Below a [Logistic Regression model](https://scikit-learn.org/stable/modules/generated/sklearn.linear_model.LogisticRegression.html#sklearn.linear_model.LogisticRegression) is trained. This is just a linear classifier with a sigmoid- or softmax- activation-function. " ] }, { "cell_type": "code", "execution_count": 22, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " precision recall f1-score support\n", "\n", " 0 0.97 0.96 0.97 2038\n", " 1 0.96 0.97 0.97 2122\n", "\n", " accuracy 0.97 4160\n", " macro avg 0.97 0.97 0.97 4160\n", "weighted avg 0.97 0.97 0.97 4160\n", "\n" ] }, { "data": { "image/png": "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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "from sklearn.linear_model import LogisticRegression\n", "\n", "logreg = LogisticRegression()\n", "logreg.fit(tf_idf_matrix_train, train_labels)\n", "\n", "logreg_predictions = logreg.predict(tf_idf_matrix_test)\n", "\n", "print(classification_report(test_labels, logreg_predictions))\n", "\n", "fig, ax = plt.subplots(figsize=(5, 5))\n", "disp = ConfusionMatrixDisplay.from_estimator(logreg, tf_idf_matrix_test, test_labels, display_labels=['reliable', 'fake'], xticks_rotation='vertical', ax=ax)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Note: there is an acutal test set provided by the kaggle challenge. However it seems that the distribution of test-data is significantly different from the distribution of training-data. Since similar preprocessing an classifiers resultet in much worse evaluation scores (about 0.65 Accuracy). This is why we only used the official train data and splittet it to get meaningful results.\n", "\n", "Results of a logistic regression model on the actual `test.csv`:\n", "\n", " precision recall f1-score support\n", "\n", " 0 0.59 0.65 0.62 2339\n", " 1 0.69 0.63 0.66 2861\n", "\n", " accuracy 0.64 5200\n", " macro avg 0.64 0.64 0.64 5200\n", " weighted avg 0.64 0.64 0.64 5200" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3.9.12 ('nlp')", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.9.12" }, "toc": { "base_numbering": 1, "nav_menu": {}, "number_sections": true, "sideBar": true, "skip_h1_title": false, "title_cell": "Table of Contents", "title_sidebar": "Contents", "toc_cell": false, "toc_position": {}, "toc_section_display": true, "toc_window_display": false }, "vscode": { "interpreter": { "hash": "77fcc27d04427ac9b174429f8dd629c7fde3916c50938bd2a248d72e2e9d7309" } } }, "nbformat": 4, "nbformat_minor": 4 }