{ "cells": [ { "cell_type": "code", "execution_count": 1, "id": "9fad4e45", "metadata": {}, "outputs": [], "source": [ "import numpy as np\n", "import pandas as pd\n", "\n", "from sklearn.model_selection import train_test_split\n", "from sklearn.feature_extraction.text import TfidfVectorizer\n", "from sklearn.linear_model import PassiveAggressiveClassifier\n", "from sklearn.metrics import accuracy_score, confusion_matrix\n", "\n", "import seaborn as sn\n", "import matplotlib.pyplot as plt" ] }, { "cell_type": "code", "execution_count": 2, "id": "1252a3bd", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(6335, 4)" ] }, "execution_count": 2, "metadata": {}, "output_type": "execute_result" } ], "source": [ "#Read the data\n", "df=pd.read_csv('C:\\\\DataScienceProjects\\\\FakeNewsClassifier\\\\news.csv')\n", "\n", "#Get shape\n", "df.shape" ] }, { "cell_type": "code", "execution_count": 3, "id": "1738e4c9", "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", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
Unnamed: 0titletextlabel
08476You Can Smell Hillary’s FearDaniel Greenfield, a Shillman Journalism Fello...FAKE
110294Watch The Exact Moment Paul Ryan Committed Pol...Google Pinterest Digg Linkedin Reddit Stumbleu...FAKE
23608Kerry to go to Paris in gesture of sympathyU.S. Secretary of State John F. Kerry said Mon...REAL
310142Bernie supporters on Twitter erupt in anger ag...— Kaydee King (@KaydeeKing) November 9, 2016 T...FAKE
4875The Battle of New York: Why This Primary MattersIt's primary day in New York and front-runners...REAL
\n", "
" ], "text/plain": [ " Unnamed: 0 title \\\n", "0 8476 You Can Smell Hillary’s Fear \n", "1 10294 Watch The Exact Moment Paul Ryan Committed Pol... \n", "2 3608 Kerry to go to Paris in gesture of sympathy \n", "3 10142 Bernie supporters on Twitter erupt in anger ag... \n", "4 875 The Battle of New York: Why This Primary Matters \n", "\n", " text label \n", "0 Daniel Greenfield, a Shillman Journalism Fello... FAKE \n", "1 Google Pinterest Digg Linkedin Reddit Stumbleu... FAKE \n", "2 U.S. Secretary of State John F. Kerry said Mon... REAL \n", "3 — Kaydee King (@KaydeeKing) November 9, 2016 T... FAKE \n", "4 It's primary day in New York and front-runners... REAL " ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.head()" ] }, { "cell_type": "code", "execution_count": 4, "id": "de85f791", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "0 FAKE\n", "1 FAKE\n", "2 REAL\n", "3 FAKE\n", "4 REAL\n", "5 FAKE\n", "6 FAKE\n", "7 REAL\n", "Name: label, dtype: object" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "#DataFlair - Get the labels\n", "y=df.label\n", "y.head(8)" ] }, { "cell_type": "code", "execution_count": 5, "id": "7f0e61ba", "metadata": {}, "outputs": [], "source": [ "#DataFlair - Split the dataset\n", "x = df.text\n", "x_train,x_test,y_train,y_test=train_test_split(x, y, test_size=0.25, random_state=7)" ] }, { "cell_type": "code", "execution_count": 6, "id": "5ecf0c0b", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[[0. 0.46979139 0.58028582 0.38408524 0. 0.\n", " 0.38408524 0. 0.38408524]\n", " [0. 0.6876236 0. 0.28108867 0. 0.53864762\n", " 0.28108867 0. 0.28108867]\n", " [0.51184851 0. 0. 0.26710379 0.51184851 0.\n", " 0.26710379 0.51184851 0.26710379]\n", " [0. 0.46979139 0.58028582 0.38408524 0. 0.\n", " 0.38408524 0. 0.38408524]]\n", "['and' 'document' 'first' 'is' 'one' 'second' 'the' 'third' 'this']\n" ] } ], "source": [ "# Exploring the TF-IDF Vectorizerfrom sklearn.feature_extraction.text import TfidfVectorizer\n", "\n", "# Example documents\n", "documents = [\n", " \"This is the first document.\",\n", " \"This document is the second document.\",\n", " \"And this is the third one.\",\n", " \"Is this the first document?\",\n", "]\n", "\n", "# Create a TfidfVectorizer object\n", "tfidf_example_vectorizer = TfidfVectorizer()\n", "\n", "# Fit the vectorizer to the documents and transform the documents into a TF-IDF matrix\n", "tfidf_matrix = tfidf_example_vectorizer.fit_transform(documents)\n", "\n", "# Print the TF-IDF matrix\n", "print(tfidf_matrix.toarray())\n", "\n", "# Get the feature names (terms)\n", "print(tfidf_example_vectorizer.get_feature_names_out())\n" ] }, { "cell_type": "code", "execution_count": 7, "id": "639569db", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[[0. 0.46979139 0.58028582 0.38408524 0. 0.\n", " 0.38408524 0. 0.38408524]\n", " [0. 0.6876236 0. 0.28108867 0. 0.53864762\n", " 0.28108867 0. 0.28108867]\n", " [0.51184851 0. 0. 0.26710379 0.51184851 0.\n", " 0.26710379 0.51184851 0.26710379]\n", " [0. 0.46979139 0.58028582 0.38408524 0. 0.\n", " 0.38408524 0. 0.38408524]]\n", "['and' 'document' 'first' 'is' 'one' 'second' 'the' 'third' 'this']\n" ] } ], "source": [ "# Print the TF-IDF matrix\n", "print(tfidf_matrix.toarray())\n", "\n", "# Get the feature names (terms)\n", "print(tfidf_example_vectorizer.get_feature_names_out())\n" ] }, { "cell_type": "code", "execution_count": 8, "id": "42694dbe", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[[0. 1. 0. 0. 0. ]\n", " [0. 0. 0. 1. 0. ]\n", " [0.57735027 0. 0.57735027 0. 0.57735027]\n", " [0. 1. 0. 0. 0. ]]\n", "['and' 'first' 'one' 'second' 'third']\n" ] } ], "source": [ "# Create a TfidfVectorizer object specifying max_df\n", "# Terms with higher TF-IDF scores are considered more significant or unique to the document, \n", "# as they appear frequently in the document but infrequently across the corpus.\n", "\n", "\n", "# When max_df=0.5 is set in the context of TF-IDF vectorization, it means that terms (words) that occur in \n", "# more than 60% of the documents in the corpus will be ignored or not considered for TF-IDF calculation.\n", "\n", "# In other words, any term that occurs in more than 60% of the documents will be considered too common and will \n", "# be excluded from the vocabulary.\n", "max_dfVectorizer = TfidfVectorizer(max_df=0.6)\n", "\n", "# Fit the vectorizer to the documents and transform the documents into a TF-IDF matrix\n", "tfidf_matrix = max_dfVectorizer.fit_transform(documents)\n", "\n", "# Print the TF-IDF matrix\n", "print(tfidf_matrix.toarray())\n", "\n", "# Get the feature names (terms)\n", "print(max_dfVectorizer.get_feature_names_out())" ] }, { "cell_type": "code", "execution_count": 9, "id": "6ceb6071", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[[1. 0. ]\n", " [0.78722298 0.61666846]\n", " [0. 0. ]\n", " [1. 0. ]]\n", "['document' 'second']\n" ] } ], "source": [ "# Create a TfidfVectorizer object specifying stop words\n", "sw_vectorizer = TfidfVectorizer(stop_words='english')\n", "\n", "# Fit the vectorizer to the documents and transform the documents into a TF-IDF matrix\n", "tfidf_matrix = sw_vectorizer.fit_transform(documents)\n", "\n", "# Print the TF-IDF matrix\n", "print(tfidf_matrix.toarray())\n", "\n", "# Get the feature names (terms)\n", "print(sw_vectorizer.get_feature_names_out())" ] }, { "cell_type": "code", "execution_count": 10, "id": "5329750c", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[[0.]\n", " [1.]\n", " [0.]\n", " [0.]]\n", "['second']\n" ] } ], "source": [ "# Create a TfidfVectorizer object specifying stop words and max_df\n", "tfidf_example_vectorizer2 = TfidfVectorizer(stop_words='english', max_df=0.55)\n", "\n", "# Fit the vectorizer to the documents and transform the documents into a TF-IDF matrix\n", "tfidf_matrix = tfidf_example_vectorizer2.fit_transform(documents)\n", "\n", "# Print the TF-IDF matrix\n", "print(tfidf_matrix.toarray())\n", "\n", "# Get the feature names (terms)\n", "print(tfidf_example_vectorizer2.get_feature_names_out())" ] }, { "cell_type": "code", "execution_count": 11, "id": "181c9891", "metadata": {}, "outputs": [], "source": [ "# For the Fake News Dataset\n", "#Initialize a TfidfVectorizer\n", "tfidf_vectorizer=TfidfVectorizer(stop_words='english', max_df=0.7)\n", "\n", "#Fit and transform train set, transform test set\n", "tfidf_train=tfidf_vectorizer.fit_transform(x_train) \n", "tfidf_test=tfidf_vectorizer.transform(x_test)" ] }, { "cell_type": "code", "execution_count": 12, "id": "5b5cfcae", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[[0. 0. 0. ... 0. 0. 0. ]\n", " [0. 0. 0. ... 0. 0. 0. ]\n", " [0. 0. 0. ... 0. 0. 0. ]\n", " ...\n", " [0. 0. 0. ... 0. 0. 0. ]\n", " [0. 0.01146018 0. ... 0. 0. 0. ]\n", " [0. 0. 0. ... 0. 0. 0. ]]\n", "['00' '000' '0000' ... 'هذا' 'والمرضى' 'ยงade']\n" ] } ], "source": [ "# Print the TF-IDF matrix for training dataset\n", "print(tfidf_train.toarray())\n", "\n", "# Get the feature names (terms)\n", "print(tfidf_vectorizer.get_feature_names_out())" ] }, { "cell_type": "code", "execution_count": 13, "id": "558f3435", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[[0. 0. 0. ... 0. 0. 0.]\n", " [0. 0. 0. ... 0. 0. 0.]\n", " [0. 0. 0. ... 0. 0. 0.]\n", " ...\n", " [0. 0. 0. ... 0. 0. 0.]\n", " [0. 0. 0. ... 0. 0. 0.]\n", " [0. 0. 0. ... 0. 0. 0.]]\n", "['00' '000' '0000' ... 'هذا' 'والمرضى' 'ยงade']\n" ] } ], "source": [ "# Print the TF-IDF matrix for test dataset\n", "print(tfidf_test.toarray())\n", "\n", "# Get the feature names (terms)\n", "print(tfidf_vectorizer.get_feature_names_out())" ] }, { "cell_type": "code", "execution_count": 14, "id": "74a1d0bc", "metadata": {}, "outputs": [ { "data": { "text/html": [ "
PassiveAggressiveClassifier(max_iter=50)
In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook.
On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.
" ], "text/plain": [ "PassiveAggressiveClassifier(max_iter=50)" ] }, "execution_count": 14, "metadata": {}, "output_type": "execute_result" } ], "source": [ "#Initialize a PassiveAggressiveClassifier\n", "pac=PassiveAggressiveClassifier(max_iter=50)\n", "pac.fit(tfidf_train,y_train)\n" ] }, { "cell_type": "code", "execution_count": 15, "id": "d5dec4b5", "metadata": {}, "outputs": [], "source": [ "# To incorporate additional training data without retraining the model on the data it has already seen, \n", "# you can use the partial_fit() method available in the PassiveAggressiveClassifier.\n", "\n", "# pac.partial_fit(x_remaining_training_data, y_remaining_training_data)" ] }, { "cell_type": "code", "execution_count": 16, "id": "113ddecb", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Accuracy: 92.74%\n" ] } ], "source": [ "#Predict on the test set and calculate accuracy\n", "y_pred=pac.predict(tfidf_test)\n", "score=accuracy_score(y_test,y_pred)\n", "print(f'Accuracy: {round(score*100,2)}%')" ] }, { "cell_type": "code", "execution_count": 17, "id": "41d437a6", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Confusion Matrix:\n", "[[752 56]\n", " [ 59 717]]\n" ] }, { "data": { "text/plain": [ "array([752, 56], dtype=int64)" ] }, "execution_count": 17, "metadata": {}, "output_type": "execute_result" } ], "source": [ "#Build confusion matrix\n", "\n", "labels=['FAKE','REAL']\n", "c_m = confusion_matrix(y_test,y_pred, labels = labels)\n", "\n", "print(\"Confusion Matrix:\")\n", "print(c_m)\n", "\n", "c_m[labels.index('FAKE')]" ] }, { "cell_type": "code", "execution_count": 18, "id": "fcbddd38", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "752" ] }, "execution_count": 18, "metadata": {}, "output_type": "execute_result" } ], "source": [ "c_m[labels.index('FAKE')][labels.index('FAKE')]" ] }, { "cell_type": "code", "execution_count": 19, "id": "f93dda86", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "59" ] }, "execution_count": 19, "metadata": {}, "output_type": "execute_result" } ], "source": [ "c_m[labels.index('REAL')][labels.index('FAKE')]" ] }, { "cell_type": "code", "execution_count": 20, "id": "b77a3670", "metadata": {}, "outputs": [ { "data": { "image/png": "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HDlS9erVU7169fTmm2/+6XFnzpwp9Dqu7v+ja6/l6vqW4lyLxWLRY489pmXLlmnevHlq0KCB2rZtW2Dfr7/+Wl27dpV05W6hL7/8UsnJyXrxxReLfd6CrvPPYhw8eLB+//13BQcHs1YDKGEkGyh33NzcFBkZqd27d+db4FmQq79wU1JS8u07efKkqlSp4rDYKlasKEnKysqya792XYgktW3bVmvWrNG5c+e0c+dOtW7dWlFRUUpMTCx0/MDAwEKvQ5JDr+WPBg8erNOnT2vevHl67LHHCu2XmJgoDw8PffLJJ+rbt6/atGmjFi1aXNc5C1poW5iUlBSNHDlSzZo105kzZzR27NjrOieA60OygXIpOjpahmHoiSeeKHBBZU5OjtasWSNJ6tSpkyTZFnhelZycrO+//16RkZEOi+vqHRXfffedXfvVWAri5uamVq1a6e2335YkffPNN4X2jYyM1KZNm2zJxVXvvvuuvL29Tbst9Oabb9bzzz+v++67T4MGDSq0n8Vikbu7u9zc3GxtmZmZWrp0ab6+jqoW5ebmqn///rJYLPr0008VGxurt956SytXrrzhsQEUDc/ZQLnUunVrzZ07VyNGjFDz5s01fPhw3XrrrcrJydGePXs0f/58hYeH67777lPDhg315JNP6q233lKFChXUvXt3HT16VC+99JJq1qyp5557zmFx3XvvvQoICNDQoUM1ZcoUubu7KyEhQb/88otdv3nz5mnTpk3q0aOHatWqpd9//912x0fnzp0LHX/SpEn65JNP1LFjR02cOFEBAQF677339O9//1txcXHy9/d32LVca+rUqX/Zp0ePHpo+fboGDBigJ598UmfOnNHrr79e4O3JTZo0UWJiov75z3+qbt26qlix4nWts5g0aZK2bt2q9evXKzg4WGPGjFFSUpKGDh2qiIgIhYaGFntMAMVDsoFy64knnlDLli01Y8YMTZs2TampqfLw8FCDBg00YMAAPf3007a+c+fOVb169RQfH6+3335b/v7+uueeexQbG1vgGo3r5efnp3Xr1ikqKkoDBw7UTTfdpMcff1zdu3fX448/buvXrFkzrV+/XpMmTVJqaqoqVaqk8PBwffzxx7Y1DwVp2LChtm/frgkTJmjkyJHKzMxUo0aNtHjx4mI9idMsnTp10qJFizRt2jTdd999uvnmm/XEE0+oWrVq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A9dl37592rVrlzZv3qy9e/fati1btig5OVn79++362+1WrVy5Uq1bNlSHTt2zLcfKOsmTZqk119/XSdPnixS//fee081atTQt99+a/cdmjlzppYsWaLLly+bHDFQcqhT47rEx8erZcuWBd550rp1a8XHx2vGjBl27Z6envroo4/Ut29fderUSZ9//rmaNGli25+Wlqbff//d7pjAwMBiL7oDnKFDhw669dZbFRMTo9mzZ0uSLly4kO9ZMd7e3vLz81N8fLwefPBBhYeH2+2vXbu2xo8fr3//+9/q3bu3JOncuXPau3evXb+AgADVqlXLvAsCHIjKBootOztby5Yt0wMPPFDg/gceeEDLli1TdnZ2vn0eHh5asWKF2rVrp06dOum7776z7WvYsKGqV69ut+3evdu06wAcbfTo0VqwYIF++eUXSdLEiRPz/Z0eN26cdu/erW+//bbA75Cvr6+6du1qNx25efNmRURE2G0TJ04ssesCbhSvmAcAAKaisgEAAExFsgEAAExFsgEAAExFsgEAAExFsgEAAExFsgEAAExFsgEAAExFsgGUQ5MnT1azZs1snwcPHqw+ffqUeBxHjx6VxWLJ9/RLAK6FZAMoQYMHD5bFYpHFYpGHh4fq1q2rsWPH6uLFi6ae980331RCQkKR+pIgAHA03o0ClLB77rlHixcvVk5OjrZu3arHH39cFy9e1Ny5c+365eTkOOy9MP7+/g4ZBwCuB5UNoIRZrVYFBwerZs2aGjBggB555BGtXr3aNvWxaNEi1a1bV1arVYZh6Ny5c3ryySdVrVo1+fn5qVOnTvr222/txpw6daqCgoLk6+uroUOH5nuh3bXTKHl5eZo2bZrq168vq9WqWrVq6R//+IckKTQ0VJIUEREhi8WiDh062I5bvHixGjVqpIoVK+qWW27RnDlz7M7z9ddfKyIiQhUrVlSLFi20Z88eB/7kAJRVVDYAJ/Py8lJOTo4k6aefftKKFSv00Ucfyc3NTZLUo0cPBQQEaO3atfL399c777yjyMhI/fDDDwoICNCKFSs0adIkvf3222rbtq2WLl2qWbNmqW7duoWeMzo6WgsWLNCMGTN09913KyUlRf/5z38kXUkYWrZsqY0bN+rWW2+Vp6enJGnBggWaNGmSZs+erYiICO3Zs0dPPPGEfHx8NGjQIF28eFE9e/ZUp06dtGzZMh05ckTPPvusyT89AGWCAaDEDBo0yOjdu7ft81dffWUEBgYaffv2NSZNmmR4eHgYaWlptv2ff/654efnZ/z+++9249SrV8945513DMMwjNatWxtPPfWU3f5WrVoZt912W4HnPX/+vGG1Wo0FCxYUGOORI0cMScaePXvs2mvWrGksX77cru2VV14xWrdubRiGYbzzzjtGQECAcfHiRdv+uXPnFjgWANfCNApQwj755BNVqlRJFStWVOvWrdWuXTu99dZbkqTatWuratWqtr67d+9WRkaGAgMDValSJdt25MgR/fzzz5Kk77//Xq1bt7Y7x7Wf/+j7779XVlaWIiMjixzzqVOn9Msvv2jo0KF2cbz66qt2cdx2223y9vYuUhwAXAfTKEAJ69ixo+bOnSsPDw+FhITYLQL18fGx65uXl6fq1atr8+bN+ca56aabruv8Xl5exT4mLy9P0pWplFatWtntuzrdYxjGdcUDoPwj2QBKmI+Pj+rXr1+kvrfffrtSU1Pl7u6uOnXqFNinUaNG2rlzpx599FFb286dOwsdMywsTF5eXvr888/1+OOP59t/dY1Gbm6urS0oKEg333yzDh8+rEceeaTAcRs3bqylS5cqMzPTltD8WRwAXAfTKEAp1rlzZ7Vu3Vp9+vTRZ599pqNHj2r79u36v//7P+3atUuS9Oyzz2rRokVatGiRfvjhB02aNEkHDhwodMyKFStq/PjxGjdunN599139/PPP2rlzp+Lj4yVJ1apVk5eXl9atW6dff/1V586dk3TlQWGxsbF688039cMPP2jfvn1avHixpk+fLkkaMGCAKlSooKFDh+rgwYNau3atXn/9dZN/QgDKApINoBSzWCxau3at2rVrpyFDhqhBgwZ6+OGHdfToUQUFBUmS+vXrp4kTJ2r8+PFq3ry5jh07puHDh//puC+99JLGjBmjiRMnqlGjRurXr5/S0tIkSe7u7po1a5beeecdhYSEqHfv3pKkxx9/XAsXLlRCQoKaNGmi9u3bKyEhwXarbKVKlbRmzRodPHhQERERevHFFzVt2jQTfzoAygqLwUQrAAAwEZUNAABgKpINAABgKpINAABgKpINAABgKpINAABgKpINAABgKpINAABgKpINAABgKpINAABgKpINAABgKpINAABgKpINAABgqv8HUJjBLLt5e1EAAAAASUVORK5CYII=", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "sn.heatmap(c_m, annot=True, fmt='d', cmap='Blues', xticklabels=labels, yticklabels=labels)\n", "plt.xlabel('Predicted')\n", "plt.ylabel('Actual')\n", "plt.title('Confusion Matrix')\n", "plt.show()" ] }, { "cell_type": "code", "execution_count": null, "id": "daf0b39b", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "id": "20448c4b", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "id": "34c60c89", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "id": "74606135", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "id": "ac63ca62", "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 3 (ipykernel)", "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.11.5" } }, "nbformat": 4, "nbformat_minor": 5 }