diff --git a/Multi-Class Text Classification LSTM Consumer complaints.ipynb b/Multi-Class Text Classification LSTM Consumer complaints.ipynb new file mode 100644 index 0000000..a8d6f07 --- /dev/null +++ b/Multi-Class Text Classification LSTM Consumer complaints.ipynb @@ -0,0 +1,770 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Using TensorFlow backend.\n" + ] + }, + { + "data": { + "text/html": [ + "" + ], + "text/vnd.plotly.v1+html": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "import numpy as np \n", + "import pandas as pd\n", + "import matplotlib.pyplot as plt\n", + "import seaborn as sns\n", + "from keras.preprocessing.text import Tokenizer\n", + "from keras.preprocessing.sequence import pad_sequences\n", + "from keras.models import Sequential\n", + "from keras.layers import Dense, Embedding, LSTM, SpatialDropout1D\n", + "from sklearn.model_selection import train_test_split\n", + "from keras.utils.np_utils import to_categorical\n", + "from keras.callbacks import EarlyStopping\n", + "from keras.layers import Dropout\n", + "import re\n", + "from nltk.corpus import stopwords\n", + "from nltk import word_tokenize\n", + "STOPWORDS = set(stopwords.words('english'))\n", + "from bs4 import BeautifulSoup\n", + "import plotly.graph_objs as go\n", + "import plotly.plotly as py\n", + "import cufflinks\n", + "from IPython.core.interactiveshell import InteractiveShell\n", + "import plotly.figure_factory as ff\n", + "InteractiveShell.ast_node_interactivity = 'all'\n", + "from plotly.offline import iplot\n", + "cufflinks.go_offline()\n", + "cufflinks.set_config_file(world_readable=True, theme='pearl')" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [], + "source": [ + "df = pd.read_csv('consumer_complaints_small.csv')" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": { + "scrolled": true + }, + "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", + "
ProductConsumer complaint narrative
0Credit reporting, credit repair services, or o...Ive tried several times contacting all 3 credi...
1Credit reporting, credit repair services, or o...Recently XXXX Credit Reporting Agency and/or i...
2Credit reporting, credit repair services, or o...Recently, I, XXXX XXXX XXXX was contacted by X...
3Debt collectionA company called Perfection Collection just re...
4Credit reporting, credit repair services, or o...XXXX XXXX - XX/XX/18 {$1200.00} XXXX XXXX-XX/X...
\n", + "
" + ], + "text/plain": [ + " Product \\\n", + "0 Credit reporting, credit repair services, or o... \n", + "1 Credit reporting, credit repair services, or o... \n", + "2 Credit reporting, credit repair services, or o... \n", + "3 Debt collection \n", + "4 Credit reporting, credit repair services, or o... \n", + "\n", + " Consumer complaint narrative \n", + "0 Ive tried several times contacting all 3 credi... \n", + "1 Recently XXXX Credit Reporting Agency and/or i... \n", + "2 Recently, I, XXXX XXXX XXXX was contacted by X... \n", + "3 A company called Perfection Collection just re... \n", + "4 XXXX XXXX - XX/XX/18 {$1200.00} XXXX XXXX-XX/X... " + ] + }, + "execution_count": 3, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df.head()" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "RangeIndex: 361866 entries, 0 to 361865\n", + "Data columns (total 2 columns):\n", + "Product 361866 non-null object\n", + "Consumer complaint narrative 361866 non-null object\n", + "dtypes: object(2)\n", + "memory usage: 5.5+ MB\n" + ] + } + ], + "source": [ + "df.info()" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "Credit reporting, credit repair services, or other personal consumer reports 83754\n", + "Debt collection 81948\n", + "Mortgage 51125\n", + "Credit reporting 31588\n", + "Student loan 20516\n", + "Credit card or prepaid card 19180\n", + "Credit card 18838\n", + "Bank account or service 14885\n", + "Checking or savings account 11522\n", + "Consumer Loan 9474\n", + "Vehicle loan or lease 5134\n", + "Money transfer, virtual currency, or money service 4977\n", + "Payday loan, title loan, or personal loan 3923\n", + "Payday loan 1747\n", + "Money transfers 1497\n", + "Prepaid card 1450\n", + "Other financial service 292\n", + "Virtual currency 16\n", + "Name: Product, dtype: int64" + ] + }, + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df.Product.value_counts()" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [], + "source": [ + "df.loc[df['Product'] == 'Credit reporting', 'Product'] = 'Credit reporting, credit repair services, or other personal consumer reports'\n", + "df.loc[df['Product'] == 'Credit card', 'Product'] = 'Credit card or prepaid card'\n", + "df.loc[df['Product'] == 'Payday loan', 'Product'] = 'Payday loan, title loan, or personal loan'\n", + "df.loc[df['Product'] == 'Virtual currency', 'Product'] = 'Money transfer, virtual currency, or money service'\n", + "df = df[df.Product != 'Other financial service']" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [ + { + "data": { + "application/vnd.plotly.v1+json": { + "config": { + "linkText": "Export to plot.ly", + "plotlyServerURL": "https://plot.ly", + "showLink": true + }, + "data": [ + { + "marker": { + "color": "rgba(255, 153, 51, 0.6)", + "line": { + "color": "rgba(255, 153, 51, 1.0)", + "width": 1 + } + }, + "name": "Product", + "orientation": "v", + "text": "", + "type": "bar", + "uid": "b5d5ede9-b467-4fe4-88fc-0fc55c8f9d20", + "x": [ + "Credit reporting, credit repair services, or other personal consumer reports", + "Debt collection", + "Mortgage", + "Credit card or prepaid card", + "Student loan", + "Bank account or service", + "Checking or savings account", + "Consumer Loan", + "Payday loan, title loan, or personal loan", + "Vehicle loan or lease", + "Money transfer, virtual currency, or money service", + "Money transfers", + "Prepaid card" + ], + "y": [ + 115342, + 81948, + 51125, + 38018, + 20516, + 14885, + 11522, + 9474, + 5670, + 5134, + 4993, + 1497, + 1450 + ] + } + ], + "layout": { + "legend": { + "bgcolor": "#F5F6F9", + "font": { + "color": "#4D5663" + } + }, + "paper_bgcolor": "#F5F6F9", + "plot_bgcolor": "#F5F6F9", + "title": { + "font": { + "color": "#4D5663" + }, + "text": "Number complaints in each product" + }, + "xaxis": { + "gridcolor": "#E1E5ED", + "showgrid": true, + "tickfont": { + "color": "#4D5663" + }, + "title": { + "font": { + "color": "#4D5663" + }, + "text": "" + }, + "zerolinecolor": "#E1E5ED" + }, + "yaxis": { + "gridcolor": "#E1E5ED", + "showgrid": true, + "tickfont": { + "color": "#4D5663" + }, + "title": { + "font": { + "color": "#4D5663" + }, + "text": "Number of Complaints" + }, + "zerolinecolor": "#E1E5ED" + } + } + }, + "text/html": [ + "
" + ], + "text/vnd.plotly.v1+html": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "df['Product'].value_counts().sort_values(ascending=False).iplot(kind='bar', yTitle='Number of Complaints', \n", + " title='Number complaints in each product')" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [], + "source": [ + "def print_plot(index):\n", + " example = df[df.index == index][['Consumer complaint narrative', 'Product']].values[0]\n", + " if len(example) > 0:\n", + " print(example[0])\n", + " print('Product:', example[1])" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "why are these account reported twice on my credit report? I asked for an explanation to the credit bureaus but until now, I got no response from them.. Furthermore, the account was never paid late. I am faithfully paying my account with this creditor, no late payments. Fix this error please since Experian and XXXX couldn't help me XXXX XXXX XXXX, XXXX XXXX XXXX XXXX XXXX, XXXX XXXX XXXX XXXX XXXX\n", + "Product: Credit reporting, credit repair services, or other personal consumer reports\n" + ] + } + ], + "source": [ + "print_plot(10)" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "RE : PREDATORY LENDING COMPLAINT To Whom It May Concern : I am writing to file a complaint against ECMC because of their predatory lending practices. I mailed out two certified letters, the first letter was a debt validation letter via cert number : XXXX XXXX XXXX XXXX XXXX and the second letter titled Notice of Estoppel via cert number : XXXX XXXX XXXX XXXX XXXX. ( Please see attachments A & B ). I started my credit restoration with a Certified Credit Counselor in XX/XX/2018, come to find out that I have a total of 6 collection agencies trying to collect on the same school loan from XXXX XXXX. Out of ignorance, I was forced to make payments to one agency titled XXXX XXXX that collected from my weekly paycheck. This withdraw from my paycheck has caused me a real hardship, having no choice to make payments or I couldnt stay employed. I too mailed out a debt validation letter via mail cert : XXXX XXXX XXXX XXXX XXXX to XXXX XXXX and the second letter titled Notice of Estoppel via cert # XXXX XXXX XXXX XXXX XXXX ; they finally stopped collecting after my second letter of almost 5 months of paid payments collecting {$1100.00} ( See Attachment C and D ). I went through the proper channels by asking Human Resources to provide me the Order for payments. You will see that ECMC is mentioned within the order from XXXX XXXX, ( See Attachment E ). It clearly states that XXXX XXXX is the assistant company to collect on the debt for ECMC with a new loan number. ECMC created TWO loan numbers, trying to collect on two payments on ONE loan owed to XXXX XXXX. It was never announced to me that ECMC and XXXX XXXX are working as a brother company collecting on the same debt ; separately. XXXX XXXX is announced as a referred company assisting ECMC to collect debt. ECMC is now announcing the same attempt to collect payments dated XX/XX/XXXX from my paycheck ; without answering any of my questions or concerns from my letter ( s ) ( See Attachment F ). Since ECMC can not produce any information or material to validate that I rightfully owe them the debt, responding back with frivolous letters ( See Attachment G ). They are now maliciously going after my income yet AGAIN but this time under ECMC directly, not mentioning that their referred company XXXX XXXX collected any payments in the past 5 months. Lastly, I mailed copies of all my communication with the creditors ( ECMC and XXXX XXXX to all three credit bureaus. \r\n", + "\r\n", + "I am requesting that you investigate this company and take any appropriate regulatory action, including any necessary referrals to state agencies. It is important that we put an end to these types of deceptive and unethical business practices.\n", + "Product: Student loan\n" + ] + } + ], + "source": [ + "print_plot(100)" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [], + "source": [ + "df = df.reset_index(drop=True)\n", + "REPLACE_BY_SPACE_RE = re.compile('[/(){}\\[\\]\\|@,;]')\n", + "BAD_SYMBOLS_RE = re.compile('[^0-9a-z #+_]')\n", + "STOPWORDS = set(stopwords.words('english'))\n", + "\n", + "def clean_text(text):\n", + " \"\"\"\n", + " text: a string\n", + " \n", + " return: modified initial string\n", + " \"\"\"\n", + " text = text.lower() # lowercase text\n", + " text = REPLACE_BY_SPACE_RE.sub(' ', text) # replace REPLACE_BY_SPACE_RE symbols by space in text. substitute the matched string in REPLACE_BY_SPACE_RE with space.\n", + " text = BAD_SYMBOLS_RE.sub('', text) # remove symbols which are in BAD_SYMBOLS_RE from text. substitute the matched string in BAD_SYMBOLS_RE with nothing. \n", + " text = text.replace('x', '')\n", + "# text = re.sub(r'\\W+', '', text)\n", + " text = ' '.join(word for word in text.split() if word not in STOPWORDS) # remove stopwors from text\n", + " return text\n", + "df['Consumer complaint narrative'] = df['Consumer complaint narrative'].apply(clean_text)" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [], + "source": [ + "df['Consumer complaint narrative'] = df['Consumer complaint narrative'].str.replace('\\d+', '')" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "account reported twice credit report asked eplanation credit bureaus got response furthermore account never paid late faithfully paying account creditor late payments fi error please since eperian couldnt help\n", + "Product: Credit reporting, credit repair services, or other personal consumer reports\n" + ] + } + ], + "source": [ + "print_plot(10)" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "predatory lending complaint may concern writing file complaint ecmc predatory lending practices mailed two certified letters first letter debt validation letter via cert number second letter titled notice estoppel via cert number please see attachments b started credit restoration certified credit counselor come find total collection agencies trying collect school loan ignorance forced make payments one agency titled collected weekly paycheck withdraw paycheck caused real hardship choice make payments couldnt stay employed mailed debt validation letter via mail cert second letter titled notice estoppel via cert # finally stopped collecting second letter almost months paid payments collecting see attachment c went proper channels asking human resources provide order payments see ecmc mentioned within order see attachment e clearly states assistant company collect debt ecmc new loan number ecmc created two loan numbers trying collect two payments one loan owed never announced ecmc working brother company collecting debt separately announced referred company assisting ecmc collect debt ecmc announcing attempt collect payments dated paycheck without answering questions concerns letter see attachment f since ecmc produce information material validate rightfully owe debt responding back frivolous letters see attachment g maliciously going income yet time ecmc directly mentioning referred company collected payments past months lastly mailed copies communication creditors ecmc three credit bureaus requesting investigate company take appropriate regulatory action including necessary referrals state agencies important put end types deceptive unethical business practices\n", + "Product: Student loan\n" + ] + } + ], + "source": [ + "print_plot(100)" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Found 141712 unique tokens.\n" + ] + } + ], + "source": [ + "# The maximum number of words to be used. (most frequent)\n", + "MAX_NB_WORDS = 50000\n", + "# Max number of words in each complaint.\n", + "MAX_SEQUENCE_LENGTH = 250\n", + "# This is fixed.\n", + "EMBEDDING_DIM = 100\n", + "\n", + "tokenizer = Tokenizer(num_words=MAX_NB_WORDS, filters='!\"#$%&()*+,-./:;<=>?@[\\]^_`{|}~', lower=True)\n", + "tokenizer.fit_on_texts(df['Consumer complaint narrative'].values)\n", + "word_index = tokenizer.word_index\n", + "print('Found %s unique tokens.' % len(word_index))" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Shape of data tensor: (361574, 250)\n" + ] + } + ], + "source": [ + "X = tokenizer.texts_to_sequences(df['Consumer complaint narrative'].values)\n", + "X = pad_sequences(X, maxlen=MAX_SEQUENCE_LENGTH)\n", + "print('Shape of data tensor:', X.shape)" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Shape of label tensor: (361574, 13)\n" + ] + } + ], + "source": [ + "Y = pd.get_dummies(df['Product']).values\n", + "print('Shape of label tensor:', Y.shape)" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "(325416, 250) (325416, 13)\n", + "(36158, 250) (36158, 13)\n" + ] + } + ], + "source": [ + "X_train, X_test, Y_train, Y_test = train_test_split(X,Y, test_size = 0.10, random_state = 42)\n", + "print(X_train.shape,Y_train.shape)\n", + "print(X_test.shape,Y_test.shape)" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "_________________________________________________________________\n", + "Layer (type) Output Shape Param # \n", + "=================================================================\n", + "embedding_2 (Embedding) (None, 250, 100) 5000000 \n", + "_________________________________________________________________\n", + "spatial_dropout1d_2 (Spatial (None, 250, 100) 0 \n", + "_________________________________________________________________\n", + "lstm_2 (LSTM) (None, 100) 80400 \n", + "_________________________________________________________________\n", + "dense_2 (Dense) (None, 13) 1313 \n", + "=================================================================\n", + "Total params: 5,081,713\n", + "Trainable params: 5,081,713\n", + "Non-trainable params: 0\n", + "_________________________________________________________________\n", + "None\n" + ] + } + ], + "source": [ + "model = Sequential()\n", + "model.add(Embedding(MAX_NB_WORDS, EMBEDDING_DIM, input_length=X.shape[1]))\n", + "model.add(SpatialDropout1D(0.2))\n", + "model.add(LSTM(100, dropout=0.2, recurrent_dropout=0.2))\n", + "model.add(Dense(13, activation='softmax'))\n", + "model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])\n", + "print(model.summary())" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "WARNING:tensorflow:From /usr/local/lib/python3.6/dist-packages/tensorflow/python/ops/math_ops.py:3066: to_int32 (from tensorflow.python.ops.math_ops) is deprecated and will be removed in a future version.\n", + "Instructions for updating:\n", + "Use tf.cast instead.\n", + "Train on 292874 samples, validate on 32542 samples\n", + "Epoch 1/5\n", + "292874/292874 [==============================] - 1266s 4ms/step - loss: 0.8802 - acc: 0.7211 - val_loss: 0.6457 - val_acc: 0.7819\n", + "Epoch 2/5\n", + "292874/292874 [==============================] - 1246s 4ms/step - loss: 0.5814 - acc: 0.7996 - val_loss: 0.5529 - val_acc: 0.8074\n", + "Epoch 3/5\n", + "292874/292874 [==============================] - 1248s 4ms/step - loss: 0.5107 - acc: 0.8204 - val_loss: 0.5307 - val_acc: 0.8159\n", + "Epoch 4/5\n", + "292874/292874 [==============================] - 1255s 4ms/step - loss: 0.4615 - acc: 0.8398 - val_loss: 0.5199 - val_acc: 0.8244\n", + "Epoch 5/5\n", + "292874/292874 [==============================] - 1235s 4ms/step - loss: 0.4206 - acc: 0.8555 - val_loss: 0.5285 - val_acc: 0.8238\n" + ] + } + ], + "source": [ + "epochs = 5\n", + "batch_size = 64\n", + "\n", + "history = model.fit(X_train, Y_train, epochs=epochs, batch_size=batch_size,validation_split=0.1,callbacks=[EarlyStopping(monitor='val_loss', patience=3, min_delta=0.0001)])" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "36158/36158 [==============================] - 38s 1ms/step\n", + "Test set\n", + " Loss: 0.519\n", + " Accuracy: 0.824\n" + ] + } + ], + "source": [ + "accr = model.evaluate(X_test,Y_test)\n", + "print('Test set\\n Loss: {:0.3f}\\n Accuracy: {:0.3f}'.format(accr[0],accr[1]))" + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "plt.title('Loss')\n", + "plt.plot(history.history['loss'], label='train')\n", + "plt.plot(history.history['val_loss'], label='test')\n", + "plt.legend()\n", + "plt.show();" + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAX0AAAEICAYAAACzliQjAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDMuMC4yLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvOIA7rQAAIABJREFUeJzt3Xl4VeW1+PHvSkgIBEjIBEIIMyQggxImFRWBiqJClVqkttprS29bvV5rHavUen/ea61jq7VV61AtWApqsWJBFByRUcYwhcEMQAhDAgESMqzfH3sHjiGQA5xkn2F9nicP5+z9nr3X2XpW3qz9nvcVVcUYY0xkiPI6AGOMMU3Hkr4xxkQQS/rGGBNBLOkbY0wEsaRvjDERxJK+McZEEEv6xhgTQSzpm7AhIgtFZL+INPc6FmOClSV9ExZEpAswAlDgmiY8b7OmOpcxgWBJ34SLHwBfAq8CN9VuFJEWIvKEiHwtIqUi8pmItHD3XSQiX4hIiYjki8jN7vaFIvIjn2PcLCKf+TxXEfm5iGwGNrvbnnGPcUBElovICJ/20SJyv4hsEZGD7v5OIvKciDzh+yZEZLaI3NEYF8gYsKRvwscPgL+5P5eLSDt3++PAIOACIAm4G6gRkc7A+8AfgFRgILDyNM43ARgK9HGfL3WPkQRMA/4hInHuvl8ANwBXAm2A/wAOA68BN4hIFICIpACj3dcb0ygs6ZuQJyIXAZ2BGaq6HNgCTHaT6X8At6tqoapWq+oXqloBTAbmq+p0Va1U1b2qejpJ//9UdZ+qHgFQ1TfcY1Sp6hNAc6C32/ZHwAOqulEdq9y2S4BSYJTbbhKwUFWLzvKSGHNSlvRNOLgJmKeqe9zn09xtKUAczi+BujqdZLu/8n2fiMgvRWS9W0IqARLc8zd0rteAG93HNwKvn0VMxjTIbkKZkObW568HokVkl7u5OZAInAOUA92BVXVemg8MOclhDwEtfZ63r6fNselp3fr93Tg99nWqWiMi+wHxOVd3YG09x3kDWCsiA4As4J2TxGRMQFhP34S6CUA1Tm19oPuTBXyKU+d/GXhSRDq4N1SHu0M6/waMFpHrRaSZiCSLyED3mCuBa0WkpYj0AG5pIIbWQBVQDDQTkak4tftaLwH/IyI9xdFfRJIBVLUA537A68Cs2nKRMY3Fkr4JdTcBr6hqnqruqv0BngW+B9wLrMFJrPuA3wJRqpqHc2P1Tnf7SmCAe8yngKNAEU755W8NxDAX+DewCfga568L3/LPk8AMYB5wAPgL0MJn/2tAP6y0Y5qA2CIqxnhLRC7GKfN0VvtAmkZmPX1jPCQiMcDtwEuW8E1TsKRvjEdEJAsowbnh/LTH4ZgIYeUdY4yJINbTN8aYCBJ04/RTUlK0S5cuXodhjDEhZfny5XtUNbWhdn4lfREZCzwDROPccHq0zv4MnGFniW6be1V1jruvP/BnnHHLNcBgVS0/2bm6dOnCsmXL/AnLGGOMS0S+9qddg0lfRKKB54AxQAGwVERmq2qOT7MHcOY9eV5E+gBzgC7utLNvAN9X1VXuF1IqT/O9GGOMCRB/avpDgFxV3aqqR4E3gfF12ijHv4GYAOxwH38LWK2qqwDcSaaqzz5sY4wxZ8KfpN+Rb367sMDd5ush4EYRKcDp5d/mbu8FqIjMFZEVInJ3fScQkSkiskxElhUXF5/WGzDGGOO/QN3IvQF4VVWfEJHhwOsicq57/IuAwTjzh38oIstV9UPfF6vqC8ALANnZ2SeMIa2srKSgoIDy8pPeCggbcXFxpKenExMT43Uoxpgw5E/SL8SZGrZWurvN1y3AWABVXeQuHpGC81fBJ7VT3orIHOB84ENOQ0FBAa1bt6ZLly6ISMMvCFGqyt69eykoKKBr165eh2OMCUP+lHeWAj1FpKuIxOIs9DC7Tps83IUg3G8ZxuHMODgX6OfOVtgMuATI4TSVl5eTnJwc1gkfQERITk6OiL9ojDHeaLCnr6pVInIrTgKPBl5W1XUi8jCwTFVn48xU+KK7tqcCN7vziOwXkSdxfnEoMEdV3zuTQMM94deKlPdpjPGGXzV9d8z9nDrbpvo8zgEuPMlr38AZtmmMMaYexQcrWLBhN1U1yuShGY16LpuGwU8lJSX88Y9/PO3XXXnllZSUlDRCRMaYUKWqbCo6yHMLcrn2j58z5H/nc/es1fxjeX7DLz5LQTcNQ7CqTfo/+9nPvrG9qqqKZs1OfhnnzJlz0n3GmMhRWV3D0m37mL9+N/PXF5G37zAA/dMTuGN0L0ZlpdHnnDYNHOXsWdL307333suWLVsYOHAgMTExxMXF0bZtWzZs2MCmTZuYMGEC+fn5lJeXc/vttzNlyhTg+LQSZWVlXHHFFVx00UV88cUXdOzYkX/+85+0aNGigTMbY0JV6ZFKPt5UzPycIhZs3M3B8ipim0VxUY8UfnJJN0ZltqN9QlyTxhRySf83764jZ8eBgB6zT4c2/Prqvqds8+ijj7J27VpWrlzJwoULGTduHGvXrj02tPLll18mKSmJI0eOMHjwYK677jqSk5O/cYzNmzczffp0XnzxRa6//npmzZrFjTfeGND3YozxVt7ew8xfX8T89UUs2baPqholOT6WsX3bM7pPO0b0TKFlrHepN+SSfrAYMmTIN8bS//73v+ftt98GID8/n82bN5+Q9Lt27crAgc7a24MGDWL79u1NFq8xpnHU1Chf5ZfwoZvoNxWVAdCrXSt+fHE3Rme1Y2CnRKKjgmNkXsgl/YZ65E0lPj7+2OOFCxcyf/58Fi1aRMuWLbn00kvrHWvfvHnzY4+jo6M5cuRIk8RqjAmsw0er+GzzHuavL+KjDbvZU3aU6ChhaNckvjs4g9FZaXROjm/4QB4IuaTvldatW3Pw4MF695WWltK2bVtatmzJhg0b+PLLL5s4OmNMYys6UM6H7k3Yz3P3UFFVQ+u4ZlzaO43RWWlc2iuNhJbBP32KJX0/JScnc+GFF3LuuefSokUL2rVrd2zf2LFj+dOf/kRWVha9e/dm2LBhHkZqjAkEVWX9zoPH6vOrC0oB6JTUgslDMxiT1Y7BXZOIiQ6tke9Bt0Zudna21l1EZf369WRlZXkUUdOLtPdrTLCoqKpm8dZ9TqLPKWJHaTkiMLBTIqOz2jGmTzt6prUKym/Ou5NZZjfUznr6xpiItv/QURZsdMo2n2zaQ1lFFXExUYzomcp/j+7FyMw0Uls3b/hAIcKSvjEm4mwtLnN787tZ9vU+ahTSWjfn6gEdGNMnjQu6pxAXE+11mI3Ckr4xJuxVVdewIq/kWNlm655DAGSd04ZbR/ZgdJ92nNshgaggGVbZmCzpG2PCUllFFZ/4fBt2/+FKYqKFYd2SufnCLlyWmUZ625Zeh9nkLOkbY8JGYckR90tSu/lyy16OVteQ2DKGy3qnMSqrHRf3SqF1XPAPq2xMlvSNMSGrpkZZu6OU+TlOos/Z6UzR0jUlnpsu6MzorHYM6tyWZiE2rLIxWdL3U0lJCdOmTTthlk1/PP3000yZMoWWLSPvT0ljAq28spovtuxh/vrdfLi+iKIDFUQJZHdO4r4rMhndpx3dU1t5HWbQsqTvp5NNreyPp59+mhtvvNGSvjFnqHaRkfnri/h08x6OVFYTHxvNxb1SGZ3VjpGZaSTFx3odZkiwpO8n36mVx4wZQ1paGjNmzKCiooJvf/vb/OY3v+HQoUNcf/31FBQUUF1dzYMPPkhRURE7duxg5MiRpKSksGDBAq/fijFBT1XZvLvs2Gibr/JLUIUOCXFMHJTO6D7tGNYtiebNwnNYZWMKvaT//r2wa01gj9m+H1zx6Cmb+E6tPG/ePGbOnMmSJUtQVa655ho++eQTiouL6dChA++95ywDXFpaSkJCAk8++SQLFiwgJSUlsHEbE0ZOtshIv44J/PeoXozu4ywyEozfhg0loZf0g8C8efOYN28e5513HgBlZWVs3ryZESNGcOedd3LPPfdw1VVXMWLECI8jNSa4nWyRkQu7J3u2yEi48yvpi8hY4BkgGnhJVR+tsz8DeA1IdNvc6y6m7rs/B3hIVR8/q4gb6JE3BVXlvvvu4yc/+ckJ+1asWMGcOXN44IEHGDVqFFOnTq3nCMZErmBfZCTcNXhlRSQaeA4YAxQAS0Vktqrm+DR7AJihqs+LSB9gDtDFZ/+TwPsBi9oDvlMrX3755Tz44IN873vfo1WrVhQWFhITE0NVVRVJSUnceOONJCYm8tJLL33jtVbeMZHoZIuM9EwLzkVGwp0/v06HALmquhVARN4ExuP03GspULuibwKwo3aHiEwAtgGHAhGwV3ynVr7iiiuYPHkyw4cPB6BVq1a88cYb5ObmctdddxEVFUVMTAzPP/88AFOmTGHs2LF06NDBbuSaiFBVXcMnm4v599pd31hkZEiXJB68KrgXGQl3DU6tLCITgbGq+iP3+feBoap6q0+bc4B5QFsgHhitqstFpBXwAc5fCb8Eyuor74jIFGAKQEZGxqCvv/76G/sjbarhSHu/Jnxs3HWQmcvzefurHewpq6B182Zcmhlai4yEqqaeWvkG4FVVfUJEhgOvi8i5wEPAU6padqo77qr6AvACOPPpBygmY0wT2H/oKLNX7WDm8gLWFJbSLEq4LDONiYPSubR3GrHN7NuwwcSfpF8IdPJ5nu5u83ULMBZAVReJSByQAgwFJorIYzg3eWtEpFxVnz3ryI0xnqkt38xcXsD8nN0cra6hzzltmHpVH8YP7EByq/CZfz7c+JP0lwI9RaQrTrKfBEyu0yYPGAW8KiJZQBxQrKrHxiyKyEM45Z0zSviqGhHjc4NtJTNjfG3cdZBZKwp4a0Uhe8oqSIqP5cZhnbluUEf6dkjwOjzjhwaTvqpWicitwFyc4Zgvq+o6EXkYWKaqs4E7gRdF5A6cm7o3awCzV1xcHHv37iU5OTmsE7+qsnfvXuLibFyyCR4lh4+Xb1YXWPkm1IXEGrmVlZUUFBRQXl7uUVRNJy4ujvT0dGJi7IaX8c7JyjcTB6Vb+SZIhdUauTExMXTt2tXrMIwJe5uKDjJzuZVvwllIJH1jTOOx8k1ksaRvTASqr3yTZaNvIoIlfWMiSG355u2vCik+6JRvvjcsg4mD0q18EyEs6RsT5uor34x0yzcjrXwTcSzpGxOGqqpr+HTzHv6xPP9Y+SazfWsedMs3KVa+iViW9I0JI5uKDjJreQFvWfnGnIQlfWNCXMnho7zrlm9WWfnGNMCSvjEhqLZ8M3N5AR/kFFn5xvjNkr4xIcTKN+ZsWdI3JshZ+cYEkiV9Y4KQlW9MY7Gkb0wQsfKNaWyW9I3xmJVvTFOypG+MB6x8Y7xiSd+YJrS5dupiK98Yj1jSN6aRRUz5proS9m2F4g1QvMn5t+IASBRINES5/0oUREW726JBxOex736ff0/Y77ut7uO6x49qpGOd5nsJklX/LOkb0whOVr55YFwWE87rGNrlm8py2JvrJveNzr97NjnbaqqOt0vIgJZJoNVQUwNa4z6udv7VGnd77bYan7a1+33aao137zkQan9hnOqXTofzYPLfGzUMS/rGBFDd8k3bljFMHlpbvmkTWms8Hz3kJPPaxF777/7txxOwREHbrpCaCb2vhNTezk9KL4iND2w8qj6/COr+AtHjj0/YX3PiL5Ca6lMc62S/jNzznNA2gMdKzAjsNauHJX1jzlLp4Upmr3bLN/klREcJI3s75ZvLMkOgfHOkpJ7kvhFK8463iYqB5O7Qvh/0+46b2HtDcg+IiWuaOH1LJ+aM+ZX0RWQs8AwQDbykqo/W2Z8BvAYkum3uVdU5IjIGeBSIBY4Cd6nqRwGM3xhPVFXX8GmuW75Z983yzfiBHUltHYTlm0N73aTulmNqE/zBncfbNIuDlJ7QaQic/wO3554JSV0hOsa72E3ANJj0RSQaeA4YAxQAS0Vktqrm+DR7AJihqs+LSB9gDtAF2ANcrao7RORcYC7QMcDvwZgms7noIDNXFPD2ikJ2B2P5RhXKir5Zjqm9qXp4z/F2MfFOQu82ElJ7OYk9tTckdraedJjzp6c/BMhV1a0AIvImMB7wTfoKtHEfJwA7AFT1K58264AWItJcVSvONnBjmsrho1X8a9VOpi3JY2WwlG9qauBAwfGE7luWqSg93i4uwUnomVc6/6a4Nfc2HZ0biCbi+JP0OwL5Ps8LgKF12jwEzBOR24B4YHQ9x7kOWFFfwheRKcAUgIyMxr+RYYw/1u88wLTFebzzVSEHK6rokdaq6cs3NdXOjdPijbBn4zd775WHjreLT3USer+Jx3vtqb2hVbugGSpogkOgbuTeALyqqk+IyHDgdRE5V9W5xS8ifYHfAt+q78Wq+gLwAkB2drYGKCZjTtuRo9W8u3oH05fk8VVeCbHNohjX7xwmD80gu3PbxivffGOM+8bjP3s2QbVPP6l1ByeZn//94/X2lN4Qn9w4cZmw40/SLwQ6+TxPd7f5ugUYC6Cqi0QkDkgBdotIOvA28ANV3XL2IRsTeBt2HWD64jze+qqQg+VVdE+N58Gr+nDteR1pGx8buBP5O8Y9McNJ6N0vdUsymU7tPc6+tWvOjj9JfynQU0S64iT7ScDkOm3ygFHAqyKSBcQBxSKSCLyHM5rn88CFbczZK6+s5l+rdzJt8desyCshNjqKK/q1Z/KQDIZ0TTq7Xn1FmZPMfUfJNDjG3U3sjTHG3RhXg0lfVatE5FackTfRwMuquk5EHgaWqeps4E7gRRG5A+em7s2qqu7regBTRWSqe8hvqeruRnk3xvhhU9FBpi3O460VBRwor6JbSjwPjMvi2vPTSTrdXv2xMe51yjINjXFPzYSk7k03xt0Yl6gGVwk9Oztbly1b5nUYJsyUV1YzZ81Opi3OY9nX+4mNjmLsue25YUgGw7r50av3HePue1O1vjHuvqNkbIy7aSIislxVsxtqZ9/INWEtd/dB/rY4j7dWFFJ6pJKuKfHcf2Um152fTnLd+W9U4VDx8cS+e/3xssxJx7j3Pv5jY9xNCLCkb8JOeWU176/dyfTF+SzZvo+YaOHyvu2ZPDSD4d2SEXB66Ft8v8Dk/ntk//EDNU9wknnvK9x6eyakZTpj3G0YpAlRlvRN2MjdXcb0JXnMWlFAyeFKuiS14JGRCVzV4SAJB7+AtS/DAjfBVxw4/sIWbSE1C/pM8Bnjngmt21tyN2HHkr4JaRVV1fx7zQ4++GIphwvX0TuqkD+13UfftjtpdXArsqjseOP4VCeZ97/+m8k9PtWSu4kYlvRN6Dj27dQN7N2+mh2bVxK9dyPf0kLGy1FnWj8AbQ8JmdDjAvsCkzF1WNI3wae6EvZtg+L136i5657NiPvt1GSgQpPZH9+NfRkjOafHQKLS3HHuLdp6G78xQcySvvFOVQXs3VJnRsiN7rdTK481q2zdia+jOvFFzeWsqWxPaavuZGcPY8KwTPq2tnHuxpwOS/qm8VWWw97NPsMg3eS+b6uzYhAAAm27QFoW9B5LVVIvvjiQyisbY1iw7RDRUcKYrHZMHprBRT1SiIqyGrwxZ8KSvgkcv5bXi4akbk6tvc/44zdUU3pCTAu27znE9KV5zHyvgL2HjtIxMZpffqsX12d3Iq2N9eqNOVuW9M3pqzhYZx5396fEd+qBZs5SesemHnDHuSd3h2bf/FLU0aoaPsgpYvqS1XyWu4foKGFUZhqTh2Ywomcq0darNyZgLOmbkztScmKvvXijs3hHrehYZ4Kw9MFwns90v0ndGpx6IG/vYaYvzeMfy/LZU3aUjoktuHNML64f3Il21qs3plFY0jdweF+d1Zc2wO4NULbreJtmcU5y7+wzDDI106nDR/v/v1FldQ3zc4qYtiSPTzfvIUpgVFY7Jg/J4OJe1qs3prFZ0o9U2z+HL34Phcud+WZqxcQ7wx67X+aT3Hs787ufxbwy+fsOM31JHjOWFbCnrIIOCXHcMboX3x3cifYJ1qs3pqlY0o8kqrD9U1j4W/j6M4hPg16XH++1p/aGNukBWzu1srqGD9cXMW1JPp9uLkaAy9xa/SW90qxXb4wHLOlHAlXYugA+fgzyFkGr9jD2URh0M8S0CPjp8vcd5u9L85mxLJ/dBys4JyGO20f15PrsTnRIDPz5jDH+s6QfzlQh90P4+LdQsMRZX/XKx50brgFevKOquoYPN+xm2uI8PtnslItG9k5j8pAMLu2dSrPowPz1YIw5O5b0w5EqbJrrJPsdKyChE4x7Es678YThkmerYP9hZizN5+/L8ik6UEG7Ns257bKefHdwJzpar96YoGNJP5yowsY5TrLfucq5+Xr1MzBgMjQL3OLeVdU1LNhYzLTFX7Nwk9Orv6RXKv8zPoPLMtOsV29MELOkHw5qamDDu/Dx76BojbPY9vjnoP93A7pM346SI7y5NJ8ZS/PZdaCctNbNuXVkD747uBPpbVsG7DzGmMZjST+U1VRDzj/hk9/B7hxnoe0Jf3K+AXsaY+dPpbpGWbjRqdUv2LgbBS7umcpD1/RlVFYaMdarNyakWNIPRTXVsO5tZzTOno3Ol6aufQnOvTZga7TuLD3C35fm8/el+ewsLSe1dXN+eml3Jg3OoFOS9eqNCVV+JX0RGQs8A0QDL6nqo3X2ZwCvAYlum3tVdY677z7gFqAa+C9VnRu48CNMdRWsnen07PfmOkv8TXzZWeYvAMm+ukb5eNNupi3O56MNRdQojOiZwq+v7sOorHbWqzcmDDSY9EUkGngOGAMUAEtFZLaq5vg0ewCYoarPi0gfYA7QxX08CegLdADmi0gv1WPz6Rp/VFfC6hnw6ePOdMTtzoXr/wqZVwfki1S7SsuZsczp1ReWHCGlVXP+8xKnV5+RbL16Y8KJPz39IUCuqm4FEJE3gfGAb9JXoI37OAHY4T4eD7ypqhXANhHJdY+3KACxh7+qo7BqOnz6BJR8De37w3f/Br2vDEiy/3LrXv7y2TY+2rCb6hplRM8UfjUui9FZ7YhtZr16Y8KRP0m/I5Dv87wAGFqnzUPAPBG5DYgHRvu89ss6r+1Y9wQiMgWYApCRkeFP3OGtqgJW/g0+fQpK86DDeXDFb6HX2IAt4L0qv4TJL35JUnwsPx7RjRuGdKJzcnxAjm2MCV6BupF7A/Cqqj4hIsOB10XkXH9frKovAC8AZGdna4BiCj2V5fDV6/DZU3CgEDpmw1VPQo/RAUv2ABVV1dw1cxVpreOYe8fFJLQI3LBOY0xw8yfpFwKdfJ6nu9t83QKMBVDVRSISB6T4+VpTeQSWvwafPw0Hd0KnoXDNH5yZLgOY7Gs9+1Eum4rKeOXmwZbwjYkw/iT9pUBPEemKk7AnAZPrtMkDRgGvikgWEAcUA7OBaSLyJM6N3J7AkgDFHvqOHoZlL8Pnz8Ch3dD5Qvj2n6HrxY2S7AHWFpbyx4VbuPb8jozMTGuUcxhjgleDSV9Vq0TkVmAuznDMl1V1nYg8DCxT1dnAncCLInIHzk3dm1VVgXUiMgPnpm8V8HMbuQNUlMGyv8AXf3Dmsu8yAr7zCnS5qFFPW1ldw90zV5MUH8vUq/o06rmMMcHJr5q+O+Z+Tp1tU30e5wAXnuS1jwCPnEWM4aPiICx5ERY9C4f3QreRcMndzmpUTeD5hVvI2XmAP39/EIktAzcXjzEmdNg3cptCeSkseQEWPQdH9js3Zi+5BzoNabIQNu46yB8+2szVAzpwed/2TXZeY0xwsaTfmI6UwOI/wZd/dBJ/r7Fw8d2QPqhJw6iqruGumatoExfDQ1dbWceYSGZJvzEc3gdfPu8k/IoD0HscXHKXM97eAy9+uo3VBaU8O/k8klsFdj59Y0xosaQfSIf2OvX6JS/A0TLIugYuvgvO6e9ZSLm7y3hq/ibG9m3PuH7neBaHMSY4WNIPhLJiWPQHWPISVB6GvhOcZN+ur6dhVdcod89cRcvYaB6e0BdppGGgxpjQYUn/bBwsgi9+D0v/AtUVcO51MOKXkJbpdWQAvPL5NlbklfDUdweQ1jqwa+IaY0KTJf0zcWCn84Wq5a9A9VHodz1c/EtI6el1ZMds33OIx+dt5LLMNCYMPGG6I2NMhLKkfzpKC515cVb8FWqqYMANMOIXkNzd68i+oaZGuXvWamKio/jfb/ezso4x5hhL+v4oyXOS/VdvgNbAwMlw0S8gqavXkdXrjcVfs2TbPh67rj/tE6ysY4w5zpL+qezf7sxlv3IaIHDejU7PPjF4p3/O33eYR9/fwIieKXwnO93rcIwxQcaSfn32boFPn3QWMImKhkE/hIv+GxKCO4mqKve9tQYBHr2uv5V1jDEnsKTva0+usyTh6hkQHQNDfgwX3g5tOngdmV/eXJrPZ7l7+H8TzqVjYguvwzHGBCFL+gDFG53FxtfOgujmMPQ/4cL/gtahM0fNjpIjPPLeeoZ1S2LykOAtPxljvBXZSb8ox0n2696GmBYw/Fa44DZoFVrzzKsq97+9huoa5bHrBhAVZWUdY0z9IjPp71oDHz8G62dDbCunXj/8VohP8TqyMzJrRSELNxbz66v7kJHc0utwjDFBLLKS/o6VTs9+w7+geRtnqoRhP4OWSV5HdsZ2Hyjn4XfXkd25LTcN7+J1OMaYIBcZSb9wudOz3/RvaJ4Al9wLw/4TWrT1OrKzoqr86p21VFTV8NjE/lbWMcY0KLyTfv5S+Pi3kPsBxCXCyAdg6BSIS/A6soCYvWoHH+QUcf+VmXRLbeV1OMaYEBCeST/vSyfZb/kIWiTBqKkw+McQ18bryAJmT1kFD81ex4BOidxyUTevwzHGhIjwSvrbP4ePH4Vtn0DLFBj9Gxj8I2gefr3gX/9zHYcqqnl8Yn+iraxjjPGTX0lfRMYCzwDRwEuq+mid/U8BI92nLYE0VU109z0GjAOigA+A21VVAxO+j71b4NUrIT4NvvUIZP8QYuMDfppg8P6anby3Zid3Xd6bnu1aex2OMSaENJj0RSQaeA4YAxQAS0Vktqrm1LZR1Tt82t8GnOc+vgC4EKhdOuoz4BJgYYDiPy65O0yaDt1HOmPuw9T+Q0d58J9r6duhDVMutrKOMeb0RPnRZgiQq6pbVfUo8CYw/hTtbwCmu4+Ad24GAAARKUlEQVQViANigeZADFB05uE2IPPKsE74AL95dx0lhyv53cQBxET785/PGGOO8ydrdATyfZ4XuNtOICKdga7ARwCqughYAOx0f+aq6vp6XjdFRJaJyLLi4uLTewcRZH5OEe+s3MHPR/agT4fwuSltjGk6ge4qTgJmqmo1gIj0ALKAdJxfFJeJyIi6L1LVF1Q1W1WzU1NTAxxSeCg9Usmv3llDZvvW/HxkD6/DMcaEKH+SfiHQyed5urutPpM4XtoB+DbwpaqWqWoZ8D4w/EwCjXT/71857Ck7yu8mDiC2mZV1jDFnxp/ssRToKSJdRSQWJ7HPrttIRDKBtsAin815wCUi0kxEYnBu4p5Q3jGn9vGmYv6xvICfXNyNfunh8cUyY4w3Gkz6qloF3ArMxUnYM1R1nYg8LCLX+DSdBLxZZzjmTGALsAZYBaxS1XcDFn0EOFheyX2zVtMjrRX/NSp4Fl43xoQmv8bpq+ocYE6dbVPrPH+ontdVAz85i/gi3v+9v4FdB8qZ+dMLiIuJ9jocY0yIs+JwEPsidw/TFudxy0VdOT8jtCeHM8YEB0v6QepQRRX3vLWaLskt+cWY3l6HY4wJE+E1904Y+d3cjRTsP8LfpwynRayVdYwxgWE9/SC0ZNs+Xv1iOzcN78KQrqG7wIsxJvhY0g8yR45Wc8+s1XRKasFdl1tZxxgTWFbeCTJPfrCRbXsOMe1HQ4lvbv95jDGBZT39ILIibz9/+Wwbk4dmcEGP0Fyk3RgT3CzpB4nyymrunrma9m3iuO+KTK/DMcaEKasfBInff7iZ3N1lvPYfQ2gdF+N1OMaYMGU9/SCwpqCUP3+yle8MSueSXjbLqDGm8VjS99jRqhrumrmK5PhYHhjXx+twjDFhzso7HntuQS4bdh3kpR9kk9DSyjrGmMZlPX0Prd95gOcW5DJhYAdG92nndTjGmAhgSd8jldVOWSexZQy/vrqv1+EYYyKElXc88sInW1lbeIDnv3c+beNjvQ7HGBMhrKfvgc1FB3lm/mbG9TuHK/qd43U4xpgIYkm/iVXXKHfNXE1882h+M97KOsaYpmXlnSb2l8+2sjK/hGcmDSSlVXOvwzHGRBjr6TehrcVlPDFvE2P6tOOaAR28DscYE4Es6TeRmhrlnlmrad4sikcmnIuIeB2SMSYCWdJvIq8t2s7S7fuZenVf0trEeR2OMSZC+ZX0RWSsiGwUkVwRubee/U+JyEr3Z5OIlPjsyxCReSKyXkRyRKRL4MIPDXl7D/PYvzdyae9Urju/o9fhGGMiWIM3ckUkGngOGAMUAEtFZLaq5tS2UdU7fNrfBpznc4i/Ao+o6gci0gqoCVTwoaC2rBMdJfzvt/tZWccY4yl/evpDgFxV3aqqR4E3gfGnaH8DMB1ARPoAzVT1AwBVLVPVw2cZc0iZtiSPRVv38qtxWXRIbOF1OMaYCOdP0u8I5Ps8L3C3nUBEOgNdgY/cTb2AEhF5S0S+EpHfuX851H3dFBFZJiLLiouLT+8dBLHCkiP835z1XNgjmUmDO3kdjjHGBPxG7iRgpqpWu8+bASOAXwKDgW7AzXVfpKovqGq2qmanpobHfPKqyr2zVqPAo9f2t7KOMSYo+JP0CwHfbmq6u60+k3BLO64CYKVbGqoC3gHOP5NAQ80/lhXw6eY93HtFJp2SWnodjjHGAP4l/aVATxHpKiKxOIl9dt1GIpIJtAUW1XltoojUdt8vA3Lqvjbc7Cot53/ey2FI1yRuHNrZ63CMMeaYBpO+20O/FZgLrAdmqOo6EXlYRK7xaToJeFNV1ee11TilnQ9FZA0gwIuBfAPBRlX51dtrqKyu4bHr+hMVZWUdY0zw8GvuHVWdA8yps21qnecPneS1HwD9zzC+kPPOykI+3LCbB8Zl0SUl3utwjDHmG+wbuQG0+2A5D83O4fyMRH54YVevwzHGmBNY0g8QVWXqO+s4UlnNYxMHEG1lHWNMELKkHyDvrdnJv9ft4o7RveiR1srrcIwxpl6W9ANgb1kFv/7nOvqnJ/DjEVbWMcYEL1tEJQAeejeHA+WVTJs4jGbR9nvUGBO8LEOdpbnrdvHuqh3cdllPerdv7XU4xhhzSpb0z0LJ4aM88M5ass5pw08v7e51OMYY0yAr75yFh/+Vw/5DR3nl5sHEWFnHGBMCLFOdoY82FPHWikJ+eml3zu2Y4HU4xhjjF0v6Z+BAeSX3v7WWXu1acetlPbwOxxhj/GZJ/wz873vr2X2wnN9NHEDzZicsD2CMMUHLkv5p+nRzMW8uzefHF3djQKdEr8MxxpjTYkn/NJRVVHHvrDV0S4nnjtG9vA7HGGNOm43eOQ2/fX8DO0qPMPM/hxMXY2UdY0zosZ6+nxZt2cvrX37NDy/oyqDOSV6HY4wxZ8SSvh8OH63inlmryUhqyS8vt7KOMSZ0WXnHD4/P3UTevsNM//EwWsbaJTPGhC7r6Tdg2fZ9vPLFNr4/rDPDuyd7HY4xxpwVS/qnUF5Zzd0zV9MhoQX3XJHpdTjGGHPWrFZxCk/N38TWPYd4/ZYhtGpul8oYE/r86umLyFgR2SgiuSJybz37nxKRle7PJhEpqbO/jYgUiMizgQq8sa3ML+HFT7YyaXAnRvRM9TocY4wJiAa7ryISDTwHjAEKgKUiMltVc2rbqOodPu1vA86rc5j/AT4JSMRNoKKqmrtnriKtdRz3j8vyOhxjjAkYf3r6Q4BcVd2qqkeBN4Hxp2h/AzC99omIDALaAfPOJtCm9OxHuWwqKuP/ru1Hm7gYr8MxxpiA8SfpdwTyfZ4XuNtOICKdga7AR+7zKOAJ4JenOoGITBGRZSKyrLi42J+4G83awlL+uHAL157fkZGZaZ7GYowxgRbo0TuTgJmqWu0+/xkwR1ULTvUiVX1BVbNVNTs11bv6eWV1DXfNXE1SfCxTr+rjWRzGGNNY/BmSUgh08nme7m6rzyTg5z7PhwMjRORnQCsgVkTKVPWEm8HB4PmFW1i/8wB//v4gElvGeh2OMcYEnD9JfynQU0S64iT7ScDkuo1EJBNoCyyq3aaq3/PZfzOQHawJf8OuA/zho81cPaADl/dt73U4xhjTKBos76hqFXArMBdYD8xQ1XUi8rCIXOPTdBLwpqpq44TaeKqqa7h75mraxMXw0NVW1jHGhC+/vnGkqnOAOXW2Ta3z/KEGjvEq8OppRddEXvx0G6sLSnl28nkkt2rudTjGGNNoIn4ahtzdZTw1fxNj+7ZnXL9zvA7HGGMaVUQn/eoa5e6Zq2gZG83DE/oiIl6HZIwxjSqik/4rn29jRV4Jv766D2mt47wOxxhjGl3EJv3tew7x+LyNjMpMY8LAer9rZowxYScik35NjXL3rNXEREfxyLf7WVnHGBMxIjLpv7H4a5Zs28eD4/rQPsHKOsaYyBFxST9/32EefX8DI3qm8J3sdK/DMcaYJhVRSV9Vufet1Qjw6HX9raxjjIk4EZX031yaz+e5e7nvyiw6JrbwOhxjjGlyEZP0d5Qc4ZH31jO8WzKTh2R4HY4xxngiIpK+qnL/22uorlF+e11/oqKsrGOMiUwRkfRnrShk4cZi7h7bm4zkll6HY4wxngn7pF90oJyH311Hdue23DS8i9fhGGOMp8I66asqv3p7LRVVNTw20co6xhgT1kl/9qodzF9fxJ3f6kW31FZeh2OMMZ4L26RffLCCh2avY0CnRG65qJvX4RhjTFAI26T/0Ox1HKqo5vGJ/Ym2so4xxgBhmvTfX7OT99bs5PbRPenZrrXX4RhjTNAIu6S/79BRHvznWvp2aMOUi62sY4wxvvxaIzeUPPzuOkoOV/LX/xhKTHTY/U4zxpiz4ldWFJGxIrJRRHJF5N569j8lIivdn00iUuJuHygii0RknYisFpHvBvoN+JqfU8Q7K3fw85E96NOhTWOeyhhjQlKDPX0RiQaeA8YABcBSEZmtqjm1bVT1Dp/2twHnuU8PAz9Q1c0i0gFYLiJzVbUkkG8CoPRwJfe/vYbM9q35+cgegT68McaEBX96+kOAXFXdqqpHgTeB8adofwMwHUBVN6nqZvfxDmA3kHp2IdfvaHUN/dMT+d3EAcQ2s7KOMcbUx5+afkcg3+d5ATC0voYi0hnoCnxUz74hQCywpZ59U4ApABkZZzYDZmrr5rx0U/YZvdYYYyJFoLvEk4CZqlrtu1FEzgFeB36oqjV1X6SqL6hqtqpmp6Y2yh8Cxhhj8C/pFwKdfJ6nu9vqMwm3tFNLRNoA7wG/UtUvzyRIY4wxgeFP0l8K9BSRriISi5PYZ9dtJCKZQFtgkc+2WOBt4K+qOjMwIRtjjDlTDSZ9Va0CbgXmAuuBGaq6TkQeFpFrfJpOAt5UVfXZdj1wMXCzz5DOgQGM3xhjzGmQb+Zo72VnZ+uyZcu8DsMYY0KKiCxX1QZHs9jYRmOMiSCW9I0xJoJY0jfGmAgSdDV9ESkGvj6LQ6QAewIUTiBZXKfH4jo9FtfpCce4Oqtqg190Crqkf7ZEZJk/NzOamsV1eiyu02NxnZ5IjsvKO8YYE0Es6RtjTAQJx6T/gtcBnITFdXosrtNjcZ2eiI0r7Gr6xhhjTi4ce/rGGGNOwpK+McZEkJBM+n6s2dtcRP7u7l8sIl2CJK6bRaTYZ/K5HzVRXC+LyG4RWXuS/SIiv3fjXi0i5wdJXJeKSKnP9ZraRHF1EpEFIpLjru98ez1tmvya+RlXk18zEYkTkSUissqN6zf1tGnyz6SfcXnymXTPHS0iX4nIv+rZ13jXS1VD6geIxll9qxvOSlyrgD512vwM+JP7eBLw9yCJ62bgWQ+u2cXA+cDak+y/EngfEGAYsDhI4roU+JcH1+sc4Hz3cWtgUz3/LZv8mvkZV5NfM/catHIfxwCLgWF12njxmfQnLk8+k+65fwFMq++/V2Ner1Ds6fuzZu944DX38UxglIhIEMTlCVX9BNh3iibjcdY8UHUWukl0VzvzOi5PqOpOVV3hPj6IM6V4xzrNmvya+RlXk3OvQZn7NMb9qTtCpMk/k37G5QkRSQfGAS+dpEmjXa9QTPr1rdlb93/8Y23UWQ+gFEgOgrgArnPLATNFpFM9+73gb+xeGO7+ef6+iPRt6pO7f1afh9NL9OXpNTtFXODBNXNLFSuB3cAHqnrS69WEn0l/4gJvPpNPA3cDJywf62q06xWKST+UvQt0UdX+wAcc/01u6rcCZz6RAcAfgHea8uQi0gqYBfy3qh5oynOfSgNxeXLNVLVaVQfiLKc6RETObYrzNsSPuJr8MykiVwG7VXV5Y5+rPqGY9P1Zs/dYGxFpBiQAe72OS1X3qmqF+/QlYFAjx+Sv01kHucmo6oHaP89VdQ4QIyIpTXFuEYnBSax/U9W36mniyTVrKC4vr5l7zhJgATC2zi4vPpMNxuXRZ/JC4BoR2Y5TBr5MRN6o06bRrlcoJn1/1uydDdzkPp4IfKTuHREv46pT870GpyYbDGYDP3BHpAwDSlV1p9dBiUj72jqmiAzB+f+10ROFe86/AOtV9cmTNGvya+ZPXF5cMxFJFZFE93ELYAywoU6zJv9M+hOXF59JVb1PVdNVtQtOnvhIVW+s06zRrlezQBykKalqlYjUrtkbDbys7pq9wDJVnY3zwXhdRHJxbhROCpK4/kucdYWr3Lhubuy4AERkOs6ojhQRKQB+jXNTC1X9EzAHZzRKLnAY+GGQxDUR+KmIVAFHgElN8MsbnJ7Y94E1bj0Y4H4gwyc2L66ZP3F5cc3OAV4TkWicXzIzVPVfXn8m/YzLk89kfZrqetk0DMYYE0FCsbxjjDHmDFnSN8aYCGJJ3xhjIoglfWOMiSCW9I0xJoJY0jfGmAhiSd8YYyLI/weDmNnpx5/yHwAAAABJRU5ErkJggg==\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "plt.title('Accuracy')\n", + "plt.plot(history.history['acc'], label='train')\n", + "plt.plot(history.history['val_acc'], label='test')\n", + "plt.legend()\n", + "plt.show();" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Test with a new complaint." + ] + }, + { + "cell_type": "code", + "execution_count": 39, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[[1.5803229e-02 2.3755017e-03 5.1062729e-04 5.3740919e-01 3.5682529e-01\n", + " 8.5910626e-02 3.0194962e-04 2.5151852e-05 3.9089144e-05 1.0010027e-04\n", + " 5.1000190e-04 1.3226915e-04 5.6953013e-05]] Credit card or prepaid card\n" + ] + } + ], + "source": [ + "new_complaint = ['I am a victim of identity theft and someone stole my identity and personal information to open up a Visa credit card account with Bank of America. The following Bank of America Visa credit card account do not belong to me : XXXX.']\n", + "seq = tokenizer.texts_to_sequences(new_complaint)\n", + "padded = pad_sequences(seq, maxlen=MAX_SEQUENCE_LENGTH)\n", + "pred = model.predict(padded)\n", + "labels = ['Credit reporting, credit repair services, or other personal consumer reports', 'Debt collection', 'Mortgage', 'Credit card or prepaid card', 'Student loan', 'Bank account or service', 'Checking or savings account', 'Consumer Loan', 'Payday loan, title loan, or personal loan', 'Vehicle loan or lease', 'Money transfer, virtual currency, or money service', 'Money transfers', 'Prepaid card']\n", + "print(pred, labels[np.argmax(pred)])" + ] + }, + { + "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.7" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +}