From dd95cfa14498b76431142aa42202d8b684d4d317 Mon Sep 17 00:00:00 2001 From: Jonas Weinz Date: Sat, 16 Jun 2018 18:04:49 +0200 Subject: [PATCH 1/9] just some little updates --- .../simple_twitter_learning.ipynb | 357 ++++++++++++++++-- 1 file changed, 319 insertions(+), 38 deletions(-) diff --git a/Project/simple_approach/simple_twitter_learning.ipynb b/Project/simple_approach/simple_twitter_learning.ipynb index 1dd7ab5..de24a90 100644 --- a/Project/simple_approach/simple_twitter_learning.ipynb +++ b/Project/simple_approach/simple_twitter_learning.ipynb @@ -2,7 +2,7 @@ "cells": [ { "cell_type": "code", - "execution_count": 1, + "execution_count": 15, "metadata": {}, "outputs": [ { @@ -25,7 +25,7 @@ "True" ] }, - "execution_count": 1, + "execution_count": 15, "metadata": {}, "output_type": "execute_result" } @@ -44,6 +44,10 @@ "from sklearn.model_selection import train_test_split\n", "from sklearn.preprocessing import MultiLabelBinarizer\n", "import nltk\n", + "from keras.models import load_model\n", + "from sklearn.externals import joblib\n", + "import operator\n", + "from sklearn.pipeline import Pipeline\n", "nltk.download('punkt')\n", "nltk.download('averaged_perceptron_tagger')\n", "nltk.download('wordnet')" @@ -51,7 +55,7 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": 11, "metadata": {}, "outputs": [], "source": [ @@ -61,11 +65,11 @@ "from Tools.Emoji_Distance import sentiment_vector_to_emoji\n", "from Tools.Emoji_Distance import emoji_to_sentiment_vector\n", "\n", - "def emoji2sent(emoji_arr):\n", - " return np.array([emoji_to_sentiment_vector(e) for e in emoji_arr])\n", + "def emoji2sent(emoji_arr, only_emoticons=True):\n", + " return np.array([emoji_to_sentiment_vector(e, only_emoticons=only_emoticons) for e in emoji_arr])\n", "\n", - "def sent2emoji(sent_arr, custom_target_emojis=None):\n", - " return [sentiment_vector_to_emoji(s, custom_target_emojis=custom_target_emojis) for s in sent_arr]" + "def sent2emoji(sent_arr, custom_target_emojis=None, only_emoticons=True):\n", + " return [sentiment_vector_to_emoji(s, custom_target_emojis=custom_target_emojis, only_emoticons=only_emoticons) for s in sent_arr]" ] }, { @@ -77,6 +81,311 @@ "SINGLE_LABEL = True" ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "----\n", + "## classes and functions we are using later:\n", + "----" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "* functions for selecting items from a set / list" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [], + "source": [ + "def latest(lst):\n", + " return lst[-1] if len(lst) > 0 else 'X' \n", + "def most_common(lst):\n", + " # trying to find the most common used emoji in the given lst\n", + " return max(set(lst), key=lst.count) if len(lst) > 0 else \"X\" # setting label to 'X' if there is an empty emoji list" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "* our emoji blacklist (skin and sex modifiers)" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [], + "source": [ + "# defining blacklist for modifier emojis:\n", + "emoji_blacklist = set([\n", + " chr(0x1F3FB),\n", + " chr(0x1F3FC),\n", + " chr(0x1F3FD),\n", + " chr(0x1F3FE),\n", + " chr(0x1F3FF),\n", + " chr(0x2642),\n", + " chr(0x2640)\n", + "])" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "* lemmatization helper functions" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [], + "source": [ + "from nltk.stem.snowball import SnowballStemmer\n", + "from nltk.stem import WordNetLemmatizer\n", + "from nltk import pos_tag\n", + "from nltk import word_tokenize\n", + "from nltk.corpus import wordnet\n", + "\n", + "def get_wordnet_pos(treebank_tag):\n", + "\n", + " if treebank_tag.startswith('J'):\n", + " return wordnet.ADJ\n", + " elif treebank_tag.startswith('V'):\n", + " return wordnet.VERB\n", + " elif treebank_tag.startswith('N'):\n", + " return wordnet.NOUN\n", + " elif treebank_tag.startswith('R'):\n", + " return wordnet.ADV\n", + " else:\n", + " return wordnet.NOUN" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "* the pipeline manager saves and stores sklearn pipelines. Keras models are handled differently, so the have to be named explicitly during save and load operations" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": {}, + "outputs": [], + "source": [ + "class pipeline_manager(object):\n", + " @staticmethod\n", + " def load_pipeline_from_files(file_prefix:str, keras_models = []):\n", + " pm = pipeline_manager()\n", + " pm.load(file_prefix, keras_models=keras_models)\n", + " return pm\n", + " \n", + " def __init__(self, pipeline = None):\n", + " self.pipeline = pipeline\n", + " self.additional_objects = {}\n", + " \n", + " def save(prefix:str, keras_models = []):\n", + " # doing this like explained here: https://stackoverflow.com/a/43415459\n", + " for km in keras_models:\n", + " self.pipeline.named_steps[km].model.save(prefix + \".\" + km)\n", + " # setting this part to None:\n", + " self.pipeline.named_steps[km].model = None\n", + " \n", + " # now we can save the pipeline:\n", + " joblib.dump(self.pipeline, prefix + \".pipeline\")\n", + " \n", + " def load(prefix:str, keras_models=[]):\n", + " self.pipeline = joblib.load(prefix + \".pipeline\")\n", + " for km in keras_models:\n", + " self.pipeline.named_steps[km].model = load_model(prefix + \".\" + km)\n", + " \n", + " def fit(self,X,y):\n", + " self.pipeline.fit(X,y)\n", + " \n", + " def predict(self,X):\n", + " self.pipeline.predict(X)\n", + " " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "* the sample data manager loads and preprocesses data" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": {}, + "outputs": [], + "source": [ + "class sample_data_manager(object):\n", + " @staticmethod\n", + " def generate_and_read(path:str):\n", + " sdm = sample_data_manager(path):\n", + " \n", + " def __init__(self, data_root_folder:str):\n", + " self.data_root_folder = data_root_folder\n", + " self.json_files = sorted(glob.glob(self.data_root_folder + \"/*.json\"))\n", + " self.n_files = len(self.json_files)\n", + " self.raw_data = None\n", + " self.emojis = None\n", + " self.plain_text = None\n", + " self.labels = None\n", + " self.emoji_count = None\n", + " self.emoji_weights = None\n", + " self.X = None\n", + " self.y = None\n", + " self.Xt = None\n", + " self.yt = None\n", + " \n", + " def read_files(self, file_index_range:list, only_emoticons=True):\n", + " assert np.min(file_index_range) >= 0 and np.max(file_index_range) < self.n_files\n", + " for i in file_index_range:\n", + " print(\"reaing file: \" + self.json_files[i] + \"...\")\n", + " if self.raw_data is None:\n", + " self.raw_data = pd.read_json(self.json_files[i], encoding=\"utf-8\")\n", + " else:\n", + " self.raw_data = self.raw_data.append(pd.read_json(self.json_files[i], encoding=\"utf-8\"))\n", + " \n", + " self.emojis = self.raw_data['EMOJI']\n", + " self.plain_text = self.raw_data['text']\n", + " \n", + " # replacing keywords. TODO: maybe these information can be extracted and used\n", + " self.plain_text = self.plain_text.str.replace(\"(||)\",\"\").str.replace(\"[\" + \"\".join(list(emoji_blacklist)) + \"]\",\"\")\n", + " \n", + " # so far filtering for the latest emoji. TODO: maybe there are also better approaches\n", + " self.labels = emoji2sent([latest(e) for e in emojis], only_emoticons=only_emoticons )\n", + " \n", + " # and filter out all samples we have no label for:\n", + " wrong_labels = np.isnan(np.linalg.norm(self.labels, axis=1)) \n", + "\n", + " self.labels = self.labels[np.invert(wrong_labels)]\n", + " self.plain_text = self.plain_text[np.invert(wrong_labels)]\n", + " self.emojis = self.emojis[np.invert(wrong_labels)]\n", + " \n", + " print(\"imported \" + len(self.labels) + \" samples\")\n", + " \n", + " def apply_stemming_and_lemmatization(self):\n", + " stemmer = SnowballStemmer(\"english\")\n", + " for key in self.plain_text.keys():\n", + " stemmed_sent = []\n", + " for word in self.plain_text[key].split(\" \"):\n", + " word_stemmed = stemmer.stem(word)\n", + " stemmed_sent.append(word_stemmed)\n", + " stemmed_sent = (\" \").join(stemmed_sent)\n", + " self.plain_text[key] = stemmed_sent\n", + " \n", + " lemmatizer = WordNetLemmatizer()\n", + " for key in self.plain_text.keys():\n", + " lemmatized_sent = []\n", + " sent_pos = pos_tag(word_tokenize(self.plain_text[key]))\n", + " for word in sent_pos:\n", + " wordnet_pos = get_wordnet_pos(word[1].lower())\n", + " word_lemmatized = lemmatizer.lemmatize(word[0], pos=wordnet_pos)\n", + " lemmatized_sent.append(word_lemmatized)\n", + " lemmatized_sent = (\" \").join(lemmatized_sent)\n", + " self.plain_text[key] = lemmatized_sent\n", + " \n", + " def generate_emoji_count_and_weights(self):\n", + " self.emoji_count = {}\n", + " for e_list in self.emojis:\n", + " for e in set(e_list):\n", + " if e not in self.emoji_count:\n", + " self.emoji_count[e] = 0\n", + " self.emoji_count[e] += 1\n", + " \n", + " emoji_sum = sum([self.emoji_count[e] for e in self.emoji_count])\n", + "\n", + " self.emoji_weights = {}\n", + " for e in self.emoji_count:\n", + " # tfidf for emojis\n", + " self.emoji_weights[e] = np.log((emoji_sum / self.emoji_count[e]))\n", + "\n", + " weights_sum= sum([self.emoji_weights[x] for x in self.emoji_weights])\n", + "\n", + " # normalize:\n", + " for e in self.emoji_weights:\n", + " self.emoji_weights[e] = self.emoji_weights[e] / weights_sum\n", + "\n", + " self.emoji_weights['X'] = 0 # dummy values\n", + " self.emoji_count['X'] = 0\n", + " \n", + " def get_emoji_count(self):\n", + " sorted_emoji_count = list(reversed(sorted(self.emoji_count.items(), key=operator.itemgetter(1))))\n", + " return sorted_emoji_count\n", + " \n", + " def filter_by_top_emojis(self,n_top = 20):\n", + " in_top = [sentiment_vector_to_emoji(x) in self.get_emoji_count()[:n_top] for x in self.labels]\n", + " self.labels = self.labels[in_top]\n", + " self.plain_text = self.plain_text[in_top]\n", + " self.emojis = self.emojis[in_top]\n", + " print(\"remaining samples after top emoji filtering: \", len(labels))\n", + " \n", + " def create_train_test_split(self, split = 0.1, random_state = 4222):\n", + " self.X, self.Xt, self.y, self.yt = train_test_split(self.plain_text, self.labels, test_size=split, random_state=random_state)\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "* the trainer class passes Data from the sample manager to the pipeline manager" + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "metadata": {}, + "outputs": [], + "source": [ + "class trainer(object):\n", + " def __init__(self, sdm:sample_data_manager, pm:pipeline_manager):\n", + " self.sdm = sdm\n", + " self.pm = pm\n", + " \n", + " def fit(self):\n", + " # TODO: make batch fitting available here\n", + " self.pm.fit(X = self.sdm.X, y = self.sdm.y)\n", + " " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "* when in notebook environment: run the stuff below:" + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "you are in a notebook\n" + ] + } + ], + "source": [ + "import __main__ as main\n", + "if not hasattr(main, '__file__'):\n", + " print(\"you are in a notebook\")" + ] + }, { "cell_type": "markdown", "metadata": {}, @@ -1298,26 +1607,6 @@ "plain_text = plain_text.str.replace(\"(||)\",\"\").str.replace(\"[\" + \"\".join(list(emoji_blacklist)) + \"]\",\"\")" ] }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "* defining different criterias for choosing a single emoji (currently `latest` is used)" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": {}, - "outputs": [], - "source": [ - "def latest(lst):\n", - " return lst[-1] if len(lst) > 0 else 'X' \n", - "def most_common(lst):\n", - " # trying to find the most common used emoji in the given lst\n", - " return max(set(lst), key=lst.count) if len(lst) > 0 else \"X\" # setting label to 'X' if there is an empty emoji list" - ] - }, { "cell_type": "markdown", "metadata": {}, @@ -2722,7 +3011,7 @@ }, { "cell_type": "code", - "execution_count": 1, + "execution_count": 14, "metadata": {}, "outputs": [], "source": [ @@ -2743,17 +3032,9 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "Using TensorFlow backend.\n" - ] - } - ], + "outputs": [], "source": [ "import keras\n", "import pickle\n", From c1b0070aebd97da88fb93874f589decea21c4227 Mon Sep 17 00:00:00 2001 From: Jonas Weinz Date: Mon, 18 Jun 2018 13:35:51 +0200 Subject: [PATCH 2/9] added presentation --- .../Emoji Prediction for Text Messages.odp | Bin 0 -> 158822 bytes .../Emoji Prediction for Text Messages.pdf | Bin 0 -> 242857 bytes 2 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 Presentations/midterm/Emoji Prediction for Text Messages.odp create mode 100644 Presentations/midterm/Emoji Prediction for Text Messages.pdf diff --git a/Presentations/midterm/Emoji Prediction for Text Messages.odp b/Presentations/midterm/Emoji Prediction for Text Messages.odp new file mode 100644 index 0000000000000000000000000000000000000000..4a09c70449640a2c354270a08e4124050d0d5926 GIT binary patch literal 158822 zcmbrm1zeO}yDyA@AX3tu5=z4m(xQYk3KG)Y-7O^`sdRS;LwAF8cbAgV(hX;g&-0#d zzk5G>f9HJP{C>j>_sm__TI*W>xYj60BOv0!!99Y5+mIWSfzUzoS>fQ|U{A0K&eGJ< z(81NlP}j!B!cZTHn#q(8__u#?H_ly#D!)!oMAq z{zx>D4;c;)_9O%cRWfn3)U(nxwXkP(_}5z&8!O{r1vv@y$Hb4pSI{Njh`xh^djQ_T zMLt3Re@B|cvcLuj1sNqVO8Vzd8JOr<*q*Vl(Xg{JvO`$8U$Ak%;N%l{AtcNr^zwz! zOIBGCcDdIAuU>N~h`kh-cq#ryR7(1dth}V0g3LQbh4(6Nl~tA0)KxXL)U*^bunp#@@=Ac0fC83MuUzVz( zf7HbMs7?Oan7-Q5+}fJ8)>g3IS-ja>@oS)Vd$_H=qqDoGtEabbU|?u?WN2h$Y+_<+ zdS+^7W^R6d>Bo=N)wRuEzqWUF4u1bWIy$<#x&raMzrUXpc!~)J_pn$}R7A;TZZFwW zg;)Z&>mVK~li618Ln`|o_mv`QZ+EcnMq`INPeO zujRYFmd@?(-M%~hG?|echxF~G&GxPd$~W@L+G5-4{IGs0IA)7<+X}ij9V>I$OkMLM zXZ&9a4PN*+{2Dz+z^_x`Wat0L-*FJpy;UH>&z&XKv%f6MwlaO-v7z<3qm^3a+JG_0B$d^za4ur4J@F zwL4lKu{-S1)cf6C8NnX`yr#=X(!F6{SaRdixjFh{?07}!hh4+k+RNa!SaJkuRnlqU zo8kHdw5B>eUZ)FTy|lE8;+ZvkK!ZBcue6ZkeCC!^x5D(sE;|(4w=?}D6z*E?SG!Uo z@eAVYiBFo%>Y}BREZWrO74Q?OwrN=1J!Niq&oC8K0#;~IOIsgD2&T9Dd`B8~q0SJ{ z<@3^_V%vF;VkYVhAw+E@f7ul6^0Udkz0U7z`ObTp#Nu=}*{(&R2YT(H)$FQyW7gw! zDe0NSx3x^y#P3sb;vtN!U!ESMg|Af3hb`p^#_XP}ROL9(;J!q2IGmY2I23#Noj{GgDXGMZ7{%pv%;%M+Eq=(;IJ?L(+RnIF-Av+Xup(udjB3e!-7}+UO!{qQA9-V{ zSggEOnd|v77LW3M;4fOoJx}=2ytb~mlPcGy#GA?o!Df$zxj_c-5Nf{f%V?l@mEXd8 z@Au^YEhpS~W4Vcn2Q)tkGvgC8ypVT|ZJ{F|_;A)yi+OW<85=7fT|O*r1H3tZKRHwEr>9epVO`-fiR6y2a)Q zES{2La-zkrbbSAPzWtAphRwIHt*wkqjUDa&OwINjtPa-J7J9mNtp9g=8Ch8CIvD;> zdr|zuxlAo}jScNtUzs{s>e|@<52qylhn;P#Z5(X?xN!Wx+|M4M5J&s}`4&n4>3nw9 z#sJ0qf7nx3U*FKe5JcGee+tk)H3sbV{^u+Gr^vvX&_>tF(BeNuhTzbfkOK@p*pmy~ zp@ONtgCn>lR(3Y<;9&dn!p1K80`@N(+iNaSaSm~I4v6RrUUtYUhzR?CgTrRPu{s|i zfxqV)t0v&smw$tXl)xn1$*ZCRVY`EvWc%3UDEO~fk)&dx7@3)rD-Up=ynRU%VIoV1qjnl;<+IeaM}`BECZ zxQi=z`2E-=S&RqXTE5 zq8+KV)#tY*=W}@0F9d-cJ@b*3(eb`qCz!_=Oyuf6af*VS*C(cRgV4t_`mcQqJ0@+x zhi5kds01>@se-Zz9ELJ=cIyM_B7Os5Bs>;#3w8E;RfhesT$tnnrJEtR&-I3jG#j}0 zAryw>ZBs?+vd0^PvSoUmGT+|i$OK}L4UA?wJGPM4+7&bGk&kW|-3Q{_ZwcGKx-eGC<|`#$b|hfpU@Av5?us zv*UT|mWR!d{AR1=X3MM79pjzPd}+eoUg;q-B^Xg#$gr4}3szgq>d{Nkwf08QC-uj% zsy}$H-Q3ulCfu^M*id7-SYIV;J(BKo3BoqG?0rwh%VRo5bG(scJ-6KCcKZ2xKq93( zgn%{iRlws}2Rcvx*b}qKf?4BtNX{6CYj+?9>W3l@$?XDDgc(tWE<5jZzR!-d5Ba0LM_R8mmYoy=9*c6?Feb5Wq z4X%7Z+xtg<=;Y&B3MGQ<9{&E>{&c$1VspZKg=3*gwa zAmEPVAZF%Q=LgnCL&>J&`wMmYodFKYn)B6`6)onI1%`Jw$MWujA0HsdG<#eQfSy9F z2hU@*U@|Uzd!p#R(Cm4w;A*3X+}nM7eI7NJy^e_g)w|UUiz?efKzNDY??{R$Md9vh zr-b`f`~E7fq!npWm*e&&=##Ic9`A;*Hph2WZLUW@SEN3djc22>BR@QJ-w^)N?T3t+ zi1k!lmCCkIzNc8ZBXAjP3BMGgrz6CIPPC>9y6^HTTk0PD=qR@N`JLz;vYd|Xft$~> z`ugDWq4dV)^CkDQ^NwJgr{@;S&5J5Je%lJLae&BehE0>(br?zYdf+o2C05t}5*CuKR^lVaLuZ3t9O+M<<@jUsOmSF8G6e!P9Pr(dhsfg?EuGf%v zI<}{7qxo;2x~FnHX2@!k|atcA{ z72oneXLUlr*c?g~G>5fX&sxOGO7rQVTzfKjQgI!>qewM)>C`9e+}2nKo22`0PYzN< zTxrGkoP2QEELG-#xY^3DjRWT?R$1l_8|RpIIQiloRH^g<=J7EWgK;G zrvGYW`Vu)b=m|h8n7$jh=6W9!FHMjX<(X3t8u0hL?eu_Y~1ljt55E` z94X~|m#JVJdcDt*Og`v+uZ>Wcd?f~wt^%XGJA-eRw&GM&gy`pXSyCa!azBjuy#5su z%104sM2CSC<*0wL#^1S*xUH)4p{X60QhfMmfg!^x~*dG^b z2AzbP@GY*`TihsPVxQZec`aejK4(7r+^Y!B2z$j=g?$*^3VWXkJNrLugzYVc0)_1- zr2`4_`xM58p2!`M)a=sEtyuqxcDzg?EqmGV=&WSJTR65Ky6io{v-fMV;p}|sY2HAt zU-#Yt(=vi4X);6O7_22WKo!6#*eOzE-xA{chls+BWX3i6VZOr;9uz~Ggp&L&clBEn4QbDn3qq?tm-&8U6dp}t)31K6R^9kqAv@o)y~&s* ziN*7JzA?H)V-f?txKp$Jv_W3$4G#H_dN#-QCN$hDnYPSMnX0){XlE*xD=LG#_(W69 zaNW&l_cP-q_=lFRu@-YbcaTEPSv2%qd>W@Qi7u-xH`CqqW5R?M3SMt=4!iH?Oz*m5 zZz(QuOj|B=+!;ZgcX%k3ynmBm@}``qT>V}ej~fU)Zf0Xn^`g`JSZ~W=J?U0qb}giS zZbh2&?!sq8Pr%kO`yhrvrH!=SL7GvO?}3nm9*RRO>p5w8i}{45j@Z))eY2`2bcIQ@;n z)ms2-m3S#c{Zlz5ew6Vrk2*#Q8}qz#IXpJVVcVbF6BKL^4lRnanmMSgMGS|7>LX}N zqmli>t6z?+#L)lJR1{V>_>9Y%u+bD9W{c-w4J~KBcdO}*YI#Xx(auHN7abBBQtHW2 zKd^*nLFjV|i&ja5>vSXgz91tTp&SLPmZ=$+iN)$dk{dOi7X;YU0gU!N3 zf>CSa^qy+&!Ps!WpjIbw)T4vhYwtuO%lY{_e_q#<4ouq8N2G<_2i7;yUGH>T$G-TE zMPaET*=A&R4$fc-e_p^jX%_A0H@@WK_i<4Pi1zH@KS)w^_Nq8Aidi31ZJTt@G)3|ij5de48Rj)~yMnHpr)PMqaz%>K>W{oJDY zS(Nhxt>MJrw1JS01)Ds+xJ>8F!4%e(l#A~jV(#cJqbDRcX2iOWz^o32l)y0A@e<|V zH?FiOfx6pg=|0}k5BkJFL%hZU4c|$TGqj&=psB16>ALAfNB#KT!Tp5#v~gO*&Q&ltW(W)q(??^2Au@KVUGvN6}ew$aY$IJa`j z>cg{DF-D6I_5^VWL1) zILD%dgOYydU}ed~d~k&7wwZ-ZDlvW0QZ=+^R8$s%dTc#~Uf}F020w<@2qS_UkqQl0 zkqE2u#3^|Y0^f-0!eqi4`g}XGe!VfQvwXbzRnD7QTD&(wffsfs#g3veUJ|pjYaN$d z4H&9V*}74gzKeI;#0Jl=_unFZ^BaTcMd4hU&TVWdTuN3pQZQ>6(NpmG@=K6DbneRQ zpZ_0)>$)|FpcNSKdichL8pRq!d| z)Otc!yC8manrMH&F;Yi={2Lc!{9OBGEPj1#+b9~pJekh!JsMnVY8g&%ReOgQ9Rb!o zHZ88gQ9xP8K)@4ud?iB<4XS&Of|DJBvT}6XwQ#dd2l-b!J_haR`Fm^gj3`KJ#{CvC zc90|c(o<+{Ixn;TW=SG#u9}ur_sVbCg_5i$ZTghJA=%6T`h>#RSa9`W8!djgZP1T* z+RUWy*}d3EbpNyG8K7*t zho?K!gQ%>HI^^Crwu+4|w&OX{1ok%SvR!fcF%B6L1(kiVN>kY*t$SqkkYJW#OV!F)5s*w8o>}oz?L)PWg zKUD74`{U*}8-g1(8=P{D1{00Iy%|!6!|2sVT1k zN-L8i6*JKD<>_Eo7|9^dvWNZ@R83zCCN^Y=hcPYRm%p2(Eu|6zNZtos{f@QeW^AoL zZg`==c{urn?e}K${#fQOClKSI8T)$jR zs%I-r6=`m7E{}7a50-M3zP+1z^__YpCHv50e>jD|W(%kt3!B67?CsIa>QlJS-*waz zZ9Rg?A>b&G7)BNDLY0zm4e!e%!<|?rAYsTJjORu0I`3=H+yapxSHC+vS2P%#J7qaY zB>tvD>YP!V>8eRs=9Yd;sO+ep{k*h(ji{0U-&}kGlO-3ZCG*Sf=lfjp0*C&Nvh@zz zwAM?F)h#Y1gFznGRs7WZ9TD$OfYkHqH0I=yh1*WG{pL`v_x+t|YPVUYR+C%C(KZi8 zduTE2%Zr(eh}=z%*R#fHvoEU77f*J8m=xGoxcp+`@l=|AS19{x zS6D?CBhtW1XNasH5<1kj=i+L+uw=IdjDzy7%IS2KS^L`7@~bT0pei@|dR2H52UrKW zI@$W7&*U_8m^4G87ZkHL=Da(jYq#EKNWuhd#V)b$4nmD>;qR(nA-h?scPxCalpk4V zyDCnTBCFwgv{ptIG_xE?;T7M7ceLbwFdL%`E>q^R5zWn8;WjVNQx9bl@NVkvi3IbK z(EK!2(I0fOi3TbPin%h9anj?g%OZRGh}>6RE$(BCrCUYnOJRpUl^Z)+^I3~Aqf}aK zpZT29e9d-`sR38eYj&J zm$J((=c_sI+;~c{5I0xs8olqE!+B3^?!+bB&KI4FR4b_EN?JcX*M?qbH=ZL;db`ch$11!v-jA<8mFwu8lIM&d7c@IC zUJr9jUW(7qZuXm71ey*xX>Lijgih2qb>$o@c=w&68fXKHh1P9X2I5rOuHC^>le4IHsRcRz9zghPo%a_6Upc}S7N_W=Lf7^{sNr$YVwuLtnr{(rMx0U5X zWlvYlN+(L`RWByX6J^YW{?80e@Fck&!HvTCcjMziB1r*_)R9=HtF*QxqHCaoRIzs$ zaIasi^XD%%v8y_>{7Ma-S&KGV97=$6*SlV77AiACyzg#CTu(^?v1cxl7RAGe4Z9iH zd%n_2Cw>n=RUdv($Q4Sg>^$*w6Xl`qh*G{nTXjqyi%%6xhe^%KW|}v-qK;p&tb-0e zLBTl=<%(4{{R%Y(W2vf|hWt%`4uycrNb~Agj`Y;zfd9dwKd0?VN492%*LuiZXy?JL z$Z1;YnWShw==Y?TH@QGR+&G=q9*)#3@w&t?JBM{ld2v*W`1;OAZP#tZa&%nImhp{J zIym%Y7HH%h2v3m?Mo6q1b$OP5Qj5vdhF22`dDMoflpmrwo1Sh@7L8_?Z`%0Ks)o6T z58_^*?NzW86ud8-TTC8>b@@#AezR~S{ioQQwz|5V#}6tRn$;?ds(&^%$c{6XMqV(H z1s-=~#J46FhH1tKV5+Qxu|EicV(D7=z7QX)DE-e!9_~;7yJyr3c>M`}SeQO~l*HV3 zX(StkG&vg3vB{-%{PumIl#2`;1GeRksI$o(m%qq5MO@LbXVRUdE1};+^+G4;PrJ97 zV|#u`(JuJ-xbM!e$7nLn+*8GtTvz&u^uZZkQtUv;TFl2+6ZJSmY-~hEOoFneKO4XA zI=)1tdWsmEQY{cN?B+tBM(d&y-%%akxq7F}%U*lr@;ZK3Qae*c%NPMezv{fy9rC3SDXjgk>l9yE z-rdtdevvj$#b?3Pt|RV{uih7-{@!pJz#%a6zsAlY%rKoT&$&ev_rMO?!5wZV(Du;1 zAAxtLe78k1Gr-h27#4yL=2?yyvxElY5T3k63OvE-Ch}VT7h!52kruEJTR$#U@ zvRbT<8C!4mx~;$b;fE zFFG$LfYbye2aoYo?FJ`HsaSU~VdsK$YqUF4X4D-{R=tqKZOQRE5QD4AY?1?57GGh$ zh`&gA;a8;&fGT7`4PkexMP z+W3@Mu}0m1ingbr%EO1K_?%#O2*2}wX!dF z)3NN}%j<&{TA=b8X!;nwnlCpD(Zq7tUzk-YR36M_cg4D@ZTVk#uJ({01fHQ*dMbt0*jQFDTb)O07)r(7L?EGZRD;)iOD+!X**HvljT ztNlI=U?UPbvB75oRx9yPLMoVpw)1!wcqG)_9W}|VLutaxYeOmX_2Er4DT6#8-+xP5 z>x!VT)^yX|cZ6?nKeys~g;r@Y`aM~|m1CmHcqqAyysRnbu?)-aWdVOS^G{7`F?;mGa>AWwKZc=;m{I)-Z8Nx2FCQx}7gGurI%W8N2A}1n zn2GacZ);#Xkk2Z$i{}C$s(wz3vn(%si@U9b0u_Ej(){3duV#6mu%y{+f4L=%j!fl` z!&1_6XSQ0BB@r<+wN5Jz(9@tgp|PO*87F|%9AU&<<@>t+xFg--;iRVeRTlZ}?+4_} zzGMC|-@;nq_1tAVI+TJ>xh&^6SCE`^^p(J%qnLxST>&3jA%5VtF)m>2rmkZ$x`=34 zftz_g&*I_R?wtMzS?~LhgEgkG;=H+8YmwL-HA8^M@1PAXjnIyd_~?2FHja$Srp z__mzkAK2ZkZ~j;#k9bKtN-h!eyl$_YCO@acFLdovid%d_CovLUl%#!P^wMCy(o|nq zeuY)#C-=s+1sdC34=?PI_rQeKGwWAc23ee<~iz22wNxAa-_G_D?>58PC9G zTab)(r;|@j&e;|RoOE!1We%Ldeq$gZ9!4~IzBulEcVk`@KU`@FQAGJ75ABr*>tfbx8+>4?s}caWx4Cm z00NoIqjgKSG$GG{I{QryQ5~vF&-EA;>Ta}OFuo+0dC+()w|27{A#7D-;sxyFnb@b! z`wO|+EndnRSZ3kRc)=x|nstn^Y zsg9hbfHPc8aTPi&sZ^T0RaaJipu5AJc(_C+9a&oInrmM&UQ9??$-fB#Xd#y-M8+T} zBYaXAmu~kj5?&o{qP{sBL|Zy)nU>1F9;ecBM!{_nzXfPYqH)v7m~?gVyHPHwv~1mS@2YHmzJifJ#TKvI z5yQCFt^}H$iEsL6yR-T*fFXuLl_cn1&Fk7`^eHh8se5BtL>q2L-7jC#l+q-?^}H634m`(kro3ytt_xgt+?fgsQY?p;Ha7fN z9~>Wi43vzGqM9WRX7%dOj*mS&hBCvColbs@R+HXz?G1>^r8@1+84iQ|+sA3WBv5)A zP9bb{;0`#Hr6%O!$%YFf^E5Xowa6(_PhFj(lUa1zI^So5mu@<;+K!aOvVIAe&;W4z z5yt(lGPIX``z}E{CW09;2>`6wvzNftdyeDwFzHwPW3$&SXZK)2w~YTDK=n&{Eha{* zU@+u=(_YL^qkq$0i<=}4@6$<@vt>|zqPE&)9&POW&T50!OJ7IeumgwtM%2CG?xkSl z5NSZa27Ho#D~oosfZc%T$M-woWh+mfc`eu3cY9p?3^dhXK0Ym%=q2o_W_tm2H0UbOeTiPL_K`TfT+!I#b@w^wk&3yygmHucFo2@z z&!#Ptz|l!;52_3*Q=eV!!{}8Qh5!ln3=QHGiNw=ZL6_e@IHPiLXo3_*sLCR-Se1jU zK5``dNIVis6X{ktFg5f-jMGc%-T2ya>=VpJ&(?Rfj`wYA3N z!HY!W;nb?(*NC=w`p^0F1M0I_Y!B-BWFlIRnCKpCqv<1tkcfa(Rp@xBKv$D^YA#GS z1{{3#wqKKlabzF88c?1SoNj3jHdLc1){Hh3t~T*QTg6cyOucZ#k0zhMygkBKlB2Vk zYrD2ssMLMPJ<5(Z@yTlsQ`_TEj707y&*}ys$g;hzUm|6|l%Y@jTx;c_$z(xH6L(CX z9L3X6A7|e>6okn7R?7Afoq-=)ZT&dayVx_4zM>1Xv6Q+AkeM>GQV+@YBU^;%Uco7Y z)?2OfJpK5ctm8OxpD-12_}h-m8$GmacHIEM@M$C*db!G!NfONVm>|a>m+~mqCiopE zqE!rx#1JMZTRu&AUaFc0i2lgVk)bb`!`>yz zJ{?VZa|62kd=99R!kk3d=c9Xx#BH@=fEXK0DBYmf`MLTAjjr!y_CY|V_H%-C z#h9^O@K>+bMDg?s9uR=|=HnVWdRiTK^(F@>EHKa*+{5u^08N_2aARFXiBF>}bC268 zGb;TU#Hx1)VfwlK&WSDNO1h-MMZaG?1zpp%!Ij}A_X*z#*y%Can0?X8Bt z$88*xQ`c)GsefG!;Hz@u9|k|fCwA4bJ1oYZvD{juC3PSTk;z``CqZ?}Mv!QLTNEcm z^luEf#fT+qdKBpF%zkicWrkuVtjsCHG=cT%BO|+orUa^m!lL;2!6LNz2|U3;N7WXd z>fA?3oQRLtHytRd3U2XUzv61r?Knj0h8>>hiN*_b;LQB0mUoc3T<6NaZStnwK%Z;Qf3}syV z$H5t5At5*;F6W3jA*Q_EcOHyu&{V~`U#4< zn(GFUd99+>=Bb{CZczQfInEXWfT=Pfpv30WE@dZkkJQk0p!Bo~iOr02L!1LDFLUmObJmJH)g_zbkBC@18e|_flBx4M;bz z3ZJw|(j*GSQCbEgp??%T{&C}fRYLy$no-dIFF_=d1Ae|pohJ%p@>)`eQD{^6GLR-d zUxotxe)a?uw$W<_0en4ctl8*tNKvZc9xk^)~a2Z357OzE*-)+ds^Us`N;13iz z4g$O6=-0zDz#5(21pwk*M+OI6l8EH%!)^)$Py|vi#A#Qx zLcbeBeIHmW2^p^g6F*d$(N3O!b;3FTLI(yM(?@SJoj1SyX8T<+b7g;AL4Olby8X1DBNZN8x1=ifpE1iA9LR%0zpEb$D)=~30|-L3~tOUAyl z)z>yZWc9+Z>s0rBUVAWc)?V_00!_eSL!Q4ch;B+<2IX)rZ~POv%<*m0{9srdrdtT# zU9^*1&z5(t4JJ+358tK+i_HS~%jxO@*b|hWezg9?JS)BacdR7Rv^NMf{wN9C9&&|Ieg|1@t|-QX0!Oa zk>C2>tb_VgG(xr?8OGgG=Y{>k_cst~+#>ZF?vlo%&w}2oUFhQ_+QLb!P!p)pIdXgZ z$$B~mQk6A_CH4en*3W6yL$}lY#rZR5Wpv;ku!H%-IiKTVQaAo28Dk>}C>OJ?SZ%sm znQ3*GDf&YY6&0XbgQ`+~+CJHqbYX}DGhi?R#{&?o*F&c@pvEp9AkX>3{VV-gY}Lmf z8-9ZF*<9=8=3LO!m?*oL!Z$ic>;1-n99b|2I4^rnKbD2!t%H4J0mG9m(P|o~S@tqV zwgmdpD^!b-TP12C7mq`wv!CsOdj~+f5%p&yjt-WD>1owMsV*xh>Qg3I-)V;`7XAAT zMCw4nvdJ*0VIHb9n`HQ%0E8v>hmUbf5!wYqIM^Oxf9p@@eq0b@;v;5JOYqu9E;w@H zn_~A3(8+C=HCwzquQfE@%KQR?UZpPb(bzXddj8o@z0yoN3Dk+T9-u1M;xq1ZY^*f4 zVd>$=+*+D^J~^H$C0droNInWqCOgMzategF%)wt?j*d#xsX`{_Is>ZPB}&&qdBdQQ>d79JeQ; zpPd8GbpR-N*666AyD&}z)XMoLyl7`2EuSq*$FZm(44Us66Zzb(Maffl%Y07`!B?%Z zvo9n=S^(VElsVKyM^n*6uNDLFPZZ`-k@F}CT_30P`tAFdFi>>I;-PuB(?WCh05BTPL#5A2oZblP7q-9hy0`x(Zw6ci*MznLSU zvpSiBqiW5!Cw|#z`G<>xR5UL_HWBC7M;M)FFyB!^A>Ll1eZ*>bwA39R|H4*JhsbxE z?V09_y3L`yYFlvqXdqC;XwPJQ8JJfsSa^fj0ziF_JDa zHP5Tp5d@_#MMFYn>QRO7KLGS<7Uci{R<1P9GqnXmyqM7n^M?&pO8MxSunbIo+Gcp$S;pe19_Ro`45Ky&X2>somcdp{9Buvl(x#D;dyBpl zTCk9f>u?X)izVqZXiLg_Oa#Jd_(B;vUqJt#a;{(Wd)|E1^ZxeSi6abeLA%B(MN`u)AmF?cM-@q6 zY6PZn?D%<%jIcKT_QhLd8+Ir*?c)S05hE_CpXfG6ewgnzbu6%KZCjbUKjD}3vo}S# zX72euc^g<;M|yXA;4RTXKXA;Uu9I>-cKwa`8oqXDhdO*3bmWU?h}>Gjp`Wx{I?yFk zoAj}V!$YF3VyN;l{Kf+A_iulYD0D%z9$EK17-{*fG$M2&jF!EN7AkgrgmD@iz}vq*}V*4D1<-^|&|d1d(UObq??Kxpc^2_0dR4WemRqCH%UKqQ1^Q z`B@!T;REl}!Pki%GXL3FH^;6iDcW}*xr5LIjt++o$v=$DsO%+as9mJ7(<=_O-#4(T za||NpQVVB#e6iKKLCy{>-c4v$x-nm=d(8E(8;sxy!+4aL5*9raCbGyK7dhbm?b$ZU zz6qAw2(CoE{rKQD8C7NnO0cWGMt~=IF$5`Ar8QI2eCb5=;neyUJVeJ@>t&&axs|8R zar@J8?a}O@EbOnqWK)!x25&yOce1k4_#tBWNHNfB>!a*@wq4r-AKu`_NuU(Jx_#o8 z&CGVjEAGFwS^Iv~voC7#rAG|AytiI*C$?%|hxsSN_US zFZ8tN89y}^1+o)?eVDUi)G~x@VN>i;IROa42;!~^!6AXd}J@1QbYa>X$h**!z*3R zn=4vfVkcWg3_5o@w*ycKZ}_O7J>5YgRjbB$#FoMLs;jnRGJ@To2OZ(7C$) z1;ehVuJh0mMplblD)hC77z_ubZWZ28uo>A*>nH0@@X8Z;hSc)uK`drUqs{fZaH&HG zz6?iQaDs}fE^2Zr0M)OZfUIrNhiXyaJNaav6j}t;duznyW9axf5WYWI_?gH;z$DJ$ znNpjuW*2k@Ghpqb`;semqxV`@Lk%@v7%De%IS-Nw`#K9)U2w~f=;a+P2A`B^b10`# zcDUjfLEKT1?VQH7o`E(eC!{b)cRvyZH4NC;WvmZSP3 z->VEt1EIgo#{X6ke-+zxk1(&Tvp}>y?GM(1{Wt3m_j-x~AAl8Ou;+ij2o3TA@@EYi z2e%kRgo|B-OO!)IjGOm`i1>fA2o1px4i4Vx&my$PeAC!)a3A6RT7*yZ1hkSiLErPxIj5wg#fM{`hGV zB@h@q7tV#QcPna#eh`{Oq7c6&bD)~@Vpjm4}WwpfczMys(34=7= zE-@Zr9KPrDQSd`E@yi zf8s@+sT!36HFanq0MFxSZ7`k3$$Yvv%ySAetgl!pZBVa#0tF?GK8J6Qzg&KDe{Vn)cXr#gLopUsdAjc(kD z>Z0i7wUm=al0>S;ePP9di%BO5#p8^INbkMY&gDmNLtq@`7Jm`KacTK2TpkcWoI9%l zN(~jGk-+s+&Nsg#BU@bjjBG$(E<<$$qvW|YT`-FWxLb`9f5p<1CvwkF+a(??H zdxzMPicI0bc687B(boV88IAAv^k&!JIe22@vD1 zfoSis7EsMM{pKW$=GOC9M&Jtd0~J2m6Hv|+J{fmyd5R?^M%#XV40>>VkndREgz97^ zm?`UB&kmL;t_7Q^YJrS7!wEuaZKQDOvh6Ql0-T`aDYPr|PT`T^Fm7E2$OWiN>*lMk zduOE3cyrW0Yj#QQb)ma6niUAf7TfA_Y_U-(;Fz-<1Z;jbnh7GBK?V2Y=7O5rpvu7g z7F-D(mtXHu*J-6xS|R;2&^9maAQ!;)XgHT@QPEd;hpgGG(h9g$XEQ&b3bpQ+pyu=) z3xCaEdLO)!@l%9?y>|=+)&dMtgw1Kl6%v)QOFfU5)vMf4(VR4LktmFw6sth;&3Al| z$!!i!ZD?YMqQTlle0M?fDJY{E65j2!@npgKhD;-c8*tL%bA_A%#t*~`T0|QQ+ah8j_%4a|tZmufDyDH;Cc5_> zk4jMJg1inPJ;}lJV!_GZWy;>q2_oL!y_~X2YWi;n zb)Mwp6>4tJ$JQfX$=Pv8;-EWG+JmwYW4_xv)F~l-q@VSie$6&2_q&q~CSbMiqQFlK z1CI>LLgk`zW_fx0o3MSbj5J7$(9iVYT=DPPPat>Ik`MmyzQ5K!*Fvv%@DIF3iMV#m z8T6tXC5$b&M^eMh`~fcogY^YTwn|!n4_FQbw+&WrFB;EKf;|z`!l@q{oT-MubL@ zrlU>x*hL3iIJci0btd%(@3w0Nj}f%TTrY0|vaT@0tSii?S*}4_Y4$~U&lTpe07oo% zam4H9P=cqV_dvFov-pG=jb9+(r$+{?5-HQR$F z(AoV%mXKdzh2FJ!;&}(H)OkiWz#A|7^yA`ib&=C??T0&42io^jGoft3ldR6;*6QUOesq6O?|78fJ@< zJrnMs2M~`c7R~M2(YDVo9FfM4*#8>jTc5u4pgpD-!ko(TA52%kbh@K(Ro(W7)%*l$ z8nh)lv1;Db|6=!pvk}awC!)Yov`i;fhuM}no?CaGz4DI(p0R4t_(0R=jz?GTs8elN!_DfS>9lrTYR|^zIgv2Sctb zdk4}vNN;Wu!t*{8`NJC`dHR&HyrB3bZ-5kFWdSQ2*tvL#jK}2% zdWX=fNDED+DfQe7ec$gpXP-UJe)s-y{NczLz)G^_Tyx&{)uzy$+xhcDJb3QR)U1vQ z9pyWi4$#n-?*8?*Cx!}}EJbu?QJa0{o6wxD`1~`Bm?ervWSRG)a&s&LEiW)1A&nUf zuWaGgSGO4ih@6(4Z1w`n@SwI;#pFi3Qkg1cdcLl>!L;&SLZ>7hujyBYHz~bp!*rw( zwDcm3m}%7`mlZGQuxIy`gDB9k3y`=_YfUJUa-r_| z+>!@cq2jiXtC|mWOYL$1t% zqzE^x1z{GMb`g=U0T87}bJ6@7W(s;ah&_HVJ5qipU~ucbDKzg7R`@`Ex8EF z@*k;T)k2HKHISk*`pBO*et^0*ik1>VaT~$@SOB1Y z|M7Fz-z+RciCNYLbq_c(7Pq0^U4YwVvurg~+<_=)z*Ew;hC%uYm~PgRPri6Fe^D8C z00}&h5(RLd`u9@`>lckUrbEyG6Lz%1N#|Q@0PK`nbQZGG zD?WOn<*v}9o+yXegi?B;WI8$zu(z_&@3ToU1EA#4F}PnV-c=wXpt=5iqAmj}iN&JZ zZK9j$gOuVIPfecnTEE|pu3Q^1yPK+(Qv3^e-ifu|nU45jtM)=R$?J{Z(L~!%5s~0t zDOtS>#jIqhr_|*}fj5iSK?HMcajVRGe*pucRC31)c!2za4Y<*!;^nbk^Iv2CPobWxL({kmP2DyC`c z+r)NVRj~1g6Q-P|qa4ivyX}F`+1s}bNbp2u{Du_oS0l^ruwG}wWX~6Je$E+Ypo&@h z^7>lof`)+@^PI|rZn&67<={2bAu|E)3%i@6yOFF;u=nU@Brw@4_p;wQZ}3k%k3lUu z)HIo=I`-rpM|3Bl8lIUli;nvN?hzs5b2qQ3r&9lVa+w<+ApGMML`zif>}*;^2-qfW z%5%pF2psC9KZKFSsAANkVz?ue{dL*whM*^$X@1O^8ls9#UU&j3rgYGB*u*?yG!@ur z89|eU<&9Q^or}*05xg-&MOHDxKxVALh?gzX{9fN49ZB*o1Ye2dCr^ZXCY?t4)dKx> zYEvf>2S~Av)cHPZ8lSxC|q(_e=<(qEO@tB-2Mipe9 zA8^1N=8cTcl$BDFs+ov?rNi`H-2MBU%v$qXMb~S zr$tQ)kvq$0YeP*3Dg*V3y9fAaS|a!zDREFHx$m-ws1KeGf{Z+5x|}0apO>MDGOj1CUe&q-LAOdfgKnyoSFF{x>9j${7fiq;rPZC43mBFg_^Hb@%c^X z2RIU_P%Zk`W!|Go64RbB*z0oRp~j`^l+)dfv8 zwhpdW4^ahGBv$Y1PCwq$fXhjAcWc?aDd4d%6+xWz;o$d7zUdCd4H=-ow zM=AyhtORkwN6uNnH_C?G<|vvJHMXqLrGYl?Pu%|E*z2GO>T`N~bX$S2Bi9n!{#{i~ zqYhi#vWHRZyKRO7=hz%=5YjNoZg-g_Tt)f4QW>N6Qyqw-9rw9@@FKIfAmtq+6e*kZ z_+ylD@{R(9Ud%w4Nr`v!7_2I^{B403r5{RhkV_3wh;+gn$7!;5icqaK*CVQwVGw5B zq91JVrWMVhU3m3$!4`~FhEm*32o@3Vq;HeJDdCv=mwX=|mk>EFjy=07^uW+ZCgkdD zr#F5zV%(zXQFyY_0n&XjZokwrwXAY+>`!n@75B=}D?B&7Mk7L6uc_r@rmsg3TuDnB zdIg7OKx$yYgy}`2t`vNGB9`^z1l=&uK;Bp;21ygOi>ov70i`P<7@}NrENz1~lPE&D zVp-hLg~>S1a|J*AY!W1-bTtxjoTO59{-ontAJG`@e{d2+2D}|k$=;xHQRxvLxSTsK z9RCPKdpE}tUwOMH@z>0@K1;5AG*F6GH_@#DUbC?9`4A6W^91;a!Ky3relU#pOXWl~h_8tG0- zim8Qyq&=rk7|3kDwC7DJnBZz9yx^zWKHcx_9z13e@ei z8sMxUkS8-I!%onig$Wy*)7CwhK$PSbq2n{RR=&vl!RQ|~%7ogaW*_H}=1=IO2?Z%5 zreFr(kW^l(;dNGSiKU(1pcrr`P)q7~u6iiNq6XOy(So*{|%67yKUBp=zjJcfQf_ z?S-1O?WpAF)?PIE=jFG)u1r{#d`9YDL70`v*y)6E<1FhFYXMN6w*qZ?I3ajkDuk^65HPI2QCbI@-F? zTv?AQ3{2x7WnLY%Z47rU>bkomHi7=~qQ>|-%IOo@2cVBe$yDmezy_852uk2UVKQ2* zQKL=qkhk&OT5@>d7$=GlCQcGau{}$nd48G5Q)2C>PMkc>C@RdC@5OXgs}5%UWGC6s z#PA;;YRNY&bAaa1bSPgGCYRzT(2ds{o9nOFKb`z~R)P!f!`(1ua@bex{oZshY>1HZ zOZo}Vu`!)7=di$u$?G$YO)RsHEabD3LMiPw-M>y{Cdu|jB(J$~V~g!(JIzHJUbMtY zPiY1!Y+oiwFHjO@t&{kIF3Ufz37ZLHd3YU6SjBBMIHjq(n>tnaxJ$@RgNbuK=4YI6 z(?w)e{g%}3oAVy=NjsI|R1@`uH|Fe$`g1*;O>_hV(`ZzLc9wPYzr;vq3`Y(-h^A#c zS(!iRV$+`x9&@QoaUjTcy{|GTv@@>TWOXq0@WFkC{-}2vhAM%HLmwlm4RKsm=i_P5 z*@;%ghs&d)4(%&0cgU5Y+M2U7s5yNb3oXRz1ZgfZ+9&N~+&Wol-;eb>nZfVnBX+!Z z7W4?$Hyp=(`+Mb^E0YP6ojaJA`K{UXyS1T&tgVMV>+1n++>uu-26OTpel{mC_l#`0 zWlv?hl`h`CYNSRlVj}eJ@=MHtdbDJf=gHfWU3=X_!(anjjZ#LzPAa|gFhSh@*kV); zBeTq`hI5Sh37vW|W~ay;tx%)IO7mc&om|>iFZsixHj<_cyV79`Rk8c_NiUBS6W+4$ zZuwob&|4$H(Z92ejBkK|}(^cZv$V)ijj%$-rM z3r(gvi*zg>sw`TwzsvGue25VDyOrSaEj9jI@|tAVSN|>w3G}aebabEbS`}rB{}NZk z0MlH7Tt6mnHlqdC!x?dJ;_U?;p%L>Mbl!s4q=_4|V@5$u8uI|*{^oV6CpLp8gtpD@ z=e4*ke4LuL==DunX!mhk_)?qRMyXJT{`)Jp&wjqgH4S4(Tgl3CK-mE6}68-|1rI}Q)~yBu}` zMsV621JyCnt=zA+IV8~mJHF5wv3y9rc^bop{I&Vk2>JQw9P&P*#kZ5~^b+)eaS*kL|(oxSNmWh`v<%j4YqKPu!#OKgJL!1-@Th$b)s^VNt}8JPxTWUO5r@Ym zdg}#nS4yk6F0w3O@W>5#nyyvAwx*%o(hxP+Nl#t3DcQq7A4NBl1y1+Jsq^Cyoo zh3P!#d(^JV+d%~$$$qc_t&r-{@YU^|(MFG288t=l5uM&4a|`;sm|Q)N(AECl-LQ{h zNm6>F9e!f{9nXg&$AgXtR~Bz3sC8V8TJHG3u8Fgjt@4l`Uz-M41-|%jld9kN%*&s* zdH60tU&M*m_=U^hLW!hOb?1)-39-O8|Jd(w(S6x;i;iL|-adqtE^xIpq~B^+;z-h# z0m_lXyS$Qqbhp>R6`T^=aj)n8k&;qc^*pmfUd}p+mPQpFN7^~+8%PN{a0*=h3IYI3 z!W;Fz8EZfF`ZRkkxVr`biJKXDY5Vg+OoaINg&Tn#6lY9azwBZ~)mxa$EZ;Z7RYCS;49Y|G@ji z?t47;;jb$?#o2CPjj-u5+7h%Ud%^8**4G<{KFdGBVhBitoa8Z(0DT~+v^U3^?yE|% zVg0-K(T7V^GX<->Sc=VWW~;KxSLqqnNzjOChjQrZ(AubQMB36fn1}bZtjR4IGKbjl z4-PTwAKvACo_awzZ&C<>a}@+^hvvUlU!~_3^5AQ;oI;FFjzcytuiWX_Z%jgwMR&nP zy$6_vX(&y&1Bv4Rf&d}xy*!+JgpebL@f~pX3B+9KoD6^RBCTqhc-Gc-0n%-Ny|qm&J$iO=#T5lx@0&`ci?+x{hN>$BiqYO22?j z=J^Dz14o=^VrzsrrbGf5AXXd`el#eq+gcW}m?_6g^@GGI9TEucf<(ueLWP(=cJ;a-ss=D^d)uxh{^q{B55(?Lw<0K8pU ztNh1&%i#ex1|B?A^c5~*kH6NNFE-w#n(j%4jDha46}gW< z7dVvq(p`WS&YYBcL7r0;`6L6)Vf44cPc~$0f4^8PKJ~(ZeNW$;4;6DIf-I?4Z*KQ5 z1QfO)Y_j7dWNx!YWzB`2VdssDTEk&dIiLi%sNMn;rexQmW+YT-DTPQL@Mm4ykf#)Q6z z0*npWUvIb@f(Wx!t^wUh{o+pVGhZevs2>@gj6LhqpP|*eQ^Qby9n~@hBEC7jB-sKF zaL|Gs#S{}E9+&?fw2SwEbof#z5ae9#(K05k09V|*>dvjiWW$EHYoKH=;pvbte0!M< zF=`?_ah4G+(tH9bq!Wn&0c(Ye2xy*yo1hc(oO8V~D(13g4roavIK~np*cQ}kbgpBI zUF4^5-_WbQzuE4muBIq;#dW|*E~O`xox>J`AT^Y216-5Z&_HH@b;8oQ9o^X1@DD&# zT(jI78CpgN$&C1aEobN@*E~T^*qBfx#f9JSL(mgf-LHYV1VZ)d^7UtbpwnMx?ko0I zy19h560~tjwX#yn06-NAEtPkz9;M~O-!wQ%-bOe`3n!Teq(b#nwFb$9h`AZi_4_*1 zs<#vmAZ^E!A7AenUxr-INoNiJz=HJGbJJ5p=*7*TAYjlD==M!jhcy=3f#$o4(=D;4 zC{n*HQ;K6d^rFd*Dv~>fC_txzfXW~U%XjfX&S)(Vi(iQEV71A6$>3ZM-nqG{O^9+C za)rt0u=>*H$81F{n;f*rtp3E8Aas>Ad16aTpHFctPwuOL0z?o09v|rrKGJd2+-x~U zjuc@6zZVoPF6Ju%hTex=rwHO)K%e(2`!>fk8vx!2VpqMUo|G2oCNf~kW!|EdL^CTy zo?Uk$#$DoB97keBd1%%;ed&mV>Z&Q_D~FNgZ{I$aCx}JJ2H!gE*nLO7QG6QDax;w0 z$Zqgxo^6uAoj-S4X-r9kC>Q69A!Sq1zEoO$mUKMN>d(($mi{l{!SH)fEAAoc@B(=r zk$>2Fj^8i-ho2lR#|YbeIe_5V0BXn0-3Sx^jc%X#h|ayWhjYV!*jN9*y(;~(0YK5h z?#|M#IV?^`#Hv7(kBq~WZ=2&lOlAXE7;5V|@%nGDoJW<30gZZXp3)0GK9kqcQq25N zNnU~Fu;7{#$Z)yv^^ahUS=5;Yl-IxVjA+vJ%DwLk|0#)b;z5{R1csE!h*1zj(hAwl zoWPAAof)gf!|W1rfsK_5A8M2N0Cn=_VdOujRy6!zuwrc>&o}_=_iP-`?VzOxAV-m&l1$%}8ppCkGPi`PAIPDZXEMa2|lKn_3w z;PYh`8R}^v*ruIjs8#L(ApUR(RNXU$NyvTx(4xF-f3ZT*@v02&83cj`w2N!J5Cvjk zj}m(%2WOzj$_gGV+a^Xx%Agl>7p|K-9-eA9_;x1psMUS&%9=xrQV;AVE+Dxd-eClV zKVUBnTKOj9g&JMkx4a>WWH$WVsKj*mnnm!E?xOu0OM2yi93IP|>uGuwrNdA#Er!jy z31Y7sx1K9%8CV0hqR;4$bLDkE1j{Y|kTo9B zUSvMYe6fTGBN02m_RoocMShTh^6<5RT6%b$&%EzV_f?ZY>d#u)`p^8%33L+Lz>xiE z3W;5gSOeiqsRgOfOhl_tl#$!;mD$zJ?ZjUzCA4ks7(`>aDKhRxXHW004H)MG&_p|2 zo`Hqfad0F_F(w$NBsGDon}~4};v6Q{%6!!odg=M_DTSAY1twc!R{-_y2LnXpY)4Kf z*SiaEXJkp0UR{ZflNp_kb%p7o7pV@h67S8Gy?;J1p7 zxSZ#df!qrA#&wQ$!B@HdEOqyq%I7l6BKwcG#xHqY%y@uJcB6^RoKu`qTlbR-dHs9& zYBb(MvN#0eZ@;0<^H$k;%w5HF1;|Q>6|*cYGy+>xe@Ifkpj#5)plgUMgSQ=Ddqbt0 z2xjlaRnSrD)Hnmw$J%m})ALKHGNSWYc)u3pu4>JIQRn?iL({dSbTo!2v?13)Eoqrg zNu8kVb-N=dyM&_0I8poMXpeQ0=l~;kcuKQA=f_J8_a1FPfoGe)m<@OsyK?gw(5W<` zr&26BM3=jQcak5ac9q?&3R3*HX`COG(EQgQ&Tlj$oqS}f=^e5W*`2%VEE7Na2D&}keJSs$8E8ClVK z6aqKOIeTo~wIZ6f265eDA2gVf-`aDY;yE^;IIv?K9&ehG&kz&+^AnX~aX5R1MwJsN zxj6)rjand1qGe8X_Z0nWmbu&c89)`&E>_PD@L82|>pBKoct1o*`_aB@L8B;c_o4OD zCg?~Z0LKd%DOSqg?>VmBCY1g`I z<1@`rkc`v*Or`JI1PHw?LjxdkDhhekuX4&4>|NujdkqIq*wYij#U&FwyWX{u={5+N zn_7fwGke#XChv`krjp~t^oxyLYbk{?HGa+>w@+hMn$(Y)Uv83wjS?eqcoK_E4o^f( zB#@9{(6#e(f^yx>o;I-S7tQK1k99~l+UrCK05L|uA()GSJp1jyy3|5i~vjb_yGNg+sIahC~gTC;L=J(q3guQxu z(<1!7y-}#aY1fx$$-WaH$8%tHcV^7ASZ?aHBYFM`=S$$);Mh>LkPfyt1f5!VcT@aY zJb60UIeCQfn(?r5;U$uQy#Vf;7Hl0&ch)PKDv)6ybA$*rhJ$DNJ!Bso}l> zGi=)%7m{Yg!h}g*Zk~PodrK~5yZmkF2hQQan#UJA8+T=)vJH%oleGwr(-5WJd$-i? zQE#?vx418D47pl~LX{#umbOy=%r4BbDB0vRXTR;KI*nsJ%m`}-Z0{VAj{7Y4;Q^@x z-3=)xfX-)pLQ)0Efpf)l5AO%6<3+%&oooS8~p`7PJAXt!F6m2gjt=Vs~xtVh z3v)WNGFWn4Xh=nG&j`K-%p~=a zGvU%h*n2nL-wv#`A1t-MvWcH~{U+#zOA1sjX<|Lu*I-H?isE_nmTp}+CQURK0v}oH zvLv8v8KZd-`5Q&$$(LoP zgzDb2%ZeJ|J%)4u2jyf#uG%ad@l#K|U{`Jzpkb$^e8UQ*o_cD_GWELB>a4wRAMU26O$n_5w z9;y0pCnj%UpEx(f7mihkEhGiF=lLy<6h<|b_AO3^k`DzKVLm!B^5^}E5w=X~Sudv+ z-wLchfAcVn1Uw*Z1gD6grC_Iq1I21fHHHV7v6x^qeaCv2MZhV^9FP_shTQ)1gLfH?q zvF@^$3-hmyx^^dclebgUH9e+>sOhx+-n+4?bpecyQrXBE2!j?ynt)#YfzZ&HkL{=S z3gTa%(F}st%~QTZr?B`dqCdOcf6XWk7Fg#l{7i|+h#u)t$fPrgFm5dnxo`iP&iDje zw=~>&v1D4s!JNqTeXATgbDOS@s9M?m@oC>ouXgYYz*Pz8Jd)AGpx0nnd zs70>Cjn-OsZgoj)>)Wj&*VRuA-*4@G3TSy2N8OwG6zGiUlKgE3gf^W91tx9{^0`GW zg#F4{AZ%7z?5b;WC#bDPn=HLN5a!kw=0FIm20=|}X`yxM47^B(%nUxj z^TRO04)b9EbnR8cb_9^TS~Q{#?Ooea2stArrx%*8&+w$5xcN)>k4Q)p&eoXlRa0ou z2e<43lE8@QG8Xdy+$x<+<^$0-p_N53gwgezxG}6=hc5*0B471_*N->B4`QiXA$kl) zw<4^2h#QKaMjYx4yH+r}Iz)68_QXq5t`qq2qLN4_%372K?QCW=G8vE#07~J>w}v~0 ziH0bugs7ys8#tu5YK|pug0^PdmypPK-TDK?yYmxgdGO$wwaMyAXagW*0Ay9Z$onIY z)&;M}x40ieV^c*JukeWIJ=O4!yjm87|5$-G#{t2#fR7deI5rZ4*iVO%c#;I2%-TT+ zp$XdD0dq9x@6m)SwNKuTQbyE1eAZ((dI_?Y;nm;(u2qqYaVE3EM~jF6u#?+?+gs*> zd|@+UF{R)i(g$sS08&S4$7x`R!UHOIJ{T6-M)fDUPiSl&60jnt$spX3G z5!*+JWEviG)T$nWSAoXtE$4If!L|B}0maE<*fwDUXcq${x!(Dw#xZ;1kjMDX4U-Hm zMR|Y}Jp-O}8{VhY;o|mdZ*P<7c>*!P-9jl$9vhX4OK5&Xm3-TBOo< za~?;6m$3L0XR3G4qIHXDu5ET6oLUT6@K3_WK#U+udwyU#bE&9 zZ~sh+|KL@eD|l1(;Ha^Ue|dNQ53sHOMBn*z$OsXI0oalT@y1B#6!_e6AluCaqjsL{ z-iN}5X#n@_Rq^x7>$~9gxT5m@m3o%mFn~D50HTb|+`MU7GI_de`~_X4=loz%8-vR{ z*A)mit^mlV@X7awn=tDa;Fza^#o@9&p(I3s)fWo8O@;D9o}2^cSJoG3%$L>{82C@} zkX29`u`{~6!$0TH~W}4+|-Ba!}GxC3yEsSDnGpge}?=Wj^?O-&Ymw zwa0^Tzedo2OZ99&SqKJE;b(_h$oCOYJwJPp2iJUdu-L}Hd;l8W`M8%1xq##}z*-yn z%>{u8fLs{_4CV~K8!TLwngC>AaVLJ9J9hf2_4+5!%HR&!m|eqSU^80kvm;0i-vSfZ z3rzDNTsGvp1x~$VO#>g7+0_}*Gl@_(EiT7mB6-b15EkZk8I1bSmgy5D1sic@EMNgz z{y?&7!VMg6>BU(?X2l|-EQGB+?CO5HuE>u>5wxDZ?ebSjhc=}7tbe;v;EAX*Vb2*! z5T^%QQi3F_dOrBk3+?CbBGt)9YQg67U)5JQ<6+y*Sr-hj4^Zpo-1{{VhGTLFt|qVKTbUV5NleU(r~28r&YRO$v1<`?{C&U0`puZHPcyjkZ*N!{g?cbl{S6S zWUw3)JnO6CLF{%SG=n&eoR1jsTz*Z4E*nNwH5cXjs=1`t-mSYaeY^bwxsM#)QSSVd zxSeQ_@zMu4n(8!P(+UI}+vz_LJ>kOcPTncQe8(z?|P} z$iTaTA7ln3ZAvh_alz?r9MAoQB*gp-mC6@U+1_W(@NREf&`5TfcB%<1A378%qRTj? z%eq+*ZWsD^Gx%Ya^GEo4V*J6;sTS8kF%VsX3pRRhenL_f55eGbpBV?O6JM?6dAvd> zjdB?lt!02u%RG3TKN3=t>5HFwo_W0!c;!n{QkTp@nIs5UDE6o7w*H8|>HeXYf{iWd zurFCp3;`Ai{QE#W_Nrp7|FjQaz{Rz4mt_iG_;`Ko5q^N=!$IMZ1Cb+TX4sP&&hX7@ zDl!_M9&AyxYzcY=`fwraC2X?6*~?J;RF7MiW7OPYR1A!oy@;OyLMg+7wsOWLg2EyH z-C+^6H{PwF*xMZiDAM|5VL7)~z{Z94!X3DKmM#@Y|I!|lCs?>M?kzq2hG}tcxV%c` zG%_nKhiKT;&Wlh#w)=}!S1#ot+4Z*H$pnr|Z!6;mZc4_I_8oI1fv>6DS0xrn%Y^hA z?dGi`QEdRoC&}8XZV=Id0qx1(Ir2^~p8pD?XV;{p##}UYlANQFI0lTp{iAf}47Ju+ z@v`vcf5<;C1$H#~Ieo0Bo^_A6yOrR5nJI`zIj&TRvE}Wfazr`~ju9K&H*mFBX91@d z^|)jsCXFSjl96v!VD^U8bR5xAMyTc3s>2AHIVfvb&dwaP88AvdGmIfSgt@77z4NPH zC(kpVX$OdZVaH}}NLfoM`$a>%l)o=gFf0r-&vaH-8lN9|qoFh$>x(DixiR8UcTW=) zWk|9DT#K41Xv8#A5n2)^3w#`3i$Aq(FzkYm(u{s zMW=RMjbTgGGO>@mB`Kbd}p*e^Itxv5b8R!I@y*CR;w7Z z{8_Mo&4-z(rR+Zrt0c4Qa4cDuhJx}3s545bO(bhQ4f5GG*tt3Cq7$8MXYek5U&&{fh&Is)`P+*fc!+jGMZGDcWX|!i!sNItjkzAd@ANfo9 z7UUM~-;#;tI%zJWY?7^MyWC}NCQ-p35oE;yK2Rj+3&L4+ts`oQ5@zyV6o=y%x}U zwngly?RyC2B^I{@mnMaCQ&^^za#!@a!fM}4a^mT$K*x77sV5~I!h&`bA0f6e6Q2pZ zM{CfT=GgZAEW@^^NL|0e#f`B4yj|jCF-JXjuI(04#I+|mg76O=B^TXR-jNd_?3DZZ zF5Byy2I`rbd6yR-;GMlm-_?T^mw4}jLGiaJ68}u%#kv-;)hpivqz7(}y2*S>y>B{G z_GVc#ywwrx;S!s_j)>4}?3eZntJ>LU;(f#8>P6e(L(AqF7oH|TFQAXQAQoFHK1^3r zp>mXW-v0O%87hea9n%A1Kk6^GUS*}>)R7L+Uao&1az&$6l9dz|68ICqs;HAcC>GNM z6!kdqHz{Kbb!t}aW}T@>R(EhHP|=W~{*7TaM~QGZky)gsUp2=UZXy(|!?o_SuC&rB ziT6*|KvPxg#=wW?E*jw9pm*ZRlg8bXQd)Q4zPw#%Z70-`qfS|YX8#Kj!n)#6&pUIw z^;O94XuVUV)ipLvubTe!wmx(g>X2fsdblaVzP%Of?O(OD~ef!2t3yiK6(Sz4(?zsK&@pp8|>q1q+_G`#r z?6c+_$PFDl{`n7YtMl?--lYGexZS(bzq#KV47_-trf>YI((UN~i^L5RcQ}kRa{pVE z|9{>q{LlX4(JHW0{kz+vyO&77Vx5X80zBPv04kF=)|$}#mORkE6t|tedQTq; z=6r-F+_O}7CkF!WYUTinCvfBgJzJ!=yHi6cX4eGKo6?m7Z3urk=$ru5?2M)g0BwI2)ba7p6kcmmnK8+ z7b3J8RD@RG)h+7;FW(YFPwcVk~{^5&hHjFSt86EJfdkjR= zU5I-xN{6uW`)gL@KO}bV`ugP6b(yg0s@)x-@q+Ipjr;w#C`Am5h919$yq4W2D%>{& zb*D6hn`VTN!BAEnBecPxU=L4L^S`fT@WA$ z?1R%jQZq<-3#VkdAQ`HIP?b+i-G`*HcdV+lP~rtGUEWY8rMNg^c)RI$a8e@{E=*>#%&CU9`Ci(6Kpc- z5zx`;kn?^g^cQ^f(qE9n92xk#JiV*})HkA^vgtCEK+3i`Xp9O`Zo$7+2Mg{~J9UV@ zsix;MzbAuzvNEIW0x7V-c0T6d-UKtk0Q6OFTN(KzJ5Z>Anqf`g!so& z+is{a^x9IPq;i7wSEV@(=akB{Ris7R+x*hQtp5+-oGLiV?ZSyN`6e^%GLkf0h(Bbbrh1Su>cjWYw2_ zA+uJdYlVL(%#Ygx(I7$h)OtHPPS~XVJkm3Nad+$+vR@h*=Jl!b#Y~V}!uc%7&HnC+ zV4~fh?iQ3j#ZADdH5y#M`QCud;M*SO-cdNa&YDW6Q-!Yn7k6(lQr=HsXE%n&xb^(Y z>5f9le*Wsw%lH#InE{5t&EZ&c^TTV7mO3uAES85$bZqj6|WaCEeh>P4YH zA97rc*y3uWz@Ft>jCa4OmhP=XV~QVUESF-)Uygk?RO9NQZ(5iRKwmHr^GE; zS=iDmt800Pn;Y+(QSa+9aIGtux(;@YItV@Z-fNaXPSDC!IYuMWv0g(l4EO1xZGxSu zq?_mJ?FT8ns=Sp(S6wA8ncS=K>$h9Zx|j2j@Y!Xtq)rkGJpWTLnwusCUk(jAj)2Jx zkkisB*qu$u|B2?o(Zsq9tzsB0VZ~s#phmQeOpzM(osNqZX-rS5U)eKZ&-xE6fSFBR z<0x_Dnoe0_ ztHuv;Y;tXq95MPEvv#7Oyz<5SC(rQSg#7`t4iO$L6N1)Yep{tekD$qXjh407Gu>)B z!19=wteT2)OZ{bZf~KVNtPkkI{dpr-h2Fxa@N87`qU$%+kfAjV+mhn{;DcS&lcD^noJ0!4Rj!>uCBZ z6(=7R@qUv%RaK2grNZe2U8*;2R>Rb~@>_lOL=_REPw*8bUwH0+C%dujbGmZ1M_Yr0 zPOVcUY*+`RlP`58DdS90@rw~^I5?Lo>SF4J<(ORvXzX9R--k}U^>)mTqBL_A<#L~N zFH}Y`gjJ@uAux+7_?ay4eL?J5BV=AbVD-D(v^K4zG~iLn2Mt{cf!uw`X z`L!EOex_6`s##D)K63gGc;0R#Ljki_QB85$3{?{)_k>mQS|DcSk&e&S?51c1)*NLt zv&DIM07c=G5zZ@lh2#?3Src;Y{^C>=xMd?0MNX$aNM^Zzy)mdBo%$eSCXP168*RnZ z@V@ata?V`5O$u@gAh^FGB2i7p{xK7tXhZdyn)M6QJ<%v0^F>1ro&`j41$jY&%f#(u z)DvoKvfvfT(6@e*XGk#BGv0Bv=XALDZtBYz<+>3k{!xuJi9owPiB8_Uyj3yw*q(v) zXtKc-gJeN90?js}++ya%J1fPlnnsbsBm>j4?}UTMI6`AEh+M8*ClszYC+`sT#5NS> z$1t*OFg?1BYDpT=Ani{kK1uCW^~(y0+y2rL+mm)XDN{&yT4u9{^IY|a1Xh6mu_?+; zH?tF0khQ9x0>bgN_FI%juLpkb%XXv!!~UamD_^ek6i8dmZP_W#{gAsh$N$YK;`(Hh z>oQ&UJ&pZ5ky9a={2lrRSIrTs;H9|;KXiGav=u&U^;-=q$u{Z1P2lfJZBwO)qmA`B zn`(15)8<&XI6<42Z&iqhWpcb!lvWlf6N^M#3j{rhtxckF90VQdM0Y`U%2e!;q z%(v3(lNgOT?@c>gs>8^snX%TyCMU^xtDLT}kM>^kc8?c}c8{$7Cak&_Eb(Ub_mT0tbNEmRI2%)8XdY?-2U---_eZ?$7Bpqm{AgJ=oi;y=M z4XaNBdYDeQfdb16Jc&@HbK)P-Ic^veYcqFBSXEBU^HRo1sB~BJ&v;U-Zf{b4dck^j zi)_}jn3AbrA?T1(sM$HkEM#v>uljQ-MR_)KlJ35fylL=3r0r8-zo&qTlCGZvowVJ_ zTavYXj0D+4EHi7fx9Jn3S2dI`sDB-&m4dD+WiW>=@9_FLx8X2x$phVkk?!TuD{RA` zme3-zUk$}mIG7S{Jeue4y|FcS&E>s{`jySwmy*6yF>4JbmEH@g(;kSIXDF%*7kNOD zx5L-CG5DjwpKmK8kk9-lohC*2Fo&B`lkx%9tZ;F!Oh;B3j)}OJFMYJ0zx;WlBVj{+ zc*#?FUaqrm)k9nJkXAIYy76%P;~>eWu-SYrGEm3Gic+oc_t~!48=&0&DrHo=w>zXB z6#pp2S>x92GlBe;R{qX)T7?Vx2@D)o^4j?h9aV+&G!*mZQPGPQ>;r{u+|St4HJkW) zat5)XM6X>5v~;M$;YT$1pG;6}7)M`?vfM`DG@M&CqFxw_DL z<*n(Y45Lj24w-uycSX{4tKvxMT_4!gQY`IhMRCKn{&t)q9qFu8d&aF$<8+`zY-m6C9K=S2QJm50dzwVE+B#Kc&ZzUXJs%r%UJZT4KXliHz_LtXRI zpsf4GCR6b?g;`moVA&wVCO1~D8QQe%g>h*%f%qgA{n?jILiSHmUsv${uz*rAO+8C@ zRLgN@-t@@c_sRac`A>WC8*3!45O|H zwl8CS-U(Fj@-|O2 z6Y?zpQ{DhzcKB(JRrz-*^YGeN%lu{{{S#i|0=#&UP0IYvNw$0Vx^S(E7xEd7RXb~j zbxDz!^bn)tMyNEkEF=0-kz0m{<|P(5;pu^s(E7iCGl=hpd*wRA0%lYXSbwLbi27j0uxeT;5f5PAoC94{rUH0HtWMX>lC#C zu{>cY9@sqgjbHlSWGZj^!*^sZQu^QrXG+&<2AA@LckK5&QtV2ka}&i(+g4m!!}Cqv z8Bv=Jyi#7$N3=2f$dKaHdKd})ums=)_)XWL>{AVUOYK>$zY+L@r7Eo2urs#twYwgU z(Uq_IMY%wylt0D{i)$;;En7D%m)oOUr}CAn+w3Gq8uYk1 zMt|_3c9LlwsMrP8XtA%9Br+giJ+Vo*2i#2$o8ay;Zl1ZIHkJ>q|6G6G9++|T42QW< zV{i@i8AP20ooeTF#X2# z;yhCYY^RDjnt))Yj!29SqPg%15uE(~2nW@G|0{~HENxglx&enZ_JesQ9U@)sf_M{> z9i!)3g;S9bwe;7VsYM+uOK{cSBVtFv`{3h&E82zWh+e;SNIpuCG}RWf^y2L|6lWmj z9Jk@^q4rY)8OOLy zg=9?}+jEgUO*2Iy2M8i_3{mMLM^7SJd*qy^#fo)31ki{AFKK3+8)7{{{5DF}s65)? z=SOLLHeJEi$oKHmVPyJ7eg`j+L~WJoD9LJeFXM?a8V{uAS6(b$xlQ^17UQHyDPvhW zd)W*QFDSclD(+O-?hX9-E-2zkfGQ=+gsrvn*Z~{`nrmzXh zxFvjYBmnFk9D3zv`FDXx&Hw=8E=c;#V-T<&nFA%QkZFo22EgE#Py&oU`}h{Z(Z8mi zD#Re?hYdN%fuY25@NL4}rHMa^4bE|6(>GUENqJzyD{6%!r#~mQz^Tvjo7?N7!!8M* z*C0I#9EE=sEtvLQd5h7T2HQy#MoBP3}#43>QmZWc=eh=?p^N6q!HQR$RDkDbk!cHlO8n7C-RUFKiAX@yu zDQ%WR{3eG_v@di)rN3wnwtYh59@E3z2WMC&w)+XgzipatAbV)$CHVk}MFiO2M*FD{ zjM^>D!MK@tW8}yfn7o5c*Q(}eheOQ}XYXRCvYXdbl;eoa9KfmNK<8(^=xFOg8`)F^Z6%)mA}NQ&&*nxYCu&gea<2IP=-oj~l> z@?R_B#}CA$_(n^!wsR9eswbDZf6oQ?!Tu9~*HPYS%JDCd(6Pll=+F}iA+D!Yz6$g@ zy3-so6+^j3vNy3|skZ)%?msWIqEjKE>PI-Vpjfd~X|;>O&7gnL)rxMG5Htvf#GLz; zLl!~AH$sj$6lE0+qwn{3t=QHcMYRRx20)Ef0CebW& zGC0(ImjzzqF%M7=m~UPrITv`4E;J(KK7T;#B`YQFeyazbkBG`Jn$gMA9ty4S#H>a@ zJd)rc*y8C18A~1Pj?dY*KV?RaD#?uIq{4n@tn<*6^OEh)?2NWKG0DD^w6~JxF;mSh@%Km55aGu!gl0Odj%2sX>sA z#gwl5{FreZ1ubf8aB3iX9xb0?H0-DS!K|u?@R37?N+-$L4^3<{dh-|=%1hjMZsUzK zK}GtaZ#%aO^d!%(4qLlLu00c!Q0DpmcwM^>Ev0E3?1W5F0qF{i+KS3-DL3v5*eD$! z7gq?;8v-=%n6c4n!l{P%JdbQw>+Tm8Hq5THNE#*OkdrE!E8)VTZg%a9r0S>Wj`zLrZwzzYujc z=mEjZ8$7d-5sic(qKcV9Q;Q&A>DG%D{U=f0&HANI#Plnm?YrXy2G(ISt3G0;M(wRB zw#bo`Lw{*SGpP{fi_~zOje_x(8o|qAK-6=Yw8!34Q%_W8Ehek6nxNb=(o8R_#?2|( z7jL+?*H3*yPkj}HQG(S>=g?1QB6w4{9*G2!lMUHU<-l=Rz2DT5&OZb#GONp~+Hen$ zSdnSqdYzK-+ch-Eoh?EnP5tC*zzBfiy;yXON8+iV+DV^C)&XLxmS+c@jZ{N{fZGiN(rP2~#rp3$DT zxAMJtL{ckGJwF)2PuC@@8~x6wHW+6$CbPkTZv)gK)3unmZ596Ls*hU_?PP`ubUHSE zeo4N^FiU!dsvPp}-^pD1IFXy~e=ovc_HsPc{EEhv?2F!UL3w#bca!V$=9Mf_enqdVN?ckKChTc* z&oz6_3kaW&xs{1^pn?|9-*R4X?4Oq0dM~@!&!n4a(xMUb!t|!W`ki_;vqvWYd2dHw z_0Di_KX*jKnkkgnc9_*}W*W38Ugg{algGJk3pjmS=TN$OGvl0$J1K*atKxL|g$sVa zdhVp&xl2GE)e04u;jSO~@?ChTBj0@`0S2hCd=b*;!*zT80n9*|D;b=Wxnt&5k24Cf za~|1Z`>yvQQJv4CU+GT%cZxs9mae?c`>#x!Z03spZhiDVImaUA_M~6N)YR zqqUV{Y31x5$;48{_Thxsb5(2G3^_^ zFeUlehgwS+`{{N2U!P{ojXQta3`^M*pGs*?aebds#(b6S3>mH|g~viII5ZS&KBqRbbLzg4C=Q`tkMrED2-d?z6_?9_y;HdlJiZ zTQS*BmZCws{bwT**vpFKaM3vKlzo1#8%c}z%KoCP0i?8b2?gCr1e`lTV&!{Eg(4?B zZkX>A=WCOQxBH#G@@qJrYz^z_FQnx91t;bnb;-+9F+ZQXd36d^TpURFeJ7loq7ec% zojS0uEUGyrBO`;oL#ZE{yMLI@{d(*rO8w$oS3=kGFB78`T>_wLyDooPaAh{m- zyC<-152w_QkTdb)8TMPR?91XbE#}k};xk?_xy$9VA9L*4e%Mgx(u(xlJq2|Kj^3{w zUqxj2QBzP*%mz|qF2?_2E^mX;3) z^5dDAQ%}w@&E8Y0U)*ifdk(#*N5v0&}i@Dy3BQ@SNg4I-c)|nWZOM>C4Z4Cw1DBD8W092*2($%R@M}ab9qSXq$hH~+je%5do zqY>m;`1$Y={`NM{S_DrCe|@kFL}Sb5+Ez*9sXp|fwQIa4XW9LT^IvjjA-i$;`vTLoboPepaX}u; z4DP$KIp-)UAmOfBMSA#}<0X`E1hVri4FdP-k5D%a=_RZPz09`96B{^xSv=D)k-!qB zd{mc38A59)OmKA$>D~80;H%AbQ-0~!TfR?rFaFqCqB?d5dB!ZgBK;1rNJ5m^$wW!! z>fC$X7(2X8V%q<(8mR6p{ZTSaaQ*Q@{<_79hYK>zDo3Tme*I_C;Q6Jl;IFk%Dekto zwn_?gm`1nqU({P&GYWMpU!islT>Z2Et51Exg4vw^vSQT3)uck{Zzhb0LrAGt4Nijb^)|W^?dIHe5rCo znNL1kvE$2#X!&T=fX*qocF}Ov6Z7UWR>4}~Mp5sp&adETLwmPweQ--??G{C|80dQ^ zJ{wQE#FjoVQ*H_0eqEj1ENhrhIU0n!C6ncPo$imft8fmxWGGSI29=!|^)7f-<8?y2 z1>pwsek$9M*ft&gpyItOd1w{?ZmL3~1wG|dj;KFYywJ8u>*nP=ej~M#TOcwq2r*0; z(KT39XTjdts0uo#&3B3?*!L~eJzOJha66%F`}CLo66IOi!bM+5{6*H}8}Rr$uZ5mx znz?}|NGvR9Z({$w8p)=Ttmt{cI-s`07L{E_lt#;kUXM9TRQ1D!%haHAj%o%3V!MPh ze7yj#YW=-~1Usm-(fwDDZz6~dBhZ4Z2_M#6xcM-ka zgG&q<50m*RIGZX@?;;aM)n;hAdn-GiIrL7yqYdoEqSWZ$SB_W1@HXaYWSToNy<2lT z*^gGTW(=U1WuZI4>%n|BxZX^OOsTBeOO1HN_IY@!4dH3JT6P64+PznmGWO<>8gm?> z3pc2|cAog=*3`|bm!it@Q>`io5_bCXl5H}_iICZHO16A7M=Nq=Up!SGR`~Z2+72aF zgn0~PuZV|1hK^I^gCuU1-779txu8J(22xa;72{s2Ew%ou)sA8RzSCe#%F3ti_fJJS zR(pan9x{=)rRd)f{k;{|!p6@fGDWbkQ;Sr?>AV$m(&%I&H+b6foOK%1|8~4DO)}Tb zjd`_chIDQl2`oT)FRvfJ2JCt@QV}H6q;cAC&LrD6k?fbyE6elXulHQz zdTl#(BRFl_iI5m5Rx+tR^jrFn3cc6&h&yq}O=U@#z1MhoSJG#bD1Es5$5EQ&Kj+ry z64>;*ZcH5>Igfr!bEd~M?4fSvxHg+{SEb=KqK%$R!siw0h+hi(lX4<4*L&rYEWAL$ z|7tMe!&Hsg7!~W<0IA>k4x!S+dKJ) ztcC%9*3V>-qQ`t6FVf3NHCo-RuK~GEicum zz;!aMf21~amKL6QhA%MAWF)TNq9c%)a>__XxSSvLmX$5&Jt#yp`?Ee2^+kv`ote3J z4_N{-3Af-XC#(UxZG^%zlXd+}6koY^cd|6?^+_$+D2a_>=cy!X-6^U@^xNfzlPgOg zcN+Ne4y1AA1@^{JqM{(iA`$P0G~Kyu2m#s^W@cu9n8I);uy^>gRpDy<_3g>hb31~= zrg$6D1C(C*)mCA+-?cmONjV{vYhsJ#S}!`8qH~nMp48)0kzG366>^#0AMejOR(}g} zc`Mp06K11IyaF97ndqSv>57vIORQWs?56E#=&#Vavb6BoP}ZTWQ_!Wsc1(S!evlw- zYRuECswmc}Zp_8ZOq8aeh~d6jko$TjBg}5FuVN4#$tY3#^y(=1hd7Vg<~C24;m%k* zQDpTiqf${q`op)@v;-UTy>d-pl<;o)HOPmH?)C(ex~jaea}*Sv&w_&$5?KcNKmzo_ z`EB1IQ97Jj&J_fcX0Q!M8A-3<&JeVsTOlpD6}BGJ(Eb*&kmtSX*@Cft49#eCG6-3j zeCslUDuaA@75#{$&+bD;7PrMID0*Pa40iLfq4aN}kUuxrmrax=)}0Ia`AimfW=2hE z@-&vvD+X7;`Q*cd$i}xwv7g7l3tJ&vx42?Z-wa0JB%)yIh@=G$~C#vu{r zJOKpx+9$>?&F8s@qvBvJZ3Y7M2y)wCnp1Rwg>&m~FioHNmM*3@=3kPLLE=DWP5kSh zwJ+>?w|vFHLQ&R2dzLAdh_%;q~*@j4BHpB$j-kMInmt;F8>OjD`iCC2i4m#G_c zBh~463&0~+g4IXE!NaB~-Xz(V&|H?Ycn3tA{cz|e9)rKMX4(#E*=r;+d<-V5m7aef z&JKHN-N`g`CJJf;=9U53)8>-$-`y&i%}EY|8rr&Mdt~Mu422P58)WvqDWpgcpH-OZ z+;BXwBi*G1!>c(wh+BqCG-}5M0NvY*21Wg^nPUcPVYqcAT1~x?op&cSqJIIpY{dV% z&1gNo25{74s7(@ZD5*zjyxB}JxSRhwC95ONW7O6RqR+7Oka{tSF8!UB_i2BWqrmQG zeaj2bN&~N-5TJ&3Bb^VjtE5Gj03xT?HSt@gF_M_e%WMFDWaH}7aMrmDJ2#TQNZSFq zw7K_psP8>(X%X73~obru%;g&DOD|KL7&Ad{|t<1H4RNVOiY*e=@Dn( z|A$zb#?hGWLGbQKC7o}L!u%?|AakM56>d{!1}wsa0ePGFtG4I2mfH%P&o9I`;qpz> zTSDZ&6?Lpkcq-^$W+&(u*nK52G2q?6*6<0u7V(_@nA*fYDPX-FQV~hGLTY{RH`#Y@ zJMuB4A+^n*X4Z7=d~w)L;EGy@p>zEamsHy%xldm|7s8HYHtx3>k)FENJb^zYn&*5$ z(^AMMTx6*b%TNZRAd$wh5jBC=>kN>hYF&9=e2OLPRVtsAk~qq0Bb&rmRD&Z5;1^n< z4Fuf=D6^@?6$fuRn)2ZZUEXrnLdtDbaP}nAvY|-WePB`+kcHWhvqiQI!%KLjV4IPZ z?+ES8R=hH}`0v*s;bxX%Eb(sn3RF&3jD1+Sd7+zHk z0(9!gT%~8Tj8zp33DAnFZlSerx}v(_hpyIYT7cIY2{X$7tb~PWn!r(+ZNyQrVBGkwv8NbndT$rKRG`N@SfW`xN30T?-$BX$VyKt-#}t{zLES<5 z7aJa%kzOVqQ!Y}VuuTFPAUP!CzJ|p%7~)Uol&2b2M)YgvZyWN`nxp1ve!O{DP(`kC zbZNTU^w3(WvAyiQ{G&gXpfv-p+ylS~er^$tF}7Yd*=&*QnXzOX4LS@ z`pkY&-8UJ`{Oh)f)!!yUT;Ar5n}*=+G>D5sKh^uHB@1%N9UVaoYiTzh zPJAW_DoA|>A^G>;JlAEmOEq4+(JW%#Ssu2Ck|iTXUJiQXKAD{0ti_Z)&fPT;D}euJ zM%Ur=W7*orWvosEDncdE9-dM z7?z(Azc390ZO$1A#g|Bt>Pp!UtwUvCb#|+8u|q1LN0wSg^0HiPF#TF%9T1D>v85f{ zulohWAapViKTR`enMcry^vkMI5?lWE(3iD*r-+h0`_U_GSUy?`9qwaN|*y>ER@vn|5Sc^@{&L%dxaZJ=)(V+(E8Zm zl?EI0T}5m*hs_vzl^}A&OWd+8y5XGehU0uuRiuV=u?E^V)cjsVZ>oSjn|)F}?&W{x z_PL<1(Kk=A7m_ophEK6(dG_84Y&(vZ&p3%@Dhpy4xcJR$^j9D6*~a%@sTv<8F^|T+ zENT}F{BUCJRtvNlkPMgcH&r?O_;3H7XLSnb@{v<=7n40gY)l*W#=yF%=fT+|mZx$} z99(b=?8r>q&<>iRY>m%T;yWs%t|w$0)PKSJjj$lS3A5|ET|L47LAN5gQ2__b)1>_c ztICHpmg6FVG&g%qFY>_R( zH0gXhnz*DvLu{w-%Q75~?Dvq}mA$wz@b;h)RblLYb$UTc$T3(~Ggh%^9^#(wr2u>x zTG5`BWYKu*o9YCxV`oJs1d`ai+PvyMbtTGK1$0~R9?!*l2K)?!KimDQ9csK0`4#4W zb^i4xPcZn{-$wi)$9S(;pE%UTOV*j;&g*Yhin2R?E0TI%|a?wk|Y>#RSeJ$C=q8K$8(Wq9I*G@o_n2NLU zo7UT4d2)Y7btelAc{Rq`ZS=a*T3;m0O4Bj~gGJsFPAG$atrgv-)Txa9!yV-dy2=T`j9F{9`&Ax_{UP1=fbggF zZ;S@5T`>(O-}Mi<1M!1WWJTMj-<_EXPd+ylxpzgfxMtzyyFX>5CuUvpv5jx!O?ItE z#wRxV{3+L$4HGEwi-jXIc@3VTE*_u4f+T2`^o0(+!Qs5%&>8i8)7+`h!l%L|L&1n5h7D~1?U8Zea&I(5nID-SH89xDdD^)TOdJipz@gtR^x6ph^>d6x!{^&$ z$6ZbQ#df`RGR^irS~n~xrr%CTTI(Jc-<)QMYWXo$x1~$i871&oljM1uqx{&~GcnqB zJuIywd5jtYQDG3e{_*5UKc%j9jgMM^>@q`2;i*y@!e+dSz*6I9E3u=w=Uj+*tD$Bm zPsy7XvuD=C$v?EAzAyDR6#!Y2IG-`};g*8&vlj$uyCRXq@SCr*Fq0>nj!&!og%2)# z^HpptN-HLbIU*8w*3Fbvhkg8Ev^THj9FJxHv6#93{>p$YUXsu63Y$awKmEMorzG~} ze7W{_)2k%TPLW^0;5xVRzwL2kw};IqkGs`Y4%+j;j4xQ9D0*Ydq}k0cmi3U@y$omA zNq*mMmHkp%&SaTnPT>dcZdG4m&5A)<(dkzHoS$Fg7Vf-TZ=8Q4X#MMn*~U;GKVGTgdGO)ht)>sH15cSU&~75x#c}z% zo+*B*GwTpz)7uYurS7NGd=|Z(F{hC8@V9l2MaGU(rs;_m^33Kq-ob83nH{!e ztQXf#F|}(KzAlFndxBwAeHeG--hh@Cc^CG6g2J_D^B1TE-1%iFW_(*upQf}DDqHmG zj=U;}cW?4(ml2HDRB{(ba**q#4k>z6sAqxKVeM-vWCP|xUd?iUbp;d-rWKv&E zwYT(3B(H6-T;SmgJW+;AGz#9@%X%{uF^*Y-#!F`Cl&P`ire2rS&B+LpM1K5dFXj8_ znU8Y0mA|UT#5D>g2-2dmPoFx&f!VsIO5Jeoh>W4akfE#UoA}hD%vYEj!9?WV%MIn|x;By5RUR{KIKL|G&9tGl1MpxcY;d+toS* zC~EzBqVFfqIJ?EQV(5wcvW(Nh5j>~Kb7mbP0YPo|Ees#;6=r<*x`jV2nO8tJ*&;49 z`(adhiUWh4N>L54@SshSo+4(C@r)DLlB8RFvQ+u3$h#@yE%oUn)d$gM6(^Q_{Vq<0 zuIJigVq1oJ#l}e8N0WQ+XicPUc&qCoZ7@^F2-g)Qmj|r+WY!Rc%lFd)M_mA(F#g5R zk3Ksx!F*{nIn{=4BE6gC@>Q_(8g7?uHeywogsk;*|HgFqUS0|Yx`Yw19=@|EVL)$0 z6EqEW^_A`~grQ2o#4v`$q#5v67T+>=1Gb#${pgrKHlVAe7bE~=8lhZ;N4K0 zx;F3-%gqu`T%l(RdgU#FRVWWH*U9jeCAaKN$?w0A(GY_o&}J)m#U`j;;^OmITw!dfma!IL%Nk!5N^&OF?|-SG11aX4lhJ9(l78MlT1EXR zbXu`^8TT5Vt$IZ%rP-f4F*dACeBe=hW5Kl9S19{+=-$#%^Dg=H$2FN_5{ z{WJ)9lXy6)w8B?812g&NmXrd|B=mcU4MlY`@mH#VBED^!gx6q z>>p1&WjAb@aV2}Eup7t~cE!`&9jMHa3&eiEgc@N?(6IBlUenq8Rah2G?pNiEZc$`vFgj46#q z_+_~(9E0gX_+ajL3)Dk)1^XSu`u?pD?;E07;0ZlF|0_Wo3qA2BZEz*@3&g+vy8T8` zMq2xL@U0giikImk&$5foSxRWZDqsG!`Aiz5T{`!} zw!VFT68c(eT;TYQ7xh4r;(<~EXp0s(wN|ko@#q3(ekPpug zm=Jh{6Ygb(SOF?DAgn6CvDu2^E6_@=*Sp7ipyrEjfIPG!e?PvA)^lsrl#?B zj&>m*hRTXQY1zsb)#qr=jYI8)tMu>7LSrF^>mZr9kX{=ce-UNTc6kV_>pbpk{?C z``$Vmt1g+Z;ykMGc#s#b+z#Q8wgEv}Gjk^6c2;4&GVTn^?eby(;a-|Emn~(!eKK{H z-_4YfQ}gG}`aJbgF(q#@j~PN2%#^R! zCWVz4ht6c=K~;GCpF!B=NBhvdbuUS!1is$L)mZ+^J+n~==cLWbh^?}hTze#XKI2$_ zaesUJN4SbhtAR?*gYAh;rp_Nl2`Z`3IW>MQAEV8n|Jh7!PGRQ{2rP6qUh8&dXex0P z5OO&>orXZg(sy{y6=IstS29JKfHDJ`OU|&rasdqe1cnr+-+JStK+?0=uVkR3#3gA( zSLP`$`WDe)wr^X8N+3rs`#^{c{%_H#nA-S=0s(uJZLKqSVg>;8gOJFU~qPA9FP_4BvXwO z-U#h9dO$l7LXTUttnq&{A3YpyF^JaOPf4YFkzgYWAlavDnw?Cx1xFd&ZaKuJeX;%r z%7G}iiD$K;#(+R&pHNKvVRr4*EZC-Ou#$N%D!> zuJa7=pG(8hw(*>%na#;crBbyiI>-{?ANS+g-n9Tuzr;xx*~8BI@}05bc?s~gZdAOS zdM>>i2qXr!m|vax^OhNN0DNBUl9K!NG$f_$Sf)z( z+_~E7L*S6wAfjUc=bAB1Cji@AIZ3_e`JGT+q?AYEjBt9Ho#5E1M8sHmU)gh0&JOBX zrz)L`b<@sCYa@Qp$3=$}^2S2T5!Z##>6+XBVCw7xKV*}aZ=Mp#DoNuWK=&?WE4Ury z;=>33%#zvj3{YAkB}=0j*rKL~pCB3bXRxZ^)vp0?^0BJm2rIz*Y}`9wK+^owuLoxvLPr-9& zuAGffP~60R;n_F;8n6R)=wRsnKl}=tcQE-7Ug=;_9577(`6^${9${JGlV$(xU+mWZ zKK=E-$Dmn;OaPB`TA8at8?pVFnD~)kz-{QWSm9V3flx_z<*AmuCWWgK5N9O+(`;%f zGxfm3!EGws=EuWGT0yW5Y&dxqe;4he)bLQ`vof_J9WD^v7;Ni=FeQZoMwW z>;fL%_{M7u6mD(k1PN=`=`M08i!h|&vurcpCjkNAi%??9@(D5VcTxSs=75WcGq zz^=r1^2eNo7qnsn+vvs<^;^Z1d*&kskIPPnPj4N#E;1@-I1=6=tq11(=-(|&$Su{| z7=!=b%Ioe`!wZ1mS`R}X=aW%VOIGQOUXw8e(|S@ZLa%_V3WBa>+6+sMl_P9vOZssm z<8srEuqZ=Yu)JW`Tm24POn|I`#?C|~PK22g4=nWB0SG#adg&K!*c#}zkvZGW&q zaf$YVbh35kh(-b*ZW#vb6av^IOrW{;<9?ArFJv(fO_P!+!D_M2`TgHVo9ZQ&eyo^1 zVbGmh7mrA={uusuLl(FPu^+B^~Z5a|Ox!P|O$2#b#xb8R?&`7u!L z9BI_do*=5b|G8Bkw+!2Q#AwD1NmmRm4tRtep?m-ybZi6+`a{oyVHi$>2( zS-Xp<2gh_EE$V-A%qbz&W0c*{W5h}aw~S!n`awgy6uweC9Q-u3fT$NF)JI#X-oi`_ zI)G#cOOUXh6=4q4Ogn z{HHkXIx)%^DgTj_Pt|3?3g7))9eU9`Sy3jB#?-=rhLh5kb@ZWLdoG2bcb(1h7n^Nn ztg!Rf_w5rK!%KXhn9T8JB-am@65}Al=8A6{K`86-L;?KBF_VqY=2XE~R)x}8PO?#! zJ+=F_r+V;gHNH1lC86h48m4eF4Lp>CK=@E2`#9VNhrzaqO!|~SsaH$hSMUj(Sd$qK zyIT-_NZ;*q$4{rEwGEg{au!M_JZo{=+$HIT^D-47ccz`LfN}w(4Wcy|#Io3cP+w?k z(}I@#^Q%v1-P9}l;WAj*GO*AQm{5gTa=mUWJu}E$zs85pGGiOHc-P^8k5ip%SmiIk zr0|&CP?2wbaHjsdljhzkE_y~g0rr9l^F6J{SDhZ^VJ$Jtw<^NvYzsiUyEacsFJsQU zJ%}FkInDki*|AbD%#SU*DjcKYOrL)`OO0C7(iyr7>2#P$iu_!g?tW>DnqPDpSp(DF zZo*#sX86+O>9iT9agmHfPGo9rWwIYgGCED?Nv2BdsnB9R{|^gM+V2ZE-%@IQ;o<6h zW9;Dvo2A(My9aX(i9ZHCe$+si2$VTlAI-poCboM>E# z(tDs7=w4sdd=gIpZZ})ExM$w0opZbmUD@iNID(3iO=vZ=>^{DB69N(TLvaF0ZmgGX z5QOlyV#kR=CG_jz{8D8yB>Uy8WwW4)-Z)K_T%~&t*17$7XE1{nB1LJ_@ zVLQ}f%}Hxo)e46ViibjE>EaDpSmzjWoLy2qXdGJpmiTfhU%ttcuR52EJw~z1fDi9h zWGRwhW)e(qWiQ8joTdzzW)|W_#%X&6Jt1;Oxk!3UCr791j8c-o-R+6g%lqC*?v;s{ z!6h%!K*#h`m5qJAc}6qw-X=VxshU6fU(l%*z<&xpa8wIsEcYlk3o;lx3ii@#0n@ny-&8jUaqg?s^}dJeQ}k3;F{5gYoCHiz-G z5Fg896$@-7izxcS%&ZK2uLZk3^(KfWQZX!vZx3}8mK9NeE*cq=bKf!%nyAdL1mL&a`B`qg~!sEL?I|ic$E?tB@G7AQ=3&JFJ(6I@g@|D zvC|w45?c*EK1YdKL~~ZVb_RUTpGZ-7)FyBDRD=IP#y8acFS8A;_e14QLIJSKLQ|_L zuhbc(XuE{Lv-1NPPtF}Qj^&kM@@hE#SpcsXsmN~P^^~3Dtr50JNx-*GrdfG{l&0|mem2c61qo&=SyrEK=ZskUv8mvQ z{^}LVUE{M?Zp@LAT>xGw`hF_dGXFNTw|l5RPfcM<-p{ofpjSJg{O2n~Ml%m7C|p!N znUh9FU2L8}m#*iB$=o8+%cmOZhc)cw5+&IZ+5QwjIqIvQm)y^02}n^o#}+qRejwZg zRaiN-%<-fs_0bDT)Q{UNz%+|eu(joik7DN?*#*-0kvHp^~)SElnKQi%x% zx^8I;mf94)qb#XT+fom@szz|i1ZlpwI|;@|ETef$GTl>Qb96Xr6CZ)eBGXgKRJ>ZS zc=lS#uI!CO+1}8#`#xdMxTJz&xV>m(;l>rFA8Y>2cVmVvHL$przo3ICO*?G$yel@y z5*B@ZGYO9AJG=p;+cH`Fp!W4B{WHNfo_~6d* z$&a_gGYfm^LuA*kA=*>yuv!+eem9DH`?oj9k)V5iisRWKoGdo@@zH$o{Tb@HL*x1gYF`I#Yp z`-ODOKeGH-o+%ziQ8$}`HJW#T$4P^RkXV1|NUcwHIXScN>=LA|ADlwtV33)xbxjbR zG1}h<{_81oJL?+FO=3qhW9Y@K4x2KV!7-7oh#0+tERX$yfSq4W{AaKNPeaYL;twy;_7z5AOA0_Uyb{`QBfZ<( zKyhVKApMOkDtkbYW*|@`!-ZA&Qlq7eL=RbHNzzPQGmsHQOYR6;WdvL zy2h*-b@JMqlDmCpr(P@HdQEcma(!yr>*^nS2e&%;LFZ*1L>qcJg#!z~fF2i4^Q55$$C=+a6g10m*9La3v4IWTB3OG z$wrT*saS6Kk?NH%|3LOn4^4k014Hl-tbOnUUcX30$BDht%YH3|U)W9=l70idm+(ER zX7tmTTPPKb6$SsTi7A~lmMC$)w`l@+x0_SET0floI65F2U=#$cVabrOPlcx{j7;fd zB(micVB)yR@Tpmqmas|1ukS%b$!J5te&kDNpRYRrN!F?Ex?q-*8``@~Q2W&1cNyE} zCW>gLhau*+D_#R}RIwPr#u7E6R#dJ-L7^vZF$!f=2g>PDik$N2l!96#mYH^)#Ckwg zE+cBOSMx4ZIq%FQ`cZ7y;8{-BAx}hh#a1SOi>|p1N86uaRmwF8SCu6X^u!*IZ0!`j zEkKj91DU3=egE|-kSp4op=KYasGkSrv_&ISqG3#wam!$D8XTZb^!{5%Da;EkpPo8SoCeGPn?+d^90yXBQ_vR?IYM6{a+O1_CswyWmt*%z zQuEG8)ner*Zn-1fkoGb0@EEZmmE#x!HEqcVE;$e?+*_^WAs9*o zqYslpDc1H@i>a%HP|_88^Vc$XnR4^LL3C&Ub`&pIWVZfGp*+if#xc`_2b%llC0{|6 zCSZK0Q}2K0>)*MwisM;n=Xlv9$4ihRv3$At62!Mus*a5QTi;6HxmtqwWzbK^>2%it z0yV#zv>Dy4!Es(NNh9Nl6=T>xg6XV27eG^VR7J;oo-0Pgc7+`v90wTFzf{uydoa<# z75*)>{vR#@)KM!qY$7lhf^fP2{a-j5cIIycgZ;li!2V~b*#Fz_g~?0p(NFpA$`aQ5 zuC1)3oWA_TE9xEn)LX$yyBd*9sS|5yThrSCd+XKzxh)36HAX+)-7lN%JoD2@Jqv%n z?5u`P)&0^noa%m^Ug+)LwG%7u@y}ymhsQ)gp4u1y8f{`Npk?A83T}ZG&Ebd7(=-F; zdaiHX^Gl~)CHKT>>$Y#EA9o$!GyOKcDRF*kZ?i72#d)iZXK7oAdhgFdz)h%a;+Xda zEtkaG0v&3QfhqKXEi`(Jd{T*^jG@#LbDPGadv-D7FfGk}N{alVGd z+%)|Yesk2kwawCL0cLUVHG&n~TjT$RJjg&-(51MuzSZ9^AX1l^neISv|s zhN@%zePTrG-A;N9 z-TA#Y>)%Sgex_?IGzkdH&+I`W0z-zB zsMCz}zkw}5Aj6VQ!B5)$H=!XO`@r7BFs!{N5XJHBbqJStB-MlJR$>>_%R1grVlfe5 zNat9tfo!~g8uEzL8iUnlbLOMdTixabGrRI8hBm+10$zP&m6W*meA{PxF|cF*nz^ub z@3g>BzP7v&-qFlh^buxKss};HZW8ND=bPe?5)GGO+}7*v^C$QJOmB~9QJpfM8sB%j z_ih`x>zvdQaTqQ^@H81bV%0Bqvu%0`$NUl@Q(X-7ZpLQVAc+4RKu#MW^q{+7ZL$wi zn+Bxrap)letJ;`?kK@>XN!{rwH!cGov+`Y-oL;!Z991(?yV64U1jwS-Q=-UaYi$)H zNKBvd<11^k@_K5fJS744?crJT?%C8pVEM(YFz(tbd-9C|p8guzSe$cxU{&Bd)EMPd zr1$;jvpc_EZ|#~Sj$!7HY28fH`~3I56^{QAO@sHmwi0&u4FP$|&|~mD5JhT-I4k-! zb@mlY(~2rbuhQRZyJ!Z@`(Eu8L9SsIAut$>`tjj%IvUDG3TKlt}KETKBL^7YN;#7HO}z7H>0xU$X>vN9W;4x^eZpe{G3nK$$^h zCK7*br3*@Z-d&`YjTgjA{V6TsUVccyOU|Eze=F$m{BKZ9sGQHn@yMaaldE|`J?93@ z2CMo6@CC|((HBpY3X_=Dtt~xnEhVHS^IFJ-x1%w9S$tbv@^fm!-yYLQt3-k859UBH zZdC~~Yv*r))Vk!~L$W(DbcLnW6%I|biSLT67P(~_^bn%LIfJzUm!@o#=v*Gnhsg>{lvd~r;6JzT?<45! z9rfW+evQ3%Y)~_{1p}5qSPDpTO?@jblUUZ_oKh3>btxExm0Q>NW1$LPYxikh4#{+m zQFL?t6)&?wtxbyPqhBAb_g_0FoxZ$39(UI7Wq7JAoh)7aTp_t76t849o1;QLx-k5K z@>-p43q~GU+hrtesu~{B51L%-mWrA;g57swpK?T6yi=oh0{rO33d?(yxaP)r*gt%X zE^gn)A})EKb6NM+nib4{7enoU4Rh#Tl-(fOd~aB=73;SL93Oc9WCvm<*J31-yXv82 zlSWFYg%`>uxF($J$mSO(5H2BNBcmVvG)L($;h2F(`o3zs$k42hjP<~7%@}Mpy9^q@ z<9$-zoo-1L^{=*Nnn;upus}_}-Fw&nv774Djl7erMs6F_1FBRuR5vq|w1t3af{HoV zV{9rxn&ZOSTs(r}1IKgF)Yxzj8v88Lj7&K7%B|s|`MZ7*w6EKBt$kt<;K2|rqwPY@ zNpA#>zS{LB7Gavs6#=in`z4ycr_zQAkC|KoTL@FH5YsMUAW(I+G>Im`D{1LH4TG=Q1*5Y*gd5VFQ z2^3iDB-CrG1FtbXP?!ss^@aSHBR>P7jKZgI``4Ne#NIM;^RnH+PhA#-r|Bma=ASTn z+o(8kS)jJV`~9ZonfJNi4I!02IOpROYYxkqsSFRU45)N|H5ob`;d*k*cao^%wr$w#`tC%)^|QL;QFuqlUcE2likT`jO@#38EH>^dlR(DZzsr!e+2( zs`D#Cc_uy|yJm7PhGcp+h=}A6UB_FAY?9kKf+;?cM_U7fFXo8u9Hb5+a=ww5T+(1$Z$}U8)t}Tzn6Y7Yw&;4GaPoh54;|6Rdp_Z<|VjgzFupC||=io6eb}}Co zd5?eSbI#e=F3@U#jD_1AH62OMAOL#iS6(U$w4xKO0qCzwMaH?B1s1_>DjCKy-3T{y zXJ5fGEUph0W2;3LWCid?t!slduMT7szd#f&?vOgnRcEwB#=Uow(2`PE%xINk&+dOJ z8Y!{TM9C3gkBYyVf1Hv{yF70`@drY#`_z9%2SWU}M~Tk>NaUA;>PS&fwTeS_%!h5k?YrSPSf z*)NJ~3raZysJZ$eS9XRx)b3y~IG1Kb-!#5AO$`hP^mVP`3DM@Uk$bia*!Z*ELi zB`uSyLlmOsoq%$idm#e&Z9hlyL?aJ9aSuRKjsxxGR80=Bur=g8X0I13Pa;t2JMU9S z76RKAV}LUPn=<#tbTW~BKscUe(|zE=9A0taq93|oprJE~In8(VL-kLnuB#ZCW+RTg zzQ5EkM3so~oy|^cfd2G}d29QSiah}*xrz{s_;iYE184vZe|vJW<9HbGT{b9n2*L_1 zcAZkm{4WgaZs1}Lz>2I?1SM$%Ux*PqZ1sSyL13(!Xuk6{Xc~p&PJ9|YD0X*|I^gU5 zV7cy4C1W5x6l+8rbPiB7q&|?p4@qiD(d@4fj0~#o$-n!T(QA;JU?10uf7HI3^?DCr z#ds@)Dny#mh}7g}rvF>gaAI>7vc{14Z?4$))7AIJg4_3idC%VD@RLLfwnVrCwjRl~ zA#ge-8vs*D2N*!!QRQ>Dv&XY0nE$*wn zSRqQJ)=Kw|Ss)L*#AfeP#ekd8*mggv!5IPLZ2v=~s}Wke>{3u2$X0wBP1j*y!tj-a z7i|a8d^}dy+f46wrHHs!jp*W{-844vGdI3N!=nREzIyVhvc67Oe;c|OuC+3Zkhb4o z+K26UK*j&<1d;WAEei=2yb-z)3W@0xjJ;>8U%oe`ZG50;&XXp<{Qi{%-BEhy>-?AK z)fq2%44b*Dc7dLOff1|vzr6glEj*2wk$A#N%>0&D_40aul!Y^( z=JJi|qb3`#k@oS z+t>{z597A~2XAi~R#n)B3u4g?N_Qi*=|&o)LApV@TUw+$r9)DX?gr`Fba!_No6cEV zzwewgbLRY+AH#Kdt>xM)-hS$S?)M51r1}w;UyjgLFSUS-H?!Z!IqLe}9K?LGbVCNR zLI4lemq+NJtt5{3W_%SCN&B=R2uJsx)YID$tU;~KH+Z(43=j_hKHG&@p{E;))CM3M zv(L{r5g=-ybD3&8djRZx;#^(PAmq?j+vIE-<%UCmI8rl##j~#}rG!08#y`NoliD%- zA^j=*g)N2gLJ8gy05B=eq`+^2nnT2sAA+Ui{{jzYhE1YvN~ea{zxqId3!@kucq|4V zbmK**n33pwfZeJbsZ!NV+i$$Y+|O72weANU3U1}vcEV3TU2)e^%hjwn6i7Ii*3N|W z(jxVdl7w1bac@TprvNQsAjmpW+4CVkjX@I#HnJJKu9gTrOt8TimxYEI&Kj*hw-YBr zCgu4`bw^$($)rkALCwU&uYSU6XL%K-Y7H2^^{-#LeQN&jt1 zK1U{R3!{j^xB{AhfV*wj4)PN(N)e~t1y+c14`Sor5cYn$W__==qu;ILZJ36i367lJ z$?mcaF{l*PTSelPxTW_+5~zc~xTTai>0Ya02M>R{pB91_j|bLA+vm-8kY7Pgd_+#} zfTG?G@Hf4e&okybNkT>i!E-E?Qytzf}fOHVW8L(ier3A6w ze?RCR1n`b1_elyQ+d(jk@*G>6G3BEf2cLO>|!=- zFh2_Hy7(VB#TlS-VRF!H*9weu0A$kdqoE!M-0e~QaNLiHWcmN1|5eG-E-q6X(@g{l zk7%aZA%H$YgSvvd*8woY9=cvq4%>t?)|soY!HbdM7S8_qzEQ2TnNS|AqXQVW#7Y7y z3VC#RA<*o9I<{m|eDP&c72TL$8VQbRvhr;&BrVJQg@JAp&njPOQzlTy<}kLzh_L2m z25=ZET9o6*RS7)u;)_gwJ4upgvPorFX9n6y;axzS8!Y+wZkA^aU$*vFp3ODj)$d_l z+GAm*{fnn^rJSCQ?UcS#17cUKbH-yy!L%fFLBO_To?a1+20w)uVPQ)EuHQJk0oXi$2unX_#BJ2J}iw8+6Q{Vq1X)?eQqIgM zGocAalp(m=Dpo0LnY5($Q6NepG?nn8AFoUqnuJ*}%VU=CaJmBDWuMtvpFv4sSyTw@^2^5J(GO8-5aa`k8^za`8p+}l zta#3ox(TQOx75s$O`%5eL&?H9+Q>r>D%jPciLO=?&%O8Nt zI4p~?QGxc6au1$Ri7y($sSXyrI@WCI=UGw8u^mO5dhZNA-PSn%Ro`SpX6cw*nWCp8dFo}3_~lc;H&b3N%=H5i@hA+ zJ~dj$Lh^Yu3;5!0Orc={k0bKx-Hhmgt{KQbXW)$61+_PdNPDi3Y6xHuz^3r1Z9=Gj zQM2cxZ(t(AKk-U)nn1{N5b|LOc?jp;b-J(jO05%0CnfDu7OEj$PEuD2k zrJr>6J)6nfyl^%WTB3BiEZV!L`anENEHb&F0J;Vs@I|kQJdcUU>V1O(o<(BbuetJa zc4d=de%;m#B#5Tt$=2cl$V1bT(ib~JAKgU74j%ugo6`6jGG+6n9q;O~B{?GW&Wn!qGzYFg3{iQ+tQOaU zXFMTGc(WxOiRcE>mh-WJ^*)E6%q3(~0Cf_3fE4`jkMrT8L}&8~QJjs0oxV*5F&=SGamL;@xDZ)Jj0r`l%0!0wR#uxUOwF2P~U6sDH(H>`oso&KCwyd05 zb}5@ZS0U79WZ%+`gB5FznXF*_nu&_UIrcpQx_MaUqwL9D09rR=bM$J1k&@znGu~Z0yJ@y5c1rQ~r*%j1JDr zsCiz1+nrs{Nb_Vw#cKF#`ipjF9bkkY<|r0fvAJ00#ZIJ$`Ux%v@26&ru=$@KJv1UO zfn0H8fNc;M&aWd-n=PW`!LM{%HL06Nfs`!_;X2{?5)V^!=yur-?y^XWzZ(F(7jC?N zjKa^|vKrFM3QI%Y*M=24Bq_MKfv-6QiRJK5N2~LNMkhpjAp8Y9+H62$h}V2~w~R381$oj-|M_58bf}%F@V?C*SNeRX&*-Rjh8>` zY6X!eufgqIuRghPgqEk#r z8LcT3`2eiaG&*(J!;~dWPg*SI@#hSvL#K;BID50&aS7@G`*m!fRk&(ZY?a42A~}Ox z0Az!v{gy(-W%*IGIlN1rnr2?JQq@;nf(N#3o{@_L5~2a~cQ-kHxPvA*8Oe|D#eOBx zKwbh~_n%lqUb~McY76P;ZH=F^-))^7RWh8W+y_Ey86UgDXkyT(K@sZr4&$41SBfy6 zO62E8z^2(qV4MH}L~Fs0Cv@U3QxnFLDFk5gYd*t0Jq&GH1I&dMd1inulkZTb-Npr< z8+-6&$Y-=F##M?vWP!WQ3ee&vdjR6O`9{UbDUNw}qiRSpCTR2YsD}M(XbxvXX<2L? zHwmCWJYkBFYlUiBeNxdq`~qn-*NOjMDkhUAEN`7U$Lq<;9mB6ssGXOM_i#J#JpD$G zxHEkKX%|2JS{HtG^~#sS|6$mvrI)n`viE=o9k=qZ?c0|-LUJmn*ux!#ct>-lF@>0P znHFKJ1q}UJ3KI_@OZg_aEo@hm@WS2Wf$T$PoKchwBgday-Xu=+=IfIzoJOUm9xVS|hZ994z86n3zFcP8ZVxVD0?boD_Q zp{&55bOGY_YR8hTmx%&;;=tNJ-2zC)W&pg^xhG!gz$3+<>h>W1ejRU9AMWs>@mkkkb<=XwtGEmX0x0s z?6ipuOF5Vy^ctN*BbNuT1gOw_>mFH_9uZ&`)J+!p$+DTo&=G}^>qfMKM2n(I8Nq8g z>CxnD$p))Mr;9*naKr5@J204<_nfA+?dCUCKf@NG0JO?EHg3{v{Yih|sp-ydE4xiXdvl7v0R=~;yc3bX?0)n3w2loEpBZwX2h zAWEh>$_B%?9)QK}pD~9V1tj=HkwJ|J5-dMM9qBGKWmphG9^J&Bz<#3Wea;jc+i$m| zMC@p=R)FILA(+rnYX4L-jL-yy!pRl0lHM4$NTxgC^Up+cBsM8HnJCe^aTG-oX$1BE zv05f5dxW!WOT0wu;M6di-^_T{iJZ~C`cevb{#7BRM)LDOumINiWPNDJZzo*X&jPV@ zazquFDiQ68)8idkLfkz34nr^2{W1Ci94MktqnB%Zy~?V!Yi6{Q{PG2`uLPe&W(Y4x6$Yz82m)pUF~-89W-z3PkPFGZ zZ>6?#QiVxH(I6sb3KL{1y?S*c6=05Uc)i^YEs&a?+x}GH9je_MqfQq4h(#7HLO$fr z|Fi0qj0JywKg79ygb<}}o5LP{sHZ?QqKnvu*(|#~|7l+=MaKr;-lohdaB+_Ql&)l( z0l-4Z4ABSIk{#Y`B557%o*v);`{Xq4;QvhA`)!JDekAgXG`>&eS^YJN(D|jlW{CME zppVZ~8GhPh3R4;|EB$_(2~AKtdran)odP0fB+zj1TnVN3GmHOis;KOn4h&hHOn~|@ zN8e(?Edp=ntxAw4`S&>Ie$#RcW!`zUQd1_V?6b&8X6F6k*aG^VmpOq_ld`FM(THDK z4?gSs#OlktxT9g5kmAO=Ism}ppkYgNGH`x`+J3O7h{hi)r$cOv+oXLU_$!O`o_zUu z6!q>aLV~o5@rM-Zt^$8upWnT@cOG&q>DTJKsd%qppYs5#_eCrXmQ)Jc+kOwDe>X7_j4FY5klOO-bzo9mBEKQ<7Sv|CmVw zc0~akTmg>k-3!f6^1$vagH2FhA|9A@Un8${d-qTd>%CbL0E-Kvnn>w;UGubiKYA%5 z_HiK!*h-x<{d5$f^n5Mg4J?M_RJTBm4ZYT@@G!xTp6c?+Fs;|im!JC z9tUIi8_fdy`bTj(9+o5}DGi=6+w-NKB;0-7Y#0I+m+etUz2 zn3Nq=pNX&UsTX@> zzS^w*%Oenl4TX&!NP(blYa0f>rPtkq0twAeG}MW60-KMjWVp9tM4>+Yzn*?g%->)l zhi(i*z*MnP`YCw;IPOmHRQLf6e}g-gKSKmaUc`{wfMRxP9{_jb21J&{7myIWjm1zL z3zP%aoDk}h1_G$ScqtI~0AM@shfsm-<1S8?`Q(XpcPjsbO3QmKc2Y>R1Q5GHk;=-K z3xGqr6Nnp<0O@o;%@Jpz=}>?c6$}tIzALi=LR#Ytta3e2Tx@eV>-8EC*VL)i$+gW% zo_wt&m1(R$$p7viEolh*i`cfKJjnkG-R6H|82?9%*Z+qQ#j!Q)Pw<`gKbTeiC!82) zWbJQsh25VR{XdbJe_6gzY}Nn&XA3$43P%K-^OisWMUUv(;l}r=`cs454McUc{b8ls z-hNasdr=}SU|U^}%DVCxb^S=D3>mBKxz@5#?YvAGCpT(>$vT_T8>WJdm`MC=8e=p1EWp{C#%_#BsleH#7+;I&%vt? zTW-pKQ(B9FodEO+Axavqfp5E*JWp|KefQ4({0>R#3Y-)9A$2A`w1& z&3Duf1!k@AJv83jd@Htt*MF@1(PK7mFge^6)qFa=!2v}iK#_?=8n5hH-#@r*;6Qmg z8!2TZU*n;H++^HpSx7=)!s9fCE}J;D~RENUVD!mk(4#uM*R{# z#%X`V8zK3kJLg<%WBfVDe0S`peo0GPm#wE-{^7QY@wf+p9lovi+IWLcUC-~k1-_tw zN`2YzS58p~qpP=n;u*=g7f)KOs4f%xA_Y})uWL;8wVaU8VT;Fk`kB3XIEMhRyWlh*Qr;M%5AlDiCF z2g0Sq`Ch|TdHCXzN;SefRQL1wib-P6J{wcGTAEBBd9Ra=L))<4I`vf_)jpUm`+lXq zAa7Jb{uZI_;Ld)8S2h=G)#csZ#-vZr`j-3V5t*KzI{Y}2mx4SD%^M%TFED^%EUF0M z>V_IO1TJBxOjagSy)A}8{b?N%hf=1N%_q%0qkc+#$fb=Z9%lt2T047!KYN?TW$YTL zQU@ksb+E66tdtJ`NBsSu>&=M@o7?;k?aj7KuaU0>QH+P{3-i}86rGHsB%yuf^AL^0 zCcty-*rLF5{ZMiL1XmmKtD0EQjMblT7fR!q_Bt6nliV?*lLd@qAd|eP=ZCb=1F_uF z44-Q>Mz**#7FD2i?r?p?XnD=SL1iP-zMq}!UDZA{ZdWGBe2!_14VB>>%L{#bLMS`?tII+j|NX@u#W;@ojXx@7La0xX%08<+3Y*adv0~c9J3P zMMED)1+E4O&Uj#Vrj`tqL6-BEEa-id*fzOGo~g@8GsOM?t6wwfis&cCX5?MG_)Ox- z!jOJb*A&M3Rl0PC_5APz>eOX4u^P`=?<>25xhi7vufv(~tg|L;v+}I|3X%BBQ+>5#>~D{k1)-?B9O54IjCzK~d?o7CFPv+Fw4`x)mrWtC|r$>BlKk;-hGM3=t6% z^AEx%4-2ajpZY+q6p|wr`lCBk1RlPsFxUDeY>c>g59vpAs{nI!8L8~vgzir%+cM|1 zn@+!0t}gbQ(-((i6|PUaR3;Av1b&`2K0b{!BZLZ*iDB*C-qf%yu<(Ke4~OyC?Rx9H z?Y^IAR`lalg)scKzwV-jgc+z21q`3@I4(#cv52k;_v zvw-auDPaTAQD8Tb$i(M}$bYQ7Wc`HLGlvu{E`{rE{)sFdjyYq>w~h!sYi({q_C_yHS@d*lu{gELagqBjdkl`2v`!4ip*5Jn zq#iux+Z|^1)W(Q3%ep60KN`UCPxNngxGqlV+iv>Wmv9|SfGLjH-(8|W7J!cFFA@T4 z><)m$m}Q3-g^>+)XawpZzYWdSjy)hmZqLV9zQZL4(%c(k>q+cXX6O#FGxrhCkzVC2 zr-Q+YYK}x*eLo+z%uI6MZE_FfiX)-$^Kts*_WTI6*kBBMv^8E;xu~Avg=_mACLocC z>)fL-g1>jS*7{{nN>fJf1xuQz|DtjB`GV)NsTQ41ds}3b5y8_Yd?O1dSC`vh;w+z)_WKEDBUnPA^nu z5;FI#83z($!dKsosor)r91Vi<9k`a3>_H(nvX;psoZwpW=uqMy zYS<#!P%@%-_oU2muK41Pu;K75$Zk6+ifYf?@F-y`l#v+snK@bcGdzC+m5xB?-9Owh zy&c4*sE9jF!#d^~QKD70Ji*#YwPC^mI3iAGskTXzGOA;W$c|Z=-?U=iy12*t9QiLC;M0fhcFFUwM7J#&whOR)*vC-O5 zVZ2MS$;6(THGh`lnXdLCpntu#>knlDmMAWoeDd`cPT*N~r(pyxJ6SOIACjMYuqy~+ z5^=&r-;_Q!tPfslr^m|1+w!M?!}X8+`HRcGTV>d9`6L?$!(l6lx=iM=wCB8xxW^VV zEc-&Tk)*>LR-w4hdi)&fuE3a;pU49rs00S8OPXmeMzx->wXXCK42f{M{N*s4C}fw3 z3%)PO#*N5W%-h7iC9a+^iLKoX7lvGI-ijh?eKDhj#c&ScC*EZHBTxwnsE;G(4*1kQ z;{Wh4p9QudaBxsvYpX zh4O=ohS!;hA=u%+#|n-Fo%}J9of(j2y2%ao;kkc>$7y4~a~~)U*$b~=0EKXc#Bg+{ zXQ73HMsO?h4?$8zB_T=vKB2fr*y?A|;oQAn+s(VBxNrjc0vlENu1FkvS$jRSvN~{I z1YP(1k}^t%5Rb@+Ve`bfdoLKRs0^7EnV^aoVmn1pf-XPI#)ZvbT5;OB?c$KNg^0a| zH+DLi^MrI8teDAR`h%R(oYQkwjTf32s$4}t=IhHoLcmD4n-yy*0HbZh@-&>Tm;K7& zy!g1~yYAa*+#eM7>_rP}rTK4ZDR!0HPwO5L5K=yRt$h+_&TyoY7K^b{r)W#mmEvO< zfZ29&HLiSpCBSqMW?$Nu*Itsvjdpkp z32Pzzqn545SEC;;EYIpnd%HUyx+S*BNkh$-u9X+5|0e+9Hotek*RVc$Ot>@9$K$%i z@kKCK^kYvTIa#5`gJ!n1=8f^1w3G+R^y_;|WJjH3ERpF2ab#D=LWWE-e%fHcyD9gO zKem6C?}m>8fgNmPtqERw2Zmme=B1B0c0Pwb{Fp|KMQn+_5-@zbA&>6w&haKpxtwUB zyoWUVy_Z8kv8Fh$NYs}IiH5)BS(onRk0%hxe!*Xj#;B|G&ObeUOS^IpfhrHaFVkNj zu&)+$B#1OE!r53c7Z^YU@#rIc9d1vBNKX3th`D_I)K4f&mWaZ_N9@@j68=YE(S*Xc zLa)3UDA+h%9hsi551+%FhNUp>o&4)}9IyM?5^=3p+{Ukr>^nA0wgX&*rlR|3LD6L8 zfeS715%xMQmGHFP*u)95(LNgMjmr<`Bui1~;ZK#*3Q3;YJx0bFDehs6=w*$Mm;NU= zTY0fVfuv$3(|oW3)!dxVL$zFT4uSF|r-XXKEut32Qpj~#Nq_v?pCz5h#Nb4UDOKeM zBwIgEp)Ea*aeE!yX5_z-No?M|_0DO}@t_KmuSKcsky_4)v)79LifC!p3q|Rvo2S^)wNTz*=qamX|+GA z(Q-qTzO7!W7qx{>J!|UvyjY=~b$zrwHdwOzj*L?~j9=oOPBkkEy*4He!vigE)f8;K zJG{}?BVxk!+b}gUvLdHy}q;x4COY!ZYcJ zXOmze!>Oxz76leUvIRKKr#6S)l#}Z~Dar|ATIKCs9wS2K!r<9+&w%levqD1S@uIr* zRy2VP>)Pw*E0cN92VA;0{e=dyXLR&Yi};34%clZ_VIA6L!wzqj(IwKZT6QMfHG-d# zBQ=7vaVd{OM-TaUaDz8<_`VQXh|c-@TxhMhywZNxjJx=qw!ZbWWw-ZIMX6Btx91pp z4A$T{?0V7xn6r2(P3uhaBGZtJt7`~c?H;mfb9@CNgjqZnAGAgd{lmc6Bn*zr@Lgh|{1izOS=FFT8f;$E zzA#}|fC}En$i!Bmz_0{o4 zQ-JW1FsI@NphoO{T100i5$Qdm(vk|W^25jcQgg&%Rexk3MOX|03Ps;&tb*zBk(j6+ zfdHk)p!IO9n{*jrj}dIM+Lgi?#SCj)PLPe8=Nc%Wz{e&c!iWaCN+x;_tJLM??jvd@ za-B>lkIgu-6DItwg0ZGPD$B9aWmciFCs0FKAc0altUNh}d^TFqkKFjq7`a$BDW?5*8ezLa?BE!O|NZi4Ttw3@JIie2iwD7(9*d@%V`vmcOB0xm4@v2Zt}lv z4v!%+-f1NeMA|b5DA0v<-cnf|ux4GE_uOybP4e~-$N(>WrvzQVH_7mOZp;S{^fuh3 zy3^omNq2iA@!#MuGbFvpO`EZuZRziQSxNS9HgSF`V_3}Whj)(iPrZEuhQ!5|N>^*^YmA@C)Zcf{=uylV#^Lgx zjXpQ_S60p{M7;9{&7uejS$u-$ua+A~*%C}GNVHOt3>O~1HX2*n$BwwY`T<$~M%5Sf zTH_rPPk==@F}lXgC&6$v5@7ufc|sD})0Dmo;Fz~Uc)MGfM`CRD$?J*PO<;}Ve)YbP z96U7^n*QW6*d16C%WXpD$R6TRT>1S1qLrs&+dRY!l&oVS zU58g^2?cLckcw*27bO<=G5vG)jmB164JtPmMiGbDuLzHdq!J>ROKoaF!1&sGHj2^J z9L%Iy568n2hHuO>7N|6|(&WEA&5g$Hc{?YrceB_hGn6&IbuI>vWYm|mbghQ&Kb#3i zCU(CV^yQgYtEp2J6@}|NJO$$fT2ls@Y(hwNiqnZprlg1!6|A@n^B3*@NM7p3K=<{u zQbE|z-<-_A%)HPCNr`;`TVV)OFp(TPN=u!fWo5D4_MN!vzs6YTegwp{x;Spkbte;V zBa6j2Tq_-H8V{OC$VfFxXp_i;1JT}bo!u6mW9eXSc{g2=4VZ`^&}*ixLKOHUJ1#@e z&ZbqA*SWa6USZ}h9*mqzck9c^w~r}dVWe6+72yOyQccQxuSVzvZstx0$wR8varD?r z*i9b-!0Fp1B8(R7fEU7z~adU5z;E%|NWC44HF@zrjv6{9# zr-3&*hMTQE8#GpY6}AQSt@ka9p&Pw7?MoDS6H=_zy*94!tc35}fvzr$b~Yad`2kUY zC(}ZM3JP?h7w&igOi_f7qUxc%$kAZ>^s3A6T))K7#W6b3rRlZe?+qX8(1i(HTQ_Xm zeJ;Adqi(~I@$|nY-lAYpVTV`93cgbPqh&+vj0%(qDk$N{565b7&%VKbv_y+n=k7sU z2Vsc$ka*i*nDWb4(hd4hBzs{@wc6A-XW&SP)48Ui&c?Gzec8DQjn|#O%&W+4ONYw{ z1}t~z92dEuhfnSh4Qk3%nOWnKe*G3Ddh03!vXfNSwodIvP$@=XawmRE9um~Ew9;@t z4c^rA+BYdfU_1SZsn2LM=BNnIMRhb~x3@G4`QfDW&l?~TqStf2zXR4!PE}AZhF`ec z;oC+ZuwXO$ZhL>rytLT{FEU3K1)m|yM;)2E4-$W7Y;jeOz|%f^2#}uC(J+g^-STZY zOlto%2zPYoKGp~n6S~ZkiIp4QI&&>MdK#UMX^ErfAo>Bk3T_r_JiAT5en^vt{MWeL zqyA@Ha@q7AHReM`+J79iQXt3AV6`R7V)?T>O2|ev9Y~gS>J$(A1I_ujmvUyax2{~c z6y(4^t95w7S}BE9!IT)UKW%qIg5j(Fj3~Y)+e3Hf?={=gYOJfV+=PtCxLvvXe-vdR z*7GRcP4+xaY`tGTv~7pjCbHjm?fxbllQy0sIvopD^IxfbYANnH$4z+nU=F}`Y-@V(MUN#%In49Y9icO85Mn6;3)r#qZ{Sl1#lR?*j0U-q)!ssa5IRnN#I|5Q|j!?&y!u;#82+^)^Mm|xl-3-F&929b_)g>S|Fh0MvC+dEbTA5b{Tf6eB z?d$R3@NKHRcJM3dbPN$9E8RGUW061{(b z4eA%A9O;=x9oG$|XA8Mo>!UFb_z53JM*Em4L%XFQ(hZ4me-rbBdep+$(%ikWfD|9* zVb{Lj>YS8uom$yt=wY`^tYyXYNk7$|YFom5x+D*Ii|6l$f?*}MAVGOzeX#@>w9c&gckQ$+Bh0~0(SZ?5jlF}8~BC?>OOQ!M)j;)>t z?qnb-3I=mEc#c43Rhd+flV?B*2rWSLv6Dx-o#(hx=-)u`mrH!e}x(~4P^ z{)sQB^?I|_b>;mNQ8g;sblQ|h{N1VCfxh=lJoR(_kbngPUvWc#wQ~Gj>b?q2tHGVK ziAmrtA-rpjwgo3AW>$Kr5VtqCPO`(K1f^I6U)oxpVM5HAT22<$x6~X6yQeqH*$~_D zEF2mO&9iJEb&Gi$t~w$ttPH(_N>X;Ve;BjdyWmCPx_91hk&w&dMG*+q7X$NUzjqj_ z=5P_}?9MCat`vXk`Xy$^{lFI@h>Y+H8MPR*b^QzYJ%h>LbMN&pi_RKmVusHBA1{LZ ziFy<1!%;Ou+w8gJf&~cFafzyc+YN#%^9OT8)pD2#oeH{ckUzcqe_qDoeswCk3TDqo z{QIyDDuPT3z5m}QN-+%SR7~uF*9UIO>SzpJr2fjXufp_RzhNT#TL|daD!K%1aH5(k zwJ`{xKS4hT)Pn5&I1Z}o9ElrZA4;)h*JrA`&JI-L|MBJ{mQmDoZWFlD5;1-5IYaAz zpW%EL}}0L73C#S5b+U#=TW4k#FSxRUYo$c zyaw;s*9hX?Q=F0T?X!&$Nw($%?NK5JaDKA2Um9 zul1VU-3CT>qp#nOELfGAm6|cm-`^h4J#Rln=)3@m00Z;E=n;qh-|1IHXsKXe*8B+u zFC4Z8O7e?MolrG*>u+*Y(M8etwMH%I!G!fBtl2 z$#45IC3m-M@M}6bJ+$sHFr*mS;PopAb;7(;UgXD@f3Hb>qE(rlFce8?m0T>M{CnxE zSRgBJa0HO366K~W{r3_~D544HG*`0Xj^aHJJ;L8>q)OS~nODQq2|Q!2LH~JMh#Bo9 zbMXg9Sd=99_m+8(I~%OQ3S`c|_kTziO-U7ilS9v4C|hFnla)9#`0txCv%v>ME@g^4 zQP&{qWHgpjv${GH@zviSp*7@U)88p81Ytc|(&nzqLgtG<;r=TEzbM|n zH=qyx-;e+8)&Cx00$Bgu@ZTe8!oTh(O+b*$N>?6O^w9pexDxkm0VhvinhNb-710N~ z(~Q^2=!CA@WaNjZE22i{?T0t#-naZ~so@!aj8B|a>VO3xS7 z=l}WregfEFP*x;GLr1&iEh+)yp%t3+Y;b&~DSc*H4-W z=lTq^SjyFJ*8Q}UQ@7`d*v&jhFV>6wGrz$>`tq230ynAS@p#9LbH@4E1-jz8)9)>0 z6vnPX(v3Z=ZnwNeb^=s3>bBCxyW;Z|*A>`kBv=>8x9?|%%6c~)A136A_+|{tCY4wl z`i9Qx>@Ou$MlTtE8mY;XXIbQ3zB>VZS1}s`hNa`tLv5KcaqKG_Gq8*4ch&9(fsm^d z=n+t z-E~pKQ9w0HttP(lz$mGKGnf~za?~!peXzfG*Q|3-;%_i)J`(b2x=*Iiz2Ck~PyrdH z-sJ8izUqy>QN9orQOhn+)o!LcNw|kgIbrt@nXD_BTZJ<+4XqU zb*rD$Ru1xG610u(tNmCZ_9-7g(l$iwe~Xypqhc=sy4%n}V+ip7zY{Ru#(? zPIWyu2nDVy6exI0?SIIoH*+7{D|rz6&Xz{*21Oz5c&+s9xnCp~A(5OT5*DQPUZ!ST z3aCZ>{Fa?7o3ZDEpZ*5Xgq)5BW0ZZuBYZ2FXJ}?{E(OV}?vPVp_HMx+R8()CMF$_nBMiJh{iTP{rb2A-`~+V?bwu zLGwNDOZf|elUnx)L+(sbks7y;B?n+jYgo%qc0$hJ0O0}m{Htuels7)tqeSeT=?b3I zUwk=DI+P*vYnAb$ZGy-9Iej-)w0-A3&T}EeNm`00P7zlxCo;J*uS;54*gtXGZ$zv* z*39}7Z!T|=DQ#;gpUVv2PuL%b%nBqWKi?slkTXK-7UvOuk^EJZfDJPI6fB<^-n5eA zT>!1s*n82GZ%xdNucE$XpM1!>l&dbSc{IB+pz2hlHnz=3$nqXFd#)O(e-*^Ku9x<6 zr&`^6=Rk@XA3L6Ra-Gnl%}*8U(Wk6^0PU)g%SP(pi8pWHX9+;uW9GMmeCB(qE?fAc z)qcZWNR1iaSJ)4=d_41Q=3-coddlN2gZ^%PdaR1+oq&GMV5JAszCB|Gj`*l?tIU%~ ziqw#FH(O-h3b_C^x>fQFuzD-aYO{}GL(A-8Lz^oc!nSr(B!E7DpEF+;f4$%{q$?<2 zl~_BU;PSw4PCMCd9g&dnRBM$rQAZ-P67@5`;nt;myQW;s#U|60qi*3PUdCchG=&hg ziyDthBF`=uPW|?n$l#K5?3TOJg8!bNt>(+}J4gzu!-T}`Kyma(m0c<}b}NHv%B)8h za*gFxCtAsswOHNA8BJ4ieP1j@Ne?03(TJ;@@mtBA@&(eU2{O~>m0;V+psLpOBL=gj zlE5;FW_fBWl>I9F6@1J~F&<0d>+ZJ9)}WVxtg(slA!hi}t>PXLd}D)L9cBall~q3u zHHe;67riEs%fsqca@_y*mz5}9U#IBui@u?&51*G!b}?tuY?s~PKMfHGi>9R4;^<~2 z5&BLFY!wz`B(>kqf6bO>z2yZJy%UFZD7Wt%x6v?g7Qe^TmzG1Yh~=cHo5eaVImE~5Q6EihtI@R9*!cOjO{RdQOD!CzWBl!Romx3Z9nron_qV7Og!0eWceF5O`o!K%*`kI$gfNGl;pT|t&#B0 zAL&WC`N*G4A1C*R3e5bNWYXjGO+5(AVe%kd=B;9$LU=v?P54KW!*K%()ne+X6YfIJ ztILw|H^`&oR^y`*a%sy%-@u6!W@QZ?dt1o(wt~I}!vz6J#&So^?)veg=-D5#WdSFA zp&7m{w6F86r(R>R?t=h5DD_%v*Y%v36Bif+Dzng0K4vAFqS2s2tFmyFcnG=J*A_)J z$w@N9udl?f+d6#+e48uxs?vJui~0>)ZgKYB{8!{|{CDi$1A`%h^+5}taYvzla)7e$b(TuO!bRJHXUQ@rk3Hq( zyXYpUZuu2WjCPa9O}4k?E+ByQ&D&gXULG*^dh-)6QFwREBBS`6UFVOsFS z?=YTOgrN4*xelvinrC8|p#}LXEk}=lau$Q4vhbZ(h%%D8t7)Wus21>_nsslbATUbq znw@20^TtG3MN7K;kJ2oKUS^`|m>~;qR!|~|c^j&3WG}nz8n$9aaMWBL0cYJCb2&{Xkt;CDoYG2RQ%@Q5PBqGf|pwcZa zJ1-%xo~3KkC~d#SGQUyY+U|Z%kx;gaopGtSuS`6jA=4P20hY8+uc*AEOWV5Sh?^~Y2R;@oX2@5yO9a%aZ)I)RC@6*-wUl-EoDNMXeVtBeBl}8#T8;1fq&6-+ z@;=rEE;>~YB^$YVEGTaTvSCMzMkJrJO~~&)^E39>Y{7MLSMHI(%X1yS7&p5R`%_8v zxp9c~FS`pqe%as`x7wA`NenZ`O)q12ugM%UL5tsTEsCdWQdGFEstsd&M!0}I zq-bia>tFh!04uNe*UyNN`fL;z8*AG+&pCEjD_4@3%_Q4oiQ4wx;=xZxR>$nKRn^%& zvLQ_shupfAz45#Byu4c<%eB?p=BwJJ-<2*~_mto0x-ppYs;JPKHX< z)(5w*Zb^zJMf%uxxlSGms~?XeD9;|1BvlQb`CMo5KX=6JFr+L`qhFoqvH{xalD*ZdbY^ zTy%(Lt2jjV@^QsuEktvE@J@4bd-YZl4yfX9U6R3oTm|`*3+B=d!&g$=$MeR4tp2^S z1@h1q@Tw5OgW03w?I^D$*H*SgaDghqP-A36T0Lsw)~rO2bviszg&BG;ya^2HN{Mux zsD9YL)TjF0^%3q##WQ=+NFxTDsE|PK z|3Hh?`r_?$9Sa#CRpv8!-AipewJsBhQB2|_z=<_<91>aJ&W35pyzS3SmQ~a0C%ps$ zS1)_+QhK$7#p@8brV0-j%pSk*G}OuICGRiP-x~dz=X6mr9djyp#~s~%Y2;WA*iq3= zE6=;n9MV;TPF{jpwfvJ_f^PZ#?dUH^VV@I$Qd}%37Ciqzs0(T`R?3~vWc6vZ@jOUK z1xj)5CUnSax7y<8P#i5aw4Wx_a5%S{cQm!A{AKO!zP?~tpWY7*p-GJ)f{mvMe#c*s zaA&Pp&&BTB6XpqRw4Z4=j?gX#~DR+1K7Z#8$+EeHi z9%ZW1TQkTP2_~sL4dlmIN*%Qlt>==+qJ60}Gw;=ub;=my9NFRd9T-(JZ?vlTZ$DN! z3#QVC&+z5hsg3HV-8NgA*A=Z!M(6jNwP!NmWPXfoE!|gUWpx#3tWjEYAjV`G@Dy}676eVwehV%J*{)A;Ud8bm0CIc@@&n#n2K@HT1nU#^X{yj3TT;D z&V+q+-oY8g(d72kTdESvSR2p5fVTqpgVre4<4-GgHG6yrF@bN%D&^7#r5N* z!v(ljQ$k^sRTvB@ry3X_D5}b()5RanPm!p*`aR*s@Qc{ry|Lg$$*j|@(@2Gxw|7vZ z8zW>ODL%huqCNstoh}r-us55fX(z+k`;;+bHQmlu6D(G;I=wE91&tOLEme_7zO0nT91GEdE7EjXr1PkVw+`VfTHHf3%4g9}Y`|hwNx_4VUq7)So z=^|a4bSVL)mrw-hO@&aTDIEetrAhC-8EI03gkDudAOu23x=62~hZ^n#_4j?}oLm06 zndfmdiIbVV_w4s@QjEmXg8xGIPC;J%y8*BH6@zSK;c-+9+#b>l`(Xv%1|wZ4uW z0lE`FBjr5qEOy|cUB$EDe2g7uKv_2|3){Y%8~@R3)qu4y{9IdVEz55T2S1p#{_(!~=PeK6Gdm5%5^LT> zxze|fMAxV1EZXtALdjJl*ZXX>#b?xDx(tUZWyDsJ(#~;nV;c>`J0rSl=qPGcAFOtj z4LzOI>LIu=@qu*T3ER?mU#23Db1%J@yxeBQ?wt8o%0=jSpY&*rpELOK$48n%e{Y`e zB*zc%%2Ixz?BIYs-SgRYkL_COf-=&e&QlZPbq(E$?lp z$Oc$+2HJyVr^1_#>*)A*Q1Cq;$NHC95UHVrW^YP**m-CQ3il-67-e^z&BU2A;o9Wu6d-~`)# zUO2dQiki0e^^*j4DBIx{jW6{o2Hvn>YQDq`X~Fmh<%g*9KM!Q>`)vv=>j@Kc~w z9cqfYp@Shm?kvA_Au&Ul_(!u+=1#irC<1o_82V#Q2N!Rn9t(}_uei|>k1=x+E}kvDU;m=;9R5#JAMQH5n{FU>DL z@|qYd%-`JCi$y1%=m!dPR9Pi`FT{K9l!QqH3bZhnnGC%=ntIarV2Fv!%U+`)W~EPO zl1Am%I7O>KL7iPgg!P)@vM~nvBJX5tp`PrZrpc75K{$?BBrx@|IFv;xbZ(@6vapt-5kyt=QYc|-W z@Yl7=KH#eWH1EA$kN{1_1KK6&3ego@;{wTbvij%bAk=rI;YG7Ln&Xi=X2;e(t+Aup zp|bAX41wB62R^Y~Sqixs2jB8#jC3i+S->(FTEF+pvfXgdlJ-VUnO=s-D348_NGQX5lL=) zS0#N~2I{_$xU;#owy4-8Q8x+2i|EV`ciW2xTfAR87@Ub3bX$G%e2!P&3Q%n1p*#85 zTD|vT@J)k$m%xJ+hgTunRi9~Y*nm86mwMZETzRkC7v)jS?``|{tm4@=`mNrZoVc0> zTCZ7Yxi{MlmVx!Mj*ntF1z_RLgQZ5Vg4X99Em@>M66B*8=+a=dyla_cEw1)h&DcftTyl2S zGsuv(4JL!!^;Cpz@qfCt(6H8?X-_&(kr;8Q`_sW`zYPTnL<9uY(k}6h((W$vNVD=6A;{;*B<-Q0-KsT+7*aJjlr*a`JE0X|D zP5>ho)^D%cz_(IBzk}?J&4&oQcADabs98_2QYTD z3`j8+ZG-i(ocfiN?|+NERr1xCF3|Co~+SZ5gT`f2F?3{otoy99QolF)sNa zVipryw0UJQQKx%a`kHRm%e@)yS0KjlUcH!3$DoQ&tMn*qX5*?wD__6z>%&r8D@mG&AJmOP(2Hud7fRO5 zDE%%Sp&?z%6?2O{Crd8{xh%?PdTNE%#_3QCb-8b3C4s51uOb{vwqBl>q&`vrx-Im& zKT6F{)ZTcxG+ZAo{cBhieEt^wn){TE6++ktb8e?}(^L(;-Cfuw5?isP`OP}fV~_zt zV{BM78@F>HSq0@CrEixQNsSE7c?wKUc)Mi@hX83Hgu!`pQ1GVT91^y(JQ$3UrKZPE zi+yWtVUFYc2;(f!%zeLm6&`TgWT;0Q1o=t~`B0O&FcX|*@e&=xBQK*D{7KiPN7>%> zxiNi;^GccXrYZefc=#3i7z=uH;r_Lme&#hzOEcV(%E)Ck7Y;$2H^>d7hhOu6^LN2G z;0hNVt9P93k33+yu&-j&dGkvw;@2&+w_-eyb1fSTo3rC}&Cs2MI?lM^i3O5Ni4Jbt z3l#><@q_cO*D}(e%j?66N_jHU(pIFW~ z80K9fOU9LFZ{=J&bLJXq@3^?Wb&Q{SYe^Ou5I<=a{vq?2f*DT z8y$6A|C`h3ADzU7Xa@9pz4nnk8LYa?!m%c&G{+*j)D4@xzUo zi-O&7F87q6oT>nUk*jigx63k=A3&^2tC~Qa+nXUf6*eAuvWYG=&oie|$FU7f@hx8) zDxXS=4wj8gHvkWGXkDnIEvnL!lucGTjrX&^`XHdctPX#2&hNxO`R+)`m(I1?zcX3_ zn6HW)aGPF$`&(Ar%>GH_k?(bLN7R~qRjwG^|$m>&fQ z%!#_Wn(gYl9qL(@P@2#ypZ`!qNx$Yp?`d+_xG;h1=TrL}U9N~{ zWtN2_E_m1XE}RKmpZJX|ku326PA+7%YD@eiB=9QmOnZkRhCBG$x#cvW35wVk(~svr zZa9oBzK|35EWmYNBh@NW)|sY6EeMNV#8rp>EP_RlJ_?oeA8I#YBVe+WG2Mm%@ z*OvRmsyM0c3kPuHeFuKbb#85fV< z%~fj4oNFe!Mzm~@tW{F6)o1Sy&7e{(LWbo*A%W~PaplJ9;kF#+G~(kFwq8L3mb`f= zJ7;>YadCfDTG?8!7?Cnpr=bn!bE5dzEoZc`b33Jw=K5{>mtr-o-Th??0nNR z$WMGItTB_uj-esx9xcu)DX^Xa0kL^`8(NhPyIHmRbKMk?O>5UfR~TG|wUKhBW>>U7*5B_MivBi!D0qZ=iDc zgPhfI*&%(Uz43$-6OHHcrZfeEuE)jJRB%N zCzov>$p6>8AeF3a|{r(bSPRK(wD&t?;A7_3!!^heOxaO)ayi42MLUv z>GgyFcc6-1Mo(bugx@Yh?KU{1zcPE2ZG-gNl2~^5s)vwUIgx*tQP%v>I+%8W#@_}@ z0y{LqQG>a?w*8GF1_~F{&yhMK198Bb+)+rBN+Oyf4m=W}uc#nrr|3-(?@38V?PR`` zOoIr0%!dv$TaEJ3agaH$^z_kiPq6;^op0S!{xsKY9BB%JQZK!GGvOz91xLTS+Un1o zf)kIH9zAf6O@MiUo<$(_pbpsk< zZowqC1pp+u3;2qudIRU3CR4gkx0DcVcyTO5BW)=Bjv z1p!+F-n*s&l$WzDF^}~4l9%K=@~Qs5?|5h^Ve$rj6u+GR_q$P-|BVa+(BbLpzwb{E z3w-i-e+ED!PhWrc|L`UDXfz-5%+61^w;PW4|PUs8nzoiYimV|5>NrwR6N3aSRBMA?k59Y4Zx-4;jrKeTllOkHm_uzf1E^p(WzUkfPws<1GfC7Ubab8E^`pgYDsJ|>(ob$UbK0LI z&tQGKs;Cs@D`p(3dF8_=6UwxkRz|RS1jx7D*y+i^Es`B0-O0C1F%6sLHyMr+OU!+H zTvw{lVh4$lJNE0)!7o2@Oj>o7x@uLmdJl5rTut;I9jnGjzVPjLUA6I9Wg69_Ts^+l zfqU<0`DSvp#!n$>vpi9GVIGyJJ;azO%Z}Oi&TSCe_V#O4C)@WHKT?WR=HbBYgP|~M zgNdQ0YRf{g?`GCFb(7}WV$(@^=1gOpRL`v?#+bdxP;Sn@8k45?98asxLGeOtijJb= zZ_B;XBmg~keqPrHvbRy8y~{V1ZZdj~-{SCaz@|$7kh%c*SzWR^xl`AK8sALPs0KJ` z*=qUGKsqbcYV+gy@1H6tit0aena8TCS0n z(~;WbbXPs|`AZrh1tlQi%!VbwASJJ!_ti~|z+4125INKmsCcit42Z-VK+Q!G1t#YV>;_)I^{0_ zkD~}Rzx$h60n8*sV#0d0=ig+GocC|wJ0Jx~o+q|y+o)VD{s00?R$1{l1JCMVuagU* zF|7y?8Mft1Dl7gCl-!Tokc0t9Osc8KtQCwIpplHVx(G*95Jgm&;Y%>d&K5ip!>-|& zlu`w3o`!C8o#>-y0dX07pO$Zv>I2oyXIGdf(-8cpw`) zLh7DcdLp{J=#5V75vDa(hhvnSUU2I(8Y|ueESAG1L)oJW>d7{vX6(2D0him+6+DjX zZ6(K+%2TC1Od3vwTV)ID>^u@be6QBB@9xmWP@ay29tMgoL12wPb4Dil!b@(+e)`Mx zcI4LvP26@a5Z^>uC&58aja!RgKbXh%q7RdXp~jwdvv_rh4{?D6 z5+;aEv8UP8Z-yVtB#d@JjM}Yx4QnQus~7ad4G$7QeNR~ZJ$c& zcCY#_zc1Rd?~`a1PHgS68hfO5tonGMg53o2adDfqFG=bTyn%C<4Vtlj`hj9;>09HQ zU88>ba*p&T?f^0AtY4&9$565lfw9cGx`dgz3E{luT6K8h?fctXN z^y&W9INh4^(2pMEi#-`kwIG{sX#lOG2k!VI=xn&}XDMkF_op#+imjH3ks2aHvg!U*NQql^hZYoz_!3;gNBbwBa`>3S12tT!&$D;07nI9P z);udCA`@(YmCuJ}eUsYe$?}M@lXmIn_A739Tu!&j`T_n8U_*Kb%8+IXje8GzEPW74 zZ{(h~S@3T+O#HH@Iv>!pe)ng0(^{~PDAsn9nhh8u&UsGHUBM6j zE(l)mr*HgmDl#L^EkdTYP1g)L%-@oqfFL0$rdJma4&tAv08F3r3DH%n%A?+*Irb-0 z$h$GizJcnwWk=nAH>8zV>IH28v?x1n1t+R?D`m^T2jbSAj=DPa5tR=-vYHUfgrjV{I*~TL^vZ4kH zutrM!@_AF$wWsqI)m)Wp8;3O|N7>DY@}aIVO5xo35Oz`@mmTKgt#YCSd1LjWh~VFB z!833$A2~#ey~GK}y^&Nt==@G|BB2%hV=8gzTXm%v1n})FTJDFdh(AIk=#A`}9~$$~ zmefE|D~AQPbwFvbArD<0wDKmJ8PO_}{5IsVrHqmN6WeR>FN)q7uQCkcTWRnVi=IW! zKv>2(V-C9MftXtL>EjB5$CUQ&YgN=g-5H=S_Tge1{<(@;~t z3|Z*#-k~v&)Ma>xo$@V=)$JmJSCU_x@++u??cMq**iHi{I5-TzYcdEGsC@&=H#b-I z-vXEhU#(vVr|??o+>A!{$>)tm=fFLKE8;PlY{gzkdo9z#$0;@C1N7NK^-E-7y6K+~ zG!UNo)izOzi*;*OSSr~oxxXk;D-XQUgWb|zYXu$%T}qzSfe&14$x+Nod^a#&q}$0A zEEQy|S9X%(M_+XEi_@V-M2^Y0NDR1$J#jQW&z_8E=fK?H82)64EbuYOz3z(s6{)AY z?TlK~k4*x_y*Xo?zKXFOSuK&(xvViR`xw>PGQu7aF6mC(q8dCbxf}PbDRm&k#RK3* z%oND4P1AX@Wp5ZK7(xpzc%`1pTqjj_5zdhsZh0IaV5y$E2Bev+%qCOHnCP17;Yx3y zqO-haN+Hi|C!4e_Uhb~;c)H4-f`mOhX*>%a7I=Td_=bcSLavft@`YEF$LR;2|(4C`J(MSA~jCudfJF;F;hiD$>Kemd@%08Mb+&j~ZQvHl?4`+?8y zT2#=>7OuEq{h_C}ca|?yegXict$qT1V}5+N`#IaH2@paW=(NYqhsckl%Iop>-ho)j z7A{g}ab2?q!ok4h1!FFnF%OJz)=+UFoBi-4OX#43h^mEAhfkGp^<32y!nr9)CssWp z_75c!-1ff1df5$>*z{Qe`V}CVRfY2o6rb&y$Xc~bozN&1?@Fv2j82MVV?)S%$BWdTXr9Dm>k!$jh;O3r$?n%>#>SXS3xO+$|UlxRU?!;8>yy_dxDcaJ@#f6%tI^c|DMn%wBPd_4u)Q1|9mS1=k zFV{Nk(Z3j=fQPAD)B$-w^24feG z9%WBgj%alS+K;&JW3$WP2Ok=2iVi)WcCsOjo!{Hi=?k|PEo6T|15}%o*)Oh2iI;@F zut_mU*#r_hx^TprW-$mp-wcx=>v#d%;|FS4tiQxbdE$TyWOqdHcCuk_=q0xXM@94t z{lP|xdEPlb8^TKKFVMgm$0@lkKu%g6WE0836-O;(De#A{kz3_2Fwr1)X3WUtt(k2L zB75w{(kb^FP68)+?a`}K{9>2RWhW-zv^>p=z|4EdA#b)k%Wr(+X+e1JZ}#<<&+&JE%IkO^#A*dmHF#C~BrdNls_aR7m%FAq-#vhI0(h%3 z#Oh?wKT&w4t|Y_5XQk<;D0#%jwlZhAm zrS(2@=9^tP8f^$ZZ)4vc{Plf@i(MrPwLU#9x50omt}_$(kNq z(rDw8kY+pCKVqNNK;)s!CSJCg;ic=OPwtrD*PR&mJ9l6)j;qJC22%LG-l0cg8@#6{ z`C2m&*e-nrSr24uw8Q9*OONn5m_5>)=l1*DwPw<}V0=S*$LZPg7LV1_P(Z8s3*3og z0=Ba+$wwaS#BS~`Mz&{G1O-vj92w;vZPXdyWdlUhGNBHKtMm9o$)-i~N9Ql0f{W+~ z?d`01{$4>2z-8f0Ry9KJ_P5*GkM--z@*7~VI<`CTVYaCVfOBsLH4kRrLW zvAEf}bbT{#X#CMvOxLXrWM(pl#__7lzSfu9p4fd!_s{F-lej{z6VrnS9PGDd{SUB! z3gb>(G~SQx$6KP-4+=;STx6Ts=y@KhBOmBx-!u5AewOqVESgqq zV1JgkxUIqdm-p|JV#yyK-b4jPwl}HsBvLuIq6(2g9m|D5C@X0pv&I86Jz9*n$D8^_ z%a6q5zBs1{$(`UA`T7UQqjJ}4j>(WUJ|{|wbhEWf zGc&c7;py@6gu(vve75Cg-poFRB-%>4R>}0BHGcDGk~doM1hH7M{&3NaltIXNFET-E ze{7Q5#V0r8s8DRP-wY#sxcExrXaMYKdBC2N$sFYLft$S_Rs{?Pc-VG3Cz8A;xv>Qs zm646|1kPmHyYBCqL_L<&2Sh1x6p4-~fUdTnp@31>LnS~iM@y$i@Pkl9N^=ZC1ZUzn1KRId9kYq7y z$3zoTp66gk{ikVev$n!!$QTs5R>|(E*uRmR{CZ^wFCWy%lw`cj(bE>NP6* zwC&!_*0<-iN^$a>pnVEX8&BCycd2Q2Yt62MAd~rfFFbVCFx)SF5_Y4?A5@Dcjy_! zc(_>Lje5?y{&R0!shMibU>)>tnWm940*)2TELVpDEO$4%S=@!mWFHINm0&TqvI?|l z*$s>G_hMvaM#}c`aj~;p9TbhRmLI7vHsB=$ItqN{0?FyDL^V=@^}9Qz{sMbllg z2jDg6j^G7H@j#$@U1Y9nIV93s^e4W?h+!E(Wh$C>9eTRI3lDXCmF=2RXki{} zc-qy-uH0;;;A1~E_=dp8w}*$R0DSyDE0;}$g0Yo@w^m%Z=LM3-t~e3GEp@sjL#5-A z#Xn@$LsuC)uccB+ed>4Ad=C=KIBEm$cOuu6ZJNYgT-J}Jg|vNNePN0$!e5w`d#wK8 z!~s}2WvHzp<5IZBzcg#CK5Chu>fHT$9`R%Tfx#HJLB~jKMBR(4;{R0tp=}n4NfW$- zjV+3%i7ORU;9=c$I6&Mki;ov@%U?#8X*;Iwo0aLMze*h5nYTvp#E7r|r`pf!Qwv@D zhQi0%^uFR6Fm-UQH9oMrLRfrGH#8APoPo$x-zGlxgc}Rv*ONMdv886vPdt0mmAtvM za=nr@ZPJI$EaPB-WFIA6Tt+^$A4Iu16J*&z?oJvb4dYX5tY2l0qmUPyI;tZjELJ3| zZ+?+5m{t-|5{l`icD1v(>a%|Aqd~X}$yKc8y9`6V7hTONc^;1=tg8u%f-M@dgFwbX z*CcaWv-?wFcmrt9b~{hx!N`aF^Mdg8b^cyJ>qTr4VOGltD1};%s7ceKShMm*o2tnf z@z(aAotl-ORv87)N?9OAbRi(RI5p{{T^cB zVAHJIoR92Z&7PNsCai{;W*yO!AduX|h}fgX6g?gdAG=z~9rwPOp&=FY`~?2UE5X~` zIDQP@WQ9VW6dE=ffpjM7o^ZmBRHBb&gUI@(r*l>r;b|PdS3zP5_4UV^hXLI($q|`{ zjL&C#jJ_|~Qxw{UhD*MRBZ=5AW&KZU0pnPsPhmTD()dtuzk^(0MguX|hRwKr59_KP zA^^Q=Z z5o-l6*kT`VMHrNc-x|8LBiBxul?|VMOWoM-G*$Zq{E_W+VJ9r^OmV@g9I<*oqs%Ig z!;khQY&Pc|C1%Jmi6}=zWE_q!EPB$Ep0x?;_1+unmRokU-1I!zm)XY{HP0M}0^&CYo~AmGK7LOnV;Czfjcc0i9)slqtr;BfVM<2;AiM(! zS>1tZyk2!E&XV)(#7g@x z>)`h)T=tu{JU0(9lpWYio+u2XMtq~sS}gFGMUApvX=YhfY+~8l!yN2!m%TIlcD!_b z)b!ZNmi%TA9|V=znDL@(r>jPzZD#726Ig^kz_)tSYkfy|(x0!E_;`z50wzs1CBEod zzB(wv1&>10XK~TbVtsYXbX}@(t~0KyhaXy1RGQ)delLsj#&zV|m=d%F+gc}YWxBMj zXC1VCg>+~Zk3PpKzD3zVsGxt-rIjm zLRiXS;^iL!RHn{C%j4_Q{@v22t?d8@8@eTULoq=!(vCiczOXt(XVvJTl9$uZm(Or- zF?)1bzCN4No85bd9PF27<;;iYOr+rGB$2<#49K8MnW3;&2FySJZ`lSf51LW zo3-7^Ot4+X#^zP|7*2?9*kt^f&~q(H4#KrGOoW{->3{V@;TTNMb@l|>Xwz#nhlu@5~-_4b($ znxzVdu{MbxT<D+e=g0`;S)Wc2Gd&fIi371x5VnS#v~Teg1wO^;B@Zp}s2%U7 zvjiglKg|hbo}jpm{-J2Ds31qGdKxZQ{+@^@-lEZ!jDi;0eP4G7nQl*TS$=Wrs3#r`4SJ#4$#HYv&5)d+5`Y$ zX*!d#rA>tG=uANJEoR04#W^RiOPNsbF&_RjhnjmS!ND5F zrV#j5j>_&Kuu&kunCk786(A$O$oNec{=jHFwCPS~ZXL zR!}jVSP;j9nw)!dZ3c`e@P+0>(Pcu)5w!~ys&a5gSsdzjf@;qSur@euF?;JCd+cF%B9XjEksc5D5IrfhQKMcM4?MG4>L z>#ALWwr6FN$JDC8ucv*$!^!RzpMNS>PWM_lkQ+ucX|kn=TmOqrtibM=jq0R|S)DZn z$LBR=thmESA-kF2*nv7hbS7jUfAh+1D{tL8B@=F8|j{+~5WCudk$S){! zq&cO5FJ%>IvtaSK$DR@yB8TyGhj4<#$VpUsWM`i7$Gkl?@|z=vc~4X}pl^jHApsuf zQ9C0yByVyNzXE!Np5$xKq8edi8FUh^?wL~l^wG~GytwjV?#?gQ#p$-lMZwbDJqt$}4ljzv0i2jok#EXDYzCQ>UU7xZX~siHTxiLv zaRW&&@}fDJ;9(^65AbQYYV%wpRG`cS~bxH2p~o$`L1=L%Q* zFOD60sqKg1%@=sLbR~eU^N0TJI{jzupI^mD*(MSTNmj9wrar3#pjC=kz|^6gHyS`k zSgnqAI6wM43W@a9Kw;{a#TD^uR)7K>NNJxjjtIdrmjyvV6(HBID!3Xqsp-bnM-=05 zbVQ!HA<)%vTS|1)ps?=(ZTcc zQ}!6m?}rZ@0j9exDhxt@^GR3?Aa}Ri)9MIV*5Ze!{IU6vN#0XQFaJ*Iv2bHZyr-n; z*rnw5P(6Rg=xQd&}Nt;s2UNZT|U=ZaSWrh@zM$D1E7^4FaZqNazri`%nxjd@@d z-w4TFtuo0I!x)033!wVW&V)ZPsPT(BotqwV^c7m5Czu0>%%XwfxeFPU_?|0JI`6m2 z1paydtaAG&MwN-d(HP^39~W+W8KVRFJkib+03Y5REinA4+WmiqKGPWH5x^7RiDd_% z725nZ6f>I-Q%*ouXUaPhDU4K3XbKhL? z>7lMo^U(lS5muW$Zsgr3CuR5gY`@b;<#5R_vb6O7CcxZ@3w{GA*3PmYxE5a|4XHS18z*`nCw$aYP)MQt+r2!v5RSQ+nS&kOVV`?cRc`d4!IcmI!} z2muEMUZ?BxzxH>@2#zi)0PiJx6~$w-P<=;r&@nddNZ?chd4oiFt=nvfaKZlGgJcdXzvaOJ%Vpa zX2_rS*N z?iulqm5ZRee7Im(jjxfVRJDrMX2(bFKZgqv7+g{fPpA5qB@VznNYGP%N~VnzCup&{Qy6rgre`md%oq!vQ&9=CQ$a|7-r7C`3r zkKawQNqDQ;9p~*a9qK4;Ir-lw#d0?e01qep1)ve-kCjhblwcqPnDKx)kT`3JKh{1` zA2k)`qk1$gCpXmp>0xy4!6gb5-3w_&);~wP7YF1t!~Oz5saNyQ(Kdi64MM5Z^?pjg zQ9j(ow8>tEI^oOdL~`bxGlw>E{yp*YC!_I3Y*FnT4B$UU`X(4>(2&(di6XeW0A))s zAgO)-XQTnlm5%@mOAGLRS>()`LIc6o-^Q+&rSAAH{?}Vb$%CVLiJ<2LUZ88J6`)uI z2b-u8{c}-sK=}{wSn`?q>tO_3XfD9oI33wBfb+qVQ=5!45AVt(?-zjJCv+4jPd7`=DcoaP;et7e?=6YRX&eG}7w_D?!Cx zs-K++dfV01x($U>zo6ei@I%C(fcn9I38*hfDo!4KiD^0%=I_r+-SPkG`+ikygGqs&>;bM z+C&0ib`W%oypHe+Z8@dPyf(d#+UBB%Tzwz_L+>gLbD)v}Yl z#WnK?m(|31ZS@v^n>lAvr-Y)(xh$_9r=}rMi?N%1XQW+^D*;+xe2~a$T)1nH+O>ZC zdX|>JbGs+F>H0jGzV4x|#eH_P0Sl7RkU2=AE7fU-=190;*-+dVS46tvT8DENK4Odo zplg;oZ~e&lY5V?iu{jS?)^h<@qvI%)O%yl5%%HiM0Y$qnX4PF-NUp=cTP_ z!jTCjmG&4$LmQf@gPK+92b*BTMG%2(>`S|Tkc=1YU+#krWjs*CfL18mzN~U^N z&Twc-s!u8MaSQYJq*4W&bpqw-U%f|(`WQ1U?LdJvmgBPksI~0C^HHmb z-nS&|Dh$XUB(C@DPx5aHH?SqErm)(|D}E04ZEg_J5EuHkRdqZf!K&*j;x_m8{iF6> z*;erFxHP>Nj7#wbKiyBp9xPRB*bQx`zENo!c46sv5GML{6Xr`(@bbzVD=h9HpLrdSUKo@%dYF%B(&){ zP3y>2_6(f)&dU1G!Vp|wB(%lZsAv5i@+56``6xlq2?cJNSA8O;i(#dg>35sG?#!@k zvPs1YZ~?Mi>DL6qx094)lRf_bng}Hih7Q%yMC|kDBT@NCw3wAtHELcky>w`4819_u z?oL<~o{UBzmR{ z&vr9n+t+1{Vih<-EZ`FNh%QGK?bbj(o=XaWHV+$gRU2G2*_vJW)-V{wTR2txMP4H= z>z0d#=JIeXt7i2zWwGdfR~EqW$sAyB{4#Ouk<=#4stXnHF!L$++Uscu^iJ7YnRD>6 zTGg85g@W1e_i%96NN5R0HKJ*e!D*%~5n#q&A_2rzA|~;QdX+taDJ8uh!l(2Hh5@HP zv3}pKqI20>PT5qXLbA3B;EZRwvb_vfzW5emK{K+lx6V z%0TkOg!LM2bagib14{QU^6;j6Lge^SE^~6-nqD z08C$Fc<$CMQVxa+TwLOhd*_6{P+{U)%thphtNq=vEUxtJg5fiSj+N^-62g)ZuJqJ6 z;de@y9abT__D>BYj&lsBGc*s>%~#HolFTLwx3c&@!WE=9nzvVldk7+%<* zU!+iqZ{l_J$=gc$4$<=y`H{wN6VT|KZ$VCH>2+eQaUC=JI!GhM0p%d+`WOf&ML<`} zQ1@6^o6y@L-Di~MxqG|-)eJBr0r#b1=Vt$itc;%DKW;%afK=ktEoeL`lSi@3_|*q8ZlpM%6qr1Mz+i;sW)E(0FC%qZNyBn!U2OnEsCXJ;%>3+X@3sD!Q5k< zaRjpKj_1L4F;kF0Plwd+Nhb~#upmHsbRmCx<@5kJO<6GcX_M; z@`w~^&snjS5;5x|`m8OaHHNO?J0OgnckZ#5ZPg$Z$3}FWogS`Z@4lyLg z6r?>pN7@|hD)wa}T`9wcd&2K!!nX)_g8388gw41ijIn6EA`B98g!beEJ0aLS8u2c+{fYy3dKeHSpt%gAq(o`5mVkmt`Z z(i6@W=gW~*$W19+|KjRX?hM(~=hP^>BHL2o&n{(s`a5wwHEQKwJU5q^39^U2+eO1Z z4}oat8O;Fx92I>;8KR=kxT7oZ7BZ&yYsvI2SK<30&ysgpvL)NKuJLf5!&Hl&k+DU;L?{k(H_Tq4hKs(PNRl`$}jPDRxYI8pKvD%K$ep zTkBe9igb_q;QZyc1rTN29}A$@oPR8Uj4xNEDJ_eSSPTX9*7>Ld26Ezjs zeFrY3@q&s#*HpM#TedS?Ii~^Xg(%3tWrsRF%&oJ_i?fgpaItLPVkEIyBemc5!j&Y~ zd8gYbEss3_e1FVM6Z^>A!kgJU?|%s(d)9MCF{ovsx8qYaW9aUZz8SRb0$c6dC|=o; zS?iZKtlvUbhqI*jL@Z@le%9~(KdJ2_tED-<*rS1=?3He8_RBuk#m9#7O{d=iaHUsA9Sl(++Ax75)h?Lr zgb-#s9X>?wy-HP`@rn{Z3InJmpE)^K^r!DYG-oZfhjf{IElBU8bJ(IP+zRua->CO9`w=V=NgRC z{wGY1b!%ZS^0`Nz$wS~#vJM?sD!^UH1H2yUqWfy^M{(a*vur&qN~Cp7zsKp}V?)X# zC*OtVbEFigkMTImNg+7c>y6nhdsH-YqTuW&#+;6JTk5i0ULz;yp%F=6!S@4;;YvEs zy`aTSw2{qfZ>2?sqTgpfatjnQUtUKRB3HFfHd(+qU$OR3yvcsfO6SD5uc;Mb*+zlL z=~!$Pu-L-eani3$fO+ZrMKU_#Z259JVi9@mHSB)aeBZ$7@g|u4-bjSv;krVdLfxiV zyV6{(0~WJ8HXz1hDw+VwL&o4ufb6szBAd(r8K`{Y)m6Uwh3}cLpna>L0vg+|nVXGI zCnJW4FL^p-r`_1ps0t%qw?v z#HxjVxxbFL60q=*tsFy27eDgj@7ZUU4)E*qPQXS9d7Hk`& z*7pj}5i-9ojUjnm0h({5B7r72bn+uiGPip4dUJ~I?TQ7ellYRkb|W%}t&xd!Fg07F z9jm~usF#N{tEl<%n#`E`5{X|(5X<_O#Kg{Xv5lAO`+0nuEXQ>O$B>Rdf$^i+T~?lH zy%v*mvAV(o1{}y4nL2-gS+z`eCH>yVn7;VQzO(ZX;t6PG`8Hikc^2nzw^`?rd&A4MNa;~epJTQQ{dYLx|K2|Qs?ucM zw;4W?XY@*z@*zoo)=}wv$6vHx;6_^Ht+cgj8J|RWSc$%K#P{5iN%n5PEv2`aU>5g* z9-%bcqj4T{{N|>Er+V3U?r_heU+IX{@i0^*%*Iw#Xncobt|JAZBw2-x`q~NDBu_ z-7uO_1IF*5x8JYN^Su85@nYB6cJeyc`Q-cazFr)fOfZYIiK=;a6;f^`QS6J-ynRt& zfjnNKC&HjumdeqpD%6cj&)TNa2*-DldL1)NAZqMedHU5BIeZ45OeQ0dCohppTn1|K z=2NQCn^W754SZpcOx}=F1T#%v2ZJ-VjsfL!|CHJ1$9QsJIlwP8<|jU&3>!hNuQ`Us zS(2`NcWs=quG-f6@ba2>)wI_`%`2f8sIlz_kZ^0?*wtz}$(#uhB2!H9u(0tD{gQOQ z#bMVbu$;OZs3TDP(|7?s4gDhnZ-EC{P)2OL1?kmpacHFdhsgR7_*ppwqU7}+WaE>{ zKosYAo1CQH&FYXTH8Pf>(ieFs=l((R{DwGiHgdBzaCz*^!QfUsM$A?#25@(;XtgMFS+*BHB&8D z2S(juAp=K;zIV$f={-(vMNPHwuN_}F}j_ROb$5MFCR` zcEhr|q^A1$^XbL1@xDx_9lkOt*Z7U{M}`oq`+2YRK~MGBZ9?jc5Okp_Rj=M>*bbLF zJcvi7 zE$7#1FzEHL)ADd7g+{du#Ct?fOy9}MPQT9<^zMDTMQMM(^M1o+la=*t&mBF|xg@Vv z1e4+-*Av??a7i;4Ir*HEQkMH+66_>y{Wx!dOW0=Ih~Or>*Bmw`RsPzs+*EdZxbGTk z%wr$>?GX)!xdMAe23+fHBC?GHXL;lPVixEjUq80`3?XTD4h`|Y^vWNt>dUqc1VyjEsx{ZMq95u=DZJmQ(do3*DqYe ztFFB9uIWHh#=QL{?rAl;BOY^J&dB$wWSoIJrVn}9>RIO5burp!AqAG4H|Pt^kM>LY<7dW~sEyX=@xt8Pe9`>3eKaa+8~ z=7l;x)FMywvMIgN6R9M}S2%Dei7(3{`w=xRP2uGh;a>%DIjt{@ zn6)r%(VrM$xyD8Yh7Sh?9vIK4=Slbu{{tfIHjK-Ee9Hj2BQbSe4ZlKytuCvyHZM~#CwT+mnuvH{Z0;dlS`DxocJq{rPgoBG1JRlm zfLF*WlnF?3%DtZgc!lV5(d96F6V5mE#p+h<_mr*VdbYEjFLcVpV86>GG|h&S*e0&w z^M2LAAN^V_Drc_$#^4q>f@em+Nz|s-!Q$LOx?$yrl&gUUNk(hV4 zZL4k9a%H;j^r^GNer2+2GL=_~!M79`9b(?_3*d9gW}^Ug--K#zyD(nr2iqXq#=5f=rk`T0Vm`pt7N zXJ~;hJHolW%nHLo!;*0R76y_a5Gv74xBuxI;PHB3M^5Hz#<>@0)-Ce^ z1TR-PZ-7^zXIQWZIAK83lLu}reNqW+!_1$|hMGPZ?ox==Jn%e>qh*WH)1)G~vRsI9 zwnP;!-luuE6!Y@~t#o3=2T0|&v$*P&!cQ!QYJyLVz;R})j&-e~I@b(0YppN+akojoA#-3PBYyJ*uW6Zj=D>25xtsmlbl5YXJ7~gI9{qEM z{;E0>PG$<&{-5-sUeo^M+e%GWs+;R_{V1 z0>VUF+?Ib(N>fjgRnKX;=j6Df%!AD4Lk*2MQcGT~Z7G0Lr32~!^S1L5cLgeYHigTeer)taHeF8*eaFQjq}DR99-yYrULkgi@7&qON`PQVxfJqF_%@|A7)TXi507O zb0+YMbcvQFrY-gBL$mm-LI)0JyW_0D8t%m@ACM6tEbZCS3Ud^{8FZ{$XgAp%7J3{q z8Ao*=F^Ov!)bE>& ztF|)wqWqo~AFr_KJRdqBHZ4ocs7*k z>gP!}HDTpI=q3zzTH|mb;iDouT_&m1Yz%br!{Oyo<8Ym^;p&8GCxWy5qYE+>+fa2m zH@)DAY$1(>{_KQBr5mN{)=xXL(eMu-ivSiSkAY>P)IIY9gNs?HJ1W)@KF{G2zD1hm?Js!6FiO=Qcp`cKDdgVTssD~XJ4ovx*`Q4Ch+cxX zJr;Stf*2R(VPiC6Y+WV6uRF(|?%@fbOo64(e!9Z^c^QP_k9mxrveb~+2Mf(x)QYtl zhiwcqzZAaHKN;;D0dF#}Vqsx8&7nF{;bfq{jW*V;d0D6<{h+|l`5M^ZCJeAi=EfY> z(%zh}6*7fT3J;&iGdN}7o`KWkuk~4W(fe=)ahWAT^^_`>670D((hb52$JpcI;#`?f zgq|BK##ZV%C@nNe-Ys(TK&e)lp5-zd;Urme9Sd-o@8|B&zC@mCQB}eb{R~!Nxk%y$sx%%}@IGot;vup6{_oR&k89 z1cIdPlA7Z$2(tnLL0DP%m*RzDk4G<9mVWA*p%;_ek}~DTA_Cw0x_FtB-tE*GKbg9S z_Au3%#ZhmgNh0E;s5QA^Zt%PdI-%h#HnAhCQi`%}ld2}#a-|5C>2;9S*IDYlm)N7G z8eeM!%+_WZCLpFp2&j|#RK#w~e)NzC%|h=nM@iOBZj3hR76z?Ccxl-2f=@`Sa!@{} zmql3jT(LOdf=}qD)sM?r`jRC^&uk}{X{)bA^Cw9*(oOd3#;dE;bqs6*L4>zuMas46 za;x3E!uI_mUrK`jSL$98O{tBn_pNVcWUH@g#IA@4<4d83SLUtUv+~Ch37H<<)gjb%~)XCLgg=`|*T_z*b zY|h3qdtkh`P%h1O4qM;1s>B=@a6wYAPPnGo4)cX9egacoxfX+b=@~cl1nFm+hglO$ z6r?c_amEmsXZHepLVN7R3^xEiR}y;JGyuO#%YA`9tGr?153$PmQC6#g1)>taDoe|9 zCW0@On9SF~^g#1w-5C%->tCReB)w1wB-`y)W$@P+abVkDaXtFi3jkA(5!!aG6oUNcqUE z9!yPq(utjo=+e=dqoZoy+j}L>1FC>^twW}csw0a!epHr49wqjR_Fd&>JBGCYL2y}U06|Fj_}_5Ya#vN`Nwv9cr1iMhi?E6F zh>0qrl+XlG&4-g!>aO&4YJgICc=jRObuqd9hH=-72Y~4Td98{)ZthB6ZWmhHeottF ze=vMyURZLf-+gexZRkME>}#!iomCBo53T&4JDyoVss;Ve@HNd3%B2Q(1>pdtR^F3%*^3`_C5-`&MZiDwnlF+WkowO4v_p5=X>zwWyUkD_Au}J1hlC{bUopD(@_=c>9x)p zN8kF+5tQvu#LPznQD73W;q?jg%k`Mkl3{#VwfaKTB&!H{S}>8jaK>~pf)k3q3q=b< z#h)Rje+>i^!0eA(ZuFOwc?G)^z%VfL;Q8I>CCfPo$$Pu*hnKxn0#oaP2*b{qHqW%D z@(Ui%Dw?oH^Lu_eqU38z&Uvl0Af#s;r`Xh1d`mq110PN1sHN&)XHVVr8bTifJd$0+J4H8GNCjp9@8WtIu*mUxqj@(c$P zn~pn%aaHuW?iW?@ZyK+zhsN24^Vtrc1|Dv#_*yBUqDW20Jq=g}fIRdCTIy}mqnI6T zp=r9S-T=*xfCQBw<|7HyyL&CmW{BW!o=>8iNwi#pW1JOQ!EQ*4Yc`HlDFQtN<%!%(+8*=#u_-*DTrSZ3@n+N_v+}py6H0$?byJ-}&iXXs>QFhl%oU7yn)%?Bq z?Yw2p4g!b!5?n_>J2CsbEiObs3}#$ zQ#bJ*WuRHWo4S}dbiwT;YI>}=+x!2oZUaIibXNh6?CX?i*Sh{u_{C1d`$}s0QJuv7 zi6b8Gi@?YHd$3`I?UcQLA43zqO6yG$LqnB2?RQw}K`nd>-{PcQItspu#o4fAM20NH zeVj>`AG^N#9MpP1S9PP*PLal!GI2J;hVN_Cun z*va!a#B>>$ooo3nJTl5)0`;hcnr}^D&)4GKSe%(&Uj!i(V)nU=-&1FXhNOIgiHrjtDE%GVQ74{F zP_#++W2MeuBP*AM1BO>-=PSyA?x;&FPO4x)5g9*48Hl-RI9&xP93($sOthHW;_aOf zH=YfS88@R?HK>A5)uyRljx*{0){Ppp9~Ed+G|yB{LCSmxO)|pyt%p`|9wZGH_RUqM zOxm@TagG5|hY=T$PlO^+2L;$IpQNAy7@RNS`upx1@>jM`6`&9dd0IBN?~x@aW)D-+Zyy%?I_e$T8IVrW21jIq5& zf_otC@4kyA106zeE)qu=)*Y z-*Wv)p?zmWN7L*?$)+GuL*VD_m7!%05e%&tJl>Q%(7fH+i_Lk0x3pVa)9fha;CpNI zv;|BVh&r(G=TV*<`S^?I})TeJK5HLlmSQ=_03}1uUOG7R^aQin=FNs1pl{(>@njs41n{Q4)_}RTbz%#5;Onn4P`h$HiqDql&~?uS!w3$oLCZ0^;r6r12yXCL$yP33 zs_)&+-LItkgq@Nyn0{%3()N}LcRGm=E83QM{;ooi>4ah`c@FaG9AbliPAt@Q*0HA zJ-po)A>*dG26*Wjtj3n(e0D)_5$aVkHSC=!JyOI*&0ZXYq$ih+!35lpxzRhu-{fM4 zA|}ZpO&rX-U^3b$XLenkdA+owV+{|f;Zuz7lGz%J?i3P^7^Gp@vFuvuzfNy5<#m*4 z6Oq^{1W1hPv#$s}w=2P-h9VYn6Ice@a(JB-^ioBbV7bEma0``m&d>5HD1Fr8v-s^5 zbT=#OmgCt{nT-u#qW-p!dcM6mN%vzY0x?5c(#Q>KQ{Ll z6DdJzZ3|T)oo}DVe_Ww#^7I}$z$QGk1o!kY>yFz_Hp$r~RlUigj?hQ>pbPz1{7pg2 zFFL>v3C2zOq~OA%;i8lVr84Lbg;Ra67CKB$fO>$>$o9NYDLQz|r)ynRt8!nqji!Qq=Q!27v_t*J2lGtlX)m+p(9O6^UfsD3 z(U{I%W&_n&ASk#{>^s`&%4Uac==AMFtnRdOmf7HEHsF5fiTIBgjccE)elduj<0@YR z;uP0H*6>s-o(x0DOtl*g{Onwoe)g+~biLAYTkYelbomrQrg)2j$`&oOdYlC^oiZA$ zJ^YyW*|?5@loUkVKG*YBaW1*q*jyj}qXe+;N4I-*-&~oiPQgT;6er%Vc6$V#w?qkB zW`_chDVq^Jwra0v%C82MwgoY|L&EOs-g{UVw6#2cvT)gSas}rYV951Ifluy^ITaqd z?uUt)#j~SbR)&}V(<91#VY==EcweI5Owx12tnxbF_PH1w-bqr>6}|g-Z^JSOeBtzC z{kw{*7Zn^A4qb1mGZiab!niAnTF{B%>|*r`zi%9cI8%X1nvK89!dw(6U69MJTz!z! z9Y+Cn)4V8A#XCX(P?%q@U%sVe48|MzAZ4h&OceRRR>IB=P*@dd6-g~y&(x5-st|dz zNZukO(%-6sC?_09^0_UTRjK-SFB~ja6i9IYTi|*@pajskTvQ7Kr}tIauf7mEEH9^< zgIKIae*G@mz5SFK!|{il;THiD-t?6*W?%VaUp-fBt(enUn0tG&Lk(p2WKlTEaK(cR|v(GPOb0%qBH7p!l{PGSW!DI&oRtS(eZ)?%Tcoj+UN>f9jwwc5+4V6Oe!C4s|u#zGI$@D0Y8U z^k7liI}F1(tK9bGr93fKMDxX}vLVFWlYC!jt_q0PyaG|&NOG zsAd2}74^{kJ4RtUsDyLqUknx5fCia#!nQ%`CHU#uYikVZJ#y2G{XBMcBGrl$oX*eA z0(O6Vd-``(`tM~}HKC6jz+BbSSv^zTHSU3!hi1h86hpph9DtnwKJ{dl6m^b`QaSlJ zl2Yo)+iwjKg+~9q04eAJxhbM&jRPVfz`LdtuVBe0^oFe7%Qd`st2_-SL{ghCJ@h{<)v0Ny6!BpT39JG~Vjw ze-HU*iO3hWACHP(358I&DX8fW4OTA43;Il%O8>rEM@4LVyN!$E_Jrx!sQt5G!okXy za0#_kUyeK9k4^#!Gs0_=RsTasAk8{Z1nX?rsaqV-%-UT%meLhPW`MR+zj}ZA>mL2$ zw#d8)YRtR_f*N1aJ1L)C1U1M@-0HbZgM3*QTaaawEc&=Lt8b7mKC*LFK0&u_eO24Z z{Ft&nZz=t#W|`+A-Q}*6z`SUxnT`S1zK5Z_-55xwDc|&ProM|AA08I}SO&zqEUGcj zT8kbWR^b>7s#CdoYEvFg*3BB{Fn0WAVEf$(79;9riZ;;GgBN+;4&z(F1y+qnr3)^t z|M^!Iu@1xxen`JQw^#pmj_*{s-pYbFiKoZfg!s#+&t#Zy&1#e^vk+~iRjgUg_#VSf z(Cd_>Hd5t=*;^!Bg6!0{OC6X`@bGSZQIL76l}g~WYo$Q@(@`aJBKhVDLnA&K-cu!v~Z@SY`3PO z&YvHsp3CoTwW6kMS6HCFX8++i`NOCXXrB292m^=$VE}dk3G*Ve5YtzFq50Jv@_oWFb|7LLcePu74 zuPE}kyEidtJrbu%{!ucgcnZ(Fz$R>2z-<4*Cdgi36Eu8J$$tn;(9-(8*x*?P(&-J< zXBFM)t8u!Kjwp>)d`)%t|BXlR3&+IwMeH1qznq>G-rl?MSI3rtS@-6R2NvxZ#U7j= zjD_rWg}b)pw21a^Fycap40i2~?RMK{%kH#n9Z4*?x_C}Wv@(l-Dn3_i2Z}96LK)Dqp0y)4a%KYt$VW!? z803@5#tT}6<}pfUzF){w>}foooZUlL`j8O{N#jFaB)4v)0BS`&J86VEC%`%f&`Hdb ztMN<~5_YPMLOGDQ(%@4-rD$wm;ww-REGcBFDZXs$)GN{~$+(wJC)JKtUz3(P;vt4r z@(bKZ;^RG({K9yNUli)(l-y$})h{lb4D)d(sd=-+@o2hZZ5$b|wpD!Nc!>(Ohdkb{ zeni7~8lY$e$xo?gR3(fKkUODs5N>q^6!)1U8ndV4lr$2#cB=M9q{ zSH;#vXs^4OU`UD|s21br1jyvP&KywhT|HFDNt+&S&7Bq+q%cWtXFq{#C}(WSpUkm*_m^Byqsk0qfMYTG_I5MU?EM zX>}Qt(YpoM9fDIm$zxj5%h<7cqLDp5*AlC4#rFq27WF4}0MNNRfXM@+Wo)4^3(}#$; z#;mK;v6+$6wVTyEK$YeA^U2>jj8;76dCz9jYjV@e^|PcehYTjLgNK%RM9XViaQU-HQiBFhp;7a*jNUTOv( z_1;~uF8=v*dhh|{wL~6+^x4Vgd~qCZ=gS7EtCX$xd>t)%a->JCJ_cb=;!F@!!tLS$ zcAIYP0godjoXFXCfBQ-s=cB)c{_p;CFc;aNYADrBtmi2=cFxHF(9a3RGYqtsINRnuy(-Np9izTGA}!#HjU52gB}6;h}>3cfqbZOC_i zjyi-yQ4chCNSqd*vk8q+JMQ;Cb~^1)n~D*u8Ey+8r?bGFS1i=YS9C;NV*c9*`Mtck zIi+Q__HzaFU{Wj(GgI6(JS@y1YmOM*WIS@rsiCH@c5hzK&Ez!;b~}3k0AkBF>@z#U zgV9sO?^&my`v;tb=IdnKLBdD0tIzrF?jx9MvfT9~fU4@JWGTq|V4846y&-$czvS-3 zZCEJHVDXEoD!(l6(^-y7#fpua`%$rDN(}WACSi5E4UHupjT%CJo@u9>y4)Q-Q=W30 zsS*Z`B?DdOXd%XWS3TEBJ?j0F=)ZK*Zz7~Cg8$>`I3O_{to^pQTWW<`3`mpU-a1<# z)VO)a#CKU_IubSp-NnSP?aofRb%33gTCta6cPF=S=EpV2lcJX%Gtahh5}xW@#l^AC z5b?i;$G;ED|Fks5$HPM&V&W>eiel61cf>q)#yI*5%mt~VBkz^C+B`FMDfd3CnU1wd zitA9D_LTE=Jjva zi#9>S8y7nh9`~z@y!@bZ5LcRW(4HjW{mj?fH`Y3764LK|OcZzie|L?yQR7nG0?5A~ zm4LV6W#8^aHe;4kYB)SOrJFh}VPNQIA5@F2i{5R_>2B{(ONkp{nB*=_(R;`ePac`y zK6g8M8O zQr2oc}8D3%u-j3k4 zsS!#w8x$I@OUOg)f{nt~tC%*{)F_RH5!R>54Dg*hSCt-_oJh_>&Q!vN1 zs!)*VIq(6LckonI0ist0S0ziWc|=P~rm*vt#tpUH7M(Lq{DBT9J{z$Z89&hVZTDVP z3Q*cN0MPvcudAksvcn%0XhpMxa#>3WZcc`<8(cNrWi~!~*#`D~9_(6s-&9_LRP>Ng zqjFKGji!`OU_GIhO;pKrly24V1skr(Jj?lJ+gk2U$c^a&?}w8wOe3~clO*mwp% zPO;51AbopH@CrV3sKy8%8uhg5;j2Cr`9zw9R8qC3-tJ(M#qMaqDpCA>Acyj+Kd-m* z?OkN(E=+T)e@%1#MRmEwVxNhLVj!LugH?JnW8SEdIVi%QKS;TPf@yepXhtrcrK*n*jXpqKhMt*oDFVs1f~~%TMmDelfbyUxDRwp;7yQQ{jh&=pTK7NzT3U<@3PdGN`C#%@qaqnD&*ed>g(x^Eet%|)Y zVJQ;yms{8=yHo+4w+MJxbF)3ywkj)1$TIRM-Y}v;WhBdFt0!yjr!K68b#&W#;&+xR zOJxA@-gcnnYnXZ1i|f9HE@~ej#%bV2Sm$_)!3O?bwdfxZEtkU$*$*JMV)85O;b*J{ zAmX_Z_itu>p(zx8*Q^Z2Gb^^lBb$PL5pn>fViaY}F>N$86Sr4B=WX4*(Jmt{rvwWX z*I|trI}F(dB?BYR0rXj4ezmSaAcGQIjicWk;=*qsqmU~YI1Kl`>Q zie8{x##Nv*eTg0_*Yi=OQ6ssBS8!9RKVl0jIc?Ps_XY@eCnC zjsT`0cU^JIX0^X4W^o^(UGli^rsLQ#Zg67#-uE!I`fi_#lQ2h2AM~*fDHMpIzH}FE zTo2ZI0kx_*&t3hI2ueCIZ}F)e>kwOVg{w6Fr#lHStZ)!YBj_Epkx>CB7M^gO*=nM_ z_snri+#(4cCFJ?Z1Fy6H7-cR{ zC@2za1YUv@acS!#y2Q~yftGHOXuRz^sE;{s*9P{xBb4Zw;$a=jaY3m*gF__;Y`=UgM^TYPCg3y9&E>4Y7I`9uLp1)`u@Cz>YY!aJf+sTv;H_j12Z z8!$e?o<(&7DK_}A#RSTUYKn^3w1lNFtLN9x0A(sIv7iJM04MY11Q1eD0`}=+H}cIr zK12D9In(-6(#xJb_W3PouA07#;P+H$kV3-f)5E+U0Z7S#3#`{g6u()ex>RE-xI?4l zkShD_SN1$VU19-WNC}Hg1fc7%zX-;Dqs4&L|Dd}5w0}@tf7-v$UB7mZ_e?lO?_0TQ zBA3|xpl(Ryq`X?kde-4Hxu-%Y00<3u^`^o)2MLr+ySjZeMx2`gGON|>6z7}2ev@o@ z1Zj`ocOg_}bvkO0?(d3LlfTF{;^CF~u|~51>3Q<5xYtDg@<|cC2kq(DTzwCktRry# zB{uLRfozc*e9ZbXG+?=?_g{u0dW!Z(FDr%uFHHQtKi`RIX3s7V2>-s?FBwu$htj1W z%l0>tnxbFiJdc%D{$;ZQOj*w*%C7e`YkZmriw)~4!?rmhyIZa|fbtIdYKiZ!k5ZC{*% zV*luI>0X-AKQClBneV|A*p)X%Rd3PEl|3H&h#!}fZKLQrev>VN_9myFP`aZ1GxAvW zz@P7l_b<~)&f#4R#ACauAww=Zca!W(zTjS0_qfCG3FXx(6R-!ohxep@%)@TF)634t z^uF-!OUK@)229+9WINl_`;rN(L zM*L+&GP>=^1jJ8C&7cxSF55hp=YP~U+gCVMu_ME+A8)BgEz8xNY0g~k&&EsL`Oml7 zgG#4ivzM03Dk`vmDZHPRBwW>@N$aE6?%3b3sSR3r!5>L=_74-U^Ob}gzOIJ;CtZD) zQvzgOke{sb=aL(3y7`lTfnU1iD%m)&D8p#Eo!Ija<6yy_0^`qHeaXmcY=mk;9_>w< zwyEs%d5)>$jhf_NV;VFch}00NS|)v|J4h3JN|1fyme{rZipPfrZ-hU$`8rOQhNSMf z-s6u`+mN2;2pvCq^TL%8p%G@gtpYk8Atvfa;TicY}cN@f| zSvTZgP5e_YR|3stqCqKPgtnzA`UDx$UDo^fYX`JQ`xxJrhOLO&lUcbD=5F6A=YK^( z6B(cQQT$TFv(b6Zo3oRLfdLH)@uP zYPV?apK|PJ4Yp|drdrPA$)#G(<(Z{g&gSW)TF%$~(Cl+f9dFSj->r7H47%opxcsq! zA$zhI?-KlSA)fAQREv9%`L0ZGHfp&LwkW%Ug zcdUgmFTW4;xD5(`;(>Do^>3H_bP93RH)vq$ES!tb=7ur`NonK#q+41{Oe zJ!0gEA^+-V?1laQk2doCiihGm54w`OqP5yaj_c1VgI(9JrrV$!867w?$;jdS@Q~CM zh`qv-tif86;Lh1LlxcOBK5?MN-BID|Tp94sZIauT{@3-bE{RI=suS^DhNF!F1-T_{ zW0jI~V~!dg^ciqCbg|4@MFB$?m)4zh3e$KjWVg#A-?X4!RhLGA*e}g*YkU4!NDJ2y zZOo>3hBO(nh$<8&UA!UuGjz)+s`)N2j!h27lu^O6x?j-N;+}eSpJ(1!Kv8Ebe{$a* zVL5U~XCqN#h>M`%jPB}KKIi2h1q4!WIIj*~mdBG&Cv?7@Wtr4zm_L4KG2|`Gj&h5q6VFVEZeUQ(01R^C1>Mp<5{;#s`yZ4zMdL zaMS5#*wkByMBDPm1efJe9q6OF}v7}eR@iw0oi8vuzeAEPXFB5?a@hA zR(g3S{juWuMi}yohrlCn$3$fD&#BD>az!OsE2zkB?C1#nt?_rCe5}VddpW*Ui2Qs< zq{NA$_hdeBX}L~W=@ex6$!GE&<@%v(m3>^6#>GCQA0>R%DvPU7@r@KhXD#_SocZ2ZiV$z9lfYJYH=e-9SB~8YCJiJHgYJq^pM z_-h^^<7m#Wmu@k=YyI(&iRW%;MC<)$cLOiqe8n?!vQ=DLe5Sv)sY^e^SwAgw_-t~h zxW+I`ce8~EwD_${%4H{%G|cLHa?oqav6PZ zel-M>$;5*!YN@@yKmPibQY%9;>)+om8UptJuHX0OcJANX|Bn?vUyl9Hj{o~gu@_2z$W9ZmeM-i~77ibqe zH0_9sHEIfO0|-K1`fj$za`b;Qmfs&+8!G7NP7%4LEt@RiXPB=8XLoRLF!YnR)-RNy z3yCO8E*sfBwU|0Awnum!ZYoqcE@rBwiMI<_kIrD6a#T~IDyDtG45IGa>8#XO4_P?<-B2QVY<;YBqh+Yb z0JXKR`5MD8<_Z#eR8&mxT>M8ue6wRSyoIb}L+OqVX zogBuuMYAZ`+7@Nz$7C889~nmrUQ+7uNPckUwjU4aI*UC;p8`dI;XZU4tGG4D zESI{2@1}UbPSMs@oG|x^t!cgtY4GE7g6$IQuY#o}uLv#5-e2=r7x27g@POI|I z)q1?yC7`%lgkV=QYIH@!;8q)$C2MUhf44&j8S_!?zR5t7%2T-Cu-z;4h@+v&t1r1=rM|!Z^+l)IO@iaLAc@E{)w8^bj@q25lW^$yJ!HZ`$d^>4 z?Fp&O8KJQ+J&DhJf1WF^j%5*?4Vkca?RZP}e535Fu&P`xG1Zo4{4xbF!v~{;;obM{ zN87WP3nUF_hBBWMrjh@r`a=N8^&OtiDuO;%kSVI}X zVoMHnCe{-3$1Y2p>t(AXQM&GLafhJCwYhvS&s$aP;kzSnu;8appLVb(21Dna^Snd< zbPPEZPH)4fCt9ld-}pQj^D-^=^jX2)J8ls=XB}aDNv;nJ1$>krd>waoQsTI%NGLqtRJx-KdQzadZLAFmbI%KO)2glFD2RKpTD+2A0t>iKwWk%mSN; zBJF~>YOr}G3lmdo#69UjhpW+d9vcOkn3|3a_yIBHJSR~1&P0_Hna7*H^!Ic^jxxBT z7Kwbaw>=LggzOCcPKN9jJ%?RdY7zyWPG>1mxf~L{?o0E-Rk8ck290{AoRZ$*k<3<2 zS(|Ayth9&W5?_F+4_5l5EeCU9zW7wZ1-iwSY3FG;42zd=A#e!x^8*ogAt8|4=F2?I zoG|R?^W(Jh=WbvzxZec7+e7uKm)Pv;4&&Mn39Du0nyr~9?CO(4=S?A0+8?(w zj*hI&%(6|7(HL^K4e1J;^FQnjcD7T_^bc?5?{8IHX9U+7o?r&Nx6H@ZmJ{H+^Drf4)7TRV(57-+}BBY--`doq!oH#%x!ZN!qS~^kIKeJU(oNv zYX!n)2D_eV?K3q|zUL3=Qx|rh4BNSn*wrhTm>7(CT3Ge2rR~#JVuz~4sS&o5!o~mO zv+SckOID>uv2C3q8+RdR>5C9gyXbDGFoijI5ZUGZz2c&dt!(;8zoSO8JU+AVmx{P= zxNeA2v}!3Z|5-g1^ZBS#fpe1EOHip3eb~7>S~hPl2VcW`h0DV11dclNOP*d_5RYr4 z<$4zBFQUbOtK1G0ZFRqWbJ6(fV44qx*Tbq0tV*y3$AEW(RQw|R5_i;gA*DE_=1po2 zJt2u?h@xDuaQ#5DYX3%u?V6V_@3LTth{a)e>hZcWb-h!iFy*S4z@fSkD(Qgss(-%7 zxtrtUulyhn^gS46}EXb;UA;r zKRS0M@-vHz8*=!4tSi>Y3MR&vJS(#v(-_LI9fLhpOT;w(gGUtw9IiU~*%J}JAbUZzWz7IXy9d2>QT*z9#rX3yDjdscuiJ9V=G z=GVG;kG-~LB`RIRTh9S%|K{Cp?Kj_R@@Gr?xj3^OyM>8Kr>A*<_?u#`K4-AkHJ8RtMUj9}n;;m9N*=2t{!Bl=DPI|{}5!Wc+@7er(wS1+;^raQKVeFz8 zH^*~Nv|+Xub&al>Eb|k(>Ar`r26+7vN@qtIuBna=u=p@=lZrpd4SWBB{zxI21nlsT zslDZTF6RSqK2pAj{`uvB>$xjA{Niv}za>{O8#7g$);amqwVTIcSQ z-QfCQx?t8S!H6?IzowOIq5Rf|^eIN}i+Fc=%IJR1F-iMW8lV*(7B+4pC}ySgX%EcG^NmxR@iK)Wa;}@H zMVIu--bCIkhxqKr0*}81p@v(#^?llgaXPb0Pw_9=QWjnxY&LRHTbqVTDs(BwruE>e zu*l;NOKY}X-io!g-!Pveo*kNhEH1!K*Zb5E+kGQnNfFLVQW0J(9*~$QC!fTY-poC+ zEgdn?{qjNc%+o4i#^|Q!w8EJvVrc6U_)MH{$S&^xQTLW%Rc>qlsM6g?NePk?(%s!4 zodP0=boZ1NX#wew?(Qxr38fn;>Fz!Qm#)3`x%Ru?|2gN=`M|o?bi$m^Gsd{@`xo~Z zPmx!PT{(eY3AQeA2Ml?MsaW^y*j?{RRQXyT3Hy|EV=9e_00Tuu*pSi9qmP#ZM1ym- zZ@bgR1h+W%Pqub1R|aElxjD=8e#9_$+WB~E%2=Feu6|p7$ z4NL5_{oH!(4!7Y`0v8=r;p+-3ooKxAU9}3tu?4hQ%wJhVU&meg;^}IP&9jQ!5WTcr znc1x20*Ln9F6zzdu|c1~-JU@~BLUROLM|mPce(!@+LoDHb-*m+ z_5L7izzM0PP{~tyiu?M9e0MAHAV7-w0ig{{#T>PEW8UACr>oxP?EYNAEn0ufC0Rk< z-)cbK3=urq8~gD(e4@om)4VVblV#%;;lNSjuJ&z!o9HA1U*gH;SOv0l!S5h%5%EAL z;WMl270w-pFjLiD>5eLbse3Lg-jg;J7PrY6hpj7S=ThODqi{oX+B=adH8PY~?uD#% z)1@00`7t#*S_j=4w(3@^#k+*wmQ#X;tN=m0(Qa zJga`U0VGYtuOM`W8v4^0>6!3wnXlntwS2dI$tV{yg9iC`*4eN76sN7DYb3h3CLw1F zB)_JPBef>dwfkr9P|l66s~oELrSvQ{-A%ZTS5oXJJze!C=bz&Q4MGe8Ew%i_Qzi-%VQqAiDz_e|~XWwnod5MofQH;*?)jy$dQf3)?vLt)x=u#sIpQMxgi zDAs#{Yoc208bw-w$hEsmuxmXVDU|!61$Hx|JA8D`KU$KO1X;DpQw znHFfA`+~O++K_s#TRYZbbpvPQ^VUU9VQQ1}=x&p4-p81QI zo>v{d7ck}x@nv=tPeol758O6m1(8+{BG)qKGoe2^Tm^>4H=jqUZt47s^iOJc10G*o?8q zwPhnpqBv-NJv!D+t8CGgWU%>2)aNVMV?8!_u#4GUgSP6pesQ)*th(#a@MzIv1sYd+ zY3-LDBa*KT5_igk9AjIyw=Ep6i}f13bX5i4d<-FEmuZ+qBj(BE;pjtM3$#(OhqrOQ z#mJ)3!FM8LMdAGr&wF=$ain(DO88JWGie8F$1b)av?VHa@G|dut{al`=z1AaD9U18 z_?-E5np@a>OaB#Kyr+>al1IU+>ztF zo*q(gyC{9NzxteYujQ_JWT021>DF#htGT%U7J)?0~_w;h|}m}Bjcyr4C8iM+M5yw}2X?tC&ykYUw7e&V5V!FDmyilD0f12sI3)~@pXY)^gL zp^H3fqST@h{`)-=ZoAAvtqLm2AsxvyBTp(;eS7Mb z=aBx9ug4XmGAvkpbg=*0f(2X#o~et_%}ou9SBKfAy57lWa#3DODbxvjv0lael5z@tb- zRMM=Dl+)lcJVdG>npF!vd@U1(x5*KaWSHGgD0hXEPM_oCl3Pd)hjGn4NmO^)Y4wJt zv(Rw1EG;G&x)qTc4Z@~I64zSPs#g!^b<^AAe2fw`c(gWjRpcR321+&L@^6$E#_gU@EuM$oE7WF*{*UG2Cuxf#|JsBG82vsh?jM^gQV z)TW#^{11^$!dvE#1_v~@fBVJnG)iy&p|SnjFD6L-o5oi8Qb)jB=8po11M@G{k46dc zx9W$1r25}P!GFB%2Nm;6Nxat#^Qm>g@aJokFyb-lzT9b)7|m4{1@arUb>l(6V*!uz zDt^Ja)0S7gSn9Notfws-wkNzFL;Y#UabdRa8E9oEeJ{;^9$yULGrxNO;@= z(USzR$9B0(I)+YdRLtRfy7=Md7=4RpOB>L)k`&$vUanJUl^OZpoaCz&yjpDcpWg6= zL;bkEZdL+W_)uBNwlUXGGn%g^8}t1=CdCR6V6{)2Pq(!;=9?OhH^*en#|vo_Ijuhd zDYD=Ug^9TjZwiYa{G2V0nQ8=U09*JU5R zj7Ui-_UfjAE;zMx^itmu)#z-a&bZbZyDPXR}D?iyyAxmj{bo&!0cHySw!) zy6k{ykc(%L5$aFkegTJqpEmf=XbF7Y>7jT^s(@#{euhPN7;yoAn||p_Z-<>}wHpqq znJ8+-PeA1|Ut7?auC}BPL?bS5=^B8k#8jNA2@CwHbtM`9Nol2yM9DlYZ zSVF5sI&eI@Du&5dxOn7n=c9p1BA(Gyhn3qMPU=k5wVe-HKV>>4{pDgXW93fjcH(kc z&#RKZ+86UYUko&F%AzMa13%`F)Y!#kK$9WcB{G_Vw`>!b5FJ zyBsc$H>NkTWMb?P>O@_6urcP5RNsA*9>r|No5%Hw*&I#f#I~r6#d<1ZCSUqIzAKya z9JQjYBQp_V;EfK(O3`WB#Y)1gR6j{LsH2U06R;kJbDo3bMK zT766NR6M(zmSSFAtaA zT);Iz40kADD969G|3K|TTRLCZu7cf%T590O&8@%La@-UAWe@pFq%9RUV%`SxUV;lp zP7s1c7!sRbL}VTBiRXNZR0)qu)bWy-PzYfTSQKO0taIR$ol*(hRg}*@>=65({RhE9 zU-sGx!2c1j$A5YI9?D`m{RN~R+hX(~2VOh(kCSqfuVDAdo0051zSbxUW+3`j31B$F ze~gOSx%l2I*gDNy$Zj#38`%LTQ2!E7H;L0vc>ct-erIOv{@z^XF#-@v(Qp^bUf<6G z4KD)jazki&B?yj90||F~$7g(XyMA#60Ex8dul=5gTo}6XBzDVbRm)u#hjk?_P*9X$ z=^CLXRbf(OwpD|eg^r2~o4o|bOAHUgS>8Fr-z7RfZ+1J$*A|5*M;fB(dw{Jr=kTC} zcs$2whkzsgx%+6L*8&osI<#Teq#@2~xRRiKPe#M#Nb*aHR|NWbAO{ra1wSVk48|1D zskYFnq7Bp1ZGZdzFi$n_;~`Ewzlr(nS&&$>uzrf}d=q>VcwfdS z#ek_d{|@mql0s7C36rM#*-p(uxeCHxsR1~Cu6opy>WR>>(A!9#SqC=m_+Do>w&cx{q}*e&Zd#1R?)-ej1qiW1#TJ?9DelWn~=^CJQ6tRLED& zOXrISe#Gz*7*^aK@FM15!e~wUq9Z}I`wG%9aWmv>cW$`EK#*1~Kf2O|MhL@Lie15&+}5XiA2z=F@%_RJVn4_k~s$LbHc}u=`cUR z`q0YwFcOv(17_=)RK>C&eZXn8IE~T4*7Faqlb{Mw9A0cZ) zsb9m0c{BB!+&+H#)b;3(&kIYg6pTZ=^fE6m4-IO#QG)IHb7lWFD1<)Xl1i(qf8r-5 zk#W&RP2jX<1ZCWb{@vNmj434au8e9FWF^B^fURs39${l=3_@=y74a4RnQJH-@GAGU zH`0N2x)|aK1Yi%<`y_j`pDrOLHfca{Gn^$my@2lh{_L7TX{N@yghR{@makxc$*3Z$ z$^EPx7W1#AAeD=(T1d*ymx-|DzxJG$cSiVS0)Osa^Hs5!xHxXE(3ga9iBQ5fp6Gl< z&~PX(k)Ql^1rbU(xuO9mk;lgltNdTKfbTms5*fgri*Uw1o>r_`)}GP~T(UgiW+e%D zYP-@d$|tkGRR@vHVbz{tcIe}nH+kK=U-;y1zmie6HiF^(@5O{9lJ-;2_k(#?2>tgO7s={CluE{ytu*5M*yK7T~LADyc*$m*!&~d{)OZJ5p4en&__%NrG-7_R&fFrM(*GS zShgykMPLb-U%o2`_Fow+whDqKaN?Q_fVUY7+rFi!>1~=GORu58Z=96)6bn*=Ud;q> zy58aWfpNSbq?zsQxZLIGP9oC{0Cp_4OJaEjEzRY$FS2{i79b_bXs3G%O!5hA_a5XM zU=b$qILcg|4R~Db)TlJMIi7GnKH5`A0|r<^(WeLzl&;v9#_R$BN=frm6GnC3!^pD1 zh2@-*S|W(=!PRcDAP*3bWPk_XUca++i4z93wE8vnunnFxm#7tFff(>}apGdIMhapx z@`?Bdu1NrF^&3vxPFMA=$_Ysaj`tP}_+xw{N-=Y}xw)|j2xv1TLhYs>ju-3E1Jtih zym4`~Hk=`eJ_U4nr%Ui6%V}pif5hY8uzO-qSlA~pc7c|+v`UDdg;1$>yK+EU$U9(U zWK?Jpa6c`KW-`zp9v;5t@Vfjkc22auP*Z=qZgaRIjWh~n)cf)2aFe?;`*%fY=}0(K zLMZ^U7Q)UPZ@o<`MbrFvOA3S-)=y2?1qi{ir;U{LmT8wsBm7aET!FU#U6QmHSU%e& zwt?`5Z|m;?x(c3?HDo~!q$@qATbrI1PN*u798Vic0v5xbjl>Tge^X>K^WNMzAFZ=D z<#t$)Sm;uGuNN{?Wj^+iPA$LZH-h~1$?iq=sS?QGL3RhLPQ91l{LDpn zqwCSDHXm467OFo4VLDCN&8w{gV)DxzVP|m zr`uDa-ZDtBLQNhQ<@HBcq@*QqaDIrh^^UT<#N^7g4I{vezITu}Jq8&|)v;+F`zpL9 zk?Wwn1Bg#VYLRRdmaa=M#CD>@;B4kRsP}0*;lp-fV^6k`xi+S&3SPZ>mAjY1=UOh8%rhpOwv_Y>@`nS0 z(G^Ba!~*3wS!zfJ!NA&o04796y;wI-Pk?6?{yRva&(-cy9+3N2h0;t&M^W_xZ$73w z&-Li%uOWgTB;LR$vVk@Nbp{RU*|$o|neoK{oKCjEv6p~Olsj&zt35KyFoSQv^Jx3#vY= zFPAhdbo=$kZ5ygs%2_;@7WLxm{cBu+tVz|6@ois)fY0Onn;|R1${3$*x0||4h0mN< z5+Xu0Kh>$0me%Rn55s_O!wjTzhm!c0py>1Wv5Lu0m79#+?KPdH9IDSZy1sBNy7p|W zIYJ+$hJh2K<#Wd<7=(G5ws{uJ)C`&x0wxWNQ7Jkd^naMhNl7W)48;dBVL-*~e69D? z3JrfxDBSt}If+WzN0FyWw$2myT!75xj4R2d3h41RsphGmk>jqv8+59uOc1KFUYIAx zc`|#rS0q$b|KNG@h8+5wg8^)QODSP$sS_fRWvlGc&;d4CC5oXFKIbBF|KQ;GV9nV1 z*6x`j0ROkMdXT~}=ch{K5@ob#hh`j=*@Jz!n8&Lwiu z7QEgUtx6f6a)lE~EBDl@VRBxk;QO+lZ`7YA^weJ=&FGuRY;!z_+I;_6o{cUTG-$tv zBKn7DKI+)Hyw1D1>`;pd5Ca%G@=P0yd?;KaRO6JXsI`&<*1faE-Dc|L%!Y%B%`->X ze6?GLV!_=oL6`lskpp6qQBcrh9%kOo zWo0y%z8-$@1G6)8;ej&Ly&IJsS!NLv^WL?~Ym0YBw% zJ$rfgdAqs|9{lq&%@@q3gO9_hlr-_fi>f==??6SohYI^iM(x{ljRUa<*d>dO-1a|1 zu#8*ZU7DU)e;;>BMk#vDVjo{2|!!|9%WaEG>rvuB^H)kr5-RHsQDTEULp0>~j zE;&a5rS(@{$;(a25HjtD-T0p9;U4X083XXx+bnaSqv+}NVeyb3=b%|Q4YkMMlxw{? zsfB^Jr9u7C3uC@a_!z$!A@OS-#uS9a);Zkka5(FCZP?GZ@y(t`5`bo+O`H0S2hOXd zw@`0QOYvtLk(0*ud_fV+M|Q6LnF>TY6%44cxpO~96NKj-JXDR=_%Kl|U5W@V{kVpVnd;Mv>e}=1aEX&j|5?!|$|$e9n)y4*NMJ z9NMN8EcjqcFc05%H?Mq|JJTWF+q#BshqlC-XUH_pNb-5mG6#x;$KG<}Q?ol_UME#o z$=f8vry4uHJM^VHU(G!-g`OHRD2Wn3>zBkAH4FeZholN1i$3#bKD!kJdLMw|V9jZ~ zdAoq=8Yg^?B%*;a2-P7PgGj!J-e@e*(gjEBH$kcho6nRugrTC;Y8)uvnxrKx_V8Yc z{6%Pf;i`W@s(&D^|445ZnUs8+5IcJ!DNKM)V)2_)U|^X;If5LmQfa1qg7LD0$8i&f z1L_2X&L+2`%Qv9Mg_;2Ekx?)ho@&`}}&dBnV8kbrfl`3R3eV(`6hQ+&=JMYPfaZe;1;!7zN#`wk9hDS+C?)s@~V5) zk;SBshH348BseEQ&HzgS7ifhI)ipdc6dZgYP~mmsR!#OBrXq@a^8nElJasb9jo<6q zg@D(okl*vZ<`IjqKYc2W*bnOF^a#1Y+tFO|`}WFMCIcA{k4B5h(zeAbol3LMjj45Y zbu2bNgieU&9~kQ9C=l0yFKA|aZ;oKL(nc_pDi{lvhZMjpx^6H3NY^l$X^&`CI@?rU zydZ|jbPY8#GD=7Cg~f;li8iXR@R>UgU-W(@A)EEQE{FB}w)%s;nVO+n!aHO6T+TxM zChZ^-(|hU|P5UA#`%7nM?olg`Dm^;=?>UWlfCOIUYo&=aexgwpxdApkC9r-R&iNX1 zf!=&NA=ND*QU8na@U3Hlk}9KAoB zWCR4_7&h(my*4%FMUbn2Kbdo0h{?^(eTOtUlA|aK@ZJiTDTR@;>?(ktv=?9%x86O3 zp7i;x6ls8gvs@0AHXBg4hO>e@*7g%Yd$B?bbRw5w@-rv=E>@MJ6w*JVO@^pS@8PQO zh9)8+f(*3b7zUI5W`6BtN&_T=Hqa!>+q<%V%#43{5r6uZF+~0oNBT!VBee(-16yl* zwyr`cc?3jIriech%gfdWCNtHR#>iBe7^OCgBJM54z&=3sn@BB%8WLmDC{AiT=pveZ z7J1&}S?Y-?;=TD1=#pQ7>zM^6ceuuS!DE9-zcB*%L^3y*Co%HzEaJ^~x9&R*rI0(X zH^Z4hVq#)aKvh@)9>jEu^-q9>V*s2kXaR7`8LG;0YuuvB566hP8HT9fVB=TL_#Q_I z>ZE3diNEy^K!}H`3_T(9>hUPPA(d_1OARPUruNr!*&9}VAU60K#B8R0cdju zKZjcf>Nj6E&yn#MrGTQWdUtP4bYIXv14;F3!#(9l*jNBk5*<9bA%&8?ogF0$iwdCJ ztCi4&dJXDu=p=3>uw#ryP~je`|0q<-08P1u1DEev=WeX0B+084b+!2gjH3e zvFdPgDGOopf0-Ii4^YzR)e8Z)ASUrE+Q>#HWRudHY`XDe1-gUN)I|q5Fo9HO_1GJs z1KNyR9kRjW5k`=;)7*FjK+e9;Ynl84+QjH(A8Z@ci?mg;WN-;U3+!x@y9V#VJ$>M}4hPasIqVX8CGp%&j$6FLG1l>>NKy}WX z_Q`3yIi2Z~eeCRkPZN8Amq+VW{OC_M45%&0ln?)0Ea`ui&3<>KElcj>iw>4DZ2 z9+D_ozd0zs<*v@o9?-E~b!5qYTmO|5=6|P4dcWNd78aIKXD~Ec_pQNXO16Wb{a&pE z#1#|pIZz3_dF~}LK?FpXclUl5$UdWtq{)ZAW_0R>arqF%cM*2W=}uk--AH-Dc;pE8oo3F9e91zeeF>oD zxqd+{Bvr+>O9cdq3d3Ps1aF|-Y#k?H$CCh7xs=f-?`^wfR#i5MW|2b8;DNIW0CFOm_WU&IfP`bUOE%b`p~<)yHnua zr6J+#-#^~`6mE4vu?^bK3P@H7(z7k5$~W&oZR)Vo%O3*#(}M!(dW$xkv#{ z4X$WT&-h2J^InSfGAr?8ppZtZJkxjL3JA&h zj5nSjEV2L;@jd-u_6~$PT#-IGlyV@3Y_8(5;Xhf^{LKF|)>Qt#u%;YdfqGs6rgMSW zxwBVE4xG2ztBM+F;6H0XJvj#&6A$siqA-JAePx1b{gVW@{(-OX85i@}+T#*OTm3$)87<_8kF(uYGJ zlbC=8t8#~pVUHVYV8(!F4;6xP1l#OcM?_jyO$_xY#T7rD9YZDLZb1KyNV`fJVH91V z=mUhvIDYr)jtAy3VGZ52^zR$E-q&>}_y9)a!sgxH?qX3zTzruOG=0BxA^$aOpFuU3 z#If`BT^A1${aDb2P4hfpB96^)oHRJWi83kfrrrqlIm{AuF_>u6(okcrlMdXg&fCScDSaCM)~$JsiHGr@Xcv zMt{N*-=A^)gWtXeQH!jVaRl7>i*}~H zOF5V2kkj{e?Q2QNIR!xa!<{_M;uU1?5_MCO)tYr8Yshl_I|3n0dR zC?^(xMx4)+WX02}$6bitK27ipj&l#n^yDfH7*Lz-zsCW`Psou|z)+7sq`x!_agPYD zEt3`0FZ74O%(~kTv@;}7an09y8Jm9|wf>%kQJmL{s!6pB?|3S4_S8GSx;xUn2$i8A>d`C7t+`f$A2$f5D*$X-jPnN)E z+A-k@7mIZjnz3u4rkIIFhRd`rp%IdNpJI)b9yYWw=ki!ErL^ zXZ`6;8vac9YHzYEV^e3cr#oKBZcJdZ8EU4vuuBq26>A)deYCCJ!|yrHYrts$AZol_ zfyI_t=8nHdSg_{r-|>FaM^b>ot*(F1KwD^WKeM{;REefjlesTWfEyiLc1E_GfJP{};Ly;M%fGJ;_L&k$ z>Wu%aZB;q<`*yNKbF(uuX}rP4GZ}ZDPE)Wy;2s^`ca{W&hsOfi#^nLIhm62i{g{|Y z54!bKTNY{mL4zn67#IwA{xX9G4t~1`B0gmQuiYPPBO@bKfzq(im_RlF2(#tlmrnlq zx&No`4nBQO#W;za1S!hb0(@Bj6FZzg=CDctzQ(_n1mZ`bfd)9-M8bI3`@hWsI;;xVHFcu- z36DvCa%55bOSbgn7d#OMAXZ;+JOSw}s`1}lpfTVe#gz`?^1>_=6tC z8v@iAl0oVV?QfKnlv02%O+NYkP9`&G$p~bfeJAMviu&Jn&_9^WzlhF1n9P5Sw-WFF zAJ7{>GlxHm!m~>Qu2Eg6UDa2z(F}U3plMYyr35-M$5WR}7y+vO?G` z6jA|Qkd{^_4m9vgCrF7EQuw63wS}H(m5bFo?-f&B($dlnrwKy`fs8P7puVAg6!`Lt z6lrw-p2Q@oU6spFQ)a^cVlcW2FVzb*4I!btdBsLW!z*!Pa zM)$M7I9xRW$IhKrzC;+EXaYL^g8I(akyA-2O~g?^bqn@=&d*)gneR`@=vcP8kUYKnb&DsNdz&92a;uM7i5C{;43Z2c=v9P zezGXoI=KpnHwoe>kiv467UNk>^Br69mu-nbhW;S=7gQ%9G0-3xg++cO1={EDn|?jd zR(hjMHb;TejysVApnm=YXlRHnGwu!u5hCWWi0dQugW(ebDd{87zszGnaTjL0?;h5J z@ISP~dP}5S97QFs(vD8@w2}hy7%b@eBlv<_T$+D0gSjOIKRm1iK2MBbrE;Y&``d9C z`LyQ29a+=sYIB47o$z~o9IzId%6l%0nsRUPm}&p9c+!F~d_k*3Zi7vVLYj?fFTPp( z^LvS0Da}m=q@ieL79uLWTb$guN<$ww#ncJ}T!Z1iiOXP3^#V57UAxO6Hy$IzPURk_ zN`$TRUSOp=>X&r>cuyt`fSre^OfhX8f#}2>BO>|(*v^Hf{+#raJKgc`TC1>6Qet9E zAm}IPiX~PT>z@SM^-J`dHkDJz&HFwv6x>39)$EOTkR9 zz>d_@3C)c6i6^e!vClyh+v>tEi|519+FU2G1$i9Y)|j$E8l%=Fg$I zlkQCy4d9#LBnps+zZNC3d#d!}#fvPlAS~bx48n;0X^7x=sVgN2re0kRKVAF)c9!wD zGz}&5=4=idbn9eo4U!gKYNWkG5F-|O_F14TK8#=m&kQWgpPoS~feLgkk{ z6ms=}AYtXhrNgoy0Jc-LU3xe!#vs)=GX4?DPdCOncYKjzP?`%6=! zMesIf7ucC^(h1@!^zRHHoE&=`#SO_?E`!sQ@Fo^IxK{C-cC8O)8dtz&&}LhxwQ%&} zAyG}fu4}kmPa)-_pdq~{B!nh@`vQFCP?i~h#`i_NI>n(V(X@jqkzDPIIf}6^Wo{QN zdtD4b>gm~HOnbKcd$D$fJcJI8|HwxQ_rypJH0v5`ue=JD9h(>CuG{kOV37Mg-A=dT z_dNMN!tAsF3CG;ZFVy3=lk>IaG>f&xVWQb#7!gs+n{e}`p+Gwh66>!#gryHTgz`4$ zqmBYp0JK?P+DKwLry{c=7znQ;wQIdpR#vuX^TUDqLCku|&he6>@z#Y-$#cphAi@U< z6J-*nKOWaFHtvt~`&TdfzaZ1!XIuRFg?ke4uebk!sQwq}_&)+JlB2tavZ$~fN-MM} z;CPS!FDFB>{yG^-Q%_1&7)QWa55mG(qsz+TIN(J?`=OPLrhG;{J#UM#NSso(#pl%c z>1dSr-31Pg*bkj19DYfBepq3CX(i#OA8}5Ul$0?#cX*whCU$niOm^0l23XGen@o4P zO`Gk15|t$O2ZSyL!YqaqD>^PM!p$N2Ce^tcGRE?3K?3a9B z4FcEGM}xM6RpAUWa${uZjw+rHUaKwDWei4ZjGRB);tGtrd;68e#@vND2d@c+T(#qt z-vzn-B|o2qXnd16Bq-ssp9sN;DZM1_8lE}i%?t4^+ZOOcFTv6zJK#}gUe1S7*Y_+U zztYHWYB$6(*_CoIDTUybqQS+h@5m$v=aD)Nu`WEH4#$y-QCJ2ZVZqcBc)QaQk8HQi zd0mHPM&zEYRZu5LF-4FK8|bA7`=8$=$+Z}6xj)pwwU~H$$IvFRB^mB^i}C5MGatPy ztUV=LlB7}BL?JT2atROC;kxXJLN_cT&rf;Wkngr_5T4hy=kD(}&KGsljXoTy!EeS`?bViksZXK1jUdA*fWbVl(GEV)Ssbd-Tyaf(VcCmsG zrV_~k3&xsH5`tp0(5}N--Gs;Mh*tfI0Q8S51bQ8>kA}46FvQ%E7)W*<*gN7hhnXp^ zzW%Jc8dH$nr#7;J*{Ak8QZ)5suZ*Q<5cRSx7b@YO!I$ai= zMo2{c=cuFqbXXmDEbaq)69pK+PRGBznzr53N6bwcGT5p7QuUGKJ_hWSu09S?y}j?*?~h+eemb=v;OTqnb}3FZV-Y;=I3I_IzI|Th%;K zdbJwg2HH>cr<+O7JdCFa(~94ryjo!}NYL_Qif7g@@^eruzOhW>^maCUrSg5qi<=4M zmMG)(#{m6i8iN?*js++pMU|;k{bp}3T1w?0L?k95PLnpao6?W`>(=Jg=*DqQ>u~ax zIBq@~6<)RpLs+S}8N^Mc-Eh}RGH7BhRhWx}AAZ!t;3RSgz_>}C!3Mz%%k=ti(lNfD zr!YR38I42SQFwn-^A&~*$5!wf8)`)T{99E-N+*4Ep3Guh=CT*_uM$ zbJN6bbOmfO#RYI;uZqz%@^UjNka7jEr9I*!u1%`w-&pS?XqMTe@~C8sh{^aU9S`eUq|N+q;u6@ryp%K}lCK=o8&3BJZ(w z`=5#5+Evg74Mz+J)GXdT9Qvt`(i95&gK_Cggmd{Iy5&~0-|?RFqyW89rX5X&|D2Ob zXQnLeH@Ko#9(Q=h=erW&VG2l+^gksg>!~Xk=prKTyr1kN` z(bsKPrb-lyIePd}FF$n%(4tT1Tog_OZwOsNp}xN3{&p=~_)+faleZH8hx2V^Uvo@R zH0xD3*4*{h%eiGyPGil3-5VvttJlc$ng{63DHyO`VqEzT1ykAQo5CZ11j0TvAkvk? z;UBk)3&(v#_2K1Bb^=RfhaB$*BC;%BaIW?j56yv49KVcdVF3w-bn3w{pPwr*6j=7Y zm6udaj64jfYkb~`HVBmr=wlB#cI)`ll=MD8JhTTu6LrMe!^Gr_b)J0h>rmN*{RU&ChMG(4*v#ws^88eo8Ikk;Y3~V`3yJl^C`5UTWl^5Z*WC--8QmNQs(> zchG5Cwb!h=bDn&8ih>Vc6UO#Z;e3WIcxqg$aY$Ac>+*r0OxuxzO-UOy8m6&uUg;#V z^kzThT4h-v`?6-F*>HHrx9_=Zw(kv$+vBGy6(aLqLm}t;s(rkvh8Y*sW0^tIm(6K? z)Zn-CX{BteJfbK1YaOJlwsqY%h*Kx5#%pt!dT8JB)+EgR`-)0KtzChzvzwLXaUM5( zW;o^-zYto%$3plA#J$`zH!N#-x8s~T*M)lmW4CbkiI+Nz@Jclq#GL57B)kM5wPcp6udhIx7`^QxfA2I{-!|PTz!+l?w$Ob=bG;(HfHda9XBhL zV<`H;R``CDvE{m`@ARDNW@^w$WEi&M?AV*CzH2w#F7PCY&M{uDn9_3%J1 z9{+Jy!oXDGspC7gl$EAcZ9ypc;<-#ClC_GT^YcFAq@CwfGYoB9Q_eiqaS30gJD;p|J&T+g1MC!R~2TER*+z_G_-p2+Qi=B zexjSy7Oe7_@mm&N#LdgTAwUSNeYbwX$cL`9=*v#)|841eje#K#|J3t%L?TYhBhTww z;hEL1WuGdb9kki#Bsy)sqo~f~h^Rfkte6=TJuY|C9@h=Rsx*x4?QhOGUSpB)%+c(q z`X+Zk$i~Y3R$ECt>WrPH<95fCVq|So;(@rS*;MO+&y3nOlqyFPU2WN%=@YK%Z$Y0s zpT6x=S!uPxkjNez**5=-gY~nziB}Icx+(hTQ(_JNVncl~xe)pJY?AhSOluw5LuCws z+;#$18>=E-OL(^k&SSFc_n+o;4EAvGRE+K8d5ZFP%`n+Z9-yBDYF2Vfe+xt1K`Sof zUiy5Ev0bm6m3wJ*Tts{O`dz(-FHR1gf>-c9{zXBLytRFIXBE0*ciU4fuCU$dp=t-& z+*p6i0~IFnk?uO?K~ z#LPE9U{xD3*1xj}>msIQ?gniZ?INoN?!mK&+NcMJ<#v=#kwQ>XNjhF@KzbCsIPU0Q zv??W?Ou1SSTk*$6Ysfa8+Fj}Gjn!a+zwFIXyc<(&JecG-$XksMCUENT-l!wLUj1Rt z$rU;%z^!$@n->Vh%jNhT1wQAq>*hdNqON0tm8VQ9E-_*|Z_epzrS0V=1_WVCUv9cs zH@J99FrGuf!17|fdiP5v0|vY2#bkl|L0~IE2!Gn8MVN?t5gzH|8PB_wSA+paBa8c| zr=MD4T!&Io#5;yn4p#U_ICJu?g{S5+(8MZ1l_QIet5|Uq zkk1Ry7h0t+hY}~w>{f?11%fN}$YVBUj;2cpsuT?NT<6ORR(zzU-Z(!MRtosOr@A#W z{IjN+*hp|}_L-&ClWtv=*~C>$)af8mv*)dxVk@ySVhETxx@4#sBVW6`)m*j&U5_q@ zla>hTtt~V-NhYl@o}8tywDmig+drIsgunpw>~x{&*Q(vr?MhO%j_b>HYk{(Gpl;WA&=EaO;H z$<3PvMLIEy`=N3ZY3+5dodvNw^2CR83``72obduxPJ}2EuU?&K0;p4M49f>xj)5`4 zeO(Ghb)QP2-HC>X`k^phDQQ}JCDgk)_8*y&Zq9|#x%uqjaahB?mC_);*ZZIP`^yd)>r!Ku1~beLUVO5T?LkG_YaC~6 z=B}}OJM6{W#>focU$Qq4(J*Xe6-b4m#ECE;YbNGf+{Vydbtyr(n{K~${`R;#*e)S! zdURdI2G7r>8n>-6kJxVQ9Inm`Y61t_qG(aU&3VzEBn$TJ`Y6>dcBqbN|J5Q{OKGe) zUgh|VVI)>}_xC5qJyND<>z<#c?BsNaf=Q-I@ zS1nQeXZvK8h=}R0{qkv_#3;*|hZ{*dXX9(B>FxGjDPD(k%6YJ*PX9a{TVB|x2~%kG z#yCecvVx4PM-qIb4wthE@mQ)HA@yBPuOZXk>qwPtA8N`A?p=tz+k@~9wkJpIk$J2P zy`8DD)oMY+`z+afMq;($#uyeYz{65o#jsS1KxOvKlDnFi`i&%dL>a*)+`G_Oj0Xb` zxKCju*1jcn%fBy26C$+|M%wOW(`B*RZgbb7RC@kyd>>ywTJ<3? z6`8T460!0of4E?3qc0te{;7Y6TP z3oF&xHJOWC|77CHYdRWzj&I}OXs@Y2MoSNhYq-h2Fchr-VOR1D`LI7eo>#Uiwq%s_ zloJMPeNe}vNwNko`k%<~z(z>yEx!;OICW}$iW z`GBZF{1@xU^qsN*Rmg#=dU+iO-jCx0YdF1m-t(54fJhdoKEr36fIT9W4i<9T#ABm0 zw4Q%>d2(X)`8YBcGi6xBojMCEU~D|%6a5M33}`dy&*&@AOiQp*Zmhnst%;ZnM(VUS zV7>NQLK%OFzdH$H8tmKZ_i_?U#B*cFK&eQ<*C3q=Aqzj{#+J<92M4@?l^f-||)`NPt2#CC+Tqn4e-1vFua7_H2 z)^Ac^Ho>_ZP4=wU#egtJ;X)r%O;>{|y5G*IU++II&uO<+E1ktyTTB?q zhjjJN!IsyokqbtLzNs$(`kopH9RxMF+r6~`i|0B4>AhHf+M#_#eq98ZvJ>tBtHA;A zQ1jz#!H(jL_}BVJG_5H-DO!!lxY6vSw?Sfzo_X=%0P|CmF^sBKE4EsRr$(Mh%5P;( zbIZ_mTW!@0wB`1sUX!{5mG4kXa)}(L7GT4cn<|OR3)TnBj1NtC)oDeJGb-I9u)evP z=VbJmsoF)Cr6ZV#vGZVXw6Yg4I5f9yBrG1Tenr*~M{RRAyP##wv+3bOC9D0v9L?&3 zEhe+HaxgKuG~>D&PNNA%mf!=9^>UnS z6NdQCkFV%w-cpgl!q9O$k@!@EIJ2)fG+i!V9dBED#@DzGOy^jh!NEwrEd)9UKI|3- z((!$O;90x$JnLU{?W-5_<$_hBH=mWTiCYq1qRCGxL?qK7wGicJln|apt(Jk755Bev zJ*7_(*+{pzRC!}wIJI>}XVg^X3KyLE^`WS3B;J}OS_T9WPJAS1@lnX_&$~9ZO#rV? z70zY?q?1k3TOd3c_$z5kS_LQ|q{P+{=Lo6;Ajy&DpfB*Vrl=nM9I zTP?Lku7#^6RBA7U|u+6#rd^vq>EiQ>L1r3PnAf)%zkq>3o(=>sGC+TFC%6JlRN zBvlS*GvLR<;StXE>4+W$k=zTk>CCen88|Y|1il*P?)uhK^2=3d+LML;+!rgcH%u-@4M${?#^H+F`sb z$t&fC0xO}-D8Bg~yZmA8NKw67IDa`tDHt;xgjau_#940}hiCSD8{@6UcA6t%Sc*$% z&(F${xO@?JICaptY{mmlTn+b|-$vKf)VECX>!L9QN%c6QNZQGA~ zgyK@nOMG&o!iluBJpQpgd4chyeqI9t{@MDEflu%JGslSuS`LpaCB>tV(D|xdDQ>>E zH)|Wp3bqW<<$B7K!HNl;6Q|$iu9SQ=Xp-6raBU4|hQwK8&lO|Jwx+H|^otEi&AS-& z&t<^O=t?0`v9uUy-7g)bI$_KT@p}FzwL)Qvpb*KE;BCUc-elwxT(1xISzTN=ee?-u zu*IukyYD(H>`hle8>JykS78uc$?&@gPQ@x%LANtOx|LSBL6hY$YSJXp5|yi4V|8QK zG1*AhaFjb<+L-m-g4Knsml+3Bg=KijICd^Xv$F`l% zNAfjbJ@_>}>f&RoQV*`%Xyeh*QwupSQ|M7GfH@Y#dIRfx`%(h#~yCy_8^93aX7w-524WfBeRfrw?n9fJumAkgWN@04;D3}k5Y5`qHFGG~OEsDpSXY>9J;vM&94 zt|*@JQ;lP#KKGbS*P_LOpG;(pm&wbXE%jp;zPY&mzO^~;z>2kLAqVr{IhbVewt9;S z{cM4b^>Jfuf67n?UZe;`Zj2C^4QI)T*}w=C(&mtWBBz!Y&1$s{sE5J$0mC39M$RZBPLU%VlNzFA0%6jL+ z|9=o15cjy3=(M;#jo>si_j9@cG&keJ#0=yAgEkP|mEA+LFz17E&4P;FMeu`)(9?`f z)Bb~`|AVX{rOP{o=Jzk2y#KA=uz{lgpO^eEa*#Z6Qw+(vFIgiPN*I(MWmGKXP?Zi< zsHt%B>a-$!*i_xRn|*Hn))c;#yuX}$of6$ z|3z27ZfLd+Z^e9{McRd$Ks(fou3!P!$|oi%9Bi%!uoINFfdNbsTPaT*3Y^oFj<&G> zp=fIPIb?4%8>G>l=h)#+7eREecJvG5n)F_4u=aOp{Qn{kl^PG$cX8*W$xZ}EON(Z4 zurl-#Gk_R zTKqxp{_WwcUKbcHl!arZlI`UKLp5yudtUkQ{d>^ij8s$q&}Y$qQ1jox!p=*?*PEIb zk#aodThq}20CwO5=om)6DFC-_^8bsjp<=GhmPZ)kl&vyHoFguliwG_E(3Zotxx@9OS!wpORIMfn{LF;aW?5+}NaycwwTMt`(bp-MQYWp^2qymS;2|>|_@~i- z%Iy3({(togt^EwDeQl#NQVH+um>^$_wjR}-%AI#MEQJ1Ft)>HB|5)e$=(wG>r`=Ul z40YMKCau>TtQ@^!s~wtNbyAl(U=doGQPqpA#{CZ`509oQx4cVzFIT|gXN~Z`iT_Ca zGp7HDbyBKobsQUvn-PHXwOi@2P+l(sZWu2L{d8rz)M^T-+x75WuSkO^C+RB-tuZI4 zNE>n1^*D(fZVLVL<4+rtHB6oe-8_)qhFVOwX?&%;v-Ma*Tyj01{-MI%%$k}7ad^=9 zJ2PtIyZIo7g1OX3-2a^_(awY=!N3Or4az)PY(pcFXTR zTnjfmm)Vk$$9^Qzx5hpHnffm7L#8uVyd{2%?n(gWE(!-$v>_#9uq1(49d+_s2v(++ zJ2gm1FQH@$hyBG50Gk+UIDXq@fQ%BX)3i{fD8L_}#XJ~Rn-dgh2TlOD6)+X4M|tA? zrO|A-x)ZMUWZD2wx_h(^3p%7So!bZWSZAW6+UhDZntGiG4z%~KmC|&yvzH&>FPwfY zesf8OMqVHdL}v8td!f`)tNW@etj?0Qo$K@|R8@GPW-?T3mF0-jPFX>ct=6$qVaVx^ z--gsRj^ddtlf@&-bCNrr`A$YxO!H*HXx<9XA+!wh@+%pJO&kfPS5}2a{mwIe*)71+ zHPwa1c`F~gWAq3_R-~;;@)BvsVOkjQ8Kr5{#{KiFjD#XC<@+n0vQx3_!9I5`nj%sA zK#4s6p01(XOp+FG3#TwqJHbtQDSUwkDe zPGy~bTc9Z-`!0bE#6rWi3k?A%3^l4*^r; z>;1*$Yc>mLJ>sBDA*u`|3Pz)>X@t3|U_^2f0*1D9ctp>6{%n}J*qv#yYLhuM$hgaN zf75WXeIhoByiNs+^y>kut1xYT_k`pRMVpT+h~Lh-tuI@s8bP;qrgyC%7v(+AU#O(s zP3=~!I;wPcoZR6+g$Y0{TL5m+B!^-CV(KW@;*8T*o-P-;kxd}jR#X*C-=6)WXYVN1 zBh9^|4fie-+h|K1hveobwh!{I_Y^|!HZ)yWcE4dcH1Zu=(>u_g>Xf)9u?OPYJ~5Yl zZ(p?o&x;&*GC{GUNh`)3u6fOuCeGc96P67s`)xM9Kxs0^aO_~sc)I>z)*IlckXY^j zpC^95dStYb_4F-E)Y0%uAWlETRc|n6PIsRi&AUc|QJr?j^XEYDSvtgBBZ3o1#`7-4 z^3K-AesVNdT{Nv}5)MEP@G*pyW!NKQ=Nen;98ZYg-0}1nFN3TT%$ovW=hd#`E$$mQ$EBrwV3>@?SapgD4u_?u z-3lZBCE%-{Qlu-A9U3H%nnGNc$3>010MYnMxNd*bwab29uG)B(Y z;gh6H?n=$W(FeWQ=3-^a&XI8a?Tk*%6?`RI@E(ZQoC!+*nF=Vhi0psbE*n9Yrdw(h=qe?6M_0Efl{{LVz0FEVv}7 z6wD-H7LLoHbH8%vEfPCXtb+h*5-)o!4}UErn={kHCy~+%Y0CP)YbBb);iSRn5SOTb zlk6+GAliV(sp3|(Ujd}Mt#BABmCRR7Ld|=-+#lItP&BO zY}grWr(aG=D6F4EveJiDKJCLW6ysTE1jJs)-G&R98?$^uZ4xd!qKTEwb}Qa2{$*LF zTcOd!+kC`6HdqI>qN6vmxC5dNz7Z;|{H?t>jwoH@HX&MV?2fej6=aLw13N<5!BEtK z8p&TEUhz8AMAn_dFQ)1gxeGev{5vkc!Rp+uQA-4k`*IZ%VYC{bd@h9hkV;F>C^KL1mZnE>}X|rhX^*C(S0QwJM883TWdEj9BrW}`3 zM~q((qQJ$VPoeHswn#RBSF$tr;?SL3^kLHaG2#*WS54fgiPIIhyAy*|a|iXy=rYCEXe<{0*fS(bK!v}Q}?~14_yU{1Q zGWd^G^83f#dl_dqux~vl>J*h8nWChn@PRh7#mOW-KU+3*uEx{PO4H!Ez?G-9MeH zqT05Y?`n!GFj52%X5n|XQD4}6V=lBDk8VI6CK<$N(cTjk0b7nAtg^>glI)-;G8sa? zafk2>=d_%LIFe4^a%n=R@l_B+Sm5*3i}*lDh?V#bYby%NcM#;@P1cSeI(%h}&2Ep^ zT*t)yRkU>(j|A=57$*pU<0oKx+FH$RNR7@cWh&9WSh-(P?q!FyjHHpq7KMUzMD^B* zHf%@SvFM;PONNGjM2V^+~6oNU+#?YhTyP6<}* zC1&Dwxv5_#Qt&0D_c^>g(%k~x$u4eo;F&W6W3Mi~QSSbU>{Ehf;r`_*7f(HaRJSRd zr^nY-05wI^B2pR%x!9)>VL?k}k?16j+x4;cn3cur5|b(g3?4n&CY7BLm82^pM+Y-Y zv~!|f`}{&PmO)$`V}x++6=q_nlFOXlp^^y_{tu4Bu#2Yr`zNsuqWDw7lRz z)lu=g(T^X8B?q&`2Kyz8;U^MH)mspoLh`!>EUig^E>%XD^?}<+tH`Ht_SdTv%JhQ6 z>BZp4%(OO6*|ph-*Dd#QuMhC{Jedx8zvuMlOBUKlSMSCu)(48A4Cj;!LSUE@JJl|+ zgsa-2#CTT-nc`nR)u!=S!}bvWh2&TRZu42)1NgwO3#z1R|L0n7m-1W#R?uXj+Kw2a z@)n`K#LXxceYZHua^%`&*TPl^0UH(wvTFO341ny4 zj4u4d+{wrI1X--?)UI9d-@ z(Z6XnC(PBS*vZd@+eB9;8^Q!xFKFRp+a!bgc6USs)4#w0n>!$l=491j$6C?C*wI8X zD%#{JI_f?+T1(1FCI4{sHysG64_SnHc`wH6>uM58z(s{5DOjniqtg-rmCnf#2B0Aq zYF-tN0nK7)A-|y+ZhH3y3b z!L=WLT~sicay-UVbDErdYG}c?6tKiEAse^eh>vMGSqY?cA{mrfw()W}&{TRWi~-pY zmkvf3gO3T%$7wDJBL)dmYuQ)IGQre$Ar6c#)r3KZ;QrMOdC(!5xsCvI3*Lc*7KV@; zhUC7Eq)^Cvz(Pb~&jq7gahI`-I`^oryLZW9+KFGWv(PQY4K;#sCAd9~*k2+Qo;Mgg z>|ypGf6yoK#fE5Qrm(t2io`~ zfLmi?gfGuDj3yenGAH*^1O~h`DKjPUWA%|{BCN`Ee4xSzwm%+e``73YXEYcCEk&NW z7@?A~lOQ9Hw!4sR(%*f69Q)YESJz+nNW`^_=lvCM^*kQUJg?%gnZ6k0FbB-qXbC7- zHe`r`%o9~~?e@sd#JrpNg6(zaW%x+cgnY~x)u$K%%o87U_YTNMq`VfzuJO(4N1{p$ z<$6s_yrUhcu1Xwg682nACIc66^}KM)Uk9YpRz^O^TQiJ|e}QN#s8Rs}^2pvKYEm$g z_HWBUj8#+g+**Q&c?m094%E53B}NSkV(&;!Bbe+4%Khyo05Sg~(eoqGXd@X-K3o%{ zK00=UqYwwsXC}Alw||?G@~QW9yt{_W&Rc9>zSz`SI>=CMaT;3kD0~D)8$w;M=5uJr zA5x5OqPKoHg_`?p)^F6zoE5h!VY5$sn_}NYcrhK5PWYF* z#GWWQdC@>As!l0NqIJU=lBl&~2Zz#c;TTcO9y~lp4U!0K%DwA=e+pc)0!03*^Jkz) zx^OK4SKo*@CS~JE-8%7O28+^f0C~rcj1Rm#^GAT>9UTAtwLI&eEF7Ey?p^YE9io^N z3{C>ZK{e*Tbzoe`Fe5slt-5_q+XZB)gAjJ)@3>f+|Bkt5GUZ!x5BrdFnIk@a5I7v>EE0&)KX)5?fRKigk z)2h8=0x#@Z1C8xKllEW+rViT?h6TftPfaheGVA4&wtHXMTEnRq)6pgJT!#QsoD}}K zw|4WnSOGUWJ43497AFHXILQR;W8j_y_DI@B#GBT51txe&_JLX@rOS!8n{J!u{cLcW zxOvtZ%?!!$uG&x zc_?kUiAZ-Bp^i?HOF@TY^i2rCRi=Lb0#H%6Uk9Pe{vb>U3oGY2C!> zaJ1VbHQy^LKNntEhOYW4=z7>fk>{el{m`>{^xjl{~l4(!X$Tyo3n$gve` zdWChIkcPWT*%f6>511Uq0zuPP=AfpEa$+OO@k*OU{JXm`d(S|X1?qbIktRUP^2mpc z$AApuYT_sC3p&Dkcb0cotqT-w#l@$=ugvJ)v2->FOP4zSoIf^*C*||GXhbP;TQ~dU;5+^iXI# zRa9c#8V+`kcZ;u*MFmpgtcr6Vd$gA}=&}5@wtSMwkhr&DEk;hNd2rLA)dFbe5B!|8 zG%4l`iyKnRj~{(xoanss{l!D)?t@9r%yyT{EXmM$AWqxh@NYR~4zy%h=hvuK?XG|^ zeXG;?P#z(}iu7WJC;=;dZ^7*~+S9ZbwS`)83lm~c&cYjcHQ=Guu>v8ruk2ZEI2??; z6CYff_whQ*2IXx6P`-B=5+Q1;_3F!l$`6&g(moSm`oF=-tH&nBfLSQD5@1F*QU%J()6ZNVIt-_nf4j!i~D)t=2`9vmR%KE|Ri<>Uk%=xcJ`d%MUu8 zWNFPih{h~(w6}2INRJeIICfzb!OA$N78JJ{1-h>t@>8tiae$wz21Vi+sQfd@>F5&D_d| zRf??!<=Uz=68u^bSGiA4P*Yos-aF{7?{?jjMMzIgje>~VuEE}=$jbztQ}c2@+43}W zeH@dbhc2e=*0P&^d6|LAh!ygich4-lD;xmjTP^cL0FfwZ2M^4JKr3)?-j3UxxpX zn6z-Cm)Z|S;vktsN2V0@Z3d zO5J*@cV}YM+l^`W!VOHuUdG#qSC#|S%Wag8rIcr6NfpG0ltZ?oR1atoGliSmRz?#o zoWe7$)T0!*TLz>SJ&x<{Uz|e`6Q`*xol8Hi;XFa z-7b_A9^lIf{5^Hd^L#aO&_1n2!&ha+S9R=62Pn583g?!!4I*o4eovh1dCjOC<20H9 zObc!OP)zso=FBC%2P)#GXNyXEqSc{${9ejoH=a5wr2E|OV;aG3`+26)*8ClHwLCZmoZ}D) zLbZ0$Ao&wLP~occd~?W;bUu9&4TOSVISLq;#}_91LUuGV){GE5MIwQw=2z_#KZsig zyBp_02G3sC(-n?`0RTmGD;^Nt4RH`vbSS3)-MB#%Nabg=nqppL$zP&`<#H3b(5ZaH zI9Z;(`Vx?EiJE_p1$ZIUB({v2ze9b9aQIaCkgu&7?+}s|*T{=_Kj=^cnm3|G2*$;D zc|B1$N6$%jdv3nv|E(lqd1N;%t0}BY7%f&yBo27RlFZJRk-nS+&y~utPekBcVf9?j z5~Z|NDhWbD4%K7L$%R3j&!NOkKPYWj!`@@toM}*mJvmxu3;8J0mC<*wo02^c+1w$M zI5s#lj65wBp%J|p@-1e;F~CqET&0;|D*08b?(=LE!g2~J?eO}wzD)%1`flU%p7J4+ z!}xIo9}|R=H-a8@vjGNQ+j6b6?kKq34Fszh4DlDIg{d*%U291E7{bIlroP9nAo-)~ z@#FcgMI$>2KPycK=0jFL{`LjK!HqP?K79_v?{f`S{XE+m& zs6fy1sT~FkBN4Prm8I~<6H3gvkq*lNi#3Fl0EM^fv1q?j_HcCgXdH>>$p<0-xaSRJ zb(?dKW_B2_7BkP4K7$6^KEF_G6X7pus;mlbv@}aU^#M6(jUZ~;W+GN?u+=b2+b8a` z?o>si@Sm2N+uv6z-&Wah--|h4NUy~1H>fK^(n}d{=MSjPr6d5<8ymJ__#_6w7R{8 z_x*i`)B?n(<;tXkFJAYa_cpPiU;j=$2e)d_eGWN(Kan7TL_tg6ZK#EeJEXNrLbbacYh&yKKF(O; z-mpr}mwL*99bC%*yi1)-$SJ?+@m(Q+iRsojC_vYr&cz~_NPk>!PBN`c+~9y|N~Zrp z+{H`~`dc@9paR!{CacG!HkvgAjh)s6^rsNOMu*n)Om@c(0t^@w65K3)KC!*w?;m`;x(QGLr#UX)5nbfA^ywa5B#uJ;u?6p|X)98{?1BQX1CwhRD*%j$1|qhAk}* zp8wF(Y$zJ#o>ooh-4Y`ZTT^X}8M@$%4* zuZ@Sv*5dtx%_={vUBEyX6ea>all~{?fz9Ism;L=K+sAj><>vMHQ-)d$oURe?==%A`qyiro+aill z$1HkkO9OdisAB{$8uGwMcCW}PT*DDy=H?47Ot18UwgM7>Q%z^MN*8@w+Oph^XFq1{ zw*-B#?!Y1oUyRf z`#42)Xkc4Mat~Ka-|L1MH;sJ0vfAdObC7wU#dnUhjc#n(? z3D{l+fnM3f_W*RDH;t_UTvG}xCu8>E zlTrQ#BzQofE(5}v`9~acxP(r`aLHI7`5{t^(P+i9pOmO7@&gH|j6JQ0gqmp&xL`u+Q!ES^-@l}OU%=d!I zLT;)`@yws<>`F0amC|O75?-c0Y|Kn)hka!1oL2%(LFOm8?LI$71}?EYrM>J&|Hfe;GD=YXm%gK<=*M}QFMXMm zUtR<&J4FN-fr`w%n@y5Fl!mEh;R1=Hz`t-JK>pI#2eNN6>U_D=miF3%m-Zg+ zJA%vE1T05NT_}lHGleH*nWBQ$W_m#C>;GbRoE4|>J<`kyE3Ns$RF29e8Sd7UnA&;F(EiQ_dJ9(9JX{oNc^ah@8 z=apGg&B6M^|M=iXhY_-uSdv|~R%-4W%oMf|qb-m=$mI5BziUs+Un|qhb*4S=m(UR76}w&lcT??jXE;1jQ&08x)wKM>h({+z?w3oKXqjRR!$H+xBpS~o zv5%47g4n+|?pQ?Ps?tDsp?o@{)sV&!iMwIhbD zX=A=uk?}2E&DB?_I`yuUph==(;;OKh^|u_w+6?3JQvvYoRD-kROc4kFo7u|=2$v=3}VB%gei;Y11EQfb*ve6 z?*sM%GK^IOlm}*Z<)(QPQ3vJxGzaB&i3BXA2n$PVlWGUfBLaxdRlJ;uv0ZI%d+l05 zLdeCSFqJ^Lz)VE9NwH(52-nansrtaut_?QlIfT zfWIZHa(Ahw-{~B{3P?0OU02)L2?jg`tKFopTRLbzN$hy{X%J5bxCu^wLV^MF@dwPn6|p@9mq8 z4$>AVJM?~EN`7+6&(AWBy1(WMitv@=~(9@7F3~1xB%!8gy^)Irv$SMA2}viAz&Rf#?cR|D*w zlQ!bvPY8ut>vK#fE7Y@gYAQt|+ogkvV2NUF8HfhX=-icjo$MzS`L2;4eG&uGKeeA8?C^&aAoQ6ojeQb9@ z1q@JI672M82ZiKe0N>+P$}PrIoYK9<#`Chza<5mgWsH8nLYn;1v?W?G&BDy6rY1=M zlmzjtitOyAEc)ozhj~~pN;7cW_o)NP9j{f1Ff)$4jhbZSRFxr|L#|0~yS2x-Vpb_v zNe9V6nddt`L@b)25jO~aGC&@TS8X-dw!Pg*Cx0%x(XI)}XW?8n?|MritL_OpJVk+M zuPaQW?!^W+S&SSCPyQN%In4*ACHJ#tvh_})t>uv#(;c{r5_CWO_`nN0mux{a2`=?l z`G61MY!D5x*1oni#SZVApkKKCdtgx9m)OhShok)=|1UB(=g#wc5T3X++)=^84|OAh zN5%1likG_CAoWTVmxnJDeiy}6R=t&;W5JM_)zrErg-;x1Z6=?@Tz1DIoSj{sq5rsy;`vRkp{zLOOmf3MENTq<}1h zbY$hBiiBD`1iJZ@6E$@GceXH+-eY}BLBiAzDJ&o?hGi-RJtAm{gg`9*6aR83qGmp8 z+9kzL#^JFOS9g)9XG)gzeM=qtiGl7)h2!@U%nTI0; zC?d0SpKv&?BZpU_Q7r~F2nw1y;B56qR~~sPkc)H_Vy%-?fE?f0hAp3Tm$526>G!8x zCISDJq0ksz?C#0;tu~>hoE?T=HmysMCX;jU&OIPjjdU#(J4zvN3n zlO2Fnrekxtx?0t2h$G#D_$qr7`hwo}t(4=*K0rMp&wZ}!{O*&bT0>IJ16v)c=0Ph= z%f-`;`_g036iYo1IOOEc_3+J-{Q;#|p?mIXH3M{SKJyTYujf@QgCV#J}k&XvEuV)i$tT zD}ORNwjow?4b^kNR>4UPABR})5Y&~){uYSpb4$%#T8S!6!87KDrRP2JkyaNfpMX9O}yKndW0pcAj*9>QlwShqWSKf)c1|x==`93_Y+kk*H zg29=!j}pg;4M~VVnS$r5?^D_b5peyoQ9EJ-cOjrX1_HZ@BLckxE`kBvPu5tUZv&Kw3fvwHvIGP8A|x67}spGF3cba!tJ2;doe{ZgI&Y%){GP0zmm6O zAKXma4&EXoc{MKwWgh zjWf7OY&e_5Psw5PeTN*;g!04)nVRA77RVl%7D|%;wAR41Q3^)Nzvm9wSIqI3)E1}b zH{zHVXmdYfw8n$VZH*6lUcIJ+q>s6Gj;ro}&iHLYZZtfm=5S=<(TyFG{N_s-zxTWb z0?3X<_uSJJEv(-rQX^@1`Ys-M3hwnt$0G!no#bId*@5fapK_Rn=}CA)t{Kju$19pT4f{zK3X6s!ZA-cFv8n3jPdl30F^1g%@EH6f19@M_#%{Rte!F zk%DzbvkRH5`$EsKrSTDbIf879_4s{wY`?Dxnl=Y8NA^&U?^Qt}4b5*f;zm*Eby2tgXjrAsS9u9g*Y zorYwM<|vEM3Y<0~%&UF%if-7yGUCG@K+|eZ!+Fb|>6<>%RXO9!_Fhch zBX9Rd^yfeq@T+l3v?^FMe9%Fam5jEmed#M4*0tm#hKGq~h3Qngo;^8!-}V&o#rH9; z&Kv8Q_u&oBui}sB)^T*`mK~?mzmhleYMO-4^v_iK+nCpwSaA;3Y4$f+7JT6%DqSPi zO$xUH8~M|{)cCLmoHHul2CmJ^Tg1;#d!V_wYbimC9%o#itH^HAt;-0B-a+DBxA#Rv zZ*gP0pkmk$A3(v)S>HT(SE?O_##Grl@~q{vnP&PDd6>s!LX$*q3_?WGgL_?$mzX!U zm+*$a$x2bAn=P%?)Qq=*d#^u7FBF=4uc_**w*)3L`<~0m?YHMYPsF7nmxzUR-!$#x zaUHQh;{wB+2H*&wh?GVBs)`!H@nfk}tmfXlK6eq+x80=GX)!j_A#{Vi%$yx${YfV6 z2-5;~n9Q!ea-1$?t;5xBu2p*is2)u8oiot#z}g48^uKP zFnBN_?rTnax+U1K;)JDo&*DvRxIAnPz@Hie;xPmc__tgw(_M)XU3?za>aVVR)UsOf zw9kD>z*~3czv2E7f;i7ovcvEJ0I*7d{Qs~BK>e@?I5@gl8vTcd=~8PnZokEO^PLje zeYTTukl(;r#c5&Tc5P~+>}1Sj_`WEBTpqEV%s;xoz9jLx=NIh<HA)))pHG4sF2pw$7lifaR+kV9D2i7i+fQTMgYfS?yP}bcKFt?=fUz|}fx0;P~qv7<@s5&`ifjU5<>Ud^R zOIZkOsp=hUP4Ab|J}5z3le#w_A5^^O40p-EPAus#rskTvZW+_-FR+tFQ{YJkvB99g zO3L6|*K1IbWsihz@k;ir=c41)(2)ojt=f;Cls#&;4xw7g?Q(TeV_jKEiIwMOqq~(HupF9Yj9n79gwqdDxW4*M~ysX*of7>#=5NKHU)3Gq-<@{Z$;8^aXZflxagofQuO((tA6wWNdhF{Ja`L6V`e6{+Jh)$RPnKKfIJ z;{?>E!mbMJ4t z&+UyHY(caYg(Z9zjo2Yzc8;0CcQ!sGQ;5MBU##QTvp)B`7x^a29(#w|`N^zag~bm{ zg~gN?9L_2(6kSJR6s;|D3D*a`{+Lz3?&E)|UW1E1=+Ekz=3%*pT@&lv-1GfS&Y?be zZyylcxLz@Jw8dYlp_pGV)PsY?rhex=Q zx^^os+_H}&y_2~vE~$ANZZE>QXdt{ECi`|n0&IIe(Y)Aj(ECfMf34f?C4{nQOw@X) z<)oWH8{r#d2cI^F?t5@P(6~R32CFo)k4bcpd0p?q@(Jq!3=AlZyB7L zsLXm8C^RnPxVh9jauL@Sh;B37G=MH|X9bfJHfhZhAV8;@%vBtiIr6m8W%Pt0^xgu9 zz`6m}+S_gJUliQ6l2`#r_8~DMaZ5hzB53Az*UBd%x>-PzO2b`TvuR#^pV{qTIciw5`8#P7mHlKi2ybVjF?eH{Vt5D)GRSb+gO!Err;_ zu{0i4Jk$!6jagiEaS^{?uzmHu{w0pib)8c1$e0o^(*u}b^K>2!Y5rm;|i;!j&BUYYc-t?N7D_5&S+$+L*6&YXO@$HH8$I%?8k|Z4voE z0}NMI0m|Lwb;v-ltI(R{#-oq5|BQBrJmv#*{0#>p4r2jD84E$8I1yJK9npMI9@DV; z-v+={kZtWMMDhw?Y{w`)tZ92B8NWQSR>-DoI4KY9HxeKixWfhQN|r#QTm+QyVWOqHaSJ z_PTKP!Jvh%f;nNW*LCdRyuGw|35s`75? z_MndH^!*Ox!&K~VyB*0kN}$gYo2YekbNiB+O>dXJgLBIdl~75hQ{eG!-O{=NQT1x* zwx&FJG0*vBulhNEQGIs}4_l@`)l@`Y%wE4hf=UT=d; zAFgci)c3+Obffx(eR5MHbeibJCc(mybcS{tOuy48?; zoyX1{M5nJbys8@&v#mb9KOKcd2`7}m^++rjG(NhR^++lT4%buB%+2}$nuM!T|JnN{oZR|Cj1yE zt~iYOXZ7mh8>XdHGTT)`I+1~P`jB_#YQ1~xr-@EgQWPjBf-{4bqz*y?PNM0&42bPR z^P80${qrBeNs@WWZFB+eu1i-ItFuH<-W~G#9>?Cl1bNZa2c+#&SJU_ef6!_4lR6R1 zQ0>LPfAI0=8B5n>o#y^7vH4(qjiog6{S7daag!Rsk$(@fz=URs<_lmg!8~ET#l1f7K!myF(>T#*XHUnKMw&7AW;;|)$-5|e zVQg%ZcASBh@l{eCd^9YXOAoZQ7sdES&Ii|vH}jF3X^Z?M8}rJ+eR4~4)ylniVXK3r z&&CB4;07InKK#Q{j+18%KHEbQn$R5FmN(hci_s{KGb_INW{vOGR_MZ0+#BY*caKFXOgC-BeEMp09O(V?Vv8n;pXZxrJ1|Xq zR<2Qx|2(eXnkH16Rd5;^=ZBkp>&)7ypVHl<9_Ip%rG0?#PwNJm8xBI(M)46vae_XC z4ngUL*J<9iqW=>LfAhG#u#q1QAGxYFJ1Yx^2U?ZC#Y#8)ln`1s*QhPdzQU~&g!)kO zh0*1OsvI+JJ3JmUJyY5^WL=oUi%2hzH9EeXw%(1|sn*(h-6g$1G68+2kNW7fL*8dapT6{NRRmZp=p65Jr{ z?V4U-;A*XIahnW;6(&js+UovH{%3Y>4xN=wmxX4|%3@+VrXoJLrL-I+8~I5H_g)|o&i)og3|X>e16k`T#M;LpTjS6kCUMJ1ITs|+k( zx1?2bR&jf|v)1AbU}yBuNhM{rJ;oWx<39r@1T`?Hl-pqYxrk7IQ8yoX!p>WNC^vcI zqv_Cf*J5By>B`ipU16fFVsI(Jp#-QA>2_IRB8BhMyYb!(I(bl|=0T&F8q_N>!T zNp74_eE>I(j~xr`pILVrbT;FI+t|QoEUf%c&FMq}OR2!+9godVUd1fJ2#%HN$c?L42M@1@rbBMDja^TNXoAprZ7%!$kgyA z5DOlcvx#?Zka+C6zSu@;rrTj1%%4pmYTlv;gR}6J; zL?n6U==-0X+vm1g<=Xi|gD}HFrGccK;%T{sfY3FJEL{Jr0XA$IQj|=~0bmeIMyHk> zGYfYNcTvG?Er1ajA286bn&|gb#?~1!e;m_g8bjoNuSCYlF567xD0b}*O@k5%u+@qu zY-6Kwqk?FgQUd#3;V0rrqiej^PT=g#&58J(c0~vC*BncE_MOC5Y3d~sscw(@t~wl+ zJdCl%*+jLcbYq6SQZSMhCo3#cp~kZ)EDm&GePLvyE0^UGC-GIWSat@aXmY>O`K`?K zp`?3?Kzy<~r5)vItIDkOcwx$B&L-`oGN44ZXbl%ib>Ks1a;Df!Vqs*&tfO&fw&KdB z?u3!A+SSTwI&HO6pB(@{^`Q&_4vLZeB&B=3%=56mo$`1kw{E(5=EhmLj6Fk8-=Nd@ z^Rl5e&o{bBG?J`SS`JKC!ywD1c;A3(E86qQawHx*E4SuzF<7DRreZtemngp$ui6@n z6pZQv7{Bunt->6|!3ta0n43iL(@KOM&dvY2?bWy%;=&i0ojRQTiG9?Vf)}Qu3GgHAvTFuh{Cn|_T`^6=dz9mkadf>{P3O+FNS6P+)es-ua@df21{J$*U#u&OSOSI%O#9z$62R3 z4tn>9?`>`74t0F(-21ZEUf2pSCZjK^4wOZ*3Q!8T(hNshRBOQzqPlKA&mIp_P}ItO3M=E7_^RW; znRTDr=+v-+<=9|bdQhR}aQ1*6k(SPAS?(ILH~hE}7$zRbfOa$}> zO1M_ns-5PZ(lOeWKfzj`3;j%dZax%~W6m-RHDb)Bzh}pOE0GgqV0ly^gPe$H1xlx- z5F=iVq}QmdhF!_pXXG9k*!*bc=%YbLU;3F$PWhN<(L0hX97WgWh?mV43`5mV<0&3n zhzC!c7ykL~XH2Dkd{i`IkW4OH?N}zFjJa|gE8G+Vo%Si;)U4^Wkn52^iI7`?$m(JNpoi}h9OiE zF2+w;4%|}vSeZG8fPqapQZ@?rp}^(9#P7)Io5r25^JFK}2Y+hIONr3A^ozxRw=+ue z^$ko^yBi~uNgRK)PKg{BRK>VD8~2D$e~R9){AD1gV-%#chlXJ9c@U&FYPPEDY~ax0AwS=#f*6#E z{i@DL!7>l1Lx0ORr}sXBqe;`;$+=L3+m+|;=FJFd%KG^}IFdgubd?_uWqIjlgY#($!1=}gjYSXDe5FhodIINu^6qZQP&eP85p`+!i3HALAYk$Z}IUJQB&DH-Q_99*L;>b3O1UB_0_vArTkJf-q~S)MX&mkUC)E2=->2+ucETTkQW z#Ft9aif<}2!3rjphFc)Tk|U>gcN&L;G_)Vo`+!EliUx+b!!&yY%@x)79`7hL#Z4WO zZ%}#@`>8y;QK`y#XEwk-Ded@^F23USMh#7{VP`yHh~wjIr7Y5nR|oCjlfYQ*l;+$jjTE$VxxCUiXfwf-$4r%eHB&eN2l zlRSd79i9D(A3G|^w{i=XS01wrDo%2gG-SjSj6W(LPHrS?q$A1bT^O~G-FtM}KS@e* zhwkCMwG>Gg*8Dhi4W_Wn$?3i#+kk?#xlU2^f;B#@6go@dD{8Zf0Nze=RYo7(7tv^y z)zJEe!}Xa>>7hA6e3zqbVzTCDi3YDYG1!A3)a@K{)NekUS{5l#LIWIS#MAK$1 z-*|ewab(l^#8GoCY&2Ntta)KWUe{hBrPb8gzEmrwiy&iF`p~&aB>Wl;VYP1+sdTaD zWKUCq4Ee6y?iI`80l$oGgZ2WVG2M@GhoAVF;=UO!$p{a=t`GmHu$)ENhCow~zUh^l}jg+-M_6@`Cyx9@b9MPeWUfb)2{ z3$Vg}>OvGG`bQ5UK(MHyxUizQiijc@C<#(jz0}2@+CN=QFwOzAIK?^|@G=`|v>1O~ zg(1WSYOm{M@8@iPPxxG%?AIw(37xU{l!O*SK*!6jRxn?{xx|JTQ2Y;9g+UVH!ax;C z5fv2?Fi=EHS?RZ~UK1@d4@A2vDe$YSYgHGzxag|L?_51G4Vu7F0RYb9Wmk*qF5p~p zRaEhx1E(kqi6~1-{0CMqYAs!6731te7Z+XqL-OrUR{tEGi_#(I%1nQS zWDLwpI!(W}yeLe8p0F1JF)rr6ghqaCWpF{?;Od1o0Kf(w=IHh#OZ7iAq literal 0 HcmV?d00001 diff --git a/Presentations/midterm/Emoji Prediction for Text Messages.pdf b/Presentations/midterm/Emoji Prediction for Text Messages.pdf new file mode 100644 index 0000000000000000000000000000000000000000..c4c9161c299d5d2e661f238ad734f693cc36194b GIT binary patch literal 242857 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 )uq+%W);U{&C2Uz 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ȁL+#b`UGr4ZW+dA>$;OvOJ6Hb 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Ⓢ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�-Uyh1Pp+)g87i@;Ng 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 literal 0 HcmV?d00001 From 9f848b43dfdb4f50fdfa4790dc41d3554fa672dc Mon Sep 17 00:00:00 2001 From: aikira7 Date: Mon, 18 Jun 2018 17:29:19 +0200 Subject: [PATCH 3/9] Plots (Emojis in Sentiment Space 2dim) --- Project/Images/Neg_Neu.png | Bin 0 -> 23361 bytes Project/Images/Neg_Neu_same_axis.png | Bin 0 -> 7849 bytes Project/Images/Pos_Neg.png | Bin 0 -> 22799 bytes Project/Images/Pos_Neg_same_axis.png | Bin 0 -> 7993 bytes Project/Images/Pos_Neu.png | Bin 0 -> 22946 bytes Project/Images/Pos_Neu_same_axis.png | Bin 0 -> 7701 bytes 6 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 Project/Images/Neg_Neu.png create mode 100644 Project/Images/Neg_Neu_same_axis.png create mode 100644 Project/Images/Pos_Neg.png create mode 100644 Project/Images/Pos_Neg_same_axis.png create mode 100644 Project/Images/Pos_Neu.png create mode 100644 Project/Images/Pos_Neu_same_axis.png diff --git a/Project/Images/Neg_Neu.png b/Project/Images/Neg_Neu.png new file mode 100644 index 0000000000000000000000000000000000000000..930a4416333942d608b6d1adbcc641f8583b9f91 GIT binary patch literal 23361 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 HYt(-L^N~pO literal 0 HcmV?d00001 diff --git a/Project/Images/Neg_Neu_same_axis.png b/Project/Images/Neg_Neu_same_axis.png new file mode 100644 index 0000000000000000000000000000000000000000..c5dd2672b80adea701fa4719f1540e4716db0f2d GIT binary patch literal 7849 zcmb_>2UL^Ux^@r+L_x)%2nrTj0EJM8j!2VU1BeC)y@T`)qN1TGMLI}t0i*?`su+~e zmEMuwdne&;#+fr`X5I6z|E_z#wLVzcYwve|`|Z!OU#hFhQ&G}WLLd;T`wB9e5C};u zc+XLs03#%DMwjD%&YJSlkfOG$bKu8Gi@Pd!A&`=YGl#~f!0*$J3i{3v2zA5pOY+qr z*AxO_l(;W*SK9-*H0*DCafU$dNSSUG$ZaNd;cSADcesLrLTRbo$s5vfJ<8We@5WML zKXYiGSL*tnCso;`SkGe95#Y~3S+-01lBhXxy4B@PFJc}o7$+x+RdkwrW$ULb-Mrg6 zaN*s(?YvaB-sa>LpOTff_9*Xq7j%mE^5V?$p_qfDg@Ty*d5Dy`0vz&+LGvtR@;Q_g z^5F&!B4z)tA%qbcH?fAt^o78imw zQP6In!sarqWvXn*r4mI5WCj|EdaYnO(HMsD*&ub>Naa~e5%^77=IQMKMX%l&1+l>CU4LNXH01PxD%;^*h*&s@IquC#q-VPV0UcjbjxY}L6mQ3^P$6F^=;4~q)C!gMquB^<@r+2HfL&N0q zz{wL564(cT_z};Uo|y*^bnMj=6KO76y&;4CLQD(6^sn>_#T=hVCa88q%s5z z`8p936B8))wz@h|*UWCXs^ShO-C2p%kEAsSav0gzg(um1tWj$RgeKESUvkZxug4g) zk$!tqY^gqx#k0SEVh5COPeKuwE*mo9yYr|nJqSv=N^w_m7;o!9_=gAPzTRND|mVe7oP~wQ0ag+d&}z^8u}mZ zI@LvnoM9t_+&s^Z`#x9RKBJVSx%h)HGJ>qTvG7ApvM@LIz4y)?!}e3ZK9}w#4)w{X zV`azP)wR=_9g3FAu+_4#m(?dUh-gwi|$v3||pU+6frJooERaZQ!;_Ji1^u}?uhIJ!SnsK8w6G$DtO@Y!|r_7>%gis97Nd?f%LLBa2j z*ov?HQ>FjrPO6kBFsBpk9bIiT z(5*?rWmv3RYl6V#I}gVy?tLETNv45ubI<5Nc=Astpv1++=b;O;vqol*_tvL~L_dzJ zzd0K9mzrTT+n-$|g?M|+M1e)|B-Q+FNK^6x?4Xw+TAT%kfzQ~AEr6JH_l&v8xAsPEqW~ZeJsj(rfqA_XHzT8x(_kE2yUd_h=V4 zJj~>U^tIMPo#W5L+B=}~0-CWGOJi)C zMh|%xGYE5A9s2|l984>lUr1=webkrLKRR7OI+Jc#!CEua8uAfgpF=0xS7=ZPGGML` z$jn%*Ai_bk1qABnC8)uB#~Xx9sEPlrP+a`QrwVYNJ7i;Gm0HJM4D!dq;^M{bEj-1Koe3+cWXkBaX()8j>4MyY0Q`gCK zwQP-yjEIMOJ~-pH6gm}5G=<5TZip1@z4&E=O8eoxjhQ`kRFXLSaND&~_ z5*8Mgr3{Ch5Aud#{f~%1p$9AVsgWV^qVCI8t_yt#s*RNlpXqpu5x;{a5Rx}>kdL*{ zYCpn$f0>22r!E63plv|mwA+$siT`zL2Z)(@-H_E^QNzMO;F+FG9= z%4rltN--WKv!V9Jxco@n9l5%-nmqqhSdzbE{~$ z@4I}FiM)A;NoJ}=IM%rV&;wte)WX7^`^ZNZY_8&tw9%maBZ!gYKao_8DeESu@*N4D<={H2hMgzu^^W@Wnc&tB)*(NuQYm~KrL zb#DXj!S)iUH8nlUP{R(4hfDi$P<_RbYJMN2uCd~UqG^zb8d(L4DM z_a;q9<3Gfrc7~kWeRqb1tiER+F?_}!A0-Nv5GdkzI99vk_d(>llagozKgkwcQQ*n> zy*?@P<*c~oAtksNHHc#GZG99umZBMU>NcU0+ z(Y{6TI)cjdIg~Se?;HPsA_?eRx1FNkowFGc5_r7Vb}F50s2?h(EOH5Rj{7;n zYC20yrq+^1JqR0a=?`%LEly}%gyvG1(1@j--4v(Dc50l)i&@eTzv)mx0&6QuqLSD1 z!MSwj-iL0h9DnPv;(ZUcJC*I)l7ubVlE!uZtroeZkz_Da7=%g(H^!K&<--RukWx85uz_-AI4J*49Gr2JN*2wa}_MUfVut0pa+`WWT7= zXdio)&g+%L2kf(<81ht^*b|v`8CU7(;>0|84LeJYzF^LgM!~a3`R$Y3%A-vwro^fv zufC*pQNX8hgzR1T4zt|ONl1E(M4x~@{I{NOGv)6)Msw73Gm@SEVg7`SF)H{lkK+6?x}3<&{GAD!!95bx&scKhD1b z6N!9X7hc}5yJjfy6mO5zj0g4izpIdQIjKe9DJTFX5|NWAcY{qXxv>atwXQu~sGjvb zqF-9zPRF^&gmhsVk=@tS+SQf`h)Yp6W`xi4+^4!jqqnA^`=h!U^zWoVYySO(S_=Vw zzg`xGD~Z%FTq zxppnKUwQ|D34SqE9{64;5bE{eqMg1BRVTbd|A!ifO}LDHbf={YCH*CLPATJFJbumc zjw}h~Z-PS_mngxiOlJl=j_l&ZVDnFEHr&>aoL`maMretvuhi~@Xyi!RM)BQ7lJw#` zCo~x5N;)Ox>*eIlLM$dd6-sV&nS_prId6MM5ena?6pFpMt$pkI#zdx8woVm&wBfwJ zp_U<4XPb8UgoaiT8{w*k`?_Fe99n}ZUB|b+UEk`I&9iOY;0c9$9Re=eh|dF))_Oi< zy)WFv)cG^xP6;2>iUa{C^R!Aqi=U?2y+Fl05YL#dW)Q4r)plt8-shtyt&doGGKJ|4 z9H!IVki)X^cK4)CUq)B1D@hIwE;V-dOU-%!v<$t^Nu}h9rtQg@yAmDz?wPgn>|oZD z=_|R}lgdTUiBM*i=@{}%Jx1G;n*KUD5xg?a;q6H=l-suR`8n!y$O3+}{!zdo7 zc(iFb8n&4*z>JG)W^Uj@t>oT%!Or2a#x4&>KchR2a zM$6tzIy3nM%9p)Tfk$n!+Gb_gJg;q{%kYi%0#ciZ%gx?A!fKz)5J)KJ)2j8i$5WXC z@t;p9T$7VK*CcAG(iqp7oum@`wDSVT`tsP56G-T-pAS9N@1n2#h>*f|B(A=>{bBUY z8M<;-lh72cRiUFA5_r1STa`us_(niMj#aHhB?AJ2msJAp+b8^C!Bn5n9 zb@DIg8_Nw03$#vMi;^x`8=HF!Yi|IjZrV?w6yX>Mu4QkIJqJ+L;`n|;Pg3vhT7zFh z$qy7)Y)gDAwC=R_2F=1jfO$zuq9Dig7kL3N z2UjOuBD>X1ZYfv65w>~5oxuUc4=Gn}BLTre+j{o4%6 zr4$bbt|Zk5Z8qigtCx&dE?tpQWTx?H7#jn<*AeKrwTuB*0R&<+i*qk>db|o4+e{5n zNs2pQ>DeT?P<65*WT*EbK>eJf@}BcudD+>l$E|+Q5c{{j&`>{3{X25vKL*7S9ncV& zoAWDV4h{|$W&-&`ADr0?ul$AK=r7EZBuM&)yNjKVihS5*a%wN)I?K&}Pu;Y|b^F#P zCMN#=l7_vo$uF}Ny6t^2&-N(;q+dqRsQTnSa(!%dDPl|Su2#!o_qoF$PEobU(Sx4@yw7 z0G~Whj>GM!`I2X4X**z_mC*F4pCuSPy3Z<+V4}|bcuP<8MIuU;-VL?yf!{NiEv^+= zv`q7?et5y01(Qa%Uni6N#dlv6Ut%JDusjt8Eh7@|iwEonX4c-7{FqC&C|fJNQL?|g z7Vbj3QKTR+&kb>%rDG2K(8rDvKVI+oYH9f8P1s8LgZZOfb54iMxEKjIr3W)c=|xo- z@#YWILAC5i?Dt!b2Iw6!>5K`*la=UjMl$gmURY=TSlwF7o7oW$03nL-`scGcM#IBbkv56A6OM$2j6K zbwyFQ@VT8kU|fcQEJbHEp!a03`fM&go2Qoz$NU>)^4u*P*Q(?G(dDxVn(`-56@*B6aWzX|UxdX7|rlK0$Nk0le>qsu+n;~v>3 z;aGvTsf-;!7=-rwjpq1?4wX(d^WMZz{LI!9V=TsC&YnCmJUm>(vCvmyLPbRdI6L6^ zH5`{S>G}fJWus8qT0AZFNdR@5@m{GPO;u*?cfZa;bGpvhadol3jLH9S?V_3(AQ`^) zCyH*H-#mMPAJeiP%Ad}N3fsxyk?DZ`PI++u#qHey(8K7z zXYm}@Cz}A$Qj6m;29XZjzTejwFd80D-@_2h$LJa;<=;rszr*nVM5X@!&0@9x2jRMZ za4`G8I8 zF7ybGQD67YN>$w|T9T(`+Qn zTjI`19=<9b1XBPttdc5`+?IS*%;ObUG&wZtwQ$>OuAra*&>77Ii{@SX0MYipBoF#T z&gc>FyIi1TAt9mO-d?TB2pp=Whc!G$Z>_#a`)pJXOh}TrJHeLX@i`63XSGk*89h4O zXwQ4+f8@8LcGwukfC0=0lkcVm0vmgOVRE`PQRxjApp#tKamo*Jpjt<4c5HFwe$y>i z=o@v5ky(#HStuxv-HWmK7u(y1&)fpUJlac?Hn%iA{fW*1ZVk#wl#Hcq$aFPtcuqx~ zr8kn@l&6&gXo+2PA*P(z$ly?p#jevD#8(nq_}Xg-+k;B6cU+J6biV=qjAHE)oi9o? z;uq>HJJSIv6kB|}i%O#4(m+KBW%;>lkb?4%2^eCvn6v+LrfcH|X!9U{8Xkbw--Xrz z<5!J2Pq(D?lN6W6++TnW0S+qri8IXnyGT}FOFZ9Pw)vm*9G2J0cM2Z^HQlU}-B7RE z_*sF)4=w-zEUz2Ds^T+@U@bJP@hHj8Hs4 zx%D^Bl|QBUQFWtGAKS`;>c#Y=S1 z?lFbGs$o;jWm8EJiwBCz1u(7n$C*d3br1+an;tHb4BRs6zbtt zIBOy2(lHQA8>MdY?tkg*43FxWt9woxepOidqVexugtx&f37q68eU@ZwWqrqP@v%m{q%~83fyzzde?I* z2EUEOQB&S{K(K_Te86J2d+Uh;gD2mD3Ru8yV?Xp>Lqo%funVD4@KuudnsTN+ zHC4!gk#=Bku%EjFH{n!u+6?A4g{R%$8$BYr1F~~b$f3&_j*xgfNpWy0d9c!SA^XGotlSr#0l&*~>`zt(*)CpvpI%V49-Xz}fw?>3z|Fpuh7e zIr2<8JzVK?a~=L`-s8_M>!Cr+hk*;CrK_?rtT^Ioup}35+6KibP}i?re9_^hz(}+dXYuP(pK!Z#fdlq`-b@uC)p&8 z{kx;GRTsk}rxBxjZSJ|#n{z(^A({_#H{8YUEPW5Qvg9@~{DPT1VT;xAI zo>IgPN)p#1+9eLSsxN=!QGmZwY)bGaEEw*L`b#RoDf6&c?7+Z4em=*x`~$d?k3H>f%|A4tq-mfDFKO>TToyU18KX94s7icB5>)wGaCQ=O!ZJ$3jzx9 h|M)Vng^c`&{Q1I7X2QCHE4W^U+?Q3ADUvpN@?Q&XT7m!o literal 0 HcmV?d00001 diff --git a/Project/Images/Pos_Neg.png b/Project/Images/Pos_Neg.png new file mode 100644 index 0000000000000000000000000000000000000000..0bafad4ac366a4245492882ede2a3a2ee984f40e GIT binary patch literal 22799 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 H&eVScqP_~j literal 0 HcmV?d00001 diff --git a/Project/Images/Pos_Neu_same_axis.png b/Project/Images/Pos_Neu_same_axis.png new file mode 100644 index 0000000000000000000000000000000000000000..175dc7f436e4dca816fdbbf80dc034dc00023413 GIT binary patch literal 7701 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 Date: Tue, 19 Jun 2018 10:50:36 +0200 Subject: [PATCH 4/9] k-means clustering --- Project/Tools/kmeans_on_Emojis.ipynb | 206 +++++++++++++++++++++++++++ 1 file changed, 206 insertions(+) create mode 100644 Project/Tools/kmeans_on_Emojis.ipynb diff --git a/Project/Tools/kmeans_on_Emojis.ipynb b/Project/Tools/kmeans_on_Emojis.ipynb new file mode 100644 index 0000000..9428daf --- /dev/null +++ b/Project/Tools/kmeans_on_Emojis.ipynb @@ -0,0 +1,206 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [], + "source": [ + "import sys\n", + "import numpy as np\n", + "from sklearn.cluster import KMeans\n", + "sys.path.append(\"..\")\n", + "\n", + "from Tools.Emoji_Distance import sentiment_vector_to_emoji\n", + "from Tools.Emoji_Distance import emoji_to_sentiment_vector\n", + "from Tools.Emoji_Distance import dataframe_to_dictionary\n", + "\n", + "def emoji2sent(emoji_arr):\n", + " return np.array([emoji_to_sentiment_vector(e) for e in emoji_arr])\n", + "\n", + "def sent2emoji(sent_arr, custom_target_emojis=None):\n", + " return [sentiment_vector_to_emoji(s, custom_target_emojis=custom_target_emojis) for s in sent_arr]" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [], + "source": [ + "data , data_only_emoticons, list_sentiment_vectors , list_emojis , list_sentiment_emoticon_vectors , list_emoticon_emojis = dataframe_to_dictionary()" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array([[0.46813021, 0.24716181, 0.28470797],\n", + " [0.72967448, 0.05173769, 0.21858783],\n", + " [0.34310532, 0.43648208, 0.2204126 ],\n", + " [0.75466009, 0.0529057 , 0.19243421],\n", + " [0.70401758, 0.05932203, 0.23666039],\n", + " [0.57697579, 0.12699863, 0.29602558],\n", + " [0.22289823, 0.59126106, 0.18584071],\n", + " [0.49837557, 0.0805718 , 0.42105263],\n", + " [0.44415243, 0.11169514, 0.44415243],\n", + " [0.5634451 , 0.09927679, 0.33727811]])" + ] + }, + "execution_count": 10, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "array_sentiment_vectors = np.array(list_sentiment_emoticon_vectors)\n", + "array_sentiment_vectors[:10]" + ] + }, + { + "cell_type": "code", + "execution_count": 42, + "metadata": {}, + "outputs": [], + "source": [ + "kmeans = KMeans(n_clusters=5, random_state=0).fit(array_sentiment_vectors)" + ] + }, + { + "cell_type": "code", + "execution_count": 43, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array([[0.43555605, 0.2777192 , 0.28672476],\n", + " [0.21254481, 0.57576584, 0.21168936],\n", + " [0.56669216, 0.13017252, 0.30313532],\n", + " [0.33453667, 0.45309312, 0.21237021],\n", + " [0.71664806, 0.06648547, 0.21686647]])" + ] + }, + "execution_count": 43, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "centers = kmeans.cluster_centers_\n", + "centers" + ] + }, + { + "cell_type": "code", + "execution_count": 44, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "πŸ™‡\n", + "😿\n", + "πŸ˜„\n", + "😭\n", + "😍\n" + ] + } + ], + "source": [ + "for center in centers:\n", + " print(sentiment_vector_to_emoji(center))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "* only most used emojis" + ] + }, + { + "cell_type": "code", + "execution_count": 46, + "metadata": {}, + "outputs": [], + "source": [ + "top_emojis = [('πŸ˜‚', 10182),\n", + " ('😭', 3893),\n", + " ('😍', 2866),\n", + " ('😩', 1647),\n", + " ('😊', 1450),\n", + " ('😘', 1151),\n", + " ('πŸ™', 1089),\n", + " ('πŸ™Œ', 1003),\n", + " ('πŸ˜‰', 752),\n", + " ('😁', 697),\n", + " ('πŸ˜…', 651),\n", + " ('😎', 606),\n", + " ('😒', 544),\n", + " ('πŸ˜’', 539),\n", + " ('😏', 478),\n", + " ('😌', 434),\n", + " ('πŸ˜”', 415),\n", + " ('πŸ˜‹', 397),\n", + " ('πŸ˜€', 392),\n", + " ('😀', 368)]" + ] + }, + { + "cell_type": "code", + "execution_count": 47, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "πŸ˜‚\n", + "πŸ˜’\n", + "😁\n", + "😭\n", + "😍\n" + ] + } + ], + "source": [ + "for center in centers:\n", + " print(sentiment_vector_to_emoji(center, custom_target_emojis=top_emojis))" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "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.6.4" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} From e0ed251c8bf6e9b85bc5632209bdec71f120f5d5 Mon Sep 17 00:00:00 2001 From: Jonas Weinz Date: Tue, 19 Jun 2018 16:23:28 +0200 Subject: [PATCH 5/9] first refactored twitter_learning version --- .../simple_twitter_learning.ipynb | 614 ++++++++++++++++-- 1 file changed, 549 insertions(+), 65 deletions(-) diff --git a/Project/simple_approach/simple_twitter_learning.ipynb b/Project/simple_approach/simple_twitter_learning.ipynb index de24a90..54ea663 100644 --- a/Project/simple_approach/simple_twitter_learning.ipynb +++ b/Project/simple_approach/simple_twitter_learning.ipynb @@ -2,9 +2,18 @@ "cells": [ { "cell_type": "code", - "execution_count": 15, + "execution_count": 1, "metadata": {}, "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/home/jonas/.local/lib/python3.6/site-packages/h5py/__init__.py:36: FutureWarning: Conversion of the second argument of issubdtype from `float` to `np.floating` is deprecated. In future, it will be treated as `np.float64 == np.dtype(float).type`.\n", + " from ._conv import register_converters as _register_converters\n", + "Using TensorFlow backend.\n" + ] + }, { "name": "stdout", "output_type": "stream", @@ -25,7 +34,7 @@ "True" ] }, - "execution_count": 15, + "execution_count": 1, "metadata": {}, "output_type": "execute_result" } @@ -46,6 +55,7 @@ "import nltk\n", "from keras.models import load_model\n", "from sklearn.externals import joblib\n", + "import pickle\n", "import operator\n", "from sklearn.pipeline import Pipeline\n", "nltk.download('punkt')\n", @@ -55,7 +65,7 @@ }, { "cell_type": "code", - "execution_count": 11, + "execution_count": 2, "metadata": {}, "outputs": [], "source": [ @@ -168,53 +178,6 @@ " return wordnet.NOUN" ] }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "* the pipeline manager saves and stores sklearn pipelines. Keras models are handled differently, so the have to be named explicitly during save and load operations" - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "metadata": {}, - "outputs": [], - "source": [ - "class pipeline_manager(object):\n", - " @staticmethod\n", - " def load_pipeline_from_files(file_prefix:str, keras_models = []):\n", - " pm = pipeline_manager()\n", - " pm.load(file_prefix, keras_models=keras_models)\n", - " return pm\n", - " \n", - " def __init__(self, pipeline = None):\n", - " self.pipeline = pipeline\n", - " self.additional_objects = {}\n", - " \n", - " def save(prefix:str, keras_models = []):\n", - " # doing this like explained here: https://stackoverflow.com/a/43415459\n", - " for km in keras_models:\n", - " self.pipeline.named_steps[km].model.save(prefix + \".\" + km)\n", - " # setting this part to None:\n", - " self.pipeline.named_steps[km].model = None\n", - " \n", - " # now we can save the pipeline:\n", - " joblib.dump(self.pipeline, prefix + \".pipeline\")\n", - " \n", - " def load(prefix:str, keras_models=[]):\n", - " self.pipeline = joblib.load(prefix + \".pipeline\")\n", - " for km in keras_models:\n", - " self.pipeline.named_steps[km].model = load_model(prefix + \".\" + km)\n", - " \n", - " def fit(self,X,y):\n", - " self.pipeline.fit(X,y)\n", - " \n", - " def predict(self,X):\n", - " self.pipeline.predict(X)\n", - " " - ] - }, { "cell_type": "markdown", "metadata": {}, @@ -224,14 +187,25 @@ }, { "cell_type": "code", - "execution_count": 17, + "execution_count": 11, "metadata": {}, "outputs": [], "source": [ "class sample_data_manager(object):\n", " @staticmethod\n", - " def generate_and_read(path:str):\n", - " sdm = sample_data_manager(path):\n", + " def generate_and_read(path:str, only_emoticons=True, apply_stemming=True, n_top_emojis=-1, file_range=None):\n", + " sdm = sample_data_manager(path)\n", + " sdm.read_files(file_index_range=range(sdm.n_files) if file_range is None else file_range, only_emoticons=only_emoticons)\n", + " if apply_stemming:\n", + " sdm.apply_stemming_and_lemmatization()\n", + " \n", + " sdm.generate_emoji_count_and_weights()\n", + " \n", + " if n_top_emojis > 0:\n", + " sdm.filter_by_top_emojis(n_top=n_top_emojis)\n", + " \n", + " return sdm\n", + " \n", " \n", " def __init__(self, data_root_folder:str):\n", " self.data_root_folder = data_root_folder\n", @@ -247,11 +221,12 @@ " self.y = None\n", " self.Xt = None\n", " self.yt = None\n", + " self.top_emojis = None\n", " \n", " def read_files(self, file_index_range:list, only_emoticons=True):\n", " assert np.min(file_index_range) >= 0 and np.max(file_index_range) < self.n_files\n", " for i in file_index_range:\n", - " print(\"reaing file: \" + self.json_files[i] + \"...\")\n", + " print(\"reading file: \" + self.json_files[i] + \"...\")\n", " if self.raw_data is None:\n", " self.raw_data = pd.read_json(self.json_files[i], encoding=\"utf-8\")\n", " else:\n", @@ -264,7 +239,7 @@ " self.plain_text = self.plain_text.str.replace(\"(||)\",\"\").str.replace(\"[\" + \"\".join(list(emoji_blacklist)) + \"]\",\"\")\n", " \n", " # so far filtering for the latest emoji. TODO: maybe there are also better approaches\n", - " self.labels = emoji2sent([latest(e) for e in emojis], only_emoticons=only_emoticons )\n", + " self.labels = emoji2sent([latest(e) for e in self.emojis], only_emoticons=only_emoticons )\n", " \n", " # and filter out all samples we have no label for:\n", " wrong_labels = np.isnan(np.linalg.norm(self.labels, axis=1)) \n", @@ -273,7 +248,7 @@ " self.plain_text = self.plain_text[np.invert(wrong_labels)]\n", " self.emojis = self.emojis[np.invert(wrong_labels)]\n", " \n", - " print(\"imported \" + len(self.labels) + \" samples\")\n", + " print(\"imported \" + str(len(self.labels)) + \" samples\")\n", " \n", " def apply_stemming_and_lemmatization(self):\n", " stemmer = SnowballStemmer(\"english\")\n", @@ -322,20 +297,142 @@ " \n", " def get_emoji_count(self):\n", " sorted_emoji_count = list(reversed(sorted(self.emoji_count.items(), key=operator.itemgetter(1))))\n", + " #display(sorted_emoji_count)\n", " return sorted_emoji_count\n", " \n", " def filter_by_top_emojis(self,n_top = 20):\n", - " in_top = [sentiment_vector_to_emoji(x) in self.get_emoji_count()[:n_top] for x in self.labels]\n", + " self.top_emojis = [x[0] for x in self.get_emoji_count()[:n_top]]\n", + " in_top = [sentiment_vector_to_emoji(x) in self.top_emojis for x in self.labels]\n", " self.labels = self.labels[in_top]\n", " self.plain_text = self.plain_text[in_top]\n", " self.emojis = self.emojis[in_top]\n", - " print(\"remaining samples after top emoji filtering: \", len(labels))\n", + " print(\"remaining samples after top emoji filtering: \", len(self.labels))\n", " \n", " def create_train_test_split(self, split = 0.1, random_state = 4222):\n", " self.X, self.Xt, self.y, self.yt = train_test_split(self.plain_text, self.labels, test_size=split, random_state=random_state)\n", "\n" ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "* the pipeline manager saves and stores sklearn pipelines. Keras models are handled differently, so the have to be named explicitly during save and load operations" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "metadata": {}, + "outputs": [], + "source": [ + "class pipeline_manager(object):\n", + " @staticmethod\n", + " def load_pipeline_from_files(file_prefix:str, keras_models = [], all_models = []):\n", + " pm = pipeline_manager(keras_models=keras_models)\n", + " pm.load(file_prefix, all_models)\n", + " return pm\n", + " \n", + " @staticmethod\n", + " def create_keras_pipeline_with_vectorizer(vectorizer, layers, sdm:sample_data_manager):\n", + " '''\n", + " creates pipeline with vectorizer and keras classifier\n", + " '''\n", + " from keras.models import Sequential\n", + " from keras.layers import Dense\n", + " \n", + " if sdm.X is None:\n", + " sdm.create_train_test_split()\n", + " \n", + " vec_train = vectorizer.fit_transform(sdm.X)\n", + " vec_test = vectorizer.transform(sdm.Xt)\n", + " # creating keras model:\n", + " model=Sequential()\n", + " \n", + " keras_layers = []\n", + " first_layer = True\n", + " for layer in layers:\n", + " if first_layer:\n", + " model.add(Dense(units=layer[0], activation=layer[1], input_dim=vectorizer.transform([\" \"])[0]._shape[1]))\n", + " first_layer = False\n", + " else:\n", + " model.add(Dense(units=layer[0], activation=layer[1]))\n", + " \n", + " model.compile(loss='mean_squared_error',\n", + " optimizer='adam')\n", + " \n", + " pipeline = Pipeline([\n", + " ('vectorizer',vectorizer),\n", + " ('keras_model', model)\n", + " ])\n", + " \n", + " return pipeline_manager(pipeline=pipeline, keras_models=['keras_model'])\n", + " \n", + " @staticmethod\n", + " def create_pipeline_with_classifier_and_vectorizer(vectorizer, classifier, sdm:sample_data_manager = None):\n", + " '''\n", + " creates a pipeline with vectorizer and classifier for non keras classifiers\n", + " if sample data manager is given, the vectorizer will be also fitted!\n", + " '''\n", + " if sdm is not None:\n", + " if sdm.X is None:\n", + " sdm.create_train_test_split()\n", + "\n", + " vec_train = vectorizer.fit_transform(sdm.X)\n", + " vec_test = vectorizer.transform(sdm.Xt)\n", + " \n", + " pipeline = Pipeline([\n", + " ('vectorizer',vectorizer),\n", + " ('classifier', classifier)\n", + " ])\n", + " \n", + " return pipeline_manager(pipeline=pipeline, keras_models=[])\n", + " \n", + " def __init__(self, pipeline = None, keras_models = []):\n", + " self.pipeline = pipeline\n", + " self.additional_objects = {}\n", + " self.keras_models = keras_models\n", + " \n", + " def save(self, prefix:str):\n", + " print(self.keras_models)\n", + " # doing this like explained here: https://stackoverflow.com/a/43415459\n", + " for step in self.pipeline.named_steps:\n", + " if step in self.keras_models:\n", + " self.pipeline.named_steps[step].model.save(prefix + \".\" + step)\n", + " else:\n", + " joblib.dump(self.pipeline.named_steps[step], prefix + \".\" + str(step))\n", + " \n", + " load_command = \"pipeline_manager.load_pipeline_from_files( '\"\n", + " load_command += prefix + \"', \" + str(self.keras_models) + \", \"\n", + " load_command += str(list(self.pipeline.named_steps.keys())) + \")\"\n", + " \n", + " import __main__ as main\n", + " if not hasattr(main, '__file__'):\n", + " display(\"saved pipeline. It can be loaded the following way:\")\n", + " display(Markdown(\"> ```\\n\"+load_command+\"\\n```\"))\n", + " else:\n", + " print(\"saved pipeline. It can be loaded the following way:\")\n", + " print(load_command)\n", + " \n", + " \n", + " def load(self, prefix:str, models = []):\n", + " self.pipeline = None\n", + " model_list = []\n", + " for model in models:\n", + " if model in self.keras_models:\n", + " model_list.append((model, load_model(prefix + \".\" + model)))\n", + " else:\n", + " model_list.append((model, joblib.load(prefix+\".\" + model)))\n", + " self.pipeline = Pipeline(model_list)\n", + " \n", + " def fit(self,X,y):\n", + " self.pipeline.fit(X,y)\n", + " \n", + " def predict(self,X):\n", + " return self.pipeline.predict(X)\n", + " " + ] + }, { "cell_type": "markdown", "metadata": {}, @@ -345,7 +442,7 @@ }, { "cell_type": "code", - "execution_count": 23, + "execution_count": 9, "metadata": {}, "outputs": [], "source": [ @@ -354,12 +451,49 @@ " self.sdm = sdm\n", " self.pm = pm\n", " \n", - " def fit(self):\n", - " # TODO: make batch fitting available here\n", - " self.pm.fit(X = self.sdm.X, y = self.sdm.y)\n", + " def fit(self, max_size=10000, disabled_fit_steps=['vectorizer']):\n", + " # TODO: make batch fitting available here (eg: continous waiting for data and fitting them)\n", + " if self.sdm.X is None:\n", + " self.sdm.create_train_test_split()\n", + " disabled_fits = {}\n", + " disabled_fit_transforms = {}\n", + " \n", + " named_steps = self.pm.pipeline.named_steps\n", + " \n", + " for s in disabled_fit_steps:\n", + " # now it gets a little bit dirty:\n", + " # replace fit functions we don't want to call again (e.g. for vectorizers)\n", + " disabled_fits[s] = named_steps[s].fit\n", + " disabled_fit_transforms[s] = named_steps[s].fit_transform\n", + " named_steps[s].fit = lambda self, X, y=None: self\n", + " named_steps[s].fit_transform = named_steps[s].transform\n", + " \n", + " self.pm.fit(X = self.sdm.X[:max_size], y = self.sdm.y[:max_size])\n", + " \n", + " # restore replaced fit functions:\n", + " for s in disabled_fit_steps:\n", + " named_steps[s].fit = disabled_fits[s]\n", + " named_steps[s].fit_transform = disabled_fit_transforms[s]\n", + " \n", + " def test(self):\n", + " '''\n", + " return: prediction:list, teacher:list\n", + " '''\n", + " if self.sdm.X is None:\n", + " self.sdm.create_train_test_split()\n", + " return self.pm.predict(self.sdm.Xt), self.sdm.yt\n", + "\n", " " ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "----\n", + "## Train" + ] + }, { "cell_type": "markdown", "metadata": {}, @@ -369,21 +503,371 @@ }, { "cell_type": "code", - "execution_count": 25, + "execution_count": 12, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "you are in a notebook\n" + "reading file: ./data_en/2017-11-01.json...\n", + "imported 33368 samples\n", + "remaining samples after top emoji filtering: 26197\n" ] } ], "source": [ "import __main__ as main\n", "if not hasattr(main, '__file__'):\n", - " print(\"you are in a notebook\")" + " # we are in an interactive environment (probably in jupyter)\n", + " # load data:\n", + " sdm = sample_data_manager.generate_and_read(path=\"./data_en/\", n_top_emojis=20, file_range=range(1))\n", + " " + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch 1/1\n", + "100/100 [==============================] - 3s 27ms/step - loss: 0.1225\n" + ] + } + ], + "source": [ + " #pm = pipeline_manager.create_keras_pipeline_with_vectorizer(vectorizer=TfidfVectorizer(stop_words='english'),\n", + " # layers=[(10000, 'relu'),(5000, 'relu'),(2500, 'relu'),(y1[0].shape[0],None)], sdm=sdm)\n", + " pm = pipeline_manager.create_keras_pipeline_with_vectorizer(vectorizer=TfidfVectorizer(stop_words='english'),\n", + " layers=[(2500, 'relu'),(3,None)], sdm=sdm)\n", + " \n", + " tr = trainer(sdm=sdm, pm=pm)\n", + " tr.fit(100)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "----\n", + "## save classifier" + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "['keras_model']\n" + ] + }, + { + "data": { + "text/plain": [ + "'saved pipeline. It can be loaded the following way:'" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/markdown": [ + "> ```\n", + "pipeline_manager.load_pipeline_from_files( 'custom_classifier', ['keras_model'], ['vectorizer', 'keras_model'])\n", + "```" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "pm.save('custom_classifier')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "----\n", + "## Prediction" + ] + }, + { + "cell_type": "code", + "execution_count": 33, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array([[0.15801723, 0.11859037, 0.10975348],\n", + " [0.17035495, 0.10913695, 0.09354854],\n", + " [0.11777218, 0.06569621, 0.06620223],\n", + " ...,\n", + " [0.14746301, 0.09480572, 0.08052498],\n", + " [0.15932804, 0.11895895, 0.10343507],\n", + " [0.17135939, 0.1061406 , 0.09402546]], dtype=float32)" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + "array([[0.46813021, 0.24716181, 0.28470797],\n", + " [0.46813021, 0.24716181, 0.28470797],\n", + " [0.70401758, 0.05932203, 0.23666039],\n", + " ...,\n", + " [0.46813021, 0.24716181, 0.28470797],\n", + " [0.46813021, 0.24716181, 0.28470797],\n", + " [0.46813021, 0.24716181, 0.28470797]])" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "prediction variance: 0.0006294687\n", + "teacher variance: 0.03341702104519965\n" + ] + }, + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
predictpredicted_sentimentteacherteacher_sentimenttext
35671😒[0.15801723301410675, 0.11859036982059479, 0.1...πŸ˜‚[0.46813021474490496, 0.24716181096977158, 0.2...i feel like i care so much more in everi situat
25683😒[0.1703549474477768, 0.10913695394992828, 0.09...πŸ˜‚[0.46813021474490496, 0.24716181096977158, 0.2...i did not meat to add that 2 there ... hav see...
8985😒[0.1177721843123436, 0.06569620966911316, 0.06...😊[0.7040175768989329, 0.059322033898305086, 0.2...never…
5410😒[0.18182337284088135, 0.12382747232913971, 0.0...πŸ˜‚[0.46813021474490496, 0.24716181096977158, 0.2...lmao on me ! ! ! wtf wa he suppos to say
62611😒[0.1786666363477707, 0.11502400785684586, 0.10...😊[0.7040175768989329, 0.059322033898305086, 0.2...this dude alway help me get through my school ...
\n", + "
" + ], + "text/plain": [ + " predict predicted_sentiment teacher \\\n", + "35671 😒 [0.15801723301410675, 0.11859036982059479, 0.1... πŸ˜‚ \n", + "25683 😒 [0.1703549474477768, 0.10913695394992828, 0.09... πŸ˜‚ \n", + "8985 😒 [0.1177721843123436, 0.06569620966911316, 0.06... 😊 \n", + "5410 😒 [0.18182337284088135, 0.12382747232913971, 0.0... πŸ˜‚ \n", + "62611 😒 [0.1786666363477707, 0.11502400785684586, 0.10... 😊 \n", + "\n", + " teacher_sentiment \\\n", + "35671 [0.46813021474490496, 0.24716181096977158, 0.2... \n", + "25683 [0.46813021474490496, 0.24716181096977158, 0.2... \n", + "8985 [0.7040175768989329, 0.059322033898305086, 0.2... \n", + "5410 [0.46813021474490496, 0.24716181096977158, 0.2... \n", + "62611 [0.7040175768989329, 0.059322033898305086, 0.2... \n", + "\n", + " text \n", + "35671 i feel like i care so much more in everi situat \n", + "25683 i did not meat to add that 2 there ... hav see... \n", + "8985 never… \n", + "5410 lmao on me ! ! ! wtf wa he suppos to say \n", + "62611 this dude alway help me get through my school ... " + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Mean Squared Error: [0.14140389 0.04240099 0.02944344]\n", + "Variance teacher: [0.02183094 0.02513847 0.00285735]\n", + "Variance prediction: [0.00053908 0.00024232 0.00021658]\n" + ] + } + ], + "source": [ + "import __main__ as main\n", + "if not hasattr(main, '__file__'):\n", + " pred, teacher = tr.test()\n", + " \n", + " display(pred)\n", + " display(teacher)\n", + " \n", + " print('prediction variance: ', np.linalg.norm(np.var(pred, axis=0)))\n", + " print('teacher variance: ', np.linalg.norm(np.var(teacher, axis=0)))\n", + " \n", + " # build a dataframe to visualize test results:\n", + " testlist = pd.DataFrame({'text': sdm.Xt, \n", + " 'teacher': sent2emoji(sdm.yt),\n", + " 'teacher_sentiment': sdm.yt.tolist(),\n", + " 'predict': sent2emoji(pred, custom_target_emojis=sdm.top_emojis),\n", + " 'predicted_sentiment': pred.tolist()})\n", + " # display:\n", + " display(testlist.head())\n", + " \n", + " # mean squared error:\n", + " teacher_sentiments = np.array([sample[1]['teacher_sentiment'] for sample in testlist.iterrows()])\n", + " predicted_sentiments = np.array([sample[1]['predicted_sentiment'] for sample in testlist.iterrows()])\n", + "\n", + " mean_squared_error = ((teacher_sentiments - predicted_sentiments)**2).mean(axis=0)\n", + " print(\"Mean Squared Error: \", mean_squared_error)\n", + " print(\"Variance teacher: \", np.var(teacher_sentiments, axis=0))\n", + " print(\"Variance prediction: \", np.var(predicted_sentiments, axis=0))\n", + " \n", + " # save to csv:\n", + " testlist.to_csv('test.csv')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "----\n", + "## Load classifier" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "import __main__ as main\n", + "if not hasattr(main, '__file__'):\n", + " try:\n", + " pm\n", + " except NameError:\n", + " pass\n", + " else:\n", + " del pm # delete existing pipeline manager if ther is one\n", + "\n", + " pm = pipeline_manager.load_pipeline_from_files( 'custom_classifier', ['keras_model'], ['vectorizer', 'keras_model'])\n", + " lookup_emojis = [#'πŸ˜‚',\n", + " '😭',\n", + " '😍',\n", + " '😩',\n", + " '😊',\n", + " '😘',\n", + " 'πŸ™',\n", + " 'πŸ™Œ',\n", + " 'πŸ˜‰',\n", + " '😁',\n", + " 'πŸ˜…',\n", + " '😎',\n", + " '😒',\n", + " 'πŸ˜’',\n", + " '😏',\n", + " '😌',\n", + " 'πŸ˜”',\n", + " 'πŸ˜‹',\n", + " 'πŸ˜€',\n", + " '😀']\n", + " out = widgets.Output()\n", + "\n", + " t = widgets.Text()\n", + " b = widgets.Button(\n", + " description='get emoji',\n", + " disabled=False,\n", + " button_style='', # 'success', 'info', 'warning', 'danger' or ''\n", + " tooltip='Click me',\n", + " icon='check'\n", + " )\n", + "\n", + "\n", + "\n", + " def handle_submit(sender):\n", + " with out:\n", + " clear_output()\n", + " with out:\n", + " pred = pm.predict([t.value])\n", + "\n", + " display(Markdown(\"# Predicted Emoji \" + str(sent2emoji(pred, lookup_emojis)[0])))\n", + " display(Markdown(\"# Sentiment Vector: $$ \\pmatrix{\" + str(pred[0,0]) +\n", + " \"\\\\\\\\\" + str(pred[0,1]) + \"\\\\\\\\\" + str(pred[0,2]) + \"}$$\"))\n", + "\n", + " b.on_click(handle_submit)\n", + "\n", + " display(t)\n", + " display(widgets.VBox([b, out])) " ] }, { From 8425355783bf0b179ec63f30f1638b4e75887794 Mon Sep 17 00:00:00 2001 From: Jonas Weinz Date: Tue, 19 Jun 2018 16:29:11 +0200 Subject: [PATCH 6/9] refactoring simple twitter learning done --- .../simple_twitter_learning.ipynb | 2811 ------------- .../simple_twitter_learning_old.ipynb | 3706 +++++++++++++++++ 2 files changed, 3706 insertions(+), 2811 deletions(-) create mode 100644 Project/simple_approach/simple_twitter_learning_old.ipynb diff --git a/Project/simple_approach/simple_twitter_learning.ipynb b/Project/simple_approach/simple_twitter_learning.ipynb index 54ea663..7b8661c 100644 --- a/Project/simple_approach/simple_twitter_learning.ipynb +++ b/Project/simple_approach/simple_twitter_learning.ipynb @@ -869,2817 +869,6 @@ " display(t)\n", " display(widgets.VBox([b, out])) " ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# simple twitter approach\n", - "*for learning emoji usage by single (in the meaning of unconnected) twitter messages*" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## loading train data" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "* Download preprocessed raw data:\n", - " * [here](https://the-cake-is-a-lie.net/nextcloud/index.php/s/MmXFYj6mGoMQoJN) for english\n", - " * [here](https://the-cake-is-a-lie.net/nextcloud/index.php/s/HgqpQ6rFadtWSAt) for german" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [], - "source": [ - "data_root_folder = \"./data_en/\" # i created a symlink here" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "* get all json files in `data_root_folder`" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [], - "source": [ - "json_files = sorted(glob.glob(data_root_folder + \"/*.json\"))" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "----" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "* so far, only load the first file" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "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", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \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", - "
EMOJIHASHTAGSLINKED_USERdatetimeidlangpersonreply_totext
0[πŸ”₯, πŸ‘][][]2017-11-01 13:29:00925716304635547600en31507978NaNfashionbombdaily's photo <EMOJI><EMOJI>🏼
1[🀦][][]2017-11-01 13:29:00925716304664911900en231994649NaNIt’s scary how on point my horoscope be <EMOJI...
2[πŸ˜„][][]2017-11-01 13:29:03925716317214089200en2592765104NaNWoooaaaahhh <EMOJI>
3[πŸ“·][][]2017-11-01 13:29:04925716321416949800en278737933NaN<EMOJI> vivalcli: Portraits by Zhao Guojing an...
4[😩, 😩][][@hiphopphiIes]2017-11-01 13:29:06925716329801310200en8245862536349819009.257162e+17<USER> i wanna know too<EMOJI><EMOJI>
5[😭, πŸ’“][][@WizMommma]2017-11-01 13:29:02925716313019965400en15819538149.257088e+17<USER> veda was yoda too <EMOJI><EMOJI>
6[πŸ˜‚][][]2017-11-01 13:29:05925716325607133200en1001999683NaNI’m less stressed about turning 30 now <EMOJI>...
7[πŸ’―][][]2017-11-01 13:29:07925716334008082400en745222369183043600NaNFull charged. <EMOJI>
8[πŸ™„][][@SeaDimon, @lsarsour]2017-11-01 13:29:09925716342401052700en7985571552175391009.257147e+17<USER> That’s part of the problem, (they) <USE...
9[😟, πŸ˜₯, 😒][][@Ian_khetye]2017-11-01 13:29:10925716346570240000en7443960391264215009.250629e+17<USER> got me emotional there<EMOJI><EMOJI><EM...
10[🌻][][]2017-11-01 13:29:13925716359182520300en7214900101182054008.965900e+17back to the yellow <EMOJI>
11[🍁, 🌺, πŸ‚][][@Dimafadma]2017-11-01 13:29:15925716367558545400en5205367239.257159e+17<USER> Happy month to you and your loved ones ...
12[πŸƒ][#mortdale, #partofthefamily, #gorgeousboy][]2017-11-01 13:29:16925716371735900200en850852815941517300NaNMaxx and Patricia. Family hangs at For Good He...
13[πŸ’­, 🀦][][]2017-11-01 13:29:20925716388513230800en914145041588867100NaNI need to STOP beating myself up with my thoug...
14[😍, 😘][#7YearsOfKMH2][]2017-11-01 13:29:20925716388525645800en2425405622NaNCutest Son <EMOJI>Roll no. 31 <EMOJI> <HASHTAG>
15[😜][][]2017-11-01 13:29:22925716396931240000en4614871873NaNBy the summer I should have everything up and ...
16[πŸ˜‚, πŸ”₯][][]2017-11-01 13:29:23925716401125331000en2831608345NaNI know my English is not that good but that do...
17[πŸ’•][][@yungbabytate]2017-11-01 13:29:23925716401133948900en7885719746330092009.255778e+17<USER> I <EMOJI> u mama
18[πŸ˜‰][][@cmckenney]2017-11-01 13:29:23925716401125544000en2183078029.257115e+17<USER> That picture was NOT taken this morning...
19[πŸ‘…][#footfetishnation][]2017-11-01 13:29:25925716409489002500en885261166146179100NaNWelcome to <HASHTAG> <EMOJI>
20[πŸ‘Œ, πŸ™‚][][]2017-11-01 13:29:25925716409497272300en831437760833609700NaNAwkward <EMOJI><EMOJI>
21[πŸ€—, πŸ“Ί][][]2017-11-01 13:29:26925716413699854300en231664542NaNback at it with supernatural <EMOJI><EMOJI>
22[πŸ’―][][]2017-11-01 13:29:26925716413679009800en3196847035NaNOne of the best things I've learned was to sto...
23[πŸ‘…, πŸ’¦, πŸ‘][][@ctrlpurp]2017-11-01 13:29:29925716426278735900en9184928583526359009.257161e+17<USER> Can I taste?<EMOJI><EMOJI><EMOJI>
24[πŸ’”][][@saunders_court1]2017-11-01 13:29:30925716430473039900en34711873379.257163e+17<USER> we miss you ☹️<EMOJI>
25[🀐, 🀐, 🀐][][]2017-11-01 13:29:31925716434667184100en780060488600199200NaNActually my bias in WJSN are Eunseo &amp; Bona...
26[😴][][]2017-11-01 13:29:32925716438853345300en388380690NaNI so cannot be bothered with the rest of the d...
27[πŸ˜‚][][@xxxtentacion]2017-11-01 13:29:35925716451457163300en899320696869974000NaN<USER> 2lit4life<EMOJI>
28[πŸ˜‚, πŸ™„][][]2017-11-01 13:29:35925716451461357600en784790670NaNI’m not stop saying that!<EMOJI><EMOJI>
29[πŸŽ‰, πŸŽ‚, 🎈, 🎊, 🎁, πŸ’œ][][@justinerooney_]2017-11-01 13:29:37925716459828936700en3051266655NaN<USER> HAPPY BIHDAY <EMOJI><EMOJI><EMOJI><EMOJ...
..............................
68703[πŸ˜•][#halloweencostumes][]2017-11-01 07:23:04925624214522036200en1672876458NaN<HASHTAG> this one falls under the weird crazy...
68704[πŸ˜‚, 😩][][]2017-11-01 07:23:05925624218682777600en382473866NaNI'm not allowed to have chocolates yet, then I...
68705[πŸ˜‚][#MUFC][]2017-11-01 07:23:06925624222889766900en893145405457911800NaNManchester United manager Mourinho slams 'spec...
68706[πŸ’–][][]2017-11-01 07:23:07925624227088121900en240378516NaN<EMOJI> en Bushwhick
68707[πŸŒ†, πŸ‘‰, πŸš–, πŸ“ž][#BurkeCentre][]2017-11-01 07:23:18925624273237983200en784620573209002000NaN: <HASHTAG> <EMOJI> <EMOJI><EMOJI> For Taxi <E...
68708[😁][][@mychosliaheart, @BarrettoJulia, @iamjoshuaga...2017-11-01 07:23:18925624273212805100en1709981879.254136e+17<USER> <USER> <USER> Look, Mammeh and Daddeh! ...
68709[πŸ˜‹][][]2017-11-01 07:23:24925624298395533300en1348667816NaNLife is so good with you <EMOJI>
68710[πŸ‘Œ, πŸŽƒ, 😘][#portlandoregon, #portlandhalloween, #carrie…][]2017-11-01 07:23:24925624298378801200en722481645765300200NaNHappy Halloween! <EMOJI>🏽<EMOJI><EMOJI> <HASHT...
68711[πŸ‘][][@8limbsbondi...]2017-11-01 07:23:26925624306779897900en2443251500NaNSome work on the ropes in today’s boxing class...
68712[😭][][]2017-11-01 07:23:27925624310974136300en2406186390NaNScotty and Kristen’s halloween costumes <EMOJI>
68713[πŸ˜‚][][@rfrandrea, @AdaaanAndyyy]2017-11-01 07:23:30925624323557146600en10394481499.256150e+17<USER> <USER> May pre-month celebration sis <E...
68714[😭, 😭, πŸ’˜][][@peachshua1230]2017-11-01 07:23:31925624327755591700en8450855445896724009.256009e+17<USER> Awww <EMOJI> Ajsksjdjd im smiling like ...
68715[😫, βœ‹][][]2017-11-01 07:23:34925624340342812700en924752524871131100NaNI hate when I send a text or snap n I'm so anx...
68716[πŸ˜‚, πŸ™][][]2017-11-01 07:23:34925624340355280900en419493819NaNThe answer is no I have no plans and I never l...
68717[😭][][@BeachBoy_Gab]2017-11-01 07:23:34925624340346937300en24577459529.256219e+17<USER> LMAOOO I'm so proud <EMOJI>
68718[😒, πŸ’”][][]2017-11-01 07:23:34925624340338507800en1955767531NaNMy cousin/little sister is leaving to San Fran...
68719[πŸ™ƒ][][]2017-11-01 07:23:35925624344524361700en796490344581898200NaNCan't be alone w my thoughts tonight so just g...
68720[πŸ˜‚, πŸ˜‚, πŸ˜‚, πŸ˜‚, πŸ˜‚][][]2017-11-01 07:23:36925624348710285300en907808317124177900NaN<EMOJI><EMOJI><EMOJI><EMOJI><EMOJI> ambot!!!
68721[πŸ‘Œ, πŸ‘Š, πŸ™Œ][][]2017-11-01 07:23:37925624352929910800en262162415NaN<EMOJI>🏽<EMOJI>🏽 1st of the month!!Happy 1st o...
68722[😴][#WednesdayWisdom][]2017-11-01 07:23:41925624369715515400en574882525NaN<HASHTAG> ... stay in bed <EMOJI>
68723[πŸ˜‚, πŸ˜‚, πŸ˜‚, πŸ˜‚][][@Louis_Tomlinson, @NiallOfficial]2017-11-01 07:23:44925624382269124600en5561751739.254038e+17<USER> <USER> THIS IS GOLD. GOLD. <EMOJI><EMOJ...
68724[πŸ˜€][][]2017-11-01 07:23:45925624386455031800en1610265588NaN<EMOJI> thank you for the kind compliment
68725[😎][][]2017-11-01 07:23:45925624386454937600en4760724450NaNEnjoyed the silence <EMOJI>
68726[✨][][]2017-11-01 07:23:46925624390657572900en882858115636514800NaNOS: Spiderman Homecoming <EMOJI>
68727[🀷][][]2017-11-01 07:23:46925624390682849300en188129628NaNGo to hell <EMOJI>πŸ½β€β™€οΈ
68728[😘][][]2017-11-01 07:23:46925624390666129400en2473135939NaNThank you Yomi! <EMOJI>
68729[πŸ˜‚][][@discopiggu]2017-11-01 07:23:46925624390670106600en23735842099.256241e+17<USER> Lol. Just enjoy the stars. Music Kidhar...
68730[πŸ™][#NYCStrong][]2017-11-01 07:23:50925624407459971100en181689756NaNThoughts and prayers for NY<EMOJI>🏻 <HASHTAG>
68731[πŸ’][#GreatSuccess][@BrianyH]2017-11-01 07:23:50925624407460057100en601607889.254610e+17<USER> I searched COCK, PENIS, SHLONG, WINKY, ...
68732[πŸƒ, 🌻, 🌻, πŸƒ, πŸƒ, πŸ’, πŸ’, πŸƒ, πŸ™‹][][@amitbarman520]2017-11-01 07:23:53925624420022063100en37922907259.256215e+17<USER> Thank you so much<EMOJI><EMOJI><EMOJI><...
\n", - "

68733 rows Γ— 9 columns

\n", - "
" - ], - "text/plain": [ - " EMOJI \\\n", - "0 [πŸ”₯, πŸ‘] \n", - "1 [🀦] \n", - "2 [πŸ˜„] \n", - "3 [πŸ“·] \n", - "4 [😩, 😩] \n", - "5 [😭, πŸ’“] \n", - "6 [πŸ˜‚] \n", - "7 [πŸ’―] \n", - "8 [πŸ™„] \n", - "9 [😟, πŸ˜₯, 😒] \n", - "10 [🌻] \n", - "11 [🍁, 🌺, πŸ‚] \n", - "12 [πŸƒ] \n", - "13 [πŸ’­, 🀦] \n", - "14 [😍, 😘] \n", - "15 [😜] \n", - "16 [πŸ˜‚, πŸ”₯] \n", - "17 [πŸ’•] \n", - "18 [πŸ˜‰] \n", - "19 [πŸ‘…] \n", - "20 [πŸ‘Œ, πŸ™‚] \n", - "21 [πŸ€—, πŸ“Ί] \n", - "22 [πŸ’―] \n", - "23 [πŸ‘…, πŸ’¦, πŸ‘] \n", - "24 [πŸ’”] \n", - "25 [🀐, 🀐, 🀐] \n", - "26 [😴] \n", - "27 [πŸ˜‚] \n", - "28 [πŸ˜‚, πŸ™„] \n", - "29 [πŸŽ‰, πŸŽ‚, 🎈, 🎊, 🎁, πŸ’œ] \n", - "... ... \n", - "68703 [πŸ˜•] \n", - "68704 [πŸ˜‚, 😩] \n", - "68705 [πŸ˜‚] \n", - "68706 [πŸ’–] \n", - "68707 [πŸŒ†, πŸ‘‰, πŸš–, πŸ“ž] \n", - "68708 [😁] \n", - "68709 [πŸ˜‹] \n", - "68710 [πŸ‘Œ, πŸŽƒ, 😘] \n", - "68711 [πŸ‘] \n", - "68712 [😭] \n", - "68713 [πŸ˜‚] \n", - "68714 [😭, 😭, πŸ’˜] \n", - "68715 [😫, βœ‹] \n", - "68716 [πŸ˜‚, πŸ™] \n", - "68717 [😭] \n", - "68718 [😒, πŸ’”] \n", - "68719 [πŸ™ƒ] \n", - "68720 [πŸ˜‚, πŸ˜‚, πŸ˜‚, πŸ˜‚, πŸ˜‚] \n", - "68721 [πŸ‘Œ, πŸ‘Š, πŸ™Œ] \n", - "68722 [😴] \n", - "68723 [πŸ˜‚, πŸ˜‚, πŸ˜‚, πŸ˜‚] \n", - "68724 [πŸ˜€] \n", - "68725 [😎] \n", - "68726 [✨] \n", - "68727 [🀷] \n", - "68728 [😘] \n", - "68729 [πŸ˜‚] \n", - "68730 [πŸ™] \n", - "68731 [πŸ’] \n", - "68732 [πŸƒ, 🌻, 🌻, πŸƒ, πŸƒ, πŸ’, πŸ’, πŸƒ, πŸ™‹] \n", - "\n", - " HASHTAGS \\\n", - "0 [] \n", - "1 [] \n", - "2 [] \n", - "3 [] \n", - "4 [] \n", - "5 [] \n", - "6 [] \n", - "7 [] \n", - "8 [] \n", - "9 [] \n", - "10 [] \n", - "11 [] \n", - "12 [#mortdale, #partofthefamily, #gorgeousboy] \n", - "13 [] \n", - "14 [#7YearsOfKMH2] \n", - "15 [] \n", - "16 [] \n", - "17 [] \n", - "18 [] \n", - "19 [#footfetishnation] \n", - "20 [] \n", - "21 [] \n", - "22 [] \n", - "23 [] \n", - "24 [] \n", - "25 [] \n", - "26 [] \n", - "27 [] \n", - "28 [] \n", - "29 [] \n", - "... ... \n", - "68703 [#halloweencostumes] \n", - "68704 [] \n", - "68705 [#MUFC] \n", - "68706 [] \n", - "68707 [#BurkeCentre] \n", - "68708 [] \n", - "68709 [] \n", - "68710 [#portlandoregon, #portlandhalloween, #carrie…] \n", - "68711 [] \n", - "68712 [] \n", - "68713 [] \n", - "68714 [] \n", - "68715 [] \n", - "68716 [] \n", - "68717 [] \n", - "68718 [] \n", - "68719 [] \n", - "68720 [] \n", - "68721 [] \n", - "68722 [#WednesdayWisdom] \n", - "68723 [] \n", - "68724 [] \n", - "68725 [] \n", - "68726 [] \n", - "68727 [] \n", - "68728 [] \n", - "68729 [] \n", - "68730 [#NYCStrong] \n", - "68731 [#GreatSuccess] \n", - "68732 [] \n", - "\n", - " LINKED_USER datetime \\\n", - "0 [] 2017-11-01 13:29:00 \n", - "1 [] 2017-11-01 13:29:00 \n", - "2 [] 2017-11-01 13:29:03 \n", - "3 [] 2017-11-01 13:29:04 \n", - "4 [@hiphopphiIes] 2017-11-01 13:29:06 \n", - "5 [@WizMommma] 2017-11-01 13:29:02 \n", - "6 [] 2017-11-01 13:29:05 \n", - "7 [] 2017-11-01 13:29:07 \n", - "8 [@SeaDimon, @lsarsour] 2017-11-01 13:29:09 \n", - "9 [@Ian_khetye] 2017-11-01 13:29:10 \n", - "10 [] 2017-11-01 13:29:13 \n", - "11 [@Dimafadma] 2017-11-01 13:29:15 \n", - "12 [] 2017-11-01 13:29:16 \n", - "13 [] 2017-11-01 13:29:20 \n", - "14 [] 2017-11-01 13:29:20 \n", - "15 [] 2017-11-01 13:29:22 \n", - "16 [] 2017-11-01 13:29:23 \n", - "17 [@yungbabytate] 2017-11-01 13:29:23 \n", - "18 [@cmckenney] 2017-11-01 13:29:23 \n", - "19 [] 2017-11-01 13:29:25 \n", - "20 [] 2017-11-01 13:29:25 \n", - "21 [] 2017-11-01 13:29:26 \n", - "22 [] 2017-11-01 13:29:26 \n", - "23 [@ctrlpurp] 2017-11-01 13:29:29 \n", - "24 [@saunders_court1] 2017-11-01 13:29:30 \n", - "25 [] 2017-11-01 13:29:31 \n", - "26 [] 2017-11-01 13:29:32 \n", - "27 [@xxxtentacion] 2017-11-01 13:29:35 \n", - "28 [] 2017-11-01 13:29:35 \n", - "29 [@justinerooney_] 2017-11-01 13:29:37 \n", - "... ... ... \n", - "68703 [] 2017-11-01 07:23:04 \n", - "68704 [] 2017-11-01 07:23:05 \n", - "68705 [] 2017-11-01 07:23:06 \n", - "68706 [] 2017-11-01 07:23:07 \n", - "68707 [] 2017-11-01 07:23:18 \n", - "68708 [@mychosliaheart, @BarrettoJulia, @iamjoshuaga... 2017-11-01 07:23:18 \n", - "68709 [] 2017-11-01 07:23:24 \n", - "68710 [] 2017-11-01 07:23:24 \n", - "68711 [@8limbsbondi...] 2017-11-01 07:23:26 \n", - "68712 [] 2017-11-01 07:23:27 \n", - "68713 [@rfrandrea, @AdaaanAndyyy] 2017-11-01 07:23:30 \n", - "68714 [@peachshua1230] 2017-11-01 07:23:31 \n", - "68715 [] 2017-11-01 07:23:34 \n", - "68716 [] 2017-11-01 07:23:34 \n", - "68717 [@BeachBoy_Gab] 2017-11-01 07:23:34 \n", - "68718 [] 2017-11-01 07:23:34 \n", - "68719 [] 2017-11-01 07:23:35 \n", - "68720 [] 2017-11-01 07:23:36 \n", - "68721 [] 2017-11-01 07:23:37 \n", - "68722 [] 2017-11-01 07:23:41 \n", - "68723 [@Louis_Tomlinson, @NiallOfficial] 2017-11-01 07:23:44 \n", - "68724 [] 2017-11-01 07:23:45 \n", - "68725 [] 2017-11-01 07:23:45 \n", - "68726 [] 2017-11-01 07:23:46 \n", - "68727 [] 2017-11-01 07:23:46 \n", - "68728 [] 2017-11-01 07:23:46 \n", - "68729 [@discopiggu] 2017-11-01 07:23:46 \n", - "68730 [] 2017-11-01 07:23:50 \n", - "68731 [@BrianyH] 2017-11-01 07:23:50 \n", - "68732 [@amitbarman520] 2017-11-01 07:23:53 \n", - "\n", - " id lang person reply_to \\\n", - "0 925716304635547600 en 31507978 NaN \n", - "1 925716304664911900 en 231994649 NaN \n", - "2 925716317214089200 en 2592765104 NaN \n", - "3 925716321416949800 en 278737933 NaN \n", - "4 925716329801310200 en 824586253634981900 9.257162e+17 \n", - "5 925716313019965400 en 1581953814 9.257088e+17 \n", - "6 925716325607133200 en 1001999683 NaN \n", - "7 925716334008082400 en 745222369183043600 NaN \n", - "8 925716342401052700 en 798557155217539100 9.257147e+17 \n", - "9 925716346570240000 en 744396039126421500 9.250629e+17 \n", - "10 925716359182520300 en 721490010118205400 8.965900e+17 \n", - "11 925716367558545400 en 520536723 9.257159e+17 \n", - "12 925716371735900200 en 850852815941517300 NaN \n", - "13 925716388513230800 en 914145041588867100 NaN \n", - "14 925716388525645800 en 2425405622 NaN \n", - "15 925716396931240000 en 4614871873 NaN \n", - "16 925716401125331000 en 2831608345 NaN \n", - "17 925716401133948900 en 788571974633009200 9.255778e+17 \n", - "18 925716401125544000 en 218307802 9.257115e+17 \n", - "19 925716409489002500 en 885261166146179100 NaN \n", - "20 925716409497272300 en 831437760833609700 NaN \n", - "21 925716413699854300 en 231664542 NaN \n", - "22 925716413679009800 en 3196847035 NaN \n", - "23 925716426278735900 en 918492858352635900 9.257161e+17 \n", - "24 925716430473039900 en 3471187337 9.257163e+17 \n", - "25 925716434667184100 en 780060488600199200 NaN \n", - "26 925716438853345300 en 388380690 NaN \n", - "27 925716451457163300 en 899320696869974000 NaN \n", - "28 925716451461357600 en 784790670 NaN \n", - "29 925716459828936700 en 3051266655 NaN \n", - "... ... ... ... ... \n", - "68703 925624214522036200 en 1672876458 NaN \n", - "68704 925624218682777600 en 382473866 NaN \n", - "68705 925624222889766900 en 893145405457911800 NaN \n", - "68706 925624227088121900 en 240378516 NaN \n", - "68707 925624273237983200 en 784620573209002000 NaN \n", - "68708 925624273212805100 en 170998187 9.254136e+17 \n", - "68709 925624298395533300 en 1348667816 NaN \n", - "68710 925624298378801200 en 722481645765300200 NaN \n", - "68711 925624306779897900 en 2443251500 NaN \n", - "68712 925624310974136300 en 2406186390 NaN \n", - "68713 925624323557146600 en 1039448149 9.256150e+17 \n", - "68714 925624327755591700 en 845085544589672400 9.256009e+17 \n", - "68715 925624340342812700 en 924752524871131100 NaN \n", - "68716 925624340355280900 en 419493819 NaN \n", - "68717 925624340346937300 en 2457745952 9.256219e+17 \n", - "68718 925624340338507800 en 1955767531 NaN \n", - "68719 925624344524361700 en 796490344581898200 NaN \n", - "68720 925624348710285300 en 907808317124177900 NaN \n", - "68721 925624352929910800 en 262162415 NaN \n", - "68722 925624369715515400 en 574882525 NaN \n", - "68723 925624382269124600 en 556175173 9.254038e+17 \n", - "68724 925624386455031800 en 1610265588 NaN \n", - "68725 925624386454937600 en 4760724450 NaN \n", - "68726 925624390657572900 en 882858115636514800 NaN \n", - "68727 925624390682849300 en 188129628 NaN \n", - "68728 925624390666129400 en 2473135939 NaN \n", - "68729 925624390670106600 en 2373584209 9.256241e+17 \n", - "68730 925624407459971100 en 181689756 NaN \n", - "68731 925624407460057100 en 60160788 9.254610e+17 \n", - "68732 925624420022063100 en 3792290725 9.256215e+17 \n", - "\n", - " text \n", - "0 fashionbombdaily's photo 🏼 \n", - "1 It’s scary how on point my horoscope be \n", - "3 vivalcli: Portraits by Zhao Guojing an... \n", - "4 i wanna know too \n", - "5 veda was yoda too \n", - "6 I’m less stressed about turning 30 now ... \n", - "7 Full charged. \n", - "8 That’s part of the problem, (they) got me emotional there \n", - "11 Happy month to you and your loved ones ... \n", - "12 Maxx and Patricia. Family hangs at For Good He... \n", - "13 I need to STOP beating myself up with my thoug... \n", - "14 Cutest Son Roll no. 31 \n", - "15 By the summer I should have everything up and ... \n", - "16 I know my English is not that good but that do... \n", - "17 I u mama \n", - "18 That picture was NOT taken this morning... \n", - "19 Welcome to \n", - "20 Awkward \n", - "21 back at it with supernatural \n", - "22 One of the best things I've learned was to sto... \n", - "23 Can I taste? \n", - "24 we miss you ☹️ \n", - "25 Actually my bias in WJSN are Eunseo & Bona... \n", - "26 I so cannot be bothered with the rest of the d... \n", - "27 2lit4life \n", - "28 I’m not stop saying that! \n", - "29 HAPPY BIHDAY this one falls under the weird crazy... \n", - "68704 I'm not allowed to have chocolates yet, then I... \n", - "68705 Manchester United manager Mourinho slams 'spec... \n", - "68706 en Bushwhick \n", - "68707 : For Taxi Look, Mammeh and Daddeh! ... \n", - "68709 Life is so good with you \n", - "68710 Happy Halloween! 🏽 \n", - "68713 May pre-month celebration sis Awww Ajsksjdjd im smiling like ... \n", - "68715 I hate when I send a text or snap n I'm so anx... \n", - "68716 The answer is no I have no plans and I never l... \n", - "68717 LMAOOO I'm so proud \n", - "68718 My cousin/little sister is leaving to San Fran... \n", - "68719 Can't be alone w my thoughts tonight so just g... \n", - "68720 ambot!!! \n", - "68721 🏽🏽 1st of the month!!Happy 1st o... \n", - "68722 ... stay in bed \n", - "68723 THIS IS GOLD. GOLD. thank you for the kind compliment \n", - "68725 Enjoyed the silence \n", - "68726 OS: Spiderman Homecoming \n", - "68727 Go to hell πŸ½β€β™€οΈ \n", - "68728 Thank you Yomi! \n", - "68729 Lol. Just enjoy the stars. Music Kidhar... \n", - "68730 Thoughts and prayers for NY🏻 \n", - "68731 I searched COCK, PENIS, SHLONG, WINKY, ... \n", - "68732 Thank you so much<... \n", - "\n", - "[68733 rows x 9 columns]" - ] - }, - "execution_count": 6, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "twitter_data = pd.read_json(json_files[0], encoding=\"utf-8\")\n", - "twitter_data" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "* extracting emojis and text" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [], - "source": [ - "emojis = twitter_data['EMOJI']\n", - "plain_text = twitter_data['text']" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "* make our plain text more \"plain\":\n", - " * removing the keyword `` (just for the beginning)\n", - " * removing remaining useless emojis, like skin modifier etc." - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [], - "source": [ - "# defining blacklist for modifier emojis:\n", - "emoji_blacklist = set([\n", - " chr(0x1F3FB),\n", - " chr(0x1F3FC),\n", - " chr(0x1F3FD),\n", - " chr(0x1F3FE),\n", - " chr(0x1F3FF),\n", - " chr(0x2642),\n", - " chr(0x2640)\n", - "])" - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": {}, - "outputs": [], - "source": [ - "# filtering them and the EMOJI keyword out:\n", - "plain_text = plain_text.str.replace(\"(||)\",\"\").str.replace(\"[\" + \"\".join(list(emoji_blacklist)) + \"]\",\"\")" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "* convert all emojis to a sentiment vector" - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "metadata": {}, - "outputs": [], - "source": [ - "labels = emoji2sent([latest(e) for e in emojis])\n" - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "68733" - ] - }, - "execution_count": 12, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "len(labels)" - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "metadata": {}, - "outputs": [], - "source": [ - "wrong_labels = np.isnan(np.linalg.norm(labels, axis=1))" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "* remove all data we have no label for" - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "metadata": {}, - "outputs": [], - "source": [ - "labels = labels[np.invert(wrong_labels)]\n", - "plain_text = plain_text[np.invert(wrong_labels)]\n", - "emojis = emojis[np.invert(wrong_labels)]" - ] - }, - { - "cell_type": "code", - "execution_count": 15, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "33368 33368 33368\n" - ] - } - ], - "source": [ - "print(len(labels), len(emojis), len(plain_text))" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "* Apply stemming and lemmatization (if needed)" - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "metadata": {}, - "outputs": [], - "source": [ - "from nltk.stem.snowball import SnowballStemmer\n", - "from nltk.stem import WordNetLemmatizer\n", - "from nltk import pos_tag\n", - "from nltk import word_tokenize\n", - "from nltk.corpus import wordnet" - ] - }, - { - "cell_type": "code", - "execution_count": 17, - "metadata": {}, - "outputs": [], - "source": [ - "def get_wordnet_pos(treebank_tag):\n", - "\n", - " if treebank_tag.startswith('J'):\n", - " return wordnet.ADJ\n", - " elif treebank_tag.startswith('V'):\n", - " return wordnet.VERB\n", - " elif treebank_tag.startswith('N'):\n", - " return wordnet.NOUN\n", - " elif treebank_tag.startswith('R'):\n", - " return wordnet.ADV\n", - " else:\n", - " return wordnet.NOUN" - ] - }, - { - "cell_type": "code", - "execution_count": 18, - "metadata": {}, - "outputs": [], - "source": [ - "stemmer = SnowballStemmer(\"english\")\n", - "for key in plain_text.keys():\n", - " stemmed_sent = []\n", - " for word in plain_text[key].split(\" \"):\n", - " word_stemmed = stemmer.stem(word)\n", - " stemmed_sent.append(word_stemmed)\n", - " stemmed_sent = (\" \").join(stemmed_sent)\n", - " plain_text[key] = stemmed_sent" - ] - }, - { - "cell_type": "code", - "execution_count": 19, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "2 woooaaaahhh\n", - "4 i wan na know too\n", - "6 i 'm le stress about turn 30 now i think i'v r...\n", - "9 got me emot there\n", - "14 cutest son roll no . 31\n", - "15 by the summer i should have everyth up and run...\n", - "18 that pictur wa not taken this morning !\n", - "26 i so can not be bother with the rest of the da...\n", - "27 2lit4lif\n", - "35 hate fall asleep befor i put my phone on the c...\n", - "36 unexpect saw two of my crush today . this day ...\n", - "40 elvi whi o whi ? our girl wa such a love stori...\n", - "42 you'r late i ate them all\n", - "43 me toooo\n", - "47 the pressur is just too much\n", - "51 i broke grammar\n", - "52 have not desir to go to work today\n", - "53 omg do n't it scari all i know is that i do no...\n", - "56 achoo mr. fuck nigga you , you done caught cau...\n", - "58 i can never catch a dang break !\n", - "59 pas my p on two hour of sleep\n", - "60 i 'm realli not amus\n", - "65 i can help you\n", - "71 whew i slept good af last night\n", - "74 this would be epic . pizza and play perfect gi...\n", - "76 hey , it 1st novemb\n", - "80 u is to press bitch for me to have been speak ...\n", - "88 lmfao thought it wa just me be bitter\n", - "89 yupp yuppp . super prettttyyy , my heart cant ...\n", - "90 bakit halo halong seri binanggit mo be ? none ...\n", - " ... \n", - "68675 go back to dark hair tomorrow , mhmm yasss\n", - "68677 i miss them so much\n", - "68678 i wan na feel your gut too\n", - "68683 everi time\n", - "68687 i neither own nor watch tv . now go watch cnn\n", - "68688 revolutionari love\n", - "68694 ear worm is run in the famili after sing an aw...\n", - "68696 ill never look at you the same . yeah you got ...\n", - "68699 it our 3 year anniversari today to celebrate ,...\n", - "68700 person that scare me\n", - "68701 damn girl . can u look ani hotter than this ? ...\n", - "68703 this one fall under the weird crazi one .\n", - "68704 i 'm not allow to have chocol yet , then i uni...\n", - "68705 manchest unit manag mourinho slam specialists'...\n", - "68708 look , mammeh and daddeh ! cuuutee..\n", - "68709 life is so good with you\n", - "68710 happi halloween !\n", - "68712 scotti and kristen halloween costum\n", - "68713 may pre-month celebr si\n", - "68717 lmaooo i 'm so proud\n", - "68720 ambot ! ! !\n", - "68721 1st of the month ! ! happi 1st of novemb *53 d...\n", - "68722 ... stay in bed\n", - "68723 this is gold . gold .\n", - "68724 thank you for the kind compliment\n", - "68725 enjoy the silenc\n", - "68728 thank you yomi !\n", - "68729 lol . just enjoy the star . music kidhar aur b...\n", - "68730 thought and prayer for ny\n", - "68732 thank you so muchhav a happi wednesday and a g...\n", - "Name: text, Length: 33368, dtype: object\n" - ] - } - ], - "source": [ - "lemmatizer = WordNetLemmatizer()\n", - "for key in plain_text.keys():\n", - " lemmatized_sent = []\n", - " sent_pos = pos_tag(word_tokenize(plain_text[key]))\n", - " for word in sent_pos:\n", - " wordnet_pos = get_wordnet_pos(word[1].lower())\n", - " word_lemmatized = lemmatizer.lemmatize(word[0], pos=wordnet_pos)\n", - " lemmatized_sent.append(word_lemmatized)\n", - " lemmatized_sent = (\" \").join(lemmatized_sent)\n", - " plain_text[key] = lemmatized_sent\n", - "print(plain_text)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "* generate weights:" - ] - }, - { - "cell_type": "code", - "execution_count": 20, - "metadata": {}, - "outputs": [], - "source": [ - "# at first count over our table\n", - "emoji_count = {}\n", - "\n", - "\n", - "for e_list in emojis:\n", - " for e in set(e_list):\n", - " if e not in emoji_count:\n", - " emoji_count[e] = 0\n", - " emoji_count[e] += 1\n", - "\n", - "emoji_count\n", - "emoji_sum = sum([emoji_count[e] for e in emoji_count])\n", - "\n", - "emoji_weights = {}\n", - "for e in emoji_count:\n", - " # tfidf for emojis\n", - " emoji_weights[e] = np.log((emoji_sum / emoji_count[e]))\n", - "\n", - "weights_sum= sum([emoji_weights[x] for x in emoji_weights])\n", - " \n", - "# normalize:\n", - "for e in emoji_weights:\n", - " emoji_weights[e] = emoji_weights[e] / weights_sum\n", - "\n", - "emoji_weights['X'] = 0 # dummy values\n", - "emoji_count['X'] = 0" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "* most used emojis in Dataset" - ] - }, - { - "cell_type": "code", - "execution_count": 21, - "metadata": {}, - "outputs": [], - "source": [ - "import operator" - ] - }, - { - "cell_type": "code", - "execution_count": 22, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "[('πŸ˜‚', 10182),\n", - " ('😭', 3893),\n", - " ('😍', 2866),\n", - " ('😩', 1647),\n", - " ('😊', 1450),\n", - " ('😘', 1151),\n", - " ('πŸ™', 1089),\n", - " ('πŸ™Œ', 1003),\n", - " ('πŸ˜‰', 752),\n", - " ('😁', 697),\n", - " ('πŸ˜…', 651),\n", - " ('😎', 606),\n", - " ('😒', 544),\n", - " ('πŸ˜’', 539),\n", - " ('😏', 478),\n", - " ('😌', 434),\n", - " ('πŸ˜”', 415),\n", - " ('πŸ˜‹', 397),\n", - " ('πŸ˜€', 392),\n", - " ('😀', 368)]" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "text/plain": [ - "['πŸ˜‚',\n", - " '😭',\n", - " '😍',\n", - " '😩',\n", - " '😊',\n", - " '😘',\n", - " 'πŸ™',\n", - " 'πŸ™Œ',\n", - " 'πŸ˜‰',\n", - " '😁',\n", - " 'πŸ˜…',\n", - " '😎',\n", - " '😒',\n", - " 'πŸ˜’',\n", - " '😏',\n", - " '😌',\n", - " 'πŸ˜”',\n", - " 'πŸ˜‹',\n", - " 'πŸ˜€',\n", - " '😀']" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "sorted_emoji_count = list(reversed(sorted(emoji_count.items(), key=operator.itemgetter(1))))\n", - "display(sorted_emoji_count[:20])\n", - "\n", - "top_emojis = [x[0] for x in sorted_emoji_count[:20]]\n", - "display(top_emojis)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "* only learn the most used ones:" - ] - }, - { - "cell_type": "code", - "execution_count": 23, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "26197 26197 26197\n" - ] - } - ], - "source": [ - "in_top = [sentiment_vector_to_emoji(x) in top_emojis for x in labels]\n", - "labels = labels[in_top]\n", - "plain_text = plain_text[in_top]\n", - "emojis = emojis[in_top]\n", - "print(len(labels), len(emojis), len(plain_text))" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "* generating train and test set:" - ] - }, - { - "cell_type": "code", - "execution_count": 24, - "metadata": {}, - "outputs": [], - "source": [ - "X1, Xt1, y1, yt1 = train_test_split(plain_text, labels, test_size=0.1, random_state=4222)" - ] - }, - { - "cell_type": "code", - "execution_count": 25, - "metadata": {}, - "outputs": [], - "source": [ - "#y1_weights = np.array([(sum([emoji_weights[e] for e in e_list]) / len(e_list)) if len(e_list) > 0 else 0 for e_list in sent2emoji(y1)])" - ] - }, - { - "cell_type": "code", - "execution_count": 26, - "metadata": {}, - "outputs": [], - "source": [ - "vectorizer = TfidfVectorizer(stop_words='english')\n", - "vec_train = vectorizer.fit_transform(X1)\n", - "vec_test = vectorizer.transform(Xt1)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "* train. this can take a very long time..." - ] - }, - { - "cell_type": "code", - "execution_count": 27, - "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "Using TensorFlow backend.\n" - ] - } - ], - "source": [ - "from sklearn.neural_network import MLPClassifier as MLP\n", - "from sklearn.multiclass import OneVsRestClassifier as OVRC\n", - "from sklearn.tree import DecisionTreeClassifier as DTC\n", - "\n", - "from keras.models import Sequential\n", - "from keras.layers import Dense" - ] - }, - { - "cell_type": "code", - "execution_count": 28, - "metadata": {}, - "outputs": [], - "source": [ - "def train(max_size = 10000, layers=[(1024, 'relu'),(y1[0].shape[0],'softmax')], random_state=4222, ovrc=False, n_iter=5):\n", - " \n", - " model = Sequential()\n", - " \n", - " # build mlp layers:\n", - " keras_layers = []\n", - " first_layer = True\n", - " for layer in layers:\n", - " if first_layer:\n", - " model.add(Dense(units=layer[0], activation=layer[1], input_dim=vectorizer.transform([\" \"])[0]._shape[1]))\n", - " first_layer = False\n", - " else:\n", - " model.add(Dense(units=layer[0], activation=layer[1]))\n", - " \n", - " #mlp = MLPClassifier(layers=sknn_layers, random_state=random_state, verbose=True, n_iter=n_iter, batch_size=100)\n", - " \n", - " model.compile(loss='mean_squared_error',\n", - " optimizer='adam')\n", - " \n", - " clf = OVRC(model) if ovrc else model\n", - "\n", - " clf.fit(vec_train[:max_size].A, y1[:max_size], validation_split=0.2, epochs=n_iter)#, sample_weight=y1_weights[:max_size])\n", - " \n", - " return clf" - ] - }, - { - "cell_type": "code", - "execution_count": 29, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Train on 18861 samples, validate on 4716 samples\n", - "Epoch 1/3\n", - "18861/18861 [==============================] - 1106s 59ms/step - loss: 0.0185 - val_loss: 0.0152\n", - "Epoch 2/3\n", - "18861/18861 [==============================] - 1104s 59ms/step - loss: 0.0107 - val_loss: 0.0163\n", - "Epoch 3/3\n", - "18861/18861 [==============================] - 1106s 59ms/step - loss: 0.0065 - val_loss: 0.0166\n" - ] - } - ], - "source": [ - "clf = train(max_size=100000,layers=[(10000, 'relu'),(5000, 'relu'),(2500, 'relu'),(y1[0].shape[0],None)], n_iter=3)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "* make a prediction and store it in a csv file:" - ] - }, - { - "cell_type": "code", - "execution_count": 30, - "metadata": {}, - "outputs": [], - "source": [ - "pred = clf.predict(vectorizer.transform(Xt1))" - ] - }, - { - "cell_type": "code", - "execution_count": 31, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "0.011668838\n", - "0.03387511671001757\n" - ] - } - ], - "source": [ - "print(np.linalg.norm(np.var(pred, axis=0)))\n", - "print(np.linalg.norm(np.var(labels, axis=0)))\n" - ] - }, - { - "cell_type": "code", - "execution_count": 32, - "metadata": {}, - "outputs": [], - "source": [ - "# build a dataframe to visualize test results:\n", - "testlist = pd.DataFrame({'text': Xt1, \n", - " 'teacher': sent2emoji(yt1),\n", - " 'teacher_sentiment': yt1.tolist(),\n", - " 'predict': sent2emoji(pred, custom_target_emojis=top_emojis),\n", - " 'predicted_sentiment': pred.tolist()})" - ] - }, - { - "cell_type": "code", - "execution_count": 33, - "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", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
textteacherteacher_sentimentpredictpredicted_sentiment
35671i feel like i care so much more in everi situatπŸ˜‚[0.46813021474490496, 0.24716181096977158, 0.2...πŸ˜…[0.4447824954986572, 0.30056363344192505, 0.27...
25683i did not meat to add that 2 there ... hav see...πŸ˜‚[0.46813021474490496, 0.24716181096977158, 0.2...😁[0.5660845637321472, 0.1737498641014099, 0.284...
8985neverβ€¦πŸ˜Š[0.7040175768989329, 0.059322033898305086, 0.2...πŸ˜‚[0.4871470034122467, 0.26607102155685425, 0.27...
5410lmao on me ! ! ! wtf wa he suppos to sayπŸ˜‚[0.46813021474490496, 0.24716181096977158, 0.2...😒[0.4061833620071411, 0.3226468861103058, 0.273...
62611this dude alway help me get through my school ...😊[0.7040175768989329, 0.059322033898305086, 0.2...πŸ˜‚[0.4549962878227234, 0.21886931359767914, 0.33...
48197happi b'day sir😊[0.7040175768989329, 0.059322033898305086, 0.2...πŸ˜€[0.6561306715011597, 0.11821962147951126, 0.27...
23654you need some good old fashion swedish jesusπŸ™[0.4983755685510071, 0.08057179987004548, 0.42...πŸ˜…[0.4600130021572113, 0.28595462441444397, 0.27...
58207these late shift are make me not have a social...πŸ˜…[0.47186147186147187, 0.2922077922077922, 0.23...πŸ˜‚[0.49543458223342896, 0.25571855902671814, 0.2...
374dc this weekend😍[0.7296744771190439, 0.05173769460607014, 0.21...😌[0.6040589213371277, 0.15823380649089813, 0.26...
26310paul lad you 'll make e blush😊[0.7040175768989329, 0.059322033898305086, 0.2...πŸ˜‚[0.452500581741333, 0.2882971167564392, 0.2790...
30892did you have a fun halloween ?πŸ˜‚[0.46813021474490496, 0.24716181096977158, 0.2...πŸ˜‚[0.4644194543361664, 0.2708289325237274, 0.277...
11868hi handsom😍[0.7296744771190439, 0.05173769460607014, 0.21...😊[0.7254493236541748, 0.12355809658765793, 0.22...
46219i 'm not okay with this , i 'm su snapchat😭[0.34310532030401736, 0.4364820846905538, 0.22...πŸ˜”[0.3264158070087433, 0.48023173213005066, 0.23...
13583my parent be so mad i be buy new stuff & amp ;...😭[0.34310532030401736, 0.4364820846905538, 0.22...πŸ˜‚[0.4271591007709503, 0.29361462593078613, 0.29...
43843one of the few song that calm me down esp on f...πŸ˜‚[0.46813021474490496, 0.24716181096977158, 0.2...πŸ˜‚[0.44168680906295776, 0.2790682315826416, 0.29...
63589iphon x bouta be the last phone we ever buyπŸ˜‚[0.46813021474490496, 0.24716181096977158, 0.2...πŸ˜…[0.41863512992858887, 0.3106093108654022, 0.28...
53695visit my main man today ❀ i miss u papa😭[0.34310532030401736, 0.4364820846905538, 0.22...😁[0.5650997757911682, 0.19236208498477936, 0.27...
67529donut😍[0.7296744771190439, 0.05173769460607014, 0.21...πŸ˜‚[0.45511549711227417, 0.28582143783569336, 0.2...
25493ha anyon heard this by ? who the fuck knew he ...😘[0.7546600877192983, 0.05290570175438596, 0.19...πŸ˜…[0.4276219606399536, 0.30413898825645447, 0.28...
19486wow superrbb😍[0.7296744771190439, 0.05173769460607014, 0.21...😊[0.7149834036827087, 0.10459273308515549, 0.24...
48449of cours they do n't . their perfect model of ...πŸ˜‚[0.46813021474490496, 0.24716181096977158, 0.2...πŸ˜‚[0.5363025665283203, 0.22163532674312592, 0.27...
4504plea pick me . pick me . pick me . please .😍[0.7296744771190439, 0.05173769460607014, 0.21...πŸ˜‚[0.4641677737236023, 0.18824045360088348, 0.37...
40285shiid no crack is wack😭[0.34310532030401736, 0.4364820846905538, 0.22...πŸ˜‚[0.44292521476745605, 0.28201037645339966, 0.2...
56741pj still sleep like a newborn😩[0.22289823008849557, 0.5912610619469026, 0.18...😒[0.40168094635009766, 0.3777309060096741, 0.24...
22948an opinion doe n't mean you make sen first off...😌[0.6240601503759399, 0.13984962406015036, 0.23...πŸ˜‚[0.4365620017051697, 0.2830066680908203, 0.294...
68426missyou too😘[0.7546600877192983, 0.05290570175438596, 0.19...😭[0.3452186584472656, 0.4593580365180969, 0.223...
13431i swear she did😩[0.22289823008849557, 0.5912610619469026, 0.18...πŸ˜‚[0.4436468482017517, 0.2736954987049103, 0.294...
66287it true , he wa the mutt ( big-d ) nut .πŸ˜‰[0.5634451019066403, 0.0992767915844839, 0.337...πŸ˜…[0.47334975004196167, 0.2881445586681366, 0.26...
41980is happen so happi😭[0.34310532030401736, 0.4364820846905538, 0.22...πŸ˜…[0.4635038673877716, 0.30251604318618774, 0.26...
34632saw that the first one said sose you tmmrw and npπŸ˜‚[0.46813021474490496, 0.24716181096977158, 0.2...πŸ˜…[0.43297499418258667, 0.31000325083732605, 0.2...
..................
47218keep it i do n't want itπŸ˜‚[0.46813021474490496, 0.24716181096977158, 0.2...πŸ˜…[0.470976859331131, 0.2997904419898987, 0.2489...
350876 year ago today we said our final good bye , ...😒[0.39118825100133514, 0.38451268357810414, 0.2...πŸ˜…[0.4478594660758972, 0.30181050300598145, 0.27...
61252amenπŸ™[0.4983755685510071, 0.08057179987004548, 0.42...😁[0.5783949494361877, 0.15405726432800293, 0.30...
39960fact😎[0.5981432360742706, 0.10477453580901856, 0.29...πŸ˜‚[0.4938848316669464, 0.24237176775932312, 0.25...
365nw final found someon hi loydiπŸ˜…[0.47186147186147187, 0.2922077922077922, 0.23...😌[0.6203110218048096, 0.17863908410072327, 0.23...
50665i need ur shoulder to cri on😒[0.39118825100133514, 0.38451268357810414, 0.2...πŸ˜…[0.4619033932685852, 0.2977892756462097, 0.267...
21007awww you 'll get me teari eye gurl !😘[0.7546600877192983, 0.05290570175438596, 0.19...πŸ˜…[0.5029815435409546, 0.2711288630962372, 0.253...
18819γ€°happi hump day to all my ladi is def sweet like😘[0.7546600877192983, 0.05290570175438596, 0.19...πŸ™Œ[0.6974080801010132, 0.11416944861412048, 0.24...
42421thanks .😊[0.7040175768989329, 0.059322033898305086, 0.2...😁[0.5765037536621094, 0.18341206014156342, 0.26...
38705it okay i did n't see you until i wa in your faceπŸ˜‚[0.46813021474490496, 0.24716181096977158, 0.2...😒[0.4030645787715912, 0.36543628573417664, 0.25...
47033fall in with alexissdang β¬…οΈπŸ˜[0.7296744771190439, 0.05173769460607014, 0.21...😌[0.6219494342803955, 0.1795988380908966, 0.226...
38742let your wild side free girl ! ! ! ! !πŸ˜‚[0.46813021474490496, 0.24716181096977158, 0.2...😒[0.4049544930458069, 0.35102248191833496, 0.25...
67610can we get season 3 already ! ?😭[0.34310532030401736, 0.4364820846905538, 0.22...😒[0.416861355304718, 0.35468244552612305, 0.245...
61021have to quot this bih rememb this niggaπŸ˜‚[0.46813021474490496, 0.24716181096977158, 0.2...πŸ˜‚[0.4401417672634125, 0.2810788154602051, 0.292...
14904he so damn😩[0.22289823008849557, 0.5912610619469026, 0.18...πŸ˜‚[0.5411785244941711, 0.2148503214120865, 0.246...
50994yasss it time for a great show maxloyalβ„’β™› : gi...πŸ˜‚[0.46813021474490496, 0.24716181096977158, 0.2...πŸ™Œ[0.7073097229003906, 0.12480126321315765, 0.23...
6973got to love a fish finger sarniπŸ˜‚[0.46813021474490496, 0.24716181096977158, 0.2...😌[0.6375303864479065, 0.14495858550071716, 0.24...
3269say datπŸ˜‚[0.46813021474490496, 0.24716181096977158, 0.2...πŸ˜‚[0.5052645802497864, 0.21280284225940704, 0.30...
54827if ur happi i 'm happi😊[0.7040175768989329, 0.059322033898305086, 0.2...πŸ˜…[0.5138391852378845, 0.26520460844039917, 0.25...
19409rockstarπŸ˜€[0.6560364464692483, 0.08428246013667426, 0.25...πŸ˜‚[0.520979106426239, 0.22392335534095764, 0.265...
38703god fuck me i alreadi fix it oncπŸ˜‚[0.46813021474490496, 0.24716181096977158, 0.2...πŸ˜”[0.32009249925613403, 0.4819949269294739, 0.22...
25133it social accept to listen to ani christma mus...πŸ˜‚[0.46813021474490496, 0.24716181096977158, 0.2...😁[0.5703040361404419, 0.17875489592552185, 0.27...
15339i thrash p in imessag now he wan na bet on 2kπŸ˜‚[0.46813021474490496, 0.24716181096977158, 0.2...πŸ˜…[0.4571400284767151, 0.2949279546737671, 0.269...
28082my fatass need some lemon pepper wing w a lil ...πŸ˜‚[0.46813021474490496, 0.24716181096977158, 0.2...😭[0.36291953921318054, 0.4310339391231537, 0.22...
44462fck off tristan yes soph collect u in 15 n we ...😀[0.2691131498470948, 0.4801223241590214, 0.250...😌[0.6122021675109863, 0.15579015016555786, 0.27...
60212open the bagπŸ˜‹[0.6784741144414169, 0.04495912806539509, 0.27...πŸ˜‚[0.470508873462677, 0.2711063623428345, 0.2810...
34950i ask peopl to guess my zodiac sign and this o...😀[0.2691131498470948, 0.4801223241590214, 0.250...πŸ˜‚[0.4431285262107849, 0.27477312088012695, 0.29...
59462i regret this smπŸ˜‚[0.46813021474490496, 0.24716181096977158, 0.2...😒[0.40375131368637085, 0.3289208710193634, 0.27...
19465fuck collegπŸ˜‚[0.46813021474490496, 0.24716181096977158, 0.2...πŸ˜…[0.4494284391403198, 0.31076472997665405, 0.26...
8135aye this wa my first time actual see it wendi ...πŸ˜‚[0.46813021474490496, 0.24716181096977158, 0.2...πŸ˜…[0.42708122730255127, 0.31392431259155273, 0.2...
\n", - "

2620 rows Γ— 5 columns

\n", - "
" - ], - "text/plain": [ - " text teacher \\\n", - "35671 i feel like i care so much more in everi situat πŸ˜‚ \n", - "25683 i did not meat to add that 2 there ... hav see... πŸ˜‚ \n", - "8985 never… 😊 \n", - "5410 lmao on me ! ! ! wtf wa he suppos to say πŸ˜‚ \n", - "62611 this dude alway help me get through my school ... 😊 \n", - "48197 happi b'day sir 😊 \n", - "23654 you need some good old fashion swedish jesus πŸ™ \n", - "58207 these late shift are make me not have a social... πŸ˜… \n", - "374 dc this weekend 😍 \n", - "26310 paul lad you 'll make e blush 😊 \n", - "30892 did you have a fun halloween ? πŸ˜‚ \n", - "11868 hi handsom 😍 \n", - "46219 i 'm not okay with this , i 'm su snapchat 😭 \n", - "13583 my parent be so mad i be buy new stuff & amp ;... 😭 \n", - "43843 one of the few song that calm me down esp on f... πŸ˜‚ \n", - "63589 iphon x bouta be the last phone we ever buy πŸ˜‚ \n", - "53695 visit my main man today ❀ i miss u papa 😭 \n", - "67529 donut 😍 \n", - "25493 ha anyon heard this by ? who the fuck knew he ... 😘 \n", - "19486 wow superrbb 😍 \n", - "48449 of cours they do n't . their perfect model of ... πŸ˜‚ \n", - "4504 plea pick me . pick me . pick me . please . 😍 \n", - "40285 shiid no crack is wack 😭 \n", - "56741 pj still sleep like a newborn 😩 \n", - "22948 an opinion doe n't mean you make sen first off... 😌 \n", - "68426 missyou too 😘 \n", - "13431 i swear she did 😩 \n", - "66287 it true , he wa the mutt ( big-d ) nut . πŸ˜‰ \n", - "41980 is happen so happi 😭 \n", - "34632 saw that the first one said sose you tmmrw and np πŸ˜‚ \n", - "... ... ... \n", - "47218 keep it i do n't want it πŸ˜‚ \n", - "35087 6 year ago today we said our final good bye , ... 😒 \n", - "61252 amen πŸ™ \n", - "39960 fact 😎 \n", - "365 nw final found someon hi loydi πŸ˜… \n", - "50665 i need ur shoulder to cri on 😒 \n", - "21007 awww you 'll get me teari eye gurl ! 😘 \n", - "18819 γ€°happi hump day to all my ladi is def sweet like 😘 \n", - "42421 thanks . 😊 \n", - "38705 it okay i did n't see you until i wa in your face πŸ˜‚ \n", - "47033 fall in with alexissdang ⬅️ 😍 \n", - "38742 let your wild side free girl ! ! ! ! ! πŸ˜‚ \n", - "67610 can we get season 3 already ! ? 😭 \n", - "61021 have to quot this bih rememb this nigga πŸ˜‚ \n", - "14904 he so damn 😩 \n", - "50994 yasss it time for a great show maxloyalβ„’β™› : gi... πŸ˜‚ \n", - "6973 got to love a fish finger sarni πŸ˜‚ \n", - "3269 say dat πŸ˜‚ \n", - "54827 if ur happi i 'm happi 😊 \n", - "19409 rockstar πŸ˜€ \n", - "38703 god fuck me i alreadi fix it onc πŸ˜‚ \n", - "25133 it social accept to listen to ani christma mus... πŸ˜‚ \n", - "15339 i thrash p in imessag now he wan na bet on 2k πŸ˜‚ \n", - "28082 my fatass need some lemon pepper wing w a lil ... πŸ˜‚ \n", - "44462 fck off tristan yes soph collect u in 15 n we ... 😀 \n", - "60212 open the bag πŸ˜‹ \n", - "34950 i ask peopl to guess my zodiac sign and this o... 😀 \n", - "59462 i regret this sm πŸ˜‚ \n", - "19465 fuck colleg πŸ˜‚ \n", - "8135 aye this wa my first time actual see it wendi ... πŸ˜‚ \n", - "\n", - " teacher_sentiment predict \\\n", - "35671 [0.46813021474490496, 0.24716181096977158, 0.2... πŸ˜… \n", - "25683 [0.46813021474490496, 0.24716181096977158, 0.2... 😁 \n", - "8985 [0.7040175768989329, 0.059322033898305086, 0.2... πŸ˜‚ \n", - "5410 [0.46813021474490496, 0.24716181096977158, 0.2... 😒 \n", - "62611 [0.7040175768989329, 0.059322033898305086, 0.2... πŸ˜‚ \n", - "48197 [0.7040175768989329, 0.059322033898305086, 0.2... πŸ˜€ \n", - "23654 [0.4983755685510071, 0.08057179987004548, 0.42... πŸ˜… \n", - "58207 [0.47186147186147187, 0.2922077922077922, 0.23... πŸ˜‚ \n", - "374 [0.7296744771190439, 0.05173769460607014, 0.21... 😌 \n", - "26310 [0.7040175768989329, 0.059322033898305086, 0.2... πŸ˜‚ \n", - "30892 [0.46813021474490496, 0.24716181096977158, 0.2... πŸ˜‚ \n", - "11868 [0.7296744771190439, 0.05173769460607014, 0.21... 😊 \n", - "46219 [0.34310532030401736, 0.4364820846905538, 0.22... πŸ˜” \n", - "13583 [0.34310532030401736, 0.4364820846905538, 0.22... πŸ˜‚ \n", - "43843 [0.46813021474490496, 0.24716181096977158, 0.2... πŸ˜‚ \n", - "63589 [0.46813021474490496, 0.24716181096977158, 0.2... πŸ˜… \n", - "53695 [0.34310532030401736, 0.4364820846905538, 0.22... 😁 \n", - "67529 [0.7296744771190439, 0.05173769460607014, 0.21... πŸ˜‚ \n", - "25493 [0.7546600877192983, 0.05290570175438596, 0.19... πŸ˜… \n", - "19486 [0.7296744771190439, 0.05173769460607014, 0.21... 😊 \n", - "48449 [0.46813021474490496, 0.24716181096977158, 0.2... πŸ˜‚ \n", - "4504 [0.7296744771190439, 0.05173769460607014, 0.21... πŸ˜‚ \n", - "40285 [0.34310532030401736, 0.4364820846905538, 0.22... πŸ˜‚ \n", - "56741 [0.22289823008849557, 0.5912610619469026, 0.18... 😒 \n", - "22948 [0.6240601503759399, 0.13984962406015036, 0.23... πŸ˜‚ \n", - "68426 [0.7546600877192983, 0.05290570175438596, 0.19... 😭 \n", - "13431 [0.22289823008849557, 0.5912610619469026, 0.18... πŸ˜‚ \n", - "66287 [0.5634451019066403, 0.0992767915844839, 0.337... πŸ˜… \n", - "41980 [0.34310532030401736, 0.4364820846905538, 0.22... πŸ˜… \n", - "34632 [0.46813021474490496, 0.24716181096977158, 0.2... πŸ˜… \n", - "... ... ... \n", - "47218 [0.46813021474490496, 0.24716181096977158, 0.2... πŸ˜… \n", - "35087 [0.39118825100133514, 0.38451268357810414, 0.2... πŸ˜… \n", - "61252 [0.4983755685510071, 0.08057179987004548, 0.42... 😁 \n", - "39960 [0.5981432360742706, 0.10477453580901856, 0.29... πŸ˜‚ \n", - "365 [0.47186147186147187, 0.2922077922077922, 0.23... 😌 \n", - "50665 [0.39118825100133514, 0.38451268357810414, 0.2... πŸ˜… \n", - "21007 [0.7546600877192983, 0.05290570175438596, 0.19... πŸ˜… \n", - "18819 [0.7546600877192983, 0.05290570175438596, 0.19... πŸ™Œ \n", - "42421 [0.7040175768989329, 0.059322033898305086, 0.2... 😁 \n", - "38705 [0.46813021474490496, 0.24716181096977158, 0.2... 😒 \n", - "47033 [0.7296744771190439, 0.05173769460607014, 0.21... 😌 \n", - "38742 [0.46813021474490496, 0.24716181096977158, 0.2... 😒 \n", - "67610 [0.34310532030401736, 0.4364820846905538, 0.22... 😒 \n", - "61021 [0.46813021474490496, 0.24716181096977158, 0.2... πŸ˜‚ \n", - "14904 [0.22289823008849557, 0.5912610619469026, 0.18... πŸ˜‚ \n", - "50994 [0.46813021474490496, 0.24716181096977158, 0.2... πŸ™Œ \n", - "6973 [0.46813021474490496, 0.24716181096977158, 0.2... 😌 \n", - "3269 [0.46813021474490496, 0.24716181096977158, 0.2... πŸ˜‚ \n", - "54827 [0.7040175768989329, 0.059322033898305086, 0.2... πŸ˜… \n", - "19409 [0.6560364464692483, 0.08428246013667426, 0.25... πŸ˜‚ \n", - "38703 [0.46813021474490496, 0.24716181096977158, 0.2... πŸ˜” \n", - "25133 [0.46813021474490496, 0.24716181096977158, 0.2... 😁 \n", - "15339 [0.46813021474490496, 0.24716181096977158, 0.2... πŸ˜… \n", - "28082 [0.46813021474490496, 0.24716181096977158, 0.2... 😭 \n", - "44462 [0.2691131498470948, 0.4801223241590214, 0.250... 😌 \n", - "60212 [0.6784741144414169, 0.04495912806539509, 0.27... πŸ˜‚ \n", - "34950 [0.2691131498470948, 0.4801223241590214, 0.250... πŸ˜‚ \n", - "59462 [0.46813021474490496, 0.24716181096977158, 0.2... 😒 \n", - "19465 [0.46813021474490496, 0.24716181096977158, 0.2... πŸ˜… \n", - "8135 [0.46813021474490496, 0.24716181096977158, 0.2... πŸ˜… \n", - "\n", - " predicted_sentiment \n", - "35671 [0.4447824954986572, 0.30056363344192505, 0.27... \n", - "25683 [0.5660845637321472, 0.1737498641014099, 0.284... \n", - "8985 [0.4871470034122467, 0.26607102155685425, 0.27... \n", - "5410 [0.4061833620071411, 0.3226468861103058, 0.273... \n", - "62611 [0.4549962878227234, 0.21886931359767914, 0.33... \n", - "48197 [0.6561306715011597, 0.11821962147951126, 0.27... \n", - "23654 [0.4600130021572113, 0.28595462441444397, 0.27... \n", - "58207 [0.49543458223342896, 0.25571855902671814, 0.2... \n", - "374 [0.6040589213371277, 0.15823380649089813, 0.26... \n", - "26310 [0.452500581741333, 0.2882971167564392, 0.2790... \n", - "30892 [0.4644194543361664, 0.2708289325237274, 0.277... \n", - "11868 [0.7254493236541748, 0.12355809658765793, 0.22... \n", - "46219 [0.3264158070087433, 0.48023173213005066, 0.23... \n", - "13583 [0.4271591007709503, 0.29361462593078613, 0.29... \n", - "43843 [0.44168680906295776, 0.2790682315826416, 0.29... \n", - "63589 [0.41863512992858887, 0.3106093108654022, 0.28... \n", - "53695 [0.5650997757911682, 0.19236208498477936, 0.27... \n", - "67529 [0.45511549711227417, 0.28582143783569336, 0.2... \n", - "25493 [0.4276219606399536, 0.30413898825645447, 0.28... \n", - "19486 [0.7149834036827087, 0.10459273308515549, 0.24... \n", - "48449 [0.5363025665283203, 0.22163532674312592, 0.27... \n", - "4504 [0.4641677737236023, 0.18824045360088348, 0.37... \n", - "40285 [0.44292521476745605, 0.28201037645339966, 0.2... \n", - "56741 [0.40168094635009766, 0.3777309060096741, 0.24... \n", - "22948 [0.4365620017051697, 0.2830066680908203, 0.294... \n", - "68426 [0.3452186584472656, 0.4593580365180969, 0.223... \n", - "13431 [0.4436468482017517, 0.2736954987049103, 0.294... \n", - "66287 [0.47334975004196167, 0.2881445586681366, 0.26... \n", - "41980 [0.4635038673877716, 0.30251604318618774, 0.26... \n", - "34632 [0.43297499418258667, 0.31000325083732605, 0.2... \n", - "... ... \n", - "47218 [0.470976859331131, 0.2997904419898987, 0.2489... \n", - "35087 [0.4478594660758972, 0.30181050300598145, 0.27... \n", - "61252 [0.5783949494361877, 0.15405726432800293, 0.30... \n", - "39960 [0.4938848316669464, 0.24237176775932312, 0.25... \n", - "365 [0.6203110218048096, 0.17863908410072327, 0.23... \n", - "50665 [0.4619033932685852, 0.2977892756462097, 0.267... \n", - "21007 [0.5029815435409546, 0.2711288630962372, 0.253... \n", - "18819 [0.6974080801010132, 0.11416944861412048, 0.24... \n", - "42421 [0.5765037536621094, 0.18341206014156342, 0.26... \n", - "38705 [0.4030645787715912, 0.36543628573417664, 0.25... \n", - "47033 [0.6219494342803955, 0.1795988380908966, 0.226... \n", - "38742 [0.4049544930458069, 0.35102248191833496, 0.25... \n", - "67610 [0.416861355304718, 0.35468244552612305, 0.245... \n", - "61021 [0.4401417672634125, 0.2810788154602051, 0.292... \n", - "14904 [0.5411785244941711, 0.2148503214120865, 0.246... \n", - "50994 [0.7073097229003906, 0.12480126321315765, 0.23... \n", - "6973 [0.6375303864479065, 0.14495858550071716, 0.24... \n", - "3269 [0.5052645802497864, 0.21280284225940704, 0.30... \n", - "54827 [0.5138391852378845, 0.26520460844039917, 0.25... \n", - "19409 [0.520979106426239, 0.22392335534095764, 0.265... \n", - "38703 [0.32009249925613403, 0.4819949269294739, 0.22... \n", - "25133 [0.5703040361404419, 0.17875489592552185, 0.27... \n", - "15339 [0.4571400284767151, 0.2949279546737671, 0.269... \n", - "28082 [0.36291953921318054, 0.4310339391231537, 0.22... \n", - "44462 [0.6122021675109863, 0.15579015016555786, 0.27... \n", - "60212 [0.470508873462677, 0.2711063623428345, 0.2810... \n", - "34950 [0.4431285262107849, 0.27477312088012695, 0.29... \n", - "59462 [0.40375131368637085, 0.3289208710193634, 0.27... \n", - "19465 [0.4494284391403198, 0.31076472997665405, 0.26... \n", - "8135 [0.42708122730255127, 0.31392431259155273, 0.2... \n", - "\n", - "[2620 rows x 5 columns]" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "display(testlist)\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "* exactly correct labeled sentences:" - ] - }, - { - "cell_type": "code", - "execution_count": 34, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "0.1851145038167939\n" - ] - } - ], - "source": [ - "print (sum([1 if sample[1]['teacher'] == sample[1]['predict'] else 0 for sample in testlist.iterrows()]) / testlist.shape[0])" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "* mean squared error:" - ] - }, - { - "cell_type": "code", - "execution_count": 35, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "array([0.02218282, 0.02594105, 0.00323429])" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "teacher_sentiments = np.array([sample[1]['teacher_sentiment'] for sample in testlist.iterrows()])\n", - "predicted_sentiments = np.array([sample[1]['predicted_sentiment'] for sample in testlist.iterrows()])\n", - "\n", - "mean_squared_error = ((teacher_sentiments - predicted_sentiments)**2).mean(axis=0)\n", - "display(mean_squared_error)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "* by an overall variance of:" - ] - }, - { - "cell_type": "code", - "execution_count": 36, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Variance teacher: [0.02183094 0.02513847 0.00285735]\n", - "Variance prediction: [0.00850173 0.00793481 0.00095984]\n" - ] - } - ], - "source": [ - "print(\"Variance teacher: \", np.var(teacher_sentiments, axis=0))\n", - "print(\"Variance prediction: \", np.var(predicted_sentiments, axis=0))" - ] - }, - { - "cell_type": "code", - "execution_count": 37, - "metadata": {}, - "outputs": [], - "source": [ - "testlist.to_csv('test.csv')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "* save classifier:" - ] - }, - { - "cell_type": "code", - "execution_count": 38, - "metadata": {}, - "outputs": [], - "source": [ - "import pickle\n", - "clf.save(\"clf2.keras\")\n", - "pickle.dump( vectorizer, open( \"vec2.pickle\", \"wb\" ) )" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "----\n", - "## testing area\n", - "\n", - "**for just testing, start from here!**\n", - "\n", - "download the dumped classifier and vectorizer from [here](https://the-cake-is-a-lie.net/nextcloud/index.php/s/NjMXamfwQsyrefG)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "* loading classifier and vectorizer" - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "metadata": {}, - "outputs": [], - "source": [ - "from IPython.display import clear_output, Markdown, Math\n", - "import ipywidgets as widgets\n", - "import sys\n", - "sys.path.append(\"..\")\n", - "\n", - "from Tools.Emoji_Distance import sentiment_vector_to_emoji\n", - "from Tools.Emoji_Distance import emoji_to_sentiment_vector\n", - "\n", - "def emoji2sent(emoji_arr):\n", - " return np.array([emoji_to_sentiment_vector(e) for e in emoji_arr])\n", - "\n", - "def sent2emoji(sent_arr, custom_target_emojis=None):\n", - " return [sentiment_vector_to_emoji(s, custom_target_emojis=custom_target_emojis) for s in sent_arr]" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "import keras\n", - "import pickle\n", - "clf = keras.models.load_model(\"clf.keras\")\n", - "vectorizer = pickle.load( open( \"vec.pickle\", \"rb\" ) )" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "* define lookup emojis here:" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [], - "source": [ - "lookup_emojis = [#'πŸ˜‚',\n", - " '😭',\n", - " '😍',\n", - " '😩',\n", - " '😊',\n", - " '😘',\n", - " 'πŸ™',\n", - " 'πŸ™Œ',\n", - " 'πŸ˜‰',\n", - " '😁',\n", - " 'πŸ˜…',\n", - " '😎',\n", - " '😒',\n", - " 'πŸ˜’',\n", - " '😏',\n", - " '😌',\n", - " 'πŸ˜”',\n", - " 'πŸ˜‹',\n", - " 'πŸ˜€',\n", - " '😀']" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "* a simple output widget for testing:" - ] - }, - { - "cell_type": "code", - "execution_count": 19, - "metadata": {}, - "outputs": [ - { - "data": { - "application/vnd.jupyter.widget-view+json": { - "model_id": "755aa31644db4628a3be1ff3b621fa28", - "version_major": 2, - "version_minor": 0 - }, - "text/plain": [ - "Text(value='')" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "application/vnd.jupyter.widget-view+json": { - "model_id": "4601eccc07074e71983c9005d1d329b1", - "version_major": 2, - "version_minor": 0 - }, - "text/plain": [ - "VBox(children=(Button(description='get emoji', icon='check', style=ButtonStyle(), tooltip='Click me'), Output(…" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "out = widgets.Output()\n", - "\n", - "t = widgets.Text()\n", - "b = widgets.Button(\n", - " description='get emoji',\n", - " disabled=False,\n", - " button_style='', # 'success', 'info', 'warning', 'danger' or ''\n", - " tooltip='Click me',\n", - " icon='check'\n", - ")\n", - "\n", - "\n", - "\n", - "def handle_submit(sender):\n", - " with out:\n", - " clear_output()\n", - " with out:\n", - " pred = clf.predict(vectorizer.transform([t.value]))\n", - " \n", - " display(Markdown(\"# Predicted Emoji \" + str(sent2emoji(pred, lookup_emojis)[0])))\n", - " display(Markdown(\"# Sentiment Vector: $$ \\pmatrix{\" + str(pred[0,0]) +\n", - " \"\\\\\\\\\" + str(pred[0,1]) + \"\\\\\\\\\" + str(pred[0,2]) + \"}$$\"))\n", - "\n", - "b.on_click(handle_submit)\n", - " \n", - "display(t)\n", - "display(widgets.VBox([b, out])) " - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [ - { - "ename": "NameError", - "evalue": "name 'mlb' is not defined", - "output_type": "error", - "traceback": [ - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[0;31mNameError\u001b[0m Traceback (most recent call last)", - "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[0;32mimport\u001b[0m \u001b[0mnumpy\u001b[0m \u001b[0;32mas\u001b[0m \u001b[0mnp\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 2\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 3\u001b[0;31m \u001b[0my_trans\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mmlb\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0minverse_transform\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0myt1\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 4\u001b[0m \u001b[0mpred_trans\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mmlb\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0minverse_transform\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0myt1\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 5\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;31mNameError\u001b[0m: name 'mlb' is not defined" - ] - } - ], - "source": [ - "import numpy as np\n", - "\n", - "y_trans = mlb.inverse_transform(yt1)\n", - "pred_trans = mlb.inverse_transform(yt1)\n", - "\n", - "# evaluate accuracy\n", - "pos = 0\n", - "neg = 0\n", - "all = 0\n", - "for entry in range(len(y_trans)):\n", - " if len(np.intersect1d(y_trans[entry], pred_trans[entry])) > 0:\n", - " pos += 1\n", - " else:\n", - " neg += 1\n", - " all += 1\n", - "print(pos/all)\n", - "print(neg)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] } ], "metadata": { diff --git a/Project/simple_approach/simple_twitter_learning_old.ipynb b/Project/simple_approach/simple_twitter_learning_old.ipynb new file mode 100644 index 0000000..54ea663 --- /dev/null +++ b/Project/simple_approach/simple_twitter_learning_old.ipynb @@ -0,0 +1,3706 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/home/jonas/.local/lib/python3.6/site-packages/h5py/__init__.py:36: FutureWarning: Conversion of the second argument of issubdtype from `float` to `np.floating` is deprecated. In future, it will be treated as `np.float64 == np.dtype(float).type`.\n", + " from ._conv import register_converters as _register_converters\n", + "Using TensorFlow backend.\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[nltk_data] Downloading package punkt to /home/jonas/nltk_data...\n", + "[nltk_data] Package punkt is already up-to-date!\n", + "[nltk_data] Downloading package averaged_perceptron_tagger to\n", + "[nltk_data] /home/jonas/nltk_data...\n", + "[nltk_data] Package averaged_perceptron_tagger is already up-to-\n", + "[nltk_data] date!\n", + "[nltk_data] Downloading package wordnet to /home/jonas/nltk_data...\n", + "[nltk_data] Package wordnet is already up-to-date!\n" + ] + }, + { + "data": { + "text/plain": [ + "True" + ] + }, + "execution_count": 1, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "import pandas as pd\n", + "from IPython.display import clear_output, Markdown, Math\n", + "import ipywidgets as widgets\n", + "import os\n", + "import glob\n", + "import json\n", + "import numpy as np\n", + "import itertools\n", + "import sklearn.utils as sku\n", + "from sklearn.feature_extraction.text import CountVectorizer, TfidfVectorizer, HashingVectorizer\n", + "from sklearn.model_selection import train_test_split\n", + "from sklearn.preprocessing import MultiLabelBinarizer\n", + "import nltk\n", + "from keras.models import load_model\n", + "from sklearn.externals import joblib\n", + "import pickle\n", + "import operator\n", + "from sklearn.pipeline import Pipeline\n", + "nltk.download('punkt')\n", + "nltk.download('averaged_perceptron_tagger')\n", + "nltk.download('wordnet')" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [], + "source": [ + "import sys\n", + "sys.path.append(\"..\")\n", + "\n", + "from Tools.Emoji_Distance import sentiment_vector_to_emoji\n", + "from Tools.Emoji_Distance import emoji_to_sentiment_vector\n", + "\n", + "def emoji2sent(emoji_arr, only_emoticons=True):\n", + " return np.array([emoji_to_sentiment_vector(e, only_emoticons=only_emoticons) for e in emoji_arr])\n", + "\n", + "def sent2emoji(sent_arr, custom_target_emojis=None, only_emoticons=True):\n", + " return [sentiment_vector_to_emoji(s, custom_target_emojis=custom_target_emojis, only_emoticons=only_emoticons) for s in sent_arr]" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [], + "source": [ + "SINGLE_LABEL = True" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "----\n", + "## classes and functions we are using later:\n", + "----" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "* functions for selecting items from a set / list" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [], + "source": [ + "def latest(lst):\n", + " return lst[-1] if len(lst) > 0 else 'X' \n", + "def most_common(lst):\n", + " # trying to find the most common used emoji in the given lst\n", + " return max(set(lst), key=lst.count) if len(lst) > 0 else \"X\" # setting label to 'X' if there is an empty emoji list" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "* our emoji blacklist (skin and sex modifiers)" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [], + "source": [ + "# defining blacklist for modifier emojis:\n", + "emoji_blacklist = set([\n", + " chr(0x1F3FB),\n", + " chr(0x1F3FC),\n", + " chr(0x1F3FD),\n", + " chr(0x1F3FE),\n", + " chr(0x1F3FF),\n", + " chr(0x2642),\n", + " chr(0x2640)\n", + "])" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "* lemmatization helper functions" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [], + "source": [ + "from nltk.stem.snowball import SnowballStemmer\n", + "from nltk.stem import WordNetLemmatizer\n", + "from nltk import pos_tag\n", + "from nltk import word_tokenize\n", + "from nltk.corpus import wordnet\n", + "\n", + "def get_wordnet_pos(treebank_tag):\n", + "\n", + " if treebank_tag.startswith('J'):\n", + " return wordnet.ADJ\n", + " elif treebank_tag.startswith('V'):\n", + " return wordnet.VERB\n", + " elif treebank_tag.startswith('N'):\n", + " return wordnet.NOUN\n", + " elif treebank_tag.startswith('R'):\n", + " return wordnet.ADV\n", + " else:\n", + " return wordnet.NOUN" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "* the sample data manager loads and preprocesses data" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [], + "source": [ + "class sample_data_manager(object):\n", + " @staticmethod\n", + " def generate_and_read(path:str, only_emoticons=True, apply_stemming=True, n_top_emojis=-1, file_range=None):\n", + " sdm = sample_data_manager(path)\n", + " sdm.read_files(file_index_range=range(sdm.n_files) if file_range is None else file_range, only_emoticons=only_emoticons)\n", + " if apply_stemming:\n", + " sdm.apply_stemming_and_lemmatization()\n", + " \n", + " sdm.generate_emoji_count_and_weights()\n", + " \n", + " if n_top_emojis > 0:\n", + " sdm.filter_by_top_emojis(n_top=n_top_emojis)\n", + " \n", + " return sdm\n", + " \n", + " \n", + " def __init__(self, data_root_folder:str):\n", + " self.data_root_folder = data_root_folder\n", + " self.json_files = sorted(glob.glob(self.data_root_folder + \"/*.json\"))\n", + " self.n_files = len(self.json_files)\n", + " self.raw_data = None\n", + " self.emojis = None\n", + " self.plain_text = None\n", + " self.labels = None\n", + " self.emoji_count = None\n", + " self.emoji_weights = None\n", + " self.X = None\n", + " self.y = None\n", + " self.Xt = None\n", + " self.yt = None\n", + " self.top_emojis = None\n", + " \n", + " def read_files(self, file_index_range:list, only_emoticons=True):\n", + " assert np.min(file_index_range) >= 0 and np.max(file_index_range) < self.n_files\n", + " for i in file_index_range:\n", + " print(\"reading file: \" + self.json_files[i] + \"...\")\n", + " if self.raw_data is None:\n", + " self.raw_data = pd.read_json(self.json_files[i], encoding=\"utf-8\")\n", + " else:\n", + " self.raw_data = self.raw_data.append(pd.read_json(self.json_files[i], encoding=\"utf-8\"))\n", + " \n", + " self.emojis = self.raw_data['EMOJI']\n", + " self.plain_text = self.raw_data['text']\n", + " \n", + " # replacing keywords. TODO: maybe these information can be extracted and used\n", + " self.plain_text = self.plain_text.str.replace(\"(||)\",\"\").str.replace(\"[\" + \"\".join(list(emoji_blacklist)) + \"]\",\"\")\n", + " \n", + " # so far filtering for the latest emoji. TODO: maybe there are also better approaches\n", + " self.labels = emoji2sent([latest(e) for e in self.emojis], only_emoticons=only_emoticons )\n", + " \n", + " # and filter out all samples we have no label for:\n", + " wrong_labels = np.isnan(np.linalg.norm(self.labels, axis=1)) \n", + "\n", + " self.labels = self.labels[np.invert(wrong_labels)]\n", + " self.plain_text = self.plain_text[np.invert(wrong_labels)]\n", + " self.emojis = self.emojis[np.invert(wrong_labels)]\n", + " \n", + " print(\"imported \" + str(len(self.labels)) + \" samples\")\n", + " \n", + " def apply_stemming_and_lemmatization(self):\n", + " stemmer = SnowballStemmer(\"english\")\n", + " for key in self.plain_text.keys():\n", + " stemmed_sent = []\n", + " for word in self.plain_text[key].split(\" \"):\n", + " word_stemmed = stemmer.stem(word)\n", + " stemmed_sent.append(word_stemmed)\n", + " stemmed_sent = (\" \").join(stemmed_sent)\n", + " self.plain_text[key] = stemmed_sent\n", + " \n", + " lemmatizer = WordNetLemmatizer()\n", + " for key in self.plain_text.keys():\n", + " lemmatized_sent = []\n", + " sent_pos = pos_tag(word_tokenize(self.plain_text[key]))\n", + " for word in sent_pos:\n", + " wordnet_pos = get_wordnet_pos(word[1].lower())\n", + " word_lemmatized = lemmatizer.lemmatize(word[0], pos=wordnet_pos)\n", + " lemmatized_sent.append(word_lemmatized)\n", + " lemmatized_sent = (\" \").join(lemmatized_sent)\n", + " self.plain_text[key] = lemmatized_sent\n", + " \n", + " def generate_emoji_count_and_weights(self):\n", + " self.emoji_count = {}\n", + " for e_list in self.emojis:\n", + " for e in set(e_list):\n", + " if e not in self.emoji_count:\n", + " self.emoji_count[e] = 0\n", + " self.emoji_count[e] += 1\n", + " \n", + " emoji_sum = sum([self.emoji_count[e] for e in self.emoji_count])\n", + "\n", + " self.emoji_weights = {}\n", + " for e in self.emoji_count:\n", + " # tfidf for emojis\n", + " self.emoji_weights[e] = np.log((emoji_sum / self.emoji_count[e]))\n", + "\n", + " weights_sum= sum([self.emoji_weights[x] for x in self.emoji_weights])\n", + "\n", + " # normalize:\n", + " for e in self.emoji_weights:\n", + " self.emoji_weights[e] = self.emoji_weights[e] / weights_sum\n", + "\n", + " self.emoji_weights['X'] = 0 # dummy values\n", + " self.emoji_count['X'] = 0\n", + " \n", + " def get_emoji_count(self):\n", + " sorted_emoji_count = list(reversed(sorted(self.emoji_count.items(), key=operator.itemgetter(1))))\n", + " #display(sorted_emoji_count)\n", + " return sorted_emoji_count\n", + " \n", + " def filter_by_top_emojis(self,n_top = 20):\n", + " self.top_emojis = [x[0] for x in self.get_emoji_count()[:n_top]]\n", + " in_top = [sentiment_vector_to_emoji(x) in self.top_emojis for x in self.labels]\n", + " self.labels = self.labels[in_top]\n", + " self.plain_text = self.plain_text[in_top]\n", + " self.emojis = self.emojis[in_top]\n", + " print(\"remaining samples after top emoji filtering: \", len(self.labels))\n", + " \n", + " def create_train_test_split(self, split = 0.1, random_state = 4222):\n", + " self.X, self.Xt, self.y, self.yt = train_test_split(self.plain_text, self.labels, test_size=split, random_state=random_state)\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "* the pipeline manager saves and stores sklearn pipelines. Keras models are handled differently, so the have to be named explicitly during save and load operations" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "metadata": {}, + "outputs": [], + "source": [ + "class pipeline_manager(object):\n", + " @staticmethod\n", + " def load_pipeline_from_files(file_prefix:str, keras_models = [], all_models = []):\n", + " pm = pipeline_manager(keras_models=keras_models)\n", + " pm.load(file_prefix, all_models)\n", + " return pm\n", + " \n", + " @staticmethod\n", + " def create_keras_pipeline_with_vectorizer(vectorizer, layers, sdm:sample_data_manager):\n", + " '''\n", + " creates pipeline with vectorizer and keras classifier\n", + " '''\n", + " from keras.models import Sequential\n", + " from keras.layers import Dense\n", + " \n", + " if sdm.X is None:\n", + " sdm.create_train_test_split()\n", + " \n", + " vec_train = vectorizer.fit_transform(sdm.X)\n", + " vec_test = vectorizer.transform(sdm.Xt)\n", + " # creating keras model:\n", + " model=Sequential()\n", + " \n", + " keras_layers = []\n", + " first_layer = True\n", + " for layer in layers:\n", + " if first_layer:\n", + " model.add(Dense(units=layer[0], activation=layer[1], input_dim=vectorizer.transform([\" \"])[0]._shape[1]))\n", + " first_layer = False\n", + " else:\n", + " model.add(Dense(units=layer[0], activation=layer[1]))\n", + " \n", + " model.compile(loss='mean_squared_error',\n", + " optimizer='adam')\n", + " \n", + " pipeline = Pipeline([\n", + " ('vectorizer',vectorizer),\n", + " ('keras_model', model)\n", + " ])\n", + " \n", + " return pipeline_manager(pipeline=pipeline, keras_models=['keras_model'])\n", + " \n", + " @staticmethod\n", + " def create_pipeline_with_classifier_and_vectorizer(vectorizer, classifier, sdm:sample_data_manager = None):\n", + " '''\n", + " creates a pipeline with vectorizer and classifier for non keras classifiers\n", + " if sample data manager is given, the vectorizer will be also fitted!\n", + " '''\n", + " if sdm is not None:\n", + " if sdm.X is None:\n", + " sdm.create_train_test_split()\n", + "\n", + " vec_train = vectorizer.fit_transform(sdm.X)\n", + " vec_test = vectorizer.transform(sdm.Xt)\n", + " \n", + " pipeline = Pipeline([\n", + " ('vectorizer',vectorizer),\n", + " ('classifier', classifier)\n", + " ])\n", + " \n", + " return pipeline_manager(pipeline=pipeline, keras_models=[])\n", + " \n", + " def __init__(self, pipeline = None, keras_models = []):\n", + " self.pipeline = pipeline\n", + " self.additional_objects = {}\n", + " self.keras_models = keras_models\n", + " \n", + " def save(self, prefix:str):\n", + " print(self.keras_models)\n", + " # doing this like explained here: https://stackoverflow.com/a/43415459\n", + " for step in self.pipeline.named_steps:\n", + " if step in self.keras_models:\n", + " self.pipeline.named_steps[step].model.save(prefix + \".\" + step)\n", + " else:\n", + " joblib.dump(self.pipeline.named_steps[step], prefix + \".\" + str(step))\n", + " \n", + " load_command = \"pipeline_manager.load_pipeline_from_files( '\"\n", + " load_command += prefix + \"', \" + str(self.keras_models) + \", \"\n", + " load_command += str(list(self.pipeline.named_steps.keys())) + \")\"\n", + " \n", + " import __main__ as main\n", + " if not hasattr(main, '__file__'):\n", + " display(\"saved pipeline. It can be loaded the following way:\")\n", + " display(Markdown(\"> ```\\n\"+load_command+\"\\n```\"))\n", + " else:\n", + " print(\"saved pipeline. It can be loaded the following way:\")\n", + " print(load_command)\n", + " \n", + " \n", + " def load(self, prefix:str, models = []):\n", + " self.pipeline = None\n", + " model_list = []\n", + " for model in models:\n", + " if model in self.keras_models:\n", + " model_list.append((model, load_model(prefix + \".\" + model)))\n", + " else:\n", + " model_list.append((model, joblib.load(prefix+\".\" + model)))\n", + " self.pipeline = Pipeline(model_list)\n", + " \n", + " def fit(self,X,y):\n", + " self.pipeline.fit(X,y)\n", + " \n", + " def predict(self,X):\n", + " return self.pipeline.predict(X)\n", + " " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "* the trainer class passes Data from the sample manager to the pipeline manager" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [], + "source": [ + "class trainer(object):\n", + " def __init__(self, sdm:sample_data_manager, pm:pipeline_manager):\n", + " self.sdm = sdm\n", + " self.pm = pm\n", + " \n", + " def fit(self, max_size=10000, disabled_fit_steps=['vectorizer']):\n", + " # TODO: make batch fitting available here (eg: continous waiting for data and fitting them)\n", + " if self.sdm.X is None:\n", + " self.sdm.create_train_test_split()\n", + " disabled_fits = {}\n", + " disabled_fit_transforms = {}\n", + " \n", + " named_steps = self.pm.pipeline.named_steps\n", + " \n", + " for s in disabled_fit_steps:\n", + " # now it gets a little bit dirty:\n", + " # replace fit functions we don't want to call again (e.g. for vectorizers)\n", + " disabled_fits[s] = named_steps[s].fit\n", + " disabled_fit_transforms[s] = named_steps[s].fit_transform\n", + " named_steps[s].fit = lambda self, X, y=None: self\n", + " named_steps[s].fit_transform = named_steps[s].transform\n", + " \n", + " self.pm.fit(X = self.sdm.X[:max_size], y = self.sdm.y[:max_size])\n", + " \n", + " # restore replaced fit functions:\n", + " for s in disabled_fit_steps:\n", + " named_steps[s].fit = disabled_fits[s]\n", + " named_steps[s].fit_transform = disabled_fit_transforms[s]\n", + " \n", + " def test(self):\n", + " '''\n", + " return: prediction:list, teacher:list\n", + " '''\n", + " if self.sdm.X is None:\n", + " self.sdm.create_train_test_split()\n", + " return self.pm.predict(self.sdm.Xt), self.sdm.yt\n", + "\n", + " " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "----\n", + "## Train" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "* when in notebook environment: run the stuff below:" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "reading file: ./data_en/2017-11-01.json...\n", + "imported 33368 samples\n", + "remaining samples after top emoji filtering: 26197\n" + ] + } + ], + "source": [ + "import __main__ as main\n", + "if not hasattr(main, '__file__'):\n", + " # we are in an interactive environment (probably in jupyter)\n", + " # load data:\n", + " sdm = sample_data_manager.generate_and_read(path=\"./data_en/\", n_top_emojis=20, file_range=range(1))\n", + " " + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch 1/1\n", + "100/100 [==============================] - 3s 27ms/step - loss: 0.1225\n" + ] + } + ], + "source": [ + " #pm = pipeline_manager.create_keras_pipeline_with_vectorizer(vectorizer=TfidfVectorizer(stop_words='english'),\n", + " # layers=[(10000, 'relu'),(5000, 'relu'),(2500, 'relu'),(y1[0].shape[0],None)], sdm=sdm)\n", + " pm = pipeline_manager.create_keras_pipeline_with_vectorizer(vectorizer=TfidfVectorizer(stop_words='english'),\n", + " layers=[(2500, 'relu'),(3,None)], sdm=sdm)\n", + " \n", + " tr = trainer(sdm=sdm, pm=pm)\n", + " tr.fit(100)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "----\n", + "## save classifier" + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "['keras_model']\n" + ] + }, + { + "data": { + "text/plain": [ + "'saved pipeline. It can be loaded the following way:'" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/markdown": [ + "> ```\n", + "pipeline_manager.load_pipeline_from_files( 'custom_classifier', ['keras_model'], ['vectorizer', 'keras_model'])\n", + "```" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "pm.save('custom_classifier')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "----\n", + "## Prediction" + ] + }, + { + "cell_type": "code", + "execution_count": 33, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array([[0.15801723, 0.11859037, 0.10975348],\n", + " [0.17035495, 0.10913695, 0.09354854],\n", + " [0.11777218, 0.06569621, 0.06620223],\n", + " ...,\n", + " [0.14746301, 0.09480572, 0.08052498],\n", + " [0.15932804, 0.11895895, 0.10343507],\n", + " [0.17135939, 0.1061406 , 0.09402546]], dtype=float32)" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + "array([[0.46813021, 0.24716181, 0.28470797],\n", + " [0.46813021, 0.24716181, 0.28470797],\n", + " [0.70401758, 0.05932203, 0.23666039],\n", + " ...,\n", + " [0.46813021, 0.24716181, 0.28470797],\n", + " [0.46813021, 0.24716181, 0.28470797],\n", + " [0.46813021, 0.24716181, 0.28470797]])" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "prediction variance: 0.0006294687\n", + "teacher variance: 0.03341702104519965\n" + ] + }, + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
predictpredicted_sentimentteacherteacher_sentimenttext
35671😒[0.15801723301410675, 0.11859036982059479, 0.1...πŸ˜‚[0.46813021474490496, 0.24716181096977158, 0.2...i feel like i care so much more in everi situat
25683😒[0.1703549474477768, 0.10913695394992828, 0.09...πŸ˜‚[0.46813021474490496, 0.24716181096977158, 0.2...i did not meat to add that 2 there ... hav see...
8985😒[0.1177721843123436, 0.06569620966911316, 0.06...😊[0.7040175768989329, 0.059322033898305086, 0.2...never…
5410😒[0.18182337284088135, 0.12382747232913971, 0.0...πŸ˜‚[0.46813021474490496, 0.24716181096977158, 0.2...lmao on me ! ! ! wtf wa he suppos to say
62611😒[0.1786666363477707, 0.11502400785684586, 0.10...😊[0.7040175768989329, 0.059322033898305086, 0.2...this dude alway help me get through my school ...
\n", + "
" + ], + "text/plain": [ + " predict predicted_sentiment teacher \\\n", + "35671 😒 [0.15801723301410675, 0.11859036982059479, 0.1... πŸ˜‚ \n", + "25683 😒 [0.1703549474477768, 0.10913695394992828, 0.09... πŸ˜‚ \n", + "8985 😒 [0.1177721843123436, 0.06569620966911316, 0.06... 😊 \n", + "5410 😒 [0.18182337284088135, 0.12382747232913971, 0.0... πŸ˜‚ \n", + "62611 😒 [0.1786666363477707, 0.11502400785684586, 0.10... 😊 \n", + "\n", + " teacher_sentiment \\\n", + "35671 [0.46813021474490496, 0.24716181096977158, 0.2... \n", + "25683 [0.46813021474490496, 0.24716181096977158, 0.2... \n", + "8985 [0.7040175768989329, 0.059322033898305086, 0.2... \n", + "5410 [0.46813021474490496, 0.24716181096977158, 0.2... \n", + "62611 [0.7040175768989329, 0.059322033898305086, 0.2... \n", + "\n", + " text \n", + "35671 i feel like i care so much more in everi situat \n", + "25683 i did not meat to add that 2 there ... hav see... \n", + "8985 never… \n", + "5410 lmao on me ! ! ! wtf wa he suppos to say \n", + "62611 this dude alway help me get through my school ... " + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Mean Squared Error: [0.14140389 0.04240099 0.02944344]\n", + "Variance teacher: [0.02183094 0.02513847 0.00285735]\n", + "Variance prediction: [0.00053908 0.00024232 0.00021658]\n" + ] + } + ], + "source": [ + "import __main__ as main\n", + "if not hasattr(main, '__file__'):\n", + " pred, teacher = tr.test()\n", + " \n", + " display(pred)\n", + " display(teacher)\n", + " \n", + " print('prediction variance: ', np.linalg.norm(np.var(pred, axis=0)))\n", + " print('teacher variance: ', np.linalg.norm(np.var(teacher, axis=0)))\n", + " \n", + " # build a dataframe to visualize test results:\n", + " testlist = pd.DataFrame({'text': sdm.Xt, \n", + " 'teacher': sent2emoji(sdm.yt),\n", + " 'teacher_sentiment': sdm.yt.tolist(),\n", + " 'predict': sent2emoji(pred, custom_target_emojis=sdm.top_emojis),\n", + " 'predicted_sentiment': pred.tolist()})\n", + " # display:\n", + " display(testlist.head())\n", + " \n", + " # mean squared error:\n", + " teacher_sentiments = np.array([sample[1]['teacher_sentiment'] for sample in testlist.iterrows()])\n", + " predicted_sentiments = np.array([sample[1]['predicted_sentiment'] for sample in testlist.iterrows()])\n", + "\n", + " mean_squared_error = ((teacher_sentiments - predicted_sentiments)**2).mean(axis=0)\n", + " print(\"Mean Squared Error: \", mean_squared_error)\n", + " print(\"Variance teacher: \", np.var(teacher_sentiments, axis=0))\n", + " print(\"Variance prediction: \", np.var(predicted_sentiments, axis=0))\n", + " \n", + " # save to csv:\n", + " testlist.to_csv('test.csv')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "----\n", + "## Load classifier" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "import __main__ as main\n", + "if not hasattr(main, '__file__'):\n", + " try:\n", + " pm\n", + " except NameError:\n", + " pass\n", + " else:\n", + " del pm # delete existing pipeline manager if ther is one\n", + "\n", + " pm = pipeline_manager.load_pipeline_from_files( 'custom_classifier', ['keras_model'], ['vectorizer', 'keras_model'])\n", + " lookup_emojis = [#'πŸ˜‚',\n", + " '😭',\n", + " '😍',\n", + " '😩',\n", + " '😊',\n", + " '😘',\n", + " 'πŸ™',\n", + " 'πŸ™Œ',\n", + " 'πŸ˜‰',\n", + " '😁',\n", + " 'πŸ˜…',\n", + " '😎',\n", + " '😒',\n", + " 'πŸ˜’',\n", + " '😏',\n", + " '😌',\n", + " 'πŸ˜”',\n", + " 'πŸ˜‹',\n", + " 'πŸ˜€',\n", + " '😀']\n", + " out = widgets.Output()\n", + "\n", + " t = widgets.Text()\n", + " b = widgets.Button(\n", + " description='get emoji',\n", + " disabled=False,\n", + " button_style='', # 'success', 'info', 'warning', 'danger' or ''\n", + " tooltip='Click me',\n", + " icon='check'\n", + " )\n", + "\n", + "\n", + "\n", + " def handle_submit(sender):\n", + " with out:\n", + " clear_output()\n", + " with out:\n", + " pred = pm.predict([t.value])\n", + "\n", + " display(Markdown(\"# Predicted Emoji \" + str(sent2emoji(pred, lookup_emojis)[0])))\n", + " display(Markdown(\"# Sentiment Vector: $$ \\pmatrix{\" + str(pred[0,0]) +\n", + " \"\\\\\\\\\" + str(pred[0,1]) + \"\\\\\\\\\" + str(pred[0,2]) + \"}$$\"))\n", + "\n", + " b.on_click(handle_submit)\n", + "\n", + " display(t)\n", + " display(widgets.VBox([b, out])) " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# simple twitter approach\n", + "*for learning emoji usage by single (in the meaning of unconnected) twitter messages*" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## loading train data" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "* Download preprocessed raw data:\n", + " * [here](https://the-cake-is-a-lie.net/nextcloud/index.php/s/MmXFYj6mGoMQoJN) for english\n", + " * [here](https://the-cake-is-a-lie.net/nextcloud/index.php/s/HgqpQ6rFadtWSAt) for german" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [], + "source": [ + "data_root_folder = \"./data_en/\" # i created a symlink here" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "* get all json files in `data_root_folder`" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [], + "source": [ + "json_files = sorted(glob.glob(data_root_folder + \"/*.json\"))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "----" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "* so far, only load the first file" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \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", + "
EMOJIHASHTAGSLINKED_USERdatetimeidlangpersonreply_totext
0[πŸ”₯, πŸ‘][][]2017-11-01 13:29:00925716304635547600en31507978NaNfashionbombdaily's photo <EMOJI><EMOJI>🏼
1[🀦][][]2017-11-01 13:29:00925716304664911900en231994649NaNIt’s scary how on point my horoscope be <EMOJI...
2[πŸ˜„][][]2017-11-01 13:29:03925716317214089200en2592765104NaNWoooaaaahhh <EMOJI>
3[πŸ“·][][]2017-11-01 13:29:04925716321416949800en278737933NaN<EMOJI> vivalcli: Portraits by Zhao Guojing an...
4[😩, 😩][][@hiphopphiIes]2017-11-01 13:29:06925716329801310200en8245862536349819009.257162e+17<USER> i wanna know too<EMOJI><EMOJI>
5[😭, πŸ’“][][@WizMommma]2017-11-01 13:29:02925716313019965400en15819538149.257088e+17<USER> veda was yoda too <EMOJI><EMOJI>
6[πŸ˜‚][][]2017-11-01 13:29:05925716325607133200en1001999683NaNI’m less stressed about turning 30 now <EMOJI>...
7[πŸ’―][][]2017-11-01 13:29:07925716334008082400en745222369183043600NaNFull charged. <EMOJI>
8[πŸ™„][][@SeaDimon, @lsarsour]2017-11-01 13:29:09925716342401052700en7985571552175391009.257147e+17<USER> That’s part of the problem, (they) <USE...
9[😟, πŸ˜₯, 😒][][@Ian_khetye]2017-11-01 13:29:10925716346570240000en7443960391264215009.250629e+17<USER> got me emotional there<EMOJI><EMOJI><EM...
10[🌻][][]2017-11-01 13:29:13925716359182520300en7214900101182054008.965900e+17back to the yellow <EMOJI>
11[🍁, 🌺, πŸ‚][][@Dimafadma]2017-11-01 13:29:15925716367558545400en5205367239.257159e+17<USER> Happy month to you and your loved ones ...
12[πŸƒ][#mortdale, #partofthefamily, #gorgeousboy][]2017-11-01 13:29:16925716371735900200en850852815941517300NaNMaxx and Patricia. Family hangs at For Good He...
13[πŸ’­, 🀦][][]2017-11-01 13:29:20925716388513230800en914145041588867100NaNI need to STOP beating myself up with my thoug...
14[😍, 😘][#7YearsOfKMH2][]2017-11-01 13:29:20925716388525645800en2425405622NaNCutest Son <EMOJI>Roll no. 31 <EMOJI> <HASHTAG>
15[😜][][]2017-11-01 13:29:22925716396931240000en4614871873NaNBy the summer I should have everything up and ...
16[πŸ˜‚, πŸ”₯][][]2017-11-01 13:29:23925716401125331000en2831608345NaNI know my English is not that good but that do...
17[πŸ’•][][@yungbabytate]2017-11-01 13:29:23925716401133948900en7885719746330092009.255778e+17<USER> I <EMOJI> u mama
18[πŸ˜‰][][@cmckenney]2017-11-01 13:29:23925716401125544000en2183078029.257115e+17<USER> That picture was NOT taken this morning...
19[πŸ‘…][#footfetishnation][]2017-11-01 13:29:25925716409489002500en885261166146179100NaNWelcome to <HASHTAG> <EMOJI>
20[πŸ‘Œ, πŸ™‚][][]2017-11-01 13:29:25925716409497272300en831437760833609700NaNAwkward <EMOJI><EMOJI>
21[πŸ€—, πŸ“Ί][][]2017-11-01 13:29:26925716413699854300en231664542NaNback at it with supernatural <EMOJI><EMOJI>
22[πŸ’―][][]2017-11-01 13:29:26925716413679009800en3196847035NaNOne of the best things I've learned was to sto...
23[πŸ‘…, πŸ’¦, πŸ‘][][@ctrlpurp]2017-11-01 13:29:29925716426278735900en9184928583526359009.257161e+17<USER> Can I taste?<EMOJI><EMOJI><EMOJI>
24[πŸ’”][][@saunders_court1]2017-11-01 13:29:30925716430473039900en34711873379.257163e+17<USER> we miss you ☹️<EMOJI>
25[🀐, 🀐, 🀐][][]2017-11-01 13:29:31925716434667184100en780060488600199200NaNActually my bias in WJSN are Eunseo &amp; Bona...
26[😴][][]2017-11-01 13:29:32925716438853345300en388380690NaNI so cannot be bothered with the rest of the d...
27[πŸ˜‚][][@xxxtentacion]2017-11-01 13:29:35925716451457163300en899320696869974000NaN<USER> 2lit4life<EMOJI>
28[πŸ˜‚, πŸ™„][][]2017-11-01 13:29:35925716451461357600en784790670NaNI’m not stop saying that!<EMOJI><EMOJI>
29[πŸŽ‰, πŸŽ‚, 🎈, 🎊, 🎁, πŸ’œ][][@justinerooney_]2017-11-01 13:29:37925716459828936700en3051266655NaN<USER> HAPPY BIHDAY <EMOJI><EMOJI><EMOJI><EMOJ...
..............................
68703[πŸ˜•][#halloweencostumes][]2017-11-01 07:23:04925624214522036200en1672876458NaN<HASHTAG> this one falls under the weird crazy...
68704[πŸ˜‚, 😩][][]2017-11-01 07:23:05925624218682777600en382473866NaNI'm not allowed to have chocolates yet, then I...
68705[πŸ˜‚][#MUFC][]2017-11-01 07:23:06925624222889766900en893145405457911800NaNManchester United manager Mourinho slams 'spec...
68706[πŸ’–][][]2017-11-01 07:23:07925624227088121900en240378516NaN<EMOJI> en Bushwhick
68707[πŸŒ†, πŸ‘‰, πŸš–, πŸ“ž][#BurkeCentre][]2017-11-01 07:23:18925624273237983200en784620573209002000NaN: <HASHTAG> <EMOJI> <EMOJI><EMOJI> For Taxi <E...
68708[😁][][@mychosliaheart, @BarrettoJulia, @iamjoshuaga...2017-11-01 07:23:18925624273212805100en1709981879.254136e+17<USER> <USER> <USER> Look, Mammeh and Daddeh! ...
68709[πŸ˜‹][][]2017-11-01 07:23:24925624298395533300en1348667816NaNLife is so good with you <EMOJI>
68710[πŸ‘Œ, πŸŽƒ, 😘][#portlandoregon, #portlandhalloween, #carrie…][]2017-11-01 07:23:24925624298378801200en722481645765300200NaNHappy Halloween! <EMOJI>🏽<EMOJI><EMOJI> <HASHT...
68711[πŸ‘][][@8limbsbondi...]2017-11-01 07:23:26925624306779897900en2443251500NaNSome work on the ropes in today’s boxing class...
68712[😭][][]2017-11-01 07:23:27925624310974136300en2406186390NaNScotty and Kristen’s halloween costumes <EMOJI>
68713[πŸ˜‚][][@rfrandrea, @AdaaanAndyyy]2017-11-01 07:23:30925624323557146600en10394481499.256150e+17<USER> <USER> May pre-month celebration sis <E...
68714[😭, 😭, πŸ’˜][][@peachshua1230]2017-11-01 07:23:31925624327755591700en8450855445896724009.256009e+17<USER> Awww <EMOJI> Ajsksjdjd im smiling like ...
68715[😫, βœ‹][][]2017-11-01 07:23:34925624340342812700en924752524871131100NaNI hate when I send a text or snap n I'm so anx...
68716[πŸ˜‚, πŸ™][][]2017-11-01 07:23:34925624340355280900en419493819NaNThe answer is no I have no plans and I never l...
68717[😭][][@BeachBoy_Gab]2017-11-01 07:23:34925624340346937300en24577459529.256219e+17<USER> LMAOOO I'm so proud <EMOJI>
68718[😒, πŸ’”][][]2017-11-01 07:23:34925624340338507800en1955767531NaNMy cousin/little sister is leaving to San Fran...
68719[πŸ™ƒ][][]2017-11-01 07:23:35925624344524361700en796490344581898200NaNCan't be alone w my thoughts tonight so just g...
68720[πŸ˜‚, πŸ˜‚, πŸ˜‚, πŸ˜‚, πŸ˜‚][][]2017-11-01 07:23:36925624348710285300en907808317124177900NaN<EMOJI><EMOJI><EMOJI><EMOJI><EMOJI> ambot!!!
68721[πŸ‘Œ, πŸ‘Š, πŸ™Œ][][]2017-11-01 07:23:37925624352929910800en262162415NaN<EMOJI>🏽<EMOJI>🏽 1st of the month!!Happy 1st o...
68722[😴][#WednesdayWisdom][]2017-11-01 07:23:41925624369715515400en574882525NaN<HASHTAG> ... stay in bed <EMOJI>
68723[πŸ˜‚, πŸ˜‚, πŸ˜‚, πŸ˜‚][][@Louis_Tomlinson, @NiallOfficial]2017-11-01 07:23:44925624382269124600en5561751739.254038e+17<USER> <USER> THIS IS GOLD. GOLD. <EMOJI><EMOJ...
68724[πŸ˜€][][]2017-11-01 07:23:45925624386455031800en1610265588NaN<EMOJI> thank you for the kind compliment
68725[😎][][]2017-11-01 07:23:45925624386454937600en4760724450NaNEnjoyed the silence <EMOJI>
68726[✨][][]2017-11-01 07:23:46925624390657572900en882858115636514800NaNOS: Spiderman Homecoming <EMOJI>
68727[🀷][][]2017-11-01 07:23:46925624390682849300en188129628NaNGo to hell <EMOJI>πŸ½β€β™€οΈ
68728[😘][][]2017-11-01 07:23:46925624390666129400en2473135939NaNThank you Yomi! <EMOJI>
68729[πŸ˜‚][][@discopiggu]2017-11-01 07:23:46925624390670106600en23735842099.256241e+17<USER> Lol. Just enjoy the stars. Music Kidhar...
68730[πŸ™][#NYCStrong][]2017-11-01 07:23:50925624407459971100en181689756NaNThoughts and prayers for NY<EMOJI>🏻 <HASHTAG>
68731[πŸ’][#GreatSuccess][@BrianyH]2017-11-01 07:23:50925624407460057100en601607889.254610e+17<USER> I searched COCK, PENIS, SHLONG, WINKY, ...
68732[πŸƒ, 🌻, 🌻, πŸƒ, πŸƒ, πŸ’, πŸ’, πŸƒ, πŸ™‹][][@amitbarman520]2017-11-01 07:23:53925624420022063100en37922907259.256215e+17<USER> Thank you so much<EMOJI><EMOJI><EMOJI><...
\n", + "

68733 rows Γ— 9 columns

\n", + "
" + ], + "text/plain": [ + " EMOJI \\\n", + "0 [πŸ”₯, πŸ‘] \n", + "1 [🀦] \n", + "2 [πŸ˜„] \n", + "3 [πŸ“·] \n", + "4 [😩, 😩] \n", + "5 [😭, πŸ’“] \n", + "6 [πŸ˜‚] \n", + "7 [πŸ’―] \n", + "8 [πŸ™„] \n", + "9 [😟, πŸ˜₯, 😒] \n", + "10 [🌻] \n", + "11 [🍁, 🌺, πŸ‚] \n", + "12 [πŸƒ] \n", + "13 [πŸ’­, 🀦] \n", + "14 [😍, 😘] \n", + "15 [😜] \n", + "16 [πŸ˜‚, πŸ”₯] \n", + "17 [πŸ’•] \n", + "18 [πŸ˜‰] \n", + "19 [πŸ‘…] \n", + "20 [πŸ‘Œ, πŸ™‚] \n", + "21 [πŸ€—, πŸ“Ί] \n", + "22 [πŸ’―] \n", + "23 [πŸ‘…, πŸ’¦, πŸ‘] \n", + "24 [πŸ’”] \n", + "25 [🀐, 🀐, 🀐] \n", + "26 [😴] \n", + "27 [πŸ˜‚] \n", + "28 [πŸ˜‚, πŸ™„] \n", + "29 [πŸŽ‰, πŸŽ‚, 🎈, 🎊, 🎁, πŸ’œ] \n", + "... ... \n", + "68703 [πŸ˜•] \n", + "68704 [πŸ˜‚, 😩] \n", + "68705 [πŸ˜‚] \n", + "68706 [πŸ’–] \n", + "68707 [πŸŒ†, πŸ‘‰, πŸš–, πŸ“ž] \n", + "68708 [😁] \n", + "68709 [πŸ˜‹] \n", + "68710 [πŸ‘Œ, πŸŽƒ, 😘] \n", + "68711 [πŸ‘] \n", + "68712 [😭] \n", + "68713 [πŸ˜‚] \n", + "68714 [😭, 😭, πŸ’˜] \n", + "68715 [😫, βœ‹] \n", + "68716 [πŸ˜‚, πŸ™] \n", + "68717 [😭] \n", + "68718 [😒, πŸ’”] \n", + "68719 [πŸ™ƒ] \n", + "68720 [πŸ˜‚, πŸ˜‚, πŸ˜‚, πŸ˜‚, πŸ˜‚] \n", + "68721 [πŸ‘Œ, πŸ‘Š, πŸ™Œ] \n", + "68722 [😴] \n", + "68723 [πŸ˜‚, πŸ˜‚, πŸ˜‚, πŸ˜‚] \n", + "68724 [πŸ˜€] \n", + "68725 [😎] \n", + "68726 [✨] \n", + "68727 [🀷] \n", + "68728 [😘] \n", + "68729 [πŸ˜‚] \n", + "68730 [πŸ™] \n", + "68731 [πŸ’] \n", + "68732 [πŸƒ, 🌻, 🌻, πŸƒ, πŸƒ, πŸ’, πŸ’, πŸƒ, πŸ™‹] \n", + "\n", + " HASHTAGS \\\n", + "0 [] \n", + "1 [] \n", + "2 [] \n", + "3 [] \n", + "4 [] \n", + "5 [] \n", + "6 [] \n", + "7 [] \n", + "8 [] \n", + "9 [] \n", + "10 [] \n", + "11 [] \n", + "12 [#mortdale, #partofthefamily, #gorgeousboy] \n", + "13 [] \n", + "14 [#7YearsOfKMH2] \n", + "15 [] \n", + "16 [] \n", + "17 [] \n", + "18 [] \n", + "19 [#footfetishnation] \n", + "20 [] \n", + "21 [] \n", + "22 [] \n", + "23 [] \n", + "24 [] \n", + "25 [] \n", + "26 [] \n", + "27 [] \n", + "28 [] \n", + "29 [] \n", + "... ... \n", + "68703 [#halloweencostumes] \n", + "68704 [] \n", + "68705 [#MUFC] \n", + "68706 [] \n", + "68707 [#BurkeCentre] \n", + "68708 [] \n", + "68709 [] \n", + "68710 [#portlandoregon, #portlandhalloween, #carrie…] \n", + "68711 [] \n", + "68712 [] \n", + "68713 [] \n", + "68714 [] \n", + "68715 [] \n", + "68716 [] \n", + "68717 [] \n", + "68718 [] \n", + "68719 [] \n", + "68720 [] \n", + "68721 [] \n", + "68722 [#WednesdayWisdom] \n", + "68723 [] \n", + "68724 [] \n", + "68725 [] \n", + "68726 [] \n", + "68727 [] \n", + "68728 [] \n", + "68729 [] \n", + "68730 [#NYCStrong] \n", + "68731 [#GreatSuccess] \n", + "68732 [] \n", + "\n", + " LINKED_USER datetime \\\n", + "0 [] 2017-11-01 13:29:00 \n", + "1 [] 2017-11-01 13:29:00 \n", + "2 [] 2017-11-01 13:29:03 \n", + "3 [] 2017-11-01 13:29:04 \n", + "4 [@hiphopphiIes] 2017-11-01 13:29:06 \n", + "5 [@WizMommma] 2017-11-01 13:29:02 \n", + "6 [] 2017-11-01 13:29:05 \n", + "7 [] 2017-11-01 13:29:07 \n", + "8 [@SeaDimon, @lsarsour] 2017-11-01 13:29:09 \n", + "9 [@Ian_khetye] 2017-11-01 13:29:10 \n", + "10 [] 2017-11-01 13:29:13 \n", + "11 [@Dimafadma] 2017-11-01 13:29:15 \n", + "12 [] 2017-11-01 13:29:16 \n", + "13 [] 2017-11-01 13:29:20 \n", + "14 [] 2017-11-01 13:29:20 \n", + "15 [] 2017-11-01 13:29:22 \n", + "16 [] 2017-11-01 13:29:23 \n", + "17 [@yungbabytate] 2017-11-01 13:29:23 \n", + "18 [@cmckenney] 2017-11-01 13:29:23 \n", + "19 [] 2017-11-01 13:29:25 \n", + "20 [] 2017-11-01 13:29:25 \n", + "21 [] 2017-11-01 13:29:26 \n", + "22 [] 2017-11-01 13:29:26 \n", + "23 [@ctrlpurp] 2017-11-01 13:29:29 \n", + "24 [@saunders_court1] 2017-11-01 13:29:30 \n", + "25 [] 2017-11-01 13:29:31 \n", + "26 [] 2017-11-01 13:29:32 \n", + "27 [@xxxtentacion] 2017-11-01 13:29:35 \n", + "28 [] 2017-11-01 13:29:35 \n", + "29 [@justinerooney_] 2017-11-01 13:29:37 \n", + "... ... ... \n", + "68703 [] 2017-11-01 07:23:04 \n", + "68704 [] 2017-11-01 07:23:05 \n", + "68705 [] 2017-11-01 07:23:06 \n", + "68706 [] 2017-11-01 07:23:07 \n", + "68707 [] 2017-11-01 07:23:18 \n", + "68708 [@mychosliaheart, @BarrettoJulia, @iamjoshuaga... 2017-11-01 07:23:18 \n", + "68709 [] 2017-11-01 07:23:24 \n", + "68710 [] 2017-11-01 07:23:24 \n", + "68711 [@8limbsbondi...] 2017-11-01 07:23:26 \n", + "68712 [] 2017-11-01 07:23:27 \n", + "68713 [@rfrandrea, @AdaaanAndyyy] 2017-11-01 07:23:30 \n", + "68714 [@peachshua1230] 2017-11-01 07:23:31 \n", + "68715 [] 2017-11-01 07:23:34 \n", + "68716 [] 2017-11-01 07:23:34 \n", + "68717 [@BeachBoy_Gab] 2017-11-01 07:23:34 \n", + "68718 [] 2017-11-01 07:23:34 \n", + "68719 [] 2017-11-01 07:23:35 \n", + "68720 [] 2017-11-01 07:23:36 \n", + "68721 [] 2017-11-01 07:23:37 \n", + "68722 [] 2017-11-01 07:23:41 \n", + "68723 [@Louis_Tomlinson, @NiallOfficial] 2017-11-01 07:23:44 \n", + "68724 [] 2017-11-01 07:23:45 \n", + "68725 [] 2017-11-01 07:23:45 \n", + "68726 [] 2017-11-01 07:23:46 \n", + "68727 [] 2017-11-01 07:23:46 \n", + "68728 [] 2017-11-01 07:23:46 \n", + "68729 [@discopiggu] 2017-11-01 07:23:46 \n", + "68730 [] 2017-11-01 07:23:50 \n", + "68731 [@BrianyH] 2017-11-01 07:23:50 \n", + "68732 [@amitbarman520] 2017-11-01 07:23:53 \n", + "\n", + " id lang person reply_to \\\n", + "0 925716304635547600 en 31507978 NaN \n", + "1 925716304664911900 en 231994649 NaN \n", + "2 925716317214089200 en 2592765104 NaN \n", + "3 925716321416949800 en 278737933 NaN \n", + "4 925716329801310200 en 824586253634981900 9.257162e+17 \n", + "5 925716313019965400 en 1581953814 9.257088e+17 \n", + "6 925716325607133200 en 1001999683 NaN \n", + "7 925716334008082400 en 745222369183043600 NaN \n", + "8 925716342401052700 en 798557155217539100 9.257147e+17 \n", + "9 925716346570240000 en 744396039126421500 9.250629e+17 \n", + "10 925716359182520300 en 721490010118205400 8.965900e+17 \n", + "11 925716367558545400 en 520536723 9.257159e+17 \n", + "12 925716371735900200 en 850852815941517300 NaN \n", + "13 925716388513230800 en 914145041588867100 NaN \n", + "14 925716388525645800 en 2425405622 NaN \n", + "15 925716396931240000 en 4614871873 NaN \n", + "16 925716401125331000 en 2831608345 NaN \n", + "17 925716401133948900 en 788571974633009200 9.255778e+17 \n", + "18 925716401125544000 en 218307802 9.257115e+17 \n", + "19 925716409489002500 en 885261166146179100 NaN \n", + "20 925716409497272300 en 831437760833609700 NaN \n", + "21 925716413699854300 en 231664542 NaN \n", + "22 925716413679009800 en 3196847035 NaN \n", + "23 925716426278735900 en 918492858352635900 9.257161e+17 \n", + "24 925716430473039900 en 3471187337 9.257163e+17 \n", + "25 925716434667184100 en 780060488600199200 NaN \n", + "26 925716438853345300 en 388380690 NaN \n", + "27 925716451457163300 en 899320696869974000 NaN \n", + "28 925716451461357600 en 784790670 NaN \n", + "29 925716459828936700 en 3051266655 NaN \n", + "... ... ... ... ... \n", + "68703 925624214522036200 en 1672876458 NaN \n", + "68704 925624218682777600 en 382473866 NaN \n", + "68705 925624222889766900 en 893145405457911800 NaN \n", + "68706 925624227088121900 en 240378516 NaN \n", + "68707 925624273237983200 en 784620573209002000 NaN \n", + "68708 925624273212805100 en 170998187 9.254136e+17 \n", + "68709 925624298395533300 en 1348667816 NaN \n", + "68710 925624298378801200 en 722481645765300200 NaN \n", + "68711 925624306779897900 en 2443251500 NaN \n", + "68712 925624310974136300 en 2406186390 NaN \n", + "68713 925624323557146600 en 1039448149 9.256150e+17 \n", + "68714 925624327755591700 en 845085544589672400 9.256009e+17 \n", + "68715 925624340342812700 en 924752524871131100 NaN \n", + "68716 925624340355280900 en 419493819 NaN \n", + "68717 925624340346937300 en 2457745952 9.256219e+17 \n", + "68718 925624340338507800 en 1955767531 NaN \n", + "68719 925624344524361700 en 796490344581898200 NaN \n", + "68720 925624348710285300 en 907808317124177900 NaN \n", + "68721 925624352929910800 en 262162415 NaN \n", + "68722 925624369715515400 en 574882525 NaN \n", + "68723 925624382269124600 en 556175173 9.254038e+17 \n", + "68724 925624386455031800 en 1610265588 NaN \n", + "68725 925624386454937600 en 4760724450 NaN \n", + "68726 925624390657572900 en 882858115636514800 NaN \n", + "68727 925624390682849300 en 188129628 NaN \n", + "68728 925624390666129400 en 2473135939 NaN \n", + "68729 925624390670106600 en 2373584209 9.256241e+17 \n", + "68730 925624407459971100 en 181689756 NaN \n", + "68731 925624407460057100 en 60160788 9.254610e+17 \n", + "68732 925624420022063100 en 3792290725 9.256215e+17 \n", + "\n", + " text \n", + "0 fashionbombdaily's photo 🏼 \n", + "1 It’s scary how on point my horoscope be \n", + "3 vivalcli: Portraits by Zhao Guojing an... \n", + "4 i wanna know too \n", + "5 veda was yoda too \n", + "6 I’m less stressed about turning 30 now ... \n", + "7 Full charged. \n", + "8 That’s part of the problem, (they) got me emotional there \n", + "11 Happy month to you and your loved ones ... \n", + "12 Maxx and Patricia. Family hangs at For Good He... \n", + "13 I need to STOP beating myself up with my thoug... \n", + "14 Cutest Son Roll no. 31 \n", + "15 By the summer I should have everything up and ... \n", + "16 I know my English is not that good but that do... \n", + "17 I u mama \n", + "18 That picture was NOT taken this morning... \n", + "19 Welcome to \n", + "20 Awkward \n", + "21 back at it with supernatural \n", + "22 One of the best things I've learned was to sto... \n", + "23 Can I taste? \n", + "24 we miss you ☹️ \n", + "25 Actually my bias in WJSN are Eunseo & Bona... \n", + "26 I so cannot be bothered with the rest of the d... \n", + "27 2lit4life \n", + "28 I’m not stop saying that! \n", + "29 HAPPY BIHDAY this one falls under the weird crazy... \n", + "68704 I'm not allowed to have chocolates yet, then I... \n", + "68705 Manchester United manager Mourinho slams 'spec... \n", + "68706 en Bushwhick \n", + "68707 : For Taxi Look, Mammeh and Daddeh! ... \n", + "68709 Life is so good with you \n", + "68710 Happy Halloween! 🏽 \n", + "68713 May pre-month celebration sis Awww Ajsksjdjd im smiling like ... \n", + "68715 I hate when I send a text or snap n I'm so anx... \n", + "68716 The answer is no I have no plans and I never l... \n", + "68717 LMAOOO I'm so proud \n", + "68718 My cousin/little sister is leaving to San Fran... \n", + "68719 Can't be alone w my thoughts tonight so just g... \n", + "68720 ambot!!! \n", + "68721 🏽🏽 1st of the month!!Happy 1st o... \n", + "68722 ... stay in bed \n", + "68723 THIS IS GOLD. GOLD. thank you for the kind compliment \n", + "68725 Enjoyed the silence \n", + "68726 OS: Spiderman Homecoming \n", + "68727 Go to hell πŸ½β€β™€οΈ \n", + "68728 Thank you Yomi! \n", + "68729 Lol. Just enjoy the stars. Music Kidhar... \n", + "68730 Thoughts and prayers for NY🏻 \n", + "68731 I searched COCK, PENIS, SHLONG, WINKY, ... \n", + "68732 Thank you so much<... \n", + "\n", + "[68733 rows x 9 columns]" + ] + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "twitter_data = pd.read_json(json_files[0], encoding=\"utf-8\")\n", + "twitter_data" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "* extracting emojis and text" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [], + "source": [ + "emojis = twitter_data['EMOJI']\n", + "plain_text = twitter_data['text']" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "* make our plain text more \"plain\":\n", + " * removing the keyword `` (just for the beginning)\n", + " * removing remaining useless emojis, like skin modifier etc." + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [], + "source": [ + "# defining blacklist for modifier emojis:\n", + "emoji_blacklist = set([\n", + " chr(0x1F3FB),\n", + " chr(0x1F3FC),\n", + " chr(0x1F3FD),\n", + " chr(0x1F3FE),\n", + " chr(0x1F3FF),\n", + " chr(0x2642),\n", + " chr(0x2640)\n", + "])" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [], + "source": [ + "# filtering them and the EMOJI keyword out:\n", + "plain_text = plain_text.str.replace(\"(||)\",\"\").str.replace(\"[\" + \"\".join(list(emoji_blacklist)) + \"]\",\"\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "* convert all emojis to a sentiment vector" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [], + "source": [ + "labels = emoji2sent([latest(e) for e in emojis])\n" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "68733" + ] + }, + "execution_count": 12, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "len(labels)" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [], + "source": [ + "wrong_labels = np.isnan(np.linalg.norm(labels, axis=1))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "* remove all data we have no label for" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [], + "source": [ + "labels = labels[np.invert(wrong_labels)]\n", + "plain_text = plain_text[np.invert(wrong_labels)]\n", + "emojis = emojis[np.invert(wrong_labels)]" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "33368 33368 33368\n" + ] + } + ], + "source": [ + "print(len(labels), len(emojis), len(plain_text))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "* Apply stemming and lemmatization (if needed)" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": {}, + "outputs": [], + "source": [ + "from nltk.stem.snowball import SnowballStemmer\n", + "from nltk.stem import WordNetLemmatizer\n", + "from nltk import pos_tag\n", + "from nltk import word_tokenize\n", + "from nltk.corpus import wordnet" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": {}, + "outputs": [], + "source": [ + "def get_wordnet_pos(treebank_tag):\n", + "\n", + " if treebank_tag.startswith('J'):\n", + " return wordnet.ADJ\n", + " elif treebank_tag.startswith('V'):\n", + " return wordnet.VERB\n", + " elif treebank_tag.startswith('N'):\n", + " return wordnet.NOUN\n", + " elif treebank_tag.startswith('R'):\n", + " return wordnet.ADV\n", + " else:\n", + " return wordnet.NOUN" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": {}, + "outputs": [], + "source": [ + "stemmer = SnowballStemmer(\"english\")\n", + "for key in plain_text.keys():\n", + " stemmed_sent = []\n", + " for word in plain_text[key].split(\" \"):\n", + " word_stemmed = stemmer.stem(word)\n", + " stemmed_sent.append(word_stemmed)\n", + " stemmed_sent = (\" \").join(stemmed_sent)\n", + " plain_text[key] = stemmed_sent" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "2 woooaaaahhh\n", + "4 i wan na know too\n", + "6 i 'm le stress about turn 30 now i think i'v r...\n", + "9 got me emot there\n", + "14 cutest son roll no . 31\n", + "15 by the summer i should have everyth up and run...\n", + "18 that pictur wa not taken this morning !\n", + "26 i so can not be bother with the rest of the da...\n", + "27 2lit4lif\n", + "35 hate fall asleep befor i put my phone on the c...\n", + "36 unexpect saw two of my crush today . this day ...\n", + "40 elvi whi o whi ? our girl wa such a love stori...\n", + "42 you'r late i ate them all\n", + "43 me toooo\n", + "47 the pressur is just too much\n", + "51 i broke grammar\n", + "52 have not desir to go to work today\n", + "53 omg do n't it scari all i know is that i do no...\n", + "56 achoo mr. fuck nigga you , you done caught cau...\n", + "58 i can never catch a dang break !\n", + "59 pas my p on two hour of sleep\n", + "60 i 'm realli not amus\n", + "65 i can help you\n", + "71 whew i slept good af last night\n", + "74 this would be epic . pizza and play perfect gi...\n", + "76 hey , it 1st novemb\n", + "80 u is to press bitch for me to have been speak ...\n", + "88 lmfao thought it wa just me be bitter\n", + "89 yupp yuppp . super prettttyyy , my heart cant ...\n", + "90 bakit halo halong seri binanggit mo be ? none ...\n", + " ... \n", + "68675 go back to dark hair tomorrow , mhmm yasss\n", + "68677 i miss them so much\n", + "68678 i wan na feel your gut too\n", + "68683 everi time\n", + "68687 i neither own nor watch tv . now go watch cnn\n", + "68688 revolutionari love\n", + "68694 ear worm is run in the famili after sing an aw...\n", + "68696 ill never look at you the same . yeah you got ...\n", + "68699 it our 3 year anniversari today to celebrate ,...\n", + "68700 person that scare me\n", + "68701 damn girl . can u look ani hotter than this ? ...\n", + "68703 this one fall under the weird crazi one .\n", + "68704 i 'm not allow to have chocol yet , then i uni...\n", + "68705 manchest unit manag mourinho slam specialists'...\n", + "68708 look , mammeh and daddeh ! cuuutee..\n", + "68709 life is so good with you\n", + "68710 happi halloween !\n", + "68712 scotti and kristen halloween costum\n", + "68713 may pre-month celebr si\n", + "68717 lmaooo i 'm so proud\n", + "68720 ambot ! ! !\n", + "68721 1st of the month ! ! happi 1st of novemb *53 d...\n", + "68722 ... stay in bed\n", + "68723 this is gold . gold .\n", + "68724 thank you for the kind compliment\n", + "68725 enjoy the silenc\n", + "68728 thank you yomi !\n", + "68729 lol . just enjoy the star . music kidhar aur b...\n", + "68730 thought and prayer for ny\n", + "68732 thank you so muchhav a happi wednesday and a g...\n", + "Name: text, Length: 33368, dtype: object\n" + ] + } + ], + "source": [ + "lemmatizer = WordNetLemmatizer()\n", + "for key in plain_text.keys():\n", + " lemmatized_sent = []\n", + " sent_pos = pos_tag(word_tokenize(plain_text[key]))\n", + " for word in sent_pos:\n", + " wordnet_pos = get_wordnet_pos(word[1].lower())\n", + " word_lemmatized = lemmatizer.lemmatize(word[0], pos=wordnet_pos)\n", + " lemmatized_sent.append(word_lemmatized)\n", + " lemmatized_sent = (\" \").join(lemmatized_sent)\n", + " plain_text[key] = lemmatized_sent\n", + "print(plain_text)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "* generate weights:" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "metadata": {}, + "outputs": [], + "source": [ + "# at first count over our table\n", + "emoji_count = {}\n", + "\n", + "\n", + "for e_list in emojis:\n", + " for e in set(e_list):\n", + " if e not in emoji_count:\n", + " emoji_count[e] = 0\n", + " emoji_count[e] += 1\n", + "\n", + "emoji_count\n", + "emoji_sum = sum([emoji_count[e] for e in emoji_count])\n", + "\n", + "emoji_weights = {}\n", + "for e in emoji_count:\n", + " # tfidf for emojis\n", + " emoji_weights[e] = np.log((emoji_sum / emoji_count[e]))\n", + "\n", + "weights_sum= sum([emoji_weights[x] for x in emoji_weights])\n", + " \n", + "# normalize:\n", + "for e in emoji_weights:\n", + " emoji_weights[e] = emoji_weights[e] / weights_sum\n", + "\n", + "emoji_weights['X'] = 0 # dummy values\n", + "emoji_count['X'] = 0" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "* most used emojis in Dataset" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "metadata": {}, + "outputs": [], + "source": [ + "import operator" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[('πŸ˜‚', 10182),\n", + " ('😭', 3893),\n", + " ('😍', 2866),\n", + " ('😩', 1647),\n", + " ('😊', 1450),\n", + " ('😘', 1151),\n", + " ('πŸ™', 1089),\n", + " ('πŸ™Œ', 1003),\n", + " ('πŸ˜‰', 752),\n", + " ('😁', 697),\n", + " ('πŸ˜…', 651),\n", + " ('😎', 606),\n", + " ('😒', 544),\n", + " ('πŸ˜’', 539),\n", + " ('😏', 478),\n", + " ('😌', 434),\n", + " ('πŸ˜”', 415),\n", + " ('πŸ˜‹', 397),\n", + " ('πŸ˜€', 392),\n", + " ('😀', 368)]" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + "['πŸ˜‚',\n", + " '😭',\n", + " '😍',\n", + " '😩',\n", + " '😊',\n", + " '😘',\n", + " 'πŸ™',\n", + " 'πŸ™Œ',\n", + " 'πŸ˜‰',\n", + " '😁',\n", + " 'πŸ˜…',\n", + " '😎',\n", + " '😒',\n", + " 'πŸ˜’',\n", + " '😏',\n", + " '😌',\n", + " 'πŸ˜”',\n", + " 'πŸ˜‹',\n", + " 'πŸ˜€',\n", + " '😀']" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "sorted_emoji_count = list(reversed(sorted(emoji_count.items(), key=operator.itemgetter(1))))\n", + "display(sorted_emoji_count[:20])\n", + "\n", + "top_emojis = [x[0] for x in sorted_emoji_count[:20]]\n", + "display(top_emojis)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "* only learn the most used ones:" + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "26197 26197 26197\n" + ] + } + ], + "source": [ + "in_top = [sentiment_vector_to_emoji(x) in top_emojis for x in labels]\n", + "labels = labels[in_top]\n", + "plain_text = plain_text[in_top]\n", + "emojis = emojis[in_top]\n", + "print(len(labels), len(emojis), len(plain_text))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "* generating train and test set:" + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "metadata": {}, + "outputs": [], + "source": [ + "X1, Xt1, y1, yt1 = train_test_split(plain_text, labels, test_size=0.1, random_state=4222)" + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "metadata": {}, + "outputs": [], + "source": [ + "#y1_weights = np.array([(sum([emoji_weights[e] for e in e_list]) / len(e_list)) if len(e_list) > 0 else 0 for e_list in sent2emoji(y1)])" + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "metadata": {}, + "outputs": [], + "source": [ + "vectorizer = TfidfVectorizer(stop_words='english')\n", + "vec_train = vectorizer.fit_transform(X1)\n", + "vec_test = vectorizer.transform(Xt1)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "* train. this can take a very long time..." + ] + }, + { + "cell_type": "code", + "execution_count": 27, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Using TensorFlow backend.\n" + ] + } + ], + "source": [ + "from sklearn.neural_network import MLPClassifier as MLP\n", + "from sklearn.multiclass import OneVsRestClassifier as OVRC\n", + "from sklearn.tree import DecisionTreeClassifier as DTC\n", + "\n", + "from keras.models import Sequential\n", + "from keras.layers import Dense" + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "metadata": {}, + "outputs": [], + "source": [ + "def train(max_size = 10000, layers=[(1024, 'relu'),(y1[0].shape[0],'softmax')], random_state=4222, ovrc=False, n_iter=5):\n", + " \n", + " model = Sequential()\n", + " \n", + " # build mlp layers:\n", + " keras_layers = []\n", + " first_layer = True\n", + " for layer in layers:\n", + " if first_layer:\n", + " model.add(Dense(units=layer[0], activation=layer[1], input_dim=vectorizer.transform([\" \"])[0]._shape[1]))\n", + " first_layer = False\n", + " else:\n", + " model.add(Dense(units=layer[0], activation=layer[1]))\n", + " \n", + " #mlp = MLPClassifier(layers=sknn_layers, random_state=random_state, verbose=True, n_iter=n_iter, batch_size=100)\n", + " \n", + " model.compile(loss='mean_squared_error',\n", + " optimizer='adam')\n", + " \n", + " clf = OVRC(model) if ovrc else model\n", + "\n", + " clf.fit(vec_train[:max_size].A, y1[:max_size], validation_split=0.2, epochs=n_iter)#, sample_weight=y1_weights[:max_size])\n", + " \n", + " return clf" + ] + }, + { + "cell_type": "code", + "execution_count": 29, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Train on 18861 samples, validate on 4716 samples\n", + "Epoch 1/3\n", + "18861/18861 [==============================] - 1106s 59ms/step - loss: 0.0185 - val_loss: 0.0152\n", + "Epoch 2/3\n", + "18861/18861 [==============================] - 1104s 59ms/step - loss: 0.0107 - val_loss: 0.0163\n", + "Epoch 3/3\n", + "18861/18861 [==============================] - 1106s 59ms/step - loss: 0.0065 - val_loss: 0.0166\n" + ] + } + ], + "source": [ + "clf = train(max_size=100000,layers=[(10000, 'relu'),(5000, 'relu'),(2500, 'relu'),(y1[0].shape[0],None)], n_iter=3)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "* make a prediction and store it in a csv file:" + ] + }, + { + "cell_type": "code", + "execution_count": 30, + "metadata": {}, + "outputs": [], + "source": [ + "pred = clf.predict(vectorizer.transform(Xt1))" + ] + }, + { + "cell_type": "code", + "execution_count": 31, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "0.011668838\n", + "0.03387511671001757\n" + ] + } + ], + "source": [ + "print(np.linalg.norm(np.var(pred, axis=0)))\n", + "print(np.linalg.norm(np.var(labels, axis=0)))\n" + ] + }, + { + "cell_type": "code", + "execution_count": 32, + "metadata": {}, + "outputs": [], + "source": [ + "# build a dataframe to visualize test results:\n", + "testlist = pd.DataFrame({'text': Xt1, \n", + " 'teacher': sent2emoji(yt1),\n", + " 'teacher_sentiment': yt1.tolist(),\n", + " 'predict': sent2emoji(pred, custom_target_emojis=top_emojis),\n", + " 'predicted_sentiment': pred.tolist()})" + ] + }, + { + "cell_type": "code", + "execution_count": 33, + "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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
textteacherteacher_sentimentpredictpredicted_sentiment
35671i feel like i care so much more in everi situatπŸ˜‚[0.46813021474490496, 0.24716181096977158, 0.2...πŸ˜…[0.4447824954986572, 0.30056363344192505, 0.27...
25683i did not meat to add that 2 there ... hav see...πŸ˜‚[0.46813021474490496, 0.24716181096977158, 0.2...😁[0.5660845637321472, 0.1737498641014099, 0.284...
8985neverβ€¦πŸ˜Š[0.7040175768989329, 0.059322033898305086, 0.2...πŸ˜‚[0.4871470034122467, 0.26607102155685425, 0.27...
5410lmao on me ! ! ! wtf wa he suppos to sayπŸ˜‚[0.46813021474490496, 0.24716181096977158, 0.2...😒[0.4061833620071411, 0.3226468861103058, 0.273...
62611this dude alway help me get through my school ...😊[0.7040175768989329, 0.059322033898305086, 0.2...πŸ˜‚[0.4549962878227234, 0.21886931359767914, 0.33...
48197happi b'day sir😊[0.7040175768989329, 0.059322033898305086, 0.2...πŸ˜€[0.6561306715011597, 0.11821962147951126, 0.27...
23654you need some good old fashion swedish jesusπŸ™[0.4983755685510071, 0.08057179987004548, 0.42...πŸ˜…[0.4600130021572113, 0.28595462441444397, 0.27...
58207these late shift are make me not have a social...πŸ˜…[0.47186147186147187, 0.2922077922077922, 0.23...πŸ˜‚[0.49543458223342896, 0.25571855902671814, 0.2...
374dc this weekend😍[0.7296744771190439, 0.05173769460607014, 0.21...😌[0.6040589213371277, 0.15823380649089813, 0.26...
26310paul lad you 'll make e blush😊[0.7040175768989329, 0.059322033898305086, 0.2...πŸ˜‚[0.452500581741333, 0.2882971167564392, 0.2790...
30892did you have a fun halloween ?πŸ˜‚[0.46813021474490496, 0.24716181096977158, 0.2...πŸ˜‚[0.4644194543361664, 0.2708289325237274, 0.277...
11868hi handsom😍[0.7296744771190439, 0.05173769460607014, 0.21...😊[0.7254493236541748, 0.12355809658765793, 0.22...
46219i 'm not okay with this , i 'm su snapchat😭[0.34310532030401736, 0.4364820846905538, 0.22...πŸ˜”[0.3264158070087433, 0.48023173213005066, 0.23...
13583my parent be so mad i be buy new stuff & amp ;...😭[0.34310532030401736, 0.4364820846905538, 0.22...πŸ˜‚[0.4271591007709503, 0.29361462593078613, 0.29...
43843one of the few song that calm me down esp on f...πŸ˜‚[0.46813021474490496, 0.24716181096977158, 0.2...πŸ˜‚[0.44168680906295776, 0.2790682315826416, 0.29...
63589iphon x bouta be the last phone we ever buyπŸ˜‚[0.46813021474490496, 0.24716181096977158, 0.2...πŸ˜…[0.41863512992858887, 0.3106093108654022, 0.28...
53695visit my main man today ❀ i miss u papa😭[0.34310532030401736, 0.4364820846905538, 0.22...😁[0.5650997757911682, 0.19236208498477936, 0.27...
67529donut😍[0.7296744771190439, 0.05173769460607014, 0.21...πŸ˜‚[0.45511549711227417, 0.28582143783569336, 0.2...
25493ha anyon heard this by ? who the fuck knew he ...😘[0.7546600877192983, 0.05290570175438596, 0.19...πŸ˜…[0.4276219606399536, 0.30413898825645447, 0.28...
19486wow superrbb😍[0.7296744771190439, 0.05173769460607014, 0.21...😊[0.7149834036827087, 0.10459273308515549, 0.24...
48449of cours they do n't . their perfect model of ...πŸ˜‚[0.46813021474490496, 0.24716181096977158, 0.2...πŸ˜‚[0.5363025665283203, 0.22163532674312592, 0.27...
4504plea pick me . pick me . pick me . please .😍[0.7296744771190439, 0.05173769460607014, 0.21...πŸ˜‚[0.4641677737236023, 0.18824045360088348, 0.37...
40285shiid no crack is wack😭[0.34310532030401736, 0.4364820846905538, 0.22...πŸ˜‚[0.44292521476745605, 0.28201037645339966, 0.2...
56741pj still sleep like a newborn😩[0.22289823008849557, 0.5912610619469026, 0.18...😒[0.40168094635009766, 0.3777309060096741, 0.24...
22948an opinion doe n't mean you make sen first off...😌[0.6240601503759399, 0.13984962406015036, 0.23...πŸ˜‚[0.4365620017051697, 0.2830066680908203, 0.294...
68426missyou too😘[0.7546600877192983, 0.05290570175438596, 0.19...😭[0.3452186584472656, 0.4593580365180969, 0.223...
13431i swear she did😩[0.22289823008849557, 0.5912610619469026, 0.18...πŸ˜‚[0.4436468482017517, 0.2736954987049103, 0.294...
66287it true , he wa the mutt ( big-d ) nut .πŸ˜‰[0.5634451019066403, 0.0992767915844839, 0.337...πŸ˜…[0.47334975004196167, 0.2881445586681366, 0.26...
41980is happen so happi😭[0.34310532030401736, 0.4364820846905538, 0.22...πŸ˜…[0.4635038673877716, 0.30251604318618774, 0.26...
34632saw that the first one said sose you tmmrw and npπŸ˜‚[0.46813021474490496, 0.24716181096977158, 0.2...πŸ˜…[0.43297499418258667, 0.31000325083732605, 0.2...
..................
47218keep it i do n't want itπŸ˜‚[0.46813021474490496, 0.24716181096977158, 0.2...πŸ˜…[0.470976859331131, 0.2997904419898987, 0.2489...
350876 year ago today we said our final good bye , ...😒[0.39118825100133514, 0.38451268357810414, 0.2...πŸ˜…[0.4478594660758972, 0.30181050300598145, 0.27...
61252amenπŸ™[0.4983755685510071, 0.08057179987004548, 0.42...😁[0.5783949494361877, 0.15405726432800293, 0.30...
39960fact😎[0.5981432360742706, 0.10477453580901856, 0.29...πŸ˜‚[0.4938848316669464, 0.24237176775932312, 0.25...
365nw final found someon hi loydiπŸ˜…[0.47186147186147187, 0.2922077922077922, 0.23...😌[0.6203110218048096, 0.17863908410072327, 0.23...
50665i need ur shoulder to cri on😒[0.39118825100133514, 0.38451268357810414, 0.2...πŸ˜…[0.4619033932685852, 0.2977892756462097, 0.267...
21007awww you 'll get me teari eye gurl !😘[0.7546600877192983, 0.05290570175438596, 0.19...πŸ˜…[0.5029815435409546, 0.2711288630962372, 0.253...
18819γ€°happi hump day to all my ladi is def sweet like😘[0.7546600877192983, 0.05290570175438596, 0.19...πŸ™Œ[0.6974080801010132, 0.11416944861412048, 0.24...
42421thanks .😊[0.7040175768989329, 0.059322033898305086, 0.2...😁[0.5765037536621094, 0.18341206014156342, 0.26...
38705it okay i did n't see you until i wa in your faceπŸ˜‚[0.46813021474490496, 0.24716181096977158, 0.2...😒[0.4030645787715912, 0.36543628573417664, 0.25...
47033fall in with alexissdang β¬…οΈπŸ˜[0.7296744771190439, 0.05173769460607014, 0.21...😌[0.6219494342803955, 0.1795988380908966, 0.226...
38742let your wild side free girl ! ! ! ! !πŸ˜‚[0.46813021474490496, 0.24716181096977158, 0.2...😒[0.4049544930458069, 0.35102248191833496, 0.25...
67610can we get season 3 already ! ?😭[0.34310532030401736, 0.4364820846905538, 0.22...😒[0.416861355304718, 0.35468244552612305, 0.245...
61021have to quot this bih rememb this niggaπŸ˜‚[0.46813021474490496, 0.24716181096977158, 0.2...πŸ˜‚[0.4401417672634125, 0.2810788154602051, 0.292...
14904he so damn😩[0.22289823008849557, 0.5912610619469026, 0.18...πŸ˜‚[0.5411785244941711, 0.2148503214120865, 0.246...
50994yasss it time for a great show maxloyalβ„’β™› : gi...πŸ˜‚[0.46813021474490496, 0.24716181096977158, 0.2...πŸ™Œ[0.7073097229003906, 0.12480126321315765, 0.23...
6973got to love a fish finger sarniπŸ˜‚[0.46813021474490496, 0.24716181096977158, 0.2...😌[0.6375303864479065, 0.14495858550071716, 0.24...
3269say datπŸ˜‚[0.46813021474490496, 0.24716181096977158, 0.2...πŸ˜‚[0.5052645802497864, 0.21280284225940704, 0.30...
54827if ur happi i 'm happi😊[0.7040175768989329, 0.059322033898305086, 0.2...πŸ˜…[0.5138391852378845, 0.26520460844039917, 0.25...
19409rockstarπŸ˜€[0.6560364464692483, 0.08428246013667426, 0.25...πŸ˜‚[0.520979106426239, 0.22392335534095764, 0.265...
38703god fuck me i alreadi fix it oncπŸ˜‚[0.46813021474490496, 0.24716181096977158, 0.2...πŸ˜”[0.32009249925613403, 0.4819949269294739, 0.22...
25133it social accept to listen to ani christma mus...πŸ˜‚[0.46813021474490496, 0.24716181096977158, 0.2...😁[0.5703040361404419, 0.17875489592552185, 0.27...
15339i thrash p in imessag now he wan na bet on 2kπŸ˜‚[0.46813021474490496, 0.24716181096977158, 0.2...πŸ˜…[0.4571400284767151, 0.2949279546737671, 0.269...
28082my fatass need some lemon pepper wing w a lil ...πŸ˜‚[0.46813021474490496, 0.24716181096977158, 0.2...😭[0.36291953921318054, 0.4310339391231537, 0.22...
44462fck off tristan yes soph collect u in 15 n we ...😀[0.2691131498470948, 0.4801223241590214, 0.250...😌[0.6122021675109863, 0.15579015016555786, 0.27...
60212open the bagπŸ˜‹[0.6784741144414169, 0.04495912806539509, 0.27...πŸ˜‚[0.470508873462677, 0.2711063623428345, 0.2810...
34950i ask peopl to guess my zodiac sign and this o...😀[0.2691131498470948, 0.4801223241590214, 0.250...πŸ˜‚[0.4431285262107849, 0.27477312088012695, 0.29...
59462i regret this smπŸ˜‚[0.46813021474490496, 0.24716181096977158, 0.2...😒[0.40375131368637085, 0.3289208710193634, 0.27...
19465fuck collegπŸ˜‚[0.46813021474490496, 0.24716181096977158, 0.2...πŸ˜…[0.4494284391403198, 0.31076472997665405, 0.26...
8135aye this wa my first time actual see it wendi ...πŸ˜‚[0.46813021474490496, 0.24716181096977158, 0.2...πŸ˜…[0.42708122730255127, 0.31392431259155273, 0.2...
\n", + "

2620 rows Γ— 5 columns

\n", + "
" + ], + "text/plain": [ + " text teacher \\\n", + "35671 i feel like i care so much more in everi situat πŸ˜‚ \n", + "25683 i did not meat to add that 2 there ... hav see... πŸ˜‚ \n", + "8985 never… 😊 \n", + "5410 lmao on me ! ! ! wtf wa he suppos to say πŸ˜‚ \n", + "62611 this dude alway help me get through my school ... 😊 \n", + "48197 happi b'day sir 😊 \n", + "23654 you need some good old fashion swedish jesus πŸ™ \n", + "58207 these late shift are make me not have a social... πŸ˜… \n", + "374 dc this weekend 😍 \n", + "26310 paul lad you 'll make e blush 😊 \n", + "30892 did you have a fun halloween ? πŸ˜‚ \n", + "11868 hi handsom 😍 \n", + "46219 i 'm not okay with this , i 'm su snapchat 😭 \n", + "13583 my parent be so mad i be buy new stuff & amp ;... 😭 \n", + "43843 one of the few song that calm me down esp on f... πŸ˜‚ \n", + "63589 iphon x bouta be the last phone we ever buy πŸ˜‚ \n", + "53695 visit my main man today ❀ i miss u papa 😭 \n", + "67529 donut 😍 \n", + "25493 ha anyon heard this by ? who the fuck knew he ... 😘 \n", + "19486 wow superrbb 😍 \n", + "48449 of cours they do n't . their perfect model of ... πŸ˜‚ \n", + "4504 plea pick me . pick me . pick me . please . 😍 \n", + "40285 shiid no crack is wack 😭 \n", + "56741 pj still sleep like a newborn 😩 \n", + "22948 an opinion doe n't mean you make sen first off... 😌 \n", + "68426 missyou too 😘 \n", + "13431 i swear she did 😩 \n", + "66287 it true , he wa the mutt ( big-d ) nut . πŸ˜‰ \n", + "41980 is happen so happi 😭 \n", + "34632 saw that the first one said sose you tmmrw and np πŸ˜‚ \n", + "... ... ... \n", + "47218 keep it i do n't want it πŸ˜‚ \n", + "35087 6 year ago today we said our final good bye , ... 😒 \n", + "61252 amen πŸ™ \n", + "39960 fact 😎 \n", + "365 nw final found someon hi loydi πŸ˜… \n", + "50665 i need ur shoulder to cri on 😒 \n", + "21007 awww you 'll get me teari eye gurl ! 😘 \n", + "18819 γ€°happi hump day to all my ladi is def sweet like 😘 \n", + "42421 thanks . 😊 \n", + "38705 it okay i did n't see you until i wa in your face πŸ˜‚ \n", + "47033 fall in with alexissdang ⬅️ 😍 \n", + "38742 let your wild side free girl ! ! ! ! ! πŸ˜‚ \n", + "67610 can we get season 3 already ! ? 😭 \n", + "61021 have to quot this bih rememb this nigga πŸ˜‚ \n", + "14904 he so damn 😩 \n", + "50994 yasss it time for a great show maxloyalβ„’β™› : gi... πŸ˜‚ \n", + "6973 got to love a fish finger sarni πŸ˜‚ \n", + "3269 say dat πŸ˜‚ \n", + "54827 if ur happi i 'm happi 😊 \n", + "19409 rockstar πŸ˜€ \n", + "38703 god fuck me i alreadi fix it onc πŸ˜‚ \n", + "25133 it social accept to listen to ani christma mus... πŸ˜‚ \n", + "15339 i thrash p in imessag now he wan na bet on 2k πŸ˜‚ \n", + "28082 my fatass need some lemon pepper wing w a lil ... πŸ˜‚ \n", + "44462 fck off tristan yes soph collect u in 15 n we ... 😀 \n", + "60212 open the bag πŸ˜‹ \n", + "34950 i ask peopl to guess my zodiac sign and this o... 😀 \n", + "59462 i regret this sm πŸ˜‚ \n", + "19465 fuck colleg πŸ˜‚ \n", + "8135 aye this wa my first time actual see it wendi ... πŸ˜‚ \n", + "\n", + " teacher_sentiment predict \\\n", + "35671 [0.46813021474490496, 0.24716181096977158, 0.2... πŸ˜… \n", + "25683 [0.46813021474490496, 0.24716181096977158, 0.2... 😁 \n", + "8985 [0.7040175768989329, 0.059322033898305086, 0.2... πŸ˜‚ \n", + "5410 [0.46813021474490496, 0.24716181096977158, 0.2... 😒 \n", + "62611 [0.7040175768989329, 0.059322033898305086, 0.2... πŸ˜‚ \n", + "48197 [0.7040175768989329, 0.059322033898305086, 0.2... πŸ˜€ \n", + "23654 [0.4983755685510071, 0.08057179987004548, 0.42... πŸ˜… \n", + "58207 [0.47186147186147187, 0.2922077922077922, 0.23... πŸ˜‚ \n", + "374 [0.7296744771190439, 0.05173769460607014, 0.21... 😌 \n", + "26310 [0.7040175768989329, 0.059322033898305086, 0.2... πŸ˜‚ \n", + "30892 [0.46813021474490496, 0.24716181096977158, 0.2... πŸ˜‚ \n", + "11868 [0.7296744771190439, 0.05173769460607014, 0.21... 😊 \n", + "46219 [0.34310532030401736, 0.4364820846905538, 0.22... πŸ˜” \n", + "13583 [0.34310532030401736, 0.4364820846905538, 0.22... πŸ˜‚ \n", + "43843 [0.46813021474490496, 0.24716181096977158, 0.2... πŸ˜‚ \n", + "63589 [0.46813021474490496, 0.24716181096977158, 0.2... πŸ˜… \n", + "53695 [0.34310532030401736, 0.4364820846905538, 0.22... 😁 \n", + "67529 [0.7296744771190439, 0.05173769460607014, 0.21... πŸ˜‚ \n", + "25493 [0.7546600877192983, 0.05290570175438596, 0.19... πŸ˜… \n", + "19486 [0.7296744771190439, 0.05173769460607014, 0.21... 😊 \n", + "48449 [0.46813021474490496, 0.24716181096977158, 0.2... πŸ˜‚ \n", + "4504 [0.7296744771190439, 0.05173769460607014, 0.21... πŸ˜‚ \n", + "40285 [0.34310532030401736, 0.4364820846905538, 0.22... πŸ˜‚ \n", + "56741 [0.22289823008849557, 0.5912610619469026, 0.18... 😒 \n", + "22948 [0.6240601503759399, 0.13984962406015036, 0.23... πŸ˜‚ \n", + "68426 [0.7546600877192983, 0.05290570175438596, 0.19... 😭 \n", + "13431 [0.22289823008849557, 0.5912610619469026, 0.18... πŸ˜‚ \n", + "66287 [0.5634451019066403, 0.0992767915844839, 0.337... πŸ˜… \n", + "41980 [0.34310532030401736, 0.4364820846905538, 0.22... πŸ˜… \n", + "34632 [0.46813021474490496, 0.24716181096977158, 0.2... πŸ˜… \n", + "... ... ... \n", + "47218 [0.46813021474490496, 0.24716181096977158, 0.2... πŸ˜… \n", + "35087 [0.39118825100133514, 0.38451268357810414, 0.2... πŸ˜… \n", + "61252 [0.4983755685510071, 0.08057179987004548, 0.42... 😁 \n", + "39960 [0.5981432360742706, 0.10477453580901856, 0.29... πŸ˜‚ \n", + "365 [0.47186147186147187, 0.2922077922077922, 0.23... 😌 \n", + "50665 [0.39118825100133514, 0.38451268357810414, 0.2... πŸ˜… \n", + "21007 [0.7546600877192983, 0.05290570175438596, 0.19... πŸ˜… \n", + "18819 [0.7546600877192983, 0.05290570175438596, 0.19... πŸ™Œ \n", + "42421 [0.7040175768989329, 0.059322033898305086, 0.2... 😁 \n", + "38705 [0.46813021474490496, 0.24716181096977158, 0.2... 😒 \n", + "47033 [0.7296744771190439, 0.05173769460607014, 0.21... 😌 \n", + "38742 [0.46813021474490496, 0.24716181096977158, 0.2... 😒 \n", + "67610 [0.34310532030401736, 0.4364820846905538, 0.22... 😒 \n", + "61021 [0.46813021474490496, 0.24716181096977158, 0.2... πŸ˜‚ \n", + "14904 [0.22289823008849557, 0.5912610619469026, 0.18... πŸ˜‚ \n", + "50994 [0.46813021474490496, 0.24716181096977158, 0.2... πŸ™Œ \n", + "6973 [0.46813021474490496, 0.24716181096977158, 0.2... 😌 \n", + "3269 [0.46813021474490496, 0.24716181096977158, 0.2... πŸ˜‚ \n", + "54827 [0.7040175768989329, 0.059322033898305086, 0.2... πŸ˜… \n", + "19409 [0.6560364464692483, 0.08428246013667426, 0.25... πŸ˜‚ \n", + "38703 [0.46813021474490496, 0.24716181096977158, 0.2... πŸ˜” \n", + "25133 [0.46813021474490496, 0.24716181096977158, 0.2... 😁 \n", + "15339 [0.46813021474490496, 0.24716181096977158, 0.2... πŸ˜… \n", + "28082 [0.46813021474490496, 0.24716181096977158, 0.2... 😭 \n", + "44462 [0.2691131498470948, 0.4801223241590214, 0.250... 😌 \n", + "60212 [0.6784741144414169, 0.04495912806539509, 0.27... πŸ˜‚ \n", + "34950 [0.2691131498470948, 0.4801223241590214, 0.250... πŸ˜‚ \n", + "59462 [0.46813021474490496, 0.24716181096977158, 0.2... 😒 \n", + "19465 [0.46813021474490496, 0.24716181096977158, 0.2... πŸ˜… \n", + "8135 [0.46813021474490496, 0.24716181096977158, 0.2... πŸ˜… \n", + "\n", + " predicted_sentiment \n", + "35671 [0.4447824954986572, 0.30056363344192505, 0.27... \n", + "25683 [0.5660845637321472, 0.1737498641014099, 0.284... \n", + "8985 [0.4871470034122467, 0.26607102155685425, 0.27... \n", + "5410 [0.4061833620071411, 0.3226468861103058, 0.273... \n", + "62611 [0.4549962878227234, 0.21886931359767914, 0.33... \n", + "48197 [0.6561306715011597, 0.11821962147951126, 0.27... \n", + "23654 [0.4600130021572113, 0.28595462441444397, 0.27... \n", + "58207 [0.49543458223342896, 0.25571855902671814, 0.2... \n", + "374 [0.6040589213371277, 0.15823380649089813, 0.26... \n", + "26310 [0.452500581741333, 0.2882971167564392, 0.2790... \n", + "30892 [0.4644194543361664, 0.2708289325237274, 0.277... \n", + "11868 [0.7254493236541748, 0.12355809658765793, 0.22... \n", + "46219 [0.3264158070087433, 0.48023173213005066, 0.23... \n", + "13583 [0.4271591007709503, 0.29361462593078613, 0.29... \n", + "43843 [0.44168680906295776, 0.2790682315826416, 0.29... \n", + "63589 [0.41863512992858887, 0.3106093108654022, 0.28... \n", + "53695 [0.5650997757911682, 0.19236208498477936, 0.27... \n", + "67529 [0.45511549711227417, 0.28582143783569336, 0.2... \n", + "25493 [0.4276219606399536, 0.30413898825645447, 0.28... \n", + "19486 [0.7149834036827087, 0.10459273308515549, 0.24... \n", + "48449 [0.5363025665283203, 0.22163532674312592, 0.27... \n", + "4504 [0.4641677737236023, 0.18824045360088348, 0.37... \n", + "40285 [0.44292521476745605, 0.28201037645339966, 0.2... \n", + "56741 [0.40168094635009766, 0.3777309060096741, 0.24... \n", + "22948 [0.4365620017051697, 0.2830066680908203, 0.294... \n", + "68426 [0.3452186584472656, 0.4593580365180969, 0.223... \n", + "13431 [0.4436468482017517, 0.2736954987049103, 0.294... \n", + "66287 [0.47334975004196167, 0.2881445586681366, 0.26... \n", + "41980 [0.4635038673877716, 0.30251604318618774, 0.26... \n", + "34632 [0.43297499418258667, 0.31000325083732605, 0.2... \n", + "... ... \n", + "47218 [0.470976859331131, 0.2997904419898987, 0.2489... \n", + "35087 [0.4478594660758972, 0.30181050300598145, 0.27... \n", + "61252 [0.5783949494361877, 0.15405726432800293, 0.30... \n", + "39960 [0.4938848316669464, 0.24237176775932312, 0.25... \n", + "365 [0.6203110218048096, 0.17863908410072327, 0.23... \n", + "50665 [0.4619033932685852, 0.2977892756462097, 0.267... \n", + "21007 [0.5029815435409546, 0.2711288630962372, 0.253... \n", + "18819 [0.6974080801010132, 0.11416944861412048, 0.24... \n", + "42421 [0.5765037536621094, 0.18341206014156342, 0.26... \n", + "38705 [0.4030645787715912, 0.36543628573417664, 0.25... \n", + "47033 [0.6219494342803955, 0.1795988380908966, 0.226... \n", + "38742 [0.4049544930458069, 0.35102248191833496, 0.25... \n", + "67610 [0.416861355304718, 0.35468244552612305, 0.245... \n", + "61021 [0.4401417672634125, 0.2810788154602051, 0.292... \n", + "14904 [0.5411785244941711, 0.2148503214120865, 0.246... \n", + "50994 [0.7073097229003906, 0.12480126321315765, 0.23... \n", + "6973 [0.6375303864479065, 0.14495858550071716, 0.24... \n", + "3269 [0.5052645802497864, 0.21280284225940704, 0.30... \n", + "54827 [0.5138391852378845, 0.26520460844039917, 0.25... \n", + "19409 [0.520979106426239, 0.22392335534095764, 0.265... \n", + "38703 [0.32009249925613403, 0.4819949269294739, 0.22... \n", + "25133 [0.5703040361404419, 0.17875489592552185, 0.27... \n", + "15339 [0.4571400284767151, 0.2949279546737671, 0.269... \n", + "28082 [0.36291953921318054, 0.4310339391231537, 0.22... \n", + "44462 [0.6122021675109863, 0.15579015016555786, 0.27... \n", + "60212 [0.470508873462677, 0.2711063623428345, 0.2810... \n", + "34950 [0.4431285262107849, 0.27477312088012695, 0.29... \n", + "59462 [0.40375131368637085, 0.3289208710193634, 0.27... \n", + "19465 [0.4494284391403198, 0.31076472997665405, 0.26... \n", + "8135 [0.42708122730255127, 0.31392431259155273, 0.2... \n", + "\n", + "[2620 rows x 5 columns]" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "display(testlist)\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "* exactly correct labeled sentences:" + ] + }, + { + "cell_type": "code", + "execution_count": 34, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "0.1851145038167939\n" + ] + } + ], + "source": [ + "print (sum([1 if sample[1]['teacher'] == sample[1]['predict'] else 0 for sample in testlist.iterrows()]) / testlist.shape[0])" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "* mean squared error:" + ] + }, + { + "cell_type": "code", + "execution_count": 35, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array([0.02218282, 0.02594105, 0.00323429])" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "teacher_sentiments = np.array([sample[1]['teacher_sentiment'] for sample in testlist.iterrows()])\n", + "predicted_sentiments = np.array([sample[1]['predicted_sentiment'] for sample in testlist.iterrows()])\n", + "\n", + "mean_squared_error = ((teacher_sentiments - predicted_sentiments)**2).mean(axis=0)\n", + "display(mean_squared_error)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "* by an overall variance of:" + ] + }, + { + "cell_type": "code", + "execution_count": 36, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Variance teacher: [0.02183094 0.02513847 0.00285735]\n", + "Variance prediction: [0.00850173 0.00793481 0.00095984]\n" + ] + } + ], + "source": [ + "print(\"Variance teacher: \", np.var(teacher_sentiments, axis=0))\n", + "print(\"Variance prediction: \", np.var(predicted_sentiments, axis=0))" + ] + }, + { + "cell_type": "code", + "execution_count": 37, + "metadata": {}, + "outputs": [], + "source": [ + "testlist.to_csv('test.csv')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "* save classifier:" + ] + }, + { + "cell_type": "code", + "execution_count": 38, + "metadata": {}, + "outputs": [], + "source": [ + "import pickle\n", + "clf.save(\"clf2.keras\")\n", + "pickle.dump( vectorizer, open( \"vec2.pickle\", \"wb\" ) )" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "----\n", + "## testing area\n", + "\n", + "**for just testing, start from here!**\n", + "\n", + "download the dumped classifier and vectorizer from [here](https://the-cake-is-a-lie.net/nextcloud/index.php/s/NjMXamfwQsyrefG)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "* loading classifier and vectorizer" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [], + "source": [ + "from IPython.display import clear_output, Markdown, Math\n", + "import ipywidgets as widgets\n", + "import sys\n", + "sys.path.append(\"..\")\n", + "\n", + "from Tools.Emoji_Distance import sentiment_vector_to_emoji\n", + "from Tools.Emoji_Distance import emoji_to_sentiment_vector\n", + "\n", + "def emoji2sent(emoji_arr):\n", + " return np.array([emoji_to_sentiment_vector(e) for e in emoji_arr])\n", + "\n", + "def sent2emoji(sent_arr, custom_target_emojis=None):\n", + " return [sentiment_vector_to_emoji(s, custom_target_emojis=custom_target_emojis) for s in sent_arr]" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "import keras\n", + "import pickle\n", + "clf = keras.models.load_model(\"clf.keras\")\n", + "vectorizer = pickle.load( open( \"vec.pickle\", \"rb\" ) )" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "* define lookup emojis here:" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [], + "source": [ + "lookup_emojis = [#'πŸ˜‚',\n", + " '😭',\n", + " '😍',\n", + " '😩',\n", + " '😊',\n", + " '😘',\n", + " 'πŸ™',\n", + " 'πŸ™Œ',\n", + " 'πŸ˜‰',\n", + " '😁',\n", + " 'πŸ˜…',\n", + " '😎',\n", + " '😒',\n", + " 'πŸ˜’',\n", + " '😏',\n", + " '😌',\n", + " 'πŸ˜”',\n", + " 'πŸ˜‹',\n", + " 'πŸ˜€',\n", + " '😀']" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "* a simple output widget for testing:" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "metadata": {}, + "outputs": [ + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "755aa31644db4628a3be1ff3b621fa28", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Text(value='')" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "4601eccc07074e71983c9005d1d329b1", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "VBox(children=(Button(description='get emoji', icon='check', style=ButtonStyle(), tooltip='Click me'), Output(…" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "out = widgets.Output()\n", + "\n", + "t = widgets.Text()\n", + "b = widgets.Button(\n", + " description='get emoji',\n", + " disabled=False,\n", + " button_style='', # 'success', 'info', 'warning', 'danger' or ''\n", + " tooltip='Click me',\n", + " icon='check'\n", + ")\n", + "\n", + "\n", + "\n", + "def handle_submit(sender):\n", + " with out:\n", + " clear_output()\n", + " with out:\n", + " pred = clf.predict(vectorizer.transform([t.value]))\n", + " \n", + " display(Markdown(\"# Predicted Emoji \" + str(sent2emoji(pred, lookup_emojis)[0])))\n", + " display(Markdown(\"# Sentiment Vector: $$ \\pmatrix{\" + str(pred[0,0]) +\n", + " \"\\\\\\\\\" + str(pred[0,1]) + \"\\\\\\\\\" + str(pred[0,2]) + \"}$$\"))\n", + "\n", + "b.on_click(handle_submit)\n", + " \n", + "display(t)\n", + "display(widgets.VBox([b, out])) " + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "ename": "NameError", + "evalue": "name 'mlb' is not defined", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mNameError\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[0;32mimport\u001b[0m \u001b[0mnumpy\u001b[0m \u001b[0;32mas\u001b[0m \u001b[0mnp\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 2\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 3\u001b[0;31m \u001b[0my_trans\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mmlb\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0minverse_transform\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0myt1\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 4\u001b[0m \u001b[0mpred_trans\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mmlb\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0minverse_transform\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0myt1\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 5\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;31mNameError\u001b[0m: name 'mlb' is not defined" + ] + } + ], + "source": [ + "import numpy as np\n", + "\n", + "y_trans = mlb.inverse_transform(yt1)\n", + "pred_trans = mlb.inverse_transform(yt1)\n", + "\n", + "# evaluate accuracy\n", + "pos = 0\n", + "neg = 0\n", + "all = 0\n", + "for entry in range(len(y_trans)):\n", + " if len(np.intersect1d(y_trans[entry], pred_trans[entry])) > 0:\n", + " pos += 1\n", + " else:\n", + " neg += 1\n", + " all += 1\n", + "print(pos/all)\n", + "print(neg)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "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.6.5" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} From a623322ebbe40e72539ae484ce14608cd813b9bd Mon Sep 17 00:00:00 2001 From: Jonas Weinz Date: Wed, 20 Jun 2018 11:34:36 +0200 Subject: [PATCH 7/9] just very little tweaks --- .../simple_twitter_learning.ipynb | 167 +++++++++++------- 1 file changed, 102 insertions(+), 65 deletions(-) diff --git a/Project/simple_approach/simple_twitter_learning.ipynb b/Project/simple_approach/simple_twitter_learning.ipynb index 7b8661c..a091cf1 100644 --- a/Project/simple_approach/simple_twitter_learning.ipynb +++ b/Project/simple_approach/simple_twitter_learning.ipynb @@ -9,8 +9,6 @@ "name": "stderr", "output_type": "stream", "text": [ - "/home/jonas/.local/lib/python3.6/site-packages/h5py/__init__.py:36: FutureWarning: Conversion of the second argument of issubdtype from `float` to `np.floating` is deprecated. In future, it will be treated as `np.float64 == np.dtype(float).type`.\n", - " from ._conv import register_converters as _register_converters\n", "Using TensorFlow backend.\n" ] }, @@ -187,7 +185,7 @@ }, { "cell_type": "code", - "execution_count": 11, + "execution_count": 7, "metadata": {}, "outputs": [], "source": [ @@ -322,7 +320,7 @@ }, { "cell_type": "code", - "execution_count": 21, + "execution_count": 8, "metadata": {}, "outputs": [], "source": [ @@ -503,7 +501,7 @@ }, { "cell_type": "code", - "execution_count": 12, + "execution_count": 10, "metadata": {}, "outputs": [ { @@ -527,7 +525,7 @@ }, { "cell_type": "code", - "execution_count": 22, + "execution_count": 11, "metadata": {}, "outputs": [ { @@ -535,7 +533,7 @@ "output_type": "stream", "text": [ "Epoch 1/1\n", - "100/100 [==============================] - 3s 27ms/step - loss: 0.1225\n" + "10000/10000 [==============================] - 109s 11ms/step - loss: 0.0197\n" ] } ], @@ -546,16 +544,9 @@ " layers=[(2500, 'relu'),(3,None)], sdm=sdm)\n", " \n", " tr = trainer(sdm=sdm, pm=pm)\n", - " tr.fit(100)" + " tr.fit(10000)" ] }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - }, { "cell_type": "markdown", "metadata": {}, @@ -566,7 +557,7 @@ }, { "cell_type": "code", - "execution_count": 23, + "execution_count": 13, "metadata": {}, "outputs": [ { @@ -576,6 +567,14 @@ "['keras_model']\n" ] }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/home/jonas/.local/lib/python3.6/site-packages/keras/engine/sequential.py:109: UserWarning: `Sequential.model` is deprecated. `Sequential` is a subclass of `Model`, you can just use your `Sequential` instance directly.\n", + " warnings.warn('`Sequential.model` is deprecated. '\n" + ] + }, { "data": { "text/plain": [ @@ -601,7 +600,9 @@ } ], "source": [ - "pm.save('custom_classifier')" + "import __main__ as main\n", + "if not hasattr(main, '__file__'):\n", + " pm.save('custom_classifier')" ] }, { @@ -614,19 +615,19 @@ }, { "cell_type": "code", - "execution_count": 33, + "execution_count": 14, "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "array([[0.15801723, 0.11859037, 0.10975348],\n", - " [0.17035495, 0.10913695, 0.09354854],\n", - " [0.11777218, 0.06569621, 0.06620223],\n", + "array([[0.4423941 , 0.22976081, 0.26076168],\n", + " [0.75167173, 0.2919423 , 0.3423372 ],\n", + " [0.48943695, 0.21931192, 0.22773138],\n", " ...,\n", - " [0.14746301, 0.09480572, 0.08052498],\n", - " [0.15932804, 0.11895895, 0.10343507],\n", - " [0.17135939, 0.1061406 , 0.09402546]], dtype=float32)" + " [0.51003224, 0.26002786, 0.25588542],\n", + " [0.5808168 , 0.30632192, 0.2964917 ],\n", + " [0.39000767, 0.31723523, 0.24713083]], dtype=float32)" ] }, "metadata": {}, @@ -651,7 +652,7 @@ "name": "stdout", "output_type": "stream", "text": [ - "prediction variance: 0.0006294687\n", + "prediction variance: 0.009700283\n", "teacher variance: 0.03341702104519965\n" ] }, @@ -676,79 +677,79 @@ " \n", " \n", " \n", - " predict\n", - " predicted_sentiment\n", + " text\n", " teacher\n", " teacher_sentiment\n", - " text\n", + " predict\n", + " predicted_sentiment\n", " \n", " \n", " \n", " \n", " 35671\n", - " 😒\n", - " [0.15801723301410675, 0.11859036982059479, 0.1...\n", + " i feel like i care so much more in everi situat\n", " πŸ˜‚\n", " [0.46813021474490496, 0.24716181096977158, 0.2...\n", - " i feel like i care so much more in everi situat\n", + " πŸ˜‚\n", + " [0.44239410758018494, 0.2297608107328415, 0.26...\n", " \n", " \n", " 25683\n", - " 😒\n", - " [0.1703549474477768, 0.10913695394992828, 0.09...\n", + " i did not meat to add that 2 there ... hav see...\n", " πŸ˜‚\n", " [0.46813021474490496, 0.24716181096977158, 0.2...\n", - " i did not meat to add that 2 there ... hav see...\n", + " 😌\n", + " [0.7516717314720154, 0.291942298412323, 0.3423...\n", " \n", " \n", " 8985\n", - " 😒\n", - " [0.1177721843123436, 0.06569620966911316, 0.06...\n", + " never…\n", " 😊\n", " [0.7040175768989329, 0.059322033898305086, 0.2...\n", - " never…\n", + " πŸ˜‚\n", + " [0.48943695425987244, 0.21931192278862, 0.2277...\n", " \n", " \n", " 5410\n", - " 😒\n", - " [0.18182337284088135, 0.12382747232913971, 0.0...\n", + " lmao on me ! ! ! wtf wa he suppos to say\n", " πŸ˜‚\n", " [0.46813021474490496, 0.24716181096977158, 0.2...\n", - " lmao on me ! ! ! wtf wa he suppos to say\n", + " 😒\n", + " [0.3661550283432007, 0.32579296827316284, 0.23...\n", " \n", " \n", " 62611\n", - " 😒\n", - " [0.1786666363477707, 0.11502400785684586, 0.10...\n", + " this dude alway help me get through my school ...\n", " 😊\n", " [0.7040175768989329, 0.059322033898305086, 0.2...\n", - " this dude alway help me get through my school ...\n", + " πŸ˜‚\n", + " [0.48689204454421997, 0.20729433000087738, 0.2...\n", " \n", " \n", "\n", "" ], "text/plain": [ - " predict predicted_sentiment teacher \\\n", - "35671 😒 [0.15801723301410675, 0.11859036982059479, 0.1... πŸ˜‚ \n", - "25683 😒 [0.1703549474477768, 0.10913695394992828, 0.09... πŸ˜‚ \n", - "8985 😒 [0.1177721843123436, 0.06569620966911316, 0.06... 😊 \n", - "5410 😒 [0.18182337284088135, 0.12382747232913971, 0.0... πŸ˜‚ \n", - "62611 😒 [0.1786666363477707, 0.11502400785684586, 0.10... 😊 \n", + " text teacher \\\n", + "35671 i feel like i care so much more in everi situat πŸ˜‚ \n", + "25683 i did not meat to add that 2 there ... hav see... πŸ˜‚ \n", + "8985 never… 😊 \n", + "5410 lmao on me ! ! ! wtf wa he suppos to say πŸ˜‚ \n", + "62611 this dude alway help me get through my school ... 😊 \n", "\n", - " teacher_sentiment \\\n", - "35671 [0.46813021474490496, 0.24716181096977158, 0.2... \n", - "25683 [0.46813021474490496, 0.24716181096977158, 0.2... \n", - "8985 [0.7040175768989329, 0.059322033898305086, 0.2... \n", - "5410 [0.46813021474490496, 0.24716181096977158, 0.2... \n", - "62611 [0.7040175768989329, 0.059322033898305086, 0.2... \n", + " teacher_sentiment predict \\\n", + "35671 [0.46813021474490496, 0.24716181096977158, 0.2... πŸ˜‚ \n", + "25683 [0.46813021474490496, 0.24716181096977158, 0.2... 😌 \n", + "8985 [0.7040175768989329, 0.059322033898305086, 0.2... πŸ˜‚ \n", + "5410 [0.46813021474490496, 0.24716181096977158, 0.2... 😒 \n", + "62611 [0.7040175768989329, 0.059322033898305086, 0.2... πŸ˜‚ \n", "\n", - " text \n", - "35671 i feel like i care so much more in everi situat \n", - "25683 i did not meat to add that 2 there ... hav see... \n", - "8985 never… \n", - "5410 lmao on me ! ! ! wtf wa he suppos to say \n", - "62611 this dude alway help me get through my school ... " + " predicted_sentiment \n", + "35671 [0.44239410758018494, 0.2297608107328415, 0.26... \n", + "25683 [0.7516717314720154, 0.291942298412323, 0.3423... \n", + "8985 [0.48943695425987244, 0.21931192278862, 0.2277... \n", + "5410 [0.3661550283432007, 0.32579296827316284, 0.23... \n", + "62611 [0.48689204454421997, 0.20729433000087738, 0.2... " ] }, "metadata": {}, @@ -758,9 +759,9 @@ "name": "stdout", "output_type": "stream", "text": [ - "Mean Squared Error: [0.14140389 0.04240099 0.02944344]\n", + "Mean Squared Error: [0.02340565 0.02344435 0.00374819]\n", "Variance teacher: [0.02183094 0.02513847 0.00285735]\n", - "Variance prediction: [0.00053908 0.00024232 0.00021658]\n" + "Variance prediction: [0.0083875 0.00473354 0.00115709]\n" ] } ], @@ -807,9 +808,38 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 15, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "2ca4e06fcd4f41c2bfd161f9f16ca594", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Text(value='')" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "a39abb79d70e4ae1952b2d928cfab174", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "VBox(children=(Button(description='get emoji', icon='check', style=ButtonStyle(), tooltip='Click me'), Output(…" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], "source": [ "import __main__ as main\n", "if not hasattr(main, '__file__'):\n", @@ -869,6 +899,13 @@ " display(t)\n", " display(widgets.VBox([b, out])) " ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] } ], "metadata": { From 0bedb6060d0c2c15fbaf66471f6f2b5321e8d69f Mon Sep 17 00:00:00 2001 From: Jonas Weinz Date: Wed, 20 Jun 2018 13:38:18 +0200 Subject: [PATCH 8/9] documentation and python file for simple_twitter_learning --- .../simple_twitter_learning.ipynb | 148 +++- .../simple_twitter_learning.py | 631 ++++++++++++++++++ 2 files changed, 749 insertions(+), 30 deletions(-) create mode 100644 Project/simple_approach/simple_twitter_learning.py diff --git a/Project/simple_approach/simple_twitter_learning.ipynb b/Project/simple_approach/simple_twitter_learning.ipynb index a091cf1..c2e623e 100644 --- a/Project/simple_approach/simple_twitter_learning.ipynb +++ b/Project/simple_approach/simple_twitter_learning.ipynb @@ -9,6 +9,8 @@ "name": "stderr", "output_type": "stream", "text": [ + "/home/jonas/.local/lib/python3.6/site-packages/h5py/__init__.py:36: FutureWarning: Conversion of the second argument of issubdtype from `float` to `np.floating` is deprecated. In future, it will be treated as `np.float64 == np.dtype(float).type`.\n", + " from ._conv import register_converters as _register_converters\n", "Using TensorFlow backend.\n" ] }, @@ -180,7 +182,14 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "* the sample data manager loads and preprocesses data" + "### sample data manager\n", + "the sample data manager loads and preprocesses data\n", + "most common way to use:\n", + "\n", + "\n", + "* `sdm = sample_data_manager.generate_and_read(path:str, only_emoticons=True, apply_stemming=True, n_top_emojis=-1, file_range=None)`\n", + "\n", + " * Generates a sample_data_manager object and preprocess data in one step\n" ] }, { @@ -192,6 +201,16 @@ "class sample_data_manager(object):\n", " @staticmethod\n", " def generate_and_read(path:str, only_emoticons=True, apply_stemming=True, n_top_emojis=-1, file_range=None):\n", + " \"\"\"\n", + " generate, read and process train data in one step.\n", + " \n", + " @param path: folder containing json files to process\n", + " @param only_emoticons: if True, only messages containing emoticons (provided by Tools.Emoji_Distance) are used\n", + " @param apply_stemming: apply stemming and lemmatization on dataset\n", + " @param n_top_emojis: only use messages containing one of <`n_top_emojis`>-top emojis. set to `-1` to prevent top emoji filtering\n", + " @param file_range: range of file's indices to read (eg `range(3)` to read the first three files). If `None`: all files are read\n", + " @return: sample_data_manager object\n", + " \"\"\"\n", " sdm = sample_data_manager(path)\n", " sdm.read_files(file_index_range=range(sdm.n_files) if file_range is None else file_range, only_emoticons=only_emoticons)\n", " if apply_stemming:\n", @@ -206,6 +225,11 @@ " \n", " \n", " def __init__(self, data_root_folder:str):\n", + " \"\"\"\n", + " constructor for manual initialization\n", + " \n", + " @param data_root_folder: folder containing json files to process\n", + " \"\"\"\n", " self.data_root_folder = data_root_folder\n", " self.json_files = sorted(glob.glob(self.data_root_folder + \"/*.json\"))\n", " self.n_files = len(self.json_files)\n", @@ -222,6 +246,12 @@ " self.top_emojis = None\n", " \n", " def read_files(self, file_index_range:list, only_emoticons=True):\n", + " \"\"\"\n", + " reading (multiple) files to one panda table.\n", + " \n", + " @param file_index_range: range of file's indices to read (eg `range(3)` to read the first three files)\n", + " @param only_emoticons: if True, only messages containing emoticons (aka smileys) are used. This classification is derived from Tools.Emoji_Distance\n", + " \"\"\"\n", " assert np.min(file_index_range) >= 0 and np.max(file_index_range) < self.n_files\n", " for i in file_index_range:\n", " print(\"reading file: \" + self.json_files[i] + \"...\")\n", @@ -249,6 +279,9 @@ " print(\"imported \" + str(len(self.labels)) + \" samples\")\n", " \n", " def apply_stemming_and_lemmatization(self):\n", + " \"\"\"\n", + " apply stemming and lemmatization to plain text samples\n", + " \"\"\"\n", " stemmer = SnowballStemmer(\"english\")\n", " for key in self.plain_text.keys():\n", " stemmed_sent = []\n", @@ -270,6 +303,9 @@ " self.plain_text[key] = lemmatized_sent\n", " \n", " def generate_emoji_count_and_weights(self):\n", + " \"\"\"\n", + " counting occurences of emojis\n", + " \"\"\"\n", " self.emoji_count = {}\n", " for e_list in self.emojis:\n", " for e in set(e_list):\n", @@ -294,11 +330,23 @@ " self.emoji_count['X'] = 0\n", " \n", " def get_emoji_count(self):\n", + " \"\"\"\n", + " @return: descending list of tuples in form (, ) \n", + " \"\"\"\n", + " assert self.emoji_count is not None\n", + " \n", " sorted_emoji_count = list(reversed(sorted(self.emoji_count.items(), key=operator.itemgetter(1))))\n", " #display(sorted_emoji_count)\n", " return sorted_emoji_count\n", " \n", " def filter_by_top_emojis(self,n_top = 20):\n", + " \"\"\"\n", + " filgter out messages not containing one of the `n_top` emojis\n", + " \n", + " @param n_top: number of top emojis used for filtering\n", + " \"\"\"\n", + " assert self.labels is not None # ← messages are already read in\n", + " \n", " self.top_emojis = [x[0] for x in self.get_emoji_count()[:n_top]]\n", " in_top = [sentiment_vector_to_emoji(x) in self.top_emojis for x in self.labels]\n", " self.labels = self.labels[in_top]\n", @@ -307,6 +355,8 @@ " print(\"remaining samples after top emoji filtering: \", len(self.labels))\n", " \n", " def create_train_test_split(self, split = 0.1, random_state = 4222):\n", + " if self.X is not None:\n", + " sys.stderr.write(\"WARNING: overwriting existing train/test split \\n\")\n", " self.X, self.Xt, self.y, self.yt = train_test_split(self.plain_text, self.labels, test_size=split, random_state=random_state)\n", "\n" ] @@ -327,6 +377,16 @@ "class pipeline_manager(object):\n", " @staticmethod\n", " def load_pipeline_from_files(file_prefix:str, keras_models = [], all_models = []):\n", + " \"\"\"\n", + " load a pipeline from files. A pipeline should be represented by multiple model files in the form '.'\n", + " \n", + " @param file_prefix: basename of all files (without extension)\n", + " @param keras_models: list of keras models (keras model files, only extension name). Leave this list empty if this is not a keras pipeline\n", + " @param all_models: list of all models (including keras_models, only extension name).\n", + " \n", + " @return a pipeline manager object\n", + " \"\"\"\n", + " \n", " pm = pipeline_manager(keras_models=keras_models)\n", " pm.load(file_prefix, all_models)\n", " return pm\n", @@ -335,6 +395,13 @@ " def create_keras_pipeline_with_vectorizer(vectorizer, layers, sdm:sample_data_manager):\n", " '''\n", " creates pipeline with vectorizer and keras classifier\n", + " \n", + " @param vectorizer: Vectorizer object. will be fitted with data provided by sdm\n", + " @param layers: list of keras layers. One keras layer is a tuple in form: (<#neurons:int>, )\n", + " @param sdm: sample data manager to get data for the vectorizer\n", + " \n", + " @return: a pipeline manager object\n", + " \n", " '''\n", " from keras.models import Sequential\n", " from keras.layers import Dense\n", @@ -369,8 +436,13 @@ " @staticmethod\n", " def create_pipeline_with_classifier_and_vectorizer(vectorizer, classifier, sdm:sample_data_manager = None):\n", " '''\n", - " creates a pipeline with vectorizer and classifier for non keras classifiers\n", - " if sample data manager is given, the vectorizer will be also fitted!\n", + " creates pipeline with vectorizer and non-keras classifier\n", + " \n", + " @param vectorizer: Vectorizer object. will be fitted with data provided by sdm\n", + " @param classifier: unfitted classifier object (should be compatible with all sklearn classifiers)\n", + " @param sdm: sample data manager to get data for the vectorizer\n", + " \n", + " @return: a pipeline manager object\n", " '''\n", " if sdm is not None:\n", " if sdm.X is None:\n", @@ -387,11 +459,24 @@ " return pipeline_manager(pipeline=pipeline, keras_models=[])\n", " \n", " def __init__(self, pipeline = None, keras_models = []):\n", + " \"\"\"\n", + " constructor\n", + " \n", + " @param pipeline: a sklearn pipeline\n", + " @param keras_models: list of keras steps in pipeline. Neccessary because saving and loading from keras models differs from the scikit ones\n", + " \"\"\"\n", + " \n", " self.pipeline = pipeline\n", " self.additional_objects = {}\n", " self.keras_models = keras_models\n", " \n", " def save(self, prefix:str):\n", + " \"\"\"\n", + " saving the pipeline. It generates one file per model in the form: '.'\n", + " \n", + " @param prefix: file prefix for all models\n", + " \"\"\"\n", + " \n", " print(self.keras_models)\n", " # doing this like explained here: https://stackoverflow.com/a/43415459\n", " for step in self.pipeline.named_steps:\n", @@ -407,13 +492,20 @@ " import __main__ as main\n", " if not hasattr(main, '__file__'):\n", " display(\"saved pipeline. It can be loaded the following way:\")\n", - " display(Markdown(\"> ```\\n\"+load_command+\"\\n```\"))\n", + " display(Markdown(\"> ```\\n\"+load_command+\"\\n```\")) # ← if we're in jupyter, print the fancy way :)\n", " else:\n", " print(\"saved pipeline. It can be loaded the following way:\")\n", " print(load_command)\n", " \n", " \n", " def load(self, prefix:str, models = []):\n", + " \"\"\"\n", + " load a pipeline. A pipeline should be represented by multiple model files in the form '.'\n", + " NOTE: keras model names (if there are some) have to be defined in self.keras_models first!\n", + " \n", + " @param prefix: the prefix for all model files\n", + " @param models: model_names to load\n", + " \"\"\"\n", " self.pipeline = None\n", " model_list = []\n", " for model in models:\n", @@ -424,9 +516,11 @@ " self.pipeline = Pipeline(model_list)\n", " \n", " def fit(self,X,y):\n", + " \"\"\"fitting the pipeline\"\"\"\n", " self.pipeline.fit(X,y)\n", " \n", " def predict(self,X):\n", + " \"\"\"predict\"\"\"\n", " return self.pipeline.predict(X)\n", " " ] @@ -446,10 +540,17 @@ "source": [ "class trainer(object):\n", " def __init__(self, sdm:sample_data_manager, pm:pipeline_manager):\n", + " \"\"\"constructor\"\"\"\n", " self.sdm = sdm\n", " self.pm = pm\n", " \n", " def fit(self, max_size=10000, disabled_fit_steps=['vectorizer']):\n", + " \"\"\"\n", + " fitting data in the pipeline. Because we don't want to refit the vectorizer, the pipeline models containing the vectorizer have to be named explicitly\n", + " \n", + " @param max_size: don't train more examples than that number\n", + " @param disabled_fit_steps: list of pipeline steps that we want to prevent to refit. Normally all vectorizer steps\n", + " \"\"\"\n", " # TODO: make batch fitting available here (eg: continous waiting for data and fitting them)\n", " if self.sdm.X is None:\n", " self.sdm.create_train_test_split()\n", @@ -475,7 +576,7 @@ " \n", " def test(self):\n", " '''\n", - " return: prediction:list, teacher:list\n", + " @return: prediction:list, teacher:list\n", " '''\n", " if self.sdm.X is None:\n", " self.sdm.create_train_test_split()\n", @@ -510,7 +611,9 @@ "text": [ "reading file: ./data_en/2017-11-01.json...\n", "imported 33368 samples\n", - "remaining samples after top emoji filtering: 26197\n" + "remaining samples after top emoji filtering: 26197\n", + "Epoch 1/1\n", + "100/100 [==============================] - 3s 27ms/step - loss: 0.1227\n" ] } ], @@ -520,31 +623,12 @@ " # we are in an interactive environment (probably in jupyter)\n", " # load data:\n", " sdm = sample_data_manager.generate_and_read(path=\"./data_en/\", n_top_emojis=20, file_range=range(1))\n", - " " - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Epoch 1/1\n", - "10000/10000 [==============================] - 109s 11ms/step - loss: 0.0197\n" - ] - } - ], - "source": [ - " #pm = pipeline_manager.create_keras_pipeline_with_vectorizer(vectorizer=TfidfVectorizer(stop_words='english'),\n", - " # layers=[(10000, 'relu'),(5000, 'relu'),(2500, 'relu'),(y1[0].shape[0],None)], sdm=sdm)\n", + " #pm = pipeline_manager.create_keras_pipeline_with_vectorizer(vectorizer=TfidfVectorizer(stop_words='english'),\\n\",\n", + " # layers=[(10000, 'relu'),(5000, 'relu'),(2500, 'relu'),(y1[0].shape[0],None)], sdm=sdm)\\n\",\n", " pm = pipeline_manager.create_keras_pipeline_with_vectorizer(vectorizer=TfidfVectorizer(stop_words='english'),\n", " layers=[(2500, 'relu'),(3,None)], sdm=sdm)\n", - " \n", " tr = trainer(sdm=sdm, pm=pm)\n", - " tr.fit(10000)" + " tr.fit(100)" ] }, { @@ -610,7 +694,9 @@ "metadata": {}, "source": [ "----\n", - "## Prediction" + "## Prediction\n", + "\n", + "* predict and save to `test.csv`" ] }, { @@ -803,7 +889,9 @@ "metadata": {}, "source": [ "----\n", - "## Load classifier" + "## Load classifier\n", + "\n", + "* loading classifier and show a test widget" ] }, { diff --git a/Project/simple_approach/simple_twitter_learning.py b/Project/simple_approach/simple_twitter_learning.py new file mode 100644 index 0000000..0f0b944 --- /dev/null +++ b/Project/simple_approach/simple_twitter_learning.py @@ -0,0 +1,631 @@ + +# coding: utf-8 + +# In[1]: + + +import pandas as pd +from IPython.display import clear_output, Markdown, Math +import ipywidgets as widgets +import os +import glob +import json +import numpy as np +import itertools +import sklearn.utils as sku +from sklearn.feature_extraction.text import CountVectorizer, TfidfVectorizer, HashingVectorizer +from sklearn.model_selection import train_test_split +from sklearn.preprocessing import MultiLabelBinarizer +import nltk +from keras.models import load_model +from sklearn.externals import joblib +import pickle +import operator +from sklearn.pipeline import Pipeline +nltk.download('punkt') +nltk.download('averaged_perceptron_tagger') +nltk.download('wordnet') + + +# In[2]: + + +import sys +sys.path.append("..") + +from Tools.Emoji_Distance import sentiment_vector_to_emoji +from Tools.Emoji_Distance import emoji_to_sentiment_vector + +def emoji2sent(emoji_arr, only_emoticons=True): + return np.array([emoji_to_sentiment_vector(e, only_emoticons=only_emoticons) for e in emoji_arr]) + +def sent2emoji(sent_arr, custom_target_emojis=None, only_emoticons=True): + return [sentiment_vector_to_emoji(s, custom_target_emojis=custom_target_emojis, only_emoticons=only_emoticons) for s in sent_arr] + + +# In[3]: + + +SINGLE_LABEL = True + + +# ---- +# ## classes and functions we are using later: +# ---- + +# * functions for selecting items from a set / list + +# In[4]: + + +def latest(lst): + return lst[-1] if len(lst) > 0 else 'X' +def most_common(lst): + # trying to find the most common used emoji in the given lst + return max(set(lst), key=lst.count) if len(lst) > 0 else "X" # setting label to 'X' if there is an empty emoji list + + +# * our emoji blacklist (skin and sex modifiers) + +# In[5]: + + +# defining blacklist for modifier emojis: +emoji_blacklist = set([ + chr(0x1F3FB), + chr(0x1F3FC), + chr(0x1F3FD), + chr(0x1F3FE), + chr(0x1F3FF), + chr(0x2642), + chr(0x2640) +]) + + +# * lemmatization helper functions + +# In[6]: + + +from nltk.stem.snowball import SnowballStemmer +from nltk.stem import WordNetLemmatizer +from nltk import pos_tag +from nltk import word_tokenize +from nltk.corpus import wordnet + +def get_wordnet_pos(treebank_tag): + + if treebank_tag.startswith('J'): + return wordnet.ADJ + elif treebank_tag.startswith('V'): + return wordnet.VERB + elif treebank_tag.startswith('N'): + return wordnet.NOUN + elif treebank_tag.startswith('R'): + return wordnet.ADV + else: + return wordnet.NOUN + + +# ### sample data manager +# the sample data manager loads and preprocesses data +# most common way to use: +# +# +# * `sdm = sample_data_manager.generate_and_read(path:str, only_emoticons=True, apply_stemming=True, n_top_emojis=-1, file_range=None)` +# +# * Generates a sample_data_manager object and preprocess data in one step +# + +# In[7]: + + +class sample_data_manager(object): + @staticmethod + def generate_and_read(path:str, only_emoticons=True, apply_stemming=True, n_top_emojis=-1, file_range=None): + """ + generate, read and process train data in one step. + + @param path: folder containing json files to process + @param only_emoticons: if True, only messages containing emoticons (provided by Tools.Emoji_Distance) are used + @param apply_stemming: apply stemming and lemmatization on dataset + @param n_top_emojis: only use messages containing one of <`n_top_emojis`>-top emojis. set to `-1` to prevent top emoji filtering + @param file_range: range of file's indices to read (eg `range(3)` to read the first three files). If `None`: all files are read + @return: sample_data_manager object + """ + sdm = sample_data_manager(path) + sdm.read_files(file_index_range=range(sdm.n_files) if file_range is None else file_range, only_emoticons=only_emoticons) + if apply_stemming: + sdm.apply_stemming_and_lemmatization() + + sdm.generate_emoji_count_and_weights() + + if n_top_emojis > 0: + sdm.filter_by_top_emojis(n_top=n_top_emojis) + + return sdm + + + def __init__(self, data_root_folder:str): + """ + constructor for manual initialization + + @param data_root_folder: folder containing json files to process + """ + self.data_root_folder = data_root_folder + self.json_files = sorted(glob.glob(self.data_root_folder + "/*.json")) + self.n_files = len(self.json_files) + self.raw_data = None + self.emojis = None + self.plain_text = None + self.labels = None + self.emoji_count = None + self.emoji_weights = None + self.X = None + self.y = None + self.Xt = None + self.yt = None + self.top_emojis = None + + def read_files(self, file_index_range:list, only_emoticons=True): + """ + reading (multiple) files to one panda table. + + @param file_index_range: range of file's indices to read (eg `range(3)` to read the first three files) + @param only_emoticons: if True, only messages containing emoticons (aka smileys) are used. This classification is derived from Tools.Emoji_Distance + """ + assert np.min(file_index_range) >= 0 and np.max(file_index_range) < self.n_files + for i in file_index_range: + print("reading file: " + self.json_files[i] + "...") + if self.raw_data is None: + self.raw_data = pd.read_json(self.json_files[i], encoding="utf-8") + else: + self.raw_data = self.raw_data.append(pd.read_json(self.json_files[i], encoding="utf-8")) + + self.emojis = self.raw_data['EMOJI'] + self.plain_text = self.raw_data['text'] + + # replacing keywords. TODO: maybe these information can be extracted and used + self.plain_text = self.plain_text.str.replace("(||)","").str.replace("[" + "".join(list(emoji_blacklist)) + "]","") + + # so far filtering for the latest emoji. TODO: maybe there are also better approaches + self.labels = emoji2sent([latest(e) for e in self.emojis], only_emoticons=only_emoticons ) + + # and filter out all samples we have no label for: + wrong_labels = np.isnan(np.linalg.norm(self.labels, axis=1)) + + self.labels = self.labels[np.invert(wrong_labels)] + self.plain_text = self.plain_text[np.invert(wrong_labels)] + self.emojis = self.emojis[np.invert(wrong_labels)] + + print("imported " + str(len(self.labels)) + " samples") + + def apply_stemming_and_lemmatization(self): + """ + apply stemming and lemmatization to plain text samples + """ + stemmer = SnowballStemmer("english") + for key in self.plain_text.keys(): + stemmed_sent = [] + for word in self.plain_text[key].split(" "): + word_stemmed = stemmer.stem(word) + stemmed_sent.append(word_stemmed) + stemmed_sent = (" ").join(stemmed_sent) + self.plain_text[key] = stemmed_sent + + lemmatizer = WordNetLemmatizer() + for key in self.plain_text.keys(): + lemmatized_sent = [] + sent_pos = pos_tag(word_tokenize(self.plain_text[key])) + for word in sent_pos: + wordnet_pos = get_wordnet_pos(word[1].lower()) + word_lemmatized = lemmatizer.lemmatize(word[0], pos=wordnet_pos) + lemmatized_sent.append(word_lemmatized) + lemmatized_sent = (" ").join(lemmatized_sent) + self.plain_text[key] = lemmatized_sent + + def generate_emoji_count_and_weights(self): + """ + counting occurences of emojis + """ + self.emoji_count = {} + for e_list in self.emojis: + for e in set(e_list): + if e not in self.emoji_count: + self.emoji_count[e] = 0 + self.emoji_count[e] += 1 + + emoji_sum = sum([self.emoji_count[e] for e in self.emoji_count]) + + self.emoji_weights = {} + for e in self.emoji_count: + # tfidf for emojis + self.emoji_weights[e] = np.log((emoji_sum / self.emoji_count[e])) + + weights_sum= sum([self.emoji_weights[x] for x in self.emoji_weights]) + + # normalize: + for e in self.emoji_weights: + self.emoji_weights[e] = self.emoji_weights[e] / weights_sum + + self.emoji_weights['X'] = 0 # dummy values + self.emoji_count['X'] = 0 + + def get_emoji_count(self): + """ + @return: descending list of tuples in form (, ) + """ + assert self.emoji_count is not None + + sorted_emoji_count = list(reversed(sorted(self.emoji_count.items(), key=operator.itemgetter(1)))) + #display(sorted_emoji_count) + return sorted_emoji_count + + def filter_by_top_emojis(self,n_top = 20): + """ + filgter out messages not containing one of the `n_top` emojis + + @param n_top: number of top emojis used for filtering + """ + assert self.labels is not None # ← messages are already read in + + self.top_emojis = [x[0] for x in self.get_emoji_count()[:n_top]] + in_top = [sentiment_vector_to_emoji(x) in self.top_emojis for x in self.labels] + self.labels = self.labels[in_top] + self.plain_text = self.plain_text[in_top] + self.emojis = self.emojis[in_top] + print("remaining samples after top emoji filtering: ", len(self.labels)) + + def create_train_test_split(self, split = 0.1, random_state = 4222): + if self.X is not None: + sys.stderr.write("WARNING: overwriting existing train/test split \n") + self.X, self.Xt, self.y, self.yt = train_test_split(self.plain_text, self.labels, test_size=split, random_state=random_state) + + + +# * the pipeline manager saves and stores sklearn pipelines. Keras models are handled differently, so the have to be named explicitly during save and load operations + +# In[8]: + + +class pipeline_manager(object): + @staticmethod + def load_pipeline_from_files(file_prefix:str, keras_models = [], all_models = []): + """ + load a pipeline from files. A pipeline should be represented by multiple model files in the form '.' + + @param file_prefix: basename of all files (without extension) + @param keras_models: list of keras models (keras model files, only extension name). Leave this list empty if this is not a keras pipeline + @param all_models: list of all models (including keras_models, only extension name). + + @return a pipeline manager object + """ + + pm = pipeline_manager(keras_models=keras_models) + pm.load(file_prefix, all_models) + return pm + + @staticmethod + def create_keras_pipeline_with_vectorizer(vectorizer, layers, sdm:sample_data_manager): + ''' + creates pipeline with vectorizer and keras classifier + + @param vectorizer: Vectorizer object. will be fitted with data provided by sdm + @param layers: list of keras layers. One keras layer is a tuple in form: (<#neurons:int>, ) + @param sdm: sample data manager to get data for the vectorizer + + @return: a pipeline manager object + + ''' + from keras.models import Sequential + from keras.layers import Dense + + if sdm.X is None: + sdm.create_train_test_split() + + vec_train = vectorizer.fit_transform(sdm.X) + vec_test = vectorizer.transform(sdm.Xt) + # creating keras model: + model=Sequential() + + keras_layers = [] + first_layer = True + for layer in layers: + if first_layer: + model.add(Dense(units=layer[0], activation=layer[1], input_dim=vectorizer.transform([" "])[0]._shape[1])) + first_layer = False + else: + model.add(Dense(units=layer[0], activation=layer[1])) + + model.compile(loss='mean_squared_error', + optimizer='adam') + + pipeline = Pipeline([ + ('vectorizer',vectorizer), + ('keras_model', model) + ]) + + return pipeline_manager(pipeline=pipeline, keras_models=['keras_model']) + + @staticmethod + def create_pipeline_with_classifier_and_vectorizer(vectorizer, classifier, sdm:sample_data_manager = None): + ''' + creates pipeline with vectorizer and non-keras classifier + + @param vectorizer: Vectorizer object. will be fitted with data provided by sdm + @param classifier: unfitted classifier object (should be compatible with all sklearn classifiers) + @param sdm: sample data manager to get data for the vectorizer + + @return: a pipeline manager object + ''' + if sdm is not None: + if sdm.X is None: + sdm.create_train_test_split() + + vec_train = vectorizer.fit_transform(sdm.X) + vec_test = vectorizer.transform(sdm.Xt) + + pipeline = Pipeline([ + ('vectorizer',vectorizer), + ('classifier', classifier) + ]) + + return pipeline_manager(pipeline=pipeline, keras_models=[]) + + def __init__(self, pipeline = None, keras_models = []): + """ + constructor + + @param pipeline: a sklearn pipeline + @param keras_models: list of keras steps in pipeline. Neccessary because saving and loading from keras models differs from the scikit ones + """ + + self.pipeline = pipeline + self.additional_objects = {} + self.keras_models = keras_models + + def save(self, prefix:str): + """ + saving the pipeline. It generates one file per model in the form: '.' + + @param prefix: file prefix for all models + """ + + print(self.keras_models) + # doing this like explained here: https://stackoverflow.com/a/43415459 + for step in self.pipeline.named_steps: + if step in self.keras_models: + self.pipeline.named_steps[step].model.save(prefix + "." + step) + else: + joblib.dump(self.pipeline.named_steps[step], prefix + "." + str(step)) + + load_command = "pipeline_manager.load_pipeline_from_files( '" + load_command += prefix + "', " + str(self.keras_models) + ", " + load_command += str(list(self.pipeline.named_steps.keys())) + ")" + + import __main__ as main + if not hasattr(main, '__file__'): + display("saved pipeline. It can be loaded the following way:") + display(Markdown("> ```\n"+load_command+"\n```")) # ← if we're in jupyter, print the fancy way :) + else: + print("saved pipeline. It can be loaded the following way:") + print(load_command) + + + def load(self, prefix:str, models = []): + """ + load a pipeline. A pipeline should be represented by multiple model files in the form '.' + NOTE: keras model names (if there are some) have to be defined in self.keras_models first! + + @param prefix: the prefix for all model files + @param models: model_names to load + """ + self.pipeline = None + model_list = [] + for model in models: + if model in self.keras_models: + model_list.append((model, load_model(prefix + "." + model))) + else: + model_list.append((model, joblib.load(prefix+"." + model))) + self.pipeline = Pipeline(model_list) + + def fit(self,X,y): + """fitting the pipeline""" + self.pipeline.fit(X,y) + + def predict(self,X): + """predict""" + return self.pipeline.predict(X) + + + +# * the trainer class passes Data from the sample manager to the pipeline manager + +# In[9]: + + +class trainer(object): + def __init__(self, sdm:sample_data_manager, pm:pipeline_manager): + """constructor""" + self.sdm = sdm + self.pm = pm + + def fit(self, max_size=10000, disabled_fit_steps=['vectorizer']): + """ + fitting data in the pipeline. Because we don't want to refit the vectorizer, the pipeline models containing the vectorizer have to be named explicitly + + @param max_size: don't train more examples than that number + @param disabled_fit_steps: list of pipeline steps that we want to prevent to refit. Normally all vectorizer steps + """ + # TODO: make batch fitting available here (eg: continous waiting for data and fitting them) + if self.sdm.X is None: + self.sdm.create_train_test_split() + disabled_fits = {} + disabled_fit_transforms = {} + + named_steps = self.pm.pipeline.named_steps + + for s in disabled_fit_steps: + # now it gets a little bit dirty: + # replace fit functions we don't want to call again (e.g. for vectorizers) + disabled_fits[s] = named_steps[s].fit + disabled_fit_transforms[s] = named_steps[s].fit_transform + named_steps[s].fit = lambda self, X, y=None: self + named_steps[s].fit_transform = named_steps[s].transform + + self.pm.fit(X = self.sdm.X[:max_size], y = self.sdm.y[:max_size]) + + # restore replaced fit functions: + for s in disabled_fit_steps: + named_steps[s].fit = disabled_fits[s] + named_steps[s].fit_transform = disabled_fit_transforms[s] + + def test(self): + ''' + @return: prediction:list, teacher:list + ''' + if self.sdm.X is None: + self.sdm.create_train_test_split() + return self.pm.predict(self.sdm.Xt), self.sdm.yt + + + + +# ---- +# ## Train + +# * when in notebook environment: run the stuff below: + +# In[10]: + + +import __main__ as main +if not hasattr(main, '__file__'): + # we are in an interactive environment (probably in jupyter) + # load data: + sdm = sample_data_manager.generate_and_read(path="./data_en/", n_top_emojis=20, file_range=range(1)) + #pm = pipeline_manager.create_keras_pipeline_with_vectorizer(vectorizer=TfidfVectorizer(stop_words='english'),\n", + # layers=[(10000, 'relu'),(5000, 'relu'),(2500, 'relu'),(y1[0].shape[0],None)], sdm=sdm)\n", + pm = pipeline_manager.create_keras_pipeline_with_vectorizer(vectorizer=TfidfVectorizer(stop_words='english'), + layers=[(2500, 'relu'),(3,None)], sdm=sdm) + tr = trainer(sdm=sdm, pm=pm) + tr.fit(100) + + +# ---- +# ## save classifier + +# In[13]: + + +import __main__ as main +if not hasattr(main, '__file__'): + pm.save('custom_classifier') + + +# ---- +# ## Prediction +# +# * predict and save to `test.csv` + +# In[14]: + + +import __main__ as main +if not hasattr(main, '__file__'): + pred, teacher = tr.test() + + display(pred) + display(teacher) + + print('prediction variance: ', np.linalg.norm(np.var(pred, axis=0))) + print('teacher variance: ', np.linalg.norm(np.var(teacher, axis=0))) + + # build a dataframe to visualize test results: + testlist = pd.DataFrame({'text': sdm.Xt, + 'teacher': sent2emoji(sdm.yt), + 'teacher_sentiment': sdm.yt.tolist(), + 'predict': sent2emoji(pred, custom_target_emojis=sdm.top_emojis), + 'predicted_sentiment': pred.tolist()}) + # display: + display(testlist.head()) + + # mean squared error: + teacher_sentiments = np.array([sample[1]['teacher_sentiment'] for sample in testlist.iterrows()]) + predicted_sentiments = np.array([sample[1]['predicted_sentiment'] for sample in testlist.iterrows()]) + + mean_squared_error = ((teacher_sentiments - predicted_sentiments)**2).mean(axis=0) + print("Mean Squared Error: ", mean_squared_error) + print("Variance teacher: ", np.var(teacher_sentiments, axis=0)) + print("Variance prediction: ", np.var(predicted_sentiments, axis=0)) + + # save to csv: + testlist.to_csv('test.csv') + + +# ---- +# ## Load classifier +# +# * loading classifier and show a test widget + +# In[15]: + + +import __main__ as main +if not hasattr(main, '__file__'): + try: + pm + except NameError: + pass + else: + del pm # delete existing pipeline manager if ther is one + + pm = pipeline_manager.load_pipeline_from_files( 'custom_classifier', ['keras_model'], ['vectorizer', 'keras_model']) + lookup_emojis = [#'πŸ˜‚', + '😭', + '😍', + '😩', + '😊', + '😘', + 'πŸ™', + 'πŸ™Œ', + 'πŸ˜‰', + '😁', + 'πŸ˜…', + '😎', + '😒', + 'πŸ˜’', + '😏', + '😌', + 'πŸ˜”', + 'πŸ˜‹', + 'πŸ˜€', + '😀'] + out = widgets.Output() + + t = widgets.Text() + b = widgets.Button( + description='get emoji', + disabled=False, + button_style='', # 'success', 'info', 'warning', 'danger' or '' + tooltip='Click me', + icon='check' + ) + + + + def handle_submit(sender): + with out: + clear_output() + with out: + pred = pm.predict([t.value]) + + display(Markdown("# Predicted Emoji " + str(sent2emoji(pred, lookup_emojis)[0]))) + display(Markdown("# Sentiment Vector: $$ \pmatrix{" + str(pred[0,0]) + + "\\\\" + str(pred[0,1]) + "\\\\" + str(pred[0,2]) + "}$$")) + + b.on_click(handle_submit) + + display(t) + display(widgets.VBox([b, out])) + From b067c789a76ae7553f84eeaccdd336f5c492f203 Mon Sep 17 00:00:00 2001 From: Jonas Weinz Date: Wed, 20 Jun 2018 18:10:54 +0200 Subject: [PATCH 9/9] merged kmeans approach --- .../simple_twitter_learning.ipynb | 232 ++++++++++++------ .../simple_twitter_learning.py | 89 +++++-- 2 files changed, 225 insertions(+), 96 deletions(-) diff --git a/Project/simple_approach/simple_twitter_learning.ipynb b/Project/simple_approach/simple_twitter_learning.ipynb index c2e623e..277e2b8 100644 --- a/Project/simple_approach/simple_twitter_learning.ipynb +++ b/Project/simple_approach/simple_twitter_learning.ipynb @@ -51,7 +51,8 @@ "import sklearn.utils as sku\n", "from sklearn.feature_extraction.text import CountVectorizer, TfidfVectorizer, HashingVectorizer\n", "from sklearn.model_selection import train_test_split\n", - "from sklearn.preprocessing import MultiLabelBinarizer\n", + "from sklearn.preprocessing import MultiLabelBinarizer, LabelBinarizer\n", + "from sklearn.cluster import KMeans\n", "import nltk\n", "from keras.models import load_model\n", "from sklearn.externals import joblib\n", @@ -72,14 +73,13 @@ "import sys\n", "sys.path.append(\"..\")\n", "\n", - "from Tools.Emoji_Distance import sentiment_vector_to_emoji\n", - "from Tools.Emoji_Distance import emoji_to_sentiment_vector\n", + "import Tools.Emoji_Distance as edist\n", "\n", "def emoji2sent(emoji_arr, only_emoticons=True):\n", - " return np.array([emoji_to_sentiment_vector(e, only_emoticons=only_emoticons) for e in emoji_arr])\n", + " return np.array([edist.emoji_to_sentiment_vector(e, only_emoticons=only_emoticons) for e in emoji_arr])\n", "\n", "def sent2emoji(sent_arr, custom_target_emojis=None, only_emoticons=True):\n", - " return [sentiment_vector_to_emoji(s, custom_target_emojis=custom_target_emojis, only_emoticons=only_emoticons) for s in sent_arr]" + " return [edist.sentiment_vector_to_emoji(s, custom_target_emojis=custom_target_emojis, only_emoticons=only_emoticons) for s in sent_arr]" ] }, { @@ -200,7 +200,7 @@ "source": [ "class sample_data_manager(object):\n", " @staticmethod\n", - " def generate_and_read(path:str, only_emoticons=True, apply_stemming=True, n_top_emojis=-1, file_range=None):\n", + " def generate_and_read(path:str, only_emoticons=True, apply_stemming=True, n_top_emojis=-1, file_range=None, n_kmeans_cluster=-1):\n", " \"\"\"\n", " generate, read and process train data in one step.\n", " \n", @@ -209,6 +209,8 @@ " @param apply_stemming: apply stemming and lemmatization on dataset\n", " @param n_top_emojis: only use messages containing one of <`n_top_emojis`>-top emojis. set to `-1` to prevent top emoji filtering\n", " @param file_range: range of file's indices to read (eg `range(3)` to read the first three files). If `None`: all files are read\n", + " @param n_kmeans_cluster: generating multilabeled labels with kmeans with these number of clusters. Set to -1 to use the plain sentiment space as label\n", + " \n", " @return: sample_data_manager object\n", " \"\"\"\n", " sdm = sample_data_manager(path)\n", @@ -221,6 +223,9 @@ " if n_top_emojis > 0:\n", " sdm.filter_by_top_emojis(n_top=n_top_emojis)\n", " \n", + " if n_kmeans_cluster > 0:\n", + " sdm.generate_kmeans_binary_label(only_emoticons=only_emoticons, n_clusters=n_kmeans_cluster)\n", + " \n", " return sdm\n", " \n", " \n", @@ -244,6 +249,10 @@ " self.Xt = None\n", " self.yt = None\n", " self.top_emojis = None\n", + " self.binary_labels = None\n", + " self.use_binary_labels = False\n", + " self.kmeans_cluster = None\n", + " self.label_binarizer = None\n", " \n", " def read_files(self, file_index_range:list, only_emoticons=True):\n", " \"\"\"\n", @@ -348,16 +357,46 @@ " assert self.labels is not None # ← messages are already read in\n", " \n", " self.top_emojis = [x[0] for x in self.get_emoji_count()[:n_top]]\n", - " in_top = [sentiment_vector_to_emoji(x) in self.top_emojis for x in self.labels]\n", + " in_top = [edist.sentiment_vector_to_emoji(x) in self.top_emojis for x in self.labels]\n", " self.labels = self.labels[in_top]\n", " self.plain_text = self.plain_text[in_top]\n", " self.emojis = self.emojis[in_top]\n", " print(\"remaining samples after top emoji filtering: \", len(self.labels))\n", " \n", + " def generate_kmeans_binary_label(self, only_emoticons=True, n_clusters=5):\n", + " \"\"\"\n", + " generate binary labels using kmeans.\n", + " \n", + " @param only_emoticons: set whether we're using the full emoji set or only emoticons\n", + " @param n_clusters: number of cluster we're generating in emoji's sentiment space\n", + " \"\"\"\n", + " assert self.labels is not None\n", + " array_sentiment_vectors = edist.list_sentiment_emoticon_vectors if only_emoticons else edist.list_sentiment_vectors\n", + " array_sentiment_vectors = np.array(array_sentiment_vectors)\n", + " \n", + " list_emojis = edist.list_emoticon_emojis if only_emoticons else edist.list_emojis\n", + " self.use_binary_labels = True\n", + " print(\"clustering following emojis: \" + \"\".join(list_emojis) + \"...\")\n", + " self.kmeans_cluster = KMeans(n_clusters=n_clusters).fit(array_sentiment_vectors)\n", + " print(\"clustering done\")\n", + " self.label_binarizer = LabelBinarizer()\n", + " \n", + " multiclass_labels = self.kmeans_cluster.predict(self.labels)\n", + " \n", + " # FIXME: we have to guarantee that in every dataset all classes occur.\n", + " # otherwise batch fitting is not possible!\n", + " # (or we have to precompute the mlb fitting process somewhere...)\n", + " self.binary_labels = self.label_binarizer.fit_transform(multiclass_labels)\n", + " \n", + " \n", " def create_train_test_split(self, split = 0.1, random_state = 4222):\n", + " assert self.plain_text is not None and self.labels is not None\n", " if self.X is not None:\n", " sys.stderr.write(\"WARNING: overwriting existing train/test split \\n\")\n", - " self.X, self.Xt, self.y, self.yt = train_test_split(self.plain_text, self.labels, test_size=split, random_state=random_state)\n", + " \n", + " labels = self.binary_labels if self.use_binary_labels else self.labels\n", + " assert labels is not None\n", + " self.X, self.Xt, self.y, self.yt = train_test_split(self.plain_text, labels, test_size=split, random_state=random_state)\n", "\n" ] }, @@ -392,13 +431,15 @@ " return pm\n", " \n", " @staticmethod\n", - " def create_keras_pipeline_with_vectorizer(vectorizer, layers, sdm:sample_data_manager):\n", + " def create_keras_pipeline_with_vectorizer(vectorizer, layers, sdm:sample_data_manager, loss=None, optimizer=None):\n", " '''\n", " creates pipeline with vectorizer and keras classifier\n", " \n", " @param vectorizer: Vectorizer object. will be fitted with data provided by sdm\n", " @param layers: list of keras layers. One keras layer is a tuple in form: (<#neurons:int>, )\n", " @param sdm: sample data manager to get data for the vectorizer\n", + " @param loss: set keras loss function. Depending whether sdm use multiclass labels `categorical_crossentropy` or `mean_squared_error` is used as default\n", + " @param optimizer: set keras optimizer. Depending whether sdm use multiclass labels `sgd` or `adam` is used as default\n", " \n", " @return: a pipeline manager object\n", " \n", @@ -423,8 +464,17 @@ " else:\n", " model.add(Dense(units=layer[0], activation=layer[1]))\n", " \n", - " model.compile(loss='mean_squared_error',\n", - " optimizer='adam')\n", + " if sdm.use_binary_labels: \n", + " loss_function = loss if loss is not None else 'categorical_crossentropy'\n", + " optimizer_function = optimizer if optimizer is not None else 'sgd'\n", + " model.compile(loss=loss_function,\n", + " optimizer=optimizer_function,\n", + " metrics=['accuracy'])\n", + " else:\n", + " loss_function = loss if loss is not None else 'mean_squared_error'\n", + " optimizer_function = optimizer if optimizer is not None else 'adam'\n", + " model.compile(loss=loss_function,\n", + " optimizer=optimizer_function)\n", " \n", " pipeline = Pipeline([\n", " ('vectorizer',vectorizer),\n", @@ -613,7 +663,7 @@ "imported 33368 samples\n", "remaining samples after top emoji filtering: 26197\n", "Epoch 1/1\n", - "100/100 [==============================] - 3s 27ms/step - loss: 0.1227\n" + "100/100 [==============================] - 3s 28ms/step - loss: 0.1230\n" ] } ], @@ -622,11 +672,18 @@ "if not hasattr(main, '__file__'):\n", " # we are in an interactive environment (probably in jupyter)\n", " # load data:\n", - " sdm = sample_data_manager.generate_and_read(path=\"./data_en/\", n_top_emojis=20, file_range=range(1))\n", + " \n", + " # setting n_kmeans_clusters to a value > 0 activates binarized labeling automatically! \n", + " # set to -1 to disable kmeans clustering and generating labels in plain sentiment space\n", + " \n", + " #n_kmeans_cluster = 5\n", + " n_kmeans_cluster = -1\n", + " sdm = sample_data_manager.generate_and_read(path=\"./data_en/\", n_top_emojis=20, file_range=range(1), n_kmeans_cluster=n_kmeans_cluster)\n", + " sdm.create_train_test_split()\n", " #pm = pipeline_manager.create_keras_pipeline_with_vectorizer(vectorizer=TfidfVectorizer(stop_words='english'),\\n\",\n", " # layers=[(10000, 'relu'),(5000, 'relu'),(2500, 'relu'),(y1[0].shape[0],None)], sdm=sdm)\\n\",\n", " pm = pipeline_manager.create_keras_pipeline_with_vectorizer(vectorizer=TfidfVectorizer(stop_words='english'),\n", - " layers=[(2500, 'relu'),(3,None)], sdm=sdm)\n", + " layers=[(2500, 'relu'),(sdm.y.shape[1],None)], sdm=sdm)\n", " tr = trainer(sdm=sdm, pm=pm)\n", " tr.fit(100)" ] @@ -641,7 +698,7 @@ }, { "cell_type": "code", - "execution_count": 13, + "execution_count": 11, "metadata": {}, "outputs": [ { @@ -651,14 +708,6 @@ "['keras_model']\n" ] }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "/home/jonas/.local/lib/python3.6/site-packages/keras/engine/sequential.py:109: UserWarning: `Sequential.model` is deprecated. `Sequential` is a subclass of `Model`, you can just use your `Sequential` instance directly.\n", - " warnings.warn('`Sequential.model` is deprecated. '\n" - ] - }, { "data": { "text/plain": [ @@ -701,19 +750,19 @@ }, { "cell_type": "code", - "execution_count": 14, + "execution_count": 12, "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "array([[0.4423941 , 0.22976081, 0.26076168],\n", - " [0.75167173, 0.2919423 , 0.3423372 ],\n", - " [0.48943695, 0.21931192, 0.22773138],\n", + "array([[0.16062996, 0.08324276, 0.09433182],\n", + " [0.16413 , 0.09421383, 0.07578427],\n", + " [0.11994962, 0.05705731, 0.06310127],\n", " ...,\n", - " [0.51003224, 0.26002786, 0.25588542],\n", - " [0.5808168 , 0.30632192, 0.2964917 ],\n", - " [0.39000767, 0.31723523, 0.24713083]], dtype=float32)" + " [0.13887292, 0.08502828, 0.08176519],\n", + " [0.18185864, 0.09223703, 0.10704609],\n", + " [0.17687687, 0.09147045, 0.10650696]], dtype=float32)" ] }, "metadata": {}, @@ -738,7 +787,7 @@ "name": "stdout", "output_type": "stream", "text": [ - "prediction variance: 0.009700283\n", + "prediction variance: 0.0005431187\n", "teacher variance: 0.03341702104519965\n" ] }, @@ -763,79 +812,79 @@ " \n", " \n", " \n", - " text\n", - " teacher\n", - " teacher_sentiment\n", " predict\n", " predicted_sentiment\n", + " teacher\n", + " teacher_sentiment\n", + " text\n", " \n", " \n", " \n", " \n", " 35671\n", - " i feel like i care so much more in everi situat\n", + " πŸ˜‚\n", + " [0.16062995791435242, 0.0832427591085434, 0.09...\n", " πŸ˜‚\n", " [0.46813021474490496, 0.24716181096977158, 0.2...\n", - " πŸ˜‚\n", - " [0.44239410758018494, 0.2297608107328415, 0.26...\n", + " i feel like i care so much more in everi situat\n", " \n", " \n", " 25683\n", - " i did not meat to add that 2 there ... hav see...\n", + " 😒\n", + " [0.16413000226020813, 0.0942138284444809, 0.07...\n", " πŸ˜‚\n", " [0.46813021474490496, 0.24716181096977158, 0.2...\n", - " 😌\n", - " [0.7516717314720154, 0.291942298412323, 0.3423...\n", + " i did not meat to add that 2 there ... hav see...\n", " \n", " \n", " 8985\n", - " never…\n", + " πŸ˜‚\n", + " [0.11994962394237518, 0.05705730617046356, 0.0...\n", " 😊\n", " [0.7040175768989329, 0.059322033898305086, 0.2...\n", - " πŸ˜‚\n", - " [0.48943695425987244, 0.21931192278862, 0.2277...\n", + " never…\n", " \n", " \n", " 5410\n", - " lmao on me ! ! ! wtf wa he suppos to say\n", + " πŸ˜‚\n", + " [0.18114930391311646, 0.10199417173862457, 0.1...\n", " πŸ˜‚\n", " [0.46813021474490496, 0.24716181096977158, 0.2...\n", - " 😒\n", - " [0.3661550283432007, 0.32579296827316284, 0.23...\n", + " lmao on me ! ! ! wtf wa he suppos to say\n", " \n", " \n", " 62611\n", - " this dude alway help me get through my school ...\n", + " πŸ˜‚\n", + " [0.16997836530208588, 0.08633847534656525, 0.0...\n", " 😊\n", " [0.7040175768989329, 0.059322033898305086, 0.2...\n", - " πŸ˜‚\n", - " [0.48689204454421997, 0.20729433000087738, 0.2...\n", + " this dude alway help me get through my school ...\n", " \n", " \n", "\n", "" ], "text/plain": [ - " text teacher \\\n", - "35671 i feel like i care so much more in everi situat πŸ˜‚ \n", - "25683 i did not meat to add that 2 there ... hav see... πŸ˜‚ \n", - "8985 never… 😊 \n", - "5410 lmao on me ! ! ! wtf wa he suppos to say πŸ˜‚ \n", - "62611 this dude alway help me get through my school ... 😊 \n", + " predict predicted_sentiment teacher \\\n", + "35671 πŸ˜‚ [0.16062995791435242, 0.0832427591085434, 0.09... πŸ˜‚ \n", + "25683 😒 [0.16413000226020813, 0.0942138284444809, 0.07... πŸ˜‚ \n", + "8985 πŸ˜‚ [0.11994962394237518, 0.05705730617046356, 0.0... 😊 \n", + "5410 πŸ˜‚ [0.18114930391311646, 0.10199417173862457, 0.1... πŸ˜‚ \n", + "62611 πŸ˜‚ [0.16997836530208588, 0.08633847534656525, 0.0... 😊 \n", "\n", - " teacher_sentiment predict \\\n", - "35671 [0.46813021474490496, 0.24716181096977158, 0.2... πŸ˜‚ \n", - "25683 [0.46813021474490496, 0.24716181096977158, 0.2... 😌 \n", - "8985 [0.7040175768989329, 0.059322033898305086, 0.2... πŸ˜‚ \n", - "5410 [0.46813021474490496, 0.24716181096977158, 0.2... 😒 \n", - "62611 [0.7040175768989329, 0.059322033898305086, 0.2... πŸ˜‚ \n", + " teacher_sentiment \\\n", + "35671 [0.46813021474490496, 0.24716181096977158, 0.2... \n", + "25683 [0.46813021474490496, 0.24716181096977158, 0.2... \n", + "8985 [0.7040175768989329, 0.059322033898305086, 0.2... \n", + "5410 [0.46813021474490496, 0.24716181096977158, 0.2... \n", + "62611 [0.7040175768989329, 0.059322033898305086, 0.2... \n", "\n", - " predicted_sentiment \n", - "35671 [0.44239410758018494, 0.2297608107328415, 0.26... \n", - "25683 [0.7516717314720154, 0.291942298412323, 0.3423... \n", - "8985 [0.48943695425987244, 0.21931192278862, 0.2277... \n", - "5410 [0.3661550283432007, 0.32579296827316284, 0.23... \n", - "62611 [0.48689204454421997, 0.20729433000087738, 0.2... " + " text \n", + "35671 i feel like i care so much more in everi situat \n", + "25683 i did not meat to add that 2 there ... hav see... \n", + "8985 never… \n", + "5410 lmao on me ! ! ! wtf wa he suppos to say \n", + "62611 this dude alway help me get through my school ... " ] }, "metadata": {}, @@ -845,9 +894,9 @@ "name": "stdout", "output_type": "stream", "text": [ - "Mean Squared Error: [0.02340565 0.02344435 0.00374819]\n", + "Mean Squared Error: [0.13877691 0.04682433 0.02937794]\n", "Variance teacher: [0.02183094 0.02513847 0.00285735]\n", - "Variance prediction: [0.0083875 0.00473354 0.00115709]\n" + "Variance prediction: [0.00046378 0.00019441 0.00020516]\n" ] } ], @@ -896,16 +945,31 @@ }, { "cell_type": "code", - "execution_count": 15, + "execution_count": 13, "metadata": {}, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { - "model_id": "2ca4e06fcd4f41c2bfd161f9f16ca594", + "model_id": "003ae16760b04c25bdc9f2fe2193747a", "version_major": 2, "version_minor": 0 }, + "text/html": [ + "

Failed to display Jupyter Widget of type Text.

\n", + "
\n", + "

\n", + " If you're reading this message in another frontend (for example, a static\n", + " rendering on GitHub or NBViewer),\n", + " it may mean that your frontend doesn't currently support widgets.\n", + "

\n" + ], "text/plain": [ "Text(value='')" ] @@ -916,12 +980,27 @@ { "data": { "application/vnd.jupyter.widget-view+json": { - "model_id": "a39abb79d70e4ae1952b2d928cfab174", + "model_id": "4580af82b30545f197a41e4359010556", "version_major": 2, "version_minor": 0 }, + "text/html": [ + "

Failed to display Jupyter Widget of type VBox.

\n", + "

\n", + " If you're reading this message in the Jupyter Notebook or JupyterLab Notebook, it may mean\n", + " that the widgets JavaScript is still loading. If this message persists, it\n", + " likely means that the widgets JavaScript library is either not installed or\n", + " not enabled. See the Jupyter\n", + " Widgets Documentation for setup instructions.\n", + "

\n", + "

\n", + " If you're reading this message in another frontend (for example, a static\n", + " rendering on GitHub or NBViewer),\n", + " it may mean that your frontend doesn't currently support widgets.\n", + "

\n" + ], "text/plain": [ - "VBox(children=(Button(description='get emoji', icon='check', style=ButtonStyle(), tooltip='Click me'), Output(…" + "VBox(children=(Button(description='get emoji', icon='check', style=ButtonStyle(), tooltip='Click me'), Output()))" ] }, "metadata": {}, @@ -987,13 +1066,6 @@ " display(t)\n", " display(widgets.VBox([b, out])) " ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] } ], "metadata": { diff --git a/Project/simple_approach/simple_twitter_learning.py b/Project/simple_approach/simple_twitter_learning.py index 0f0b944..efd8ac1 100644 --- a/Project/simple_approach/simple_twitter_learning.py +++ b/Project/simple_approach/simple_twitter_learning.py @@ -15,7 +15,8 @@ import itertools import sklearn.utils as sku from sklearn.feature_extraction.text import CountVectorizer, TfidfVectorizer, HashingVectorizer from sklearn.model_selection import train_test_split -from sklearn.preprocessing import MultiLabelBinarizer +from sklearn.preprocessing import MultiLabelBinarizer, LabelBinarizer +from sklearn.cluster import KMeans import nltk from keras.models import load_model from sklearn.externals import joblib @@ -33,14 +34,13 @@ nltk.download('wordnet') import sys sys.path.append("..") -from Tools.Emoji_Distance import sentiment_vector_to_emoji -from Tools.Emoji_Distance import emoji_to_sentiment_vector +import Tools.Emoji_Distance as edist def emoji2sent(emoji_arr, only_emoticons=True): - return np.array([emoji_to_sentiment_vector(e, only_emoticons=only_emoticons) for e in emoji_arr]) + return np.array([edist.emoji_to_sentiment_vector(e, only_emoticons=only_emoticons) for e in emoji_arr]) def sent2emoji(sent_arr, custom_target_emojis=None, only_emoticons=True): - return [sentiment_vector_to_emoji(s, custom_target_emojis=custom_target_emojis, only_emoticons=only_emoticons) for s in sent_arr] + return [edist.sentiment_vector_to_emoji(s, custom_target_emojis=custom_target_emojis, only_emoticons=only_emoticons) for s in sent_arr] # In[3]: @@ -122,7 +122,7 @@ def get_wordnet_pos(treebank_tag): class sample_data_manager(object): @staticmethod - def generate_and_read(path:str, only_emoticons=True, apply_stemming=True, n_top_emojis=-1, file_range=None): + def generate_and_read(path:str, only_emoticons=True, apply_stemming=True, n_top_emojis=-1, file_range=None, n_kmeans_cluster=-1): """ generate, read and process train data in one step. @@ -131,6 +131,8 @@ class sample_data_manager(object): @param apply_stemming: apply stemming and lemmatization on dataset @param n_top_emojis: only use messages containing one of <`n_top_emojis`>-top emojis. set to `-1` to prevent top emoji filtering @param file_range: range of file's indices to read (eg `range(3)` to read the first three files). If `None`: all files are read + @param n_kmeans_cluster: generating multilabeled labels with kmeans with these number of clusters. Set to -1 to use the plain sentiment space as label + @return: sample_data_manager object """ sdm = sample_data_manager(path) @@ -143,6 +145,9 @@ class sample_data_manager(object): if n_top_emojis > 0: sdm.filter_by_top_emojis(n_top=n_top_emojis) + if n_kmeans_cluster > 0: + sdm.generate_kmeans_binary_label(only_emoticons=only_emoticons, n_clusters=n_kmeans_cluster) + return sdm @@ -166,6 +171,10 @@ class sample_data_manager(object): self.Xt = None self.yt = None self.top_emojis = None + self.binary_labels = None + self.use_binary_labels = False + self.kmeans_cluster = None + self.label_binarizer = None def read_files(self, file_index_range:list, only_emoticons=True): """ @@ -270,16 +279,46 @@ class sample_data_manager(object): assert self.labels is not None # ← messages are already read in self.top_emojis = [x[0] for x in self.get_emoji_count()[:n_top]] - in_top = [sentiment_vector_to_emoji(x) in self.top_emojis for x in self.labels] + in_top = [edist.sentiment_vector_to_emoji(x) in self.top_emojis for x in self.labels] self.labels = self.labels[in_top] self.plain_text = self.plain_text[in_top] self.emojis = self.emojis[in_top] print("remaining samples after top emoji filtering: ", len(self.labels)) + def generate_kmeans_binary_label(self, only_emoticons=True, n_clusters=5): + """ + generate binary labels using kmeans. + + @param only_emoticons: set whether we're using the full emoji set or only emoticons + @param n_clusters: number of cluster we're generating in emoji's sentiment space + """ + assert self.labels is not None + array_sentiment_vectors = edist.list_sentiment_emoticon_vectors if only_emoticons else edist.list_sentiment_vectors + array_sentiment_vectors = np.array(array_sentiment_vectors) + + list_emojis = edist.list_emoticon_emojis if only_emoticons else edist.list_emojis + self.use_binary_labels = True + print("clustering following emojis: " + "".join(list_emojis) + "...") + self.kmeans_cluster = KMeans(n_clusters=n_clusters).fit(array_sentiment_vectors) + print("clustering done") + self.label_binarizer = LabelBinarizer() + + multiclass_labels = self.kmeans_cluster.predict(self.labels) + + # FIXME: we have to guarantee that in every dataset all classes occur. + # otherwise batch fitting is not possible! + # (or we have to precompute the mlb fitting process somewhere...) + self.binary_labels = self.label_binarizer.fit_transform(multiclass_labels) + + def create_train_test_split(self, split = 0.1, random_state = 4222): + assert self.plain_text is not None and self.labels is not None if self.X is not None: sys.stderr.write("WARNING: overwriting existing train/test split \n") - self.X, self.Xt, self.y, self.yt = train_test_split(self.plain_text, self.labels, test_size=split, random_state=random_state) + + labels = self.binary_labels if self.use_binary_labels else self.labels + assert labels is not None + self.X, self.Xt, self.y, self.yt = train_test_split(self.plain_text, labels, test_size=split, random_state=random_state) @@ -306,13 +345,15 @@ class pipeline_manager(object): return pm @staticmethod - def create_keras_pipeline_with_vectorizer(vectorizer, layers, sdm:sample_data_manager): + def create_keras_pipeline_with_vectorizer(vectorizer, layers, sdm:sample_data_manager, loss=None, optimizer=None): ''' creates pipeline with vectorizer and keras classifier @param vectorizer: Vectorizer object. will be fitted with data provided by sdm @param layers: list of keras layers. One keras layer is a tuple in form: (<#neurons:int>, ) @param sdm: sample data manager to get data for the vectorizer + @param loss: set keras loss function. Depending whether sdm use multiclass labels `categorical_crossentropy` or `mean_squared_error` is used as default + @param optimizer: set keras optimizer. Depending whether sdm use multiclass labels `sgd` or `adam` is used as default @return: a pipeline manager object @@ -337,8 +378,17 @@ class pipeline_manager(object): else: model.add(Dense(units=layer[0], activation=layer[1])) - model.compile(loss='mean_squared_error', - optimizer='adam') + if sdm.use_binary_labels: + loss_function = loss if loss is not None else 'categorical_crossentropy' + optimizer_function = optimizer if optimizer is not None else 'sgd' + model.compile(loss=loss_function, + optimizer=optimizer_function, + metrics=['accuracy']) + else: + loss_function = loss if loss is not None else 'mean_squared_error' + optimizer_function = optimizer if optimizer is not None else 'adam' + model.compile(loss=loss_function, + optimizer=optimizer_function) pipeline = Pipeline([ ('vectorizer',vectorizer), @@ -503,11 +553,18 @@ import __main__ as main if not hasattr(main, '__file__'): # we are in an interactive environment (probably in jupyter) # load data: - sdm = sample_data_manager.generate_and_read(path="./data_en/", n_top_emojis=20, file_range=range(1)) + + # setting n_kmeans_clusters to a value > 0 activates binarized labeling automatically! + # set to -1 to disable kmeans clustering and generating labels in plain sentiment space + + #n_kmeans_cluster = 5 + n_kmeans_cluster = -1 + sdm = sample_data_manager.generate_and_read(path="./data_en/", n_top_emojis=20, file_range=range(1), n_kmeans_cluster=n_kmeans_cluster) + sdm.create_train_test_split() #pm = pipeline_manager.create_keras_pipeline_with_vectorizer(vectorizer=TfidfVectorizer(stop_words='english'),\n", # layers=[(10000, 'relu'),(5000, 'relu'),(2500, 'relu'),(y1[0].shape[0],None)], sdm=sdm)\n", pm = pipeline_manager.create_keras_pipeline_with_vectorizer(vectorizer=TfidfVectorizer(stop_words='english'), - layers=[(2500, 'relu'),(3,None)], sdm=sdm) + layers=[(2500, 'relu'),(sdm.y.shape[1],None)], sdm=sdm) tr = trainer(sdm=sdm, pm=pm) tr.fit(100) @@ -515,7 +572,7 @@ if not hasattr(main, '__file__'): # ---- # ## save classifier -# In[13]: +# In[11]: import __main__ as main @@ -528,7 +585,7 @@ if not hasattr(main, '__file__'): # # * predict and save to `test.csv` -# In[14]: +# In[12]: import __main__ as main @@ -568,7 +625,7 @@ if not hasattr(main, '__file__'): # # * loading classifier and show a test widget -# In[15]: +# In[13]: import __main__ as main

\n", + " If you're reading this message in the Jupyter Notebook or JupyterLab Notebook, it may mean\n", + " that the widgets JavaScript is still loading. If this message persists, it\n", + " likely means that the widgets JavaScript library is either not installed or\n", + " not enabled. See the Jupyter\n", + " Widgets Documentation for setup instructions.\n", + "