From 413ac81914abccfff1acca0f56e93a5cdf3be10d Mon Sep 17 00:00:00 2001 From: Jitin Kapila Date: Sun, 2 Aug 2020 15:32:52 +0530 Subject: [PATCH 1/2] Added spacy en_core_web_sm model download in Ch03 --- ..._DocVectors_using_averaging_Via_spacy.ipynb | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/Ch3/07_DocVectors_using_averaging_Via_spacy.ipynb b/Ch3/07_DocVectors_using_averaging_Via_spacy.ipynb index 8077d36..75eb933 100644 --- a/Ch3/07_DocVectors_using_averaging_Via_spacy.ipynb +++ b/Ch3/07_DocVectors_using_averaging_Via_spacy.ipynb @@ -14,7 +14,17 @@ }, { "cell_type": "code", - "execution_count": 0, + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# downloading en_core_web_sm, assuming spacy is already installed\n", + "!python -m spacy download en_core_web_sm" + ] + }, + { + "cell_type": "code", + "execution_count": null, "metadata": { "colab": {}, "colab_type": "code", @@ -371,7 +381,7 @@ }, { "cell_type": "code", - "execution_count": 0, + "execution_count": null, "metadata": { "colab": {}, "colab_type": "code", @@ -401,9 +411,9 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.6.10" + "version": "3.7.3" } }, "nbformat": 4, - "nbformat_minor": 1 + "nbformat_minor": 4 } From 2d7347b27ecf31adf0baac225c55911c2d0b27d7 Mon Sep 17 00:00:00 2001 From: Jitin Kapila Date: Tue, 11 Aug 2020 00:14:37 +0530 Subject: [PATCH 2/2] Solved doc2vec and Fasttext with some minor other changes --- ...ng_lemmatization_stopword_postagging.ipynb | 1024 +++++++++-------- Ch4/01_OnePipeline_ManyClassifiers.ipynb | 171 +-- Ch4/02_Doc2Vec_Example.ipynb | 819 +++++++------ Ch4/04_FastText_Example.ipynb | 910 +++++++++------ 4 files changed, 1621 insertions(+), 1303 deletions(-) diff --git a/Ch2/04_Tokenization_Stemming_lemmatization_stopword_postagging.ipynb b/Ch2/04_Tokenization_Stemming_lemmatization_stopword_postagging.ipynb index 423389c..92706a6 100644 --- a/Ch2/04_Tokenization_Stemming_lemmatization_stopword_postagging.ipynb +++ b/Ch2/04_Tokenization_Stemming_lemmatization_stopword_postagging.ipynb @@ -1,520 +1,562 @@ { - "cells": [ - { - "cell_type": "markdown", - "metadata": { - "colab_type": "text", - "id": "QnXzcZvdc-r6" - }, - "source": [ - "In this notebook we will demostrate how to perform tokenization,stemming,lemmatization and pos_tagging using libraries like [spacy](https://spacy.io/) and [nltk](https://www.nltk.org/) " - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": { - "colab": {}, - "colab_type": "code", - "id": "R3xEmJpRc5r8" - }, - "outputs": [], - "source": [ - "#This will be our corpus which we will work on\n", - "corpus_original = \"Need to finalize the demo corpus which will be used for this notebook and it should be done soon !!. It should be done by the ending of this month. But will it? This notebook has been run 4 times !!\"\n", - "corpus = \"Need to finalize the demo corpus which will be used for this notebook & should be done soon !!. It should be done by the ending of this month. But will it? This notebook has been run 4 times !!\"" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": { + "nbformat": 4, + "nbformat_minor": 0, + "metadata": { "colab": { - "base_uri": "https://localhost:8080/", - "height": 34 + "name": "Tokenization_Stemming_lemmatization_stopword_postagging.ipynb", + "provenance": [], + "collapsed_sections": [] }, - "colab_type": "code", - "id": "KHh_33IopPTf", - "outputId": "37c2db65-d10d-4254-80df-48a3f48713cd" - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "need to finalize the demo corpus which will be used for this notebook & should be done soon !!. it should be done by the ending of this month. but will it? this notebook has been run 4 times !!\n" - ] + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" } - ], - "source": [ - "#lower case the corpus\n", - "corpus = corpus.lower()\n", - "print(corpus)" - ] }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/", - "height": 34 + "cells": [ + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "QnXzcZvdc-r6" + }, + "source": [ + "In this notebook we will demostrate how to perform tokenization,stemming,lemmatization and pos_tagging using libraries like [spacy](https://spacy.io/) and [nltk](https://www.nltk.org/) " + ] }, - "colab_type": "code", - "id": "3yaGf8RiqgBM", - "outputId": "5856d53c-63e9-4045-dc53-96bb98fba30e" - }, - "outputs": [ { - "name": "stdout", - "output_type": "stream", - "text": [ - "need to finalize the demo corpus which will be used for this notebook & should be done soon !!. it should be done by the ending of this month. but will it? this notebook has been run times !!\n" - ] - } - ], - "source": [ - "#removing digits in the corpus\n", - "import re\n", - "corpus = re.sub(r'\\d+','', corpus)\n", - "print(corpus)" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/", - "height": 34 + "cell_type": "code", + "metadata": { + "colab_type": "code", + "id": "R3xEmJpRc5r8", + "colab": {} + }, + "source": [ + "#This will be our corpus which we will work on\n", + "corpus_original = \"Need to finalize the demo corpus which will be used for this notebook and it should be done soon !!. It should be done by the ending of this month. But will it? This notebook has been run 4 times !!\"\n", + "corpus = \"Need to finalize the demo corpus which will be used for this notebook & should be done soon !!. It should be done by the ending of this month. But will it? This notebook has been run 4 times !!\"" + ], + "execution_count": 10, + "outputs": [] }, - "colab_type": "code", - "id": "v5Q--GItqzfu", - "outputId": "e0581860-574e-4f1e-f517-29b60b438ec8" - }, - "outputs": [ { - "name": "stdout", - "output_type": "stream", - "text": [ - "need to finalize the demo corpus which will be used for this notebook should be done soon it should be done by the ending of this month but will it this notebook has been run times \n" - ] - } - ], - "source": [ - "#removing punctuations\n", - "import string\n", - "corpus = corpus.translate(str.maketrans('', '', string.punctuation))\n", - "print(corpus)" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/", - "height": 34 + "cell_type": "code", + "metadata": { + "colab_type": "code", + "id": "KHh_33IopPTf", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 54 + }, + "outputId": "fa12e7e4-aeb3-4053-be10-3cadad90d094" + }, + "source": [ + "#lower case the corpus\n", + "corpus = corpus.lower()\n", + "print(corpus)" + ], + "execution_count": 11, + "outputs": [ + { + "output_type": "stream", + "text": [ + "need to finalize the demo corpus which will be used for this notebook & should be done soon !!. it should be done by the ending of this month. but will it? this notebook has been run 4 times !!\n" + ], + "name": "stdout" + } + ] }, - "colab_type": "code", - "id": "zmANqee9rK4N", - "outputId": "227843ab-d55f-4c9a-adff-cc253eb36450" - }, - "outputs": [ { - "data": { - "text/plain": [ - "'need to finalize the demo corpus which will be used for this notebook should be done soon it should be done by the ending of this month but will it this notebook has been run times'" + "cell_type": "code", + "metadata": { + "colab_type": "code", + "id": "3yaGf8RiqgBM", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 54 + }, + "outputId": "859abb8b-3a34-4e23-bd8e-963520fb6ed3" + }, + "source": [ + "#removing digits in the corpus\n", + "import re\n", + "corpus = re.sub(r'\\d+','', corpus)\n", + "print(corpus)" + ], + "execution_count": 12, + "outputs": [ + { + "output_type": "stream", + "text": [ + "need to finalize the demo corpus which will be used for this notebook & should be done soon !!. it should be done by the ending of this month. but will it? this notebook has been run times !!\n" + ], + "name": "stdout" + } ] - }, - "execution_count": 5, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "#removing trailing whitespaces\n", - "corpus = corpus.strip()\n", - "corpus" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/", - "height": 872 }, - "colab_type": "code", - "id": "KMuHZTpy9X_u", - "outputId": "9ec1f466-2e24-4262-b48c-a6c36f3dcb7a" - }, - "outputs": [ { - "name": "stdout", - "output_type": "stream", - "text": [ - "Requirement already satisfied: spacy in /home/etherealenvy/miniconda3/envs/practicalnlp/lib/python3.6/site-packages (2.1.3)\n", - "Requirement already satisfied: cymem<2.1.0,>=2.0.2 in /home/etherealenvy/miniconda3/envs/practicalnlp/lib/python3.6/site-packages (from spacy) (2.0.3)\n", - "Requirement already satisfied: srsly<1.1.0,>=0.0.5 in /home/etherealenvy/miniconda3/envs/practicalnlp/lib/python3.6/site-packages (from spacy) (1.0.2)\n", - "Requirement already satisfied: plac<1.0.0,>=0.9.6 in /home/etherealenvy/miniconda3/envs/practicalnlp/lib/python3.6/site-packages (from spacy) (0.9.6)\n", - "Requirement already satisfied: murmurhash<1.1.0,>=0.28.0 in /home/etherealenvy/miniconda3/envs/practicalnlp/lib/python3.6/site-packages (from spacy) (1.0.2)\n", - "Requirement already satisfied: blis<0.3.0,>=0.2.2 in /home/etherealenvy/miniconda3/envs/practicalnlp/lib/python3.6/site-packages (from spacy) (0.2.4)\n", - "Requirement already satisfied: wasabi<1.1.0,>=0.2.0 in /home/etherealenvy/miniconda3/envs/practicalnlp/lib/python3.6/site-packages (from spacy) (0.6.0)\n", - "Requirement already satisfied: requests<3.0.0,>=2.13.0 in /home/etherealenvy/.local/lib/python3.6/site-packages (from spacy) (2.23.0)\n", - "Requirement already satisfied: numpy>=1.15.0 in /home/etherealenvy/miniconda3/envs/practicalnlp/lib/python3.6/site-packages (from spacy) (1.18.5)\n", - "Requirement already satisfied: jsonschema<3.0.0,>=2.6.0 in /home/etherealenvy/miniconda3/envs/practicalnlp/lib/python3.6/site-packages (from spacy) (2.6.0)\n", - "Requirement already satisfied: thinc<7.1.0,>=7.0.2 in /home/etherealenvy/miniconda3/envs/practicalnlp/lib/python3.6/site-packages (from spacy) (7.0.8)\n", - "Requirement already satisfied: preshed<2.1.0,>=2.0.1 in /home/etherealenvy/miniconda3/envs/practicalnlp/lib/python3.6/site-packages (from spacy) (2.0.1)\n", - "Requirement already satisfied: certifi>=2017.4.17 in /home/etherealenvy/.local/lib/python3.6/site-packages (from requests<3.0.0,>=2.13.0->spacy) (2020.4.5.1)\n", - "Requirement already satisfied: idna<3,>=2.5 in /home/etherealenvy/.local/lib/python3.6/site-packages (from requests<3.0.0,>=2.13.0->spacy) (2.9)\n", - "Requirement already satisfied: chardet<4,>=3.0.2 in /home/etherealenvy/.local/lib/python3.6/site-packages (from requests<3.0.0,>=2.13.0->spacy) (3.0.4)\n", - "Requirement already satisfied: urllib3!=1.25.0,!=1.25.1,<1.26,>=1.21.1 in /home/etherealenvy/.local/lib/python3.6/site-packages (from requests<3.0.0,>=2.13.0->spacy) (1.25.9)\n", - "Requirement already satisfied: tqdm<5.0.0,>=4.10.0 in /home/etherealenvy/miniconda3/envs/practicalnlp/lib/python3.6/site-packages (from thinc<7.1.0,>=7.0.2->spacy) (4.46.1)\n", - "Requirement already satisfied: en_core_web_sm==2.1.0 from https://github.com/explosion/spacy-models/releases/download/en_core_web_sm-2.1.0/en_core_web_sm-2.1.0.tar.gz#egg=en_core_web_sm==2.1.0 in /home/etherealenvy/miniconda3/envs/practicalnlp/lib/python3.6/site-packages (2.1.0)\n", - "\u001b[38;5;2m✔ Download and installation successful\u001b[0m\n", - "You can now load the model via spacy.load('en_core_web_sm')\n", - "\u001b[38;5;2m✔ Linking successful\u001b[0m\n", - "/home/etherealenvy/miniconda3/envs/practicalnlp/lib/python3.6/site-packages/en_core_web_sm\n", - "-->\n", - "/home/etherealenvy/miniconda3/envs/practicalnlp/lib/python3.6/site-packages/spacy/data/en\n", - "You can now load the model via spacy.load('en')\n" - ] - } - ], - "source": [ - "!pip install spacy\n", - "!python -m spacy download en" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "colab_type": "text", - "id": "nfJx3MnVj_ph" - }, - "source": [ - "### Tokenizing the text" - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/", - "height": 250 + "cell_type": "code", + "metadata": { + "colab_type": "code", + "id": "v5Q--GItqzfu", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 34 + }, + "outputId": "82fec440-1251-4ba1-cdf4-f1cab3c2a607" + }, + "source": [ + "#removing punctuations\n", + "import string\n", + "corpus = corpus.translate(str.maketrans('', '', string.punctuation))\n", + "print(corpus)" + ], + "execution_count": 13, + "outputs": [ + { + "output_type": "stream", + "text": [ + "need to finalize the demo corpus which will be used for this notebook should be done soon it should be done by the ending of this month but will it this notebook has been run times \n" + ], + "name": "stdout" + } + ] }, - "colab_type": "code", - "id": "OUz580k2sMqf", - "outputId": "5195f746-7e75-4cfa-d763-4856359baf05" - }, - "outputs": [ { - "name": "stderr", - "output_type": "stream", - "text": [ - "[nltk_data] Downloading package stopwords to\n", - "[nltk_data] /home/etherealenvy/nltk_data...\n", - "[nltk_data] Package stopwords is already up-to-date!\n", - "[nltk_data] Downloading package punkt to\n", - "[nltk_data] /home/etherealenvy/nltk_data...\n", - "[nltk_data] Package punkt is already up-to-date!\n" - ] + "cell_type": "code", + "metadata": { + "colab_type": "code", + "id": "zmANqee9rK4N", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 52 + }, + "outputId": "6105b616-e770-409a-88b0-3f23dd3ffd72" + }, + "source": [ + "#removing trailing whitespaces\n", + "corpus = ' '.join([token for token in corpus.split()])\n", + "corpus" + ], + "execution_count": 14, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "application/vnd.google.colaboratory.intrinsic+json": { + "type": "string" + }, + "text/plain": [ + "'need to finalize the demo corpus which will be used for this notebook should be done soon it should be done by the ending of this month but will it this notebook has been run times'" + ] + }, + "metadata": { + "tags": [] + }, + "execution_count": 14 + } + ] }, { - "name": "stdout", - "output_type": "stream", - "text": [ - "\n", - "NLTK\n", - "Tokenized corpus: ['need', 'to', 'finalize', 'the', 'demo', 'corpus', 'which', 'will', 'be', 'used', 'for', 'this', 'notebook', 'should', 'be', 'done', 'soon', 'it', 'should', 'be', 'done', 'by', 'the', 'ending', 'of', 'this', 'month', 'but', 'will', 'it', 'this', 'notebook', 'has', 'been', 'run', 'times']\n", - "Tokenized corpus without stopwords: ['need', 'finalize', 'demo', 'corpus', 'used', 'notebook', 'done', 'soon', 'done', 'ending', 'month', 'notebook', 'run', 'times']\n", - "\n", - "Spacy:\n", - "Tokenized Corpus: ['need', 'to', 'finalize', 'the', 'demo', 'corpus', 'which', 'will', 'be', 'used', 'for', 'this', 'notebook', 'should', 'be', 'done', 'soon', 'it', 'should', 'be', 'done', 'by', 'the', 'ending', 'of', 'this', 'month', 'but', 'will', 'it', 'this', 'notebook', 'has', 'been', 'run', 'times']\n", - "Tokenized corpus without stopwords ['need', 'finalize', 'demo', 'corpus', 'notebook', 'soon', 'ending', 'month', 'notebook', 'run', 'times']\n", - "Difference between NLTK and spaCy output:\n", - " {'used', 'done'}\n" - ] - } - ], - "source": [ - "from pprint import pprint\n", - "##NLTK\n", - "import nltk\n", - "from nltk.corpus import stopwords\n", - "nltk.download('stopwords')\n", - "nltk.download('punkt')\n", - "from nltk.tokenize import word_tokenize\n", - "stop_words_nltk = set(stopwords.words('english'))\n", - "\n", - "tokenized_corpus_nltk = word_tokenize(corpus)\n", - "print(\"\\nNLTK\\nTokenized corpus:\",tokenized_corpus_nltk)\n", - "tokenized_corpus_without_stopwords = [i for i in tokenized_corpus_nltk if not i in stop_words_nltk]\n", - "print(\"Tokenized corpus without stopwords:\",tokenized_corpus_without_stopwords)\n", - "\n", - "\n", - "##SPACY \n", - "from spacy.lang.en.stop_words import STOP_WORDS\n", - "import spacy\n", - "spacy_model = spacy.load('en_core_web_sm')\n", - "\n", - "stopwords_spacy = spacy_model.Defaults.stop_words\n", - "print(\"\\nSpacy:\")\n", - "tokenized_corpus_spacy = word_tokenize(corpus)\n", - "print(\"Tokenized Corpus:\",text_tokens)\n", - "tokens_without_sw= [word for word in tokenized_corpus_spacy if not word in stopwords_spacy]\n", - "\n", - "print(\"Tokenized corpus without stopwords\",tokens_without_sw)\n", - "\n", - "\n", - "print(\"Difference between NLTK and spaCy output:\\n\",\n", - " set(tokenized_corpus_without_stopwords)-set(tokens_without_sw))" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "colab_type": "text", - "id": "eRH_ltkD-HpA" - }, - "source": [ - "Notice the difference output after stopword removal using nltk and spacy" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "colab_type": "text", - "id": "tGcwD1JlkEao" - }, - "source": [ - "### Stemming" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/", - "height": 87 + "cell_type": "code", + "metadata": { + "colab_type": "code", + "id": "KMuHZTpy9X_u", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 759 + }, + "outputId": "76adf317-3d10-46f7-f955-6edf1e9099d4" + }, + "source": [ + "!pip install spacy\n", + "!python -m spacy download en_core_web_sm" + ], + "execution_count": 15, + "outputs": [ + { + "output_type": "stream", + "text": [ + "Requirement already satisfied: spacy in /usr/local/lib/python3.6/dist-packages (2.2.4)\n", + "Requirement already satisfied: cymem<2.1.0,>=2.0.2 in /usr/local/lib/python3.6/dist-packages (from spacy) (2.0.3)\n", + "Requirement already satisfied: thinc==7.4.0 in /usr/local/lib/python3.6/dist-packages (from spacy) (7.4.0)\n", + "Requirement already satisfied: wasabi<1.1.0,>=0.4.0 in /usr/local/lib/python3.6/dist-packages (from spacy) (0.7.1)\n", + "Requirement already satisfied: numpy>=1.15.0 in /usr/local/lib/python3.6/dist-packages (from spacy) (1.18.5)\n", + "Requirement already satisfied: srsly<1.1.0,>=1.0.2 in /usr/local/lib/python3.6/dist-packages (from spacy) (1.0.2)\n", + "Requirement already satisfied: murmurhash<1.1.0,>=0.28.0 in /usr/local/lib/python3.6/dist-packages (from spacy) (1.0.2)\n", + "Requirement already satisfied: catalogue<1.1.0,>=0.0.7 in /usr/local/lib/python3.6/dist-packages (from spacy) (1.0.0)\n", + "Requirement already satisfied: requests<3.0.0,>=2.13.0 in /usr/local/lib/python3.6/dist-packages (from spacy) (2.23.0)\n", + "Requirement already satisfied: setuptools in /usr/local/lib/python3.6/dist-packages (from spacy) (49.2.0)\n", + "Requirement already satisfied: plac<1.2.0,>=0.9.6 in /usr/local/lib/python3.6/dist-packages (from spacy) (1.1.3)\n", + "Requirement already satisfied: preshed<3.1.0,>=3.0.2 in /usr/local/lib/python3.6/dist-packages (from spacy) (3.0.2)\n", + "Requirement already satisfied: blis<0.5.0,>=0.4.0 in /usr/local/lib/python3.6/dist-packages (from spacy) (0.4.1)\n", + "Requirement already satisfied: tqdm<5.0.0,>=4.38.0 in /usr/local/lib/python3.6/dist-packages (from spacy) (4.41.1)\n", + "Requirement already satisfied: importlib-metadata>=0.20; python_version < \"3.8\" in /usr/local/lib/python3.6/dist-packages (from catalogue<1.1.0,>=0.0.7->spacy) (1.7.0)\n", + "Requirement already satisfied: certifi>=2017.4.17 in /usr/local/lib/python3.6/dist-packages (from requests<3.0.0,>=2.13.0->spacy) (2020.6.20)\n", + "Requirement already satisfied: idna<3,>=2.5 in /usr/local/lib/python3.6/dist-packages (from requests<3.0.0,>=2.13.0->spacy) (2.10)\n", + "Requirement already satisfied: chardet<4,>=3.0.2 in /usr/local/lib/python3.6/dist-packages (from requests<3.0.0,>=2.13.0->spacy) (3.0.4)\n", + "Requirement already satisfied: urllib3!=1.25.0,!=1.25.1,<1.26,>=1.21.1 in /usr/local/lib/python3.6/dist-packages (from requests<3.0.0,>=2.13.0->spacy) (1.24.3)\n", + "Requirement already satisfied: zipp>=0.5 in /usr/local/lib/python3.6/dist-packages (from importlib-metadata>=0.20; python_version < \"3.8\"->catalogue<1.1.0,>=0.0.7->spacy) (3.1.0)\n", + "Requirement already satisfied: en_core_web_sm==2.2.5 from https://github.com/explosion/spacy-models/releases/download/en_core_web_sm-2.2.5/en_core_web_sm-2.2.5.tar.gz#egg=en_core_web_sm==2.2.5 in /usr/local/lib/python3.6/dist-packages (2.2.5)\n", + "Requirement already satisfied: spacy>=2.2.2 in /usr/local/lib/python3.6/dist-packages (from en_core_web_sm==2.2.5) (2.2.4)\n", + "Requirement already satisfied: numpy>=1.15.0 in /usr/local/lib/python3.6/dist-packages (from spacy>=2.2.2->en_core_web_sm==2.2.5) (1.18.5)\n", + "Requirement already satisfied: wasabi<1.1.0,>=0.4.0 in /usr/local/lib/python3.6/dist-packages (from spacy>=2.2.2->en_core_web_sm==2.2.5) (0.7.1)\n", + "Requirement already satisfied: srsly<1.1.0,>=1.0.2 in /usr/local/lib/python3.6/dist-packages (from spacy>=2.2.2->en_core_web_sm==2.2.5) (1.0.2)\n", + "Requirement already satisfied: preshed<3.1.0,>=3.0.2 in /usr/local/lib/python3.6/dist-packages (from spacy>=2.2.2->en_core_web_sm==2.2.5) (3.0.2)\n", + "Requirement already satisfied: plac<1.2.0,>=0.9.6 in /usr/local/lib/python3.6/dist-packages (from spacy>=2.2.2->en_core_web_sm==2.2.5) (1.1.3)\n", + "Requirement already satisfied: requests<3.0.0,>=2.13.0 in /usr/local/lib/python3.6/dist-packages (from spacy>=2.2.2->en_core_web_sm==2.2.5) (2.23.0)\n", + "Requirement already satisfied: murmurhash<1.1.0,>=0.28.0 in /usr/local/lib/python3.6/dist-packages (from spacy>=2.2.2->en_core_web_sm==2.2.5) (1.0.2)\n", + "Requirement already satisfied: tqdm<5.0.0,>=4.38.0 in /usr/local/lib/python3.6/dist-packages (from spacy>=2.2.2->en_core_web_sm==2.2.5) (4.41.1)\n", + "Requirement already satisfied: setuptools in /usr/local/lib/python3.6/dist-packages (from spacy>=2.2.2->en_core_web_sm==2.2.5) (49.2.0)\n", + "Requirement already satisfied: cymem<2.1.0,>=2.0.2 in /usr/local/lib/python3.6/dist-packages (from spacy>=2.2.2->en_core_web_sm==2.2.5) (2.0.3)\n", + "Requirement already satisfied: blis<0.5.0,>=0.4.0 in /usr/local/lib/python3.6/dist-packages (from spacy>=2.2.2->en_core_web_sm==2.2.5) (0.4.1)\n", + "Requirement already satisfied: thinc==7.4.0 in /usr/local/lib/python3.6/dist-packages (from spacy>=2.2.2->en_core_web_sm==2.2.5) (7.4.0)\n", + "Requirement already satisfied: catalogue<1.1.0,>=0.0.7 in /usr/local/lib/python3.6/dist-packages (from spacy>=2.2.2->en_core_web_sm==2.2.5) (1.0.0)\n", + "Requirement already satisfied: idna<3,>=2.5 in /usr/local/lib/python3.6/dist-packages (from requests<3.0.0,>=2.13.0->spacy>=2.2.2->en_core_web_sm==2.2.5) (2.10)\n", + "Requirement already satisfied: chardet<4,>=3.0.2 in /usr/local/lib/python3.6/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", + "Requirement already satisfied: certifi>=2017.4.17 in /usr/local/lib/python3.6/dist-packages (from requests<3.0.0,>=2.13.0->spacy>=2.2.2->en_core_web_sm==2.2.5) (2020.6.20)\n", + "Requirement already satisfied: urllib3!=1.25.0,!=1.25.1,<1.26,>=1.21.1 in /usr/local/lib/python3.6/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", + "Requirement already satisfied: importlib-metadata>=0.20; python_version < \"3.8\" in /usr/local/lib/python3.6/dist-packages (from catalogue<1.1.0,>=0.0.7->spacy>=2.2.2->en_core_web_sm==2.2.5) (1.7.0)\n", + "Requirement already satisfied: zipp>=0.5 in /usr/local/lib/python3.6/dist-packages (from importlib-metadata>=0.20; python_version < \"3.8\"->catalogue<1.1.0,>=0.0.7->spacy>=2.2.2->en_core_web_sm==2.2.5) (3.1.0)\n", + "\u001b[38;5;2m✔ Download and installation successful\u001b[0m\n", + "You can now load the model via spacy.load('en_core_web_sm')\n" + ], + "name": "stdout" + } + ] }, - "colab_type": "code", - "id": "ibEpzcv0sdW8", - "outputId": "f40aa595-f67f-4042-e9bf-e5b4a160d524" - }, - "outputs": [ { - "name": "stdout", - "output_type": "stream", - "text": [ - "Before Stemming:\n", - "need to finalize the demo corpus which will be used for this notebook should be done soon it should be done by the ending of this month but will it this notebook has been run times\n", - "After Stemming:\n", - "need to final the demo corpu which will be use for thi notebook should be done soon it should be done by the end of thi month but will it thi notebook ha been run time " - ] - } - ], - "source": [ - "from nltk.stem import PorterStemmer\n", - "from nltk.tokenize import word_tokenize\n", - "stemmer= PorterStemmer()\n", - "\n", - "print(\"Before Stemming:\")\n", - "print(corpus)\n", - "\n", - "print(\"After Stemming:\")\n", - "for word in tokenized_corpus_nltk:\n", - " print(stemmer.stem(word),end=\" \")" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "colab_type": "text", - "id": "9Wy6cwvYkJeR" - }, - "source": [ - "### Lemmatization" - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/", - "height": 70 + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "nfJx3MnVj_ph" + }, + "source": [ + "### Tokenizing the text" + ] }, - "colab_type": "code", - "id": "27KvL4ZE-fqJ", - "outputId": "41dc046e-14dd-4d4f-83ca-2b3af4532593" - }, - "outputs": [ { - "name": "stderr", - "output_type": "stream", - "text": [ - "[nltk_data] Downloading package wordnet to\n", - "[nltk_data] /home/etherealenvy/nltk_data...\n", - "[nltk_data] Unzipping corpora/wordnet.zip.\n" - ] + "cell_type": "code", + "metadata": { + "colab_type": "code", + "id": "OUz580k2sMqf", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 272 + }, + "outputId": "da21bf1e-444b-4077-c823-e58b4986a35f" + }, + "source": [ + "from pprint import pprint\n", + "##NLTK\n", + "import nltk\n", + "from nltk.corpus import stopwords\n", + "nltk.download('stopwords')\n", + "nltk.download('punkt')\n", + "from nltk.tokenize import word_tokenize\n", + "stop_words_nltk = set(stopwords.words('english'))\n", + "\n", + "tokenized_corpus_nltk = word_tokenize(corpus)\n", + "print(\"\\nNLTK\\nTokenized corpus:\",tokenized_corpus_nltk)\n", + "tokenized_corpus_without_stopwords = [i for i in tokenized_corpus_nltk if not i in stop_words_nltk]\n", + "print(\"Tokenized corpus without stopwords:\",tokenized_corpus_without_stopwords)\n", + "\n", + "\n", + "##SPACY \n", + "from spacy.lang.en.stop_words import STOP_WORDS\n", + "import spacy\n", + "spacy_model = spacy.load('en_core_web_sm')\n", + "\n", + "stopwords_spacy = spacy_model.Defaults.stop_words\n", + "print(\"\\nSpacy:\")\n", + "tokenized_corpus_spacy = word_tokenize(corpus)\n", + "print(\"Tokenized Corpus:\",tokenized_corpus_spacy)\n", + "tokens_without_sw= [word for word in tokenized_corpus_spacy if not word in stopwords_spacy]\n", + "\n", + "print(\"Tokenized corpus without stopwords\",tokens_without_sw)\n", + "\n", + "\n", + "print(\"Difference between NLTK and spaCy output:\\n\",\n", + " set(tokenized_corpus_without_stopwords)-set(tokens_without_sw))" + ], + "execution_count": 17, + "outputs": [ + { + "output_type": "stream", + "text": [ + "[nltk_data] Downloading package stopwords to /root/nltk_data...\n", + "[nltk_data] Package stopwords is already up-to-date!\n", + "[nltk_data] Downloading package punkt to /root/nltk_data...\n", + "[nltk_data] Package punkt is already up-to-date!\n", + "\n", + "NLTK\n", + "Tokenized corpus: ['need', 'to', 'finalize', 'the', 'demo', 'corpus', 'which', 'will', 'be', 'used', 'for', 'this', 'notebook', 'should', 'be', 'done', 'soon', 'it', 'should', 'be', 'done', 'by', 'the', 'ending', 'of', 'this', 'month', 'but', 'will', 'it', 'this', 'notebook', 'has', 'been', 'run', 'times']\n", + "Tokenized corpus without stopwords: ['need', 'finalize', 'demo', 'corpus', 'used', 'notebook', 'done', 'soon', 'done', 'ending', 'month', 'notebook', 'run', 'times']\n", + "\n", + "Spacy:\n", + "Tokenized Corpus: ['need', 'to', 'finalize', 'the', 'demo', 'corpus', 'which', 'will', 'be', 'used', 'for', 'this', 'notebook', 'should', 'be', 'done', 'soon', 'it', 'should', 'be', 'done', 'by', 'the', 'ending', 'of', 'this', 'month', 'but', 'will', 'it', 'this', 'notebook', 'has', 'been', 'run', 'times']\n", + "Tokenized corpus without stopwords ['need', 'finalize', 'demo', 'corpus', 'notebook', 'soon', 'ending', 'month', 'notebook', 'run', 'times']\n", + "Difference between NLTK and spaCy output:\n", + " {'done', 'used'}\n" + ], + "name": "stdout" + } + ] }, { - "name": "stdout", - "output_type": "stream", - "text": [ - "need to finalize the demo corpus which will be used for this notebook should be done soon it should be done by the ending of this month but will it this notebook ha been run time " - ] - } - ], - "source": [ - "from nltk.stem import WordNetLemmatizer\n", - "from nltk.tokenize import word_tokenize\n", - "nltk.download('wordnet')\n", - "lemmatizer=WordNetLemmatizer()\n", - "\n", - "\n", - "for word in tokenized_corpus_nltk:\n", - " print(lemmatizer.lemmatize(word),end=\" \")" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "colab_type": "text", - "id": "h8uCGA8ukMfQ" - }, - "source": [ - "### POS Tagging" - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/", - "height": 1000 + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "eRH_ltkD-HpA" + }, + "source": [ + "Notice the difference output after stopword removal using nltk and spacy" + ] }, - "colab_type": "code", - "id": "kZqBxLDz-6cu", - "outputId": "9b89af94-c433-4099-b1c3-3adefecae984" - }, - "outputs": [ { - "name": "stdout", - "output_type": "stream", - "text": [ - "POS Tagging using spacy:\n", - "Need : VERB\n", - "to : PART\n", - "finalize : VERB\n", - "the : DET\n", - "demo : ADJ\n", - "corpus : NOUN\n", - "which : DET\n", - "will : VERB\n", - "be : VERB\n", - "used : VERB\n", - "for : ADP\n", - "this : DET\n", - "notebook : NOUN\n", - "and : CCONJ\n", - "it : PRON\n", - "should : VERB\n", - "be : VERB\n", - "done : VERB\n", - "soon : ADV\n", - "! : PUNCT\n", - "! : PUNCT\n", - ". : PUNCT\n", - "It : PRON\n", - "should : VERB\n", - "be : VERB\n", - "done : VERB\n", - "by : ADP\n", - "the : DET\n", - "ending : NOUN\n", - "of : ADP\n", - "this : DET\n", - "month : NOUN\n", - ". : PUNCT\n", - "But : CCONJ\n", - "will : VERB\n", - "it : PRON\n", - "? : PUNCT\n", - "This : DET\n", - "notebook : NOUN\n", - "has : VERB\n", - "been : VERB\n", - "run : VERB\n", - "4 : NUM\n", - "times : NOUN\n", - "! : PUNCT\n", - "! : PUNCT\n", - "POS Tagging using NLTK:\n" - ] + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "tGcwD1JlkEao" + }, + "source": [ + "### Stemming" + ] }, { - "ename": "LookupError", - "evalue": "\n**********************************************************************\n Resource \u001b[93maveraged_perceptron_tagger\u001b[0m not found.\n Please use the NLTK Downloader to obtain the resource:\n\n \u001b[31m>>> import nltk\n >>> nltk.download('averaged_perceptron_tagger')\n \u001b[0m\n For more information see: https://www.nltk.org/data.html\n\n Attempted to load \u001b[93mtaggers/averaged_perceptron_tagger/averaged_perceptron_tagger.pickle\u001b[0m\n\n Searched in:\n - '/home/etherealenvy/nltk_data'\n - '/home/etherealenvy/miniconda3/envs/practicalnlp/nltk_data'\n - '/home/etherealenvy/miniconda3/envs/practicalnlp/share/nltk_data'\n - '/home/etherealenvy/miniconda3/envs/practicalnlp/lib/nltk_data'\n - '/usr/share/nltk_data'\n - '/usr/local/share/nltk_data'\n - '/usr/lib/nltk_data'\n - '/usr/local/lib/nltk_data'\n**********************************************************************\n", - "output_type": "error", - "traceback": [ - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[0;31mLookupError\u001b[0m Traceback (most recent call last)", - "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[1;32m 12\u001b[0m \u001b[0;31m# nltk.download('averaged_perceptron_tagger')\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 13\u001b[0m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\"POS Tagging using NLTK:\"\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 14\u001b[0;31m \u001b[0mpprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mnltk\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mpos_tag\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mword_tokenize\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mcorpus_original\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", - "\u001b[0;32m~/.local/lib/python3.6/site-packages/nltk/tag/__init__.py\u001b[0m in \u001b[0;36mpos_tag\u001b[0;34m(tokens, tagset, lang)\u001b[0m\n\u001b[1;32m 158\u001b[0m \u001b[0;34m:\u001b[0m\u001b[0mrtype\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mlist\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mtuple\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mstr\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mstr\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 159\u001b[0m \"\"\"\n\u001b[0;32m--> 160\u001b[0;31m \u001b[0mtagger\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0m_get_tagger\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mlang\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 161\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0m_pos_tag\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mtokens\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mtagset\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mtagger\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mlang\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 162\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;32m~/.local/lib/python3.6/site-packages/nltk/tag/__init__.py\u001b[0m in \u001b[0;36m_get_tagger\u001b[0;34m(lang)\u001b[0m\n\u001b[1;32m 104\u001b[0m \u001b[0mtagger\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mload\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0map_russian_model_loc\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 105\u001b[0m \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 106\u001b[0;31m \u001b[0mtagger\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mPerceptronTagger\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 107\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mtagger\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 108\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;32m~/.local/lib/python3.6/site-packages/nltk/tag/perceptron.py\u001b[0m in \u001b[0;36m__init__\u001b[0;34m(self, load)\u001b[0m\n\u001b[1;32m 166\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mload\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 167\u001b[0m AP_MODEL_LOC = \"file:\" + str(\n\u001b[0;32m--> 168\u001b[0;31m \u001b[0mfind\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\"taggers/averaged_perceptron_tagger/\"\u001b[0m \u001b[0;34m+\u001b[0m \u001b[0mPICKLE\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 169\u001b[0m )\n\u001b[1;32m 170\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mload\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mAP_MODEL_LOC\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;32m~/.local/lib/python3.6/site-packages/nltk/data.py\u001b[0m in \u001b[0;36mfind\u001b[0;34m(resource_name, paths)\u001b[0m\n\u001b[1;32m 583\u001b[0m \u001b[0msep\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m\"*\"\u001b[0m \u001b[0;34m*\u001b[0m \u001b[0;36m70\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 584\u001b[0m \u001b[0mresource_not_found\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m\"\\n%s\\n%s\\n%s\\n\"\u001b[0m \u001b[0;34m%\u001b[0m \u001b[0;34m(\u001b[0m\u001b[0msep\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mmsg\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0msep\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 585\u001b[0;31m \u001b[0;32mraise\u001b[0m \u001b[0mLookupError\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mresource_not_found\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 586\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 587\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;31mLookupError\u001b[0m: \n**********************************************************************\n Resource \u001b[93maveraged_perceptron_tagger\u001b[0m not found.\n Please use the NLTK Downloader to obtain the resource:\n\n \u001b[31m>>> import nltk\n >>> nltk.download('averaged_perceptron_tagger')\n \u001b[0m\n For more information see: https://www.nltk.org/data.html\n\n Attempted to load \u001b[93mtaggers/averaged_perceptron_tagger/averaged_perceptron_tagger.pickle\u001b[0m\n\n Searched in:\n - '/home/etherealenvy/nltk_data'\n - '/home/etherealenvy/miniconda3/envs/practicalnlp/nltk_data'\n - '/home/etherealenvy/miniconda3/envs/practicalnlp/share/nltk_data'\n - '/home/etherealenvy/miniconda3/envs/practicalnlp/lib/nltk_data'\n - '/usr/share/nltk_data'\n - '/usr/local/share/nltk_data'\n - '/usr/lib/nltk_data'\n - '/usr/local/lib/nltk_data'\n**********************************************************************\n" - ] + "cell_type": "code", + "metadata": { + "colab_type": "code", + "id": "ibEpzcv0sdW8", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 84 + }, + "outputId": "18f77b85-3a8e-4e89-df28-3bd6342ac594" + }, + "source": [ + "from nltk.stem import PorterStemmer\n", + "from nltk.tokenize import word_tokenize\n", + "stemmer= PorterStemmer()\n", + "\n", + "print(\"Before Stemming:\")\n", + "print(corpus)\n", + "\n", + "print(\"After Stemming:\")\n", + "for word in tokenized_corpus_nltk:\n", + " print(stemmer.stem(word),end=\" \")" + ], + "execution_count": 18, + "outputs": [ + { + "output_type": "stream", + "text": [ + "Before Stemming:\n", + "need to finalize the demo corpus which will be used for this notebook should be done soon it should be done by the ending of this month but will it this notebook has been run times\n", + "After Stemming:\n", + "need to final the demo corpu which will be use for thi notebook should be done soon it should be done by the end of thi month but will it thi notebook ha been run time " + ], + "name": "stdout" + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "9Wy6cwvYkJeR" + }, + "source": [ + "### Lemmatization" + ] + }, + { + "cell_type": "code", + "metadata": { + "colab_type": "code", + "id": "27KvL4ZE-fqJ", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 67 + }, + "outputId": "d8b6778f-79b7-4dd4-8832-da29d75dc3a8" + }, + "source": [ + "from nltk.stem import WordNetLemmatizer\n", + "from nltk.tokenize import word_tokenize\n", + "nltk.download('wordnet')\n", + "lemmatizer=WordNetLemmatizer()\n", + "\n", + "\n", + "for word in tokenized_corpus_nltk:\n", + " print(lemmatizer.lemmatize(word),end=\" \")" + ], + "execution_count": 19, + "outputs": [ + { + "output_type": "stream", + "text": [ + "[nltk_data] Downloading package wordnet to /root/nltk_data...\n", + "[nltk_data] Unzipping corpora/wordnet.zip.\n", + "need to finalize the demo corpus which will be used for this notebook should be done soon it should be done by the ending of this month but will it this notebook ha been run time " + ], + "name": "stdout" + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "h8uCGA8ukMfQ" + }, + "source": [ + "### POS Tagging" + ] + }, + { + "cell_type": "code", + "metadata": { + "colab_type": "code", + "id": "kZqBxLDz-6cu", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 1000 + }, + "outputId": "a8503608-0352-4c00-82fe-789d874b5655" + }, + "source": [ + "#POS tagging using spacy\n", + "doc = spacy_model(corpus_original) \n", + " \n", + "print(\"POS Tagging using spacy:\") \n", + "# Token and Tag \n", + "for token in doc: \n", + " print(token,\":\", token.pos_)\n", + "\n", + "\n", + "\n", + "#pos tagging using nltk\n", + "nltk.download('averaged_perceptron_tagger')\n", + "print(\"POS Tagging using NLTK:\")\n", + "pprint(nltk.pos_tag(word_tokenize(corpus_original)))" + ], + "execution_count": 20, + "outputs": [ + { + "output_type": "stream", + "text": [ + "POS Tagging using spacy:\n", + "Need : VERB\n", + "to : PART\n", + "finalize : VERB\n", + "the : DET\n", + "demo : NOUN\n", + "corpus : NOUN\n", + "which : DET\n", + "will : VERB\n", + "be : AUX\n", + "used : VERB\n", + "for : ADP\n", + "this : DET\n", + "notebook : NOUN\n", + "and : CCONJ\n", + "it : PRON\n", + "should : VERB\n", + "be : AUX\n", + "done : VERB\n", + "soon : ADV\n", + "! : PUNCT\n", + "! : PUNCT\n", + ". : PUNCT\n", + "It : PRON\n", + "should : VERB\n", + "be : AUX\n", + "done : VERB\n", + "by : ADP\n", + "the : DET\n", + "ending : NOUN\n", + "of : ADP\n", + "this : DET\n", + "month : NOUN\n", + ". : PUNCT\n", + "But : CCONJ\n", + "will : VERB\n", + "it : PRON\n", + "? : PUNCT\n", + "This : DET\n", + "notebook : NOUN\n", + "has : AUX\n", + "been : AUX\n", + "run : VERB\n", + "4 : NUM\n", + "times : NOUN\n", + "! : PUNCT\n", + "! : PUNCT\n", + "[nltk_data] Downloading package averaged_perceptron_tagger to\n", + "[nltk_data] /root/nltk_data...\n", + "[nltk_data] Unzipping taggers/averaged_perceptron_tagger.zip.\n", + "POS Tagging using NLTK:\n", + "[('Need', 'NN'),\n", + " ('to', 'TO'),\n", + " ('finalize', 'VB'),\n", + " ('the', 'DT'),\n", + " ('demo', 'NN'),\n", + " ('corpus', 'NN'),\n", + " ('which', 'WDT'),\n", + " ('will', 'MD'),\n", + " ('be', 'VB'),\n", + " ('used', 'VBN'),\n", + " ('for', 'IN'),\n", + " ('this', 'DT'),\n", + " ('notebook', 'NN'),\n", + " ('and', 'CC'),\n", + " ('it', 'PRP'),\n", + " ('should', 'MD'),\n", + " ('be', 'VB'),\n", + " ('done', 'VBN'),\n", + " ('soon', 'RB'),\n", + " ('!', '.'),\n", + " ('!', '.'),\n", + " ('.', '.'),\n", + " ('It', 'PRP'),\n", + " ('should', 'MD'),\n", + " ('be', 'VB'),\n", + " ('done', 'VBN'),\n", + " ('by', 'IN'),\n", + " ('the', 'DT'),\n", + " ('ending', 'VBG'),\n", + " ('of', 'IN'),\n", + " ('this', 'DT'),\n", + " ('month', 'NN'),\n", + " ('.', '.'),\n", + " ('But', 'CC'),\n", + " ('will', 'MD'),\n", + " ('it', 'PRP'),\n", + " ('?', '.'),\n", + " ('This', 'DT'),\n", + " ('notebook', 'NN'),\n", + " ('has', 'VBZ'),\n", + " ('been', 'VBN'),\n", + " ('run', 'VBN'),\n", + " ('4', 'CD'),\n", + " ('times', 'NNS'),\n", + " ('!', '.'),\n", + " ('!', '.')]\n" + ], + "name": "stdout" + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "zWdmz6lFkpEI" + }, + "source": [ + "There are various other libraries you can use to perform these common pre-processing steps" + ] } - ], - "source": [ - "#POS tagging using spacy\n", - "doc = spacy_model(corpus_original) \n", - " \n", - "print(\"POS Tagging using spacy:\") \n", - "# Token and Tag \n", - "for token in doc: \n", - " print(token,\":\", token.pos_)\n", - "\n", - "\n", - "\n", - "#pos tagging using nltk\n", - "# nltk.download('averaged_perceptron_tagger')\n", - "print(\"POS Tagging using NLTK:\")\n", - "pprint(nltk.pos_tag(word_tokenize(corpus_original)))" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "colab_type": "text", - "id": "zWdmz6lFkpEI" - }, - "source": [ - "There are various other libraries you can use to perform these common pre-processing steps" - ] - } - ], - "metadata": { - "colab": { - "collapsed_sections": [], - "name": "Tokenization_Stemming_lemmatization_stopword_postagging.ipynb", - "provenance": [] - }, - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - } - }, - "nbformat": 4, - "nbformat_minor": 1 -} + ] +} \ No newline at end of file diff --git a/Ch4/01_OnePipeline_ManyClassifiers.ipynb b/Ch4/01_OnePipeline_ManyClassifiers.ipynb index 7425835..44b5c37 100644 --- a/Ch4/01_OnePipeline_ManyClassifiers.ipynb +++ b/Ch4/01_OnePipeline_ManyClassifiers.ipynb @@ -54,7 +54,11 @@ "metadata": { "id": "QBvvarqE5xWm", "colab_type": "code", - "colab": {} + "colab": { + "base_uri": "https://localhost:8080/", + "height": 70 + }, + "outputId": "aa45dbb3-dde0-436a-ab7b-cb6ea9bcbcf1" }, "source": [ "import numpy as np\n", @@ -87,8 +91,17 @@ "#import time function from time module to track the training duration\n", "from time import time" ], - "execution_count": 0, - "outputs": [] + "execution_count": 1, + "outputs": [ + { + "output_type": "stream", + "text": [ + "/usr/local/lib/python3.6/dist-packages/sklearn/utils/deprecation.py:144: FutureWarning: The sklearn.feature_extraction.stop_words module is deprecated in version 0.22 and will be removed in version 0.24. The corresponding classes / functions should instead be imported from sklearn.feature_extraction.text. Anything that cannot be imported from sklearn.feature_extraction.text is now part of the private API.\n", + " warnings.warn(message, FutureWarning)\n" + ], + "name": "stderr" + } + ] }, { "cell_type": "markdown", @@ -105,37 +118,36 @@ "metadata": { "id": "tZkcGcXp9wq1", "colab_type": "code", - "outputId": "4943ab36-3441-4655-82b0-61b2c4cec376", "colab": { "base_uri": "https://localhost:8080/", - "height": 106 - } + "height": 269 + }, + "outputId": "ea1bb924-36da-4a12-e3c9-30d1808f4660" }, "source": [ - "!apt-get install -y -qq software-properties-common python3-software-properties module-init-tools\n", - "!add-apt-repository -y ppa:alessandro-strada/ppa 2>&1 > /dev/null\n", - "!apt-get update -qq 2>&1 > /dev/null\n", - "!apt-get -y install -qq google-drive-ocamlfuse fuse\n", - "from google.colab import auth\n", - "auth.authenticate_user()\n", - "from oauth2client.client import GoogleCredentials\n", - "creds = GoogleCredentials.get_application_default()\n", - "import getpass\n", - "!google-drive-ocamlfuse -headless -id={creds.client_id} -secret={creds.client_secret} < /dev/null 2>&1 | grep URL\n", - "vcode = getpass.getpass()\n", - "!echo {vcode} | google-drive-ocamlfuse -headless -id={creds.client_id} -secret={creds.client_secret}\n", - "!mkdir -p drive\n", - "!google-drive-ocamlfuse drive" + "!wget -P DATAPATH https://raw.githubusercontent.com/practical-nlp/practical-nlp/master/Ch4/Data/Full-Economic-News-DFE-839861.csv\n", + "!ls -lah DATAPATH" ], - "execution_count": 0, + "execution_count": 2, "outputs": [ { "output_type": "stream", "text": [ - "Please, open the following URL in a web browser: https://accounts.google.com/o/oauth2/auth?client_id=32555940559.apps.googleusercontent.com&redirect_uri=urn%3Aietf%3Awg%3Aoauth%3A2.0%3Aoob&scope=https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fdrive&response_type=code&access_type=offline&approval_prompt=force\n", - "··········\n", - "Please, open the following URL in a web browser: https://accounts.google.com/o/oauth2/auth?client_id=32555940559.apps.googleusercontent.com&redirect_uri=urn%3Aietf%3Awg%3Aoauth%3A2.0%3Aoob&scope=https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fdrive&response_type=code&access_type=offline&approval_prompt=force\n", - "Please enter the verification code: Access token retrieved correctly.\n" + "--2020-08-10 11:32:30-- https://raw.githubusercontent.com/practical-nlp/practical-nlp/master/Ch4/Data/Full-Economic-News-DFE-839861.csv\n", + "Resolving raw.githubusercontent.com (raw.githubusercontent.com)... 151.101.0.133, 151.101.64.133, 151.101.128.133, ...\n", + "Connecting to raw.githubusercontent.com (raw.githubusercontent.com)|151.101.0.133|:443... connected.\n", + "HTTP request sent, awaiting response... 200 OK\n", + "Length: 12383529 (12M) [text/plain]\n", + "Saving to: ‘DATAPATH/Full-Economic-News-DFE-839861.csv’\n", + "\n", + "Full-Economic-News- 100%[===================>] 11.81M 35.5MB/s in 0.3s \n", + "\n", + "2020-08-10 11:32:31 (35.5 MB/s) - ‘DATAPATH/Full-Economic-News-DFE-839861.csv’ saved [12383529/12383529]\n", + "\n", + "total 12M\n", + "drwxr-xr-x 2 root root 4.0K Aug 10 11:32 .\n", + "drwxr-xr-x 1 root root 4.0K Aug 10 11:32 ..\n", + "-rw-r--r-- 1 root root 12M Aug 10 11:32 Full-Economic-News-DFE-839861.csv\n" ], "name": "stdout" } @@ -146,19 +158,19 @@ "metadata": { "id": "LbED8Q185xWu", "colab_type": "code", - "outputId": "f48a6b5a-c95c-4134-927d-768b86d4b746", "colab": { "base_uri": "https://localhost:8080/", - "height": 104 - } + "height": 101 + }, + "outputId": "6bc758e1-c542-4309-a8b7-f9ae406bde7d" }, "source": [ - "our_data = pd.read_csv(\"DATAPATH\" , encoding = \"ISO-8859-1\" )\n", + "our_data = pd.read_csv(\"DATAPATH/Full-Economic-News-DFE-839861.csv\" , encoding = \"ISO-8859-1\" )\n", "\n", "display(our_data.shape) #Number of rows (instances) and columns in the dataset\n", "our_data[\"relevance\"].value_counts()/our_data.shape[0] #Class distribution in the dataset" ], - "execution_count": 0, + "execution_count": 3, "outputs": [ { "output_type": "display_data", @@ -184,7 +196,7 @@ "metadata": { "tags": [] }, - "execution_count": 9 + "execution_count": 3 } ] }, @@ -203,11 +215,11 @@ "metadata": { "id": "BYW_S3585xXF", "colab_type": "code", - "outputId": "233a6037-4a02-466e-bb59-21fb6ce9182c", "colab": { "base_uri": "https://localhost:8080/", "height": 34 - } + }, + "outputId": "988c2d6e-9826-4651-d6b6-2464d2479062" }, "source": [ "# convert label to a numerical variable\n", @@ -217,7 +229,7 @@ "our_data = our_data[[\"text\",\"relevance\"]] #Let us take only the two columns we need.\n", "our_data.shape" ], - "execution_count": 0, + "execution_count": 4, "outputs": [ { "output_type": "execute_result", @@ -229,7 +241,7 @@ "metadata": { "tags": [] }, - "execution_count": 10 + "execution_count": 4 } ] }, @@ -269,7 +281,7 @@ " #remove punctuation and numbers\n", " return doc" ], - "execution_count": 0, + "execution_count": 5, "outputs": [] }, { @@ -295,11 +307,11 @@ "metadata": { "id": "GimJJHhg5xYl", "colab_type": "code", - "outputId": "4dbac8e7-df8f-4374-b9b1-437149a6fb19", "colab": { "base_uri": "https://localhost:8080/", - "height": 69 - } + "height": 67 + }, + "outputId": "e8d8dbea-9a85-4ca9-c41a-6cdd092b68df" }, "source": [ "import sklearn\n", @@ -316,7 +328,7 @@ "print(X_train.shape, y_train.shape)\n", "print(X_test.shape, y_test.shape)" ], - "execution_count": 0, + "execution_count": 6, "outputs": [ { "output_type": "stream", @@ -334,11 +346,11 @@ "metadata": { "id": "gsUyIBUD5xZI", "colab_type": "code", - "outputId": "26cd24c2-84ab-4e02-e873-1544254e8ce9", "colab": { "base_uri": "https://localhost:8080/", "height": 34 - } + }, + "outputId": "f704fb2b-d1f1-4c3a-d220-f05ee1384a61" }, "source": [ "#Step 2-3: Preprocess and Vectorize train and test data\n", @@ -349,7 +361,7 @@ "print(X_train_dtm.shape, X_test_dtm.shape)\n", "#i.e., the dimension of our feature vector is 49753!" ], - "execution_count": 0, + "execution_count": 7, "outputs": [ { "output_type": "stream", @@ -365,11 +377,11 @@ "metadata": { "id": "nDLwA4CL5xZq", "colab_type": "code", - "outputId": "1340afd9-2e5d-43de-9e46-abc50f8dd9e3", "colab": { "base_uri": "https://localhost:8080/", - "height": 52 - } + "height": 50 + }, + "outputId": "d1fea858-5e17-4d3e-9450-ae5702114261" }, "source": [ "#Step 3: Train the classifier and predict for test data\n", @@ -377,13 +389,13 @@ "%time nb.fit(X_train_dtm, y_train)#train the model(timing it with an IPython \"magic command\")\n", "y_pred_class = nb.predict(X_test_dtm)#make class predictions for X_test_dtm" ], - "execution_count": 0, + "execution_count": 8, "outputs": [ { "output_type": "stream", "text": [ - "CPU times: user 12.6 ms, sys: 0 ns, total: 12.6 ms\n", - "Wall time: 13.8 ms\n" + "CPU times: user 11.9 ms, sys: 1.08 ms, total: 13 ms\n", + "Wall time: 14.9 ms\n" ], "name": "stdout" } @@ -394,11 +406,11 @@ "metadata": { "id": "LiCHjvc75xZ3", "colab_type": "code", - "outputId": "dbaf55e1-faea-44d5-c2c7-e24bdd7203f7", "colab": { "base_uri": "https://localhost:8080/", - "height": 495 - } + "height": 494 + }, + "outputId": "5308276c-78cd-48c3-bf5c-1f6eb5321152" }, "source": [ "#Step 4: Evaluate the classifier using various measures\n", @@ -452,7 +464,7 @@ "y_pred_prob = nb.predict_proba(X_test_dtm)[:, 1]\n", "print(\"ROC_AOC_Score: \", metrics.roc_auc_score(y_test, y_pred_prob))" ], - "execution_count": 0, + "execution_count": 9, "outputs": [ { "output_type": "stream", @@ -465,7 +477,7 @@ { "output_type": "display_data", "data": { - "image/png": "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\n", + "image/png": "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\n", "text/plain": [ "
" ] @@ -492,11 +504,11 @@ "metadata": { "id": "ylOI4OsD5xaE", "colab_type": "code", - "outputId": "38070c4c-90a7-474f-958e-b672d2318c2d", "colab": { "base_uri": "https://localhost:8080/", - "height": 512 - } + "height": 510 + }, + "outputId": "1db10ac7-a249-474a-b9f7-7d4e57af93c5" }, "source": [ "vect = CountVectorizer(preprocessor=clean, max_features=5000) #Step-1\n", @@ -512,13 +524,13 @@ "plot_confusion_matrix(cnf_matrix, classes=['Not Relevant','Relevant'],normalize=True,\n", " title='Confusion matrix with max 5000 features')" ], - "execution_count": 0, + "execution_count": 10, "outputs": [ { "output_type": "stream", "text": [ - "CPU times: user 5.24 ms, sys: 0 ns, total: 5.24 ms\n", - "Wall time: 5.25 ms\n", + "CPU times: user 5.32 ms, sys: 0 ns, total: 5.32 ms\n", + "Wall time: 5.33 ms\n", "Accuracy: 0.6876876876876877\n" ], "name": "stdout" @@ -526,7 +538,7 @@ { "output_type": "display_data", "data": { - "image/png": "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\n", + "image/png": "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\n", "text/plain": [ "
" ] @@ -553,11 +565,11 @@ "metadata": { "id": "0v7pM9hB5xbA", "colab_type": "code", - "outputId": "80d7503c-9d10-45a2-ff46-705ded6530a5", "colab": { "base_uri": "https://localhost:8080/", - "height": 634 - } + "height": 628 + }, + "outputId": "efcfc795-ad19-44fe-e557-67dc8301363c" }, "source": [ "from sklearn.linear_model import LogisticRegression #import\n", @@ -576,7 +588,7 @@ "plot_confusion_matrix(cnf_matrix, classes=['Not Relevant','Relevant'],normalize=True,\n", " title='Confusion matrix with normalization')" ], - "execution_count": 0, + "execution_count": 11, "outputs": [ { "output_type": "stream", @@ -603,7 +615,7 @@ { "output_type": "display_data", "data": { - "image/png": "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\n", + "image/png": "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\n", "text/plain": [ "
" ] @@ -630,11 +642,11 @@ "metadata": { "id": "XJLKusAQ5xbf", "colab_type": "code", - "outputId": "bffaee1e-548d-4997-d003-f3abd1d306e9", "colab": { "base_uri": "https://localhost:8080/", - "height": 529 - } + "height": 527 + }, + "outputId": "2d8342ee-cf45-45d5-8a08-cf996b6fbdd8" }, "source": [ "from sklearn.svm import LinearSVC\n", @@ -657,7 +669,7 @@ "plot_confusion_matrix(cnf_matrix, classes=['Not Relevant','Relevant'],normalize=True,\n", " title='Confusion matrix with normalization')" ], - "execution_count": 0, + "execution_count": 12, "outputs": [ { "output_type": "stream", @@ -670,7 +682,7 @@ { "output_type": "stream", "text": [ - "Accuracy: 0.6871871871871872\n", + "Accuracy: 0.6861861861861862\n", "AUC: 0.7251117679464362\n" ], "name": "stdout" @@ -678,7 +690,7 @@ { "output_type": "display_data", "data": { - "image/png": "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\n", + "image/png": "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\n", "text/plain": [ "
" ] @@ -699,6 +711,19 @@ "source": [ "So, how do we choose whats the best? If we look at overall accuracy alone, we should be choosing the very first classifier in this notebook. However, that is also doing poorly with identifying \"relevant\" articles. If we choose purely based on how good it is doing with \"relevant\" category, we should choose the second one we built. If we choose purely based on how good it is doing with \"irrelevant\" category, surely, nothing beats not building any classifier and just calling everything irrelevant! So, what to choose as the best among these depends on what we are looking for in our usecase! " ] + }, + { + "cell_type": "code", + "metadata": { + "id": "AcZ_zv34JUQt", + "colab_type": "code", + "colab": {} + }, + "source": [ + "" + ], + "execution_count": 12, + "outputs": [] } ] -} +} \ No newline at end of file diff --git a/Ch4/02_Doc2Vec_Example.ipynb b/Ch4/02_Doc2Vec_Example.ipynb index 546569b..ea63f5b 100644 --- a/Ch4/02_Doc2Vec_Example.ipynb +++ b/Ch4/02_Doc2Vec_Example.ipynb @@ -1,375 +1,474 @@ { - "cells": [ - { - "cell_type": "markdown", - "metadata": { - "colab_type": "text", - "id": "LCgVnQopb6TI" - }, - "source": [ - "# Doc2Vec demonstration \n", - "\n", - "In this notebook, let us take a look at how to \"learn\" document embeddings and use them for text classification. We will be using the dataset of \"Sentiment and Emotion in Text\" from [Kaggle](https://www.kaggle.com/c/sa-emotions/data).\n", - "\n", - "\"In a variation on the popular task of sentiment analysis, this dataset contains labels for the emotional content (such as happiness, sadness, and anger) of texts. Hundreds to thousands of examples across 13 labels. A subset of this data is used in an experiment we uploaded to Microsoft’s Cortana Intelligence Gallery.\"\n" - ] - }, - { - "cell_type": "code", - "execution_count": 0, - "metadata": { - "colab": {}, - "colab_type": "code", - "id": "hSB6W1seb6TJ" - }, - "outputs": [], - "source": [ - "import pandas as pd\n", - "from nltk.tokenize import TweetTokenizer\n", - "from nltk.corpus import stopwords\n", - "from sklearn.model_selection import train_test_split\n", - "from gensim.models.doc2vec import Doc2Vec, TaggedDocument" - ] + "nbformat": 4, + "nbformat_minor": 0, + "metadata": { + "colab": { + "name": "Doc2Vec_Example.ipynb", + "provenance": [] + }, + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.6.10" + } }, - { - "cell_type": "code", - "execution_count": 0, - "metadata": { - "colab": {}, - "colab_type": "code", - "id": "lSvnHBYPb6TQ", - "outputId": "76752204-4f72-4ab3-f783-44b1d854173d" - }, - "outputs": [ + "cells": [ { - "name": "stdout", - "output_type": "stream", - "text": [ - "(40000, 4)\n" - ] + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "LCgVnQopb6TI" + }, + "source": [ + "# Doc2Vec demonstration \n", + "\n", + "In this notebook, let us take a look at how to \"learn\" document embeddings and use them for text classification. We will be using the dataset of \"Sentiment and Emotion in Text\" from [Kaggle](https://www.kaggle.com/c/sa-emotions/data).\n", + "\n", + "\"In a variation on the popular task of sentiment analysis, this dataset contains labels for the emotional content (such as happiness, sadness, and anger) of texts. Hundreds to thousands of examples across 13 labels. A subset of this data is used in an experiment we uploaded to Microsoft’s Cortana Intelligence Gallery.\"\n" + ] }, { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
tweet_idsentimentauthorcontent
01956967341emptyxoshayzers@tiffanylue i know i was listenin to bad habi...
11956967666sadnesswannamamaLayin n bed with a headache ughhhh...waitin o...
21956967696sadnesscoolfunkyFuneral ceremony...gloomy friday...
31956967789enthusiasmczareaquinowants to hang out with friends SOON!
41956968416neutralxkilljoyx@dannycastillo We want to trade with someone w...
\n", - "
" + "cell_type": "code", + "metadata": { + "colab_type": "code", + "id": "hSB6W1seb6TJ", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 50 + }, + "outputId": "fa6730c6-06df-46ce-91c8-cd59211d24de" + }, + "source": [ + "import pandas as pd\n", + "import nltk\n", + "nltk.download('stopwords')\n", + "from nltk.tokenize import TweetTokenizer\n", + "from nltk.corpus import stopwords\n", + "from sklearn.model_selection import train_test_split\n", + "from gensim.models.doc2vec import Doc2Vec, TaggedDocument" ], - "text/plain": [ - " tweet_id sentiment author \\\n", - "0 1956967341 empty xoshayzers \n", - "1 1956967666 sadness wannamama \n", - "2 1956967696 sadness coolfunky \n", - "3 1956967789 enthusiasm czareaquino \n", - "4 1956968416 neutral xkilljoyx \n", - "\n", - " content \n", - "0 @tiffanylue i know i was listenin to bad habi... \n", - "1 Layin n bed with a headache ughhhh...waitin o... \n", - "2 Funeral ceremony...gloomy friday... \n", - "3 wants to hang out with friends SOON! \n", - "4 @dannycastillo We want to trade with someone w... " + "execution_count": 1, + "outputs": [ + { + "output_type": "stream", + "text": [ + "[nltk_data] Downloading package stopwords to /root/nltk_data...\n", + "[nltk_data] Package stopwords is already up-to-date!\n" + ], + "name": "stdout" + } ] - }, - "execution_count": 176, - "metadata": { - "tags": [] - }, - "output_type": "execute_result" - } - ], - "source": [ - "#Load the dataset and explore.\n", - "filepath = \"DATASET_PATH\"\n", - "df = pd.read_csv(filepath)\n", - "print(df.shape)\n", - "df.head()" - ] - }, - { - "cell_type": "code", - "execution_count": 0, - "metadata": { - "colab": {}, - "colab_type": "code", - "id": "5JEI6SH7b6TU", - "outputId": "1518cce3-afd2-48e2-ac51-c2c314d7329a" - }, - "outputs": [ + }, { - "data": { - "text/plain": [ - "neutral 8638\n", - "worry 8459\n", - "happiness 5209\n", - "sadness 5165\n", - "love 3842\n", - "surprise 2187\n", - "fun 1776\n", - "relief 1526\n", - "hate 1323\n", - "empty 827\n", - "enthusiasm 759\n", - "boredom 179\n", - "anger 110\n", - "Name: sentiment, dtype: int64" + "cell_type": "code", + "metadata": { + "id": "Fnv168QRJjxi", + "colab_type": "code", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 470 + }, + "outputId": "a99d7d74-d248-4fa0-bf66-916283ffd401" + }, + "source": [ + "#downloding data\n", + "!wget -P DATAPATH https://raw.githubusercontent.com/practical-nlp/practical-nlp/master/Ch4/Data/Sentiment%20and%20Emotion%20in%20Text/train_data.csv\n", + "!wget -P DATAPATH https://raw.githubusercontent.com/practical-nlp/practical-nlp/master/Ch4/Data/Sentiment%20and%20Emotion%20in%20Text/test_data.csv\n", + "!ls -lah DATAPATH" + ], + "execution_count": 2, + "outputs": [ + { + "output_type": "stream", + "text": [ + "--2020-08-10 11:36:06-- https://raw.githubusercontent.com/practical-nlp/practical-nlp/master/Ch4/Data/Sentiment%20and%20Emotion%20in%20Text/train_data.csv\n", + "Resolving raw.githubusercontent.com (raw.githubusercontent.com)... 151.101.0.133, 151.101.64.133, 151.101.128.133, ...\n", + "Connecting to raw.githubusercontent.com (raw.githubusercontent.com)|151.101.0.133|:443... connected.\n", + "HTTP request sent, awaiting response... 200 OK\n", + "Length: 2479133 (2.4M) [text/plain]\n", + "Saving to: ‘DATAPATH/train_data.csv’\n", + "\n", + "\rtrain_data.csv 0%[ ] 0 --.-KB/s \rtrain_data.csv 100%[===================>] 2.36M 14.7MB/s in 0.2s \n", + "\n", + "2020-08-10 11:36:07 (14.7 MB/s) - ‘DATAPATH/train_data.csv’ saved [2479133/2479133]\n", + "\n", + "--2020-08-10 11:36:08-- https://raw.githubusercontent.com/practical-nlp/practical-nlp/master/Ch4/Data/Sentiment%20and%20Emotion%20in%20Text/test_data.csv\n", + "Resolving raw.githubusercontent.com (raw.githubusercontent.com)... 151.101.0.133, 151.101.64.133, 151.101.128.133, ...\n", + "Connecting to raw.githubusercontent.com (raw.githubusercontent.com)|151.101.0.133|:443... connected.\n", + "HTTP request sent, awaiting response... 200 OK\n", + "Length: 783640 (765K) [text/plain]\n", + "Saving to: ‘DATAPATH/test_data.csv’\n", + "\n", + "test_data.csv 100%[===================>] 765.27K --.-KB/s in 0.1s \n", + "\n", + "2020-08-10 11:36:09 (6.78 MB/s) - ‘DATAPATH/test_data.csv’ saved [783640/783640]\n", + "\n", + "total 3.2M\n", + "drwxr-xr-x 2 root root 4.0K Aug 10 11:36 .\n", + "drwxr-xr-x 1 root root 4.0K Aug 10 11:36 ..\n", + "-rw-r--r-- 1 root root 766K Aug 10 11:36 test_data.csv\n", + "-rw-r--r-- 1 root root 2.4M Aug 10 11:36 train_data.csv\n" + ], + "name": "stdout" + } ] - }, - "execution_count": 177, - "metadata": { - "tags": [] - }, - "output_type": "execute_result" - } - ], - "source": [ - "df['sentiment'].value_counts()" - ] - }, - { - "cell_type": "code", - "execution_count": 0, - "metadata": { - "colab": {}, - "colab_type": "code", - "id": "CHajyKpmb6TY", - "outputId": "46661693-ae70-46cc-8a40-ab8196b5069b" - }, - "outputs": [ + }, { - "data": { - "text/plain": [ - "(22306, 4)" + "cell_type": "code", + "metadata": { + "colab_type": "code", + "id": "lSvnHBYPb6TQ", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 212 + }, + "outputId": "e2aac8d5-ef66-4e02-9949-32434f8cb537" + }, + "source": [ + "#Load the dataset and explore.\n", + "filepath = \"DATAPATH/train_data.csv\"\n", + "df = pd.read_csv(filepath)\n", + "print(df.shape)\n", + "df.head()" + ], + "execution_count": 2, + "outputs": [ + { + "output_type": "stream", + "text": [ + "(30000, 2)\n" + ], + "name": "stdout" + }, + { + "output_type": "execute_result", + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
sentimentcontent
0empty@tiffanylue i know i was listenin to bad habi...
1sadnessLayin n bed with a headache ughhhh...waitin o...
2sadnessFuneral ceremony...gloomy friday...
3enthusiasmwants to hang out with friends SOON!
4neutral@dannycastillo We want to trade with someone w...
\n", + "
" + ], + "text/plain": [ + " sentiment content\n", + "0 empty @tiffanylue i know i was listenin to bad habi...\n", + "1 sadness Layin n bed with a headache ughhhh...waitin o...\n", + "2 sadness Funeral ceremony...gloomy friday...\n", + "3 enthusiasm wants to hang out with friends SOON!\n", + "4 neutral @dannycastillo We want to trade with someone w..." + ] + }, + "metadata": { + "tags": [] + }, + "execution_count": 2 + } ] - }, - "execution_count": 178, - "metadata": { - "tags": [] - }, - "output_type": "execute_result" - } - ], - "source": [ - "#Let us take the top 3 categories and leave out the rest.\n", - "shortlist = ['neutral', \"happiness\", \"worry\"]\n", - "df_subset = df[df['sentiment'].isin(shortlist)]\n", - "df_subset.shape" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "colab_type": "text", - "id": "m2oiZzU5b6Tf" - }, - "source": [ - "# Text pre-processing:\n", - "Tweets are different. Somethings to consider:\n", - "- Removing @mentions, and urls perhaps?\n", - "- using NLTK Tweet tokenizer instead of a regular one\n", - "- stopwords, numbers as usual." - ] - }, - { - "cell_type": "code", - "execution_count": 0, - "metadata": { - "colab": {}, - "colab_type": "code", - "id": "Rl-FfMdLb6Th", - "outputId": "1688361f-c82f-4b0f-9a49-fa6e415f2095" - }, - "outputs": [ + }, { - "name": "stdout", - "output_type": "stream", - "text": [ - "22306 22306\n" - ] - } - ], - "source": [ - "#strip_handles removes personal information such as twitter handles, which don't\n", - "#contribute to emotion in the tweet. preserve_case=False converts everything to lowercase.\n", - "tweeter = TweetTokenizer(strip_handles=True,preserve_case=False)\n", - "mystopwords = set(stopwords.words(\"english\"))\n", - "\n", - "#Function to tokenize tweets, remove stopwords and numbers. \n", - "#Keeping punctuations and emoticon symbols could be relevant for this task!\n", - "def preprocess_corpus(texts):\n", - " def remove_stops_digits(tokens):\n", - " #Nested function that removes stopwords and digits from a list of tokens\n", - " return [token for token in tokens if token not in mystopwords and not token.isdigit()]\n", - " #This return statement below uses the above function to process twitter tokenizer output further. \n", - " return [remove_stops_digits(tweeter.tokenize(content)) for content in texts]\n", - "\n", - "#df_subset contains only the three categories we chose. \n", - "mydata = preprocess_corpus(df_subset['content'])\n", - "mycats = df_subset['sentiment']\n", - "print(len(mydata), len(mycats))" - ] - }, - { - "cell_type": "code", - "execution_count": 0, - "metadata": { - "colab": {}, - "colab_type": "code", - "id": "rsGwfVebb6Tl", - "outputId": "a39c6870-ef5b-45f4-b574-d94862ae1922" - }, - "outputs": [ + "cell_type": "code", + "metadata": { + "colab_type": "code", + "id": "5JEI6SH7b6TU", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 252 + }, + "outputId": "22cc98a5-90d0-49c9-fb58-f40d743963e9" + }, + "source": [ + "df['sentiment'].value_counts()" + ], + "execution_count": 3, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "worry 7433\n", + "neutral 6340\n", + "sadness 4828\n", + "happiness 2986\n", + "love 2068\n", + "surprise 1613\n", + "hate 1187\n", + "fun 1088\n", + "relief 1021\n", + "empty 659\n", + "enthusiasm 522\n", + "boredom 157\n", + "anger 98\n", + "Name: sentiment, dtype: int64" + ] + }, + "metadata": { + "tags": [] + }, + "execution_count": 3 + } + ] + }, { - "name": "stdout", - "output_type": "stream", - "text": [ - "Model Saved\n" - ] - } - ], - "source": [ - "#Split data into train and test, following the usual process\n", - "train_data, test_data, train_cats, test_cats = train_test_split(mydata,mycats,random_state=1234)\n", - "\n", - "#prepare training data in doc2vec format:\n", - "train_doc2vec = [TaggedDocument((d), tags=[str(i)]) for i, d in enumerate(train_data)]\n", - "#Train a doc2vec model to learn tweet representations. Use only training data!!\n", - "model = Doc2Vec(vector_size=50, alpha=0.025, min_count=10, dm =1, epochs=100)\n", - "model.build_vocab(train_doc2vec)\n", - "model.train(train_doc2vec, total_examples=model.corpus_count, epochs=model.epochs)\n", - "model.save(\"d2v.model\")\n", - "print(\"Model Saved\")" - ] - }, - { - "cell_type": "code", - "execution_count": 0, - "metadata": { - "colab": {}, - "colab_type": "code", - "id": "hTqo26Vsb6Ts", - "outputId": "1fadf3cc-1238-4512-9d50-2b1402f0fe8c" - }, - "outputs": [ + "cell_type": "code", + "metadata": { + "colab_type": "code", + "id": "CHajyKpmb6TY", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 34 + }, + "outputId": "8749211d-1a7c-43c9-bf40-d4d22e74407a" + }, + "source": [ + "#Let us take the top 3 categories and leave out the rest.\n", + "shortlist = ['neutral', \"happiness\", \"worry\"]\n", + "df_subset = df[df['sentiment'].isin(shortlist)]\n", + "df_subset.shape" + ], + "execution_count": 4, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "(16759, 2)" + ] + }, + "metadata": { + "tags": [] + }, + "execution_count": 4 + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "m2oiZzU5b6Tf" + }, + "source": [ + "# Text pre-processing:\n", + "Tweets are different. Somethings to consider:\n", + "- Removing @mentions, and urls perhaps?\n", + "- using NLTK Tweet tokenizer instead of a regular one\n", + "- stopwords, numbers as usual." + ] + }, + { + "cell_type": "code", + "metadata": { + "colab_type": "code", + "id": "Rl-FfMdLb6Th", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 34 + }, + "outputId": "6273576c-0495-4606-da02-a7d06358ab2d" + }, + "source": [ + "#strip_handles removes personal information such as twitter handles, which don't\n", + "#contribute to emotion in the tweet. preserve_case=False converts everything to lowercase.\n", + "tweeter = TweetTokenizer(strip_handles=True,preserve_case=False)\n", + "mystopwords = set(stopwords.words(\"english\"))\n", + "\n", + "#Function to tokenize tweets, remove stopwords and numbers. \n", + "#Keeping punctuations and emoticon symbols could be relevant for this task!\n", + "def preprocess_corpus(texts):\n", + " def remove_stops_digits(tokens):\n", + " #Nested function that removes stopwords and digits from a list of tokens\n", + " return [token for token in tokens if token not in mystopwords and not token.isdigit()]\n", + " #This return statement below uses the above function to process twitter tokenizer output further. \n", + " return [remove_stops_digits(tweeter.tokenize(content)) for content in texts]\n", + "\n", + "#df_subset contains only the three categories we chose. \n", + "mydata = preprocess_corpus(df_subset['content'])\n", + "mycats = df_subset['sentiment']\n", + "print(len(mydata), len(mycats))" + ], + "execution_count": 5, + "outputs": [ + { + "output_type": "stream", + "text": [ + "16759 16759\n" + ], + "name": "stdout" + } + ] + }, { - "name": "stdout", - "output_type": "stream", - "text": [ - " precision recall f1-score support\n", - "\n", - " happiness 0.51 0.47 0.49 1331\n", - " neutral 0.47 0.58 0.52 2143\n", - " worry 0.55 0.44 0.49 2103\n", - "\n", - "avg / total 0.51 0.50 0.50 5577\n", - "\n" - ] + "cell_type": "code", + "metadata": { + "colab_type": "code", + "id": "rsGwfVebb6Tl", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 87 + }, + "outputId": "ce668f41-578a-467e-d3e7-20ea66b53c6d" + }, + "source": [ + "#Split data into train and test, following the usual process\n", + "train_data, test_data, train_cats, test_cats = train_test_split(mydata,mycats,random_state=1234)\n", + "\n", + "#prepare training data in doc2vec format:\n", + "train_doc2vec = [TaggedDocument((d), tags=[str(i)]) for i, d in enumerate(train_data)]\n", + "#Train a doc2vec model to learn tweet representations. Use only training data!!\n", + "model = Doc2Vec(vector_size=50, alpha=0.025, min_count=5, dm =1, epochs=100)\n", + "model.build_vocab(train_doc2vec)\n", + "model.train(train_doc2vec, total_examples=model.corpus_count, epochs=model.epochs)\n", + "model.save(\"d2v.model\")\n", + "print(\"Model Saved\")" + ], + "execution_count": 6, + "outputs": [ + { + "output_type": "stream", + "text": [ + "Model Saved\n" + ], + "name": "stdout" + }, + { + "output_type": "stream", + "text": [ + "/usr/local/lib/python3.6/dist-packages/smart_open/smart_open_lib.py:254: UserWarning: This function is deprecated, use smart_open.open instead. See the migration notes for details: https://github.com/RaRe-Technologies/smart_open/blob/master/README.rst#migrating-to-the-new-open-function\n", + " 'See the migration notes for details: %s' % _MIGRATION_NOTES_URL\n" + ], + "name": "stderr" + } + ] + }, + { + "cell_type": "code", + "metadata": { + "colab_type": "code", + "id": "hTqo26Vsb6Ts", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 238 + }, + "outputId": "13f5218a-a22d-400d-bd9e-d53a51c767d7" + }, + "source": [ + "#Infer the feature representation for training and test data using the trained model\n", + "model= Doc2Vec.load(\"d2v.model\")\n", + "#infer in multiple steps to get a stable representation. \n", + "train_vectors = [model.infer_vector(list_of_tokens, steps=50) for list_of_tokens in train_data]\n", + "test_vectors = [model.infer_vector(list_of_tokens, steps=50) for list_of_tokens in test_data]\n", + "\n", + "#Use any regular classifier like logistic regression\n", + "from sklearn.linear_model import LogisticRegression\n", + "\n", + "myclass = LogisticRegression(class_weight=\"balanced\") #because classes are not balanced. \n", + "myclass.fit(train_vectors, train_cats)\n", + "\n", + "preds = myclass.predict(test_vectors)\n", + "from sklearn.metrics import classification_report, confusion_matrix\n", + "print(classification_report(test_cats, preds))\n", + "\n", + "#print(confusion_matrix(test_cats,preds))\n" + ], + "execution_count": 7, + "outputs": [ + { + "output_type": "stream", + "text": [ + "/usr/local/lib/python3.6/dist-packages/smart_open/smart_open_lib.py:254: UserWarning: This function is deprecated, use smart_open.open instead. See the migration notes for details: https://github.com/RaRe-Technologies/smart_open/blob/master/README.rst#migrating-to-the-new-open-function\n", + " 'See the migration notes for details: %s' % _MIGRATION_NOTES_URL\n" + ], + "name": "stderr" + }, + { + "output_type": "stream", + "text": [ + " precision recall f1-score support\n", + "\n", + " happiness 0.35 0.53 0.42 713\n", + " neutral 0.48 0.55 0.51 1595\n", + " worry 0.61 0.40 0.48 1882\n", + "\n", + " accuracy 0.48 4190\n", + " macro avg 0.48 0.50 0.47 4190\n", + "weighted avg 0.51 0.48 0.48 4190\n", + "\n" + ], + "name": "stdout" + } + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "FQuoinmiK_jG", + "colab_type": "code", + "colab": {} + }, + "source": [ + "" + ], + "execution_count": null, + "outputs": [] } - ], - "source": [ - "#Infer the feature representation for training and test data using the trained model\n", - "model= Doc2Vec.load(\"d2v.model\")\n", - "#infer in multiple steps to get a stable representation. \n", - "train_vectors = [model.infer_vector(list_of_tokens, steps=50) for list_of_tokens in train_data]\n", - "test_vectors = [model.infer_vector(list_of_tokens, steps=50) for list_of_tokens in test_data]\n", - "\n", - "#Use any regular classifier like logistic regression\n", - "from sklearn.linear_model import LogisticRegression\n", - "\n", - "myclass = LogisticRegression(class_weight=\"balanced\") #because classes are not balanced. \n", - "myclass.fit(train_vectors, train_cats)\n", - "\n", - "preds = myclass.predict(test_vectors)\n", - "from sklearn.metrics import classification_report, confusion_matrix\n", - "print(classification_report(test_cats, preds))\n", - "\n", - "#print(confusion_matrix(test_cats,preds))\n" - ] - } - ], - "metadata": { - "colab": { - "name": "Doc2Vec_Example.ipynb", - "provenance": [] - }, - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.6.10" - } - }, - "nbformat": 4, - "nbformat_minor": 1 -} + ] +} \ No newline at end of file diff --git a/Ch4/04_FastText_Example.ipynb b/Ch4/04_FastText_Example.ipynb index b88d33f..8a98d80 100644 --- a/Ch4/04_FastText_Example.ipynb +++ b/Ch4/04_FastText_Example.ipynb @@ -1,390 +1,542 @@ { - "cells": [ - { - "cell_type": "markdown", - "metadata": { - "colab_type": "text", - "id": "6FIToZHAhz2O" - }, - "source": [ - "In this notebook we will demonstrate using the fastText library to perform text classificatoin on the dbpedie data which can we downloaded from [here](https://github.com/le-scientifique/torchDatasets/raw/master/dbpedia_csv.tar.gz).
fastText is a library for learning of word embeddings and text classification created by Facebook's AI Research (FAIR) lab. The model allows to create an unsupervised learning or supervised learning algorithm for obtaining vector representations for words. Facebook makes available pretrained models for 294 languages(source: [wiki](https://en.wikipedia.org/wiki/FastText)).
\n", - "**Note**: This notebook uses an older version of fasttext." - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": { - "colab": {}, - "colab_type": "code", - "id": "YKgZXvTGb61z" - }, - "outputs": [], - "source": [ - "#necessary imports\n", - "import pandas as pd\n", - "from time import time\n", - "from fasttext import supervised " - ] - }, - { - "cell_type": "code", - "execution_count": 0, - "metadata": { - "colab": {}, - "colab_type": "code", - "id": "lMoRw3oQb62I", - "outputId": "370aaaab-6613-4631-bb88-e00d746a5100" - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Train:(560000, 3) Test:(70000, 3)\n" - ] + "nbformat": 4, + "nbformat_minor": 0, + "metadata": { + "colab": { + "name": "FastText_Example.ipynb", + "provenance": [] + }, + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.6.10" } - ], - "source": [ - "data_path = 'DATAFOLDER_PATH'\n", - "# Loading train data\n", - "train_file = data_path + 'dbpedia_csv/train.csv'\n", - "df = pd.read_csv(train_file, header=None, names=['class','name','description'])\n", - "# Loading test data\n", - "test_file = data_path + 'dbpedia_csv/test.csv'\n", - "df_test = pd.read_csv(test_file, header=None, names=['class','name','description'])\n", - "# Data we have\n", - "print(\"Train:{} Test:{}\".format(df.shape,df_test.shape))\n" - ] }, - { - "cell_type": "code", - "execution_count": 0, - "metadata": { - "colab": {}, - "colab_type": "code", - "id": "gaz226vXb62W", - "outputId": "cbe39521-6bd0-4d5f-ddf1-bae279784d16" - }, - "outputs": [ + "cells": [ { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
classnamedescriptionclass_name
01E. D. Abbott LtdAbbott of Farnham E D Abbott Limited was a Br...Company
11Schwan-StabiloSchwan-STABILO is a German maker of pens for ...Company
21Q-workshopQ-workshop is a Polish company located in Poz...Company
31Marvell Software Solutions IsraelMarvell Software Solutions Israel known as RA...Company
41Bergan Mercy Medical CenterBergan Mercy Medical Center is a hospital loc...Company
\n", - "
" + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "6FIToZHAhz2O" + }, + "source": [ + "In this notebook we will demonstrate using the fastText library to perform text classificatoin on the dbpedie data which can we downloaded from [here](https://github.com/le-scientifique/torchDatasets/raw/master/dbpedia_csv.tar.gz).
fastText is a library for learning of word embeddings and text classification created by Facebook's AI Research (FAIR) lab. The model allows to create an unsupervised learning or supervised learning algorithm for obtaining vector representations for words. Facebook makes available pretrained models for 294 languages(source: [wiki](https://en.wikipedia.org/wiki/FastText)).
\n", + "**Note**: This notebook uses an older version of fasttext." + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "xC9f1uA-OX8J", + "colab_type": "code", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 235 + }, + "outputId": "02dfd2ba-06ee-403a-dde6-a2b3ae61014c" + }, + "source": [ + "!pip install fasttext==0.9.2" ], - "text/plain": [ - " class name \\\n", - "0 1 E. D. Abbott Ltd \n", - "1 1 Schwan-Stabilo \n", - "2 1 Q-workshop \n", - "3 1 Marvell Software Solutions Israel \n", - "4 1 Bergan Mercy Medical Center \n", - "\n", - " description class_name \n", - "0 Abbott of Farnham E D Abbott Limited was a Br... Company \n", - "1 Schwan-STABILO is a German maker of pens for ... Company \n", - "2 Q-workshop is a Polish company located in Poz... Company \n", - "3 Marvell Software Solutions Israel known as RA... Company \n", - "4 Bergan Mercy Medical Center is a hospital loc... Company " + "execution_count": 15, + "outputs": [ + { + "output_type": "stream", + "text": [ + "Collecting fasttext==0.9.2\n", + "\u001b[?25l Downloading https://files.pythonhosted.org/packages/f8/85/e2b368ab6d3528827b147fdb814f8189acc981a4bc2f99ab894650e05c40/fasttext-0.9.2.tar.gz (68kB)\n", + "\r\u001b[K |████▊ | 10kB 17.9MB/s eta 0:00:01\r\u001b[K |█████████▌ | 20kB 1.7MB/s eta 0:00:01\r\u001b[K |██████████████▎ | 30kB 2.2MB/s eta 0:00:01\r\u001b[K |███████████████████ | 40kB 2.5MB/s eta 0:00:01\r\u001b[K |███████████████████████▉ | 51kB 2.0MB/s eta 0:00:01\r\u001b[K |████████████████████████████▋ | 61kB 2.2MB/s eta 0:00:01\r\u001b[K |████████████████████████████████| 71kB 1.9MB/s \n", + "\u001b[?25hRequirement already satisfied: pybind11>=2.2 in /usr/local/lib/python3.6/dist-packages (from fasttext==0.9.2) (2.5.0)\n", + "Requirement already satisfied: setuptools>=0.7.0 in /usr/local/lib/python3.6/dist-packages (from fasttext==0.9.2) (49.2.0)\n", + "Requirement already satisfied: numpy in /usr/local/lib/python3.6/dist-packages (from fasttext==0.9.2) (1.18.5)\n", + "Building wheels for collected packages: fasttext\n", + " Building wheel for fasttext (setup.py) ... \u001b[?25l\u001b[?25hdone\n", + " Created wheel for fasttext: filename=fasttext-0.9.2-cp36-cp36m-linux_x86_64.whl size=3020301 sha256=b65b73f96edcad8906e88913fc050bb28348ae2d57360e7df66ab675a73822e0\n", + " Stored in directory: /root/.cache/pip/wheels/98/ba/7f/b154944a1cf5a8cee91c154b75231136cc3a3321ab0e30f592\n", + "Successfully built fasttext\n", + "Installing collected packages: fasttext\n", + "Successfully installed fasttext-0.9.2\n" + ], + "name": "stdout" + } ] - }, - "execution_count": 64, - "metadata": { - "tags": [] - }, - "output_type": "execute_result" - } - ], - "source": [ - "# Since we have no clue about the classes lets build one\n", - "# Mapping from class number to class name\n", - "class_dict={\n", - " 1:'Company',\n", - " 2:'EducationalInstitution',\n", - " 3:'Artist',\n", - " 4:'Athlete',\n", - " 5:'OfficeHolder',\n", - " 6:'MeanOfTransportation',\n", - " 7:'Building',\n", - " 8:'NaturalPlace',\n", - " 9:'Village',\n", - " 10:'Animal',\n", - " 11:'Plant',\n", - " 12:'Album',\n", - " 13:'Film',\n", - " 14:'WrittenWork'\n", - " }\n", - "\n", - "# Mapping the classes\n", - "df['class_name'] = df['class'].map(class_dict)\n", - "df.head()" - ] - }, - { - "cell_type": "code", - "execution_count": 0, - "metadata": { - "colab": {}, - "colab_type": "code", - "id": "si7VC_Rub62a", - "outputId": "78f5b32b-79e5-4a37-d855-ce16219244be" - }, - "outputs": [ + }, + { + "cell_type": "code", + "metadata": { + "colab_type": "code", + "id": "YKgZXvTGb61z", + "colab": {} + }, + "source": [ + "#necessary imports\n", + "import pandas as pd" + ], + "execution_count": 1, + "outputs": [] + }, { - "data": { - "text/plain": [ - "NaturalPlace 40000\n", - "Athlete 40000\n", - "MeanOfTransportation 40000\n", - "Company 40000\n", - "Animal 40000\n", - "Album 40000\n", - "Village 40000\n", - "Plant 40000\n", - "WrittenWork 40000\n", - "Film 40000\n", - "OfficeHolder 40000\n", - "Building 40000\n", - "EducationalInstitution 40000\n", - "Artist 40000\n", - "Name: class_name, dtype: int64" + "cell_type": "code", + "metadata": { + "id": "l6CfW7C3L4EB", + "colab_type": "code", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 588 + }, + "outputId": "f9708301-c566-4094-ad24-ecee460052db" + }, + "source": [ + "# downloading the data\n", + "!wget -P DATAPATH https://github.com/le-scientifique/torchDatasets/raw/master/dbpedia_csv.tar.gz\n", + "\n", + "# untaring the reuqired file\n", + "!tar -xvf DATAPATH/dbpedia_csv.tar.gz -C DATAPATH\n", + "\n", + "# sneek peek in the folder structure\n", + "!ls -lah DATAPATH\n" + ], + "execution_count": 2, + "outputs": [ + { + "output_type": "stream", + "text": [ + "--2020-08-10 15:31:17-- https://github.com/le-scientifique/torchDatasets/raw/master/dbpedia_csv.tar.gz\n", + "Resolving github.com (github.com)... 140.82.114.4\n", + "Connecting to github.com (github.com)|140.82.114.4|:443... connected.\n", + "HTTP request sent, awaiting response... 301 Moved Permanently\n", + "Location: https://github.com/srhrshr/torchDatasets/raw/master/dbpedia_csv.tar.gz [following]\n", + "--2020-08-10 15:31:17-- https://github.com/srhrshr/torchDatasets/raw/master/dbpedia_csv.tar.gz\n", + "Reusing existing connection to github.com:443.\n", + "HTTP request sent, awaiting response... 302 Found\n", + "Location: https://raw.githubusercontent.com/srhrshr/torchDatasets/master/dbpedia_csv.tar.gz [following]\n", + "--2020-08-10 15:31:17-- https://raw.githubusercontent.com/srhrshr/torchDatasets/master/dbpedia_csv.tar.gz\n", + "Resolving raw.githubusercontent.com (raw.githubusercontent.com)... 151.101.0.133, 151.101.64.133, 151.101.128.133, ...\n", + "Connecting to raw.githubusercontent.com (raw.githubusercontent.com)|151.101.0.133|:443... failed: Connection timed out.\n", + "Connecting to raw.githubusercontent.com (raw.githubusercontent.com)|151.101.64.133|:443... connected.\n", + "HTTP request sent, awaiting response... 200 OK\n", + "Length: 68431223 (65M) [application/octet-stream]\n", + "Saving to: ‘DATAPATH/dbpedia_csv.tar.gz.1’\n", + "\n", + "dbpedia_csv.tar.gz. 100%[===================>] 65.26M 81.3MB/s in 0.8s \n", + "\n", + "2020-08-10 15:31:50 (81.3 MB/s) - ‘DATAPATH/dbpedia_csv.tar.gz.1’ saved [68431223/68431223]\n", + "\n", + "dbpedia_csv/\n", + "dbpedia_csv/test.csv\n", + "dbpedia_csv/classes.txt\n", + "dbpedia_csv/train.csv\n", + "dbpedia_csv/readme.txt\n", + "total 328M\n", + "drwxr-xr-x 3 root root 4.0K Aug 10 15:31 .\n", + "drwxr-xr-x 1 root root 4.0K Aug 10 12:14 ..\n", + "drwxrwxr-x 2 1000 1000 4.0K Mar 29 2015 dbpedia_csv\n", + "-rw-r--r-- 1 root root 66M Aug 10 12:14 dbpedia_csv.tar.gz\n", + "-rw-r--r-- 1 root root 66M Aug 10 15:31 dbpedia_csv.tar.gz.1\n", + "-rw-r--r-- 1 root root 22M Aug 10 12:15 dbpedia_test.csv\n", + "-rw-r--r-- 1 root root 175M Aug 10 12:15 dbpedia_train.csv\n" + ], + "name": "stdout" + } ] - }, - "execution_count": 65, - "metadata": { - "tags": [] - }, - "output_type": "execute_result" - } - ], - "source": [ - "df[\"class_name\"].value_counts()" - ] - }, - { - "cell_type": "code", - "execution_count": 0, - "metadata": { - "colab": {}, - "colab_type": "code", - "id": "Sn-3kIqMb62d" - }, - "outputs": [], - "source": [ - "# Lets do some cleaning of this text\n", - "def clean_it(text,normalize=True):\n", - " # Replacing possible issues with data. We can add or reduce the replacemtent in this chain\n", - " s = str(text).replace(',',' ').replace('\"','').replace('\\'',' \\' ').replace('.',' . ').replace('(',' ( ').\\\n", - " replace(')',' ) ').replace('!',' ! ').replace('?',' ? ').replace(':',' ').replace(';',' ').lower()\n", - " \n", - " # normalizing / encoding the text\n", - " if normalize:\n", - " s = s.normalize('NFKD').str.encode('ascii','ignore').str.decode('utf-8')\n", - " \n", - " return s\n", - "\n", - "# Now lets define a small function where we can use above cleaning on datasets\n", - "def clean_df(data, cleanit= False, shuffleit=False, encodeit=False, label_prefix='__class__'):\n", - " # Defining the new data\n", - " df = data[['name','description']].copy(deep=True)\n", - " df['class'] = label_prefix + data['class'].astype(str) + ' '\n", - " \n", - " # cleaning it\n", - " if cleanit:\n", - " df['name'] = df['name'].apply(lambda x: clean_it(x,encodeit))\n", - " df['description'] = df['description'].apply(lambda x: clean_it(x,encodeit))\n", - " \n", - " # shuffling it\n", - " if shuffleit:\n", - " df.sample(frac=1).reset_index(drop=True)\n", - " \n", - " return df" - ] - }, - { - "cell_type": "code", - "execution_count": 0, - "metadata": { - "colab": {}, - "colab_type": "code", - "id": "r_DRvdFcb62m", - "outputId": "ba503528-7d01-438b-f7fb-2879874e0a0c" - }, - "outputs": [ + }, { - "name": "stdout", - "output_type": "stream", - "text": [ - "CPU times: user 4.44 s, sys: 68.1 ms, total: 4.51 s\n", - "Wall time: 4.51 s\n" - ] - } - ], - "source": [ - "%%time\n", - "# Transform the datasets using the above clean functions\n", - "df_train_cleaned = clean_df(df, True, True)\n", - "df_test_cleaned = clean_df(df_test, True, True)" - ] - }, - { - "cell_type": "code", - "execution_count": 0, - "metadata": { - "colab": {}, - "colab_type": "code", - "id": "imMZ9-Bkb62t" - }, - "outputs": [], - "source": [ - "# Write files to disk as fastText classifier API reads files from disk.\n", - "train_file = data_path + 'dbpedia_train.csv'\n", - "df_train_cleaned.to_csv(train_file, header=None, index=False, columns=['class','name','description'] )\n", - "\n", - "test_file = data_path + 'dbpedia_test.csv'\n", - "df_test_cleaned.to_csv(test_file, header=None, index=False, columns=['class','name','description'] )\n" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "colab_type": "text", - "id": "bWZTSzd9b62x" - }, - "source": [ - "Now that we have the train and test files written into disk in a format fastText wants, we are ready to use it for text classification!" - ] - }, - { - "cell_type": "code", - "execution_count": 0, - "metadata": { - "colab": {}, - "colab_type": "code", - "id": "a-H1wouCb62x", - "outputId": "f85a632e-d2b2-4b60-d0e2-93896645947c" - }, - "outputs": [ + "cell_type": "code", + "metadata": { + "colab_type": "code", + "id": "lMoRw3oQb62I", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 34 + }, + "outputId": "4a9015af-de57-41f3-d932-fa255e48063f" + }, + "source": [ + "data_path = 'DATAPATH'\n", + "# Loading train data\n", + "train_file = data_path + '/dbpedia_csv/train.csv'\n", + "df = pd.read_csv(train_file, header=None, names=['class','name','description'])\n", + "# Loading test data\n", + "test_file = data_path + '/dbpedia_csv/test.csv'\n", + "df_test = pd.read_csv(test_file, header=None, names=['class','name','description'])\n", + "# Data we have\n", + "print(\"Train:{} Test:{}\".format(df.shape,df_test.shape))\n" + ], + "execution_count": 3, + "outputs": [ + { + "output_type": "stream", + "text": [ + "Train:(560000, 3) Test:(70000, 3)\n" + ], + "name": "stdout" + } + ] + }, + { + "cell_type": "code", + "metadata": { + "colab_type": "code", + "id": "gaz226vXb62W", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 195 + }, + "outputId": "9136af68-a5d9-4041-d13c-52d26c38a59c" + }, + "source": [ + "# Since we have no clue about the classes lets build one\n", + "# Mapping from class number to class name\n", + "class_dict={\n", + " 1:'Company',\n", + " 2:'EducationalInstitution',\n", + " 3:'Artist',\n", + " 4:'Athlete',\n", + " 5:'OfficeHolder',\n", + " 6:'MeanOfTransportation',\n", + " 7:'Building',\n", + " 8:'NaturalPlace',\n", + " 9:'Village',\n", + " 10:'Animal',\n", + " 11:'Plant',\n", + " 12:'Album',\n", + " 13:'Film',\n", + " 14:'WrittenWork'\n", + " }\n", + "\n", + "# Mapping the classes\n", + "df['class_name'] = df['class'].map(class_dict)\n", + "df.head()" + ], + "execution_count": 4, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
classnamedescriptionclass_name
01E. D. Abbott LtdAbbott of Farnham E D Abbott Limited was a Br...Company
11Schwan-StabiloSchwan-STABILO is a German maker of pens for ...Company
21Q-workshopQ-workshop is a Polish company located in Poz...Company
31Marvell Software Solutions IsraelMarvell Software Solutions Israel known as RA...Company
41Bergan Mercy Medical CenterBergan Mercy Medical Center is a hospital loc...Company
\n", + "
" + ], + "text/plain": [ + " class ... class_name\n", + "0 1 ... Company\n", + "1 1 ... Company\n", + "2 1 ... Company\n", + "3 1 ... Company\n", + "4 1 ... Company\n", + "\n", + "[5 rows x 4 columns]" + ] + }, + "metadata": { + "tags": [] + }, + "execution_count": 4 + } + ] + }, + { + "cell_type": "code", + "metadata": { + "colab_type": "code", + "id": "si7VC_Rub62a", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 269 + }, + "outputId": "8c8e6220-8028-460c-8042-95b9fa25152b" + }, + "source": [ + "df[\"class_name\"].value_counts()" + ], + "execution_count": 5, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "Athlete 40000\n", + "Animal 40000\n", + "MeanOfTransportation 40000\n", + "Artist 40000\n", + "OfficeHolder 40000\n", + "Building 40000\n", + "Plant 40000\n", + "WrittenWork 40000\n", + "EducationalInstitution 40000\n", + "Village 40000\n", + "NaturalPlace 40000\n", + "Company 40000\n", + "Film 40000\n", + "Album 40000\n", + "Name: class_name, dtype: int64" + ] + }, + "metadata": { + "tags": [] + }, + "execution_count": 5 + } + ] + }, + { + "cell_type": "code", + "metadata": { + "colab_type": "code", + "id": "Sn-3kIqMb62d", + "colab": {} + }, + "source": [ + "# Lets do some cleaning of this text\n", + "def clean_it(text,normalize=True):\n", + " # Replacing possible issues with data. We can add or reduce the replacemtent in this chain\n", + " s = str(text).replace(',',' ').replace('\"','').replace('\\'',' \\' ').replace('.',' . ').replace('(',' ( ').\\\n", + " replace(')',' ) ').replace('!',' ! ').replace('?',' ? ').replace(':',' ').replace(';',' ').lower()\n", + " \n", + " # normalizing / encoding the text\n", + " if normalize:\n", + " s = s.normalize('NFKD').str.encode('ascii','ignore').str.decode('utf-8')\n", + " \n", + " return s\n", + "\n", + "# Now lets define a small function where we can use above cleaning on datasets\n", + "def clean_df(data, cleanit= False, shuffleit=False, encodeit=False, label_prefix='__class__'):\n", + " # Defining the new data\n", + " df = data[['name','description']].copy(deep=True)\n", + " df['class'] = label_prefix + data['class'].astype(str) + ' '\n", + " \n", + " # cleaning it\n", + " if cleanit:\n", + " df['name'] = df['name'].apply(lambda x: clean_it(x,encodeit))\n", + " df['description'] = df['description'].apply(lambda x: clean_it(x,encodeit))\n", + " \n", + " # shuffling it\n", + " if shuffleit:\n", + " df.sample(frac=1).reset_index(drop=True)\n", + " \n", + " return df" + ], + "execution_count": 6, + "outputs": [] + }, + { + "cell_type": "code", + "metadata": { + "colab_type": "code", + "id": "r_DRvdFcb62m", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 50 + }, + "outputId": "140ec680-99f8-4f2d-c00f-ebbb1cd5e9ae" + }, + "source": [ + "%%time\n", + "# Transform the datasets using the above clean functions\n", + "df_train_cleaned = clean_df(df, True, True)\n", + "df_test_cleaned = clean_df(df_test, True, True)" + ], + "execution_count": 7, + "outputs": [ + { + "output_type": "stream", + "text": [ + "CPU times: user 9 s, sys: 1.16 s, total: 10.2 s\n", + "Wall time: 10.5 s\n" + ], + "name": "stdout" + } + ] + }, + { + "cell_type": "code", + "metadata": { + "colab_type": "code", + "id": "imMZ9-Bkb62t", + "colab": {} + }, + "source": [ + "# Write files to disk as fastText classifier API reads files from disk.\n", + "train_file = data_path + '/dbpedia_train.csv'\n", + "df_train_cleaned.to_csv(train_file, header=None, index=False, columns=['class','name','description'] )\n", + "\n", + "test_file = data_path + '/dbpedia_test.csv'\n", + "df_test_cleaned.to_csv(test_file, header=None, index=False, columns=['class','name','description'] )\n" + ], + "execution_count": 8, + "outputs": [] + }, { - "name": "stdout", - "output_type": "stream", - "text": [ - "CPU times: user 56.5 s, sys: 1.51 s, total: 58 s\n", - "Wall time: 12.6 s\n", - "70000 0.9710571428571428 0.9710571428571428\n" - ] + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "bWZTSzd9b62x" + }, + "source": [ + "Now that we have the train and test files written into disk in a format fastText wants, we are ready to use it for text classification!" + ] + }, + { + "cell_type": "code", + "metadata": { + "colab_type": "code", + "id": "a-H1wouCb62x", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 52 + }, + "outputId": "c4f88ae8-0314-480e-e201-6a905a0b3fdb" + }, + "source": [ + "%%time\n", + "## Using fastText for feature extraction and training\n", + "from fasttext import train_supervised \n", + "\"\"\"fastText expects and training file (csv), a model name as input arguments.\n", + "label_prefix refers to the prefix before label string in the dataset.\n", + "default is __label__. In our dataset, it is __class__. \n", + "There are several other parameters which can be seen in: \n", + "https://pypi.org/project/fasttext/\n", + "\"\"\"\n", + "model = train_supervised(input=train_file, label=\"__class__\", lr=1.0, epoch=75, loss='ova', wordNgrams=2, dim=200, thread=2, verbose=100)" + ], + "execution_count": 18, + "outputs": [ + { + "output_type": "stream", + "text": [ + "CPU times: user 1h 30min 19s, sys: 25 s, total: 1h 30min 44s\n", + "Wall time: 46min 33s\n" + ], + "name": "stdout" + } + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "sAyN3ZDbQFq-", + "colab_type": "code", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 106 + }, + "outputId": "7b121c71-6605-4e10-86e9-753a24ae02a1" + }, + "source": [ + "for k in range(1,6):\n", + " results = model.test(test_file,k=k)\n", + " print(f\"Test Samples: {results[0]} Precision@{k} : {results[1]*100:2.4f} Recall@{k} : {results[2]*100:2.4f}\")" + ], + "execution_count": 19, + "outputs": [ + { + "output_type": "stream", + "text": [ + "Test Samples: 70000 Precision@1 : 93.2914 Recall@1 : 93.2914\n", + "Test Samples: 70000 Precision@2 : 48.7243 Recall@2 : 97.4486\n", + "Test Samples: 70000 Precision@3 : 32.6376 Recall@3 : 97.9129\n", + "Test Samples: 70000 Precision@4 : 24.6793 Recall@4 : 98.7171\n", + "Test Samples: 70000 Precision@5 : 19.8411 Recall@5 : 99.2057\n" + ], + "name": "stdout" + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "nrxSYRs3b621" + }, + "source": [ + "Try training a classifier on this dataset with, say, LogisticRegression to realize how fast fastText is! 93% Precision and Recall are hard numbers to beat, too!" + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "Bp9w8RScruz7", + "colab_type": "code", + "colab": {} + }, + "source": [ + "" + ], + "execution_count": null, + "outputs": [] } - ], - "source": [ - "## Using fastText for feature extraction and training\n", - "from fasttext import supervised \n", - "\"\"\"fastText expects and training file (csv), a model name as input arguments.\n", - "label_prefix refers to the prefix before label string in the dataset.\n", - "default is __label__. In our dataset, it is __class__. \n", - "There are several other parameters which can be seen in: \n", - "https://pypi.org/project/fasttext/\n", - "\"\"\"\n", - "%time model = supervised(train_file, 'temp', label_prefix=\"__class__\")\n", - "results = model.test(test_file)\n", - "print(results.nexamples, results.precision, results.recall)" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "colab_type": "text", - "id": "nrxSYRs3b621" - }, - "source": [ - "Try training a classifier on this dataset with, say, LogisticRegression to realize how fast fastText is! 97% Precision and Recall are hard numbers to beat, too!" - ] - } - ], - "metadata": { - "colab": { - "name": "FastText_Example.ipynb", - "provenance": [] - }, - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.6.10" - } - }, - "nbformat": 4, - "nbformat_minor": 1 -} + ] +} \ No newline at end of file