{ "cells": [ { "cell_type": "markdown", "id": "ece502db-27d3-4a24-bb40-5dccf3d42f4c", "metadata": {}, "source": [ "# Logistic Regression" ] }, { "cell_type": "markdown", "id": "6f271d7e-29db-41ba-a4e3-80e541be8a32", "metadata": {}, "source": [ "## Imports" ] }, { "cell_type": "code", "execution_count": 1, "id": "9a1df8b8-16b2-43b3-817d-67cf5d0438cb", "metadata": {}, "outputs": [], "source": [ "from fastcore.all import *\n", "import numpy as np\n", "import scipy as sp\n", "import pandas as pd\n", "import matplotlib.pyplot as plt\n", "import seaborn as sns\n", "import random\n", "import nltk\n", "import re\n", "import string\n", "from sklearn.linear_model import LogisticRegression\n", "from sklearn import metrics\n", "from nltk.corpus import twitter_samples\n", "from rich.console import Console\n", "from nltk.corpus import stopwords # module for stop words that come with NLTK\n", "from nltk.stem import PorterStemmer # module for stemming\n", "from nltk.tokenize import TweetTokenizer # module for tokenizing strings" ] }, { "cell_type": "code", "execution_count": 2, "id": "2ede2468-2762-412a-a95f-6fa295d56f0d", "metadata": {}, "outputs": [], "source": [ "sns.set()\n", "console = Console()" ] }, { "cell_type": "markdown", "id": "6c04a079-0aac-4327-bea7-311570740015", "metadata": {}, "source": [ "## Download Dataset" ] }, { "cell_type": "code", "execution_count": 3, "id": "e7665ef5-3d13-453d-a240-51e994a78ccf", "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "[nltk_data] Downloading package twitter_samples to\n", "[nltk_data] /home/rahul.saraf/nltk_data...\n", "[nltk_data] Package twitter_samples is already up-to-date!\n", "[nltk_data] Downloading package stopwords to\n", "[nltk_data] /home/rahul.saraf/nltk_data...\n", "[nltk_data] Package stopwords is already up-to-date!\n" ] }, { "data": { "text/plain": [ "True" ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ "nltk.download('twitter_samples')\n", "nltk.download('stopwords')" ] }, { "cell_type": "code", "execution_count": 4, "id": "7e04909e-8aa3-4eef-813b-1bfdf3a9123a", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "{'contributors': None,\n", " 'coordinates': None,\n", " 'text': 'hopeless for tmr :(',\n", " 'user': {'screen_name': 'yuwraxkim',\n", " 'time_zone': 'Jakarta',\n", " 'profile_background_image_url': 'http://pbs.twimg.com/profile_background_images/585476378365014016/j1mvQu3c.png',\n", " 'profile_background_image_url_https': 'https://pbs.twimg.com/profile_background_images/585476378365014016/j1mvQu3c.png',\n", " 'default_profile_image': False,\n", " 'url': None,\n", " 'profile_text_color': '000000',\n", " 'following': False,\n", " 'listed_count': 3,\n", " 'entities': {'description': {'urls': []}},\n", " 'utc_offset': 25200,\n", " 'profile_sidebar_border_color': '000000',\n", " 'name': 'yuwra ✈ ',\n", " 'favourites_count': 196,\n", " 'followers_count': 1281,\n", " 'location': 'wearegsd;favor;pucukfams;barbx',\n", " 'protected': False,\n", " 'notifications': False,\n", " 'profile_image_url_https': 'https://pbs.twimg.com/profile_images/622631732399898624/kmYsX_k1_normal.jpg',\n", " 'profile_use_background_image': True,\n", " 'profile_image_url': 'http://pbs.twimg.com/profile_images/622631732399898624/kmYsX_k1_normal.jpg',\n", " 'lang': 'id',\n", " 'statuses_count': 19710,\n", " 'friends_count': 1264,\n", " 'profile_banner_url': 'https://pbs.twimg.com/profile_banners/3078803375/1433287528',\n", " 'geo_enabled': True,\n", " 'is_translator': False,\n", " 'contributors_enabled': False,\n", " 'profile_sidebar_fill_color': '000000',\n", " 'created_at': 'Sun Mar 08 05:43:40 +0000 2015',\n", " 'verified': False,\n", " 'profile_link_color': '000000',\n", " 'is_translation_enabled': False,\n", " 'has_extended_profile': False,\n", " 'id_str': '3078803375',\n", " 'follow_request_sent': False,\n", " 'profile_background_color': '000000',\n", " 'default_profile': False,\n", " 'profile_background_tile': True,\n", " 'id': 3078803375,\n", " 'description': '⇨ [V] TravelGency █ 2/4 Goddest from Girls Day █ 92L █ sucrp'},\n", " 'retweet_count': 0,\n", " 'favorited': False,\n", " 'entities': {'hashtags': [], 'user_mentions': [], 'urls': [], 'symbols': []},\n", " 'source': '<a href=\"https://mobile.twitter.com\" rel=\"nofollow\">Mobile Web (M2)</a>',\n", " 'truncated': False,\n", " 'geo': None,\n", " 'in_reply_to_status_id_str': None,\n", " 'is_quote_status': False,\n", " 'in_reply_to_user_id_str': None,\n", " 'place': None,\n", " 'in_reply_to_status_id': None,\n", " 'in_reply_to_screen_name': None,\n", " 'lang': 'en',\n", " 'retweeted': False,\n", " 'in_reply_to_user_id': None,\n", " 'created_at': 'Fri Jul 24 10:42:49 +0000 2015',\n", " 'metadata': {'iso_language_code': 'en', 'result_type': 'recent'},\n", " 'favorite_count': 0,\n", " 'id_str': '624530164626534400',\n", " 'id': 624530164626534400}" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "L(twitter_samples.docs())[0]" ] }, { "cell_type": "code", "execution_count": 5, "id": "be8f9dd8-b382-4423-8b84-99d8059a7bfb", "metadata": {}, "outputs": [], "source": [ "ptweets = twitter_samples.strings('positive_tweets.json')\n", "ntweets = twitter_samples.strings('negative_tweets.json')" ] }, { "cell_type": "code", "execution_count": 6, "id": "a7df9941-17f4-4214-8b6f-aacbd040bccf", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(5000, 5000)" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "len(ptweets), len(ntweets)" ] }, { "cell_type": "code", "execution_count": 7, "id": "c724e814-4681-4d33-be40-30eadf3a4bbc", "metadata": {}, "outputs": [ { "data": { "text/html": [ "<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"><span style=\"color: #008000; text-decoration-color: #008000\">Hi BAM ! @BarsAndMelody </span>\n", "<span style=\"color: #008000; text-decoration-color: #008000\">Can you follow my bestfriend @969Horan696 ? </span>\n", "<span style=\"color: #008000; text-decoration-color: #008000\">She loves you a lot :</span><span style=\"color: #008000; text-decoration-color: #008000; font-weight: bold\">)</span><span style=\"color: #008000; text-decoration-color: #008000\"> </span>\n", "<span style=\"color: #008000; text-decoration-color: #008000\">See you in Warsaw &lt;</span><span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">3</span><span style=\"color: #008000; text-decoration-color: #008000\"> </span>\n", "<span style=\"color: #008000; text-decoration-color: #008000\">Love you &lt;</span><span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">3</span><span style=\"color: #008000; text-decoration-color: #008000\"> x23</span>\n", "</pre>\n" ], "text/plain": [ "\u001b[32mHi BAM ! @BarsAndMelody \u001b[0m\n", "\u001b[32mCan you follow my bestfriend @969Horan696 ? \u001b[0m\n", "\u001b[32mShe loves you a lot :\u001b[0m\u001b[1;32m)\u001b[0m\u001b[32m \u001b[0m\n", "\u001b[32mSee you in Warsaw <\u001b[0m\u001b[1;36m3\u001b[0m\u001b[32m \u001b[0m\n", "\u001b[32mLove you <\u001b[0m\u001b[1;36m3\u001b[0m\u001b[32m x23\u001b[0m\n" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"><span style=\"color: #800000; text-decoration-color: #800000\">Mtaani tunaita pussy viazi choma and we still get laid :-</span><span style=\"color: #800000; text-decoration-color: #800000; font-weight: bold\">(</span>\n", "</pre>\n" ], "text/plain": [ "\u001b[31mMtaani tunaita pussy viazi choma and we still get laid :-\u001b[0m\u001b[1;31m(\u001b[0m\n" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "console.print(ptweets[random.randint(0,5000)], style='green')\n", "console.print(ntweets[random.randint(0,5000)], style='red')" ] }, { "cell_type": "markdown", "id": "611ea39a-8c60-4543-8a5d-5ab1ce384fd5", "metadata": {}, "source": [ "## Preprocessing" ] }, { "cell_type": "markdown", "id": "c39c94f0-7168-456b-b721-7e85cffdfa93", "metadata": {}, "source": [ "```{admonition} What are we going to do?\n", "1. Remove hyperlinks, twitter marks and styles\n", "2. Tokenize\n", "3. Remove Stopwords\n", "4. Stemming\n", "```" ] }, { "cell_type": "markdown", "id": "dedeeaf4-7a23-4a7c-9272-6c385ef18f97", "metadata": {}, "source": [ "### Remove hyperlinks, twitter marks and styles" ] }, { "cell_type": "code", "execution_count": 8, "id": "065f0a82-93bf-4ae8-b6ff-9cc869a41788", "metadata": {}, "outputs": [ { "data": { "text/html": [ "<div>\n", "<style scoped>\n", " .dataframe tbody tr th:only-of-type {\n", " vertical-align: middle;\n", " }\n", "\n", " .dataframe tbody tr th {\n", " vertical-align: top;\n", " }\n", "\n", " .dataframe thead th {\n", " text-align: right;\n", " }\n", "</style>\n", "<table border=\"1\" class=\"dataframe\">\n", " <thead>\n", " <tr style=\"text-align: right;\">\n", " <th></th>\n", " <th>class</th>\n", " <th>Tweet</th>\n", " </tr>\n", " </thead>\n", " <tbody>\n", " <tr>\n", " <th>0</th>\n", " <td>positive</td>\n", " <td>#FollowFriday @France_Inte @PKuchly57 @Milipol_Paris for being top engaged members in my community this week :)</td>\n", " </tr>\n", " <tr>\n", " <th>1</th>\n", " <td>positive</td>\n", " <td>@Lamb2ja Hey James! How odd :/ Please call our Contact Centre on 02392441234 and we will be able to assist you :) Many thanks!</td>\n", " </tr>\n", " <tr>\n", " <th>2</th>\n", " <td>positive</td>\n", " <td>@DespiteOfficial we had a listen last night :) As You Bleed is an amazing track. When are you in Scotland?!</td>\n", " </tr>\n", " <tr>\n", " <th>3</th>\n", " <td>positive</td>\n", " <td>@97sides CONGRATS :)</td>\n", " </tr>\n", " <tr>\n", " <th>4</th>\n", " <td>positive</td>\n", " <td>yeaaaah yippppy!!! my accnt verified rqst has succeed got a blue tick mark on my fb profile :) in 15 days</td>\n", " </tr>\n", " <tr>\n", " <th>...</th>\n", " <td>...</td>\n", " <td>...</td>\n", " </tr>\n", " <tr>\n", " <th>9995</th>\n", " <td>negative</td>\n", " <td>I wanna change my avi but uSanele :(</td>\n", " </tr>\n", " <tr>\n", " <th>9996</th>\n", " <td>negative</td>\n", " <td>MY PUPPY BROKE HER FOOT :(</td>\n", " </tr>\n", " <tr>\n", " <th>9997</th>\n", " <td>negative</td>\n", " <td>where's all the jaebum baby pictures :((</td>\n", " </tr>\n", " <tr>\n", " <th>9998</th>\n", " <td>negative</td>\n", " <td>But but Mr Ahmad Maslan cooks too :( https://t.co/ArCiD31Zv6</td>\n", " </tr>\n", " <tr>\n", " <th>9999</th>\n", " <td>negative</td>\n", " <td>@eawoman As a Hull supporter I am expecting a misserable few weeks :-(</td>\n", " </tr>\n", " </tbody>\n", "</table>\n", "<p>10000 rows × 2 columns</p>\n", "</div>" ], "text/plain": [ " class \\\n", "0 positive \n", "1 positive \n", "2 positive \n", "3 positive \n", "4 positive \n", "... ... \n", "9995 negative \n", "9996 negative \n", "9997 negative \n", "9998 negative \n", "9999 negative \n", "\n", " Tweet \n", "0 #FollowFriday @France_Inte @PKuchly57 @Milipol_Paris for being top engaged members in my community this week :) \n", "1 @Lamb2ja Hey James! How odd :/ Please call our Contact Centre on 02392441234 and we will be able to assist you :) Many thanks! \n", "2 @DespiteOfficial we had a listen last night :) As You Bleed is an amazing track. When are you in Scotland?! \n", "3 @97sides CONGRATS :) \n", "4 yeaaaah yippppy!!! my accnt verified rqst has succeed got a blue tick mark on my fb profile :) in 15 days \n", "... ... \n", "9995 I wanna change my avi but uSanele :( \n", "9996 MY PUPPY BROKE HER FOOT :( \n", "9997 where's all the jaebum baby pictures :(( \n", "9998 But but Mr Ahmad Maslan cooks too :( https://t.co/ArCiD31Zv6 \n", "9999 @eawoman As a Hull supporter I am expecting a misserable few weeks :-( \n", "\n", "[10000 rows x 2 columns]" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "df = pd.DataFrame({'positive':ptweets, 'negative':ntweets})\\\n", " .unstack().reset_index().drop(columns=['level_1'])\\\n", " .rename(columns={0:'Tweet', 'level_0':'class'})\n", "with pd.option_context('max_colwidth', 0):\n", " display(df)" ] }, { "cell_type": "code", "execution_count": 9, "id": "21ed528d-b557-4141-93cd-a46683943791", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "class negative\n", "Tweet @Camy19994 FOLLOWED ME THANKS, AND\\n@justinbie...\n", "Name: 7777, dtype: object" ] }, "execution_count": 9, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.iloc[2777+5000]" ] }, { "cell_type": "code", "execution_count": 10, "id": "83581eb6-cb91-4538-906c-aebe881b46c1", "metadata": {}, "outputs": [], "source": [ "tweet = df.iloc[0]['Tweet']\n", "remove_old_style = lambda tweet: re.sub(r'^RT[\\s]+', '', tweet)\n", "remove_url = lambda tweet: re.sub(r'https?://[^\\s\\n\\r]+', '', tweet)\n", "remove_hash = lambda tweet: re.sub(r'#', '', tweet)\n", "tokenizer = TweetTokenizer(preserve_case=False, strip_handles=True,\n", " reduce_len=True)\n", " \n", "stopwords_english = stopwords.words('english')\n", "stemmer = PorterStemmer() \n", "skip_words = stopwords_english+list(string.punctuation)\n", "# stopwords_english\n", "# tweet, set(tokenizer.tokenize(remove_hash(tweet))) - set(stopwords_english)\n", "def process_tweet(tweet):\n", " clean_tweet = remove_hash(remove_url(remove_old_style(tweet)))\n", " tokens = tokenizer.tokenize(clean_tweet)\n", " return [stemmer.stem(word) for word in tokens \n", " if word not in skip_words]" ] }, { "cell_type": "code", "execution_count": 11, "id": "17d9752f-ebbd-424b-8c7d-757167026bfe", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "0 [followfriday, top, engag, member, commun, wee...\n", "1 [hey, jame, odd, :/, pleas, call, contact, cen...\n", "2 [listen, last, night, :), bleed, amaz, track, ...\n", "3 [congrat, :)]\n", "4 [yeaaah, yipppi, accnt, verifi, rqst, succeed,...\n", " ... \n", "9995 [wanna, chang, avi, usanel, :(]\n", "9996 [puppi, broke, foot, :(]\n", "9997 [where', jaebum, babi, pictur, :(]\n", "9998 [mr, ahmad, maslan, cook, :(]\n", "9999 [hull, support, expect, misser, week, :-(]\n", "Name: PTweet, Length: 10000, dtype: object" ] }, "execution_count": 11, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df['PTweet']=df['Tweet'].apply(process_tweet)\n", "df['PTweet']" ] }, { "cell_type": "code", "execution_count": 12, "id": "e991eaed-27c4-494f-9b3e-dcc09d875209", "metadata": {}, "outputs": [], "source": [ "toks = df['PTweet'].sum()\n", "\n" ] }, { "cell_type": "markdown", "id": "f4741caa-c2a2-4a92-905b-93e67a5ea090", "metadata": {}, "source": [ "## Feature Engineering" ] }, { "cell_type": "markdown", "id": "017801d9-6e22-41fe-ba4c-88b308a6cf9b", "metadata": {}, "source": [ "### Building Frequency Dictionary" ] }, { "cell_type": "code", "execution_count": 13, "id": "9b7e36c6-2bda-4ec8-bad8-25fc45d05cd7", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "{'positive': 32, 'negative': 6}" ] }, "execution_count": 13, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.loc[0,'PTweet']\n", "\n", "def contains_tok(tweet_tokens, tok):\n", " in_tokens = False\n", " if tok in tweet_tokens: in_tokens = True\n", " return in_tokens\n", "\n", "df[df.apply(lambda row: contains_tok(row['PTweet'], toks[1]), axis=1)]['class'].value_counts().to_dict()\n", "# contains_tok(df.loc[0,'PTweet'], toks[0])" ] }, { "cell_type": "code", "execution_count": 14, "id": "8aa8b87b-3d44-4f46-8642-06060c967bbe", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "['children',\n", " 'latin',\n", " 'bilal',\n", " 'leno',\n", " 'savag',\n", " 'hyung',\n", " 'braxton',\n", " 'statement',\n", " 'convinc',\n", " 'therefor']" ] }, "execution_count": 14, "metadata": {}, "output_type": "execute_result" } ], "source": [ "toks = list(set(df['PTweet'].sum()))\n", "toks[:10]\n" ] }, { "cell_type": "code", "execution_count": 15, "id": "7ea37889-14b1-4123-8f43-968d8feec5b5", "metadata": {}, "outputs": [ { "data": { "text/html": [ "<div>\n", "<style scoped>\n", " .dataframe tbody tr th:only-of-type {\n", " vertical-align: middle;\n", " }\n", "\n", " .dataframe tbody tr th {\n", " vertical-align: top;\n", " }\n", "\n", " .dataframe thead th {\n", " text-align: right;\n", " }\n", "</style>\n", "<table border=\"1\" class=\"dataframe\">\n", " <thead>\n", " <tr style=\"text-align: right;\">\n", " <th></th>\n", " <th>positive</th>\n", " <th>negative</th>\n", " </tr>\n", " <tr>\n", " <th>word</th>\n", " <th></th>\n", " <th></th>\n", " </tr>\n", " </thead>\n", " <tbody>\n", " <tr>\n", " <th>children</th>\n", " <td>3.0</td>\n", " <td>2.0</td>\n", " </tr>\n", " <tr>\n", " <th>latin</th>\n", " <td>3.0</td>\n", " <td>0.0</td>\n", " </tr>\n", " <tr>\n", " <th>bilal</th>\n", " <td>0.0</td>\n", " <td>1.0</td>\n", " </tr>\n", " <tr>\n", " <th>leno</th>\n", " <td>0.0</td>\n", " <td>1.0</td>\n", " </tr>\n", " <tr>\n", " <th>savag</th>\n", " <td>1.0</td>\n", " <td>0.0</td>\n", " </tr>\n", " <tr>\n", " <th>hyung</th>\n", " <td>0.0</td>\n", " <td>1.0</td>\n", " </tr>\n", " <tr>\n", " <th>braxton</th>\n", " <td>0.0</td>\n", " <td>1.0</td>\n", " </tr>\n", " <tr>\n", " <th>statement</th>\n", " <td>1.0</td>\n", " <td>1.0</td>\n", " </tr>\n", " <tr>\n", " <th>convinc</th>\n", " <td>0.0</td>\n", " <td>3.0</td>\n", " </tr>\n", " <tr>\n", " <th>therefor</th>\n", " <td>0.0</td>\n", " <td>1.0</td>\n", " </tr>\n", " </tbody>\n", "</table>\n", "</div>" ], "text/plain": [ " positive negative\n", "word \n", "children 3.0 2.0\n", "latin 3.0 0.0\n", "bilal 0.0 1.0\n", "leno 0.0 1.0\n", "savag 1.0 0.0\n", "hyung 0.0 1.0\n", "braxton 0.0 1.0\n", "statement 1.0 1.0\n", "convinc 0.0 3.0\n", "therefor 0.0 1.0" ] }, "execution_count": 15, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# toks[:10]\n", "pd.DataFrame([{'word':tok, \n", " **df[df.apply(lambda row: contains_tok(row['PTweet'], tok), axis=1)]['class'].value_counts().to_dict()} \n", " for tok in toks[:10]]).fillna(0).set_index('word')" ] }, { "cell_type": "code", "execution_count": 16, "id": "05bbbc2e-9684-4f6e-9696-8ffbeaf7733e", "metadata": {}, "outputs": [], "source": [ "def build_freqs(df):\n", " toks = list(set(df['PTweet'].sum()))\n", " return pd.DataFrame([{'word':tok, \n", " **df[df.apply(lambda row: contains_tok(row['PTweet'], tok), axis=1)]['class'].value_counts().to_dict()} \n", " for tok in toks]).fillna(0).set_index('word')\n", " " ] }, { "cell_type": "code", "execution_count": 17, "id": "c809697c-8a6f-4928-bcb1-344d304ec025", "metadata": {}, "outputs": [ { "data": { "text/html": [ "<div>\n", "<style scoped>\n", " .dataframe tbody tr th:only-of-type {\n", " vertical-align: middle;\n", " }\n", "\n", " .dataframe tbody tr th {\n", " vertical-align: top;\n", " }\n", "\n", " .dataframe thead th {\n", " text-align: right;\n", " }\n", "</style>\n", "<table border=\"1\" class=\"dataframe\">\n", " <thead>\n", " <tr style=\"text-align: right;\">\n", " <th></th>\n", " <th>positive</th>\n", " <th>negative</th>\n", " </tr>\n", " <tr>\n", " <th>word</th>\n", " <th></th>\n", " <th></th>\n", " </tr>\n", " </thead>\n", " <tbody>\n", " <tr>\n", " <th>children</th>\n", " <td>3.0</td>\n", " <td>2.0</td>\n", " </tr>\n", " <tr>\n", " <th>latin</th>\n", " <td>3.0</td>\n", " <td>0.0</td>\n", " </tr>\n", " <tr>\n", " <th>bilal</th>\n", " <td>0.0</td>\n", " <td>1.0</td>\n", " </tr>\n", " <tr>\n", " <th>leno</th>\n", " <td>0.0</td>\n", " <td>1.0</td>\n", " </tr>\n", " <tr>\n", " <th>savag</th>\n", " <td>1.0</td>\n", " <td>0.0</td>\n", " </tr>\n", " </tbody>\n", "</table>\n", "</div>" ], "text/plain": [ " positive negative\n", "word \n", "children 3.0 2.0\n", "latin 3.0 0.0\n", "bilal 0.0 1.0\n", "leno 0.0 1.0\n", "savag 1.0 0.0" ] }, "execution_count": 17, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df_freq=build_freqs(df); df_freq.head()" ] }, { "cell_type": "code", "execution_count": 18, "id": "eca4eaf8-d0d3-4a52-8ebe-257d6928755e", "metadata": {}, "outputs": [ { "data": { "text/html": [ "<div>\n", "<style scoped>\n", " .dataframe tbody tr th:only-of-type {\n", " vertical-align: middle;\n", " }\n", "\n", " .dataframe tbody tr th {\n", " vertical-align: top;\n", " }\n", "\n", " .dataframe thead th {\n", " text-align: right;\n", " }\n", "</style>\n", "<table border=\"1\" class=\"dataframe\">\n", " <thead>\n", " <tr style=\"text-align: right;\">\n", " <th></th>\n", " <th>positive</th>\n", " <th>negative</th>\n", " </tr>\n", " </thead>\n", " <tbody>\n", " <tr>\n", " <th>count</th>\n", " <td>10507.000000</td>\n", " <td>10507.000000</td>\n", " </tr>\n", " <tr>\n", " <th>mean</th>\n", " <td>3.172361</td>\n", " <td>3.077567</td>\n", " </tr>\n", " <tr>\n", " <th>std</th>\n", " <td>37.991689</td>\n", " <td>44.787129</td>\n", " </tr>\n", " <tr>\n", " <th>min</th>\n", " <td>0.000000</td>\n", " <td>0.000000</td>\n", " </tr>\n", " <tr>\n", " <th>25%</th>\n", " <td>0.000000</td>\n", " <td>0.000000</td>\n", " </tr>\n", " <tr>\n", " <th>50%</th>\n", " <td>1.000000</td>\n", " <td>1.000000</td>\n", " </tr>\n", " <tr>\n", " <th>75%</th>\n", " <td>1.000000</td>\n", " <td>1.000000</td>\n", " </tr>\n", " <tr>\n", " <th>max</th>\n", " <td>3541.000000</td>\n", " <td>4422.000000</td>\n", " </tr>\n", " </tbody>\n", "</table>\n", "</div>" ], "text/plain": [ " positive negative\n", "count 10507.000000 10507.000000\n", "mean 3.172361 3.077567\n", "std 37.991689 44.787129\n", "min 0.000000 0.000000\n", "25% 0.000000 0.000000\n", "50% 1.000000 1.000000\n", "75% 1.000000 1.000000\n", "max 3541.000000 4422.000000" ] }, "execution_count": 18, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df_freq.describe()" ] }, { "cell_type": "code", "execution_count": 19, "id": "bbd2cd17-7123-409c-9138-db9ea139371d", "metadata": {}, "outputs": [ { "data": { "text/html": [ "<div>\n", "<style scoped>\n", " .dataframe tbody tr th:only-of-type {\n", " vertical-align: middle;\n", " }\n", "\n", " .dataframe tbody tr th {\n", " vertical-align: top;\n", " }\n", "\n", " .dataframe thead th {\n", " text-align: right;\n", " }\n", "</style>\n", "<table border=\"1\" class=\"dataframe\">\n", " <thead>\n", " <tr style=\"text-align: right;\">\n", " <th></th>\n", " <th>positive</th>\n", " <th>negative</th>\n", " </tr>\n", " <tr>\n", " <th>word</th>\n", " <th></th>\n", " <th></th>\n", " </tr>\n", " </thead>\n", " <tbody>\n", " <tr>\n", " <th>:)</th>\n", " <td>3541.0</td>\n", " <td>2.0</td>\n", " </tr>\n", " <tr>\n", " <th>:-)</th>\n", " <td>669.0</td>\n", " <td>0.0</td>\n", " </tr>\n", " <tr>\n", " <th>thank</th>\n", " <td>636.0</td>\n", " <td>105.0</td>\n", " </tr>\n", " <tr>\n", " <th>:d</th>\n", " <td>628.0</td>\n", " <td>0.0</td>\n", " </tr>\n", " <tr>\n", " <th>follow</th>\n", " <td>365.0</td>\n", " <td>169.0</td>\n", " </tr>\n", " <tr>\n", " <th>...</th>\n", " <td>...</td>\n", " <td>...</td>\n", " </tr>\n", " <tr>\n", " <th>💎</th>\n", " <td>0.0</td>\n", " <td>1.0</td>\n", " </tr>\n", " <tr>\n", " <th>gate</th>\n", " <td>0.0</td>\n", " <td>1.0</td>\n", " </tr>\n", " <tr>\n", " <th>goodmus</th>\n", " <td>0.0</td>\n", " <td>4.0</td>\n", " </tr>\n", " <tr>\n", " <th>322</th>\n", " <td>0.0</td>\n", " <td>1.0</td>\n", " </tr>\n", " <tr>\n", " <th>3a2ad</th>\n", " <td>0.0</td>\n", " <td>1.0</td>\n", " </tr>\n", " </tbody>\n", "</table>\n", "<p>10507 rows × 2 columns</p>\n", "</div>" ], "text/plain": [ " positive negative\n", "word \n", ":) 3541.0 2.0\n", ":-) 669.0 0.0\n", "thank 636.0 105.0\n", ":d 628.0 0.0\n", "follow 365.0 169.0\n", "... ... ...\n", "💎 0.0 1.0\n", "gate 0.0 1.0\n", "goodmus 0.0 4.0\n", "322 0.0 1.0\n", "3a2ad 0.0 1.0\n", "\n", "[10507 rows x 2 columns]" ] }, "execution_count": 19, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df_freq.sort_values(by='positive', ascending=False)" ] }, { "cell_type": "code", "execution_count": 20, "id": "c16bd5f0-a78c-407e-95f5-d05068f8318e", "metadata": {}, "outputs": [ { "data": { "text/html": [ "<div>\n", "<style scoped>\n", " .dataframe tbody tr th:only-of-type {\n", " vertical-align: middle;\n", " }\n", "\n", " .dataframe tbody tr th {\n", " vertical-align: top;\n", " }\n", "\n", " .dataframe thead th {\n", " text-align: right;\n", " }\n", "</style>\n", "<table border=\"1\" class=\"dataframe\">\n", " <thead>\n", " <tr style=\"text-align: right;\">\n", " <th></th>\n", " <th>positive</th>\n", " <th>negative</th>\n", " </tr>\n", " <tr>\n", " <th>word</th>\n", " <th></th>\n", " <th></th>\n", " </tr>\n", " </thead>\n", " <tbody>\n", " <tr>\n", " <th>:(</th>\n", " <td>1.0</td>\n", " <td>4422.0</td>\n", " </tr>\n", " <tr>\n", " <th>:-(</th>\n", " <td>0.0</td>\n", " <td>481.0</td>\n", " </tr>\n", " <tr>\n", " <th>i'm</th>\n", " <td>173.0</td>\n", " <td>318.0</td>\n", " </tr>\n", " <tr>\n", " <th>miss</th>\n", " <td>27.0</td>\n", " <td>296.0</td>\n", " </tr>\n", " <tr>\n", " <th>...</th>\n", " <td>253.0</td>\n", " <td>284.0</td>\n", " </tr>\n", " <tr>\n", " <th>...</th>\n", " <td>...</td>\n", " <td>...</td>\n", " </tr>\n", " <tr>\n", " <th>swasa</th>\n", " <td>1.0</td>\n", " <td>0.0</td>\n", " </tr>\n", " <tr>\n", " <th>soph</th>\n", " <td>1.0</td>\n", " <td>0.0</td>\n", " </tr>\n", " <tr>\n", " <th>ef</th>\n", " <td>1.0</td>\n", " <td>0.0</td>\n", " </tr>\n", " <tr>\n", " <th>cocoar</th>\n", " <td>1.0</td>\n", " <td>0.0</td>\n", " </tr>\n", " <tr>\n", " <th>kw</th>\n", " <td>2.0</td>\n", " <td>0.0</td>\n", " </tr>\n", " </tbody>\n", "</table>\n", "<p>10507 rows × 2 columns</p>\n", "</div>" ], "text/plain": [ " positive negative\n", "word \n", ":( 1.0 4422.0\n", ":-( 0.0 481.0\n", "i'm 173.0 318.0\n", "miss 27.0 296.0\n", "... 253.0 284.0\n", "... ... ...\n", "swasa 1.0 0.0\n", "soph 1.0 0.0\n", "ef 1.0 0.0\n", "cocoar 1.0 0.0\n", "kw 2.0 0.0\n", "\n", "[10507 rows x 2 columns]" ] }, "execution_count": 20, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df_freq.sort_values(by='negative', ascending=False)" ] }, { "cell_type": "markdown", "id": "d4d65031-568e-4088-9067-96addcb09bcb", "metadata": {}, "source": [ "### Scoring Tweets" ] }, { "cell_type": "code", "execution_count": 21, "id": "a799d5ea-c40f-4f72-803a-c6b062a12b95", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "{'positive': 3737.0, 'negative': 69.0}" ] }, "execution_count": 21, "metadata": {}, "output_type": "execute_result" } ], "source": [ "tweet_token=df['PTweet'][0]\n", "df_freq.loc[tweet_token].sum().to_dict()" ] }, { "cell_type": "code", "execution_count": 22, "id": "8c3ded61-c976-4300-bcc5-73d0430298c4", "metadata": {}, "outputs": [], "source": [ "# pd.DataFrame(df.apply(lambda row: ,axis=1))\n", "\n", "def score_tweet(tweet_tokens): \n", " l = df_freq.loc[tweet_tokens].sum().tolist()\n", " l.append(1.0)\n", " return l" ] }, { "cell_type": "code", "execution_count": 23, "id": "12ee70da-9cc8-47a3-9152-24b72039cfdd", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "[3737.0, 69.0, 1.0]" ] }, "execution_count": 23, "metadata": {}, "output_type": "execute_result" } ], "source": [ "score_tweet(tweet_token)" ] }, { "cell_type": "code", "execution_count": 24, "id": "e0979071-8ccc-4cb4-9ef0-ba4e193fc29f", "metadata": {}, "outputs": [], "source": [ "df['positive'], df['negative'], df['bias']=zip(*df['PTweet'].map(score_tweet))" ] }, { "cell_type": "code", "execution_count": 25, "id": "34b2a736-bdf3-4bf0-931a-fb4f969c8ff1", "metadata": {}, "outputs": [ { "data": { "text/html": [ "<div>\n", "<style scoped>\n", " .dataframe tbody tr th:only-of-type {\n", " vertical-align: middle;\n", " }\n", "\n", " .dataframe tbody tr th {\n", " vertical-align: top;\n", " }\n", "\n", " .dataframe thead th {\n", " text-align: right;\n", " }\n", "</style>\n", "<table border=\"1\" class=\"dataframe\">\n", " <thead>\n", " <tr style=\"text-align: right;\">\n", " <th></th>\n", " <th>class</th>\n", " <th>Tweet</th>\n", " <th>PTweet</th>\n", " <th>positive</th>\n", " <th>negative</th>\n", " <th>bias</th>\n", " </tr>\n", " </thead>\n", " <tbody>\n", " <tr>\n", " <th>0</th>\n", " <td>positive</td>\n", " <td>#FollowFriday @France_Inte @PKuchly57 @Milipol...</td>\n", " <td>[followfriday, top, engag, member, commun, wee...</td>\n", " <td>3737.0</td>\n", " <td>69.0</td>\n", " <td>1.0</td>\n", " </tr>\n", " <tr>\n", " <th>1</th>\n", " <td>positive</td>\n", " <td>@Lamb2ja Hey James! How odd :/ Please call our...</td>\n", " <td>[hey, jame, odd, :/, pleas, call, contact, cen...</td>\n", " <td>4448.0</td>\n", " <td>473.0</td>\n", " <td>1.0</td>\n", " </tr>\n", " <tr>\n", " <th>2</th>\n", " <td>positive</td>\n", " <td>@DespiteOfficial we had a listen last night :)...</td>\n", " <td>[listen, last, night, :), bleed, amaz, track, ...</td>\n", " <td>3728.0</td>\n", " <td>159.0</td>\n", " <td>1.0</td>\n", " </tr>\n", " <tr>\n", " <th>3</th>\n", " <td>positive</td>\n", " <td>@97sides CONGRATS :)</td>\n", " <td>[congrat, :)]</td>\n", " <td>3562.0</td>\n", " <td>4.0</td>\n", " <td>1.0</td>\n", " </tr>\n", " <tr>\n", " <th>4</th>\n", " <td>positive</td>\n", " <td>yeaaaah yippppy!!! my accnt verified rqst has...</td>\n", " <td>[yeaaah, yipppi, accnt, verifi, rqst, succeed,...</td>\n", " <td>3878.0</td>\n", " <td>273.0</td>\n", " <td>1.0</td>\n", " </tr>\n", " <tr>\n", " <th>...</th>\n", " <td>...</td>\n", " <td>...</td>\n", " <td>...</td>\n", " <td>...</td>\n", " <td>...</td>\n", " <td>...</td>\n", " </tr>\n", " <tr>\n", " <th>9995</th>\n", " <td>negative</td>\n", " <td>I wanna change my avi but uSanele :(</td>\n", " <td>[wanna, chang, avi, usanel, :(]</td>\n", " <td>55.0</td>\n", " <td>4546.0</td>\n", " <td>1.0</td>\n", " </tr>\n", " <tr>\n", " <th>9996</th>\n", " <td>negative</td>\n", " <td>MY PUPPY BROKE HER FOOT :(</td>\n", " <td>[puppi, broke, foot, :(]</td>\n", " <td>3.0</td>\n", " <td>4439.0</td>\n", " <td>1.0</td>\n", " </tr>\n", " <tr>\n", " <th>9997</th>\n", " <td>negative</td>\n", " <td>where's all the jaebum baby pictures :((</td>\n", " <td>[where', jaebum, babi, pictur, :(]</td>\n", " <td>34.0</td>\n", " <td>4490.0</td>\n", " <td>1.0</td>\n", " </tr>\n", " <tr>\n", " <th>9998</th>\n", " <td>negative</td>\n", " <td>But but Mr Ahmad Maslan cooks too :( https://t...</td>\n", " <td>[mr, ahmad, maslan, cook, :(]</td>\n", " <td>9.0</td>\n", " <td>4434.0</td>\n", " <td>1.0</td>\n", " </tr>\n", " <tr>\n", " <th>9999</th>\n", " <td>negative</td>\n", " <td>@eawoman As a Hull supporter I am expecting a ...</td>\n", " <td>[hull, support, expect, misser, week, :-(]</td>\n", " <td>116.0</td>\n", " <td>565.0</td>\n", " <td>1.0</td>\n", " </tr>\n", " </tbody>\n", "</table>\n", "<p>10000 rows × 6 columns</p>\n", "</div>" ], "text/plain": [ " class Tweet \\\n", "0 positive #FollowFriday @France_Inte @PKuchly57 @Milipol... \n", "1 positive @Lamb2ja Hey James! How odd :/ Please call our... \n", "2 positive @DespiteOfficial we had a listen last night :)... \n", "3 positive @97sides CONGRATS :) \n", "4 positive yeaaaah yippppy!!! my accnt verified rqst has... \n", "... ... ... \n", "9995 negative I wanna change my avi but uSanele :( \n", "9996 negative MY PUPPY BROKE HER FOOT :( \n", "9997 negative where's all the jaebum baby pictures :(( \n", "9998 negative But but Mr Ahmad Maslan cooks too :( https://t... \n", "9999 negative @eawoman As a Hull supporter I am expecting a ... \n", "\n", " PTweet positive negative \\\n", "0 [followfriday, top, engag, member, commun, wee... 3737.0 69.0 \n", "1 [hey, jame, odd, :/, pleas, call, contact, cen... 4448.0 473.0 \n", "2 [listen, last, night, :), bleed, amaz, track, ... 3728.0 159.0 \n", "3 [congrat, :)] 3562.0 4.0 \n", "4 [yeaaah, yipppi, accnt, verifi, rqst, succeed,... 3878.0 273.0 \n", "... ... ... ... \n", "9995 [wanna, chang, avi, usanel, :(] 55.0 4546.0 \n", "9996 [puppi, broke, foot, :(] 3.0 4439.0 \n", "9997 [where', jaebum, babi, pictur, :(] 34.0 4490.0 \n", "9998 [mr, ahmad, maslan, cook, :(] 9.0 4434.0 \n", "9999 [hull, support, expect, misser, week, :-(] 116.0 565.0 \n", "\n", " bias \n", "0 1.0 \n", "1 1.0 \n", "2 1.0 \n", "3 1.0 \n", "4 1.0 \n", "... ... \n", "9995 1.0 \n", "9996 1.0 \n", "9997 1.0 \n", "9998 1.0 \n", "9999 1.0 \n", "\n", "[10000 rows x 6 columns]" ] }, "execution_count": 25, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df" ] }, { "cell_type": "code", "execution_count": 26, "id": "0acfab4f-8b9b-4f1b-8a42-477e406a5c6c", "metadata": {}, "outputs": [ { "data": { "text/html": [ "<div>\n", "<style scoped>\n", " .dataframe tbody tr th:only-of-type {\n", " vertical-align: middle;\n", " }\n", "\n", " .dataframe tbody tr th {\n", " vertical-align: top;\n", " }\n", "\n", " .dataframe thead th {\n", " text-align: right;\n", " }\n", "</style>\n", "<table border=\"1\" class=\"dataframe\">\n", " <thead>\n", " <tr style=\"text-align: right;\">\n", " <th></th>\n", " <th>positive</th>\n", " <th>negative</th>\n", " </tr>\n", " <tr>\n", " <th>word</th>\n", " <th></th>\n", " <th></th>\n", " </tr>\n", " </thead>\n", " <tbody>\n", " <tr>\n", " <th>children</th>\n", " <td>3.0</td>\n", " <td>2.0</td>\n", " </tr>\n", " <tr>\n", " <th>latin</th>\n", " <td>3.0</td>\n", " <td>0.0</td>\n", " </tr>\n", " <tr>\n", " <th>bilal</th>\n", " <td>0.0</td>\n", " <td>1.0</td>\n", " </tr>\n", " <tr>\n", " <th>leno</th>\n", " <td>0.0</td>\n", " <td>1.0</td>\n", " </tr>\n", " <tr>\n", " <th>savag</th>\n", " <td>1.0</td>\n", " <td>0.0</td>\n", " </tr>\n", " <tr>\n", " <th>...</th>\n", " <td>...</td>\n", " <td>...</td>\n", " </tr>\n", " <tr>\n", " <th>smoak</th>\n", " <td>1.0</td>\n", " <td>0.0</td>\n", " </tr>\n", " <tr>\n", " <th>siguro</th>\n", " <td>1.0</td>\n", " <td>0.0</td>\n", " </tr>\n", " <tr>\n", " <th>kapan</th>\n", " <td>0.0</td>\n", " <td>1.0</td>\n", " </tr>\n", " <tr>\n", " <th>fever</th>\n", " <td>2.0</td>\n", " <td>7.0</td>\n", " </tr>\n", " <tr>\n", " <th>3a2ad</th>\n", " <td>0.0</td>\n", " <td>1.0</td>\n", " </tr>\n", " </tbody>\n", "</table>\n", "<p>10507 rows × 2 columns</p>\n", "</div>" ], "text/plain": [ " positive negative\n", "word \n", "children 3.0 2.0\n", "latin 3.0 0.0\n", "bilal 0.0 1.0\n", "leno 0.0 1.0\n", "savag 1.0 0.0\n", "... ... ...\n", "smoak 1.0 0.0\n", "siguro 1.0 0.0\n", "kapan 0.0 1.0\n", "fever 2.0 7.0\n", "3a2ad 0.0 1.0\n", "\n", "[10507 rows x 2 columns]" ] }, "execution_count": 26, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df_freq" ] }, { "cell_type": "markdown", "id": "f4388cbb-1147-4af5-9cbc-0755fb94e386", "metadata": {}, "source": [ "### Visualizing Words" ] }, { "cell_type": "code", "execution_count": 27, "id": "9b318d53-0918-4395-bf62-19a11c210902", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "['happi',\n", " 'merri',\n", " 'nice',\n", " 'good',\n", " 'bad',\n", " 'sad',\n", " 'mad',\n", " 'best',\n", " 'pretti',\n", " '❤',\n", " ':)',\n", " ':(',\n", " '😒',\n", " '😬',\n", " '😄',\n", " '😍',\n", " '♛',\n", " 'song',\n", " 'idea',\n", " 'power',\n", " 'play',\n", " 'magnific']" ] }, "execution_count": 27, "metadata": {}, "output_type": "execute_result" } ], "source": [ "keys = ['happi', 'merri', 'nice', 'good', 'bad', 'sad', 'mad', 'best', 'pretti',\n", " '❤', ':)', ':(', '😒', '😬', '😄', '😍', '♛',\n", " 'song', 'idea', 'power', 'play', 'magnific']\n", "\n", "sel_keys = [ k for k in keys if k in df_freq.index]\n", "sel_keys" ] }, { "cell_type": "code", "execution_count": 28, "id": "86a553d1-6c31-4e2a-81da-6f615c1861e4", "metadata": {}, "outputs": [], "source": [ "sel_df = df_freq.loc[sel_keys]" ] }, { "cell_type": "code", "execution_count": null, "id": "20173321-6e5b-4c9c-a75a-7b85fafbe9a0", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": 29, "id": "7ab4223d-059b-42da-8e0a-12ab86cc92ab", "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "*c* argument looks like a single numeric RGB or RGBA sequence, which should be avoided as value-mapping will have precedence in case its length matches with *x* & *y*. Please use the *color* keyword-argument or provide a 2D array with a single row if you intend to specify the same RGB or RGBA value for all points.\n" ] }, { "data": { "text/plain": [ "[<matplotlib.lines.Line2D at 0x147a3b2b1670>]" ] }, "execution_count": 29, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAYwAAAESCAYAAADuVeJ5AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjUuMCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8/fFQqAAAACXBIWXMAAAsTAAALEwEAmpwYAABA+UlEQVR4nO3dd3hUxdfA8e9ueiUQgvQqDEUEEQVFVMAGKooFf6IgICjSBOm9g1KkSO9VFBCRjiAioC8CiggII0iTHkJ622R33z92iaFn027K+TwPT3Znyz07T9iTe2fmjMlutyOEEELci9noAIQQQuQOkjCEEEKkiSQMIYQQaSIJQwghRJq4Gx1AFvECHgEuAlaDYxFCiNzCDSgG7AMSb34wryaMR4BdRgchhBC5VH1g982NeTVhXAQID4/FZkvftOHgYH/CwmIyNai8TvrMddJnrpH+cp0rfWY2myhY0A+c36E3y6sJwwpgs9nTnTCuv164RvrMddJnrpH+cl06+uy2l/Jl0FsIIUSa5IqEoZTqppTaZnQcQgiRn+X4hKGU8gBqGh2HEELkdzk+YQAtgeVGByGEEPldtg16K6XGA68DZYHqWuvDzvZKwCIgGAgDWmmtjzsfMwPPa63fUkr1yq5YhRBC3Co7Z0mtASZz6/qImcA0rfVSpdS7wCygofOx14C16T1gcLB/el8KQEhIQIZenx9Jn7lO+sw10l+uy6w+y7aEobXeDaCUSmlTShUBagHPOpuWA1OVUiFa61BAAU8rpVoCNZVS7bTWc9N6zLCwmHRPwQsJCSA0NDpdr82vpM9cJ33mGumve0hKwnvZYpKrVCO5Tl3AtT4zm013/UPb6DGMUsB5rbUVwPnzgrMdrfUorfWzWusXgD9cSRZCCJGfuB86SNDzDQjo3R2P3/ZlzTGy5F2zgNb6GaNjEEKIHCchAb/xn+IzbTK24MJEzl+K5aWmWXIoo88w/gVKKKXcAJw/izvbhRBC3IX7nv+jYIPH8Z3yOQnN3yZ8994sSxZgcMLQWl8B/gDedja9DRxwjl8IIYS4DVNMNP59e1Cw6fOYkpKIWLGGmMnTsQcVzNLjZlvCUEpNUUqdA0oC25RSR5wPdQC6KKX+Bro47wshhLgNj+3bKPhkXbwXzCWufQeu7fg/kp5ueO8XZoLsnCXVFeh6m/ZjQJ3sikMIIXIjU/g1/Af1w3vFcpIrViJi3fckP5q9X525ZtBbCCHyJbsdz/XfEdCnB6aIcGI/6UVc997g5ZXtoUjCEEKIHMp8+RL+fXrgtXEdSTUeInrFGqwPVDcsHkkYQgiR09jteH21DP/B/TElJhAzaDjxH3UGd2O/so2eVptrDBzYm/PnzxkdhhAijzOfOU2BN18l8OOOJFepSviPPxPfpZvhyQLkDCNNTp78B6vVRokSJY0ORQiRV1mt+Myfjd+oYdjNbkR/9jkJ77UFc875u14SRhps3bqZ+vWfMjoMIUQe5aaPEdC9Mx7795LY6Flixk/GlgP/QM05qSsH6tmzK1evhnLo0EGUqmJ0OEKIvCYpCd/Px1Kw0RO4nTxB1PQ5RH25KkcmC5AzjNuKirMQfjacwcPHE+jrydWrVwkKCjI6LCFEHuJ+8AABH3fC/a/DJLz6GjGjxmEPCTE6rLuShHGTPUcusXDTMdzdzSQn22jdpDJeXl5YLBajQxNC5AXx8fiNG4PP9CnYQooQuWg5lsYvGh1VmsglqVSi4iws3HQMS7KNuIRkLMk2Fm48RomSpTl3TuohCiEyxuP/fnYUC5w6iYQWLR3FAnNJsgBJGDcIi0zAzWxKuX/u13nYEqOoUv0RDhz4zcDIhBC5mSk6Cv/e3Ql6pTEmq5WIVWuJ+fwL7AWCjA7NJZIwUgku4I011Q59Jeu8j9krkBeef579+/ditVoNjE4IkRt5bttCwfp18F68gLgOnR3FAp982uiw0kUSRiqBvp60blIZT3czvt7ueLqbad2kMiEFA3j//Q8JDZWq60KItDGFhRHwUTsKtHgTe0AAERu2Ejt8NPj5GR1ausmg903qVi1K1bKFsJrMuNltBPp6AlCnzmMGRyaEyBXsdry+W41//16YIiKI7dmXuI97GFIsMLNJwriNQF9P2WxeCOEy86WL+PfujtfmjSTVfIjoVeuwVq1mdFiZRhKGEEJklN2O97LF+A0diMmSSMzQUcR/8FGOqP+UmfLWpxFCiGxmPnWSgJ4f47nrJyz16hM9YQq28hWMDitLSMIQQoj0sFrxmT0Dv09HYHf3IHr8ZBLefS9HFQvMbJIwhBDCRW5H/yKgeyc8fv+NxOdeIGbsRGzFSxgdVpaThCGEEGllseA7eQK+k8ZjDwwkauY8Epu9ASbTvV+bB0jCEEKINHA/8BsB3TrhfvQvEl57k5iRn2EvXNjosLKVJAwhhLibuDj8PhuFz6xp2O4rSuSSr7E839joqAwhCUMIIe7AY/dOAj7pgtvpU8S3akvs4GHYAwsYHZZhJGEIIcRNTFGR+A0bjM+SBVjLliPi2w0k1atvdFiGk4QhhBCpeG7ZhH+vbpivXCauY1die/cHX1+jw8oRJGEIIQRgunoV/4G98V69iuQq1YhY9CXJDz1sdFg5iiQMIUT+ZrfjtXol/gN6Y4qOJrZ3f+K6fgKenkZHluNIwhBC5FvmC+cdxQK/30zSw7WJnjgNa+UqRoeVY0nCEELkPzYb3ksW4jdsECablZgRY4hv1wHc3IyOLEeThCGEyFfcTp7A/5OueP6yG0v9p4meMBlb2XJGh5UrSMIQQuQPycn4zJqO32cjsXt6ET1xKgktWuabsh6ZQRKGECLPczty2FEs8I8DJL7wIjFjP8dWtJjRYeU6kjCEEHlXYiK+k8bjO3kC9qAgouYsJLFpMzmrSCdJGEKIPMl9/14CunfGXR8j4c3/ETNiDPZCwUaHlatJwhBC5C2xsfh9OgKf2TOwFS9B5PJVWBo9Z3RUeYIkDCFEnuGxcwcBn3TF7exp4tu0I3bgUOwBgUaHlWdIwhBC5HqmyAj8hg7EZ9likstXIOK7TSQ9Vs/osPIcSRhCiFzNc9MG/Ht3x3w1lLgu3Ynt2Rd8fIwOK0/K0QlDKfUoMBEwAdu11gMNDkkIkUOYrlzBf0BvvL9bTXK16kQs/ZrkGg8ZHVaeZjY6gHs4oLWup7V+HHhMKSUXI4XI7+x2vFYsp1D9R/DatJ7YfoMI/36HJItskKPPMLTWSQBKKTfgAhBnbERCCEOdPUtg23Z4/bCVpNqPEj1pGtZKyuio8o1sSxhKqfHA60BZoLrW+rCzvRKwCAgGwoBWWuvjqV7XAhgKbNFaJ2dXvEKIHMRmw3vhPBg5BE+bnejRY0lo016KBWYzk91uz5YDKaWeAM4Au4CXUiWM7cB8rfVSpdS7QFutdcObXmsGVgJDtdaH0nC4ssCpzIxfCGGQv/+Gdu1g1y549lmYPRvKljU6qryuHHD65sZsO8PQWu8GUOq/00elVBGgFvCss2k5MFUpFaK1DlVKeWmtE7XWNqVUNJDgyjHDwmKw2dKXEENCAggNjU7Xa/Mr6TPXSZ/dRXIyPtO/wG/caOzePsRMmUFg5w8JvRoD0mdp5srvmNlsIjjY/46PGz2GUQo4r7W2AmitrUqpC872UKCpUqoTjsH5nakvVQkh8i63w4cI6NYJjz//ILHJy8R8NgHbfUWlBpTBjE4Yd6W1XonjUpQQIj9ISMB34lh8v5iEvWAhIuctwfLyK0ZHJZyMnlb7L1DCOQvq+myo4s52IUQ+4r73Vwo2egK/ieNJfL0513bvlWSRwxiaMLTWV4A/gLedTW/jWHsRalhQQojsFRODX/9eBL38HKb4eCK+Wk30FzOxFyxkdGTiJtmWMJRSU5RS54CSwDal1BHnQx2ALkqpv4EuzvtCiHzA48cfKPRUXXzmzSahbXvCd+4hqeEzRocl7iA7Z0l1Bbrepv0YUCe74hBCGM8UEY7/4P54f7WM5PsrEvHdZpLrPmZ0WOIecvSgtxAi7/Fcvxb/vj0wh10l7uMexPboA97eRocl0kAShhAiW5guXyagX0+81n9HUvUaRC1fRXL1GkaHJVwgCUMIkbXsdry+/hL/wf0wxccTM3Ao8R91AQ8PoyMTLpKEIYTIMuazZwjo+TGeO7aTVOcxoidOxXp/RaPDEukkCUMIkflsNrznz8Z/5DDsJhPRY8aT0KYdmI1e+iUyQhKGECJTuR3/m4DunfHYuwdLg0ZEj5+MrVRpo8MSmUAShhAicyQl4TttMr7jP8Xu60vUFzNJbP621H/KQyRhCCEyzP3PP/Dv1hmPw3+S0LQZMaPHYS9SxOiwRCaThCGESL/4ePwmfIbPtMnYggsTuWAZlhdfNjoqkUUkYQgh0sV9z/8R0L0T7v+cIL5FS2KHjsQeVNDosEQWkoQhhHCJKSYav5FD8Zk/B2vpMkSs/I6kpxoYHZbIBpIwhBBp5vnD9/j37Ib5wnniPviI2L6DwP/OO7SJvEUShhDinkzXwvAf1A/vlV+RXEkRsf57kh+RmqH5jSQMIcSd2e14rltDQN+emCLCif2kN3Hde4GXl9GRCQNIwhBC3Jb58iX8e3+C16b1JNV4iOgVa7A+UN3osISBJGEIIW5kt+O9fCl+g/tjsiQSM3gE8R06gbt8XeR38hsghEhhPnOagB4f47nzRyyP1SPm8ylYK0ixQOEgCUMIAVYrPvNm4Td6OHazG9FjJ5LQqo0UCxQ3kIQhRD7npo8R0K0THr/tI/GZ54gZNwlbiZJGhyVyIEkYQuRXFgu+X0zEd+I47P7+RE2fQ+LrzaVYoLgjlxOGUsoM3Ke1vpgF8QghsoH7H78T0K0z7n8dJqHZ68SMHIs9JMTosEQOl+aEoZQKAqYDbwBJgJ9SqinwqNZ6YNaEJ4TIVPHx+I0djc+ML7AVuY/IxV9heaGJ0VGJXMKVEa2ZQCRQBrA42/4PeCuzgxJCZD6PX3ZT8OnH8J02mYR3WhG+61dJFsIlriSMRkBX56UoO4DWOhSQovdC5GCm6Cj8e3Un6NUmmGw2Ir5ZR8yEKdgLBBkdmshlXBnDiAQKAyljF0qp0qnvCyFyFs+tm/Hv1R3zpYvEdehMbJ8B4OdndFgil3LlDGMu8I1SqgFgVko9BizCcalKCJGDmMLCCPioHQXeaY49MJCIDVuJHT5akoXIEFfOMD4D4oFpgAcwH5gFTM6CuIQQ6WG347XmG/z798IUFUVsz77EdesJnp5GRybygDQnDK21HUdykAQhRA5kvngB/z6f4LV5I0kP1SJ64jSsVasZHZbIQ1yZVnsQWAos11qfy7qQhBAusdvxXroIv6EDMSUnETN0FPEfdgQ3N6MjE3mMK5ekhgJvA0OUUr8BXwIrtdbXsiIwIcS9mU+dJKBHVzx378RSrz7RE6ZgK1/B6LBEHpXmQW+t9bda6+ZAMRzjF82Af5VSa7MqOCHEHVit+MyYSqGnH8P94B9ET5hC5DfrJFmILOVyKUqtdTSOs4sZwK+ArPzJBy5evEDLls2NDkMAbkf/IujFZ/Af0h/Lk08TvnsvCS1bS2VZkeVcGcMwAQ2BFjjOLs7gSBzvZU1oQogbWCz4Tp6A76Tx2AMDiZo1n8RXX5digSLbuDKGcQGIAb4C6mmtj2ZNSCIrxcfHM3hwX65cuYLNZqV163acPXuGn3/eRWJiAg88UIPevftjMpk4duwoY8YMB+DRR+saHHn+5v77fgK6d8b96F8kvPYmMaPGYg8ONjoskc+4kjBe0VrvzbJIRLb49ddfKFw4hHHjHLOjY2JieOSROrRp0x6AESMG8fPPu3jiiScZM2YY3bv3pmbNWkybJrOpDREXh9+nI/GZPR3bfUWJXPo1lucaGx2VyKfumjCUUmW11qedd68qpcrf7nla65OZHZjIXFFxFsIiEyhSvAz79k1i+vQp1KtXnxo1HmLHjh9YtmwxiYkJREVFUbZsBWrUeIjo6Ghq1qwFwPPPN2HPnp8N/hT5i8funQR074zbmdPEt2pL7OBh2AMLGB3WLS5evEDv3t1YsmSF0aGILHavM4xDQIDz9gkcRQdvvmBqB2TCdw6258glFm46hpvZhNVmp2Ofz0m6dpw5c2bw8MOPsHr1SubOXcx99xVl3rxZWCyJRoecr5miIvEbNgifJQtJLleeiG83kFSvvtFhCXH3hKG1Dkh1W6Zg5EJRcRYWbjqGJdkGQHJCJF9tT2J8l2fw9w9g/fo1AAQFBREXF8eOHT/w9NONCAgIICAggIMH/6BGjZp8//0mAz9F/uG5ZRP+vbphvnKZuE4fE9urH/j6ZuoxFi6cy5YtGwkKKkiRIvehVBUeeeRRxo0bQ2JiAsWLl6Rfv8EEBgZy/Li+bbuMb+VPaU4CSqkpd2iflGnR3P79n1BK7VFK/aKU6pGVx8qLwiITcDP/d1KYGHWJkz9NoUP7lixYMIf33nufl19+lZYt36JHj85UqfJfKYl+/Ybw+eef0bp1C5wV7UUWMV29SsCHbSjQ8i3sBQsRsXk7sUNGZHqyOHr0CDt2bGfhwuVMmDCF63NXRo4cwkcfdWHRoq+oUOF+FiyYc9d2x/hWLxYtWp6p8YmczZVB79ZA19u0twS6ZUYwd3ASeFJrbVFK/aiUmqG1jsvC4+UpwQW8sdr++7L3K6IoWLwKYzs+TqCvoyBd5cpV+eCDjre8tnLlKjd8IXTs+HHWB5zf2O14fbMC/wG9MUVHE9tnAHFdumd6scDrY1j7fvud+vWfwsvLC/CiXr36JCTEEx0dzUMPPQxA48YvMWhQH2JiYm7bHh0dLeNb+dQ9E4ZSqu3156a6fV154GqmR5WK1vpCqrtWwJaVx8trAn09ad2kMgs3/jeG0bpJ5ZRkIYxjPn8O2vQicMMGkh6u7SgWWLlKph8n9RjW5b9PUb2slDgX6ZOWM4yWzp+eqW6D4xrFZVxYuKeUGg+8DpQFqmutDzvbK+HYWyMYCANaaa2P3/TaZ4F/tNYJaT2ecKhbtShVyxYiLDKB4ALekiyMZrPhvXgBfsMHg81KzIgxxLfrkCXFAm8ew/IMKsOuXau52uEDfD3d+Pnn3TRt2oyAgEAOHjxAjRoPsXnzBmrWrIW/v/9t22V8K/8y2e1puzatlBqptR6YkYMppZ7AsUJ8F/BSqoSxHZivtV6qlHoXaKu1bpjqdSWBxUBTrXVMGg5VFjiVkViF8c6dO0eHDh1Yv359tr42Sx0/Du3bw08/QaNGMHs2lL/tbPVM8ffZcAbN+oW4hOSUtsh/tuEWdZRiRYsQHBxM/fr1qV69OkOGDCE+Pp5SpUoxZswYChQowNGjR2/bfvjwYfr3dyzwrFevHjt37sx5fS0yohxw+ubGNCeM1JxlQlJGUrXWLl0mUkqdxpkwlFJFgL+BYK21VSnlhuMso6LWOlQp5QVsADpprXUaD1EWOBUWFoPNlr7B2pCQAEJDo9P12vwqs/ssI/P7c9zagORkfGZOw2/sKOyeXsQOH03C2+8SUiQwS3/PouIs9J7+S8oZBoAbSUzo2gBPs41OndrTu/cAlKqcZTFkJvl/6TpX+sxsNhEc7A93SBiu1JIqjmO3vSeBoJsezsi5dCngvNbaCuBMGhec7aE4aldVBWYppQDe0Vqfz8DxRC5itVoZNmwgf/99jHLlyjNw4HCWL1+Sq0qZuB05TED3Tnj8cYDEF14kZuzn2IoWy5Zj324My+PC93TtuAiLJZHGjV/KNclCGM+VWVKzgDigEfATjsQxFNiY+WH9R2u9AFiQlccQOdfZs2fo23cQDz5Yk9Gjh7F69Upef7157ihlkpiI78Rx+E75HHtQQSLnLsLy8qvZXizw1jGsp7P1+CLvcGUx3uM4xhb+AOxa64PA+0BG10b8C5RwXorC+bO4s13kQ1FxFk5djCImPokiRe7jwQdrAo7pm4cO/cHvv++nffv3aNXqLX77bT+nTp287VRPI7nv+5WCjZ7A7/OxJDZ7g2u792Jp2sywyrKBvp6UKxYoEx5EhrhyhmEFro+cRSilQoAooERGAtBaX1FK/YFjN7+lzp8HtNahGXlfkTulngIaHx12w7V3BxMTJnyWc0uZxMbiN2Y4PnNmYitegsjlq7A0es7oqITIFK6cYaTeLGkL8DWwGtif1jdQSk1RSp0DSgLblFJHnA91ALoopf4Gujjvi3wm9RTQeIuVJKuNiGuh/Lr/NwC2bt2ccraRupQJcMNUT8CQqZ4eP/1Ioafq4jt7Bglt2hG+61dJFiJPceUMoyX/JZhuQE/AH5iU1jfQWnflNqvFtdbHgDouxCLyoJvLmAB4+YfwzTcrmTJxDGXLlqNZszeIjo6iZcu3CA4OvqWUyZgxwzGZTDz6aPb9OpkiI/AbMgCfL5eQXL4CEWs3k1T38Ww7vhDZJV3TanOBssi02myX0T673RRQT3fzDWVMchrPjevx7/MJ5quhxHf6mNgefcDHJ82vl98z10h/uc6oabXD7/BQInAO2Ky1vpzW9xPiZrmhjEnnzh/QuXM3qhQqjH//Xniv/ZbkatWJWPo1yTUeMjo8IbKUK5ekKuHYy3svjhlMpYBHgXXAy8B0pdTrWuvNmR6lyDdyQxkTj+83U2jqJExxccT2H0xcp4/Bw8PosITIcq4MepuB/2mt62utW2it6wPNAavWui7QEfg0K4IU+UtOmAJ68eIFWrR4nWHDBvLOO28wcGBvLP+cwP2vI/iNG4O1oqJf6/d5+9BB3m3zDvPmzQLgt9/20a/ffzPN9+3bQ79+PY36GEJkKlcSxvPA2pva1gPXNxheiqN6rRB5wtmzZ2jW7A2WLVlBwPlzbHq1MaboKOI6dSVi3Rba9+7PvHlLWLRoOQcO/MaJE8epVas2Z86cJjw8HIANG9bx4otNDf4kQmQOVxLGP8BHN7V1cLYDFMaxElyIXOvmRYMP+foR9EpjXt/+A/uL3EdyzVpYXn0dzGa2b99K27bv0LbtO5w+fZLTp09iMpl4/vkmfP/9RqKjozly5BB1ZcaUyCNcGcNoB6xWSvUBzuNYsGcFXnM+roBBmRueENkn9aLBxKgr2COjKNjgcezePsR16UZyWBj26CgALlw4z/LlS5kzZzGBgYGMGjUUi8UCwIsvNqV37+54enrRoEEj3N1d+W8mRM6V5jMMrfXvQEUcxQAnAu/gqCj7u/PxnVrrOVkSpRBZLPWiwaLnjtN79ShCE+P5v8ee4NrufWxMTk5ZNAgQGxuLt7cP/v7+XLsWxp49v6Q8VrhwCIULh7Bo0TyaNJHLUSLvcOWS1A201jsBT6WUbN8lcr2wyAS8bUm03L2Uict6EhQbQQFPf+ZUULT4pBPR0VE0a/ZGyvMrVqxEpUqKFi3eYNiwgVSvXuOG93vuuRcoUuQ+ypYtl90fRYgs48o6jOo4Br0TcZT2+Bp4CseOe29lSXRCZJMSxw8ydn5XSlw7z7ZqDZn+SDMSDq1g4KDhN8zWmjp1dsrtAQOG3vH9/vzzD5o2fTULIxYi+7lyhjEDGKy1rgwkOdt+Ap7I9KiEyC4xMfj170XxN1+ioAcMf3MYs1/uTpJfAEEBXuma2tu27bv8888JnnvO2Iq5QmQ2V0bjquGYOguO/bzRWscqpdJeB0GIHMTjxx8I6Pkx5nP/Ev/+B8T2H8I7Zs9UiwZfu/eb3Mb8+Uvv/SQhciFXEsZp4GFSVadVSj0KnMjkmITIUqbwa/gPGYD3V8tIvr8iEWu3kFzHsUNfIOTI1eVC5ASuJIxBwAal1EzASynVD8e6jHZZEpkQWcBz3XcE9O2B6VoYsd16EvdJb/D2NjosIXIFV6bVrsex2jsE2AGUBl7VWn+fNaEJkXnMly8R2OZdCrzfEmvRYoR//xNx/QdLshDCBa7MkvLEUWzQBFwD/IBuSim01q2yKD4hbhEfH8/gwX25cuUKNpuV1q3bUaBAENOmTcJqtVK5clV69uyHp6cnb7zxMi+VKs3Pv+wm2W5nTNdPKNpnAOExMQzr1pGrV6/ywAPV2bfvV+bNW0pQUJDRH0+IHMuVWVKLcGycFIVj3OKfVP+EyDa//vqLc2HccpYsWUGdOo8zevQwhg0bw+LFX2O1WlmzZhXms2cwh16h6IZ1rCxSlFfe/5CF7m7g4cGCBbN5+OFHWLp0BU8/3YjLly8Z/bGyxMWLF2jZsnmWHqNDh7ZZ+v4i53BlDOMFoJzWOiKLYhHinqLiLHgGFOXXvXuYPn0K9erVx9fXj2LFilO6dBkAGr/QhO8mjqNj7x5Q9D4e7/IJEZ26UvHoX/w4ezoAf/55kNGjxwFQt+7jBAQEGvaZcruZM+cbHYLIJq4kjLOAV1YFIsS9pK71VOjhjti9I5kzZwa1atVOeY7b3xr/gX1xv3SRpLqPYUuIx9ayNZjNuLmZsVqTMz2uixcv0Lt3N5YsWZHu9/j99/14eHjcsmI8M9hsNj77bCSHDv1JSEgIn346gS1bNrF27bckJSVRsmRJBg0agbe3N6NGDcXT05Njx44SGxtLly7dqVevPhs3rmPnzh+JiYnh6tVQnnuuMW3bfgDAs8/WZ+vWXZket8h5XLkktRj4Tin1tlKqYep/WRWcENelrvUUHXWNZLsbh64V45XX3ubw4UNcvHiBqyMGU7BhPdaHXaX6i02JXP4N3KHwX/XqNdi+fSsAe/fuIdpZVNAoBw78xqFDf2bJe5879y+vvfYmS5euwN8/gB07tvPUUw2YO3cxixYtp0yZcqxfvybl+RcvXmTOnEWMGzeJ8ePHkJiYCMDRo0cYNWosixYt58cft3Hs2F9ZEq/IuVw5w+js/Dn6pnY7sg+GyGJhkQm4mU0AJEZdIvToBsxmM4sPBTD4jTexjd9Pv+9Wk6QUqt6TvDRwGJhMd3y/tm3bM3ToALZs2cgDDzxIcHAwvr6+6Y7ParUybNhA/v77GOXKlWfgwOGcPn2KqVMnEhcXR1BQEP37D6Vw4cKsXPkV3333DW5ubihViTZtOvDdd6sxm818//0munfvRY0MbvcaFWchLDKB5PgkihUrTsWKCgClKnPx4gVOnvyHOXNmEBMTTXx8PI8+WjfltQ0bPoPZbKZUqdIUL16Cs2dPA1C7dh0KFAgC4KmnGvLnn39QuXLVDMUpcpc0JwyttVRRE4YJLuCN1WYHwK+Iwq+Iwt+exPT4XQR90AZbcGEWjZ2IpclLN7xu1ap1KbcrV66aUgvKz8+fCRO+wN3dncOH/+To0b/w9Ez/gr2zZ8/Qt+8gHnywJqNHD2P16hXs3LmDMWMmULBgQX744Xtmz55G//5DWLp0IStXrsXT0xMvLzuJiSZeeeU1fHx8adGiJQBz586kRo2HeOSROi7HkvrSXXx0GEm2/xKn2eyG1ZrI6NHDGD16PBUrVmLjxnUcOPBbynNMtyRa013bRf4hhfpFrhDo60nrJpVZuNHxRVjpzGH67p6N/7+niH+nFbFDRmAPKpjm97t8+RKDB/fFZrPj4eFBnz4D0hVXVJyFf6/EEBJyX0r58+efb8LixQs4efIfunfvBIDNZiU4uDAAFSpUZPjwgdSv/zTNmr0E2G5533btOqQ7nuuX7gCSrDYiohOJirPcsII9Li6WwoULk5yczPffbyIkpEjKYz/+uI3GjV/i4sULXLhwntKly3D8uGbfvl+JiorEy8uLXbt20K/f4HTFKHIvSRgi16hbtSjVgj3wGzmU+75ehLV0GSJWfkfSUw1cfq9SpUqzYMGXGYrn+l/y1vhwImIS2fPXJepWLQqAr68v5cqVZ9asBbe8bty4SRw8eICff97Jq6/OBUx4e3sTGhrKvn17+PTTCYwf/ymPP/4EDRo8w9GjR5g8eQLx8fF4enowefIMvLy8mTlzKgcO/EZSkoVmzd7k1Vdfv+HS3XUmk4mwyIQbEka7dh/xwQetCQoKomrVB4iL+2+zzPvuK0r79u8RGxtLz5798PJyzHWpWrUaAwb0JjT0Cs8911guR+VDkjBEruH5w/eU6dkN84XzxH3Ykdi+g8DPmO1YUv8ln5RkJSk+gulLN1N1YAu2bt1MtWoPsG7dGg4f/pMHHniQ5ORkzp49Q9my5bhy5TK1atXmwQdrsm3bFsLDw3nzzf/h6+vH6dOn2LFje8pxkpKSGDy4P8OHj6ZKlWrExsbg6enF+vXf4efnx9y5i7FYLHz00fs8+mhdgoNCUi7dAXj4FuL+hj0JLuBY0X79khdww/4eqdWu/Si9evW/pT0kpAhjxky4pV1mSOUfkjBEjme6Fob/oH54r/yK5EqKiPXfk5yOa/uZ6ea/5D38Qrh26hfatVlLxfsr8MYb/6NOnceYNGk8MTExWK1Wmjd/m9KlyzB8+CCioqNJttpo8mJTfty+jVdeeZ1Bg/oQERGBX6okePbsGQoXDqZKlWqAY+wFYN++PZw4cSIlucTGxnDu3L88WrzEDZfurDY7rZtUloKKIlNIwhA5l92O19pv8e/XE1NEBLGf9Cauey/wSt9yoBUrvqRp09fwdtaPWrx4Pq1a/bdKuUOHtmlehJZ6EN7DtxDlGvTC093M2I6Pp3w5V6yomDbt1l2L3+s8KmVQ+tdL10iymShdugyLFn3Fl18uIT4+jkuXLt71+Ha7ne7de1GnzmO3PFa3alGqli2Uqkx72pPFnTaFatLkZZo0eTnN7yPypnRv0SpEVjJfukhg63cIbN8aa4lShG/dSVzfgfdMFlar9Y6PrVixnISEhJT7S5bcOL7gyorl64Pwnu5mfDzd8HQ3p+kv+dSXsuItVpKSrSmD0rdTunQZrl4N4+jRI4BjsDo5OZlHH32MNWtWkZzsWIh49uwZ4uPjb4ivXLFAObMQmUrOMETOYrfj/eUS/IYMwGRJJGbwCOI7dAJ3dy5evECPHl1QqsoN6x3effdNGjZ8lv37f6VFi1YEBhZg3rxZJCVZKF68JP37D2HDhrVcvRpK164fUqCAY6A3MTGR1q1bUK5ceYYMGenyiuX0/CWf1kHp6zw8PBg+fDQTJ44jMTERLy8vJk2azssvv8qlSxdp2/Yd7HY7QUEFbzu+IERmkoQhcgzz6VME9PgYz107sDxWj5iJX2Atf/8Nz7l1vcNKAAoUKMD8+cuIiIhgwIBeTJo0HR8fH5YuXcjXXy+jTZv2fP31MqZMmZVSkXb16hUsXJixmVKBvp4u/RWf+lIW3H1Q+roqVaoxe/bCW9o//LATH37YyfWghUgnSRjCeFYrPnNn4jdmBHazG9FjJ5LQqg2YHVdMU69aLlLkxvUOq1Z9BUCjRs8BcOTIIU6fPslHH70PQHJyEtWqVc/+z3QHN68nsdqhdWMll45EriAJQxjK7dhRArp3wuO3/SQ+8xwx4yZhK1Ey5fGbVy1fX5D2H8flHW9vx9bydrud2rXrMGzYzRVsco7Ul7JU+cJY4m8/fiFETiOD3sIYFgu+Ez6jYKMncDt1kqgZc4latvKGZJF6gDg89F/Czv5OxLVQ/m/vPnbs+IFFi+bxwAMP3vC21apV59Chg5w79y/g2Gzp7NkzgGMxXVxcbMpz3dzcUwaNs9v1QekC/lIAWuQecoYhsp37gd8I6NYZ96NHSGj2OjGjxmEvXPiW510fIE6I+JezP08Duw1MZiaMH82lC46EUKpUmRteU7BgQQYMGMrQoQNISnL85d6+/UeULl2Gpk2b0aNHFwoXDuGLL2bRtGkz3nvvf1SqVJkhQ0Zm/QcXIpcz2e32ez8r9ykLnAoLi8FmS9/nCwkJIDQ0OlODyuvu2WdxcfiNG4PPjC+wFbmPmLETsbzQ5I5Pj4qz0Hv6L1w5sZsrh9ektLt7eJCclARApUqVmT9/aWZ9hGwnv2eukf5ynSt9ZjabCA72BygHnL7l8UyNTOQanTt/kK37GXj8vIuCDR7Hd9pkEt5pRfjuvXdNFtc1eawMBUvVxLdg6ZS268nCx8cnZROf1O60ZeioUUP58cdt6fwEQgi5JCWylCkqEr/hQ/BZPB9rmbJEfLOOpPpP3fN1qQe73b386dRrLBeP/cDyZfOxWq3UrFmLgQOHUbRosVteK1uGCpE1JGHkItcXrjkGdv+kSpWqNGnyMvPnzyI8PJzBg0cAMHnyBCyWRLy8vOnffzClS5clMTGB0aOHceLEcef9xCyP13PrZvx7dsN8+RJxHToT23cgpGGToptLdANs2nuOsR3bUKFcGbZt28KoUeNwv8NuetcX4NntdiZOHMu+fb9SpEhRPDz+e/6xY0dvu7nR2rXf3nbrUiFELrgkpZQqpJT6TSkVY3QsOcH58+f43//e5csvV3HmzGm2bt3M9Onz6NTpY5YsWUCZMmWZNm0OCxZ8yfvvf8isWdMA+PbbVXh5ebNs2Sref/9D/v77WJbFaLp6lYAO71PgnebYCxQgYsNWYoePTlOygNuvhnYzO1ZDP/vsC3dNFqnt3PkjZ8+eYenSlQwaNIzDhx1boCYnJzNp0jhGjPiM+fOX8uKLTZk929FPd9u6VIj8LjecYUQDzwIrjA7EKDdvt1mhgmP1c7ly5ald+1FMJhPly9/PxYsXiYmJYeTIoZw7dxaTyZQybfTgwQO88cb/ALj//oop75Gp7Ha8vl2Ff/9emKKiiO3Vj7iPe4CLO9ndvBoawGqzp6yGvlOyuN5P1+dx/PHHAZ555nnc3NwoXDiEWrUeAeDs2dN33NzobluXCpHf5fiEobVOAq4ppYwOxRB3327TjIeHR8ptqzWZuXNnUqtWbcaMGc/Fixfo0uXDbInTfOE8vN+bwHXrSKr1MNETp2Gtkr4Ndm5ZDZ2GEt2p+8mSZGXPX5fu+Fy7nTtubnS3rUuFyO+yNWEopcYDr+OY9lpda33Y2V4JWAQEA2FAK6318eyMLSdK63abqcXExBASEgLAxo3/7Wddo8ZDbN26mYcffoSTJ0/wzz8nMidImw3vpYvwGzYIkpOIGTaa+A8+Aje3DL2tK4X9bu4nO7Bw4zFeebA6WzevpXHjlwgPD+f33/fz7LPPU7p0GSIiwm/Z3Kh8+Qp33bpUiPwuu88w1gCTgZtLgs4Epmmtlyql3gVmAQ0zejDnfOJ0CwkJyGgIGRJ+Nhx3d/MNg78mkwmryUxISADe3h4EBvoQEhJAYqIf7u5udOrUgb59+7Js2UKeeuop3Nwcz23fvg39+vWjVavmVKhQgWrVqhEU5Juxz3jiBLRvDzt2QIMGMGcO/hUqkLFe/08IUCENz7tdP7m7m6nzRANO/3OE9957i+LFi1Or1kMEBvpQvHghpk2bysiRI4mOjsZqtfLee+9Rp05NunXrRocObShUqBA1atQgNjY2y38PjP49y22kv1yXWX1myMI9pdRp4CWt9WGlVBHgbyBYa21VSrnhOMuoqLUOTfWabVrrZ9J4iLLkgYV71xeupf4ivHmTHkNYrfjMmo7fZyOxu3sQO3QkCe++R0iRQEP6LMf2UxrkhN+z3ET6y3V5beFeKeC81toK4Px5wdkOOJIF8JBSaptS6gFjwsx+6d2kJyu5Hf2LoCaN8B86AMuTTxO+ey8JLVuDyXTP12aVnNhPQuRFOX7QG8CFM4s8JyPbbWYqiwXfSePxnTwBe4ECRM1eQOIrrxmaKFLLMf0kRB6WExLGv0AJpZRbqktSxZ3tAtc36cls7r/tI6B7Z9yPHSXh9ebEjPwMe3CwYfHcidH9JEReZ/glKa31FeAP4G1n09vAgdTjF8IgsbH4DepHUJNnMEVFEblsBdEz5mZpsjCq3LgQ4t6yNWEopaYopc4BJYFtSqkjzoc6AF2UUn8DXZz3hYE8dv1E/NOP8dqWDXR/7HEaV6lC75+2k5CQwP79e2nTpgWtWr3F6NHDsFgsHD16hM6dOwOwa9cOGjasR1JSEomJibz55iuAY5X6J590oW3bd+nYsR1nzpwGHEUBx40bTfv27zFjxhRjPrAQ4p6y9ZKU1ror0PU27ceAOtkZi7g9U2QEfsMG4bN0EZHlynPKw51ew8cwwLmH9ldfLWXt2m+ZNGk6pUuXYcSIwaxZs4rXXmvO0aNHATh48A/Kl6/A0aNHsFqtVK1aDYCxY0fRs2c/SpUqzZEjh5kw4VOmTJkJQGjoFWbOnI9bBtdvCCGyTk4YwxA5hOfmjfj37o75ymXCP+zCkZffImRMvxv20F64cC7FihWndGnHxkWNG7/E6tUrad68BaVLl+b06VMcPXqEt95qwcGDB7BardSo8RBxcXEcOvQngwb1TTne9Q2OABo0eEaShRA5nCQMgSk0FP8BvfBes5rkKtXYNXQqk096YN3yDxExiez56xJ1qxYFwN8/gKioyNu+T+3atdmz52fc3d2pXbsOo0cPxWq10anTx9jtNgIC/Fm48MvbvlYqwgqR8xk+6C0MZLfjteprCtV/BK+N64ntO5Az321l8kkPLMk2EpKsJMVHMH3pZqLiLGzdupnKlatw8eKFlD2zt2zZSM2atQBHwlixYjnVqlWnYMGCREZG8u+/jpIbfn7+FCtWgu3btzkPbef48b8N++hCCNfJGUY+ZT5/Dv9e3fDa9j1JDz9C9KRpWFVlwi5G3VBa3MMvhGunfqFdm7VUvL8C3br1olq16gwa1Aer1UrlylV59dXXAahRowbh4ddSEkiFChW5du0qJudajcGDRzB+/KcsWjQPqzWZRo2eo2LFStn/4YUQ6SJ7et9Bni1BYLPhvWg+fiOGYLJZie0/mPj3P0wpFpi6zEZS3DXO71tApUa90lRmI8/2WRaSPnON9Jfr8lppEJFN3E6eoECzFwno8wnJtWpz7ac9xH/Q8YbKsqnLbHh7uGECKbMhhADkklT+kJyMz4yp+I0bjd3Ti+hJ00h4+907lvW4ocxGjxclWQghAEkYeZ7b4UMEdO+Mx8EDJDZ+iZjPJmArWuyer5MyG0KIm0nCyKsSE/GdOBbfKROxBxUkcu4iLC+/mmOKBQohch9JGHmQ+75fHcUC/9YkNH+bmOGjsRfKecUChRC5iySMvCQmBr9PR+AzZya24iWIXL4KS6PnjI5KCJFHSMLIIzx2bCeg58e4nT1DfNv2xA4cit1ftrIUQmQeSRi5nCkiHL+hA/H5cgnJFe4nYu1mkuo+bnRYQog8SBJGLua5YR3+fT7BHHaVuK6fENuzL0hNJiFEFpGEkQuZLl8moH8vvNatIemBB4n6ciXJzoqyQgiRVSRh5CZ2O14rluM/qC+muDhi+w8mrtPH4OFhdGRCiHxAEkYuYf73LAE9P8bzxx9IeqSOo1igFO4TQmQjSRg5nc2G94K5+I0cisluJ3rMOBLatAezlAETQmQvSRg5mNuJ446yHr/+H5anGxI9fjI25053QgiR3SRh5ERJSfhMn4Lf+E+x+/gQNWUGiW+1kLIeQghDScIw2JUrl5k7dybnz5/DbDZDTAxvnzrJK38dIfGlV4geMx77ffcZHaYQIgOGDOlHu3YfUapUaaNDyRC5EG6g8+fPMWzYQN544y2mTfiC+UWLs2DLJo7FRDO29ftEzV8iyUKIPODVV9/gyy8XGx1GhknCMNCMGV8waNAIqoZHULBhPXwnT8D0xlu8v3UnV4ILc/y4NjpEIUQmqFHjIfbv30tycrLRoWSIJAyDxMbG4OfpwamBvWnTqR1PmmBSxy68eOUyHQf2oXnzt9mxY7vRYQohMqBnz65cvRqK2WymRImSnDhx3OiQMkTGMLJZVJyFsMgEzD+up/iGdbx8+jT127Zj65MNaND4JRpfC+PEieMUKVKE8PBrRocrhEiH6//PBw8fn7IRWcGChbh6NRSoYmxwGSAJIxvtOXKJVav30fbHedQ58iMLy1fgn6UrGfDdKtiwlm82rAWgQYNG+Pr6UqxYCYMjFkK4as+RSyzcdAw3swmrzU7rJpWpW7UoFksiXl5eRoeXIZIwsklUnIVjk+YxaetMAuOjWfXoG/we4MXRoGCmTp19w3OtViv9+/ekR4++BkUrhEiPqDgLCzcdw5JsS2lbuPEYVcsW4t9/z1K+fAUDo8s4SRjZwHz5EgW7fUyvHzbxT5HyDHltCKeKlKeYKYlFC+dy+cIZnnnmOXx9/fj7b828eTNp0uRlihSRGVJC5CZhkQm4mf9bL3Xu13mUrf0WJ89cwMvLi+DgwgZGl3GSMLKS3Y7XV8vwH9wf4uNZ8tR7rHqoKTazm+NxNy9Gjh7Pzu2bGDZsEAkJ8ZQuXZaPPupKuXLljY1dCOGy4ALeWG32lPsl67yP2d3Mwf07eeWV1wyMLHNIwsgi5rNnCOjRFc+ffsRS93FiJn5BUGIA7htvvLYZXMCPZs3eoFmzN4wOWQiRQYG+nrRuUpmFN/0/DzsVxfPPNzE6vAyThJHZrFZ85s/Gb9Rw7CYT0Z9OIKH1+2A2UxeoWrYQYZEJBBfwTpk9IYTIO+pWLXrr//OqTY0OK1NIwshEbn9rArp1wmP/XiwNn3EUCyxZ6obnBPp6SqIQIo/Lq//PJWFkhqQkfKdOwnfCZ9j9/IiaOovEN/8nxQKFEHmKJIwMcj94gICPO+H+12ESXnmNmFFjsRcpYnRYQgiR6SRhpFd8PH7jP8Vn+hRshUOIXPglliYvGR2VEEJkGUkY6eDxfz/j370z7if/If6dVsQOHYm9QJDRYQkhRJaShOECU3QUfiOG4LNwHtbSZYlYtZakJ5/O9jj++usIw4YNJCLiGiaTCbsdnn++MZ980ifbYxFC5B9SrTaNPLdtoeCTdfFeNJ+4Dzty7af/MyRZ/P77frp370i7dh+yZctPbN68g5Urv+Po0SN06tQ+2+MRQuQfOT5hKKW+UErtUkr1N+L4prAwAjq2p0CLN7H7+xOxYSuxIz4FPz8jwmHEiMF0796bsWNH8eqrjVmwYA6vv/4yBQsWIjw8nB9+2GJIXEKIvC9HJwylVG0gWWtdH6illMq+4kp2O17fraZQ/UfwWvMNsZ/0JnzbLpJrP5ptIVx34WosPx+6yKFjp/Hy8qJYsRIoVYWSJUtRqFAhfHx8KF68BB07duWbb1Zme3xCiPwhp49h1AGu7yL0E/AwsDGrD2q+dBHa9ybwu+9IqvkQ0SvXYq32QFYf9raWfK/58ffzAMRe/YdkvPnppx+w2WyYTCa2bt2SsjFLgwaNiIyMMCROIUTel20JQyk1HngdKAtU11ofdrZXAhYBwUAY0EprfX1bqiDgsPN2tPN+1rHb8V62GL+hA8GSSMyQkcR/2BHcjcmrF67GpiQLAK/AYly+Gkp0XBJPP92I5s3fBiAqKoqePbty4sQJ7ruvmCGxCiHyvuz8JlwDTAZ23dQ+E5imtV6qlHoXmAU0dD4WAQQ6bwcA/7hywOBg/7Q/+eRJaN8etm+Hp56CuXPxv/9+XHiHTHfwVPgN9909fTG7e+ITGMz69d+ybdsmgoKCOHXqFG3btmXmzJnMnDmTkJAAgyLG0GPnVtJnrpH+cl1m9Vm2JQyt9W4ApVRKm1KqCFALeNbZtByYqpQK0VqHAnuBt4F1wJPACleOGRYWgy1VqeHbslrxmTMDvzEjsLu5EztuEgktWxNyXwFCQ6NdOVymCwm4tRZNybrt2bpuKnXrPsZjj9UjOdlK7drRTJ8+nRdeeJFixcoZFndISIDhfZbbSJ+5RvrLda70mdlsuusf2kYPepcCzmutrQDOnxec7Wit9wFeSqldwEGt9eXMPLjbsaMEvfQs/oP7Y3niScJ37yXhvbZgNrpbHIoX9qNhrRu3aX3u8ap88806bDYbX3wxkSlTJrBu3bf06TOITp26GROoECJfyOmD3mitO2X6m1os+E75HN+J47AHBBA1Yy6Jr72ZI4sFvvucomGtkpy6GEW5YoEUL+yYzjts2GiDIxNC5DdGJ4x/gRJKKTettVUp5QYUd7ZnCfcDvxHQrTPuR4+Q8NobxIwci71wzt42sXhhv5REIYQQRjH02ovW+grwB45xCpw/DzjHLzJXXBx+QwcS1LgRpohwIpd8TfTM+Tk+WQghRE6RndNqpwCvAUWBbUqpMK11NaADsEgpNRgIB1pl9rE9ft5FQPfOuJ0+RXzLNsQOGY49sEBmH0YIIfK07Jwl1RXoepv2YzgW6GU6U0w0/oMG4LNkAday5YhYvZ6kJ57MikMJIUSeZ/QYRpYq8OarmH/bT9xHXYjtMwB8fY0OSQghcq28mjDcAOwVKxI1bhLJD1RP12CN2ZzzZk3ldNJnrpM+c430l+vS2mepnud2u8dNdvs9FrblTk9w64pyIYQQaVMf2H1zY15NGF7AI8BFwGpwLEIIkVu4AcWAfUDizQ/m1YQhhBAik+WMGhhCCCFyPEkYQggh0kQShhBCiDSRhCGEECJNJGEIIYRIE0kYQggh0kQShhBCiDSRhCGEECJNJGEIIYRIk7xafDBLKKW+AGoCm7TWskfqPSilCgFbAaW1vvPO8iKFUuoJYDxgA77RWk8wOKQcTyn1KDARMAHbtdYDDQ4p11BKdQNe0lo/k5bnyxlGGimlagPJWuv6QC2l1H1Gx5QLRAPPAnuMDiQXOQk8qbV+HHhJKSU1+e/tgNa6nrPPHlNKBRodUG6glPLA8QdwmknCSLs6wHbn7Z+Ahw2MJVfQWidpra8ZHUduorW+oLW2OO9acZxpiLvQWicBKKXcgAtAnLER5RotgeWuvCBfXpJSSo0HXgfKAtW11oed7ZWARUAwEAa00lofd74sCDjsvB3tvJ9vpLPP8rWM9JlS6lngH611QrYGbbD09plSqgUwFNiitU7O5rANlZ4+U0qZgee11m8ppXql9Vj59QxjDfAkcOam9pnANK11JWAaMCvVYxHA9VPdAOf9/GQNrvdZfreGdPSZUqok0A/okQ0x5jRrSEefaa2/BCoDxZVS1bMhzpxkDa732WvAWlcPlC8ThtZ6t9b639RtSqkiQC3+O0VbjmOsIsR5fy/QwHn7SeC37Ig1p0hnn+Vr6ekzpZQXsBD4SGsdk43h5ggZ6DO01jYcZ//56qwsnf83FdBaKbUZqKmUapeWY+XLhHEHpYDzWmsrgPPnBWc7Wut9gJdSahdwUGt92bBIc4679hmAUmob8JBSaptS6gFjwsxR7tVnLYCqwCyl1A6lVAljwsxR7tVnTZ19tRM4J5dEgXt/n43SWj+rtX4B+ENrPTctb5ovxzDSS2vdyegYcpu0TtcTDlrrBcACo+PITbTWK4GVRseRW7nyf1TOMP7zL1DCOdPi+oyL4s52cXvSZ66TPnOd9JnrsqTPJGE4aa2vAH8Abzub3sYxvzvUsKByOOkz10mfuU76zHVZ1Wf5ck9vpdQUHLMEigJXgTCtdTWlVGUc09AKAuE4pqFp4yLNOaTPXCd95jrpM9dlZ5/ly4QhhBDCdXJJSgghRJpIwhBCCJEmkjCEEEKkiSQMIYQQaSIJQwghRJpIwhBCCJEmkjCEEEKkiSQMIbKJUmqmUmrQXR7vr5RKUxE4IYwgC/eEMIBS6mlgqda6pNGxCJFWcoYhhBAiTeQMQ4g7UEqdxrFLWUugGI6dzT7SWicopdoDfYBCwG6gg9b6glLKBHwOvAN449gF7W2t9WGl1ELgHDAGR80fL/7bf7oS8AFwv9b6XaXUJmCD1npqqngOAsO01quddYK+wLG3fCgwSGu9Iss6QwjkDEOIe3kHeB6ogONLfaBSqiGOL/3mOBLJGeAr5/Ofw7EjYyWggPM5YanfUGsdCzQGLmit/Z3/Ltx03OX8V2kUpVRVoAywQSnlB2wFvgSKAP8DpjufI0SWkYQhxN1N1Vr/q7W+BozC8SX+DjBfa/271joRx/7bjymlygJJOPZ8rwyYtNZHtdYX03Hcb3FsnVnGef8dYLXzeC8Bp7XWC7TWyVrrA8A3wJsZ+JxC3JMkDCHuLvWGM2dwbEJT3HkbAOfe22FACa31dmAqMA24opSarZQKdPWgWutoYAOOswdwJKplzttlgDpKqYjr/3AklKKuHkcIV8gWrULcXalUt0vj2Bf5Ao4vbQCcl4iCgfMAWuspwBSlVBFgBdALuHk6bVoGD5cDQ5x7VXsDPzrb/wV+0lo/6/KnESIDJGEIcXedlFLrcQxODwC+BrYDy5VSXwJHgdHAr1rr00qpR3Ccuf8OxAIJgO0273sZCFZKFdBaR97h2BuB+cBw4Gut9fX3WQ98qpRqyX9jJzWBGK310Qx9WiHuQi5JCXF3XwLfAyeBf4CRWuttOM4YvgEu4hgQv37pKBCYg2OHszM4LlWNu/lNtdbHcJxBnHReVip+m+ckAquBZ5xxXG+PxjG4/j8cZzuXgM9wzLoSIsvItFoh7sA5rbadM0EIke/JGYYQQog0kYQhhBAiTeSSlBBCiDSRMwwhhBBpIglDCCFEmkjCEEIIkSaSMIQQQqSJJAwhhBBp8v98jFBT/qdTIgAAAABJRU5ErkJggg==\n", "text/plain": [ "<Figure size 432x288 with 1 Axes>" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "%matplotlib inline\n", "fig, ax = plt.subplots()\n", "\n", "sel_df.plot.scatter(x='positive', y='negative', loglog=True, ax=ax)\n", "for row in sel_df.iterrows():\n", " ax.annotate(row[0], (row[1]['positive'], row[1]['negative'])) \n", " \n", "ax.plot([0, 9000], [0, 9000], color = 'red')\n", "# fig.canvas.draw()" ] }, { "cell_type": "markdown", "id": "e0958bf2-a8f0-451b-a4e2-106e959371b3", "metadata": {}, "source": [ "## Modeling- Logistics Regression" ] }, { "cell_type": "code", "execution_count": null, "id": "ed6786ee-4881-4a94-8634-6b6d735a0fe2", "metadata": {}, "outputs": [ { "data": { "text/html": [ "<div>\n", "<style scoped>\n", " .dataframe tbody tr th:only-of-type {\n", " vertical-align: middle;\n", " }\n", "\n", " .dataframe tbody tr th {\n", " vertical-align: top;\n", " }\n", "\n", " .dataframe thead th {\n", " text-align: right;\n", " }\n", "</style>\n", "<table border=\"1\" class=\"dataframe\">\n", " <thead>\n", " <tr style=\"text-align: right;\">\n", " <th></th>\n", " <th>class</th>\n", " <th>Tweet</th>\n", " <th>PTweet</th>\n", " <th>positive</th>\n", " <th>negative</th>\n", " <th>bias</th>\n", " </tr>\n", " </thead>\n", " <tbody>\n", " <tr>\n", " <th>0</th>\n", " <td>positive</td>\n", " <td>#FollowFriday @France_Inte @PKuchly57 @Milipol...</td>\n", " <td>[followfriday, top, engag, member, commun, wee...</td>\n", " <td>3737.0</td>\n", " <td>69.0</td>\n", " <td>1.0</td>\n", " </tr>\n", " <tr>\n", " <th>1</th>\n", " <td>positive</td>\n", " <td>@Lamb2ja Hey James! How odd :/ Please call our...</td>\n", " <td>[hey, jame, odd, :/, pleas, call, contact, cen...</td>\n", " <td>4448.0</td>\n", " <td>473.0</td>\n", " <td>1.0</td>\n", " </tr>\n", " <tr>\n", " <th>2</th>\n", " <td>positive</td>\n", " <td>@DespiteOfficial we had a listen last night :)...</td>\n", " <td>[listen, last, night, :), bleed, amaz, track, ...</td>\n", " <td>3728.0</td>\n", " <td>159.0</td>\n", " <td>1.0</td>\n", " </tr>\n", " <tr>\n", " <th>3</th>\n", " <td>positive</td>\n", " <td>@97sides CONGRATS :)</td>\n", " <td>[congrat, :)]</td>\n", " <td>3562.0</td>\n", " <td>4.0</td>\n", " <td>1.0</td>\n", " </tr>\n", " <tr>\n", " <th>4</th>\n", " <td>positive</td>\n", " <td>yeaaaah yippppy!!! my accnt verified rqst has...</td>\n", " <td>[yeaaah, yipppi, accnt, verifi, rqst, succeed,...</td>\n", " <td>3878.0</td>\n", " <td>273.0</td>\n", " <td>1.0</td>\n", " </tr>\n", " </tbody>\n", "</table>\n", "</div>" ], "text/plain": [ " class Tweet PTweet positive negative bias\n", "0 positive #FollowFriday @France_Inte @PKuchly57 @Milipol... [followfriday, top, engag, member, commun, wee... 3737.0 69.0 1.0\n", "1 positive @Lamb2ja Hey James! How odd :/ Please call our... [hey, jame, odd, :/, pleas, call, contact, cen... 4448.0 473.0 1.0\n", "2 positive @DespiteOfficial we had a listen last night :)... [listen, last, night, :), bleed, amaz, track, ... 3728.0 159.0 1.0\n", "3 positive @97sides CONGRATS :) [congrat, :)] 3562.0 4.0 1.0\n", "4 positive yeaaaah yippppy!!! my accnt verified rqst has... [yeaaah, yipppi, accnt, verifi, rqst, succeed,... 3878.0 273.0 1.0" ] }, "execution_count": null, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.head()" ] }, { "cell_type": "code", "execution_count": null, "id": "83673fe1-afce-4c4b-9753-14d5aa0643d1", "metadata": {}, "outputs": [ { "data": { "text/html": [ "<div>\n", "<style scoped>\n", " .dataframe tbody tr th:only-of-type {\n", " vertical-align: middle;\n", " }\n", "\n", " .dataframe tbody tr th {\n", " vertical-align: top;\n", " }\n", "\n", " .dataframe thead th {\n", " text-align: right;\n", " }\n", "</style>\n", "<table border=\"1\" class=\"dataframe\">\n", " <thead>\n", " <tr style=\"text-align: right;\">\n", " <th></th>\n", " <th>class</th>\n", " <th>Tweet</th>\n", " <th>PTweet</th>\n", " <th>positive</th>\n", " <th>negative</th>\n", " <th>bias</th>\n", " </tr>\n", " </thead>\n", " <tbody>\n", " <tr>\n", " <th>5000</th>\n", " <td>negative</td>\n", " <td>hopeless for tmr :(</td>\n", " <td>[hopeless, tmr, :(]</td>\n", " <td>2.0</td>\n", " <td>4427.0</td>\n", " <td>1.0</td>\n", " </tr>\n", " <tr>\n", " <th>5001</th>\n", " <td>negative</td>\n", " <td>Everything in the kids section of IKEA is so c...</td>\n", " <td>[everyth, kid, section, ikea, cute, shame, i'm...</td>\n", " <td>316.0</td>\n", " <td>4917.0</td>\n", " <td>1.0</td>\n", " </tr>\n", " <tr>\n", " <th>5002</th>\n", " <td>negative</td>\n", " <td>@Hegelbon That heart sliding into the waste ba...</td>\n", " <td>[heart, slide, wast, basket, :(]</td>\n", " <td>20.0</td>\n", " <td>4456.0</td>\n", " <td>1.0</td>\n", " </tr>\n", " <tr>\n", " <th>5003</th>\n", " <td>negative</td>\n", " <td>“@ketchBurning: I hate Japanese call him \"bani...</td>\n", " <td>[“, hate, japanes, call, bani, :(, :(, ”]</td>\n", " <td>67.0</td>\n", " <td>8962.0</td>\n", " <td>1.0</td>\n", " </tr>\n", " <tr>\n", " <th>5004</th>\n", " <td>negative</td>\n", " <td>Dang starting next week I have \"work\" :(</td>\n", " <td>[dang, start, next, week, work, :(]</td>\n", " <td>303.0</td>\n", " <td>4690.0</td>\n", " <td>1.0</td>\n", " </tr>\n", " <tr>\n", " <th>...</th>\n", " <td>...</td>\n", " <td>...</td>\n", " <td>...</td>\n", " <td>...</td>\n", " <td>...</td>\n", " <td>...</td>\n", " </tr>\n", " <tr>\n", " <th>8995</th>\n", " <td>negative</td>\n", " <td>Amelia didnt stalk my twitter :(</td>\n", " <td>[amelia, didnt, stalk, twitter, :(]</td>\n", " <td>34.0</td>\n", " <td>4479.0</td>\n", " <td>1.0</td>\n", " </tr>\n", " <tr>\n", " <th>8996</th>\n", " <td>negative</td>\n", " <td>oh, i missed the broadcast. : (</td>\n", " <td>[oh, miss, broadcast]</td>\n", " <td>79.0</td>\n", " <td>393.0</td>\n", " <td>1.0</td>\n", " </tr>\n", " <tr>\n", " <th>8997</th>\n", " <td>negative</td>\n", " <td>i really can't stream on melon i feel useless :-(</td>\n", " <td>[realli, can't, stream, melon, feel, useless, ...</td>\n", " <td>174.0</td>\n", " <td>958.0</td>\n", " <td>1.0</td>\n", " </tr>\n", " <tr>\n", " <th>8998</th>\n", " <td>negative</td>\n", " <td>I need to stop looking at old soccer pictures :(</td>\n", " <td>[need, stop, look, old, soccer, pictur, :(]</td>\n", " <td>251.0</td>\n", " <td>4703.0</td>\n", " <td>1.0</td>\n", " </tr>\n", " <tr>\n", " <th>8999</th>\n", " <td>negative</td>\n", " <td>Got an interview for the job that I want but t...</td>\n", " <td>[got, interview, job, want, rang, tuesday, int...</td>\n", " <td>236.0</td>\n", " <td>4800.0</td>\n", " <td>1.0</td>\n", " </tr>\n", " </tbody>\n", "</table>\n", "<p>4000 rows × 6 columns</p>\n", "</div>" ], "text/plain": [ " class Tweet PTweet positive negative bias\n", "5000 negative hopeless for tmr :( [hopeless, tmr, :(] 2.0 4427.0 1.0\n", "5001 negative Everything in the kids section of IKEA is so c... [everyth, kid, section, ikea, cute, shame, i'm... 316.0 4917.0 1.0\n", "5002 negative @Hegelbon That heart sliding into the waste ba... [heart, slide, wast, basket, :(] 20.0 4456.0 1.0\n", "5003 negative “@ketchBurning: I hate Japanese call him \"bani... [“, hate, japanes, call, bani, :(, :(, ”] 67.0 8962.0 1.0\n", "5004 negative Dang starting next week I have \"work\" :( [dang, start, next, week, work, :(] 303.0 4690.0 1.0\n", "... ... ... ... ... ... ...\n", "8995 negative Amelia didnt stalk my twitter :( [amelia, didnt, stalk, twitter, :(] 34.0 4479.0 1.0\n", "8996 negative oh, i missed the broadcast. : ( [oh, miss, broadcast] 79.0 393.0 1.0\n", "8997 negative i really can't stream on melon i feel useless :-( [realli, can't, stream, melon, feel, useless, ... 174.0 958.0 1.0\n", "8998 negative I need to stop looking at old soccer pictures :( [need, stop, look, old, soccer, pictur, :(] 251.0 4703.0 1.0\n", "8999 negative Got an interview for the job that I want but t... [got, interview, job, want, rang, tuesday, int... 236.0 4800.0 1.0\n", "\n", "[4000 rows x 6 columns]" ] }, "execution_count": null, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.iloc[:4000]\n", "df.iloc[5000:9000]" ] }, { "cell_type": "code", "execution_count": null, "id": "697dc070-9155-4413-8f11-b39b6c92477d", "metadata": {}, "outputs": [ { "data": { "text/html": [ "<div>\n", "<style scoped>\n", " .dataframe tbody tr th:only-of-type {\n", " vertical-align: middle;\n", " }\n", "\n", " .dataframe tbody tr th {\n", " vertical-align: top;\n", " }\n", "\n", " .dataframe thead th {\n", " text-align: right;\n", " }\n", "</style>\n", "<table border=\"1\" class=\"dataframe\">\n", " <thead>\n", " <tr style=\"text-align: right;\">\n", " <th></th>\n", " <th>class</th>\n", " <th>Tweet</th>\n", " <th>PTweet</th>\n", " <th>positive</th>\n", " <th>negative</th>\n", " <th>bias</th>\n", " <th>sentiment</th>\n", " </tr>\n", " </thead>\n", " <tbody>\n", " <tr>\n", " <th>0</th>\n", " <td>positive</td>\n", " <td>#FollowFriday @France_Inte @PKuchly57 @Milipol...</td>\n", " <td>[followfriday, top, engag, member, commun, wee...</td>\n", " <td>3737.0</td>\n", " <td>69.0</td>\n", " <td>1.0</td>\n", " <td>0</td>\n", " </tr>\n", " <tr>\n", " <th>1</th>\n", " <td>positive</td>\n", " <td>@Lamb2ja Hey James! How odd :/ Please call our...</td>\n", " <td>[hey, jame, odd, :/, pleas, call, contact, cen...</td>\n", " <td>4448.0</td>\n", " <td>473.0</td>\n", " <td>1.0</td>\n", " <td>0</td>\n", " </tr>\n", " <tr>\n", " <th>2</th>\n", " <td>positive</td>\n", " <td>@DespiteOfficial we had a listen last night :)...</td>\n", " <td>[listen, last, night, :), bleed, amaz, track, ...</td>\n", " <td>3728.0</td>\n", " <td>159.0</td>\n", " <td>1.0</td>\n", " <td>0</td>\n", " </tr>\n", " <tr>\n", " <th>3</th>\n", " <td>positive</td>\n", " <td>@97sides CONGRATS :)</td>\n", " <td>[congrat, :)]</td>\n", " <td>3562.0</td>\n", " <td>4.0</td>\n", " <td>1.0</td>\n", " <td>0</td>\n", " </tr>\n", " <tr>\n", " <th>4</th>\n", " <td>positive</td>\n", " <td>yeaaaah yippppy!!! my accnt verified rqst has...</td>\n", " <td>[yeaaah, yipppi, accnt, verifi, rqst, succeed,...</td>\n", " <td>3878.0</td>\n", " <td>273.0</td>\n", " <td>1.0</td>\n", " <td>0</td>\n", " </tr>\n", " </tbody>\n", "</table>\n", "</div>" ], "text/plain": [ " class Tweet PTweet positive negative bias sentiment\n", "0 positive #FollowFriday @France_Inte @PKuchly57 @Milipol... [followfriday, top, engag, member, commun, wee... 3737.0 69.0 1.0 0\n", "1 positive @Lamb2ja Hey James! How odd :/ Please call our... [hey, jame, odd, :/, pleas, call, contact, cen... 4448.0 473.0 1.0 0\n", "2 positive @DespiteOfficial we had a listen last night :)... [listen, last, night, :), bleed, amaz, track, ... 3728.0 159.0 1.0 0\n", "3 positive @97sides CONGRATS :) [congrat, :)] 3562.0 4.0 1.0 0\n", "4 positive yeaaaah yippppy!!! my accnt verified rqst has... [yeaaah, yipppi, accnt, verifi, rqst, succeed,... 3878.0 273.0 1.0 0" ] }, "execution_count": null, "metadata": {}, "output_type": "execute_result" } ], "source": [] }, { "cell_type": "code", "execution_count": null, "id": "a803ef1f-1213-440d-a946-81aafb664035", "metadata": {}, "outputs": [ { "data": { "text/html": [ "<div>\n", "<style scoped>\n", " .dataframe tbody tr th:only-of-type {\n", " vertical-align: middle;\n", " }\n", "\n", " .dataframe tbody tr th {\n", " vertical-align: top;\n", " }\n", "\n", " .dataframe thead th {\n", " text-align: right;\n", " }\n", "</style>\n", "<table border=\"1\" class=\"dataframe\">\n", " <thead>\n", " <tr style=\"text-align: right;\">\n", " <th></th>\n", " <th>class</th>\n", " <th>Tweet</th>\n", " <th>PTweet</th>\n", " <th>positive</th>\n", " <th>negative</th>\n", " <th>bias</th>\n", " <th>sentiment</th>\n", " </tr>\n", " </thead>\n", " <tbody>\n", " <tr>\n", " <th>0</th>\n", " <td>positive</td>\n", " <td>#FollowFriday @France_Inte @PKuchly57 @Milipol...</td>\n", " <td>[followfriday, top, engag, member, commun, wee...</td>\n", " <td>3737.0</td>\n", " <td>69.0</td>\n", " <td>1.0</td>\n", " <td>1</td>\n", " </tr>\n", " <tr>\n", " <th>1</th>\n", " <td>positive</td>\n", " <td>@Lamb2ja Hey James! How odd :/ Please call our...</td>\n", " <td>[hey, jame, odd, :/, pleas, call, contact, cen...</td>\n", " <td>4448.0</td>\n", " <td>473.0</td>\n", " <td>1.0</td>\n", " <td>1</td>\n", " </tr>\n", " <tr>\n", " <th>2</th>\n", " <td>positive</td>\n", " <td>@DespiteOfficial we had a listen last night :)...</td>\n", " <td>[listen, last, night, :), bleed, amaz, track, ...</td>\n", " <td>3728.0</td>\n", " <td>159.0</td>\n", " <td>1.0</td>\n", " <td>1</td>\n", " </tr>\n", " <tr>\n", " <th>3</th>\n", " <td>positive</td>\n", " <td>@97sides CONGRATS :)</td>\n", " <td>[congrat, :)]</td>\n", " <td>3562.0</td>\n", " <td>4.0</td>\n", " <td>1.0</td>\n", " <td>1</td>\n", " </tr>\n", " <tr>\n", " <th>4</th>\n", " <td>positive</td>\n", " <td>yeaaaah yippppy!!! my accnt verified rqst has...</td>\n", " <td>[yeaaah, yipppi, accnt, verifi, rqst, succeed,...</td>\n", " <td>3878.0</td>\n", " <td>273.0</td>\n", " <td>1.0</td>\n", " <td>1</td>\n", " </tr>\n", " <tr>\n", " <th>...</th>\n", " <td>...</td>\n", " <td>...</td>\n", " <td>...</td>\n", " <td>...</td>\n", " <td>...</td>\n", " <td>...</td>\n", " <td>...</td>\n", " </tr>\n", " <tr>\n", " <th>9995</th>\n", " <td>negative</td>\n", " <td>I wanna change my avi but uSanele :(</td>\n", " <td>[wanna, chang, avi, usanel, :(]</td>\n", " <td>55.0</td>\n", " <td>4546.0</td>\n", " <td>1.0</td>\n", " <td>0</td>\n", " </tr>\n", " <tr>\n", " <th>9996</th>\n", " <td>negative</td>\n", " <td>MY PUPPY BROKE HER FOOT :(</td>\n", " <td>[puppi, broke, foot, :(]</td>\n", " <td>3.0</td>\n", " <td>4439.0</td>\n", " <td>1.0</td>\n", " <td>0</td>\n", " </tr>\n", " <tr>\n", " <th>9997</th>\n", " <td>negative</td>\n", " <td>where's all the jaebum baby pictures :((</td>\n", " <td>[where', jaebum, babi, pictur, :(]</td>\n", " <td>34.0</td>\n", " <td>4490.0</td>\n", " <td>1.0</td>\n", " <td>0</td>\n", " </tr>\n", " <tr>\n", " <th>9998</th>\n", " <td>negative</td>\n", " <td>But but Mr Ahmad Maslan cooks too :( https://t...</td>\n", " <td>[mr, ahmad, maslan, cook, :(]</td>\n", " <td>9.0</td>\n", " <td>4434.0</td>\n", " <td>1.0</td>\n", " <td>0</td>\n", " </tr>\n", " <tr>\n", " <th>9999</th>\n", " <td>negative</td>\n", " <td>@eawoman As a Hull supporter I am expecting a ...</td>\n", " <td>[hull, support, expect, misser, week, :-(]</td>\n", " <td>116.0</td>\n", " <td>565.0</td>\n", " <td>1.0</td>\n", " <td>0</td>\n", " </tr>\n", " </tbody>\n", "</table>\n", "<p>10000 rows × 7 columns</p>\n", "</div>" ], "text/plain": [ " class Tweet PTweet positive negative bias sentiment\n", "0 positive #FollowFriday @France_Inte @PKuchly57 @Milipol... [followfriday, top, engag, member, commun, wee... 3737.0 69.0 1.0 1\n", "1 positive @Lamb2ja Hey James! How odd :/ Please call our... [hey, jame, odd, :/, pleas, call, contact, cen... 4448.0 473.0 1.0 1\n", "2 positive @DespiteOfficial we had a listen last night :)... [listen, last, night, :), bleed, amaz, track, ... 3728.0 159.0 1.0 1\n", "3 positive @97sides CONGRATS :) [congrat, :)] 3562.0 4.0 1.0 1\n", "4 positive yeaaaah yippppy!!! my accnt verified rqst has... [yeaaah, yipppi, accnt, verifi, rqst, succeed,... 3878.0 273.0 1.0 1\n", "... ... ... ... ... ... ... ...\n", "9995 negative I wanna change my avi but uSanele :( [wanna, chang, avi, usanel, :(] 55.0 4546.0 1.0 0\n", "9996 negative MY PUPPY BROKE HER FOOT :( [puppi, broke, foot, :(] 3.0 4439.0 1.0 0\n", "9997 negative where's all the jaebum baby pictures :(( [where', jaebum, babi, pictur, :(] 34.0 4490.0 1.0 0\n", "9998 negative But but Mr Ahmad Maslan cooks too :( https://t... [mr, ahmad, maslan, cook, :(] 9.0 4434.0 1.0 0\n", "9999 negative @eawoman As a Hull supporter I am expecting a ... [hull, support, expect, misser, week, :-(] 116.0 565.0 1.0 0\n", "\n", "[10000 rows x 7 columns]" ] }, "execution_count": null, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df['sentiment'] = 0\n", "df.loc[df['class']=='positive', 'sentiment']=1\n", "df" ] }, { "cell_type": "code", "execution_count": null, "id": "baa549dc-39a1-4921-bb10-911174662a62", "metadata": {}, "outputs": [ { "data": { "text/html": [ "<div>\n", "<style scoped>\n", " .dataframe tbody tr th:only-of-type {\n", " vertical-align: middle;\n", " }\n", "\n", " .dataframe tbody tr th {\n", " vertical-align: top;\n", " }\n", "\n", " .dataframe thead th {\n", " text-align: right;\n", " }\n", "</style>\n", "<table border=\"1\" class=\"dataframe\">\n", " <thead>\n", " <tr style=\"text-align: right;\">\n", " <th></th>\n", " <th>class</th>\n", " <th>Tweet</th>\n", " <th>PTweet</th>\n", " <th>positive</th>\n", " <th>negative</th>\n", " <th>bias</th>\n", " <th>sentiment</th>\n", " </tr>\n", " </thead>\n", " <tbody>\n", " <tr>\n", " <th>0</th>\n", " <td>positive</td>\n", " <td>#FollowFriday @France_Inte @PKuchly57 @Milipol...</td>\n", " <td>[followfriday, top, engag, member, commun, wee...</td>\n", " <td>3737.0</td>\n", " <td>69.0</td>\n", " <td>1.0</td>\n", " <td>1</td>\n", " </tr>\n", " <tr>\n", " <th>1</th>\n", " <td>positive</td>\n", " <td>@Lamb2ja Hey James! How odd :/ Please call our...</td>\n", " <td>[hey, jame, odd, :/, pleas, call, contact, cen...</td>\n", " <td>4448.0</td>\n", " <td>473.0</td>\n", " <td>1.0</td>\n", " <td>1</td>\n", " </tr>\n", " <tr>\n", " <th>2</th>\n", " <td>positive</td>\n", " <td>@DespiteOfficial we had a listen last night :)...</td>\n", " <td>[listen, last, night, :), bleed, amaz, track, ...</td>\n", " <td>3728.0</td>\n", " <td>159.0</td>\n", " <td>1.0</td>\n", " <td>1</td>\n", " </tr>\n", " <tr>\n", " <th>3</th>\n", " <td>positive</td>\n", " <td>@97sides CONGRATS :)</td>\n", " <td>[congrat, :)]</td>\n", " <td>3562.0</td>\n", " <td>4.0</td>\n", " <td>1.0</td>\n", " <td>1</td>\n", " </tr>\n", " <tr>\n", " <th>4</th>\n", " <td>positive</td>\n", " <td>yeaaaah yippppy!!! my accnt verified rqst has...</td>\n", " <td>[yeaaah, yipppi, accnt, verifi, rqst, succeed,...</td>\n", " <td>3878.0</td>\n", " <td>273.0</td>\n", " <td>1.0</td>\n", " <td>1</td>\n", " </tr>\n", " <tr>\n", " <th>...</th>\n", " <td>...</td>\n", " <td>...</td>\n", " <td>...</td>\n", " <td>...</td>\n", " <td>...</td>\n", " <td>...</td>\n", " <td>...</td>\n", " </tr>\n", " <tr>\n", " <th>8995</th>\n", " <td>negative</td>\n", " <td>Amelia didnt stalk my twitter :(</td>\n", " <td>[amelia, didnt, stalk, twitter, :(]</td>\n", " <td>34.0</td>\n", " <td>4479.0</td>\n", " <td>1.0</td>\n", " <td>0</td>\n", " </tr>\n", " <tr>\n", " <th>8996</th>\n", " <td>negative</td>\n", " <td>oh, i missed the broadcast. : (</td>\n", " <td>[oh, miss, broadcast]</td>\n", " <td>79.0</td>\n", " <td>393.0</td>\n", " <td>1.0</td>\n", " <td>0</td>\n", " </tr>\n", " <tr>\n", " <th>8997</th>\n", " <td>negative</td>\n", " <td>i really can't stream on melon i feel useless :-(</td>\n", " <td>[realli, can't, stream, melon, feel, useless, ...</td>\n", " <td>174.0</td>\n", " <td>958.0</td>\n", " <td>1.0</td>\n", " <td>0</td>\n", " </tr>\n", " <tr>\n", " <th>8998</th>\n", " <td>negative</td>\n", " <td>I need to stop looking at old soccer pictures :(</td>\n", " <td>[need, stop, look, old, soccer, pictur, :(]</td>\n", " <td>251.0</td>\n", " <td>4703.0</td>\n", " <td>1.0</td>\n", " <td>0</td>\n", " </tr>\n", " <tr>\n", " <th>8999</th>\n", " <td>negative</td>\n", " <td>Got an interview for the job that I want but t...</td>\n", " <td>[got, interview, job, want, rang, tuesday, int...</td>\n", " <td>236.0</td>\n", " <td>4800.0</td>\n", " <td>1.0</td>\n", " <td>0</td>\n", " </tr>\n", " </tbody>\n", "</table>\n", "<p>8000 rows × 7 columns</p>\n", "</div>" ], "text/plain": [ " class Tweet PTweet positive negative bias sentiment\n", "0 positive #FollowFriday @France_Inte @PKuchly57 @Milipol... [followfriday, top, engag, member, commun, wee... 3737.0 69.0 1.0 1\n", "1 positive @Lamb2ja Hey James! How odd :/ Please call our... [hey, jame, odd, :/, pleas, call, contact, cen... 4448.0 473.0 1.0 1\n", "2 positive @DespiteOfficial we had a listen last night :)... [listen, last, night, :), bleed, amaz, track, ... 3728.0 159.0 1.0 1\n", "3 positive @97sides CONGRATS :) [congrat, :)] 3562.0 4.0 1.0 1\n", "4 positive yeaaaah yippppy!!! my accnt verified rqst has... [yeaaah, yipppi, accnt, verifi, rqst, succeed,... 3878.0 273.0 1.0 1\n", "... ... ... ... ... ... ... ...\n", "8995 negative Amelia didnt stalk my twitter :( [amelia, didnt, stalk, twitter, :(] 34.0 4479.0 1.0 0\n", "8996 negative oh, i missed the broadcast. : ( [oh, miss, broadcast] 79.0 393.0 1.0 0\n", "8997 negative i really can't stream on melon i feel useless :-( [realli, can't, stream, melon, feel, useless, ... 174.0 958.0 1.0 0\n", "8998 negative I need to stop looking at old soccer pictures :( [need, stop, look, old, soccer, pictur, :(] 251.0 4703.0 1.0 0\n", "8999 negative Got an interview for the job that I want but t... [got, interview, job, want, rang, tuesday, int... 236.0 4800.0 1.0 0\n", "\n", "[8000 rows x 7 columns]" ] }, "execution_count": null, "metadata": {}, "output_type": "execute_result" } ], "source": [ "train_df = pd.concat([df.iloc[:4000], df.iloc[5000:9000]]); train_df" ] }, { "cell_type": "code", "execution_count": null, "id": "cf7e4e79-3889-47cd-b94e-4a883e719bda", "metadata": {}, "outputs": [ { "data": { "text/html": [ "<div>\n", "<style scoped>\n", " .dataframe tbody tr th:only-of-type {\n", " vertical-align: middle;\n", " }\n", "\n", " .dataframe tbody tr th {\n", " vertical-align: top;\n", " }\n", "\n", " .dataframe thead th {\n", " text-align: right;\n", " }\n", "</style>\n", "<table border=\"1\" class=\"dataframe\">\n", " <thead>\n", " <tr style=\"text-align: right;\">\n", " <th></th>\n", " <th>class</th>\n", " <th>Tweet</th>\n", " <th>PTweet</th>\n", " <th>positive</th>\n", " <th>negative</th>\n", " <th>bias</th>\n", " <th>sentiment</th>\n", " </tr>\n", " </thead>\n", " <tbody>\n", " <tr>\n", " <th>4995</th>\n", " <td>positive</td>\n", " <td>@chriswiggin3 Chris, that's great to hear :) D...</td>\n", " <td>[chri, that', great, hear, :), due, time, remi...</td>\n", " <td>4005.0</td>\n", " <td>337.0</td>\n", " <td>1.0</td>\n", " <td>1</td>\n", " </tr>\n", " <tr>\n", " <th>4996</th>\n", " <td>positive</td>\n", " <td>@RachelLiskeard Thanks for the shout-out :) It...</td>\n", " <td>[thank, shout-out, :), great, aboard]</td>\n", " <td>4349.0</td>\n", " <td>129.0</td>\n", " <td>1.0</td>\n", " <td>1</td>\n", " </tr>\n", " <tr>\n", " <th>4997</th>\n", " <td>positive</td>\n", " <td>@side556 Hey! :) Long time no talk...</td>\n", " <td>[hey, :), long, time, talk, ...]</td>\n", " <td>4075.0</td>\n", " <td>556.0</td>\n", " <td>1.0</td>\n", " <td>1</td>\n", " </tr>\n", " <tr>\n", " <th>4998</th>\n", " <td>positive</td>\n", " <td>@staybubbly69 as Matt would say. WELCOME TO AD...</td>\n", " <td>[matt, would, say, welcom, adulthood, ..., :)]</td>\n", " <td>4017.0</td>\n", " <td>420.0</td>\n", " <td>1.0</td>\n", " <td>1</td>\n", " </tr>\n", " <tr>\n", " <th>4999</th>\n", " <td>positive</td>\n", " <td>@DanielOConnel18 you could say he will have eg...</td>\n", " <td>[could, say, egg, face, :-)]</td>\n", " <td>776.0</td>\n", " <td>154.0</td>\n", " <td>1.0</td>\n", " <td>1</td>\n", " </tr>\n", " </tbody>\n", "</table>\n", "</div>" ], "text/plain": [ " class Tweet PTweet positive negative bias sentiment\n", "4995 positive @chriswiggin3 Chris, that's great to hear :) D... [chri, that', great, hear, :), due, time, remi... 4005.0 337.0 1.0 1\n", "4996 positive @RachelLiskeard Thanks for the shout-out :) It... [thank, shout-out, :), great, aboard] 4349.0 129.0 1.0 1\n", "4997 positive @side556 Hey! :) Long time no talk... [hey, :), long, time, talk, ...] 4075.0 556.0 1.0 1\n", "4998 positive @staybubbly69 as Matt would say. WELCOME TO AD... [matt, would, say, welcom, adulthood, ..., :)] 4017.0 420.0 1.0 1\n", "4999 positive @DanielOConnel18 you could say he will have eg... [could, say, egg, face, :-)] 776.0 154.0 1.0 1" ] }, "execution_count": null, "metadata": {}, "output_type": "execute_result" } ], "source": [ "test_df = df.iloc[list(set(df.index.tolist()) - set(train_df.index.tolist()))]\n", "test_df.tail()" ] }, { "cell_type": "markdown", "id": "832a09c8-82d7-40be-b20b-e30449eab141", "metadata": {}, "source": [ "### Train test Split" ] }, { "cell_type": "code", "execution_count": null, "id": "a2a1fff4-9e77-4a7b-9b6a-9e5c32306462", "metadata": {}, "outputs": [], "source": [ "X = train_df[['bias', 'positive', 'negative']]\n", "y = train_df['sentiment']" ] }, { "cell_type": "code", "execution_count": null, "id": "210b94f2-69b0-4f2f-bd73-7a346a0ab559", "metadata": {}, "outputs": [], "source": [ "X_test = test_df[['bias', 'positive', 'negative']]\n", "y_test = test_df['sentiment']" ] }, { "cell_type": "markdown", "id": "d789d4b6-3b8c-4492-b88f-45a559d89aef", "metadata": {}, "source": [ "### Model training" ] }, { "cell_type": "code", "execution_count": null, "id": "4881ff7b-b52d-45ce-9721-25572c4655da", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "LogisticRegression()" ] }, "execution_count": null, "metadata": {}, "output_type": "execute_result" } ], "source": [ "model = LogisticRegression()\n", "model.fit(X , y)" ] }, { "cell_type": "markdown", "id": "8d6b78a3-5f9c-4ec9-8b87-c92e63eef0fa", "metadata": {}, "source": [ "### Model Scoring" ] }, { "cell_type": "code", "execution_count": null, "id": "f0551706-ebff-47dd-aa14-deb48060a211", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([[ 0.24050227, 0.00685412, -0.0077651 ]])" ] }, "execution_count": null, "metadata": {}, "output_type": "execute_result" } ], "source": [ "model.coef_" ] }, { "cell_type": "code", "execution_count": null, "id": "d33e693b-115a-4bd2-9b7e-1a4afb400d1d", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "0.992875" ] }, "execution_count": null, "metadata": {}, "output_type": "execute_result" } ], "source": [ "metrics.accuracy_score(y, model.predict(X)) # Score on training " ] }, { "cell_type": "code", "execution_count": null, "id": "0aefe999-6613-4e2d-a787-5a632d1a60be", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "0.994" ] }, "execution_count": null, "metadata": {}, "output_type": "execute_result" } ], "source": [ "metrics.accuracy_score(y_test, model.predict(X_test))" ] }, { "cell_type": "markdown", "id": "42ac0dff-759b-4af6-868e-94d3e638c6fa", "metadata": {}, "source": [ "### Visualizing Model" ] }, { "cell_type": "code", "execution_count": null, "id": "e1424e46-3587-4118-b222-d3c5126026fd", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([0.00685412, 0.01370825, 0.02056237])" ] }, "execution_count": null, "metadata": {}, "output_type": "execute_result" } ], "source": [ "thetas = model.coef_.reshape(3,1)" ] }, { "cell_type": "code", "execution_count": null, "id": "a093246e-2e38-494d-98d6-a09056343d04", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "28424.0" ] }, "execution_count": null, "metadata": {}, "output_type": "execute_result" } ], "source": [ "def negative(thetas, pos):\n", " return ( -thetas[0] - thetas[1]*pos)/thetas[2]\n", "\n", "def direction(thetas, pos):\n", " return pos * thetas[2] / thetas[1]\n", "\n", "# negative(thetas, np.array([1,2,3]))\n", "# direction(thetas, np.array([1,2,3]))" ] }, { "cell_type": "code", "execution_count": null, "id": "ce354a76-145b-44d6-888a-f028ed16b2a3", "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "/opt/anaconda/envs/aiking/lib/python3.9/site-packages/seaborn/_decorators.py:36: FutureWarning: Pass the following variables as keyword args: x, y. From version 0.12, the only valid positional argument will be `data`, and passing other arguments without an explicit keyword will result in an error or misinterpretation.\n", " warnings.warn(\n" ] }, { "data": { "text/plain": [ "<AxesSubplot:xlabel='positive', ylabel='negative'>" ] }, "execution_count": null, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\n", "text/plain": [ "<Figure size 432x288 with 1 Axes>" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "palette ={0:'red', 1:'green'}\n", "offset=5000\n", "ax = sns.scatterplot(data=df, x='positive',y='negative', hue='sentiment', palette=palette, marker='.')\n", "pos = np.arange(0, int(X.abs().max().max()), 1); pos\n", "\n", "sns.lineplot(pos, negative(thetas, pos), ax=ax)\n", "# ax.arrow(offset, negative(thetas, offset), offset, direction(thetas, offset), head_width=500, head_length=500, fc='g', ec='g')\n", "# # Plot a red line pointing to the negative direction\n", "# ax.arrow(offset, negative(thetas, offset), -offset, -direction(thetas, offset), head_width=500, head_length=500, fc='r', ec='r')" ] }, { "cell_type": "code", "execution_count": null, "id": "ebe1201c-3a0b-4f61-9eba-67b16c6b8dc1", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "id": "6230a779-a976-4fe2-b9c5-3295b26a8d27", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "id": "bf5112f1-0c81-445e-bb79-1f62d55c21ca", "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.8.13" } }, "nbformat": 4, "nbformat_minor": 5 }