├── README.md ├── Global Vectors for Word Representation.ipynb └── Convolutional Neural Networks for Sentence Classification.ipynb /README.md: -------------------------------------------------------------------------------- 1 | # PyTorch Implementations 2 | 3 | A collection of pytorch notebooks implementing deep learning papers. This notebooks were developed during studying these papers and helped me reinforced the concepts strongly. The goal is to maintain this repository and add more paper implementations. I hope that these notebooks help other practitioners as well. 4 | 5 | 6 | Name | Notebook 7 | --- | --- 8 | [A Neural Algorithm of Artistic Style](https://arxiv.org/pdf/1508.06576.pdf) | [![colab link](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/jaygala24/pytorch-implementations/blob/master/A%20Neural%20Algorithm%20of%20Artistic%20Style.ipynb) 9 | [Show, Attend and Tell: Neural Image Caption Generation with Visual Attention](https://arxiv.org/pdf/1502.03044.pdf) | [![colab link](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/jaygala24/pytorch-implementations/blob/master/Show%2C%20Attend%20and%20Tell.ipynb) 10 | [Efficient Estimation of Word Representations in Vector Space](https://arxiv.org/pdf/1301.3781.pdf) | [![colab link](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/jaygala24/pytorch-implementations/blob/master/Efficient%20Estimation%20of%20Word%20Representations%20in%20Vector%20Space.ipynb) 11 | [GloVe: Global Vectors for Word Representation](https://nlp.stanford.edu/pubs/glove.pdf) | [![colab link](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/jaygala24/pytorch-implementations/blob/master/Global%20Vectors%20for%20Word%20Representation.ipynb) 12 | [Convolutional Neural Networks for Sentence Classification](https://arxiv.org/pdf/1408.5882.pdf) | [![colab link](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/jaygala24/pytorch-implementations/blob/master/Convolutional%20Neural%20Networks%20for%20Sentence%20Classification.ipynb) 13 | [Neural Machine Translation by Jointly Learning to Align and Translate](https://arxiv.org/pdf/1409.0473.pdf) | [![colab link](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/jaygala24/pytorch-implementations/blob/master/Neural%20Machine%20Translation%20by%20Jointly%20Learning%20to%20Align%20and%20Translate.ipynb) 14 | [Attention Is All You Need](https://arxiv.org/abs/1706.03762) | [![colab link](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/jaygala24/pytorch-implementations/blob/master/Attention%20Is%20All%20You%20Need.ipynb) 15 | 16 | 17 | ### Contribution 18 | 19 | If you would like to contribute a deep learning paper implementation, then please send the pull request with the jupyter notebook filename as the paper name. Maintaining a single repository showcasing different paper implementations would help other practitioners. 20 | -------------------------------------------------------------------------------- /Global Vectors for Word Representation.ipynb: -------------------------------------------------------------------------------- 1 | {"nbformat":4,"nbformat_minor":0,"metadata":{"accelerator":"GPU","colab":{"name":"Global Vectors for Word Representation.ipynb","provenance":[],"collapsed_sections":[]},"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.8.5"}},"cells":[{"cell_type":"markdown","metadata":{"id":"qyE1Ux-F_NPL"},"source":["# GloVe: Global Vectors for Word Representation\n","\n","_This notebook demonstrates the implementation of GloVe architecture proposed by [Pennington et al., 2014](https://nlp.stanford.edu/pubs/glove.pdf) for learning continuous word representations._\n"]},{"cell_type":"markdown","metadata":{"id":"OvXcHGt5_NPO"},"source":["**Note**: The notebook has been derived from my previously written blog post ([link](https://jaygala24.github.io/blog/python/pytorch/word-embeddings/word2vec/glove/2021/04/20/word_embeddings.html)).\n"]},{"cell_type":"markdown","metadata":{"id":"mzI-bvF0wZi-"},"source":["Previously, there were two main directions for learning distributed word representations: 1) count-based methods such as Latent Semantic Analysis (LSA) 2) direct prediction-based methods such as Word2Vec. Count-based methods make efficient use of statistical information about the corpus, but they do not capture the meaning of the words like word2vec and perform poorly on analogy tasks such as _**“king - queen = man - woman”**_. On the other hand, direct prediction-based methods capture the meaning of the word semantically and syntactically using local context but fail to consider the global count statistics. This is where GloVe comes into the picture and overcomes the drawbacks of both approaches by combining them. The author proposed a global log bilinear regression model to learn embeddings based on the co-occurrence of words. Note that the GloVe does not use a neural network for learning word vectors.\n"]},{"cell_type":"markdown","metadata":{"id":"2gEXhip9ZBXz"},"source":["Here we will be using text corpus of cleaned wikipedia articles provided by Matt Mahoney.\n"]},{"cell_type":"code","metadata":{"id":"4uvUbYanl_Ye"},"source":["!wget https://s3.amazonaws.com/video.udacity-data.com/topher/2018/October/5bbe6499_text8/text8.zip\n","!unzip text8.zip"],"execution_count":null,"outputs":[]},{"cell_type":"markdown","metadata":{"id":"4A7yH9Gw_NPV"},"source":["### Imports\n"]},{"cell_type":"code","metadata":{"id":"Z9vQnTNHl_WC"},"source":["%matplotlib inline\n","%config InlineBackend.figure_format = \"retina\"\n","\n","import time\n","import random\n","from collections import Counter, defaultdict\n","\n","import numpy as np\n","import matplotlib.pyplot as plt\n","from sklearn.manifold import TSNE\n","\n","import torch\n","import torch.nn as nn\n","import torch.optim as optim\n","import torch.nn.functional as F"],"execution_count":null,"outputs":[]},{"cell_type":"code","metadata":{"id":"PsPQvNL3l_UP"},"source":["# check if gpu is available since training is faster\n","device = torch.device(\"cuda\" if torch.cuda.is_available() else \"cpu\")"],"execution_count":null,"outputs":[]},{"cell_type":"markdown","metadata":{"id":"y35N6tE7_NPY"},"source":["### Data Preprocessing and Loading\n"]},{"cell_type":"markdown","metadata":{"id":"dLqfygcLyCLq"},"source":["#### Co-occurrence matrix\n","\n","The authors used a co-occurrence matrix with a context window of fixed size $m$ to learn the word embeddings. Let's try to generate this matrix for the below toy example with a context window of size 2:\n","- I like deep learning\n","- I like NLP\n","- I enjoy flying\n"]},{"cell_type":"markdown","metadata":{"id":"8zULhp8T5vzN"},"source":["![co-occurrence matrix example](data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/4QBqRXhpZgAASUkqAAgAAAADABIBAwABAAAAAQAAADEBAgARAAAAMgAAAGmHBAABAAAARAAAAAAAAABTaG90d2VsbCAwLjMwLjEwAAACAAKgCQABAAAAUAIAAAOgCQABAAAAEQEAAAAAAAD/4Qn0aHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLwA8P3hwYWNrZXQgYmVnaW49Iu+7vyIgaWQ9Ilc1TTBNcENlaGlIenJlU3pOVGN6a2M5ZCI/PiA8eDp4bXBtZXRhIHhtbG5zOng9ImFkb2JlOm5zOm1ldGEvIiB4OnhtcHRrPSJYTVAgQ29yZSA0LjQuMC1FeGl2MiI+IDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+IDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiIHhtbG5zOmV4aWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20vZXhpZi8xLjAvIiB4bWxuczp0aWZmPSJodHRwOi8vbnMuYWRvYmUuY29tL3RpZmYvMS4wLyIgZXhpZjpQaXhlbFhEaW1lbnNpb249IjU5MiIgZXhpZjpQaXhlbFlEaW1lbnNpb249IjI3MyIgdGlmZjpJbWFnZVdpZHRoPSI1OTIiIHRpZmY6SW1hZ2VIZWlnaHQ9IjI3MyIgdGlmZjpPcmllbnRhdGlvbj0iMSIvPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw/eHBhY2tldCBlbmQ9InciPz7/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0aHBwgJC4nICIsIxwcKDcpLDAxNDQ0Hyc5PTgyPC4zNDL/2wBDAQkJCQwLDBgNDRgyIRwhMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjL/wAARCAERAlADASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwDzXzH/AL7fnR5j/wB9vzqfT7GfU9RtrG2UNPcSLFGCcDJOBXV6j4DtYNQi0nTvENtf6wbhbea0EDR+WxzkhjkMBjnHSuVRb2P0GpXp05csn5/Lz7fM43zH/vt+dHmP/fb867i++HltHZao2l+IoNQvtKUteWot2j2Afe2sThsYP5VUfwK6an4bsv7QXOtwpMH8r/U7u2M/N+lCi27IzWLoNXv+D6K/bscl5j/32/OjzH/vt+ddta/D2F7PU72+1+3srTTtQeylkkgZs7f4lAOSSSPl/WtzQPhvpdv42fStYvo7y3az+02oRXTz1bPzZU/Ltx0zzmhRb/ryuRPH0IJu97eT/rqeW+Y/99vzo8x/77fnXaWHgWxv49Vv08QA6RYOifaorKSRnLAE/u8ggDOCTXH3kUUF5NDBcLcQo5VJlUqJADw2DyM0mrHRTrQqNqPTyZH5j/32/OtLw7I58TaV87f8fkPf/bFZdaXh3/kZtJ/6/If/AEMULcdRe4/Qgv5H/tG6+dv9c/f3NVvMf++351NqH/ISuv8Ars/8zXX/ABK06y0690RbK1ht1l0qGSQRIF3MS2WOOp96dtL/ANdf8iPaKMowtun+FjivMf8Avt+dHmP/AH2/Om0VJvYd5j/32/OjzH/vt+dNooCxu6tI/wDwj3h/52/1M3f/AKbNWJ5j/wB9vzrZ1b/kXfD/AP1wm/8ARzV03huJH+FGvv5cZkF/bhWdc4+Zf0q1G/4focjqqlBO28rfe2cB5j/32/OjzH/vt+de0LpNw2v+ObF7ezmuzpaLGtnbeWhYpxtUkkHp3rjR8OXbXxo66vA01vam51F1jJW0AxleD87c9BilyvT+u/8AkZ08fSlfm00T76NJ9vO3mcT5j/32/OjzH/vt+ddL4k8IjRNMstVs9Q+36dds0aytbtC6uvUFGzjvj6VzFLrY66dSFSPNHYd5j/32/OjzH/vt+dNopGljd06R/wDhFdbO9vv23f8A2mrE8x/77fnWzp3/ACKmuf79t/6E1N8MeHLnxRrAsLeVIVWNpZpnBIjRepwOvbj3qrNmCnGHPKWyf6IyPMf++350eY/99vzrtp/h4rPpM2n6uLqw1C8FmZ3tWhaKQ+qMckYyetSan8OI7PTNXntPEFte3mknN3axwsNi5/vE8nA5GOMEZocWlcj65Qulffyfe2ummumpwvmP/fb86PMf++3516LeeFNR1+HwhYQnT4/tNi0gkitzGUQYJMjZO8+/HJ96oT+ArB9PGo6X4lhv7GK6S2vJfszRm33MBuwT8y8jninyO9v63sTHG0Wld6/N9/LrbQ4nzH/vt+dHmP8A32/Ouym+Hlza6rr9rdXyxQaPb+e1wYsiXIygAzwW57npXF1JvTq06nwO/wDwVf8AI3fCUjnxPZ5dv4+/+w1YnmP/AH2/Otnwj/yM9n/wP/0BqyrS1lvr2C0gXdNPIsaL6sTgU0r6IWiqSb7L9SPzH/vt+dHmP/fb869h8PeD9P8ADs/iKD+27XUL6HSZkuLUQFTCxAIIJyGHbIxjIrlNG+Hgv9M066v9XWwl1NitlCLV5d/OAXYEBASR19afK+hzxx9F3b2Xk9dL7WucT5j/AN9vzo8x/wC+3512Vl8PZRFqFxrOorp1rZ3Rsy8du1w0ko67VXBxjnNWY/hhc/2xqthcarbQJY26XQuXQ7JIm/i9VwAfXkfjS5X/AF95o8ZQTactvXy+/dHCeY/99vzo8x/77fnXTeJvCEeh6VYatYarHqem3pZUnSExEMOoKkn0P5GuXpbOxtTqQqR5obDvMf8Avt+dbfi2Rx4lucO33Iu//TNawq2/Fv8AyMtz/uRf+i1o6Ca/er0f6GN5j/32/OjzH/vt+dem6t4em8QaL4B0yxSNJ7m1l3ORgADaSxx6DNYGt+BotP0V9W07V1v7WG4FvcF7V4DGx6EA53L703Fpswp4ylOyejf+bX42OR8x/wC+350eY/8Afb867R/AljcaJqF/pHiOLUJtPi82eIWjxrt77XY4boe1Je+A7bTvD1lqd14gt45r63jmtrTySXkLYyvXgAEc9/ajlZSxdFu19b22f+RxnmP/AH2/OjzH/vt+dejXPwpjhur/AE+LxJazarbQG4WzEDAugA6tnCnnpz2NRf8ACOXGs6D4KsmlsYI795kjlitSJFweS7bvn9ulPlbI+vUHZp6fPs327I8+8x/77fnR5j/32/Ou21T4ex2Wiale2evW1/caZIqXttFEy+Xk44Yn5j+HY88VbX4ZWkYuoLvxLHDf2VoLu6t1sndY0Iz9/PzdR0FKz3K+u0LXv+D8vLzX3o8+8x/77fnW34akcz6j87f8g257/wCwawu9bfhr/X6l/wBg25/9ANJbm1Zfu2Y3mP8A32/OjzH/AL7fnWr4Ut4bvxdo9vcRrLDLeRI6MMhlLDIIr1bVvCGjXPjLRtU0ywtxp329rC/tVjGxZEJAJXpg4/l61UYN283YwxGMhQnySXRv89PwPFPMf++350eY/wDfb869HvNI05PAni65WxtxPbayYoZRGN0ab1G1T2HJ4qTwRYx/8K81XUrfw7aaxqUV6kcUc9qZyVIXIAHPcnilFX/D8bf5kyxkVByt1seaeY/99vzo8x/77fnXa/E7SNO0nWrEWNqllNcWaTXVpG2VhkOcgen0/wAa4ik9HY6aNSNWmqiW5u2kj/8ACFasd7Z+32ff/YuKxPMf++351s2n/Ik6t/2ELP8A9AuK6T4RadYX3jASXksfmW8bPDbyRFxIcHJz0G3rzVRXM7GNSqqMKlRq9v8AJHBeY/8Afb86PMf++35161fCDW/BOqvPqcFwJ9chiOopa+UNuxBu2cYx+uK5eb4eXNrquv2t1fLFBo9v57XBiyJcjKADPBbnuelKz/r0uTTxlOV+fRr18l27v1ON8x/77fnR5j/32/OvTb/wZdeItU0qye7060YaEl2rw2pjUgHGH+Y5PPLfpWHqngJYNP0y+0fWYNUt766FmHWIxBJTwByTkcHnim4NO39b2HDG0ZWTdm/X87HHeY/99vzo8x/77fnXd6j8PdPsdJ1e7XxKk02lER3MIsnAEp4Chs85PGcVwVS9HY3pVqdVNw6eTX5jvMf++351t+KpHGsxYdv+QfZd/wDp1irCrb8Vf8hmL/sH2X/pLFR0Br96vR/oY3mP/fb86PMf++3502ika2HeY/8Afb86PMf++3502igLDvMf++350eY/99vzptFAWL+iam+i65ZamiCRrWZZdhON2D0rs7zxX4WtPEsXiXR7XVG1J7sXEsVyUWJVOd4XGTk54z0q9/wpPU/+g5pn5t/hR/wpPU/+g5pn5t/hWqU1a3Q8qrisDUlzSn0s99V5lW78YeGLC31640G31NtR1pGjkF2EEcCuSW27SSevH4fjYsPHXhfyfDl7qVlqbano0SwKkBTymA43HJySBzjjnjpTv+FJ6n/0HNM/Nv8ACj/hSep/9BzTPzb/AAoSktkYueAas5v11vtb8jF1Txhp974Y1zTY4bkTX+rtfRMyrtEZPQ89fz+tasPxE0uLxlo2q/Zrs2trpa2M67VD7sHJUZwRyOpFS/8ACk9T/wCg5pn5t/hR/wAKT1P/AKDmmfm3+FJKS0t/VrfkU6uXtWc+/frb/IzvDniLw14d1q4urO/8RW8AlVo1QRMJ4wBlZFyBnOcH0PY1yXiDUYdX8QX2oW9sLaG4maRIh/CD9O/eu+/4Unqf/Qc0z82/wo/4Unqf/Qc0z82/wpOMnbyNKeKwUJuop6vTr/keX1peHf8AkZtJ/wCvyH/0MV33/Ck9T/6Dmmfm3+FW9K+Dmo2Wr2V22s6c6wTxyFVLZIVgcDj2oUJGlTMcK4NKf5nlmof8hK6/67P/ADNdB428R2fiS50uSzjnRbSwjtpPOUDLKTkjBPHNdhc/BHV57qaUatYAO7MAQ/GTn0qP/hRmsf8AQX0/8n/wp8srWJ+v4NyjNz1Xr1PK6K9U/wCFGax/0F9P/J/8KP8AhRmsf9BfT/yf/ClyS7Gn9p4T+dfieV0V6p/wozWP+gvp/wCT/wCFH/CjNY/6C+n/AJP/AIUckuwf2nhP51+Jw2rf8i74f/64Tf8Ao5q0NH8TWWn+CNT0WWKdrm6uoZkZFGwKpUnJznPHpXcXvwc1W50vTLVdUsQ1pHIjMd2G3OW4496of8KM1j/oL6f+T/4VSUlsYfXcHOPLOfW/XvdEUvxK09PEfiTVbOO+ifULOOG0bYoZJFXGW+bgZ9M0sHxH0aLxH/bK2V7DNf2Rt9TEG1SsnGJIjnrx3x271J/wozWP+gvp/wCT/wCFH/CjNY/6C+n/AJP/AIUJT/r5/wCZhz5bb4+luuySX6L5nL+Ltfs9VtraCz1jXr8I5d/7Sddg4wNoBPPXJNcnXqn/AAozWP8AoL6f+T/4Uf8ACjNY/wCgvp/5P/hU8kt7HXSx+DpxUYz/AK+48ror1T/hRmsf9BfT/wAn/wAKP+FGax/0F9P/ACf/AAo5Jdi/7Twn86/E4bTv+RU1z/ftv/Qmq34F8UR+FNea8nilktpoGgl8k4kVTg5X3BArvbX4OarBo2oWTapYl7loirDdgbCSc8e9UP8AhRmsf9BfT/yf/CmoyWqMJY7B1FOE56P17IzrrxlpiatpFxHq/iPUYbW9S4lS+ZCoVf7qg8tz1JAqC38YWBuvGQWC6Y69lbQBVypLNjf83H3h0zWx/wAKM1j/AKC+n/k/+FH/AAo3WP8AoL6f/wCP/wCFHLLqu/46Gft8vtbn7fg79u5oarrx8D3fg4X9uXeDS2gvLZWG9VbaPpnK/pXJ6j4k8Paf4TvtC8NRag41CZZLia92AqqnIVQvXkdf8jek+COtyuXk1qxdj1Zi5P8AKm/8KM1j/oL6f+T/AOFNqTvp/V7kUquBgk3Uu162bTbWnlcseNfEEh+FuirNF5Wo6tFGLhv4pIos4J+pKn8TXkderP8ABHW5AofWrFgowu4ucD0HFN/4UZrH/QX0/wDJ/wDClKMpScrbm2FxeDw8ORVFu31/rRaHDeEf+Rns/wDgf/oDVn6XfPperWd/GoZ7aZJgp6EqQcfpXrGifBzVdM1eC8k1SxdI92VXdk5Uj096of8ACjNY/wCgvp/5P/hQoyVmi3mGElKV5qzSXXzEk8c+EIdQ1rVLSz1b7dq9pJDKJNnlxMy9hnJBIyT+VV9N+IGnyeGNN029v9d02409DHv0xl2zp2yCRggcfn61Z/4UZrH/AEF9P/J/8KP+FGax/wBBfT/yf/CnaXY5+fLrWc/6tbt2KejfECyh0zUNLvL3XLZJb1rq3v7aRWnIPG2TJAPA7d/pWt4U1Ww1OfxfdTXGq32nrpYV2vJFNwyAHcARwO+BVX/hRmsf9BfT/wAn/wAKcvwR1tAwTWrFQwwwBcZHoeKLS6rpb8LCqVMA0+Wpa9vzT/Q5rxV4l0i68OaX4d0CK8FhZO0rS3m3e7tnsvGBk/5FcdXqn/CjNY/6C+n/AJP/AIUf8KM1j/oL6f8Ak/8AhUuEm7nVSx2CpR5Yz/PrqeV1t+Lf+Rluf9yL/wBFrXc/8KM1j/oL6f8Ak/8AhV/Wvg5qup6tLdx6pYorqgCtuzwgX09qOSVhvMsL7RPn6Pv5GBZfESz06TwlLDa3EjaTBJBdKwADhwB8hz2xnnFQ+IPFul3kMYttV8RaghuUle01CRPJ2A5KnBJJ6Vrf8KM1j/oL6f8Ak/8AhR/wozWP+gvp/wCT/wCFU+dnOquXKSkp/wBXb7eZPqvxM0S6sdZihk1lxqFmYYbaVIxDbHbgBQG6ep/nXH+JPE1lrFt4bjt451bTLRIJvMUDcwxnbgnI474rqf8AhRmsf9BfT/yf/Cj/AIUZrH/QX0/8n/wotO9/66/5hSq5fSacZ/1a3Yqj4g6SPiNqXiHyLz7Hc2Rt0TYu8NtUcjdjGVPequneONMtLfwdHJDdk6LJK1ztRfmDHjZ83P44rU/4UZrH/QX0/wDJ/wDCj/hRmsf9BfT/AMn/AMKEprb+uv6i9rl1rc/S3Xs4/kzDtPFenm18XWhjnD65cI1sWChUHmM3znPHDDpmvUPE1jJqkGpabLdatpthFZK5uVEIs2CqMLu2+Yw9t3rXF/8ACjNY/wCgvp/5P/hUjfBTXmiETa5ZmNeiFnwPwxRyy5eWxnWqYOc1OFVK2u1+36I8nrb8Nf6/Uv8AsG3P/oBruf8AhRmsf9BfT/yf/Cr+k/BzVdPkumfVLFvOtJYBt3cF1wD06VKhI7auZYVwaU/zPLfD9/FpXiLTdQnV2htrmOVwgBYhWBOM9+K7nw78SrTR/F2tXlxb3M2kajcNcLEFUyRvuyrYJxn159PSrX/CjNY/6C+n/k/+FH/CjNY/6C+n/k/+FUlNbGVbE4CtfnnurdfUzrDxh4bm0XXtK1mDVRBqWotdq1mse5VyCASxxnj0NV4vGGmaP4T1jRtAk1eB7m7SW1ndlR1QBdwZkIweD0HQitn/AIUZrH/QX0/8n/wo/wCFGax/0F9P/J/8KXLK1rf1p/kR7fL7/Hpe9tbX+48ummluJmmnkeWVzlndixJ9yaZXqn/CjNY/6C+n/k/+FH/CjNY/6C+n/k/+FLkl2Ov+08J/OvxOGtP+RJ1b/sIWf/oFxVrwJ4htPDHiVdSvY5nhEMkeIVBbLDA6kV30Pwc1WLw/e6edUsS9xcwTKw3YARZQQeO/mD8jVD/hRmsf9BfT/wAn/wAKfLJGEsdg6inCc9H69kcnB4ks4/h5e6AY5/tc9+tyrhRsCgAcnOc8eldp418QSH4W6Ks0Xlajq0UYuG/ikiizgn6kqfxNV/8AhRmsf9BfT/yf/CnP8EdbkCh9asWCjC7i5wPQcUNScWrb2/AznXwMqkZ860bfXr/wbP5FaL4iaRHqVtcm3vdkWg/2awCLnzfUfN9336+1UPDOuWV1o2g+GSjC6XW47pnlwsRTpjdnOfwrW/4UZrH/AEF9P/J/8KP+FGax/wBBfT/yf/CqXPzXa/q9/wAyXVy/l5Yzt9/Zr9Tf8fWk2q6Frsl3d6xYQWUnmRJdLCtvctkgBNih26cbie1eGV6xJ8FNemVVl1yzdV+6GZzj6cVH/wAKM1j/AKC+n/k/+FQ4SbvYvCYvC4eHJ7RP5WPK62/FX/IZi/7B9l/6SxV3P/CjNY/6C+n/AJP/AIVf1n4OarqV+lxHqliirbW8OG3ZzHCkZPTuVJo5JWN3mWF9onz9H38jzO4l0I+GbSK3t7pdaEzG4lZh5TR84AGevTt61kV6p/wozWP+gvp/5P8A4Uf8KM1j/oL6f+T/AOFHJLsOOY4SK/ifmeV0V6p/wozWP+gvp/5P/hR/wozWP+gvp/5P/hRyS7Ff2nhP51+J5XRXqn/CjNY/6C+n/k/+FH/CjNY/6C+n/k/+FHJLsH9p4T+dfieV0Vp+GwD4o0kEZBvIcg/74ra+JoC/EXWAAAPMTgf7i1LWif8AXQ6fa/vvZW6X/GxyVFFFI2CiiigAooooAK2PCf8AyOWh/wDYQg/9GLWPWx4T/wCRy0P/ALCEH/oxaa3M638OXoz6Hf8A1jfU02llO1nPoSa8hOnw3Xw1uPGTF/7f3PeJe7zvQrKQEHPC7Rjb0ro83sfCeSPXaKjt5DNbRSkYLoGI+oqSm1bQE7q4UUUUhk0v/HvB/un+ZqGppf8Aj3g/3T/M1zXifSNAvbNr/wAQRLJa2kbMRJIwRR3O0HBbsD19KG7agjformPh7b3tt4LsUvvNDne8aTEl0iLEopz6LiunptWdhJ3VwooopDCiiigCaP8A49Zvqv8AWoamj/49Zvqv9az9Qszf2MlqLqe28zAMtuwVwM8gHBxnpnrzxQJFqiuP+HES2/h68gTdsi1K6RdzFjgSEDk8muwp9mCdwooopDCiiigCa1/4+U/H+VQ1Na/8fKfj/KsjX72TTvDupXsP+tt7WSVPqqkihuyuCV3Y0aK8uk0e20Pw94a8Q2e9dVlubU3NzvJe5EuA4fJ5B3fhivUapq1/J2JUr/mFFFFSUFFFFABU11/x8N9B/IVDU11/x8N9B/IUC6kNFeaxaNZ+KLbxVqmpK0l7b3dxb2kpcg2yxKNuzn5Tnk+tdl4UvptS8JaTe3LFp5rWN5GP8TbRk/jTW33fiF9bev4GxRRRSGFFFFABRRRQAVNb/ek/65t/Koamt/vSf9c2/lQJkNFYHjbUJ9K8F6te2rlJ44CEcdVJIGR9M5rm7nQ7Lwpq3ha60pGhmuboWl2wck3KuhJL5PJyM5prV2/rUJOyv6/geh0UUUhhRRRQBMv/AB5y/wDXRP5NUNTL/wAecv8A10T+TVxvjdmuDoekmR0ttR1BYrnYxUvGFZimRzg4ANHZCvZNnWUVxOj2Vv4f+ItxpGmR+Rp1zpoujbqTsSRZNu5R2yDzj0rtqfRMOtmFFFFIYUUUUAFTXX+uH/XNP/QRUNTXX+uH/XNP/QRQLqQ0VwUejWPi3xR4kOsRG5SykjtbVGYgQjywxZcHhiT168CtjwBe3GoeCNNmu5WlmCtG0jHJbY5UEn1wBTWqv6fiF9TpaKKKQwooooA+bNNvP7O1S0vfL8z7PMkuzON21gcZ7dKu+J9b/wCEj8R3mrfZ/s/2lgfK379uFA64GenpUn9m6D/0MD/+ALf/ABVH9m6D/wBDA/8A4At/8VWGp9tzU+fns72ts9vuMSitv+zdB/6GB/8AwBb/AOKo/s3Qf+hgf/wBb/4qlYv20fP7n/kYlFbf9m6D/wBDA/8A4At/8VR/Zug/9DA//gC3/wAVRYPbR8/uf+RiUVt/2boP/QwP/wCALf8AxVH9m6D/ANDA/wD4At/8VRYPbR8/uf8AkYlbHhP/AJHLQ/8AsIQf+jFp/wDZug/9DA//AIAt/wDFVq+GNP0VfFmjNFrjySC+gKJ9jZdx3jAznimlqZ1qsfZy32fR/wCR7fJ/rG+prh/+EEu/sUmijWQPD0k5mNp9m/ehS28xiTd93P8As5xxXoraeC7Hzhyf7tJ/Z4/57j/vmuhaO58RdNWKAAUAAYA4FLV7+zx/z3H/AHzR/Z4/57j/AL5oDmRRoq9/Z4/57j/vmj+zx/z3H/fNAcyK8v8Ax7wf7p/ma5PxR4YvvEF5YSw6tFbW9o3mfZprTzo5JOzMN65x2ByK7h7EGKIecPlB/h96j/s8f89x/wB80W1uHMrWMTTINQt7UpqV9FeT7iRJFb+SAvpt3N785q7V7+zx/wA9x/3zR/Z4/wCe4/75oC6KNFXv7PH/AD3H/fNH9nj/AJ7j/vmgOZFGir39nj/nuP8Avmj+zx/z3H/fNAcyK8f/AB6zfVf61Rvo7uazkSxuY7a4ONkskXmqvPPy7hnj3raSxAgkXzhyRztqP+zx/wA9x/3zRYFJHG+FvDupeHhcRXGrwXlvNLJPsWzMTCR23E7t7cdeMfjXSVe/s8f89x/3zR/Z4/57j/vmgE0ijRV7+zx/z3H/AHzR/Z4/57j/AL5oDmRRoq9/Z4/57j/vmj+zx/z3H/fNAcyK9r/x8p+P8qqXVtFeWk1rOu6KZGjdfVSMGteCxCTK3nA4z/DUf9nj/nuP++aTV1YFJJ3OAs/Bl8g0yz1DWhd6Xpkqy20AttkjFPueY+45C+wGcV2NXv7PH/Pcf980f2eP+e4/75p6sE4oo0Ve/s8f89x/3zR/Z4/57j/vmgOZFGir39nj/nuP++aP7PH/AD3H/fNAcyKNTXX/AB8N9B/IVY/s8f8APcf981JPYh5i3nAdP4fagOZXPPrvwfqHn6rHpmtLZ2GquZLmFrbe6Mww5jbcMbgO4OK6exs4dOsLeyt12wW8axRj0UDArW/s8f8APcf980f2eP8AnuP++aOlgur3KNFXv7PH/Pcf980f2eP+e4/75oDmRRoq9/Z4/wCe4/75o/s8f89x/wB80BzIo0Ve/s8f89x/3zR/Z4/57j/vmgOZFGprf70n/XNv5VY/s8f89x/3zUkNiFL/AL4HKEfd9qAckYOraZBrOk3em3OfJuYmjcr1AI6j3FYNj4W1H+0NNn1nWUvotMB+yxx23lZbbt3yHcdxAz0x613H9nj/AJ7j/vmj+zx/z3H/AHzQtNQbTKNFXv7PH/Pcf980f2eP+e4/75oDmRRoq9/Z4/57j/vmj+zx/wA9x/3zQHMiuv8Ax5y/9dE/k1YPiLQv7ds7dYrprS7tZ1uba4Cb9jr6rxkEEgjNdUtiBbuvnDllOdvoD/jUf9nj/nuP++aLBzI5PRtAubTVrnWNUv0vdRniWANFD5UcUanO1VyTyTkkmt6r39nj/nuP++aP7PH/AD3H/fNAJoo0Ve/s8f8APcf980f2eP8AnuP++aA5kUaKvf2eP+e4/wC+aP7PH/Pcf980BzIo1Ndf64f9c0/9BFWP7PH/AD3H/fNSTWIeQHzgPlUfd9FAoDmVzhb3wxqK6xf3+i6wlh/aKKt0klt5vzKNodPmGGxxzkVtaNpVvoej2umWu4w26BFLdW9SfcnJ/Gtz+zx/z3H/AHzR/Z4/57j/AL5oWisF1e5Roq9/Z4/57j/vmj+zx/z3H/fNAcyKNFXv7PH/AD3H/fNH9nj/AJ7j/vmgOZHy5Y2cuo6hb2UG3zbiVYk3HA3McDP51r3Xg3V7RNYd0hZNIdUumWUcFumM8mq/hT/kb9G/6/of/QxXoniDTrO4h+It5NaxSXNvcweTKyAtHlhnae2awt7t/X9P8z7OviJU6qgtnb8ZJHnOveH73w5dwW195XmTQLcL5bbhtbOM8deKyq958W6ZZrpF1riWUGp6lb6VbxLbzKGW3jO7Mu0/ePX6bTVOfTPCHh7+ztL1MaKllNYiSd5reRruRmB+dJACAMjpn19qcoWbXZ/5/wCRzUsz5qcW4tvy8km9PmvU8Sop8wRZ5FibdGGIVvUZ4NMrM9YKKKKACtnwj/yOmhf9hC3/APRi1jVs+Ef+R00L/sIW/wD6MWmtzOt/Dl6M+nj941zieO/DMmrppa6on2p5TCmY3CNIDgqJNuwnPGM10Z+8frXB+I9vi3xBYeHNOUNb6beR3mo3Kj5YSnKxA/32PX0FdK+JI/P3s2d3RRRQMKKKKAHt9xPof51kaz4j0rw+sJ1K68pp2KxRpG0juR1wiAscd+OK12+4n0P864hjn4zxiXouhEwZ9fO+fHvjbT3aX9bXF0b/AK3sdPpWrWGt6fHfabcpcW0mQrrkcjggg8gj0PNXa4vwEANR8XeVj7N/bUmzHTdsTfj/AIFmu0o6J90vxQdWvUKKKKQwooooAev+rf8ACqWo6jZ6TYS31/cJb2sIy8jnAH+fSrq/6t/wriPiKf3XhtZP+PdtdtRNnoRlsZ9t2KN2l3sLuzd0XxPo/iB5o9NuzJLBgyRSRPE6g9DtcA4PrjFa9cXcAf8AC5LIxY3/ANiy+fj+75q7c/jmu0p9E/63aDq1/W1wooopDCiiigB8f+sFMp8f+sFRkAggjINAjMsPEej6nqt3pljqEVxeWgDTxxZYJk45bpnPbORWpXD6PZ21h8VdStrO3it4I9HtwkcSBVX94/QCu4o6J/1u0F9Wv62TCiiigYUUUUAFPk++fwplPk++fwoEc7qnjbw7o1+9lf6ksc8YUyhYndYgem9lUhM/7RFbyOsiK6MGVhkMDkEV5zoPkP4e8fG927jqN6Jy/wDcCDbn224xXTeBPN/4QHQPPz5n2CHOev3Rj9Ka2+78UD0f3/gdDRRRSGFFFFABRRRQAU+Pq3+6aZT4+rf7poEMJABJOAKy9J8R6PrtxeQaXfxXb2bBJ/KyVUnOPm6HoehNaM0UdxC8MyLJFIpV0YZDA8EEVxfhOCG2+IHjKC3iSKGP7EqRxqFVR5R4AHSmtbg9jt6KKKQwooooAeP9U3+8P61Q1PVLHRrCS+1G5S3to8bpH9+AABySfQc1fH+qb/eH9a4nx2V/tTwgs2Ps51lN+em7Y+zP/AsUdUu7X5i2TZvaL4k0nxAJxpl35rwECWN4nidM9Mo4DAHscVq1xcY/4vPMYen9hr5+PXzjtz74zXaU+if9b2Dq1/W1wooopDCiiigAp8n3h/uj+QplPk+8P90fyFAjA1nxhoOgXQttRv8Ay59nmFEheUon95tinaPc4Fa9vcQ3dtFc28qSwSqHjkQ5VlPIINcb4a8pvGHjn7Rt80XEIbd/zy8kbfw+9+tT/C0OPhxpO7O3Enl5/ueY239MU1qr+n4g9/v/AK/ryOwooopDCiiigD5PtLqaxvIbu3fZPC6yRtgHDA5BweOtac/ivWriLVI5bzcmqMr3g8pB5hU5Hbj8MU7z/C//AEDtY/8AA+L/AOM0ef4X/wCgdrH/AIHxf/Ga5/mfeStJ3cNfl/mTL448RJqIvxqH+kfZhaEmFCpiH8JXbg/iM1PafELxPZWEVlDqIMUK7YjJBG7Rj0VipI/pVLz/AAv/ANA7WP8AwPi/+M0ef4X/AOgdrH/gfF/8Zou+5m6VJ6Ol+CMQkkknqaK2/P8AC/8A0DtY/wDA+L/4zR5/hf8A6B2sf+B8X/xmlY29o/5X+H+ZiUVt+f4X/wCgdrH/AIHxf/GaPP8AC/8A0DtY/wDA+L/4zRYPaP8Alf4f5mJWz4R/5HTQv+whb/8Aoxad5/hf/oHax/4Hxf8AxmtXwxP4c/4SzRvIsNVWb7dBsZ72NlDbxgkCIZGe2RTS1M61R+zl7r2fb/M+hz1NcpH8OfDEMskkNpdxNJIZX8vUblQXJyTgSYromv4w5Hktwf7/AP8AWpv9oR/88X/77H+FdHW58Lyu1i10FFVf7Qj/AOeL/wDfY/wo/tCP/ni//fY/woHystUVV/tCP/ni/wD32P8ACj+0I/8Ani//AH2P8KA5WXW+4n0P86xda8NaXr7W8l/DIZrckwzwzPDJHnqAyEHB9K0XvoxFEfKbkH+L3+lR/wBoR/8APF/++x/hQKzGaVpNjomnx2OnW6wW0eSEBJySckknkknueau1V/tCP/ni/wD32P8ACj+0I/8Ani//AH2P8KLhystUVV/tCP8A54v/AN9j/Cj+0I/+eL/99j/CgfKy1RVX+0I/+eL/APfY/wAKP7Qj/wCeL/8AfY/woDlZdX/Vv+FUNV0qx1vTpdP1G3W4tZQN6MSOhyCCOQQe45qZL2MwyN5TYBH8X/1qj/tCP/ni/wD32P8ACgEmUtG8M6VoMk8tjDJ58+BLPPM80jgdAWck4Hp0rXqr/aEf/PF/++x/hR/aEf8Azxf/AL7H+FFxcrLVFVf7Qj/54v8A99j/AAo/tCP/AJ4v/wB9j/CgfKy1RVX+0I/+eL/99j/Cj+0I/wDni/8A32P8KA5WXY/9YKYRkYqGC+jeZVETDP8Atf8A1qj/ALQj/wCeL/8AfY/woFZmJa+AvD1nqaalBb3gvFIIlbUbhicHIBzIQRnseK6Wqv8AaEf/ADxf/vsf4Uf2hH/zxf8A77H+FF+gcr3LVFVf7Qj/AOeL/wDfY/wo/tCP/ni//fY/woHystUVV/tCP/ni/wD32P8ACj+0I/8Ani//AH2P8KA5WWqfJ98/hVL+0I/+eL/99j/CpJ72NJSpiY9P4vb6UCszD1LwN4f1XUJb67snaWfb9oVLiREn29PMRWCvj3FdCiLGioihVUYAAwAKrf2hH/zxf/vsf4Uf2hH/AM8X/wC+x/hR5D5XuWqKq/2hH/zxf/vsf4Uf2hH/AM8X/wC+x/hQHKy1RVX+0I/+eL/99j/Cj+0I/wDni/8A32P8KA5WWqKq/wBoR/8APF/++x/hR/aEf/PF/wDvsf4UBystU+Pq3+6apf2hH/zxf/vsf4VJFfRsXxEwwhP3vb6UCsx80SzwvE+7Y6lW2sVOD6Ecj6isDTfA2gaRqf8AaVlb3SXZILSNf3D78DA3BnIbAPcGtj+0I/8Ani//AH2P8KP7Qj/54v8A99j/AAo21Hyt6Fqiqv8AaEf/ADxf/vsf4Uf2hH/zxf8A77H+FAcrLVFVf7Qj/wCeL/8AfY/wo/tCP/ni/wD32P8ACgOVl0f6pv8AeH9aztX0ew13T3sdStxPbsQ20kqQQcgggggj1Bqwt9Gbd28psBlGN3sfb2qP+0I/+eL/APfY/wAKAsypovhzTNA89rCFxLcEGaaaZ5ZJMDAy7kkgdhnFatVf7Qj/AOeL/wDfY/wo/tCP/ni//fY/wouLlZaoqr/aEf8Azxf/AL7H+FH9oR/88X/77H+FA+Vlqiqv9oR/88X/AO+x/hR/aEf/ADxf/vsf4UBystU+T7w/3R/IVS/tCP8A54v/AN9j/CpJr2NJADEx+VT971A9qBWZjav4M0PXL03l7ayee8flSvDcSQ+an919jDcPrW1b28NpbRW1vEkUMShI40GAqjgACov7Qj/54v8A99j/AAo/tCP/AJ4v/wB9j/CjyHyvctUVV/tCP/ni/wD32P8ACj+0I/8Ani//AH2P8KA5WWqKq/2hH/zxf/vsf4Uf2hH/AM8X/wC+x/hQHKz5TorX8LW1reeK9Ktr0KbaW6jWQMeCCw4P16V6r4z1CBNO8Q6ZfWmq3MSD/RFOmKkFmQflZZAfunjnv+OK5+X3eY+3rYr2dWNNRvf/ADt/Wx4nWmukxN4dfVf7SsxKs/k/Yi/74jGd4X+7717emrSx/EDRfDqwWv8AZ19pYe6QwKTKfLbG44zgbQMe5rj9HsrKX4fLbXSqtq3idIpGPGI8KDz9Kpw1t/W9jmWYOSTcbbPe+jv5eR5bRXvrNqdz4l8RaLq+npF4Ut7JzCDbKsUYAG1lfHXqevGPaqOgQWOu6VoPjG5Ef/Ejtpor1cDLmNf3f485/Glyrfpv8tQ/tO0buP3O+rV0tuu3keIUVYvruS/v7i8lx5k8rSNjpknNV6hHqIK2PCf/ACOWh/8AYQg/9GLWPWx4T/5HLQ/+whB/6MWmtzOt/Dl6M+h3/wBY31NYEPi7S7nxKNCtzNLc7ZCZVj/dApjcu49WGRnGcd633/1jfU1xeqXNuvxN0H99EAtndBvmHBynB966F8SXr+R8HJ2jf0/M7KiiigoKKKKAJpf+PeD/AHT/ADNYOseIrbR7m3tPs13e3twGaO2tIwzlV6sckAAZHJNb0v8Ax7wf7p/ma4ieVLT4swvcusaXGjmOBnOAzLLlgPfBBp7tL+tri2Tf9bnQaJrdpr1gbu0EqbZGilimXbJE68FWHYitGuR8Dss914lvISGtZ9VkMLj7r4VVYj1GQefauuo6J+gLr8wooopDCiiigCaP/j1m+q/1rL1jV7TQ9Oe+vGfy1IUKi7ndicKqgdSTxWpH/wAes31X+tcV4/YQ22hXUp221vrFvJOx6KuSMn2yRRu0vQWyb/rY1NI8TW2rX82ntZ3thfRRiU295GFZkJxuG0kEZ461t1x7Sx3nxWtmtXWQW2lOJ2Q5C75F2gn14JrsKfRP+t2g6tf1sgooopDCiiigCa1/4+U/H+VV3dY42kdgqKCWY9ABVi1/4+U/H+VYniaKafwtq0NuCZns5VQDqSUOKUnaLYRV5WM2z8dadeXVon2PUILW9k8u0vZ4AsM7dgpzkZxxkDNdPXmt9eWl/wCBfB9tZyxyXEt1ZCJEILApgvx22gHPpXpVXJWuuzt+RMXe3pf8woooqSgooooAKmuv+PhvoP5Coamuv+PhvoP5CgXU5TUvG1jp13dwix1G7jssfbLi1gDx2/GcMSQSQOTtBwK6G3niureK4gcSQyoHR16MpGQa4DSb600/RvG8N/NHHLHf3UkiOwBKOoKHHfI4FdP4NgmtvBeiwzqVlSziDK3UfKOKa2+78UDev3/gblFFFIYUUUUAFFFFABU1v96T/rm38qhqa3+9J/1zb+VAmU7q6gsrSa6uZBHBChkkduiqBkmsLTfGdlqF/a2j2Oo2RvFLWkl3CES4AGflIJIOOcEA4pvxBilm8A60kIJf7OWwOpAIJ/QGsvW7y01PUPBcdhNHK7Xi3KiNgcRLE248dByBTWr+78Qk7LTz/A7miiikMKKKKAJl/wCPOX/ron8mrO1LUrTSbJ7y9l8uFSBnBYkngAAckk9AK0V/485f+uifyaq0jxxpvlZVUfxMcAUMEUNB1u28RaTHqVpHNHDIzqFnXa4KsVORk45FaVch8NpY38IoiyKzC6uSQDkgec9dfTEgooopDCiiigAqa6/1w/65p/6CKhqa6/1w/wCuaf8AoIoF1OZ1Txda6bfzWUdhqGoT28YluBZQhxAp6biWHJAJwMn2rX0+/ttU0+C+s5BJbzoHjccZBrk9FvbbT/FfjFb6aOF/NiuMyMBmLygM89QCCKt/DiGSHwFpgkUruV5FU9lZ2Zf0IprVX9PxFfX7/wCv67nVUUUUigooooA+YgcHI61qXPiXXL2y+xXWsX81rgAxSXDMpA6ZBPNT/wBv2v8A0Lej/lP/APHaP7ftf+hb0f8AKf8A+O1zn3DbbTcNvQp/23qv26K9/tO8+1wp5cc/ntvRcYwGzkDBPHvW1feK7aXwRb+HbOweFjcC5uriSbeZZMYyBjjPH5VR/t+1/wChb0f8p/8A47R/b9r/ANC3o/5T/wDx2n0sZygpNNw29P8AMr3HiLWruxFjc6tfTWgAHkyTsyYHQYJrSsfFS6f4Fv8Aw/BbyCe+nV5bgyfLsGPlC+vHX3qr/b9r/wBC3o/5T/8Ax2j+37X/AKFvR/yn/wDjtHfXcbgmkuTZ36b/AHmJRW3/AG/a/wDQt6P+U/8A8do/t+1/6FvR/wAp/wD47Ssac8v5X+H+ZiVseE/+Ry0P/sIQf+jFp/8Ab9r/ANC3o/5T/wDx2tXwxrdtN4s0aIaBpURe+gUSIJty5kXkZkIyPcU0tTOtOXs5e70fb/M9vf8A1jfU1jy+FvD09w882g6XJM7F3kezjLMx5JJIyTXWtDBuP7hOvv8A40nkQf8APBP1/wAa6D4fmRk9KK1vIg/54J+v+NHkQf8APBP1/wAaB8yMmitbyIP+eCfr/jR5EH/PBP1/xoDmM+X/AI94P90/zNZuo6Tp2rwrDqNjbXcancqzxBwD6jPSuleGExxgwpgA468c/WmeRB/zwT9f8aLCUjEt7aC0t0t7aGOGGMYSONQqqPQAcCpa1vIg/wCeCfr/AI0eRB/zwT9f8aA5kZNFa3kQf88E/X/GjyIP+eCfr/jQPmMmitbyIP8Angn6/wCNHkQf88E/X/GgOYz4/wDj1m+q/wBaq3FvDd27wXEMc0Mg2vHIoZWHoQetbqww+U48lMHGRz/jTPIg/wCeCfr/AI0WEpnO6dpOnaRE0Wm2FtaRscssEQQMfU461crW8iD/AJ4J+v8AjR5EH/PBP1/xoDmRk0VreRB/zwT9f8aPIg/54J+v+NA+YyaK1vIg/wCeCfr/AI0eRB/zwT9f8aA5jPtf+PlPx/lUNbMUMIkBEKA+vP8AjTPIg/54J+v+NAuY5i10HR7K+e+tdLsoLt87po4FVznryBnmtGtbyIP+eCfr/jR5EH/PBP1/xoDmRk0VreRB/wA8E/X/ABo8iD/ngn6/40D5jJorW8iD/ngn6/40eRB/zwT9f8aA5jJqa6/4+G+g/kK0PIg/54J+v+NPlhhMhJhQnjnn/GgXMcrd6Do9/epe3el2VxdR42zSwKzjHTkjPFaNa3kQf88E/X/GjyIP+eCfr/jQHMjJorW8iD/ngn6/40eRB/zwT9f8aB8xk0VreRB/zwT9f8aPIg/54J+v+NAcxk0VreRB/wA8E/X/ABo8iD/ngn6/40BzGTU1v96T/rm38q0PIg/54J+v+NPjhhBbEKD5T6/40CcjFIBBBGQeoNULDQtI0ueSfT9Ls7WWTh3ggVC3tkCum8iD/ngn6/40eRB/zwT9f8aA5kZNFa3kQf8APBP1/wAaPIg/54J+v+NA+YyaK1vIg/54J+v+NHkQf88E/X/GgOYz1/485f8Aron8mqleWNpqNs1tfWsF1AxBMU8YdSR04PFdAIYfJYeSmNw459/emeRB/wA8E/X/ABosLmOasND0nSpHk07S7KzdxtZre3SMsPQlQM1frW8iD/ngn6/40eRB/wA8E/X/ABoDmRk0VreRB/zwT9f8aPIg/wCeCfr/AI0D5jJorW8iD/ngn6/40eRB/wA8E/X/ABoDmMmprr/XD/rmn/oIrQ8iD/ngn6/40+WGEuCYUJ2r6+g96Bcxy1/oWkarNHNqGmWd3JH9x54Fcr7AkVfACqFUAAcADtWv5EH/ADwT9f8AGjyIP+eCfr/jQHMjJorW8iD/AJ4J+v8AjR5EH/PBP1/xoHzGTRWt5EH/ADwT9f8AGjyIP+eCfr/jQHMfJlddoXgm4vbDV7nVLe+sfslg93b74SglI/3hyPpWT4TktYvF2kSXpQWy3cZkL/dA3Dk+1ez3cPiOH/hOX1a6LabPZzPYRtMrZUKcFFzkAAgHpyawUfdcvX8j6/G4qVOSpx0vb80tP1PDYNH1O6s3vLfTbyW1TO+eOBmRcdcsBgU2x0vUNTZ10+wurtkGWFvC0hUe+AcV7rZ3FxHp/hq/0HS77UbWGxVNtrfpFCr4w6yIRyfUmsnw3Il74FnGkWF492uqyS3Frp16sEqAk7ctj5lA2j8PaqcEpNf1vYx/tKfK5cq3S3Wm+/bby3PH49NvpmlWKyuHMLBZAsTHYScAHjgk8Ul7p97ps/kX1ncWspG7y54ijY9cEV7dptzq2pap44e0shpervb2ypEZ0YrJtbB3j5Qx4+hrk/iT9qg8K+F7LWpfM12JJWuNzh3VCRt3Ede35GolGyua0cdKpWVNpa+d38PNf06XPNKKKKk9IK2fCP8AyOmhf9hC3/8ARi1jVs+Ef+R00L/sIW//AKMWmtzOt/Dl6M+nm6muEm+Ic8drLrCaDI/hyK4MD6h9pUPgPsMgixygbvuz3xXcyDcHHrkV4vHqlrF8JZ/BbPnxFvksBp+D5rO0pIbH93ad27piulb/AKf1/Wp8B01PaAQygg5B5BpaitozDawxE5KIFJ9cCpab3EtVqFFFFIY9vuJ9D/Oub8XeKD4W0t7uPS7rUJFjeUpCNqIqjLF3PCj8yewNdI33E+h/nXF/E3WNO07wRqtreXsMFxd2cqW8cjYaVtvRR36j86mbaTaHFXZ1Vncfa7G3udu3zo1k25zjIzip6xvCuq2GreHbOXT7uG5jjiSJ2ibcFcKMqfetmtJq0mkZwbcU2FFFFSWFFFFAD1/1b/hWL4j16Lw7pYu3gkuZpJUgt7eMgNNK5wqgngfXsAa2l/1b/hXE/EcNDp2jamUZrbTdWgurkqpJWIZDNgdhuBo6pea/MO5f0bxPd3evS6Hq+k/2bqC24uolS4E6Sx52khtq8g8EYrpK4PT9QtPEvxPh1LSJ0urCw0x4ZbqI5jMkjqQgboSApJ9K7yn0T/rdi6v+uiCiiikMKKKKAHx/6wVXubiK0tZbmdwkMKGR2PZQMk1Yj/1grH8TWc2o+FtWsrcZmuLOWKMerFCBSk7RbQ4pOSTOetPHt27aXd32gSWej6pMsNrdm5V3y/8Aqy8YHyhvqcZGa7avJH1ux8ReFfCXh/TpRLqqXNp9otVB32whwZC4/hxtxz1zxXrdXJJXt3f3aEJt29P8woooqSgooooAKfJ98/hTKfJ98/hQI5XVPGB07xNp+jrpN3JHdXAt3vH/AHcSMULALnlzgc44Hrniunrznx74l0S18S+GrefVLWOay1NZblGkAMSGJsFvQcj869Ct7iG6tori3kWSGVQ6OpyGUjIIoWsb+f6L/gg/it5f5klFFFAwooooAKKKKACnx9W/3TTKfH1b/dNAijqupW2j6VdaldsVt7aJpZCBk4Azx71zdh4yv21PTLbWNAbTYdVBFnN9qEpLBdwWRQo2Er7n0q18QbC41PwDrVpaRtJO9uSiKMltpDYHucVzd1r2neMNX8IW2i3C3MtvdC9uhGM/ZkSNgQ/90liBg0R1lb0/4IS0jf1/Sx6TRRRQMKKKKAHj/VN/vD+tYniTX08P2MMotnu7q5nW2tbZGCmWVugyeAOCSewFbY/1Tf7w/rXEfEF/sT+HdYlVvsen6mkl04BPlxsjJvPsCwzR1XqvzF0fzNHQ/E1zf6zd6Lqul/2dqVvEtwI1uBMksTEjcrYHQjBBFdHXCaNeW3iH4nXWsaXMtzp1ppa2jXMfMbytJv2q3Q4A5x0zXd0+if8AW4dX/XQKKKKQwooooAKfJ94f7o/kKZT5PvD/AHR/IUCOR1LxbfprF9p2iaEdUfT41e7droQBCwyEXKnc2OccDpzW3oWsW3iDRLTVbPcILmMOoYcr6g+4OR+FcVba9p3hHxf4tj1u5W0+1yR3lq0nHnp5QUhP7xBXGBzzW58ObC503wFpcF3E0U5V5WjYYKb3ZgCOxwRTjrG/p/wQe/8AX3/13OpooopDCiiigD5JpS7NjLE4GBk9q2v+Eu1z/n+/8hJ/8TR/wl2uf8/3/kJP/ia5tD769Xsvv/4BjB3VSquwVuoB4NCO8bbkZlPqDitn/hLtc/5/v/ISf/E0f8Jdrn/P9/5CT/4mjQL1P5V9/wDwBNJ8SXOkaPq+mxQxPHqcaxyO+cptJOR+dYzMzsWYliepJzW1/wAJdrn/AD/f+Qk/+Jo/4S7XP+f7/wAhJ/8AE03ZkxjOLbUVrvq/TsYlFbf/AAl2uf8AP9/5CT/4mj/hLtc/5/v/ACEn/wATS0KvV7L7/wDgGJWz4R/5HTQv+whb/wDoxad/wl2uf8/3/kJP/ia1PDPinWZ/Fejwy3m6OS+hVh5SDILgHtTVrmdZ1PZy0Wz6/wDAPog/eP1puxd+/aN2MZxziqD3lwHYCU9ab9tuP+eproPhuVmlRWb9tuP+epo+23H/AD1NA+VmlRWb9tuP+epo+23H/PU0Bys1W+4n0P8AOmVSku5xDCRIckHP51F9tuP+epoFys0qKzfttx/z1NH224/56mgfKzSorN+23H/PU0fbbj/nqaA5WaVFZv224/56mj7bcf8APU0Bys1V/wBW/wCFMqml3ObeUmQ5BXFQ/bbj/nqaBcrNFVVF2qoUegGKWs37bcf89TR9tuP+epoDlZpUVm/bbj/nqaPttx/z1NA+VmlRWb9tuP8AnqaPttx/z1NAcrNWP/WCmVSt7udp1BkJHP8AKovttx/z1NAuVmiEUMWCgMepA5NLWb9tuP8AnqaPttx/z1NA+VmlRWb9tuP+epo+23H/AD1NAcrNKis37bcf89TR9tuP+epoDlZpU+T75/Csr7bcf89TUtzdzrOwEhAwP5UC5WXaKzfttx/z1NH224/56mgfKzSorN+23H/PU0fbbj/nqaA5WaVFZv224/56mj7bcf8APU0Bys0qKzfttx/z1NH224/56mgOVmlT4+rf7prK+23H/PU1LBdzsXzIThGP6UC5WXaRUVSSqgEnJwOtZ3224/56mj7bcf8APU0D5WaVFZv224/56mj7bcf89TQHKzSorN+23H/PU0fbbj/nqaA5Wao/1Tf7w/rTOowapLdzm1kbzDkOoB/Bqi+23H/PU0C5WaKqqKFVQoHQAYpazfttx/z1NH224/56mgOVmlRWb9tuP+epo+23H/PU0D5WaVFZv224/wCepo+23H/PU0Bys0qfJ94f7o/kKyvttx/z1NS3F3OsoAkIGxD/AOOigXKy4yKxBZQSDkZHSlrN+23H/PU0fbbj/nqaB8rNKis37bcf89TR9tuP+epoDlZpUVm/bbj/AJ6mj7bcf89TQHKz5u8NwRXXifSoJ41kiku4kdGGQylwCDXUa14Ml1Hxl4gTT/sWn6ZYTfvJrh/KhiB6DIB6+gFct4fuobHxHpl3cPsghuopJGwThQwJOBz0r0y18b6LLf8Aimz/ALRitY7+6W4tLyazM0bYABDIRntxkVikml8/0PsMVOtCpzU1fRd+/wDkcPL4G1O31sabcXWnQBrcXK3ctyFgeI8Bg/cZ9s1Lc/D/AFa31XS7FLiwuF1TItbq3mLwvjr82M8fSumh8Q6FceJ865rFlqccOnGGzuX0wpb28ueAYwPmAHfGP51du/GOgf2n4OI1WGddNnmN3LDZtCihgMFUC9Pp9TTUY6X7/hcxeJxSaSj0fR72bX46focr/wAKx106mumpPp0l6YHnaBLjLIFIG1uMBjuGO3vUF/4G1HQn0u7uGsL+zurlYQba4LIXzyjMBx0IyM9DWl4c8SaVY+N/Emo3V3stryC6WCTy2O8u+V4AyMj1qGx8QaZD4A0rTZLrF5BrS3UkexjtiA+9nGPw60oWdm/L8/8AI0lUxSdnqtOndP8AJkmpeA9R1fxTrcOm2dhp6aeYjLALolIwyjkOyjI4LHOMVnXfw71y11nTtNjNpdNqCF7ee3m3RMoGWO4gcAc9Ppmum1TxdodxceOmivtw1OGBbM+U480quD24/HFangzVbHU7nwbaWszSXGl2l212qqw8oEADOR8w9hmiMU0v67/5GLxGJpQ5mtEuqf8AInv66f8ABOA1rwRd6Joqas+qaTd2ryeUhtLkuXbvjKjOO9UPCf8AyOWh/wDYQg/9GLXa+O7aS88H2mo2N5aDSLe6aIWsGnPZ4kYZLYZmLf5964rwn/yOWh/9hCD/ANGLU/asddKrKph5Sk7vXyPoaQ4dyegJrzZ9f8Ry+FZvGcOpItokrSJpn2dNjQK+3l/vbiATkHHtXpMoy7g9ya80XRPEMfhKXwWulHymlaJdS85PKFu0m7cVzu3YOMY6963W/n/X9fefHPbXY9IikEsSSL911DD8adTY4xFEka/dRQo+gp1N76Ar21CiiikMml/494P90/zNchrF/qd74rt/D+mX39ngWjXlxcrEsj43bVVQwIGTkkkHpXXy/wDHvB/un+ZrjtYs9S0/xjb+ILDT31CF7M2dxBFIiyL825WG4gEZyCM0dVf+tP8AMXR2/rX/ACLHhHVb6/h1Gz1KRJrzTbx7V5lQJ5qgAq20cAkHkCujrnfCWl3tlDqN7qMSw3epXj3TwK4bylICqpI4JAHOPWuip9vkC/zCiiikMKKKKAJo/wDj1m+q/wBa5rxbq93penWsdgUW9v7uOzhkkXcsZc8sR3wATiulj/49Zvqv9a5fxjpV7qWnWc2nRrLeafexXkULMFEuwnK5PAJBPWjqr+Qujt/WhV0y91bTfGH9hanqP9ow3FmbqCd4UjdWVgrKQgAI5BHFdZXKaZaanqni/wDt6/059Ogt7M2sEM0iPI7MwZmOwkAcADmurp9Ff+tf8gW7/rp/mFFFFIYUUUUATWv/AB8p+P8AKoTnBx1qa1/4+U/H+VQnp60C6nI6HqWuv411DTdXntjGtlHcRwW6fLEWdhjcfmY4HU4HsK66uIsTr3/CeT6rN4auobS5tYrXc1zATHtdiWIDkkYPbmu3p/ZX9dRLd/10CiiikUFFFFABU11/x8N9B/IVDU11/wAfDfQfyFAup59LqPiHWRr2oaZqq2Vvpc0kEFt9mRxO0agsXZuQCeBtxiur0LUv7Z0Gw1LYE+1QJKVH8JIyRXImy8QaL/wkGm2GjtexancSXFrdLOipEZQAwkDEEbTzwDmuu0PTRo2g2Gmh9/2WBIiw/iIGCaa2+7/gg/i+/wD4BoUUUUhhRRRQAUUUUAFTW/3pP+ubfyqGprf70n/XNv5UCZi+JNX/ALB8OX+qBA7W0JdUPRm6AH8SK51bzxDoWqaE2qast/b6pL9nmiNukYgkKllKFRkjII+bNb/ijSH17wxqOlxuEkuISqM3QN1GfbIFYCW2u+INS0Iajo76dBpkn2i4kkmR/NlCFVCBSTjJJycU47/d93UUttPP/gHbUUUUigooooAmX/jzl/66J/Jq5jxZqt7YQ6fZ6a6RXmpXa2qTOu4RAgsz7e5ABwDXTr/x5y/9dE/k1ct4u0y+vItMvtNhE91pt4tyIC4XzVwVZQTwDg8Z9KOq+X5i1s7f1oQaNf6pZeLrnw/qd/8A2gps1vLe5aFY3A3bWVgoAPOCDiuqrldHstRv/Ftz4h1CwfT41tFs7e3lkVpCN25nbaSBzgAZ7V1VPov66/5At3/X9ahRRRSGFFFFABU11/rh/wBc0/8AQRUNTXX+uH/XNP8A0EUC6nF+MNS17TLrTZbKe1g09723gk+TfLLvfDDkYUY7jJPtXXVx3jeLWL8WVrp2hz3aQXkF20yzwopCNkqAzg549MV1VnNLcWkcs9s9rKwy0LsrMh9CVJB/A0L4fn/l/wAEH8Xy/wAyeiiigYUUUUAfO/8AwjHiD/oBan/4CSf4Uf8ACMeIP+gFqf8A4CSf4Vn/AGq4/wCe8v8A32aPtVx/z3l/77Nc+h9zar3X3f8ABND/AIRjxB/0AtT/APAST/Cj/hGPEH/QC1P/AMBJP8Kz/tVx/wA95f8Avs0farj/AJ7y/wDfZo0C1Xuvu/4Jof8ACMeIP+gFqf8A4CSf4Uf8Ix4g/wCgFqf/AICSf4Vn/arj/nvL/wB9mj7Vcf8APeX/AL7NGgWq9193/BND/hGPEH/QC1P/AMBJP8KsWWi+KtOukurLS9Ytp0+7JFbyqw/ECsf7Vcf895f++zR9quP+e8v/AH2aLg41GrO33f8ABOh1S28ba1s/tO01y7CfcWWCVgv0GMCpPDHhzXIfFmjSy6NqMcaX0DO72rgKBIpJJxwK5r7Vcf8APeX/AL7NbHhO5nbxloYM0hB1C3BBc8/vFpq1zKpCcaUkrJWfT/gn0M9vP5jfuZOp/hNJ9mn/AOeMn/fJrVJO480ZPrXQfEcxlfZp/wDnjJ/3yaPs0/8Azxk/75NauT60ZPrQHMZX2af/AJ4yf98mj7NP/wA8ZP8Avk1q5PrRk+tAcxnyW8xghAhkyAc/KfU1F9mn/wCeMn/fJrXYnYnPY/zpuT60C5jK+zT/APPGT/vk0fZp/wDnjJ/3ya1cn1oyfWgfMZX2af8A54yf98mj7NP/AM8ZP++TWrk+tGT60BzGV9mn/wCeMn/fJo+zT/8APGT/AL5NauT60ZPrQHMZ8dvMLaYeTJklcDaai+zT/wDPGT/vk1rqT5b8+lNyfWgXMZX2af8A54yf98mj7NP/AM8ZP++TWrk+tGT60D5jK+zT/wDPGT/vk0fZp/8AnjJ/3ya1cn1oyfWgOYyvs0//ADxk/wC+TR9mn/54yf8AfJrVyfWjJ9aA5jPtreYXCkwyAc9VPpUX2af/AJ4yf98mteMnzBzTcn1oFzGV9mn/AOeMn/fJo+zT/wDPGT/vk1q5PrRk+tA+Yyvs0/8Azxk/75NH2af/AJ4yf98mtXJ9aMn1oDmMr7NP/wA8ZP8Avk0fZp/+eMn/AHya1cn1oyfWgOYyvs0//PGT/vk1Lc28xnYiGQjA6KfStDJ9adITvPPpQLmMj7NP/wA8ZP8Avk0fZp/+eMn/AHya1cn1oyfWgfMZX2af/njJ/wB8mj7NP/zxk/75NauT60ZPrQHMZX2af/njJ/3yaPs0/wDzxk/75NauT60ZPrQHMZX2af8A54yf98mj7NP/AM8ZP++TWrk+tGT60BzGV9mn/wCeMn/fJqW3t5gz5hkH7th90+laGT606MnLc/wmgXMZH2af/njJ/wB8mj7NP/zxk/75NauT60ZPrQPmMr7NP/zxk/75NH2af/njJ/3ya1cn1oyfWgOYyvs0/wDzxk/75NH2af8A54yf98mtXJ9aMn1oDmM9beb7JIPJkyXXjafRqi+zT/8APGT/AL5Na4J8puf4h/Wm5PrQLmMr7NP/AM8ZP++TR9mn/wCeMn/fJrVyfWjJ9aB8xlfZp/8AnjJ/3yaPs0//ADxk/wC+TWrk+tGT60BzGV9mn/54yf8AfJo+zT/88ZP++TWrk+tGT60BzGV9mn/54yf98mpbm3mMoIhkPyJ0U/3RWhk+tOkJ3Dn+EfyoFzGR9mn/AOeMn/fJo+zT/wDPGT/vk1q5PrRk+tA+Yyvs0/8Azxk/75NH2af/AJ4yf98mtXJ9aMn1oDmMr7NP/wA8ZP8Avk0fZp/+eMn/AHya1cn1oyfWgOY+WdAhjuPEWmQTIHiku4kdG6MC4BBr1zxF4Q0a58TaTqOlWFulrb6mlhqNqkYCA7htYr0wQQD9RXj2kXcdhrVjeShmjt7iOVgvUhWBOPfiu+0f4lWmmeO9X1N7e5l0fUX3tDtXzFZcFGwTjIPv39qyg46X/rb/AIJ9djaddz56V9F99/16r0Jf7H037D8R2+wW26ynC2p8sZhHmOMJ/d6DpVX4c2MM3hvxNejRLXVr61WE20M9v52SS2QFHP5elN03xpoHneLYtUg1P7Hrk4dPsqx+Yi7mPO44B5Hr3qCw8WaH4e0rxDZaC2sxfb44RazTFFkR1zuLMhGBzxjNSrJX8vxM5QrOEqdnduL8re7f9bj/AIk6RYWFtoV3Fp0Wmaje25ku7KLhYzxg7f4epGPb2rgKlubq4vJ2nup5Z5m+9JK5Zj9SaiqXu2ejQpyp01CTu0FFFFI2Ctnwj/yOmhf9hC3/APRi1jVs+Ef+R00L/sIW/wD6MWmtzOt/Dl6M+nXO0M3pk15E1zq9z8Pp/Hqa3qKagrvdRWwnItliWQqIzF90jaOp5z3r11gCSD0NebjwX4jXw/L4QSbThoMk7EXfmP8AaFgL7zHs27d3UZ3Yx2rpW+m/9f1958BpbXY9EglE9vFKBgOgbH1GakpqIsaKijCqAAPanU3voJXtqFFFFIY9vuJ9D/OuO+IyaqvhK/u9O1eXT0tbaWZ/IUCSRgMqA/8ACOucDJ9RXYt9xPof51zHjTTta1nQLnStIj08reQSQzSXc7oUBGAVCo2e/XFTO9nYcd9TY0mR5dHsZJGLO1vGzMTkklRk1crL8Pxapb6RDb6tFZxzwqI1+yStIrKAACSyqQevGK1K0nbmdjOF1FJhRRRUlhRRRQA9f9W/4VyXjvUby003TrKxuHtZ9U1CGy+0R43RKxJYrnocKQD711q/6t/wrnPF+g3OvaXbixmihv7K6jvLVpgdhkQ9GxzggkcetGl1fa6/MO9jH0tbrw98Qk0NdSvr3T73T2uUW9naZ4pUcA4ZucEN09RXcVyukaLrFx4pfxDros4Zo7T7JbW1pI0iopbczMzKuSSBwBwBXVU+iv8A1q/0F1dv60X6hRRRSGFFFFAD4/8AWCszXNQOk6BqOoqoZrW2kmCnuVUn+lacf+sFUtSsYtT0u7sJsiK5heFyOuGBB/nSlfldhxtzK55uRquh6J4b8TNrupXV1e3Nst9DPOWgdJ8AhY/uptLDGMdK9Srz+18K+Jbq00TRtXl00aXpM0Upnt5HaW68r/VgoVATsTyenFegVcra22u7emn/AASFfS/b8dQoooqSgooooAKfJ98/hTKfJ98/hQI8x8rUfE8PijVl1vUrKTTrqe2sIbW4McSeSo5dRw+5s53Z4rtPC2qSa14V0rU5gBLdWscsmBgbioz+tczP4Z8TWEmvWOiyaadP1iZ5/OuJHWS1aRQJMKFIf1HI5612GkabFo2jWWmQEmK0hSFSepCjGaa+H7vvtqD+L7/0sXaKKKQwooooAKKKKACnx9W/3TTKfH1b/dNAjn/GesTaB4O1XVLbHnwQExZGQHPAP5kVzElrf+E9Y8MTjW9Tvl1K4Fnex3dwZEdmQsHRTwmGHRcDFdh4j0aPxD4dv9Ikk8tbqFow+M7T2OPY4Nc7a6D4k1PU9Fk8QnTY7bSGMq/ZJHdrmbaVViGUbAAScc80R+L7vu6hL4fv/Sx21FFFAwooooAeP9U3+8P61yPje9vI10bSrK6ktH1W/W2kuIjh0jCszbT2YhcZ7Zrrh/qm/wB4f1rmvFuhXms21hPps0Meo6ddpd2/n58tyAQUYjkAgnkUdV6r8xa2dvP8jL0Q3Wh/EC58PHUL29sJtOW9h+2zmZ4nD7GAduSDwcE8V21cvoei6q3ia68Ra59kiupLZbSC2tZGkWKMNuJLMBlifbgCuop9F/XX/IOrt/Wn+YUUUUhhRRRQAU+T7w/3R/IUynyfeH+6P5CgRwXj46vaXOkXtvrM9vaHUrWD7JAuzzN0mGLv1YY42jA9c13Vcf410bxHrrWdvpkWlC1trqG733NzIjs8bbtuFjYYPHOfwrqbJrtrOI30cEd0R+8WBy6A+xIBI/AUL4fn/kN7/L/MnooooAKKKKAPmT/hF7z/AJ/dH/8ABrb/APxdH/CL3n/P7o//AINbf/4usSrp0fVAEJ028AdDIp8hvmQdWHHI5HNc2h96+dbyX3f8Evf8Ivef8/uj/wDg1t//AIuj/hF7z/n90f8A8Gtv/wDF1iU/ypPK83y28vO3fjjPpmjQdqn8y+7/AIJsf8Ivef8AP7o//g1t/wD4uj/hF7z/AJ/dH/8ABrb/APxdYlFGgctT+Zfd/wAE2/8AhF7z/n90f/wa2/8A8XR/wi95/wA/uj/+DW3/APi6xKKNA5an8y+7/gm3/wAIvef8/uj/APg1t/8A4utXwx4cuoPFmjTNeaUyx30DEJqUDMQJFPAD5J9hXH1seE/+Ry0P/sIQf+jFpq1zOtGp7OWq2fT/AIJ9PFk3H97F1/vik3R/89Yv+/grJf8A1jfU02ug+H5TY3R/89Yv+/go3R/89Yv+/grHooDlNjdH/wA9Yv8Av4KN0f8Az1i/7+CseigOU22ZPLT97H0P8Y9aZuj/AOesX/fwVmy/8e8H+6f5moaA5TY3R/8APWL/AL+CjdH/AM9Yv+/grHooDlNjdH/z1i/7+CjdH/z1i/7+CseigOU2N0f/AD1i/wC/go3R/wDPWL/v4Kx6KA5TbVk8t/3sfb+MUzdH/wA9Yv8Av4KzY/8Aj1m+q/1qGgOU2N0f/PWL/v4KN0f/AD1i/wC/grHooDlNjdH/AM9Yv+/go3R/89Yv+/grHooDlNjdH/z1i/7+CjdH/wA9Yv8Av4Kx6KA5TbjZPMGJYz9HFM3R/wDPWL/v4KzbX/j5T8f5VDQHKbG6P/nrF/38FG6P/nrF/wB/BWPRQHKbG6P/AJ6xf9/BRuj/AOesX/fwVj0UBymxuj/56xf9/BRuj/56xf8AfwVj0UBymxuj/wCesX/fwU+Rk8w5ljHTq4rEqa6/4+G+g/kKA5TS3R/89Yv+/go3R/8APWL/AL+CseigOU2N0f8Az1i/7+CjdH/z1i/7+CseigOU2N0f/PWL/v4KN0f/AD1i/wC/grHooDlNjdH/AM9Yv+/go3R/89Yv+/grHooDlNjdH/z1i/7+CnxsmWxLGflPRxWJU1v96T/rm38qAcTS3R/89Yv+/go3R/8APWL/AL+CseigOU2N0f8Az1i/7+CjdH/z1i/7+CseigOU2N0f/PWL/v4KN0f/AD1i/wC/grHooDlNsMnkt+9jxuHO8e9M3R/89Yv+/grNX/jzl/66J/JqhoDlNjdH/wA9Yv8Av4KN0f8Az1i/7+CseigOU2N0f/PWL/v4KN0f/PWL/v4Kx6KA5TY3R/8APWL/AL+CjdH/AM9Yv+/grHooDlNjdH/z1i/7+CnyMm4ZljHyjq49BWJU11/rh/1zT/0EUBymluj/AOesX/fwUbo/+esX/fwVj0UBymxuj/56xf8AfwUbo/8AnrF/38FY9FAcpsbo/wDnrF/38FG6P/nrF/38FY9FAcp86eH0sZPEFimo+d9kaZQ/kgFj6deOuM+1e43l9FP8SNZtI7q9ka30ibzIZiPJiJWPHlgeo65714FaT/ZbyC427vKkV9ucZwc4rsh8QwPGOr+IP7L/AOQhaG28jz/9XlVG7dt5+70wOtYXXLb1/I+uxmGnVqc0VfT8br9CxafD621T/hFZ9PuLh7TVty3TNjMLpy4HHoGxn0qzPpMT+B/s9pql2+lt4h+yxwsseCuMCTO3Oce+PapvBfiY6H8MteMtxAJFk22MZceYJHXaxA64AIOfrXLWXi77J4VttE+xbzBqS3/nebjdgY24x+ufwq7xUrdNPzWnyM1HEzk1vyuy283f8UvkdXe/Dvw2t3rmk2Wqai+radbNdDzEURbQAdp4yTyORgc0aF8ONGvLTS/t8urvLfWhuzc2qoLaFQM7GYg/N/WsX/hYI/4SrXNb/sz/AJClm1r5Pn/6rKqN2dvP3emB1r0CC40i+0TRrO6u7OTR105Irq5TWGtvLYKflMCthjnHUc5pRScb9f8Ah/8AgGNaeKpRSk3r6X21/HZdTw26EAu5hamQ24c+UZMbtueM44zj0qKprxbdL2dbV2e2EjCJmGCyZ4J98VDWS2PdWwVseE/+Ry0P/sIQf+jFrHrY8J/8jlof/YQg/wDRi01uZ1v4cvRn0NKdrOfQk15CdPhuvhrceMmL/wBv7nvEvd53oVlICDnhdoxt6V6/J/rG+prh/wDhBLv7FJoo1kDw9JOZjafZv3oUtvMYk3fdz/s5xxXQt/6/r/hj4R7HZW8hmtopSMF0DEfUVJSABQABgDgUtN7gtFqFFFFIZNL/AMe8H+6f5muF1e0g8QfEKDRtSTz9OttNN39nYnY8jSbQWHfAHGfWu6l/494P90/zNczrPh+6utZttZ0rUEstQhha3YywebHLGTnBG4HIPIINHVX/AK0F0f8AXUo+Bd1r/bmkq7tbafqLxWwZi2yMqrBAT2GTXXVkeHtDGhWU0b3LXV1cztcXNwy7fMkbqQvYYAAHtWvT7fIF/mFFFFIYUUUUATR/8es31X+tZ+oWZv7GS1F1PbeZgGW3YK4GeQDg4z0z154rQj/49Zvqv9ao30d3NZyJY3MdtcHGyWSLzVXnn5dwzx70MEcv8OIlt/D15Am7ZFqV0i7mLHAkIHJ5NdhXN+FvDupeHhcRXGrwXlvNLJPsWzMTCR23E7t7cdeMfjXSU+i9ETFWv6sKKKKRQUUUUATWv/Hyn4/yrI1+9k07w7qV7D/rbe1klT6qpIrXtf8Aj5T8f5VUuraK8tJrWdd0UyNG6+qkYNKSbi0gjpLU8zk0e20Pw94a8Q2e9dVlubU3NzvJe5EuA4fJ5B3fhivUa46z8GXyDTLPUNaF3pemSrLbQC22SMU+55j7jkL7AZxXY1ba1t3/AA0Iimt+346hRRRUlhRRRQAVNdf8fDfQfyFQ1Ndf8fDfQfyFAup5fFo1n4otvFWqakrSXtvd3FvaSlyDbLEo27OflOeT612XhS+m1LwlpN7csWnmtY3kY/xNtGT+NZF34P1Dz9Vj0zWls7DVXMlzC1tvdGYYcxtuGNwHcHFdPY2cOnWFvZW67YLeNYox6KBgU1t93/BBr3r+v/ALFFFFIYUUUUAFFFFABU1v96T/AK5t/Koamt/vSf8AXNv5UCZzXjbUJ9K8F6te2rlJ44CEcdVJIGR9M5rm7nQ7Lwpq3ha60pGhmuboWl2wck3KuhJL5PJyM5rt9W0yDWdJu9Nuc+TcxNG5XqAR1HuKwbHwtqP9oabPrOspfRaYD9ljjtvKy23bvkO47iBnpj1px0f3Ckrr7/8AgHVUUUUigooooAmX/jzl/wCuifyauN8bs1wdD0kyOltqOoLFc7GKl4wrMUyOcHABrsl/485f+uifyasHxFoX9u2dusV01pd2s63NtcBN+x19V4yCCQRmjqvl+Yujt/Whg6PZW/h/4i3GkaZH5GnXOmi6NupOxJFk27lHbIPOPSu2rB0bQLm01a51jVL9L3UZ4lgDRQ+VHFGpztVck8k5JJrep9F/XUFuwooopDCiiigAqa6/1w/65p/6CKhqa6/1w/65p/6CKBdTgPH+nAzaRqLXV0xXU7SOODzMRJmTlto6k+pz7Yrua5rxP4c1TxBJbrBrEFpbQTR3CxtZGVvMQ5BLeYOOnGPxres0uYrSNLudJ7gDDypH5asfULk4/M0L4bef+QP4vl/mT0UUUDCiiigD59/svRP+hiT/AMA5KP7L0T/oYk/8A5KxKK57n3Ps5fzP8P8AI2/7L0T/AKGJP/AOSj+y9E/6GJP/AADkrEoouHs5fzP8P8jb/svRP+hiT/wDko/svRP+hiT/AMA5KxKKLh7OX8z/AA/yNv8AsvRP+hiT/wAA5KP7L0T/AKGJP/AOSsSii4ezl/M/w/yNv+y9E/6GJP8AwDkrV8MabpCeLNGaLXkkkF9AVT7LINx3jAyema4+tnwj/wAjpoX/AGELf/0YtNbmdaEvZy957Pt/kfSbafl2PnLyf7ppP7O/6bL/AN8mrh+8frWe2uaSmpDTX1SyW/PS1NwglP8AwDOf0roPhuZkn9nf9Nl/75NH9nf9Nl/75NW6KA5mVP7O/wCmy/8AfJo/s7/psv8A3yat0UBzMgkscxRDzl+UHsfWo/7O/wCmy/8AfJq833E+h/nVK/1Ow0q3+0ajfW1nCTt8y4lWNc+mWIFAJsT+zv8Apsv/AHyaP7O/6bL/AN8mpre5gu7dLi2mjmhkGUkiYMrD1BHBqWiwczKn9nf9Nl/75NH9nf8ATZf++TVuigOZlT+zv+my/wDfJo/s7/psv/fJq3RQHMyBLHEEi+cvJHODUf8AZ3/TZf8Avk1eX/Vv+FQyyxwQvLNIkcSAszuwAUepJ6UBdlf+zv8Apsv/AHyaP7O/6bL/AN8mk0/VtN1eJpdN1C0vY0O1ntplkAPoSpNXKA5mVP7O/wCmy/8AfJo/s7/psv8A3yat0UBzMqf2d/02X/vk0f2d/wBNl/75NW6KA5mQQWOyZW85TjPY+lR/2d/02X/vk1ej/wBYKZQHMyp/Z3/TZf8Avk0f2d/02X/vk1HBrmk3WoPYW+qWU17Hnfbx3CNIuOuVByKv0BzMqf2d/wBNl/75NH9nf9Nl/wC+TVuigOZlT+zv+my/98mj+zv+my/98mrdFAczKn9nf9Nl/wC+TUk9jvmLeco6dj6VPT5Pvn8KA5mUf7O/6bL/AN8mj+zv+my/98mpJ720tpoYZ7mGKWdtsKSSBWkPooPU/Sp6A5mVP7O/6bL/AN8mj+zv+my/98mrdFAczKn9nf8ATZf++TR/Z3/TZf8Avk1booDmZU/s7/psv/fJo/s7/psv/fJq3RQHMyp/Z3/TZf8Avk1JDY7S/wC+U5QjofSp6fH1b/dNAczKP9nf9Nl/75NH9nf9Nl/75NW6ghvbS5nngguoZZoCBNGkgZoyegYDp+NAczI/7O/6bL/3yaP7O/6bL/3yat0UBzMqf2d/02X/AL5NH9nf9Nl/75NW6KA5mQLY4t3Xzl5ZTnB7A/41H/Z3/TZf++TV4f6pv94f1qMkKCSQAOSTQF2Vf7O/6bL/AN8mj+zv+my/98mpbS8tb+3W4s7mG4hYkCSFw6kg4PI461NQHMyp/Z3/AE2X/vk0f2d/02X/AL5NW6KA5mVP7O/6bL/3yaP7O/6bL/3yat0UBzMqf2d/02X/AL5NST2O+QHzlHyqOh7KBU9Pk+8P90fyFAczKP8AZ3/TZf8Avk0f2d/02X/vk0y/1rStKeNNR1Oys2l/1YuJ1jL/AE3EZq6CGUMpBBGQR3oDmZV/s7/psv8A3yaP7O/6bL/3yat0UBzMqf2d/wBNl/75NH9nf9Nl/wC+TVuigOZnyTRU9ndNZX1vdIiO0MiyBZBlWIOcEdxVnW9Wl13WLjUp4YIZJ2BaOBdqDAA4H4VzH6BeXNa2hn0UUUigooooAKKKKACtnwj/AMjpoX/YQt//AEYtY1bPhH/kdNC/7CFv/wCjFprczrfw5ejPpyQkK5HUZrxtbG0uPgRd6zLDH/abmS9a62jzPPExwd3XPAFezH7xrjj8OtOMjw/2hqP9kvc/am0rzF+zl927H3d23dzt3YzXT/X9f10PgLnV2rvJaQvIMOyKWHvipaKKb1YkrKwUUUUhj2+4n0P864W7hh1H4vwW17Ek0NpozTwRyKGUSNLtZgD3wAK7pvuJ9D/Ouf1vwvDrF/a6jFfXmnajbI0aXNoyhijdUYMpBGRnpwaNmn/WzQujX9bmP8P41tbrxTYQKFs7bWJBAi/dQMisygdgCTx712tZmhaFaeHtONpaNLJvkaaWaZt0k0jHLOx7k1p0+iXkvyDq35v8wooopDCiiigB6/6t/wAK4j4j4ms9BsZRutL3WbaG5Q9HTJbafYlRXbr/AKt/wrJ17QrTxFpbWF4ZUXeskcsLbZInU5V1PYg0dU/NfmLuv62OaFrBpvxftUsYY4EutHkNwkShVbZIuxiB35IzXcVg6L4Xh0nUZ9Snv7zUtRmjEJubtlLLGDkIoVVAGeTxya3qfRL+t2w6t/1skFFFFIYUUUUAPj/1grG8U3M1l4S1i6tyVnhspnjI6hghINbMf+sFQzRR3EMkMqB45FKup6EHgilJXi0OLtJM8sv9LsdN8BeC76wt4oruO8sWSZFAdzJgPk9Tu3HPrXq1clp/w/srC4sd+p6ld2WnP5llZXEimKBucEYUM23PG4nFdbVyd7vu2/yIStb0t+YUUUVJQUUUUAFPk++fwplPk++fwoEee+L9Isbfxj4W1RIM3txqqo8zMWO0RPhRk/KvGcDAzzXf1zGueC113U4L6bXtYtzbyia3it3hCQuF25XdGT0J6k9a6O3iaC2iiaaSZkUKZJMbnwOpwAMn2AoXw28/0X+QP4r+X+ZJRRRQMKKKKACiiigAp8fVv900ynx9W/3TQIhmiWeCSFywWRSpKMVOCMcEcg+4rhfBGm2ekeOPGFlYQLBbRmz2ovvESSSeSSeSTya7qZDLC8ayPGWUqHTG5c9xkEZ/CuZ0jwSmka5Pqya/rNxPcFTcJO8JSbapVdwEYPAPYinHRsHsdTRRRSGFFFFADx/qm/3h/WqGqaXZ6zYtZX8RltnILx7yofBzg4IyPUdD3q+P9U3+8P61R1Kyk1Cye3jvrqyZiD59qVDjB6DcrDn6UMEcv8LEWPwLAiKFRbq6CqowABM/Ars65/wx4Ti8KwvBbarqV1bsWYQ3TRlUZmLMw2opyST1NdBTF1YUUUUhhRRRQAU+T7w/3R/IUynyfeH+6P5CgR5/o2n2Ws+MPGkmp20Ny6SxWiiZA2yHygcDPQEsTV74XyyzfDrSTK7PsV40YnOUWRlX9AKs6p4Lg1DVbnULXVdS0ya8jWK7FnIgE6gYBO5ThgOMjBxW5punWuk6bb6fZRCK2t4xHGgOcAU1pG3p+APf7/6/rsi1RRRSGFFFFAHyTRRRXKfoYUUUUAFFFFABRRRQAVs+Ef8AkdNC/wCwhb/+jFooprczrfw5ejPp4/eP1pKKK6T8/CiiigYUUUUAPb7ifQ/zplFFAgooooGFFFFABRRRQA9f9W/4UyiigQUUUUDCiiigAooooAfH/rBTKKKBBRRRQMKKKKACiiigAp8n3z+FFFAhlFFFAwooooAKKKKACiiigAp8fVv900UUCGUUUUDCiiigAooooAeP9U3+8P60yiigQUUUUDCiiigAooooAKfJ94f7o/kKKKBDKKKKBhRRRQAUUUUAf//Z)\n","\n","(image source: https://stanford.io/3n4FH4H)\n"]},{"cell_type":"code","metadata":{"id":"30vSye4Yn4ji"},"source":["class GloVeDataset(object):\n"," def __init__(self, corpus, min_count=5, window_size=5):\n"," \"\"\" Prepares the training data for the glove model.\n"," Params:\n"," corpus (string): corpus of words\n"," min_count (int): words with minimum occurrence to consider\n"," window_size (int): context window size for generating co-occurrence matrix\n"," \"\"\"\n"," self.window_size = window_size\n"," self.min_count = min_count\n","\n"," tokens = corpus.split(\" \")\n"," word_counts = Counter(tokens)\n"," # only consider the words that occur more than 5 times in the corpus \n"," word_counts = Counter({word:count for word, count in word_counts.items() if count >= min_count})\n"," \n"," self.word2idx = {word: idx for idx, (word, _) in enumerate(word_counts.most_common())}\n"," self.idx2word = {idx: word for word, idx in self.word2idx.items()}\n","\n"," # create the training corpus\n"," self.token_ids = [self.word2idx[word] for word in tokens if word in self.word2idx]\n","\n"," # create the co-occurrence matrix for corpus\n"," self.create_cooccurrence_matrix()\n","\n","\n"," def create_cooccurrence_matrix(self):\n"," \"\"\" Creates the co-occurence matrix of center and context words based on the context window size.\n"," \"\"\"\n"," cooccurrence_counts = defaultdict(Counter)\n"," for current_idx, word in enumerate(self.token_ids):\n"," # find the start and end of context window\n"," left_boundary = max(current_idx - self.window_size, 0)\n"," right_boundary = min(current_idx + self.window_size + 1, len(self.token_ids))\n","\n"," # obtain the context words and center words based on context window\n"," context_word_ids = self.token_ids[left_boundary:current_idx] + self.token_ids[current_idx + 1:right_boundary]\n"," center_word_id = self.token_ids[current_idx]\n","\n"," for idx, context_word_id in enumerate(context_word_ids):\n"," if current_idx != idx:\n"," # add (1 / distance from center word) for this pair\n"," cooccurrence_counts[center_word_id][context_word_id] += 1 / abs(current_idx - idx)\n"," \n"," # create tensors for input word ids, output word ids and their co-occurence count\n"," in_ids, out_ids, counts = [], [], []\n"," for center_word_id, counter in cooccurrence_counts.items():\n"," for context_word_id, count in counter.items():\n"," in_ids.append(center_word_id)\n"," out_ids.append(context_word_id)\n"," counts.append(count)\n","\n"," self.in_ids = torch.tensor(in_ids, dtype=torch.long)\n"," self.out_ids = torch.tensor(out_ids, dtype=torch.long)\n"," self.cooccurrence_counts = torch.tensor(counts, dtype=torch.float)\n","\n","\n"," def get_batches(self, batch_size):\n"," \"\"\" Creates the batches for training the network.\n"," Params:\n"," batch_size (int): size of the batch\n"," Returns:\n"," batch (torch tensor of shape (batch_size, 3)): tensor of word pair ids and \n"," co-occurence counts for a given batch\n"," \"\"\"\n"," random_ids = torch.tensor(np.random.choice(len(self.in_ids), len(self.in_ids), replace=False), dtype=torch.long)\n","\n"," for i in range(0, len(random_ids), batch_size):\n"," batch_ids = random_ids[i: i+batch_size]\n"," yield self.in_ids[batch_ids], self.out_ids[batch_ids], self.cooccurrence_counts[batch_ids]\n"],"execution_count":null,"outputs":[]},{"cell_type":"code","metadata":{"id":"FWvhJYihAm0t"},"source":["# read the file and initialize the GloVeDataset\n","with open(\"text8\", encoding=\"utf-8\") as f:\n"," corpus = f.read()\n","\n","dataset = GloVeDataset(corpus)"],"execution_count":null,"outputs":[]},{"cell_type":"markdown","metadata":{"id":"QsjjWFkw-fxO"},"source":["### GloVe Model\n","\n","Before we move ahead, let's get familiarized with some notations.\n","- $X$ denotes the word-word co-occurrence matrix\n","- $X_{ij}$ denotes the number of times word $j$ occurs in the context of word $i$\n","- $X_i$ = $\\sum_{k}{X_{ik}}$ denotes the number of times any word $k$ appearing in context of word $i$ and $k$ represents the total number of distinct words that appear in context of word $i$)\n","- $P_{ij} = P(j | i) = \\frac{X_{ij}}{X_i}$ denotes the co-occurence probablity i.e. probability that word $j$ appears in the context of word $i$\n","\n","The denominator term in the co-occurrence probability accounts for global statistics, which word2vec does not uses. The main idea behind the GloVe is to encode meaning using the ratios of co-occurrence probabilities. Let's understand the above by deriving the linear meaning components for the following words based on co-occurrence probability.\n"]},{"cell_type":"markdown","metadata":{"id":"jk6DHrzi6gYg"},"source":["![co-occurence probabilities example](data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0aHBwgJC4nICIsIxwcKDcpLDAxNDQ0Hyc5PTgyPC4zNDL/2wBDAQkJCQwLDBgNDRgyIRwhMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjL/wAARCADAA4UDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwD3+iimyyJDE8sh2ogLMfQCgB1FcufiP4NWRkbxJpyuhwwMwBX6+lbunarp+r232nTb62vIM48y3lWRc+mQaALdFFFABRVPU9W0/RbJrzU72Cztl4Ms8gRc+nPU+1P07ULXVdPgv7GYTWs6B4pACAynvzQBZoopskiQxPLK6pGgLMzHAUDqSaAHUVmaN4i0jxCtw+kahBepbyeXI8LblDYzjPQ8elXri4htLaW5uJFjhiQvI7dFUDJJ/Ch6bgtdiWiseLxVoM2gJry6rarpcgJW6kfYhwSMfNjnIPHWnReJdGm8Ot4gjv4zpKo0hucELtUkE9M9QaHpv0BamtRVewv7XVLCC+splntZ0EkUi9GU9DVijYNwooooAKKKKACiiigAorJm8T6Jb67Bokmp2w1Sc4S1D7pOhbkDpwCecVquwRGdjhVGSfajpcPIWiuYf4i+Do5WifxHp6yISGRpQCpHXI7VsaXrela3C02lalaX0a8M1tMsm364PFAF+iiigAopskiQxPLIwVEUszHoAOpqlo2t6b4g02PUdKu0urSQkLKmQCQcEc80AX6KKKACsXSLqefxB4ggllZore4iWJT0QGBGIH4kn8a2q5/Q/wDkZ/FH/X1B/wCk8dAHQUUUUAFFFZC+KNFbxANBW/RtUKl/s4ViQB1JOMD86ANeiiigAooooAKKKKACiiigAorIs/FGi6hrc+jWl+kuowIZJYFVsooIGScY6kd6vw39ncXc9pDdwSXNvjzoUkBeLPI3KORntmgCxRTJpkt4XmlbbGilmOM4ArO0TxFpPiOCefSLxbqKCUwyOqsArgAkcgZ6igDUooooAKKKKACiiigAoorK1zxJo/hq1W51i+jtIWOAzgnJ/AGgDVopsciyxJIhyrgMCRjg06gAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKyLjxRotprtvok1+i6lcHEVvtYs3GewwOKPIPM16KKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooqC9vbfT7SS6u5VigjGXdugFAE9FZ+ja3p3iHTU1DSrpbm0dmVZVUgMQcHGQO9aFABRRRQAUUUjMFUsxAAGST2oAWisnTvE+i6vetZ2N/HNcCPzggBG+PON6kjDLnjcuRWtQAUUVnazrumeHrE3urXiWtsDgyOCR+goA0aKhtLqG+s4bu3ffBMiyRtgjcpGQcHnpTZ7+ztbi3t7i7ghmuWKwRySBWlIGSFB5Jx6UWs7B5liiiigAooooAKKKKACiiigAooooA8e+HrxQ/GP4gmRkRfMUksQB945qlok0Mfx31m/wDC0LT6NDZf8TBbAAxyS44C8hS27Hfs3vSeC9I0bXPjL48j1TTrG/EcoaNbqBJdp3EEgMDjtmvZbaws9Nsjb2NpBawKCRHBGEUfgOKmOlOMv7v+Y5a1Jrz/AMjhdH+Kh8QW1pdaT4W1e6tprz7LNIir/o4yAGbGfqccAdTyK3F8XTalfaha+H9LOpDT5DDcTvcLDH5oGTGhIJZh34AGetcz8CCG+HLBWGft0/TtyKh+C8kmmxeI/DWoZTVLLUpJpEfhnRwMOPUHHX3HrV21t5X/AC/zZPd+dvz/AOAaOreLdP8AFvww8VPbRywXNpZ3EF3aXCgSQSBDwQMjtwRXP+GviFP4Z+G+h3DeFtVutJtrSNLjUI9oVT0JVCdzAHjdwPeqYs2nl+Let2o/4llxbPBE6/dlkSNvMI9cHIz7mun0O7soP2f7aW8kj+zf2MyNkj5iUK7R6knjHrUXtFzXaLt95VrzUfNr8jf1Hx5pVpp+iXNpuvX1uRY9PjjIXzCccsT90DIz39jU2keK1vvE194cvbI2eqWkK3BVZBJHLG3G5WwDweCCBXnGl6pd+CfC3gPwveCGyvdRaR3vbpAfsali2FDcByHC88DuDVvQrvTYvj9f+TqguUbRlj8+W5D+ZJ5i5AOcZ/2V4HoK0suey2u/wX+ZF/dv5L8WZ/gXxDe6Le+NY9M8PX2sT/23PIyW5VFRc92bqTzhQCeK7/RPiBpfiXwleaxa2N5L9l3R3dh5amZGA5UqSAePf9eK5/4ROo1DxyCwBXXZiRnoMnn9DUHgew23XxC16HC6ZqFzILZx92QIH3uvqpLHn2NZN2h/26n+CNEry/7ea/FnQaZrWneI/hLeajpenrYWMtldLFbBVUIFDr0XgZxnA9aw/Aeq2ujfATT76+06a/s47eZp4Io1fKCRychiARjrUXw3ZR+z2TkYFne59vmkqHwwwH7MkxyMf2Xdj9ZKup7qqW8v/bhQ15L93+hp+KvG13p/wbi8ReHdOS2SeBBGCyqLRGIUEKOCRkYA4H4YOlqfjbUPDXgiHXdR0CeWKNYxKI7lGfaQMSH2JPPcVxeugyfss2uz5sWdsTj2lXNen2aaZ4k8JLpxmhube4sUjmWNw2FdO+OntTkmue3RkQd1Bvqn+hHqPihrDwlb66tkLjz/ACtlvFOCX8wgIFbGCSWX0781vxM7RI0iBHKgsoOdp9M968d+HiapPqkHgrVY3ZPCl3JM8zfdlXGLcf8AjzMP91a9lodt1s9vQavs91v6nMTeL/P8S32gaRY/bb7T4VluvMmEKJuGVUHBLMR7Y96r2/xBsbvwHL4sttPvZreAP59umwSRFM7s5YAgY7E8dqxYfFtrq/jvxFpV1fwaNZ6UqJIQ6xTXhwckyHkIvQbcHkc84rk/Bd1bH4CeK4EnQyKL5vLL5cLt4JB57iov7jflf8S7e8l52/A6+5+K/wBl8PWPiJvDOpHQ5ljM95vQCEscYCE7nAJxuwB6E11OteKbTSV0+OKKS9vdSbZZWsJAabjJbJ4VQOST0rzPxAwH7LdvkjmxtR/5ESnarqCaF8SfAWr6lIItJl0n7Klw5+SOVkPU9BnK8+n0rSy5nHzt+Df6W+Zmn7ql5X/L/P8AAs+IL29ufjb4Gjv9MNlNGlycrKJY5AUP3WwDxg5BA/WvXq8k8Z6xpg+M/gZzqFrshS4Mj+au1NyYXJzgZ7V631qY/AvV/mVL4/kjxfw7fWOm/tDeMZr26t7WM2iAPNIqAnER6mmWBh1r9oGDVvCKh9KhtSmqXdsuIJXIbjcOGOSnT0z2qHStI0vxD8efG+nanbw3ME1kE2uASDiIEqexHqOlXvButXnw38U/8ID4jnLabMxbRr+TgFSf9WT2549jx0Iop/DT9NPx/rzCe8/XX8P68j0LWPFcOneIdP8AD9tbm61a+R5Y4i/loiLnLO2DjocAAmqVn42fUbDxAltpjjWNFYpPZSTAKzYypD91IBOcA8dKzfEPitU+JOn+F/tEGmB7NrmXUJAnmMuTiKMtwuduSTnpxzzXN+B7mwbxh8R4bS9WdZvLFuWn8xpv3b8gkkt9f6VDb5W12b+5lJK69V+Jv/DnxZrOs+A01fVtNnuw/nS+bC6MZf3rDYqEjAA4GT0FavhLxfoV94EfxBa2aaRo8DSkxlFQIqk5O1eAT6DNYXwYv7Q/CjTbX7VD9oUXGYt43DEjE8dehH5iuL0PTrzWP2YtQtdPVpJxPJJ5acllWUMwx9B0q6mjlbol+ZEdeW/V/wCZ6ZdePLuz0FPEU3hu7GiMokMomQzpEekhi/u4IP3sgdRXWaff2uqafb39lMs1rcRiSKRejKeQa4+LxBpmpfBh9Vklj+yPpLJKMjh/L2lPru4xU/wq0q80b4aaNZ36MlwImkZG4KB3LAH0OCOKpq0pLt/wf8hJ3jF9/wDgHZVz+h/8jP4o/wCvqD/0njroK5/Q/wDkZ/FH/X1B/wCk8dSUdBRRRQAV5ZYalC/xO8Y+KbhGks9DtY9Oj2Fck/fkA3EDOeOvevS7+8i07Trm9nO2K3iaVz6BQSf5V4L4Sa/8Pnwz4m1qVZdH16/nmuInQBba4lP7qUnucLwTwoJx60R1l/W70X6g9I/1stX+h7no+pPq2nx3jafeWIkGVivFVZMepVWOPocH2p2ratY6Hps2o6lcLb2kOPMlYEhckAdAT1Iqe1u4L2HzraQSRbmUOvQkHBx68g81Bq09/babNNpllHe3i48u3km8pX5GfmwccZPTtQ/IF5nL/wDC3PAf/QxQf9+pP/ia2NA8Y+H/ABTJPHoupR3jQAGQKjLtB6feA9Kx/wC3vH//AEJFh/4Ol/8AjdbOgah4ivZJxrmhW+mIoHlNFfC43nuCAox2poTNwkAZPQVyFt8QrK+tIL+z0vUZ9OnvRZRXiLHsZy+zcRv3Bd3cj8OldBq2r2ejWkdxevsiknjgB44aRgozntk15z4WsJvB3xU1HwpbgT6HqMB1W3iPP2Rw2CPYZHH0X3pR1l/XTX8hvSP9en52O81PxLY6dqdvpSrLd6ncKXjs7YBpNg6u2SFVfdiM9Bk0zRvFNnq+rahpHkz2mpaftM9tOFztYZVlKkhlP1+oFcT8LGF3feMfE+qOFvn1OS3kaU48iGIDC89AM/oKqaNPPbSeN/ibcRtFb3FuU01HGDJDGuFfHoxC4/8Ar0r2V32v/l/XqO13Zd7f5/16Gn4BdtU8W+NvFQieZWuxYWypjLJCuDtyQOTjuK2PA+o+HvEM+seItH0mezuJrj7PdT3AUNM0YHTDMMDPXjNc94VvYvCPwPmuFfdeW9g15M2OBNKC6qT/AHvmXI+nrXNaheP4W/Z+sdO0+42XV5JHBd3C5/cmfMj5bpnadp9M1TTi+Xqkl83p93+YtJa9238l/SPSNT+IFjb6LqeqWNnd3lhYq4e+iCCHeOMKSwZwDgEqCPeq/wAI9Lk034cac84/0m+3XszHqzSHcCf+A7a5r4k3Wn6d4J0nwPo7xhb6e2sWdGG2GPIOWPqdufpk16nprWrabb/YSDarGEiIBAKjgYz244PcULTma9P1f6fcJu9vv/y/UtUUUUhhRRRQAUUUUAFec/FT/ia3XhbwsvP9qamsky+sMXzP/T8q9GrxPxrba14n+IeuyaDdvBP4d0gJGUXLPLJ8zIp/hJTIyOaV7NPtr92o0rp/d9+n6nqGmeJI9U1e80+20y/Edm5iku2EfkbgPuqwclj2IA4PBxW5XNeCfEWk674a0yTTfJi32oc2sQ4hwdrKcdMNkc9cH3rpapq2hKd1c4+5+KfgmzuprW416FJoXMciGKT5WBwR931p1l8UPBeoXsFnaa7DLcTuI40EUg3MTgDlabc6345jupkt/BtlNArkRyHWApdc8Ejy+MjtTrPWvG8t7BHd+D7KC2ZwJZV1cOUXPJC+WM4HalHW1xs66sHUPFdlZ69FoVvBcX+qyRmY21sFzHH/AH3ZiFUZ98nsK3q8muNVstC+MuuCz1DT47+/sYRIuqSmBEkAAURtg78jBK8c4wTzhdUv62Do3/W53Hhvxhp/iea+gtLe9hnsZWguUuIcCORTgrvGVJ+hPFNfxlZO1+1ja3d/bafuF3c24Tyo2UZZQWYb2A6hc46deK43XdNm+GXwj1+6s7yS61W8kM1xe425llYKWUfwgA8VV8T6nZ+EPgnHo+iyRT3E1jHEWiYHAlwGkYj+8WOPUn2OB3s7bqy+bGrXV9nf7kdvb+PNJl8CHxhMlzbaZsZwJUHmMA20YAJHzHpz3FWtP8T/AG3WINMl0jULOae1N2jzeWUKAqMZR2+b5hxWJDZeHtQ8K2XgKWXzI7jTWRGUYDCLYpZT3IYggjI4NVfhLeajJot/pGqlZ7jQryTTo7wDPmxrjAz7cD8BV2XM7bdPTb87EJvlT/rv+Vz0OiiipKCiiigAooooAK8ynuU1D413l7L81p4Z0nn5lG2WXk8sQB8mepHSvTHZURnY4VRkk9hXzxp1zfWyr8QbyTztA1PX3N7atHwIclIpGPcI3QdM4P0S1mv630/Ub+F/1tr+h7noGt/2/py3y6bf2MLgGMXqIjOPUKGJA+uKu399baZYT315KIraBDJLIQSFUdTxRaXttfI72syzIjbC6crnAPB6Hr2+lF/LdQ2E8tlbLc3SoTFC8nlh27Atg4+uKcvISOS/4W54D/6GKD/v1J/8TWpoXjnw14mvXs9G1WO7uEQyMio4wuQM8gdyKy/7e8f/APQkWH/g6X/43WpoWpeJ7y9ePWvDttptuEJWWLUBOS2RxtCDHGec9qaEzZvrprKyluVtprkxqW8qHbvbHpuIH61h6Z430jUvBH/CW7pbfTRG8jeeAHUKxUggEjORwAe4royMgg9DXhXhHTbvVfht4j0qaFk07S2v0iz0mmO7GPZMk/7zD+7UN2UvS/3f8OWldr1serah4us9P0jSNUa0vJrXU5YYo2hjDGLzcbWfngZIHGeTVjUvEdnp2pW+lpHNeancKXS0tgC4QdXYkhVX3JGegya5T4ezyeIvCXh2Ro2GnadaRcsP9fcKuOP9lP1b/d5yPhlrVrcW/iXxbqU6vqV9qLwLDuBkVEA8uJR1zz0q5JKTXRXfy0S/rsRFtxT9Pv1f5Hb6R4xttZ1vVdJg0++jutLRTciQJjc2SEUhiCSBn05HNYfg7xrq/ijxXrMcuj3FrpVlL9kT5om2SrkuZGDZz90ALuA7nvWJ8NNchj8K+JvFd66m8vLi41CVF+bZEmVRSe33WAz1qnoN9c6D8AtT1Gxdn1eaGS+nkjGSjzNkNn+8EIbHbipb5VzPovxf9Mq13yrq7fJf0jvNT8e6bYRapNbW13qMOlKTfS2oTZCRyV3OyhmA/hXJHfFO1vxzYaHpWl6lJY31xbam8Udu0Kp96QZUMGYEcexrj/CvhjRX+H+g2+ra0LrTJ1SVbCAbEuZmIYiTBLykN1GQOOV4qX4g248SfEHwj4Rj4tomfUbtU42xoMKPbOGH41TVpKPn/wAOTe65vL/hjsdG8Y2Wua/d6VaWeoKLeISi7ltykEyk4zGx+8PQ4wcEjNdFTURY0VEUKijAUDAAp1IYUUUUAFcz8Q9Z/sHwBrWoK22RbZo4j/tv8i/qwrpq80+LCy6zd+F/CdvKI5NT1ASyNt3ARRDcxI79Qce1TJc3u99Couz5u2pf8LXkfhHRfDvhRNKv7u9Nkssn2URlYyeXZyzjaNxOM9e2a7yvOfhvra2yatouuTJ/wkFnqLQ3ErD95dhzmOTA5I28DsAvYV6NWknf3u+v36mcVb3exzWtfEDwr4e1FtP1XV4ra7VQxjaNyQD06KRWf/wtzwH/ANDFB/36k/8Aia0NZ1XxZaai0Wk+GbW/tAoKzyakIST3G3Yen1rP/t7x/wD9CRYf+Dpf/jdQi2djbzxXVtFcQuHilQOjDupGQa85+Lev3sGkQ+HbOwvfO1m5js0uI2jCurH51XL7skccgDnrXo1u0r20TzxiKZkBeMNuCtjkZ74PevPPEC/2x8bfDGnfej0qzm1CQdst8i/qAabV5Jef5a/oJO0W/L/hvxN6TUdE0OCx1C50drPUZUFjaW3kxvdyKDxGuxmG3jP3sDqcVJF4zgfxZa+GptMv7fUZ4GuSHEZSOIfxFlc9TxgZ5H0J5DRtRttS+M3ifUdXuooU0G3jtbNJnCiNXGXkGe5Ixn0YCofC+vW+ofErxb4iv90S2cC2VrERlxEimSQkdugJzjBYA80KV7N9m/l0/GwNWul5L+vRfkdld+OLOHUtWsrXT7+/fSI1kvmthHiPcpYABnUscAnAB/Piua+KOojWfB+h6TAHiPiK8t4yr4DJFxIxP0AGaoa7/wASXx94c8Z6E/nWXiV4rK+tQciYOuUkA9QvX6e5q3rVkvin42aZphx/Z+g6e1xOgHBeT5Qh9iu38MihLZPvr8tX9+gN2u12/PRfidJYeOtKl8T2fhqCzv4zPbtJaXDwhYZUQc7Tndjjg4APbqKr3mp6BrPxHstCvtDupNY06Nr22uZAnlxIcDcCHzyQMAj06ViaRd22p/HHWr2WQbdNtotLtEAyWdsu5AHpggntTPBF7DqPxD8Za87B53uDp9nGBltkC/OfYE7eTxkgd6E9pPs3/l+aYNWul5L/AD/U7m88T2dvrI0a2imvtT2ea9tbBSYk7M7MQqg9gTk9garaf4zsNRtNVeK1vFutKkMd5ZMq+chHORhtpBGSCD2rj/hDcQW/gjVfFmrXCrd315NcX08hwUCEgKfQDnA9659zf6J8PPGvi+8hkt77xLNstLdxh0jclI8js2GJx6AUpXS87fi7WQ1Zv52+SvdncD4q6O/hP/hIodO1SW22tJ5KQqZFiVipkb5tqqSDjJycHA4Ndjpt/Dqml2moW+7yLqFJo94wdrAEZHrzXknivRR4Y+Eej+FEkC3ur3NtZTzHjk4LH6ALj6V61pb2r6XbfYf+PVYwsJ2kAqOARntgcHuKtpa26O39fh+JCb089f6/Et0UUVJQUUUUAFNkjSaJ4pUV43BVlYZDA9QRWD/wmelf8+2uf+CK9/8AjVH/AAmelf8APtrn/givf/jVAE9r4R8NWV0t1aeHdJt7hTuWWKyjRwfUELmtO6tLa+tpLa7t4riCQYeKVA6sPQg8GsX/AITPSv8An21z/wAEV7/8ao/4TPSv+fbXP/BFe/8AxqgC/pugaNoxc6XpNhYl/vG1tki3fXaBmm6l4c0XWJ0n1HSrO6mjG1ZZYVZgPTPXHt0ql/wmelf8+2uf+CK9/wDjVH/CZ6V/z7a5/wCCK9/+NUAbUNpbW1otrBbxRWyLsWFECoF9ABxisq18H+GrK8F3a6DpsNwG3q8dsilW9RxwfcVF/wAJnpX/AD7a5/4Ir3/41R/wmelf8+2uf+CK9/8AjVHW4eRo6roela7AkOraba30Ubb0S4iWQKfUZFRjw5ogvrW+GkWIurSPy7eUW6holHQKccDk9PU1S/4TPSv+fbXP/BFe/wDxqj/hM9K/59tc/wDBFe//ABqgCe98I+HNRvTe3mh6fPct96WS3Us/+8cfN+NX7jTbC7sfsNzZW01ngL9nkiVo8DoNpGMVk/8ACZ6V/wA+2uf+CK9/+NUf8JnpX/Ptrn/givf/AI1R0sHmWo/C3h6GyksotB0tLSU5kgWzjEbn1K4waRfCvh1LFrFdA0tbRm3NALOMRk+pXGM1W/4TPSv+fbXP/BFe/wDxqj/hM9K/59tc/wDBFe//ABqgC/DoGjW2my6bb6TYw2MwIkto7dFjcHrlQMGsPWrxPAOi2y+HvCM99A8+17bS4gpjyPvkAHPTr+Zq7/wmelf8+2uf+CK9/wDjVH/CZ6V/z7a5/wCCK9/+NUMBnhLTruKG91fVLcW+p6rMJ5odwYwoFCxxkjqQo59ya6Ouf/4TPSv+fbXP/BFe/wDxqj/hM9K/59tc/wDBFe//ABqgC7N4c0S41dNWm0ixk1FMbbp4FMgx0+YjOR61EvhLw4sd1H/YOmGO7fzLhWtUIlbrlgRz1P51X/4TPSv+fbXP/BFe/wDxqj/hM9K/59tc/wDBFe//ABqgCy3hTw41gtg2gaUbNX3rbmzj8sN6hcYz71NL4f0afSl0uXSbF9PX7tq1uhiX6LjAqh/wmelf8+2uf+CK9/8AjVH/AAmelf8APtrn/givf/jVAFiz8KeHtPMBs9D06A2+TCUtkBjJxkg44JwOfatdlV0KOoZWGCCMgisD/hM9K/59tc/8EV7/APGqP+Ez0r/n21z/AMEV7/8AGqAJoPB/hi2ulurfw5pEVwrblljsY1cH1BC5zVvU9E0nWkjTVdLsr9YySi3VukoUnqRuBxWd/wAJnpX/AD7a5/4Ir3/41R/wmelf8+2uf+CK9/8AjVAFq88LeH9QFqLzRNOuFtBttxLbIwiHooI4HtU0WhaRBq0mqxaZaJqEiBHuVhUSFQMY3YzjAA/AVn/8JnpX/Ptrn/givf8A41R/wmelf8+2uf8Agivf/jVAFi38J+HbVbpYNC02Nbs5uAtsmJe/zDHPNWdN0PSNGV10vS7KxD/fFrbpFu+u0DNZ3/CZ6V/z7a5/4Ir3/wCNUf8ACZ6V/wA+2uf+CK9/+NUAWF8J+HkvzfJomnrdF/MMgt1zv/vdPve/Wtiuf/4TPSv+fbXP/BFe/wDxqj/hM9K/59tc/wDBFe//ABqgDoK5/Q/+Rn8Uf9fUH/pPHR/wmelf8+2uf+CK9/8AjVYej+LNNj8ReIpGt9YKy3MJULo12xGIIxyBFlenfHr0oA7yiuf/AOEz0r/n21z/AMEV7/8AGqP+Ez0r/n21z/wRXv8A8aoA27i3gu7aS2uYY5oJVKSRSqGV1PUEHgiq1zoul3mkjSrnTrWXTgqoLVol8sBegC4wAMDFZv8Awmelf8+2uf8Agivf/jVH/CZ6V/z7a5/4Ir3/AONUAbsMMVtBHBBGkUMahUjRQqqB0AA6Cn1z/wDwmelf8+2uf+CK9/8AjVH/AAmelf8APtrn/givf/jVAHQUVz//AAmelf8APtrn/givf/jVH/CZ6V/z7a5/4Ir3/wCNUAa2oaZY6tbfZtRs4Lu33BvKnjDoSOhIPBqOx0fTdMkkksbG3t5JcCR40AZgOgJ6kDsO1Zv/AAmelf8APtrn/givf/jVH/CZ6V/z7a5/4Ir3/wCNUAXJvDmiXF5JdzaVZvcSkGR2hUmQjoW/vEds9Ku3dnbX9nLZ3dvHPbSqUkikUMrL6EVjf8JnpX/Ptrn/AIIr3/41R/wmelf8+2uf+CK9/wDjVHSweZoLoekpox0ddOtV00oUNqIgIyp6jb0ofQdIk0YaO+mWjaaF2i0MK+UB1+7jHXms/wD4TPSv+fbXP/BFe/8Axqj/AITPSv8An21z/wAEV7/8aoeobE3/AAiHhw6fBYf2Fp32S3l86KD7OuxH/vAY6+9bQAAwBgCuf/4TPSv+fbXP/BFe/wDxqj/hM9K/59tc/wDBFe//ABqgDoKK5/8A4TPSv+fbXP8AwRXv/wAao/4TPSv+fbXP/BFe/wDxqgDoKK5//hM9K/59tc/8EV7/APGqP+Ez0r/n21z/AMEV7/8AGqAOgorn/wDhM9K/59tc/wDBFe//ABqj/hM9K/59tc/8EV7/APGqAOgqtb6fZWlxcXFtZ28M1ywaeSOJVaVh0LEDLH61kf8ACZ6V/wA+2uf+CK9/+NUf8JnpX/Ptrn/givf/AI1QBpado2maR5/9nWFtafaJDLN5EQTzGPc46mr1c/8A8JnpX/Ptrn/givf/AI1R/wAJnpX/AD7a5/4Ir3/41QB0FFc//wAJnpX/AD7a5/4Ir3/41R/wmelf8+2uf+CK9/8AjVAG5OJWt5BCwWUqQjMMgNjjNedWej2N/wCFBpnivwvdX+s7SLh2tfMaeU/xpOPlUHjGWXaMDAxXU/8ACZ6V/wA+2uf+CK9/+NUf8JnpX/Ptrn/givf/AI1Savcdyv4P8NS6Z4BstA1wR3pWJkmjlxKu0sSEOeGCggfhV5PCHhyLSX0pNC09bB3Dvbi3XYzDoSMcn3qH/hM9K/59tc/8EV7/APGqP+Ez0r/n21z/AMEV7/8AGqpu7uJKysXrrw9o19JDJdaXaSyQJ5cLtEC0S+iHqv4Yq1ZWNpptqttY20NtAuSI4UCqM9eBWP8A8JnpX/Ptrn/givf/AI1R/wAJnpX/AD7a5/4Ir3/41SA6Ciuf/wCEz0r/AJ9tc/8ABFe//GqP+Ez0r/n21z/wRXv/AMaoA6Ciuf8A+Ez0r/n21z/wRXv/AMao/wCEz0r/AJ9tc/8ABFe//GqAOgorn/8AhM9K/wCfbXP/AARXv/xqj/hM9K/59tc/8EV7/wDGqAN6SNJY2jkRXRgVZWGQQeoIqn/Y2l/2QdJGnWi6aUKG0WFRFtPJG0DGKzf+Ez0r/n21z/wRXv8A8ao/4TPSv+fbXP8AwRXv/wAaoA2bOzttPs4rSzt4re2iXbHFEoVVHoAKnrn/APhM9K/59tc/8EV7/wDGqP8AhM9K/wCfbXP/AARXv/xqgDoKK5//AITPSv8An21z/wAEV7/8ao/4TPSv+fbXP/BFe/8AxqgDoKrQ2Fpb2j2kNtFHbuXLRquFJYktke5JJ+tZH/CZ6V/z7a5/4Ir3/wCNUf8ACZ6V/wA+2uf+CK9/+NUAbdtbQWVrFa2sKQwRKEjjjXCqo6AD0rPtvDGhWeqTanbaPYw302fMuEgUO2evOM89/Wqn/CZ6V/z7a5/4Ir3/AONUf8JnpX/Ptrn/AIIr3/41R5h5F628PaNZaXNplrpVnDYTbvNto4VEb7uuVxg5qez0uw0/Tl0+zsreCyVSogjjCpg9RjpzWV/wmelf8+2uf+CK9/8AjVH/AAmelf8APtrn/givf/jVAFrSvC+gaHPJPpWjWFlNJw0lvbqjEemQOntV0adYjUTqIs7cXzR+UbkRL5hTOdu7GcZ7Vkf8JnpX/Ptrn/givf8A41R/wmelf8+2uf8Agivf/jVAHQUVz/8Awmelf8+2uf8Agivf/jVH/CZ6V/z7a5/4Ir3/AONUAdBRXP8A/CZ6V/z7a5/4Ir3/AONUf8JnpX/Ptrn/AIIr3/41QB0FVpNPspb+G/ks7d7yFSsVw0SmSNT1CtjIB9qyP+Ez0r/n21z/AMEV7/8AGqP+Ez0r/n21z/wRXv8A8aoA0v7G0z+2P7X+wW39o+X5X2ryh5m303dcVern/wDhM9K/59tc/wDBFe//ABqj/hM9K/59tc/8EV7/APGqAOgorn/+Ez0r/n21z/wRXv8A8ao/4TPSv+fbXP8AwRXv/wAaoAua/qd7pOnpc2Oly6k3nIkkUTYZIycM4GCWwOcAZNY3hrRbhvFGt+Kb+FoZr/Zb2kMg+eO3jHBI7Fmy2O3Gec1d/wCEz0r/AJ9tc/8ABFe//GqP+Ez0r/n21z/wRXv/AMaoWmv9f1/mweun9f1/kW5/DWhXWrpq1xpFjLqKY23TwKZBjod2M5HY1JHoGjxSX0kWmWiPqGRdssQBnzwd579T19aof8JnpX/Ptrn/AIIr3/41R/wmelf8+2uf+CK9/wDjVAFyz8N6Jp9xHPZ6TZW8sQIjaKBV8sHrtwPlz3x1q3Dp9lb3txew2dvHdXG0TzpEoeXaMDcwGTjtmsj/AITPSv8An21z/wAEV7/8ao/4TPSv+fbXP/BFe/8AxqgDStdF0uy1C51C1061hvLn/X3EcSq8n+8wGTRYaLpelz3M9hp9tbTXT+ZPJDEFaVvViOvU/nWb/wAJnpX/AD7a5/4Ir3/41R/wmelf8+2uf+CK9/8AjVAFweG9EF290NJsxO8nmu/kr8z/AN88ct79at3un2Woxxx31nb3SRyCVFniVwrjowBHBHrWR/wmelf8+2uf+CK9/wDjVH/CZ6V/z7a5/wCCK9/+NUAaepaPpmsxxR6np9teJE4kjW4iVwrDuM96ugADAGAK5/8A4TPSv+fbXP8AwRXv/wAao/4TPSv+fbXP/BFe/wDxqgDoKK5//hM9K/59tc/8EV7/APGq2LK8iv7SO6hWZY5M4E8DwuMHHKOAw6dxQBYooooAKKKKACiuR+IXjOfwLoC6umnw3sPmrE0b3JifLdNvyMD39OlZ+r/EDVPDGl2Or+IvDsUGmXLIsktnfGeS3LDI3o0afjgmhO/5A1Y76iqGo6zYaXo8mq3U4W0RA+8DJbP3Qo7kkgAdyafps95c2Sz3tstrLJ8ywbtxRewY9N3rjgdOcZIBcorjvCPinVdf8SeI7C7t7NLTSZlt0ltyxMkhBLAk+nA6Vp+NNdn8NeEdQ1i2ijlmtkVlSTO05YDnH1o6J9xpXdjeoqMyMLYyhC7bNwQdzjpWZ4Z1a91vQ4b7UNHn0m5dmDWk7bmUAkA5wOo56UCvpc16KKKACiqOq3V3ZWRubS1F0YjukhBw7J32di3cA9emRUunaha6rp8F/ZTLNbToHjde4P8AnpQBZooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigArn9D/5GfxR/19Qf+k8ddBXP6H/yM/ij/r6g/wDSeOgDoKKKr3txLa2ryw2kt1IB8sMRUM34sQB+dDdgLFFcn8PvGEnjfQbjVJLEWey7kgWEPvICgdTgc811lNqwBRXIx+Kb7XPEWq6R4eitNulbUuru73FDK2f3aquDxjliePQ1Y8J+LV8RS6lp91bCz1fS5vIvLYPvX/ZdGwMqwGRkA0lr+YPQ6aiikBDAEEEHoRQAtFJkAgEjJ6CloAKK5P4geMbjwV4dm1WHSJb5Y9oLeaqRoWO0bsnceSOAD9RXQw3yHSI7+4ZYo/IE0jE8KNuT+ApX0b7B1S7luiuFs/GGuax4auPE+laXbNpke97e2mdhPdRISCwI4QnBwpBzxyM1sweNNEm8I2/ic3Ei6bOqkMsLyMpJxtKoCcg8HjtT9f6uB0NFcZ/wtbwd/wBBC7/8Fl1/8bq1rfibT3SysI9UgszqEQmM80ghMduerANghmzgDqOT/DigDesNTstUjmksbmOdIZmgkZDkK6nDL+FW688+Etzp39kaxZWVxbN5er3bJFFICRHvwpAB+76GvQ6fRPyX5C6v1YUUUUhhRSEgAkkADqTXIWHjC78UahcQ+F7SGXTrZzFLqt0xETOOqxIvMmO5yo9zR1sHmdhRTIhIIkErK8gA3Mi7QT7DJx+Zqjrmuad4c0ifVNUuVgtIRlmPJJ7ADuT2FDdgWpo0Vzmhapr+uxxX8unQaVp8mGjhucyXMidiwBCxkjtlsd66Om1bcL3CikyMkZGR2oJCgkkADqTSAWiiq97cS2tq8sNpLdSAfLDEVDN+LEAfnQ3YCxRXJ/D7xhJ430G41SSxFnsu5IFhD7yAoHU4HPNOuvFNzd+L5fDOhwwPc2sAnvbq4JMduG+6m1cFmPXGQAKLapf13Dv5f8MdVRXM+HPFTaprGqaDqNulrrGmsplSNiySxsMrIhPOD3B6HjmqknxS8IRSvG9/dB0YqwGm3J5H/bOgDsawIPG3hm61n+x7fWrWbUfMMX2eNtz7hnIwPTBz9KdpviDT/Fml3h0K+lVlUxedJaSRmNyODtkC7sda4/Qx4g8DeItI0LWGsdU0u/zbWmowWwgmikVSwWRRkEEA85J9TQviswfw3R6bRRRQAUUUUAFFcbrGv+LZRcz+GtCsri0tiy+Ze3LI9yV4bylA6ZBALEZ7DHJ0vBXiqHxl4Wtdait3tjKWSSFjko6nBGe496FqD0OgoqrqWo22kaZdajeyCO2tomllf0UDJrjT4y14eER4vOkW39l7PtBsvMb7T9n/AOem77u7b82zHT+KlcLHeUVV07ULbVtNttQs5BLbXMayxOO6kZFWSQMZIGeB702raME76oWiikBBzgg44oAWiiuMh8cXM3xKTwnJo8lqhs2uvPmlUs4BwMKpIAznqc+wo62B6K52dFc74t8VR+GbazSO3+16jqFwtrZWofb5kh7k4OFHUnFU7jxTf6D4g0vTPEMNp5GqsYra8tdwVJh/yzdWz17MDz6Chag9DrqK53W/HPh/w7fiy1O7niuCgfbHZTyjB6cohHb1pmkeP/Deu6lHp+n3lxJcyAlVexnjBwMn5nQAcD1oWuwPTctX/i/w9pepx6bfavawXbsFEbvjBPQE9FJ7ZxW3Xn3xQjmt/B11a2+gPeaXI4n1GSGZFkjjDh3ZQclm469q7jT7qC9021u7Vi1vPEkkRPdSAR+lC1VwejLNFFFABRRTXYpGzBWcgZ2r1PsKAHUVx3hvxtc69411zQJtJaxGlxxnMkqu7lueduVAxjoTXY0dE+4dWuwUVx3iPxL4mtta/s7wx4bTVvJiD3U0t0sCRs33UBPU4GTjoCPWs3RvGni6fxrY+Htb8MWlh9ogkuGkjvhKUjXjOF9WIHNC1B6HodFFICDnBBxwfagBaKQkKMkgD3paACis/WtSm0nSri9hsJr54kZ/JidFJAGeSxAA49z7VmeBPE8njHwhaa5JbLbNctJ+5VtwUK7KOeM8Cha38geh0dFcknim91nxPqWiaBFbFdMCi7vLrcyCVuRGqrgk4Byc8ehqx4Y8Wx66mp293b/Y9T0qYw3tuG3hSOQ6nGSrAZHGaL6X+fyA6WgnAya4z/ha3g7/AKCF3/4LLr/43WkNQtfG3ha+XQtSlgE6Pbi6a1dWjYjkhHCk8Gh3s2gVr6jtN8beGtZ1Iadpus2t3dncfKhbccDqeO3vW/Xnfhq513wz4stfDGvpYXkN3bu1hqVpbiBm8sDckiDgcYPH69vRKbtZNC6hRRRSGFFFFABRRSE4BIBPsO9AHj/xekm1zxl4R8J2sH2pmnN9Pb7wu9U6Ak8DIElbPirw34l+IcFrpOoWdrouixzrNckXPnzzbeiqFUKo56knt6VW0bRPENx8ab7xRqug3MGnm1+y2TtPAxjHHzMFkJGfm6Z+9XqNEV7qv6/5fgkDfvO3p/n+bPNPHEgfx54B8NqNtk1y906diYUyg/DmvQtQvYtO026vpziK3iaVz6BQSf5VxPxD06S31vwx4sjUtHo94Vu8fwwS4Vn+i9T7EntWp8RrHV9X8CahpuhQefeXirCAJFQBGYbzliB93P51Lu4O293+lv0GkuddrL9Tg/hvcX+p+Eja6HqQt9bv7x9S1K6VY5FtlkY4DKwO5mVeFGMdSRwD1/xNhkg+E+rxS3MlzIsSBppAoZz5i8kKAPyFZb+FNS8GeLdL1TwtpYu7KayXT9QtY3WLlB+7mOcD2J649c1rfFHzf+FVav55Qy+THvKAhd29c4z2q5Wtp/VtF+AU786v/V9/xH/EnXLzw58PrrVNPvXtbyIRrAURH3uxCgEOpGOc8elR6x4o1Hw14e0HT3C6h4n1QR28SyYVWlwN8jhcYRc5IHsOKq/EjRtW1uDwzBYac99aQ6jHcXkSSKpKoOAdxAxknNReLdC18+LvCnim3sV1I6YJUvLS2cKwDjG6PeQGxnuQTgfglvr3/C367Er4Vbt+P/AN46b4rttY0eSHWUu7PL/2mtxGiAjA2+Uqpkc56t9c1gXPj9NT1jU0t9SXTdD0p/ImvEVXnvLj/nlArAg478EkkYx1rs7C61HUTLJPYNp9sU2xpOytOWP8RCMVUegySfbHPnfw70PW/Blpc6RP4RW4v1uJGi1ZZYRHKjHguxPmD6BSfajd2Y+lztPAk2vXHhO2m8RiQX8jOwWVFWQRljsDhQAG24zwPzrm/hldvB4i8a6Bn/RrDVDLbr2RZSzFR7ZGfxNehRs8Vor3ckW9EzK6jamQOSMk4H41w3wx02Rn8Q+J5UKDXdQae3DDBNupIjb8ck/TFNfE/T9UJ/D8/wBGd/RRRSGFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAVz+h/8jP4o/wCvqD/0njroK5/Q/wDkZ/FH/X1B/wCk8dAHQUjfcP0pagvJpILV5IbWW6cDiKIoGb6FmA/WlLYa3PNvgP8A8iLef9hSf/2WvUK87+EWi634b8O3Oma1pE1nM95JcK5mikQqwXA+Ryc8HtXTJqHiE+NZLB9IiGgC2Dpf+cN5l/u7c59e3bOe1W+i8l+Qurfm/wAzgPC89x8PvHXii01uyvv7P1a7N5Z30FrJOjEkkodgJDcjjHY+oyeA521P43+M9St4porT7PDG6ypsbfhcZXsflbg8juAeK7vXNU1wiWx8P6Q8t2fkF5dsI7aEn+I5O98eiqQfUUeDfCUHhHSHtxO11e3MpuL28kGGnlbq3sPQVMNLPsrfp+QS1ul1d/1/M6FlDqVYAqRgg968wv8AUH+D0heUy3fhC5ciGIMDNYykE7FyfmjbBx/d/n6exIUlRuIHA9a4nR/Ct5rOqv4h8ZQwy3ZDR2emZEkNlEeD7PIw6t+Apa30/r+vwHpbUPC2i6hq+pR+MPEbL9skjP8AZ9jHJuisoWHqOGkYdW/AV29cboGg6t4T13+zrDF14WnDPGkkn7zT367Fzy0Z7DqP59lVO1tNidb6nnfxw/5JPqv+/D/6NWrPjuWaH4Lak8GQ/wDZiqcf3SFDfoTR8WdK1jxD4IutF0bSpry5uWjIZZYkRArhjku4PbsD1rfgsDrHg86VqdjNaia0+zTRSMjMMptJBRmH61DTdOa7/wCRadpwfb/NFL4fxRr8MtARQNh02LI+qAn+ZrlPgDJI3gC5iYkxRajMkWf7uFPH4k1oaEnibw34IPhn+x57vUrSN7ezu43QQSoc7HZi2VwCMgjPHGa6LwN4XTwd4RsdGWQSyRKWmkHR5GOWI9snA9gK0bTnKXf/ADuZpWjGPb/Kx0VUr3R9M1GRZL7TbO6dRtVp4FcgegJFXaKko5zwn4Ps/CkV8IBA8l1dy3HmJbiMojtkR8E5C/5Aro6KKACiiigDg/jJqlzpPwv1WW1dklmCQb16hXYBv0yPxrAOleL/AAL8NrS+0bWbKSLTbNZpdOaxAjkXG5zv3bt3JOeM+grvvGXhuPxb4S1DRJHEZuY8RyEZ2OCCp+mQK5eWTxRe/D6XwzP4fuF1mS0Ni1wZI/sxBXYZt+7OMc4xuzxip1SlbfS39ev5j0bjfbW/4HX+GNci8S+GdO1mKMxreQiQoTnaehGfYgivNfihFd+IPid4O8MRTRxW5LXriVC8bMuSNygjdgIRjI+9XWSWWueCfAmk6X4X0yLV7q1McEiyyiMFeS78kd/fjPfFR+N/DWo3msaD4o0aBJtT0eUl7UuF8+Fxh0DHgN1xnA5NXK3Omtk/+G/QmN+Rp7tGVq/iHxP4F8VaLFq+pQavomrXAtS/2VYZLaQ4xjacEc559DXptefa/pN/471rw+sml3Wn6Xpl2L64kvNivI6j5Y0VWJ69ScD0zXoNJba/0v6uPrp/X9aHG+K9A1C21EeLPDcipq1vHtubWR9sV9CvOxuysOdrdu/Fc9ZazL8Yj5FmZbDwtAVF/lwJ7uTAJhGD8sYzyf4ugro/Euiaz4q1dNImb7H4YVBJdyRS/vb5s/6njlE4+Y9TnA71BrfhC40u8i1/wZDBa6lbxrFNYjEcF9CvAjbsrAfdbt0PFEfPb+vw8vn6t+W/9f1f5enaRRRwQpDEgSONQqqOgA4ApzfcP0psLO8KNJH5bsoLJnO09xnvUd5NJBavJDay3TgcRRFAzfQswH60pbMUfI82+A//ACIt5/2FJ/8A2WofhYzzeP8A4izT8zf2iqZPXaDIF/QCtL4RaLrfhvw7c6ZrWkTWcz3klwrmaKRCrBcD5HJzwe1WI9EvvC3xC1TXbKxlvdK1mJPtUdvtMkE6cBtpI3KwJ6ZOT0xV3tJf4bfgv8rA9U/W/wCL/wA7mNKzQ/tLwiHpNomJsdwCcZ/Ja9VrifDfh29l8cav4x1a3NtNcxLaWVqzBnigXGS5UkbmIzgE4rtqlaRS/rVtg/ib/rZIq6lDeXOnTw2F4tnduuIrhohKIz67SRmsq30K+urzTr3Xb23up7Dc8KW1uYk8wqVLnLMSdpIA4AyevGN+igAooooAKKKKAOd8ZHxSdDnj8K29i948bDfczMrJ/uLtwT6ZYAe9Yfwi1i11HwWtlBpn9mT6ZM1pc2uScSjktk88kknPfNaVn4o199QvLO98F6hEY5GFvNBcQyRTJnhizMu3PXGD/Sn+GfD934c0rVrpkin1bUbmW+lijbEfmN92MMewwBk+5pJ2TfRr+v1G1ey8/wCv0MT44SyxfCjVfKJG54VfH90yLmt+SCH/AIVm8GB5P9jlcdtvk1VGnap42+HVzp3ijT49Mv72N43ijcOIyD8jcE+gOM1kbfFL/Dv/AIRU6NKNY+y/YDdmRPs2zGzzt+c4287cbs9u9KUXyzj1dvyaHF+9GXRX/NEnwRlll+FGk+aSdrTKpP8AdEjYrp/FHhu38TaWttJPLbXMMgmtLuE4e3lHRx69eR3BqbwzoUHhnw1p+jW7bo7SER78Y3t1ZvxJJ/GofFDa+dLW38ORQ/bbiQRNczMNtqhzmTb/ABEdh6kdquo7ydiKastThR478R3N3/wgyW9vH4wDGOW93KbdIcA/aAM5LEH7mOvtXe+GvDtr4Y0hbG2klmdnMs9xM26SeVvvOx9TWC3wx0ceHUsIZZo9Tjl+1Jq+c3P2nvKW757r0xxW94ak1x9IEfiK3gj1CFzG0kDgpOo6SAfw59D0oXXv/X9W+fkh9O39f1+Hm9ivL7j/AJOStf8AsAn/ANDavUK80l0vX3+NMPiQeHrv+y49ONmZPPt9xbJO7b5mcc49fakviXz/ACY5fC/l+aKvjJnl+O3gWCX/AI91inkQHpv2tn+S0fHpmi8I6TcREieLV4WiI6htr9K6Lx14avdTu9D1/SI1l1TRbnzkgZwvnxNgPGCeASBxniqevaPf+O9b0KOfTrix0bTbkXtwbvaHmkUfJGqgngZOSePTNENFFdn+twlu33VvwaO+UkoCeuOaWiigEc7c6Nrmow6jYahq9q+nXe5F8mzKTJE2QU3byucHG7b+FbttbxWdrDbQIEhhQRxoOiqBgD8qlooAKKKKACiikdiqMwUsQMhRjJ9uaAPMPB//ACXLx3/1ytv/AEAV6hXmvhfStfsvin4l1u80C6g0/VFiSCQzwMV2AAlgJCRnrxmus8Sah4hsZtLXQtIi1COa5CXjSTBPJi7sMkZ7+vTpzRH4ILyE/ik/62N6uE8HH+3PGvijxK3zRJMulWZP9yLmQj2Lk/lXV65Ne2+g38um27XF8sDm3iUgF5MfKOeOuKz/AARoTeG/BmmaXKP9IjhDXBznMrfM5z3+Ymhbt/1r/wAD8xva39af8G33HQVwHiaxvPBuo3fjLRT5lm/7zWNNd8LKoGPOjJ4WQDqOjAetd/XFaj4c1PxZ4lZdeRIfDVjIrW9ijhvt0gwfMlx/AD0TuRk0ddP6/rt/w6eltTL0l5fipeQ6zcFofCdpNus7Pdh72VD/AKyXB4VSOE7kZNek1xN34a1Hw94iGteE4o2gvJVGp6UzhI5MnHnR9lcd+zAetdtT0tp/X9f1sT11KOt/8gHUf+vaT/0E1xfwR/5JNo/1m/8ARr11/iBrr+wr2OzsZryeWF40iidFJJUgZLsox+Nc18KNK1bw/wCBrLRdY0yazurYyFi0sTq25ywwUcnoe4FTHeXy/Ucto+rML4HM82n+KLif/j5k1uYyk9c4U/zJpPDjvF+0T4thjz5UlhC8gHTcBHj+Z/OtjR9Hv/BXivXpbfT577RtXmF3GbXaXgnP31ZSRw3UEdMc4q14L8NXtnrWu+JtXiWHUdYmUrbhgxt4UGEUkcFsdcZHSnDeL7K34WCX2l3f63O0qhrFvqN1pskWlX8djeEgpPJAJlGDkgrkZyOOvGav0UAYlpolxJq1tq2r3UNzeW0LRQrbwmOOPfje2CzEk7QM54Hbk1t0UUAFFFFABRRRQAUUUUAFFFFADZI0ljaORFdHBVlYZBB6giq2nafFpdoLW3aQwIf3aSNu8teyg9do7Zzjp0xVuigArP1zRrTxDo1zpV+HNrcALIEbaeCDwfqK0KKAWgiqFUKOgGKWiigAooooAp6nplvq1sLW73tbFgZIlbCyj+63qvqO/Q5GRVtVVFCqAqgYAAwAKWigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigArn9D/5GfxR/19Qf+k8ddBXP6Jj/AISbxPgHP2qDP/gPHQB0FFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUV5f8b9QurHw1p8WmXd7bateXqW9s1rdSRHnrkKQG7DnPWqPxHjvfh/4R0/V9H13VRqcU8ULJc30txHdEg7gY5GYZ4z8oFJPS772/r7x21su1z16iuV8T+J7jSNG0yO3iQazq0sdraxPyqSOPmZh3VBkn6Ad63tN09dOslg86Wdz80s0zbnkY9WP+A4HQYAp23JTvbzLlFeVfDu60221Xxf4kur2K0sJ9SNnavdXOE2RdSGc9yc/hW/8AEu9iuPhXq93Y3KSxNEhjmgkDAjzF5DCjon6fiUleXL52O2oqHzorez86eRI4kj3O7sAqgDkknoKp2fiLRdRm8my1exuZdhk2RXCs2wfxYB6cjnpzQyVqrmlRXJaV8RNA1vxbPoOnXtvO0EW5pxMoWSQn7kY/jwASSOBx17b+o61pekKG1LUbSzDAkefMqZA6kZPajpcfWxeoqJbiBrYXKzRm3KbxKGG0rjOc9MY71Qi8S6FPLDFDrNhJJM4SJEuEJkbk4UA89D09KPIPM1KKoprWlSaidOj1Oze+UFjbLOpkAHUlc5AFR2/iDRbu0ubu21exmtrUlZ5o7hGSIjruYHA/GgDSorJnFn4m0ZJ9M1JWUnfa3tpKGCuMjII4YZyCDweQaqeDvEn/AAkmjySTIsWoWc72l7Cp4SZDhsex4I9jR5AdDRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAVz+h/8jP4o/wCvqD/0njroK5/Q/wDkZ/FH/X1B/wCk8dAHQUUVzniLRL3xFdQ6e17dWOkLGXuHtJfLlnfOFj3DlVAyTjrkDPWgDo6K8f0zTb/wB8XdJ0LTdUvbzRNYt5Xe1upTIYGQE7ge3IHPuQc8V7BRuk0GzsworhtW8CSeL57u41/VNTt08xks7WyuvLSGMHCuQMhnb72T0yB2rN+Ed9rA/wCEi0DVb2W/TRr77Nb3cpyzrz8pPfGAfbdj0oWv5/194PT8j0uikY7VJALYGcDqaxvDfiew8T2cstoJYZ7eQxXNpcLtmt3H8Lr29j0NAG1RWI3iiwPitPDlus1zeiIy3DQqClqv8PmNngt2HJ/CtujzDyCivOvjVJf2fw8vr+x1W9s2iMa7LdggcM4U7jjd0PQEV017rKaB4DfWJhvFpp4m2k/eITIH4nApX91yfQdveUV1N+ivNPDXh6XxJ8O01nUrq4bX9Sha7jvVlZXt2OTGI8H5VA2/KODznNXfBXijXPGHw1ttQ0+SxTW0cwTNeIzRF0OGJCEHJXB47mqaabXVE3uk+jO+rA8W+Ih4c0uKWNrT7ZczLBbJdziGNnPJ3OegABP5DvWX5XxN/wCfvwj/AOAtz/8AHK2b/TNK1m0tNO8SW2l3l28e7yZEBBYAb2jDZYD3HI45pNdhoPDlzr93bSTa7badbkkeQtlO0oZcdSxA/DFbVcL8PNL/ALDv/Euk2Ukr6Ja3qrYq7lhESgMiKT2Vjj6575ruqb6NCXmFFFFIYUVkeJdKu9b0WTTbS9ex+0MqzXETYkSPOW2H+8QMZ7Zz2xXl3jj4fWfhvwxLeWXiLxPLqEskdtZxyakSHmdgqggKM9SfwpXHY9ooqnpVkdN0izsTK8pt4UiMkjFmcgAZJPUmuH+J+uSaPe+Goruee20C6vTHqU8LFDjHyKzDkKTknHUA03o7LuJaq56JRXnI8rT/AIn6JZ+FnzZz2ssuqwQSFoFjwDFIRkhWLZwRyRXo1HS4dbBRWJL4psLbxXH4eulmt7qeLzbWWVQIrj+8qNnlhxkHB5p/iTxLp/hfTPtl8XdncRwW8K7pbiQ9ERe5NHmHWxsUUyFzLCkhjaMsoYo+Ny57HHeob63kubSSKK7mtWYf62ELvH03Aj9KHoC1LNFea/BG9vL/AMF3k99dz3c51KYNNO5dmwF6k0um3h8cfEzXrO7dpNF0FUt47TcRHLO2dzuB97G0gA8d+tO2qXlf8A6Nvo7fjY9Jorzrw1qk+h/E/VvBck0kunvbLf6cJXLGEHAeME87c5IHYCtSSP4k+a/lXfhMR7jt3W1xnHbP7zrS6J9w7o7GuWXxf53xAh8N29uGtzayyyXRPWRGUFF9cbuT68djSSHxtF4bv/PTSrrVWKrbLYboVCkgMSZSRuAyR24rjLe61u1+KGgQf8IqLXytMmiWL+0Ec+WZE3SFsckdSOpzQviS/rZg/hb/AK3R67RRRQAUUUUAFFefal8OpfFkU17rus6rbX8jM0ENpdbIrRc/IAo4Y4xuPc5xgYpPg9q+r6p4Uu4NZuGup9Ov5bJLpjkyqmOSe/JIzQtQeh6FRVDWv7RbSZk0nYL2TCRyPjEeSAXweu0EtjvjFeT/ABA8ETeEvD0/i3RfEutLq1iUkkkubsyCcFgCCMY79OnbFK9tXsNK+i3PZ6KpaNdzX+iWF5cReVPPbxyyR/3WZQSPzNVPEfiO08MWUN9fw3Bs2mWKWeJNy24P8b9wucDIz1qpLldmTF8yujYoqB721jsTfPcRLaCPzTOXGwJjO7PTGOc1n+HPENt4m0w6jZwXMdo0jJDJPHs85R0kUddp7E4peQ/M16KK8ujl1C3/AGgYLCbVr26tW0h51hmcBEYtj5VUAdhzjPvQt0v62uD0V/63seo0V598Qtbu217w34RsLmS2fWLgm6mhba626csFI5UtyMj0NU/GcqfDvVfD+taXut9PuLxbHULUOTHIjgkSYJ++uCd3U96I6283b+vnoD0+656bRXO60njNr8HQZ9BSz2Di+hmeTd35RwMdO1M0hPHC6lGdauPDz2ODvWygmWXOOMFnI647ULUGUfFXibxF4fs7jWIdIs5dJtJAssck7C5lXcFLIAu0cngEkkenSuyVtyK2CMjOD1rifiLpi6t4Yu9RtNcurSfS1aeH7NMPLM0fIDrj5jkAYPeur0mW6n0axmvoxHeSW8bToBja5UFh+eaFswe6LlFFFABRRTXUtGyq5RiMBgASPfmgB1FeYeCpr4fF/wAZWN1qd5fRW0MAi+0uDsDDcQAAFHJ7AV6fQtYp9w6tdgorzfx9ri2Hjjwzp2rzyW3hy7EvnurlEkmA+RZGH8PQ4zg554FTaT/oXxXl03QHc6Mun79QhRy0EE5b5NvZWK9QOo5xQtfx/D+vyB6fh+J6FRRWJZeKbC88SX2gOs1tqNqA6xTqF8+Mj/WRnPzLnI9RjkUeQeZt0Via94osNAnsbWZZri+vpRFb2lsoaV+fmbGRhVHJJ4rbo8wCisrxJDPN4fvvs1/cWUiQO4lt9u/IU92Bx+HPvXMfBu6uL34X6Xc3c8s88jTF5ZXLMx81+STyaFrfyB6JPud5RXmfhadfiD4o8SX+pFp9K0+5+wWNoWPlAr9+QqOGY8YJ6DpVjwRrN5beLPE/gu4uXuDpjLPYS3DF2ELgEIxPLBSyjJOcGha/dcHp99v6+eh6JVXUtQt9K0y51C7cJb20TSyMeygZNct5XxN/5+/CP/gLc/8Axyta2W7/ALCmj8ZyaLIJH2MIoytuyHACsJScnP8AShptaAt9TN8La54l12eO6ubTRE0l1LebZ3xuHzjheBtzzzya6+vO7Xw1ZeGvinp58ORC0tb6znfUrODiEBdvlvt6KSxIGPQ4716JT0smv61Frd3CiiikMKKKKACiikIyCASPcdqAPH/F9v8A8Jj8ctC0ASypbaRateTPC21kc8jB7HIj/Ou6i8BaN/advqN+97qt1bHdA+oXTTLEfVUPyg9OcZ4qvpHw+tNH8X3niaPWNVn1C8G2489oSjrxhcCMEAbR0I6V19EdIrv+oPWT7HmXjcv/AMLg+Hwkz5G66x6b9g/+tXZ+LtYGgeENW1UkBra1d0z3fGFH5kVU8ZeHJNcs7K6stq6ppdyt5ZsxwGZesZPYMMj8j2pdW0vT/iB4WfT7qS8treV18+JMJKjIQxjYMDjkDPr2ODmpteHL5v8AHqO9pqXp+B5z8MoftCWng3xBZmCO1so9ShtXYMt6ZGLGST12kjCdO5zgY7f4rgD4Ya2AMARJgf8AbRava94Ksdc1PTNSW6u7C808Mkc1m4RmiYYaM5B4/Udqo/Ey0I+F2rWlpCxCwxpHHGpJwHXgD6Vcnf8Ar+ulv+GCmrSXy/r79S54z0T/AISjwXfaBDdLDd3VtuiG7BJUqeR125wD9axfhzrFv4k0xdV1K1+za/o8cmmXwIxtwVJ/A7QfY7q6O98OtfaxY6xDqd3Z3NrbNAiRBCjK5BberKc/dXoR0qOw8HWGn6Pq1hHPctJqzSyXl2zL5rvIMFhgYGB0AGBSd1drf9en4bkxs1FP+l1/Gxw/gXVI9L8CeKPHlxEHe+uri9jU8ExplY1+mQR+NQeFtC8SeI/CM91cCO2vfESF77Vrhw8gt2+7HBGucLtP8RXBJODXdaN4E0rSfCknh52nvbWWA28j3DDcY+flG0AADJ6dznk81BofgOLR7KHTpNc1W/0yDiGyuXTYqjorFVDOB6E7faiyu10sl8l/SHd2v1u3/X4nNXNvHq3jvS/h9bFhoGhWMdzexE5+0EYEUb+q/dYjoaneS28RfHe1igVWh8Oac7O4HAmkO3b+AP55rev/AADa3Xi6TxHaatqWm3k8IguVtHQLMgxjO5SQeAMjB44x1p+meANK0rxNe63BNdFrpYgbZnBiUxjCt0yT1PJPJz1wQJ6pvz+93/QGtGl5fp/wTjNCso/FPxa8X6rMqjSrFU09yOBLt5dD6jcuT6jA6E1keEIoB4K8WeNr23iFlLdXN3Z2xUCNioKxkr0ODwo9ST1xj1DSPBOnaL4b1HRLW5vPL1B5pJ7l3UzF5BhmyFxn047VHd+AtLuvh+vg1ZrqHT1iSISIy+aQrBsk4wSSOeO5qbe7byt9+rf37FX96773+S0X4blf4WaOdE+G2i2rjErw/aJAeoaQ78fkwFYfw33j4g/EMJn7P/aEZHpvw27+ldjttfCei7II7i8nY7UX781zLjAzgAdB7KoHYCq/gvw2/h3SJvtbpJqV/cPeX0ifdMrnJA9gMAfT3rRu83Ly/Vf5GaTUFF73v+Z0lFFFSUFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFc/of/ACM/ij/r6g/9J466Cuf0P/kZ/FH/AF9Qf+k8dAHQVWv7+20yyku7uQRwxjJOMk9gABySTwAOSTVmuY8WeCofFz2huNa1mwW1bfGmnzrEN/8AeJKE5xwOeKTGhmjaO7a1deLdaVYb2eIQW8MjDFnbg5Ck9N7Hlj9AOmT1VcJp/wALbOy1K1vJ/E3ifUVt5RKttf6gJYWYcqWXaM4OD16it1PCtunjWTxOL6+NxJbC2NsZf3AHqFx149fWq7L+v6v/AJk93/X9WJ9c1aWyRLOwjWfVboEW0JPA9ZH9EXPJ78AckVF4Z0G08L6WmnRzebdTO9xcTPgPcSscu5H1I+gwKwNV+F9vquuXWrP4r8UW1xc4DC0vkiRVH3VACfdGTj6nuTWp4X8EWvhe7uLtdW1jU7iZBH5uqXXnNGoOcKcDAJxn6ClHz/r+v66DfkdPXlPjsXM3jGJfAu8eL1gP22SIqIVt9pwJ88Fs42d/wxXqrDcpXJGRjI6isjw74a0/wxYvbWKyM8shlnuJ23yzuerO3c0mrv8Ar+v6sO9kYXwyOijw48emrMmoLKf7UW7/AOPn7T/EZfU5zg9MdK7WsZ/DOnt4oi8RRCWC/WIwymF9q3CdhIP4sdj2rZqm76kpWPO/jh/ySfVf9+H/ANGrV7xpYy6l8HdRtoAWkOmK6qOp2qGx+lavi/whbeM9JbS77UL+3s3KmSO1Ma7yDkZLIx646Y6Vq6bp50/To7J7ue7WNAge4CbioGMHaqj9KjlvCUe/+RV7TjLsc98PruF/hboVwHHlx6cgY9htXB/UGuc+AtpLB8PHuZFKreX008YP93hf5qa6FPAMFtpl1o9jq19aaLdMzPZRbMIGOWRHK7lU5PHucEV09hY2umWEFjZQrDbQII4o16Ko6CtL3lKXf/hyUrRUe3/DFis7UtB0jWZIJNS0y0u5Lc5heeJXMZ9ienQVo0VIyOC3htYEgt4Y4YUGFjjUKqj2AqSiigAooooAK4PXj/b3xS0DRR81tpMT6rcjtv8AuQj6gljXeVjaZ4cttN1/V9ZWaWa61No/M8zGI1RcKq4HTqaF8Sf9eX+fyB7Nf15/gbNcJ8RL5by40fwZ5MTHxBI8ck0qBhDFGNzFQeN/Taex5rd8WeFrfxbpcVhc317ZpHOk4ezl2MSueCcHjn8wDTvEPhWx8RxWZuJJ7e7sZRNaXluwEsL+oJBBB7ggg0rX37/gPbbt+J5tpGmX/wAI/HOm6Pa3LXvhjX7gxxpKB5ttNgY5HUdPwzxkc+y1zsXhNZtZs9V1fUbjU7qxDfZVkRI44mYYLhVAyxHGTnHYCuiqr6WZPXQ5D4kNoP8AwirpriyuzSAWS23/AB8m4/g8nHO/P/1+K5HwQL2HxlCPiD5p8StbqNKeYqYPK2jeI8cedn73f04r0R/DGnzeKV8Q3AlnvYofJt1lfdHbj+IovZm7n2p/iLw5p3ifSzYajG20MJIpYm2yQyDo6N/Cw9aUdNf6/wCH/wCG8xvXT+v+G/4c1qRvuH6U2GPyoUj3u+xQu5zlmx3J9aju4HubZ4Y7qa2ZhjzYQpZfpuVh+lKW2gI82+A//Ii3n/YUn/8AZaj+Gdu2nfEb4hWM3ErXsdyoPdHLsD+TCuu8HeCbTwTZS2en6lqE9tJK0pjumibDtjJyqKe3rU+o+FobrXo9esrubT9UWHyHmiVWWaPOdrqwIODyCMEeuOKq+q9Lfl+qB6p+t/xf6M4sQNfftJNNDkpYaMBMR0BYnAP4Nn8K9TrG0Lw1Z6FLe3KSS3N/fyCW7u5yDJKQMAcAAKBwABgVs0lpFL+t7/qHVv8ArawVA1navepetbQtdRoY0nMYLqp5KhuoBwOPap6KACiiigAooooAwtf1G6I/sfSGU6tcocORlbWM8GV/p/CP4jx0BIn8PaLp/hnR7XRbAgJAmfmYF5CT8zt6kk8n3rlbr4UW91qd3qB8X+LYZ7p/Ml8jUEjBPQcLGBgDgegrZ0DwRaeH7PUIE1TV76a+XZJd3115kyqAQArYGAMkj3NJbeYPc6euP1azTxzex6efm0CznEl2/a7lQ8RL6orDLHuQFHQ4tab4Mh0vwWfDNtrGqrEQy/bBKv2gBjkhWKkDrjpx9ea56H4PWlvAkEHjPxlFEi7UjTVAqqPQAJwKfUOh6JG8ciny3VlUlTtOcEcEfhUd81qlhcNfGIWgjbzjNjZsxzuzxjFQaPpVvomkWum2pkaG3QIGkbc7nuzHuxOST6mq3iHw5Y+JrSCz1Fp2tI5lmeCOTak+3osg/iXODj2FEl0QI8WjTmKW4j1L/hVf20tFG56dNrMPv/Zt+cA+2a98t2ha2ia2MZgKAxmPG3bjjGOMYpGtoHtTavDG1uU8sxFRtK4xtx0xjtWd4e8PWfhnTm0+wec2nmtJHFLJvEIPOxPRR2FNbW/r5i8zWry+4/5OStf+wCf/AENq9Qrkm8BQP4yXxSdb1b+0Vh8hRmDyxH/d2+V0yc56+9JfEn6/k0N6xa9PzTOZ8bQNa/GvwJqcnEEgmtdx6B9rYH47/wBKPjpC994d0PTIRuubzWIY4lHXOGGf1Fd74h8OWPiXT0tL3zFMUqzwTwttkhlX7rqccEfTFU4fCccmtWmr6tfz6nd2Sstr5qIiQluGcKoGXI4yfwAojpZdnf8AG/5hJ3bfdW/Q6FRtUD0GKWiigDLg8N6HbX8t/BpFlHdyv5kkywKGZ/7xOOvv1rUoooAKKKKACiikdSyMoYqSMBhjI9+aAPMPB/8AyXLx3/1ytv8A0AV6hXJ6T4Dt9H8UX/iGHWtVlvb/AG/aVlMJRwvQYEQIwBjgir3iTwrb+JZtLlnvr61On3IuUFrLsEhHZuDkf/X9aFpGK7A/ik/62Ob8dvB4l8R6X4BmhTyL+Jry6nZQWSNDwI89HJGN3YZ9axPCNtqfw08eWvgqS5N9oGqpLNp8jKBJC6jcytjrx/MEY5Fd/r3hSz12+sdRE9xZanYEm2vLYjegP3lIYEMp7gj8qSz8LRR67Hrmo3s+o6lFEYYJJVVEgU/e2IoABPcnJ7dKI6P77+fb9Alr+FvLv+pv15/8Ujp7WVjFCs7eKTLnRfsZAnEvc57R4+9njH4V6BWNY+GNPsfEF/roEs+o3mFM077zFGBxHH/dXPOO5NK2o72OM+HeIvEWqR+J9/8Awm7czNMRte3z8n2fHHl+oHOetemVja74Y0/xBJZT3Iliu7GYTW11bvsljIPIDf3WHBHcVs1V7om2pR1v/kA6j/17Sf8AoJri/gj/AMkm0f6zf+jXrtdW046rps1l9subRZkKPJb7N+0jBA3qwHX0rM8JeE7fwdo8elWN/e3FnFuMcd0YzsycnBVFPUnrnrSjvK/W36/5jlql5XOM+CsDadF4s0qXi4tdal3g9cEAA/jtNJ4Yge7+P/jDUI+YLa0htnYdN5VDj/xw12dx4UjGvz63pd9Pp19dRrHdGJVdJwv3SysD8w7EY981a8P+HLHw5aTRWhkkluJmnubmZg0k8jdWYgAfgAAOwojpZ9lb8LfkEtb+bv8Ajc16rahp1lqtk9nqFpBd20mN8M8YdTjkcGrNFAFTT9K0/SofJ0+yt7WMgArDGFzjgZx1q3RRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAVz+h/8jP4o/wCvqD/0njroK5/Qyf8AhJvE/tdQf+k8dAHQUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRVeC+tLqWWK3uoJpIjiRI5AxQ+4HSgCxRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAc54y8Y2vgnSRql/Y3lxabwjvbeWShPAyGdSc+2az7j4j2Om21jea1o+raTY3pURXdykTRgsMgN5cjFMj1ArkvjXcnU9W8K+FY4ppxdXn2q4hgXc7RpxwO/Bc/hV7xzY618RtNtfDum6JeadYG4SS6vtQVYwiL2RNxZj+AHHvSjdq/n+HX+vIbsnby/4Y9Lur22srKW9uZ44raJDI8rNhVUc5zUWm3zajZLd/ZZrdJOYlmGHZezFf4c+h59cHgcF45l3eJPBHg9Cfsd1dedOp/5aRwKGVT6gkZP0r0S5uI7S1muZmCxQo0jk9gBk021Zy6a/gJXul1Oc8N+L5PEHiHW9KOlva/2S6RyStMrh3bJwAB2A9a0PFOvJ4Y8N3usvbtcLaqGMSttLZYDr+Nea/D6+1X/AIRWW70ZbaXX9d1CXUJY7mNmjhhZ9oaQqwKjCnb1J7DqR1XxNW5X4T6uLuSKS4ESb3ijKKT5i9FJJH5mhppK++n39f8AIcbOdul/wO0aULbmYg4CbyAMnpmszwz4itfFOhw6tZwXUEErMoS6j2ONpIORk+nrWZ478Q3fhTwNda1ZNbedbIhCXEbOshJChflZSDkjmmah4vl8P+FNJu9Uthca3qCxRQ2Nv8vm3DgfKMk7VBPJOcD1o6v5IlbI62iuXN14wtdY0eOW0sbyzui4vmt0Mf2QAAqQzOS/OR90Zx2qpdeNjd63qOnaTJaw2mkru1PVLvLQwN/zzVQRubg5OQBjueKHoM6bVdR/sqzN21vLNBGczGIZaNO77erAdwOcdM9KswTxXMEc8EiyQyKHR0OQynkEH0rn/Autaj4j8J2+p6pbJDLMz7NkZQSRhiEfaxJG4YOMmuf+GF/JFf8AinwyxJh0fUmFqD/BDISyp9Bg/nTtq18/y/zDpf5fn/kdf4k1yLw34fvNWliaYW6ArEpwZHJAVQfUkgfjWh5kgtfNMLGXZuMSsM5x90E4HtziuS8W/wDE28U+GvDy8xm4OpXQH/POH7oPsZGT8q6LXtUj0Tw/qGqS/ctLd5j77VJxUt2i5P8Aq3/Bv9w0rySX9f1+pyuk/EyHXLzU7XTfDOuXEumSGK6Ci2GxgSMDMw3fdPTNb/hnxXpXi2wkutLlkJhkMU8MyFJIXHVWU9D+leYfCPULvQ/A8t0vh7WNQ1HVLiS7LwwqEkzwv7xmAA4zn3Nb/grw/f8AgLwz4m8Ra2IhqV60uoT28TbliChmCZ7nJPSm/dTv0X46f8ES95+71f4f1Y7kazDLrTaXbI080Khrl1+5bgjKhj/ePZRzjk44zk+NvF7+DrG1uhpcl8Lm4S2RUmVP3jfdHOSfwFUfhPHI/wAPrLULhvMvNSeS8uZT1d3c8n8AB+FZHjy7t7z4j+E9Kupkjs9P8zV7tnOAoT5Yyf8AgWR+NNq0lF/P9fwuJO6cl8v0+89MGSBkYPcVj6X4gTU9f1vSlt2jbSpIkaQtkSb0D8DtjOKh0C58RX09xdaktnBpzMfskQt3S4ZOzPlyF/3cZx1weKyPCn/JRPHX/Xxaf+iBQt/l+qA7aivPB4y13Vdf8VaVpAsIbzRQPs9ncwO73Xy53ZDrgE4AwD1GetUvidc+ILj/AIRvw/ZalDbPrU6wXMaQEuVAzId24YQDqowT/epLW1utvxG9L36X/A9QorktX8Uz6Nc6X4fgjg1DxFfL8kUamKGNB96VwSxVAB0ySSMCqvh/xfd3WteIotQuLGbR9JRC2pQRNFGJMEyJy7BtuOoPHSjT+vL+v03DU7eiuE/4TDV7vwlqHi22htbTSYIXntIbqJmluY1BIZiGAQNjgYJ5B9qo61448QaN8J9P8TvFpx1S5SJjbvE+xjIflVQHzkA55PY0PT8Px2Ba/j+B6TRXmmuePdd0i+8M/wCj2H2PUpxFKGRzLKoUGSVAD8q/3QdxPFXrLxdr83xOg8PXVlZxWU2ntetGu4z243YXe2dpJ7gDjPU4yXa7t6/grivpf+t7HWadq8V/cXNo8bW99bEedbyEZAP3XBH3lODg+xBwQRWjXnfxCvn8PeLfB+uQHaZb06bcgf8ALSKXHB+hGR716JSWquN72Cuf0P8A5GfxR/19Qf8ApPHXQVz+h/8AIz+KP+vqD/0njoA6CiiigAooooAKKKKACuXh8XT6o182g6RJqNtZTNBJMZ1iEki/eWMHO7HTJ2jPQ11FeC3mu6v8KNa1yx0sJqegTTee8qoznS5ZT/Hjg+u3IzxyM8q+tv6uO2h7N4e1+x8TaLDqmnl/JkypSRdrxsDhlYdiCMVJretWHh7R7nVdSmENpbrudsZPoAB3JOAB71k+ANP0rTvBtjHo199vtJQ0xuz1mdiSzEdjnPHbGK5/43abf6j8O5TYQvM1tcx3EsSAktGuc8d8ZB/CnPT+vvFD3v6+41rrxzJpNvZ3+uaLcafpV26It0ZlcwFvu+co+4D6gsAetdeCCAQcg9CK8k+IvjXwz4h+D+oGy1S1nmuII2S2Rw0qNvU/Mg5XB7nA/MV6B4Lad/A+gtdbvPOnwF93XOwdadt/J/1+Qk9E+/8AwP8AM3KKKKQwooooAKKKKACiiigCrqWo2ukabc6jfSiK1tozLK5/hUDJrmbnxzNYaLFr17oV1BojhWafzVaWKNiNrvEOi8gnBJGelbfiXRrfxD4a1DSbqQxQXUDRtIP4PRvwODXhlv4rvrnS7HwH4rukt9EuJPs8WvxRsUvIEYAIrEADJAHmcjHbndSV27ddLfqN2Su9up9DRyJLGskbBkcBlYdCD0NZ+va1B4f0W41K4jllWIALDCu55XJAVFHdiSAPrV6CKOC3jhhAWKNQqAdgBgVzHjrwnqPiuysYtO159IltLgXKukPmbnAwufmGMZPrTl5Cj5lPQfH2oa7rEFgfBOv6ej5L3N9bmKKMAZ6kcnsB7129eW+FvE/i7QvGsHg/xs0F417Gz6fqUChRLtGSpAAHQegIPrkGvUqelk0Lq0worjfFEOvaLqq+JtGe4v7ZIxHf6QWyJIxn95CO0gyeP4h71lTeJrr4jSrpXhK5nttJ2qdR1gKUZARnyYs/8tMdT/D9aS12/r+v+BuN6bno9V728jsLV7iVJnVf4YYmkc/RVBJqWGMQwpEGZgihQXYsxx6k9TTm+4fpSlotAXmc94N8X2fjXSJtTsbeeGCO4eBROAGbaByQM469KW/8UpD4iTw/pto1/qnk/aJUEgjjgj6Au/OMnoACfwrkPgP/AMiLef8AYUn/APZai+GEz33xF+Id7PzMt8kAJ7IhdQPyUVVtV6X/AAX6sHon62/F/ojudA8T22u3F/ZGGS01LT5BHd2kpBZCRlWBHDKRyD/Kmv448JRuyP4p0RWU4KnUIgQfT71cSZWsv2lPLh4S+0UecB3Kk4J/75Fegt4d0NmLNo2nFickm1Tn9KS1Sf8AW9v0Dq1/W1yNL7SvFOmXMOmaxbXULfu5ZbG5WQoD1G5SdpIz781x914U02w+JvhyTw3p8FhLbxTSaibSMRoYCu1A4HBJfpnn5Se1ds9iNO065XQrGwhumUmNGXyo2ftuKKTj8K5fRdP8fWlwiXi+HEjmmEl5dQzTSTyDvgMgXOBgDoB9KF8WgP4dTuaKKKACiiigAooooAKKKKAAnAJPQVy2n+OrDUvG8/heC0vUuYLY3LyzwmJSMqAFDYY/e64A4711NeX2f/JyOof9gJf/AENaF8SXr+TYP4W/T80eoVk65rq6NHEkVlc397cEiC0tgC746kkkBVGRliccjuRWtUNxiJHuUtTPOiEKse0Ow67QWIH5kCkwRynhvx8ms+Irnw7qWj3mj6xDF5wt7hldZI+m5XXg/wCeuDWx4h8T6Z4ZtopL+R2mnfy7a2gTfNO/91FHU/oO5rz3QvEK3fxpmHiTRLvSdXls/s2lrK6uhhBLNyvBcnPIJAxjr1zdDbXvFXxc8Ta3Yx2EjaOx0+zN+7+XByQSqqMkna3OR97vTWtvRv7v6QPS/wAvx/pnrul3mo3sZlvdMFgjAFI3nDy/8CCjaPwY1oVxPg7xve6xr+q+GtdsIbLW9NAdhBIXimjOMOueR1HB9R7gdtT8xeQUUUUhhRRRQAUUUUAFFFFABRRRQAUUUUAYeveJ7bQ7qwsBDJd6lqEhS1tIiAz4GWYk8KoHJP8AOotO8UpP4hk8P6jaNYaqsP2iOMyCSOePOCyPxnB6ggH8K4yOV739pSWOblLHRf3APbcVyR/32RSfEyZrH4lfDy9gOJWvJIGI7oxRSPyY/nRHXl83/ml+QS0v5L9LnqtcqnjKXUptQ/sDSJNUg0+UwTzCdYg8ijLJHn75Ge+0ehNdRKrPE6qcMVIB9DXj3wh8Qad4X0PUfDXiK9t9M1WxvZGeO8kEZlVsYZS2N3fp7etJatry/UHor+Z6b4c8Raf4p0aLVNNkZoXJVkddrxuOqMOxFUJvGNvPrk2i6LZzarfW/wDx8tEwSG2PpJIeM/7Khj7V5BoHiS40Hwj8T9W01mWBdSYWbbSu15HK7gD0IBQ8+ldB4cTxd4D+GNrqVjpWkXVssP269iaaT7TLu+Zn3Y25C4454HU0/N7WX4q4W6Le7/A9ghMrQoZ0RJSPmVHLKD7EgZ/IVJWX4b1618T+HbLWbIMILuPeFbqp6FT7ggj8K1KbVnZiTuroKKKKQwooooAKKKKACiiigApCcAk549BmlooA8i0pbvWfj3da1e6VqsOn2tn9m0+efT5kRm4BOSuF+9JycV67RRQtIpdge7Z518QbJ7Txj4M8T4/0axvWtblv7izAKrH0APH4itf4mvqP/CvtVt9KtLi6vbqMWyR28bO2HIVjgDoFJ5rp7yzt9Qs5rO7hWa3mQpJG4yGB6io9Ns5bCzW2ku5LoRnEcko+fZ2DH+Ij14z355KsnHle39XX9dx3tJSR5hY6HP8AC/xbp82m6fe3ejanYpaXaWsbSslzGPlcjsG5HoMnpXSfFFpH+FWrtLGI5DDGWQNuCneuRnvXbVk+J9Bj8TeHLzR5p3gjulCmRACVwwPQ/Sm22tQhaMk/Q4v4rQXV/p/hrTksru5sZtTie8+zQtKfLQZ2kKO/5cVD40g1KHxx4M8S3WmXMmmWPnLdR2yGdrZnXAYqoJIHGSAcY+mfT0XYir6DFLRs7rvf8LE9LPtYy7DVm1Yyta2lxHahPkuLiNoi7nsqMA2B6kAemeceT/DrTrPR7G60zxF4Z1S78QR30kxV7SSWGdiflkVj+6HT7xI+te2UULR3G9VYjgaRreNp41ikKguituCn0zgZ/KvPvhjZNPqvi3xLg+RqupsLY9nijJUOPYkn8q7fVtPfVLI2n2qW3hkOJjFw7p3UN/DnuRzjOMHkWLe1hs7OO0tI0ghiQRxIi4VABgACjZt/1/WgPZI5Pwx/xN/GviTXj80UDppVqf8AZi+aQj6uxH/AayPjVcalP4Jl0XSNN1G9ur6RFf7JaSShIgdxJZVIHIAxnPNdp4c0KHw5ocGmQyvN5Zd3mk+9I7MWZj7kk1q0mrpL+v6bGnZt/wBeX3Iy/Dltb2XhrTbS1SVIILdIkEsTRthQByrAEHjuKl1vThq+g6hppbaLu2kgz6blI/rV+inP3736ih7trdDifhPJIvw9sbC4Qx3enPJZ3EZ6o6ORg/hg/jXI6v4HvfHHiTxrqF1a3NtNDHFa6NLKrRgtH8xZc4ypcDnnqa9SXR0g1p9TtZTA04AuoguUnwMKx9HHA3dxwQcDGlRL3nzPf9e4L3VZbfp2OY8E+Ib/AMQaLBJqGlXdldRRCO6NzGY8zDhggI5HGc9OQOecYNhez6b4m+JV7awG4uYPs8kUKqWMji2BVcDk5OBxXotY+maBFpmva1qqTu76o8TuhAAj2IEGPXOM027tvy/VCStY4PU7SXW/iD4T8RaFZ31rqI+TVfNtniVLfGSsm4AbuSAOp4PQA1a1Rb+7+OFhJ/Zl3LbadprfZpfKYQ+bI2GYvjAwn45GBXpVFC0at0v+Ibp/L8Dx7UNOSx+Mmr6j4k0rU7vTb60jjsZ7WCaaMAAbo3WIE8kHggjvWp8RrPUr/wCEt9Z6JoctpHvjCWUKASGAMCf3a/d/3eTjrg5Fem0VNvdUe3+dyr+9zf1tY8e8fXt7r3w4ttP0HSNUh0x5be3mzZSLIUyPlWPG7aMctjBOAM5ONLxjpF94n1fwZoR0m4i0lLg3d58haONIx+7R2A2hiMjbnv3r0+iqvrfzuTbS3lY88vdGudc+NNjc3NjONK0PTy8ErxERPcOf4SRg4XB46EVB4Yj1CX4seKtSuNKu13vFaQzTRtHGsCLyysRhtzYwB9TivSqKS0t8/wAX/S9BvW/y/D+rnnXxGs217xT4N0OEFnXUP7Qnx/BDEOSfTJbA969FrM03RYrG8ub+aVrnULnAluHGMIPuoo/hQZPHqckk81p0LRW+f9fcD3uFc/of/Iz+KP8Ar6g/9J466Cuf0P8A5GfxR/19Qf8ApPHQB0FFFFABRRRQAUUUUAFeYeCZB4V03WdB8T2V19okvp5jN9kknjvo5P4gVUhjjgqefavT6KVvysHT8f6+887+HOlX3hHwPqs02n3So11cXtnpwGZkhx8keOzHHT39a6jRvEa6h4Wt9b1GxuNJEikvb3SnenzYHGMnPbjJyOK3KKf/AAPwA801jRrj4hajBp0OmS6Z4XinWe9nngMEuoMpyEVCAwTuWYDPbpXpSIsaKiKFVRgAdAKWihaKyB6u4UUUUAFFFFABRRRQAUUUUAc7480m/wBc8C6xpmmPtvLi3Kxjdt3HqVz2yAR+NcXrk9n4h+FQ8Pf2HfnVxaJBDp7WUitBOoChtxXaFBGd2cY+uK9WopWumn1/T/hx3tZ9v6/Q4+71TUPA/gfR1fSr3W7yJILSZLMFmztwzng8ZH5kdKteIfGcPhvUrG2vNJ1WW2ulyby2tjLHCc9H25OfoD+NdNRVNtu77kpJKyOIkspPFfjnRdajtp4dM0aOZ0luIWia4lkULhUYBtqgE5IGSRjPWu3oopdLD63OO8Uf2/r2qr4b0tLjTtPaMSX+rYwdh/5ZQnu5wct/CPfFZlz4WufAMy6v4MtJJrAKq6hoyMW85QMebFn/AJagdR/F9a9EooWm39f1/Wob7jIZPOhSTY6b1DbXGGGexHY1He3SWdpJPIkzqo+7DC0rH6KoJP5VPRQ9QR5j8E4bvTvCt3Yahp2oWVy19LMEurOWLKMFwcsoH4ZqxY2Mngr4la5fzwTHRddRJhcxRM6wzrncr7QSu7JIJ47V6NRTvqn5WDe6fV3/ABuefeG9HudW+JWreM7m2mt7QW62GnLOhR5EGC8hU8qCc4zgkGvQaKKXRIOtwooooAKKKKACiiigAooooAKKKKAA8CvKrOSf/hfV7qx0vVl059LFql02nThGkDKcZ2ex56cV6rRQt0/62sHRr+u5g+LPENx4a0uK8ttFvdWeSdITBZruZQc/MeDwMfmR0qPxB4vtvDd3YxXmm6rLBdZzc2tqZo4SMcPtyRnPYGuiooA4e704+LfHHh/WILaaLT9GEsv2i4haJppHUKqKrANgdSSMdMZ5xl6Ray+A/iF4hlu7a4Oia463UN3FC0ixTDO9H2glcliQTx716ZRQtNvP8f6/AHrv/Vv6f3nnvhjSLjUfifrnjJrea3sZbZLKzE8ZjeYDaWk2nBC5XAyOa9Cooo6Jdg63CiiigAooooAKKKKACiiigAooooAKKKKAPPvEelXOjfEzSvGVvbTT2T2zWGoiCMu8SnlJNo5IzgHHQCo73T5PGnxL0TU4oJhouhRvL9oliZBPO+MKgYAkLgEt0zxXotFC0t5f1+oPW/n/AF/wDB07xFcX3ivVNFfRb63hskRkv5VxFPnHCnHv6noelZfiPW57sNZ+GdKbUNZOYo7x4CtvaHoXaVhg4/uqSSR0rsqKVrpJjvrc8/Pwzgt/hVfeEoJ/MurqNpJLp+PNuMht59twA+gqpZ+IZ1+GraJd6VqK+IYrA2JsfsjkySBNgYMBtKHg7s4A716XRTet09mCdrNdDmvAHh2bwp4G0vR7hg1xBGTLtOQHZixA+hOPwrpaKKcnd3ZKVlYKKKKQwooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKzNO02Sz1fV7x3Rkvpo5EUZyoWJUOfxU1p0UAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFAH//Z)\n","\n","(image source: http://nlp.stanford.edu/pubs/glove.pdf)\n"]},{"cell_type":"markdown","metadata":{"id":"PloC5f5YCK39"},"source":["The matrix shows the co-occurrence probabilities for the words from the concept of the thermodynamic phases of water (i.e., $ice$ and $steam$). The first two rows represent the co-occurrence probabilities for the words $ice$ and $steam$, whereas the last row represents their ratios. We can observe the following:\n","- ratio is not neural for closely related words such as $solid$ and $ice$ or $gas$ and $steam$\n","- ratio is neutral for words relevant to $ice$ and $steam$ both or not completely irrelevant to both\n"," \n","The ratio of co-occurrence proababilities is a good starting point for learning word embeddings. Let's start with the most general function $F$ parametrized by 3 word vectors ($w_i$, $w_j$ and $\\tilde{w_k}$) given below:\n"," \n","$$\n","F(w_i, w_j, \\tilde{w_k}) = \\frac{P_{ik}}{P_{jk}}\n","$$\n"," \n","where $w, \\tilde{w} \\in \\mathrm{R^d}$ and $\\tilde{w}$ represent the separate context words.\n"," \n","How do we choose $F$?\n"," \n","There can be many possibilities for choosing $F$ but imposing some constraints allows us to restrict $F$ and select a unique choice. The goal is to learn word vectors (embeddings) that can be projected in the word vector space. These vector spaces are inherently linear, i.e., think of vectors as a line in $\\mathrm{R^d}$ space, so the most intuitive way is to take vector differences which makes our function $F$ as follows:\n"," \n","$$\n","F(w_i - w_j, \\tilde{w_k}) = \\frac{P_{ik}}{P_{jk}}\n","$$\n"," \n","We see that the right-hand side of the above equation is a scalar. Choosing a complex function such as a neural network would introduce non-linearities since our primary goal is to capture the linear meaning components from word vector space. Here, we take dot product on the left-hand side to make it a scalar similar to the right-hand side.\n"," \n","$$\n","F((w_i - w_j)^T \\tilde{w_k}) = \\frac{P_{ik}}{P_{jk}}\n","$$\n"," \n","We also need to preserve symmetry for the distinction between a word and a context word which means that if $ice$ can be used as a context word for $water$, then $water$ can also be used as a context word for $ice$. In a simple, it can be expressed as $w \\leftrightarrow \\tilde{w}$. This is also evident from our co-occurrence matrix since $X \\leftrightarrow X^T$. In order to restore the symmetry, we require that function $F$ is a homomorphism between groups $(\\mathrm{R, +})$ and $(\\mathrm{R, \\times})$.\n"," \n","> _Given two groups, $\\small (G, ∗)$ and $\\small (H, \\cdot)$, a group homomorphism from $\\small (G, ∗)$ to $\\small (H, \\cdot)$ is a function $\\small h : G \\rightarrow H$ such that for all $u$ and $v$ in $\\small G$ it holds that $\\small h(u * v) = h(u) \\cdot h(v)$_\n"," \n","$$\n","\\begin{align}\n","F((w_i - w_j)^T \\tilde{w_k}) &= F(w_i^T \\tilde{w_k} + (-w_j^T \\tilde{w_k})) \\\\\n"," &= F(w_i^T \\tilde{w_k}) \\times F(-w_j^T \\tilde{w_k}) \\\\\n"," &= F(w_i^T \\tilde{w_k}) \\times F(w_j^T \\tilde{w_k})^{-1} \\\\\n"," &= \\frac{F(w_i^T \\tilde{w_k})}{F(w_j^T \\tilde{w_k})} \\\\\n","\\end{align}\n","$$\n"," \n","So if we recall the $F$ in terms of co-occurrence probabilities, we get the following:\n"," \n","$$\n","F(w_i^T \\tilde{w_k}) = P_{ik} = \\frac{X_{ik}}{X_i}\n","$$\n"," \n","Since we are expressing $F$ in terms of probability which is a non-negative term, so we apply exponential to dot product $w_i^T \\tilde{w_k}$ and then take logarithm on both sides.\n"," \n","$$\n","w_i^T \\tilde{w_k} = log(P_{ik}) = log(X_{ik}) - log(X_i)\n","$$\n"," \n","On the right hand, the term $log(X_i)$ is independent of $k$ so it can be absorbed into a bias $b_i$ for $w_i$. Finally, we add bias $\\tilde{b_k}$ for $\\tilde{w_k}$ to restore the symmetry.\n"," \n","$$\n","w_i^T \\tilde{w_k} + b_i + \\tilde{b_k} = log(X_{ik})\n","$$\n"," \n","The above equation leads to our objective function, a weighted least squares regression model where we use the weighting function $f(X_{ij})$ for word-word co-occurrences.\n"," \n","$$\n","J = \\sum_{i,j = 1}^{V}f(X_{ij}) (w_i^T \\tilde{w_k} + b_i + \\tilde{b_k} - logX_{ik})^2\n","$$\n"," \n","where $V$ is the size of the vocabulary.\n","\n","Here, the weighting function is defined as follows:\n","\n","$$\n","f(x) = \\begin{cases}\n"," (x / x_{max})^{\\alpha} & \\text{if}\\ x < x_{max} \\\\\n"," 1 & \\text{otherwise}\n"," \\end{cases}\n","$$\n","\n","where $x_{max}$ is the cutoff of the weighting function and $\\alpha$ is power scaling similar to Word2Vec.\n"]},{"cell_type":"code","metadata":{"id":"erZmvpRB5B4r"},"source":["class GloVeModel(nn.Module):\n"," def __init__(self, vocab_size, embed_dim, x_max=100, alpha=0.75):\n"," \"\"\" GloVe model for learning word embeddings. Uses the approach of predicting \n"," context words given the center word.\n"," Params:\n"," vocab_size (int): number of words in the vocabulary\n"," embed_dim (int): embeddings of dimension to be generated\n"," x_max (int): cutoff of the weighting function\n"," alpha (int): parameter of the weighting funtion\n"," \"\"\"\n"," super(GloVeModel, self).__init__()\n"," self.vocab_size = vocab_size\n"," self.embed_dim = embed_dim\n"," self.x_max = x_max\n"," self.alpha = alpha\n","\n"," # embedding layers for input (center) and output (context) words along with biases\n"," self.embed_in = nn.Embedding(vocab_size, embed_dim)\n"," self.embed_out = nn.Embedding(vocab_size, embed_dim)\n"," self.bias_in = nn.Embedding(vocab_size, 1)\n"," self.bias_out = nn.Embedding(vocab_size, 1)\n","\n"," # initialize the embeddings with uniform dist and set bias to zero\n"," self.embed_in.weight.data.uniform_(-1, 1)\n"," self.embed_out.weight.data.uniform_(-1, 1)\n"," self.bias_in.weight.data.zero_()\n"," self.bias_out.weight.data.zero_()\n","\n"," \n"," def forward(self, in_ids, out_ids, cooccurrence_counts):\n"," \"\"\" Trains the GloVe model and updates the weights based on the\n"," criterion.\n"," Params:\n"," in_ids (torch tensor of shape (batch_size,)): indexes of the input words for a batch\n"," out_ids (torch tensor of shape (batch_size,)): indexes of the output words for a batch\n"," cooccurrence_counts (torch tensor of shape (batch_size,)): co-occurence count of input \n"," and output words for a batch\n"," \"\"\"\n"," emb_in = self.embed_in(in_ids)\n"," emb_out = self.embed_out(out_ids)\n"," b_in = self.bias_in(in_ids)\n"," b_out = self.bias_out(out_ids)\n","\n"," # add 1 to counts i.e. cooccurrences in order to avoid log(0) case\n"," cooccurrence_counts += 1\n","\n"," # count weight factor\n"," weight_factor = torch.pow(cooccurrence_counts / self.x_max, self.alpha)\n"," weight_factor[cooccurrence_counts > 1] = 1\n"," \n"," # calculate the distance between the input and output embeddings\n"," emb_prods = torch.sum(emb_in * emb_out, dim=1)\n"," log_cooccurrences = torch.log(cooccurrence_counts)\n"," distances = (emb_prods + b_in + b_out - log_cooccurrences) ** 2\n","\n"," return torch.mean(weight_factor * distances)\n"],"execution_count":null,"outputs":[]},{"cell_type":"markdown","metadata":{"id":"dLD163YZ_NP1"},"source":["### Training\n"]},{"cell_type":"code","metadata":{"id":"W0mKaLxLnz-H"},"source":["# intialize the model and optimizer\n","vocab_size = len(dataset.word2idx)\n","embed_dim = 300\n","model = GloVeModel(vocab_size, embed_dim).to(device)\n","optimizer = optim.Adagrad(model.parameters(), lr=0.05)"],"execution_count":null,"outputs":[]},{"cell_type":"code","metadata":{"id":"LoLR9QlAnz8i"},"source":["# training the network\n","n_epochs = 5\n","batch_size = 512\n","\n","print(\"-\" * 60)\n","print(\"Start of training\")\n","print(\"-\" * 60)\n","\n","for epoch in range(n_epochs):\n"," losses = []\n"," start = time.time()\n","\n"," for input_word_ids, target_word_ids, cooccurrence_counts in dataset.get_batches(batch_size):\n"," # load tensor to GPU\n"," input_word_ids = input_word_ids.to(device)\n"," target_word_ids = target_word_ids.to(device)\n"," cooccurrence_counts = cooccurrence_counts.to(device)\n"," \n"," # forward pass\n"," loss = model.forward(input_word_ids, target_word_ids, cooccurrence_counts)\n","\n"," # backward pass, optimize\n"," optimizer.zero_grad()\n"," loss.backward()\n"," optimizer.step()\n","\n"," losses.append(loss.item())\n"," \n"," end = time.time()\n","\n"," print(f\"Epochs: {epoch + 1}/{n_epochs}\\tAvg training loss: {np.mean(losses):.6f}\\tEllapsed time: {(end - start):.0f} s\")\n","\n","print(\"-\" * 60)\n","print(\"End of training\")\n","print(\"-\" * 60)\n"],"execution_count":null,"outputs":[]},{"cell_type":"markdown","metadata":{"id":"kTxZa53l_NP4"},"source":["### Inference\n"]},{"cell_type":"code","metadata":{"id":"NF6CZu_Ynz6e"},"source":["# get the trained embeddings from the model\n","emb_in = model.embed_in.weight.to(\"cpu\").data.numpy()\n","emb_out = model.embed_out.weight.to(\"cpu\").data.numpy()\n","embeddings = emb_in + emb_out\n","\n","# number of words to be visualized\n","viz_words = 200\n","\n","# projecting the embedding dimension from 300 to 2\n","tsne = TSNE()\n","embed_tsne = tsne.fit_transform(embeddings[:viz_words, :])\n","\n","# plot the projected embeddings\n","plt.figure(figsize=(16, 16))\n","for idx in range(viz_words):\n"," plt.scatter(*embed_tsne[idx, :], color=\"blue\")\n"," plt.annotate(dataset.idx2word[idx], (embed_tsne[idx, 0], embed_tsne[idx, 1]), alpha=0.7)\n"],"execution_count":null,"outputs":[]},{"cell_type":"markdown","metadata":{"id":"oEXgG-hDIMdT"},"source":["## References\n","\n","1. [GloVe: Global Vectors for Word Representation](https://nlp.stanford.edu/pubs/glove.pdf)\n","2. [Group homomorphism](https://en.wikipedia.org/wiki/Group_homomorphism)\n","3. [Homomorphism in GloVe](https://datascience.stackexchange.com/questions/27042/glove-vector-representation-homomorphism-question)\n","4. [A GloVe Implementation in Python](http://www.foldl.me/2014/glove-python/)\n","5. [Pytorch Global Vectors for Word Representation](https://github.com/kefirski/pytorch_GloVe)\n"]}]} -------------------------------------------------------------------------------- /Convolutional Neural Networks for Sentence Classification.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": { 6 | "id": "yeMtUsLNDOsR" 7 | }, 8 | "source": [ 9 | "# Convolutional Neural Networks for Sentence Classification\n", 10 | "\n", 11 | "_This notebook demonstrates the implementation of Convolutional Neural Networks for Sentence Classification proposed by [Kim, 2014](https://arxiv.org/pdf/1408.5882.pdf)._\n" 12 | ] 13 | }, 14 | { 15 | "cell_type": "markdown", 16 | "metadata": {}, 17 | "source": [ 18 | "Traditionally, Convolutional Neural Networks (CNNs) were invented for computed vision and achieved state-of-the-art performance in computer vision and speech recognition. CNNs act like feature extractors where they scan different regions of the image using the kernel and output of each layer is passed to the next CNN layer. The lower layers in CNNs are useful at detecting low-level features such as edges whereas the higher layers in CNNs are useful at detecting facial features such as eyes, nose, ear, etc.\n", 19 | "\n", 20 | "The above paper proposed by [Kim, 2014](https://arxiv.org/pdf/1408.5882.pdf) was one of the earliest work demonstrating the applications of CNNs in NLP tasks, specifically text classification. In this case, CNN is used as a feature extractor which encodes semantic features of text and then these features are fed into classifier.\n", 21 | "\n", 22 | "RNNs extract the prefix sequence features which might not be always helpful as preserving complete context is very difficult for longer sequences and we may get wrong prediction. CNNs help us to extract subsequence features which are beneficial for classification tasks as the dominant features context would be preserved.\n", 23 | "\n", 24 | "We will build a CNN based sentiment classifier for IMDB movie reviews.\n" 25 | ] 26 | }, 27 | { 28 | "cell_type": "code", 29 | "execution_count": 1, 30 | "metadata": { 31 | "executionInfo": { 32 | "elapsed": 5029, 33 | "status": "ok", 34 | "timestamp": 1622648644726, 35 | "user": { 36 | "displayName": "Jay Gala", 37 | "photoUrl": "https://lh3.googleusercontent.com/a-/AOh14Ghr20IAxple1q2jggw00r147YTV5sjlqKrRANzYVA=s64", 38 | "userId": "11525158385229787114" 39 | }, 40 | "user_tz": -330 41 | }, 42 | "id": "QM7kOJJLFB28" 43 | }, 44 | "outputs": [], 45 | "source": [ 46 | "%%capture\n", 47 | "# download the spacy language models for english\n", 48 | "!python -m spacy download en --quiet" 49 | ] 50 | }, 51 | { 52 | "cell_type": "code", 53 | "execution_count": 2, 54 | "metadata": { 55 | "executionInfo": { 56 | "elapsed": 2867, 57 | "status": "ok", 58 | "timestamp": 1622648647583, 59 | "user": { 60 | "displayName": "Jay Gala", 61 | "photoUrl": "https://lh3.googleusercontent.com/a-/AOh14Ghr20IAxple1q2jggw00r147YTV5sjlqKrRANzYVA=s64", 62 | "userId": "11525158385229787114" 63 | }, 64 | "user_tz": -330 65 | }, 66 | "id": "ssZUPl3UFNC6" 67 | }, 68 | "outputs": [], 69 | "source": [ 70 | "%%capture\n", 71 | "!pip install torchtext --upgrade" 72 | ] 73 | }, 74 | { 75 | "cell_type": "code", 76 | "execution_count": 3, 77 | "metadata": { 78 | "executionInfo": { 79 | "elapsed": 154436, 80 | "status": "ok", 81 | "timestamp": 1622648802013, 82 | "user": { 83 | "displayName": "Jay Gala", 84 | "photoUrl": "https://lh3.googleusercontent.com/a-/AOh14Ghr20IAxple1q2jggw00r147YTV5sjlqKrRANzYVA=s64", 85 | "userId": "11525158385229787114" 86 | }, 87 | "user_tz": -330 88 | }, 89 | "id": "-0IQi07nz9J6" 90 | }, 91 | "outputs": [], 92 | "source": [ 93 | "%%capture\n", 94 | "!wget https://dl.fbaipublicfiles.com/fasttext/vectors-english/crawl-300d-2M.vec.zip\n", 95 | "!unzip crawl-300d-2M.vec.zip\n", 96 | "!rm -rf crawl-300d-2M.vec.zip" 97 | ] 98 | }, 99 | { 100 | "cell_type": "markdown", 101 | "metadata": { 102 | "id": "B--2aTzsFPgA" 103 | }, 104 | "source": [ 105 | "## Imports\n" 106 | ] 107 | }, 108 | { 109 | "cell_type": "code", 110 | "execution_count": 4, 111 | "metadata": { 112 | "executionInfo": { 113 | "elapsed": 5741, 114 | "status": "ok", 115 | "timestamp": 1622648807738, 116 | "user": { 117 | "displayName": "Jay Gala", 118 | "photoUrl": "https://lh3.googleusercontent.com/a-/AOh14Ghr20IAxple1q2jggw00r147YTV5sjlqKrRANzYVA=s64", 119 | "userId": "11525158385229787114" 120 | }, 121 | "user_tz": -330 122 | }, 123 | "id": "ZyKMGPOjFUu5" 124 | }, 125 | "outputs": [], 126 | "source": [ 127 | "import random\n", 128 | "import numpy as np\n", 129 | "\n", 130 | "import torch\n", 131 | "import torch.nn as nn\n", 132 | "import torch.optim as optim\n", 133 | "import torch.nn.functional as F\n", 134 | "\n", 135 | "import spacy\n", 136 | "import torchtext\n", 137 | "import torchtext.vocab as vocab\n", 138 | "from torchtext.legacy.datasets import IMDB\n", 139 | "from torchtext.legacy.data import Field, LabelField, BucketIterator\n", 140 | "\n", 141 | "import warnings\n", 142 | "from tqdm.notebook import tqdm\n", 143 | "warnings.filterwarnings('ignore')" 144 | ] 145 | }, 146 | { 147 | "cell_type": "code", 148 | "execution_count": 5, 149 | "metadata": { 150 | "executionInfo": { 151 | "elapsed": 23, 152 | "status": "ok", 153 | "timestamp": 1622648807739, 154 | "user": { 155 | "displayName": "Jay Gala", 156 | "photoUrl": "https://lh3.googleusercontent.com/a-/AOh14Ghr20IAxple1q2jggw00r147YTV5sjlqKrRANzYVA=s64", 157 | "userId": "11525158385229787114" 158 | }, 159 | "user_tz": -330 160 | }, 161 | "id": "DjC3C6_2FYB6" 162 | }, 163 | "outputs": [], 164 | "source": [ 165 | "# for reproducibility\n", 166 | "# refer https://pytorch.org/docs/stable/notes/randomness.html\n", 167 | "SEED = 42\n", 168 | "\n", 169 | "random.seed(SEED)\n", 170 | "np.random.seed(SEED)\n", 171 | "torch.manual_seed(SEED)\n", 172 | "torch.cuda.manual_seed(SEED)\n", 173 | "torch.backends.cudnn.deterministic = True" 174 | ] 175 | }, 176 | { 177 | "cell_type": "code", 178 | "execution_count": 6, 179 | "metadata": { 180 | "executionInfo": { 181 | "elapsed": 16, 182 | "status": "ok", 183 | "timestamp": 1622648807740, 184 | "user": { 185 | "displayName": "Jay Gala", 186 | "photoUrl": "https://lh3.googleusercontent.com/a-/AOh14Ghr20IAxple1q2jggw00r147YTV5sjlqKrRANzYVA=s64", 187 | "userId": "11525158385229787114" 188 | }, 189 | "user_tz": -330 190 | }, 191 | "id": "KV2NLb9oFaav" 192 | }, 193 | "outputs": [], 194 | "source": [ 195 | "device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')" 196 | ] 197 | }, 198 | { 199 | "cell_type": "markdown", 200 | "metadata": { 201 | "id": "WjxWOXY2F3Fg" 202 | }, 203 | "source": [ 204 | "## Data Preprocessing and Loading\n" 205 | ] 206 | }, 207 | { 208 | "cell_type": "code", 209 | "execution_count": 32, 210 | "metadata": { 211 | "executionInfo": { 212 | "elapsed": 810146, 213 | "status": "ok", 214 | "timestamp": 1622650907554, 215 | "user": { 216 | "displayName": "Jay Gala", 217 | "photoUrl": "https://lh3.googleusercontent.com/a-/AOh14Ghr20IAxple1q2jggw00r147YTV5sjlqKrRANzYVA=s64", 218 | "userId": "11525158385229787114" 219 | }, 220 | "user_tz": -330 221 | }, 222 | "id": "x9DZy-LFH7Bc" 223 | }, 224 | "outputs": [], 225 | "source": [ 226 | "# create field objects for text and label\n", 227 | "review = Field(tokenize='spacy', batch_first=True)\n", 228 | "sentiment = LabelField(batch_first=True)\n", 229 | "\n", 230 | "# load the imdb dataset\n", 231 | "train_data, test_data = IMDB.splits(text_field=review, label_field=sentiment)\n", 232 | "train_data, valid_data = train_data.split()" 233 | ] 234 | }, 235 | { 236 | "cell_type": "code", 237 | "execution_count": 33, 238 | "metadata": { 239 | "executionInfo": { 240 | "elapsed": 71638, 241 | "status": "ok", 242 | "timestamp": 1622650979181, 243 | "user": { 244 | "displayName": "Jay Gala", 245 | "photoUrl": "https://lh3.googleusercontent.com/a-/AOh14Ghr20IAxple1q2jggw00r147YTV5sjlqKrRANzYVA=s64", 246 | "userId": "11525158385229787114" 247 | }, 248 | "user_tz": -330 249 | }, 250 | "id": "9eFs-n60Jdrc" 251 | }, 252 | "outputs": [], 253 | "source": [ 254 | "# load the pretrained fasttext embeddings and build the vocabulary\n", 255 | "en_fast_embed = vocab.Vectors(name='crawl-300d-2M.vec', cache='.', unk_init = torch.Tensor.normal_)\n", 256 | "review.build_vocab(train_data, max_size=25000, vectors=en_fast_embed)\n", 257 | "sentiment.build_vocab(train_data)\n", 258 | "\n", 259 | "del en_fast_embed" 260 | ] 261 | }, 262 | { 263 | "cell_type": "code", 264 | "execution_count": 34, 265 | "metadata": { 266 | "colab": { 267 | "base_uri": "https://localhost:8080/" 268 | }, 269 | "executionInfo": { 270 | "elapsed": 39, 271 | "status": "ok", 272 | "timestamp": 1622650979185, 273 | "user": { 274 | "displayName": "Jay Gala", 275 | "photoUrl": "https://lh3.googleusercontent.com/a-/AOh14Ghr20IAxple1q2jggw00r147YTV5sjlqKrRANzYVA=s64", 276 | "userId": "11525158385229787114" 277 | }, 278 | "user_tz": -330 279 | }, 280 | "id": "LbQNCow6HuMp", 281 | "outputId": "0254c26d-ab4e-4b55-a9ad-56377b8f0e5b" 282 | }, 283 | "outputs": [ 284 | { 285 | "name": "stdout", 286 | "output_type": "stream", 287 | "text": [ 288 | "# of training examples: 17500\n", 289 | "# of validation examples: 7500\n", 290 | "# of testing examples: 25000\n", 291 | "dict_keys(['text', 'label'])\n", 292 | "dict_values([['The', 'fact', 'that', 'someone', 'actually', 'spent', 'money', 'on', 'such', 'a', 'bad', 'script', ',', 'is', 'beyond', 'me', '.', 'This', 'really', 'must', 'be', 'one', 'of', 'the', 'worst', 'films', ',', 'in', 'addition', 'to', '\"', 'Haunted', 'Highway', '\"', 'I', 'have', 'ever', 'seen', '.', 'BAD', 'actors', ',', 'and', 'a', 'really', 'bad', 'story', '.', 'There', \"'s\", 'no', 'normal', 'reactions', 'to', 'any', 'event', 'in', 'this', 'film', ',', 'and', 'even', 'though', 'it', \"'s\", 'Halloween', ',', 'normal', 'people', 'would', 'have', 'bigger', 'reactions', 'when', 'they', \"'re\", 'witnessing', 'their', 'father', 'being', 'killed', ',', 'not', 'to', 'mention', 'gutted', ',', 'people', 'with', 'tape', 'covering', 'their', 'airways', ',', 'not', 'being', 'able', 'to', 'breathe', '(', 'in', 'a', 'room', 'with', 'at', 'least', '50', 'people', 'I', 'might', 'add', ')', 'and', 'some', 'person', 'dressed', 'up', 'as', 'Satan', 'dragging', 'dead', 'people', 'out', 'of', 'his', 'house', ',', 'even', 'an', '8', 'year', 'old', 'would', 'see', 'the', 'difference', 'between', 'a', 'doll', 'and', 'a', 'person', '.', 'Not', 'to', 'mention', 'the', 'fact', 'that', 'no', 'one', 'could', 'possibly', 'be', 'that', 'naive', 'and', 'dumb', 'to', 'believe', 'the', 'reality', 'of', 'Satan', 'and', 'Jesus', \"'\", 'appearances', 'on', 'the', 'same', 'day', ',', 'like', 'this', 'kid', 'does', '.', 'When', 'i', 'was', '8', ',', 'I', 'sure', 'had', 'more', 'brains', 'than', 'that', '.', '<', 'br', '/>But', ',', 'the', 'really', 'stupid', 'thing', 'is', 'that', 'everyone', 'else', 'seems', 'to', 'be', 'falling', 'for', 'this', 'mute', 'Satan', 'look', '-', 'alike', 'as', 'well', ',', 'no', 'questions', 'asked', '.', 'The', 'question', 'throughout', 'the', 'film', 'is', ',', 'is', 'it', 'really', 'Satan', ',', 'or', 'is', 'it', 'some', 'crazy', 'person', 'killing', 'people', 'off', 'whenever', 'he', 'feels', 'like', 'it', '?', 'Well', ',', 'he', \"'s\", 'got', 'human', 'hands', ',', 'arms', ',', 'built', 'and', 'whatever', ',', 'so', 'I', 'guess', 'he', \"'s\", 'supposed', 'to', 'be', 'in', 'the', 'movie', 'as', 'well', ',', 'otherwise', 'they', 'did', 'a', 'lousy', 'job', 'concealing', 'it', '.', 'Then', ',', 'with', 'this', 'person', 'being', 'human', 'and', 'all', ',', 'he', 'was', 'able', 'to', 'kill', 'an', 'old', 'lady', ',', 'a', 'man', 'and', 'his', 'mistress', ',', '5', '(', '!', '!', '?', '?', '?', ')', 'cops', '(', 'all', 'with', 'guns', 'and', 'training', 'i', 'presume', ')', ',', 'and', 'a', 'few', 'other', 'people', '.....', 'and', 'obviously', 'everyone', 'was', 'just', 'standing', 'there', 'waiting', 'for', 'him', ',', 'or', 'what?The', 'whole', 'concept', 'and', 'way', 'of', 'telling', 'the', 'story', 'is', 'absolutely', 'the', 'worst', 'thing', 'I', \"'ve\", 'seen', ',', 'and', 'I', 'would', 'never', 'recommend', 'anyone', 'to', 'waste', '1', 'hour', 'and', '30', 'minutes', 'of', 'their', 'lives', 'to', 'watch', 'this', 'total', 'crap', '.'], 'neg'])\n" 293 | ] 294 | } 295 | ], 296 | "source": [ 297 | "print(f'# of training examples: {len(train_data.examples)}')\n", 298 | "print(f'# of validation examples: {len(valid_data.examples)}')\n", 299 | "print(f'# of testing examples: {len(test_data.examples)}')\n", 300 | "\n", 301 | "print(train_data[0].__dict__.keys())\n", 302 | "print(train_data[0].__dict__.values())" 303 | ] 304 | }, 305 | { 306 | "cell_type": "code", 307 | "execution_count": 35, 308 | "metadata": { 309 | "executionInfo": { 310 | "elapsed": 23, 311 | "status": "ok", 312 | "timestamp": 1622650979186, 313 | "user": { 314 | "displayName": "Jay Gala", 315 | "photoUrl": "https://lh3.googleusercontent.com/a-/AOh14Ghr20IAxple1q2jggw00r147YTV5sjlqKrRANzYVA=s64", 316 | "userId": "11525158385229787114" 317 | }, 318 | "user_tz": -330 319 | }, 320 | "id": "j_7k6_xaKd6e" 321 | }, 322 | "outputs": [], 323 | "source": [ 324 | "BATCH_SIZE = 64\n", 325 | "\n", 326 | "train_iterator, valid_iterator, test_iterator = BucketIterator.splits(\n", 327 | " (train_data, valid_data, test_data),\n", 328 | " batch_size=BATCH_SIZE,\n", 329 | " device=device\n", 330 | ")" 331 | ] 332 | }, 333 | { 334 | "cell_type": "code", 335 | "execution_count": 36, 336 | "metadata": { 337 | "colab": { 338 | "base_uri": "https://localhost:8080/" 339 | }, 340 | "executionInfo": { 341 | "elapsed": 23, 342 | "status": "ok", 343 | "timestamp": 1622650979187, 344 | "user": { 345 | "displayName": "Jay Gala", 346 | "photoUrl": "https://lh3.googleusercontent.com/a-/AOh14Ghr20IAxple1q2jggw00r147YTV5sjlqKrRANzYVA=s64", 347 | "userId": "11525158385229787114" 348 | }, 349 | "user_tz": -330 350 | }, 351 | "id": "QE2tx68lLCNf", 352 | "outputId": "987ffbb6-8da9-42c2-94f1-e3da1b74fc64" 353 | }, 354 | "outputs": [ 355 | { 356 | "name": "stdout", 357 | "output_type": "stream", 358 | "text": [ 359 | "{'text': torch.Size([64, 1150]), 'label': torch.Size([64])}\n" 360 | ] 361 | } 362 | ], 363 | "source": [ 364 | "# sanity check to see if data loader is working\n", 365 | "x = next(iter(train_iterator))\n", 366 | "\n", 367 | "print({'text': x.text.shape, 'label': x.label.shape})" 368 | ] 369 | }, 370 | { 371 | "cell_type": "markdown", 372 | "metadata": { 373 | "id": "ZtW9HLyyLPOO" 374 | }, 375 | "source": [ 376 | "## Model Architecture\n" 377 | ] 378 | }, 379 | { 380 | "cell_type": "markdown", 381 | "metadata": {}, 382 | "source": [ 383 | "![cnn_architecture](data:image/jpeg;base64,/9j/4AAQSkZJRgABAQEAYABgAAD/4RCcRXhpZgAATU0AKgAAAAgABAE7AAIAAAAOAAAISodpAAQAAAABAAAIWJydAAEAAAAcAAAQeOocAAcAAAgMAAAAPgAAAAAc6gAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEFkbWluaXN0cmF0b3IAAAHqHAAHAAAIDAAACGoAAAAAHOoAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEEAZABtAGkAbgBpAHMAdAByAGEAdABvAHIAAAD/4QpmaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLwA8P3hwYWNrZXQgYmVnaW49J++7vycgaWQ9J1c1TTBNcENlaGlIenJlU3pOVGN6a2M5ZCc/Pg0KPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyI+PHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj48cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0idXVpZDpmYWY1YmRkNS1iYTNkLTExZGEtYWQzMS1kMzNkNzUxODJmMWIiIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIvPjxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSJ1dWlkOmZhZjViZGQ1LWJhM2QtMTFkYS1hZDMxLWQzM2Q3NTE4MmYxYiIgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIj48ZGM6Y3JlYXRvcj48cmRmOlNlcSB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPjxyZGY6bGk+QWRtaW5pc3RyYXRvcjwvcmRmOmxpPjwvcmRmOlNlcT4NCgkJCTwvZGM6Y3JlYXRvcj48L3JkZjpEZXNjcmlwdGlvbj48L3JkZjpSREY+PC94OnhtcG1ldGE+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw/eHBhY2tldCBlbmQ9J3cnPz7/2wBDAAcFBQYFBAcGBQYIBwcIChELCgkJChUPEAwRGBUaGRgVGBcbHichGx0lHRcYIi4iJSgpKywrGiAvMy8qMicqKyr/2wBDAQcICAoJChQLCxQqHBgcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKir/wAARCAK4As0DASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwD6RooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigArC8Sa9e6RdaXZ6VpsWoXepTvEiTXXkIgWNpCS2xj0XGMd63a5HxJewL8RfBtiW/0iSW8mVAP4Ft2Uk+nLqKALH9qeNP+hX0r/wdt/8AI9H9qeNP+hX0r/wdt/8AI9dNRQBzP9qeNP8AoV9K/wDB23/yPR/anjT/AKFfSv8Awdt/8j101cd421i/tdS07TtK1SWzluElleOzsDd3UgXaBtUgoiZblm9gKQy3/anjT/oV9K/8Hbf/ACPR/anjT/oV9K/8Hbf/ACPXI6B4t8S+KotC0iPUE0u8uIbye8vfsqNIwgn8lVVCSiscgt1AxxRqEGv3HjjwWt14ktJ5obq8hkks7dSr7EYncCflcrhWXoDyKrf+vkSdVDrfi+4j8y38N6PKmSNya6zDIOCMi37EEfhUn9qeNP8AoV9K/wDB23/yPXJ6N40udDt7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wxf/APpTJVjUfG+nW9zNYaVFcaxqsbGP7FZRM21+mJJMbIx6liPxPFfq2H/gw9F+R4c/iYy3P274qXkq8ppelR2+70knkLsv12wxH/gQrp6xfC2jT6Rpsr6lIk2qX87Xd9LGDtMrADauedqKqoueyjvW1W5IUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABXCfFKx/tK28NWv2q5tPM1tP31rJskXFvOeG7V3dcd8Qf9d4W/7Da/+k1xXLjG1hqjXZ/kXT+NHPf8IP8A9TR4k/8ABh/9jR/wg/8A1NHiT/wYf/Y11NFfmn1ir3PY5IlX4WW32Pwjc2/nTT+Xqt8vmzvud8XL8se5rs65P4c/8i7ff9hi/wD/AEpkrrK/T8O70YPyX5HjS+JhRRRWxIUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABXL+OdJ1TU7bSJtEt4bmfT9RW6aGafyg6eVKhw2085kB6djXUUVFSEakHCWzGm07o4LHjH/oWLP/AMGw/wDjdGPGP/QsWf8A4Nh/8brvaK8n+xMD/J+L/wAzf6zV7nO+B9Kv9I8PSRavFFDdT3tzdNFFL5gQSTM4G7AycMO1dFRRXrxioxUVsjBu7uFFFFUIKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKAP/Z \"CNN architecture for sentence classification\")\n", 384 | "\n", 385 | "(source: https://arxiv.org/pdf/1510.03820.pdf)\n" 386 | ] 387 | }, 388 | { 389 | "cell_type": "markdown", 390 | "metadata": {}, 391 | "source": [ 392 | "CNN based text classifier reads the input sequence and generates a feature representation for the subsequences which are used for classification.\n", 393 | "\n", 394 | "For the implementation in this notebook, we first apply the embedding layer on the input sequence $x$ to obtain the embedded representation $x_{emb}$. Next, we apply 1D convolutions of different filter sizes to obtain feature map $x_{conv_i}$ corresponding to each filter $i$. Further, we apply ReLU activation and max pooling over time to reduce each feature map to a single scalar $x_{pool_i}$ and concatenate all these scalar values $x_concat$. Finally, linear transformation is applied over the concatenated representation using the weight matrix $W$ to compute logits. Either sigmoid or softmax is applied to these computed logits depending on the classification problem i.e. binary or multi-class.\n", 395 | "\n", 396 | "$$\n", 397 | "x_{emb} = f_{embedding}(x) \\\\\n", 398 | "x_{conv_i} = \\text{conv1D}(x_{emb}) \\\\\n", 399 | "x_{pool_i} = \\text{maxpool}(relu(x_{conv_i})) \\\\\n", 400 | "x_{concat} = [x_{pool_i}; \\dots; x_{pool_j}] \\\\\n", 401 | "\\text{logits} = \\text{dropout}(Wx_{concat})\n", 402 | "$$\n" 403 | ] 404 | }, 405 | { 406 | "cell_type": "code", 407 | "execution_count": 37, 408 | "metadata": { 409 | "executionInfo": { 410 | "elapsed": 18, 411 | "status": "ok", 412 | "timestamp": 1622650979188, 413 | "user": { 414 | "displayName": "Jay Gala", 415 | "photoUrl": "https://lh3.googleusercontent.com/a-/AOh14Ghr20IAxple1q2jggw00r147YTV5sjlqKrRANzYVA=s64", 416 | "userId": "11525158385229787114" 417 | }, 418 | "user_tz": -330 419 | }, 420 | "id": "k8D3rfn_LcH8" 421 | }, 422 | "outputs": [], 423 | "source": [ 424 | "class CNNTextClassifier(nn.Module):\n", 425 | " \"\"\" Simple 1D Convolutional Neural Network for Sentence Classification.\n", 426 | " \"\"\"\n", 427 | "\n", 428 | " def __init__(self, vocab_size, n_classes, embed_size, filter_sizes, n_filters, pad_idx, dropout_rate=0.5):\n", 429 | " super(CNNTextClassifier, self).__init__()\n", 430 | " \n", 431 | " self.vocab_size = vocab_size\n", 432 | " self.embed_size = embed_size\n", 433 | " self.filter_sizes = filter_sizes\n", 434 | " self.n_filters = n_filters\n", 435 | " self.n_classes = n_classes\n", 436 | " self.pad_idx = pad_idx\n", 437 | " self.dropout_rate = dropout_rate\n", 438 | "\n", 439 | " self.embedding = nn.Embedding(vocab_size, embed_size, padding_idx=pad_idx)\n", 440 | " self.conv_list = nn.ModuleList([\n", 441 | " nn.Conv1d(in_channels=embed_size, out_channels=n_filters, kernel_size=filter_sizes[i])\n", 442 | " for i in range(len(filter_sizes))\n", 443 | " ])\n", 444 | " self.fc = nn.Linear(len(filter_sizes) * n_filters, n_classes)\n", 445 | " self.dropout = nn.Dropout(dropout_rate)\n", 446 | "\n", 447 | " \n", 448 | " def load_pretrained_embeddings(self, embeddings, fine_tune=False):\n", 449 | " self.embedding.weight = nn.Parameter(embeddings)\n", 450 | " for p in self.embedding.parameters():\n", 451 | " p.requires_grad = fine_tune\n", 452 | " \n", 453 | "\n", 454 | " def _conv_block(self, x, conv_layer):\n", 455 | " \"\"\" x: (batch_size, embed_size, seq_len)\n", 456 | " \"\"\"\n", 457 | " x_conv = F.relu(conv_layer(x)) # (batch_size, n_filters, seq_len - filter_sizes[i] + 1)\n", 458 | " x_pool = F.max_pool1d(x_conv, kernel_size=x_conv.shape[2]).squeeze(2) # (batch_size, n_filters)\n", 459 | " return x_pool\n", 460 | "\n", 461 | "\n", 462 | " def forward(self, x):\n", 463 | " \"\"\" x: (batch_size, seq_len)\n", 464 | " \"\"\"\n", 465 | " embed = self.embedding(x) # (batch_size, seq_len, embed_size)\n", 466 | " embed = embed.permute(0, 2, 1) # (batch_size, embed_size, seq_len)\n", 467 | "\n", 468 | " conv_stack = [\n", 469 | " self._conv_block(embed, conv) for conv in self.conv_list\n", 470 | " ]\n", 471 | "\n", 472 | " pooled_values = torch.cat(conv_stack, dim=1) # (batch_size, sum(num_filters)) \n", 473 | "\n", 474 | " logits = self.fc(self.dropout(pooled_values)) # (batch_size, num_classes)\n", 475 | "\n", 476 | " return logits" 477 | ] 478 | }, 479 | { 480 | "cell_type": "markdown", 481 | "metadata": { 482 | "id": "iVgiu3sAX8Kt" 483 | }, 484 | "source": [ 485 | "## Helper Utilities\n" 486 | ] 487 | }, 488 | { 489 | "cell_type": "code", 490 | "execution_count": 38, 491 | "metadata": { 492 | "executionInfo": { 493 | "elapsed": 17, 494 | "status": "ok", 495 | "timestamp": 1622650979188, 496 | "user": { 497 | "displayName": "Jay Gala", 498 | "photoUrl": "https://lh3.googleusercontent.com/a-/AOh14Ghr20IAxple1q2jggw00r147YTV5sjlqKrRANzYVA=s64", 499 | "userId": "11525158385229787114" 500 | }, 501 | "user_tz": -330 502 | }, 503 | "id": "T_xZRYpYYBf6" 504 | }, 505 | "outputs": [], 506 | "source": [ 507 | "def model_summary(model):\n", 508 | " print(model)\n", 509 | " print(f'# of trainable params: {sum(p.numel() for p in model.parameters() if p.requires_grad):,}')\n", 510 | " print(f'# of non-trainable params: {sum(p.numel() for p in model.parameters() if not p.requires_grad):,}')" 511 | ] 512 | }, 513 | { 514 | "cell_type": "code", 515 | "execution_count": 39, 516 | "metadata": { 517 | "executionInfo": { 518 | "elapsed": 17, 519 | "status": "ok", 520 | "timestamp": 1622650979189, 521 | "user": { 522 | "displayName": "Jay Gala", 523 | "photoUrl": "https://lh3.googleusercontent.com/a-/AOh14Ghr20IAxple1q2jggw00r147YTV5sjlqKrRANzYVA=s64", 524 | "userId": "11525158385229787114" 525 | }, 526 | "user_tz": -330 527 | }, 528 | "id": "tpiECqiLdF4x" 529 | }, 530 | "outputs": [], 531 | "source": [ 532 | "def accuracy(preds, y):\n", 533 | " top_preds = preds.argmax(dim=1, keepdim=True)\n", 534 | " correct = (top_preds == y.view_as(top_preds)).sum()\n", 535 | " acc = correct / len(y)\n", 536 | " return acc" 537 | ] 538 | }, 539 | { 540 | "cell_type": "markdown", 541 | "metadata": { 542 | "id": "mudqBztPX3S5" 543 | }, 544 | "source": [ 545 | "## Training\n" 546 | ] 547 | }, 548 | { 549 | "cell_type": "code", 550 | "execution_count": 46, 551 | "metadata": { 552 | "executionInfo": { 553 | "elapsed": 3, 554 | "status": "ok", 555 | "timestamp": 1622650986652, 556 | "user": { 557 | "displayName": "Jay Gala", 558 | "photoUrl": "https://lh3.googleusercontent.com/a-/AOh14Ghr20IAxple1q2jggw00r147YTV5sjlqKrRANzYVA=s64", 559 | "userId": "11525158385229787114" 560 | }, 561 | "user_tz": -330 562 | }, 563 | "id": "kL7MVl7xxpAq" 564 | }, 565 | "outputs": [], 566 | "source": [ 567 | "def train_fn(model, iterator, optimizer, criterion):\n", 568 | " model.train()\n", 569 | " epoch_loss = 0\n", 570 | " epoch_acc = 0\n", 571 | " \n", 572 | " tk0 = tqdm(iterator, total=len(iterator), position=0, leave=True)\n", 573 | "\n", 574 | " for idx, batch in enumerate(tk0):\n", 575 | " \n", 576 | " # forward pass\n", 577 | " optimizer.zero_grad()\n", 578 | " logits = model(batch.text) # (batch_size)\n", 579 | " \n", 580 | " # calcalute loss\n", 581 | " loss = criterion(logits, batch.label)\n", 582 | " \n", 583 | " # calculate accuracy\n", 584 | " acc = accuracy(logits, batch.label)\n", 585 | " \n", 586 | " # backward pass\n", 587 | " loss.backward()\n", 588 | " \n", 589 | " # update model parameters\n", 590 | " optimizer.step()\n", 591 | " \n", 592 | " epoch_loss += loss.item()\n", 593 | " epoch_acc += acc.item()\n", 594 | "\n", 595 | " tk0.update(0)\n", 596 | " \n", 597 | " tk0.close()\n", 598 | " \n", 599 | " return epoch_acc / len(iterator), epoch_loss / len(iterator)" 600 | ] 601 | }, 602 | { 603 | "cell_type": "code", 604 | "execution_count": 47, 605 | "metadata": { 606 | "executionInfo": { 607 | "elapsed": 4, 608 | "status": "ok", 609 | "timestamp": 1622650987090, 610 | "user": { 611 | "displayName": "Jay Gala", 612 | "photoUrl": "https://lh3.googleusercontent.com/a-/AOh14Ghr20IAxple1q2jggw00r147YTV5sjlqKrRANzYVA=s64", 613 | "userId": "11525158385229787114" 614 | }, 615 | "user_tz": -330 616 | }, 617 | "id": "hmytuJE8yFMn" 618 | }, 619 | "outputs": [], 620 | "source": [ 621 | "def eval_fn(model, iterator, criterion):\n", 622 | " model.eval()\n", 623 | " epoch_loss = 0\n", 624 | " epoch_acc = 0\n", 625 | " \n", 626 | " tk0 = tqdm(iterator, total=len(iterator), position=0, leave=True)\n", 627 | "\n", 628 | " with torch.no_grad():\n", 629 | " for idx, batch in enumerate(tk0):\n", 630 | " \n", 631 | " # forward pass\n", 632 | " logits = model(batch.text) # (batch_size)\n", 633 | " \n", 634 | " # calcalute loss\n", 635 | " loss = criterion(logits, batch.label)\n", 636 | " \n", 637 | " # calculate accuracy\n", 638 | " acc = accuracy(logits, batch.label)\n", 639 | "\n", 640 | " epoch_loss += loss.item()\n", 641 | " epoch_acc += acc.item()\n", 642 | "\n", 643 | " tk0.update(0)\n", 644 | " \n", 645 | " tk0.close()\n", 646 | " \n", 647 | " return epoch_acc / len(iterator), epoch_loss / len(iterator)" 648 | ] 649 | }, 650 | { 651 | "cell_type": "code", 652 | "execution_count": 48, 653 | "metadata": { 654 | "executionInfo": { 655 | "elapsed": 15, 656 | "status": "ok", 657 | "timestamp": 1622650987684, 658 | "user": { 659 | "displayName": "Jay Gala", 660 | "photoUrl": "https://lh3.googleusercontent.com/a-/AOh14Ghr20IAxple1q2jggw00r147YTV5sjlqKrRANzYVA=s64", 661 | "userId": "11525158385229787114" 662 | }, 663 | "user_tz": -330 664 | }, 665 | "id": "A2OGqhaIYXB3" 666 | }, 667 | "outputs": [], 668 | "source": [ 669 | "# hyperparameters\n", 670 | "VOCAB_SIZE = len(review.vocab)\n", 671 | "EMBED_SIZE = review.vocab.vectors.shape[1]\n", 672 | "FILTER_SIZES = [3, 4, 5]\n", 673 | "N_FILTERS = 100\n", 674 | "N_CLASSES = len(sentiment.vocab)\n", 675 | "DROPOUT_RATE = 0.5\n", 676 | "PAD_IDX = review.vocab.stoi[review.pad_token]\n", 677 | "N_EPOCHS = 20" 678 | ] 679 | }, 680 | { 681 | "cell_type": "code", 682 | "execution_count": 54, 683 | "metadata": { 684 | "colab": { 685 | "base_uri": "https://localhost:8080/" 686 | }, 687 | "executionInfo": { 688 | "elapsed": 686, 689 | "status": "ok", 690 | "timestamp": 1622651034647, 691 | "user": { 692 | "displayName": "Jay Gala", 693 | "photoUrl": "https://lh3.googleusercontent.com/a-/AOh14Ghr20IAxple1q2jggw00r147YTV5sjlqKrRANzYVA=s64", 694 | "userId": "11525158385229787114" 695 | }, 696 | "user_tz": -330 697 | }, 698 | "id": "1rmb8RcUYZl9", 699 | "outputId": "2727b9e4-f361-4ee8-e3f9-493e281c274b" 700 | }, 701 | "outputs": [ 702 | { 703 | "name": "stdout", 704 | "output_type": "stream", 705 | "text": [ 706 | "CNNTextClassifier(\n", 707 | " (embedding): Embedding(25002, 300, padding_idx=1)\n", 708 | " (conv_list): ModuleList(\n", 709 | " (0): Conv1d(300, 100, kernel_size=(3,), stride=(1,))\n", 710 | " (1): Conv1d(300, 100, kernel_size=(4,), stride=(1,))\n", 711 | " (2): Conv1d(300, 100, kernel_size=(5,), stride=(1,))\n", 712 | " )\n", 713 | " (fc): Linear(in_features=300, out_features=2, bias=True)\n", 714 | " (dropout): Dropout(p=0.5, inplace=False)\n", 715 | ")\n", 716 | "# of trainable params: 7,861,502\n", 717 | "# of non-trainable params: 0\n" 718 | ] 719 | } 720 | ], 721 | "source": [ 722 | "model = CNNTextClassifier(VOCAB_SIZE, N_CLASSES, EMBED_SIZE, FILTER_SIZES, N_FILTERS, PAD_IDX, DROPOUT_RATE)\n", 723 | "# load the pre-trained GloVe embedding\n", 724 | "model.load_pretrained_embeddings(review.vocab.vectors, fine_tune=True)\n", 725 | "model = model.to(device)\n", 726 | "\n", 727 | "model_summary(model)" 728 | ] 729 | }, 730 | { 731 | "cell_type": "code", 732 | "execution_count": 55, 733 | "metadata": { 734 | "executionInfo": { 735 | "elapsed": 20, 736 | "status": "ok", 737 | "timestamp": 1622651034651, 738 | "user": { 739 | "displayName": "Jay Gala", 740 | "photoUrl": "https://lh3.googleusercontent.com/a-/AOh14Ghr20IAxple1q2jggw00r147YTV5sjlqKrRANzYVA=s64", 741 | "userId": "11525158385229787114" 742 | }, 743 | "user_tz": -330 744 | }, 745 | "id": "vW7sfVU1aPVi" 746 | }, 747 | "outputs": [], 748 | "source": [ 749 | "optimizer = optim.Adadelta(model.parameters(), lr=1e-1)\n", 750 | "scheduler = optim.lr_scheduler.ReduceLROnPlateau(\n", 751 | " optimizer, patience=0, threshold=0.001, mode='max'\n", 752 | ")" 753 | ] 754 | }, 755 | { 756 | "cell_type": "code", 757 | "execution_count": 56, 758 | "metadata": { 759 | "executionInfo": { 760 | "elapsed": 21, 761 | "status": "ok", 762 | "timestamp": 1622651034655, 763 | "user": { 764 | "displayName": "Jay Gala", 765 | "photoUrl": "https://lh3.googleusercontent.com/a-/AOh14Ghr20IAxple1q2jggw00r147YTV5sjlqKrRANzYVA=s64", 766 | "userId": "11525158385229787114" 767 | }, 768 | "user_tz": -330 769 | }, 770 | "id": "pcaK7UVSkiv6" 771 | }, 772 | "outputs": [], 773 | "source": [ 774 | "criterion = nn.CrossEntropyLoss()" 775 | ] 776 | }, 777 | { 778 | "cell_type": "code", 779 | "execution_count": null, 780 | "metadata": { 781 | "id": "p7VOszRie17P" 782 | }, 783 | "outputs": [], 784 | "source": [ 785 | "best_acc = 0\n", 786 | "es_patience = 3\n", 787 | "patience = 0\n", 788 | "model_path = 'model.pth'\n", 789 | "\n", 790 | "\n", 791 | "for epoch in range(0, N_EPOCHS + 1):\n", 792 | " # one epoch training\n", 793 | " train_acc, train_loss = train_fn(model, train_iterator, optimizer, criterion)\n", 794 | " \n", 795 | " # one epoch validation\n", 796 | " valid_acc, valid_loss = eval_fn(model, valid_iterator, criterion)\n", 797 | " \n", 798 | " print(f'Epoch: {epoch}, Train Accuracy: {train_acc * 100:.2f}%, Train loss: {train_loss:.4f}, Valid Accuracy: {valid_acc * 100:.2f}%,, Valid Loss: {valid_loss:.4f}')\n", 799 | " \n", 800 | " scheduler.step(valid_acc)\n", 801 | "\n", 802 | " is_best = valid_acc > best_acc\n", 803 | " if is_best:\n", 804 | " print(f'Best accuracy improved ({best_acc * 100:.2f}% -> {valid_acc * 100:.2f}%). Saving Model!')\n", 805 | " best_acc = valid_acc\n", 806 | " patience = 0\n", 807 | " torch.save(model.state_dict(), model_path)\n", 808 | " else:\n", 809 | " patience += 1\n", 810 | " print(f'Early stopping counter: {patience} out of {es_patience}')\n", 811 | " if patience == es_patience:\n", 812 | " print(f'Early stopping! Best accuracy: {best_acc * 100:.2f}%')\n", 813 | " break" 814 | ] 815 | }, 816 | { 817 | "cell_type": "code", 818 | "execution_count": 58, 819 | "metadata": { 820 | "colab": { 821 | "base_uri": "https://localhost:8080/", 822 | "height": 101, 823 | "referenced_widgets": [ 824 | "0e8d20a7c37f41ec8be9bedf0b24c5ad", 825 | "77cffdfd79db46d098ff3e85694af708", 826 | "5092dec0198d4ddca6ec280a8efe20fa", 827 | "97565fb53ca747baac3a3a795dbb60df", 828 | "76a92c955bba41f4862918d88c888376", 829 | "57835188d57b40b3b7ab7b32167d5f20", 830 | "7ddcff75499442dc8e472c6121eed9c2", 831 | "9ed81c02af6047dea211c5483ba358bc" 832 | ] 833 | }, 834 | "executionInfo": { 835 | "elapsed": 4116, 836 | "status": "ok", 837 | "timestamp": 1622651418336, 838 | "user": { 839 | "displayName": "Jay Gala", 840 | "photoUrl": "https://lh3.googleusercontent.com/a-/AOh14Ghr20IAxple1q2jggw00r147YTV5sjlqKrRANzYVA=s64", 841 | "userId": "11525158385229787114" 842 | }, 843 | "user_tz": -330 844 | }, 845 | "id": "xkLMlMCeuRJv", 846 | "outputId": "8140b6d9-96aa-491d-dec5-bfa51ba4a05a" 847 | }, 848 | "outputs": [ 849 | { 850 | "name": "stdout", 851 | "output_type": "stream", 852 | "text": [ 853 | "Evaluating the model on test data ...\n" 854 | ] 855 | }, 856 | { 857 | "data": { 858 | "application/vnd.jupyter.widget-view+json": { 859 | "model_id": "0e8d20a7c37f41ec8be9bedf0b24c5ad", 860 | "version_major": 2, 861 | "version_minor": 0 862 | }, 863 | "text/plain": [ 864 | "HBox(children=(FloatProgress(value=0.0, max=391.0), HTML(value='')))" 865 | ] 866 | }, 867 | "metadata": { 868 | "tags": [] 869 | }, 870 | "output_type": "display_data" 871 | }, 872 | { 873 | "name": "stdout", 874 | "output_type": "stream", 875 | "text": [ 876 | "\n", 877 | "Test Accuracy: 86.63%, Test loss: 0.3117\n" 878 | ] 879 | } 880 | ], 881 | "source": [ 882 | "# evaluate the model on test data\n", 883 | "model.load_state_dict(torch.load(model_path, map_location=device))\n", 884 | "\n", 885 | "print('Evaluating the model on test data ...')\n", 886 | "test_acc, test_loss = eval_fn(model, test_iterator, criterion)\n", 887 | "print(f'Test Accuracy: {test_acc * 100:.2f}%, Test loss: {test_loss:.4f}')" 888 | ] 889 | }, 890 | { 891 | "cell_type": "markdown", 892 | "metadata": { 893 | "id": "fZ5zIFfEuLrP" 894 | }, 895 | "source": [ 896 | "## Inferences\n" 897 | ] 898 | }, 899 | { 900 | "cell_type": "code", 901 | "execution_count": 59, 902 | "metadata": { 903 | "executionInfo": { 904 | "elapsed": 1540, 905 | "status": "ok", 906 | "timestamp": 1622651441453, 907 | "user": { 908 | "displayName": "Jay Gala", 909 | "photoUrl": "https://lh3.googleusercontent.com/a-/AOh14Ghr20IAxple1q2jggw00r147YTV5sjlqKrRANzYVA=s64", 910 | "userId": "11525158385229787114" 911 | }, 912 | "user_tz": -330 913 | }, 914 | "id": "kn5ENhvFwXc1" 915 | }, 916 | "outputs": [], 917 | "source": [ 918 | "nlp = spacy.load('en')\n", 919 | "\n", 920 | "def predict(model, text, min_len=5):\n", 921 | " model.eval()\n", 922 | "\n", 923 | " tokens = [token.text for token in nlp.tokenizer(text)]\n", 924 | "\n", 925 | " if len(tokens) < min_len:\n", 926 | " tokens += [review.pad_token] * (min_len - len(tokens))\n", 927 | " \n", 928 | " token_ids = [review.vocab.stoi.get(token, review.unk_token) for token in tokens]\n", 929 | "\n", 930 | " token_ids = torch.tensor(token_ids, dtype=torch.long).to(device) # (seq_len)\n", 931 | " token_ids = token_ids.unsqueeze(0) # (1, seq_len)\n", 932 | "\n", 933 | " logits = model(token_ids)\n", 934 | "\n", 935 | " pred_probs = F.softmax(logits, dim=1).squeeze(0)\n", 936 | "\n", 937 | " return pred_probs" 938 | ] 939 | }, 940 | { 941 | "cell_type": "code", 942 | "execution_count": 67, 943 | "metadata": { 944 | "colab": { 945 | "base_uri": "https://localhost:8080/" 946 | }, 947 | "executionInfo": { 948 | "elapsed": 412, 949 | "status": "ok", 950 | "timestamp": 1622651694922, 951 | "user": { 952 | "displayName": "Jay Gala", 953 | "photoUrl": "https://lh3.googleusercontent.com/a-/AOh14Ghr20IAxple1q2jggw00r147YTV5sjlqKrRANzYVA=s64", 954 | "userId": "11525158385229787114" 955 | }, 956 | "user_tz": -330 957 | }, 958 | "id": "ypAw26oXk1sY", 959 | "outputId": "c38e85c8-23b0-4c95-e1ff-bdc20f1e7bcf" 960 | }, 961 | "outputs": [ 962 | { 963 | "name": "stdout", 964 | "output_type": "stream", 965 | "text": [ 966 | "The movie was great!\n", 967 | "positive: 73.38%, negative: 26.62%\n" 968 | ] 969 | } 970 | ], 971 | "source": [ 972 | "sample_text = 'The movie was great!'\n", 973 | "print(sample_text)\n", 974 | "\n", 975 | "pred_probs = predict(model, sample_text)\n", 976 | "print(f'positive: {pred_probs[0] * 100:.2f}%, negative: {(pred_probs[1]) * 100:.2f}%')" 977 | ] 978 | }, 979 | { 980 | "cell_type": "code", 981 | "execution_count": 68, 982 | "metadata": { 983 | "colab": { 984 | "base_uri": "https://localhost:8080/" 985 | }, 986 | "executionInfo": { 987 | "elapsed": 3, 988 | "status": "ok", 989 | "timestamp": 1622651695289, 990 | "user": { 991 | "displayName": "Jay Gala", 992 | "photoUrl": "https://lh3.googleusercontent.com/a-/AOh14Ghr20IAxple1q2jggw00r147YTV5sjlqKrRANzYVA=s64", 993 | "userId": "11525158385229787114" 994 | }, 995 | "user_tz": -330 996 | }, 997 | "id": "DHW1vcRvk7lR", 998 | "outputId": "7526541b-709b-4600-9520-2eda86e66fd9" 999 | }, 1000 | "outputs": [ 1001 | { 1002 | "name": "stdout", 1003 | "output_type": "stream", 1004 | "text": [ 1005 | "The movie was okay.\n", 1006 | "positive: 34.23%, negative: 65.77%\n" 1007 | ] 1008 | } 1009 | ], 1010 | "source": [ 1011 | "sample_text = 'The movie was okay.'\n", 1012 | "print(sample_text)\n", 1013 | "\n", 1014 | "pred_probs = predict(model, sample_text)\n", 1015 | "print(f'positive: {pred_probs[0] * 100:.2f}%, negative: {(pred_probs[1]) * 100:.2f}%')" 1016 | ] 1017 | }, 1018 | { 1019 | "cell_type": "code", 1020 | "execution_count": 69, 1021 | "metadata": { 1022 | "colab": { 1023 | "base_uri": "https://localhost:8080/" 1024 | }, 1025 | "executionInfo": { 1026 | "elapsed": 17, 1027 | "status": "ok", 1028 | "timestamp": 1622651695975, 1029 | "user": { 1030 | "displayName": "Jay Gala", 1031 | "photoUrl": "https://lh3.googleusercontent.com/a-/AOh14Ghr20IAxple1q2jggw00r147YTV5sjlqKrRANzYVA=s64", 1032 | "userId": "11525158385229787114" 1033 | }, 1034 | "user_tz": -330 1035 | }, 1036 | "id": "WdjKB5_8yWz-", 1037 | "outputId": "d6c58f33-ceb9-44ab-9448-c28b5295617e" 1038 | }, 1039 | "outputs": [ 1040 | { 1041 | "name": "stdout", 1042 | "output_type": "stream", 1043 | "text": [ 1044 | "The movie was terrible...\n", 1045 | "positive: 9.10%, negative: 90.90%\n" 1046 | ] 1047 | } 1048 | ], 1049 | "source": [ 1050 | "sample_text = 'The movie was terrible...'\n", 1051 | "print(sample_text)\n", 1052 | "\n", 1053 | "pred_probs = predict(model, sample_text)\n", 1054 | "print(f'positive: {pred_probs[0] * 100:.2f}%, negative: {(pred_probs[1]) * 100:.2f}%')" 1055 | ] 1056 | }, 1057 | { 1058 | "cell_type": "markdown", 1059 | "metadata": { 1060 | "id": "73M2zaJ4sjdX" 1061 | }, 1062 | "source": [ 1063 | "## References\n", 1064 | "\n", 1065 | "1. [Convolutional Neural Networks for Sentence Classification](https://arxiv.org/pdf/1408.5882.pdf)\n", 1066 | "2. [A Sensitivity Analysis of (and Practitioners’ Guide to) Convolutional Neural Networks for Sentence Classification](https://arxiv.org/pdf/1510.03820.pdf)\n", 1067 | "3. [Official Theano Implementation by Yoon Kim](https://github.com/yoonkim/CNN_sentence)\n", 1068 | "4. [PyTorch Sentiment Analysis by Ben Trevet](https://github.com/bentrevett/pytorch-sentiment-analysis)\n" 1069 | ] 1070 | } 1071 | ], 1072 | "metadata": { 1073 | "accelerator": "GPU", 1074 | "colab": { 1075 | "authorship_tag": "ABX9TyO+P5BK60lx1rX+gFJHgQ+e", 1076 | "collapsed_sections": [], 1077 | "name": "Convolutional Neural Networks for Sentence Classification.ipynb", 1078 | "provenance": [], 1079 | "toc_visible": true 1080 | }, 1081 | "kernelspec": { 1082 | "display_name": "Python 3", 1083 | "language": "python", 1084 | "name": "python3" 1085 | }, 1086 | "language_info": { 1087 | "codemirror_mode": { 1088 | "name": "ipython", 1089 | "version": 3 1090 | }, 1091 | "file_extension": ".py", 1092 | "mimetype": "text/x-python", 1093 | "name": "python", 1094 | "nbconvert_exporter": "python", 1095 | "pygments_lexer": "ipython3", 1096 | "version": "3.8.5" 1097 | }, 1098 | "widgets": { 1099 | "application/vnd.jupyter.widget-state+json": { 1100 | "0e8d20a7c37f41ec8be9bedf0b24c5ad": { 1101 | "model_module": "@jupyter-widgets/controls", 1102 | "model_name": "HBoxModel", 1103 | "state": { 1104 | "_dom_classes": [], 1105 | "_model_module": "@jupyter-widgets/controls", 1106 | "_model_module_version": "1.5.0", 1107 | "_model_name": "HBoxModel", 1108 | "_view_count": null, 1109 | "_view_module": "@jupyter-widgets/controls", 1110 | "_view_module_version": "1.5.0", 1111 | "_view_name": "HBoxView", 1112 | "box_style": "", 1113 | "children": [ 1114 | "IPY_MODEL_5092dec0198d4ddca6ec280a8efe20fa", 1115 | "IPY_MODEL_97565fb53ca747baac3a3a795dbb60df" 1116 | ], 1117 | "layout": "IPY_MODEL_77cffdfd79db46d098ff3e85694af708" 1118 | } 1119 | }, 1120 | "5092dec0198d4ddca6ec280a8efe20fa": { 1121 | "model_module": "@jupyter-widgets/controls", 1122 | "model_name": "FloatProgressModel", 1123 | "state": { 1124 | "_dom_classes": [], 1125 | "_model_module": "@jupyter-widgets/controls", 1126 | "_model_module_version": "1.5.0", 1127 | "_model_name": "FloatProgressModel", 1128 | "_view_count": null, 1129 | "_view_module": "@jupyter-widgets/controls", 1130 | "_view_module_version": "1.5.0", 1131 | "_view_name": "ProgressView", 1132 | "bar_style": "success", 1133 | "description": "100%", 1134 | "description_tooltip": null, 1135 | "layout": "IPY_MODEL_57835188d57b40b3b7ab7b32167d5f20", 1136 | "max": 391, 1137 | "min": 0, 1138 | "orientation": "horizontal", 1139 | "style": "IPY_MODEL_76a92c955bba41f4862918d88c888376", 1140 | "value": 391 1141 | } 1142 | }, 1143 | "57835188d57b40b3b7ab7b32167d5f20": { 1144 | "model_module": "@jupyter-widgets/base", 1145 | "model_name": "LayoutModel", 1146 | "state": { 1147 | "_model_module": "@jupyter-widgets/base", 1148 | "_model_module_version": "1.2.0", 1149 | "_model_name": "LayoutModel", 1150 | "_view_count": null, 1151 | "_view_module": "@jupyter-widgets/base", 1152 | "_view_module_version": "1.2.0", 1153 | "_view_name": "LayoutView", 1154 | "align_content": null, 1155 | "align_items": null, 1156 | "align_self": null, 1157 | "border": null, 1158 | "bottom": null, 1159 | "display": null, 1160 | "flex": null, 1161 | "flex_flow": null, 1162 | "grid_area": null, 1163 | "grid_auto_columns": null, 1164 | "grid_auto_flow": null, 1165 | "grid_auto_rows": null, 1166 | "grid_column": null, 1167 | "grid_gap": null, 1168 | "grid_row": null, 1169 | "grid_template_areas": null, 1170 | "grid_template_columns": null, 1171 | "grid_template_rows": null, 1172 | "height": null, 1173 | "justify_content": null, 1174 | "justify_items": null, 1175 | "left": null, 1176 | "margin": null, 1177 | "max_height": null, 1178 | "max_width": null, 1179 | "min_height": null, 1180 | "min_width": null, 1181 | "object_fit": null, 1182 | "object_position": null, 1183 | "order": null, 1184 | "overflow": null, 1185 | "overflow_x": null, 1186 | "overflow_y": null, 1187 | "padding": null, 1188 | "right": null, 1189 | "top": null, 1190 | "visibility": null, 1191 | "width": null 1192 | } 1193 | }, 1194 | "76a92c955bba41f4862918d88c888376": { 1195 | "model_module": "@jupyter-widgets/controls", 1196 | "model_name": "ProgressStyleModel", 1197 | "state": { 1198 | "_model_module": "@jupyter-widgets/controls", 1199 | "_model_module_version": "1.5.0", 1200 | "_model_name": "ProgressStyleModel", 1201 | "_view_count": null, 1202 | "_view_module": "@jupyter-widgets/base", 1203 | "_view_module_version": "1.2.0", 1204 | "_view_name": "StyleView", 1205 | "bar_color": null, 1206 | "description_width": "initial" 1207 | } 1208 | }, 1209 | "77cffdfd79db46d098ff3e85694af708": { 1210 | "model_module": "@jupyter-widgets/base", 1211 | "model_name": "LayoutModel", 1212 | "state": { 1213 | "_model_module": "@jupyter-widgets/base", 1214 | "_model_module_version": "1.2.0", 1215 | "_model_name": "LayoutModel", 1216 | "_view_count": null, 1217 | "_view_module": "@jupyter-widgets/base", 1218 | "_view_module_version": "1.2.0", 1219 | "_view_name": "LayoutView", 1220 | "align_content": null, 1221 | "align_items": null, 1222 | "align_self": null, 1223 | "border": null, 1224 | "bottom": null, 1225 | "display": null, 1226 | "flex": null, 1227 | "flex_flow": null, 1228 | "grid_area": null, 1229 | "grid_auto_columns": null, 1230 | "grid_auto_flow": null, 1231 | "grid_auto_rows": null, 1232 | "grid_column": null, 1233 | "grid_gap": null, 1234 | "grid_row": null, 1235 | "grid_template_areas": null, 1236 | "grid_template_columns": null, 1237 | "grid_template_rows": null, 1238 | "height": null, 1239 | "justify_content": null, 1240 | "justify_items": null, 1241 | "left": null, 1242 | "margin": null, 1243 | "max_height": null, 1244 | "max_width": null, 1245 | "min_height": null, 1246 | "min_width": null, 1247 | "object_fit": null, 1248 | "object_position": null, 1249 | "order": null, 1250 | "overflow": null, 1251 | "overflow_x": null, 1252 | "overflow_y": null, 1253 | "padding": null, 1254 | "right": null, 1255 | "top": null, 1256 | "visibility": null, 1257 | "width": null 1258 | } 1259 | }, 1260 | "7ddcff75499442dc8e472c6121eed9c2": { 1261 | "model_module": "@jupyter-widgets/controls", 1262 | "model_name": "DescriptionStyleModel", 1263 | "state": { 1264 | "_model_module": "@jupyter-widgets/controls", 1265 | "_model_module_version": "1.5.0", 1266 | "_model_name": "DescriptionStyleModel", 1267 | "_view_count": null, 1268 | "_view_module": "@jupyter-widgets/base", 1269 | "_view_module_version": "1.2.0", 1270 | "_view_name": "StyleView", 1271 | "description_width": "" 1272 | } 1273 | }, 1274 | "97565fb53ca747baac3a3a795dbb60df": { 1275 | "model_module": "@jupyter-widgets/controls", 1276 | "model_name": "HTMLModel", 1277 | "state": { 1278 | "_dom_classes": [], 1279 | "_model_module": "@jupyter-widgets/controls", 1280 | "_model_module_version": "1.5.0", 1281 | "_model_name": "HTMLModel", 1282 | "_view_count": null, 1283 | "_view_module": "@jupyter-widgets/controls", 1284 | "_view_module_version": "1.5.0", 1285 | "_view_name": "HTMLView", 1286 | "description": "", 1287 | "description_tooltip": null, 1288 | "layout": "IPY_MODEL_9ed81c02af6047dea211c5483ba358bc", 1289 | "placeholder": "​", 1290 | "style": "IPY_MODEL_7ddcff75499442dc8e472c6121eed9c2", 1291 | "value": " 391/391 [00:25<00:00, 15.09it/s]" 1292 | } 1293 | }, 1294 | "9ed81c02af6047dea211c5483ba358bc": { 1295 | "model_module": "@jupyter-widgets/base", 1296 | "model_name": "LayoutModel", 1297 | "state": { 1298 | "_model_module": "@jupyter-widgets/base", 1299 | "_model_module_version": "1.2.0", 1300 | "_model_name": "LayoutModel", 1301 | "_view_count": null, 1302 | "_view_module": "@jupyter-widgets/base", 1303 | "_view_module_version": "1.2.0", 1304 | "_view_name": "LayoutView", 1305 | "align_content": null, 1306 | "align_items": null, 1307 | "align_self": null, 1308 | "border": null, 1309 | "bottom": null, 1310 | "display": null, 1311 | "flex": null, 1312 | "flex_flow": null, 1313 | "grid_area": null, 1314 | "grid_auto_columns": null, 1315 | "grid_auto_flow": null, 1316 | "grid_auto_rows": null, 1317 | "grid_column": null, 1318 | "grid_gap": null, 1319 | "grid_row": null, 1320 | "grid_template_areas": null, 1321 | "grid_template_columns": null, 1322 | "grid_template_rows": null, 1323 | "height": null, 1324 | "justify_content": null, 1325 | "justify_items": null, 1326 | "left": null, 1327 | "margin": null, 1328 | "max_height": null, 1329 | "max_width": null, 1330 | "min_height": null, 1331 | "min_width": null, 1332 | "object_fit": null, 1333 | "object_position": null, 1334 | "order": null, 1335 | "overflow": null, 1336 | "overflow_x": null, 1337 | "overflow_y": null, 1338 | "padding": null, 1339 | "right": null, 1340 | "top": null, 1341 | "visibility": null, 1342 | "width": null 1343 | } 1344 | } 1345 | } 1346 | } 1347 | }, 1348 | "nbformat": 4, 1349 | "nbformat_minor": 4 1350 | } --------------------------------------------------------------------------------