Skip to content

Instantly share code, notes, and snippets.

@deansublett
Created June 5, 2019 17:13
Show Gist options
  • Save deansublett/06f010a886831f9dac5b1f9bce4f4229 to your computer and use it in GitHub Desktop.
Save deansublett/06f010a886831f9dac5b1f9bce4f4229 to your computer and use it in GitHub Desktop.
rec_system_movies.ipynb
Display the source blob
Display the rendered blob
Raw
{
"nbformat": 4,
"nbformat_minor": 0,
"metadata": {
"colab": {
"name": "rec_system_movies.ipynb",
"version": "0.3.2",
"provenance": [],
"collapsed_sections": [
"y5oMQDXJPtWM",
"-2bIjqLePmxg"
],
"include_colab_link": true
},
"kernelspec": {
"name": "python3",
"display_name": "Python 3"
},
"accelerator": "GPU"
},
"cells": [
{
"cell_type": "markdown",
"metadata": {
"id": "view-in-github",
"colab_type": "text"
},
"source": [
"<a href=\"https://colab.research.google.com/gist/deansublett/06f010a886831f9dac5b1f9bce4f4229/rec_system_movies.ipynb\" target=\"_parent\"><img src=\"https://colab.research.google.com/assets/colab-badge.svg\" alt=\"Open In Colab\"/></a>"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "y5oMQDXJPtWM",
"colab_type": "text"
},
"source": [
"# Setup & Cleaning"
]
},
{
"cell_type": "code",
"metadata": {
"id": "B7_26YfXL2FG",
"colab_type": "code",
"colab": {}
},
"source": [
"import pandas as pd\n",
"import numpy as np"
],
"execution_count": 0,
"outputs": []
},
{
"cell_type": "code",
"metadata": {
"id": "jibCtVwsHa4Q",
"colab_type": "code",
"outputId": "dab76c17-e245-4415-a3aa-681363651984",
"colab": {
"resources": {
"http://localhost:8080/nbextensions/google.colab/files.js": {
"data": "Ly8gQ29weXJpZ2h0IDIwMTcgR29vZ2xlIExMQwovLwovLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgovLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLy8KLy8gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLy8KLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQovLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAovLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAovLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KCi8qKgogKiBAZmlsZW92ZXJ2aWV3IEhlbHBlcnMgZm9yIGdvb2dsZS5jb2xhYiBQeXRob24gbW9kdWxlLgogKi8KKGZ1bmN0aW9uKHNjb3BlKSB7CmZ1bmN0aW9uIHNwYW4odGV4dCwgc3R5bGVBdHRyaWJ1dGVzID0ge30pIHsKICBjb25zdCBlbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpOwogIGVsZW1lbnQudGV4dENvbnRlbnQgPSB0ZXh0OwogIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKHN0eWxlQXR0cmlidXRlcykpIHsKICAgIGVsZW1lbnQuc3R5bGVba2V5XSA9IHN0eWxlQXR0cmlidXRlc1trZXldOwogIH0KICByZXR1cm4gZWxlbWVudDsKfQoKLy8gTWF4IG51bWJlciBvZiBieXRlcyB3aGljaCB3aWxsIGJlIHVwbG9hZGVkIGF0IGEgdGltZS4KY29uc3QgTUFYX1BBWUxPQURfU0laRSA9IDEwMCAqIDEwMjQ7Ci8vIE1heCBhbW91bnQgb2YgdGltZSB0byBibG9jayB3YWl0aW5nIGZvciB0aGUgdXNlci4KY29uc3QgRklMRV9DSEFOR0VfVElNRU9VVF9NUyA9IDMwICogMTAwMDsKCmZ1bmN0aW9uIF91cGxvYWRGaWxlcyhpbnB1dElkLCBvdXRwdXRJZCkgewogIGNvbnN0IHN0ZXBzID0gdXBsb2FkRmlsZXNTdGVwKGlucHV0SWQsIG91dHB1dElkKTsKICBjb25zdCBvdXRwdXRFbGVtZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQob3V0cHV0SWQpOwogIC8vIENhY2hlIHN0ZXBzIG9uIHRoZSBvdXRwdXRFbGVtZW50IHRvIG1ha2UgaXQgYXZhaWxhYmxlIGZvciB0aGUgbmV4dCBjYWxsCiAgLy8gdG8gdXBsb2FkRmlsZXNDb250aW51ZSBmcm9tIFB5dGhvbi4KICBvdXRwdXRFbGVtZW50LnN0ZXBzID0gc3RlcHM7CgogIHJldHVybiBfdXBsb2FkRmlsZXNDb250aW51ZShvdXRwdXRJZCk7Cn0KCi8vIFRoaXMgaXMgcm91Z2hseSBhbiBhc3luYyBnZW5lcmF0b3IgKG5vdCBzdXBwb3J0ZWQgaW4gdGhlIGJyb3dzZXIgeWV0KSwKLy8gd2hlcmUgdGhlcmUgYXJlIG11bHRpcGxlIGFzeW5jaHJvbm91cyBzdGVwcyBhbmQgdGhlIFB5dGhvbiBzaWRlIGlzIGdvaW5nCi8vIHRvIHBvbGwgZm9yIGNvbXBsZXRpb24gb2YgZWFjaCBzdGVwLgovLyBUaGlzIHVzZXMgYSBQcm9taXNlIHRvIGJsb2NrIHRoZSBweXRob24gc2lkZSBvbiBjb21wbGV0aW9uIG9mIGVhY2ggc3RlcCwKLy8gdGhlbiBwYXNzZXMgdGhlIHJlc3VsdCBvZiB0aGUgcHJldmlvdXMgc3RlcCBhcyB0aGUgaW5wdXQgdG8gdGhlIG5leHQgc3RlcC4KZnVuY3Rpb24gX3VwbG9hZEZpbGVzQ29udGludWUob3V0cHV0SWQpIHsKICBjb25zdCBvdXRwdXRFbGVtZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQob3V0cHV0SWQpOwogIGNvbnN0IHN0ZXBzID0gb3V0cHV0RWxlbWVudC5zdGVwczsKCiAgY29uc3QgbmV4dCA9IHN0ZXBzLm5leHQob3V0cHV0RWxlbWVudC5sYXN0UHJvbWlzZVZhbHVlKTsKICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKG5leHQudmFsdWUucHJvbWlzZSkudGhlbigodmFsdWUpID0+IHsKICAgIC8vIENhY2hlIHRoZSBsYXN0IHByb21pc2UgdmFsdWUgdG8gbWFrZSBpdCBhdmFpbGFibGUgdG8gdGhlIG5leHQKICAgIC8vIHN0ZXAgb2YgdGhlIGdlbmVyYXRvci4KICAgIG91dHB1dEVsZW1lbnQubGFzdFByb21pc2VWYWx1ZSA9IHZhbHVlOwogICAgcmV0dXJuIG5leHQudmFsdWUucmVzcG9uc2U7CiAgfSk7Cn0KCi8qKgogKiBHZW5lcmF0b3IgZnVuY3Rpb24gd2hpY2ggaXMgY2FsbGVkIGJldHdlZW4gZWFjaCBhc3luYyBzdGVwIG9mIHRoZSB1cGxvYWQKICogcHJvY2Vzcy4KICogQHBhcmFtIHtzdHJpbmd9IGlucHV0SWQgRWxlbWVudCBJRCBvZiB0aGUgaW5wdXQgZmlsZSBwaWNrZXIgZWxlbWVudC4KICogQHBhcmFtIHtzdHJpbmd9IG91dHB1dElkIEVsZW1lbnQgSUQgb2YgdGhlIG91dHB1dCBkaXNwbGF5LgogKiBAcmV0dXJuIHshSXRlcmFibGU8IU9iamVjdD59IEl0ZXJhYmxlIG9mIG5leHQgc3RlcHMuCiAqLwpmdW5jdGlvbiogdXBsb2FkRmlsZXNTdGVwKGlucHV0SWQsIG91dHB1dElkKSB7CiAgY29uc3QgaW5wdXRFbGVtZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaW5wdXRJZCk7CiAgaW5wdXRFbGVtZW50LmRpc2FibGVkID0gZmFsc2U7CgogIGNvbnN0IG91dHB1dEVsZW1lbnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChvdXRwdXRJZCk7CiAgb3V0cHV0RWxlbWVudC5pbm5lckhUTUwgPSAnJzsKCiAgY29uc3QgcGlja2VkUHJvbWlzZSA9IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7CiAgICBpbnB1dEVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgKGUpID0+IHsKICAgICAgcmVzb2x2ZShlLnRhcmdldC5maWxlcyk7CiAgICB9KTsKICB9KTsKCiAgY29uc3QgY2FuY2VsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYnV0dG9uJyk7CiAgaW5wdXRFbGVtZW50LnBhcmVudEVsZW1lbnQuYXBwZW5kQ2hpbGQoY2FuY2VsKTsKICBjYW5jZWwudGV4dENvbnRlbnQgPSAnQ2FuY2VsIHVwbG9hZCc7CiAgY29uc3QgY2FuY2VsUHJvbWlzZSA9IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7CiAgICBjYW5jZWwub25jbGljayA9ICgpID0+IHsKICAgICAgcmVzb2x2ZShudWxsKTsKICAgIH07CiAgfSk7CgogIC8vIENhbmNlbCB1cGxvYWQgaWYgdXNlciBoYXNuJ3QgcGlja2VkIGFueXRoaW5nIGluIHRpbWVvdXQuCiAgY29uc3QgdGltZW91dFByb21pc2UgPSBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4gewogICAgc2V0VGltZW91dCgoKSA9PiB7CiAgICAgIHJlc29sdmUobnVsbCk7CiAgICB9LCBGSUxFX0NIQU5HRV9USU1FT1VUX01TKTsKICB9KTsKCiAgLy8gV2FpdCBmb3IgdGhlIHVzZXIgdG8gcGljayB0aGUgZmlsZXMuCiAgY29uc3QgZmlsZXMgPSB5aWVsZCB7CiAgICBwcm9taXNlOiBQcm9taXNlLnJhY2UoW3BpY2tlZFByb21pc2UsIHRpbWVvdXRQcm9taXNlLCBjYW5jZWxQcm9taXNlXSksCiAgICByZXNwb25zZTogewogICAgICBhY3Rpb246ICdzdGFydGluZycsCiAgICB9CiAgfTsKCiAgaWYgKCFmaWxlcykgewogICAgcmV0dXJuIHsKICAgICAgcmVzcG9uc2U6IHsKICAgICAgICBhY3Rpb246ICdjb21wbGV0ZScsCiAgICAgIH0KICAgIH07CiAgfQoKICBjYW5jZWwucmVtb3ZlKCk7CgogIC8vIERpc2FibGUgdGhlIGlucHV0IGVsZW1lbnQgc2luY2UgZnVydGhlciBwaWNrcyBhcmUgbm90IGFsbG93ZWQuCiAgaW5wdXRFbGVtZW50LmRpc2FibGVkID0gdHJ1ZTsKCiAgZm9yIChjb25zdCBmaWxlIG9mIGZpbGVzKSB7CiAgICBjb25zdCBsaSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2xpJyk7CiAgICBsaS5hcHBlbmQoc3BhbihmaWxlLm5hbWUsIHtmb250V2VpZ2h0OiAnYm9sZCd9KSk7CiAgICBsaS5hcHBlbmQoc3BhbigKICAgICAgICBgKCR7ZmlsZS50eXBlIHx8ICduL2EnfSkgLSAke2ZpbGUuc2l6ZX0gYnl0ZXMsIGAgKwogICAgICAgIGBsYXN0IG1vZGlmaWVkOiAkewogICAgICAgICAgICBmaWxlLmxhc3RNb2RpZmllZERhdGUgPyBmaWxlLmxhc3RNb2RpZmllZERhdGUudG9Mb2NhbGVEYXRlU3RyaW5nKCkgOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbi9hJ30gLSBgKSk7CiAgICBjb25zdCBwZXJjZW50ID0gc3BhbignMCUgZG9uZScpOwogICAgbGkuYXBwZW5kQ2hpbGQocGVyY2VudCk7CgogICAgb3V0cHV0RWxlbWVudC5hcHBlbmRDaGlsZChsaSk7CgogICAgY29uc3QgZmlsZURhdGFQcm9taXNlID0gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHsKICAgICAgY29uc3QgcmVhZGVyID0gbmV3IEZpbGVSZWFkZXIoKTsKICAgICAgcmVhZGVyLm9ubG9hZCA9IChlKSA9PiB7CiAgICAgICAgcmVzb2x2ZShlLnRhcmdldC5yZXN1bHQpOwogICAgICB9OwogICAgICByZWFkZXIucmVhZEFzQXJyYXlCdWZmZXIoZmlsZSk7CiAgICB9KTsKICAgIC8vIFdhaXQgZm9yIHRoZSBkYXRhIHRvIGJlIHJlYWR5LgogICAgbGV0IGZpbGVEYXRhID0geWllbGQgewogICAgICBwcm9taXNlOiBmaWxlRGF0YVByb21pc2UsCiAgICAgIHJlc3BvbnNlOiB7CiAgICAgICAgYWN0aW9uOiAnY29udGludWUnLAogICAgICB9CiAgICB9OwoKICAgIC8vIFVzZSBhIGNodW5rZWQgc2VuZGluZyB0byBhdm9pZCBtZXNzYWdlIHNpemUgbGltaXRzLiBTZWUgYi82MjExNTY2MC4KICAgIGxldCBwb3NpdGlvbiA9IDA7CiAgICB3aGlsZSAocG9zaXRpb24gPCBmaWxlRGF0YS5ieXRlTGVuZ3RoKSB7CiAgICAgIGNvbnN0IGxlbmd0aCA9IE1hdGgubWluKGZpbGVEYXRhLmJ5dGVMZW5ndGggLSBwb3NpdGlvbiwgTUFYX1BBWUxPQURfU0laRSk7CiAgICAgIGNvbnN0IGNodW5rID0gbmV3IFVpbnQ4QXJyYXkoZmlsZURhdGEsIHBvc2l0aW9uLCBsZW5ndGgpOwogICAgICBwb3NpdGlvbiArPSBsZW5ndGg7CgogICAgICBjb25zdCBiYXNlNjQgPSBidG9hKFN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkobnVsbCwgY2h1bmspKTsKICAgICAgeWllbGQgewogICAgICAgIHJlc3BvbnNlOiB7CiAgICAgICAgICBhY3Rpb246ICdhcHBlbmQnLAogICAgICAgICAgZmlsZTogZmlsZS5uYW1lLAogICAgICAgICAgZGF0YTogYmFzZTY0LAogICAgICAgIH0sCiAgICAgIH07CiAgICAgIHBlcmNlbnQudGV4dENvbnRlbnQgPQogICAgICAgICAgYCR7TWF0aC5yb3VuZCgocG9zaXRpb24gLyBmaWxlRGF0YS5ieXRlTGVuZ3RoKSAqIDEwMCl9JSBkb25lYDsKICAgIH0KICB9CgogIC8vIEFsbCBkb25lLgogIHlpZWxkIHsKICAgIHJlc3BvbnNlOiB7CiAgICAgIGFjdGlvbjogJ2NvbXBsZXRlJywKICAgIH0KICB9Owp9CgpzY29wZS5nb29nbGUgPSBzY29wZS5nb29nbGUgfHwge307CnNjb3BlLmdvb2dsZS5jb2xhYiA9IHNjb3BlLmdvb2dsZS5jb2xhYiB8fCB7fTsKc2NvcGUuZ29vZ2xlLmNvbGFiLl9maWxlcyA9IHsKICBfdXBsb2FkRmlsZXMsCiAgX3VwbG9hZEZpbGVzQ29udGludWUsCn07Cn0pKHNlbGYpOwo=",
"ok": true,
"headers": [
[
"content-type",
"application/javascript"
]
],
"status": 200,
"status_text": ""
}
},
"base_uri": "https://localhost:8080/",
"height": 75
}
},
"source": [
"# Dataset:\n",
"# https://www.kaggle.com/tmdb/tmdb-movie-metadata/downloads/tmdb-5000-movie-dataset.zip/2\n",
"\n",
"from google.colab import files\n",
"uploaded = files.upload()\n",
"\n",
"credits = pd.read_csv(\"tmdb_5000_credits.csv\")"
],
"execution_count": 2,
"outputs": [
{
"output_type": "display_data",
"data": {
"text/html": [
"\n",
" <input type=\"file\" id=\"files-2c35a73f-994b-4ed1-bd0a-9a1adeaefb34\" name=\"files[]\" multiple disabled />\n",
" <output id=\"result-2c35a73f-994b-4ed1-bd0a-9a1adeaefb34\">\n",
" Upload widget is only available when the cell has been executed in the\n",
" current browser session. Please rerun this cell to enable.\n",
" </output>\n",
" <script src=\"/nbextensions/google.colab/files.js\"></script> "
],
"text/plain": [
"<IPython.core.display.HTML object>"
]
},
"metadata": {
"tags": []
}
},
{
"output_type": "stream",
"text": [
"Saving tmdb_5000_credits.csv to tmdb_5000_credits.csv\n"
],
"name": "stdout"
}
]
},
{
"cell_type": "code",
"metadata": {
"id": "hAoJBd_aH5E3",
"colab_type": "code",
"outputId": "16798006-11ed-4c33-b569-89d383477b7a",
"colab": {
"resources": {
"http://localhost:8080/nbextensions/google.colab/files.js": {
"data": "Ly8gQ29weXJpZ2h0IDIwMTcgR29vZ2xlIExMQwovLwovLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgovLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLy8KLy8gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLy8KLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQovLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAovLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAovLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KCi8qKgogKiBAZmlsZW92ZXJ2aWV3IEhlbHBlcnMgZm9yIGdvb2dsZS5jb2xhYiBQeXRob24gbW9kdWxlLgogKi8KKGZ1bmN0aW9uKHNjb3BlKSB7CmZ1bmN0aW9uIHNwYW4odGV4dCwgc3R5bGVBdHRyaWJ1dGVzID0ge30pIHsKICBjb25zdCBlbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpOwogIGVsZW1lbnQudGV4dENvbnRlbnQgPSB0ZXh0OwogIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKHN0eWxlQXR0cmlidXRlcykpIHsKICAgIGVsZW1lbnQuc3R5bGVba2V5XSA9IHN0eWxlQXR0cmlidXRlc1trZXldOwogIH0KICByZXR1cm4gZWxlbWVudDsKfQoKLy8gTWF4IG51bWJlciBvZiBieXRlcyB3aGljaCB3aWxsIGJlIHVwbG9hZGVkIGF0IGEgdGltZS4KY29uc3QgTUFYX1BBWUxPQURfU0laRSA9IDEwMCAqIDEwMjQ7Ci8vIE1heCBhbW91bnQgb2YgdGltZSB0byBibG9jayB3YWl0aW5nIGZvciB0aGUgdXNlci4KY29uc3QgRklMRV9DSEFOR0VfVElNRU9VVF9NUyA9IDMwICogMTAwMDsKCmZ1bmN0aW9uIF91cGxvYWRGaWxlcyhpbnB1dElkLCBvdXRwdXRJZCkgewogIGNvbnN0IHN0ZXBzID0gdXBsb2FkRmlsZXNTdGVwKGlucHV0SWQsIG91dHB1dElkKTsKICBjb25zdCBvdXRwdXRFbGVtZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQob3V0cHV0SWQpOwogIC8vIENhY2hlIHN0ZXBzIG9uIHRoZSBvdXRwdXRFbGVtZW50IHRvIG1ha2UgaXQgYXZhaWxhYmxlIGZvciB0aGUgbmV4dCBjYWxsCiAgLy8gdG8gdXBsb2FkRmlsZXNDb250aW51ZSBmcm9tIFB5dGhvbi4KICBvdXRwdXRFbGVtZW50LnN0ZXBzID0gc3RlcHM7CgogIHJldHVybiBfdXBsb2FkRmlsZXNDb250aW51ZShvdXRwdXRJZCk7Cn0KCi8vIFRoaXMgaXMgcm91Z2hseSBhbiBhc3luYyBnZW5lcmF0b3IgKG5vdCBzdXBwb3J0ZWQgaW4gdGhlIGJyb3dzZXIgeWV0KSwKLy8gd2hlcmUgdGhlcmUgYXJlIG11bHRpcGxlIGFzeW5jaHJvbm91cyBzdGVwcyBhbmQgdGhlIFB5dGhvbiBzaWRlIGlzIGdvaW5nCi8vIHRvIHBvbGwgZm9yIGNvbXBsZXRpb24gb2YgZWFjaCBzdGVwLgovLyBUaGlzIHVzZXMgYSBQcm9taXNlIHRvIGJsb2NrIHRoZSBweXRob24gc2lkZSBvbiBjb21wbGV0aW9uIG9mIGVhY2ggc3RlcCwKLy8gdGhlbiBwYXNzZXMgdGhlIHJlc3VsdCBvZiB0aGUgcHJldmlvdXMgc3RlcCBhcyB0aGUgaW5wdXQgdG8gdGhlIG5leHQgc3RlcC4KZnVuY3Rpb24gX3VwbG9hZEZpbGVzQ29udGludWUob3V0cHV0SWQpIHsKICBjb25zdCBvdXRwdXRFbGVtZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQob3V0cHV0SWQpOwogIGNvbnN0IHN0ZXBzID0gb3V0cHV0RWxlbWVudC5zdGVwczsKCiAgY29uc3QgbmV4dCA9IHN0ZXBzLm5leHQob3V0cHV0RWxlbWVudC5sYXN0UHJvbWlzZVZhbHVlKTsKICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKG5leHQudmFsdWUucHJvbWlzZSkudGhlbigodmFsdWUpID0+IHsKICAgIC8vIENhY2hlIHRoZSBsYXN0IHByb21pc2UgdmFsdWUgdG8gbWFrZSBpdCBhdmFpbGFibGUgdG8gdGhlIG5leHQKICAgIC8vIHN0ZXAgb2YgdGhlIGdlbmVyYXRvci4KICAgIG91dHB1dEVsZW1lbnQubGFzdFByb21pc2VWYWx1ZSA9IHZhbHVlOwogICAgcmV0dXJuIG5leHQudmFsdWUucmVzcG9uc2U7CiAgfSk7Cn0KCi8qKgogKiBHZW5lcmF0b3IgZnVuY3Rpb24gd2hpY2ggaXMgY2FsbGVkIGJldHdlZW4gZWFjaCBhc3luYyBzdGVwIG9mIHRoZSB1cGxvYWQKICogcHJvY2Vzcy4KICogQHBhcmFtIHtzdHJpbmd9IGlucHV0SWQgRWxlbWVudCBJRCBvZiB0aGUgaW5wdXQgZmlsZSBwaWNrZXIgZWxlbWVudC4KICogQHBhcmFtIHtzdHJpbmd9IG91dHB1dElkIEVsZW1lbnQgSUQgb2YgdGhlIG91dHB1dCBkaXNwbGF5LgogKiBAcmV0dXJuIHshSXRlcmFibGU8IU9iamVjdD59IEl0ZXJhYmxlIG9mIG5leHQgc3RlcHMuCiAqLwpmdW5jdGlvbiogdXBsb2FkRmlsZXNTdGVwKGlucHV0SWQsIG91dHB1dElkKSB7CiAgY29uc3QgaW5wdXRFbGVtZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaW5wdXRJZCk7CiAgaW5wdXRFbGVtZW50LmRpc2FibGVkID0gZmFsc2U7CgogIGNvbnN0IG91dHB1dEVsZW1lbnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChvdXRwdXRJZCk7CiAgb3V0cHV0RWxlbWVudC5pbm5lckhUTUwgPSAnJzsKCiAgY29uc3QgcGlja2VkUHJvbWlzZSA9IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7CiAgICBpbnB1dEVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgKGUpID0+IHsKICAgICAgcmVzb2x2ZShlLnRhcmdldC5maWxlcyk7CiAgICB9KTsKICB9KTsKCiAgY29uc3QgY2FuY2VsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYnV0dG9uJyk7CiAgaW5wdXRFbGVtZW50LnBhcmVudEVsZW1lbnQuYXBwZW5kQ2hpbGQoY2FuY2VsKTsKICBjYW5jZWwudGV4dENvbnRlbnQgPSAnQ2FuY2VsIHVwbG9hZCc7CiAgY29uc3QgY2FuY2VsUHJvbWlzZSA9IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7CiAgICBjYW5jZWwub25jbGljayA9ICgpID0+IHsKICAgICAgcmVzb2x2ZShudWxsKTsKICAgIH07CiAgfSk7CgogIC8vIENhbmNlbCB1cGxvYWQgaWYgdXNlciBoYXNuJ3QgcGlja2VkIGFueXRoaW5nIGluIHRpbWVvdXQuCiAgY29uc3QgdGltZW91dFByb21pc2UgPSBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4gewogICAgc2V0VGltZW91dCgoKSA9PiB7CiAgICAgIHJlc29sdmUobnVsbCk7CiAgICB9LCBGSUxFX0NIQU5HRV9USU1FT1VUX01TKTsKICB9KTsKCiAgLy8gV2FpdCBmb3IgdGhlIHVzZXIgdG8gcGljayB0aGUgZmlsZXMuCiAgY29uc3QgZmlsZXMgPSB5aWVsZCB7CiAgICBwcm9taXNlOiBQcm9taXNlLnJhY2UoW3BpY2tlZFByb21pc2UsIHRpbWVvdXRQcm9taXNlLCBjYW5jZWxQcm9taXNlXSksCiAgICByZXNwb25zZTogewogICAgICBhY3Rpb246ICdzdGFydGluZycsCiAgICB9CiAgfTsKCiAgaWYgKCFmaWxlcykgewogICAgcmV0dXJuIHsKICAgICAgcmVzcG9uc2U6IHsKICAgICAgICBhY3Rpb246ICdjb21wbGV0ZScsCiAgICAgIH0KICAgIH07CiAgfQoKICBjYW5jZWwucmVtb3ZlKCk7CgogIC8vIERpc2FibGUgdGhlIGlucHV0IGVsZW1lbnQgc2luY2UgZnVydGhlciBwaWNrcyBhcmUgbm90IGFsbG93ZWQuCiAgaW5wdXRFbGVtZW50LmRpc2FibGVkID0gdHJ1ZTsKCiAgZm9yIChjb25zdCBmaWxlIG9mIGZpbGVzKSB7CiAgICBjb25zdCBsaSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2xpJyk7CiAgICBsaS5hcHBlbmQoc3BhbihmaWxlLm5hbWUsIHtmb250V2VpZ2h0OiAnYm9sZCd9KSk7CiAgICBsaS5hcHBlbmQoc3BhbigKICAgICAgICBgKCR7ZmlsZS50eXBlIHx8ICduL2EnfSkgLSAke2ZpbGUuc2l6ZX0gYnl0ZXMsIGAgKwogICAgICAgIGBsYXN0IG1vZGlmaWVkOiAkewogICAgICAgICAgICBmaWxlLmxhc3RNb2RpZmllZERhdGUgPyBmaWxlLmxhc3RNb2RpZmllZERhdGUudG9Mb2NhbGVEYXRlU3RyaW5nKCkgOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbi9hJ30gLSBgKSk7CiAgICBjb25zdCBwZXJjZW50ID0gc3BhbignMCUgZG9uZScpOwogICAgbGkuYXBwZW5kQ2hpbGQocGVyY2VudCk7CgogICAgb3V0cHV0RWxlbWVudC5hcHBlbmRDaGlsZChsaSk7CgogICAgY29uc3QgZmlsZURhdGFQcm9taXNlID0gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHsKICAgICAgY29uc3QgcmVhZGVyID0gbmV3IEZpbGVSZWFkZXIoKTsKICAgICAgcmVhZGVyLm9ubG9hZCA9IChlKSA9PiB7CiAgICAgICAgcmVzb2x2ZShlLnRhcmdldC5yZXN1bHQpOwogICAgICB9OwogICAgICByZWFkZXIucmVhZEFzQXJyYXlCdWZmZXIoZmlsZSk7CiAgICB9KTsKICAgIC8vIFdhaXQgZm9yIHRoZSBkYXRhIHRvIGJlIHJlYWR5LgogICAgbGV0IGZpbGVEYXRhID0geWllbGQgewogICAgICBwcm9taXNlOiBmaWxlRGF0YVByb21pc2UsCiAgICAgIHJlc3BvbnNlOiB7CiAgICAgICAgYWN0aW9uOiAnY29udGludWUnLAogICAgICB9CiAgICB9OwoKICAgIC8vIFVzZSBhIGNodW5rZWQgc2VuZGluZyB0byBhdm9pZCBtZXNzYWdlIHNpemUgbGltaXRzLiBTZWUgYi82MjExNTY2MC4KICAgIGxldCBwb3NpdGlvbiA9IDA7CiAgICB3aGlsZSAocG9zaXRpb24gPCBmaWxlRGF0YS5ieXRlTGVuZ3RoKSB7CiAgICAgIGNvbnN0IGxlbmd0aCA9IE1hdGgubWluKGZpbGVEYXRhLmJ5dGVMZW5ndGggLSBwb3NpdGlvbiwgTUFYX1BBWUxPQURfU0laRSk7CiAgICAgIGNvbnN0IGNodW5rID0gbmV3IFVpbnQ4QXJyYXkoZmlsZURhdGEsIHBvc2l0aW9uLCBsZW5ndGgpOwogICAgICBwb3NpdGlvbiArPSBsZW5ndGg7CgogICAgICBjb25zdCBiYXNlNjQgPSBidG9hKFN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkobnVsbCwgY2h1bmspKTsKICAgICAgeWllbGQgewogICAgICAgIHJlc3BvbnNlOiB7CiAgICAgICAgICBhY3Rpb246ICdhcHBlbmQnLAogICAgICAgICAgZmlsZTogZmlsZS5uYW1lLAogICAgICAgICAgZGF0YTogYmFzZTY0LAogICAgICAgIH0sCiAgICAgIH07CiAgICAgIHBlcmNlbnQudGV4dENvbnRlbnQgPQogICAgICAgICAgYCR7TWF0aC5yb3VuZCgocG9zaXRpb24gLyBmaWxlRGF0YS5ieXRlTGVuZ3RoKSAqIDEwMCl9JSBkb25lYDsKICAgIH0KICB9CgogIC8vIEFsbCBkb25lLgogIHlpZWxkIHsKICAgIHJlc3BvbnNlOiB7CiAgICAgIGFjdGlvbjogJ2NvbXBsZXRlJywKICAgIH0KICB9Owp9CgpzY29wZS5nb29nbGUgPSBzY29wZS5nb29nbGUgfHwge307CnNjb3BlLmdvb2dsZS5jb2xhYiA9IHNjb3BlLmdvb2dsZS5jb2xhYiB8fCB7fTsKc2NvcGUuZ29vZ2xlLmNvbGFiLl9maWxlcyA9IHsKICBfdXBsb2FkRmlsZXMsCiAgX3VwbG9hZEZpbGVzQ29udGludWUsCn07Cn0pKHNlbGYpOwo=",
"ok": true,
"headers": [
[
"content-type",
"application/javascript"
]
],
"status": 200,
"status_text": ""
}
},
"base_uri": "https://localhost:8080/",
"height": 75
}
},
"source": [
"from google.colab import files\n",
"uploaded = files.upload()\n",
"\n",
"movies_incomplete = pd.read_csv(\"tmdb_5000_movies.csv\")"
],
"execution_count": 3,
"outputs": [
{
"output_type": "display_data",
"data": {
"text/html": [
"\n",
" <input type=\"file\" id=\"files-70512018-34de-4073-8352-ac1f083d9b86\" name=\"files[]\" multiple disabled />\n",
" <output id=\"result-70512018-34de-4073-8352-ac1f083d9b86\">\n",
" Upload widget is only available when the cell has been executed in the\n",
" current browser session. Please rerun this cell to enable.\n",
" </output>\n",
" <script src=\"/nbextensions/google.colab/files.js\"></script> "
],
"text/plain": [
"<IPython.core.display.HTML object>"
]
},
"metadata": {
"tags": []
}
},
{
"output_type": "stream",
"text": [
"Saving tmdb_5000_movies.csv to tmdb_5000_movies.csv\n"
],
"name": "stdout"
}
]
},
{
"cell_type": "code",
"metadata": {
"id": "F744Tnj5QkBu",
"colab_type": "code",
"outputId": "b68a1173-d653-4cbd-faec-5e423027fed8",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 52
}
},
"source": [
"# Shapes of dataframes\n",
"print(\"credits:\", credits.shape)\n",
"print(\"movies_incomplete:\",movies_incomplete.shape)"
],
"execution_count": 4,
"outputs": [
{
"output_type": "stream",
"text": [
"credits: (4803, 4)\n",
"movies_incomplete: (4803, 20)\n"
],
"name": "stdout"
}
]
},
{
"cell_type": "code",
"metadata": {
"id": "3044MC7tSZSI",
"colab_type": "code",
"colab": {}
},
"source": [
"# Credit to Ibtesam Ahmed for her kernel:\n",
"# https://www.kaggle.com/ibtesama/getting-started-with-a-movie-recommendation-system\n",
"\n",
"credits_renamed = credits.rename(index=str, columns={\"movie_id\": \"id\"})\n",
"movies_dirty = movies_incomplete.merge(credits_renamed, on='id')\n",
"movies_dirty.head()"
],
"execution_count": 0,
"outputs": []
},
{
"cell_type": "code",
"metadata": {
"id": "7yIAWFsoUeV9",
"colab_type": "code",
"colab": {}
},
"source": [
"movies_clean = movies_dirty.drop(columns=['homepage', 'title_x', 'title_y', 'status','production_countries'])\n",
"movies_clean.head()"
],
"execution_count": 0,
"outputs": []
},
{
"cell_type": "markdown",
"metadata": {
"id": "-2bIjqLePmxg",
"colab_type": "text"
},
"source": [
"# Basic Recommender Systems"
]
},
{
"cell_type": "code",
"metadata": {
"id": "sS9GWwKAsciL",
"colab_type": "code",
"colab": {}
},
"source": [
"V = movies_clean['vote_count']\n",
"R = movies_clean['vote_average']\n",
"C = movies_clean['vote_average'].mean()\n",
"m = movies_clean['vote_count'].quantile(0.70)\n",
"\n",
"movies_clean['weighted_average'] = (V/(V+m) * R) + (m/(m+V) * C)"
],
"execution_count": 0,
"outputs": []
},
{
"cell_type": "code",
"metadata": {
"id": "He-6Pt3jtKcf",
"colab_type": "code",
"colab": {}
},
"source": [
"movies_ranked = movies_clean.sort_values('weighted_average', ascending=False)\n",
"movies_ranked[['original_title', 'vote_count', 'vote_average', 'weighted_average', 'popularity']].head(20)"
],
"execution_count": 0,
"outputs": []
},
{
"cell_type": "code",
"metadata": {
"id": "QvZecUS2vPEu",
"colab_type": "code",
"outputId": "cdada802-8894-4f6f-b2b8-072972f3edd2",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 405
}
},
"source": [
"import matplotlib.pyplot as plt\n",
"import seaborn as sns\n",
"\n",
"wavg = movies_ranked.sort_values('weighted_average', ascending=False)\n",
"\n",
"plt.figure(figsize=(16,6))\n",
"\n",
"ax = sns.barplot(x=wavg['weighted_average'].head(10), y=wavg['original_title'].head(10), data=wavg, palette='deep')\n",
"\n",
"plt.xlim(6.75, 8.35)\n",
"plt.title('\"Best\" Movies by TMDB Votes', weight='bold')\n",
"plt.xlabel('Weighted Average Score', weight='bold')\n",
"plt.ylabel('Movie Title', weight='bold')\n",
"\n",
"plt.savefig('best_movies.png')"
],
"execution_count": 66,
"outputs": [
{
"output_type": "display_data",
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 1152x432 with 1 Axes>"
]
},
"metadata": {
"tags": []
}
}
]
},
{
"cell_type": "code",
"metadata": {
"id": "c-l0BOrcwy_9",
"colab_type": "code",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 425
},
"outputId": "6258df5c-2fe8-4fd2-e805-5ac9097e29fe"
},
"source": [
"popular = movies_ranked.sort_values('popularity', ascending=False)\n",
"\n",
"plt.figure(figsize=(16,6))\n",
"\n",
"ax = sns.barplot(x=popular['popularity'].head(10), y=popular['original_title'].head(10), data=popular, palette='deep')\n",
"\n",
"plt.title('\"Most Popular\" Movies by TMDB Votes', weight='bold')\n",
"plt.xlabel('Popularity Score', weight='bold')\n",
"plt.ylabel('Movie Title', weight='bold')\n",
"\n",
"plt.savefig('popular_movies.png')"
],
"execution_count": 67,
"outputs": [
{
"output_type": "display_data",
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAABLAAAAGDCAYAAAA79+lrAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDMuMC4zLCBo\ndHRwOi8vbWF0cGxvdGxpYi5vcmcvnQurowAAIABJREFUeJzs3Xe4XVWd//H3h6J0UEBERGNBFCkB\nIirFARUdcRRRFBUdgwhWEGz87KhjAx2HoiKDdBBEEFEZxEEivSQQEuowAo69i1JUhO/vj72OObnc\nlnJzD8n79Tx57j5rr73Wd+9zrnK/z3etk6pCkiRJkiRJGlTLTXYAkiRJkiRJ0mhMYEmSJEmSJGmg\nmcCSJEmSJEnSQDOBJUmSJEmSpIFmAkuSJEmSJEkDzQSWJEmSJEmSBpoJLEmSJD1kJZmepJLMmOxY\nJkqS49s9HjwBY09pY9fiHluSpMXJBJYkSdKASHJHkoOT7NiSClNaey+BUUk+1Nd/1SR39p2bshhi\n6M19xxj9Du6bt5Lcm+SGJPstagyTpd3H9F5SbJR+S+z9aM4HDgOuWEzjTZi+hOJI/2a0fr3X9yd5\nXN/1rxvad5j+f05ya5Ljkjx1yPz9c92X5GdJTkyyzgjxntj6Hj+k/dFJ/t7ObTaO+x7X740kaeGZ\nwJIkSXpo2SdJ77/hXgusMZnBALfRJVe+CzwNODzJPpMb0oJJsuIiXD7h70dVnVpVB1TVeYt77Alw\nI93n4TDgotb2s762bwzpvxywb9/rt44x/mnA2cDDgenArCTbD9PvVOAr7fj1wCEjjHdy+7lbkpX6\n2vcAlgfmVNXcMWKSJC0BJrAkSZIeOv4APA54cXv91tY2n1YJdGiSHyW5K8nsJK/vO79VkouT/Kmd\nvz7JW5PsCFzYuj1+nEvL5rbkyu50SSyAXcYZR6+K64wkpya5O8mNSZ7X12e+aqa+a44fLpgk6ye5\nKMlvWwXOb5KcnGStdn5K35hvSfJzugqnhbHI70eSJyZ5IMnveom0JL1n/7skD8swSwiTvDHJdW28\nW5N8IMkKffd4XpI/pKuMuyXJx8a6mVb99NP2zA5JsnySDVvV0529BE97xg/0t/VU1VXt83AA8M3W\n/L+9tqo6cphnuHeSFZNsDmw73DPsc2hVvR54Kl2CbBXgmBH6vQP4THv91GH6AFwA/IIu8bhLX/tr\n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\n",
"text/plain": [
"<Figure size 1152x432 with 1 Axes>"
]
},
"metadata": {
"tags": []
}
}
]
},
{
"cell_type": "code",
"metadata": {
"id": "AG69WtuD0os4",
"colab_type": "code",
"colab": {}
},
"source": [
"# My own recommender system\n",
"# half/half recommendation based on scaled weighted average & popularity score\n",
"\n",
"from sklearn import preprocessing\n",
"\n",
"min_max_scaler = preprocessing.MinMaxScaler()\n",
"movies_scaled = min_max_scaler.fit_transform(movies_clean[['weighted_average', 'popularity']])\n",
"movies_norm = pd.DataFrame(movies_scaled, columns=['weighted_average', 'popularity'])\n",
"movies_norm.head()"
],
"execution_count": 0,
"outputs": []
},
{
"cell_type": "code",
"metadata": {
"id": "0apzOdU3znSE",
"colab_type": "code",
"colab": {}
},
"source": [
"movies_clean[['norm_weighted_average', 'norm_popularity']] = movies_norm"
],
"execution_count": 0,
"outputs": []
},
{
"cell_type": "code",
"metadata": {
"id": "i-xJveAf0CCw",
"colab_type": "code",
"colab": {}
},
"source": [
"movies_clean['score'] = movies_clean['norm_weighted_average'] * 0.5 + movies_clean['norm_popularity'] * 0.5\n",
"movies_scored = movies_clean.sort_values(['score'], ascending=False)\n",
"movies_scored[['original_title', 'norm_weighted_average', 'norm_popularity', 'score']].head(20)"
],
"execution_count": 0,
"outputs": []
},
{
"cell_type": "code",
"metadata": {
"id": "Z6w9qb_Y42cF",
"colab_type": "code",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 405
},
"outputId": "2fa89a33-7a7e-4745-a40b-eda45f6a3ff8"
},
"source": [
"scored = movies_clean.sort_values('score', ascending=False)\n",
"\n",
"plt.figure(figsize=(16,6))\n",
"\n",
"ax = sns.barplot(x=scored['score'].head(10), y=scored['original_title'].head(10), data=scored, palette='deep')\n",
"\n",
"#plt.xlim(3.55, 5.25)\n",
"plt.title('Best Rated & Most Popular Blend', weight='bold')\n",
"plt.xlabel('Score', weight='bold')\n",
"plt.ylabel('Movie Title', weight='bold')\n",
"\n",
"plt.savefig('scored_movies.png')"
],
"execution_count": 68,
"outputs": [
{
"output_type": "display_data",
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAABDEAAAGDCAYAAAAyMItUAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDMuMC4zLCBo\ndHRwOi8vbWF0cGxvdGxpYi5vcmcvnQurowAAIABJREFUeJzs3Xu87mOd//HX26GcKSQkG6PkHJuZ\nSNF0mE6odDSFMelIlNJhBpmmZlRjEh0kVCijZAyNdGCcD3uz7e1UfqGDklTklGr7/P74Xnduq7XW\nvfZxudd+PR+P9bi/h+t7XZ/vd6/Hg/uzPtf1TVUhSZIkSZL0WLfUZAcgSZIkSZI0ESYxJEmSJEnS\nUDCJIUmSJEmShoJJDEmSJEmSNBRMYkiSJEmSpKFgEkOSJEmSJA0FkxiSJGmJkWTvJJVk1mTHsqRp\nz72STJuEsQ9vY5+0CMfYuY1x96IaQ5JkEkOSpCkryW19XxznJrkjyTeTbLiQ+p/QF8MkF/TF8XCS\nO5OcleRp8zBWL/lwwYLGPcHxNkxybpJ7k9yd5OIkawy4Zue++/xhkvSdO77v3OELKcbev+/O47SZ\n1jdu7/fgZ0lOSvLkhRHHZOv7Pez93JNkZpLXTXZskqSFzySGJElT39nAscA9wO7A8ZMUx4XAZ1oc\nLwe+NElxTMSJwIuAOcCZwFOBlebh+o2BvwVIsirw+oUd4Hz4HHAcsCywF/CNyQ1n3iRZKsl4/+96\nC/Ap4AJgG+DkJBssjtgkSYuPSQxJkqa+L1bVAcDBbX+T3okkqyf5fPur/r1JLkmyU9/5NyS5IcmD\nSX6T5LIkz27VBIe1ZntNsErim1X1TuAf2/5WfeP8fRvn3iR/aJUMb2/n9qZLKgA8t4112wTjXyfJ\neUnuT3IRMNEvtU9vnx+tqr3bdT+b4LUPAQ8Cb2v7ewErAL8d2TDJK5Jc1WL/cZJjk6zWzj0uyRda\nBc1DSX6a5H/auduA9Vs357dnsveAuD5QVW8D3t72d+gba7w4+qs59k1ye5JfJTkyydKtzUn9VSb9\n14wVTJJPtn+33yd5IMnl/VUlfRU8/57kCuAPdMmkscypqgOrajfgN8DSdMmkscbfNcmVSX7X7vmT\nSVZo53pVNbcl+WC66qE7k7y37/pVk5zWrr+WLnEiSVrETGJIkjT17ZvkaODItv8N6P6yDfw3sB/w\nE+C/gC2A85I8PcnywEl0X5ZPAc4BVgE2Ai4Hrmj93Uj3F/CvDwokyTLAdm13dt+p9en+kn4ycBrw\nFOCYJM8CbgC+09rd3sY6YVD8rf2pwAva+VuBQwbF2FzSPj+T5ClVNbeq/jTBa3/f7mHXJOsAbwV+\nBFzU3yjJS4AzgC3b5710CYavtSZvokv43AV8EZgJ7NDOndDaQ/fv+Sm65zSuJI8HduyL874JxNHv\nQ8C3geWB9/JIQmR+bED3O/RF4Hzgr4HTk6w8ot17gTuBr9IliMayRZL/THIm8ES6pNOVozVM8iK6\n350NgG+2tu+mq1jqtz7w98DFwJrAvyfpJUaOBl5DV1k0Ezh0wP1KkhYCkxiSJE19LwP2p6vAeIju\nCxfAtnRfaO8Frm6f/w9YDtiH7i/ZS9NVEJwJHFZVmwEnV9W5wLmtnyvbX8CPGRDHUcAfgY8D1wFv\n6Dv3cbqEyR10X9p/CgTYpaqupEtGAPy/NtYRg+JP8hTgue26F1bVm/jLL6l/Icn7gVfSJWXWo0uK\nrJ5kj/bX+YkkQj4LLNPu6RnA54GRVQnvbJ8fraq9gJ2BPwEvSrdeyLLt/By6JNI+wJMA2v3/pp0/\npj2TUb+w9/ktXeLioLZ/aEvMDIqj3yuq6h/okhnQJVrm1z8C36NLAtwMPACsQZeI6ndyVb28qt5Y\nVb8Yp78NgXcBu7X9q+iqN0ZzQPu8hu65XNv29+pVYzRzgedV1SvpEmEBtmoVKL01N97Qnsk/jxOb\nJGkhWWayA5AkSYvcK+j+6rw9XTXAF5P8HzCtnV+Z7stfv7+qqvuSvI1u2khvGsPPgDfSrTswry6k\nS068DtgUmE5XfUHr/4WjXLPmOP1Na5+jxg+s27YfrKqftu0fjhdgq5z4CHBDVb06yaHAh4Fv0VUD\nwCNVIWOqqiuTXE1XBfIQ3XSYHUc068V/Y7vmriR3AU+mqwD4Ml1CYTe6Z1bAd5O8oqruHxTDKD5H\nlyj4BfCdqup9cR8Ux819fdzYPm9qn08ZY6ylxwskyep0lTjrjHJ65L/5JaO0Gc1/V9XuSZ5IV13x\nCropVEeM0nZa+3xB+/lzaHTJkJ47quqOtn03j6yNsgbwuHb8B+1z3N8tSdLCYSWGJElLgKoqugqM\n++n++78RcFs7/QtguapKVYVu/YbeX+e/VFXr0n3ZfBfdl9beX5znts+J/v/EN6vq7+m+VC4FHJXk\n8W3thV4C4znt3P+2/d4bPkYba1D8t7fzyydZr20PeiPKk+i+gK+eZKVW8fBFugTQy4BTq+rqCd7v\nZ9vn6VV11yjne/FvAn/+Yt97A8qPgT9V1WvppvA8A/gu3RfuV7Y28/r8P1BV76mqT/QlMCYSR79n\n9LflkXVCekmVVdrn5gNi2Ynud+oOumTJ4+mSBPDIv3nPeFNI/kJV/YZHpiqN9e99W/t8V+/3pv3u\nbFRV1/W1659C1F9JcxePVHn0pi5N+G07kqT5ZyWGJElT375JdqFbeHA1ur/Gz6b7InYZ8CzgqiSX\n0n2hfC7dlIOTgF+mW7Dz5zxS5t/7stmrbnhxkk8DF1TVRN54cRRdQmQdYG+69R3uo/sL9+HA72hv\n9ujTG2vbJJ+hmwbwxfHir6qTklxIlxg5L8lVwGsHxHY93V/UnwbMbPe+bd/5JyRZuqrmjnbxCKfQ\nfVm+fozzxwIvBj6Y7rW329L9v9l3quqH6V4rewgwg+75jPb8NwSOSLIr8Mm+ipN5MSiOaX1tz2hV\nPK9p+19pn9e0z72S/AnYc8CYv2yfawL/QZdUm5e3v4xmiyT/SbceRi++y8ZoeyzwEro1Lp5FtxDr\nlsDqTGDx16qam+Q0uqqkU5N8B9hjAeOXJE2AlRiSJE19L6NbA2BzugUKX15Vd1bVw3RTFT5H9xf0\nvYFn0i3geXm79jt0yY99gc3aufe0c6fTLfK4Il3lwy4TCaaq7qVbiBK6RRsfpnuDx0+Av6H7kj5y\nkdAL6dbFmEv31o/dJhj/nnQVDOvTJSb+Y0Bsf6SrCvkqsCrdl9RlW5xz6L7sf3KC9/lgVX13rHUc\nquocui/b19N9AV6Vbu2MXqLlB3SJppfQPf8/0E11ObudP5xuDZBn0SWF1ppIXPMRR7/D6J7P7+me\nQ2+Nka/Q/fssS/f7dtSAMS8D/pUuYdV73rePd80E9NbEeA1dgudwHqmGGTn+t+imm1xL93xfSfd7\n+KnR2o/hALrf09XoKnU+Np9xS5LmQbrqUkmSJOkvtUqMWwHalAtJkiaNlRiSJEmSJGkomMSQJEmS\nJElDwekkkiRJkiRpKFiJIUmSJEmShoJJDEmSJEmSNBSWmewApIlYY401atq0aZMdhiRJkiRpEZg5\nc+ZdVbXmoHYmMTQUpk2bxowZMyY7DEmSJEnSIpDkxxNp53QSSZIkSZI0FKzE0FC49We/4Q3vO2Wy\nw5AkSZKkoXHqkXtOdggLnZUYkiRJkiRpKJjEkCRJkiRJQ8EkhiRJkiRJGgomMSRJkiRJ0lAwiSFJ\nkiRJkoaCSQxJkiRJkjQUTGJIkiRJkqShYBJDkiRJkiQNBZMYkiRJkiRpKJjEGFJJ7ptAmwOTrLCQ\nxts5yQ4TaLd3kmPa9uFJDl4Y40uSJEmSZBJjajsQmKckRpKlxzi1MzAwibEgkiyzKPuXJEmSJA03\nkxhDrlVIXJDk60luSnJKOgcA6wDnJzm/tX1hksuSXJ3k9CQrteO3Jfn3JFcDr05yQJIbksxO8rUk\n04C3AgclmZVkpyRrJvlGkqvaz44D4nxza3dtu26FdvykJJ9LcgVw5KJ7UpIkSZKkYedfvqeGZwKb\nAT8HLgF2rKqjk7wb2KWq7kqyBvBPwPOr6v4khwDvBo5offy6qrYBSPJzYIOqeijJalV1d5LPAfdV\n1Sdam1OBo6rq4iRPBb4NPGOcGM+oqi+0az8C7At8up17CrBDVc3tvyDJfsB+ACussvoCPB5JkiRJ\n0lRgEmNquLKqfgaQZBYwDbh4RJu/ATYFLkkC8Djgsr7zp/VtzwZOSXImcOYYYz4f2LT1BbBKr7Jj\nDJu35MVqwEp0SY+e00cmMACq6jjgOIDVn7xhjdO3JEmSJGkJYBJjaniob3suo/+7BvhOVb1+jD7u\n79t+KfAc4OXAh5JsMUr7pYC/qarfP2qQR5IaI50E7F5V1ybZm26NjdHGliRJkiRpVK6JMbXdC6zc\nti8HdkzyVwBJVkzytJEXJFkKWK+qzgcOAValq5zo7wvgPGD/vuu2HhDLysAvkiwL7Dl/tyNJkiRJ\nWpKZxJjajgPOTXJ+Vf0K2Bv4apLZdFNJNhnlmqWBk5PMAa4Bjq6qu4H/AV7RW9gTOACY3hb/vIFu\n4c/x/DNwBd2aHTcthHuTJEmSJC1hUuVSA3rsW/3JG9aL3vQvkx2GJEmSJA2NU48cniL4JDOravqg\ndlZiSJIkSZKkoWASQ5IkSZIkDQWTGJIkSZIkaSiYxJAkSZIkSUPBJIYkSZIkSRoKJjEkSZIkSdJQ\nMIkhSZIkSZKGwjKTHYA0ERs85YlD9Y5jSZIkSdLCZyWGJEmSJEkaCiYxJEmSJEnSUDCJIUmSJEmS\nhoJJDEmSJEmSNBRMYkiSJEmSpKFgEkOSJEmSJA0FX7GqofDAHT9m5pH/ONlhSJIkSY9Z277v+MkO\nQVrkrMSQJEmSJElDwSSGJEmSJEkaCiYxJEmSJEnSUDCJIUmSJEmShoJJDEmSJEmSNBRMYkiSJEmS\npKFgEkOSJEmSJA0FkxiSJEmSJGkomMRYQiWpJCf37S+T5FdJzm77uyZ5/4A+1kny9UUdqyRJkiRJ\nAMtMdgCaNPcDmydZvqoeBF4A3N47WVVnAWeN10FV/RzYY5FGKUmSJElSYyXGku1bwEvb9uuBr/ZO\nJNk7yTFt+6QkRye5NMktSfZox6clua5tL5fkxCRzklyTZJe+fs5Icm6Sm5Mc2Y4v3fq9rl1z0GK8\nb0mSJEnSELISY8n2NeDQNoVkS+AEYKcx2q4NPBvYhK5CY+Q0kncAVVVbJNkEOC/J09q5rYFnAg8B\nP0jyaeBJwLpVtTlAktUW3m1JkiRJkqYiKzGWYFU1G5hGV4XxrQHNz6yqh6vqBmCtUc4/Gzi59XsT\n8GOgl8T4XlXdU1W/B24A1gduATZM8ukkfwf8bmSHSfZLMiPJjN/e/+C836AkSZIkaUoxiaGzgE/Q\nN5VkDA/1bWcex+i/di6wTFX9FtgKuAB4K3D8yIuq6riqml5V05+w4vLzOKQkSZIkaaoxiaETgA9X\n1ZwF7OciYE+ANo3kqcAPxmqcZA1gqar6BvBPwDYLOL4kSZIkaYpzTYwlXFX9DDh6IXT1GeCzSeYA\nfwL2rqqHkjGLNtYFTkzSS6R9YCHEIEmSJEmawlJVkx2DNNCmT1mzvnLAbpMdhiRJkvSYte37/mKG\ntjQ0ksysqumD2jmdRJIkSZIkDQWTGJIkSZIkaSiYxJAkSZIkSUPBJIYkSZIkSRoKJjEkSZIkSdJQ\nMIkhSZIkSZKGgkkMSZIkSZI0FExiSJIkSZKkobDMZAcgTcQKT16fbd93/GSHIUmSJEmaRFZiSJIk\nSZKkoWASQ5IkSZIkDQWTGJIkSZIkaSiYxJAkSZIkSUPBJIYkSZIkSRoKvp1EQ+G2u37K3ie+a7LD\nkCRJkibkpH0+NdkhSFOSlRiSJEmSJGkomMSQJEmSJElDwSSGJEmSJEkaCiYxJEmSJEnSUDCJIUmS\nJEmShoJJDEmSJEmSNBRMYkiSJEmSpKFgEkOSJEmSJA0FkxiSJEmSJGkoDFUSI8laSU5NckuSmUku\nS/KKRTTWtCTXte3pSY5eFOMMiGHNJFckuSbJTiPOHZhkhb79+xZwrO2TXJDk5iRXJzknyRYDrtk7\nyTELMq4kSZIkSRO1zGQHMFFJApwJfKmq3tCOrQ/supD6X7qq5o52rqpmADMWxjjz6G+BOVX1j6Oc\nOxA4GXhgQQdJshbwX8AbqurSduzZwEbAnAXtX5IkSZKkhWGYKjGeB/yhqj7XO1BVP66qT8NfVgUk\nOTvJzm37s0lmJLk+yYf72tyW5N+TXA28Osm2Sa5Nci3wjr52Oyc5u21v3ypArklyaZKn941/RpJz\nWzXDke340klOSnJdkjlJDhp5Y63q4/tJZif5XpKnJtkaOBLYLcmsJMv3tT8AWAc4P8n5fcf/tcV/\neUtM9Ko5vpHkqvaz4yjP9p10yaFL+57txVV1Zuvj5X0VId/t9T3iHkZtk+RTSQ5t2y9KcmGSVZPc\nmmTZdnyV/n1JkiRJkkYzTEmMzYCr5/PaD1XVdGBL4LlJtuw79+uq2qaqvgacCOxfVVuN09dNwE5V\n9UzgUOCjfee2Bl4LbAG8Nsl67di6VbV5VW3Rxhjp03RJhC2BU4Cjq2pW6/+0qtq6qh7sNa6qo4Gf\nA7tU1S7t8IrA5S32C4E3t+OfAo6qqu2AVwHHjzL+oGd7MfA37Z6/BrxvHtp8oD2LXYCjgX2q6h7g\nAuClrc3rgDOq6o/9HSbZryWfZvz+vgeRJEmSJC3ZhmY6yUhJjgWeTVedsd2A5q9Jsh/d/a4NbArM\nbudOa/2tBqxWVRe2418BXjxKX6sCX0qyMVBAf/XA99oXdJLcAKwPXA9smOTTwDnAeaP0+SzglX3j\nHjngfkbzB+Dstj0TeEHbfj6waTcbB4BVkqxUVWOuoZHkCmAV4LyqehfwFOC0JGsDjwNuHeWyUdtU\n1QNJ3kyXWDmoqn7U2h9Pl+g4E9iHR5Iuf1ZVxwHHAawxba0a+AQkSZIkSVPaMFViXA9s09upqnfQ\nrRmxZjv0Jx59P8sBJNkAOBj421bpcE7vXHP/PMbxL8D5VbU58PIRfT3Utz0XWKaqfgtsRVd58FZG\nr4RYGP5YVb0v+nN5JEG1FF2FxNbtZ91REhgjn+1fA/9Ml7CBrlLkmFZJ8hYefc9MoM0WwK/ppsD0\nxrgEmNam/CxdVdfN6w1LkiRJkpYsw5TE+D6wXJK39R1boW/7NmDrJEu1aRzbt+Or0CUq7mnrNIxW\nXUFV3Q3c3Ra0BNhzjDhWBW5v23sPCjrJGsBSVfUN4J/oSxb0uZRuSkVv3IsG9QvcC6w8gXbnAfv3\nxbP1KG2OBfZOskPfsf5n23/Pe40xzqht2uKr7wGeCbw4yV/3XfNl4FRGn2IjSZIkSdKjDE0So1UZ\n7E63psWtSa4EvgQc0ppcQjeF4Qa6tReubtddC1xDt5bFqa3dWPYBjk0yC8gYbY4EPpbkGiY2HWdd\n4ILW58l0a0SMtD+wT5LZwBuBd02g3+OAc/sX9hzDAcD0tmjoDXTVII9SVXfQreXxsST/L8mlwB5A\nb6HUw4HTk8wE7hpjnL9o094o80Xg4Kr6ObAvcHySXpXGKcATgK9O4H4lSZIkSUu4PDIDQVq8kuwB\n7FZVbxzUdo1pa9XLDnvdoGaSJEnSY8JJ+3xqskOQhkqSme2FHOMa2oU9NdzaQqcvBl4y2bFIkiRJ\nkoaDSQxNiqraf3ArSZIkSZIeMTRrYkiSJEmSpCWbSQxJkiRJkjQUTGJIkiRJkqShYBJDkiRJkiQN\nBZMYkiRJkiRpKPh2Eg2FaWus57u2JUmSJGkJZyWGJEmSJEkaCiYxJEmSJEnSUDCJIUmSJEmShoJJ\nDEmSJEmSNBRMYkiSJEmSpKFgEkOSJEmSJA0FX7GqoXDPrbfxrTftM9lhSJIkaZK85MsnTnYIkh4D\nrMSQJEmSJElDwSSGJEmSJEkaCiYxJEmSJEnSUDCJIUmSJEmShoJJDEmSJEmSNBRMYkiSJEmSpKFg\nEkOSJEmSJA0FkxiSJEmSJGkomMSYgpLMTTIryfVJrk3yniQL5d86yeFJDl4YffX1uXeSYxZmn5Ik\nSZKkqWeZyQ5Ai8SDVbU1QJInAacCqwCHTWpUkiRJkiQtACsxpriquhPYD3hnOksn+XiSq5LMTvIW\ngCQrJflekquTzEmyW6+PJB9K8sMkFwNP7zt+QZJPtaqP65Js344/McmZrf/Lk2w53nFJkiRJkibC\nSowlQFXdkmRp4EnAbsA9VbVdkscDlyQ5D/gp8Iqq+l2SNYDLk5wFbAO8Dtia7vflamBmX/crVNXW\nSZ4DnABsDnwYuKaqdk/yPODL7fqxjkuSJEmSNJBJjCXPC4Etk+zR9lcFNgZ+Bny0JSMeBtYF1gJ2\nAr5ZVQ8AtMRGv68CVNWFSVZJshrwbOBV7fj3k6yeZJVxjo8qyX50VSSsueKKC37nkiRJkqShZhJj\nCZBkQ2AucCcQYP+q+vaINnsDawLbVtUfk9wGLDeB7mvA/nyrquOA4wA2Xn2NhdavJEmSJGk4uSbG\nFJdkTeBzwDFVVcC3gbclWbadf1qSFekqMu5sCYxdgPVbFxcCuydZPsnKwMtHDPHa1s+z6aap3ANc\nBOzZju8M3FVVvxvnuCRJkiRJA1mJMTUtn2QWsCzwJ+ArwH+0c8cD04CrkwT4FbA7cArwP0nmADOA\nmwCq6uokpwHX0lVyXDVirN8nuaaN9Q/t2OHACUlmAw8Aew04LkmSJEnSQOn+OC/NuyQXAAdX1YxF\nPdbGq69Rn3rpyCIQSZIkLSle8uUTJzsESYtQkplVNX1QO6eTSJIkSZKkoeB0Es23qtp5smOQJEmS\nJC05rMSQJEmSJElDwSSGJEmSJEkaCiYxJEmSJEnSUDCJIUmSJEmShoJJDEmSJEmSNBRMYkiSJEmS\npKHgK1Y1FFbdYBov+fKJkx2GJEmSJGkSWYkhSZIkSZKGgkkMSZIkSZI0FExiSJIkSZKkoWASQ5Ik\nSZIkDQWTGJIkSZIkaSgMfDtJkuWBI4AXAO8AXgtcXFX/tYhjk/7sF7f/lo9+6OuTHYYkSdIi9cF/\n3WOyQ5Ckx7SJVGL8J3AQsAXweGBp4L2LMihJkiRJkqSRJpLEeCXw8b79mcDTF004kiRJkiRJo5tI\nEuNhIH37WwH3LZpwJEmSJEmSRjdwTQzgHODdbfsrwJOB4xdZRJIkSZIkSaOYSBLjQLpKjJcCywJf\nwjUxJEmSJEnSYjYwiVFVvwP2WQyxSJIkSZIkjWnMJEaS2eNcV1W11SKIR5IkSZIkaVTjVWJsvtii\nkCRJkiRJGmDMJEZVTeTNJZIkSZIkSYvFwERFkluSvKRv/7lJvr1ow1r0klSSk/v2l0nyqyRnz2M/\nFySZPsbxnyRJ37Ezkyz019O2sX6QZFb72WMRjHF4kttb/zckef1C7NtX9kqSJEmSBhpvTYxVgCcA\n04BpSZ7aTj0XeP6iD22Rux/YPMnyVfUg8ALg9oU8xt3AjsDFSVYD1l7I/ffbs6pmzOtFSZapqj9N\nsPlRVfWJJBsDM5N8var+OK9jSpIkSZI0P8arxDgIuAUo4NPAre3nMOAniz60xeJbdK+OBXg98NXe\niSTbJ7ksyTVJLk3y9HZ8+SRfS3Jjkm8Cy4/T/9eA17XtVwJn9PW/UpLvJbk6yZwku7Xj2yWZnWS5\nJCsmuT7JPK9PkmRakuv69g9OcnjbviDJfyaZAXwoya1Jlm3nVunfH01V3Qw8QJfkIsnWSS5vcX8z\nSe/4m5NcleTaJN9IskI7vkF7tnOSfGRe702SJEmStGQaL4nxQ+B/gQCz6L7wnwOcDOy56ENbLL4G\nvC7JcsCWwBV9524CdqqqZwKHAh9tx98GPFBVz6BL6Gw7Tv/fA56TZGm6ZMZpfed+D7yiqrYBdgE+\nmSRVdRVwFvAR4Ejg5Kq6DiDJrHHGOqVvOsnqE7j3x1XV9Kr6MHABjyRzXgecMV6FRZJtgJur6s52\n6MvAIVW1JTCH7rnQ+tmuvcnmRmDfdvxTwGeragvgF+OMs1+SGUlm3P/A7yZwS5IkSZKkqWy8hT2/\nCnw1yWHA6VV1w+ILa/GoqtlJptFVYXxrxOlVgS+1qRMF9CoTngMc3Xf9eK+inQtcTJcYWL6qbutf\nIgP4aJLnAA8D6wJrAXcARwBX0SU6DuiLd+txxnrUdJIkK4/TFh6dUDkeeB9wJrAP8OYxrjkoyT7A\n04CXt3FWBVarqv9rbb4EnN62N2+VFqsBKwG9tVR2BF7Vtr8C/Ptog1XVccBxAOuuvVENuB9JkiRJ\n0hQ33poYRwMnAKsDb+378g1QVfWuRRzb4nIW8AlgZ7p77fkX4PyqekVLdFwwn/1/DfgmcPiI43sC\nawLbVtUfk9wGLNfOrU73pX/Zduz++Rj3Tzy60ma5Eef/3GdVXdKmn+wMLN2r/BhFb02MXYEvJtlo\nQAwnAbtX1bVJ9qZ7xn8edvAtSJIkSZL0iPGmk7wTeHr7HO1nqjgB+HBVzRlxfFUeWehz777jFwJv\nAGhrVWw5oP+LgI/Rt95GX/93tgTGLsD6fec+D/wzcApjVClMwC+BJyVZPcnjgZcNaP9l4FTgxEEd\nV9VZwAxgr6q6B/htkp3a6TcCvaqMlYFftPU1+qcgXcIja4VMlalJkiRJkqRFbMxKDLp1Gm5on1NW\nVf2MNj1khCPpppP8E91aID2fBU5MciPdOg8zB/RfdJUeI50C/E+SOXQJgZsAkrwJ+GNVndrW0rg0\nyfOq6vtJZg2YUtI/7h+THAFcSZeMuWnAJafQrcMxMtkyliOAU5N8AdgL+FxbuPMWuikp0CVirgB+\n1T57U1ze1a49BPjvCY4nSZIkSVrCpfuOPcqJ5PvAEVV1wWKNSJMiyR7AblX1xsmOZTTrrr1RveMf\n5rcoRZIkaTh88F/3mOwQJGlSJJlZVdMHtRuvEmNn4HMLLSI9ZiX5NPBi4CWTHYskSZIkSWMZL4kB\n8Iz29oy/UFUXLoJ4NAmqav/JjkGSJEmSpEEGJTEObT+jWXohxyJJkiRJkjSmQUmM7wA3L45AJEmS\nJEmSxjMoiXFCVf3XYolEkiRJkiRpHEtNdgCSJEmSJEkTMWYlRlWZ4JAkSZIkSY8Zg6aTSI8Ja6/7\nBN+bLkmSJElLOKstJEmSJEm8mApzAAAeH0lEQVTSUDCJIUmSJEmShsLAJEaS5ZN8PMmsJDsmOTrJ\naxZHcJIkSZIkST0TqcT4T+AgYAvg8cDSwHsXZVCSJEmSJEkjTSSJ8Urg4337M4GnL5pwJEmSJEmS\nRjeRJMbDQPr2twLuWzThSJIkSZIkjW4ir1g9B3h32/4K8GTg+EUWkTSKX97+Y/7jA2+Z7DAkSZIW\nind/7POTHYIkDaWJJDEOpKvEeCmwLPAlXBNDkiRJkiQtZgOTGFX1O2CfxRCLJEmSJEnSmMZMYiSZ\nDRwMfGKU01VVWy2yqCRJkiRJkkYYrxJjc+AJ7VOSJEmSJGlSjZnEqKrem0tOW0yxSJIkSZIkjWng\nK1aTzEryniRrL46AJEmSJEmSRjMwiQGsBXwc+EmS7ybZO8lKizguSZIkSZKkR5lIEmMdYBfgs8Am\nwBeBOxZlUJIkSZIkSSMNTGJUVQEzgEuBK9vh5RdlUJIkSZIkSSNNZE2MM4FfAafQVWScCDx/wDWr\nt7U0ZiW5I8ntbfvuJDfMb7BJ1kpydpJrk9yQ5Fvt+M5Jzp7ffudh/L2THLOQ+jo8ycETaNN7djck\nef18jHPf/Ec5of6nJXlD3/70JEcvyjElSZIkSUum8V6x2vN3wLfokhj/U1V/GHRBVf0a2Bq6L+LA\nfVX1iSTTgAVJNhwBfKeqPtX63nIB+hoWR7VntzEwM8nXq+qPkx1Un2nAG4BTAapqBl3ljiRJkiRJ\nC9VE1sR4MvBq4AZgoyRLL+CYSyf5QpLrk5yXZHmAJBslOTfJzCQXJdlklGvXBn7W26mq2X3nVkry\n9SQ3JTklSVq/hya5Ksl1SY5L50lJZrbzWyWpJE9t+z9KskKSV7drrk1yYd8467Q4b05yZO9gks8m\nmdHu68N9x29L8uEkVyeZM9p9JXlzkv/tPYvRVNXNwAPAE8Z7Xkk2SHJZG+sjI8Z5b3sWs3sxtkqK\nm5KclOSH7dk9P8kl7R63b+0OT/KV1vfNSd7cuv03YKdWLXJQf1VMkicmObONd3kv6dT6OiHJBUlu\nSXLAWPctSZIkSVLPRJIYawM3Ate1nxuSPGMBxtwYOLaqNgPuBl7Vjh8H7F9V2wIHA58Z5dpjgS8m\nOT/Jh5Ks03fumcCBwKbAhsCO7fgxVbVdVW1Ot5bHy6rqTmC5JKsAO9FVDuyUZH3gzqp6ADgUeFFV\nbQXs2jfO1sBrgS2A1yZZrx3/UFVNB7YEnjuiSuSuqtqGbnHUR00hSfJO4GXA7lX14FgPLck2wM0t\n9vGe16eAz1bVFsAv+q5/Id2z377dw7ZJntNO/xXwSbqFWzehq6x4duv3g31hbAk8D3gWcGh7/u8H\nLqqqravqqBFhfxi4pqq2bP18ue/cJsCLWjyHJVl2lHveryWGZtz/wO/HejSSJEmSpCXERJIYx9Il\nMr7aftYGPr0AY95aVbPa9kxgWrpXtu4AnJ5kFvD5Ns6jVNW36RIUX6D7EnxNkjXb6Sur6mdV9TAw\ni26aA8AuSa5IMofuC/hm7fildImO5wAfbZ87ARe185cAJ7WKg/7qk+9V1T1V9Xu66pT12/HXJLka\nuKaNsWnfNWf032/f8TcBLwb2qKqHxnheByW5HrgC+FeAAc9rR7p/J4Cv9PXzwvZzDXA13fPbuJ27\ntarmtGd3fbvHAuaMiPe/q+rBqroLOJ8uATGeZ/diqKrvA6u3xBHAOVX1UOvrTrpX+T5KVR1XVdOr\navqKKyw3YChJkiRJ0lQ3kTUxpgMfqKpj4M+VAx9dgDH7v6zPpauOWAq4u6q2HnRxVf2Gbv2FU9u0\nhecAvx6l32WSLEdXoTC9qn6abn2O3rfhC+mSFusD/w0cAhRwThvnrUn+Gngp3VoU244R/zJJNqCr\nWtiuqn6b5KS+cfqvmcujn/kcuqqIpwC3jnHLvTUxdqWrQtmIwc+rRjkW4GNV9flHHezWKem/p4f7\n9h8eEe/IfkcbZ6L+4jkuQF+SJEmSpCXARCoxfgM8P8mGSTYEXkCXNFhoqup3wK1JXg3Q1q3YamS7\nJM9LskLbXhnYCPjJOF33Egl3teqFPfrOXQT8Pd0UjYfp7vMlwMWt/42q6oqqOpTu7SzrMbZVgPuB\ne5KsRVddMRHXAG8BzhoxNeYvVNVZdNNe9hrwvC4BXte29+zr4tvAP7TnQJJ1kzxpgnH27JZkuSSr\nAzsDVwH3AiuP0f6iXgxJdqabVvO7eRxTkiRJkiRgYkmM4+nWhLi5/byMbjrHwrYnsG+Sa+mmNOw2\nSpttgRlJZgOXAcdX1VVjdVhVd7dYr6P7En9V37nb6KoTeot2XkxX3fDbtv/xtjjmdXRTT64dZ5xr\n6RISN9FViVwy8G4fufZiuiqOc5KsMaD5EcC7kyzF2M/rXcA72vSZdfvGOa/Fdlk793XGTj6MZTbd\nNJLLgX+pqp+3Y3PTLYB60Ij2h9OtvTGbbgHQveZxPEmSJEmS/izd0gcDGiX/QFelUHRrGZy0iOPS\nY0z6XpU7GeOvt/aaddDer5yMoSVJkha6d3/s84MbSdISJMnM9rKMcU1oHYKqOgE4YYGjkiRJkiRJ\nmk9jJjGSzB3nuqoqF2JcglTV4ZMdgyRJkiRpyTZeIiJ000d+Dty9eMKRJEmSJEka3XgLe55I98aN\nNeheBfruqtqi97NYopMkSZIkSWrGTGJU1b7A2sDb6V4vem6S25L83eIKTpIkSZIkqWfcV6xW1f3A\nLcCtwB/oqjLm9bWckiRJkiRJC2zMJEaSDyW5Gfg+8FfA/sDaVXX64gpOkiRJkiSpJ1U1+onkYbqF\nPW8Bbhxxuqpqt0Ucm/Rn06dPrxkzZkx2GJIkSZKkRSDJzKqaPqjdoNekBtio/fQbPfMhSZIkSZK0\niIyXxNhgsUUhSZIkSZI0wJhJjKr68eIMRJIkSZIkaTzjvp1EkiRJkiTpscIkhiRJkiRJGgomMSRJ\nkiRJ0lAY9HYS6THhwV/dy7WfuWCyw5AkSZpvW71958kOQZKGnpUYkiRJkiRpKJjEkCRJkiRJQ8Ek\nhiRJkiRJGgomMSRJkiRJ0lAwiSFJkiRJkoaCSQxJkiRJkjQUTGJIkiRJkqShYBJDkiRJkiQNBZMY\nC0mS1ZPMaj93JLm9bd+d5IYF6HfvJL9Kck2Sm5N8O8kO89HP4UkOnmibJMsl+U6Swwdcc0SS58/P\n2ElWS/L2CYQvSZIkSZJJjIWlqn5dVVtX1dbA54Cj2vbWwMML2P1pVfXMqtoY+DfgjCTPmOjFSZaZ\nl8GSPA74BjCzqg4fr21VHVpV352X/vusBpjEkCRJkiRNiEmMxWPpJF9Icn2S85IsD5BkoyTnJpmZ\n5KIkmwzqqKrOB44D9mt9vDnJVUmuTfKNJCu04ycl+VySK4Aj+/to1/xvL44RlgFOA26uqve39tOS\n3DjGPZyUZI+2/ZIkN7X7OTrJ2X39bprkgiS3JDmgHfs3YKNWsfLxCT9NSZIkSdISySTG4rExcGxV\nbQbcDbyqHT8O2L+qtgUOBj4zwf6uBnoJjzOqaruq2gq4Edi3r91TgB2q6t29A0neCbwM2L2qHhyl\n7/cBf6iqAyd4D71+lwM+D7y43c+aI67fBHgRsD1wWJJlgfcDP2oVLO+d4L1LkiRJkpZQ8zTNQPPt\n1qqa1bZnAtOSrATsAJyepNfu8RPsL33bmyf5CN3UjJWAb/edO72q5vbtvwn4KV0C449j9H0xsEOS\np1XVD8e7hxHXbQLcUlW3tv2v0qpFmnOq6iHgoSR3AmuNe4dAkv16faz9xIHNJUmSJElTnJUYi8dD\nfdtz6ZJHSwF399bRaD8TXefimXRVFwAnAe+sqi2ADwPL9bW7f8R1c+iSD08Zp+8LgQOB/02y9oB7\nmBfzfH1VHVdV06tq+hNWWnUeh5MkSZIkTTUmMSZJVf0OuDXJqwHS2WrQdUmeS1ed8IV2aGXgF216\nxp4DLr8GeAtwVpJ1xontG8AngHOTrDbwZjo/ADZMMq3tv3YC19xLF78kSZIkSQOZxJhcewL7JrkW\nuB7YbYx2r22LX/4Q+CDwqqrqVWL8M3AFcAlw06ABq+piuvU3zkmyxjjtPgt8EziLR1d3jNX+Qbo3\njZybZCZdguKeAdf8GrgkyXUu7ClJkiRJGiRVNdkxaIpIslJV3ZdukY9j6d5wctTC6Huz9Z9epx7y\n+YXRlSRJ0qTY6u07T3YIkvSYlWRmVU0f1M5KDC1Mb04yi66qZFW6t5VIkiRJkrRQ+HYSLTSt6mKh\nVF5IkiRJkjSSlRiSJEmSJGkomMSQJEmSJElDwSSGJEmSJEkaCiYxJEmSJEnSUDCJIUmSJEmShoJJ\nDEmSJEmSNBR8xaqGwvJrrsxWb995ssOQJEmSJE0iKzEkSZIkSdJQMIkhSZIkSZKGgkkMSZIkSZI0\nFExiSJIkSZKkoWASQ5IkSZIkDQXfTqKh8Mtf/pJPfvKTkx2GJEnSQO95z3smOwRJmrKsxJAkSZIk\nSUPBJIYkSZIkSRoKJjEkSZIkSdJQMIkhSZIkSZKGgkkMSZIkSZI0FExiSJIkSZKkoWASQ5IkSZIk\nDQWTGJIkSZIkaSiYxJAkSZIkSUPBJMYUleSoJAf27X87yfF9+59M8u4kZ49x/fFJNh0wxklJ9piP\n2A5PcvC8XidJkiRJWrKZxJi6LgF2AEiyFLAGsFnf+R2Ax411cVX9Y1XdsEgjlCRJkiRpHpjEmLou\nBZ7VtjcDrgPuTfKEJI8HngFcDayU5OtJbkpySpIAJLkgyfS2fV+r7Lg+yfeSrDlysCSHJrkqyXVJ\njuvr54AkNySZneRrfZds2sa4JckBi+4xSJIkSZKmCpMYU1RV/Rz4U5Kn0lVdXAZcQZfYmA7MAf4A\nPBM4ENgU2BDYcZTuVgRmVNVmwP8Bh43S5piq2q6qNgeWB17Wjr8feGZVbQm8ta/9JsCLgO2Bw5Is\nO7LDJPslmZFkxv333z9P9y9JkiRJmnpMYkxtl9IlMHpJjMv69i9pba6sqp9V1cPALGDaKP08DJzW\ntk8Gnj1Km12SXJFkDvA8Hpm6Mhs4JcnfA3/qa39OVT1UVXcBdwJrjeywqo6rqulVNX3FFVec6D1L\nkiRJkqYokxhTW29djC3oppNcTleJsQNdggPgob72c4FlJtBv9e8kWQ74DLBHVW0BfAFYrp1+KXAs\nsA1wVZJe//MzriRJkiRpCWYSY2q7lG5ax2+qam5V/QZYjS6Rcem4Vz7aUkDvLSRvAC4ecb6XsLgr\nyUq9tm1B0fWq6nzgEGBVYKX5uRFJkiRJkvzr99Q2h+6tJKeOOLZSVd3V1t6ciPuB7ZP8E93Uj9f2\nn6yqu5N8ga7a4w7gqnZqaeDkJKsCAY5ubef3fiRJkiRJS7BU1eBWWqIlua+qJrWCYr311qsDDzxw\nMkOQJEmakPe85z2THYIkDZ0kM6tq+qB2TieRJEmSJElDwSSGBprsKgxJkiRJksAkhiRJkiRJGhIm\nMSRJkiRJ0lAwiSFJkiRJkoaCSQxJkiRJkjQUTGJIkiRJkqShsMxkByBNxFprreU71yVJkiRpCWcl\nhiRJkiRJGgomMSRJkiRJ0lAwiSFJkiRJkoaCSQxJkiRJkjQUTGJIkiRJkqShYBJDkiRJkiQNBV+x\nqqFw3z0/58KzD5/sMCRJkgB4zssOn+wQJGmJZCWGJEmSJEkaCiYxJEmSJEnSUDCJIUmSJEmShoJJ\nDEmSJEmSNBRMYkiSJEmSpKFgEkOSJEmSJA0FkxiSJEmSJGkomMSQJEmSJElDwSTGYpRk9SSz2s8d\nSW5v23cnuWEB+/67JFcmuan1eVqSp87D9dOSXNe3/9Uks5McNM41uyfZtG//giTT5/8uJEmSJEka\n2zKTHcCSpKp+DWwNkORw4L6q+kSSacDZ89tvks2BTwO7VtWN7diuwDTgJ/PR35OB7arqrwY03Z0u\n7gVKwLQxl6mqPy1oP5IkSZKkqctKjMeOpZN8Icn1Sc5LsjxAko2SnJtkZpKLkmwyyrWHAB/tJTAA\nquqsqrqw9bF1kstbZcU3kzyhHd82ybVJrgXe0dffecC6raJjpyRvTnJVa/uNJCsk2QHYFfh4a7dR\nu/bVrSLkh0l2auMsneTjrY/ZSd7Sju/c7uksFkIiRJIkSZI0tZnEeOzYGDi2qjYD7gZe1Y4fB+xf\nVdsCBwOfGeXazYCrx+n7y8AhVbUlMAc4rB0/sfW91Yj2uwI/qqqtq+oi4Iyq2q61uxHYt6ouBc4C\n3tva/ahdu0xVbQ8c2DfOvsA9VbUdsB3w5iQbtHPbAO+qqqeNE78kSZIkSU4neQy5tapmte2ZwLQk\nKwE7AKcn6bV7/HidJFkd+B6wAl0C5AvAalX1f63Jl1p/q7XjF7bjXwFePEa3myf5CLAasBLw7XFC\nOKP/Htr2C4Etk+zR9lelS9r8Abiyqm4d4172A/YDWGvNVccZUpIkSZK0JDCJ8djxUN/2XGB5ukqZ\nu6tq6wHXXk9X0XBtb92NJAfTJRwWhpOA3avq2iR7AzuP07Z3H3N55PcrdBUfj0p+JNkZuH+sjqrq\nOLpEDJtsvE7NR9ySJEmSpCnE6SSPYVX1O+DWJK8GSGfk1A+AI4EPJXlG37EVWh/3AL/trU8BvBH4\nv6q6G7g7ybPb8T3HCWVl4BdJlh3R7t52bpBvA29r15PkaUlWnMB1kiRJkiT9mUmMx749gX3b4pvX\nA7uNbFBVc4B3AV9O8oMklwDPAE5tTfaiW4BzNt3bUY5ox/cBjk0yi65aYiz/DFwBXALc1Hf8a8B7\nk1zTt7DnaI6nW7jz6vYa189jFZAkSZIkaR7l/7d3b7F2lGUYx/9PKSgJBZUiioAVqSfUoDREokJF\nMESJpHIQAgoJQcDghaAJYiIFLwgBajQhYNGkxAOIRAwBFA+AJESUEkBOFkg5igIihyLn8nqxpuly\nU9gL2j2zZ/X/S3Y6a+abWe9cvFkrT7/5VpWz9DX9vW/uVrX4e1/pugxJkiQAdt17YdclSNJYSXJ9\nVc2bbJwzMSRJkiRJUi8YYkiSJEmSpF4wxJAkSZIkSb1giCFJkiRJknrBEEOSJEmSJPWCIYYkSZIk\nSeoFQwxJkiRJktQLhhiSJEmSJKkXZnZdgDSKTTbbil33Xth1GZIkSZKkDjkTQ5IkSZIk9YIhhiRJ\nkiRJ6gVDDEmSJEmS1AuGGJIkSZIkqRcMMSRJkiRJUi/46yTqhfsfX8GxF/2p6zIkSZJYtGC3rkuQ\npPWWMzEkSZIkSVIvGGJIkiRJkqReMMSQJEmSJEm9YIghSZIkSZJ6wRBDkiRJkiT1giGGJEmSJEnq\nBUMMSZIkSZLUC4YYkiRJkiSpFwwxJEmSJElSLxhijIEkK5PcOPQ3J8m8JD+Y5Lw5SW55hWOHJdnq\nVc79RpK/N+93XZIvN/uvSjJvkvddkmS/Ue5NkiRJkqRVZnZdgNaJZ6pqxwn77gGWrsU1DwNuAR6c\neCDJUcCewM5V9WSSTYEFa/FekiRJkiRNypkYYyrJ/CSXNNtbJPl9kluT/CjJvUlmN0M3SHJOc+x3\nSTZuZknMA37WzLTYeMLlTwCOrqonAarqyao6dw01PDW0vV+SJUOH90iyNMkdSfZeh7cuSZIkSRpT\nhhjjYeOhR0kuWsPxE4ErqmoH4EJg26Fjc4Ezm2OPA/tW1YUMZnEcXFU7VtUzqwY3sy5mVdXytax5\nDrAz8Dng7CRvnDggyVeaoGPpM08+sZZvJ0mSJEnqOx8nGQ9repxk2CdoHveoqt8meWzo2N1VdWOz\nfT2DcKENF1TVS8CdSZYD7wNuHB5QVYuBxQBbbv/eaqkuSZIkSdI05UwMPTe0vZJJgq3mEZKnkmw3\nwrWHg4eJMy0mhhKGFJIkSZKkV2WIsX64BjgAIMlngDePcM4KYNYrHDsFOLN5tIQkm6z6dZIJHkry\n/iQzePnCn/snmZHk3cB2wLIRapIkSZIkrcd8nGT9cBJwXpIvAX8G/sUgpNjkVc5ZwmCtimeAXYbX\nxQDOas69LskLwAvAGWu4xvHAJcAjDNbYGH6/+4C/ApsCR1XVs6/jviRJkiRJ65FUOYt/3CV5A7Cy\nql5Msgtw1iRraEw7W27/3jr4tMVdlyFJksSiBbt1XYIkjZ0k11fVvMnGORNj/bAtcEHzWMfzwBEd\n1yNJkiRJ0mtmiLEeqKo7gY90XYckSZIkSWvDhT0lSZIkSVIvGGJIkiRJkqReMMSQJEmSJEm9YIgh\nSZIkSZJ6wRBDkiRJkiT1giGGJEmSJEnqBX9iVb2wzZtmsWjBbl2XIUmSJEnqkDMxJEmSJElSLxhi\nSJIkSZKkXkhVdV2DNKkkK4BlXdchTROzgX93XYQ0jdgT0mr2g7Sa/dAv76yqLSYb5JoY6otlVTWv\n6yKk6SDJUvtBWs2ekFazH6TV7Ifx5OMkkiRJkiSpFwwxJEmSJElSLxhiqC8Wd12ANI3YD9L/syek\n1ewHaTX7YQy5sKckSZIkSeoFZ2JIkiRJkqReMMTQtJJkryTLktyV5Pg1HH9Dkl80x/+SZE77VUrt\nGKEfjk1yW5K/Jfljknd2UafUhsn6YWjcvkkqiavRa2yN0g9JDmg+I25N8vO2a5TaNMJ3pm2TXJnk\nhuZ702e7qFPrho+TaNpIsgFwB7An8ABwHXBQVd02NOarwIer6qgkBwILquqLnRQsTaER++FTwF+q\n6ukkRwPz7QeNo1H6oRk3C7gU2Ag4pqqWtl2rNNVG/HyYC1wA7F5VjyV5a1U93EnB0hQbsScWAzdU\n1VlJPgBcVlVzuqhXa8+ZGJpOdgbuqqrlVfU8cD6wz4Qx+wDnNtsXAp9OkhZrlNoyaT9U1ZVV9XTz\n8lpg65ZrlNoyyucDwHeBU4Fn2yxOatko/XAEcGZVPQZggKExN0pPFLBps70Z8GCL9WkdM8TQdPIO\n4P6h1w80+9Y4pqpeBJ4ANm+lOqldo/TDsMOB30xpRVJ3Ju2HJB8FtqmqS9ssTOrAKJ8P7wHek+Sa\nJNcm2au16qT2jdITC4FDkjwAXAZ8rZ3SNBVmdl2AJGntJDkEmAfs1nUtUheSzAAWAYd1XIo0XcwE\n5gLzGczSuzrJh6rq8U6rkrpzELCkqs5IsgvwkyQfrKqXui5Mr50zMTSd/APYZuj11s2+NY5JMpPB\ndLBHW6lOatco/UCSPYBvA5+vqudaqk1q22T9MAv4IHBVknuAjwEXu7inxtQonw8PABdX1QtVdTeD\n9QLmtlSf1LZReuJwBuvEUFV/Bt4IzG6lOq1zhhiaTq4D5iZ5V5KNgAOBiyeMuRg4tNneD7iiXJ1W\n42nSfkjyEeCHDAIMn3fWOHvVfqiqJ6pqdlXNaRZqu5ZBX7iwp8bRKN+Xfs1gFgZJZjN4vGR5m0VK\nLRqlJ+4DPg2Q5P0MQoxHWq1S64whhqaNZo2LY4DLgduBC6rq1iQnJ/l8M+zHwOZJ7gKOBV7xZ/ak\nPhuxH04DNgF+meTGJBM/sKWxMGI/SOuFEfvhcuDRJLcBVwLfrCpnrmosjdgTxwFHJLkJOA84zP8I\n7S9/YlWSJEmSJPWCMzEkSZIkSVIvGGJIkiRJkqReMMSQJEmSJEm9YIghSZIkSZJ6wRBDkiRJkiT1\ngiGGJEnSFEqyf5JlSZ5L8nCSK5L4HUySpNfBD1BJkqQpkmQ28FPgeeAo4NRVh9bBtWeu7TUkSeob\nQwxJkqSpsx2wEXAfcFFVnVFVu1fVyiQ7J7k6yYpmhsYXAJLsk+TmJP9NckuSfZr985NUksuS/BW4\nttn/rSR3N9e5PMl2Xd2sJElTLVXVdQ2SJEljKcksYDkwG3gJuAE4G/gVcAeDgONkYCVwN3A7cHNz\nziLgWAZByIeAtwNXAi8AJzIIRmYCS4BfNOcdAzxYVTu1cX+SJLXNaYiSJElTpKpWJPk4cBywF7AT\ncA7wT2Bz4PSqOn3V+CTHABsCZ1TVOUkKWAzsAdzaDLukqk5pxv+y2ffF5g/gbUneUlX/mdq7kySp\nfYYYkiRJUyTJhsCdVXVk8/ok4DvAvElOrQn/DntwDfsOBh5utmcAT7/2aiVJmv4MMSRJkqbODsDP\nk5wP3Avs2uy/A3gUODLJQ8CLwD3A7xk8LnJckgBfb17/gcHjJBNdAuwHHAqcz+DRk/lV9cmpuiFJ\nkrrkwp6SJElT51/A3xn8MsliYHtgYVWdB3wWuAlYCJwAzKiqZcD+DEKN7zNYR+OAZv/LVNW5wPHA\nXOAs4CDg6im8H0mSOuXCnpIkSZIkqReciSFJkiRJknrBEEOSJEmSJPWCIYYkSZIkSeoFQwxJkiRJ\nktQLhhiSJEmSJKkXDDEkSZIkSVIvGGJIkiRJkqReMMSQJEmSJEm98D9xn9asOfj69wAAAABJRU5E\nrkJggg==\n",
"text/plain": [
"<Figure size 1152x432 with 1 Axes>"
]
},
"metadata": {
"tags": []
}
}
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "Yg7Rj5WrPzms",
"colab_type": "text"
},
"source": [
"# Content-Based Filtering"
]
},
{
"cell_type": "code",
"metadata": {
"id": "VwUOgBQy9vSi",
"colab_type": "code",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 35
},
"outputId": "6865ab9c-be9b-492f-f1d0-c29c2e777c2e"
},
"source": [
"from sklearn.feature_extraction.text import TfidfVectorizer\n",
"\n",
"# Using Abhishek Thakur's arguments for TF-IDF\n",
"tfv = TfidfVectorizer(min_df=3, max_features=None, \n",
" strip_accents='unicode', analyzer='word',token_pattern=r'\\w{1,}',\n",
" ngram_range=(1, 3), use_idf=1,smooth_idf=1,sublinear_tf=1,\n",
" stop_words = 'english')\n",
"\n",
"# Filling NaNs with empty string\n",
"movies_clean['overview'] = movies_clean['overview'].fillna('')\n",
"\n",
"# Fitting the TF-IDF on the 'overview' text\n",
"tfv_matrix = tfv.fit_transform(movies_clean['overview'])\n",
"\n",
"tfv_matrix.shape"
],
"execution_count": 135,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
"(4803, 10417)"
]
},
"metadata": {
"tags": []
},
"execution_count": 135
}
]
},
{
"cell_type": "code",
"metadata": {
"id": "kYhUmCDBANh2",
"colab_type": "code",
"colab": {}
},
"source": [
"from sklearn.metrics.pairwise import sigmoid_kernel\n",
"\n",
"# Compute the sigmoid kernel\n",
"sig = sigmoid_kernel(tfv_matrix, tfv_matrix)\n",
"\n",
"# Reverse mapping of indices and movie titles\n",
"indices = pd.Series(movies_clean.index, index=movies_clean['original_title']).drop_duplicates()"
],
"execution_count": 0,
"outputs": []
},
{
"cell_type": "code",
"metadata": {
"id": "5jm_sdIkA4yT",
"colab_type": "code",
"colab": {}
},
"source": [
"def give_rec(title, sig=sig):\n",
" # Get the index corresponding to original_title\n",
" idx = indices[title]\n",
"\n",
" # Get the pairwsie similarity scores \n",
" sig_scores = list(enumerate(sig[idx]))\n",
"\n",
" # Sort the movies \n",
" sig_scores = sorted(sig_scores, key=lambda x: x[1], reverse=True)\n",
"\n",
" # Scores of the 10 most similar movies\n",
" sig_scores = sig_scores[1:11]\n",
"\n",
" # Movie indices\n",
" movie_indices = [i[0] for i in sig_scores]\n",
"\n",
" # Top 10 most similar movies\n",
" return movies_clean['original_title'].iloc[movie_indices]"
],
"execution_count": 0,
"outputs": []
},
{
"cell_type": "code",
"metadata": {
"id": "ofa9heIrBJKz",
"colab_type": "code",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 208
},
"outputId": "29a06a68-a2e1-49c7-b946-cf0ec18761b9"
},
"source": [
"# Testing our content-based recommendation system with the seminal film Spy Kids\n",
"give_rec('Spy Kids')"
],
"execution_count": 141,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
"1302 Spy Kids 2: The Island of Lost Dreams\n",
"1155 Spy Kids 3-D: Game Over\n",
"1769 Spy Kids: All the Time in the World\n",
"3359 In Too Deep\n",
"1631 Mr. 3000\n",
"4044 Go for It!\n",
"339 The Incredibles\n",
"1081 Revolutionary Road\n",
"1825 Jimmy Neutron: Boy Genius\n",
"2441 Escobar: Paradise Lost\n",
"Name: original_title, dtype: object"
]
},
"metadata": {
"tags": []
},
"execution_count": 141
}
]
}
]
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment