├── ResBaz2021_Presentation.pdf ├── README.md ├── LICENSE ├── .gitignore └── Resbaz_TopicModeling_NMF.ipynb /ResBaz2021_Presentation.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aneesha/Resbaz2021_QualTopicModeling/main/ResBaz2021_Presentation.pdf -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Resbaz2021_QualTopicModeling 2 | Slides and Colab Notebook for Topic Modeling for Qualitative Content Analytsis talk 3 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2021 aneesha 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Byte-compiled / optimized / DLL files 2 | __pycache__/ 3 | *.py[cod] 4 | *$py.class 5 | 6 | # C extensions 7 | *.so 8 | 9 | # Distribution / packaging 10 | .Python 11 | build/ 12 | develop-eggs/ 13 | dist/ 14 | downloads/ 15 | eggs/ 16 | .eggs/ 17 | lib/ 18 | lib64/ 19 | parts/ 20 | sdist/ 21 | var/ 22 | wheels/ 23 | pip-wheel-metadata/ 24 | share/python-wheels/ 25 | *.egg-info/ 26 | .installed.cfg 27 | *.egg 28 | MANIFEST 29 | 30 | # PyInstaller 31 | # Usually these files are written by a python script from a template 32 | # before PyInstaller builds the exe, so as to inject date/other infos into it. 33 | *.manifest 34 | *.spec 35 | 36 | # Installer logs 37 | pip-log.txt 38 | pip-delete-this-directory.txt 39 | 40 | # Unit test / coverage reports 41 | htmlcov/ 42 | .tox/ 43 | .nox/ 44 | .coverage 45 | .coverage.* 46 | .cache 47 | nosetests.xml 48 | coverage.xml 49 | *.cover 50 | *.py,cover 51 | .hypothesis/ 52 | .pytest_cache/ 53 | 54 | # Translations 55 | *.mo 56 | *.pot 57 | 58 | # Django stuff: 59 | *.log 60 | local_settings.py 61 | db.sqlite3 62 | db.sqlite3-journal 63 | 64 | # Flask stuff: 65 | instance/ 66 | .webassets-cache 67 | 68 | # Scrapy stuff: 69 | .scrapy 70 | 71 | # Sphinx documentation 72 | docs/_build/ 73 | 74 | # PyBuilder 75 | target/ 76 | 77 | # Jupyter Notebook 78 | .ipynb_checkpoints 79 | 80 | # IPython 81 | profile_default/ 82 | ipython_config.py 83 | 84 | # pyenv 85 | .python-version 86 | 87 | # pipenv 88 | # According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. 89 | # However, in case of collaboration, if having platform-specific dependencies or dependencies 90 | # having no cross-platform support, pipenv may install dependencies that don't work, or not 91 | # install all needed dependencies. 92 | #Pipfile.lock 93 | 94 | # PEP 582; used by e.g. github.com/David-OConnor/pyflow 95 | __pypackages__/ 96 | 97 | # Celery stuff 98 | celerybeat-schedule 99 | celerybeat.pid 100 | 101 | # SageMath parsed files 102 | *.sage.py 103 | 104 | # Environments 105 | .env 106 | .venv 107 | env/ 108 | venv/ 109 | ENV/ 110 | env.bak/ 111 | venv.bak/ 112 | 113 | # Spyder project settings 114 | .spyderproject 115 | .spyproject 116 | 117 | # Rope project settings 118 | .ropeproject 119 | 120 | # mkdocs documentation 121 | /site 122 | 123 | # mypy 124 | .mypy_cache/ 125 | .dmypy.json 126 | dmypy.json 127 | 128 | # Pyre type checker 129 | .pyre/ 130 | -------------------------------------------------------------------------------- /Resbaz_TopicModeling_NMF.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "nbformat": 4, 3 | "nbformat_minor": 0, 4 | "metadata": { 5 | "colab": { 6 | "name": "Resbaz_TopicModeling_NMF.ipynb", 7 | "provenance": [], 8 | "collapsed_sections": [] 9 | }, 10 | "kernelspec": { 11 | "name": "python3", 12 | "display_name": "Python 3" 13 | }, 14 | "language_info": { 15 | "name": "python" 16 | } 17 | }, 18 | "cells": [ 19 | { 20 | "cell_type": "markdown", 21 | "metadata": { 22 | "id": "VgRPR0W98Tb7" 23 | }, 24 | "source": [ 25 | "# NMF Topic Modeling with Scikit-Learn\n" 26 | ] 27 | }, 28 | { 29 | "cell_type": "markdown", 30 | "metadata": { 31 | "id": "pmeLl4vpvTdZ" 32 | }, 33 | "source": [ 34 | "## Module Installation" 35 | ] 36 | }, 37 | { 38 | "cell_type": "code", 39 | "metadata": { 40 | "id": "NW-uFkW3pO5a", 41 | "colab": { 42 | "base_uri": "https://localhost:8080/" 43 | }, 44 | "outputId": "78fce007-9c67-4114-a3ec-1c374c5452ea" 45 | }, 46 | "source": [ 47 | "# Install Spacy modules, Spacy English language parsers, OCTIS and Tweet-preprocessor\n", 48 | "\n", 49 | "!pip install spacy\n", 50 | "!python -m spacy download en_core_web_sm\n", 51 | "\n", 52 | "!pip install octis\n", 53 | "!pip install delayed\n", 54 | "\n", 55 | "!pip install tweet-preprocessor" 56 | ], 57 | "execution_count": 1, 58 | "outputs": [ 59 | { 60 | "output_type": "stream", 61 | "name": "stdout", 62 | "text": [ 63 | "Requirement already satisfied: spacy in /usr/local/lib/python3.7/dist-packages (2.2.4)\n", 64 | "Requirement already satisfied: setuptools in /usr/local/lib/python3.7/dist-packages (from spacy) (57.4.0)\n", 65 | "Requirement already satisfied: numpy>=1.15.0 in /usr/local/lib/python3.7/dist-packages (from spacy) (1.19.5)\n", 66 | "Requirement already satisfied: blis<0.5.0,>=0.4.0 in /usr/local/lib/python3.7/dist-packages (from spacy) (0.4.1)\n", 67 | "Requirement already satisfied: plac<1.2.0,>=0.9.6 in /usr/local/lib/python3.7/dist-packages (from spacy) (1.1.3)\n", 68 | "Requirement already satisfied: thinc==7.4.0 in /usr/local/lib/python3.7/dist-packages (from spacy) (7.4.0)\n", 69 | "Requirement already satisfied: catalogue<1.1.0,>=0.0.7 in /usr/local/lib/python3.7/dist-packages (from spacy) (1.0.0)\n", 70 | "Requirement already satisfied: srsly<1.1.0,>=1.0.2 in /usr/local/lib/python3.7/dist-packages (from spacy) (1.0.5)\n", 71 | "Requirement already satisfied: murmurhash<1.1.0,>=0.28.0 in /usr/local/lib/python3.7/dist-packages (from spacy) (1.0.6)\n", 72 | "Requirement already satisfied: tqdm<5.0.0,>=4.38.0 in /usr/local/lib/python3.7/dist-packages (from spacy) (4.62.3)\n", 73 | "Requirement already satisfied: requests<3.0.0,>=2.13.0 in /usr/local/lib/python3.7/dist-packages (from spacy) (2.23.0)\n", 74 | "Requirement already satisfied: wasabi<1.1.0,>=0.4.0 in /usr/local/lib/python3.7/dist-packages (from spacy) (0.8.2)\n", 75 | "Requirement already satisfied: preshed<3.1.0,>=3.0.2 in /usr/local/lib/python3.7/dist-packages (from spacy) (3.0.6)\n", 76 | "Requirement already satisfied: cymem<2.1.0,>=2.0.2 in /usr/local/lib/python3.7/dist-packages (from spacy) (2.0.6)\n", 77 | "Requirement already satisfied: importlib-metadata>=0.20 in /usr/local/lib/python3.7/dist-packages (from catalogue<1.1.0,>=0.0.7->spacy) (4.8.2)\n", 78 | "Requirement already satisfied: typing-extensions>=3.6.4 in /usr/local/lib/python3.7/dist-packages (from importlib-metadata>=0.20->catalogue<1.1.0,>=0.0.7->spacy) (3.10.0.2)\n", 79 | "Requirement already satisfied: zipp>=0.5 in /usr/local/lib/python3.7/dist-packages (from importlib-metadata>=0.20->catalogue<1.1.0,>=0.0.7->spacy) (3.6.0)\n", 80 | "Requirement already satisfied: certifi>=2017.4.17 in /usr/local/lib/python3.7/dist-packages (from requests<3.0.0,>=2.13.0->spacy) (2021.10.8)\n", 81 | "Requirement already satisfied: chardet<4,>=3.0.2 in /usr/local/lib/python3.7/dist-packages (from requests<3.0.0,>=2.13.0->spacy) (3.0.4)\n", 82 | "Requirement already satisfied: idna<3,>=2.5 in /usr/local/lib/python3.7/dist-packages (from requests<3.0.0,>=2.13.0->spacy) (2.10)\n", 83 | "Requirement already satisfied: urllib3!=1.25.0,!=1.25.1,<1.26,>=1.21.1 in /usr/local/lib/python3.7/dist-packages (from requests<3.0.0,>=2.13.0->spacy) (1.24.3)\n", 84 | "Collecting en_core_web_sm==2.2.5\n", 85 | " Downloading https://github.com/explosion/spacy-models/releases/download/en_core_web_sm-2.2.5/en_core_web_sm-2.2.5.tar.gz (12.0 MB)\n", 86 | "\u001b[K |████████████████████████████████| 12.0 MB 14.4 MB/s \n", 87 | "\u001b[?25hRequirement already satisfied: spacy>=2.2.2 in /usr/local/lib/python3.7/dist-packages (from en_core_web_sm==2.2.5) (2.2.4)\n", 88 | "Requirement already satisfied: thinc==7.4.0 in /usr/local/lib/python3.7/dist-packages (from spacy>=2.2.2->en_core_web_sm==2.2.5) (7.4.0)\n", 89 | "Requirement already satisfied: wasabi<1.1.0,>=0.4.0 in /usr/local/lib/python3.7/dist-packages (from spacy>=2.2.2->en_core_web_sm==2.2.5) (0.8.2)\n", 90 | "Requirement already satisfied: numpy>=1.15.0 in /usr/local/lib/python3.7/dist-packages (from spacy>=2.2.2->en_core_web_sm==2.2.5) (1.19.5)\n", 91 | "Requirement already satisfied: plac<1.2.0,>=0.9.6 in /usr/local/lib/python3.7/dist-packages (from spacy>=2.2.2->en_core_web_sm==2.2.5) (1.1.3)\n", 92 | "Requirement already satisfied: catalogue<1.1.0,>=0.0.7 in /usr/local/lib/python3.7/dist-packages (from spacy>=2.2.2->en_core_web_sm==2.2.5) (1.0.0)\n", 93 | "Requirement already satisfied: requests<3.0.0,>=2.13.0 in /usr/local/lib/python3.7/dist-packages (from spacy>=2.2.2->en_core_web_sm==2.2.5) (2.23.0)\n", 94 | "Requirement already satisfied: murmurhash<1.1.0,>=0.28.0 in /usr/local/lib/python3.7/dist-packages (from spacy>=2.2.2->en_core_web_sm==2.2.5) (1.0.6)\n", 95 | "Requirement already satisfied: preshed<3.1.0,>=3.0.2 in /usr/local/lib/python3.7/dist-packages (from spacy>=2.2.2->en_core_web_sm==2.2.5) (3.0.6)\n", 96 | "Requirement already satisfied: blis<0.5.0,>=0.4.0 in /usr/local/lib/python3.7/dist-packages (from spacy>=2.2.2->en_core_web_sm==2.2.5) (0.4.1)\n", 97 | "Requirement already satisfied: cymem<2.1.0,>=2.0.2 in /usr/local/lib/python3.7/dist-packages (from spacy>=2.2.2->en_core_web_sm==2.2.5) (2.0.6)\n", 98 | "Requirement already satisfied: setuptools in /usr/local/lib/python3.7/dist-packages (from spacy>=2.2.2->en_core_web_sm==2.2.5) (57.4.0)\n", 99 | "Requirement already satisfied: srsly<1.1.0,>=1.0.2 in /usr/local/lib/python3.7/dist-packages (from spacy>=2.2.2->en_core_web_sm==2.2.5) (1.0.5)\n", 100 | "Requirement already satisfied: tqdm<5.0.0,>=4.38.0 in /usr/local/lib/python3.7/dist-packages (from spacy>=2.2.2->en_core_web_sm==2.2.5) (4.62.3)\n", 101 | "Requirement already satisfied: importlib-metadata>=0.20 in /usr/local/lib/python3.7/dist-packages (from catalogue<1.1.0,>=0.0.7->spacy>=2.2.2->en_core_web_sm==2.2.5) (4.8.2)\n", 102 | "Requirement already satisfied: zipp>=0.5 in /usr/local/lib/python3.7/dist-packages (from importlib-metadata>=0.20->catalogue<1.1.0,>=0.0.7->spacy>=2.2.2->en_core_web_sm==2.2.5) (3.6.0)\n", 103 | "Requirement already satisfied: typing-extensions>=3.6.4 in /usr/local/lib/python3.7/dist-packages (from importlib-metadata>=0.20->catalogue<1.1.0,>=0.0.7->spacy>=2.2.2->en_core_web_sm==2.2.5) (3.10.0.2)\n", 104 | "Requirement already satisfied: idna<3,>=2.5 in /usr/local/lib/python3.7/dist-packages (from requests<3.0.0,>=2.13.0->spacy>=2.2.2->en_core_web_sm==2.2.5) (2.10)\n", 105 | "Requirement already satisfied: chardet<4,>=3.0.2 in /usr/local/lib/python3.7/dist-packages (from requests<3.0.0,>=2.13.0->spacy>=2.2.2->en_core_web_sm==2.2.5) (3.0.4)\n", 106 | "Requirement already satisfied: certifi>=2017.4.17 in /usr/local/lib/python3.7/dist-packages (from requests<3.0.0,>=2.13.0->spacy>=2.2.2->en_core_web_sm==2.2.5) (2021.10.8)\n", 107 | "Requirement already satisfied: urllib3!=1.25.0,!=1.25.1,<1.26,>=1.21.1 in /usr/local/lib/python3.7/dist-packages (from requests<3.0.0,>=2.13.0->spacy>=2.2.2->en_core_web_sm==2.2.5) (1.24.3)\n", 108 | "\u001b[38;5;2m✔ Download and installation successful\u001b[0m\n", 109 | "You can now load the model via spacy.load('en_core_web_sm')\n", 110 | "Collecting octis\n", 111 | " Downloading octis-1.10.0-py2.py3-none-any.whl (5.7 MB)\n", 112 | "\u001b[K |████████████████████████████████| 5.7 MB 27.2 MB/s \n", 113 | "\u001b[?25hCollecting scikit-learn==0.24.2\n", 114 | " Downloading scikit_learn-0.24.2-cp37-cp37m-manylinux2010_x86_64.whl (22.3 MB)\n", 115 | "\u001b[K |████████████████████████████████| 22.3 MB 86.5 MB/s \n", 116 | "\u001b[?25hRequirement already satisfied: flask in /usr/local/lib/python3.7/dist-packages (from octis) (1.1.4)\n", 117 | "Requirement already satisfied: spacy in /usr/local/lib/python3.7/dist-packages (from octis) (2.2.4)\n", 118 | "Requirement already satisfied: numpy in /usr/local/lib/python3.7/dist-packages (from octis) (1.19.5)\n", 119 | "Collecting libsvm\n", 120 | " Downloading libsvm-3.23.0.4.tar.gz (170 kB)\n", 121 | "\u001b[K |████████████████████████████████| 170 kB 63.9 MB/s \n", 122 | "\u001b[?25hRequirement already satisfied: requests in /usr/local/lib/python3.7/dist-packages (from octis) (2.23.0)\n", 123 | "Collecting sentence-transformers\n", 124 | " Downloading sentence-transformers-2.1.0.tar.gz (78 kB)\n", 125 | "\u001b[K |████████████████████████████████| 78 kB 8.5 MB/s \n", 126 | "\u001b[?25hRequirement already satisfied: torch in /usr/local/lib/python3.7/dist-packages (from octis) (1.10.0+cu111)\n", 127 | "Requirement already satisfied: nltk in /usr/local/lib/python3.7/dist-packages (from octis) (3.2.5)\n", 128 | "Requirement already satisfied: pandas in /usr/local/lib/python3.7/dist-packages (from octis) (1.1.5)\n", 129 | "Collecting scikit-optimize>=0.8.1\n", 130 | " Downloading scikit_optimize-0.9.0-py2.py3-none-any.whl (100 kB)\n", 131 | "\u001b[K |████████████████████████████████| 100 kB 12.0 MB/s \n", 132 | "\u001b[?25hCollecting tomotopy\n", 133 | " Downloading tomotopy-0.12.2-cp37-cp37m-manylinux_2_12_x86_64.manylinux2010_x86_64.whl (16.3 MB)\n", 134 | "\u001b[K |████████████████████████████████| 16.3 MB 815 kB/s \n", 135 | "\u001b[?25hCollecting gensim>=4.0.0\n", 136 | " Downloading gensim-4.1.2-cp37-cp37m-manylinux_2_12_x86_64.manylinux2010_x86_64.whl (24.1 MB)\n", 137 | "\u001b[K |████████████████████████████████| 24.1 MB 1.9 MB/s \n", 138 | "\u001b[?25hRequirement already satisfied: matplotlib in /usr/local/lib/python3.7/dist-packages (from octis) (3.2.2)\n", 139 | "Requirement already satisfied: joblib>=0.11 in /usr/local/lib/python3.7/dist-packages (from scikit-learn==0.24.2->octis) (1.1.0)\n", 140 | "Requirement already satisfied: threadpoolctl>=2.0.0 in /usr/local/lib/python3.7/dist-packages (from scikit-learn==0.24.2->octis) (3.0.0)\n", 141 | "Requirement already satisfied: scipy>=0.19.1 in /usr/local/lib/python3.7/dist-packages (from scikit-learn==0.24.2->octis) (1.4.1)\n", 142 | "Requirement already satisfied: smart-open>=1.8.1 in /usr/local/lib/python3.7/dist-packages (from gensim>=4.0.0->octis) (5.2.1)\n", 143 | "Collecting pyaml>=16.9\n", 144 | " Downloading pyaml-21.10.1-py2.py3-none-any.whl (24 kB)\n", 145 | "Requirement already satisfied: PyYAML in /usr/local/lib/python3.7/dist-packages (from pyaml>=16.9->scikit-optimize>=0.8.1->octis) (3.13)\n", 146 | "Requirement already satisfied: Jinja2<3.0,>=2.10.1 in /usr/local/lib/python3.7/dist-packages (from flask->octis) (2.11.3)\n", 147 | "Requirement already satisfied: Werkzeug<2.0,>=0.15 in /usr/local/lib/python3.7/dist-packages (from flask->octis) (1.0.1)\n", 148 | "Requirement already satisfied: click<8.0,>=5.1 in /usr/local/lib/python3.7/dist-packages (from flask->octis) (7.1.2)\n", 149 | "Requirement already satisfied: itsdangerous<2.0,>=0.24 in /usr/local/lib/python3.7/dist-packages (from flask->octis) (1.1.0)\n", 150 | "Requirement already satisfied: MarkupSafe>=0.23 in /usr/local/lib/python3.7/dist-packages (from Jinja2<3.0,>=2.10.1->flask->octis) (2.0.1)\n", 151 | "Requirement already satisfied: pyparsing!=2.0.4,!=2.1.2,!=2.1.6,>=2.0.1 in /usr/local/lib/python3.7/dist-packages (from matplotlib->octis) (3.0.6)\n", 152 | "Requirement already satisfied: cycler>=0.10 in /usr/local/lib/python3.7/dist-packages (from matplotlib->octis) (0.11.0)\n", 153 | "Requirement already satisfied: python-dateutil>=2.1 in /usr/local/lib/python3.7/dist-packages (from matplotlib->octis) (2.8.2)\n", 154 | "Requirement already satisfied: kiwisolver>=1.0.1 in /usr/local/lib/python3.7/dist-packages (from matplotlib->octis) (1.3.2)\n", 155 | "Requirement already satisfied: six>=1.5 in /usr/local/lib/python3.7/dist-packages (from python-dateutil>=2.1->matplotlib->octis) (1.15.0)\n", 156 | "Requirement already satisfied: pytz>=2017.2 in /usr/local/lib/python3.7/dist-packages (from pandas->octis) (2018.9)\n", 157 | "Requirement already satisfied: certifi>=2017.4.17 in /usr/local/lib/python3.7/dist-packages (from requests->octis) (2021.10.8)\n", 158 | "Requirement already satisfied: idna<3,>=2.5 in /usr/local/lib/python3.7/dist-packages (from requests->octis) (2.10)\n", 159 | "Requirement already satisfied: chardet<4,>=3.0.2 in /usr/local/lib/python3.7/dist-packages (from requests->octis) (3.0.4)\n", 160 | "Requirement already satisfied: urllib3!=1.25.0,!=1.25.1,<1.26,>=1.21.1 in /usr/local/lib/python3.7/dist-packages (from requests->octis) (1.24.3)\n", 161 | "Collecting transformers<5.0.0,>=4.6.0\n", 162 | " Downloading transformers-4.12.5-py3-none-any.whl (3.1 MB)\n", 163 | "\u001b[K |████████████████████████████████| 3.1 MB 36.4 MB/s \n", 164 | "\u001b[?25hCollecting tokenizers>=0.10.3\n", 165 | " Downloading tokenizers-0.10.3-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl (3.3 MB)\n", 166 | "\u001b[K |████████████████████████████████| 3.3 MB 40.5 MB/s \n", 167 | "\u001b[?25hRequirement already satisfied: tqdm in /usr/local/lib/python3.7/dist-packages (from sentence-transformers->octis) (4.62.3)\n", 168 | "Requirement already satisfied: torchvision in /usr/local/lib/python3.7/dist-packages (from sentence-transformers->octis) (0.11.1+cu111)\n", 169 | "Collecting sentencepiece\n", 170 | " Downloading sentencepiece-0.1.96-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (1.2 MB)\n", 171 | "\u001b[K |████████████████████████████████| 1.2 MB 34.6 MB/s \n", 172 | "\u001b[?25hCollecting huggingface-hub\n", 173 | " Downloading huggingface_hub-0.1.2-py3-none-any.whl (59 kB)\n", 174 | "\u001b[K |████████████████████████████████| 59 kB 7.7 MB/s \n", 175 | "\u001b[?25hRequirement already satisfied: typing-extensions in /usr/local/lib/python3.7/dist-packages (from torch->octis) (3.10.0.2)\n", 176 | "Collecting PyYAML\n", 177 | " Downloading PyYAML-6.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl (596 kB)\n", 178 | "\u001b[K |████████████████████████████████| 596 kB 44.0 MB/s \n", 179 | "\u001b[?25hRequirement already satisfied: importlib-metadata in /usr/local/lib/python3.7/dist-packages (from transformers<5.0.0,>=4.6.0->sentence-transformers->octis) (4.8.2)\n", 180 | "Collecting sacremoses\n", 181 | " Downloading sacremoses-0.0.46-py3-none-any.whl (895 kB)\n", 182 | "\u001b[K |████████████████████████████████| 895 kB 46.0 MB/s \n", 183 | "\u001b[?25hRequirement already satisfied: filelock in /usr/local/lib/python3.7/dist-packages (from transformers<5.0.0,>=4.6.0->sentence-transformers->octis) (3.4.0)\n", 184 | "Requirement already satisfied: regex!=2019.12.17 in /usr/local/lib/python3.7/dist-packages (from transformers<5.0.0,>=4.6.0->sentence-transformers->octis) (2019.12.20)\n", 185 | "Requirement already satisfied: packaging>=20.0 in /usr/local/lib/python3.7/dist-packages (from transformers<5.0.0,>=4.6.0->sentence-transformers->octis) (21.3)\n", 186 | "Requirement already satisfied: zipp>=0.5 in /usr/local/lib/python3.7/dist-packages (from importlib-metadata->transformers<5.0.0,>=4.6.0->sentence-transformers->octis) (3.6.0)\n", 187 | "Requirement already satisfied: thinc==7.4.0 in /usr/local/lib/python3.7/dist-packages (from spacy->octis) (7.4.0)\n", 188 | "Requirement already satisfied: wasabi<1.1.0,>=0.4.0 in /usr/local/lib/python3.7/dist-packages (from spacy->octis) (0.8.2)\n", 189 | "Requirement already satisfied: catalogue<1.1.0,>=0.0.7 in /usr/local/lib/python3.7/dist-packages (from spacy->octis) (1.0.0)\n", 190 | "Requirement already satisfied: blis<0.5.0,>=0.4.0 in /usr/local/lib/python3.7/dist-packages (from spacy->octis) (0.4.1)\n", 191 | "Requirement already satisfied: srsly<1.1.0,>=1.0.2 in /usr/local/lib/python3.7/dist-packages (from spacy->octis) (1.0.5)\n", 192 | "Requirement already satisfied: cymem<2.1.0,>=2.0.2 in /usr/local/lib/python3.7/dist-packages (from spacy->octis) (2.0.6)\n", 193 | "Requirement already satisfied: setuptools in /usr/local/lib/python3.7/dist-packages (from spacy->octis) (57.4.0)\n", 194 | "Requirement already satisfied: plac<1.2.0,>=0.9.6 in /usr/local/lib/python3.7/dist-packages (from spacy->octis) (1.1.3)\n", 195 | "Requirement already satisfied: murmurhash<1.1.0,>=0.28.0 in /usr/local/lib/python3.7/dist-packages (from spacy->octis) (1.0.6)\n", 196 | "Requirement already satisfied: preshed<3.1.0,>=3.0.2 in /usr/local/lib/python3.7/dist-packages (from spacy->octis) (3.0.6)\n", 197 | "Requirement already satisfied: pillow!=8.3.0,>=5.3.0 in /usr/local/lib/python3.7/dist-packages (from torchvision->sentence-transformers->octis) (7.1.2)\n", 198 | "Building wheels for collected packages: libsvm, sentence-transformers\n", 199 | " Building wheel for libsvm (setup.py) ... \u001b[?25l\u001b[?25hdone\n", 200 | " Created wheel for libsvm: filename=libsvm-3.23.0.4-cp37-cp37m-linux_x86_64.whl size=233365 sha256=fbe9d8bb22d615623191a56be2989725f6a127f39b8da11901a3c6a1e6671a35\n", 201 | " Stored in directory: /root/.cache/pip/wheels/cd/e8/1e/bf95cf256e4d3ffc94289ab508c49d48e34c98220af63e3513\n", 202 | " Building wheel for sentence-transformers (setup.py) ... \u001b[?25l\u001b[?25hdone\n", 203 | " Created wheel for sentence-transformers: filename=sentence_transformers-2.1.0-py3-none-any.whl size=121000 sha256=869ee208953f7b65b5cdf58a649245e2fd3cad1e226305973b0b7bdc365ead6e\n", 204 | " Stored in directory: /root/.cache/pip/wheels/90/f0/bb/ed1add84da70092ea526466eadc2bfb197c4bcb8d4fa5f7bad\n", 205 | "Successfully built libsvm sentence-transformers\n", 206 | "Installing collected packages: PyYAML, tokenizers, sacremoses, huggingface-hub, transformers, sentencepiece, scikit-learn, pyaml, tomotopy, sentence-transformers, scikit-optimize, libsvm, gensim, octis\n", 207 | " Attempting uninstall: PyYAML\n", 208 | " Found existing installation: PyYAML 3.13\n", 209 | " Uninstalling PyYAML-3.13:\n", 210 | " Successfully uninstalled PyYAML-3.13\n", 211 | " Attempting uninstall: scikit-learn\n", 212 | " Found existing installation: scikit-learn 1.0.1\n", 213 | " Uninstalling scikit-learn-1.0.1:\n", 214 | " Successfully uninstalled scikit-learn-1.0.1\n", 215 | " Attempting uninstall: gensim\n", 216 | " Found existing installation: gensim 3.6.0\n", 217 | " Uninstalling gensim-3.6.0:\n", 218 | " Successfully uninstalled gensim-3.6.0\n", 219 | "Successfully installed PyYAML-6.0 gensim-4.1.2 huggingface-hub-0.1.2 libsvm-3.23.0.4 octis-1.10.0 pyaml-21.10.1 sacremoses-0.0.46 scikit-learn-0.24.2 scikit-optimize-0.9.0 sentence-transformers-2.1.0 sentencepiece-0.1.96 tokenizers-0.10.3 tomotopy-0.12.2 transformers-4.12.5\n", 220 | "Collecting delayed\n", 221 | " Downloading delayed-0.11.0b1-py2.py3-none-any.whl (19 kB)\n", 222 | "Collecting redis\n", 223 | " Downloading redis-4.0.2-py3-none-any.whl (119 kB)\n", 224 | "\u001b[K |████████████████████████████████| 119 kB 58.8 MB/s \n", 225 | "\u001b[?25hCollecting hiredis\n", 226 | " Downloading hiredis-2.0.0-cp37-cp37m-manylinux2010_x86_64.whl (85 kB)\n", 227 | "\u001b[K |████████████████████████████████| 85 kB 4.2 MB/s \n", 228 | "\u001b[?25hCollecting deprecated\n", 229 | " Downloading Deprecated-1.2.13-py2.py3-none-any.whl (9.6 kB)\n", 230 | "Requirement already satisfied: wrapt<2,>=1.10 in /usr/local/lib/python3.7/dist-packages (from deprecated->redis->delayed) (1.13.3)\n", 231 | "Installing collected packages: deprecated, redis, hiredis, delayed\n", 232 | "Successfully installed delayed-0.11.0b1 deprecated-1.2.13 hiredis-2.0.0 redis-4.0.2\n", 233 | "Collecting tweet-preprocessor\n", 234 | " Downloading tweet_preprocessor-0.6.0-py3-none-any.whl (27 kB)\n", 235 | "Installing collected packages: tweet-preprocessor\n", 236 | "Successfully installed tweet-preprocessor-0.6.0\n" 237 | ] 238 | } 239 | ] 240 | }, 241 | { 242 | "cell_type": "markdown", 243 | "metadata": { 244 | "id": "sCASegib860J" 245 | }, 246 | "source": [ 247 | "## Module Imports" 248 | ] 249 | }, 250 | { 251 | "cell_type": "code", 252 | "metadata": { 253 | "id": "6199MN-J89DF" 254 | }, 255 | "source": [ 256 | "import numpy as np\n", 257 | "from sklearn.decomposition import NMF\n", 258 | "from sklearn.feature_extraction.text import TfidfVectorizer\n", 259 | "\n", 260 | "import matplotlib.pyplot as plt\n", 261 | "\n", 262 | "#OCTIS imports\n", 263 | "from octis.evaluation_metrics.diversity_metrics import TopicDiversity\n", 264 | "from octis.evaluation_metrics.coherence_metrics import Coherence\n", 265 | "\n", 266 | "#Text Processing imports and Custom Spacy Tokenizer\n", 267 | "import spacy\n", 268 | "import en_core_web_sm\n", 269 | "\n", 270 | "from spacy.lang.en.stop_words import STOP_WORDS\n", 271 | "\n", 272 | "# Import Tweet processing library\n", 273 | "import preprocessor as tweet_processor" 274 | ], 275 | "execution_count": 2, 276 | "outputs": [] 277 | }, 278 | { 279 | "cell_type": "markdown", 280 | "metadata": { 281 | "id": "0Ns3NzBqLTSq" 282 | }, 283 | "source": [ 284 | "## Text Preprocessing with Spacy and Tweet-preprocessor" 285 | ] 286 | }, 287 | { 288 | "cell_type": "code", 289 | "metadata": { 290 | "id": "t4yO72pNuhCB", 291 | "colab": { 292 | "base_uri": "https://localhost:8080/" 293 | }, 294 | "outputId": "1f1d9b9f-1ed7-406a-90c7-1abf7dcef5fb" 295 | }, 296 | "source": [ 297 | "# Get the list of stop words from spacy\n", 298 | "print(len(STOP_WORDS))\n", 299 | "print(STOP_WORDS)\n" 300 | ], 301 | "execution_count": 3, 302 | "outputs": [ 303 | { 304 | "output_type": "stream", 305 | "name": "stdout", 306 | "text": [ 307 | "326\n", 308 | "{'full', 'always', 'why', \"'s\", 'already', 'wherein', 'out', 'more', 'than', 'perhaps', 'else', 'once', 'one', 'himself', 'although', 'front', 'beside', 'some', 'somehow', 'almost', 'if', 'too', 'still', 'whereby', 'will', 'together', 'because', 'should', 'formerly', 'really', 'within', 'themselves', 'therein', 'for', 'has', 'seeming', 'across', 'an', 'during', 'put', 'whether', 'further', \"'d\", 'ca', 'nor', 'its', 'herein', 'be', 'at', 'therefore', 'all', 'every', 'so', 'hundred', 'not', 'those', 'how', 'besides', 'seems', 'due', 'yet', 'or', 'before', 'can', 'say', 'three', 'their', 'anyone', 'please', 'namely', 'over', 'latterly', 'make', 'using', 'everyone', 'by', 'it', 'again', 'towards', 'none', 'into', 'in', 'latter', 'n’t', 'often', 'thereafter', 'most', 'keep', 'ourselves', 'move', 'his', 'becoming', 'own', 'otherwise', 'four', 'among', 'very', 'well', '’m', 'where', \"n't\", 'must', 'he', 'side', 'would', 'enough', 'seemed', 'hereupon', 'third', 'does', 'have', 'behind', 'upon', \"'m\", 'yours', 'serious', 'which', 'name', 'whatever', 'twenty', 'am', 'wherever', 'sometime', 'meanwhile', 'along', 'next', 'as', 'under', 'any', 'forty', '’s', 'ten', 'both', 'call', 'hence', 'done', 'moreover', 'toward', 'becomes', 'being', 'against', 'whoever', 'yourselves', 'unless', 'last', 'twelve', 'were', 'but', 'go', 'show', 'several', 'amongst', 'other', 'do', 'whereas', 'anyhow', 'something', 'much', 'my', 'afterwards', 'without', 'top', 'also', 'elsewhere', 'we', 'about', 'whom', 'sometimes', 'except', 'what', 'take', 'whereafter', 'former', '’ll', '’re', 'this', 'nobody', 'a', 'your', 'others', '’ve', 'empty', 'rather', 'whither', 'above', 'even', 'herself', 're', 'thereby', 'her', 'did', 'there', 'many', 'indeed', 'down', 'i', 'throughout', 'below', 'onto', 'between', 'such', 'they', 'beforehand', 'alone', 'thereupon', 'whereupon', 'became', 'mostly', 'everywhere', 'ever', 'that', 'myself', 'you', 'someone', 'either', 'nothing', 'least', 'anything', 'on', 'become', 'might', 'seem', 'us', 'see', 'when', 'few', 'sixty', 'was', '’d', 'same', 'been', \"'ll\", 'just', 'whenever', 'could', 'and', 'thru', 'until', 'doing', 'had', 'these', 'since', 'me', 'to', 'though', 'the', 'used', 'from', '‘ve', 'our', 'back', 'him', 'amount', '‘m', 'five', 'per', 'six', 'hers', 'beyond', 'less', 'hereby', 'whole', \"'ve\", 'bottom', 'via', 'here', 'while', 'anywhere', 'of', 'another', 'part', 'nowhere', 'first', '‘s', 'whence', 'is', 'are', \"'re\", 'various', 'after', 'whose', 'itself', 'get', 'somewhere', 'fifteen', 'now', '‘ll', 'nevertheless', 'around', 'thence', 'only', 'cannot', 'quite', 'no', 'eight', 'nine', 'off', 'each', 'never', 'noone', 'she', 'neither', 'them', 'hereafter', 'mine', 'yourself', 'ours', 'made', 'thus', '‘re', 'up', 'through', 'with', 'regarding', 'two', 'give', 'however', 'then', 'may', 'everything', 'fifty', '‘d', 'eleven', 'anyway', 'n‘t', 'who'}\n" 309 | ] 310 | } 311 | ] 312 | }, 313 | { 314 | "cell_type": "code", 315 | "metadata": { 316 | "colab": { 317 | "base_uri": "https://localhost:8080/" 318 | }, 319 | "id": "8cS8eV-N_DxC", 320 | "outputId": "5b9e99c6-f506-4d17-c056-d834e437b0f8" 321 | }, 322 | "source": [ 323 | "spacy_nlp = spacy.load('en')\n", 324 | "\n", 325 | "# Add custom stopwords to Spacy\n", 326 | "spacy_nlp.Defaults.stop_words |= {\"makemeastopword\"}\n", 327 | "\n", 328 | "# Create a method called spacy_custom_tokenizer that performs custom tokenization using Spacy\n", 329 | "# Use tweet_processor to remove @replies, hashtags and links from Tweets\n", 330 | "# Remove stop words, punctuation and numbers using Spacy\n", 331 | "\n", 332 | "def spacy_custom_tokenizer(document):\n", 333 | "\n", 334 | " #Clean Tweet using tweet_processor\n", 335 | " document = tweet_processor.clean(document)\n", 336 | "\n", 337 | " # Creating a spacy document\n", 338 | " spacy_doc = spacy_nlp(document)\n", 339 | "\n", 340 | " # Remove stop words, punctuation and numbers\n", 341 | " # Return he lemma of the word as lowercase and remove extra spaces\n", 342 | " tokens = [word.lemma_.lower().strip() for word in spacy_doc if (not word.is_stop and not word.is_punct and not word.like_num)]\n", 343 | "\n", 344 | " return tokens\n", 345 | "\n", 346 | "#Test the custom tokenizer\n", 347 | "spacy_custom_tokenizer(\"I was running so I ran to run to somewhere now in Australia. ... --- makemeastopword @aneesha\")" 348 | ], 349 | "execution_count": 15, 350 | "outputs": [ 351 | { 352 | "output_type": "execute_result", 353 | "data": { 354 | "text/plain": [ 355 | "['run', 'run', 'run', 'australia']" 356 | ] 357 | }, 358 | "metadata": {}, 359 | "execution_count": 15 360 | } 361 | ] 362 | }, 363 | { 364 | "cell_type": "markdown", 365 | "metadata": { 366 | "id": "GYUcwSEdxA95" 367 | }, 368 | "source": [ 369 | "## Load Tweets for \"US Airways\" from the https://www.kaggle.com/crowdflower/twitter-airline-sentiment dataset\n", 370 | "\n" 371 | ] 372 | }, 373 | { 374 | "cell_type": "code", 375 | "metadata": { 376 | "colab": { 377 | "resources": { 378 | "http://localhost:8080/nbextensions/google.colab/files.js": { 379 | "data": "Ly8gQ29weXJpZ2h0IDIwMTcgR29vZ2xlIExMQwovLwovLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgovLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLy8KLy8gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLy8KLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQovLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAovLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAovLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KCi8qKgogKiBAZmlsZW92ZXJ2aWV3IEhlbHBlcnMgZm9yIGdvb2dsZS5jb2xhYiBQeXRob24gbW9kdWxlLgogKi8KKGZ1bmN0aW9uKHNjb3BlKSB7CmZ1bmN0aW9uIHNwYW4odGV4dCwgc3R5bGVBdHRyaWJ1dGVzID0ge30pIHsKICBjb25zdCBlbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpOwogIGVsZW1lbnQudGV4dENvbnRlbnQgPSB0ZXh0OwogIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKHN0eWxlQXR0cmlidXRlcykpIHsKICAgIGVsZW1lbnQuc3R5bGVba2V5XSA9IHN0eWxlQXR0cmlidXRlc1trZXldOwogIH0KICByZXR1cm4gZWxlbWVudDsKfQoKLy8gTWF4IG51bWJlciBvZiBieXRlcyB3aGljaCB3aWxsIGJlIHVwbG9hZGVkIGF0IGEgdGltZS4KY29uc3QgTUFYX1BBWUxPQURfU0laRSA9IDEwMCAqIDEwMjQ7CgpmdW5jdGlvbiBfdXBsb2FkRmlsZXMoaW5wdXRJZCwgb3V0cHV0SWQpIHsKICBjb25zdCBzdGVwcyA9IHVwbG9hZEZpbGVzU3RlcChpbnB1dElkLCBvdXRwdXRJZCk7CiAgY29uc3Qgb3V0cHV0RWxlbWVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKG91dHB1dElkKTsKICAvLyBDYWNoZSBzdGVwcyBvbiB0aGUgb3V0cHV0RWxlbWVudCB0byBtYWtlIGl0IGF2YWlsYWJsZSBmb3IgdGhlIG5leHQgY2FsbAogIC8vIHRvIHVwbG9hZEZpbGVzQ29udGludWUgZnJvbSBQeXRob24uCiAgb3V0cHV0RWxlbWVudC5zdGVwcyA9IHN0ZXBzOwoKICByZXR1cm4gX3VwbG9hZEZpbGVzQ29udGludWUob3V0cHV0SWQpOwp9CgovLyBUaGlzIGlzIHJvdWdobHkgYW4gYXN5bmMgZ2VuZXJhdG9yIChub3Qgc3VwcG9ydGVkIGluIHRoZSBicm93c2VyIHlldCksCi8vIHdoZXJlIHRoZXJlIGFyZSBtdWx0aXBsZSBhc3luY2hyb25vdXMgc3RlcHMgYW5kIHRoZSBQeXRob24gc2lkZSBpcyBnb2luZwovLyB0byBwb2xsIGZvciBjb21wbGV0aW9uIG9mIGVhY2ggc3RlcC4KLy8gVGhpcyB1c2VzIGEgUHJvbWlzZSB0byBibG9jayB0aGUgcHl0aG9uIHNpZGUgb24gY29tcGxldGlvbiBvZiBlYWNoIHN0ZXAsCi8vIHRoZW4gcGFzc2VzIHRoZSByZXN1bHQgb2YgdGhlIHByZXZpb3VzIHN0ZXAgYXMgdGhlIGlucHV0IHRvIHRoZSBuZXh0IHN0ZXAuCmZ1bmN0aW9uIF91cGxvYWRGaWxlc0NvbnRpbnVlKG91dHB1dElkKSB7CiAgY29uc3Qgb3V0cHV0RWxlbWVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKG91dHB1dElkKTsKICBjb25zdCBzdGVwcyA9IG91dHB1dEVsZW1lbnQuc3RlcHM7CgogIGNvbnN0IG5leHQgPSBzdGVwcy5uZXh0KG91dHB1dEVsZW1lbnQubGFzdFByb21pc2VWYWx1ZSk7CiAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShuZXh0LnZhbHVlLnByb21pc2UpLnRoZW4oKHZhbHVlKSA9PiB7CiAgICAvLyBDYWNoZSB0aGUgbGFzdCBwcm9taXNlIHZhbHVlIHRvIG1ha2UgaXQgYXZhaWxhYmxlIHRvIHRoZSBuZXh0CiAgICAvLyBzdGVwIG9mIHRoZSBnZW5lcmF0b3IuCiAgICBvdXRwdXRFbGVtZW50Lmxhc3RQcm9taXNlVmFsdWUgPSB2YWx1ZTsKICAgIHJldHVybiBuZXh0LnZhbHVlLnJlc3BvbnNlOwogIH0pOwp9CgovKioKICogR2VuZXJhdG9yIGZ1bmN0aW9uIHdoaWNoIGlzIGNhbGxlZCBiZXR3ZWVuIGVhY2ggYXN5bmMgc3RlcCBvZiB0aGUgdXBsb2FkCiAqIHByb2Nlc3MuCiAqIEBwYXJhbSB7c3RyaW5nfSBpbnB1dElkIEVsZW1lbnQgSUQgb2YgdGhlIGlucHV0IGZpbGUgcGlja2VyIGVsZW1lbnQuCiAqIEBwYXJhbSB7c3RyaW5nfSBvdXRwdXRJZCBFbGVtZW50IElEIG9mIHRoZSBvdXRwdXQgZGlzcGxheS4KICogQHJldHVybiB7IUl0ZXJhYmxlPCFPYmplY3Q+fSBJdGVyYWJsZSBvZiBuZXh0IHN0ZXBzLgogKi8KZnVuY3Rpb24qIHVwbG9hZEZpbGVzU3RlcChpbnB1dElkLCBvdXRwdXRJZCkgewogIGNvbnN0IGlucHV0RWxlbWVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGlucHV0SWQpOwogIGlucHV0RWxlbWVudC5kaXNhYmxlZCA9IGZhbHNlOwoKICBjb25zdCBvdXRwdXRFbGVtZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQob3V0cHV0SWQpOwogIG91dHB1dEVsZW1lbnQuaW5uZXJIVE1MID0gJyc7CgogIGNvbnN0IHBpY2tlZFByb21pc2UgPSBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4gewogICAgaW5wdXRFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsIChlKSA9PiB7CiAgICAgIHJlc29sdmUoZS50YXJnZXQuZmlsZXMpOwogICAgfSk7CiAgfSk7CgogIGNvbnN0IGNhbmNlbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2J1dHRvbicpOwogIGlucHV0RWxlbWVudC5wYXJlbnRFbGVtZW50LmFwcGVuZENoaWxkKGNhbmNlbCk7CiAgY2FuY2VsLnRleHRDb250ZW50ID0gJ0NhbmNlbCB1cGxvYWQnOwogIGNvbnN0IGNhbmNlbFByb21pc2UgPSBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4gewogICAgY2FuY2VsLm9uY2xpY2sgPSAoKSA9PiB7CiAgICAgIHJlc29sdmUobnVsbCk7CiAgICB9OwogIH0pOwoKICAvLyBXYWl0IGZvciB0aGUgdXNlciB0byBwaWNrIHRoZSBmaWxlcy4KICBjb25zdCBmaWxlcyA9IHlpZWxkIHsKICAgIHByb21pc2U6IFByb21pc2UucmFjZShbcGlja2VkUHJvbWlzZSwgY2FuY2VsUHJvbWlzZV0pLAogICAgcmVzcG9uc2U6IHsKICAgICAgYWN0aW9uOiAnc3RhcnRpbmcnLAogICAgfQogIH07CgogIGNhbmNlbC5yZW1vdmUoKTsKCiAgLy8gRGlzYWJsZSB0aGUgaW5wdXQgZWxlbWVudCBzaW5jZSBmdXJ0aGVyIHBpY2tzIGFyZSBub3QgYWxsb3dlZC4KICBpbnB1dEVsZW1lbnQuZGlzYWJsZWQgPSB0cnVlOwoKICBpZiAoIWZpbGVzKSB7CiAgICByZXR1cm4gewogICAgICByZXNwb25zZTogewogICAgICAgIGFjdGlvbjogJ2NvbXBsZXRlJywKICAgICAgfQogICAgfTsKICB9CgogIGZvciAoY29uc3QgZmlsZSBvZiBmaWxlcykgewogICAgY29uc3QgbGkgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdsaScpOwogICAgbGkuYXBwZW5kKHNwYW4oZmlsZS5uYW1lLCB7Zm9udFdlaWdodDogJ2JvbGQnfSkpOwogICAgbGkuYXBwZW5kKHNwYW4oCiAgICAgICAgYCgke2ZpbGUudHlwZSB8fCAnbi9hJ30pIC0gJHtmaWxlLnNpemV9IGJ5dGVzLCBgICsKICAgICAgICBgbGFzdCBtb2RpZmllZDogJHsKICAgICAgICAgICAgZmlsZS5sYXN0TW9kaWZpZWREYXRlID8gZmlsZS5sYXN0TW9kaWZpZWREYXRlLnRvTG9jYWxlRGF0ZVN0cmluZygpIDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ24vYSd9IC0gYCkpOwogICAgY29uc3QgcGVyY2VudCA9IHNwYW4oJzAlIGRvbmUnKTsKICAgIGxpLmFwcGVuZENoaWxkKHBlcmNlbnQpOwoKICAgIG91dHB1dEVsZW1lbnQuYXBwZW5kQ2hpbGQobGkpOwoKICAgIGNvbnN0IGZpbGVEYXRhUHJvbWlzZSA9IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7CiAgICAgIGNvbnN0IHJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKCk7CiAgICAgIHJlYWRlci5vbmxvYWQgPSAoZSkgPT4gewogICAgICAgIHJlc29sdmUoZS50YXJnZXQucmVzdWx0KTsKICAgICAgfTsKICAgICAgcmVhZGVyLnJlYWRBc0FycmF5QnVmZmVyKGZpbGUpOwogICAgfSk7CiAgICAvLyBXYWl0IGZvciB0aGUgZGF0YSB0byBiZSByZWFkeS4KICAgIGxldCBmaWxlRGF0YSA9IHlpZWxkIHsKICAgICAgcHJvbWlzZTogZmlsZURhdGFQcm9taXNlLAogICAgICByZXNwb25zZTogewogICAgICAgIGFjdGlvbjogJ2NvbnRpbnVlJywKICAgICAgfQogICAgfTsKCiAgICAvLyBVc2UgYSBjaHVua2VkIHNlbmRpbmcgdG8gYXZvaWQgbWVzc2FnZSBzaXplIGxpbWl0cy4gU2VlIGIvNjIxMTU2NjAuCiAgICBsZXQgcG9zaXRpb24gPSAwOwogICAgZG8gewogICAgICBjb25zdCBsZW5ndGggPSBNYXRoLm1pbihmaWxlRGF0YS5ieXRlTGVuZ3RoIC0gcG9zaXRpb24sIE1BWF9QQVlMT0FEX1NJWkUpOwogICAgICBjb25zdCBjaHVuayA9IG5ldyBVaW50OEFycmF5KGZpbGVEYXRhLCBwb3NpdGlvbiwgbGVuZ3RoKTsKICAgICAgcG9zaXRpb24gKz0gbGVuZ3RoOwoKICAgICAgY29uc3QgYmFzZTY0ID0gYnRvYShTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KG51bGwsIGNodW5rKSk7CiAgICAgIHlpZWxkIHsKICAgICAgICByZXNwb25zZTogewogICAgICAgICAgYWN0aW9uOiAnYXBwZW5kJywKICAgICAgICAgIGZpbGU6IGZpbGUubmFtZSwKICAgICAgICAgIGRhdGE6IGJhc2U2NCwKICAgICAgICB9LAogICAgICB9OwoKICAgICAgbGV0IHBlcmNlbnREb25lID0gZmlsZURhdGEuYnl0ZUxlbmd0aCA9PT0gMCA/CiAgICAgICAgICAxMDAgOgogICAgICAgICAgTWF0aC5yb3VuZCgocG9zaXRpb24gLyBmaWxlRGF0YS5ieXRlTGVuZ3RoKSAqIDEwMCk7CiAgICAgIHBlcmNlbnQudGV4dENvbnRlbnQgPSBgJHtwZXJjZW50RG9uZX0lIGRvbmVgOwoKICAgIH0gd2hpbGUgKHBvc2l0aW9uIDwgZmlsZURhdGEuYnl0ZUxlbmd0aCk7CiAgfQoKICAvLyBBbGwgZG9uZS4KICB5aWVsZCB7CiAgICByZXNwb25zZTogewogICAgICBhY3Rpb246ICdjb21wbGV0ZScsCiAgICB9CiAgfTsKfQoKc2NvcGUuZ29vZ2xlID0gc2NvcGUuZ29vZ2xlIHx8IHt9OwpzY29wZS5nb29nbGUuY29sYWIgPSBzY29wZS5nb29nbGUuY29sYWIgfHwge307CnNjb3BlLmdvb2dsZS5jb2xhYi5fZmlsZXMgPSB7CiAgX3VwbG9hZEZpbGVzLAogIF91cGxvYWRGaWxlc0NvbnRpbnVlLAp9Owp9KShzZWxmKTsK", 380 | "ok": true, 381 | "headers": [ 382 | [ 383 | "content-type", 384 | "application/javascript" 385 | ] 386 | ], 387 | "status": 200, 388 | "status_text": "" 389 | } 390 | }, 391 | "base_uri": "https://localhost:8080/", 392 | "height": 72 393 | }, 394 | "id": "fgFgStVN_hnX", 395 | "outputId": "1508586f-4e9f-4242-ca2a-59b6602a89de" 396 | }, 397 | "source": [ 398 | "# Upload dataset to Google Colab\n", 399 | "\n", 400 | "from google.colab import files\n", 401 | "\n", 402 | "uploaded = files.upload()" 403 | ], 404 | "execution_count": 6, 405 | "outputs": [ 406 | { 407 | "output_type": "display_data", 408 | "data": { 409 | "text/html": [ 410 | "\n", 411 | " \n", 413 | " \n", 414 | " Upload widget is only available when the cell has been executed in the\n", 415 | " current browser session. Please rerun this cell to enable.\n", 416 | " \n", 417 | " " 418 | ], 419 | "text/plain": [ 420 | "" 421 | ] 422 | }, 423 | "metadata": {} 424 | }, 425 | { 426 | "output_type": "stream", 427 | "name": "stdout", 428 | "text": [ 429 | "Saving Tweets.csv to Tweets.csv\n" 430 | ] 431 | } 432 | ] 433 | }, 434 | { 435 | "cell_type": "code", 436 | "metadata": { 437 | "id": "QkLvAWZdcC1D", 438 | "colab": { 439 | "base_uri": "https://localhost:8080/", 440 | "height": 530 441 | }, 442 | "outputId": "675947e8-32a1-4bff-bd87-2855faf5fd62" 443 | }, 444 | "source": [ 445 | "# Use pandas to load and only include tweets from \"US Airways\"\n", 446 | "\n", 447 | "import pandas as pd\n", 448 | "\n", 449 | "dataset_df = pd.read_csv('Tweets.csv')\n", 450 | "\n", 451 | "dataset_df = dataset_df[dataset_df['airline']=='US Airways']\n", 452 | "\n", 453 | "documents = dataset_df['text'].tolist()\n", 454 | "\n", 455 | "dataset_df.head()\n" 456 | ], 457 | "execution_count": 7, 458 | "outputs": [ 459 | { 460 | "output_type": "execute_result", 461 | "data": { 462 | "text/html": [ 463 | "
\n", 464 | "\n", 477 | "\n", 478 | " \n", 479 | " \n", 480 | " \n", 481 | " \n", 482 | " \n", 483 | " \n", 484 | " \n", 485 | " \n", 486 | " \n", 487 | " \n", 488 | " \n", 489 | " \n", 490 | " \n", 491 | " \n", 492 | " \n", 493 | " \n", 494 | " \n", 495 | " \n", 496 | " \n", 497 | " \n", 498 | " \n", 499 | " \n", 500 | " \n", 501 | " \n", 502 | " \n", 503 | " \n", 504 | " \n", 505 | " \n", 506 | " \n", 507 | " \n", 508 | " \n", 509 | " \n", 510 | " \n", 511 | " \n", 512 | " \n", 513 | " \n", 514 | " \n", 515 | " \n", 516 | " \n", 517 | " \n", 518 | " \n", 519 | " \n", 520 | " \n", 521 | " \n", 522 | " \n", 523 | " \n", 524 | " \n", 525 | " \n", 526 | " \n", 527 | " \n", 528 | " \n", 529 | " \n", 530 | " \n", 531 | " \n", 532 | " \n", 533 | " \n", 534 | " \n", 535 | " \n", 536 | " \n", 537 | " \n", 538 | " \n", 539 | " \n", 540 | " \n", 541 | " \n", 542 | " \n", 543 | " \n", 544 | " \n", 545 | " \n", 546 | " \n", 547 | " \n", 548 | " \n", 549 | " \n", 550 | " \n", 551 | " \n", 552 | " \n", 553 | " \n", 554 | " \n", 555 | " \n", 556 | " \n", 557 | " \n", 558 | " \n", 559 | " \n", 560 | " \n", 561 | " \n", 562 | " \n", 563 | " \n", 564 | " \n", 565 | " \n", 566 | " \n", 567 | " \n", 568 | " \n", 569 | " \n", 570 | " \n", 571 | " \n", 572 | " \n", 573 | " \n", 574 | " \n", 575 | " \n", 576 | " \n", 577 | " \n", 578 | " \n", 579 | " \n", 580 | " \n", 581 | " \n", 582 | " \n", 583 | " \n", 584 | " \n", 585 | " \n", 586 | " \n", 587 | " \n", 588 | " \n", 589 | " \n", 590 | "
tweet_idairline_sentimentairline_sentiment_confidencenegativereasonnegativereason_confidenceairlineairline_sentiment_goldnamenegativereason_goldretweet_counttexttweet_coordtweet_createdtweet_locationuser_timezone
8966570310600460525568negative0.6292Flight Booking Problems0.3146US AirwaysNaNjhazelnutNaN0@USAirways is there a better time to call? My...NaN2015-02-24 11:53:37 -0800NaNNaN
8967570310144459972608negative1.0000Customer Service Issue1.0000US AirwaysNaNGAKotschNaN0@USAirways and when will one of these agents b...NaN2015-02-24 11:51:48 -0800NaNAtlantic Time (Canada)
8968570309340952993796neutral1.0000NaNNaNUS AirwaysNaNDebbiMcGinnisNaN0@USAirways is a DM possible if you aren't foll...NaN2015-02-24 11:48:37 -0800MissourahHawaii
8969570309000279023616neutral1.0000NaNNaNUS AirwaysNaNAshleyKAthertonNaN0@USAirways Fortunately you have staff like Lyn...NaN2015-02-24 11:47:16 -0800NaNCentral Time (US & Canada)
8970570308799950692353negative1.0000Customer Service Issue0.6452US AirwaysNaNretardedlarryNaN0@USAirways just hung up on me again. Another ...NaN2015-02-24 11:46:28 -0800NaNNaN
\n", 591 | "
" 592 | ], 593 | "text/plain": [ 594 | " tweet_id ... user_timezone\n", 595 | "8966 570310600460525568 ... NaN\n", 596 | "8967 570310144459972608 ... Atlantic Time (Canada)\n", 597 | "8968 570309340952993796 ... Hawaii\n", 598 | "8969 570309000279023616 ... Central Time (US & Canada)\n", 599 | "8970 570308799950692353 ... NaN\n", 600 | "\n", 601 | "[5 rows x 15 columns]" 602 | ] 603 | }, 604 | "metadata": {}, 605 | "execution_count": 7 606 | } 607 | ] 608 | }, 609 | { 610 | "cell_type": "markdown", 611 | "metadata": { 612 | "id": "ex0pQ3T98qH1" 613 | }, 614 | "source": [ 615 | "##Helper Methods\n", 616 | "\n", 617 | "---\n", 618 | "\n" 619 | ] 620 | }, 621 | { 622 | "cell_type": "code", 623 | "metadata": { 624 | "id": "qSWjSIf8f6IR" 625 | }, 626 | "source": [ 627 | "\n", 628 | "# Create a function to display both top words and top documents in a topic\n", 629 | "def display_topics(H, W, feature_names, documents, no_top_words, no_top_documents):\n", 630 | " #The method needs to take H, W, the full vocabulary, docuemnt dataset anf the number of words as a \n", 631 | " # parameters and print out the top documents in addition to the top words.\n", 632 | " for topic_idx, topic in enumerate(H):\n", 633 | " print(\"Topic %d:\" % (topic_idx))\n", 634 | " print(\" \".join([ (feature_names[i] + \" (\" + str(topic[i].round(2)) + \")\")\n", 635 | " for i in topic.argsort()[:-no_top_words - 1:-1]]))\n", 636 | " top_doc_indices = np.argsort( W[:,topic_idx] )[::-1][0:no_top_documents]\n", 637 | " for doc_index in top_doc_indices:\n", 638 | " print(str(doc_index) + \". \" + documents[doc_index])\n", 639 | "\n", 640 | "# Format topic output for use by OCTIS\n", 641 | "def format_topics_for_OCTIS(nmf_H, nmf_W, vocab, no_top_words):\n", 642 | " topics = []\n", 643 | " for topic_idx, topic in enumerate(nmf_H):\n", 644 | " word_list = [vocab[i] for i in topic.argsort()[:-no_top_words - 1:-1]]\n", 645 | " topics.append(word_list)\n", 646 | "\n", 647 | " octis_topic_dict = {}\n", 648 | " octis_topic_dict[\"topic-word-matrix\"] = nmf_H\n", 649 | " octis_topic_dict[\"topics\"] = topics\n", 650 | " octis_topic_dict[\"topic-document-matrix\"] = np.array(nmf_W).transpose()\n", 651 | " return octis_topic_dict\n", 652 | "\n", 653 | "# Recreate the dataset for OCTIS using the spacy_custom_tokenizer\n", 654 | "def get_dataset_for_octis(documents):\n", 655 | " dataset_for_octis = []\n", 656 | " for document in documents:\n", 657 | " dataset_for_octis.append(spacy_custom_tokenizer(document))\n", 658 | " return dataset_for_octis\n" 659 | ], 660 | "execution_count": 8, 661 | "outputs": [] 662 | }, 663 | { 664 | "cell_type": "markdown", 665 | "metadata": { 666 | "id": "BJfWGlPA4fA9" 667 | }, 668 | "source": [ 669 | "## Parameters to Set" 670 | ] 671 | }, 672 | { 673 | "cell_type": "code", 674 | "metadata": { 675 | "id": "npHdEEGM4lAw" 676 | }, 677 | "source": [ 678 | "no_topics_list = list(range(4, 40)) #Todo: Set range of topics to be evaluated\n", 679 | "no_top_words = 10 #Todo: Set number of top words - will be used by Diversity and display_topics() method\n", 680 | "no_top_documents = 10 #Todo: Set number of top documents - will be used by the display_topics() method\n", 681 | "\n", 682 | "spacy_nlp.Defaults.stop_words |= {'flight', '..', '...', '....', 'help', 'thank', 'thanks','great', 'need', 'response', 'today'}\n", 683 | "\n", 684 | "max_iter = 500" 685 | ], 686 | "execution_count": 16, 687 | "outputs": [] 688 | }, 689 | { 690 | "cell_type": "markdown", 691 | "metadata": { 692 | "id": "0fr68Sv3xl5t" 693 | }, 694 | "source": [ 695 | "##Create a TfidfVectorizer that uses the custom Spacy Tokenizer" 696 | ] 697 | }, 698 | { 699 | "cell_type": "code", 700 | "metadata": { 701 | "id": "vzq-ivZtu4uf" 702 | }, 703 | "source": [ 704 | "# TF-IDF stands for Term Frequency-Inverse Document Frequency. TF-IDF is a technique that is used to normalize the raw word counts in comparison to the document frequency. \n", 705 | "# TF-IDF is used to represent how important a word is in a document based on how many times the word appears in the current document and how many other documents also contain the word. \n", 706 | "# A higher TF-IDF score indicates higher importance for the word in the document.\n", 707 | "\n", 708 | "# max_df - ignore terms that have a document frequency higher than the given threshold (corpus-specific stop words). This parameter represents a proportion of documents.\n", 709 | "# min_df - ignore terms that have a document frequency lower than the given threshold. In range of [0.0, 1.0], the parameter represents a proportion of documents.\n", 710 | "# max_features - only consider the top max_features ordered by term frequency across the corpus.\n", 711 | "\n", 712 | "tfidf_vectorizer = TfidfVectorizer(tokenizer = spacy_custom_tokenizer, max_features=2000, max_df=0.95, min_df=10)\n", 713 | "term_document_matrix = tfidf_vectorizer.fit_transform(documents)\n", 714 | "vocab = tfidf_vectorizer.get_feature_names()\n" 715 | ], 716 | "execution_count": 18, 717 | "outputs": [] 718 | }, 719 | { 720 | "cell_type": "markdown", 721 | "metadata": { 722 | "id": "jZsRBxzEiS75" 723 | }, 724 | "source": [ 725 | "## Vary the Number of Topics and Calculate Coherence and Diversity" 726 | ] 727 | }, 728 | { 729 | "cell_type": "code", 730 | "metadata": { 731 | "id": "90NXdhNviP1q", 732 | "colab": { 733 | "base_uri": "https://localhost:8080/" 734 | }, 735 | "outputId": "63d69890-e893-48ec-d558-4c3b6287e3da" 736 | }, 737 | "source": [ 738 | "reconstruction_error_list = []\n", 739 | "number_of_iterations_list = []\n", 740 | "npmi_coherence_score_list = []\n", 741 | "diversity_score_list = []\n", 742 | "\n", 743 | "# Coherence measures the semantic similarity between words in a topic and the metric can be reported across all topics that are generated by a Topic Modeling algorithm. \n", 744 | "# Normalized Pointwise Mutual Information (NPMI) score will be used as a Coherence measure. \n", 745 | "# NPMI measures how much more likely the top words in a generated topic can co-occur than if they were independent within the provided corpus.\n", 746 | "npmi = Coherence(texts=get_dataset_for_octis(documents), topk=no_top_words, measure='c_npmi')\n", 747 | "\n", 748 | "# Diversity is a measure of the uniqueness of words in a topic and is calculated between all generated topics.\n", 749 | "topic_diversity = TopicDiversity(topk=no_top_words)\n", 750 | "\n", 751 | "for no_topics in no_topics_list:\n", 752 | "\n", 753 | " curent_no_topics = no_topics\n", 754 | " nmf_model = NMF(n_components=curent_no_topics, init='nndsvd', max_iter=max_iter).fit(term_document_matrix)\n", 755 | " nmf_W = nmf_model.transform(term_document_matrix)\n", 756 | " nmf_H = nmf_model.components_\n", 757 | "\n", 758 | " reconstruction_error_list.append(nmf_model.reconstruction_err_)\n", 759 | " number_of_iterations_list.append(nmf_model.n_iter_)\n", 760 | "\n", 761 | " octis_topic_dict = format_topics_for_OCTIS(nmf_H, nmf_W, vocab, no_top_words)\n", 762 | "\n", 763 | " npmi_coherence_score_list.append(npmi.score(octis_topic_dict))\n", 764 | " diversity_score_list.append(topic_diversity.score(octis_topic_dict))\n", 765 | "\n", 766 | "\n", 767 | "print(\"reconstruction_error_list\", reconstruction_error_list)\n", 768 | "print(\"number_of_iterations_list\", number_of_iterations_list)\n", 769 | "print(\"npmi_coherence_score_list\", npmi_coherence_score_list)\n", 770 | "print(\"diversity_score_list\", diversity_score_list)\n" 771 | ], 772 | "execution_count": 19, 773 | "outputs": [ 774 | { 775 | "output_type": "stream", 776 | "name": "stdout", 777 | "text": [ 778 | "reconstruction_error_list [51.24051812582791, 50.942658182911195, 50.67193150805949, 50.39895677060591, 50.16382525447004, 49.922523540269125, 49.6922215836967, 49.47160282320441, 49.27596675110744, 49.019992862265745, 48.80350397454866, 48.62441912087162, 48.386453031914556, 48.196681145822666, 47.97087312778232, 47.78515915118506, 47.54980800724205, 47.3541420201889, 47.16599241020493, 46.989558399295554, 46.80230531402132, 46.629061749728095, 46.45714217444255, 46.25207097688603, 46.07133309310334, 45.9058928988189, 45.72559336286115, 45.59881894374744, 45.39506045186217, 45.2386446285017, 45.07122040203292, 44.93084820070871, 44.75910589605674, 44.57425934244373, 44.39437972688001, 44.283146642564866]\n", 779 | "number_of_iterations_list [60, 46, 76, 48, 45, 70, 104, 76, 209, 163, 66, 136, 338, 84, 240, 317, 122, 57, 170, 214, 144, 155, 156, 120, 317, 157, 150, 85, 138, 164, 84, 103, 143, 106, 185, 106]\n", 780 | "npmi_coherence_score_list [-0.0009744669222551444, 0.022443641394622904, 0.017191003401957033, 0.021219657501263006, 0.01610951097404517, 0.017579888823097675, -0.0055752281262693455, -0.003717900604786568, -0.009051423869504534, -0.03813218315140128, -0.032000196917463905, -0.034354179660529574, -0.03570418549062012, -0.053773799995966536, -0.031927289127995036, -0.038531153101990026, -0.06631329862411481, -0.06795262649096546, -0.07127703980123096, -0.07736077009358538, -0.08177682609620307, -0.09126352378310798, -0.09831055532203245, -0.09921841992109054, -0.10311742267087178, -0.11868653364248918, -0.11203026091257842, -0.11658809924699952, -0.11779959175476973, -0.12051101431592802, -0.13670629912066323, -0.12928535021792298, -0.1401929797506662, -0.1410205314133063, -0.14485709207947592, -0.1381273828697061]\n", 781 | "diversity_score_list [0.9, 0.9, 0.8833333333333333, 0.8428571428571429, 0.8, 0.8, 0.83, 0.7818181818181819, 0.7583333333333333, 0.7384615384615385, 0.7142857142857143, 0.7133333333333334, 0.6875, 0.6823529411764706, 0.6722222222222223, 0.6789473684210526, 0.69, 0.680952380952381, 0.6909090909090909, 0.6478260869565218, 0.6583333333333333, 0.64, 0.65, 0.6333333333333333, 0.625, 0.6275862068965518, 0.61, 0.6129032258064516, 0.6125, 0.603030303030303, 0.6029411764705882, 0.6057142857142858, 0.6055555555555555, 0.581081081081081, 0.5947368421052631, 0.5871794871794872]\n" 782 | ] 783 | } 784 | ] 785 | }, 786 | { 787 | "cell_type": "markdown", 788 | "metadata": { 789 | "id": "LlnuABzuq2W2" 790 | }, 791 | "source": [ 792 | "## Plot the Coherence and Diversity Metric\n", 793 | "\n" 794 | ] 795 | }, 796 | { 797 | "cell_type": "code", 798 | "metadata": { 799 | "colab": { 800 | "base_uri": "https://localhost:8080/", 801 | "height": 899 802 | }, 803 | "id": "Rxxkt8ghq9cK", 804 | "outputId": "c0717a5f-80f1-491b-df6e-daff983c02fb" 805 | }, 806 | "source": [ 807 | "\n", 808 | "plt.figure(figsize=(12,7))\n", 809 | "plt.plot(no_topics_list, npmi_coherence_score_list) \n", 810 | "\n", 811 | "plt.xlabel(\"Number of Topics\")\n", 812 | "plt.ylabel(\"NPMI Coherence Score\")\n", 813 | "plt.title(\"Topic Coherence\")\n", 814 | "\n", 815 | "plt.show()\n", 816 | "\n", 817 | "plt.figure(figsize=(12,7))\n", 818 | "plt.plot(no_topics_list, diversity_score_list) \n", 819 | "\n", 820 | "plt.xlabel(\"Number of Topics\")\n", 821 | "plt.ylabel(\"Diversity Score\")\n", 822 | "plt.title(\"Topic Diversity\")\n", 823 | "\n", 824 | "plt.show()" 825 | ], 826 | "execution_count": 20, 827 | "outputs": [ 828 | { 829 | "output_type": "display_data", 830 | "data": { 831 | "image/png": "iVBORw0KGgoAAAANSUhEUgAAAuYAAAG5CAYAAADCqfHsAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4yLjIsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+WH4yJAAAgAElEQVR4nOzdeXhV1b3/8fc3c8gEZIQwBwiTyhAUEQQEcagK4lCtWhxa69Dqrb33tv3VTmpta2snrbWoVW8HnCqoVesMIk4EwjyPJmFKGJIwZDzr90cONGIIh+Qk+5zk83qe/XD23mvv/Tn6KN+srL2WOecQERERERFvRXgdQEREREREVJiLiIiIiIQEFeYiIiIiIiFAhbmIiIiISAhQYS4iIiIiEgJUmIuIiIiIhAAV5iIi7YSZPWpmP2zjZ040s6K2fKaISHulwlxExANmdqDB5jOzww32r2nOPZ1ztzjn7m1mnq+YWb7/+TvM7HUzG9ece4mISPNEeR1ARKQjcs4lHvlsZluBrznn3vYii5ndBXwPuAV4A6gGzgemAR+0YY4o51xtWz1PRCTUqMdcRCSEmFmsmf3OzLb7t9+ZWaz/3EQzKzKz/2dmpWa2tWHvupk9ZWb3NdifZmZLzazczDaZ2fmNPC8FuAe43Tn3onPuoHOuxjn3inPuf06UqcF9vmNmu/297Tcc831+bWafmdku/3Cb+GO+z3fNbCfwpJlFmNn3/Hn3mNlzZtbV376PmTkzm+m/X6mZ/aDBsyL9/2w2mVmFmS02s57+c4PM7C0z22tm68zsyqD8CxMRCSIV5iIioeUHwBhgOHAacDpwd4PzWUAakA3MBGaZWe6xNzGz04H/A/4H6AycDWxt5HlnAnHAnBZmSvFnugn4o5l18Z/7BTDQf21/f5sfHXNtV6A3cDPwLWA6MAHoDuwD/nhMnnFALjAZ+JGZDfYfvwu4GrgQSAZuBA6ZWQLwFvAPIAO4CnjEzIY08Z1FRNqcCnMRkdByDXCPc263c64E+Clw3TFtfuicq3LOzQdeBRrr/b0J+Itz7i3nnM85V+ycW9tIu1Sg9ARDSE6UqcZ/vsY59xpwAMg1M6O+2P62c26vc64CuJ/6wvgIH/Bj//c5TP1wmh8454qcc1XAT4DLzazh0MufOucOO+eWAcuo/2EB4GvA3c65da7eMufcHuAiYKtz7knnXK1zrgD4J3BFE99ZRKTNaYy5iEho6Q5sa7C/zX/siH3OuYNNnD+iJ/BaAM/bA6SdYHz3iTLtOebaQ0AikA50AhbX1+gAGBDZoG2Jc66ywX5vYI6Z+RocqwMyG+zvbORZUP+dNzWSvzdwhpntb3AsCvhrI21FRDyjHnMRkdCynfpC8ohe/mNHdPEPzTje+SMKgZwAnvcRUEX98JHmZjqeUuAwMNQ519m/pTR88RVwx1xTCFzQoH1n51ycc644gOcd7zsXAvOPuWeic+7WAO4pItJmVJiLiISW2cDdZpZuZmnUj8f+2zFtfmpmMWY2nvphGs83cp8ngBvMbLL/hcpsMxt0bCPnXJn/GX80s+lm1snMos3sAjN74CQyfYFzzgc8BvzWzDIA/DnOa+KyR4GfmVlvf/t0M5t2omf5PQ7ca2YDrN6pZpYK/AsYaGbX+b9btJmNbjA2XUQkJKgwFxEJLfcB+cByYAWwxH/siJ3UvxC5Hfg7cEtjY8edc58CNwC/BcqA+Xy+17th2wepf3HybqCE+h7mbwJzA8zUlO8CG4GPzawceJv6FzeP5/fAy8CbZlYBfAycEeCzfgM8B7wJlFP/w0m8f2z7VOrHtm+n/p/hL4HY49xHRMQT5tyxv0UUEZFQZGYTgb8553p4nUVERIJPPeYiIiIiIiFAhbmIiIiISAjQUBYRERERkRCgHnMRERERkRCgBYaAtLQ016dPH69jiIiIiEg7t3jx4lLnXHpj51SYA3369CE/P9/rGCIiIiLSzpnZtuOd01AWEREREZEQoMJcRERERCQEqDAXEREREQkBKsxFREREREKACnMRERERkRCgwlxEREREJASoMBcRERERCQGeFuZmdr6ZrTOzjWb2vUbOx5rZs/7zn5hZH//xc81ssZmt8P95ToNr5vnvudS/ZbTdNxIRERERaR7PFhgys0jgj8C5QBGwyMxeds6tbtDsJmCfc66/mV0F/BL4MlAKXOyc225mw4A3gOwG113jnNOKQSIiIiISNrzsMT8d2Oic2+ycqwaeAaYd02Ya8LT/8wvAZDMz51yBc267//gqIN7MYtsktYiIiIhIK/CyMM8GChvsF/H5Xu/PtXHO1QJlQOoxbS4Dljjnqhoce9I/jOWHZmaNPdzMbjazfDPLLykpacn3EBERERFpsbB++dPMhlI/vOUbDQ5f45w7BRjv365r7Frn3CznXJ5zLi89Pb31w4qIiIiINMHLwrwY6Nlgv4f/WKNtzCwKSAH2+Pd7AHOArzrnNh25wDlX7P+zAvgH9UNmRERERERCmpeF+SJggJn1NbMY4Crg5WPavAzM9H++HHjXOefMrDPwKvA959zCI43NLMrM0vyfo4GLgJWt/D1ERERERFrMs8LcP2b8m9TPqLIGeM45t8rM7jGzS/zNngBSzWwjcBdwZErFbwL9gR8dMy1iLPCGmS0HllLf4/5Y232rtne4uo7D1XVexxARERGRFjLnnNcZPJeXl+fy88NzdsUbnvyUJZ/t5/sXDOLKvJ5ERDT6rquIiIiIhAAzW+ycy2vsXFi//NnRbd9/mHnrS4iKML734gq+POsjNuyq8DqWiIiIiDSDCvMw9vKy7TgH/7x1LL+6/FQ27D7AhX9YwK/fWEdlTdsObynad4gH31znz6TfwoiIiIicLM9W/pSWm1tQzMhenemTlkCftATOGZTB/a+t5eH3NvLK8u3cN30Y4we07lSQm0oO8Kd5m5hbUEytr74g/8cn27h32jAGZCa16rNFRERE2hP1mIepNTvKWbuzgktH/GdNptTEWB688jT+8fUziDTjuic+5c5nCiipqGriTs2zansZt/99CVN+M59/Ld/OtWN6s+B/J3Hf9GGs2VHBBb9fwM9fX8PBqtqgP1tERESkPdLLn4Tny58/f20NT3ywhU9/MIWuCTFfOF9ZU8ef5m3iT/M2ERcdwfcvHMyXg/By6OJte3n43Y28t66EpNgorjuzNzeO60taYuzRNnsOVPGL19fy/OIiuqfE8aOLh3De0CyOswiriIiISIfR1MufKswJv8Lc53OM/cW7DMtO5vGZo5tsu3H3AX4wZwWfbNlLXu8u3D/jFAae5BAT5xwfbCzl4Xc38smWvXTpFM2NZ/Xlq2P7kBIffdzrFm3dyw/nrmTtzgom5qbz00uG0js14aSeLSIiItKeqDA/gXArzD/cVMpXHvuEh78ygotO7X7C9s45XlhcxP2vraGispabz+7HHZMHEBcd2eR1Pp/jrTW7eOS9jSwrKiMzOZavj+/HV87oRaeYwF5PqK3z8dSHW/ntW+up8Tlum5jDLRNyTvhsERERkfZIhfkJhFth/r8vLOO1FTvJv3vKSRW4ew9Wc/9ra3hhcRG9unbi3unDmDDwiy+H1tb5+NfyHTwybyPrdx2gV9dO3DIhh8tGZRMb1byCemdZJfe9upp/Ld9B79RO/PSSoUzMzWjWvURERETClQrzEwinwryypo7R973NecOy+PUVpzXrHh9uKuXuOSvZXHqQS07rzt0XDSYjKY6q2jpeXFLMo/M3sW3PIQZkJHL7pP5cdGo3oiKD857wBxtK+dFL9c++YFgWP7xoCN07xwfl3kc45yivrG1ymI2IiIiIF1SYn0A4FeavLt/B7f9Ywt+/dgZn9U9r9n2qautfDn3kvfqXQy8f1ZPXVuxgZ3klp/ZI4fZJ/Tl3cGarrCRaVVvH4wu28NC7G4gw487JA7hxXF+im1H8lx2qYe3OctbvqmDtzgrW7axg3a4KKipr+fN1ozhvaFbQ84uIiIg0lwrzEwinwvxrT+ezong/H35vMpFBKJo3ldS/HPrx5r2c0bcrt0/qz/gBaW0yg0rh3kP89JXVvL1mFwMyErl3+jDG9EtttG1lTR0bdx9g3c6KzxXhO8srj7ZJiotiUFYSuVlJvLlqF0O7J/PkDae3+vcQERERCVRThbkWGAojew9WM2/dbm4c1zcoRTlATnois78+hj0Hqz835WFb6Nm1E4/PzOPt1bv4ySuruGrWx1w6IpubxvWlaN9hf+93Oet2VrB1zyHq/AsYxURG0D8jkTNzUsn1F+KDspLISo47+gNFUlw0s97fTElFFelJbfu9RERERJpDhXkYeXXFDmp9junDs0/c+CSYWZsX5Q1NGZLJWf3TeGTeRv48fzNzCor9uaBX107kZiZx4SndjhbgfVITTjjmfcaIbP40bxOvLNvOjeP6tsXXEBEREWkRFeZhZG5BMbmZSQzu1v6Wuo+PieQ7U3OZMbIHS7btIycjkYGZiQFPy3isAZlJDMtOZk5BsQpzERERCQvBmWpDWt1new6xeNs+po/IbtcraPZNS+CyUT0Y3rNzs4vyIy4d0YMVxWVs3F0RpHQiIiIirUeFeZiYu7R+eMe04SdeUEjqXXJadyIjjBeXFHsdRUREROSEVJiHAecccwuKGdOva9Dn/G7P0pNiGT8gjZeWbsfn0+xDIiIiEtpUmIeB5UVlbC49yKUjgvvSZ0dw6Yhsivcf5pMte72OIiIiItIkFeZhYE5BMTFREZw/rJvXUcLO1CFZJMZGMaegyOsoIiIiIk1SYR7iaup8vLJsO1MGZ2iJ+WaIj4nk/GFZvL5iJ5U1dV7HERERETkuFeYh7oONpew5WB30ucs7khkjsqmoquWt1bu8jiIiIiJyXCrMQ9zcgmI6d4pmYm6G11HC1ph+qXRLiTu6cJGIiIhIKFJhHsIOVNXyxqqdfOmUbsRE6V9Vc0VEGNOGZzN/fQmlB6q8jiMiIiLSKFV7IezNVTuprPFpNpYgmDEymzqf45Vl272OIiIiItIoFeYhbE5BMT26xDOqdxevo4S9gZlJDO2erOEsIiIiErJUmIeo3eWVLNxYyqUjsjEzr+O0C5eOyGZ5URkbdx/wOoqIiIjIF6gwD1EvL9uOz8E0zcYSNJcM706EoTnNRUREJCSpMA9Rc5cWc0p2Cv0zEr2O0m5kJMUxfkA6cwu24/M5r+OIiIiIfI4K8xC0YVcFK4vLma6XPoNuxshsivcf5tOte72OIiIiIvI5KsxD0NylxUQYXHxaN6+jtDtTh2SREBPJnCV6CVRERERCiwrzEOPzOeYWbGfcgHQykuK8jtPuxMdEcv6wbry2YgeVNXVexxERERE5SoV5iMnfto/i/Ye5dER3r6O0WzNGZlNRVcvba3Z5HUVERETkKBXmIWZOQTHx0ZFMHZLldZR2a0y/VLKS4zScRUREREKKCvMQUlVbx6vLt3Pe0EwSYqO8jtNuRUYY00Z0Z/76EvYcqPI6joiIiAigwjykvLe2hPLKWs3G0gZmjOhBrc/xyrLtXkcRERERAVSYh5S5BcWkJcYwrn+a11HavdysJIZ0S2ZOgYaziIiISGhQYR4iyg7V8O7a3Vx8WneiIvWvpS3MGJnNsqIyNpUc8DqKiIiIiArzUPHayh1U1/m4VMNY2swlp3UnwtBLoCIiIhISVJiHiLkFxfRLT+CU7BSvo3QYGclxjBuQzpyCYnw+53UcERER6eBUmIeA4v2H+WTLXi4dno2ZeR2nQ5kxIpvi/YdZtHWv11FERESkg1NhHgJeWlo/lGLacA1jaWtTh2bSKSZSL4GKiIiI51SYe8w5x5wlxeT17kKv1E5ex+lwOsVEcf6wLF5dsYPKmjqv44iIiEgHpsLcY6t3lLNh9wHNXe6hGSN6UFFZyztrdnsdRURERDowzwtzMzvfzNaZ2UYz+14j52PN7Fn/+U/MrE+Dc9/3H19nZucFes9QMregmOhI40undPM6Sod1Zk4qmcmxzCko8jqKiIiIdGCeFuZmFgn8EbgAGAJcbWZDjml2E7DPOdcf+C3wS/+1Q4CrgKHA+cAjZhYZ4D1DQp3P8dLS7UzMzaBLQozXcTqsyAhj+vBs5q0rYc+BKq/jiIiISAfldY/56cBG59xm51w18Aww7Zg204Cn/Z9fACZb/dQl04BnnHNVzrktwEb//QK5Z0j4aNMedldUae7yEHDpyGxqfY5/Ld/hdRQRERHpoLwuzLOBwgb7Rf5jjbZxztUCZUBqE9cGck/M7GYzyzez/JKSkhZ+jeaZU1BMUmwU5wzK8OT58h+DspIZ3C2ZFzU7i4iIiHjE68LcM865Wc65POdcXnp6eps//3B1Hf9euYMLTskiLjqyzZ8vXzRjRDbLCvezqeSA11FERESkA/K6MC8GejbY7+E/1mgbM4sCUoA9TVwbyD09V3qgilN7dObSET28jiJ+04Z3J8LqX8gVERERaWteF+aLgAFm1tfMYqh/mfPlY9q8DMz0f74ceNc55/zHr/LP2tIXGAB8GuA9Pdezaydm3zyGM3NSvY4ifhnJcZzVP405BcX4fM7rOCIiItLBeFqY+8eMfxN4A1gDPOecW2Vm95jZJf5mTwCpZrYRuAv4nv/aVcBzwGrg38Dtzrm6492zLb+XhK8ZI7Mp2neY/G37vI4iIiIiHYzVdz53bHl5eS4/P9/rGBICDlXXknff20wb3p2fzzjV6zgiIiLSzpjZYudcXmPnvB7KIhJSOsVEcf7QLP61fAeVNXUtvp9zjpo6XxCSiYiISHsX5XUAkVBz6chsXiwo5t21u7nwJFdkPVRdy/KiMgo+28+Sz/ZR8Nl+yg5Xc8uEHG6f1F8z8IiIiMhxqTAXOcbYnDQyk2N5cUlxk4W5c45tew5RULiPJdvqC/G1Oyuo87842jctgbMHpFFV5+Ohdzfy6ood3H/pKYzppxd+RURE5ItUmIscIzLCmDY8m798sIW9B6vpmhADwMGqWpYV7qegcD9Ltu2joHA/ew9WA5AQE8nwXp25dUIOI3t3ZnjPLkevA7hqdAk/mLOSq2Z9zFWje/L9CwaT0inak+8nIiIioUkvf6KXP+WL1uwo54LfL+DyUT2IiYpgybZ9rN9VwZFZFHPSExjZqwsjenVhZO/ODMhIIjLCmrzn4eo6fvfOeh5fsIUunWL48cVDuOjUbpg1fZ2IiIi0H029/KnCHBXm0riLHlrAyuJykuKiGN6zs78Q78yInl1a1Nu9ansZ339xBcuLyjhnUAb3Th9Gduf4ICYXERGRUKXC/ARUmEtjSg9Usf9QNf3SEok4QW/4yarzOZ76cCsPvrkOgP+emsvMsX1O2OsuIiIi4U3TJYo0Q1piLP0zkoJelEP9OPabxvXlzW+fzRl9u3LPv1Zz6SMLWbW9LOjPEhERkfCgwlzEQz26dOIv14/moatHsH3/YS55eCE/f30Nh6tbPoe6iIiIhBcV5iIeMzMuPq07b981gStG9eDP8zdz3u/eZ8GGEq+jiYiISBtSYS4SIjp3iuEXl53K7K+PISrCuO6JT7nr2aVHp2QUERGR9k2FuUiIOTMnldfuHM+3zunPy8u2M/nBeby4pAi9qC0iItK+qTAXCUFx0ZF8Z2our94xnr5pCdz13DKe+GCL17FERESkFakwFwlhuVlJvHDLWE7tkcIry3d4HUdERERakQpzkRAXEWFMGZzJ8qL9lB6o8jqOiIiItBIV5iJhYFJuBs7B++s1U4uIiEh7pcJcJAwM7Z5MWmIs761TYS4iItJeqTAXCQMREcbE3HTeX19CbZ3P6zgiIiLSClSYi4SJSbkZlB2uYWnhfq+jiIiISCtQYS4SJsYNSCMywnhv3W6vo4iIiEgrUGEuEiZS4qMZ1bsL763VOHMREZH2SIW5SBg5Z1AGq3eUs7Os0usoIiIiEmQqzEXCyKTcDADmaTiLiIhIu6PCXCSMDMxMpHtKnMaZi4iItEMqzEXCiJkxcVAGH2wopbpW0yaKiIi0JyrMRcLMpNwMDlbXkb91r9dRREREJIhUmIuEmbE5qcRERmg4i4iISDujwlwkzCTERnFGv668t07TJoqIiLQnKsxFwtDE3Aw27j5A4d5DXkcRERGRIFFhLhKGJuWmA5o2UUREpD1RYS4ShvqmJdA7tZOGs4iIiLQjKsxFwpCZMSk3gw83lVJZU+d1HBEREQkCFeYiYWpibjqVNT4+3rzH6ygiIiISBCrMRcLUmH6pxEVHME/DWURERNoFFeYiYSouOpKxOWm8u3Y3zjmv44iIiEgLqTAXCWOTctP5bO8htpQe9DqKiIiItJAKc5EwNjE3A0Czs4iIiLQDKsxFwljPrp3on5Go+cxFRETaARXmImFuUm46n2zey8GqWq+jiIiISAuoMBcJc5NyM6iu8/HhJk2bKCIiEs5UmIuEubw+XUmIieQ9DWcREREJayrMRcJcTFQE4wakMU/TJoqIiIQ1FeYi7cCk3Ay2l1WyftcBr6OIiIhIM3lSmJtZVzN7y8w2+P/scpx2M/1tNpjZTP+xTmb2qpmtNbNVZvaLBu2vN7MSM1vq377WVt9JxEv/mTZRw1lERETClVc95t8D3nHODQDe8e9/jpl1BX4MnAGcDvy4QQH/a+fcIGAEcJaZXdDg0medc8P92+Ot+i1EQkRWShyDuyXz3loV5iIiIuHKq8J8GvC0//PTwPRG2pwHvOWc2+uc2we8BZzvnDvknHsPwDlXDSwBerRBZpGQNik3nfxt+yivrPE6ioiIiDSDV4V5pnNuh//zTiCzkTbZQGGD/SL/saPMrDNwMfW97kdcZmbLzewFM+t5vABmdrOZ5ZtZfkmJVk2U8HfOoAzqfI4F60u9jiIiIiLN0GqFuZm9bWYrG9mmNWzn6qeROOmpJMwsCpgN/ME5t9l/+BWgj3PuVOp72J8+3vXOuVnOuTznXF56evrJPl4k5Azv2ZmU+GiNMxcREQlTUa11Y+fclOOdM7NdZtbNObfDzLoBjVUSxcDEBvs9gHkN9mcBG5xzv2vwzIYrrDwOPNCM6CJhKSoygrMHpjNvXQk+nyMiwryOJCIiIifBq6EsLwMz/Z9nAi810uYNYKqZdfG/9DnVfwwzuw9IAf6r4QX+Iv+IS4A1Qc4tEtIm5aZTeqCKVdvLvY4iIiIiJ8mrwvwXwLlmtgGY4t/HzPLM7HEA59xe4F5gkX+7xzm318x6AD8AhgBLjpkW8Q7/FIrLgDuA69vyS4l47eyB6Zhp2kQREZFwZFopEPLy8lx+fr7XMUSCYtofFxJhMOe2s7yOIiIiIscws8XOubzGzmnlT5F2ZlJuOksL97P3YLXXUUREROQkqDAXaWcm5WbgHLy/XtOAioiIhBMV5iLtzCnZKaQmxGicuYiISJhRYS7SzkREGBNy05m/voQ6n94hERERCRcqzEXaoUm5Gew/VMPSwv1eRxEREZEAqTAXaYfOHpBOhME8DWcREREJGyrMRdqhlE7RjOrdRePMRUREwogKc5F2amJuBiuLy9ldXhm0e+4ur+TBN9fxwuIidlcE777h7t8rd/LTV1ZxsKrW6ygiIhLGorwOICKtY1JuBr96Yx3z1pdwZV7PFt/vvXW7+e/nlrGnwfzoQ7olc/bAdCYMTGdU7y7ERHW8n/V9Psd9r66maN9hPthQyqPXjSInPdHrWCIiEoZUmIu0U4O7JZGZHMu8dbtbVJhX1dbxwL/X8cQHWxiUlcTsm8dQXevj/Q0lzF9XwuMLNvPo/E0kxERyZk4aE3LTmTgwnZ5dOwXx24SujzfvoWjfYWae2ZtXlu9g2sMLefDK0zhvaJbX0UREJMyoMBdpp8yMSbkZvLp8BzV1PqIjT743e0vpQb41ewkri8uZeWZvvn/hYOKiIwEYlp3CbRP7U1FZw0eb9jB/fQnz15fw9ppdAPRLSzjamz6mXyrxMZFB/X6h4tn8QpLjovj+hYO5eUIOt/1tMd/462Jum5jDd6bmEhlhXkcUEZEwocJcpB2bmJvBM4sKWbxtH2P6pZ7UtS8uKeKHc1cSHRXBrOtGMfU4PcBJcdFMHZrF1KFZOOfYUnqQ+etLeH99Cc8s+oynPtxKTFQEp/fpyoSB6UzITWdARiJm4V+wlh2q4fWVO/lyXk/ioiPJ7hzPs984k5++sopH5m1iRXEZv79qBF0TYryOKiIiYUCFuUg7dlb/VKIjjffW7Q64MD9QVcsP565kTkExp/ftyu+vGk63lPiArjUz+qUn0i89kRvO6ktlTR2Ltu7lfX9v+s9eW8PPXltDt5Q4RvXuQv+MxKNb37QEYqPCq1f95WXFVNf6+PLo/wwViouO5OczTmV4z8788KVVXPzQBzx67ShO6ZHiYVIREQkH5pxWBszLy3P5+flexxBpFV957GP2HKjmjW+ffcK2y4v2c8fsAj7be4g7Jw/km+f0D+pQjO37D7NgQ32RvrK4nMJ9hzjyv6AIg15dO9E/I5GcjET6p/+naE+Kiw5ahmC6+KEPqPM5XrtzfKPnlxft59a/LaHkQBX3TRvGlaNb/hKuiIiENzNb7JzLa+ycesxF2rlJuRn87LU1FO8/THbnxnu+fT7HEx9s4YE31pKeGMszN5/J6X27Bj1L987xfHl0L748uhcAlTV1bCo5wMbdB9i0+wAb/Z/nry+hpu4/nQaZybH0z0hkQEbS54r2tMQYz4bErN5ezoriMn5y8ZDjtjm1R2de+dY47phdwP/+czkFhfv5ySVDwu43AyIi0jZOWJibWSZwP9DdOXeBmQ0BznTOPdHq6USkxSYNSudnr61h3rrdXHNG7y+cL6mo4r+fX8b89SWcNzSTX152Kp07tc2Y6LjoSIZ2T2Fo988P86it8/HZ3kNsbFCsb9p9gOfzCzlYXXe0Xb/0BP55y1i6eDCG+7n8QmIiI5g+IrvJdl0TYnj6xtP59Zvr+NO8TazeUc6frhlJ9+P8kCQiIh1XID3mTwFPAj/w768HngVUmIuEgZz0RHp0iee9tSVfKMwXbCjh288uo6KyhvumD+OaM3qFxEuZUZERR8eqT21w3DnHzvJKNu4+wKrt5fzi9bX830fbuHPKgDbNV1lTx5yCYqYOzQzoh5jICHKCutQAACAASURBVOO75w/itB6d+e/nl3HxQx/w0NUjGNs/rQ3SiohIuAhk/rQ059xzgA/AOVcL1DV9iYiEiiPTJi7cWEpVbf1/ujV1Pn7++hque+JTunSK5uVvjuPaMb1DoihvipnRLSWe8QPSuWVCDpMHZfD0R1s5XN22/0t6a/Uuyg7XfO6lz0CcPyyLubefRZeEGK594hP+PH8Tes9HRESOCKQwP2hmqYADMLMxQFmrphKRoJo0KJ3DNXV8snkvn+05xOWPfsSf52/mK2f04uVvjiM3K8nriM1yy8Qc9h6s5rn8wjZ97nP5hWR3juesnJPv8e6fkcjc28/i/GFZ/Pz1tdz29yUcqKpthZQiIhJuAhnKchfwMpBjZguBdODyVk0lIkF1Zr80YqMi+P07G1i/swIzeOSakVx4Sjevo7XI6D5dGdW7C7Per/8hozmLKJ2son2H+GBjKXecM4CIZs5YkxgbxR+/MpLHFmzmF6+vZf2uCv58XR79MxKDnFZERMJJk3+LmVkkMMG/jQW+AQx1zi1vg2wiEiTxMZGcmZPK4m37GJiVxGt3jg/7ovyIWyfkULz/MK8u39Emz/vn4mIALh/Vo0X3MTNuPjuHv33tDPYfqmHawx/w+oq2+Q4iIhKamizMnXN1wNXOuVrn3Crn3ErnXE0bZRORIPru+YO4b/ownr15DD26dPI6TtCcMyiDARmJPNoG47V9Psfziws5KyeNnl2D889wbE4a/7pjHP0zk7j170tYvG1vUO4rIiLhJ5Df+y40s4fNbLyZjTyytXoyEQmqwd2SuXZMb6LaYLhHW4qIML4xIYe1OyuYt76kVZ/14aY9FO07HPSFgrqlxPOPr51BTFQEry7fGdR7i4hI+Ajkb+jhwFDgHuBB//br1gwlInIyLjmtO91S4nh03qZWfc5z+YWkxEczdUhm0O+dEBvFWTmpvL1ml2ZqERHpoE5YmDvnJjWyndMW4UREAhETFcFN4/ryyZa9FHy2r1WeUXaohn+v2sn04d2Ji26dlTsnD848urCSiIh0PCcszM0sxcx+Y2b5/u1BM0s50XUiIm3p6tN7kRIfzaPzW6fX/KVlxVTX+rgiL7jDWBqaPDgDgLfW7Gq1Z4iISOgKZCjLX4AK4Er/Vk79SqAiIiEjITaKr57ZmzdX72qVHudnFxUytHsyw7Jbr1+iW0o8w7KTeWfN7lZ7hoiIhK5ACvMc59yPnXOb/dtPgX6tHUxE5GRdP7YPsVERzHo/uL3mK4vLWLW9nCtbsbf8iCmDM1ny2T5KD1S1+rNERCS0BFKYHzazcUd2zOws4HDrRRIRaZ7UxFiuzOvJnIJidpZVBu2+z+cXEhMVwfTh2UG75/FMGZyJc/DeWvWai4h0NIEU5rcCfzSzrWa2FXgYuKVVU4mINNPXx/fD5+AvC7cE5X6VNXXMXbqd84dmkdIpOij3bMrQ7slkJcfxtsaZi4h0OIHMyrLUOXcacCpwqnNuhHNuWetHExE5eT27duJLp3TjH598Rtnhlq+H9ubqXZQdrmmTYSxQvyLolCEZLNhQSmVNXZs8U0REQkMgs7Lcb2adnXPlzrlyM+tiZve1RTgRkeb4xoR+HKiq5W8fb2vxvZ5bVEh253jG5qQGIVlgJg/O5FB1HR9t3tNmzxQREe8FMpTlAufc/iM7zrl9wIWtF0lEpGWGdk/h7IHpPLlwa4t6nQv3HmLhplKuyOtBRIQFMWHTzuyXSqeYSN7RcBYRkQ4lkMI80sxij+yYWTwQ20R7ERHP3TKhH6UHqnhhcVGz73Hk2stH9QhWrIDERUcyfkAa76zZrVVARUQ6kEAK878D75jZTWZ2E/AW8HTrxhIRaZkz+6VyWs/OPLZgM3W+ky9ufT7HC4uLGNc/jR5dOrVCwqZNGZzJjrJKVm0vb/Nni4iINwJ5+fOXwH3AYGAQcK9z7oHWDiYi0hJmxq0T+rFtzyFeX7njpK9fuKmU4v2H2+ylz2NNGpSBGZqdRUSkAwmkxxzn3L+BnwMfAqWtmkhEJEjOHZJFv7QEHp2/6aSHhDy7qJCU+GjOHZLZSumalpYYy8heXbQKqIhIB3LcwtzM/mVmw/yfuwErgRuBv5rZf7VRPhGRZouMMG4+ux8ri8tZuDHwGU72H6rmzVW7uHRENnHRka2YsGmTB2eworgsqIsliYhI6Gqqx7yvc26l//MNwFvOuYuBM6gv0EVEQt6lI7PJSIrl0fmbAr5mbkEx1XU+z4axHHHu4Pre+nfWajiLiEhH0FRh3nBljsnAawDOuQrA15qhRESCJTYqkhvH9eWDjaWsKCoL6Jrn8osYlp3MkO7JrZyuaf0zEunVtRNvr1ZhLiLSETRVmBea2bfM7FJgJPBvODpdYuuvSy0iEiTXnNGLpLiogHrNVxaXsXpHOV/2uLcc/KuADs5k4aY9HKqu9TqOiIi0sqYK85uAocD1wJcbLDI0BniylXOJiARNUlw0147pzesrd7C19GCTbZ/LLyQmKoJLTstuo3RNmzI4g+paHws26L17EZH27riFuXNut3PuFufcNOfcmw2Ov+ec+3VLH2xmXc3sLTPb4P+zy3HazfS32WBmMxscn2dm68xsqX/L8B+PNbNnzWyjmX1iZn1amlVEwt8NZ/UhKjKCWQs2H7dNZU0dcwuKuWBYFimdQuMXg6P7diUpLkqrgIqIdAABTZfYSr4HvOOcGwC849//HDPrCvyY+hdOTwd+fEwBf41zbrh/OzKn2E3APudcf+C3wC9b80uISHjISIrjspE9eGFxEbsrGp/l5I1VOymvrPX8pc+GoiMjmJibwbtrd+NrxkJJIiISPrwszKfxnxVEnwamN9LmPOpng9nrnNtH/aqj55/EfV8AJpuZBSGviIS5m8/uR02dj6cWbm30/HP5hfTsGs+Z/VLbNtgJTBmcQemBapYW7T9xYxERCVteFuaZzrkjy/HtBBpbxSMbKGywX+Q/dsST/mEsP2xQfB+9xjlXC5QBX/hb1sxuNrN8M8svKSlp4VcRkXDQNy2BC4Zl8dePt1FRWfO5c4V7D7Fw4x6uGNWTiIjQ+ll+4sAMIiNMs7OIiLRzJyzMzWygmb1jZiv9+6ea2d2B3NzM3jazlY1s0xq2c/VL8p3s72ivcc6dAoz3b9edzMXOuVnOuTznXF56evpJPlpEwtUtE3KoqKxl9qeffe7484uLMIPLRvXwKNnxpXSK5vQ+XbUKqIhIOxdIj/ljwPfxz2vunFsOXBXIzZ1zU5xzwxrZXgJ2+VcUPbKyaGN/4xQDDQd79vAfwzl35M8K4B/Uj0H/3DVmFgWkAIEv+Sci7dqpPTpzVv9UHl+wharaOgDqfI4X8gsZPyCd7M7xHids3OTBGazbVUHh3kNeRxERkVYSSGHeyTn36THHgjGh7svAkVlWZgIvNdLmDWCqmXXxv/Q5FXjDzKLMLA3AzKKBi4Ajq5Q2vO/lwLv+HnkREaC+13x3RRVzC4oBWLixlO1llVyZF3q95UecO6R+tN/bmp1FRKTdCqQwLzWzHPxDTczscmBH05cE5BfAuWa2AZji38fM8szscQDn3F7gXmCRf7vHfyyW+gJ9ObCU+l7yx/z3fQJINbONwF00MtuLiHRs4/qnMbR7Mn9+fzM+n+PZ/EI6d4o+WvyGot6pCfTPSFRhLiLSjkUF0OZ2YBYwyMyKgS3AtS19sHNuDzC5keP5wNca7P8F+MsxbQ4Co45z30rgipbmE5H2y8y4ZUIO35pdwPOLC3lr1S6+ckYvYqMivY7WpCmDM3l8wWbKK2tIjguNedZFRCR4Tthj7pzb7JybAqQDg5xz45xzW1s9mYhIK7pgWBa9unbih3NXUV3nC6m5y49nyuAMan2O+es0k5SISHsUyKws95tZZ+fcQedchX+8931tEU5EpLVERUbw9bP7UV3n45TsFIZ0T/Y60gmN6NWFrgkxWgVURKSdCmSM+QXOuaOrWvgX+rmw9SKJiLSNK0b1IK93F26dmON1lIBERhiTcjN4b10JtXU+r+OIiEiQBVKYR5pZ7JEdM4un/uVLEZGwFhcdyQu3juXCU7p5HSVg5w7JoOxwDfnb9nkdRUREgiyQwvzvwDtmdpOZ3QS8xX+WvBcRkTY0fkA6MZERWgVURKQdCuTlz18CPwMG+7d7nXMPtHYwERH5ooTYKM7MSeXtNbvQEg0iIu1LID3mOOded879t397o7VDiYjI8U0ZnMHWPYfYVHLQ6ygiIhJEgczKMsPMNphZmZmVm1mFmZW3RTgREfmiyYPrF0LS7CwiIu1LID3mDwCXOOdSnHPJzrkk51zozysmItJOde8cz5BuyVoFVESknQmkMN/lnFvT6klERCRgU4ZksnjbPvYerPY6ioiIBEkghXm+mT1rZlf7h7XMMLMZrZ5MRESOa8rgDHwO3lu72+soIiISJIEU5snAIWAqcLF/u6g1Q4mISNOGdU8hMzlWw1lERNqRqBM1cM7d0BZBREQkcBERxjmDMnl5aTFVtXXERkV6HUlERFookFlZBprZO2a20r9/qpnd3frRRESkKecOyeBgdR0fb97rdRQREQmCQIayPAZ8H6gBcM4tB65qzVAiInJiY3PSiIuO0LSJIiLtRCCFeSfn3KfHHKttjTAiIhK4uOhIxg9I5+3VWgVURKQ9CKQwLzWzHMABmNnlwI5WTSUiIgGZMjiD7WWVrNlR4XUUERFpoUAK89uBPwODzKwY+C/gllZNJSIiATlnUCZmaHYWEZF2oMnC3Mwigducc1OAdGCQc26cc25bm6QTEZEmpSfFclqPzhpnLiLSDjRZmDvn6oBx/s8HnXP6XamISIg5d0gmy4rK2FVe6XUUERFpgUCGshSY2ctmdp1W/hQRCT2TB2cA8K5WARURCWuBFOZxwB7gHLTyp4hIyMnNTKJHl3jeXq3hLCIi4Uwrf4qIhDkzY8rgTGZ/+hmHq+uIj9EqoCIi4Ugrf4qItANTBmdSVevjg42lXkcREZFm0sqfIiLtwOl9u5IUG6XZWUREwphW/hQRaQdioiI4Ozedt9fsxufTKqAiIuFIK3+KiLQTUwZnUHqgiuXFZV5HERGRZjjhy5/Ur/w5i/+s/LkFuLZVU4mIyEmblJtBZITx4JvrmDEym2HdU+iXnkhkhHkdTUREAhDIrCybgSlmlgBEaJEhEZHQ1LlTDFef3pPn84tYsKH+JdD46EgGd0tiWHYKw7qnMDQ7mQEZScREBfILUxERaUvmXNNjEc0sFrgM6EODQt45d0+rJmtDeXl5Lj8/3+sYIiJBUVvnY1PJQVYWl7FyexmristZvaOcA1X1rwfFREaQm5XEsOxkhnZPYWj3ZAZ3SyYuWtMsioi0NjNb7JzLa+xcIENZXgLKgMVAVTCDiYhI8EX5C+/crCQuG9UDAJ/PsW3voc8V66+v3MnsTwsBiIww+qcnMjQ7mWHdUxjRqzPDe3bGTMNgRETaSiA95iudc8PaKI8n1GMuIh2Rc47i/YdZWVzO6u1lrNxezsriMnZX1PfB9EtP4KrRPblsZA9SE2M9Tisi0j401WMeSGE+C3jIObeiNcKFAhXmIiL/sbu8kvc3lPLMp5+Rv20f0ZHG1CFZXHV6T87KSSNCL5OKiDRbswpzM1tB/RSJUcAAYDP1Q1kMcM65U1snbttTYS4i0rgNuyqY/WkhLxYUsf9QDT27xnPV6F5cMaoHGclxXscTEQk7zS3Mezd1U+fctiBkCwkqzEVEmlZZU8cbq3byzKeFfLR5D5ERxjmDMrj69J5MGJihKRlFRALUoqEs/hucBoz37y5wzi0LYj7PqTAXEQncltKDPLPoM/65uIjSA9V0S4njiryefHl0T7I7x3sdT0QkpLV0jPmdwNeBF/2HLgVmOeceCmpKD6kwFxE5edW1Pt5Zs4vZiwpZsKEEgAkD07lqdC8mD84gOlJzpYuIHKulhfly4Ezn3EH/fgLwkcaYi4jIEYV7D/F8fiHP5Rexs7yS9KRYLh/Vg6+N66sZXUREGmiqMA+kO8OAugb7df5jIiIiAPTs2om7pubywXcn8fhX8zitRwp/nr+J83+/4GhvuoiINC2QBYaeBD4xszn+/enAE60XSUREwlVUZARThmQyZUgma3aUc8fsAq574lO+cXY/vjM1l5goDW8RETmeE/4f0jn3G+AGYK9/u8E597vWDiYiIuFtcLdkXv7mOL5yRi/+/P5mLn/0Q7aUHvQ6lohIyDpuYW5mo83sAgDn3BLn3B+cc38AupnZqDZLKCIiYSs+JpL7Lz2FR68dybY9h7joDwv45+IiApkRTESko2mqx/yXwOpGjq8CftU6cUREpD06f1g3Xr9zPEOzU/jO88v4r2eXUlFZ43UsEZGQ0lRhntTYIkL+Y2kteaiZdTWzt8xsg//PLsdpN9PfZoOZzfQfSzKzpQ22UjP7nf/c9WZW0uDc11qSU0REgqd753hmf30M3zl3IP9avoML/7CAJZ/t8zqWiEjIaKowb7RY9uvUwud+D3jHOTcAeMe//zlm1hX4MXAGcDrwYzPr4pyrcM4NP7IB2/jPHOsAzzY4/3gLc4qISBBFRhjfmjyA574xBp8Prnj0I/743kbqfBraIiLSVGH+tpn9zMyOTo1o9e4B3m3hc6cBT/s/P039TC/HOg94yzm31zm3D3gLOL9hAzMbCGQAC1qYR0RE2tCo3l157c7xXDAsi1+9sY5rH/+EnWWVXscSEfFUU4X5d4B+wEYz+6eZ/RPYAAwE7mrhczOdczv8n3cCmY20yQYKG+wX+Y81dBX1PeQNu1ouM7PlZvaCmfU8XgAzu9nM8s0sv6REc+yKiLS1lPhoHrp6BA9cdipLC/dz/u/f581VO72OJSLimePOY+5f6fNqM+sHDPUfXuWc2xzIjc3sbSCrkVM/OOY5zsya+zvMq4DrGuy/Asx2zlWZ2Teo740/p7ELnXOzgFlQv/JnM58vIiItYGZcObono/p04Y7ZBdz818VcN6Y3P/jSYOKiI72OJyLSpk64wJC/EA+oGD/muinHO2dmu8ysm3Nuh5l1A3Y30qwYmNhgvwcwr8E9TgOinHOLGzxzT4P2jwMPnGxuERFpeznpibx421h+9e91PP7BFj7dspc/XD2C3Kwkr6OJiLQZr5ZgexmY6f88E3ipkTZvAFPNrIt/1pap/mNHXA3MbniBv8g/4hJgTdASi4hIq4qNiuTui4bw1A2j2XOwikse/oC/frRVc56LSIfhVWH+C+BcM9sATPHvY2Z5ZvY4gHNuL3AvsMi/3eM/dsSVHFOYA3eY2SozWwbcAVzfqt9CRESCbmJuBq/feTZj+qXyw5dWcf2Ti1i7s9zrWCIirc6O1xPhn67wuI4pksNaXl6ey8/P9zqGiIg04PM5nvpwK799ez0HqmqZdlp3vn3uQHqnJngdTUSk2cxssXMur9FzTRTmWwAHWCOnnXOuX/AiekuFuYhI6Np/qJpH52/mqQ+3UFvnuHJ0T+44ZwBZKXFeRxMROWnNKsw7EhXmIiKhb3d5JQ+9u5HZn35GZIQxc2wfbp2QQ5eEGK+jiYgErLk95iObuqlzbkkQsoUEFeYiIuHjsz2H+N0765lTUExCTBRfH9+Pm8b3JTH2hBONiYh4rrmFuQ9YCZQeOdTgtHPONTo/eDhSYS4iEn7W76rgwTfX8caqXXRNiOG2iTlcO6a35j8XkZDW3ML8v4DLgTLgGWCOc+5Aq6X0kApzEZHwtaxwP79+cx0LNpTSLSWOOycP4PJRPYiK9GriMRGR42vRGHP/yp9XAdOAbcD9zrmlQU/pIRXmIiLh78NNpTzw73UsLdxP37QE7jp3IF86pRsREY3NYSAi4o2mCvMTdif4V/58CXgTOB0YGNx4IiIiLTc2J405t43lsa/mERMZwbdmF3DRQx/w3trdWqRIRMJCU0NZGvaUF1I/nOVV59zhtovXNtRjLiLSvtT5HP9avp3fvLWebXsOMbpPFx7+ykgykzXFooh4qyUvfy6nvre8nPo5zY9yzv0myDk9o8JcRKR9qqnz8Vx+Ife/uoZeqQk8940xJMVFex1LRDqw5g5luQeYA/iARCDpmE1ERCSkRUdGcM0ZvXnk2lFs2FXBrX9bQnWtz+tYIiKNCuTlzzTnXGmTjcKcesxFRNq/5/ML+Z8XljNjRDYPXnkaZnopVETaXrN6zM3sIjMrAZabWZGZjW21hCIiIq3siryefOfcgbxYUMyv3ljndRwRkS9oapm0+4Hxzrm1ZnYG8AAwoW1iiYiIBN83z+nP9rJKHpm3iW6d47luTG+vI4mIHNVUYV7rnFsL4Jz7xMw0rlxERMKamXHvtKGUVFTy45dWkpkUy9ShWV7HEhEBmn75M8PM7jqyNbIvIiISdqIiI/jD1SM4pUdnvjW7gMXb9nkdSUQEaLowf4zPz8Jy7L6IiEhY6hQTxV9m5tEtJY6vPb2IzSUHvI4kInLiWVk6As3KIiLSMW3bc5AZj3xIp9hI/nnrWDKStACRiLSupmZlOe4YczP7URP3dM65e1ucTERExEO9UxP4y/WjuWrWx9z0VD7P3DyGhNimXr8SEWk9TQ1lOdjIBnAT8N1WziUiItImTuvZmYe/MoJV28u47e9LqKnTAkQi4o3jFubOuQePbMAsIB64AXgG6NdG+URERFrd5MGZ/OzSU5i/voT/9+IKNMxTRLzQ5O/rzKwrcBdwDfA0MNI5p9fXRUSk3bn69F7s2H+YP7y7kW6d47nr3IFeRxKRDqapMea/AmZQ31t+inNOr6yLiEi79u1zB7KjrJI/vLOBbilxXH16L68jiUgH0lSP+XeAKuBu4AdmduS4Uf/yZ3IrZxMREWlTZsb9M05hd0UVd89dSWZyLOcMyvQ6loh0EE2NMY9wzsU755Kcc8kNtiQV5SIi0l5FR0bwyDUjGdwtidv/XsCywv1eRxKRDqKpWVlEREQ6pITYKP5y/WhSE2O48alFbC09eOKLRERaSIW5iIhIIzKS4nj6xtPxOcf1T37KngNVXkcSkXZOhbmIiMhx5KQn8vjM0ewoq+TGp/M5VF3rdSQRacdUmIuIiDRhVO8u/OHqEawo2s8NTy5i38FqryOJSDulwlxEROQEzhuaxW+/PJyCz/Yz/ZGFbNytGYRFJPhUmIuIiARg2vBsZt88hoNVtVz6yEIWbCjxOpKItDMqzEVERAI0qncX5t5+Ftmd47n+yUX830dbvY4kIu2ICnMREZGT0KNLJ164dSwTB6bzo5dW8aOXVlJb5/M6loi0AyrMRURETlJibBSzvprHzWf34/8+2sYNTy2i7HCN17FEJMypMBcREWmGyAjj/104mAcuO5WPN+9hxiMLtRCRiLSICnMREZEWuHJ0T/560xnsOVjN9EcW8vHmPV5HEpEwpcJcRESkhcb0S+Wl288iNSGGax//hGcXfeZ1JBEJQyrMRUREgqB3agJzbj+LM3NS+e4/V/CzV1dT53NexxKRMKLCXEREJEiS46J58vrRXD+2D48t2MLN/5fPgapar2OJSJhQYS4iIhJEUZER/OSSodw7fRjz1pdw2SMfUrj3kNexRCQMqDAXERFpBdeN6c3TN5zOjrLDTP/jQhZv2+t1JBEJcSrMRUREWsm4AWnMuf0skuOjuXrWJ7y4pMjrSCISwqK8DiAiItKe5aQnMue2sdz6tyXc9dwyFm/bx6jeXchKiSMrOY6slDg6xeivYxEBc05vjOfl5bn8/HyvY4iISDtWU+fjJy+v4u+ffHEqxeS4KLqlxH+uWO+WEkem/8+s5DhS4qMxMw+Si0gwmdli51xeo+e8KszNrCvwLNAH2Apc6Zzb10i7/9/enUdXVd77H39/MxAghAAhhFkGGUQmMeAsoKhobbXVK461iqU41Wtbh97bdW/b322r9VZbrRMOFVscsLW1dcAioqhYMSACykwYDRkYQyCBJN/fH2fjDZiBJOdkn5DPa62zss8env09z9oLPnnynL1nAScD77v7hVXW9wVeADKAhcA17r7fzFKAZ4ETgW3AJHdfX1stCuYiItJU9u2vYOvuUvJ27SN/dyl5u0rZevC1O/KzcE8Zh//33Do5gW7pbchqn0L39DZcMKwbZw3uQkKCwrpIcxKvwfzXwHZ3v8fM7gY6uvtd1ex3NtAW+N5hwXwm8LK7v2BmjwGfuvujZnYTMNzdp5rZ5cA33X1SbbUomIuISDw5UFFJQXHZl4G9aojP311KblEJRXv2M6BLO6ac2Y+LRvagVZK+NibSHMRrMF8JjHP3PDPrBrzj7oNq2Hcc8KODwdwif8srBLq6e7mZnQL81N3PM7M3g+UPzSwJ2Apkei0fVMFcRESakwMVlby+NI9H31nLiq3FdEtvzeTT+3L5mN60S9F8dZF4VlswD/PX6yx3zwuWtwJZ9Tg2A9jp7gef2rAZ6BEs9wA2AQTbdwX7H8LMpphZjpnlFBYWNqR+ERGRUCQnJnDRyB68cdsZPHPdaPpkpPI/ry3n1F/N4b43V1BYXBZ2iSLSADH9tdrM3gK6VrPpP6u+cXc3syYdunf3acA0iIyYN+W5RUREosHMGDeoC+MGdWHxpp08/u5aHnlnLU+8l8ulJ/Zkyhn96NM5NewyReQIxTSYu/uEmraZWb6ZdasylaWgHk1vAzqYWVIwKt4T2BJs2wL0AjYHU1nSg/1FRESOWiN7deDRq08kt6iEafPW8eeFm3lhwUbOH9qNqWP7M6xnetglikgdwpzK8nfg2mD5WuCVIz0wmC8+F7i0muOrtnsp8HZt88tFRESOJn07p/Krbw3j/bvGM3Vsf+atLuTrv3+fK5/4F/NWFaL/EkXiV5hf/swAZgK9gQ1Ebpe43cyyganufkOw33vAYKAdkZHvye7+ppn1I3K7xE7AJ8DV7l5mZq2BPwInANuBy919XW216MufIiJytCouPcDzCzbyU7a2kgAAHFBJREFU1Pu55O8uY0i39nxvbD++NqwbSYm6k4tIU4vLu7LEEwVzERE52pWVV/DK4i94/N21rC0soWfHNvznBcdx/rBuYZcm0qLE611ZREREpImkJCVyWXYvZt8+lie+nU1a62Run7mYrbtKwy5NRAIK5iIiIi1IQoJxzpAspl1zIhWVzm/fWhV2SSISUDAXERFpgXp1asvVJx/DzJxNrCkoDrscEUHBXEREpMW6ZfyxtG2VxK9nrQy7FBFBwVxERKTFymiXwtSx/fjn5/nkrN8edjkiLZ6CuYiISAt2/el9yUxL4Z43Vuge5yIhUzAXERFpwdq2SuLfJwwgZ8MO3lpen4dwi0i0KZiLiIi0cJOye9Gvcyq/nrWC8orKsMsRabEUzEVERFq4pMQE7pw4iNUFe/jLos1hlyPSYimYi4iICOcd35UTenfggdmr2be/IuxyRFokBXMRERHBzLh74mC27i7lmfnrwy5HpEVSMBcREREATuqXwdmDu/DIO2vYUbI/7HJEWhwFcxEREfnSnRMHU1JWziPvrAm7FJEWR8FcREREvjSoaxqXjOrJ9Pkb2Lxjb9jliLQoCuYiIiJyiNvPGQgGD8xeHXYpIi2KgrmIiIgconuHNlx3ah9e/mQzy/N2h12OSIuhYC4iIiJfceO4/qSlJPHrWSvCLkWkxVAwFxERka/o0LYVN48/lrkrC/lw7baYnmvv/nIqKj2m5xBpDhTMRUREpFrXntqHbumtuWfWCtxjE5znrizg5F/O4Zz73+WNpXkxO49Ic6BgLiIiItVqnZzI7ecM5NNNO3lj2daotl1Z6Tw4ZzXXP/Mx3Tu0ITHBuHHGIr75yHw+WhfbEXqReKVgLiIiIjW6ZFRPBma14743V3KgojIqbe4uPcCUPy7k/tmruHhkD/5602m8cdsZ3HvJMPJ27WPStH8x+ZmPWZVfHJXziTQXCuYiIiJSo8QE466Jg8ktKuHFjzc1ur3V+cVc/PsPeGdlAT/9+hDuv2wEbVolkpSYwKTRvXnnR+O5c+IgFqzfzsTfzuOOlz4lb9e+KHwSkfhnmssF2dnZnpOTE3YZIiIiccndmfT4v1hXVMK7d4wjNSWpQe28vjSPH730KW1bJfLwlaM4qV9GjfvuKNnPw3PX8OyHGzCD607ry43j+pPeJrmhH0MkLpjZQnfPrm6bRsxFRESkVmbG3RcMpmhPGU+9n1vv4ysqnXveWMFNMxYxqGsar956Rq2hHKBjait+cuEQ5vxwLBcM68bj89Zy5q/n8sS8dZQeqGjoRxGJawrmIiIiUqdRvTsy8fiuPP7uWrbtKTvi43aU7Ofapxfw2LtrufKk3rww5WS6prc+4uN7dWrLA5NG8uqtpzOiVwd+8fpyzv7Nu7y8aLNusShHHQVzEREROSJ3TBxEaXklD7295oj2X7ZlFxc+9D4Lcrdz7yXD+OU3h5GSlNigcx/fPZ1nrx/DjBtOomNqMj+Y+Slfe/A93llZoFssylFDwVxERESOSP/MdlyW3YsZH21gw7aSWvd9edFmLnl0PpXuzJx6CpNG945KDacd25m/33w6D15xAiX7y/nOHz7mqic/YunmXVFpXyRM+vIn+vKniIjIkSrYXcrY+97hnCFZPHjFCV/ZfqCikv959XOmf7iBk/t14vdXjqJzu5SY1LK/vJIZH23gobfXsL1kP2MHZjKke3v6ZqTSp3MqfTq3JbNdCmYWk/OLNERtX/5s2NeqRUREpEXq0r41k0/vy+/nrmHKmf0Y2iP9y20FxaXcPGMRH6/fwQ2n9+Xu8weTlBi7P863SkrgutP6cumJPZk2bx2vLcnjgzVFlFeZe94uJYljMtrSp3MqfTNSOSajLX07R4J7RmorhXaJKxoxRyPmIiIi9bG79ABjfz2X47un86cbTgJg4YYd3PinhewuPcC9lwznopE9QqmtvKKSLTv3kVtUwvqiEtZv28v6bZHlTTv2HfKF0bSUpGBkPZW+B8N751SG9kgnOYa/UEjLphFzERERiZr2rZO59awB/PzVz5m3qpCN2/fys398Rrf0Nky/fgzHdWsfWm1JiQkck5HKMRmpMOjQbQcqKtm8Yx/ri0oiwX1bJLh/umknry35goOZPb1NMhOOy2Li0K6cMaAzrZMb9oVVkfrSiDkaMRcREamvsvIKzv7Nu+zce4A9ZeWMG5TJ7yadQHrb5vkAoP3llWzasZdVW4uZvTyftz7PZ3dpOamtEhk3uAvnD+3KuEFdaNfAhyuJHFTbiLmCOQrmIiIiDfHqki/4/vOfcMv4Y7ltwkASE46e+doHKir5cO02Zn22lX9+tpWiPftplZTAmQMymTi0K+ccl9VsfwmRcCmY10HBXEREpGFKyspJPcpHkSsqnYUbdvDGsjzeXLaVL3aVkpRgnNI/IxLSh2TRJe3IH5okLZuCeR0UzEVERORIuDtLNu9i1mdbmbVsK7lFJZjB6GM6cd7Qrkwc2pUeHdqEXabEMQXzOiiYi4iISH25O6vy9/DGsjxmLdvKiq3FAAzvmc7N44/lvOO7hlyhxCMF8zoomIuIiEhj5RaV8OZnW5mZs4n8XaXMu3M8GTF6uJI0X7UFc92kU0RERCQK+nZOZerY/ky7Jpt9Byp49J21YZckzYyCuYiIiEgUHdulHd8a1ZNn/7WBrbtKwy5HmhEFcxEREZEou+3sAbg7D729OuxSpBlRMBcRERGJsl6d2jJpdC9e/HgTG7ftDbscaSYUzEVERERi4NazBpCYYPx2zqqwS5FmIpRgbmadzGy2ma0OfnasYb9ZZrbTzF49bP0MM1tpZsvM7GkzSw7WjzOzXWa2OHj9V1N8HhEREZHDZbVvzbdPOYa/fbKFNQXFYZcjzUBYI+Z3A3PcfQAwJ3hfnfuAa6pZPwMYDAwD2gA3VNn2nruPDF4/j2LNIiIiIvVy47hjaZOcyAOzNddc6hZWML8ImB4sTwcurm4nd58DfOVXTHd/3QPAAqBnrAoVERERaahOqa2YfHpfXluax7Itu8IuR+JcWME8y93zguWtQFZDGgmmsFwDzKqy+hQz+9TM3jCz42s5doqZ5ZhZTmFhYUNOLyIiIlKnG87sR3qbZO6frbnmUruYBXMzeyuYA37466Kq+wWj3g19/OgjwDx3fy94vwg4xt1HAA8Bf6vpQHef5u7Z7p6dmZnZwNOLiIiI1K5962S+N7Yfb68oYOGGHWGXI3EsZsHc3Se4+9BqXq8A+WbWDSD4WVDf9s3sv4FM4AdVzrnb3fcEy68DyWbWOSofSERERKSBvnNqHzq3S+F/31wZdikSx8KayvJ34Npg+VrglfocbGY3AOcBV7h7ZZX1Xc3MguUxRD7ftqhULCIiItJAbVslcfP4/ny4bhsfrCkKuxyJU2EF83uAc8xsNTAheI+ZZZvZkwd3MrP3gJeAs81ss5mdF2x6jMi89A8Puy3ipcAyM/sUeBC4PJgqIyIiIhKqK0/qTff01tz35koUT6Q6pgsDsrOzPScnJ+wyRERE5Cj3woKN3P3yUp78djYThjTo3hfSzJnZQnfPrm6bnvwpIiIi0kQuObEnfTLa8r//XEllpQZH5VAK5iIiIiJNJDkxgdvPGciKrcW8tjSv7gOkRVEwFxEREWlCXx/enUFZaTwwexXlFZV1H9AIb6/I54ud+2J6DokeBXMRERGRJpSQYPzg3IGsKyrh5U+2xOQclZXOz//xOdc/k8PVT33EnrLymJxHokvBXERERKSJnTskixE90/ndW6spK6+IatulByq45flFPP1BLucP7cr6ohLu+vMS3QmmGVAwFxEREWliZsYPzx3Elp37ePHjTVFrd0fJfq5+8iNeX7qVn3ztOB65ahR3ThzMa0vz+MMH66N2HokNBXMRERGREJwxoDNj+nbiobfXsG9/40fNN23fyyWPzWfJ5l08dMUJ3HBGP8yM753Zj3OGZPHL15eTs357FCqXWFEwFxEREQmBmXHHeYMoLC7j2Q/XN6qtpZt38c1H5lNUXMYfJ4/h6yO6H3Ke//23EfTo2Iabn1tE0Z6yxhUuMaNgLiIiIhKS0X06MXZgJo++u5bi0gMNamPuygImTfuQlKQE/nLjqZzUL+Mr+6S3SebRq05k594DfP/5T6jQPdTjkoK5iIiISIh+eO5Adu49wFPv59b72Bc/3sgN03Pok5HKyzedyoCstBr3HdK9Pf/v4qHMX7uN+2evbEzJEiMK5iIiIiIhGt6zA+cdn8WT7+Wyo2T/ER3j7jwwexV3/WUpp/bPYObUU8hq37rO4y7L7sXlo3vx8Ny1zFme39jSJcoUzEVERERC9sNzB1Gyv5zH5q2tc98DFZXc+ecl/G7Oai49sSdPf2c07VKSjvhcP/3G8RzfvT23v7iYjdv2NqZsiTIFcxEREZGQDcxK46IR3Zk+fz0FxaU17renrJzJ03N4aeFmbjt7APddOpzkxPrFudbJiTx61YkA3PTcQkoPRPc+6tJwCuYiIiIiceDfJwzkQIXzyNzqR80Ldpcy6fEP+WBNEfdeMozbzxmImTXoXL0z2vLApJEs27Kbn/3js8aULVGkYC4iIiISB/p0TuWy7J4899FGtuzcd8i2NQXFfPOR+eQWlfDktdlMGt270ec7+7gsbhrXn+cXbOKlnOg95EgaTsFcREREJE7cetYAAB58a/WX6xbkbueSRz+krLySF6ecwvhBXaJ2vh+cM5BT+2fwk78t4/MvdketXWkYBXMRERGRONG9QxuuOrk3f160mdyiEl5bksfVT31ERrtW/PWmUxnWMz2q50tKTODBK06gQ9tkbpyxkF37GnYvdYkOBXMRERGROHLTuGNplZjADdM/5pbnFzG8Rzp/mXoqvTq1jcn5OrdL4eErR7Flxz7ueOlT3PXwobAomIuIiIjEkcy0FK47rQ9rC0uYeHxX/nTDSXRMbRXTc2b36cSPLziOf36ez7R562J6LqnZkd/0UkRERESaxG0TBjC6byfOHJBJYkLD7rxSX9ef1odFG3Zw76wVjOjVgZP7ZTTJeeX/aMRcREREJM6kJCUyflCXJgvlAGbGvZcOp0/nVG557hMKdtd8P/XmrLLSWbRxR9hlVEvBXEREREQAaJeSxGNXn0hJWTm3PPcJByoqwy4pqvaUlXPjjIVc+uh8lufF311oFMxFRERE5EsDs9L41beGsWD9du57c2XY5UTNusI9XPzwB7y1vID/uOA4BndNC7ukr9AccxERERE5xMUn9GDhhh1Mm7eOUb07MHFot7BLapS3V+Rz2wuLSUow/nj9GE49tnPYJVVLI+YiIiIi8hU/ufA4RvTqwB0vLSG3qCTschqkstJ5aM5qJk/PoXentvzj1tPjNpQDmO5VCdnZ2Z6TkxN2GSIiIiJxZcvOfVz44Hs40D+zHV3SUshq35rMtBS6pKXQpX3rL9d1bJuMWdN9WbUue8rK+eHMxbz5WT4Xj+zOr741nDatEsMuCzNb6O7Z1W3TVBYRERERqVaPDm14+jujmT5/Pfm7y1iVX8z7a4ooLi3/yr7JiUZmuxQyvwzrKXRJax0E+BS6tm/D4K5pJDTBnWbWFe5hyh8XkltUwk++dhyTT+8bV7801ETBXERERERqdELvjpzQu+Mh6/btr6CguJSC4jIKdpd9uZy/u5TC4jI2bttLzvrt7Nh74JDjBnRpx3fP6MdFJ3QnJSk2o9fNZT55dTSVBU1lEREREYmFsvIKCovLKCguY3V+Mc/M38DyvN10SUvhO6f14aqTjiG9TXJUzlVZ6Tw8dw33v7WKId3a8/g1J9KzY9uotB1NtU1lUTBHwVxERESkKbg7768pYtq8dby3uojUVolcPqY3153Wp1EhOl7nk1dHwbwOCuYiIiIiTeuzL3bxxLx1/GNJHgAXDu/Gd8/ox9Ae6fVqp+p88h+fPzju55MrmNdBwVxEREQkHFt27uMP7+fy/IKNlOyv4LRjM5hyZn/OHNC5zoBddT75w1eOahbzyRXM66BgLiIiIhKuXfsO8NxHG/nDB7kUFJcxuGsaU87sx9dHdCc58dBH7zSX+eTVUTCvg4K5iIiISHwoK6/glcVf8MS8dawu2EO39NZcd1ofrhjTm7TWyc1qPnl1FMzroGAuIiIiEl8qK513VxXy+Ly1/GvddtJSkpg0uhfvrCpsNvPJq6MHDImIiIhIs5KQYIwf3IXxg7uwZPNOHp+3jqc/yCW9TXKzuz/5kVIwFxEREZG4NrxnBx6+chRf7NxHq6QEOrdLCbukmFAwFxEREZFmoXuHNmGXEFMJde8iIiIiIiKxpmAuIiIiIhIHFMxFREREROKAgrmIiIiISBxQMBcRERERiQOhBHMz62Rms81sdfCzYw37zTKznWb26mHrnzGzXDNbHLxGBuvNzB40szVmtsTMRjXF5xERERERaaywRszvBua4+wBgTvC+OvcB19Sw7Q53Hxm8FgfrzgcGBK8pwKNRrFlEREREJGbCCuYXAdOD5enAxdXt5O5zgOJ6tvusR/wL6GBm3RpVqYiIiIhIEwgrmGe5e16wvBXIakAbvwimqzxgZgcf/9QD2FRln83Buq8wsylmlmNmOYWFhQ04vYiIiIhI9MQsmJvZW2a2rJrXRVX3c3cHvJ7N/xgYDIwGOgF31bc+d5/m7tnunp2ZmVnfw0VEREREoiopVg27+4SatplZvpl1c/e8YKpJQT3bPjjaXmZmfwB+FLzfAvSqsmvPYJ2IiIiISFwLayrL34Frg+VrgVfqc/DBeeNmZkTmpy+r0u63g7uznAzsqhLiRURERETiVsxGzOtwDzDTzCYDG4DLAMwsG5jq7jcE798jMmWlnZltBia7+5vADDPLBAxYDEwN2n0duABYA+wFrmu6jyQiIiIi0nAWmeLdsmVnZ3tOTk7YZYiIiIjIUc7MFrp7dnXb9ORPEREREZE4oBFzwMwKiUypaa46A0VhF3GUUt/Gjvo2dtS3saO+jR31beyob2OnIX17jLtXe0tABfOjgJnl1PQnEWkc9W3sqG9jR30bO+rb2FHfxo76Nnai3beayiIiIiIiEgcUzEVERERE4oCC+dFhWtgFHMXUt7Gjvo0d9W3sqG9jR30bO+rb2Ilq32qOuYiIiIhIHNCIuYiIiIhIHFAwFxERERGJAwrmzZyZrTezpWa22Mz0+NJGMLOnzazAzJZVWdfJzGab2ergZ8cwa2yuaujbn5rZluDaXWxmF4RZY3NkZr3MbK6ZfW5mn5nZbcF6XbeNVEvf6rptJDNrbWYLzOzToG9/Fqzva2YfmdkaM3vRzFqFXWtzU0vfPmNmuVWu25Fh19pcmVmimX1iZq8G76N63SqYHx3Gu/tI3aO00Z4BJh627m5gjrsPAOYE76X+nuGrfQvwQHDtjnT315u4pqNBOfBDdx8CnAzcbGZD0HUbDTX1Lei6bawy4Cx3HwGMBCaa2cnAvUT69lhgBzA5xBqbq5r6FuCOKtft4vBKbPZuA5ZXeR/V61bBXCTg7vOA7YetvgiYHixPBy5u0qKOEjX0rTSSu+e5+6JguZjIfxY90HXbaLX0rTSSR+wJ3iYHLwfOAv4crNd12wC19K1EgZn1BL4GPBm8N6J83SqYN38O/NPMFprZlLCLOQpluXtesLwVyAqzmKPQLWa2JJjqoukWjWBmfYATgI/QdRtVh/Ut6LpttGA6wGKgAJgNrAV2unt5sMtm9ItQgxzet+5+8Lr9RXDdPmBmKSGW2Jz9FrgTqAzeZxDl61bBvPk73d1HAecT+VPrmWEXdLTyyL1FNfIQPY8C/Yn8uTUP+E245TRfZtYO+Avw7+6+u+o2XbeNU03f6rqNAnevcPeRQE9gDDA45JKOGof3rZkNBX5MpI9HA52Au0IssVkyswuBAndfGMvzKJg3c+6+JfhZAPyVyD9wEj35ZtYNIPhZEHI9Rw13zw/+A6kEnkDXboOYWTKR4DjD3V8OVuu6jYLq+lbXbXS5+05gLnAK0MHMkoJNPYEtoRV2FKjStxODqVnu7mXAH9B12xCnAd8ws/XAC0SmsPyOKF+3CubNmJmlmlnawWXgXGBZ7UdJPf0duDZYvhZ4JcRajioHg2Pgm+jarbdgfuNTwHJ3v7/KJl23jVRT3+q6bTwzyzSzDsFyG+AcInP45wKXBrvpum2AGvp2RZVf1I3IHGhdt/Xk7j92957u3ge4HHjb3a8iytetnvzZjJlZPyKj5ABJwHPu/osQS2rWzOx5YBzQGcgH/hv4GzAT6A1sAC5zd32JsZ5q6NtxRKYDOLAe+F6VedFyBMzsdOA9YCn/N+fxP4jMhdZ12wi19O0V6LptFDMbTuRLcolEBghnuvvPg//TXiAy1eIT4OpghFeOUC19+zaQCRiwGJha5UuiUk9mNg74kbtfGO3rVsFcRERERCQOaCqLiIiIiEgcUDAXEREREYkDCuYiIiIiInFAwVxEREREJA4omIuIiIiIxAEFcxGROGNmbma/qfL+R2b20yi1/YyZXVr3no0+z7+Z2XIzm1tl3TAzWxy8tptZbrD8Vj3b/rmZTYh+1SIi4UqqexcREWliZcC3zOxX7l4UdjEHmVmSu5cf4e6Tge+6+/sHV7j7UiL3AMfMngFedfc/17cOd/+v+h4jItIcaMRcRCT+lAPTgNsP33D4iLeZ7Ql+jjOzd83sFTNbZ2b3mNlVZrbAzJaaWf8qzUwwsxwzW2VmFwbHJ5rZfWb2sZktMbPvVWn3PTP7O/B5NfVcEbS/zMzuDdb9F3A68JSZ3VfXh62ujYOfzcweMLPPzGyOmWUe3gdmNtrM5pvZp8FnTTOz44PlxcFnGVB3l4uIhE/BXEQkPj0MXGVm6fU4ZgQwFTgOuAYY6O5jgCeBW6vs1wcYA3wNeMzMWhMZ4d7l7qOB0cB3zaxvsP8o4DZ3H1j1ZGbWHbgXOIvISPhoM7vY3X8O5ABXufsdtRVcUxvB5lQgx92PB94l8sTYqse2Al4MahsBTAD2BX3wO3cfCWQDm2vtNRGROKFgLiISh9x9N/As8P16HPaxu+cFj4NeC/wzWL+USBg/aKa7V7r7amAdMBg4F/i2mS0GPgIygIMjzQvcPbea840G3nH3wmCKywzgzHrUW1cblUSCN8CfiIzCVzUIyHP3jyHSZ0EbHwL/YWZ3Ace4+7561iQiEgoFcxGR+PVbIiPZqVXWlRP8221mCUCrKtvKqixXVnlfyaHfKfLDzuOAAbe6+8jg1dfdDwb7kkZ9iug5vO7qd3J/DvgGkdHz183srJhWJSISJQrmIiJxyt23AzOJhPOD1gMnBsvfAJIb0PS/mVlCMO+8H7ASeBO40cySAcxsoJml1tYIsAAYa2adzSwRuILIlJP6qK2NBODgfPorgfcPO3Yl0M3MRgc1p5lZkpn1A9a5+4PAK8DwetYkIhIK3ZVFRCS+/Qa4pcr7J4BXzOxTYBYNG83eSCQQtwemunupmT1JZLrLIjMzoBC4uOYmwN3zzOxuYC6REffX3P2V+hRSRxslwBgz+wlQAEw67Nj9ZjYJeMjM2hAZIZ8AXAZcY2YHgK3AL+tTk4hIWMz9iP4yKCIi0qTMbI+7twu7DhGRpqKpLCIiIiIicUAj5iIiIiIicUAj5iIiIiIicUDBXEREREQkDiiYi4iIiIjEAQVzEREREZE4oGAuIiIiIhIH/j8QfywQBSZYMQAAAABJRU5ErkJggg==\n", 832 | "text/plain": [ 833 | "
" 834 | ] 835 | }, 836 | "metadata": { 837 | "needs_background": "light" 838 | } 839 | }, 840 | { 841 | "output_type": "display_data", 842 | "data": { 843 | "image/png": "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3x+E58LNO3lsylKe+eRrtu4qYXCnXC4f3J7+bZqEcv5E0LIQEREREalQdr00bh/enYLCrTzwXkEox3xyylJGPjWdNrmZjL9iQJmz0s1z6nHDSV2Ycv0QrjuxE3NWbOKshz/mjFFTeW/+GmrbRLBmrkVERERkj2vHzmbcrJWM/9UAuh1avSUaJaVR/vT6PJ76eDnHH5HH/ef0okF65VYj7ygqZeyMbxg9aQkrN+6gc4tsLhvcjpO755OaUjPmhSuauVa4FhEREZE9Nm4v4vj7JpGblcH4KwaQVsVAu3VXCVc++xkTF67l4h+34fqTupASsSrXUVwa5bXZ3zLqg69YXLiVVk3qc8mgdpzZpyX10hJ3RZPK0LIQEREREamURg3S+fOp3Zi3ajMPf/hVlfZduXEHZ4yayqTF67j9tO7898lHVCtYA6SlRBjeuyXvXDOI0ef3oWlmBjeNm8vAOyfy0AcFbN5ZXK3jJppmrkVERETkB6549jPe/XINr181kI552fvcfvY3G/nFmBnsLCrlofN68+MOuaHW4+58smQDD31QwOTF68jOSOWuM3pwUvf8UM9TGZq5FhEREZEquXVYVzIzUvjdS1/s846Kb89dxdmjPyYjNcIrl/8o9GANYGYc064pT488itevHMigjrm0b54V+nn2l8K1iIiIiPxA06wMbhnWlVnfbOSJKUvL3Mbd+ceHX3HpPz+jS34O4341gA6VmOXeX90ObciDI3ofkHNVlcK1iIiIiJRpWM9DOK5LHne/s5Cl675/F8Xi0ijXvzyHO95awCk98nnu4qNplpWRpEprDoVrERERESmTmfGX07qRnhrh9y9/QTRYHrJpezEXPD6NF2Z8w1VD2vP3c45M+hU8agqFaxEREREpV15OPW46+QimLd3AM58uZ/n6bZw2agrTl23g3rN68psTOhGp5hVB6qLKXc1bRERERA5aZ/ZtyWtffMsdby3gvn8tJurOP0cexVFtmya7tBpHM9ciIiIiUiEz46/Du2NmNKqfxrjLByhYl0Mz1yIiIiKyTy0bN+BfvzmWnPqplb6V+cFIPSMiIiIildKiYb1kl1DjaVmIiIiIiEhIFK5FREREREKicC0iIiIiEhKFaxERERGRkChci4iIiIiEROFaRERERCQkCtciIiIiIiFRuBYRERERCYnCtYiIiIhISBSuRURERERC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\n", 844 | "text/plain": [ 845 | "
" 846 | ] 847 | }, 848 | "metadata": { 849 | "needs_background": "light" 850 | } 851 | } 852 | ] 853 | }, 854 | { 855 | "cell_type": "markdown", 856 | "metadata": { 857 | "id": "lQB7L3Z7mZUX" 858 | }, 859 | "source": [ 860 | "## Run NMF for the Selected Number of Topics and Visualize" 861 | ] 862 | }, 863 | { 864 | "cell_type": "code", 865 | "metadata": { 866 | "id": "eMveATKxmXLT", 867 | "colab": { 868 | "base_uri": "https://localhost:8080/" 869 | }, 870 | "outputId": "b8346ee9-4f09-4884-e8ba-fe4d6e5a7eec" 871 | }, 872 | "source": [ 873 | " \n", 874 | "selected_number_of_topics = 10\n", 875 | "nmf_model = NMF(n_components=selected_number_of_topics, init='nndsvd', max_iter=max_iter).fit(term_document_matrix)\n", 876 | "nmf_W = nmf_model.transform(term_document_matrix)\n", 877 | "nmf_H = nmf_model.components_\n", 878 | "\n", 879 | "display_topics(nmf_H, nmf_W, vocab, documents, no_top_words, no_top_documents)" 880 | ], 881 | "execution_count": 21, 882 | "outputs": [ 883 | { 884 | "output_type": "stream", 885 | "name": "stdout", 886 | "text": [ 887 | "Topic 0:\n", 888 | "hold (3.24) hour (2.87) minute (1.06) try (0.33) reservation (0.31) + (0.29) min (0.27) count (0.24) change (0.22) unacceptable (0.17)\n", 889 | "869. @USAirways been on hold for over and hour now.\n", 890 | "1408. @USAirways @AmericanAir how do I get thru on hold over 3 hours ?\n", 891 | "997. @usairways I have been on hold for over 3 hours. Please help! http://t.co/tyXAZtMQ1U\n", 892 | "476. @USAirways anyone there to help? Still on hold...\n", 893 | "1226. @USAirways GF was on hold for 4 hours and call was dropped!!! HELP!!!!! Need a flight!!!\n", 894 | "774. @USAirways - been on hold for more than 2.5 hours - this after not getting through after 2 hours on hold this morning with no answer - help!\n", 895 | "1096. @USAirways on hold 2 hours 54 minutes. What's going on?\n", 896 | "1411. @USAirways how do I get thru on hold 3 hours 5 minutes . Is this normal ? My call is lost\n", 897 | "254. @USAirways Not good. On hold for over an hour. http://t.co/wSgYckCIIO\n", 898 | "1352. @USAirways @jtrexsocial 5 hours on hold ... Safe to say no one is working .\n", 899 | "Topic 1:\n", 900 | "service (1.63) customer (1.55) bad (0.44) experience (0.16) agent (0.11) terrible (0.11) provide (0.1) rude (0.1) line (0.1) nice (0.09)\n", 901 | "2866. @USAirways still crickets from customer service.\n", 902 | "1485. @USAirways nervous for flight tomrw out of key west not friendly customer service\n", 903 | "1178. @USAirways your customer service is atrocious.\n", 904 | "628. @USAirways is alright with me. Please give Scott F at BDL a bonus for excellent customer service\n", 905 | "2829. @USAirways customer service at its finest\n", 906 | "2314. @USAirways : its just a very bad customer service experience// can you help\n", 907 | "1098. @USAirways WORST customer service ever!!!\n", 908 | "1581. @USAirways enormous lines at customer service and two agents what kind of service is that .. http://t.co/ffanixJhwh\n", 909 | "2857. @USAirways How can I change without penalty and not have to call customer service\n", 910 | "1764. @USAirways worst customer service experience ever today. Get it together.\n", 911 | "Topic 2:\n", 912 | "need (2.57) travel (0.34) change (0.33) home (0.26) tell (0.22) asap (0.21) ticket (0.21) problem (0.17) book (0.16) people (0.16)\n", 913 | "1336. @USAirways obviously your corporate definition of PATIENCE needs to be reviewed.\n", 914 | "#Pleasehurryup #answerphone #reschedulemyflight\n", 915 | "1997. @USAirways @AmericanAir I'm in the #finalstretch to #chairman #execplat #mileagerun for 6k needed any suggestions? #letsgo!\n", 916 | "1503. @USAirways If I am traveling with an infant in my lap, is there anything I need to do to notify you?\n", 917 | "1106. @USAirways needs to hire more people http://t.co/3LPVFhKy2F\n", 918 | "2552. @USAirways I don't need to rebook I need to know the policy\n", 919 | "2393. @USAirways thanks! Now I just need to locate where my luggage is!\n", 920 | "1226. @USAirways GF was on hold for 4 hours and call was dropped!!! HELP!!!!! Need a flight!!!\n", 921 | "851. @USAirways your IVR hung up on me because of high call volume? I need help. Call me\n", 922 | "1707. @USAirways @stephenrodrick Your team needs to build capacity\n", 923 | "1251. @USAirways and at this point I don't need sorry, I need a revers agt to pick up the call so maybe we can make the 11:30 flight today\n", 924 | "Topic 3:\n", 925 | "cancel (1.59) flightle (1.16) flight (0.79) flighted (0.26) dca (0.19) rebook (0.19) amp (0.18) home (0.11) reschedule (0.11) hotel (0.1)\n", 926 | "1061. @USAirways flights to Dfw Cancelled Flightled today?\n", 927 | "616. @USAirways will all flights out of DFW be Cancelled Flightled today?\n", 928 | "609. @USAirways Discovered our flight was Cancelled Flightled yesterday at 3:30PM - @americanairlnes finally notified us our flight was Cancelled Flighted at 0316 AM\n", 929 | "1015. @USAirways Just Cancelled Flight every flight I have why don't you.\n", 930 | "1124. @USAirways Cancelled Flightled my flight then put me on a flight the next day.I need help from somebody other than a robot. PLEASE!!! Much appreciated\n", 931 | "2240. i wish i was flying @USAirways ... @JetBlue Cancelled Flightled our flights tomorrow and never notified us #FlyUS #Ripoff\n", 932 | "2767. @USAirways you Cancelled Flightled both my flights and refused to give a voucher despite no flights for 2days. @USAirways #neveragain\n", 933 | "1372. @USAirways 4 hours . How do I change my flight that was Cancelled Flightled ?\n", 934 | "2859. @USAirways They charged me for a flight they Cancelled Flightled, unbelievable and unheard of\n", 935 | "1640. @USAirways DCA to RSW at 8:30am Cancelled Flightled. Rebook to Charlotte Cancelled Flightled. Can we rebook selves online???\n", 936 | "Topic 4:\n", 937 | "delay (2.24) miss (0.54) connection (0.45) flight (0.25) connect (0.2) clt (0.15) go (0.13) charlotte (0.13) way (0.12) voucher (0.09)\n", 938 | "986. @USAirways 3818 delayed. blue skies all over. #whyisusairALWAYSDELAYED???\n", 939 | "2330. @USAirways delays to the max\n", 940 | "1954. @USAirways what is the damn delay????\n", 941 | "2116. @USAirways 4420 delayed further?\n", 942 | "750. @USAirways you're really fudgin up with all these delays 😡 #justwantmybed\n", 943 | "728. @USAirways you are absolutely terrible at managing these delays... Been delayed and undelayed and delayed 6 times now. 10 AM office hours.\n", 944 | "498. @USAirways now my rebooked connection is delayed.\n", 945 | "1400. @USAirways pullin some sh** delaying flights again... Smh @OBJ_3 http://t.co/Av2rfFHMcV\n", 946 | "374. @USAirways 4 great flights with no delays! Thank you!\n", 947 | "1099. @USAirways Three hour delay from Miami to London. None of the other flights today are delayed. Put me on another flight!\n", 948 | "Topic 5:\n", 949 | "time (2.03) fly (0.9) airline (0.51) bad (0.46) good (0.26) guy (0.23) experience (0.2) $ (0.12) follow (0.11) lose (0.11)\n", 950 | "704. @USAirways Thank you. I'll do that next time!\n", 951 | "238. @usairways US1799 CLT->SFO in first no desert, no snack basket. Incoming was on time ? What’s up?\n", 952 | "2064. @USAirways I already HAVE, four times\n", 953 | "2423. @USAirways surprisingly quick response time by you and them. Thanks!\n", 954 | "1557. @USAirways you are cutting into my pregame time. Go @KentuckyMBB !!!!\n", 955 | "710. @USAirways Has To Be THE WORST Airline Of All Time😡😡😡\n", 956 | "276. @USAirways every single time i fly you guys i am delayed at least 30 minutes. Every time. On flight 5612 out of #CLT to nola.\n", 957 | "1331. @USAirways so how about some help with suggested time I could call to avoid such long wait time\n", 958 | "1854. @USAirways it's vegas baby who doesn't have a good time in vegas lol\n", 959 | "2388. @USAirways it is just bad practice and I am disappointed that your airline was not prepared...honestly the last time I fly with you guys\n", 960 | "Topic 6:\n", 961 | "plane (1.86) gate (1.03) sit (0.96) agent (0.32) go (0.31) leave (0.3) hour (0.25) let (0.24) clt (0.23) issue (0.22)\n", 962 | "2034. @USAirways 3935. Sitting on a freezing bus because nobody is in the plane. What is up?\n", 963 | "1790. @usairways and @american please get my plane together before I go to Jetblue\n", 964 | "2307. @USAirways #flight4592 LET US OFF THIS PLANE!!! please go to a gate. This is absurd.\n", 965 | "1088. @USAirways all these planes sitting here and no one going home. #usairwaysfail http://t.co/jN3V3k3qGv\n", 966 | "1480. @USAirways the plane crew has been as professional and courteous as the gate agents were flustered.\n", 967 | "2886. @USAirways I did and it's been a disaster. You had me sitting on the runway only to bring the plane back to the gate smh\n", 968 | "1525. @USAirways sitting on a plane in Philadelphia for over 20 minutes waiting just to get off the plane. Great service!\n", 969 | "1626. @USAirways how long are you going make us sit in this plane while they repair it? Could I at least get a beer???\n", 970 | "2015. @USAirways Why were we loaded onto the plane (4 hours Late Flight, mind you), made to sit for 40 minutes\n", 971 | "1845. @USAirways #2066. Was on plane from PBI to CLT and knew about the frozen water. Also saw a plane to NYC take off at the gate next door!\n", 972 | "Topic 7:\n", 973 | "wait (1.93) luggage (0.28) phone (0.25) min (0.25) gate (0.18) hrs (0.15) minute (0.14) long (0.14) line (0.14) people (0.12)\n", 974 | "2144. @USAirways still waiting on a response\n", 975 | "1767. @USAirways still waiting #brokenpromises #notnice #neveragain #tellyourstory\n", 976 | "1349. @USAirways still waiting on your reps to show. Now 40 mins into waiting in below freezing weather waiting for a cab.\n", 977 | "847. @USAirways we've been waiting at the gate for 2 hrs, why are we now waiting to stow the luggage?\n", 978 | "2711. @USAirways I've been waiting for the callback for EIGHT HOURS. HOW MUCH LONGER?!\n", 979 | "662. @USAirways three hour wait and counting waiting for reservations on the phone. Are you serious!?\n", 980 | "1143. @USAirways I waited customer service 32 minutes on the phone w/o response. Had to hung up in the end since my battery died due to waiting!\n", 981 | "841. @USAirways where's our luggage? Been waiting more than an hour! Flight 2118.\n", 982 | "2081. @USAirways flight 1777 has been waiting for 30 minutes at RSW waiting for weight balance clearance. Come on, let us leave!\n", 983 | "2643. @USAirways a flight update doesn't help when we are waiting 20+ min at our arrival waiting for a plane to leave our gate. Who can I write?😑\n", 984 | "Topic 8:\n", 985 | "bag (1.78) check (0.58) lose (0.45) amp (0.29) baggage (0.22) luggage (0.21) find (0.2) like (0.19) claim (0.17) night (0.15)\n", 986 | "988. @USAirways where are my bags?\n", 987 | "1574. @USAirways #SOS WHERE IS MY BAG ?\n", 988 | "885. @USAirways @AuroraBIZ check your bag, @PHLAirport bag handlers broke into my suitcase and stole my camera, bag was returned in a trash bag\n", 989 | "2425. @USAirways strikes again...lost bags. And two of them. #theworst\n", 990 | "2443. @USAirways I've done everything. Still no luck in finding my bag. I don't understand how my bag could have been misplaced. Very upsetting.\n", 991 | "401. @USAirways so it's a $25.00 bag fee for a golf bag on a domestic flight?\n", 992 | "1394. @USAirways it was your fault the flight was delayed to begin with. I shouldn't have to check my bag if there's a bunch of space\n", 993 | "2572. @USAirways @BohnJai they lost my bag @PHL baggage handlers broke open my bag and stole my camera\n", 994 | "1570. @USAirways @AmericanAir WHERE IS MY BAG ?#SOS ITIS BEING LOST FOR MORE THAN 24 HOURS ! #POORCUSTUMERSERVICE\n", 995 | "2429. @USAirways you can't even track my bag to see where it is. It's like it's disappeared.\n", 996 | "Topic 9:\n", 997 | "day (1.03) get (0.72) phone (0.62) try (0.59) call (0.35) work (0.34) book (0.34) late (0.33) mile (0.32) reservation (0.28)\n", 998 | "1016. @usairways Is your reservation phone number working? Called 10x in the last 3 days, and haven’t gotten through.\n", 999 | "2820. @USAirways Haha - that will indeed be a great day!\n", 1000 | "2215. @USAirways #tbt every day.\n", 1001 | "1033. @USAirways with this livery back in the day. http://t.co/EEqWVAMmiy\n", 1002 | "2536. @USAirways for a response in 3-4 days? No thanks\n", 1003 | "2811. @USAirways Thank you so much its been a very stressful day\n", 1004 | "1852. @USAirways I've tried calling 3 times the past 3 days and I keep getting told to call back. SOMEONE PLEASE HELP ME\n", 1005 | "1994. @USAirways I have been trying to book a flight using my miles for 3 straight days. 210 min on phone - still haven't talked to a human.\n", 1006 | "2507. @USAirways I've been trying for DAYS! And I don't get hung up on until after I get through all the prompts. What am I to do??\n", 1007 | "714. @USAirways .... I've been trying to get through to book a reservation and the system will not let me through. Day 3 #ridiculous\n" 1008 | ] 1009 | } 1010 | ] 1011 | } 1012 | ] 1013 | } --------------------------------------------------------------------------------