diff --git a/examples/colab/Training/binary_text_classification/NLU_training_negation_classifier_demo_biological_texts.ipynb b/examples/colab/Training/binary_text_classification/NLU_training_negation_classifier_demo_biological_texts.ipynb index 770608c4..afaa8883 100644 --- a/examples/colab/Training/binary_text_classification/NLU_training_negation_classifier_demo_biological_texts.ipynb +++ b/examples/colab/Training/binary_text_classification/NLU_training_negation_classifier_demo_biological_texts.ipynb @@ -1 +1,3124 @@ -{"nbformat":4,"nbformat_minor":0,"metadata":{"colab":{"name":"NLU_training_negation_classifier_demo_biological_texts.ipynb","provenance":[],"collapsed_sections":[]},"kernelspec":{"display_name":"Python 3","name":"python3"}},"cells":[{"cell_type":"markdown","metadata":{"id":"zkufh760uvF3"},"source":["![JohnSnowLabs](https://nlp.johnsnowlabs.com/assets/images/logo.png)\n","\n","[![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/JohnSnowLabs/nlu/blob/master/examples/colab/Training/binary_text_classification/NLU_training_negation_classifier_demo_biological_texts.ipynb)\n","\n","\n","# Training a Sentiment Analysis Classifier with NLU \n","## 2 Class Biological Negation Classifer Training\n","With the [SentimentDL model](https://nlp.johnsnowlabs.com/docs/en/annotators#sentimentdl-multi-class-sentiment-analysis-annotator) from Spark NLP you can achieve State Of the Art results on any multi class text classification problem \n","\n","This notebook showcases the following features : \n","\n","- How to train the deep learning classifier\n","- How to store a pipeline to disk\n","- How to load the pipeline from disk (Enables NLU offline mode)\n","\n","You can achieve these results or even better on this dataset with training data : \n","\n","
\n","\n","![image.png](data:image/png;base64,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)\n","\n","\n","You can achieve these results or even better on this dataset with test data : \n","\n","
\n","\n","\n","![Screenshot 2021-02-25 140123.png](data:image/png;base64,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)\n","\n","\n","\n","\n","\n","\n","\n","\n"]},{"cell_type":"markdown","metadata":{"id":"dur2drhW5Rvi"},"source":["# 1. Install Java 8 and NLU"]},{"cell_type":"code","metadata":{"id":"hFGnBCHavltY","colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"status":"ok","timestamp":1620187471950,"user_tz":-120,"elapsed":121254,"user":{"displayName":"Christian Kasim Loan","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GjqAD-ircKP-s5Eh6JSdkDggDczfqQbJGU_IRb4Hw=s64","userId":"14469489166467359317"}},"outputId":"4abf85d5-354d-4b91-dac8-96cf4fabc546"},"source":["!wget https://setup.johnsnowlabs.com/nlu/colab.sh -O - | bash\n","import nlu"],"execution_count":null,"outputs":[{"output_type":"stream","text":["--2021-05-05 04:02:31-- https://raw.githubusercontent.com/JohnSnowLabs/nlu/master/scripts/colab_setup.sh\n","Resolving raw.githubusercontent.com (raw.githubusercontent.com)... 185.199.108.133, 185.199.110.133, 185.199.111.133, ...\n","Connecting to raw.githubusercontent.com (raw.githubusercontent.com)|185.199.108.133|:443... connected.\n","HTTP request sent, awaiting response... 200 OK\n","Length: 1671 (1.6K) [text/plain]\n","Saving to: ‘STDOUT’\n","\n","\r- 0%[ ] 0 --.-KB/s \r- 100%[===================>] 1.63K --.-KB/s in 0s \n","\n","2021-05-05 04:02:31 (36.7 MB/s) - written to stdout [1671/1671]\n","\n","Installing NLU 3.0.0 with PySpark 3.0.2 and Spark NLP 3.0.1 for Google Colab ...\n","\u001b[K |████████████████████████████████| 204.8MB 72kB/s \n","\u001b[K |████████████████████████████████| 153kB 51.4MB/s \n","\u001b[K |████████████████████████████████| 204kB 22.1MB/s \n","\u001b[K |████████████████████████████████| 204kB 49.6MB/s \n","\u001b[?25h Building wheel for pyspark (setup.py) ... \u001b[?25l\u001b[?25hdone\n"],"name":"stdout"}]},{"cell_type":"markdown","metadata":{"id":"f4KkTfnR5Ugg"},"source":["# 2. Download Negation Bilogical Texts dataset \n","https://www.kaggle.com/ma7555/bioscope-corpus-negation-annotated\n","#Context\n","The BioScope corpus consists of medical and biological texts annotated for negation and their linguistic scope. This was done to allow a comparison between the development of systems for negation/hedge detection and scope resolution.\n","The corpus is publicly available for research purposes.\n","\n","You can use this corpus to fine-tune a BERT-like model for negation detection.\n","\n","This dataset was created in this format during the COVID-19 crisis as a training set for detecting negations regarding treatment of specific drugs in the released research papers.\n","\n","Creators of the original dataset: MTA-SZTE Research Group on Artificial Intelligence - RGAI\n","https://rgai.inf.u-szeged.hu/node/105\n"]},{"cell_type":"code","metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"OrVb5ZMvvrQD","executionInfo":{"status":"ok","timestamp":1620187472933,"user_tz":-120,"elapsed":122227,"user":{"displayName":"Christian Kasim Loan","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GjqAD-ircKP-s5Eh6JSdkDggDczfqQbJGU_IRb4Hw=s64","userId":"14469489166467359317"}},"outputId":"c4e16951-2733-4f4f-c59b-a6b517dc3774"},"source":["! wget http://ckl-it.de/wp-content/uploads/2021/02/bioscope_abstract.csv\n"],"execution_count":null,"outputs":[{"output_type":"stream","text":["--2021-05-05 04:04:31-- http://ckl-it.de/wp-content/uploads/2021/02/bioscope_abstract.csv\n","Resolving ckl-it.de (ckl-it.de)... 217.160.0.108, 2001:8d8:100f:f000::209\n","Connecting to ckl-it.de (ckl-it.de)|217.160.0.108|:80... connected.\n","HTTP request sent, awaiting response... 200 OK\n","Length: 802898 (784K) [text/csv]\n","Saving to: ‘bioscope_abstract.csv’\n","\n","bioscope_abstract.c 100%[===================>] 784.08K 1.21MB/s in 0.6s \n","\n","2021-05-05 04:04:32 (1.21 MB/s) - ‘bioscope_abstract.csv’ saved [802898/802898]\n","\n"],"name":"stdout"}]},{"cell_type":"code","metadata":{"colab":{"base_uri":"https://localhost:8080/","height":419},"id":"y4xSRWIhwT28","executionInfo":{"status":"ok","timestamp":1620187474073,"user_tz":-120,"elapsed":123361,"user":{"displayName":"Christian Kasim Loan","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GjqAD-ircKP-s5Eh6JSdkDggDczfqQbJGU_IRb4Hw=s64","userId":"14469489166467359317"}},"outputId":"d0700a4a-7d4e-4fe9-8d96-84ecb1ef03ea"},"source":["import pandas as pd\n","train_path = '/content/bioscope_abstract.csv'\n","\n","train_df = pd.read_csv(train_path)\n","# the text data to use for classification should be in a column named 'text'\n","columns=['text','y']\n","train_df = train_df[columns]\n","train_df = train_df.dropna()\n","train_df = train_df.sample(frac=1).reset_index(drop=True)\n","from sklearn.model_selection import train_test_split\n","\n","train_df, test_df = train_test_split(train_df, test_size=0.2)\n","train_df"],"execution_count":null,"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"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n","
texty
85The mAb failed to induce NF-kappa B/Rel nuclea...positive
937Because these induced gene products have NF-ka...negative
1707H2O2-induced NF-kappaB activation in Wurzburg ...positive
1029The carboxyl-terminal cytoplasmic domain of CD...negative
258Pretreatment with actinomycin D and cyclohexim...negative
.........
516The finding that dexamethasone has no effect o...positive
1870IL-4 secreted by activated T cells is a pleiot...negative
380In contrast to wild-type B cells, neither of t...positive
684The IL-12 nonresponsiveness of the Th2 clones ...positive
1830Synergism between two distinct elements of the...negative
\n","

1600 rows × 2 columns

\n","
"],"text/plain":[" text y\n","85 The mAb failed to induce NF-kappa B/Rel nuclea... positive\n","937 Because these induced gene products have NF-ka... negative\n","1707 H2O2-induced NF-kappaB activation in Wurzburg ... positive\n","1029 The carboxyl-terminal cytoplasmic domain of CD... negative\n","258 Pretreatment with actinomycin D and cyclohexim... negative\n","... ... ...\n","516 The finding that dexamethasone has no effect o... positive\n","1870 IL-4 secreted by activated T cells is a pleiot... negative\n","380 In contrast to wild-type B cells, neither of t... positive\n","684 The IL-12 nonresponsiveness of the Th2 clones ... positive\n","1830 Synergism between two distinct elements of the... negative\n","\n","[1600 rows x 2 columns]"]},"metadata":{"tags":[]},"execution_count":3}]},{"cell_type":"markdown","metadata":{"id":"0296Om2C5anY"},"source":["# 3. Train Deep Learning Classifier using nlu.load('train.sentiment')\n","\n","You dataset label column should be named 'y' and the feature column with text data should be named 'text'"]},{"cell_type":"code","metadata":{"colab":{"base_uri":"https://localhost:8080/","height":1000},"id":"3ZIPkRkWftBG","executionInfo":{"status":"ok","timestamp":1620188018837,"user_tz":-120,"elapsed":10641,"user":{"displayName":"Christian Kasim Loan","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GjqAD-ircKP-s5Eh6JSdkDggDczfqQbJGU_IRb4Hw=s64","userId":"14469489166467359317"}},"outputId":"1d2af806-3dc3-4a6e-839b-892fc20497a2"},"source":["import nlu \n","from sklearn.metrics import classification_report\n","\n","# load a trainable pipeline by specifying the train. prefix and fit it on a datset with label and text columns\n","# by default the Universal Sentence Encoder (USE) Sentence embeddings are used for generation\n","trainable_pipe = nlu.load('train.sentiment')\n","fitted_pipe = trainable_pipe.fit(train_df.iloc[:50])\n","\n","# predict with the trainable pipeline on dataset and get predictions\n","preds = fitted_pipe.predict(train_df.iloc[:50],output_level='document')\n","#sentence detector that is part of the pipe generates sone NaNs. lets drop them first\n","preds.dropna(inplace=True)\n","print(classification_report(preds['y'], preds['sentiment']))\n","\n","preds"],"execution_count":null,"outputs":[{"output_type":"stream","text":["tfhub_use download started this may take some time.\n","Approximate size to download 923.7 MB\n","[OK!]\n","sentence_detector_dl download started this may take some time.\n","Approximate size to download 354.6 KB\n","[OK!]\n"," precision recall f1-score support\n","\n"," negative 0.00 0.00 0.00 24\n"," positive 0.52 1.00 0.68 26\n","\n"," accuracy 0.52 50\n"," macro avg 0.26 0.50 0.34 50\n","weighted avg 0.27 0.52 0.36 50\n","\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"," \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"," \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"," \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"," \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"," \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"," \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"," \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"," \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"," \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"," \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"," \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","
ytexttrained_sentimentsentenceorigin_indexdocumentsentence_embedding_usetrained_sentiment_confidence
0positiveThe mAb failed to induce NF-kappa B/Rel nuclea...positive[The mAb failed to induce NF-kappa B/Rel nucle...85The mAb failed to induce NF-kappa B/Rel nuclea...[-0.021044651046395302, -0.012281016446650028,...0.718423
1negativeBecause these induced gene products have NF-ka...positive[Because these induced gene products have NF-k...937Because these induced gene products have NF-ka...[-0.018397482112050056, -0.0002952178183477372...0.656633
2positiveH2O2-induced NF-kappaB activation in Wurzburg ...positive[H2O2-induced NF-kappaB activation in Wurzburg...1707H2O2-induced NF-kappaB activation in Wurzburg ...[0.04317500814795494, 0.00023781821073498577, ...0.721148
3negativeThe carboxyl-terminal cytoplasmic domain of CD...positive[The carboxyl-terminal cytoplasmic domain of C...1029The carboxyl-terminal cytoplasmic domain of CD...[0.0399024672806263, 0.06178785115480423, -0.0...0.702527
4negativePretreatment with actinomycin D and cyclohexim...positive[Pretreatment with actinomycin D and cyclohexi...258Pretreatment with actinomycin D and cyclohexim...[0.03217654675245285, -0.031980931758880615, 0...0.716568
5positiveOn the other hand, phorbol ester-induced produ...positive[On the other hand, phorbol ester-induced prod...1839On the other hand, phorbol ester-induced produ...[0.05933626368641853, 0.06317632645368576, 0.0...0.712259
6positiveActivated Rac-1 could mimic activated p21ras t...positive[Activated Rac-1 could mimic activated p21ras ...1552Activated Rac-1 could mimic activated p21ras t...[0.012313981540501118, -0.05240459367632866, -...0.694476
7negativeAfter a 2-day incubation in LDL, the binding o...positive[After a 2-day incubation in LDL, the binding ...942After a 2-day incubation in LDL, the binding o...[0.01922391913831234, -0.05796779692173004, -0...0.673653
8negativeAs evidenced by electro mobility shift assay (...positive[As evidenced by electro mobility shift assay ...383As evidenced by electro mobility shift assay (...[0.004417878575623035, -0.020263247191905975, ...0.698439
9negativeMutations at the B2 site abolish this transcri...positive[Mutations at the B2 site abolish this transcr...1515Mutations at the B2 site abolish this transcri...[0.021449951454997063, 0.017173701897263527, -...0.679992
10positiveElectrophoretic mobility-shift assays of HUVEC...positive[Electrophoretic mobility-shift assays of HUVE...1313Electrophoretic mobility-shift assays of HUVEC...[0.008786042220890522, 0.03473477438092232, -0...0.750811
11positiveIn comparison to other activators of NF-kappa ...positive[In comparison to other activators of NF-kappa...1972In comparison to other activators of NF-kappa ...[0.05494653061032295, 0.05886928364634514, 0.0...0.707760
12negativeHere we show that the I alpha1 promoter contai...positive[Here we show that the I alpha1 promoter conta...1279Here we show that the I alpha1 promoter contai...[0.024258537217974663, 0.003928740043193102, 0...0.672414
13positiveThus these data suggest that the phorbol myris...positive[Thus these data suggest that the phorbol myri...1094Thus these data suggest that the phorbol myris...[0.04496181383728981, 0.006568090058863163, -0...0.738647
14positiveA 40-fold stimulation of chloramphenicol acety...positive[A 40-fold stimulation of chloramphenicol acet...1528A 40-fold stimulation of chloramphenicol acety...[0.02669776789844036, 0.0031935900915414095, 0...0.702648
15negativeThird, a coimmunoprecipitation assay showed th...positive[Third, a coimmunoprecipitation assay showed t...1195Third, a coimmunoprecipitation assay showed th...[0.03080531395971775, -0.01305992528796196, 0....0.627124
16negativePhosphorylation of Jak2 in tax transformed cel...positive[Phosphorylation of Jak2 in tax transformed ce...1725Phosphorylation of Jak2 in tax transformed cel...[0.05668512359261513, -0.014115522615611553, 0...0.666193
17positiveThis peptide potently inhibited NFAT activatio...positive[This peptide potently inhibited NFAT activati...1924This peptide potently inhibited NFAT activatio...[0.051138270646333694, 0.019551211968064308, 0...0.726400
18positiveOverexpression of Bcl-2 in tumor cells blocks ...positive[Overexpression of Bcl-2 in tumor cells blocks...527Overexpression of Bcl-2 in tumor cells blocks ...[0.029882941395044327, 0.031224790960550308, -...0.700843
19negativeNuclear factor kappa B (NF-kappa B) is a pleio...positive[Nuclear factor kappa B (NF-kappa B) is a plei...284Nuclear factor kappa B (NF-kappa B) is a pleio...[0.04925459995865822, 0.030116116628050804, -0...0.664960
20positiveAn NFAT oligonucleotide carrying mutations in ...positive[An NFAT oligonucleotide carrying mutations in...524An NFAT oligonucleotide carrying mutations in ...[0.014317388646304607, 0.01018354669213295, 0....0.684760
21negativeIn addition Spi-B as well as PU.1 were able to...positive[In addition Spi-B as well as PU.1 were able t...521In addition Spi-B as well as PU.1 were able to...[0.044076837599277496, -0.007634499575942755, ...0.632185
22positiveNuclear run-on assays demonstrate that : ( 1 )...positive[Nuclear run-on assays demonstrate that : ( 1 ...1064Nuclear run-on assays demonstrate that : ( 1 )...[0.03107193484902382, 0.020781097933650017, 0....0.722295
23positiveFinally, we conclude that this effect of CIITA...positive[Finally, we conclude that this effect of CIIT...1539Finally, we conclude that this effect of CIITA...[0.033310066908597946, -0.03267408534884453, 0...0.678016
24positiveWe found that ALD induce a transient activatio...positive[We found that ALD induce a transient activati...1994We found that ALD induce a transient activatio...[0.049336668103933334, -0.016328582540154457, ...0.725506
25positiveAFR behaves like ascorbate, while DHA and asco...positive[AFR behaves like ascorbate, while DHA and asc...203AFR behaves like ascorbate, while DHA and asco...[0.06031205505132675, 0.00172607006970793, 0.0...0.738096
26positiveIt has been shown recently that in wild-type C...positive[It has been shown recently that in wild-type ...428It has been shown recently that in wild-type C...[0.06434260308742523, 0.035497453063726425, -0...0.714807
27positiveOncogenic forms of NOTCH1 lacking either the p...positive[Oncogenic forms of NOTCH1 lacking either the ...112Oncogenic forms of NOTCH1 lacking either the p...[0.036650002002716064, -0.005419247783720493, ...0.724903
28positiveRhabdomyosarcomas do not contain mutations in ...positive[Rhabdomyosarcomas do not contain mutations in...1258Rhabdomyosarcomas do not contain mutations in ...[0.04726873338222504, -0.012257322669029236, -...0.685728
29negativeCharacterization of CD40 signaling determinant...positive[Characterization of CD40 signaling determinan...151Characterization of CD40 signaling determinant...[0.005249931011348963, -0.01369913388043642, 0...0.699257
30negativeThus, a component of LDL-enhanced endothelial ...positive[Thus, a component of LDL-enhanced endothelial...1669Thus, a component of LDL-enhanced endothelial ...[0.06682103872299194, -0.043387044221162796, -...0.651579
31positiveHowever, stimulation with MBP did not produce ...positive[However, stimulation with MBP did not produce...1627However, stimulation with MBP did not produce ...[0.07646981626749039, 0.05336544290184975, -0....0.723428
32negativeWe analyzed the activity of the enhancer, the ...positive[We analyzed the activity of the enhancer, the...1819We analyzed the activity of the enhancer, the ...[0.058565203100442886, 0.017934346571564674, 0...0.655187
33negativeDeath-inducing ligands (DILs) such as tumor ne...positive[Death-inducing ligands (DILs) such as tumor n...148Death-inducing ligands (DILs) such as tumor ne...[0.018583133816719055, 0.05835242569446564, 0....0.707814
34positiveUsing electrophoretic mobility shift assays, w...positive[Using electrophoretic mobility shift assays, ...857Using electrophoretic mobility shift assays, w...[0.01857064664363861, -1.7747517631505616e-05,...0.719099
35negativecAMP signaling inhibited Stat1 at several diff...positive[cAMP signaling inhibited Stat1 at several dif...285cAMP signaling inhibited Stat1 at several diff...[0.0070323762483894825, -0.036651283502578735,...0.661534
36positiveIn addition, JNK activation by PMA plus ionoph...positive[In addition, JNK activation by PMA plus ionop...36In addition, JNK activation by PMA plus ionoph...[0.04152128845453262, 0.014748011715710163, 0....0.734088
37negativeThe viral protein Tax induces the activation a...positive[The viral protein Tax induces the activation ...679The viral protein Tax induces the activation a...[0.06768079847097397, -0.028039786964654922, 0...0.682207
38negativeFurthermore, OFT-1 appeared to have approximat...positive[Furthermore, OFT-1 appeared to have approxima...1527Furthermore, OFT-1 appeared to have approximat...[0.07009289413690567, 0.03128473833203316, -0....0.687950
39negativeA principal objective of the present study was...positive[A principal objective of the present study wa...479A principal objective of the present study was...[0.017783455550670624, -0.026092059910297394, ...0.659265
40positiveWe conclude that downregulation of WT1 during ...positive[We conclude that downregulation of WT1 during...1561We conclude that downregulation of WT1 during ...[0.00441081915050745, 0.021023083478212357, -0...0.698446
41negativeIn these transfected CL-01 cells, CD40:CD40L e...positive[In these transfected CL-01 cells, CD40:CD40L ...1188In these transfected CL-01 cells, CD40:CD40L e...[0.010555184446275234, -0.005831445567309856, ...0.679171
42negativeRecent studies indicate that mutations in the ...positive[Recent studies indicate that mutations in the...667Recent studies indicate that mutations in the ...[0.05200810357928276, -0.0026498467195779085, ...0.651673
43negativeTo confirm the importance of the three cis-act...positive[To confirm the importance of the three cis-ac...734To confirm the importance of the three cis-act...[0.05337677150964737, -0.028393635526299477, 0...0.667999
44positiveNo significant difference was detected in the ...positive[No significant difference was detected in the...1805No significant difference was detected in the ...[0.05019189417362213, 0.01725945621728897, 0.0...0.748773
45positiveIn contrast, anti-CD3 and anti-CD28 stimulated...positive[In contrast, anti-CD3 and anti-CD28 stimulate...1473In contrast, anti-CD3 and anti-CD28 stimulated...[0.053164657205343246, 0.015389195643365383, 0...0.712844
46negativeIn this study we analyzed the effect of CD40 s...positive[In this study we analyzed the effect of CD40 ...418In this study we analyzed the effect of CD40 s...[0.016681713983416557, 0.06071694567799568, -0...0.657744
47positiveA dramatic increase in the intracellular level...positive[A dramatic increase in the intracellular leve...689A dramatic increase in the intracellular level...[0.032944243401288986, -0.005736679304391146, ...0.704365
48positiveQualitatively different effects were observed ...positive[Qualitatively different effects were observed...1228Qualitatively different effects were observed ...[0.06803048402070999, 0.039302267134189606, 0....0.734736
49negativeA third tyrosine within the amino-terminal reg...positive[A third tyrosine within the amino-terminal re...1899A third tyrosine within the amino-terminal reg...[0.08541002124547958, 0.0034846188500523567, 0...0.687449
\n","
"],"text/plain":[" y ... trained_sentiment_confidence\n","0 positive ... 0.718423\n","1 negative ... 0.656633\n","2 positive ... 0.721148\n","3 negative ... 0.702527\n","4 negative ... 0.716568\n","5 positive ... 0.712259\n","6 positive ... 0.694476\n","7 negative ... 0.673653\n","8 negative ... 0.698439\n","9 negative ... 0.679992\n","10 positive ... 0.750811\n","11 positive ... 0.707760\n","12 negative ... 0.672414\n","13 positive ... 0.738647\n","14 positive ... 0.702648\n","15 negative ... 0.627124\n","16 negative ... 0.666193\n","17 positive ... 0.726400\n","18 positive ... 0.700843\n","19 negative ... 0.664960\n","20 positive ... 0.684760\n","21 negative ... 0.632185\n","22 positive ... 0.722295\n","23 positive ... 0.678016\n","24 positive ... 0.725506\n","25 positive ... 0.738096\n","26 positive ... 0.714807\n","27 positive ... 0.724903\n","28 positive ... 0.685728\n","29 negative ... 0.699257\n","30 negative ... 0.651579\n","31 positive ... 0.723428\n","32 negative ... 0.655187\n","33 negative ... 0.707814\n","34 positive ... 0.719099\n","35 negative ... 0.661534\n","36 positive ... 0.734088\n","37 negative ... 0.682207\n","38 negative ... 0.687950\n","39 negative ... 0.659265\n","40 positive ... 0.698446\n","41 negative ... 0.679171\n","42 negative ... 0.651673\n","43 negative ... 0.667999\n","44 positive ... 0.748773\n","45 positive ... 0.712844\n","46 negative ... 0.657744\n","47 positive ... 0.704365\n","48 positive ... 0.734736\n","49 negative ... 0.687449\n","\n","[50 rows x 8 columns]"]},"metadata":{"tags":[]},"execution_count":7}]},{"cell_type":"markdown","metadata":{"id":"lVyOE2wV0fw_"},"source":["# 4. Test the fitted pipe on new example"]},{"cell_type":"code","metadata":{"colab":{"base_uri":"https://localhost:8080/","height":80},"id":"qdCUg2MR0PD2","executionInfo":{"status":"ok","timestamp":1620188242044,"user_tz":-120,"elapsed":1496,"user":{"displayName":"Christian Kasim Loan","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GjqAD-ircKP-s5Eh6JSdkDggDczfqQbJGU_IRb4Hw=s64","userId":"14469489166467359317"}},"outputId":"a201bda6-d5e8-460d-d53d-af9416e5d519"},"source":["fitted_pipe.predict(\"The virus had a direct impact on the nervous system\")"],"execution_count":null,"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","
trained_sentimentsentenceorigin_indexdocumentsentence_embedding_usetrained_sentiment_confidence
0positive[The virus had a direct impact on the nervous ...0The virus had a direct impact on the nervous s...[0.005800435319542885, 0.02561130002140999, -0...0.67287
\n","
"],"text/plain":[" trained_sentiment ... trained_sentiment_confidence\n","0 positive ... 0.67287\n","\n","[1 rows x 6 columns]"]},"metadata":{"tags":[]},"execution_count":8}]},{"cell_type":"markdown","metadata":{"id":"xflpwrVjjBVD"},"source":["## 5. Configure pipe training parameters"]},{"cell_type":"code","metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"UtsAUGTmOTms","executionInfo":{"status":"ok","timestamp":1620188242045,"user_tz":-120,"elapsed":1004,"user":{"displayName":"Christian Kasim Loan","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GjqAD-ircKP-s5Eh6JSdkDggDczfqQbJGU_IRb4Hw=s64","userId":"14469489166467359317"}},"outputId":"9fc40e4e-8b18-45d7-d003-3be9a40c7481"},"source":["trainable_pipe.print_info()"],"execution_count":null,"outputs":[{"output_type":"stream","text":["The following parameters are configurable for this NLU pipeline (You can copy paste the examples) :\n",">>> pipe['sentiment_dl'] has settable params:\n","pipe['sentiment_dl'].setMaxEpochs(1) | Info: Maximum number of epochs to train | Currently set to : 1\n","pipe['sentiment_dl'].setLr(0.005) | Info: Learning Rate | Currently set to : 0.005\n","pipe['sentiment_dl'].setBatchSize(64) | Info: Batch size | Currently set to : 64\n","pipe['sentiment_dl'].setDropout(0.5) | Info: Dropout coefficient | Currently set to : 0.5\n","pipe['sentiment_dl'].setEnableOutputLogs(True) | Info: Whether to use stdout in addition to Spark logs. | Currently set to : True\n","pipe['sentiment_dl'].setThreshold(0.6) | Info: The minimum threshold for the final result otheriwse it will be neutral | Currently set to : 0.6\n","pipe['sentiment_dl'].setThresholdLabel('neutral') | Info: In case the score is less than threshold, what should be the label. Default is neutral. | Currently set to : neutral\n",">>> pipe['use@tfhub_use'] has settable params:\n","pipe['use@tfhub_use'].setDimension(512) | Info: Number of embedding dimensions | Currently set to : 512\n","pipe['use@tfhub_use'].setLoadSP(False) | Info: Whether to load SentencePiece ops file which is required only by multi-lingual models. This is not changeable after it's set with a pretrained model nor it is compatible with Windows. | Currently set to : False\n","pipe['use@tfhub_use'].setStorageRef('tfhub_use') | Info: unique reference name for identification | Currently set to : tfhub_use\n",">>> pipe['deep_sentence_detector@SentenceDetectorDLModel_c83c27f46b97'] has settable params:\n","pipe['deep_sentence_detector@SentenceDetectorDLModel_c83c27f46b97'].setExplodeSentences(False) | Info: whether to explode each sentence into a different row, for better parallelization. Defaults to false. | Currently set to : False\n","pipe['deep_sentence_detector@SentenceDetectorDLModel_c83c27f46b97'].setStorageRef('SentenceDetectorDLModel_c83c27f46b97') | Info: storage unique identifier | Currently set to : SentenceDetectorDLModel_c83c27f46b97\n","pipe['deep_sentence_detector@SentenceDetectorDLModel_c83c27f46b97'].setEncoder(com.johnsnowlabs.nlp.annotators.sentence_detector_dl.SentenceDetectorDLEncoder@1ff4ede2) | Info: Data encoder | Currently set to : com.johnsnowlabs.nlp.annotators.sentence_detector_dl.SentenceDetectorDLEncoder@1ff4ede2\n","pipe['deep_sentence_detector@SentenceDetectorDLModel_c83c27f46b97'].setImpossiblePenultimates(['Bros', 'No', 'al', 'vs', 'etc', 'Fig', 'Dr', 'Prof', 'PhD', 'MD', 'Co', 'Corp', 'Inc', 'bros', 'VS', 'Vs', 'ETC', 'fig', 'dr', 'prof', 'PHD', 'phd', 'md', 'co', 'corp', 'inc', 'Jan', 'Feb', 'Mar', 'Apr', 'Jul', 'Aug', 'Sep', 'Sept', 'Oct', 'Nov', 'Dec', 'St', 'st', 'AM', 'PM', 'am', 'pm', 'e.g', 'f.e', 'i.e']) | Info: Impossible penultimates | Currently set to : ['Bros', 'No', 'al', 'vs', 'etc', 'Fig', 'Dr', 'Prof', 'PhD', 'MD', 'Co', 'Corp', 'Inc', 'bros', 'VS', 'Vs', 'ETC', 'fig', 'dr', 'prof', 'PHD', 'phd', 'md', 'co', 'corp', 'inc', 'Jan', 'Feb', 'Mar', 'Apr', 'Jul', 'Aug', 'Sep', 'Sept', 'Oct', 'Nov', 'Dec', 'St', 'st', 'AM', 'PM', 'am', 'pm', 'e.g', 'f.e', 'i.e']\n","pipe['deep_sentence_detector@SentenceDetectorDLModel_c83c27f46b97'].setModelArchitecture('cnn') | Info: Model architecture (CNN) | Currently set to : cnn\n",">>> pipe['document_assembler'] has settable params:\n","pipe['document_assembler'].setCleanupMode('shrink') | Info: possible values: disabled, inplace, inplace_full, shrink, shrink_full, each, each_full, delete_full | Currently set to : shrink\n"],"name":"stdout"}]},{"cell_type":"markdown","metadata":{"id":"2GJdDNV9jEIe"},"source":["## 6. Retrain with new parameters"]},{"cell_type":"code","metadata":{"colab":{"base_uri":"https://localhost:8080/","height":1000},"id":"mptfvHx-MMMX","executionInfo":{"status":"ok","timestamp":1620188276333,"user_tz":-120,"elapsed":4993,"user":{"displayName":"Christian Kasim Loan","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GjqAD-ircKP-s5Eh6JSdkDggDczfqQbJGU_IRb4Hw=s64","userId":"14469489166467359317"}},"outputId":"0ccd6fea-1606-44f8-8dd0-632fbb3bee1b"},"source":["# Train longer!\n","trainable_pipe = nlu.load('train.sentiment')\n","trainable_pipe['trainable_sentiment_dl'].setMaxEpochs(5) \n","fitted_pipe = trainable_pipe.fit(train_df.iloc[:50])\n","# predict with the trainable pipeline on dataset and get predictions\n","preds = fitted_pipe.predict(train_df.iloc[:50],output_level='document')\n","\n","#sentence detector that is part of the pipe generates sone NaNs. lets drop them first\n","preds.dropna(inplace=True)\n","print(classification_report(preds['y'], preds['sentiment']))\n","\n","preds"],"execution_count":null,"outputs":[{"output_type":"stream","text":[" precision recall f1-score support\n","\n"," negative 0.00 0.00 0.00 24\n"," neutral 0.00 0.00 0.00 0\n"," positive 0.76 0.96 0.85 26\n","\n"," accuracy 0.50 50\n"," macro avg 0.25 0.32 0.28 50\n","weighted avg 0.39 0.50 0.44 50\n","\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"," \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"," \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"," \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"," \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"," \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"," \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"," \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"," \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"," \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"," \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"," \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","
ytexttrained_sentimentsentenceorigin_indexdocumentsentence_embedding_usetrained_sentiment_confidence
0positiveThe mAb failed to induce NF-kappa B/Rel nuclea...positive[The mAb failed to induce NF-kappa B/Rel nucle...85The mAb failed to induce NF-kappa B/Rel nuclea...[-0.021044651046395302, -0.012281016446650028,...0.750314
1negativeBecause these induced gene products have NF-ka...neutral[Because these induced gene products have NF-k...937Because these induced gene products have NF-ka...[-0.018397482112050056, -0.0002952178183477372...0.524412
2positiveH2O2-induced NF-kappaB activation in Wurzburg ...positive[H2O2-induced NF-kappaB activation in Wurzburg...1707H2O2-induced NF-kappaB activation in Wurzburg ...[0.04317500814795494, 0.00023781821073498577, ...0.771501
3negativeThe carboxyl-terminal cytoplasmic domain of CD...positive[The carboxyl-terminal cytoplasmic domain of C...1029The carboxyl-terminal cytoplasmic domain of CD...[0.0399024672806263, 0.06178785115480423, -0.0...0.703551
4negativePretreatment with actinomycin D and cyclohexim...positive[Pretreatment with actinomycin D and cyclohexi...258Pretreatment with actinomycin D and cyclohexim...[0.03217654675245285, -0.031980931758880615, 0...0.695075
5positiveOn the other hand, phorbol ester-induced produ...positive[On the other hand, phorbol ester-induced prod...1839On the other hand, phorbol ester-induced produ...[0.05933626368641853, 0.06317632645368576, 0.0...0.776027
6positiveActivated Rac-1 could mimic activated p21ras t...positive[Activated Rac-1 could mimic activated p21ras ...1552Activated Rac-1 could mimic activated p21ras t...[0.012313981540501118, -0.05240459367632866, -...0.816325
7negativeAfter a 2-day incubation in LDL, the binding o...positive[After a 2-day incubation in LDL, the binding ...942After a 2-day incubation in LDL, the binding o...[0.01922391913831234, -0.05796779692173004, -0...0.645191
8negativeAs evidenced by electro mobility shift assay (...positive[As evidenced by electro mobility shift assay ...383As evidenced by electro mobility shift assay (...[0.004417878575623035, -0.020263247191905975, ...0.670496
9negativeMutations at the B2 site abolish this transcri...neutral[Mutations at the B2 site abolish this transcr...1515Mutations at the B2 site abolish this transcri...[0.021449951454997063, 0.017173701897263527, -...0.548251
10positiveElectrophoretic mobility-shift assays of HUVEC...positive[Electrophoretic mobility-shift assays of HUVE...1313Electrophoretic mobility-shift assays of HUVEC...[0.008786042220890522, 0.03473477438092232, -0...0.838780
11positiveIn comparison to other activators of NF-kappa ...positive[In comparison to other activators of NF-kappa...1972In comparison to other activators of NF-kappa ...[0.05494653061032295, 0.05886928364634514, 0.0...0.709446
12negativeHere we show that the I alpha1 promoter contai...neutral[Here we show that the I alpha1 promoter conta...1279Here we show that the I alpha1 promoter contai...[0.024258537217974663, 0.003928740043193102, 0...0.514196
13positiveThus these data suggest that the phorbol myris...positive[Thus these data suggest that the phorbol myri...1094Thus these data suggest that the phorbol myris...[0.04496181383728981, 0.006568090058863163, -0...0.803803
14positiveA 40-fold stimulation of chloramphenicol acety...positive[A 40-fold stimulation of chloramphenicol acet...1528A 40-fold stimulation of chloramphenicol acety...[0.02669776789844036, 0.0031935900915414095, 0...0.719408
15negativeThird, a coimmunoprecipitation assay showed th...neutral[Third, a coimmunoprecipitation assay showed t...1195Third, a coimmunoprecipitation assay showed th...[0.03080531395971775, -0.01305992528796196, 0....0.577207
16negativePhosphorylation of Jak2 in tax transformed cel...neutral[Phosphorylation of Jak2 in tax transformed ce...1725Phosphorylation of Jak2 in tax transformed cel...[0.05668512359261513, -0.014115522615611553, 0...0.535941
17positiveThis peptide potently inhibited NFAT activatio...positive[This peptide potently inhibited NFAT activati...1924This peptide potently inhibited NFAT activatio...[0.051138270646333694, 0.019551211968064308, 0...0.761979
18positiveOverexpression of Bcl-2 in tumor cells blocks ...positive[Overexpression of Bcl-2 in tumor cells blocks...527Overexpression of Bcl-2 in tumor cells blocks ...[0.029882941395044327, 0.031224790960550308, -...0.715134
19negativeNuclear factor kappa B (NF-kappa B) is a pleio...neutral[Nuclear factor kappa B (NF-kappa B) is a plei...284Nuclear factor kappa B (NF-kappa B) is a pleio...[0.04925459995865822, 0.030116116628050804, -0...0.522261
20positiveAn NFAT oligonucleotide carrying mutations in ...positive[An NFAT oligonucleotide carrying mutations in...524An NFAT oligonucleotide carrying mutations in ...[0.014317388646304607, 0.01018354669213295, 0....0.605652
21negativeIn addition Spi-B as well as PU.1 were able to...neutral[In addition Spi-B as well as PU.1 were able t...521In addition Spi-B as well as PU.1 were able to...[0.044076837599277496, -0.007634499575942755, ...0.559043
22positiveNuclear run-on assays demonstrate that : ( 1 )...positive[Nuclear run-on assays demonstrate that : ( 1 ...1064Nuclear run-on assays demonstrate that : ( 1 )...[0.03107193484902382, 0.020781097933650017, 0....0.723425
23positiveFinally, we conclude that this effect of CIITA...neutral[Finally, we conclude that this effect of CIIT...1539Finally, we conclude that this effect of CIITA...[0.033310066908597946, -0.03267408534884453, 0...0.566672
24positiveWe found that ALD induce a transient activatio...positive[We found that ALD induce a transient activati...1994We found that ALD induce a transient activatio...[0.049336668103933334, -0.016328582540154457, ...0.777087
25positiveAFR behaves like ascorbate, while DHA and asco...positive[AFR behaves like ascorbate, while DHA and asc...203AFR behaves like ascorbate, while DHA and asco...[0.06031205505132675, 0.00172607006970793, 0.0...0.827045
26positiveIt has been shown recently that in wild-type C...positive[It has been shown recently that in wild-type ...428It has been shown recently that in wild-type C...[0.06434260308742523, 0.035497453063726425, -0...0.763702
27positiveOncogenic forms of NOTCH1 lacking either the p...positive[Oncogenic forms of NOTCH1 lacking either the ...112Oncogenic forms of NOTCH1 lacking either the p...[0.036650002002716064, -0.005419247783720493, ...0.761244
28positiveRhabdomyosarcomas do not contain mutations in ...positive[Rhabdomyosarcomas do not contain mutations in...1258Rhabdomyosarcomas do not contain mutations in ...[0.04726873338222504, -0.012257322669029236, -...0.607541
29negativeCharacterization of CD40 signaling determinant...positive[Characterization of CD40 signaling determinan...151Characterization of CD40 signaling determinant...[0.005249931011348963, -0.01369913388043642, 0...0.617174
30negativeThus, a component of LDL-enhanced endothelial ...neutral[Thus, a component of LDL-enhanced endothelial...1669Thus, a component of LDL-enhanced endothelial ...[0.06682103872299194, -0.043387044221162796, -...0.532349
31positiveHowever, stimulation with MBP did not produce ...positive[However, stimulation with MBP did not produce...1627However, stimulation with MBP did not produce ...[0.07646981626749039, 0.05336544290184975, -0....0.803395
32negativeWe analyzed the activity of the enhancer, the ...neutral[We analyzed the activity of the enhancer, the...1819We analyzed the activity of the enhancer, the ...[0.058565203100442886, 0.017934346571564674, 0...0.525206
33negativeDeath-inducing ligands (DILs) such as tumor ne...positive[Death-inducing ligands (DILs) such as tumor n...148Death-inducing ligands (DILs) such as tumor ne...[0.018583133816719055, 0.05835242569446564, 0....0.721663
34positiveUsing electrophoretic mobility shift assays, w...positive[Using electrophoretic mobility shift assays, ...857Using electrophoretic mobility shift assays, w...[0.01857064664363861, -1.7747517631505616e-05,...0.762466
35negativecAMP signaling inhibited Stat1 at several diff...neutral[cAMP signaling inhibited Stat1 at several dif...285cAMP signaling inhibited Stat1 at several diff...[0.0070323762483894825, -0.036651283502578735,...0.517350
36positiveIn addition, JNK activation by PMA plus ionoph...positive[In addition, JNK activation by PMA plus ionop...36In addition, JNK activation by PMA plus ionoph...[0.04152128845453262, 0.014748011715710163, 0....0.800704
37negativeThe viral protein Tax induces the activation a...neutral[The viral protein Tax induces the activation ...679The viral protein Tax induces the activation a...[0.06768079847097397, -0.028039786964654922, 0...0.559131
38negativeFurthermore, OFT-1 appeared to have approximat...positive[Furthermore, OFT-1 appeared to have approxima...1527Furthermore, OFT-1 appeared to have approximat...[0.07009289413690567, 0.03128473833203316, -0....0.662930
39negativeA principal objective of the present study was...neutral[A principal objective of the present study wa...479A principal objective of the present study was...[0.017783455550670624, -0.026092059910297394, ...0.569664
40positiveWe conclude that downregulation of WT1 during ...positive[We conclude that downregulation of WT1 during...1561We conclude that downregulation of WT1 during ...[0.00441081915050745, 0.021023083478212357, -0...0.700463
41negativeIn these transfected CL-01 cells, CD40:CD40L e...neutral[In these transfected CL-01 cells, CD40:CD40L ...1188In these transfected CL-01 cells, CD40:CD40L e...[0.010555184446275234, -0.005831445567309856, ...0.548869
42negativeRecent studies indicate that mutations in the ...neutral[Recent studies indicate that mutations in the...667Recent studies indicate that mutations in the ...[0.05200810357928276, -0.0026498467195779085, ...0.535857
43negativeTo confirm the importance of the three cis-act...neutral[To confirm the importance of the three cis-ac...734To confirm the importance of the three cis-act...[0.05337677150964737, -0.028393635526299477, 0...0.538683
44positiveNo significant difference was detected in the ...positive[No significant difference was detected in the...1805No significant difference was detected in the ...[0.05019189417362213, 0.01725945621728897, 0.0...0.838974
45positiveIn contrast, anti-CD3 and anti-CD28 stimulated...positive[In contrast, anti-CD3 and anti-CD28 stimulate...1473In contrast, anti-CD3 and anti-CD28 stimulated...[0.053164657205343246, 0.015389195643365383, 0...0.727595
46negativeIn this study we analyzed the effect of CD40 s...neutral[In this study we analyzed the effect of CD40 ...418In this study we analyzed the effect of CD40 s...[0.016681713983416557, 0.06071694567799568, -0...0.515776
47positiveA dramatic increase in the intracellular level...positive[A dramatic increase in the intracellular leve...689A dramatic increase in the intracellular level...[0.032944243401288986, -0.005736679304391146, ...0.699241
48positiveQualitatively different effects were observed ...positive[Qualitatively different effects were observed...1228Qualitatively different effects were observed ...[0.06803048402070999, 0.039302267134189606, 0....0.795765
49negativeA third tyrosine within the amino-terminal reg...positive[A third tyrosine within the amino-terminal re...1899A third tyrosine within the amino-terminal reg...[0.08541002124547958, 0.0034846188500523567, 0...0.600163
\n","
"],"text/plain":[" y ... trained_sentiment_confidence\n","0 positive ... 0.750314\n","1 negative ... 0.524412\n","2 positive ... 0.771501\n","3 negative ... 0.703551\n","4 negative ... 0.695075\n","5 positive ... 0.776027\n","6 positive ... 0.816325\n","7 negative ... 0.645191\n","8 negative ... 0.670496\n","9 negative ... 0.548251\n","10 positive ... 0.838780\n","11 positive ... 0.709446\n","12 negative ... 0.514196\n","13 positive ... 0.803803\n","14 positive ... 0.719408\n","15 negative ... 0.577207\n","16 negative ... 0.535941\n","17 positive ... 0.761979\n","18 positive ... 0.715134\n","19 negative ... 0.522261\n","20 positive ... 0.605652\n","21 negative ... 0.559043\n","22 positive ... 0.723425\n","23 positive ... 0.566672\n","24 positive ... 0.777087\n","25 positive ... 0.827045\n","26 positive ... 0.763702\n","27 positive ... 0.761244\n","28 positive ... 0.607541\n","29 negative ... 0.617174\n","30 negative ... 0.532349\n","31 positive ... 0.803395\n","32 negative ... 0.525206\n","33 negative ... 0.721663\n","34 positive ... 0.762466\n","35 negative ... 0.517350\n","36 positive ... 0.800704\n","37 negative ... 0.559131\n","38 negative ... 0.662930\n","39 negative ... 0.569664\n","40 positive ... 0.700463\n","41 negative ... 0.548869\n","42 negative ... 0.535857\n","43 negative ... 0.538683\n","44 positive ... 0.838974\n","45 positive ... 0.727595\n","46 negative ... 0.515776\n","47 positive ... 0.699241\n","48 positive ... 0.795765\n","49 negative ... 0.600163\n","\n","[50 rows x 8 columns]"]},"metadata":{"tags":[]},"execution_count":11}]},{"cell_type":"markdown","metadata":{"id":"qFoT-s1MjTSS"},"source":["# 7. Try training with different Embeddings"]},{"cell_type":"code","metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"nxWFzQOhjWC8","executionInfo":{"status":"ok","timestamp":1620188276334,"user_tz":-120,"elapsed":4701,"user":{"displayName":"Christian Kasim Loan","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GjqAD-ircKP-s5Eh6JSdkDggDczfqQbJGU_IRb4Hw=s64","userId":"14469489166467359317"}},"outputId":"b4d5e2b4-e0a5-4431-8ecd-6adf5f8a718c"},"source":["# We can use nlu.print_components(action='embed_sentence') to see every possibler sentence embedding we could use. Lets use bert!\n","nlu.print_components(action='embed_sentence')"],"execution_count":null,"outputs":[{"output_type":"stream","text":["For language NLU provides the following Models : \n","nlu.load('en.embed_sentence') returns Spark NLP model tfhub_use\n","nlu.load('en.embed_sentence.use') returns Spark NLP model tfhub_use\n","nlu.load('en.embed_sentence.tfhub_use') returns Spark NLP model tfhub_use\n","nlu.load('en.embed_sentence.use.lg') returns Spark NLP model tfhub_use_lg\n","nlu.load('en.embed_sentence.tfhub_use.lg') returns Spark NLP model tfhub_use_lg\n","nlu.load('en.embed_sentence.albert') returns Spark NLP model albert_base_uncased\n","nlu.load('en.embed_sentence.electra') returns Spark NLP model sent_electra_small_uncased\n","nlu.load('en.embed_sentence.electra_small_uncased') returns Spark NLP model sent_electra_small_uncased\n","nlu.load('en.embed_sentence.electra_base_uncased') returns Spark NLP model sent_electra_base_uncased\n","nlu.load('en.embed_sentence.electra_large_uncased') returns Spark NLP model sent_electra_large_uncased\n","nlu.load('en.embed_sentence.bert') returns Spark NLP model sent_bert_base_uncased\n","nlu.load('en.embed_sentence.bert_base_uncased') returns Spark NLP model sent_bert_base_uncased\n","nlu.load('en.embed_sentence.bert_base_cased') returns Spark NLP model sent_bert_base_cased\n","nlu.load('en.embed_sentence.bert_large_uncased') returns Spark NLP model sent_bert_large_uncased\n","nlu.load('en.embed_sentence.bert_large_cased') returns Spark NLP model sent_bert_large_cased\n","nlu.load('en.embed_sentence.biobert.pubmed_base_cased') returns Spark NLP model sent_biobert_pubmed_base_cased\n","nlu.load('en.embed_sentence.biobert.pubmed_large_cased') returns Spark NLP model sent_biobert_pubmed_large_cased\n","nlu.load('en.embed_sentence.biobert.pmc_base_cased') returns Spark NLP model sent_biobert_pmc_base_cased\n","nlu.load('en.embed_sentence.biobert.pubmed_pmc_base_cased') returns Spark NLP model sent_biobert_pubmed_pmc_base_cased\n","nlu.load('en.embed_sentence.biobert.clinical_base_cased') returns Spark NLP model sent_biobert_clinical_base_cased\n","nlu.load('en.embed_sentence.biobert.discharge_base_cased') returns Spark NLP model sent_biobert_discharge_base_cased\n","nlu.load('en.embed_sentence.covidbert.large_uncased') returns Spark NLP model sent_covidbert_large_uncased\n","nlu.load('en.embed_sentence.small_bert_L2_128') returns Spark NLP model sent_small_bert_L2_128\n","nlu.load('en.embed_sentence.small_bert_L4_128') returns Spark NLP model sent_small_bert_L4_128\n","nlu.load('en.embed_sentence.small_bert_L6_128') returns Spark NLP model sent_small_bert_L6_128\n","nlu.load('en.embed_sentence.small_bert_L8_128') returns Spark NLP model sent_small_bert_L8_128\n","nlu.load('en.embed_sentence.small_bert_L10_128') returns Spark NLP model sent_small_bert_L10_128\n","nlu.load('en.embed_sentence.small_bert_L12_128') returns Spark NLP model sent_small_bert_L12_128\n","nlu.load('en.embed_sentence.small_bert_L2_256') returns Spark NLP model sent_small_bert_L2_256\n","nlu.load('en.embed_sentence.small_bert_L4_256') returns Spark NLP model sent_small_bert_L4_256\n","nlu.load('en.embed_sentence.small_bert_L6_256') returns Spark NLP model sent_small_bert_L6_256\n","nlu.load('en.embed_sentence.small_bert_L8_256') returns Spark NLP model sent_small_bert_L8_256\n","nlu.load('en.embed_sentence.small_bert_L10_256') returns Spark NLP model sent_small_bert_L10_256\n","nlu.load('en.embed_sentence.small_bert_L12_256') returns Spark NLP model sent_small_bert_L12_256\n","nlu.load('en.embed_sentence.small_bert_L2_512') returns Spark NLP model sent_small_bert_L2_512\n","nlu.load('en.embed_sentence.small_bert_L4_512') returns Spark NLP model sent_small_bert_L4_512\n","nlu.load('en.embed_sentence.small_bert_L6_512') returns Spark NLP model sent_small_bert_L6_512\n","nlu.load('en.embed_sentence.small_bert_L8_512') returns Spark NLP model sent_small_bert_L8_512\n","nlu.load('en.embed_sentence.small_bert_L10_512') returns Spark NLP model sent_small_bert_L10_512\n","nlu.load('en.embed_sentence.small_bert_L12_512') returns Spark NLP model sent_small_bert_L12_512\n","nlu.load('en.embed_sentence.small_bert_L2_768') returns Spark NLP model sent_small_bert_L2_768\n","nlu.load('en.embed_sentence.small_bert_L4_768') returns Spark NLP model sent_small_bert_L4_768\n","nlu.load('en.embed_sentence.small_bert_L6_768') returns Spark NLP model sent_small_bert_L6_768\n","nlu.load('en.embed_sentence.small_bert_L8_768') returns Spark NLP model sent_small_bert_L8_768\n","nlu.load('en.embed_sentence.small_bert_L10_768') returns Spark NLP model sent_small_bert_L10_768\n","nlu.load('en.embed_sentence.small_bert_L12_768') returns Spark NLP model sent_small_bert_L12_768\n","For language NLU provides the following Models : \n","nlu.load('fi.embed_sentence') returns Spark NLP model sent_bert_finnish_cased\n","nlu.load('fi.embed_sentence.bert.cased') returns Spark NLP model sent_bert_finnish_cased\n","nlu.load('fi.embed_sentence.bert.uncased') returns Spark NLP model sent_bert_finnish_uncased\n","For language NLU provides the following Models : \n","nlu.load('xx.embed_sentence') returns Spark NLP model sent_bert_multi_cased\n","nlu.load('xx.embed_sentence.bert') returns Spark NLP model sent_bert_multi_cased\n","nlu.load('xx.embed_sentence.bert.cased') returns Spark NLP model sent_bert_multi_cased\n","nlu.load('xx.embed_sentence.labse') returns Spark NLP model labse\n"],"name":"stdout"}]},{"cell_type":"code","metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"IKK_Ii_gjJfF","executionInfo":{"status":"ok","timestamp":1620189387010,"user_tz":-120,"elapsed":1115278,"user":{"displayName":"Christian Kasim Loan","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GjqAD-ircKP-s5Eh6JSdkDggDczfqQbJGU_IRb4Hw=s64","userId":"14469489166467359317"}},"outputId":"6b006f1b-dc1b-454d-f65a-95d87fd62f07"},"source":["trainable_pipe = nlu.load('en.embed_sentence.small_bert_L12_768 train.sentiment')\n","# We need to train longer and user smaller LR for NON-USE based sentence embeddings usually\n","# We could tune the hyperparameters further with hyperparameter tuning methods like gridsearch\n","# Also longer training gives more accuracy\n","trainable_pipe['trainable_sentiment_dl'].setMaxEpochs(120) \n","trainable_pipe['trainable_sentiment_dl'].setLr(0.0005) \n","fitted_pipe = trainable_pipe.fit(train_df)\n","# predict with the trainable pipeline on dataset and get predictions\n","preds = fitted_pipe.predict(train_df,output_level='document')\n","\n","#sentence detector that is part of the pipe generates sone NaNs. lets drop them first\n","preds.dropna(inplace=True)\n","print(classification_report(preds['y'], preds['sentiment']))\n","\n","#preds"],"execution_count":null,"outputs":[{"output_type":"stream","text":["sent_small_bert_L12_768 download started this may take some time.\n","Approximate size to download 392.9 MB\n","[OK!]\n","sentence_detector_dl download started this may take some time.\n","Approximate size to download 354.6 KB\n","[OK!]\n"," precision recall f1-score support\n","\n"," negative 0.95 0.86 0.90 791\n"," neutral 0.00 0.00 0.00 0\n"," positive 0.91 0.92 0.92 809\n","\n"," accuracy 0.89 1600\n"," macro avg 0.62 0.59 0.61 1600\n","weighted avg 0.93 0.89 0.91 1600\n","\n"],"name":"stdout"}]},{"cell_type":"markdown","metadata":{"id":"_1jxw3GnVGlI"},"source":["# 7.1 evaluate on Test Data"]},{"cell_type":"code","metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"Fxx4yNkNVGFl","executionInfo":{"status":"ok","timestamp":1620189890877,"user_tz":-120,"elapsed":85461,"user":{"displayName":"Christian Kasim Loan","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GjqAD-ircKP-s5Eh6JSdkDggDczfqQbJGU_IRb4Hw=s64","userId":"14469489166467359317"}},"outputId":"ce8e9318-9a86-4c78-d5de-cd73ba3de282"},"source":["preds = fitted_pipe.predict(test_df,output_level='document')\n","\n","#sentence detector that is part of the pipe generates sone NaNs. lets drop them first\n","preds.dropna(inplace=True)\n","print(classification_report(preds['y'], preds['sentiment']))"],"execution_count":null,"outputs":[{"output_type":"stream","text":[" precision recall f1-score support\n","\n"," negative 0.92 0.81 0.86 209\n"," neutral 0.00 0.00 0.00 0\n"," positive 0.85 0.89 0.87 191\n","\n"," accuracy 0.85 400\n"," macro avg 0.59 0.57 0.58 400\n","weighted avg 0.89 0.85 0.86 400\n","\n"],"name":"stdout"}]},{"cell_type":"markdown","metadata":{"id":"2BB-NwZUoHSe"},"source":["# 8. Lets save the model"]},{"cell_type":"code","metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"eLex095goHwm","executionInfo":{"status":"ok","timestamp":1620190077725,"user_tz":-120,"elapsed":272045,"user":{"displayName":"Christian Kasim Loan","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GjqAD-ircKP-s5Eh6JSdkDggDczfqQbJGU_IRb4Hw=s64","userId":"14469489166467359317"}},"outputId":"35f50714-cad7-4123-d117-f6aea7095f79"},"source":["stored_model_path = './models/classifier_dl_trained' \n","fitted_pipe.save(stored_model_path)"],"execution_count":null,"outputs":[{"output_type":"stream","text":["Stored model in ./models/classifier_dl_trained\n"],"name":"stdout"}]},{"cell_type":"markdown","metadata":{"id":"e_b2DPd4rCiU"},"source":["# 9. Lets load the model from HDD.\n","This makes Offlien NLU usage possible! \n","You need to call nlu.load(path=path_to_the_pipe) to load a model/pipeline from disk."]},{"cell_type":"code","metadata":{"colab":{"base_uri":"https://localhost:8080/","height":80},"id":"SO4uz45MoRgp","executionInfo":{"status":"ok","timestamp":1620190092860,"user_tz":-120,"elapsed":286890,"user":{"displayName":"Christian Kasim Loan","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GjqAD-ircKP-s5Eh6JSdkDggDczfqQbJGU_IRb4Hw=s64","userId":"14469489166467359317"}},"outputId":"c891d7d9-52c8-456c-a354-0bcc81af43eb"},"source":["hdd_pipe = nlu.load(path=stored_model_path)\n","\n","preds = hdd_pipe.predict('The virus had a direct impact on the nervous system')\n","preds"],"execution_count":null,"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","
sentiment_confidencesentencetextsentence_embedding_from_disksentimentdocumentorigin_index
0[0.9973864][The virus had a direct impact on the nervous ...The virus had a direct impact on the nervous s...[[0.19975340366363525, 0.40417489409446716, 0....[negative]The virus had a direct impact on the nervous s...8589934592
\n","
"],"text/plain":[" sentiment_confidence ... origin_index\n","0 [0.9973864] ... 8589934592\n","\n","[1 rows x 7 columns]"]},"metadata":{"tags":[]},"execution_count":17}]},{"cell_type":"code","metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"e0CVlkk9v6Qi","executionInfo":{"status":"ok","timestamp":1620190092863,"user_tz":-120,"elapsed":286783,"user":{"displayName":"Christian Kasim Loan","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GjqAD-ircKP-s5Eh6JSdkDggDczfqQbJGU_IRb4Hw=s64","userId":"14469489166467359317"}},"outputId":"9f4b2eb0-6144-4e6b-d6c6-c782ddd192eb"},"source":["hdd_pipe.print_info()"],"execution_count":null,"outputs":[{"output_type":"stream","text":["The following parameters are configurable for this NLU pipeline (You can copy paste the examples) :\n",">>> pipe['document_assembler'] has settable params:\n","pipe['document_assembler'].setCleanupMode('shrink') | Info: possible values: disabled, inplace, inplace_full, shrink, shrink_full, each, each_full, delete_full | Currently set to : shrink\n",">>> pipe['sentence_detector@SentenceDetectorDLModel_c83c27f46b97'] has settable params:\n","pipe['sentence_detector@SentenceDetectorDLModel_c83c27f46b97'].setExplodeSentences(False) | Info: whether to explode each sentence into a different row, for better parallelization. Defaults to false. | Currently set to : False\n","pipe['sentence_detector@SentenceDetectorDLModel_c83c27f46b97'].setStorageRef('SentenceDetectorDLModel_c83c27f46b97') | Info: storage unique identifier | Currently set to : SentenceDetectorDLModel_c83c27f46b97\n","pipe['sentence_detector@SentenceDetectorDLModel_c83c27f46b97'].setEncoder(com.johnsnowlabs.nlp.annotators.sentence_detector_dl.SentenceDetectorDLEncoder@3a4ced43) | Info: Data encoder | Currently set to : com.johnsnowlabs.nlp.annotators.sentence_detector_dl.SentenceDetectorDLEncoder@3a4ced43\n","pipe['sentence_detector@SentenceDetectorDLModel_c83c27f46b97'].setImpossiblePenultimates(['Bros', 'No', 'al', 'vs', 'etc', 'Fig', 'Dr', 'Prof', 'PhD', 'MD', 'Co', 'Corp', 'Inc', 'bros', 'VS', 'Vs', 'ETC', 'fig', 'dr', 'prof', 'PHD', 'phd', 'md', 'co', 'corp', 'inc', 'Jan', 'Feb', 'Mar', 'Apr', 'Jul', 'Aug', 'Sep', 'Sept', 'Oct', 'Nov', 'Dec', 'St', 'st', 'AM', 'PM', 'am', 'pm', 'e.g', 'f.e', 'i.e']) | Info: Impossible penultimates | Currently set to : ['Bros', 'No', 'al', 'vs', 'etc', 'Fig', 'Dr', 'Prof', 'PhD', 'MD', 'Co', 'Corp', 'Inc', 'bros', 'VS', 'Vs', 'ETC', 'fig', 'dr', 'prof', 'PHD', 'phd', 'md', 'co', 'corp', 'inc', 'Jan', 'Feb', 'Mar', 'Apr', 'Jul', 'Aug', 'Sep', 'Sept', 'Oct', 'Nov', 'Dec', 'St', 'st', 'AM', 'PM', 'am', 'pm', 'e.g', 'f.e', 'i.e']\n","pipe['sentence_detector@SentenceDetectorDLModel_c83c27f46b97'].setModelArchitecture('cnn') | Info: Model architecture (CNN) | Currently set to : cnn\n",">>> pipe['bert_sentence@sent_small_bert_L12_768'] has settable params:\n","pipe['bert_sentence@sent_small_bert_L12_768'].setBatchSize(8) | Info: Size of every batch | Currently set to : 8\n","pipe['bert_sentence@sent_small_bert_L12_768'].setCaseSensitive(False) | Info: whether to ignore case in tokens for embeddings matching | Currently set to : False\n","pipe['bert_sentence@sent_small_bert_L12_768'].setDimension(768) | Info: Number of embedding dimensions | Currently set to : 768\n","pipe['bert_sentence@sent_small_bert_L12_768'].setMaxSentenceLength(128) | Info: Max sentence length to process | Currently set to : 128\n","pipe['bert_sentence@sent_small_bert_L12_768'].setIsLong(False) | Info: Use Long type instead of Int type for inputs buffer - Some Bert models require Long instead of Int. | Currently set to : False\n","pipe['bert_sentence@sent_small_bert_L12_768'].setStorageRef('sent_small_bert_L12_768') | Info: unique reference name for identification | Currently set to : sent_small_bert_L12_768\n",">>> pipe['sentiment_dl@sent_small_bert_L12_768'] has settable params:\n","pipe['sentiment_dl@sent_small_bert_L12_768'].setThreshold(0.6) | Info: The minimum threshold for the final result otheriwse it will be neutral | Currently set to : 0.6\n","pipe['sentiment_dl@sent_small_bert_L12_768'].setThresholdLabel('neutral') | Info: In case the score is less than threshold, what should be the label. Default is neutral. | Currently set to : neutral\n","pipe['sentiment_dl@sent_small_bert_L12_768'].setClasses(['positive', 'negative']) | Info: get the tags used to trained this SentimentDLModel | Currently set to : ['positive', 'negative']\n","pipe['sentiment_dl@sent_small_bert_L12_768'].setStorageRef('sent_small_bert_L12_768') | Info: unique reference name for identification | Currently set to : sent_small_bert_L12_768\n"],"name":"stdout"}]},{"cell_type":"code","metadata":{"id":"CtOuwWgAvqXw"},"source":[""],"execution_count":null,"outputs":[]}]} \ No newline at end of file +{ + "nbformat": 4, + "nbformat_minor": 0, + "metadata": { + "colab": { + "provenance": [] + }, + "kernelspec": { + "display_name": "Python 3", + "name": "python3" + } + }, + "cells": [ + { + "cell_type": "markdown", + "metadata": { + "id": "zkufh760uvF3" + }, + "source": [ + "![JohnSnowLabs](https://nlp.johnsnowlabs.com/assets/images/logo.png)\n", + "\n", + "[![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/JohnSnowLabs/nlu/blob/master/examples/colab/Training/binary_text_classification/NLU_training_negation_classifier_demo_biological_texts.ipynb)\n", + "\n", + "\n", + "# Training a Sentiment Analysis Classifier with NLU\n", + "## 2 Class Biological Negation Classifer Training\n", + "With the [SentimentDL model](https://nlp.johnsnowlabs.com/docs/en/annotators#sentimentdl-multi-class-sentiment-analysis-annotator) from Spark NLP you can achieve State Of the Art results on any multi class text classification problem\n", + "\n", + "This notebook showcases the following features :\n", + "\n", + "- How to train the deep learning classifier\n", + "- How to store a pipeline to disk\n", + "- How to load the pipeline from disk (Enables NLU offline mode)\n", + "\n", + "You can achieve these results or even better on this dataset with training data :\n", + "\n", + "
\n", + "\n", + "![image.png](data:image/png;base64,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)\n", + "\n", + "\n", + "You can achieve these results or even better on this dataset with test data :\n", + "\n", + "
\n", + "\n", + "\n", + "![Screenshot 2021-02-25 140123.png](data:image/png;base64,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)\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "dur2drhW5Rvi" + }, + "source": [ + "# 1. Colab Setup" + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "hFGnBCHavltY" + }, + "source": [ + "!pip install -q johnsnowlabs" + ], + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "f4KkTfnR5Ugg" + }, + "source": [ + "# 2. Download Negation Bilogical Texts dataset\n", + "https://www.kaggle.com/ma7555/bioscope-corpus-negation-annotated\n", + "#Context\n", + "The BioScope corpus consists of medical and biological texts annotated for negation and their linguistic scope. This was done to allow a comparison between the development of systems for negation/hedge detection and scope resolution.\n", + "The corpus is publicly available for research purposes.\n", + "\n", + "You can use this corpus to fine-tune a BERT-like model for negation detection.\n", + "\n", + "This dataset was created in this format during the COVID-19 crisis as a training set for detecting negations regarding treatment of specific drugs in the released research papers.\n", + "\n", + "Creators of the original dataset: MTA-SZTE Research Group on Artificial Intelligence - RGAI\n", + "https://rgai.inf.u-szeged.hu/node/105\n" + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "OrVb5ZMvvrQD" + }, + "source": [ + "! wget https://s3.amazonaws.com/auxdata.johnsnowlabs.com/public/resources/en/classifier-dl/bioscope_abstract/bioscope_abstract.csv\n" + ], + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 424 + }, + "id": "y4xSRWIhwT28", + "outputId": "f8f31c71-7046-474a-fd36-fb21ac09e091" + }, + "source": [ + "import pandas as pd\n", + "train_path = '/content/bioscope_abstract.csv'\n", + "\n", + "train_df = pd.read_csv(train_path)\n", + "# the text data to use for classification should be in a column named 'text' and label column should be named 'y' or 'label' or 'labels'\n", + "columns=['text','y']\n", + "train_df = train_df[columns]\n", + "train_df = train_df.dropna()\n", + "train_df = train_df.sample(frac=1).reset_index(drop=True)\n", + "from sklearn.model_selection import train_test_split\n", + "\n", + "train_df, test_df = train_test_split(train_df, test_size=0.2)\n", + "train_df" + ], + "execution_count": 3, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + " text y\n", + "7142 These apparent inconsistencies reflect the com... positive\n", + "2305 Different glucocorticoid hormones (GCH) show d... positive\n", + "1203 Northern blot analysis of RNA purified from B ... positive\n", + "2093 These results indicate that E3 is a hematopoie... positive\n", + "7594 During recent years, studies of insulin-gene r... positive\n", + "... ... ...\n", + "3894 It can also be distinguished from other previo... positive\n", + "2990 We tested the effects of BHA, a phenolic, lipi... positive\n", + "11027 Sequence analyses of pCD41 indicate that there... positive\n", + "9537 Over a 72-hr period of activation, the express... positive\n", + "7699 The B cell NFAT complex, however, was not func... negative\n", + "\n", + "[9594 rows x 2 columns]" + ], + "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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
texty
7142These apparent inconsistencies reflect the com...positive
2305Different glucocorticoid hormones (GCH) show d...positive
1203Northern blot analysis of RNA purified from B ...positive
2093These results indicate that E3 is a hematopoie...positive
7594During recent years, studies of insulin-gene r...positive
.........
3894It can also be distinguished from other previo...positive
2990We tested the effects of BHA, a phenolic, lipi...positive
11027Sequence analyses of pCD41 indicate that there...positive
9537Over a 72-hr period of activation, the express...positive
7699The B cell NFAT complex, however, was not func...negative
\n", + "

9594 rows × 2 columns

\n", + "
\n", + "
\n", + "\n", + "
\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "
\n", + "\n", + "\n", + "
\n", + " \n", + "\n", + "\n", + "\n", + " \n", + "
\n", + "
\n", + "
\n" + ] + }, + "metadata": {}, + "execution_count": 3 + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "0296Om2C5anY" + }, + "source": [ + "# 3. Train Deep Learning Classifier using nlu.load('train.sentiment')\n", + "\n", + "You dataset label column should be named 'y' and the feature column with text data should be named 'text'" + ] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 1000 + }, + "id": "3ZIPkRkWftBG", + "outputId": "bdfad334-78a0-49f2-9271-1a727ddaa17a" + }, + "source": [ + "from johnsnowlabs import nlp\n", + "from sklearn.metrics import classification_report\n", + "\n", + "# load a trainable pipeline by specifying the train. prefix and fit it on a datset with label and text columns\n", + "# by default the Universal Sentence Encoder (USE) Sentence embeddings are used for generation\n", + "trainable_pipe = nlp.load('train.sentiment')\n", + "fitted_pipe = trainable_pipe.fit(train_df.iloc[:50])\n", + "\n", + "# predict with the trainable pipeline on dataset and get predictions\n", + "preds = fitted_pipe.predict(train_df.iloc[:50],output_level='document')\n", + "#sentence detector that is part of the pipe generates sone NaNs. lets drop them first\n", + "preds.dropna(inplace=True)\n", + "print(classification_report(preds['y'], preds['sentiment']))\n", + "\n", + "preds" + ], + "execution_count": 4, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Warning::Spark Session already created, some configs may not take.\n", + "sent_small_bert_L2_128 download started this may take some time.\n", + "Approximate size to download 16.1 MB\n", + "[OK!]\n", + " precision recall f1-score support\n", + "\n", + " negative 0.00 0.00 0.00 6\n", + " positive 0.88 1.00 0.94 44\n", + "\n", + " accuracy 0.88 50\n", + " macro avg 0.44 0.50 0.47 50\n", + "weighted avg 0.77 0.88 0.82 50\n", + "\n" + ] + }, + { + "output_type": "execute_result", + "data": { + "text/plain": [ + " document \\\n", + "0 These apparent inconsistencies reflect the com... \n", + "1 Different glucocorticoid hormones (GCH) show d... \n", + "2 Northern blot analysis of RNA purified from B ... \n", + "3 These results indicate that E3 is a hematopoie... \n", + "4 During recent years, studies of insulin-gene r... \n", + "5 To our knowledge, this constitutes the first i... \n", + "6 In contrast, gp41 failed to stimulate NF-kappa... \n", + "7 Data obtained from studies in our laboratories... \n", + "8 RESULTS: Interleukin-6 protein and mRNA produc... \n", + "9 When submitted to an in vitro CD4 cross-linkin... \n", + "10 Treatment of human resting T cells with phorbo... \n", + "11 Distinct DNase-I hypersensitive sites are asso... \n", + "12 The biological activity of 11 alpha-methyl-1 a... \n", + "13 These observations indicate that the monovalen... \n", + "14 The M-CSF receptor was first detectable in the... \n", + "15 TNFRI has been recently shown to activate NF-k... \n", + "16 The two mutations R217A and R294A caused an in... \n", + "17 Cipro did not affect the nuclear transcription... \n", + "18 Conversely, diurnal rhythmicity persisted in a... \n", + "19 The immunoglobulin heavy chain (IgH) class swi... \n", + "20 Four regions in this DNA fragment interact wit... \n", + "21 Previous characterization of the GPIX promoter... \n", + "22 Neutrophil maturation was impaired in PEBP2bet... \n", + "23 Treatment of normal monocytes with 12-0-tetrad... \n", + "24 We have cloned the gene for a new ets-related ... \n", + "25 Expression and genomic configuration of GM-CSF... \n", + "26 Consequently, cytosolic activation, nuclear tr... \n", + "27 We propose that Jun plays a bifunctional role ... \n", + "28 In B lymphoid cells, deltaspi-B and spi-B mRNA... \n", + "29 In order to study CD14 gene regulation, the hu... \n", + "30 E3 transcripts were RA-inducible in HL60 cells... \n", + "31 IL-7 also delayed the decreases in the levels ... \n", + "32 A marked activation of gamma-promoter activity... \n", + "33 These results demonstrate that the transcripti... \n", + "34 The A6H monoclonal antibody (mAb) recognizes a... \n", + "35 The highly specific granulomonocyte-associated... \n", + "36 Compared to benign tumor or mammary reduction ... \n", + "37 Sequence-specific DNA-binding small molecules ... \n", + "38 Structure function analysis of vitamin D analo... \n", + "39 To determine the mechanisms responsible for th... \n", + "40 DNA band-shift analysis reveals NF-kappa B bin... \n", + "41 RESULTS: Both all-trans and 9-cis RA inhibited... \n", + "42 Negative selection in the cortex appears to be... \n", + "43 Nitric oxide-stimulated guanine nucleotide exc... \n", + "44 We show that the ability to detect NF-ATp in a... \n", + "45 C3/5 cells developed specific proliferation an... \n", + "46 Recent reports demonstrated that ionizing radi... \n", + "47 Here we examine molecular mechanisms controlli... \n", + "48 These results demonstrate that multiple X1 box... \n", + "49 IL-2 and IL-7 were equivalent in their ability... \n", + "\n", + " sentence_embedding_small_bert_L2_128 sentiment \\\n", + "0 [-0.540424644947052, 0.6268006563186646, -0.67... positive \n", + "1 [-0.7596609592437744, -0.5880932807922363, -0.... positive \n", + "2 [-0.5203543305397034, 0.033645179122686386, -0... positive \n", + "3 [-0.7046567797660828, 0.33753958344459534, -0.... positive \n", + "4 [-0.7543756365776062, 0.4511456787586212, -0.9... positive \n", + "5 [-1.0517436265945435, -0.0811738669872284, -0.... positive \n", + "6 [-0.8322800397872925, 0.5296803116798401, -0.5... positive \n", + "7 [-0.7395010590553284, 0.5016824007034302, -0.5... positive \n", + "8 [-0.06874295324087143, 0.3614305853843689, -0.... positive \n", + "9 [-0.24975398182868958, 0.007427605800330639, -... positive \n", + "10 [-0.7139838933944702, -0.15548910200595856, -0... positive \n", + "11 [0.16768714785575867, -0.4549502730369568, -0.... positive \n", + "12 [-0.6323443055152893, -0.3998635411262512, -0.... positive \n", + "13 [-0.5919932723045349, 0.1734667867422104, -0.8... positive \n", + "14 [-0.526080310344696, 0.1735551655292511, -0.53... positive \n", + "15 [-0.7427854537963867, -0.3252595067024231, -0.... positive \n", + "16 [-0.5198838710784912, 0.6203998327255249, -0.6... positive \n", + "17 [-0.010745533742010593, 0.36891499161720276, -... positive \n", + "18 [-0.6558191180229187, -0.4102998673915863, -0.... positive \n", + "19 [-0.5788812637329102, 0.16702984273433685, -0.... positive \n", + "20 [0.4348486065864563, -0.4957105219364166, -0.9... positive \n", + "21 [-1.4378761053085327, 0.35956352949142456, -0.... positive \n", + "22 [-0.9040020704269409, -0.3321942389011383, -0.... positive \n", + "23 [-0.38281142711639404, -0.09264473617076874, -... positive \n", + "24 [-0.06995158642530441, 0.0628473237156868, -0.... positive \n", + "25 [-0.2674736976623535, 0.6871048212051392, -0.5... positive \n", + "26 [-0.11669447273015976, -0.41803038120269775, -... positive \n", + "27 [-0.3439536988735199, -0.11270888149738312, -0... positive \n", + "28 [-0.026912417262792587, -0.07306383550167084, ... positive \n", + "29 [-0.6894456744194031, 0.6227385997772217, -0.4... positive \n", + "30 [0.055561263114213943, 0.29671669006347656, -0... positive \n", + "31 [-1.2081276178359985, -0.4925746023654938, -0.... positive \n", + "32 [-0.7283461093902588, -0.00887372437864542, -0... positive \n", + "33 [-0.8078993558883667, 0.024193232879042625, -0... positive \n", + "34 [-0.6170817017555237, 0.176478773355484, -0.77... positive \n", + "35 [-0.5863608717918396, 0.10614630579948425, -0.... positive \n", + "36 [0.0020447946153581142, 0.1792808622121811, -0... positive \n", + "37 [-0.2069147676229477, 0.016566185280680656, -0... positive \n", + "38 [-0.4320926070213318, 0.74772709608078, -0.559... positive \n", + "39 [-0.37579116225242615, 0.5168997049331665, -0.... positive \n", + "40 [-0.04819030314683914, 0.04168706387281418, -0... positive \n", + "41 [-0.5226595401763916, -0.33986032009124756, -0... positive \n", + "42 [-0.022223301231861115, -0.22735534608364105, ... positive \n", + "43 [-0.3036770224571228, -0.13188859820365906, -0... positive \n", + "44 [-0.6237607598304749, 0.3612492084503174, -0.4... positive \n", + "45 [-0.26343587040901184, -0.09341304749250412, -... positive \n", + "46 [-0.5906685590744019, 0.20001085102558136, -0.... positive \n", + "47 [-0.4508644938468933, 0.2742282450199127, -0.0... positive \n", + "48 [-0.3715269863605499, 0.3266661465167999, -0.3... positive \n", + "49 [-0.7310452461242676, -0.2004045844078064, -0.... positive \n", + "\n", + " sentiment_confidence text \\\n", + "0 1.0 These apparent inconsistencies reflect the com... \n", + "1 3.0 Different glucocorticoid hormones (GCH) show d... \n", + "2 2.0 Northern blot analysis of RNA purified from B ... \n", + "3 4.0 These results indicate that E3 is a hematopoie... \n", + "4 4.0 During recent years, studies of insulin-gene r... \n", + "5 3.0 To our knowledge, this constitutes the first i... \n", + "6 2.0 In contrast, gp41 failed to stimulate NF-kappa... \n", + "7 1.0 Data obtained from studies in our laboratories... \n", + "8 8.0 RESULTS: Interleukin-6 protein and mRNA produc... \n", + "9 2.0 When submitted to an in vitro CD4 cross-linkin... \n", + "10 5.0 Treatment of human resting T cells with phorbo... \n", + "11 1.0 Distinct DNase-I hypersensitive sites are asso... \n", + "12 4.0 The biological activity of 11 alpha-methyl-1 a... \n", + "13 3.0 These observations indicate that the monovalen... \n", + "14 9.0 The M-CSF receptor was first detectable in the... \n", + "15 9.0 TNFRI has been recently shown to activate NF-k... \n", + "16 3.0 The two mutations R217A and R294A caused an in... \n", + "17 8.0 Cipro did not affect the nuclear transcription... \n", + "18 8.0 Conversely, diurnal rhythmicity persisted in a... \n", + "19 2.0 The immunoglobulin heavy chain (IgH) class swi... \n", + "20 1.0 Four regions in this DNA fragment interact wit... \n", + "21 4.0 Previous characterization of the GPIX promoter... \n", + "22 8.0 Neutrophil maturation was impaired in PEBP2bet... \n", + "23 1.0 Treatment of normal monocytes with 12-0-tetrad... \n", + "24 5.0 We have cloned the gene for a new ets-related ... \n", + "25 4.0 Expression and genomic configuration of GM-CSF... \n", + "26 5.0 Consequently, cytosolic activation, nuclear tr... \n", + "27 3.0 We propose that Jun plays a bifunctional role ... \n", + "28 1.0 In B lymphoid cells, deltaspi-B and spi-B mRNA... \n", + "29 8.0 In order to study CD14 gene regulation, the hu... \n", + "30 9.0 E3 transcripts were RA-inducible in HL60 cells... \n", + "31 3.0 IL-7 also delayed the decreases in the levels ... \n", + "32 1.0 A marked activation of gamma-promoter activity... \n", + "33 6.0 These results demonstrate that the transcripti... \n", + "34 2.0 The A6H monoclonal antibody (mAb) recognizes a... \n", + "35 1.0 The highly specific granulomonocyte-associated... \n", + "36 1.0 Compared to benign tumor or mammary reduction ... \n", + "37 1.0 Sequence-specific DNA-binding small molecules ... \n", + "38 1.0 Structure function analysis of vitamin D analo... \n", + "39 5.0 To determine the mechanisms responsible for th... \n", + "40 7.0 DNA band-shift analysis reveals NF-kappa B bin... \n", + "41 5.0 RESULTS: Both all-trans and 9-cis RA inhibited... \n", + "42 5.0 Negative selection in the cortex appears to be... \n", + "43 7.0 Nitric oxide-stimulated guanine nucleotide exc... \n", + "44 2.0 We show that the ability to detect NF-ATp in a... \n", + "45 1.0 C3/5 cells developed specific proliferation an... \n", + "46 4.0 Recent reports demonstrated that ionizing radi... \n", + "47 2.0 Here we examine molecular mechanisms controlli... \n", + "48 2.0 These results demonstrate that multiple X1 box... \n", + "49 3.0 IL-2 and IL-7 were equivalent in their ability... \n", + "\n", + " y \n", + "0 positive \n", + "1 positive \n", + "2 positive \n", + "3 positive \n", + "4 positive \n", + "5 positive \n", + "6 negative \n", + "7 positive \n", + "8 positive \n", + "9 positive \n", + "10 positive \n", + "11 positive \n", + "12 positive \n", + "13 positive \n", + "14 positive \n", + "15 positive \n", + "16 negative \n", + "17 negative \n", + "18 positive \n", + "19 positive \n", + "20 positive \n", + "21 positive \n", + "22 positive \n", + "23 positive \n", + "24 positive \n", + "25 positive \n", + "26 positive \n", + "27 positive \n", + "28 positive \n", + "29 positive \n", + "30 negative \n", + "31 positive \n", + "32 positive \n", + "33 positive \n", + "34 positive \n", + "35 positive \n", + "36 positive \n", + "37 positive \n", + "38 positive \n", + "39 positive \n", + "40 positive \n", + "41 negative \n", + "42 negative \n", + "43 positive \n", + "44 positive \n", + "45 positive \n", + "46 positive \n", + "47 positive \n", + "48 positive \n", + "49 positive " + ], + "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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + "
documentsentence_embedding_small_bert_L2_128sentimentsentiment_confidencetexty
0These apparent inconsistencies reflect the com...[-0.540424644947052, 0.6268006563186646, -0.67...positive1.0These apparent inconsistencies reflect the com...positive
1Different glucocorticoid hormones (GCH) show d...[-0.7596609592437744, -0.5880932807922363, -0....positive3.0Different glucocorticoid hormones (GCH) show d...positive
2Northern blot analysis of RNA purified from B ...[-0.5203543305397034, 0.033645179122686386, -0...positive2.0Northern blot analysis of RNA purified from B ...positive
3These results indicate that E3 is a hematopoie...[-0.7046567797660828, 0.33753958344459534, -0....positive4.0These results indicate that E3 is a hematopoie...positive
4During recent years, studies of insulin-gene r...[-0.7543756365776062, 0.4511456787586212, -0.9...positive4.0During recent years, studies of insulin-gene r...positive
5To our knowledge, this constitutes the first i...[-1.0517436265945435, -0.0811738669872284, -0....positive3.0To our knowledge, this constitutes the first i...positive
6In contrast, gp41 failed to stimulate NF-kappa...[-0.8322800397872925, 0.5296803116798401, -0.5...positive2.0In contrast, gp41 failed to stimulate NF-kappa...negative
7Data obtained from studies in our laboratories...[-0.7395010590553284, 0.5016824007034302, -0.5...positive1.0Data obtained from studies in our laboratories...positive
8RESULTS: Interleukin-6 protein and mRNA produc...[-0.06874295324087143, 0.3614305853843689, -0....positive8.0RESULTS: Interleukin-6 protein and mRNA produc...positive
9When submitted to an in vitro CD4 cross-linkin...[-0.24975398182868958, 0.007427605800330639, -...positive2.0When submitted to an in vitro CD4 cross-linkin...positive
10Treatment of human resting T cells with phorbo...[-0.7139838933944702, -0.15548910200595856, -0...positive5.0Treatment of human resting T cells with phorbo...positive
11Distinct DNase-I hypersensitive sites are asso...[0.16768714785575867, -0.4549502730369568, -0....positive1.0Distinct DNase-I hypersensitive sites are asso...positive
12The biological activity of 11 alpha-methyl-1 a...[-0.6323443055152893, -0.3998635411262512, -0....positive4.0The biological activity of 11 alpha-methyl-1 a...positive
13These observations indicate that the monovalen...[-0.5919932723045349, 0.1734667867422104, -0.8...positive3.0These observations indicate that the monovalen...positive
14The M-CSF receptor was first detectable in the...[-0.526080310344696, 0.1735551655292511, -0.53...positive9.0The M-CSF receptor was first detectable in the...positive
15TNFRI has been recently shown to activate NF-k...[-0.7427854537963867, -0.3252595067024231, -0....positive9.0TNFRI has been recently shown to activate NF-k...positive
16The two mutations R217A and R294A caused an in...[-0.5198838710784912, 0.6203998327255249, -0.6...positive3.0The two mutations R217A and R294A caused an in...negative
17Cipro did not affect the nuclear transcription...[-0.010745533742010593, 0.36891499161720276, -...positive8.0Cipro did not affect the nuclear transcription...negative
18Conversely, diurnal rhythmicity persisted in a...[-0.6558191180229187, -0.4102998673915863, -0....positive8.0Conversely, diurnal rhythmicity persisted in a...positive
19The immunoglobulin heavy chain (IgH) class swi...[-0.5788812637329102, 0.16702984273433685, -0....positive2.0The immunoglobulin heavy chain (IgH) class swi...positive
20Four regions in this DNA fragment interact wit...[0.4348486065864563, -0.4957105219364166, -0.9...positive1.0Four regions in this DNA fragment interact wit...positive
21Previous characterization of the GPIX promoter...[-1.4378761053085327, 0.35956352949142456, -0....positive4.0Previous characterization of the GPIX promoter...positive
22Neutrophil maturation was impaired in PEBP2bet...[-0.9040020704269409, -0.3321942389011383, -0....positive8.0Neutrophil maturation was impaired in PEBP2bet...positive
23Treatment of normal monocytes with 12-0-tetrad...[-0.38281142711639404, -0.09264473617076874, -...positive1.0Treatment of normal monocytes with 12-0-tetrad...positive
24We have cloned the gene for a new ets-related ...[-0.06995158642530441, 0.0628473237156868, -0....positive5.0We have cloned the gene for a new ets-related ...positive
25Expression and genomic configuration of GM-CSF...[-0.2674736976623535, 0.6871048212051392, -0.5...positive4.0Expression and genomic configuration of GM-CSF...positive
26Consequently, cytosolic activation, nuclear tr...[-0.11669447273015976, -0.41803038120269775, -...positive5.0Consequently, cytosolic activation, nuclear tr...positive
27We propose that Jun plays a bifunctional role ...[-0.3439536988735199, -0.11270888149738312, -0...positive3.0We propose that Jun plays a bifunctional role ...positive
28In B lymphoid cells, deltaspi-B and spi-B mRNA...[-0.026912417262792587, -0.07306383550167084, ...positive1.0In B lymphoid cells, deltaspi-B and spi-B mRNA...positive
29In order to study CD14 gene regulation, the hu...[-0.6894456744194031, 0.6227385997772217, -0.4...positive8.0In order to study CD14 gene regulation, the hu...positive
30E3 transcripts were RA-inducible in HL60 cells...[0.055561263114213943, 0.29671669006347656, -0...positive9.0E3 transcripts were RA-inducible in HL60 cells...negative
31IL-7 also delayed the decreases in the levels ...[-1.2081276178359985, -0.4925746023654938, -0....positive3.0IL-7 also delayed the decreases in the levels ...positive
32A marked activation of gamma-promoter activity...[-0.7283461093902588, -0.00887372437864542, -0...positive1.0A marked activation of gamma-promoter activity...positive
33These results demonstrate that the transcripti...[-0.8078993558883667, 0.024193232879042625, -0...positive6.0These results demonstrate that the transcripti...positive
34The A6H monoclonal antibody (mAb) recognizes a...[-0.6170817017555237, 0.176478773355484, -0.77...positive2.0The A6H monoclonal antibody (mAb) recognizes a...positive
35The highly specific granulomonocyte-associated...[-0.5863608717918396, 0.10614630579948425, -0....positive1.0The highly specific granulomonocyte-associated...positive
36Compared to benign tumor or mammary reduction ...[0.0020447946153581142, 0.1792808622121811, -0...positive1.0Compared to benign tumor or mammary reduction ...positive
37Sequence-specific DNA-binding small molecules ...[-0.2069147676229477, 0.016566185280680656, -0...positive1.0Sequence-specific DNA-binding small molecules ...positive
38Structure function analysis of vitamin D analo...[-0.4320926070213318, 0.74772709608078, -0.559...positive1.0Structure function analysis of vitamin D analo...positive
39To determine the mechanisms responsible for th...[-0.37579116225242615, 0.5168997049331665, -0....positive5.0To determine the mechanisms responsible for th...positive
40DNA band-shift analysis reveals NF-kappa B bin...[-0.04819030314683914, 0.04168706387281418, -0...positive7.0DNA band-shift analysis reveals NF-kappa B bin...positive
41RESULTS: Both all-trans and 9-cis RA inhibited...[-0.5226595401763916, -0.33986032009124756, -0...positive5.0RESULTS: Both all-trans and 9-cis RA inhibited...negative
42Negative selection in the cortex appears to be...[-0.022223301231861115, -0.22735534608364105, ...positive5.0Negative selection in the cortex appears to be...negative
43Nitric oxide-stimulated guanine nucleotide exc...[-0.3036770224571228, -0.13188859820365906, -0...positive7.0Nitric oxide-stimulated guanine nucleotide exc...positive
44We show that the ability to detect NF-ATp in a...[-0.6237607598304749, 0.3612492084503174, -0.4...positive2.0We show that the ability to detect NF-ATp in a...positive
45C3/5 cells developed specific proliferation an...[-0.26343587040901184, -0.09341304749250412, -...positive1.0C3/5 cells developed specific proliferation an...positive
46Recent reports demonstrated that ionizing radi...[-0.5906685590744019, 0.20001085102558136, -0....positive4.0Recent reports demonstrated that ionizing radi...positive
47Here we examine molecular mechanisms controlli...[-0.4508644938468933, 0.2742282450199127, -0.0...positive2.0Here we examine molecular mechanisms controlli...positive
48These results demonstrate that multiple X1 box...[-0.3715269863605499, 0.3266661465167999, -0.3...positive2.0These results demonstrate that multiple X1 box...positive
49IL-2 and IL-7 were equivalent in their ability...[-0.7310452461242676, -0.2004045844078064, -0....positive3.0IL-2 and IL-7 were equivalent in their ability...positive
\n", + "
\n", + "
\n", + "\n", + "
\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "
\n", + "\n", + "\n", + "
\n", + " \n", + "\n", + "\n", + "\n", + " \n", + "
\n", + "
\n", + "
\n" + ] + }, + "metadata": {}, + "execution_count": 4 + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "lVyOE2wV0fw_" + }, + "source": [ + "# 4. Test the fitted pipe on new example" + ] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 150 + }, + "id": "qdCUg2MR0PD2", + "outputId": "0ecf1df7-d5ff-4ed4-e993-9092c7870aad" + }, + "source": [ + "fitted_pipe.predict(\"The virus had a direct impact on the nervous system\")" + ], + "execution_count": null, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "sentence_detector_dl download started this may take some time.\n", + "Approximate size to download 354.6 KB\n", + "[OK!]\n", + "Warning::Spark Session already created, some configs may not take.\n" + ] + }, + { + "output_type": "execute_result", + "data": { + "text/plain": [ + " sentence \\\n", + "0 The virus had a direct impact on the nervous s... \n", + "\n", + " sentence_embedding_small_bert_L2_128 sentiment \\\n", + "0 [-0.4990377724170685, 0.34958764910697937, -0.... positive \n", + "\n", + " sentiment_confidence \n", + "0 1.0 " + ], + "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", + "
sentencesentence_embedding_small_bert_L2_128sentimentsentiment_confidence
0The virus had a direct impact on the nervous s...[-0.4990377724170685, 0.34958764910697937, -0....positive1.0
\n", + "
\n", + "
\n", + "\n", + "
\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "
\n", + "\n", + "
\n", + "
\n" + ] + }, + "metadata": {}, + "execution_count": 4 + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "xflpwrVjjBVD" + }, + "source": [ + "## 5. Configure pipe training parameters" + ] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "UtsAUGTmOTms", + "outputId": "3d34ed83-2b77-48ab-960d-054ed7937903" + }, + "source": [ + "trainable_pipe.print_info()" + ], + "execution_count": null, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "The following parameters are configurable for this NLU pipeline (You can copy paste the examples) :\n", + ">>> component_list['bert_sentence_embeddings@sent_small_bert_L2_128'] has settable params:\n", + "component_list['bert_sentence_embeddings@sent_small_bert_L2_128'].setBatchSize(8) | Info: Size of every batch | Currently set to : 8\n", + "component_list['bert_sentence_embeddings@sent_small_bert_L2_128'].setEngine('tensorflow') | Info: Deep Learning engine used for this model | Currently set to : tensorflow\n", + "component_list['bert_sentence_embeddings@sent_small_bert_L2_128'].setIsLong(False) | Info: Use Long type instead of Int type for inputs buffer - Some Bert models require Long instead of Int. | Currently set to : False\n", + "component_list['bert_sentence_embeddings@sent_small_bert_L2_128'].setMaxSentenceLength(128) | Info: Max sentence length to process | Currently set to : 128\n", + "component_list['bert_sentence_embeddings@sent_small_bert_L2_128'].setDimension(128) | Info: Number of embedding dimensions | Currently set to : 128\n", + "component_list['bert_sentence_embeddings@sent_small_bert_L2_128'].setCaseSensitive(False) | Info: whether to ignore case in tokens for embeddings matching | Currently set to : False\n", + "component_list['bert_sentence_embeddings@sent_small_bert_L2_128'].setStorageRef('sent_small_bert_L2_128') | Info: unique reference name for identification | Currently set to : sent_small_bert_L2_128\n", + ">>> component_list['document_assembler'] has settable params:\n", + "component_list['document_assembler'].setCleanupMode('shrink') | Info: possible values: disabled, inplace, inplace_full, shrink, shrink_full, each, each_full, delete_full | Currently set to : shrink\n", + ">>> component_list['sentiment_dl@sent_small_bert_L2_128'] has settable params:\n", + "component_list['sentiment_dl@sent_small_bert_L2_128'].setEngine('tensorflow') | Info: Deep Learning engine used for this model | Currently set to : tensorflow\n", + "component_list['sentiment_dl@sent_small_bert_L2_128'].setThreshold(0.6) | Info: The minimum threshold for the final result otheriwse it will be neutral | Currently set to : 0.6\n", + "component_list['sentiment_dl@sent_small_bert_L2_128'].setThresholdLabel('neutral') | Info: In case the score is less than threshold, what should be the label. Default is neutral. | Currently set to : neutral\n", + "component_list['sentiment_dl@sent_small_bert_L2_128'].setStorageRef('sent_small_bert_L2_128') | Info: unique reference name for identification | Currently set to : sent_small_bert_L2_128\n" + ] + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "2GJdDNV9jEIe" + }, + "source": [ + "## 6. Retrain with new parameters" + ] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 1000 + }, + "id": "mptfvHx-MMMX", + "outputId": "1088e9d9-1d05-4b63-d07b-cb23113d9277" + }, + "source": [ + "# Train longer!\n", + "trainable_pipe = nlp.load('train.sentiment')\n", + "trainable_pipe['trainable_sentiment_dl'].setMaxEpochs(5)\n", + "fitted_pipe = trainable_pipe.fit(train_df.iloc[:50])\n", + "# predict with the trainable pipeline on dataset and get predictions\n", + "preds = fitted_pipe.predict(train_df.iloc[:50],output_level='document')\n", + "\n", + "#sentence detector that is part of the pipe generates sone NaNs. lets drop them first\n", + "preds.dropna(inplace=True)\n", + "print(classification_report(preds['y'], preds['sentiment']))\n", + "\n", + "preds" + ], + "execution_count": null, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Warning::Spark Session already created, some configs may not take.\n", + "Warning::Spark Session already created, some configs may not take.\n", + "sent_small_bert_L2_128 download started this may take some time.\n", + "Approximate size to download 16.1 MB\n", + "[OK!]\n", + " precision recall f1-score support\n", + "\n", + " negative 0.00 0.00 0.00 2\n", + " positive 0.96 1.00 0.98 48\n", + "\n", + " accuracy 0.96 50\n", + " macro avg 0.48 0.50 0.49 50\n", + "weighted avg 0.92 0.96 0.94 50\n", + "\n" + ] + }, + { + "output_type": "execute_result", + "data": { + "text/plain": [ + " document \\\n", + "0 Based on nucleotide sequence requirements and ... \n", + "1 TINUR belongs to the NGFI-B/nur77 family of th... \n", + "2 In selenium-deprived Jurkat and ESb-L T lympho... \n", + "3 These findings demonstrate that IFNs inhibit I... \n", + "4 These data reveal the presence of distinct com... \n", + "5 The translated protein showed weak DNA binding... \n", + "6 All tumor cell lines from the B-cell lineage a... \n", + "7 GABP factors bind to a distal interleukin 2 (I... \n", + "8 In addition, Tax also stimulates the transcrip... \n", + "9 Mutation of the TCF-1 alpha binding site dimin... \n", + "10 They involve phosphorylation and proteolytic r... \n", + "11 Activation of the transcription factor NF-kapp... \n", + "12 Neutrophil accumulation and development of lun... \n", + "13 Mutations in these binding sites can interfere... \n", + "14 To understand the molecular mechanisms of func... \n", + "15 Collectively, these results suggest that HOCl ... \n", + "16 However, mutation of the AP-1 site markedly di... \n", + "17 A novel HIV-1 isolate containing alterations a... \n", + "18 These findings suggest that Zp responds direct... \n", + "19 Several distinct roles for hsp90 in modulating... \n", + "20 In addition to activation of phospholipase C g... \n", + "21 Also in the current study, binding activity to... \n", + "22 These alterations of transcription factors are... \n", + "23 Epstein-Barr virus nuclear antigen 2 and laten... \n", + "24 Here, we present the isolation and characteriz... \n", + "25 The signaling capabilities of the IL-10R for a... \n", + "26 To identify potential cellular homologues of c... \n", + "27 In addition, no CIITA protein is detectable in... \n", + "28 The expression of AP-1 depended on calcium mob... \n", + "29 Nuclear accumulation of NFAT4 opposed by the J... \n", + "30 This resistance to apoptosis is reversed by an... \n", + "31 During recent years, studies of insulin-gene r... \n", + "32 The NFAT protein migrated more slowly in a sod... \n", + "33 The effect of DM on expression of IL-2R alpha ... \n", + "34 We conclude that TNF-alpha bioavailability and... \n", + "35 The two isozymes show little amino acid identi... \n", + "36 Intriguingly, surface expression of LT-alpha1b... \n", + "37 Binding of the drug inhibits isomerase activit... \n", + "38 These genes may then play a role in altering t... \n", + "39 Copyright 1999 Academic Press. \n", + "40 Direct exposure to 10 nM 2,3,7,8-TCDD caused a... \n", + "41 However, activation of the T cell lines leadin... \n", + "42 The defensin sensitivities of Salmonella typhi... \n", + "43 Receptors for the Fc portion of immunoglobulin... \n", + "44 We have isolated a novel cDNA clone encoding i... \n", + "45 IL-10 inhibitory activity is exerted on T lymp... \n", + "46 Furthermore, CD40 ligation of a HLA-A2+, Melan... \n", + "47 We conclude that interactions between TAFII32 ... \n", + "48 These cDNA were 2343 bp long and their transcr... \n", + "49 In vitro studies using pure recombinant p21ras... \n", + "\n", + " sentence_embedding_small_bert_L2_128 sentiment \\\n", + "0 [-0.49277549982070923, 0.09530887007713318, -0... positive \n", + "1 [-0.10481061786413193, 0.1171066015958786, -0.... positive \n", + "2 [-1.0812174081802368, 0.5883667469024658, -0.4... positive \n", + "3 [-0.9547467231750488, -0.15689292550086975, -0... positive \n", + "4 [-0.4628618657588959, 0.06154884025454521, -0.... positive \n", + "5 [-0.3139030635356903, -0.15748938918113708, -0... positive \n", + "6 [0.20084746181964874, -0.4846010208129883, -0.... positive \n", + "7 [-0.26659855246543884, 0.2846565246582031, -1.... positive \n", + "8 [-0.822009801864624, 0.6354378461837769, -0.34... positive \n", + "9 [-0.6489402651786804, 0.1254355013370514, -0.5... positive \n", + "10 [-0.8970018029212952, -0.5171773433685303, -0.... positive \n", + "11 [-0.5248922109603882, 0.24680814146995544, -0.... positive \n", + "12 [-1.0332255363464355, 0.5459337830543518, -1.1... positive \n", + "13 [-0.11175256222486496, 0.06691665202379227, -0... positive \n", + "14 [-0.4407936632633209, 0.782042920589447, -0.50... positive \n", + "15 [-0.6647999882698059, 0.3089727759361267, -0.4... positive \n", + "16 [-0.9864672422409058, 0.05116121098399162, -0.... positive \n", + "17 [-0.18733267486095428, 0.06821992248296738, -0... positive \n", + "18 [-0.7554842829704285, -0.054939232766628265, -... positive \n", + "19 [-0.12544415891170502, 0.2649071216583252, -0.... positive \n", + "20 [-0.5602053999900818, -0.5014104843139648, -0.... positive \n", + "21 [-0.9772286415100098, 0.048676762729883194, -0... positive \n", + "22 [-0.3631213307380676, 0.2459881603717804, -0.8... positive \n", + "23 [-0.1847376972436905, -0.007672342471778393, -... positive \n", + "24 [-0.14775823056697845, -0.014818106777966022, ... positive \n", + "25 [-0.506297767162323, 0.44844114780426025, -0.5... positive \n", + "26 [0.001409502699971199, 0.13168536126613617, -0... positive \n", + "27 [0.09807377308607101, -0.04232050105929375, -0... positive \n", + "28 [-0.9711195826530457, -0.15560954809188843, -0... positive \n", + "29 [-0.22911998629570007, 0.4173714518547058, -0.... positive \n", + "30 [-0.3486934304237366, 0.22132794559001923, -0.... positive \n", + "31 [-0.7870786786079407, 0.4678671956062317, -0.9... positive \n", + "32 [0.048784464597702026, -0.1957472562789917, -0... positive \n", + "33 [-0.37844932079315186, 0.12598302960395813, -0... positive \n", + "34 [-0.5289692878723145, 0.7431911826133728, -0.7... positive \n", + "35 [0.14430226385593414, -0.674239993095398, -0.7... positive \n", + "36 [-0.2223060429096222, -0.15909825265407562, -0... positive \n", + "37 [-0.6680501699447632, 0.34882932901382446, -0.... positive \n", + "38 [-0.8830984830856323, 0.1207333579659462, -0.6... positive \n", + "39 [-1.021697759628296, 0.9163565635681152, -0.25... positive \n", + "40 [-0.8829392194747925, 0.09077997505664825, -0.... positive \n", + "41 [-0.2961618900299072, -0.22415119409561157, -0... positive \n", + "42 [-0.4785139262676239, 0.172796368598938, -0.22... positive \n", + "43 [-0.44332364201545715, -0.3984912037849426, -0... positive \n", + "44 [0.11249734461307526, -0.1219027042388916, -0.... positive \n", + "45 [-0.07616603374481201, 0.030630899593234062, -... positive \n", + "46 [-0.3785442113876343, 0.29912295937538147, -0.... positive \n", + "47 [-0.4170002043247223, -0.09449539333581924, -0... positive \n", + "48 [-0.9243519306182861, 0.7070343494415283, -0.3... positive \n", + "49 [-0.6335657238960266, 0.15302662551403046, -0.... positive \n", + "\n", + " sentiment_confidence text \\\n", + "0 1.0 Based on nucleotide sequence requirements and ... \n", + "1 1.0 TINUR belongs to the NGFI-B/nur77 family of th... \n", + "2 1.0 In selenium-deprived Jurkat and ESb-L T lympho... \n", + "3 1.0 These findings demonstrate that IFNs inhibit I... \n", + "4 1.0 These data reveal the presence of distinct com... \n", + "5 1.0 The translated protein showed weak DNA binding... \n", + "6 1.0 All tumor cell lines from the B-cell lineage a... \n", + "7 1.0 GABP factors bind to a distal interleukin 2 (I... \n", + "8 1.0 In addition, Tax also stimulates the transcrip... \n", + "9 1.0 Mutation of the TCF-1 alpha binding site dimin... \n", + "10 1.0 They involve phosphorylation and proteolytic r... \n", + "11 1.0 Activation of the transcription factor NF-kapp... \n", + "12 1.0 Neutrophil accumulation and development of lun... \n", + "13 1.0 Mutations in these binding sites can interfere... \n", + "14 1.0 To understand the molecular mechanisms of func... \n", + "15 1.0 Collectively, these results suggest that HOCl ... \n", + "16 1.0 However, mutation of the AP-1 site markedly di... \n", + "17 1.0 A novel HIV-1 isolate containing alterations a... \n", + "18 1.0 These findings suggest that Zp responds direct... \n", + "19 1.0 Several distinct roles for hsp90 in modulating... \n", + "20 1.0 In addition to activation of phospholipase C g... \n", + "21 1.0 Also in the current study, binding activity to... \n", + "22 1.0 These alterations of transcription factors are... \n", + "23 1.0 Epstein-Barr virus nuclear antigen 2 and laten... \n", + "24 1.0 Here, we present the isolation and characteriz... \n", + "25 1.0 The signaling capabilities of the IL-10R for a... \n", + "26 1.0 To identify potential cellular homologues of c... \n", + "27 1.0 In addition, no CIITA protein is detectable in... \n", + "28 1.0 The expression of AP-1 depended on calcium mob... \n", + "29 1.0 Nuclear accumulation of NFAT4 opposed by the J... \n", + "30 1.0 This resistance to apoptosis is reversed by an... \n", + "31 1.0 During recent years, studies of insulin-gene r... \n", + "32 1.0 The NFAT protein migrated more slowly in a sod... \n", + "33 1.0 The effect of DM on expression of IL-2R alpha ... \n", + "34 1.0 We conclude that TNF-alpha bioavailability and... \n", + "35 1.0 The two isozymes show little amino acid identi... \n", + "36 1.0 Intriguingly, surface expression of LT-alpha1b... \n", + "37 1.0 Binding of the drug inhibits isomerase activit... \n", + "38 1.0 These genes may then play a role in altering t... \n", + "39 1.0 Copyright 1999 Academic Press. \n", + "40 1.0 Direct exposure to 10 nM 2,3,7,8-TCDD caused a... \n", + "41 1.0 However, activation of the T cell lines leadin... \n", + "42 1.0 The defensin sensitivities of Salmonella typhi... \n", + "43 1.0 Receptors for the Fc portion of immunoglobulin... \n", + "44 1.0 We have isolated a novel cDNA clone encoding i... \n", + "45 1.0 IL-10 inhibitory activity is exerted on T lymp... \n", + "46 1.0 Furthermore, CD40 ligation of a HLA-A2+, Melan... \n", + "47 1.0 We conclude that interactions between TAFII32 ... \n", + "48 1.0 These cDNA were 2343 bp long and their transcr... \n", + "49 1.0 In vitro studies using pure recombinant p21ras... \n", + "\n", + " y \n", + "0 positive \n", + "1 positive \n", + "2 positive \n", + "3 positive \n", + "4 positive \n", + "5 positive \n", + "6 positive \n", + "7 positive \n", + "8 positive \n", + "9 positive \n", + "10 positive \n", + "11 positive \n", + "12 positive \n", + "13 positive \n", + "14 positive \n", + "15 positive \n", + "16 positive \n", + "17 positive \n", + "18 positive \n", + "19 positive \n", + "20 positive \n", + "21 positive \n", + "22 positive \n", + "23 positive \n", + "24 positive \n", + "25 positive \n", + "26 positive \n", + "27 negative \n", + "28 positive \n", + "29 positive \n", + "30 positive \n", + "31 positive \n", + "32 positive \n", + "33 positive \n", + "34 positive \n", + "35 positive \n", + "36 positive \n", + "37 negative \n", + "38 positive \n", + "39 positive \n", + "40 positive \n", + "41 positive \n", + "42 positive \n", + "43 positive \n", + "44 positive \n", + "45 positive \n", + "46 positive \n", + "47 positive \n", + "48 positive \n", + "49 positive " + ], + "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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + "
documentsentence_embedding_small_bert_L2_128sentimentsentiment_confidencetexty
0Based on nucleotide sequence requirements and ...[-0.49277549982070923, 0.09530887007713318, -0...positive1.0Based on nucleotide sequence requirements and ...positive
1TINUR belongs to the NGFI-B/nur77 family of th...[-0.10481061786413193, 0.1171066015958786, -0....positive1.0TINUR belongs to the NGFI-B/nur77 family of th...positive
2In selenium-deprived Jurkat and ESb-L T lympho...[-1.0812174081802368, 0.5883667469024658, -0.4...positive1.0In selenium-deprived Jurkat and ESb-L T lympho...positive
3These findings demonstrate that IFNs inhibit I...[-0.9547467231750488, -0.15689292550086975, -0...positive1.0These findings demonstrate that IFNs inhibit I...positive
4These data reveal the presence of distinct com...[-0.4628618657588959, 0.06154884025454521, -0....positive1.0These data reveal the presence of distinct com...positive
5The translated protein showed weak DNA binding...[-0.3139030635356903, -0.15748938918113708, -0...positive1.0The translated protein showed weak DNA binding...positive
6All tumor cell lines from the B-cell lineage a...[0.20084746181964874, -0.4846010208129883, -0....positive1.0All tumor cell lines from the B-cell lineage a...positive
7GABP factors bind to a distal interleukin 2 (I...[-0.26659855246543884, 0.2846565246582031, -1....positive1.0GABP factors bind to a distal interleukin 2 (I...positive
8In addition, Tax also stimulates the transcrip...[-0.822009801864624, 0.6354378461837769, -0.34...positive1.0In addition, Tax also stimulates the transcrip...positive
9Mutation of the TCF-1 alpha binding site dimin...[-0.6489402651786804, 0.1254355013370514, -0.5...positive1.0Mutation of the TCF-1 alpha binding site dimin...positive
10They involve phosphorylation and proteolytic r...[-0.8970018029212952, -0.5171773433685303, -0....positive1.0They involve phosphorylation and proteolytic r...positive
11Activation of the transcription factor NF-kapp...[-0.5248922109603882, 0.24680814146995544, -0....positive1.0Activation of the transcription factor NF-kapp...positive
12Neutrophil accumulation and development of lun...[-1.0332255363464355, 0.5459337830543518, -1.1...positive1.0Neutrophil accumulation and development of lun...positive
13Mutations in these binding sites can interfere...[-0.11175256222486496, 0.06691665202379227, -0...positive1.0Mutations in these binding sites can interfere...positive
14To understand the molecular mechanisms of func...[-0.4407936632633209, 0.782042920589447, -0.50...positive1.0To understand the molecular mechanisms of func...positive
15Collectively, these results suggest that HOCl ...[-0.6647999882698059, 0.3089727759361267, -0.4...positive1.0Collectively, these results suggest that HOCl ...positive
16However, mutation of the AP-1 site markedly di...[-0.9864672422409058, 0.05116121098399162, -0....positive1.0However, mutation of the AP-1 site markedly di...positive
17A novel HIV-1 isolate containing alterations a...[-0.18733267486095428, 0.06821992248296738, -0...positive1.0A novel HIV-1 isolate containing alterations a...positive
18These findings suggest that Zp responds direct...[-0.7554842829704285, -0.054939232766628265, -...positive1.0These findings suggest that Zp responds direct...positive
19Several distinct roles for hsp90 in modulating...[-0.12544415891170502, 0.2649071216583252, -0....positive1.0Several distinct roles for hsp90 in modulating...positive
20In addition to activation of phospholipase C g...[-0.5602053999900818, -0.5014104843139648, -0....positive1.0In addition to activation of phospholipase C g...positive
21Also in the current study, binding activity to...[-0.9772286415100098, 0.048676762729883194, -0...positive1.0Also in the current study, binding activity to...positive
22These alterations of transcription factors are...[-0.3631213307380676, 0.2459881603717804, -0.8...positive1.0These alterations of transcription factors are...positive
23Epstein-Barr virus nuclear antigen 2 and laten...[-0.1847376972436905, -0.007672342471778393, -...positive1.0Epstein-Barr virus nuclear antigen 2 and laten...positive
24Here, we present the isolation and characteriz...[-0.14775823056697845, -0.014818106777966022, ...positive1.0Here, we present the isolation and characteriz...positive
25The signaling capabilities of the IL-10R for a...[-0.506297767162323, 0.44844114780426025, -0.5...positive1.0The signaling capabilities of the IL-10R for a...positive
26To identify potential cellular homologues of c...[0.001409502699971199, 0.13168536126613617, -0...positive1.0To identify potential cellular homologues of c...positive
27In addition, no CIITA protein is detectable in...[0.09807377308607101, -0.04232050105929375, -0...positive1.0In addition, no CIITA protein is detectable in...negative
28The expression of AP-1 depended on calcium mob...[-0.9711195826530457, -0.15560954809188843, -0...positive1.0The expression of AP-1 depended on calcium mob...positive
29Nuclear accumulation of NFAT4 opposed by the J...[-0.22911998629570007, 0.4173714518547058, -0....positive1.0Nuclear accumulation of NFAT4 opposed by the J...positive
30This resistance to apoptosis is reversed by an...[-0.3486934304237366, 0.22132794559001923, -0....positive1.0This resistance to apoptosis is reversed by an...positive
31During recent years, studies of insulin-gene r...[-0.7870786786079407, 0.4678671956062317, -0.9...positive1.0During recent years, studies of insulin-gene r...positive
32The NFAT protein migrated more slowly in a sod...[0.048784464597702026, -0.1957472562789917, -0...positive1.0The NFAT protein migrated more slowly in a sod...positive
33The effect of DM on expression of IL-2R alpha ...[-0.37844932079315186, 0.12598302960395813, -0...positive1.0The effect of DM on expression of IL-2R alpha ...positive
34We conclude that TNF-alpha bioavailability and...[-0.5289692878723145, 0.7431911826133728, -0.7...positive1.0We conclude that TNF-alpha bioavailability and...positive
35The two isozymes show little amino acid identi...[0.14430226385593414, -0.674239993095398, -0.7...positive1.0The two isozymes show little amino acid identi...positive
36Intriguingly, surface expression of LT-alpha1b...[-0.2223060429096222, -0.15909825265407562, -0...positive1.0Intriguingly, surface expression of LT-alpha1b...positive
37Binding of the drug inhibits isomerase activit...[-0.6680501699447632, 0.34882932901382446, -0....positive1.0Binding of the drug inhibits isomerase activit...negative
38These genes may then play a role in altering t...[-0.8830984830856323, 0.1207333579659462, -0.6...positive1.0These genes may then play a role in altering t...positive
39Copyright 1999 Academic Press.[-1.021697759628296, 0.9163565635681152, -0.25...positive1.0Copyright 1999 Academic Press.positive
40Direct exposure to 10 nM 2,3,7,8-TCDD caused a...[-0.8829392194747925, 0.09077997505664825, -0....positive1.0Direct exposure to 10 nM 2,3,7,8-TCDD caused a...positive
41However, activation of the T cell lines leadin...[-0.2961618900299072, -0.22415119409561157, -0...positive1.0However, activation of the T cell lines leadin...positive
42The defensin sensitivities of Salmonella typhi...[-0.4785139262676239, 0.172796368598938, -0.22...positive1.0The defensin sensitivities of Salmonella typhi...positive
43Receptors for the Fc portion of immunoglobulin...[-0.44332364201545715, -0.3984912037849426, -0...positive1.0Receptors for the Fc portion of immunoglobulin...positive
44We have isolated a novel cDNA clone encoding i...[0.11249734461307526, -0.1219027042388916, -0....positive1.0We have isolated a novel cDNA clone encoding i...positive
45IL-10 inhibitory activity is exerted on T lymp...[-0.07616603374481201, 0.030630899593234062, -...positive1.0IL-10 inhibitory activity is exerted on T lymp...positive
46Furthermore, CD40 ligation of a HLA-A2+, Melan...[-0.3785442113876343, 0.29912295937538147, -0....positive1.0Furthermore, CD40 ligation of a HLA-A2+, Melan...positive
47We conclude that interactions between TAFII32 ...[-0.4170002043247223, -0.09449539333581924, -0...positive1.0We conclude that interactions between TAFII32 ...positive
48These cDNA were 2343 bp long and their transcr...[-0.9243519306182861, 0.7070343494415283, -0.3...positive1.0These cDNA were 2343 bp long and their transcr...positive
49In vitro studies using pure recombinant p21ras...[-0.6335657238960266, 0.15302662551403046, -0....positive1.0In vitro studies using pure recombinant p21ras...positive
\n", + "
\n", + "
\n", + "\n", + "
\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "
\n", + "\n", + "\n", + "
\n", + " \n", + "\n", + "\n", + "\n", + " \n", + "
\n", + "
\n", + "
\n" + ] + }, + "metadata": {}, + "execution_count": 6 + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "qFoT-s1MjTSS" + }, + "source": [ + "# 7. Try training with different Embeddings" + ] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "nxWFzQOhjWC8", + "outputId": "38055466-53e0-462c-91da-be2baf02b48f" + }, + "source": [ + "# We can use nlu.print_components(action='embed_sentence') to see every possibler sentence embedding we could use. Lets use bert!\n", + "nlp.nlu.print_components(action='embed_sentence')" + ], + "execution_count": null, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "For language NLU provides the following Models : \n", + "nlu.load('am.embed_sentence.xlm_roberta') returns Spark NLP model_anno_obj sent_xlm_roberta_base_finetuned_amharic\n", + "For language NLU provides the following Models : \n", + "nlu.load('de.embed_sentence.bert.base_cased') returns Spark NLP model_anno_obj sent_bert_base_cased\n", + "For language NLU provides the following Models : \n", + "nlu.load('el.embed_sentence.bert.base_uncased') returns Spark NLP model_anno_obj sent_bert_base_uncased\n", + "For language NLU provides the following Models : \n", + "nlu.load('en.embed_sentence') returns Spark NLP model_anno_obj tfhub_use\n", + "nlu.load('en.embed_sentence.albert') returns Spark NLP model_anno_obj albert_base_uncased\n", + "nlu.load('en.embed_sentence.bert') returns Spark NLP model_anno_obj sent_bert_base_uncased\n", + "nlu.load('en.embed_sentence.bert.base_uncased_legal') returns Spark NLP model_anno_obj sent_bert_base_uncased_legal\n", + "nlu.load('en.embed_sentence.bert.finetuned') returns Spark NLP model_anno_obj sbert_setfit_finetuned_financial_text_classification\n", + "nlu.load('en.embed_sentence.bert.pubmed') returns Spark NLP model_anno_obj sent_bert_pubmed\n", + "nlu.load('en.embed_sentence.bert.pubmed_squad2') returns Spark NLP model_anno_obj sent_bert_pubmed_squad2\n", + "nlu.load('en.embed_sentence.bert.wiki_books') returns Spark NLP model_anno_obj sent_bert_wiki_books\n", + "nlu.load('en.embed_sentence.bert.wiki_books_mnli') returns Spark NLP model_anno_obj sent_bert_wiki_books_mnli\n", + "nlu.load('en.embed_sentence.bert.wiki_books_qnli') returns Spark NLP model_anno_obj sent_bert_wiki_books_qnli\n", + "nlu.load('en.embed_sentence.bert.wiki_books_qqp') returns Spark NLP model_anno_obj sent_bert_wiki_books_qqp\n", + "nlu.load('en.embed_sentence.bert.wiki_books_squad2') returns Spark NLP model_anno_obj sent_bert_wiki_books_squad2\n", + "nlu.load('en.embed_sentence.bert.wiki_books_sst2') returns Spark NLP model_anno_obj sent_bert_wiki_books_sst2\n", + "nlu.load('en.embed_sentence.bert_base_cased') returns Spark NLP model_anno_obj sent_bert_base_cased\n", + "nlu.load('en.embed_sentence.bert_base_uncased') returns Spark NLP model_anno_obj sent_bert_base_uncased\n", + "nlu.load('en.embed_sentence.bert_large_cased') returns Spark NLP model_anno_obj sent_bert_large_cased\n", + "nlu.load('en.embed_sentence.bert_large_uncased') returns Spark NLP model_anno_obj sent_bert_large_uncased\n", + "nlu.load('en.embed_sentence.bert_use_cmlm_en_base') returns Spark NLP model_anno_obj sent_bert_use_cmlm_en_base\n", + "nlu.load('en.embed_sentence.bert_use_cmlm_en_large') returns Spark NLP model_anno_obj sent_bert_use_cmlm_en_large\n", + "nlu.load('en.embed_sentence.biobert.clinical_base_cased') returns Spark NLP model_anno_obj sent_biobert_clinical_base_cased\n", + "nlu.load('en.embed_sentence.biobert.discharge_base_cased') returns Spark NLP model_anno_obj sent_biobert_discharge_base_cased\n", + "nlu.load('en.embed_sentence.biobert.pmc_base_cased') returns Spark NLP model_anno_obj sent_biobert_pmc_base_cased\n", + "nlu.load('en.embed_sentence.biobert.pubmed_base_cased') returns Spark NLP model_anno_obj sent_biobert_pubmed_base_cased\n", + "nlu.load('en.embed_sentence.biobert.pubmed_large_cased') returns Spark NLP model_anno_obj sent_biobert_pubmed_large_cased\n", + "nlu.load('en.embed_sentence.biobert.pubmed_pmc_base_cased') returns Spark NLP model_anno_obj sent_biobert_pubmed_pmc_base_cased\n", + "nlu.load('en.embed_sentence.covidbert.large_uncased') returns Spark NLP model_anno_obj sent_covidbert_large_uncased\n", + "nlu.load('en.embed_sentence.distil_roberta.distilled_base') returns Spark NLP model_anno_obj sent_distilroberta_base\n", + "nlu.load('en.embed_sentence.doc2vec') returns Spark NLP model_anno_obj doc2vec_gigaword_300\n", + "nlu.load('en.embed_sentence.doc2vec.gigaword_300') returns Spark NLP model_anno_obj doc2vec_gigaword_300\n", + "nlu.load('en.embed_sentence.doc2vec.gigaword_wiki_300') returns Spark NLP model_anno_obj doc2vec_gigaword_wiki_300\n", + "nlu.load('en.embed_sentence.electra') returns Spark NLP model_anno_obj sent_electra_small_uncased\n", + "nlu.load('en.embed_sentence.electra_base_uncased') returns Spark NLP model_anno_obj sent_electra_base_uncased\n", + "nlu.load('en.embed_sentence.electra_large_uncased') returns Spark NLP model_anno_obj sent_electra_large_uncased\n", + "nlu.load('en.embed_sentence.electra_small_uncased') returns Spark NLP model_anno_obj sent_electra_small_uncased\n", + "nlu.load('en.embed_sentence.roberta.base') returns Spark NLP model_anno_obj sent_roberta_base\n", + "nlu.load('en.embed_sentence.roberta.large') returns Spark NLP model_anno_obj sent_roberta_large\n", + "nlu.load('en.embed_sentence.small_bert_L10_128') returns Spark NLP model_anno_obj sent_small_bert_L10_128\n", + "nlu.load('en.embed_sentence.small_bert_L10_256') returns Spark NLP model_anno_obj sent_small_bert_L10_256\n", + "nlu.load('en.embed_sentence.small_bert_L10_512') returns Spark NLP model_anno_obj sent_small_bert_L10_512\n", + "nlu.load('en.embed_sentence.small_bert_L10_768') returns Spark NLP model_anno_obj sent_small_bert_L10_768\n", + "nlu.load('en.embed_sentence.small_bert_L12_128') returns Spark NLP model_anno_obj sent_small_bert_L12_128\n", + "nlu.load('en.embed_sentence.small_bert_L12_256') returns Spark NLP model_anno_obj sent_small_bert_L12_256\n", + "nlu.load('en.embed_sentence.small_bert_L12_512') returns Spark NLP model_anno_obj sent_small_bert_L12_512\n", + "nlu.load('en.embed_sentence.small_bert_L12_768') returns Spark NLP model_anno_obj sent_small_bert_L12_768\n", + "nlu.load('en.embed_sentence.small_bert_L2_128') returns Spark NLP model_anno_obj sent_small_bert_L2_128\n", + "nlu.load('en.embed_sentence.small_bert_L2_256') returns Spark NLP model_anno_obj sent_small_bert_L2_256\n", + "nlu.load('en.embed_sentence.small_bert_L2_512') returns Spark NLP model_anno_obj sent_small_bert_L2_512\n", + "nlu.load('en.embed_sentence.small_bert_L2_768') returns Spark NLP model_anno_obj sent_small_bert_L2_768\n", + "nlu.load('en.embed_sentence.small_bert_L4_128') returns Spark NLP model_anno_obj sent_small_bert_L4_128\n", + "nlu.load('en.embed_sentence.small_bert_L4_256') returns Spark NLP model_anno_obj sent_small_bert_L4_256\n", + "nlu.load('en.embed_sentence.small_bert_L4_512') returns Spark NLP model_anno_obj sent_small_bert_L4_512\n", + "nlu.load('en.embed_sentence.small_bert_L4_768') returns Spark NLP model_anno_obj sent_small_bert_L4_768\n", + "nlu.load('en.embed_sentence.small_bert_L6_128') returns Spark NLP model_anno_obj sent_small_bert_L6_128\n", + "nlu.load('en.embed_sentence.small_bert_L6_256') returns Spark NLP model_anno_obj sent_small_bert_L6_256\n", + "nlu.load('en.embed_sentence.small_bert_L6_512') returns Spark NLP model_anno_obj sent_small_bert_L6_512\n", + "nlu.load('en.embed_sentence.small_bert_L6_768') returns Spark NLP model_anno_obj sent_small_bert_L6_768\n", + "nlu.load('en.embed_sentence.small_bert_L8_128') returns Spark NLP model_anno_obj sent_small_bert_L8_128\n", + "nlu.load('en.embed_sentence.small_bert_L8_256') returns Spark NLP model_anno_obj sent_small_bert_L8_256\n", + "nlu.load('en.embed_sentence.small_bert_L8_512') returns Spark NLP model_anno_obj sent_small_bert_L8_512\n", + "nlu.load('en.embed_sentence.small_bert_L8_768') returns Spark NLP model_anno_obj sent_small_bert_L8_768\n", + "nlu.load('en.embed_sentence.tfhub_use') returns Spark NLP model_anno_obj tfhub_use\n", + "nlu.load('en.embed_sentence.tfhub_use.lg') returns Spark NLP model_anno_obj tfhub_use_lg\n", + "nlu.load('en.embed_sentence.use') returns Spark NLP model_anno_obj tfhub_use\n", + "nlu.load('en.embed_sentence.use.lg') returns Spark NLP model_anno_obj tfhub_use_lg\n", + "For language NLU provides the following Models : \n", + "nlu.load('es.embed_sentence.bert.base_cased') returns Spark NLP model_anno_obj sent_bert_base_cased\n", + "nlu.load('es.embed_sentence.bert.base_uncased') returns Spark NLP model_anno_obj sent_bert_base_uncased\n", + "For language NLU provides the following Models : \n", + "nlu.load('fi.embed_sentence.bert') returns Spark NLP model_anno_obj bert_base_finnish_uncased\n", + "nlu.load('fi.embed_sentence.bert.cased') returns Spark NLP model_anno_obj bert_base_finnish_cased\n", + "nlu.load('fi.embed_sentence.bert.uncased') returns Spark NLP model_anno_obj bert_base_finnish_uncased\n", + "For language NLU provides the following Models : \n", + "nlu.load('ha.embed_sentence.xlm_roberta') returns Spark NLP model_anno_obj sent_xlm_roberta_base_finetuned_hausa\n", + "For language NLU provides the following Models : \n", + "nlu.load('ig.embed_sentence.xlm_roberta') returns Spark NLP model_anno_obj sent_xlm_roberta_base_finetuned_igbo\n", + "For language NLU provides the following Models : \n", + "nlu.load('lg.embed_sentence.xlm_roberta') returns Spark NLP model_anno_obj sent_xlm_roberta_base_finetuned_luganda\n", + "For language NLU provides the following Models : \n", + "nlu.load('nl.embed_sentence.bert.base_cased') returns Spark NLP model_anno_obj sent_bert_base_cased\n", + "For language NLU provides the following Models : \n", + "nlu.load('pcm.embed_sentence.xlm_roberta') returns Spark NLP model_anno_obj sent_xlm_roberta_base_finetuned_naija\n", + "For language NLU provides the following Models : \n", + "nlu.load('pt.embed_sentence.bert.base_legal') returns Spark NLP model_anno_obj sbert_legal_bertimbau_base_tsdae_sts\n", + "nlu.load('pt.embed_sentence.bert.cased_large_legal') returns Spark NLP model_anno_obj sbert_bert_large_portuguese_cased_legal_mlm_sts_v0.1\n", + "nlu.load('pt.embed_sentence.bert.large_legal') returns Spark NLP model_anno_obj sbert_legal_bertimbau_large_gpl_sts\n", + "nlu.load('pt.embed_sentence.bert.legal.cased_large_mlm_sts_v0.10.by_stjiris') returns Spark NLP model_anno_obj sbert_bert_large_portuguese_cased_legal_mlm_sts_v0.10\n", + "nlu.load('pt.embed_sentence.bert.legal.cased_large_mlm_sts_v0.2.by_stjiris') returns Spark NLP model_anno_obj sbert_bert_large_portuguese_cased_legal_mlm_sts_v0.2\n", + "nlu.load('pt.embed_sentence.bert.legal.cased_large_mlm_sts_v0.3.by_stjiris') returns Spark NLP model_anno_obj sbert_bert_large_portuguese_cased_legal_mlm_sts_v0.3\n", + "nlu.load('pt.embed_sentence.bert.legal.cased_large_mlm_sts_v0.4.by_stjiris') returns Spark NLP model_anno_obj sbert_bert_large_portuguese_cased_legal_mlm_sts_v0.4\n", + "nlu.load('pt.embed_sentence.bert.legal.cased_large_mlm_sts_v0.5.by_stjiris') returns Spark NLP model_anno_obj sbert_bert_large_portuguese_cased_legal_mlm_sts_v0.5\n", + "nlu.load('pt.embed_sentence.bert.legal.cased_large_mlm_sts_v0.7.by_stjiris') returns Spark NLP model_anno_obj sbert_bert_large_portuguese_cased_legal_mlm_sts_v0.7\n", + "nlu.load('pt.embed_sentence.bert.legal.cased_large_mlm_sts_v0.8.by_stjiris') returns Spark NLP model_anno_obj sbert_bert_large_portuguese_cased_legal_mlm_sts_v0.8\n", + "nlu.load('pt.embed_sentence.bert.legal.cased_large_mlm_sts_v0.9.by_stjiris') returns Spark NLP model_anno_obj sbert_bert_large_portuguese_cased_legal_mlm_sts_v0.9\n", + "nlu.load('pt.embed_sentence.bert.legal.cased_large_mlm_sts_v1.0.by_stjiris') returns Spark NLP model_anno_obj sbert_bert_large_portuguese_cased_legal_mlm_sts_v1.0\n", + "nlu.load('pt.embed_sentence.bert.legal.cased_large_mlm_v0.11_gpl_nli_sts_v0.by_stjiris') returns Spark NLP model_anno_obj sbert_bert_large_portuguese_cased_legal_mlm_v0.11_gpl_nli_sts_v0\n", + "nlu.load('pt.embed_sentence.bert.legal.cased_large_mlm_v0.11_gpl_nli_sts_v1.by_stjiris') returns Spark NLP model_anno_obj sbert_bert_large_portuguese_cased_legal_mlm_v0.11_gpl_nli_sts_v1\n", + "nlu.load('pt.embed_sentence.bert.legal.cased_large_mlm_v0.11_nli_sts_v0.by_stjiris') returns Spark NLP model_anno_obj sbert_bert_large_portuguese_cased_legal_mlm_v0.11_nli_sts_v0\n", + "nlu.load('pt.embed_sentence.bert.legal.cased_large_mlm_v0.11_nli_sts_v1.by_stjiris') returns Spark NLP model_anno_obj sbert_bert_large_portuguese_cased_legal_mlm_v0.11_nli_sts_v1\n", + "nlu.load('pt.embed_sentence.bert.legal.cased_large_mlm_v0.11_sts_v0.by_stjiris') returns Spark NLP model_anno_obj sbert_bert_large_portuguese_cased_legal_mlm_v0.11_sts_v0\n", + "nlu.load('pt.embed_sentence.bert.legal.cased_large_mlm_v0.11_sts_v1.by_stjiris') returns Spark NLP model_anno_obj sbert_bert_large_portuguese_cased_legal_mlm_v0.11_sts_v1\n", + "nlu.load('pt.embed_sentence.bert.v2_base_legal') returns Spark NLP model_anno_obj sbert_legal_bertimbau_sts_base_ma_v2\n", + "nlu.load('pt.embed_sentence.bert.v2_large_legal') returns Spark NLP model_anno_obj sbert_legal_bertimbau_large_tsdae_sts_v2\n", + "nlu.load('pt.embed_sentence.bertimbau.legal.assin.base.by_rufimelo') returns Spark NLP model_anno_obj sbert_legal_bertimbau_sts_base_ma\n", + "nlu.load('pt.embed_sentence.bertimbau.legal.assin2.base.by_rufimelo') returns Spark NLP model_anno_obj sbert_legal_bertimbau_sts_base\n", + "nlu.load('pt.embed_sentence.bertimbau.legal.large_sts_by_rufimelo') returns Spark NLP model_anno_obj sbert_legal_bertimbau_sts_large\n", + "nlu.load('pt.embed_sentence.bertimbau.legal.large_sts_ma.by_rufimelo') returns Spark NLP model_anno_obj sbert_legal_bertimbau_sts_large_ma\n", + "nlu.load('pt.embed_sentence.bertimbau.legal.large_sts_ma_v3.by_rufimelo') returns Spark NLP model_anno_obj sbert_legal_bertimbau_sts_large_ma_v3\n", + "nlu.load('pt.embed_sentence.bertimbau.legal.large_tsdae_sts.by_rufimelo') returns Spark NLP model_anno_obj sbert_legal_bertimbau_large_tsdae_sts\n", + "nlu.load('pt.embed_sentence.bertimbau.legal.large_tsdae_sts_v4.by_rufimelo') returns Spark NLP model_anno_obj sbert_legal_bertimbau_large_tsdae_sts_v4\n", + "nlu.load('pt.embed_sentence.bertimbau.legal.large_tsdae_v4_gpl_sts.by_rufimelo') returns Spark NLP model_anno_obj sbert_legal_bertimbau_large_tsdae_v4_gpl_sts\n", + "nlu.load('pt.embed_sentence.bertimbau.legal.v2_large_sts_v2.by_rufimelo') returns Spark NLP model_anno_obj sbert_legal_bertimbau_sts_large_v2\n", + "nlu.load('pt.embed_sentence.bertimbau.legal.v2_large_v2_sts.by_rufimelo') returns Spark NLP model_anno_obj sbert_legal_bertimbau_large_v2_sts\n", + "For language NLU provides the following Models : \n", + "nlu.load('rw.embed_sentence.xlm_roberta') returns Spark NLP model_anno_obj sent_xlm_roberta_base_finetuned_kinyarwanda\n", + "For language NLU provides the following Models : \n", + "nlu.load('sv.embed_sentence.bert.base_cased') returns Spark NLP model_anno_obj sent_bert_base_cased\n", + "For language NLU provides the following Models : \n", + "nlu.load('sw.embed_sentence.xlm_roberta') returns Spark NLP model_anno_obj sent_xlm_roberta_base_finetuned_swahili\n", + "For language NLU provides the following Models : \n", + "nlu.load('wo.embed_sentence.xlm_roberta') returns Spark NLP model_anno_obj sent_xlm_roberta_base_finetuned_wolof\n", + "For language NLU provides the following Models : \n", + "nlu.load('xx.embed_sentence') returns Spark NLP model_anno_obj sent_bert_multi_cased\n", + "nlu.load('xx.embed_sentence.bert') returns Spark NLP model_anno_obj sent_bert_multi_cased\n", + "nlu.load('xx.embed_sentence.bert.cased') returns Spark NLP model_anno_obj sent_bert_multi_cased\n", + "nlu.load('xx.embed_sentence.bert.muril') returns Spark NLP model_anno_obj sent_bert_muril\n", + "nlu.load('xx.embed_sentence.bert_use_cmlm_multi_base') returns Spark NLP model_anno_obj sent_bert_use_cmlm_multi_base\n", + "nlu.load('xx.embed_sentence.bert_use_cmlm_multi_base_br') returns Spark NLP model_anno_obj sent_bert_use_cmlm_multi_base_br\n", + "nlu.load('xx.embed_sentence.labse') returns Spark NLP model_anno_obj labse\n", + "nlu.load('xx.embed_sentence.xlm_roberta.base') returns Spark NLP model_anno_obj sent_xlm_roberta_base\n", + "For language NLU provides the following Models : \n", + "nlu.load('yo.embed_sentence.xlm_roberta') returns Spark NLP model_anno_obj sent_xlm_roberta_base_finetuned_yoruba\n", + "For language NLU provides the following Models : \n", + "nlu.load('zh.embed_sentence.bert') returns Spark NLP model_anno_obj sbert_chinese_qmc_finance_v1\n", + "nlu.load('zh.embed_sentence.bert.distilled') returns Spark NLP model_anno_obj sbert_chinese_qmc_finance_v1_distill\n" + ] + } + ] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "IKK_Ii_gjJfF", + "outputId": "6c32478b-c999-499f-ca4a-38a992c4e950" + }, + "source": [ + "trainable_pipe = nlp.load('en.embed_sentence.small_bert_L12_128 train.sentiment')\n", + "# We need to train longer and user smaller LR for NON-USE based sentence embeddings usually\n", + "# We could tune the hyperparameters further with hyperparameter tuning methods like gridsearch\n", + "# Also longer training gives more accuracy\n", + "trainable_pipe['trainable_sentiment_dl'].setMaxEpochs(120)\n", + "trainable_pipe['trainable_sentiment_dl'].setLr(0.0005)\n", + "fitted_pipe = trainable_pipe.fit(train_df[:1000])\n", + "\n", + "# predict with the trainable pipeline on dataset and get predictions\n", + "preds = fitted_pipe.predict(train_df[:1000],output_level='document')\n", + "\n", + "#sentence detector that is part of the pipe generates sone NaNs. lets drop them first\n", + "preds.dropna(inplace=True)\n", + "print(classification_report(preds['y'], preds['sentiment']))\n", + "\n", + "#preds" + ], + "execution_count": null, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Warning::Spark Session already created, some configs may not take.\n", + "Warning::Spark Session already created, some configs may not take.\n", + "sent_small_bert_L12_128 download started this may take some time.\n", + "Approximate size to download 23.4 MB\n", + "[OK!]\n", + " precision recall f1-score support\n", + "\n", + " negative 0.00 0.00 0.00 132\n", + " positive 0.87 1.00 0.93 868\n", + "\n", + " accuracy 0.87 1000\n", + " macro avg 0.43 0.50 0.46 1000\n", + "weighted avg 0.75 0.87 0.81 1000\n", + "\n" + ] + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "_1jxw3GnVGlI" + }, + "source": [ + "# 7.1 evaluate on Test Data" + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "Fxx4yNkNVGFl", + "colab": { + "base_uri": "https://localhost:8080/" + }, + "outputId": "d01316a0-0e7c-4155-e8b0-8b28715aa921" + }, + "source": [ + "preds = fitted_pipe.predict(test_df,output_level='document')\n", + "\n", + "#sentence detector that is part of the pipe generates sone NaNs. lets drop them first\n", + "preds.dropna(inplace=True)\n", + "print(classification_report(preds['y'], preds['sentiment']))" + ], + "execution_count": null, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + " precision recall f1-score support\n", + "\n", + " negative 0.00 0.00 0.00 348\n", + " positive 0.85 1.00 0.92 2051\n", + "\n", + " accuracy 0.85 2399\n", + " macro avg 0.43 0.50 0.46 2399\n", + "weighted avg 0.73 0.85 0.79 2399\n", + "\n" + ] + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "2BB-NwZUoHSe" + }, + "source": [ + "# 8. Lets save the model" + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "eLex095goHwm" + }, + "source": [ + "stored_model_path = './models/classifier_dl_trained'\n", + "fitted_pipe.save(stored_model_path)" + ], + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "e_b2DPd4rCiU" + }, + "source": [ + "# 9. Lets load the model from HDD.\n", + "This makes Offlien NLU usage possible! \n", + "You need to call nlu.load(path=path_to_the_pipe) to load a model/pipeline from disk." + ] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 133 + }, + "id": "SO4uz45MoRgp", + "outputId": "e4464877-4bd1-469f-cb1b-651aea1e9bec" + }, + "source": [ + "hdd_pipe = nlp.load(path=stored_model_path)\n", + "\n", + "preds = hdd_pipe.predict('The virus had a direct impact on the nervous system')\n", + "preds" + ], + "execution_count": null, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Warning::Spark Session already created, some configs may not take.\n", + "Warning::Spark Session already created, some configs may not take.\n", + "Warning::Spark Session already created, some configs may not take.\n" + ] + }, + { + "output_type": "execute_result", + "data": { + "text/plain": [ + " document \\\n", + "0 The virus had a direct impact on the nervous s... \n", + "\n", + " sentence_embedding_from_disk sentiment \\\n", + "0 [0.6362331509590149, 0.006696224212646484, 0.2... positive \n", + "\n", + " sentiment_confidence \n", + "0 4.0 " + ], + "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", + "
documentsentence_embedding_from_disksentimentsentiment_confidence
0The virus had a direct impact on the nervous s...[0.6362331509590149, 0.006696224212646484, 0.2...positive4.0
\n", + "
\n", + "
\n", + "\n", + "
\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "
\n", + "\n", + "
\n", + "
\n" + ] + }, + "metadata": {}, + "execution_count": 37 + } + ] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "e0CVlkk9v6Qi", + "outputId": "1151c44d-6bc8-4c03-95b9-f495cd366a94" + }, + "source": [ + "hdd_pipe.print_info()" + ], + "execution_count": null, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "The following parameters are configurable for this NLU pipeline (You can copy paste the examples) :\n", + ">>> component_list['document_assembler'] has settable params:\n", + "component_list['document_assembler'].setCleanupMode('shrink') | Info: possible values: disabled, inplace, inplace_full, shrink, shrink_full, each, each_full, delete_full | Currently set to : shrink\n", + ">>> component_list['bert_sentence_embeddings@sent_small_bert_L12_128'] has settable params:\n", + "component_list['bert_sentence_embeddings@sent_small_bert_L12_128'].setBatchSize(8) | Info: Size of every batch | Currently set to : 8\n", + "component_list['bert_sentence_embeddings@sent_small_bert_L12_128'].setCaseSensitive(False) | Info: whether to ignore case in tokens for embeddings matching | Currently set to : False\n", + "component_list['bert_sentence_embeddings@sent_small_bert_L12_128'].setDimension(128) | Info: Number of embedding dimensions | Currently set to : 128\n", + "component_list['bert_sentence_embeddings@sent_small_bert_L12_128'].setMaxSentenceLength(128) | Info: Max sentence length to process | Currently set to : 128\n", + "component_list['bert_sentence_embeddings@sent_small_bert_L12_128'].setEngine('tensorflow') | Info: Deep Learning engine used for this model | Currently set to : tensorflow\n", + "component_list['bert_sentence_embeddings@sent_small_bert_L12_128'].setIsLong(False) | Info: Use Long type instead of Int type for inputs buffer - Some Bert models require Long instead of Int. | Currently set to : False\n", + "component_list['bert_sentence_embeddings@sent_small_bert_L12_128'].setStorageRef('sent_small_bert_L12_128') | Info: unique reference name for identification | Currently set to : sent_small_bert_L12_128\n", + ">>> component_list['sentiment_dl@sent_small_bert_L12_128'] has settable params:\n", + "component_list['sentiment_dl@sent_small_bert_L12_128'].setThreshold(0.6) | Info: The minimum threshold for the final result otheriwse it will be neutral | Currently set to : 0.6\n", + "component_list['sentiment_dl@sent_small_bert_L12_128'].setThresholdLabel('neutral') | Info: In case the score is less than threshold, what should be the label. Default is neutral. | Currently set to : neutral\n", + "component_list['sentiment_dl@sent_small_bert_L12_128'].setEngine('tensorflow') | Info: Deep Learning engine used for this model | Currently set to : tensorflow\n", + "component_list['sentiment_dl@sent_small_bert_L12_128'].setClasses(['positive', 'negative']) | Info: get the tags used to trained this SentimentDLModel | Currently set to : ['positive', 'negative']\n", + "component_list['sentiment_dl@sent_small_bert_L12_128'].setStorageRef('sent_small_bert_L12_128') | Info: unique reference name for identification | Currently set to : sent_small_bert_L12_128\n" + ] + } + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "CtOuwWgAvqXw" + }, + "source": [], + "execution_count": null, + "outputs": [] + } + ] +} \ No newline at end of file diff --git a/examples/colab/Training/binary_text_classification/NLU_training_sarcasam_classifier_demo_news_headlines.ipynb b/examples/colab/Training/binary_text_classification/NLU_training_sarcasam_classifier_demo_news_headlines.ipynb index 869452af..87316f62 100644 --- a/examples/colab/Training/binary_text_classification/NLU_training_sarcasam_classifier_demo_news_headlines.ipynb +++ b/examples/colab/Training/binary_text_classification/NLU_training_sarcasam_classifier_demo_news_headlines.ipynb @@ -1 +1,3130 @@ -{"nbformat":4,"nbformat_minor":0,"metadata":{"colab":{"name":"NLU_training_sarcasam_classifier_demo_news_headlines.ipynb","provenance":[],"collapsed_sections":["zkufh760uvF3"]},"kernelspec":{"name":"python3","display_name":"Python 3"}},"cells":[{"cell_type":"markdown","metadata":{"id":"zkufh760uvF3"},"source":["![JohnSnowLabs](https://nlp.johnsnowlabs.com/assets/images/logo.png)\n","\n","[![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/JohnSnowLabs/nlu/blob/master/examples/colab/Training/binary_text_classification/NLU_training_sarcasam_classifier_demo_news_headlines.ipynb)\n","\n","\n","# Training a Sentiment Analysis Classifier with NLU \n","## 2 Class News Headlines Sarcasam Training\n","With the [SentimentDL model](https://nlp.johnsnowlabs.com/docs/en/annotators#sentimentdl-multi-class-sentiment-analysis-annotator) from Spark NLP you can achieve State Of the Art results on any multi class text classification problem \n","\n","This notebook showcases the following features : \n","\n","- How to train the deep learning classifier\n","- How to store a pipeline to disk\n","- How to load the pipeline from disk (Enables NLU offline mode)\n","\n","You can achieve these results or even better on this dataset with training data:\n","\n","\n","
\n","\n","![img.png](data:image/png;base64,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)\n","\n","You can achieve these results or even better on this dataset with test data:\n","\n","\n","
\n","\n","![Screenshot 2021-02-25 150812.png](data:image/png;base64,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)\n","\n","\n","\n"]},{"cell_type":"markdown","metadata":{"id":"dur2drhW5Rvi"},"source":["# 1. Install Java 8 and NLU"]},{"cell_type":"code","metadata":{"id":"hFGnBCHavltY","colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"status":"ok","timestamp":1620187463238,"user_tz":-120,"elapsed":101354,"user":{"displayName":"Christian Kasim Loan","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GjqAD-ircKP-s5Eh6JSdkDggDczfqQbJGU_IRb4Hw=s64","userId":"14469489166467359317"}},"outputId":"1ab394d0-dce6-49cd-939b-c96e47fde49b"},"source":["!wget https://setup.johnsnowlabs.com/nlu/colab.sh -O - | bash\n","import nlu"],"execution_count":null,"outputs":[{"output_type":"stream","text":["--2021-05-05 04:02:42-- https://raw.githubusercontent.com/JohnSnowLabs/nlu/master/scripts/colab_setup.sh\n","Resolving raw.githubusercontent.com (raw.githubusercontent.com)... 185.199.110.133, 185.199.109.133, 185.199.111.133, ...\n","Connecting to raw.githubusercontent.com (raw.githubusercontent.com)|185.199.110.133|:443... connected.\n","HTTP request sent, awaiting response... 200 OK\n","Length: 1671 (1.6K) [text/plain]\n","Saving to: ‘STDOUT’\n","\n","\r- 0%[ ] 0 --.-KB/s \r- 100%[===================>] 1.63K --.-KB/s in 0s \n","\n","2021-05-05 04:02:42 (33.7 MB/s) - written to stdout [1671/1671]\n","\n","Installing NLU 3.0.0 with PySpark 3.0.2 and Spark NLP 3.0.1 for Google Colab ...\n","\u001b[K |████████████████████████████████| 204.8MB 74kB/s \n","\u001b[K |████████████████████████████████| 153kB 68.2MB/s \n","\u001b[K |████████████████████████████████| 204kB 20.5MB/s \n","\u001b[K |████████████████████████████████| 204kB 79.6MB/s \n","\u001b[?25h Building wheel for pyspark (setup.py) ... \u001b[?25l\u001b[?25hdone\n"],"name":"stdout"}]},{"cell_type":"markdown","metadata":{"id":"f4KkTfnR5Ugg"},"source":["# 2. Download News Headlines Sarcsam dataset \n","https://www.kaggle.com/rmisra/news-headlines-dataset-for-sarcasm-detection\n","#Context\n","Past studies in Sarcasm Detection mostly make use of Twitter datasets collected using hashtag based supervision but such datasets are noisy in terms of labels and language. Furthermore, many tweets are replies to other tweets and detecting sarcasm in these requires the availability of contextual tweets.\n","\n","To overcome the limitations related to noise in Twitter datasets, this News Headlines dataset for Sarcasm Detection is collected from two news website. TheOnion aims at producing sarcastic versions of current events and we collected all the headlines from News in Brief and News in Photos categories (which are sarcastic). We collect real (and non-sarcastic) news headlines from HuffPost.\n","\n","This new dataset has following advantages over the existing Twitter datasets:\n","\n","Since news headlines are written by professionals in a formal manner, there are no spelling mistakes and informal usage. This reduces the sparsity and also increases the chance of finding pre-trained embeddings.\n","\n","Furthermore, since the sole purpose of TheOnion is to publish sarcastic news, we get high-quality labels with much less noise as compared to Twitter datasets.\n","\n","Unlike tweets which are replies to other tweets, the news headlines we obtained are self-contained. This would help us in teasing apart the real sarcastic elements.\n"]},{"cell_type":"code","metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"OrVb5ZMvvrQD","executionInfo":{"status":"ok","timestamp":1620187463651,"user_tz":-120,"elapsed":101758,"user":{"displayName":"Christian Kasim Loan","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GjqAD-ircKP-s5Eh6JSdkDggDczfqQbJGU_IRb4Hw=s64","userId":"14469489166467359317"}},"outputId":"4b81d821-074f-4409-ef50-7a401f6706be"},"source":["! wget http://ckl-it.de/wp-content/uploads/2021/02/Sarcasm_Headlines_Dataset_v2.csv\n"],"execution_count":null,"outputs":[{"output_type":"stream","text":["--2021-05-05 04:04:22-- http://ckl-it.de/wp-content/uploads/2021/02/Sarcasm_Headlines_Dataset_v2.csv\n","Resolving ckl-it.de (ckl-it.de)... 217.160.0.108, 2001:8d8:100f:f000::209\n","Connecting to ckl-it.de (ckl-it.de)|217.160.0.108|:80... connected.\n","HTTP request sent, awaiting response... 200 OK\n","Length: 2381880 (2.3M) [text/csv]\n","Saving to: ‘Sarcasm_Headlines_Dataset_v2.csv’\n","\n","Sarcasm_Headlines_D 100%[===================>] 2.27M --.-KB/s in 0.1s \n","\n","2021-05-05 04:04:23 (15.7 MB/s) - ‘Sarcasm_Headlines_Dataset_v2.csv’ saved [2381880/2381880]\n","\n"],"name":"stdout"}]},{"cell_type":"code","metadata":{"colab":{"base_uri":"https://localhost:8080/","height":419},"id":"y4xSRWIhwT28","executionInfo":{"status":"ok","timestamp":1620187464360,"user_tz":-120,"elapsed":102461,"user":{"displayName":"Christian Kasim Loan","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GjqAD-ircKP-s5Eh6JSdkDggDczfqQbJGU_IRb4Hw=s64","userId":"14469489166467359317"}},"outputId":"f3e8cdcc-271a-4fa6-e8c4-4aed44da42dc"},"source":["import pandas as pd\n","test_path = '/content/Sarcasm_Headlines_Dataset_v2.csv'\n","train_df = pd.read_csv(test_path,sep=\",\")\n","cols = [\"y\",\"text\"]\n","train_df = train_df[cols]\n","from sklearn.model_selection import train_test_split\n","\n","train_df, test_df = train_test_split(train_df, test_size=0.2)\n","train_df\n","\n"],"execution_count":null,"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"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n","
ytext
1463positivered cross installs blood drop-off bins for don...
9543positivepresident-elect edwards seen entering chinatow...
2930positivecrowd at trump rally realizes they've been cha...
644positivekerry captures bin laden one week too late
2390negative'new hampshire' episode 4: not just for old, w...
.........
9034negativedeputy interior secretary met with lobbyist fo...
6330negativeparents of kidnapped girls make desperate plea
7127negativeimage vs. substance in your self-made journey
7289positive'secretary clinton is a different person than ...
9077positivecnn producer on hunt for saddest-looking fuck ...
\n","

8000 rows × 2 columns

\n","
"],"text/plain":[" y text\n","1463 positive red cross installs blood drop-off bins for don...\n","9543 positive president-elect edwards seen entering chinatow...\n","2930 positive crowd at trump rally realizes they've been cha...\n","644 positive kerry captures bin laden one week too late\n","2390 negative 'new hampshire' episode 4: not just for old, w...\n","... ... ...\n","9034 negative deputy interior secretary met with lobbyist fo...\n","6330 negative parents of kidnapped girls make desperate plea\n","7127 negative image vs. substance in your self-made journey\n","7289 positive 'secretary clinton is a different person than ...\n","9077 positive cnn producer on hunt for saddest-looking fuck ...\n","\n","[8000 rows x 2 columns]"]},"metadata":{"tags":[]},"execution_count":3}]},{"cell_type":"markdown","metadata":{"id":"0296Om2C5anY"},"source":["# 3. Train Deep Learning Classifier using nlu.load('train.sentiment')\n","\n","You dataset label column should be named 'y' and the feature column with text data should be named 'text'"]},{"cell_type":"code","metadata":{"colab":{"base_uri":"https://localhost:8080/","height":1000},"id":"3ZIPkRkWftBG","executionInfo":{"status":"ok","timestamp":1620188373251,"user_tz":-120,"elapsed":10920,"user":{"displayName":"Christian Kasim Loan","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GjqAD-ircKP-s5Eh6JSdkDggDczfqQbJGU_IRb4Hw=s64","userId":"14469489166467359317"}},"outputId":"0f669bc1-ee54-423d-81ff-d52fd9b53808"},"source":["import nlu \n","from sklearn.metrics import classification_report\n","\n","# load a trainable pipeline by specifying the train. prefix and fit it on a datset with label and text columns\n","# by default the Universal Sentence Encoder (USE) Sentence embeddings are used for generation\n","trainable_pipe = nlu.load('train.sentiment')\n","fitted_pipe = trainable_pipe.fit(train_df.iloc[:50])\n","\n","# predict with the trainable pipeline on dataset and get predictions\n","preds = fitted_pipe.predict(train_df.iloc[:50],output_level='document')\n","#sentence detector that is part of the pipe generates sone NaNs. lets drop them first\n","preds.dropna(inplace=True)\n","print(classification_report(preds['y'], preds['sentiment']))\n","\n","preds"],"execution_count":null,"outputs":[{"output_type":"stream","text":["tfhub_use download started this may take some time.\n","Approximate size to download 923.7 MB\n","[OK!]\n","sentence_detector_dl download started this may take some time.\n","Approximate size to download 354.6 KB\n","[OK!]\n"," precision recall f1-score support\n","\n"," negative 0.00 0.00 0.00 24\n"," neutral 0.00 0.00 0.00 0\n"," positive 1.00 0.23 0.38 26\n","\n"," accuracy 0.12 50\n"," macro avg 0.33 0.08 0.12 50\n","weighted avg 0.52 0.12 0.20 50\n","\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"," \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"," \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"," \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"," \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"," \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"," \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"," \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"," \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"," \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"," \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"," \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","
trained_sentimentdocumentsentence_embedding_usetexttrained_sentiment_confidencesentenceyorigin_index
0neutralred cross installs blood drop-off bins for don...[-0.07407097518444061, 0.020259270444512367, -...red cross installs blood drop-off bins for don...0.586574[red cross installs blood drop-off bins for do...positive1463
1neutralpresident-elect edwards seen entering chinatow...[0.07900547981262207, 0.06132232025265694, 0.0...president-elect edwards seen entering chinatow...0.539660[president-elect edwards seen entering chinato...positive9543
2positivecrowd at trump rally realizes they've been cha...[0.00032250594813376665, -0.022321783006191254...crowd at trump rally realizes they've been cha...0.624888[crowd at trump rally realizes they've been ch...positive2930
3neutralkerry captures bin laden one week too late[-0.004850792698562145, 0.017207739874720573, ...kerry captures bin laden one week too late0.594691[kerry captures bin laden one week too late]positive644
4neutral'new hampshire' episode 4: not just for old, w...[-0.04294964671134949, -0.07175017148256302, -...'new hampshire' episode 4: not just for old, w...0.546094['new hampshire' episode 4: not just for old, ...negative2390
5neutral12 indie spots in hong kong[-0.036156971007585526, -0.014244569465517998,...12 indie spots in hong kong0.509936[12 indie spots in hong kong]negative5450
6neutralformer refugee fights for her dream to abolish...[-0.0035593388602137566, 0.008986725471913815,...former refugee fights for her dream to abolish...0.578656[former refugee fights for her dream to abolis...negative7739
7neutralwatch out, sephora. h&m beauty is coming for you.[-0.02806154452264309, -0.04734545946121216, 0...watch out, sephora. h&m beauty is coming for you.0.503327[watch out, sephora., h&m beauty is coming for...negative4370
8neutralcomputer scientists say ai's underdeveloped et...[-0.007209080271422863, -0.01665995828807354, ...computer scientists say ai's underdeveloped et...0.564115[computer scientists say ai's underdeveloped e...positive9418
9neutralpast armageddon and on to zippori, one of isra...[-0.0013639864046126604, -0.05516374856233597,...past armageddon and on to zippori, one of isra...0.528413[past armageddon and on to zippori, one of isr...negative4357
10neutralobama caves to girl scout lobby, wears tiara i...[-0.019499918445944786, -0.01798412762582302, ...obama caves to girl scout lobby, wears tiara i...0.580572[obama caves to girl scout lobby, wears tiara ...negative2418
11neutralisrael passes law cementing itself as exclusiv...[0.05780275911092758, -0.04909253492951393, -0...israel passes law cementing itself as exclusiv...0.587168[israel passes law cementing itself as exclusi...positive7882
12positivelocal man's fear of snakes increases with each...[0.056381646543741226, -0.057368289679288864, ...local man's fear of snakes increases with each...0.611751[local man's fear of snakes increases with eac...positive6117
13neutralmedia ethics: whose standards?[0.0406915545463562, 0.03338606283068657, -0.0...media ethics: whose standards?0.522510[media ethics: whose standards?]negative7992
14neutralrare species of frog may hold cure to...ah, ne...[0.079066202044487, 0.021108830347657204, -0.0...rare species of frog may hold cure to...ah, ne...0.583740[rare species of frog may hold cure to., ..ah,...positive6445
15neutralpolice officers waving everyone over to take a...[-0.011674991808831692, -0.07644280791282654, ...police officers waving everyone over to take a...0.551790[police officers waving everyone over to take ...positive8222
16neutralnate berkus and jeremiah brent are married![0.03597276285290718, 0.05780172348022461, -0....nate berkus and jeremiah brent are married!0.521706[nate berkus and jeremiah brent are married!]negative3847
17neutralsummer camp hierarchy thrown into chaos after ...[-0.07574271410703659, 0.037431202828884125, 0...summer camp hierarchy thrown into chaos after ...0.547273[summer camp hierarchy thrown into chaos after...positive253
18neutraliraqi officer under saddam masterminded the ri...[0.02313143201172352, -0.05338258296251297, -0...iraqi officer under saddam masterminded the ri...0.570464[iraqi officer under saddam masterminded the r...negative2504
19neutralcop crashed cruiser into ditch after this owl ...[-0.0011760082561522722, -0.07277680933475494,...cop crashed cruiser into ditch after this owl ...0.539377[cop crashed cruiser into ditch after this owl...negative6992
20positivebush elected president of iraq[-0.02786075882613659, 0.044202402234077454, -...bush elected president of iraq0.607670[bush elected president of iraq]positive5882
21neutralsenate does equifax a favor as a former execut...[0.048467256128787994, -0.020521214231848717, ...senate does equifax a favor as a former execut...0.546467[senate does equifax a favor as a former execu...negative9721
22neutraltexan feels emotionally empty after chili cook...[-0.03747135400772095, 0.021678565070033073, -...texan feels emotionally empty after chili cook...0.593196[texan feels emotionally empty after chili coo...positive8362
23neutrallgbtq activists organizing massive dance prote...[0.03160602226853371, -0.031953465193510056, -...lgbtq activists organizing massive dance prote...0.582981[lgbtq activists organizing massive dance prot...negative1073
24neutralsamsung slashes profit forecast after pulling ...[0.06239231675863266, -0.03570358455181122, -0...samsung slashes profit forecast after pulling ...0.528766[samsung slashes profit forecast after pulling...negative7620
25neutralunpublished twain autobiography rails against ...[-0.030312832444906235, 0.06083317846059799, 0...unpublished twain autobiography rails against ...0.546941[unpublished twain autobiography rails against...positive6476
26neutralvegetarian begins sad, private routine of scan...[-0.07400622963905334, -0.04156332463026047, -...vegetarian begins sad, private routine of scan...0.557931[vegetarian begins sad, private routine of sca...positive6011
27neutraldown with cutesy cleaning supplies![-0.05738799646496773, 0.06619091331958771, -0...down with cutesy cleaning supplies!0.523498[down with cutesy cleaning supplies!]negative7466
28neutralhillary clinton sets personal single rep squat...[0.05143097788095474, 0.03707878664135933, -0....hillary clinton sets personal single rep squat...0.586224[hillary clinton sets personal single rep squa...positive2975
29neutraltraveling tips for families with special diet[-0.05301835760474205, -0.04789021238684654, -...traveling tips for families with special diet0.544159[traveling tips for families with special diet]negative9610
30neutraltearful biden carefully takes down blacklight ...[0.02181081660091877, -0.05245676264166832, 0....tearful biden carefully takes down blacklight ...0.578549[tearful biden carefully takes down blacklight...positive9186
31neutral8-year-old girl dies after drinking boiling wa...[-0.07436364144086838, -0.042152464389801025, ...8-year-old girl dies after drinking boiling wa...0.536114[8-year-old girl dies after drinking boiling w...negative5053
32neutralwoody harrelson applies to open a marijuana di...[0.0774756669998169, -0.06551078706979752, -0....woody harrelson applies to open a marijuana di...0.520218[woody harrelson applies to open a marijuana d...negative2457
33neutralinterview with elaine jung[-0.0419117696583271, -0.02243213728070259, 0....interview with elaine jung0.504458[interview with elaine jung]negative4830
34neutralhow your sleep changes with the moon[0.005925372242927551, 0.0024853269569575787, ...how your sleep changes with the moon0.505398[how your sleep changes with the moon]negative9055
35neutraldr. scholl's introduces new cartilage inserts ...[0.05181374028325081, 0.061040107160806656, -0...dr. scholl's introduces new cartilage inserts ...0.577065[dr. scholl's introduces new cartilage inserts...positive1651
36positivenation's dogs dangerously underpetted, say dogs[-0.01876039244234562, -0.03308898210525513, -...nation's dogs dangerously underpetted, say dogs0.600809[nation's dogs dangerously underpetted, say dogs]positive5842
37neutralsean bean's most memorable death wasn't 'lord ...[-0.013742960058152676, 0.05260717123746872, -...sean bean's most memorable death wasn't 'lord ...0.530136[sean bean's most memorable death wasn't 'lord...negative3328
38neutralwife too busy videotaping elk attack to save h...[-0.02963477373123169, -0.024700473994016647, ...wife too busy videotaping elk attack to save h...0.575398[wife too busy videotaping elk attack to save ...positive3869
39positiveobama, romney remain about equally powerful[0.046225905418395996, 0.020606394857168198, -...obama, romney remain about equally powerful0.609472[obama, romney remain about equally powerful]positive6087
40neutralman arriving late forced to use excuse he was ...[0.007267913315445185, 0.012945346534252167, -...man arriving late forced to use excuse he was ...0.545002[man arriving late forced to use excuse he was...positive6329
41neutralnews roundup for june 19, 2017[0.006106187589466572, -0.07620107382535934, -...news roundup for june 19, 20170.519457[news roundup for june 19, 2017]negative4470
42neutralreport: 1 in 5 air ducts contains person looki...[-0.03163425996899605, 0.012088724412024021, -...report: 1 in 5 air ducts contains person looki...0.572511[report: 1 in 5 air ducts contains person look...positive4423
43neutralarrested but innocent? the internet still thin...[0.0008291222620755434, -0.07605188339948654, ...arrested but innocent? the internet still thin...0.505108[arrested but innocent?, the internet still t...negative7363
44neutralthis desperate dad is trying to ward off the t...[-0.009455329738557339, -0.0632706880569458, -...this desperate dad is trying to ward off the t...0.539598[this desperate dad is trying to ward off the ...negative6400
45neutralin defense of the promposal[0.04038773849606514, 0.06097205728292465, -0....in defense of the promposal0.511992[in defense of the promposal]negative9190
46neutralreason man turning to religion later in life m...[0.024827271699905396, -0.00032991680200211704...reason man turning to religion later in life m...0.574382[reason man turning to religion later in life ...positive234
47neutralbunch of hick nobodies sue for toxic-waste exp...[0.02218099869787693, 0.0022194429766386747, 0...bunch of hick nobodies sue for toxic-waste exp...0.570060[bunch of hick nobodies sue for toxic-waste ex...positive5098
48neutralno one in family sure who trip to arboretum is...[-0.03585259988903999, 0.017737973481416702, -...no one in family sure who trip to arboretum is...0.573483[no one in family sure who trip to arboretum i...positive2552
49positivevoice coming from dnc sound system during sand...[-0.009395286440849304, -0.0020206505432724953...voice coming from dnc sound system during sand...0.602834[voice coming from dnc sound system during san...positive1449
\n","
"],"text/plain":[" trained_sentiment ... origin_index\n","0 neutral ... 1463\n","1 neutral ... 9543\n","2 positive ... 2930\n","3 neutral ... 644\n","4 neutral ... 2390\n","5 neutral ... 5450\n","6 neutral ... 7739\n","7 neutral ... 4370\n","8 neutral ... 9418\n","9 neutral ... 4357\n","10 neutral ... 2418\n","11 neutral ... 7882\n","12 positive ... 6117\n","13 neutral ... 7992\n","14 neutral ... 6445\n","15 neutral ... 8222\n","16 neutral ... 3847\n","17 neutral ... 253\n","18 neutral ... 2504\n","19 neutral ... 6992\n","20 positive ... 5882\n","21 neutral ... 9721\n","22 neutral ... 8362\n","23 neutral ... 1073\n","24 neutral ... 7620\n","25 neutral ... 6476\n","26 neutral ... 6011\n","27 neutral ... 7466\n","28 neutral ... 2975\n","29 neutral ... 9610\n","30 neutral ... 9186\n","31 neutral ... 5053\n","32 neutral ... 2457\n","33 neutral ... 4830\n","34 neutral ... 9055\n","35 neutral ... 1651\n","36 positive ... 5842\n","37 neutral ... 3328\n","38 neutral ... 3869\n","39 positive ... 6087\n","40 neutral ... 6329\n","41 neutral ... 4470\n","42 neutral ... 4423\n","43 neutral ... 7363\n","44 neutral ... 6400\n","45 neutral ... 9190\n","46 neutral ... 234\n","47 neutral ... 5098\n","48 neutral ... 2552\n","49 positive ... 1449\n","\n","[50 rows x 8 columns]"]},"metadata":{"tags":[]},"execution_count":7}]},{"cell_type":"markdown","metadata":{"id":"lVyOE2wV0fw_"},"source":["# 4. Test the fitted pipe on new example"]},{"cell_type":"code","metadata":{"colab":{"base_uri":"https://localhost:8080/","height":80},"id":"qdCUg2MR0PD2","executionInfo":{"status":"ok","timestamp":1620188373652,"user_tz":-120,"elapsed":10618,"user":{"displayName":"Christian Kasim Loan","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GjqAD-ircKP-s5Eh6JSdkDggDczfqQbJGU_IRb4Hw=s64","userId":"14469489166467359317"}},"outputId":"3740cfa7-b6c4-41f0-eb9c-d4b101438602"},"source":["fitted_pipe.predict('Aliens are immortal!')\n"],"execution_count":null,"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","
trained_sentimentdocumentsentence_embedding_usetrained_sentiment_confidencesentenceorigin_index
0neutralAliens are immortal![-0.0700131505727768, -0.06706050038337708, -0...0.549292[Aliens are immortal!]0
\n","
"],"text/plain":[" trained_sentiment document ... sentence origin_index\n","0 neutral Aliens are immortal! ... [Aliens are immortal!] 0\n","\n","[1 rows x 6 columns]"]},"metadata":{"tags":[]},"execution_count":8}]},{"cell_type":"markdown","metadata":{"id":"xflpwrVjjBVD"},"source":["## 5. Configure pipe training parameters"]},{"cell_type":"code","metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"UtsAUGTmOTms","executionInfo":{"status":"ok","timestamp":1620188373653,"user_tz":-120,"elapsed":10552,"user":{"displayName":"Christian Kasim Loan","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GjqAD-ircKP-s5Eh6JSdkDggDczfqQbJGU_IRb4Hw=s64","userId":"14469489166467359317"}},"outputId":"e43b4908-42f7-46fb-d110-210ae33b8ff9"},"source":["trainable_pipe.print_info()"],"execution_count":null,"outputs":[{"output_type":"stream","text":["The following parameters are configurable for this NLU pipeline (You can copy paste the examples) :\n",">>> pipe['sentiment_dl'] has settable params:\n","pipe['sentiment_dl'].setMaxEpochs(1) | Info: Maximum number of epochs to train | Currently set to : 1\n","pipe['sentiment_dl'].setLr(0.005) | Info: Learning Rate | Currently set to : 0.005\n","pipe['sentiment_dl'].setBatchSize(64) | Info: Batch size | Currently set to : 64\n","pipe['sentiment_dl'].setDropout(0.5) | Info: Dropout coefficient | Currently set to : 0.5\n","pipe['sentiment_dl'].setEnableOutputLogs(True) | Info: Whether to use stdout in addition to Spark logs. | Currently set to : True\n","pipe['sentiment_dl'].setThreshold(0.6) | Info: The minimum threshold for the final result otheriwse it will be neutral | Currently set to : 0.6\n","pipe['sentiment_dl'].setThresholdLabel('neutral') | Info: In case the score is less than threshold, what should be the label. Default is neutral. | Currently set to : neutral\n",">>> pipe['use@tfhub_use'] has settable params:\n","pipe['use@tfhub_use'].setDimension(512) | Info: Number of embedding dimensions | Currently set to : 512\n","pipe['use@tfhub_use'].setLoadSP(False) | Info: Whether to load SentencePiece ops file which is required only by multi-lingual models. This is not changeable after it's set with a pretrained model nor it is compatible with Windows. | Currently set to : False\n","pipe['use@tfhub_use'].setStorageRef('tfhub_use') | Info: unique reference name for identification | Currently set to : tfhub_use\n",">>> pipe['deep_sentence_detector@SentenceDetectorDLModel_c83c27f46b97'] has settable params:\n","pipe['deep_sentence_detector@SentenceDetectorDLModel_c83c27f46b97'].setExplodeSentences(False) | Info: whether to explode each sentence into a different row, for better parallelization. Defaults to false. | Currently set to : False\n","pipe['deep_sentence_detector@SentenceDetectorDLModel_c83c27f46b97'].setStorageRef('SentenceDetectorDLModel_c83c27f46b97') | Info: storage unique identifier | Currently set to : SentenceDetectorDLModel_c83c27f46b97\n","pipe['deep_sentence_detector@SentenceDetectorDLModel_c83c27f46b97'].setEncoder(com.johnsnowlabs.nlp.annotators.sentence_detector_dl.SentenceDetectorDLEncoder@9b0d688) | Info: Data encoder | Currently set to : com.johnsnowlabs.nlp.annotators.sentence_detector_dl.SentenceDetectorDLEncoder@9b0d688\n","pipe['deep_sentence_detector@SentenceDetectorDLModel_c83c27f46b97'].setImpossiblePenultimates(['Bros', 'No', 'al', 'vs', 'etc', 'Fig', 'Dr', 'Prof', 'PhD', 'MD', 'Co', 'Corp', 'Inc', 'bros', 'VS', 'Vs', 'ETC', 'fig', 'dr', 'prof', 'PHD', 'phd', 'md', 'co', 'corp', 'inc', 'Jan', 'Feb', 'Mar', 'Apr', 'Jul', 'Aug', 'Sep', 'Sept', 'Oct', 'Nov', 'Dec', 'St', 'st', 'AM', 'PM', 'am', 'pm', 'e.g', 'f.e', 'i.e']) | Info: Impossible penultimates | Currently set to : ['Bros', 'No', 'al', 'vs', 'etc', 'Fig', 'Dr', 'Prof', 'PhD', 'MD', 'Co', 'Corp', 'Inc', 'bros', 'VS', 'Vs', 'ETC', 'fig', 'dr', 'prof', 'PHD', 'phd', 'md', 'co', 'corp', 'inc', 'Jan', 'Feb', 'Mar', 'Apr', 'Jul', 'Aug', 'Sep', 'Sept', 'Oct', 'Nov', 'Dec', 'St', 'st', 'AM', 'PM', 'am', 'pm', 'e.g', 'f.e', 'i.e']\n","pipe['deep_sentence_detector@SentenceDetectorDLModel_c83c27f46b97'].setModelArchitecture('cnn') | Info: Model architecture (CNN) | Currently set to : cnn\n",">>> pipe['document_assembler'] has settable params:\n","pipe['document_assembler'].setCleanupMode('shrink') | Info: possible values: disabled, inplace, inplace_full, shrink, shrink_full, each, each_full, delete_full | Currently set to : shrink\n"],"name":"stdout"}]},{"cell_type":"markdown","metadata":{"id":"2GJdDNV9jEIe"},"source":["## 6. Retrain with new parameters"]},{"cell_type":"code","metadata":{"colab":{"base_uri":"https://localhost:8080/","height":1000},"id":"mptfvHx-MMMX","executionInfo":{"status":"ok","timestamp":1620188376889,"user_tz":-120,"elapsed":13708,"user":{"displayName":"Christian Kasim Loan","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GjqAD-ircKP-s5Eh6JSdkDggDczfqQbJGU_IRb4Hw=s64","userId":"14469489166467359317"}},"outputId":"86a3b364-8312-4dc0-beb0-37293e3ce167"},"source":["# Train longer!\n","trainable_pipe = nlu.load('train.sentiment')\n","trainable_pipe['trainable_sentiment_dl'].setMaxEpochs(5) \n","fitted_pipe = trainable_pipe.fit(train_df.iloc[:50])\n","# predict with the trainable pipeline on dataset and get predictions\n","preds = fitted_pipe.predict(train_df.iloc[:50],output_level='document')\n","\n","#sentence detector that is part of the pipe generates sone NaNs. lets drop them first\n","preds.dropna(inplace=True)\n","print(classification_report(preds['y'], preds['sentiment']))\n","\n","preds"],"execution_count":null,"outputs":[{"output_type":"stream","text":[" precision recall f1-score support\n","\n"," negative 1.00 0.88 0.93 24\n"," neutral 0.00 0.00 0.00 0\n"," positive 0.96 0.92 0.94 26\n","\n"," accuracy 0.90 50\n"," macro avg 0.65 0.60 0.62 50\n","weighted avg 0.98 0.90 0.94 50\n","\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"," \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"," \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"," \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"," \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"," \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"," \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"," \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"," \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"," \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"," \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"," \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","
trained_sentimentdocumentsentence_embedding_usetexttrained_sentiment_confidencesentenceyorigin_index
0positivered cross installs blood drop-off bins for don...[-0.07407097518444061, 0.020259270444512367, -...red cross installs blood drop-off bins for don...0.918347[red cross installs blood drop-off bins for do...positive1463
1neutralpresident-elect edwards seen entering chinatow...[0.07900547981262207, 0.06132232025265694, 0.0...president-elect edwards seen entering chinatow...0.591700[president-elect edwards seen entering chinato...positive9543
2positivecrowd at trump rally realizes they've been cha...[0.00032250594813376665, -0.022321783006191254...crowd at trump rally realizes they've been cha...0.963672[crowd at trump rally realizes they've been ch...positive2930
3positivekerry captures bin laden one week too late[-0.004850792698562145, 0.017207739874720573, ...kerry captures bin laden one week too late0.846780[kerry captures bin laden one week too late]positive644
4negative'new hampshire' episode 4: not just for old, w...[-0.04294964671134949, -0.07175017148256302, -...'new hampshire' episode 4: not just for old, w...0.888615['new hampshire' episode 4: not just for old, ...negative2390
5negative12 indie spots in hong kong[-0.036156971007585526, -0.014244569465517998,...12 indie spots in hong kong0.889380[12 indie spots in hong kong]negative5450
6neutralformer refugee fights for her dream to abolish...[-0.0035593388602137566, 0.008986725471913815,...former refugee fights for her dream to abolish...0.516011[former refugee fights for her dream to abolis...negative7739
7negativewatch out, sephora. h&m beauty is coming for you.[-0.02806154452264309, -0.04734545946121216, 0...watch out, sephora. h&m beauty is coming for you.0.904426[watch out, sephora., h&m beauty is coming for...negative4370
8positivecomputer scientists say ai's underdeveloped et...[-0.007209080271422863, -0.01665995828807354, ...computer scientists say ai's underdeveloped et...0.881709[computer scientists say ai's underdeveloped e...positive9418
9negativepast armageddon and on to zippori, one of isra...[-0.0013639864046126604, -0.05516374856233597,...past armageddon and on to zippori, one of isra...0.887740[past armageddon and on to zippori, one of isr...negative4357
10positiveobama caves to girl scout lobby, wears tiara i...[-0.019499918445944786, -0.01798412762582302, ...obama caves to girl scout lobby, wears tiara i...0.654486[obama caves to girl scout lobby, wears tiara ...negative2418
11positiveisrael passes law cementing itself as exclusiv...[0.05780275911092758, -0.04909253492951393, -0...israel passes law cementing itself as exclusiv...0.803852[israel passes law cementing itself as exclusi...positive7882
12positivelocal man's fear of snakes increases with each...[0.056381646543741226, -0.057368289679288864, ...local man's fear of snakes increases with each...0.973072[local man's fear of snakes increases with eac...positive6117
13negativemedia ethics: whose standards?[0.0406915545463562, 0.03338606283068657, -0.0...media ethics: whose standards?0.884770[media ethics: whose standards?]negative7992
14positiverare species of frog may hold cure to...ah, ne...[0.079066202044487, 0.021108830347657204, -0.0...rare species of frog may hold cure to...ah, ne...0.942009[rare species of frog may hold cure to., ..ah,...positive6445
15positivepolice officers waving everyone over to take a...[-0.011674991808831692, -0.07644280791282654, ...police officers waving everyone over to take a...0.616271[police officers waving everyone over to take ...positive8222
16negativenate berkus and jeremiah brent are married![0.03597276285290718, 0.05780172348022461, -0....nate berkus and jeremiah brent are married!0.904110[nate berkus and jeremiah brent are married!]negative3847
17neutralsummer camp hierarchy thrown into chaos after ...[-0.07574271410703659, 0.037431202828884125, 0...summer camp hierarchy thrown into chaos after ...0.586359[summer camp hierarchy thrown into chaos after...positive253
18negativeiraqi officer under saddam masterminded the ri...[0.02313143201172352, -0.05338258296251297, -0...iraqi officer under saddam masterminded the ri...0.712658[iraqi officer under saddam masterminded the r...negative2504
19negativecop crashed cruiser into ditch after this owl ...[-0.0011760082561522722, -0.07277680933475494,...cop crashed cruiser into ditch after this owl ...0.835989[cop crashed cruiser into ditch after this owl...negative6992
20positivebush elected president of iraq[-0.02786075882613659, 0.044202402234077454, -...bush elected president of iraq0.928596[bush elected president of iraq]positive5882
21negativesenate does equifax a favor as a former execut...[0.048467256128787994, -0.020521214231848717, ...senate does equifax a favor as a former execut...0.908127[senate does equifax a favor as a former execu...negative9721
22positivetexan feels emotionally empty after chili cook...[-0.03747135400772095, 0.021678565070033073, -...texan feels emotionally empty after chili cook...0.953778[texan feels emotionally empty after chili coo...positive8362
23neutrallgbtq activists organizing massive dance prote...[0.03160602226853371, -0.031953465193510056, -...lgbtq activists organizing massive dance prote...0.548180[lgbtq activists organizing massive dance prot...negative1073
24negativesamsung slashes profit forecast after pulling ...[0.06239231675863266, -0.03570358455181122, -0...samsung slashes profit forecast after pulling ...0.912397[samsung slashes profit forecast after pulling...negative7620
25positiveunpublished twain autobiography rails against ...[-0.030312832444906235, 0.06083317846059799, 0...unpublished twain autobiography rails against ...0.709892[unpublished twain autobiography rails against...positive6476
26positivevegetarian begins sad, private routine of scan...[-0.07400622963905334, -0.04156332463026047, -...vegetarian begins sad, private routine of scan...0.845192[vegetarian begins sad, private routine of sca...positive6011
27negativedown with cutesy cleaning supplies![-0.05738799646496773, 0.06619091331958771, -0...down with cutesy cleaning supplies!0.853556[down with cutesy cleaning supplies!]negative7466
28positivehillary clinton sets personal single rep squat...[0.05143097788095474, 0.03707878664135933, -0....hillary clinton sets personal single rep squat...0.908901[hillary clinton sets personal single rep squa...positive2975
29negativetraveling tips for families with special diet[-0.05301835760474205, -0.04789021238684654, -...traveling tips for families with special diet0.788320[traveling tips for families with special diet]negative9610
30positivetearful biden carefully takes down blacklight ...[0.02181081660091877, -0.05245676264166832, 0....tearful biden carefully takes down blacklight ...0.836097[tearful biden carefully takes down blacklight...positive9186
31negative8-year-old girl dies after drinking boiling wa...[-0.07436364144086838, -0.042152464389801025, ...8-year-old girl dies after drinking boiling wa...0.888045[8-year-old girl dies after drinking boiling w...negative5053
32negativewoody harrelson applies to open a marijuana di...[0.0774756669998169, -0.06551078706979752, -0....woody harrelson applies to open a marijuana di...0.916998[woody harrelson applies to open a marijuana d...negative2457
33negativeinterview with elaine jung[-0.0419117696583271, -0.02243213728070259, 0....interview with elaine jung0.909372[interview with elaine jung]negative4830
34negativehow your sleep changes with the moon[0.005925372242927551, 0.0024853269569575787, ...how your sleep changes with the moon0.908831[how your sleep changes with the moon]negative9055
35positivedr. scholl's introduces new cartilage inserts ...[0.05181374028325081, 0.061040107160806656, -0...dr. scholl's introduces new cartilage inserts ...0.901216[dr. scholl's introduces new cartilage inserts...positive1651
36positivenation's dogs dangerously underpetted, say dogs[-0.01876039244234562, -0.03308898210525513, -...nation's dogs dangerously underpetted, say dogs0.959039[nation's dogs dangerously underpetted, say dogs]positive5842
37negativesean bean's most memorable death wasn't 'lord ...[-0.013742960058152676, 0.05260717123746872, -...sean bean's most memorable death wasn't 'lord ...0.888762[sean bean's most memorable death wasn't 'lord...negative3328
38positivewife too busy videotaping elk attack to save h...[-0.02963477373123169, -0.024700473994016647, ...wife too busy videotaping elk attack to save h...0.892977[wife too busy videotaping elk attack to save ...positive3869
39positiveobama, romney remain about equally powerful[0.046225905418395996, 0.020606394857168198, -...obama, romney remain about equally powerful0.950219[obama, romney remain about equally powerful]positive6087
40positiveman arriving late forced to use excuse he was ...[0.007267913315445185, 0.012945346534252167, -...man arriving late forced to use excuse he was ...0.854663[man arriving late forced to use excuse he was...positive6329
41negativenews roundup for june 19, 2017[0.006106187589466572, -0.07620107382535934, -...news roundup for june 19, 20170.926237[news roundup for june 19, 2017]negative4470
42positivereport: 1 in 5 air ducts contains person looki...[-0.03163425996899605, 0.012088724412024021, -...report: 1 in 5 air ducts contains person looki...0.952198[report: 1 in 5 air ducts contains person look...positive4423
43negativearrested but innocent? the internet still thin...[0.0008291222620755434, -0.07605188339948654, ...arrested but innocent? the internet still thin...0.936171[arrested but innocent?, the internet still t...negative7363
44negativethis desperate dad is trying to ward off the t...[-0.009455329738557339, -0.0632706880569458, -...this desperate dad is trying to ward off the t...0.873377[this desperate dad is trying to ward off the ...negative6400
45negativein defense of the promposal[0.04038773849606514, 0.06097205728292465, -0....in defense of the promposal0.866386[in defense of the promposal]negative9190
46positivereason man turning to religion later in life m...[0.024827271699905396, -0.00032991680200211704...reason man turning to religion later in life m...0.901040[reason man turning to religion later in life ...positive234
47positivebunch of hick nobodies sue for toxic-waste exp...[0.02218099869787693, 0.0022194429766386747, 0...bunch of hick nobodies sue for toxic-waste exp...0.874898[bunch of hick nobodies sue for toxic-waste ex...positive5098
48positiveno one in family sure who trip to arboretum is...[-0.03585259988903999, 0.017737973481416702, -...no one in family sure who trip to arboretum is...0.859806[no one in family sure who trip to arboretum i...positive2552
49positivevoice coming from dnc sound system during sand...[-0.009395286440849304, -0.0020206505432724953...voice coming from dnc sound system during sand...0.943251[voice coming from dnc sound system during san...positive1449
\n","
"],"text/plain":[" trained_sentiment ... origin_index\n","0 positive ... 1463\n","1 neutral ... 9543\n","2 positive ... 2930\n","3 positive ... 644\n","4 negative ... 2390\n","5 negative ... 5450\n","6 neutral ... 7739\n","7 negative ... 4370\n","8 positive ... 9418\n","9 negative ... 4357\n","10 positive ... 2418\n","11 positive ... 7882\n","12 positive ... 6117\n","13 negative ... 7992\n","14 positive ... 6445\n","15 positive ... 8222\n","16 negative ... 3847\n","17 neutral ... 253\n","18 negative ... 2504\n","19 negative ... 6992\n","20 positive ... 5882\n","21 negative ... 9721\n","22 positive ... 8362\n","23 neutral ... 1073\n","24 negative ... 7620\n","25 positive ... 6476\n","26 positive ... 6011\n","27 negative ... 7466\n","28 positive ... 2975\n","29 negative ... 9610\n","30 positive ... 9186\n","31 negative ... 5053\n","32 negative ... 2457\n","33 negative ... 4830\n","34 negative ... 9055\n","35 positive ... 1651\n","36 positive ... 5842\n","37 negative ... 3328\n","38 positive ... 3869\n","39 positive ... 6087\n","40 positive ... 6329\n","41 negative ... 4470\n","42 positive ... 4423\n","43 negative ... 7363\n","44 negative ... 6400\n","45 negative ... 9190\n","46 positive ... 234\n","47 positive ... 5098\n","48 positive ... 2552\n","49 positive ... 1449\n","\n","[50 rows x 8 columns]"]},"metadata":{"tags":[]},"execution_count":10}]},{"cell_type":"markdown","metadata":{"id":"qFoT-s1MjTSS"},"source":["# 7. Try training with different Embeddings"]},{"cell_type":"code","metadata":{"id":"nxWFzQOhjWC8","colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"status":"ok","timestamp":1620188377296,"user_tz":-120,"elapsed":14031,"user":{"displayName":"Christian Kasim Loan","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GjqAD-ircKP-s5Eh6JSdkDggDczfqQbJGU_IRb4Hw=s64","userId":"14469489166467359317"}},"outputId":"504a2809-2e9f-45b1-812d-4cd953323d9f"},"source":["# We can use nlu.print_components(action='embed_sentence') to see every possibler sentence embedding we could use. Lets use bert!\n","nlu.print_components(action='embed_sentence')"],"execution_count":null,"outputs":[{"output_type":"stream","text":["For language NLU provides the following Models : \n","nlu.load('en.embed_sentence') returns Spark NLP model tfhub_use\n","nlu.load('en.embed_sentence.use') returns Spark NLP model tfhub_use\n","nlu.load('en.embed_sentence.tfhub_use') returns Spark NLP model tfhub_use\n","nlu.load('en.embed_sentence.use.lg') returns Spark NLP model tfhub_use_lg\n","nlu.load('en.embed_sentence.tfhub_use.lg') returns Spark NLP model tfhub_use_lg\n","nlu.load('en.embed_sentence.albert') returns Spark NLP model albert_base_uncased\n","nlu.load('en.embed_sentence.electra') returns Spark NLP model sent_electra_small_uncased\n","nlu.load('en.embed_sentence.electra_small_uncased') returns Spark NLP model sent_electra_small_uncased\n","nlu.load('en.embed_sentence.electra_base_uncased') returns Spark NLP model sent_electra_base_uncased\n","nlu.load('en.embed_sentence.electra_large_uncased') returns Spark NLP model sent_electra_large_uncased\n","nlu.load('en.embed_sentence.bert') returns Spark NLP model sent_bert_base_uncased\n","nlu.load('en.embed_sentence.bert_base_uncased') returns Spark NLP model sent_bert_base_uncased\n","nlu.load('en.embed_sentence.bert_base_cased') returns Spark NLP model sent_bert_base_cased\n","nlu.load('en.embed_sentence.bert_large_uncased') returns Spark NLP model sent_bert_large_uncased\n","nlu.load('en.embed_sentence.bert_large_cased') returns Spark NLP model sent_bert_large_cased\n","nlu.load('en.embed_sentence.biobert.pubmed_base_cased') returns Spark NLP model sent_biobert_pubmed_base_cased\n","nlu.load('en.embed_sentence.biobert.pubmed_large_cased') returns Spark NLP model sent_biobert_pubmed_large_cased\n","nlu.load('en.embed_sentence.biobert.pmc_base_cased') returns Spark NLP model sent_biobert_pmc_base_cased\n","nlu.load('en.embed_sentence.biobert.pubmed_pmc_base_cased') returns Spark NLP model sent_biobert_pubmed_pmc_base_cased\n","nlu.load('en.embed_sentence.biobert.clinical_base_cased') returns Spark NLP model sent_biobert_clinical_base_cased\n","nlu.load('en.embed_sentence.biobert.discharge_base_cased') returns Spark NLP model sent_biobert_discharge_base_cased\n","nlu.load('en.embed_sentence.covidbert.large_uncased') returns Spark NLP model sent_covidbert_large_uncased\n","nlu.load('en.embed_sentence.small_bert_L2_128') returns Spark NLP model sent_small_bert_L2_128\n","nlu.load('en.embed_sentence.small_bert_L4_128') returns Spark NLP model sent_small_bert_L4_128\n","nlu.load('en.embed_sentence.small_bert_L6_128') returns Spark NLP model sent_small_bert_L6_128\n","nlu.load('en.embed_sentence.small_bert_L8_128') returns Spark NLP model sent_small_bert_L8_128\n","nlu.load('en.embed_sentence.small_bert_L10_128') returns Spark NLP model sent_small_bert_L10_128\n","nlu.load('en.embed_sentence.small_bert_L12_128') returns Spark NLP model sent_small_bert_L12_128\n","nlu.load('en.embed_sentence.small_bert_L2_256') returns Spark NLP model sent_small_bert_L2_256\n","nlu.load('en.embed_sentence.small_bert_L4_256') returns Spark NLP model sent_small_bert_L4_256\n","nlu.load('en.embed_sentence.small_bert_L6_256') returns Spark NLP model sent_small_bert_L6_256\n","nlu.load('en.embed_sentence.small_bert_L8_256') returns Spark NLP model sent_small_bert_L8_256\n","nlu.load('en.embed_sentence.small_bert_L10_256') returns Spark NLP model sent_small_bert_L10_256\n","nlu.load('en.embed_sentence.small_bert_L12_256') returns Spark NLP model sent_small_bert_L12_256\n","nlu.load('en.embed_sentence.small_bert_L2_512') returns Spark NLP model sent_small_bert_L2_512\n","nlu.load('en.embed_sentence.small_bert_L4_512') returns Spark NLP model sent_small_bert_L4_512\n","nlu.load('en.embed_sentence.small_bert_L6_512') returns Spark NLP model sent_small_bert_L6_512\n","nlu.load('en.embed_sentence.small_bert_L8_512') returns Spark NLP model sent_small_bert_L8_512\n","nlu.load('en.embed_sentence.small_bert_L10_512') returns Spark NLP model sent_small_bert_L10_512\n","nlu.load('en.embed_sentence.small_bert_L12_512') returns Spark NLP model sent_small_bert_L12_512\n","nlu.load('en.embed_sentence.small_bert_L2_768') returns Spark NLP model sent_small_bert_L2_768\n","nlu.load('en.embed_sentence.small_bert_L4_768') returns Spark NLP model sent_small_bert_L4_768\n","nlu.load('en.embed_sentence.small_bert_L6_768') returns Spark NLP model sent_small_bert_L6_768\n","nlu.load('en.embed_sentence.small_bert_L8_768') returns Spark NLP model sent_small_bert_L8_768\n","nlu.load('en.embed_sentence.small_bert_L10_768') returns Spark NLP model sent_small_bert_L10_768\n","nlu.load('en.embed_sentence.small_bert_L12_768') returns Spark NLP model sent_small_bert_L12_768\n","For language NLU provides the following Models : \n","nlu.load('fi.embed_sentence') returns Spark NLP model sent_bert_finnish_cased\n","nlu.load('fi.embed_sentence.bert.cased') returns Spark NLP model sent_bert_finnish_cased\n","nlu.load('fi.embed_sentence.bert.uncased') returns Spark NLP model sent_bert_finnish_uncased\n","For language NLU provides the following Models : \n","nlu.load('xx.embed_sentence') returns Spark NLP model sent_bert_multi_cased\n","nlu.load('xx.embed_sentence.bert') returns Spark NLP model sent_bert_multi_cased\n","nlu.load('xx.embed_sentence.bert.cased') returns Spark NLP model sent_bert_multi_cased\n","nlu.load('xx.embed_sentence.labse') returns Spark NLP model labse\n"],"name":"stdout"}]},{"cell_type":"code","metadata":{"id":"IKK_Ii_gjJfF","colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"status":"ok","timestamp":1620190483755,"user_tz":-120,"elapsed":2120443,"user":{"displayName":"Christian Kasim Loan","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GjqAD-ircKP-s5Eh6JSdkDggDczfqQbJGU_IRb4Hw=s64","userId":"14469489166467359317"}},"outputId":"f6ff250f-0e4f-4425-a92e-18f08d6f1334"},"source":["trainable_pipe = nlu.load('en.embed_sentence.small_bert_L12_768 train.sentiment')\n","# We need to train longer and user smaller LR for NON-USE based sentence embeddings usually\n","# We could tune the hyperparameters further with hyperparameter tuning methods like gridsearch\n","# Also longer training gives more accuracy\n","trainable_pipe['trainable_sentiment_dl'].setMaxEpochs(120) \n","trainable_pipe['trainable_sentiment_dl'].setLr(0.0005) \n","fitted_pipe = trainable_pipe.fit(train_df)\n","# predict with the trainable pipeline on dataset and get predictions\n","preds = fitted_pipe.predict(train_df,output_level='document')\n","\n","#sentence detector that is part of the pipe generates sone NaNs. lets drop them first\n","preds.dropna(inplace=True)\n","print(classification_report(preds['y'], preds['sentiment']))\n","\n","#preds"],"execution_count":null,"outputs":[{"output_type":"stream","text":["sent_small_bert_L12_768 download started this may take some time.\n","Approximate size to download 392.9 MB\n","[OK!]\n","sentence_detector_dl download started this may take some time.\n","Approximate size to download 354.6 KB\n","[OK!]\n"," precision recall f1-score support\n","\n"," negative 0.90 0.88 0.89 4023\n"," neutral 0.00 0.00 0.00 0\n"," positive 0.90 0.88 0.89 3977\n","\n"," accuracy 0.88 8000\n"," macro avg 0.60 0.58 0.59 8000\n","weighted avg 0.90 0.88 0.89 8000\n","\n"],"name":"stdout"}]},{"cell_type":"markdown","metadata":{"id":"_1jxw3GnVGlI"},"source":["# 7.1 evaluate on Test Data"]},{"cell_type":"code","metadata":{"id":"Fxx4yNkNVGFl","colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"status":"ok","timestamp":1620190639161,"user_tz":-120,"elapsed":2275776,"user":{"displayName":"Christian Kasim Loan","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GjqAD-ircKP-s5Eh6JSdkDggDczfqQbJGU_IRb4Hw=s64","userId":"14469489166467359317"}},"outputId":"d7f7c06c-aae2-43fe-f7c6-34a9fc87482b"},"source":["preds = fitted_pipe.predict(test_df,output_level='document')\n","\n","#sentence detector that is part of the pipe generates sone NaNs. lets drop them first\n","preds.dropna(inplace=True)\n","print(classification_report(preds['y'], preds['sentiment']))"],"execution_count":null,"outputs":[{"output_type":"stream","text":[" precision recall f1-score support\n","\n"," negative 0.84 0.82 0.83 977\n"," neutral 0.00 0.00 0.00 0\n"," positive 0.86 0.81 0.83 1023\n","\n"," accuracy 0.82 2000\n"," macro avg 0.57 0.55 0.56 2000\n","weighted avg 0.85 0.82 0.83 2000\n","\n"],"name":"stdout"}]},{"cell_type":"markdown","metadata":{"id":"2BB-NwZUoHSe"},"source":["# 8. Lets save the model"]},{"cell_type":"code","metadata":{"id":"eLex095goHwm","colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"status":"ok","timestamp":1620190792311,"user_tz":-120,"elapsed":2428848,"user":{"displayName":"Christian Kasim Loan","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GjqAD-ircKP-s5Eh6JSdkDggDczfqQbJGU_IRb4Hw=s64","userId":"14469489166467359317"}},"outputId":"5f8bc338-d089-4a82-e4b6-0eb286d14b0d"},"source":["stored_model_path = './models/classifier_dl_trained' \n","fitted_pipe.save(stored_model_path)"],"execution_count":null,"outputs":[{"output_type":"stream","text":["Stored model in ./models/classifier_dl_trained\n"],"name":"stdout"}]},{"cell_type":"markdown","metadata":{"id":"e_b2DPd4rCiU"},"source":["# 9. Lets load the model from HDD.\n","This makes Offlien NLU usage possible! \n","You need to call nlu.load(path=path_to_the_pipe) to load a model/pipeline from disk."]},{"cell_type":"code","metadata":{"id":"SO4uz45MoRgp","colab":{"base_uri":"https://localhost:8080/","height":80},"executionInfo":{"status":"ok","timestamp":1620190810537,"user_tz":-120,"elapsed":2446986,"user":{"displayName":"Christian Kasim Loan","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GjqAD-ircKP-s5Eh6JSdkDggDczfqQbJGU_IRb4Hw=s64","userId":"14469489166467359317"}},"outputId":"2ad4167d-9332-4880-d27b-6a1679256f41"},"source":["hdd_pipe = nlu.load(path=stored_model_path)\n","\n","preds = hdd_pipe.predict('Aliens are immortal!')\n","\n","preds"],"execution_count":null,"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","
documenttextsentimentorigin_indexsentencesentiment_confidencesentence_embedding_from_disk
0Aliens are immortal!Aliens are immortal![negative]8589934592[Aliens are immortal!][0.9999138][[0.30930545926094055, 0.12947328388690948, 0....
\n","
"],"text/plain":[" document ... sentence_embedding_from_disk\n","0 Aliens are immortal! ... [[0.30930545926094055, 0.12947328388690948, 0....\n","\n","[1 rows x 7 columns]"]},"metadata":{"tags":[]},"execution_count":15}]},{"cell_type":"code","metadata":{"id":"e0CVlkk9v6Qi","colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"status":"ok","timestamp":1620190810538,"user_tz":-120,"elapsed":2446902,"user":{"displayName":"Christian Kasim Loan","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GjqAD-ircKP-s5Eh6JSdkDggDczfqQbJGU_IRb4Hw=s64","userId":"14469489166467359317"}},"outputId":"4f7f8f8f-477e-430a-c17c-5b84c3ebe8fb"},"source":["hdd_pipe.print_info()"],"execution_count":null,"outputs":[{"output_type":"stream","text":["The following parameters are configurable for this NLU pipeline (You can copy paste the examples) :\n",">>> pipe['document_assembler'] has settable params:\n","pipe['document_assembler'].setCleanupMode('shrink') | Info: possible values: disabled, inplace, inplace_full, shrink, shrink_full, each, each_full, delete_full | Currently set to : shrink\n",">>> pipe['sentence_detector@SentenceDetectorDLModel_c83c27f46b97'] has settable params:\n","pipe['sentence_detector@SentenceDetectorDLModel_c83c27f46b97'].setExplodeSentences(False) | Info: whether to explode each sentence into a different row, for better parallelization. Defaults to false. | Currently set to : False\n","pipe['sentence_detector@SentenceDetectorDLModel_c83c27f46b97'].setStorageRef('SentenceDetectorDLModel_c83c27f46b97') | Info: storage unique identifier | Currently set to : SentenceDetectorDLModel_c83c27f46b97\n","pipe['sentence_detector@SentenceDetectorDLModel_c83c27f46b97'].setEncoder(com.johnsnowlabs.nlp.annotators.sentence_detector_dl.SentenceDetectorDLEncoder@6cf015ef) | Info: Data encoder | Currently set to : com.johnsnowlabs.nlp.annotators.sentence_detector_dl.SentenceDetectorDLEncoder@6cf015ef\n","pipe['sentence_detector@SentenceDetectorDLModel_c83c27f46b97'].setImpossiblePenultimates(['Bros', 'No', 'al', 'vs', 'etc', 'Fig', 'Dr', 'Prof', 'PhD', 'MD', 'Co', 'Corp', 'Inc', 'bros', 'VS', 'Vs', 'ETC', 'fig', 'dr', 'prof', 'PHD', 'phd', 'md', 'co', 'corp', 'inc', 'Jan', 'Feb', 'Mar', 'Apr', 'Jul', 'Aug', 'Sep', 'Sept', 'Oct', 'Nov', 'Dec', 'St', 'st', 'AM', 'PM', 'am', 'pm', 'e.g', 'f.e', 'i.e']) | Info: Impossible penultimates | Currently set to : ['Bros', 'No', 'al', 'vs', 'etc', 'Fig', 'Dr', 'Prof', 'PhD', 'MD', 'Co', 'Corp', 'Inc', 'bros', 'VS', 'Vs', 'ETC', 'fig', 'dr', 'prof', 'PHD', 'phd', 'md', 'co', 'corp', 'inc', 'Jan', 'Feb', 'Mar', 'Apr', 'Jul', 'Aug', 'Sep', 'Sept', 'Oct', 'Nov', 'Dec', 'St', 'st', 'AM', 'PM', 'am', 'pm', 'e.g', 'f.e', 'i.e']\n","pipe['sentence_detector@SentenceDetectorDLModel_c83c27f46b97'].setModelArchitecture('cnn') | Info: Model architecture (CNN) | Currently set to : cnn\n",">>> pipe['bert_sentence@sent_small_bert_L12_768'] has settable params:\n","pipe['bert_sentence@sent_small_bert_L12_768'].setBatchSize(8) | Info: Size of every batch | Currently set to : 8\n","pipe['bert_sentence@sent_small_bert_L12_768'].setCaseSensitive(False) | Info: whether to ignore case in tokens for embeddings matching | Currently set to : False\n","pipe['bert_sentence@sent_small_bert_L12_768'].setDimension(768) | Info: Number of embedding dimensions | Currently set to : 768\n","pipe['bert_sentence@sent_small_bert_L12_768'].setMaxSentenceLength(128) | Info: Max sentence length to process | Currently set to : 128\n","pipe['bert_sentence@sent_small_bert_L12_768'].setIsLong(False) | Info: Use Long type instead of Int type for inputs buffer - Some Bert models require Long instead of Int. | Currently set to : False\n","pipe['bert_sentence@sent_small_bert_L12_768'].setStorageRef('sent_small_bert_L12_768') | Info: unique reference name for identification | Currently set to : sent_small_bert_L12_768\n",">>> pipe['sentiment_dl@sent_small_bert_L12_768'] has settable params:\n","pipe['sentiment_dl@sent_small_bert_L12_768'].setThreshold(0.6) | Info: The minimum threshold for the final result otheriwse it will be neutral | Currently set to : 0.6\n","pipe['sentiment_dl@sent_small_bert_L12_768'].setThresholdLabel('neutral') | Info: In case the score is less than threshold, what should be the label. Default is neutral. | Currently set to : neutral\n","pipe['sentiment_dl@sent_small_bert_L12_768'].setClasses(['positive', 'negative']) | Info: get the tags used to trained this SentimentDLModel | Currently set to : ['positive', 'negative']\n","pipe['sentiment_dl@sent_small_bert_L12_768'].setStorageRef('sent_small_bert_L12_768') | Info: unique reference name for identification | Currently set to : sent_small_bert_L12_768\n"],"name":"stdout"}]},{"cell_type":"code","metadata":{"id":"aq3RCRU4wHsv"},"source":[""],"execution_count":null,"outputs":[]}]} \ No newline at end of file +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": { + "id": "zkufh760uvF3" + }, + "source": [ + "![JohnSnowLabs](https://nlp.johnsnowlabs.com/assets/images/logo.png)\n", + "\n", + "[![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/JohnSnowLabs/nlu/blob/master/examples/colab/Training/binary_text_classification/NLU_training_sarcasam_classifier_demo_news_headlines.ipynb)\n", + "\n", + "\n", + "# Training a Sentiment Analysis Classifier with NLU\n", + "## 2 Class News Headlines Sarcasam Training\n", + "With the [SentimentDL model](https://nlp.johnsnowlabs.com/docs/en/annotators#sentimentdl-multi-class-sentiment-analysis-annotator) from Spark NLP you can achieve State Of the Art results on any multi class text classification problem\n", + "\n", + "This notebook showcases the following features :\n", + "\n", + "- How to train the deep learning classifier\n", + "- How to store a pipeline to disk\n", + "- How to load the pipeline from disk (Enables NLU offline mode)\n", + "\n", + "You can achieve these results or even better on this dataset with training data:\n", + "\n", + "\n", + "
\n", + "\n", + "![img.png](data:image/png;base64,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)\n", + "\n", + "You can achieve these results or even better on this dataset with test data:\n", + "\n", + "\n", + "
\n", + "\n", + "![Screenshot 2021-02-25 150812.png](data:image/png;base64,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)\n", + "\n", + "\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "dur2drhW5Rvi" + }, + "source": [ + "# 1. Colab Setup" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "hFGnBCHavltY" + }, + "outputs": [], + "source": [ + "! pip install -q johnsnowlabs" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "f4KkTfnR5Ugg" + }, + "source": [ + "# 2. Download News Headlines Sarcsam dataset\n", + "https://www.kaggle.com/rmisra/news-headlines-dataset-for-sarcasm-detection\n", + "#Context\n", + "Past studies in Sarcasm Detection mostly make use of Twitter datasets collected using hashtag based supervision but such datasets are noisy in terms of labels and language. Furthermore, many tweets are replies to other tweets and detecting sarcasm in these requires the availability of contextual tweets.\n", + "\n", + "To overcome the limitations related to noise in Twitter datasets, this News Headlines dataset for Sarcasm Detection is collected from two news website. TheOnion aims at producing sarcastic versions of current events and we collected all the headlines from News in Brief and News in Photos categories (which are sarcastic). We collect real (and non-sarcastic) news headlines from HuffPost.\n", + "\n", + "This new dataset has following advantages over the existing Twitter datasets:\n", + "\n", + "Since news headlines are written by professionals in a formal manner, there are no spelling mistakes and informal usage. This reduces the sparsity and also increases the chance of finding pre-trained embeddings.\n", + "\n", + "Furthermore, since the sole purpose of TheOnion is to publish sarcastic news, we get high-quality labels with much less noise as compared to Twitter datasets.\n", + "\n", + "Unlike tweets which are replies to other tweets, the news headlines we obtained are self-contained. This would help us in teasing apart the real sarcastic elements.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "OrVb5ZMvvrQD" + }, + "outputs": [], + "source": [ + "! wget https://s3.amazonaws.com/auxdata.johnsnowlabs.com/public/resources/en/classifier-dl/Sarcasm_Headlines/Sarcasm_Headlines_Dataset_v2.csv\n" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 424 + }, + "id": "y4xSRWIhwT28", + "outputId": "3b062b61-bd33-4f03-902e-066900be06d1" + }, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + "
\n", + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \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", + "
ytext
1875negativethis t. rex dominates 'american ninja warrior'...
11997negativecomputer science in vietnam: counting down to ...
315positivedhs announces racial profiling free-for-all th...
16252negativethe best rent the runway dresses for bridesmaids
12178negativeabe's visit will remind americans china's powe...
.........
10908positivesudden death of aunt creates rupture in family...
17451negativeover 50% of lgbtq youths struggle with eating ...
16032negativegop senator: my family went from 'cotton to co...
17823negativemartin o'malley fails to make ohio's president...
14495positivenra says parkland students should be grateful ...
\n", + "

22895 rows × 2 columns

\n", + "
\n", + "
\n", + "\n", + "
\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "
\n", + "\n", + "\n", + "
\n", + " \n", + "\n", + "\n", + "\n", + " \n", + "
\n", + "
\n", + "
\n" + ], + "text/plain": [ + " y text\n", + "1875 negative this t. rex dominates 'american ninja warrior'...\n", + "11997 negative computer science in vietnam: counting down to ...\n", + "315 positive dhs announces racial profiling free-for-all th...\n", + "16252 negative the best rent the runway dresses for bridesmaids\n", + "12178 negative abe's visit will remind americans china's powe...\n", + "... ... ...\n", + "10908 positive sudden death of aunt creates rupture in family...\n", + "17451 negative over 50% of lgbtq youths struggle with eating ...\n", + "16032 negative gop senator: my family went from 'cotton to co...\n", + "17823 negative martin o'malley fails to make ohio's president...\n", + "14495 positive nra says parkland students should be grateful ...\n", + "\n", + "[22895 rows x 2 columns]" + ] + }, + "execution_count": 3, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "import pandas as pd\n", + "test_path = '/content/Sarcasm_Headlines_Dataset_v2.csv'\n", + "train_df = pd.read_csv(test_path,sep=\",\")\n", + "cols = [\"y\",\"text\"]\n", + "train_df = train_df[cols]\n", + "from sklearn.model_selection import train_test_split\n", + "train_df, test_df = train_test_split(train_df, test_size=0.2)\n", + "train_df\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "0296Om2C5anY" + }, + "source": [ + "# 3. Train Deep Learning Classifier using nlu.load('train.sentiment')\n", + "\n", + "You dataset label column should be named 'y' and the feature column with text data should be named 'text'" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 1000 + }, + "id": "3ZIPkRkWftBG", + "outputId": "d880ec91-023e-4f75-a687-94825d7ea1b5" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Warning::Spark Session already created, some configs may not take.\n", + "sent_small_bert_L2_128 download started this may take some time.\n", + "Approximate size to download 16.1 MB\n", + "[OK!]\n", + " precision recall f1-score support\n", + "\n", + " negative 0.00 0.00 0.00 22\n", + " positive 0.56 1.00 0.72 28\n", + "\n", + " accuracy 0.56 50\n", + " macro avg 0.28 0.50 0.36 50\n", + "weighted avg 0.31 0.56 0.40 50\n", + "\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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + "
documentsentence_embedding_small_bert_L2_128sentimentsentiment_confidencetexty
0kids in bus accident mocked by kids in passing...[-0.7924436926841736, -0.07141707092523575, -0...positive0.0kids in bus accident mocked by kids in passing...positive
1these two words are stealing your freedom[-1.028885006904602, -0.7214630246162415, 0.12...positive0.0these two words are stealing your freedomnegative
2bush vows to do 'that thing gore just said, on...[-1.7108917236328125, 0.2942552864551544, -0.3...positive0.0bush vows to do 'that thing gore just said, on...positive
3scotland's parliament backs new independence r...[0.14012272655963898, 0.7012102603912354, -0.0...positive0.0scotland's parliament backs new independence r...negative
4joe biden: being vice president is 'a bitch'[-0.571045458316803, 0.5463784337043762, -0.17...positive0.0joe biden: being vice president is 'a bitch'negative
5u.s. army now just chasing single remaining is...[-0.9116203188896179, -0.3868906497955322, -0....positive0.0u.s. army now just chasing single remaining is...positive
6sheryl crow's freshness date expires[-1.388686180114746, 0.5200713872909546, -0.43...positive0.0sheryl crow's freshness date expirespositive
7new ebola quarantine protocol seen as barrier ...[-0.6295406222343445, 0.43973761796951294, -0....positive0.0new ebola quarantine protocol seen as barrier ...negative
8the secret to building a successful business t...[-0.1442088484764099, 0.5362765192985535, -0.5...positive0.0the secret to building a successful business t...negative
9school for crime[-1.4345587491989136, 0.35326844453811646, -1....positive0.0school for crimenegative
10want to increase trust? increase your say/do r...[-1.2950726747512817, 1.153881311416626, -0.36...positive0.0want to increase trust? increase your say/do r...negative
11when autocorrect and sexting collide[-1.1433782577514648, 0.25382623076438904, -0....positive0.0when autocorrect and sexting collidenegative
12the house science committee doesn't seem to un...[-0.24199619889259338, 0.8295924663543701, -0....positive0.0the house science committee doesn't seem to un...negative
13eric clapton wows audience with even slower ve...[-0.12445597350597382, -0.2018168419599533, 0....positive0.0eric clapton wows audience with even slower ve...positive
14rick perry returning to iowa[-1.3457694053649902, 0.5665305852890015, -0.5...positive0.0rick perry returning to iowanegative
15one beer can't do local alcoholic any harm[-1.3927576541900635, 0.6284745335578918, -0.5...positive0.0one beer can't do local alcoholic any harmpositive
16couple at point where they're comfortable usin...[-1.5534732341766357, 0.2146364003419876, -0.6...positive0.0couple at point where they're comfortable usin...positive
17watch how mountains of trash spread across the...[-1.8412539958953857, 0.1492537260055542, -0.0...positive0.0watch how mountains of trash spread across the...negative
18lowly mortal opens portal to hell[-0.8720283508300781, -1.011899709701538, -0.3...positive0.0lowly mortal opens portal to hellpositive
19stephen hawking reportedly working on juicy te...[-0.7349460124969482, -0.011331072077155113, 0...positive0.0stephen hawking reportedly working on juicy te...positive
20offshorers demand: no taxes, no risk[-1.0823032855987549, 1.29856276512146, -0.915...positive0.0offshorers demand: no taxes, no risknegative
21troubling study finds majority of americans wh...[-0.7015470862388611, -0.17110034823417664, -0...positive0.0troubling study finds majority of americans wh...positive
22annoying man more annoying after skydiving[-1.4149224758148193, -1.0473958253860474, 0.1...positive6.0annoying man more annoying after skydivingpositive
23robin hood foundation[-0.057901788502931595, 0.8722413778305054, -0...positive0.0robin hood foundationnegative
24passenger glued to airplane window like it fuc...[-0.33463752269744873, 0.7636221051216125, -0....positive0.0passenger glued to airplane window like it fuc...positive
25amazingly humanlike robot able to commit thous...[-1.2185980081558228, -0.9673603177070618, -0....positive0.0amazingly humanlike robot able to commit thous...positive
26tourists describe scenes of horror in tunisian...[-1.1378378868103027, -1.2116812467575073, -0....positive0.0tourists describe scenes of horror in tunisian...negative
27is your christmas present spying on you?[-0.8687025308609009, -0.0924399271607399, -0....positive0.0is your christmas present spying on you?negative
28area man busts his ass all day, and for what?[-2.376340627670288, -0.3160030245780945, -0.4...positive0.0area man busts his ass all day, and for what?positive
29department of interior employee caught embezzl...[-1.1687604188919067, 0.5776483416557312, -0.6...positive0.0department of interior employee caught embezzl...positive
30new software yellows neglected digital photos ...[-0.773508608341217, 0.5193011164665222, -0.54...positive0.0new software yellows neglected digital photos ...positive
31read live updates on the cnn democratic debate[-1.1500324010849, -0.5574671626091003, 0.3618...positive0.0read live updates on the cnn democratic debatenegative
32new poultry stripe gum hardly tastes like goos...[-1.2104802131652832, 0.2168104648590088, -0.0...positive0.0new poultry stripe gum hardly tastes like goos...positive
33new film takes an honest look at life with a t...[-0.27279043197631836, -0.44589897990226746, -...positive0.0new film takes an honest look at life with a t...negative
34vice president pence pushes expansive nato and...[0.06816250830888748, 0.562971830368042, -0.57...positive0.0vice president pence pushes expansive nato and...negative
35mom tucks handwritten guide on how to use netf...[-1.1668932437896729, 0.6492086052894592, -0.3...positive0.0mom tucks handwritten guide on how to use netf...positive
36man insists facebook friend actually reads 'wh...[-0.41535136103630066, -0.6858690977096558, -0...positive0.0man insists facebook friend actually reads 'wh...positive
37internet explorer makes desperate overture to ...[-0.058107126504182816, -0.19895373284816742, ...positive0.0internet explorer makes desperate overture to ...positive
38rock song takes pro-rock stance[-0.8466075658798218, -0.350190132856369, 0.33...positive0.0rock song takes pro-rock stancepositive
39college still looking for absolute saddest pla...[-0.8797492384910583, -0.09284910559654236, -0...positive0.0college still looking for absolute saddest pla...positive
40alton sterling's family demands action from ba...[-1.123725175857544, 0.27766698598861694, -0.4...positive0.0alton sterling's family demands action from ba...negative
41ronda rousey wants to show you how ripped she ...[-0.704077959060669, 0.4832143783569336, -0.43...positive0.0ronda rousey wants to show you how ripped she ...negative
42the workplace revolution: adding company cultu...[-0.6472877860069275, 0.819389283657074, -0.50...positive0.0the workplace revolution: adding company cultu...negative
43wolf blitzer walks into middle of olive garden...[-1.089509129524231, -0.010750504210591316, -0...positive0.0wolf blitzer walks into middle of olive garden...positive
44grandchild, grandfather equally dreading colla...[-0.9178588390350342, -0.05760730057954788, -0...positive0.0grandchild, grandfather equally dreading colla...positive
45congress reassures nervous zuckerberg they won...[-0.723938524723053, 0.5092206597328186, -0.02...positive0.0congress reassures nervous zuckerberg they won...positive
46senators lured back to emergency session by pr...[-2.088550567626953, 0.19368097186088562, -0.7...positive0.0senators lured back to emergency session by pr...positive
47powerball officials remove plastic balls from ...[-1.236419916152954, 0.6744992733001709, -0.52...positive9.0powerball officials remove plastic balls from ...positive
48rude guy unfortunately says something funny[-0.9946603775024414, -0.6593665480613708, 0.3...positive0.0rude guy unfortunately says something funnypositive
49the room i carry with me[-1.4270148277282715, 0.47338584065437317, -0....positive0.0the room i carry with menegative
\n", + "
\n", + "
\n", + "\n", + "
\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "
\n", + "\n", + "\n", + "
\n", + " \n", + "\n", + "\n", + "\n", + " \n", + "
\n", + "
\n", + "
\n" + ], + "text/plain": [ + " document \\\n", + "0 kids in bus accident mocked by kids in passing... \n", + "1 these two words are stealing your freedom \n", + "2 bush vows to do 'that thing gore just said, on... \n", + "3 scotland's parliament backs new independence r... \n", + "4 joe biden: being vice president is 'a bitch' \n", + "5 u.s. army now just chasing single remaining is... \n", + "6 sheryl crow's freshness date expires \n", + "7 new ebola quarantine protocol seen as barrier ... \n", + "8 the secret to building a successful business t... \n", + "9 school for crime \n", + "10 want to increase trust? increase your say/do r... \n", + "11 when autocorrect and sexting collide \n", + "12 the house science committee doesn't seem to un... \n", + "13 eric clapton wows audience with even slower ve... \n", + "14 rick perry returning to iowa \n", + "15 one beer can't do local alcoholic any harm \n", + "16 couple at point where they're comfortable usin... \n", + "17 watch how mountains of trash spread across the... \n", + "18 lowly mortal opens portal to hell \n", + "19 stephen hawking reportedly working on juicy te... \n", + "20 offshorers demand: no taxes, no risk \n", + "21 troubling study finds majority of americans wh... \n", + "22 annoying man more annoying after skydiving \n", + "23 robin hood foundation \n", + "24 passenger glued to airplane window like it fuc... \n", + "25 amazingly humanlike robot able to commit thous... \n", + "26 tourists describe scenes of horror in tunisian... \n", + "27 is your christmas present spying on you? \n", + "28 area man busts his ass all day, and for what? \n", + "29 department of interior employee caught embezzl... \n", + "30 new software yellows neglected digital photos ... \n", + "31 read live updates on the cnn democratic debate \n", + "32 new poultry stripe gum hardly tastes like goos... \n", + "33 new film takes an honest look at life with a t... \n", + "34 vice president pence pushes expansive nato and... \n", + "35 mom tucks handwritten guide on how to use netf... \n", + "36 man insists facebook friend actually reads 'wh... \n", + "37 internet explorer makes desperate overture to ... \n", + "38 rock song takes pro-rock stance \n", + "39 college still looking for absolute saddest pla... \n", + "40 alton sterling's family demands action from ba... \n", + "41 ronda rousey wants to show you how ripped she ... \n", + "42 the workplace revolution: adding company cultu... \n", + "43 wolf blitzer walks into middle of olive garden... \n", + "44 grandchild, grandfather equally dreading colla... \n", + "45 congress reassures nervous zuckerberg they won... \n", + "46 senators lured back to emergency session by pr... \n", + "47 powerball officials remove plastic balls from ... \n", + "48 rude guy unfortunately says something funny \n", + "49 the room i carry with me \n", + "\n", + " sentence_embedding_small_bert_L2_128 sentiment \\\n", + "0 [-0.7924436926841736, -0.07141707092523575, -0... positive \n", + "1 [-1.028885006904602, -0.7214630246162415, 0.12... positive \n", + "2 [-1.7108917236328125, 0.2942552864551544, -0.3... positive \n", + "3 [0.14012272655963898, 0.7012102603912354, -0.0... positive \n", + "4 [-0.571045458316803, 0.5463784337043762, -0.17... positive \n", + "5 [-0.9116203188896179, -0.3868906497955322, -0.... positive \n", + "6 [-1.388686180114746, 0.5200713872909546, -0.43... positive \n", + "7 [-0.6295406222343445, 0.43973761796951294, -0.... positive \n", + "8 [-0.1442088484764099, 0.5362765192985535, -0.5... positive \n", + "9 [-1.4345587491989136, 0.35326844453811646, -1.... positive \n", + "10 [-1.2950726747512817, 1.153881311416626, -0.36... positive \n", + "11 [-1.1433782577514648, 0.25382623076438904, -0.... positive \n", + "12 [-0.24199619889259338, 0.8295924663543701, -0.... positive \n", + "13 [-0.12445597350597382, -0.2018168419599533, 0.... positive \n", + "14 [-1.3457694053649902, 0.5665305852890015, -0.5... positive \n", + "15 [-1.3927576541900635, 0.6284745335578918, -0.5... positive \n", + "16 [-1.5534732341766357, 0.2146364003419876, -0.6... positive \n", + "17 [-1.8412539958953857, 0.1492537260055542, -0.0... positive \n", + "18 [-0.8720283508300781, -1.011899709701538, -0.3... positive \n", + "19 [-0.7349460124969482, -0.011331072077155113, 0... positive \n", + "20 [-1.0823032855987549, 1.29856276512146, -0.915... positive \n", + "21 [-0.7015470862388611, -0.17110034823417664, -0... positive \n", + "22 [-1.4149224758148193, -1.0473958253860474, 0.1... positive \n", + "23 [-0.057901788502931595, 0.8722413778305054, -0... positive \n", + "24 [-0.33463752269744873, 0.7636221051216125, -0.... positive \n", + "25 [-1.2185980081558228, -0.9673603177070618, -0.... positive \n", + "26 [-1.1378378868103027, -1.2116812467575073, -0.... positive \n", + "27 [-0.8687025308609009, -0.0924399271607399, -0.... positive \n", + "28 [-2.376340627670288, -0.3160030245780945, -0.4... positive \n", + "29 [-1.1687604188919067, 0.5776483416557312, -0.6... positive \n", + "30 [-0.773508608341217, 0.5193011164665222, -0.54... positive \n", + "31 [-1.1500324010849, -0.5574671626091003, 0.3618... positive \n", + "32 [-1.2104802131652832, 0.2168104648590088, -0.0... positive \n", + "33 [-0.27279043197631836, -0.44589897990226746, -... positive \n", + "34 [0.06816250830888748, 0.562971830368042, -0.57... positive \n", + "35 [-1.1668932437896729, 0.6492086052894592, -0.3... positive \n", + "36 [-0.41535136103630066, -0.6858690977096558, -0... positive \n", + "37 [-0.058107126504182816, -0.19895373284816742, ... positive \n", + "38 [-0.8466075658798218, -0.350190132856369, 0.33... positive \n", + "39 [-0.8797492384910583, -0.09284910559654236, -0... positive \n", + "40 [-1.123725175857544, 0.27766698598861694, -0.4... positive \n", + "41 [-0.704077959060669, 0.4832143783569336, -0.43... positive \n", + "42 [-0.6472877860069275, 0.819389283657074, -0.50... positive \n", + "43 [-1.089509129524231, -0.010750504210591316, -0... positive \n", + "44 [-0.9178588390350342, -0.05760730057954788, -0... positive \n", + "45 [-0.723938524723053, 0.5092206597328186, -0.02... positive \n", + "46 [-2.088550567626953, 0.19368097186088562, -0.7... positive \n", + "47 [-1.236419916152954, 0.6744992733001709, -0.52... positive \n", + "48 [-0.9946603775024414, -0.6593665480613708, 0.3... positive \n", + "49 [-1.4270148277282715, 0.47338584065437317, -0.... positive \n", + "\n", + " sentiment_confidence text \\\n", + "0 0.0 kids in bus accident mocked by kids in passing... \n", + "1 0.0 these two words are stealing your freedom \n", + "2 0.0 bush vows to do 'that thing gore just said, on... \n", + "3 0.0 scotland's parliament backs new independence r... \n", + "4 0.0 joe biden: being vice president is 'a bitch' \n", + "5 0.0 u.s. army now just chasing single remaining is... \n", + "6 0.0 sheryl crow's freshness date expires \n", + "7 0.0 new ebola quarantine protocol seen as barrier ... \n", + "8 0.0 the secret to building a successful business t... \n", + "9 0.0 school for crime \n", + "10 0.0 want to increase trust? increase your say/do r... \n", + "11 0.0 when autocorrect and sexting collide \n", + "12 0.0 the house science committee doesn't seem to un... \n", + "13 0.0 eric clapton wows audience with even slower ve... \n", + "14 0.0 rick perry returning to iowa \n", + "15 0.0 one beer can't do local alcoholic any harm \n", + "16 0.0 couple at point where they're comfortable usin... \n", + "17 0.0 watch how mountains of trash spread across the... \n", + "18 0.0 lowly mortal opens portal to hell \n", + "19 0.0 stephen hawking reportedly working on juicy te... \n", + "20 0.0 offshorers demand: no taxes, no risk \n", + "21 0.0 troubling study finds majority of americans wh... \n", + "22 6.0 annoying man more annoying after skydiving \n", + "23 0.0 robin hood foundation \n", + "24 0.0 passenger glued to airplane window like it fuc... \n", + "25 0.0 amazingly humanlike robot able to commit thous... \n", + "26 0.0 tourists describe scenes of horror in tunisian... \n", + "27 0.0 is your christmas present spying on you? \n", + "28 0.0 area man busts his ass all day, and for what? \n", + "29 0.0 department of interior employee caught embezzl... \n", + "30 0.0 new software yellows neglected digital photos ... \n", + "31 0.0 read live updates on the cnn democratic debate \n", + "32 0.0 new poultry stripe gum hardly tastes like goos... \n", + "33 0.0 new film takes an honest look at life with a t... \n", + "34 0.0 vice president pence pushes expansive nato and... \n", + "35 0.0 mom tucks handwritten guide on how to use netf... \n", + "36 0.0 man insists facebook friend actually reads 'wh... \n", + "37 0.0 internet explorer makes desperate overture to ... \n", + "38 0.0 rock song takes pro-rock stance \n", + "39 0.0 college still looking for absolute saddest pla... \n", + "40 0.0 alton sterling's family demands action from ba... \n", + "41 0.0 ronda rousey wants to show you how ripped she ... \n", + "42 0.0 the workplace revolution: adding company cultu... \n", + "43 0.0 wolf blitzer walks into middle of olive garden... \n", + "44 0.0 grandchild, grandfather equally dreading colla... \n", + "45 0.0 congress reassures nervous zuckerberg they won... \n", + "46 0.0 senators lured back to emergency session by pr... \n", + "47 9.0 powerball officials remove plastic balls from ... \n", + "48 0.0 rude guy unfortunately says something funny \n", + "49 0.0 the room i carry with me \n", + "\n", + " y \n", + "0 positive \n", + "1 negative \n", + "2 positive \n", + "3 negative \n", + "4 negative \n", + "5 positive \n", + "6 positive \n", + "7 negative \n", + "8 negative \n", + "9 negative \n", + "10 negative \n", + "11 negative \n", + "12 negative \n", + "13 positive \n", + "14 negative \n", + "15 positive \n", + "16 positive \n", + "17 negative \n", + "18 positive \n", + "19 positive \n", + "20 negative \n", + "21 positive \n", + "22 positive \n", + "23 negative \n", + "24 positive \n", + "25 positive \n", + "26 negative \n", + "27 negative \n", + "28 positive \n", + "29 positive \n", + "30 positive \n", + "31 negative \n", + "32 positive \n", + "33 negative \n", + "34 negative \n", + "35 positive \n", + "36 positive \n", + "37 positive \n", + "38 positive \n", + "39 positive \n", + "40 negative \n", + "41 negative \n", + "42 negative \n", + "43 positive \n", + "44 positive \n", + "45 positive \n", + "46 positive \n", + "47 positive \n", + "48 positive \n", + "49 negative " + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "from johnsnowlabs import nlp\n", + "from sklearn.metrics import classification_report\n", + "\n", + "# load a trainable pipeline by specifying the train. prefix and fit it on a datset with label and text columns\n", + "# by default the Universal Sentence Encoder (USE) Sentence embeddings are used for generation\n", + "trainable_pipe = nlp.load('train.sentiment')\n", + "fitted_pipe = trainable_pipe.fit(train_df.iloc[:50])\n", + "\n", + "# predict with the trainable pipeline on dataset and get predictions\n", + "preds = fitted_pipe.predict(train_df.iloc[:50],output_level='document')\n", + "#sentence detector that is part of the pipe generates sone NaNs. lets drop them first\n", + "preds.dropna(inplace=True)\n", + "\n", + "print(classification_report(preds['y'], preds['sentiment']))\n", + "\n", + "preds" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "lVyOE2wV0fw_" + }, + "source": [ + "# 4. Test the fitted pipe on new example" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 150 + }, + "id": "qdCUg2MR0PD2", + "outputId": "dd1009b1-8146-4cfa-8be5-b9ab14e444ec" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "sentence_detector_dl download started this may take some time.\n", + "Approximate size to download 354.6 KB\n", + "[OK!]\n", + "Warning::Spark Session already created, some configs may not take.\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", + "
sentencesentence_embedding_small_bert_L2_128sentimentsentiment_confidence
0Aliens are immortal![-0.6534902453422546, -1.4232430458068848, -0....positive0.989048
\n", + "
\n", + "
\n", + "\n", + "
\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "
\n", + "\n", + "
\n", + "
\n" + ], + "text/plain": [ + " sentence sentence_embedding_small_bert_L2_128 \\\n", + "0 Aliens are immortal! [-0.6534902453422546, -1.4232430458068848, -0.... \n", + "\n", + " sentiment sentiment_confidence \n", + "0 positive 0.989048 " + ] + }, + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "fitted_pipe.predict('Aliens are immortal!')\n" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "xflpwrVjjBVD" + }, + "source": [ + "## 5. Configure pipe training parameters" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "UtsAUGTmOTms", + "outputId": "9977460e-1f6e-497a-ca9c-2d78957f7aa2" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "The following parameters are configurable for this NLU pipeline (You can copy paste the examples) :\n", + ">>> component_list['bert_sentence_embeddings@sent_small_bert_L2_128'] has settable params:\n", + "component_list['bert_sentence_embeddings@sent_small_bert_L2_128'].setBatchSize(8) | Info: Size of every batch | Currently set to : 8\n", + "component_list['bert_sentence_embeddings@sent_small_bert_L2_128'].setEngine('tensorflow') | Info: Deep Learning engine used for this model | Currently set to : tensorflow\n", + "component_list['bert_sentence_embeddings@sent_small_bert_L2_128'].setIsLong(False) | Info: Use Long type instead of Int type for inputs buffer - Some Bert models require Long instead of Int. | Currently set to : False\n", + "component_list['bert_sentence_embeddings@sent_small_bert_L2_128'].setMaxSentenceLength(128) | Info: Max sentence length to process | Currently set to : 128\n", + "component_list['bert_sentence_embeddings@sent_small_bert_L2_128'].setDimension(128) | Info: Number of embedding dimensions | Currently set to : 128\n", + "component_list['bert_sentence_embeddings@sent_small_bert_L2_128'].setCaseSensitive(False) | Info: whether to ignore case in tokens for embeddings matching | Currently set to : False\n", + "component_list['bert_sentence_embeddings@sent_small_bert_L2_128'].setStorageRef('sent_small_bert_L2_128') | Info: unique reference name for identification | Currently set to : sent_small_bert_L2_128\n", + ">>> component_list['document_assembler'] has settable params:\n", + "component_list['document_assembler'].setCleanupMode('shrink') | Info: possible values: disabled, inplace, inplace_full, shrink, shrink_full, each, each_full, delete_full | Currently set to : shrink\n", + ">>> component_list['sentiment_dl@sent_small_bert_L2_128'] has settable params:\n", + "component_list['sentiment_dl@sent_small_bert_L2_128'].setEngine('tensorflow') | Info: Deep Learning engine used for this model | Currently set to : tensorflow\n", + "component_list['sentiment_dl@sent_small_bert_L2_128'].setThreshold(0.6) | Info: The minimum threshold for the final result otheriwse it will be neutral | Currently set to : 0.6\n", + "component_list['sentiment_dl@sent_small_bert_L2_128'].setThresholdLabel('neutral') | Info: In case the score is less than threshold, what should be the label. Default is neutral. | Currently set to : neutral\n", + "component_list['sentiment_dl@sent_small_bert_L2_128'].setStorageRef('sent_small_bert_L2_128') | Info: unique reference name for identification | Currently set to : sent_small_bert_L2_128\n" + ] + } + ], + "source": [ + "trainable_pipe.print_info()" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "2GJdDNV9jEIe" + }, + "source": [ + "## 6. Retrain with new parameters" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 1000 + }, + "id": "mptfvHx-MMMX", + "outputId": "2a8a4c62-02a1-48d4-8331-990e1268c030" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Warning::Spark Session already created, some configs may not take.\n", + "Warning::Spark Session already created, some configs may not take.\n", + "sent_small_bert_L2_128 download started this may take some time.\n", + "Approximate size to download 16.1 MB\n", + "[OK!]\n", + " precision recall f1-score support\n", + "\n", + " negative 0.44 1.00 0.61 22\n", + " positive 0.00 0.00 0.00 28\n", + "\n", + " accuracy 0.44 50\n", + " macro avg 0.22 0.50 0.31 50\n", + "weighted avg 0.19 0.44 0.27 50\n", + "\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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + "
documentsentence_embedding_small_bert_L2_128sentimentsentiment_confidencetexty
0kids in bus accident mocked by kids in passing...[-0.7924436926841736, -0.07141707092523575, -0...negative7.0kids in bus accident mocked by kids in passing...positive
1these two words are stealing your freedom[-1.028885006904602, -0.7214630246162415, 0.12...negative1.0these two words are stealing your freedomnegative
2bush vows to do 'that thing gore just said, on...[-1.7108917236328125, 0.2942552864551544, -0.3...negative1.0bush vows to do 'that thing gore just said, on...positive
3scotland's parliament backs new independence r...[0.14012272655963898, 0.7012102603912354, -0.0...negative5.0scotland's parliament backs new independence r...negative
4joe biden: being vice president is 'a bitch'[-0.571045458316803, 0.5463784337043762, -0.17...negative2.0joe biden: being vice president is 'a bitch'negative
5u.s. army now just chasing single remaining is...[-0.9116203188896179, -0.3868906497955322, -0....negative1.0u.s. army now just chasing single remaining is...positive
6sheryl crow's freshness date expires[-1.388686180114746, 0.5200713872909546, -0.43...negative1.0sheryl crow's freshness date expirespositive
7new ebola quarantine protocol seen as barrier ...[-0.6295406222343445, 0.43973761796951294, -0....negative1.0new ebola quarantine protocol seen as barrier ...negative
8the secret to building a successful business t...[-0.1442088484764099, 0.5362765192985535, -0.5...negative4.0the secret to building a successful business t...negative
9school for crime[-1.4345587491989136, 0.35326844453811646, -1....negative1.0school for crimenegative
10want to increase trust? increase your say/do r...[-1.2950726747512817, 1.153881311416626, -0.36...negative1.0want to increase trust? increase your say/do r...negative
11when autocorrect and sexting collide[-1.1433782577514648, 0.25382623076438904, -0....negative1.0when autocorrect and sexting collidenegative
12the house science committee doesn't seem to un...[-0.24199619889259338, 0.8295924663543701, -0....negative7.0the house science committee doesn't seem to un...negative
13eric clapton wows audience with even slower ve...[-0.12445597350597382, -0.2018168419599533, 0....negative6.0eric clapton wows audience with even slower ve...positive
14rick perry returning to iowa[-1.3457694053649902, 0.5665305852890015, -0.5...negative1.0rick perry returning to iowanegative
15one beer can't do local alcoholic any harm[-1.3927576541900635, 0.6284745335578918, -0.5...negative6.0one beer can't do local alcoholic any harmpositive
16couple at point where they're comfortable usin...[-1.5534732341766357, 0.2146364003419876, -0.6...negative2.0couple at point where they're comfortable usin...positive
17watch how mountains of trash spread across the...[-1.8412539958953857, 0.1492537260055542, -0.0...negative4.0watch how mountains of trash spread across the...negative
18lowly mortal opens portal to hell[-0.8720283508300781, -1.011899709701538, -0.3...negative6.0lowly mortal opens portal to hellpositive
19stephen hawking reportedly working on juicy te...[-0.7349460124969482, -0.011331072077155113, 0...negative5.0stephen hawking reportedly working on juicy te...positive
20offshorers demand: no taxes, no risk[-1.0823032855987549, 1.29856276512146, -0.915...negative2.0offshorers demand: no taxes, no risknegative
21troubling study finds majority of americans wh...[-0.7015470862388611, -0.17110034823417664, -0...negative5.0troubling study finds majority of americans wh...positive
22annoying man more annoying after skydiving[-1.4149224758148193, -1.0473958253860474, 0.1...negative1.0annoying man more annoying after skydivingpositive
23robin hood foundation[-0.057901788502931595, 0.8722413778305054, -0...negative6.0robin hood foundationnegative
24passenger glued to airplane window like it fuc...[-0.33463752269744873, 0.7636221051216125, -0....negative1.0passenger glued to airplane window like it fuc...positive
25amazingly humanlike robot able to commit thous...[-1.2185980081558228, -0.9673603177070618, -0....negative3.0amazingly humanlike robot able to commit thous...positive
26tourists describe scenes of horror in tunisian...[-1.1378378868103027, -1.2116812467575073, -0....negative5.0tourists describe scenes of horror in tunisian...negative
27is your christmas present spying on you?[-0.8687025308609009, -0.0924399271607399, -0....negative3.0is your christmas present spying on you?negative
28area man busts his ass all day, and for what?[-2.376340627670288, -0.3160030245780945, -0.4...negative5.0area man busts his ass all day, and for what?positive
29department of interior employee caught embezzl...[-1.1687604188919067, 0.5776483416557312, -0.6...negative2.0department of interior employee caught embezzl...positive
30new software yellows neglected digital photos ...[-0.773508608341217, 0.5193011164665222, -0.54...negative9.0new software yellows neglected digital photos ...positive
31read live updates on the cnn democratic debate[-1.1500324010849, -0.5574671626091003, 0.3618...negative8.0read live updates on the cnn democratic debatenegative
32new poultry stripe gum hardly tastes like goos...[-1.2104802131652832, 0.2168104648590088, -0.0...negative1.0new poultry stripe gum hardly tastes like goos...positive
33new film takes an honest look at life with a t...[-0.27279043197631836, -0.44589897990226746, -...negative4.0new film takes an honest look at life with a t...negative
34vice president pence pushes expansive nato and...[0.06816250830888748, 0.562971830368042, -0.57...negative3.0vice president pence pushes expansive nato and...negative
35mom tucks handwritten guide on how to use netf...[-1.1668932437896729, 0.6492086052894592, -0.3...negative2.0mom tucks handwritten guide on how to use netf...positive
36man insists facebook friend actually reads 'wh...[-0.41535136103630066, -0.6858690977096558, -0...negative7.0man insists facebook friend actually reads 'wh...positive
37internet explorer makes desperate overture to ...[-0.058107126504182816, -0.19895373284816742, ...negative2.0internet explorer makes desperate overture to ...positive
38rock song takes pro-rock stance[-0.8466075658798218, -0.350190132856369, 0.33...negative4.0rock song takes pro-rock stancepositive
39college still looking for absolute saddest pla...[-0.8797492384910583, -0.09284910559654236, -0...negative9.0college still looking for absolute saddest pla...positive
40alton sterling's family demands action from ba...[-1.123725175857544, 0.27766698598861694, -0.4...negative3.0alton sterling's family demands action from ba...negative
41ronda rousey wants to show you how ripped she ...[-0.704077959060669, 0.4832143783569336, -0.43...negative1.0ronda rousey wants to show you how ripped she ...negative
42the workplace revolution: adding company cultu...[-0.6472877860069275, 0.819389283657074, -0.50...negative2.0the workplace revolution: adding company cultu...negative
43wolf blitzer walks into middle of olive garden...[-1.089509129524231, -0.010750504210591316, -0...negative1.0wolf blitzer walks into middle of olive garden...positive
44grandchild, grandfather equally dreading colla...[-0.9178588390350342, -0.05760730057954788, -0...negative4.0grandchild, grandfather equally dreading colla...positive
45congress reassures nervous zuckerberg they won...[-0.723938524723053, 0.5092206597328186, -0.02...negative1.0congress reassures nervous zuckerberg they won...positive
46senators lured back to emergency session by pr...[-2.088550567626953, 0.19368097186088562, -0.7...negative3.0senators lured back to emergency session by pr...positive
47powerball officials remove plastic balls from ...[-1.236419916152954, 0.6744992733001709, -0.52...negative1.0powerball officials remove plastic balls from ...positive
48rude guy unfortunately says something funny[-0.9946603775024414, -0.6593665480613708, 0.3...negative6.0rude guy unfortunately says something funnypositive
49the room i carry with me[-1.4270148277282715, 0.47338584065437317, -0....negative4.0the room i carry with menegative
\n", + "
\n", + "
\n", + "\n", + "
\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "
\n", + "\n", + "\n", + "
\n", + " \n", + "\n", + "\n", + "\n", + " \n", + "
\n", + "
\n", + "
\n" + ], + "text/plain": [ + " document \\\n", + "0 kids in bus accident mocked by kids in passing... \n", + "1 these two words are stealing your freedom \n", + "2 bush vows to do 'that thing gore just said, on... \n", + "3 scotland's parliament backs new independence r... \n", + "4 joe biden: being vice president is 'a bitch' \n", + "5 u.s. army now just chasing single remaining is... \n", + "6 sheryl crow's freshness date expires \n", + "7 new ebola quarantine protocol seen as barrier ... \n", + "8 the secret to building a successful business t... \n", + "9 school for crime \n", + "10 want to increase trust? increase your say/do r... \n", + "11 when autocorrect and sexting collide \n", + "12 the house science committee doesn't seem to un... \n", + "13 eric clapton wows audience with even slower ve... \n", + "14 rick perry returning to iowa \n", + "15 one beer can't do local alcoholic any harm \n", + "16 couple at point where they're comfortable usin... \n", + "17 watch how mountains of trash spread across the... \n", + "18 lowly mortal opens portal to hell \n", + "19 stephen hawking reportedly working on juicy te... \n", + "20 offshorers demand: no taxes, no risk \n", + "21 troubling study finds majority of americans wh... \n", + "22 annoying man more annoying after skydiving \n", + "23 robin hood foundation \n", + "24 passenger glued to airplane window like it fuc... \n", + "25 amazingly humanlike robot able to commit thous... \n", + "26 tourists describe scenes of horror in tunisian... \n", + "27 is your christmas present spying on you? \n", + "28 area man busts his ass all day, and for what? \n", + "29 department of interior employee caught embezzl... \n", + "30 new software yellows neglected digital photos ... \n", + "31 read live updates on the cnn democratic debate \n", + "32 new poultry stripe gum hardly tastes like goos... \n", + "33 new film takes an honest look at life with a t... \n", + "34 vice president pence pushes expansive nato and... \n", + "35 mom tucks handwritten guide on how to use netf... \n", + "36 man insists facebook friend actually reads 'wh... \n", + "37 internet explorer makes desperate overture to ... \n", + "38 rock song takes pro-rock stance \n", + "39 college still looking for absolute saddest pla... \n", + "40 alton sterling's family demands action from ba... \n", + "41 ronda rousey wants to show you how ripped she ... \n", + "42 the workplace revolution: adding company cultu... \n", + "43 wolf blitzer walks into middle of olive garden... \n", + "44 grandchild, grandfather equally dreading colla... \n", + "45 congress reassures nervous zuckerberg they won... \n", + "46 senators lured back to emergency session by pr... \n", + "47 powerball officials remove plastic balls from ... \n", + "48 rude guy unfortunately says something funny \n", + "49 the room i carry with me \n", + "\n", + " sentence_embedding_small_bert_L2_128 sentiment \\\n", + "0 [-0.7924436926841736, -0.07141707092523575, -0... negative \n", + "1 [-1.028885006904602, -0.7214630246162415, 0.12... negative \n", + "2 [-1.7108917236328125, 0.2942552864551544, -0.3... negative \n", + "3 [0.14012272655963898, 0.7012102603912354, -0.0... negative \n", + "4 [-0.571045458316803, 0.5463784337043762, -0.17... negative \n", + "5 [-0.9116203188896179, -0.3868906497955322, -0.... negative \n", + "6 [-1.388686180114746, 0.5200713872909546, -0.43... negative \n", + "7 [-0.6295406222343445, 0.43973761796951294, -0.... negative \n", + "8 [-0.1442088484764099, 0.5362765192985535, -0.5... negative \n", + "9 [-1.4345587491989136, 0.35326844453811646, -1.... negative \n", + "10 [-1.2950726747512817, 1.153881311416626, -0.36... negative \n", + "11 [-1.1433782577514648, 0.25382623076438904, -0.... negative \n", + "12 [-0.24199619889259338, 0.8295924663543701, -0.... negative \n", + "13 [-0.12445597350597382, -0.2018168419599533, 0.... negative \n", + "14 [-1.3457694053649902, 0.5665305852890015, -0.5... negative \n", + "15 [-1.3927576541900635, 0.6284745335578918, -0.5... negative \n", + "16 [-1.5534732341766357, 0.2146364003419876, -0.6... negative \n", + "17 [-1.8412539958953857, 0.1492537260055542, -0.0... negative \n", + "18 [-0.8720283508300781, -1.011899709701538, -0.3... negative \n", + "19 [-0.7349460124969482, -0.011331072077155113, 0... negative \n", + "20 [-1.0823032855987549, 1.29856276512146, -0.915... negative \n", + "21 [-0.7015470862388611, -0.17110034823417664, -0... negative \n", + "22 [-1.4149224758148193, -1.0473958253860474, 0.1... negative \n", + "23 [-0.057901788502931595, 0.8722413778305054, -0... negative \n", + "24 [-0.33463752269744873, 0.7636221051216125, -0.... negative \n", + "25 [-1.2185980081558228, -0.9673603177070618, -0.... negative \n", + "26 [-1.1378378868103027, -1.2116812467575073, -0.... negative \n", + "27 [-0.8687025308609009, -0.0924399271607399, -0.... negative \n", + "28 [-2.376340627670288, -0.3160030245780945, -0.4... negative \n", + "29 [-1.1687604188919067, 0.5776483416557312, -0.6... negative \n", + "30 [-0.773508608341217, 0.5193011164665222, -0.54... negative \n", + "31 [-1.1500324010849, -0.5574671626091003, 0.3618... negative \n", + "32 [-1.2104802131652832, 0.2168104648590088, -0.0... negative \n", + "33 [-0.27279043197631836, -0.44589897990226746, -... negative \n", + "34 [0.06816250830888748, 0.562971830368042, -0.57... negative \n", + "35 [-1.1668932437896729, 0.6492086052894592, -0.3... negative \n", + "36 [-0.41535136103630066, -0.6858690977096558, -0... negative \n", + "37 [-0.058107126504182816, -0.19895373284816742, ... negative \n", + "38 [-0.8466075658798218, -0.350190132856369, 0.33... negative \n", + "39 [-0.8797492384910583, -0.09284910559654236, -0... negative \n", + "40 [-1.123725175857544, 0.27766698598861694, -0.4... negative \n", + "41 [-0.704077959060669, 0.4832143783569336, -0.43... negative \n", + "42 [-0.6472877860069275, 0.819389283657074, -0.50... negative \n", + "43 [-1.089509129524231, -0.010750504210591316, -0... negative \n", + "44 [-0.9178588390350342, -0.05760730057954788, -0... negative \n", + "45 [-0.723938524723053, 0.5092206597328186, -0.02... negative \n", + "46 [-2.088550567626953, 0.19368097186088562, -0.7... negative \n", + "47 [-1.236419916152954, 0.6744992733001709, -0.52... negative \n", + "48 [-0.9946603775024414, -0.6593665480613708, 0.3... negative \n", + "49 [-1.4270148277282715, 0.47338584065437317, -0.... negative \n", + "\n", + " sentiment_confidence text \\\n", + "0 7.0 kids in bus accident mocked by kids in passing... \n", + "1 1.0 these two words are stealing your freedom \n", + "2 1.0 bush vows to do 'that thing gore just said, on... \n", + "3 5.0 scotland's parliament backs new independence r... \n", + "4 2.0 joe biden: being vice president is 'a bitch' \n", + "5 1.0 u.s. army now just chasing single remaining is... \n", + "6 1.0 sheryl crow's freshness date expires \n", + "7 1.0 new ebola quarantine protocol seen as barrier ... \n", + "8 4.0 the secret to building a successful business t... \n", + "9 1.0 school for crime \n", + "10 1.0 want to increase trust? increase your say/do r... \n", + "11 1.0 when autocorrect and sexting collide \n", + "12 7.0 the house science committee doesn't seem to un... \n", + "13 6.0 eric clapton wows audience with even slower ve... \n", + "14 1.0 rick perry returning to iowa \n", + "15 6.0 one beer can't do local alcoholic any harm \n", + "16 2.0 couple at point where they're comfortable usin... \n", + "17 4.0 watch how mountains of trash spread across the... \n", + "18 6.0 lowly mortal opens portal to hell \n", + "19 5.0 stephen hawking reportedly working on juicy te... \n", + "20 2.0 offshorers demand: no taxes, no risk \n", + "21 5.0 troubling study finds majority of americans wh... \n", + "22 1.0 annoying man more annoying after skydiving \n", + "23 6.0 robin hood foundation \n", + "24 1.0 passenger glued to airplane window like it fuc... \n", + "25 3.0 amazingly humanlike robot able to commit thous... \n", + "26 5.0 tourists describe scenes of horror in tunisian... \n", + "27 3.0 is your christmas present spying on you? \n", + "28 5.0 area man busts his ass all day, and for what? \n", + "29 2.0 department of interior employee caught embezzl... \n", + "30 9.0 new software yellows neglected digital photos ... \n", + "31 8.0 read live updates on the cnn democratic debate \n", + "32 1.0 new poultry stripe gum hardly tastes like goos... \n", + "33 4.0 new film takes an honest look at life with a t... \n", + "34 3.0 vice president pence pushes expansive nato and... \n", + "35 2.0 mom tucks handwritten guide on how to use netf... \n", + "36 7.0 man insists facebook friend actually reads 'wh... \n", + "37 2.0 internet explorer makes desperate overture to ... \n", + "38 4.0 rock song takes pro-rock stance \n", + "39 9.0 college still looking for absolute saddest pla... \n", + "40 3.0 alton sterling's family demands action from ba... \n", + "41 1.0 ronda rousey wants to show you how ripped she ... \n", + "42 2.0 the workplace revolution: adding company cultu... \n", + "43 1.0 wolf blitzer walks into middle of olive garden... \n", + "44 4.0 grandchild, grandfather equally dreading colla... \n", + "45 1.0 congress reassures nervous zuckerberg they won... \n", + "46 3.0 senators lured back to emergency session by pr... \n", + "47 1.0 powerball officials remove plastic balls from ... \n", + "48 6.0 rude guy unfortunately says something funny \n", + "49 4.0 the room i carry with me \n", + "\n", + " y \n", + "0 positive \n", + "1 negative \n", + "2 positive \n", + "3 negative \n", + "4 negative \n", + "5 positive \n", + "6 positive \n", + "7 negative \n", + "8 negative \n", + "9 negative \n", + "10 negative \n", + "11 negative \n", + "12 negative \n", + "13 positive \n", + "14 negative \n", + "15 positive \n", + "16 positive \n", + "17 negative \n", + "18 positive \n", + "19 positive \n", + "20 negative \n", + "21 positive \n", + "22 positive \n", + "23 negative \n", + "24 positive \n", + "25 positive \n", + "26 negative \n", + "27 negative \n", + "28 positive \n", + "29 positive \n", + "30 positive \n", + "31 negative \n", + "32 positive \n", + "33 negative \n", + "34 negative \n", + "35 positive \n", + "36 positive \n", + "37 positive \n", + "38 positive \n", + "39 positive \n", + "40 negative \n", + "41 negative \n", + "42 negative \n", + "43 positive \n", + "44 positive \n", + "45 positive \n", + "46 positive \n", + "47 positive \n", + "48 positive \n", + "49 negative " + ] + }, + "execution_count": 7, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Train longer!\n", + "trainable_pipe = nlp.load('train.sentiment')\n", + "trainable_pipe['trainable_sentiment_dl'].setMaxEpochs(5)\n", + "fitted_pipe = trainable_pipe.fit(train_df.iloc[:50])\n", + "# predict with the trainable pipeline on dataset and get predictions\n", + "preds = fitted_pipe.predict(train_df.iloc[:50],output_level='document')\n", + "\n", + "#sentence detector that is part of the pipe generates sone NaNs. lets drop them first\n", + "preds.dropna(inplace=True)\n", + "print(classification_report(preds['y'], preds['sentiment']))\n", + "\n", + "preds" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "qFoT-s1MjTSS" + }, + "source": [ + "# 7. Try training with different Embeddings" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "nxWFzQOhjWC8", + "outputId": "c87f2bce-fbf5-45d5-e6f2-1204f1897958" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "For language NLU provides the following Models : \n", + "nlu.load('am.embed_sentence.xlm_roberta') returns Spark NLP model_anno_obj sent_xlm_roberta_base_finetuned_amharic\n", + "For language NLU provides the following Models : \n", + "nlu.load('de.embed_sentence.bert.base_cased') returns Spark NLP model_anno_obj sent_bert_base_cased\n", + "For language NLU provides the following Models : \n", + "nlu.load('el.embed_sentence.bert.base_uncased') returns Spark NLP model_anno_obj sent_bert_base_uncased\n", + "For language NLU provides the following Models : \n", + "nlu.load('en.embed_sentence') returns Spark NLP model_anno_obj tfhub_use\n", + "nlu.load('en.embed_sentence.albert') returns Spark NLP model_anno_obj albert_base_uncased\n", + "nlu.load('en.embed_sentence.bert') returns Spark NLP model_anno_obj sent_bert_base_uncased\n", + "nlu.load('en.embed_sentence.bert.base_uncased_legal') returns Spark NLP model_anno_obj sent_bert_base_uncased_legal\n", + "nlu.load('en.embed_sentence.bert.finetuned') returns Spark NLP model_anno_obj sbert_setfit_finetuned_financial_text_classification\n", + "nlu.load('en.embed_sentence.bert.pubmed') returns Spark NLP model_anno_obj sent_bert_pubmed\n", + "nlu.load('en.embed_sentence.bert.pubmed_squad2') returns Spark NLP model_anno_obj sent_bert_pubmed_squad2\n", + "nlu.load('en.embed_sentence.bert.wiki_books') returns Spark NLP model_anno_obj sent_bert_wiki_books\n", + "nlu.load('en.embed_sentence.bert.wiki_books_mnli') returns Spark NLP model_anno_obj sent_bert_wiki_books_mnli\n", + "nlu.load('en.embed_sentence.bert.wiki_books_qnli') returns Spark NLP model_anno_obj sent_bert_wiki_books_qnli\n", + "nlu.load('en.embed_sentence.bert.wiki_books_qqp') returns Spark NLP model_anno_obj sent_bert_wiki_books_qqp\n", + "nlu.load('en.embed_sentence.bert.wiki_books_squad2') returns Spark NLP model_anno_obj sent_bert_wiki_books_squad2\n", + "nlu.load('en.embed_sentence.bert.wiki_books_sst2') returns Spark NLP model_anno_obj sent_bert_wiki_books_sst2\n", + "nlu.load('en.embed_sentence.bert_base_cased') returns Spark NLP model_anno_obj sent_bert_base_cased\n", + "nlu.load('en.embed_sentence.bert_base_uncased') returns Spark NLP model_anno_obj sent_bert_base_uncased\n", + "nlu.load('en.embed_sentence.bert_large_cased') returns Spark NLP model_anno_obj sent_bert_large_cased\n", + "nlu.load('en.embed_sentence.bert_large_uncased') returns Spark NLP model_anno_obj sent_bert_large_uncased\n", + "nlu.load('en.embed_sentence.bert_use_cmlm_en_base') returns Spark NLP model_anno_obj sent_bert_use_cmlm_en_base\n", + "nlu.load('en.embed_sentence.bert_use_cmlm_en_large') returns Spark NLP model_anno_obj sent_bert_use_cmlm_en_large\n", + "nlu.load('en.embed_sentence.biobert.clinical_base_cased') returns Spark NLP model_anno_obj sent_biobert_clinical_base_cased\n", + "nlu.load('en.embed_sentence.biobert.discharge_base_cased') returns Spark NLP model_anno_obj sent_biobert_discharge_base_cased\n", + "nlu.load('en.embed_sentence.biobert.pmc_base_cased') returns Spark NLP model_anno_obj sent_biobert_pmc_base_cased\n", + "nlu.load('en.embed_sentence.biobert.pubmed_base_cased') returns Spark NLP model_anno_obj sent_biobert_pubmed_base_cased\n", + "nlu.load('en.embed_sentence.biobert.pubmed_large_cased') returns Spark NLP model_anno_obj sent_biobert_pubmed_large_cased\n", + "nlu.load('en.embed_sentence.biobert.pubmed_pmc_base_cased') returns Spark NLP model_anno_obj sent_biobert_pubmed_pmc_base_cased\n", + "nlu.load('en.embed_sentence.covidbert.large_uncased') returns Spark NLP model_anno_obj sent_covidbert_large_uncased\n", + "nlu.load('en.embed_sentence.distil_roberta.distilled_base') returns Spark NLP model_anno_obj sent_distilroberta_base\n", + "nlu.load('en.embed_sentence.doc2vec') returns Spark NLP model_anno_obj doc2vec_gigaword_300\n", + "nlu.load('en.embed_sentence.doc2vec.gigaword_300') returns Spark NLP model_anno_obj doc2vec_gigaword_300\n", + "nlu.load('en.embed_sentence.doc2vec.gigaword_wiki_300') returns Spark NLP model_anno_obj doc2vec_gigaword_wiki_300\n", + "nlu.load('en.embed_sentence.electra') returns Spark NLP model_anno_obj sent_electra_small_uncased\n", + "nlu.load('en.embed_sentence.electra_base_uncased') returns Spark NLP model_anno_obj sent_electra_base_uncased\n", + "nlu.load('en.embed_sentence.electra_large_uncased') returns Spark NLP model_anno_obj sent_electra_large_uncased\n", + "nlu.load('en.embed_sentence.electra_small_uncased') returns Spark NLP model_anno_obj sent_electra_small_uncased\n", + "nlu.load('en.embed_sentence.roberta.base') returns Spark NLP model_anno_obj sent_roberta_base\n", + "nlu.load('en.embed_sentence.roberta.large') returns Spark NLP model_anno_obj sent_roberta_large\n", + "nlu.load('en.embed_sentence.small_bert_L10_128') returns Spark NLP model_anno_obj sent_small_bert_L10_128\n", + "nlu.load('en.embed_sentence.small_bert_L10_256') returns Spark NLP model_anno_obj sent_small_bert_L10_256\n", + "nlu.load('en.embed_sentence.small_bert_L10_512') returns Spark NLP model_anno_obj sent_small_bert_L10_512\n", + "nlu.load('en.embed_sentence.small_bert_L10_768') returns Spark NLP model_anno_obj sent_small_bert_L10_768\n", + "nlu.load('en.embed_sentence.small_bert_L12_128') returns Spark NLP model_anno_obj sent_small_bert_L12_128\n", + "nlu.load('en.embed_sentence.small_bert_L12_256') returns Spark NLP model_anno_obj sent_small_bert_L12_256\n", + "nlu.load('en.embed_sentence.small_bert_L12_512') returns Spark NLP model_anno_obj sent_small_bert_L12_512\n", + "nlu.load('en.embed_sentence.small_bert_L12_768') returns Spark NLP model_anno_obj sent_small_bert_L12_768\n", + "nlu.load('en.embed_sentence.small_bert_L2_128') returns Spark NLP model_anno_obj sent_small_bert_L2_128\n", + "nlu.load('en.embed_sentence.small_bert_L2_256') returns Spark NLP model_anno_obj sent_small_bert_L2_256\n", + "nlu.load('en.embed_sentence.small_bert_L2_512') returns Spark NLP model_anno_obj sent_small_bert_L2_512\n", + "nlu.load('en.embed_sentence.small_bert_L2_768') returns Spark NLP model_anno_obj sent_small_bert_L2_768\n", + "nlu.load('en.embed_sentence.small_bert_L4_128') returns Spark NLP model_anno_obj sent_small_bert_L4_128\n", + "nlu.load('en.embed_sentence.small_bert_L4_256') returns Spark NLP model_anno_obj sent_small_bert_L4_256\n", + "nlu.load('en.embed_sentence.small_bert_L4_512') returns Spark NLP model_anno_obj sent_small_bert_L4_512\n", + "nlu.load('en.embed_sentence.small_bert_L4_768') returns Spark NLP model_anno_obj sent_small_bert_L4_768\n", + "nlu.load('en.embed_sentence.small_bert_L6_128') returns Spark NLP model_anno_obj sent_small_bert_L6_128\n", + "nlu.load('en.embed_sentence.small_bert_L6_256') returns Spark NLP model_anno_obj sent_small_bert_L6_256\n", + "nlu.load('en.embed_sentence.small_bert_L6_512') returns Spark NLP model_anno_obj sent_small_bert_L6_512\n", + "nlu.load('en.embed_sentence.small_bert_L6_768') returns Spark NLP model_anno_obj sent_small_bert_L6_768\n", + "nlu.load('en.embed_sentence.small_bert_L8_128') returns Spark NLP model_anno_obj sent_small_bert_L8_128\n", + "nlu.load('en.embed_sentence.small_bert_L8_256') returns Spark NLP model_anno_obj sent_small_bert_L8_256\n", + "nlu.load('en.embed_sentence.small_bert_L8_512') returns Spark NLP model_anno_obj sent_small_bert_L8_512\n", + "nlu.load('en.embed_sentence.small_bert_L8_768') returns Spark NLP model_anno_obj sent_small_bert_L8_768\n", + "nlu.load('en.embed_sentence.tfhub_use') returns Spark NLP model_anno_obj tfhub_use\n", + "nlu.load('en.embed_sentence.tfhub_use.lg') returns Spark NLP model_anno_obj tfhub_use_lg\n", + "nlu.load('en.embed_sentence.use') returns Spark NLP model_anno_obj tfhub_use\n", + "nlu.load('en.embed_sentence.use.lg') returns Spark NLP model_anno_obj tfhub_use_lg\n", + "For language NLU provides the following Models : \n", + "nlu.load('es.embed_sentence.bert.base_cased') returns Spark NLP model_anno_obj sent_bert_base_cased\n", + "nlu.load('es.embed_sentence.bert.base_uncased') returns Spark NLP model_anno_obj sent_bert_base_uncased\n", + "For language NLU provides the following Models : \n", + "nlu.load('fi.embed_sentence.bert') returns Spark NLP model_anno_obj bert_base_finnish_uncased\n", + "nlu.load('fi.embed_sentence.bert.cased') returns Spark NLP model_anno_obj bert_base_finnish_cased\n", + "nlu.load('fi.embed_sentence.bert.uncased') returns Spark NLP model_anno_obj bert_base_finnish_uncased\n", + "For language NLU provides the following Models : \n", + "nlu.load('ha.embed_sentence.xlm_roberta') returns Spark NLP model_anno_obj sent_xlm_roberta_base_finetuned_hausa\n", + "For language NLU provides the following Models : \n", + "nlu.load('ig.embed_sentence.xlm_roberta') returns Spark NLP model_anno_obj sent_xlm_roberta_base_finetuned_igbo\n", + "For language NLU provides the following Models : \n", + "nlu.load('lg.embed_sentence.xlm_roberta') returns Spark NLP model_anno_obj sent_xlm_roberta_base_finetuned_luganda\n", + "For language NLU provides the following Models : \n", + "nlu.load('nl.embed_sentence.bert.base_cased') returns Spark NLP model_anno_obj sent_bert_base_cased\n", + "For language NLU provides the following Models : \n", + "nlu.load('pcm.embed_sentence.xlm_roberta') returns Spark NLP model_anno_obj sent_xlm_roberta_base_finetuned_naija\n", + "For language NLU provides the following Models : \n", + "nlu.load('pt.embed_sentence.bert.base_legal') returns Spark NLP model_anno_obj sbert_legal_bertimbau_base_tsdae_sts\n", + "nlu.load('pt.embed_sentence.bert.cased_large_legal') returns Spark NLP model_anno_obj sbert_bert_large_portuguese_cased_legal_mlm_sts_v0.1\n", + "nlu.load('pt.embed_sentence.bert.large_legal') returns Spark NLP model_anno_obj sbert_legal_bertimbau_large_gpl_sts\n", + "nlu.load('pt.embed_sentence.bert.legal.cased_large_mlm_sts_v0.10.by_stjiris') returns Spark NLP model_anno_obj sbert_bert_large_portuguese_cased_legal_mlm_sts_v0.10\n", + "nlu.load('pt.embed_sentence.bert.legal.cased_large_mlm_sts_v0.2.by_stjiris') returns Spark NLP model_anno_obj sbert_bert_large_portuguese_cased_legal_mlm_sts_v0.2\n", + "nlu.load('pt.embed_sentence.bert.legal.cased_large_mlm_sts_v0.3.by_stjiris') returns Spark NLP model_anno_obj sbert_bert_large_portuguese_cased_legal_mlm_sts_v0.3\n", + "nlu.load('pt.embed_sentence.bert.legal.cased_large_mlm_sts_v0.4.by_stjiris') returns Spark NLP model_anno_obj sbert_bert_large_portuguese_cased_legal_mlm_sts_v0.4\n", + "nlu.load('pt.embed_sentence.bert.legal.cased_large_mlm_sts_v0.5.by_stjiris') returns Spark NLP model_anno_obj sbert_bert_large_portuguese_cased_legal_mlm_sts_v0.5\n", + "nlu.load('pt.embed_sentence.bert.legal.cased_large_mlm_sts_v0.7.by_stjiris') returns Spark NLP model_anno_obj sbert_bert_large_portuguese_cased_legal_mlm_sts_v0.7\n", + "nlu.load('pt.embed_sentence.bert.legal.cased_large_mlm_sts_v0.8.by_stjiris') returns Spark NLP model_anno_obj sbert_bert_large_portuguese_cased_legal_mlm_sts_v0.8\n", + "nlu.load('pt.embed_sentence.bert.legal.cased_large_mlm_sts_v0.9.by_stjiris') returns Spark NLP model_anno_obj sbert_bert_large_portuguese_cased_legal_mlm_sts_v0.9\n", + "nlu.load('pt.embed_sentence.bert.legal.cased_large_mlm_sts_v1.0.by_stjiris') returns Spark NLP model_anno_obj sbert_bert_large_portuguese_cased_legal_mlm_sts_v1.0\n", + "nlu.load('pt.embed_sentence.bert.legal.cased_large_mlm_v0.11_gpl_nli_sts_v0.by_stjiris') returns Spark NLP model_anno_obj sbert_bert_large_portuguese_cased_legal_mlm_v0.11_gpl_nli_sts_v0\n", + "nlu.load('pt.embed_sentence.bert.legal.cased_large_mlm_v0.11_gpl_nli_sts_v1.by_stjiris') returns Spark NLP model_anno_obj sbert_bert_large_portuguese_cased_legal_mlm_v0.11_gpl_nli_sts_v1\n", + "nlu.load('pt.embed_sentence.bert.legal.cased_large_mlm_v0.11_nli_sts_v0.by_stjiris') returns Spark NLP model_anno_obj sbert_bert_large_portuguese_cased_legal_mlm_v0.11_nli_sts_v0\n", + "nlu.load('pt.embed_sentence.bert.legal.cased_large_mlm_v0.11_nli_sts_v1.by_stjiris') returns Spark NLP model_anno_obj sbert_bert_large_portuguese_cased_legal_mlm_v0.11_nli_sts_v1\n", + "nlu.load('pt.embed_sentence.bert.legal.cased_large_mlm_v0.11_sts_v0.by_stjiris') returns Spark NLP model_anno_obj sbert_bert_large_portuguese_cased_legal_mlm_v0.11_sts_v0\n", + "nlu.load('pt.embed_sentence.bert.legal.cased_large_mlm_v0.11_sts_v1.by_stjiris') returns Spark NLP model_anno_obj sbert_bert_large_portuguese_cased_legal_mlm_v0.11_sts_v1\n", + "nlu.load('pt.embed_sentence.bert.v2_base_legal') returns Spark NLP model_anno_obj sbert_legal_bertimbau_sts_base_ma_v2\n", + "nlu.load('pt.embed_sentence.bert.v2_large_legal') returns Spark NLP model_anno_obj sbert_legal_bertimbau_large_tsdae_sts_v2\n", + "nlu.load('pt.embed_sentence.bertimbau.legal.assin.base.by_rufimelo') returns Spark NLP model_anno_obj sbert_legal_bertimbau_sts_base_ma\n", + "nlu.load('pt.embed_sentence.bertimbau.legal.assin2.base.by_rufimelo') returns Spark NLP model_anno_obj sbert_legal_bertimbau_sts_base\n", + "nlu.load('pt.embed_sentence.bertimbau.legal.large_sts_by_rufimelo') returns Spark NLP model_anno_obj sbert_legal_bertimbau_sts_large\n", + "nlu.load('pt.embed_sentence.bertimbau.legal.large_sts_ma.by_rufimelo') returns Spark NLP model_anno_obj sbert_legal_bertimbau_sts_large_ma\n", + "nlu.load('pt.embed_sentence.bertimbau.legal.large_sts_ma_v3.by_rufimelo') returns Spark NLP model_anno_obj sbert_legal_bertimbau_sts_large_ma_v3\n", + "nlu.load('pt.embed_sentence.bertimbau.legal.large_tsdae_sts.by_rufimelo') returns Spark NLP model_anno_obj sbert_legal_bertimbau_large_tsdae_sts\n", + "nlu.load('pt.embed_sentence.bertimbau.legal.large_tsdae_sts_v4.by_rufimelo') returns Spark NLP model_anno_obj sbert_legal_bertimbau_large_tsdae_sts_v4\n", + "nlu.load('pt.embed_sentence.bertimbau.legal.large_tsdae_v4_gpl_sts.by_rufimelo') returns Spark NLP model_anno_obj sbert_legal_bertimbau_large_tsdae_v4_gpl_sts\n", + "nlu.load('pt.embed_sentence.bertimbau.legal.v2_large_sts_v2.by_rufimelo') returns Spark NLP model_anno_obj sbert_legal_bertimbau_sts_large_v2\n", + "nlu.load('pt.embed_sentence.bertimbau.legal.v2_large_v2_sts.by_rufimelo') returns Spark NLP model_anno_obj sbert_legal_bertimbau_large_v2_sts\n", + "For language NLU provides the following Models : \n", + "nlu.load('rw.embed_sentence.xlm_roberta') returns Spark NLP model_anno_obj sent_xlm_roberta_base_finetuned_kinyarwanda\n", + "For language NLU provides the following Models : \n", + "nlu.load('sv.embed_sentence.bert.base_cased') returns Spark NLP model_anno_obj sent_bert_base_cased\n", + "For language NLU provides the following Models : \n", + "nlu.load('sw.embed_sentence.xlm_roberta') returns Spark NLP model_anno_obj sent_xlm_roberta_base_finetuned_swahili\n", + "For language NLU provides the following Models : \n", + "nlu.load('wo.embed_sentence.xlm_roberta') returns Spark NLP model_anno_obj sent_xlm_roberta_base_finetuned_wolof\n", + "For language NLU provides the following Models : \n", + "nlu.load('xx.embed_sentence') returns Spark NLP model_anno_obj sent_bert_multi_cased\n", + "nlu.load('xx.embed_sentence.bert') returns Spark NLP model_anno_obj sent_bert_multi_cased\n", + "nlu.load('xx.embed_sentence.bert.cased') returns Spark NLP model_anno_obj sent_bert_multi_cased\n", + "nlu.load('xx.embed_sentence.bert.muril') returns Spark NLP model_anno_obj sent_bert_muril\n", + "nlu.load('xx.embed_sentence.bert_use_cmlm_multi_base') returns Spark NLP model_anno_obj sent_bert_use_cmlm_multi_base\n", + "nlu.load('xx.embed_sentence.bert_use_cmlm_multi_base_br') returns Spark NLP model_anno_obj sent_bert_use_cmlm_multi_base_br\n", + "nlu.load('xx.embed_sentence.labse') returns Spark NLP model_anno_obj labse\n", + "nlu.load('xx.embed_sentence.xlm_roberta.base') returns Spark NLP model_anno_obj sent_xlm_roberta_base\n", + "For language NLU provides the following Models : \n", + "nlu.load('yo.embed_sentence.xlm_roberta') returns Spark NLP model_anno_obj sent_xlm_roberta_base_finetuned_yoruba\n", + "For language NLU provides the following Models : \n", + "nlu.load('zh.embed_sentence.bert') returns Spark NLP model_anno_obj sbert_chinese_qmc_finance_v1\n", + "nlu.load('zh.embed_sentence.bert.distilled') returns Spark NLP model_anno_obj sbert_chinese_qmc_finance_v1_distill\n" + ] + } + ], + "source": [ + "# We can use nlu.print_components(action='embed_sentence') to see every possibler sentence embedding we could use. Lets use bert!\n", + "nlp.nlu.print_components(action='embed_sentence')" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "IKK_Ii_gjJfF", + "outputId": "14ac0c42-1969-435b-a834-d48601c15b2c" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Warning::Spark Session already created, some configs may not take.\n", + "Warning::Spark Session already created, some configs may not take.\n", + "sent_small_bert_L12_768 download started this may take some time.\n", + "Approximate size to download 392.9 MB\n", + "[OK!]\n", + " precision recall f1-score support\n", + "\n", + " negative 0.92 0.86 0.89 542\n", + " neutral 0.00 0.00 0.00 0\n", + " positive 0.89 0.85 0.87 458\n", + "\n", + " accuracy 0.86 1000\n", + " macro avg 0.60 0.57 0.59 1000\n", + "weighted avg 0.91 0.86 0.88 1000\n", + "\n" + ] + } + ], + "source": [ + "trainable_pipe = nlp.load('en.embed_sentence.small_bert_L12_768 train.sentiment')\n", + "# We need to train longer and user smaller LR for NON-USE based sentence embeddings usually\n", + "# We could tune the hyperparameters further with hyperparameter tuning methods like gridsearch\n", + "# Also longer training gives more accuracy\n", + "trainable_pipe['trainable_sentiment_dl'].setMaxEpochs(120)\n", + "trainable_pipe['trainable_sentiment_dl'].setLr(0.0005)\n", + "fitted_pipe = trainable_pipe.fit(train_df[:1000])\n", + "# predict with the trainable pipeline on dataset and get predictions\n", + "preds = fitted_pipe.predict(train_df[:1000],output_level='document')\n", + "\n", + "#sentence detector that is part of the pipe generates sone NaNs. lets drop them first\n", + "preds.dropna(inplace=True)\n", + "print(classification_report(preds['y'], preds['sentiment']))\n", + "\n", + "#preds" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "_1jxw3GnVGlI" + }, + "source": [ + "# 7.1 evaluate on Test Data" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "Fxx4yNkNVGFl", + "outputId": "542c6589-d1f1-4310-c0b3-0717bdd4111e" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + " precision recall f1-score support\n", + "\n", + " negative 0.76 0.79 0.78 53\n", + " neutral 0.00 0.00 0.00 0\n", + " positive 0.82 0.60 0.69 47\n", + "\n", + " accuracy 0.70 100\n", + " macro avg 0.53 0.46 0.49 100\n", + "weighted avg 0.79 0.70 0.74 100\n", + "\n" + ] + } + ], + "source": [ + "preds = fitted_pipe.predict(test_df[:100],output_level='document')\n", + "\n", + "#sentence detector that is part of the pipe generates sone NaNs. lets drop them first\n", + "preds.dropna(inplace=True)\n", + "print(classification_report(preds['y'], preds['sentiment']))" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "2BB-NwZUoHSe" + }, + "source": [ + "# 8. Lets save the model" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "eLex095goHwm" + }, + "outputs": [], + "source": [ + "stored_model_path = './models/classifier_dl_trained'\n", + "fitted_pipe.save(stored_model_path)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "e_b2DPd4rCiU" + }, + "source": [ + "# 9. Lets load the model from HDD.\n", + "This makes Offlien NLU usage possible! \n", + "You need to call nlu.load(path=path_to_the_pipe) to load a model/pipeline from disk." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 133 + }, + "id": "SO4uz45MoRgp", + "outputId": "a37045b7-f9d1-4fbc-fbd2-8ab0731d2614" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Warning::Spark Session already created, some configs may not take.\n", + "Warning::Spark Session already created, some configs may not take.\n", + "Warning::Spark Session already created, some configs may not take.\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", + "
documentsentence_embedding_from_disksentimentsentiment_confidence
0Aliens are immortal![0.3093056380748749, 0.1294729858636856, 0.065...negative0.0
\n", + "
\n", + "
\n", + "\n", + "
\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "
\n", + "\n", + "
\n", + "
\n" + ], + "text/plain": [ + " document sentence_embedding_from_disk \\\n", + "0 Aliens are immortal! [0.3093056380748749, 0.1294729858636856, 0.065... \n", + "\n", + " sentiment sentiment_confidence \n", + "0 negative 0.0 " + ] + }, + "execution_count": 15, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "hdd_pipe = nlp.load(path=stored_model_path)\n", + "\n", + "preds = hdd_pipe.predict('Aliens are immortal!')\n", + "\n", + "preds" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "e0CVlkk9v6Qi", + "outputId": "4edc51a7-f104-4c0e-a480-58f5a2f62d6e" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "The following parameters are configurable for this NLU pipeline (You can copy paste the examples) :\n", + ">>> component_list['document_assembler'] has settable params:\n", + "component_list['document_assembler'].setCleanupMode('shrink') | Info: possible values: disabled, inplace, inplace_full, shrink, shrink_full, each, each_full, delete_full | Currently set to : shrink\n", + ">>> component_list['bert_sentence_embeddings@sent_small_bert_L12_768'] has settable params:\n", + "component_list['bert_sentence_embeddings@sent_small_bert_L12_768'].setBatchSize(8) | Info: Size of every batch | Currently set to : 8\n", + "component_list['bert_sentence_embeddings@sent_small_bert_L12_768'].setCaseSensitive(False) | Info: whether to ignore case in tokens for embeddings matching | Currently set to : False\n", + "component_list['bert_sentence_embeddings@sent_small_bert_L12_768'].setDimension(768) | Info: Number of embedding dimensions | Currently set to : 768\n", + "component_list['bert_sentence_embeddings@sent_small_bert_L12_768'].setMaxSentenceLength(128) | Info: Max sentence length to process | Currently set to : 128\n", + "component_list['bert_sentence_embeddings@sent_small_bert_L12_768'].setEngine('tensorflow') | Info: Deep Learning engine used for this model | Currently set to : tensorflow\n", + "component_list['bert_sentence_embeddings@sent_small_bert_L12_768'].setIsLong(False) | Info: Use Long type instead of Int type for inputs buffer - Some Bert models require Long instead of Int. | Currently set to : False\n", + "component_list['bert_sentence_embeddings@sent_small_bert_L12_768'].setStorageRef('sent_small_bert_L12_768') | Info: unique reference name for identification | Currently set to : sent_small_bert_L12_768\n", + ">>> component_list['sentiment_dl@sent_small_bert_L12_768'] has settable params:\n", + "component_list['sentiment_dl@sent_small_bert_L12_768'].setThreshold(0.6) | Info: The minimum threshold for the final result otheriwse it will be neutral | Currently set to : 0.6\n", + "component_list['sentiment_dl@sent_small_bert_L12_768'].setThresholdLabel('neutral') | Info: In case the score is less than threshold, what should be the label. Default is neutral. | Currently set to : neutral\n", + "component_list['sentiment_dl@sent_small_bert_L12_768'].setEngine('tensorflow') | Info: Deep Learning engine used for this model | Currently set to : tensorflow\n", + "component_list['sentiment_dl@sent_small_bert_L12_768'].setClasses(['positive', 'negative']) | Info: get the tags used to trained this SentimentDLModel | Currently set to : ['positive', 'negative']\n", + "component_list['sentiment_dl@sent_small_bert_L12_768'].setStorageRef('sent_small_bert_L12_768') | Info: unique reference name for identification | Currently set to : sent_small_bert_L12_768\n" + ] + } + ], + "source": [ + "hdd_pipe.print_info()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "aq3RCRU4wHsv" + }, + "outputs": [], + "source": [] + } + ], + "metadata": { + "colab": { + "collapsed_sections": [ + "zkufh760uvF3" + ], + "provenance": [] + }, + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "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.11.4" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/examples/colab/Training/binary_text_classification/NLU_training_sentiment_classifier_demo.ipynb b/examples/colab/Training/binary_text_classification/NLU_training_sentiment_classifier_demo.ipynb index bd71d0e9..dc1fe968 100644 --- a/examples/colab/Training/binary_text_classification/NLU_training_sentiment_classifier_demo.ipynb +++ b/examples/colab/Training/binary_text_classification/NLU_training_sentiment_classifier_demo.ipynb @@ -1 +1,2652 @@ -{"nbformat":4,"nbformat_minor":0,"metadata":{"colab":{"name":"NLU_training_sentiment_classifier_demo.ipynb","provenance":[],"collapsed_sections":[]},"kernelspec":{"name":"python3","display_name":"Python 3"}},"cells":[{"cell_type":"markdown","metadata":{"id":"zkufh760uvF3"},"source":["![JohnSnowLabs](https://nlp.johnsnowlabs.com/assets/images/logo.png)\n","\n","[![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/JohnSnowLabs/nlu/blob/master/examples/colab/Training/binary_text_classification/NLU_training_sentiment_classifier_demo.ipynb)\n","\n","\n","\n","# Training a Sentiment Analysis Classifier with NLU \n","With the [ClassifierDL model](https://nlp.johnsnowlabs.com/docs/en/annotators#classifierdl-multi-class-text-classification) from Spark NLP you can achieve State Of the Art results on any multi class text classification problem \n","\n","This notebook showcases the following features : \n","\n","- How to train the deep learning classifier\n","- How to store a pipeline to disk\n","- How to load the pipeline from disk (Enables NLU offline mode)\n","\n"]},{"cell_type":"markdown","metadata":{"id":"dur2drhW5Rvi"},"source":["# 1. Install Java 8 and NLU"]},{"cell_type":"code","metadata":{"id":"hFGnBCHavltY","colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"status":"ok","timestamp":1620215193255,"user_tz":-120,"elapsed":126309,"user":{"displayName":"Christian Kasim Loan","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GjqAD-ircKP-s5Eh6JSdkDggDczfqQbJGU_IRb4Hw=s64","userId":"14469489166467359317"}},"outputId":"ede615d6-a5e6-41a3-aa1e-1f0c3c841234"},"source":["!wget https://setup.johnsnowlabs.com/nlu/colab.sh -O - | bash\n","import nlu"],"execution_count":null,"outputs":[{"output_type":"stream","text":["--2021-05-05 11:44:27-- https://raw.githubusercontent.com/JohnSnowLabs/nlu/master/scripts/colab_setup.sh\n","Resolving raw.githubusercontent.com (raw.githubusercontent.com)... 185.199.108.133, 185.199.111.133, 185.199.109.133, ...\n","Connecting to raw.githubusercontent.com (raw.githubusercontent.com)|185.199.108.133|:443... connected.\n","HTTP request sent, awaiting response... 200 OK\n","Length: 1671 (1.6K) [text/plain]\n","Saving to: ‘STDOUT’\n","\n","- 0%[ ] 0 --.-KB/s Installing NLU 3.0.0 with PySpark 3.0.2 and Spark NLP 3.0.1 for Google Colab ...\n","- 100%[===================>] 1.63K --.-KB/s in 0.001s \n","\n","2021-05-05 11:44:27 (1.49 MB/s) - written to stdout [1671/1671]\n","\n","\u001b[K |████████████████████████████████| 204.8MB 58kB/s \n","\u001b[K |████████████████████████████████| 153kB 46.3MB/s \n","\u001b[K |████████████████████████████████| 204kB 18.2MB/s \n","\u001b[K |████████████████████████████████| 204kB 52.9MB/s \n","\u001b[?25h Building wheel for pyspark (setup.py) ... \u001b[?25l\u001b[?25hdone\n"],"name":"stdout"}]},{"cell_type":"markdown","metadata":{"id":"f4KkTfnR5Ugg"},"source":["# 2. Download Stock Market Sentiment dataset \n","https://www.kaggle.com/yash612/stockmarket-sentiment-dataset"]},{"cell_type":"code","metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"OrVb5ZMvvrQD","executionInfo":{"status":"ok","timestamp":1620215194079,"user_tz":-120,"elapsed":127118,"user":{"displayName":"Christian Kasim Loan","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GjqAD-ircKP-s5Eh6JSdkDggDczfqQbJGU_IRb4Hw=s64","userId":"14469489166467359317"}},"outputId":"f161f492-1d88-4652-aeb8-1a0f67e0272c"},"source":["! wget http://ckl-it.de/wp-content/uploads/2020/11/stock_data.csv\n"],"execution_count":null,"outputs":[{"output_type":"stream","text":["--2021-05-05 11:46:32-- http://ckl-it.de/wp-content/uploads/2020/11/stock_data.csv\n","Resolving ckl-it.de (ckl-it.de)... 217.160.0.108, 2001:8d8:100f:f000::209\n","Connecting to ckl-it.de (ckl-it.de)|217.160.0.108|:80... connected.\n","HTTP request sent, awaiting response... 200 OK\n","Length: 479973 (469K) [text/csv]\n","Saving to: ‘stock_data.csv’\n","\n","stock_data.csv 100%[===================>] 468.72K 846KB/s in 0.6s \n","\n","2021-05-05 11:46:33 (846 KB/s) - ‘stock_data.csv’ saved [479973/479973]\n","\n"],"name":"stdout"}]},{"cell_type":"code","metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"uDGIOASY_fRj","executionInfo":{"status":"ok","timestamp":1620215245366,"user_tz":-120,"elapsed":178400,"user":{"displayName":"Christian Kasim Loan","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GjqAD-ircKP-s5Eh6JSdkDggDczfqQbJGU_IRb4Hw=s64","userId":"14469489166467359317"}},"outputId":"fcf975df-6fe9-4a6a-f7fd-10439b2b541c"},"source":["import nlu\n","sentiment = nlu.load('sentiment')"],"execution_count":null,"outputs":[{"output_type":"stream","text":["analyze_sentiment download started this may take some time.\n","Approx size to download 4.9 MB\n","[OK!]\n"],"name":"stdout"}]},{"cell_type":"code","metadata":{"colab":{"base_uri":"https://localhost:8080/","height":76},"id":"U0ENiuMc_kyb","executionInfo":{"status":"ok","timestamp":1620215255157,"user_tz":-120,"elapsed":188186,"user":{"displayName":"Christian Kasim Loan","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GjqAD-ircKP-s5Eh6JSdkDggDczfqQbJGU_IRb4Hw=s64","userId":"14469489166467359317"}},"outputId":"b77e7958-75b4-4bf7-aff8-e416450b168a"},"source":["sentiment.predict(\"I'm very very not at all happy\")"],"execution_count":null,"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","
tokensentimentsentenceorigin_indexspelldocumentsentiment_confidencetext
0[I'm, very, very, not, at, all, happy][positive][I'm very very not at all happy]8589934592[I'm, very, very, not, at, all, happy]I'm very very not at all happy[0.3043]I'm very very not at all happy
\n","
"],"text/plain":[" token ... text\n","0 [I'm, very, very, not, at, all, happy] ... I'm very very not at all happy\n","\n","[1 rows x 8 columns]"]},"metadata":{"tags":[]},"execution_count":4}]},{"cell_type":"code","metadata":{"colab":{"base_uri":"https://localhost:8080/","height":391},"id":"y4xSRWIhwT28","executionInfo":{"status":"ok","timestamp":1620215255159,"user_tz":-120,"elapsed":188185,"user":{"displayName":"Christian Kasim Loan","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GjqAD-ircKP-s5Eh6JSdkDggDczfqQbJGU_IRb4Hw=s64","userId":"14469489166467359317"}},"outputId":"42f2b380-7742-49ee-f640-c62d4c969fce"},"source":["import pandas as pd\n","train_path = '/content/stock_data.csv'\n","\n","train_df = pd.read_csv(train_path)\n","# the text data to use for classification should be in a column named 'text'\n","# the label column must have name 'y' name be of type str\n","train_df.columns=['text','y']\n","train_df.y = train_df.y.astype(str)\n","train_df.y = train_df.y.str.replace('-1','negative')\n","train_df.y = train_df.y.str.replace('1','positive')\n","train_df"],"execution_count":null,"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"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n","
texty
0Kickers on my watchlist XIDE TIT SOQ PNK CPW B...positive
1user: AAP MOVIE. 55% return for the FEA/GEED i...positive
2user I'd be afraid to short AMZN - they are lo...positive
3MNTA Over 12.00positive
4OI Over 21.37positive
.........
5786Industry body CII said #discoms are likely to ...negative
5787#Gold prices slip below Rs 46,000 as #investor...negative
5788Workers at Bajaj Auto have agreed to a 10% wag...positive
5789#Sharemarket LIVE: Sensex off day’s high, up 6...positive
5790#Sensex, #Nifty climb off day's highs, still u...positive
\n","

5791 rows × 2 columns

\n","
"],"text/plain":[" text y\n","0 Kickers on my watchlist XIDE TIT SOQ PNK CPW B... positive\n","1 user: AAP MOVIE. 55% return for the FEA/GEED i... positive\n","2 user I'd be afraid to short AMZN - they are lo... positive\n","3 MNTA Over 12.00 positive\n","4 OI Over 21.37 positive\n","... ... ...\n","5786 Industry body CII said #discoms are likely to ... negative\n","5787 #Gold prices slip below Rs 46,000 as #investor... negative\n","5788 Workers at Bajaj Auto have agreed to a 10% wag... positive\n","5789 #Sharemarket LIVE: Sensex off day’s high, up 6... positive\n","5790 #Sensex, #Nifty climb off day's highs, still u... positive\n","\n","[5791 rows x 2 columns]"]},"metadata":{"tags":[]},"execution_count":5}]},{"cell_type":"markdown","metadata":{"id":"0296Om2C5anY"},"source":["# 3. Train Deep Learning Classifier using nlu.load('train.sentiment')\n","\n","You dataset label column should be named 'y' and the feature column with text data should be named 'text'"]},{"cell_type":"code","metadata":{"colab":{"base_uri":"https://localhost:8080/","height":651},"id":"3ZIPkRkWftBG","executionInfo":{"status":"ok","timestamp":1620215420196,"user_tz":-120,"elapsed":353218,"user":{"displayName":"Christian Kasim Loan","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GjqAD-ircKP-s5Eh6JSdkDggDczfqQbJGU_IRb4Hw=s64","userId":"14469489166467359317"}},"outputId":"0eea644b-5461-4347-b47e-c300e441be80"},"source":["from sklearn.metrics import classification_report\n","import nlu \n","# load a trainable pipeline by specifying the train. prefix and fit it on a datset with label and text columns\n","# by default the Universal Sentence Encoder (USE) Sentence embeddings are used for generation\n","trainable_pipe = nlu.load('train.sentiment')\n","fitted_pipe = trainable_pipe.fit(train_df)\n","\n","# predict with the trainable pipeline on dataset and get predictions\n","preds = fitted_pipe.predict(train_df,output_level='document')\n","#sentence detector that is part of the pipe generates sone NaNs. lets drop them first\n","preds.dropna(inplace=True)\n","print(classification_report(preds['y'], preds['sentiment']))\n","\n","preds"],"execution_count":null,"outputs":[{"output_type":"stream","text":["tfhub_use download started this may take some time.\n","Approximate size to download 923.7 MB\n","[OK!]\n","sentence_detector_dl download started this may take some time.\n","Approximate size to download 354.6 KB\n","[OK!]\n"," precision recall f1-score support\n","\n"," negative 0.61 0.58 0.59 2106\n"," neutral 0.00 0.00 0.00 0\n"," positive 0.79 0.71 0.75 3685\n","\n"," accuracy 0.66 5791\n"," macro avg 0.47 0.43 0.45 5791\n","weighted avg 0.73 0.66 0.69 5791\n","\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"," \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"," \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"," \n"," \n"," \n"," \n","
sentenceorigin_indexydocumenttrained_sentiment_confidencetexttrained_sentimentsentence_embedding_use
0[Kickers on my watchlist XIDE TIT SOQ PNK CPW ...0positiveKickers on my watchlist XIDE TIT SOQ PNK CPW B...0.985571Kickers on my watchlist XIDE TIT SOQ PNK CPW B...positive[0.006487144622951746, -0.042024899274110794, ...
1[user: AAP MOVIE. 55% return for the FEA/GEED ...1positiveuser: AAP MOVIE. 55% return for the FEA/GEED i...0.720251user: AAP MOVIE. 55% return for the FEA/GEED i...positive[0.04891366884112358, -0.07381151616573334, -0...
2[user I'd be afraid to short AMZN - they are l...2positiveuser I'd be afraid to short AMZN - they are lo...0.580390user I'd be afraid to short AMZN - they are lo...neutral[0.05556508153676987, -0.016491785645484924, 0...
3[MNTA Over 12.00]3positiveMNTA Over 12.000.941032MNTA Over 12.00positive[-0.010976563207805157, -0.029801178723573685,...
4[OI Over 21.37]4positiveOI Over 21.370.535012OI Over 21.37neutral[0.024849383160471916, 0.04679657891392708, -0...
...........................
5786[Industry body CII said #discoms are likely to...5786negativeIndustry body CII said #discoms are likely to ...0.939032Industry body CII said #discoms are likely to ...negative[0.020985640585422516, -0.03145354241132736, -...
5787[#Gold prices slip below Rs 46,000 as #investo...5787negative#Gold prices slip below Rs 46,000 as #investor...0.983991#Gold prices slip below Rs 46,000 as #investor...negative[0.05627664923667908, 0.012842322699725628, -0...
5788[Workers at Bajaj Auto have agreed to a 10% wa...5788positiveWorkers at Bajaj Auto have agreed to a 10% wag...0.918838Workers at Bajaj Auto have agreed to a 10% wag...negative[0.019935883581638336, -0.031780488789081573, ...
5789[#Sharemarket LIVE: Sensex off day’s high, up ...5789positive#Sharemarket LIVE: Sensex off day’s high, up 6...0.761864#Sharemarket LIVE: Sensex off day’s high, up 6...positive[0.0031773506198078394, -0.04296385496854782, ...
5790[#Sensex, #Nifty climb off day's highs, still ...5790positive#Sensex, #Nifty climb off day's highs, still u...0.904347#Sensex, #Nifty climb off day's highs, still u...positive[0.04823731631040573, -0.012027987278997898, -...
\n","

5791 rows × 8 columns

\n","
"],"text/plain":[" sentence ... sentence_embedding_use\n","0 [Kickers on my watchlist XIDE TIT SOQ PNK CPW ... ... [0.006487144622951746, -0.042024899274110794, ...\n","1 [user: AAP MOVIE. 55% return for the FEA/GEED ... ... [0.04891366884112358, -0.07381151616573334, -0...\n","2 [user I'd be afraid to short AMZN - they are l... ... [0.05556508153676987, -0.016491785645484924, 0...\n","3 [MNTA Over 12.00] ... [-0.010976563207805157, -0.029801178723573685,...\n","4 [OI Over 21.37] ... [0.024849383160471916, 0.04679657891392708, -0...\n","... ... ... ...\n","5786 [Industry body CII said #discoms are likely to... ... [0.020985640585422516, -0.03145354241132736, -...\n","5787 [#Gold prices slip below Rs 46,000 as #investo... ... [0.05627664923667908, 0.012842322699725628, -0...\n","5788 [Workers at Bajaj Auto have agreed to a 10% wa... ... [0.019935883581638336, -0.031780488789081573, ...\n","5789 [#Sharemarket LIVE: Sensex off day’s high, up ... ... [0.0031773506198078394, -0.04296385496854782, ...\n","5790 [#Sensex, #Nifty climb off day's highs, still ... ... [0.04823731631040573, -0.012027987278997898, -...\n","\n","[5791 rows x 8 columns]"]},"metadata":{"tags":[]},"execution_count":6}]},{"cell_type":"markdown","metadata":{"id":"lVyOE2wV0fw_"},"source":["# Test the fitted pipe on new example"]},{"cell_type":"code","metadata":{"colab":{"base_uri":"https://localhost:8080/","height":76},"id":"qdCUg2MR0PD2","executionInfo":{"status":"ok","timestamp":1620215420883,"user_tz":-120,"elapsed":353902,"user":{"displayName":"Christian Kasim Loan","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GjqAD-ircKP-s5Eh6JSdkDggDczfqQbJGU_IRb4Hw=s64","userId":"14469489166467359317"}},"outputId":"4ebad73c-0dc4-40cd-d173-a8134f269886"},"source":["fitted_pipe.predict(\"Bitcoin is going to the moon!\")"],"execution_count":null,"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","
sentenceorigin_indexdocumenttrained_sentiment_confidencetrained_sentimentsentence_embedding_use
0[Bitcoin is going to the moon!]0Bitcoin is going to the moon!0.713436positive[0.06468033790588379, -0.040837567299604416, -...
\n","
"],"text/plain":[" sentence ... sentence_embedding_use\n","0 [Bitcoin is going to the moon!] ... [0.06468033790588379, -0.040837567299604416, -...\n","\n","[1 rows x 6 columns]"]},"metadata":{"tags":[]},"execution_count":7}]},{"cell_type":"markdown","metadata":{"id":"xflpwrVjjBVD"},"source":["## Configure pipe training parameters"]},{"cell_type":"code","metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"UtsAUGTmOTms","executionInfo":{"status":"ok","timestamp":1620215420884,"user_tz":-120,"elapsed":353900,"user":{"displayName":"Christian Kasim Loan","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GjqAD-ircKP-s5Eh6JSdkDggDczfqQbJGU_IRb4Hw=s64","userId":"14469489166467359317"}},"outputId":"0a8cbe1d-a0be-47d9-e9d4-fac1f907b178"},"source":["trainable_pipe.print_info()"],"execution_count":null,"outputs":[{"output_type":"stream","text":["The following parameters are configurable for this NLU pipeline (You can copy paste the examples) :\n",">>> pipe['sentiment_dl'] has settable params:\n","pipe['sentiment_dl'].setMaxEpochs(1) | Info: Maximum number of epochs to train | Currently set to : 1\n","pipe['sentiment_dl'].setLr(0.005) | Info: Learning Rate | Currently set to : 0.005\n","pipe['sentiment_dl'].setBatchSize(64) | Info: Batch size | Currently set to : 64\n","pipe['sentiment_dl'].setDropout(0.5) | Info: Dropout coefficient | Currently set to : 0.5\n","pipe['sentiment_dl'].setEnableOutputLogs(True) | Info: Whether to use stdout in addition to Spark logs. | Currently set to : True\n","pipe['sentiment_dl'].setThreshold(0.6) | Info: The minimum threshold for the final result otheriwse it will be neutral | Currently set to : 0.6\n","pipe['sentiment_dl'].setThresholdLabel('neutral') | Info: In case the score is less than threshold, what should be the label. Default is neutral. | Currently set to : neutral\n",">>> pipe['use@tfhub_use'] has settable params:\n","pipe['use@tfhub_use'].setDimension(512) | Info: Number of embedding dimensions | Currently set to : 512\n","pipe['use@tfhub_use'].setLoadSP(False) | Info: Whether to load SentencePiece ops file which is required only by multi-lingual models. This is not changeable after it's set with a pretrained model nor it is compatible with Windows. | Currently set to : False\n","pipe['use@tfhub_use'].setStorageRef('tfhub_use') | Info: unique reference name for identification | Currently set to : tfhub_use\n",">>> pipe['deep_sentence_detector@SentenceDetectorDLModel_c83c27f46b97'] has settable params:\n","pipe['deep_sentence_detector@SentenceDetectorDLModel_c83c27f46b97'].setExplodeSentences(False) | Info: whether to explode each sentence into a different row, for better parallelization. Defaults to false. | Currently set to : False\n","pipe['deep_sentence_detector@SentenceDetectorDLModel_c83c27f46b97'].setStorageRef('SentenceDetectorDLModel_c83c27f46b97') | Info: storage unique identifier | Currently set to : SentenceDetectorDLModel_c83c27f46b97\n","pipe['deep_sentence_detector@SentenceDetectorDLModel_c83c27f46b97'].setEncoder(com.johnsnowlabs.nlp.annotators.sentence_detector_dl.SentenceDetectorDLEncoder@4ae24199) | Info: Data encoder | Currently set to : com.johnsnowlabs.nlp.annotators.sentence_detector_dl.SentenceDetectorDLEncoder@4ae24199\n","pipe['deep_sentence_detector@SentenceDetectorDLModel_c83c27f46b97'].setImpossiblePenultimates(['Bros', 'No', 'al', 'vs', 'etc', 'Fig', 'Dr', 'Prof', 'PhD', 'MD', 'Co', 'Corp', 'Inc', 'bros', 'VS', 'Vs', 'ETC', 'fig', 'dr', 'prof', 'PHD', 'phd', 'md', 'co', 'corp', 'inc', 'Jan', 'Feb', 'Mar', 'Apr', 'Jul', 'Aug', 'Sep', 'Sept', 'Oct', 'Nov', 'Dec', 'St', 'st', 'AM', 'PM', 'am', 'pm', 'e.g', 'f.e', 'i.e']) | Info: Impossible penultimates | Currently set to : ['Bros', 'No', 'al', 'vs', 'etc', 'Fig', 'Dr', 'Prof', 'PhD', 'MD', 'Co', 'Corp', 'Inc', 'bros', 'VS', 'Vs', 'ETC', 'fig', 'dr', 'prof', 'PHD', 'phd', 'md', 'co', 'corp', 'inc', 'Jan', 'Feb', 'Mar', 'Apr', 'Jul', 'Aug', 'Sep', 'Sept', 'Oct', 'Nov', 'Dec', 'St', 'st', 'AM', 'PM', 'am', 'pm', 'e.g', 'f.e', 'i.e']\n","pipe['deep_sentence_detector@SentenceDetectorDLModel_c83c27f46b97'].setModelArchitecture('cnn') | Info: Model architecture (CNN) | Currently set to : cnn\n",">>> pipe['document_assembler'] has settable params:\n","pipe['document_assembler'].setCleanupMode('shrink') | Info: possible values: disabled, inplace, inplace_full, shrink, shrink_full, each, each_full, delete_full | Currently set to : shrink\n"],"name":"stdout"}]},{"cell_type":"markdown","metadata":{"id":"2GJdDNV9jEIe"},"source":["## Retrain with new parameters"]},{"cell_type":"code","metadata":{"colab":{"base_uri":"https://localhost:8080/","height":553},"id":"mptfvHx-MMMX","executionInfo":{"status":"ok","timestamp":1620215480821,"user_tz":-120,"elapsed":413834,"user":{"displayName":"Christian Kasim Loan","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GjqAD-ircKP-s5Eh6JSdkDggDczfqQbJGU_IRb4Hw=s64","userId":"14469489166467359317"}},"outputId":"a07fb934-0fcb-4213-f693-118b873437c5"},"source":["# Train longer!\n","trainable_pipe = nlu.load('train.sentiment')\n","trainable_pipe['trainable_sentiment_dl'].setMaxEpochs(5) \n","fitted_pipe = trainable_pipe.fit(train_df)\n","# predict with the trainable pipeline on dataset and get predictions\n","preds = fitted_pipe.predict(train_df,output_level='document')\n","\n","#sentence detector that is part of the pipe generates sone NaNs. lets drop them first\n","preds.dropna(inplace=True)\n","print(classification_report(preds['y'], preds['sentiment']))\n","\n","preds"],"execution_count":null,"outputs":[{"output_type":"stream","text":[" precision recall f1-score support\n","\n"," negative 0.83 0.38 0.52 2106\n"," neutral 0.00 0.00 0.00 0\n"," positive 0.75 0.94 0.83 3685\n","\n"," accuracy 0.74 5791\n"," macro avg 0.53 0.44 0.45 5791\n","weighted avg 0.78 0.74 0.72 5791\n","\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"," \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"," \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"," \n"," \n"," \n"," \n","
sentenceorigin_indexydocumenttrained_sentiment_confidencetexttrained_sentimentsentence_embedding_use
0[Kickers on my watchlist XIDE TIT SOQ PNK CPW ...0positiveKickers on my watchlist XIDE TIT SOQ PNK CPW B...1.000000Kickers on my watchlist XIDE TIT SOQ PNK CPW B...positive[0.006487144622951746, -0.042024899274110794, ...
1[user: AAP MOVIE. 55% return for the FEA/GEED ...1positiveuser: AAP MOVIE. 55% return for the FEA/GEED i...0.934187user: AAP MOVIE. 55% return for the FEA/GEED i...positive[0.04891366884112358, -0.07381151616573334, -0...
2[user I'd be afraid to short AMZN - they are l...2positiveuser I'd be afraid to short AMZN - they are lo...0.625671user I'd be afraid to short AMZN - they are lo...negative[0.05556508153676987, -0.016491785645484924, 0...
3[MNTA Over 12.00]3positiveMNTA Over 12.000.999983MNTA Over 12.00positive[-0.010976563207805157, -0.029801178723573685,...
4[OI Over 21.37]4positiveOI Over 21.370.985523OI Over 21.37positive[0.024849383160471916, 0.04679657891392708, -0...
...........................
5786[Industry body CII said #discoms are likely to...5786negativeIndustry body CII said #discoms are likely to ...0.733400Industry body CII said #discoms are likely to ...negative[0.020985640585422516, -0.03145354241132736, -...
5787[#Gold prices slip below Rs 46,000 as #investo...5787negative#Gold prices slip below Rs 46,000 as #investor...0.967702#Gold prices slip below Rs 46,000 as #investor...negative[0.05627664923667908, 0.012842322699725628, -0...
5788[Workers at Bajaj Auto have agreed to a 10% wa...5788positiveWorkers at Bajaj Auto have agreed to a 10% wag...0.778937Workers at Bajaj Auto have agreed to a 10% wag...negative[0.019935883581638336, -0.031780488789081573, ...
5789[#Sharemarket LIVE: Sensex off day’s high, up ...5789positive#Sharemarket LIVE: Sensex off day’s high, up 6...0.999009#Sharemarket LIVE: Sensex off day’s high, up 6...positive[0.0031773506198078394, -0.04296385496854782, ...
5790[#Sensex, #Nifty climb off day's highs, still ...5790positive#Sensex, #Nifty climb off day's highs, still u...0.999243#Sensex, #Nifty climb off day's highs, still u...positive[0.04823731631040573, -0.012027987278997898, -...
\n","

5791 rows × 8 columns

\n","
"],"text/plain":[" sentence ... sentence_embedding_use\n","0 [Kickers on my watchlist XIDE TIT SOQ PNK CPW ... ... [0.006487144622951746, -0.042024899274110794, ...\n","1 [user: AAP MOVIE. 55% return for the FEA/GEED ... ... [0.04891366884112358, -0.07381151616573334, -0...\n","2 [user I'd be afraid to short AMZN - they are l... ... [0.05556508153676987, -0.016491785645484924, 0...\n","3 [MNTA Over 12.00] ... [-0.010976563207805157, -0.029801178723573685,...\n","4 [OI Over 21.37] ... [0.024849383160471916, 0.04679657891392708, -0...\n","... ... ... ...\n","5786 [Industry body CII said #discoms are likely to... ... [0.020985640585422516, -0.03145354241132736, -...\n","5787 [#Gold prices slip below Rs 46,000 as #investo... ... [0.05627664923667908, 0.012842322699725628, -0...\n","5788 [Workers at Bajaj Auto have agreed to a 10% wa... ... [0.019935883581638336, -0.031780488789081573, ...\n","5789 [#Sharemarket LIVE: Sensex off day’s high, up ... ... [0.0031773506198078394, -0.04296385496854782, ...\n","5790 [#Sensex, #Nifty climb off day's highs, still ... ... [0.04823731631040573, -0.012027987278997898, -...\n","\n","[5791 rows x 8 columns]"]},"metadata":{"tags":[]},"execution_count":9}]},{"cell_type":"markdown","metadata":{"id":"qFoT-s1MjTSS"},"source":["# Try training with different Embeddings"]},{"cell_type":"code","metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"nxWFzQOhjWC8","executionInfo":{"status":"ok","timestamp":1620215481023,"user_tz":-120,"elapsed":414033,"user":{"displayName":"Christian Kasim Loan","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GjqAD-ircKP-s5Eh6JSdkDggDczfqQbJGU_IRb4Hw=s64","userId":"14469489166467359317"}},"outputId":"69e55a4f-67b2-48e2-a5f1-395f5486dc31"},"source":["# We can use nlu.print_components(action='embed_sentence') to see every possibler sentence embedding we could use. Lets use bert!\n","nlu.print_components(action='embed_sentence')"],"execution_count":null,"outputs":[{"output_type":"stream","text":["For language NLU provides the following Models : \n","nlu.load('en.embed_sentence') returns Spark NLP model tfhub_use\n","nlu.load('en.embed_sentence.use') returns Spark NLP model tfhub_use\n","nlu.load('en.embed_sentence.tfhub_use') returns Spark NLP model tfhub_use\n","nlu.load('en.embed_sentence.use.lg') returns Spark NLP model tfhub_use_lg\n","nlu.load('en.embed_sentence.tfhub_use.lg') returns Spark NLP model tfhub_use_lg\n","nlu.load('en.embed_sentence.albert') returns Spark NLP model albert_base_uncased\n","nlu.load('en.embed_sentence.electra') returns Spark NLP model sent_electra_small_uncased\n","nlu.load('en.embed_sentence.electra_small_uncased') returns Spark NLP model sent_electra_small_uncased\n","nlu.load('en.embed_sentence.electra_base_uncased') returns Spark NLP model sent_electra_base_uncased\n","nlu.load('en.embed_sentence.electra_large_uncased') returns Spark NLP model sent_electra_large_uncased\n","nlu.load('en.embed_sentence.bert') returns Spark NLP model sent_bert_base_uncased\n","nlu.load('en.embed_sentence.bert_base_uncased') returns Spark NLP model sent_bert_base_uncased\n","nlu.load('en.embed_sentence.bert_base_cased') returns Spark NLP model sent_bert_base_cased\n","nlu.load('en.embed_sentence.bert_large_uncased') returns Spark NLP model sent_bert_large_uncased\n","nlu.load('en.embed_sentence.bert_large_cased') returns Spark NLP model sent_bert_large_cased\n","nlu.load('en.embed_sentence.biobert.pubmed_base_cased') returns Spark NLP model sent_biobert_pubmed_base_cased\n","nlu.load('en.embed_sentence.biobert.pubmed_large_cased') returns Spark NLP model sent_biobert_pubmed_large_cased\n","nlu.load('en.embed_sentence.biobert.pmc_base_cased') returns Spark NLP model sent_biobert_pmc_base_cased\n","nlu.load('en.embed_sentence.biobert.pubmed_pmc_base_cased') returns Spark NLP model sent_biobert_pubmed_pmc_base_cased\n","nlu.load('en.embed_sentence.biobert.clinical_base_cased') returns Spark NLP model sent_biobert_clinical_base_cased\n","nlu.load('en.embed_sentence.biobert.discharge_base_cased') returns Spark NLP model sent_biobert_discharge_base_cased\n","nlu.load('en.embed_sentence.covidbert.large_uncased') returns Spark NLP model sent_covidbert_large_uncased\n","nlu.load('en.embed_sentence.small_bert_L2_128') returns Spark NLP model sent_small_bert_L2_128\n","nlu.load('en.embed_sentence.small_bert_L4_128') returns Spark NLP model sent_small_bert_L4_128\n","nlu.load('en.embed_sentence.small_bert_L6_128') returns Spark NLP model sent_small_bert_L6_128\n","nlu.load('en.embed_sentence.small_bert_L8_128') returns Spark NLP model sent_small_bert_L8_128\n","nlu.load('en.embed_sentence.small_bert_L10_128') returns Spark NLP model sent_small_bert_L10_128\n","nlu.load('en.embed_sentence.small_bert_L12_128') returns Spark NLP model sent_small_bert_L12_128\n","nlu.load('en.embed_sentence.small_bert_L2_256') returns Spark NLP model sent_small_bert_L2_256\n","nlu.load('en.embed_sentence.small_bert_L4_256') returns Spark NLP model sent_small_bert_L4_256\n","nlu.load('en.embed_sentence.small_bert_L6_256') returns Spark NLP model sent_small_bert_L6_256\n","nlu.load('en.embed_sentence.small_bert_L8_256') returns Spark NLP model sent_small_bert_L8_256\n","nlu.load('en.embed_sentence.small_bert_L10_256') returns Spark NLP model sent_small_bert_L10_256\n","nlu.load('en.embed_sentence.small_bert_L12_256') returns Spark NLP model sent_small_bert_L12_256\n","nlu.load('en.embed_sentence.small_bert_L2_512') returns Spark NLP model sent_small_bert_L2_512\n","nlu.load('en.embed_sentence.small_bert_L4_512') returns Spark NLP model sent_small_bert_L4_512\n","nlu.load('en.embed_sentence.small_bert_L6_512') returns Spark NLP model sent_small_bert_L6_512\n","nlu.load('en.embed_sentence.small_bert_L8_512') returns Spark NLP model sent_small_bert_L8_512\n","nlu.load('en.embed_sentence.small_bert_L10_512') returns Spark NLP model sent_small_bert_L10_512\n","nlu.load('en.embed_sentence.small_bert_L12_512') returns Spark NLP model sent_small_bert_L12_512\n","nlu.load('en.embed_sentence.small_bert_L2_768') returns Spark NLP model sent_small_bert_L2_768\n","nlu.load('en.embed_sentence.small_bert_L4_768') returns Spark NLP model sent_small_bert_L4_768\n","nlu.load('en.embed_sentence.small_bert_L6_768') returns Spark NLP model sent_small_bert_L6_768\n","nlu.load('en.embed_sentence.small_bert_L8_768') returns Spark NLP model sent_small_bert_L8_768\n","nlu.load('en.embed_sentence.small_bert_L10_768') returns Spark NLP model sent_small_bert_L10_768\n","nlu.load('en.embed_sentence.small_bert_L12_768') returns Spark NLP model sent_small_bert_L12_768\n","For language NLU provides the following Models : \n","nlu.load('fi.embed_sentence') returns Spark NLP model sent_bert_finnish_cased\n","nlu.load('fi.embed_sentence.bert.cased') returns Spark NLP model sent_bert_finnish_cased\n","nlu.load('fi.embed_sentence.bert.uncased') returns Spark NLP model sent_bert_finnish_uncased\n","For language NLU provides the following Models : \n","nlu.load('xx.embed_sentence') returns Spark NLP model sent_bert_multi_cased\n","nlu.load('xx.embed_sentence.bert') returns Spark NLP model sent_bert_multi_cased\n","nlu.load('xx.embed_sentence.bert.cased') returns Spark NLP model sent_bert_multi_cased\n","nlu.load('xx.embed_sentence.labse') returns Spark NLP model labse\n"],"name":"stdout"}]},{"cell_type":"code","metadata":{"colab":{"base_uri":"https://localhost:8080/","height":651},"id":"IKK_Ii_gjJfF","executionInfo":{"status":"ok","timestamp":1620215663304,"user_tz":-120,"elapsed":596311,"user":{"displayName":"Christian Kasim Loan","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GjqAD-ircKP-s5Eh6JSdkDggDczfqQbJGU_IRb4Hw=s64","userId":"14469489166467359317"}},"outputId":"776428c8-8135-4f41-edfd-358ee5572e2f"},"source":["trainable_pipe = nlu.load('embed_sentence.bert train.sentiment')\n","# We need to train longer and user smaller LR for NON-USE based sentence embeddings usually\n","# We could tune the hyperparameters further with hyperparameter tuning methods like gridsearch\n","# Also longer training gives more accuracy\n","trainable_pipe['trainable_sentiment_dl'].setMaxEpochs(40) \n","trainable_pipe['trainable_sentiment_dl'].setLr(0.0005) \n","fitted_pipe = trainable_pipe.fit(train_df)\n","# predict with the trainable pipeline on dataset and get predictions\n","preds = fitted_pipe.predict(train_df,output_level='document')\n","\n","#sentence detector that is part of the pipe generates sone NaNs. lets drop them first\n","preds.dropna(inplace=True)\n","print(classification_report(preds['y'], preds['sentiment']))\n","\n","preds"],"execution_count":null,"outputs":[{"output_type":"stream","text":["sent_small_bert_L2_128 download started this may take some time.\n","Approximate size to download 16.1 MB\n","[OK!]\n","sentence_detector_dl download started this may take some time.\n","Approximate size to download 354.6 KB\n","[OK!]\n"," precision recall f1-score support\n","\n"," negative 0.68 0.24 0.35 2106\n"," neutral 0.00 0.00 0.00 0\n"," positive 0.72 0.84 0.77 3685\n","\n"," accuracy 0.62 5791\n"," macro avg 0.47 0.36 0.37 5791\n","weighted avg 0.71 0.62 0.62 5791\n","\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"," \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"," \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"," \n"," \n"," \n"," \n","
sentenceorigin_indexydocumenttrained_sentiment_confidencetrained_sentimenttextsentence_embedding_bert
0[Kickers on my watchlist XIDE TIT SOQ PNK CPW ...0positiveKickers on my watchlist XIDE TIT SOQ PNK CPW B...0.864774positiveKickers on my watchlist XIDE TIT SOQ PNK CPW B...[-0.9207566380500793, 0.21013399958610535, 0.1...
1[user: AAP MOVIE. 55% return for the FEA/GEED ...1positiveuser: AAP MOVIE. 55% return for the FEA/GEED i...0.648291positiveuser: AAP MOVIE. 55% return for the FEA/GEED i...[-0.43004706501960754, 0.5101228952407837, -0....
2[user I'd be afraid to short AMZN - they are l...2positiveuser I'd be afraid to short AMZN - they are lo...0.793143positiveuser I'd be afraid to short AMZN - they are lo...[0.3040030300617218, 0.22862930595874786, -0.5...
3[MNTA Over 12.00]3positiveMNTA Over 12.000.964940positiveMNTA Over 12.00[-1.8103482723236084, -0.4799136519432068, -0....
4[OI Over 21.37]4positiveOI Over 21.370.959243positiveOI Over 21.37[-2.4639298915863037, 0.3879586458206177, -0.6...
...........................
5786[Industry body CII said #discoms are likely to...5786negativeIndustry body CII said #discoms are likely to ...0.753365negativeIndustry body CII said #discoms are likely to ...[-0.09503882378339767, 0.6293947696685791, 0.0...
5787[#Gold prices slip below Rs 46,000 as #investo...5787negative#Gold prices slip below Rs 46,000 as #investor...0.724050negative#Gold prices slip below Rs 46,000 as #investor...[-0.12879370152950287, 0.28170245885849, 0.028...
5788[Workers at Bajaj Auto have agreed to a 10% wa...5788positiveWorkers at Bajaj Auto have agreed to a 10% wag...0.781417negativeWorkers at Bajaj Auto have agreed to a 10% wag...[-0.3395586907863617, 0.9124063849449158, -0.3...
5789[#Sharemarket LIVE: Sensex off day’s high, up ...5789positive#Sharemarket LIVE: Sensex off day’s high, up 6...0.520319neutral#Sharemarket LIVE: Sensex off day’s high, up 6...[-0.6081282496452332, 0.2732301652431488, 0.25...
5790[#Sensex, #Nifty climb off day's highs, still ...5790positive#Sensex, #Nifty climb off day's highs, still u...0.542672neutral#Sensex, #Nifty climb off day's highs, still u...[-0.4486270248889923, 0.43264666199684143, 0.0...
\n","

5791 rows × 8 columns

\n","
"],"text/plain":[" sentence ... sentence_embedding_bert\n","0 [Kickers on my watchlist XIDE TIT SOQ PNK CPW ... ... [-0.9207566380500793, 0.21013399958610535, 0.1...\n","1 [user: AAP MOVIE. 55% return for the FEA/GEED ... ... [-0.43004706501960754, 0.5101228952407837, -0....\n","2 [user I'd be afraid to short AMZN - they are l... ... [0.3040030300617218, 0.22862930595874786, -0.5...\n","3 [MNTA Over 12.00] ... [-1.8103482723236084, -0.4799136519432068, -0....\n","4 [OI Over 21.37] ... [-2.4639298915863037, 0.3879586458206177, -0.6...\n","... ... ... ...\n","5786 [Industry body CII said #discoms are likely to... ... [-0.09503882378339767, 0.6293947696685791, 0.0...\n","5787 [#Gold prices slip below Rs 46,000 as #investo... ... [-0.12879370152950287, 0.28170245885849, 0.028...\n","5788 [Workers at Bajaj Auto have agreed to a 10% wa... ... [-0.3395586907863617, 0.9124063849449158, -0.3...\n","5789 [#Sharemarket LIVE: Sensex off day’s high, up ... ... [-0.6081282496452332, 0.2732301652431488, 0.25...\n","5790 [#Sensex, #Nifty climb off day's highs, still ... ... [-0.4486270248889923, 0.43264666199684143, 0.0...\n","\n","[5791 rows x 8 columns]"]},"metadata":{"tags":[]},"execution_count":11}]},{"cell_type":"markdown","metadata":{"id":"2BB-NwZUoHSe"},"source":["# 5. Lets save the model"]},{"cell_type":"code","metadata":{"id":"eLex095goHwm","colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"status":"ok","timestamp":1620215683754,"user_tz":-120,"elapsed":616758,"user":{"displayName":"Christian Kasim Loan","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GjqAD-ircKP-s5Eh6JSdkDggDczfqQbJGU_IRb4Hw=s64","userId":"14469489166467359317"}},"outputId":"d32a77d0-d25b-414d-e849-d6fee69b169c"},"source":["stored_model_path = './models/classifier_dl_trained' \n","fitted_pipe.save(stored_model_path)"],"execution_count":null,"outputs":[{"output_type":"stream","text":["Stored model in ./models/classifier_dl_trained\n"],"name":"stdout"}]},{"cell_type":"markdown","metadata":{"id":"e_b2DPd4rCiU"},"source":["# 6. Lets load the model from HDD.\n","This makes Offlien NLU usage possible! \n","You need to call nlu.load(path=path_to_the_pipe) to load a model/pipeline from disk."]},{"cell_type":"code","metadata":{"id":"SO4uz45MoRgp","colab":{"base_uri":"https://localhost:8080/","height":76},"executionInfo":{"status":"ok","timestamp":1620215688728,"user_tz":-120,"elapsed":621729,"user":{"displayName":"Christian Kasim Loan","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GjqAD-ircKP-s5Eh6JSdkDggDczfqQbJGU_IRb4Hw=s64","userId":"14469489166467359317"}},"outputId":"d8ab883e-ae6e-442f-e92c-c2ce7147e3ee"},"source":["hdd_pipe = nlu.load(path=stored_model_path)\n","\n","preds = hdd_pipe.predict('Tesla plans to invest 10M into the ML sector')\n","preds"],"execution_count":null,"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","
sentimentsentenceorigin_indexdocumentsentence_embedding_from_disksentiment_confidencetext
0[positive][Tesla plans to invest 10M into the ML sector]8589934592Tesla plans to invest 10M into the ML sector[[-0.07111598551273346, 0.9532928466796875, -1...[0.9114534]Tesla plans to invest 10M into the ML sector
\n","
"],"text/plain":[" sentiment ... text\n","0 [positive] ... Tesla plans to invest 10M into the ML sector\n","\n","[1 rows x 7 columns]"]},"metadata":{"tags":[]},"execution_count":13}]},{"cell_type":"code","metadata":{"id":"e0CVlkk9v6Qi","colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"status":"ok","timestamp":1620215688730,"user_tz":-120,"elapsed":621726,"user":{"displayName":"Christian Kasim Loan","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GjqAD-ircKP-s5Eh6JSdkDggDczfqQbJGU_IRb4Hw=s64","userId":"14469489166467359317"}},"outputId":"e5f153e0-cb42-4779-dfa2-ccefb4f1fba4"},"source":["hdd_pipe.print_info()"],"execution_count":null,"outputs":[{"output_type":"stream","text":["The following parameters are configurable for this NLU pipeline (You can copy paste the examples) :\n",">>> pipe['document_assembler'] has settable params:\n","pipe['document_assembler'].setCleanupMode('shrink') | Info: possible values: disabled, inplace, inplace_full, shrink, shrink_full, each, each_full, delete_full | Currently set to : shrink\n",">>> pipe['sentence_detector@SentenceDetectorDLModel_c83c27f46b97'] has settable params:\n","pipe['sentence_detector@SentenceDetectorDLModel_c83c27f46b97'].setExplodeSentences(False) | Info: whether to explode each sentence into a different row, for better parallelization. Defaults to false. | Currently set to : False\n","pipe['sentence_detector@SentenceDetectorDLModel_c83c27f46b97'].setStorageRef('SentenceDetectorDLModel_c83c27f46b97') | Info: storage unique identifier | Currently set to : SentenceDetectorDLModel_c83c27f46b97\n","pipe['sentence_detector@SentenceDetectorDLModel_c83c27f46b97'].setEncoder(com.johnsnowlabs.nlp.annotators.sentence_detector_dl.SentenceDetectorDLEncoder@63c37ce4) | Info: Data encoder | Currently set to : com.johnsnowlabs.nlp.annotators.sentence_detector_dl.SentenceDetectorDLEncoder@63c37ce4\n","pipe['sentence_detector@SentenceDetectorDLModel_c83c27f46b97'].setImpossiblePenultimates(['Bros', 'No', 'al', 'vs', 'etc', 'Fig', 'Dr', 'Prof', 'PhD', 'MD', 'Co', 'Corp', 'Inc', 'bros', 'VS', 'Vs', 'ETC', 'fig', 'dr', 'prof', 'PHD', 'phd', 'md', 'co', 'corp', 'inc', 'Jan', 'Feb', 'Mar', 'Apr', 'Jul', 'Aug', 'Sep', 'Sept', 'Oct', 'Nov', 'Dec', 'St', 'st', 'AM', 'PM', 'am', 'pm', 'e.g', 'f.e', 'i.e']) | Info: Impossible penultimates | Currently set to : ['Bros', 'No', 'al', 'vs', 'etc', 'Fig', 'Dr', 'Prof', 'PhD', 'MD', 'Co', 'Corp', 'Inc', 'bros', 'VS', 'Vs', 'ETC', 'fig', 'dr', 'prof', 'PHD', 'phd', 'md', 'co', 'corp', 'inc', 'Jan', 'Feb', 'Mar', 'Apr', 'Jul', 'Aug', 'Sep', 'Sept', 'Oct', 'Nov', 'Dec', 'St', 'st', 'AM', 'PM', 'am', 'pm', 'e.g', 'f.e', 'i.e']\n","pipe['sentence_detector@SentenceDetectorDLModel_c83c27f46b97'].setModelArchitecture('cnn') | Info: Model architecture (CNN) | Currently set to : cnn\n",">>> pipe['bert_sentence@sent_small_bert_L2_128'] has settable params:\n","pipe['bert_sentence@sent_small_bert_L2_128'].setBatchSize(8) | Info: Size of every batch | Currently set to : 8\n","pipe['bert_sentence@sent_small_bert_L2_128'].setCaseSensitive(False) | Info: whether to ignore case in tokens for embeddings matching | Currently set to : False\n","pipe['bert_sentence@sent_small_bert_L2_128'].setDimension(128) | Info: Number of embedding dimensions | Currently set to : 128\n","pipe['bert_sentence@sent_small_bert_L2_128'].setMaxSentenceLength(128) | Info: Max sentence length to process | Currently set to : 128\n","pipe['bert_sentence@sent_small_bert_L2_128'].setIsLong(False) | Info: Use Long type instead of Int type for inputs buffer - Some Bert models require Long instead of Int. | Currently set to : False\n","pipe['bert_sentence@sent_small_bert_L2_128'].setStorageRef('sent_small_bert_L2_128') | Info: unique reference name for identification | Currently set to : sent_small_bert_L2_128\n",">>> pipe['sentiment_dl@sent_small_bert_L2_128'] has settable params:\n","pipe['sentiment_dl@sent_small_bert_L2_128'].setThreshold(0.6) | Info: The minimum threshold for the final result otheriwse it will be neutral | Currently set to : 0.6\n","pipe['sentiment_dl@sent_small_bert_L2_128'].setThresholdLabel('neutral') | Info: In case the score is less than threshold, what should be the label. Default is neutral. | Currently set to : neutral\n","pipe['sentiment_dl@sent_small_bert_L2_128'].setClasses(['positive', 'negative']) | Info: get the tags used to trained this SentimentDLModel | Currently set to : ['positive', 'negative']\n","pipe['sentiment_dl@sent_small_bert_L2_128'].setStorageRef('sent_small_bert_L2_128') | Info: unique reference name for identification | Currently set to : sent_small_bert_L2_128\n"],"name":"stdout"}]},{"cell_type":"code","metadata":{"id":"73rQbUy-KLpb"},"source":[""],"execution_count":null,"outputs":[]}]} \ No newline at end of file +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": { + "id": "zkufh760uvF3" + }, + "source": [ + "![JohnSnowLabs](https://nlp.johnsnowlabs.com/assets/images/logo.png)\n", + "\n", + "[![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/JohnSnowLabs/nlu/blob/master/examples/colab/Training/binary_text_classification/NLU_training_sentiment_classifier_demo.ipynb)\n", + "\n", + "\n", + "\n", + "# Training a Sentiment Analysis Classifier with NLU\n", + "With the [ClassifierDL model](https://nlp.johnsnowlabs.com/docs/en/annotators#classifierdl-multi-class-text-classification) from Spark NLP you can achieve State Of the Art results on any multi class text classification problem\n", + "\n", + "This notebook showcases the following features :\n", + "\n", + "- How to train the deep learning classifier\n", + "- How to store a pipeline to disk\n", + "- How to load the pipeline from disk (Enables NLU offline mode)\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "dur2drhW5Rvi" + }, + "source": [ + "# 1. Install Java 8 and NLU" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "hFGnBCHavltY" + }, + "outputs": [], + "source": [ + "!pip install -q johnsnowlabs" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "f4KkTfnR5Ugg" + }, + "source": [ + "# 2. Download Stock Market Sentiment dataset\n", + "https://www.kaggle.com/yash612/stockmarket-sentiment-dataset" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "OrVb5ZMvvrQD" + }, + "outputs": [], + "source": [ + "! wget https://s3.amazonaws.com/auxdata.johnsnowlabs.com/public/resources/en/classifier-dl/stock_data/stock_data.csv\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "uDGIOASY_fRj", + "outputId": "bdd53b41-7b1e-47e8-9783-b4d8e3315d84" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Warning::Spark Session already created, some configs may not take.\n", + "sentimentdl_glove_imdb download started this may take some time.\n", + "Approximate size to download 8.7 MB\n", + "[OK!]\n", + "glove_100d download started this may take some time.\n", + "Approximate size to download 145.3 MB\n", + "[OK!]\n" + ] + } + ], + "source": [ + "from johnsnowlabs import nlp\n", + "sentiment = nlp.load('sentiment')" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 150 + }, + "id": "U0ENiuMc_kyb", + "outputId": "5d5d2dc8-7481-468c-ff8c-0c45fdc0b0c7" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "sentence_detector_dl download started this may take some time.\n", + "Approximate size to download 354.6 KB\n", + "[OK!]\n", + "Warning::Spark Session already created, some configs may not take.\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", + "
sentencesentence_embedding_convertersentimentsentiment_confidenceword_embedding_glove
0I'm very very not at all happy[-0.2865465581417084, 0.25398728251457214, 0.2...pos0.999995[[0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,...
\n", + "
\n", + "
\n", + "\n", + "
\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "
\n", + "\n", + "
\n", + "
\n" + ], + "text/plain": [ + " sentence \\\n", + "0 I'm very very not at all happy \n", + "\n", + " sentence_embedding_converter sentiment \\\n", + "0 [-0.2865465581417084, 0.25398728251457214, 0.2... pos \n", + "\n", + " sentiment_confidence word_embedding_glove \n", + "0 0.999995 [[0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,... " + ] + }, + "execution_count": 3, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "sentiment.predict(\"I'm very very not at all happy\")" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 424 + }, + "id": "y4xSRWIhwT28", + "outputId": "c486e2d0-708b-4519-b43c-7427900236cf" + }, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + "
\n", + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \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", + "
texty
0Kickers on my watchlist XIDE TIT SOQ PNK CPW B...positive
1user: AAP MOVIE. 55% return for the FEA/GEED i...positive
2user I'd be afraid to short AMZN - they are lo...positive
3MNTA Over 12.00positive
4OI Over 21.37positive
.........
5786Industry body CII said #discoms are likely to ...negative
5787#Gold prices slip below Rs 46,000 as #investor...negative
5788Workers at Bajaj Auto have agreed to a 10% wag...positive
5789#Sharemarket LIVE: Sensex off day’s high, up 6...positive
5790#Sensex, #Nifty climb off day's highs, still u...positive
\n", + "

5791 rows × 2 columns

\n", + "
\n", + "
\n", + "\n", + "
\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "
\n", + "\n", + "\n", + "
\n", + " \n", + "\n", + "\n", + "\n", + " \n", + "
\n", + "
\n", + "
\n" + ], + "text/plain": [ + " text y\n", + "0 Kickers on my watchlist XIDE TIT SOQ PNK CPW B... positive\n", + "1 user: AAP MOVIE. 55% return for the FEA/GEED i... positive\n", + "2 user I'd be afraid to short AMZN - they are lo... positive\n", + "3 MNTA Over 12.00 positive\n", + "4 OI Over 21.37 positive\n", + "... ... ...\n", + "5786 Industry body CII said #discoms are likely to ... negative\n", + "5787 #Gold prices slip below Rs 46,000 as #investor... negative\n", + "5788 Workers at Bajaj Auto have agreed to a 10% wag... positive\n", + "5789 #Sharemarket LIVE: Sensex off day’s high, up 6... positive\n", + "5790 #Sensex, #Nifty climb off day's highs, still u... positive\n", + "\n", + "[5791 rows x 2 columns]" + ] + }, + "execution_count": 2, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "import pandas as pd\n", + "train_path = '/content/stock_data.csv'\n", + "\n", + "train_df = pd.read_csv(train_path)\n", + "# the text data to use for classification should be in a column named 'text'\n", + "# the label column must have name 'y' name be of type str\n", + "train_df.columns=['text','y']\n", + "train_df.y = train_df.y.astype(str)\n", + "train_df.y = train_df.y.str.replace('-1','negative')\n", + "train_df.y = train_df.y.str.replace('1','positive')\n", + "train_df" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "0296Om2C5anY" + }, + "source": [ + "# 3. Train Deep Learning Classifier using nlu.load('train.sentiment')\n", + "\n", + "You dataset label column should be named 'y' and the feature column with text data should be named 'text'" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 806 + }, + "id": "3ZIPkRkWftBG", + "outputId": "91874f31-7e1a-4180-c354-5317930d5c4c" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Warning::Spark Session already created, some configs may not take.\n", + "Warning::Spark Session already created, some configs may not take.\n", + "sent_small_bert_L2_128 download started this may take some time.\n", + "Approximate size to download 16.1 MB\n", + "[OK!]\n", + " precision recall f1-score support\n", + "\n", + " negative 0.00 0.00 0.00 2106\n", + " positive 0.64 1.00 0.78 3685\n", + "\n", + " accuracy 0.64 5791\n", + " macro avg 0.32 0.50 0.39 5791\n", + "weighted avg 0.40 0.64 0.49 5791\n", + "\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", + " \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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
documentsentence_embedding_small_bert_L2_128sentimentsentiment_confidencetexty
0Kickers on my watchlist XIDE TIT SOQ PNK CPW B...[-0.9530864357948303, 0.2135828286409378, 0.10...positive1.0Kickers on my watchlist XIDE TIT SOQ PNK CPW B...positive
1user: AAP MOVIE. 55% return for the FEA/GEED i...[-0.4725969433784485, 0.5354134440422058, -0.2...positive1.0user: AAP MOVIE. 55% return for the FEA/GEED i...positive
2user I'd be afraid to short AMZN - they are lo...[0.30400288105010986, 0.22862982749938965, -0....positive1.0user I'd be afraid to short AMZN - they are lo...positive
3MNTA Over 12.00[-1.707902193069458, -0.48472753167152405, -0....positive1.0MNTA Over 12.00positive
4OI Over 21.37[-2.3011534214019775, 0.2649511396884918, -0.4...positive1.0OI Over 21.37positive
.....................
5786Industry body CII said #discoms are likely to ...[-0.21655204892158508, 0.6153537631034851, 0.0...positive1.0Industry body CII said #discoms are likely to ...negative
5787#Gold prices slip below Rs 46,000 as #investor...[-0.19915254414081573, 0.2607441842556, 0.0032...positive1.0#Gold prices slip below Rs 46,000 as #investor...negative
5788Workers at Bajaj Auto have agreed to a 10% wag...[-0.4361518919467926, 0.9346759915351868, -0.3...positive1.0Workers at Bajaj Auto have agreed to a 10% wag...positive
5789#Sharemarket LIVE: Sensex off day’s high, up 6...[-0.6081278920173645, 0.2732301354408264, 0.25...positive1.0#Sharemarket LIVE: Sensex off day’s high, up 6...positive
5790#Sensex, #Nifty climb off day's highs, still u...[-0.5274896621704102, 0.4326432943344116, 0.06...positive1.0#Sensex, #Nifty climb off day's highs, still u...positive
\n", + "

5791 rows × 6 columns

\n", + "
\n", + "
\n", + "\n", + "
\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "
\n", + "\n", + "\n", + "
\n", + " \n", + "\n", + "\n", + "\n", + " \n", + "
\n", + "
\n", + "
\n" + ], + "text/plain": [ + " document \\\n", + "0 Kickers on my watchlist XIDE TIT SOQ PNK CPW B... \n", + "1 user: AAP MOVIE. 55% return for the FEA/GEED i... \n", + "2 user I'd be afraid to short AMZN - they are lo... \n", + "3 MNTA Over 12.00 \n", + "4 OI Over 21.37 \n", + "... ... \n", + "5786 Industry body CII said #discoms are likely to ... \n", + "5787 #Gold prices slip below Rs 46,000 as #investor... \n", + "5788 Workers at Bajaj Auto have agreed to a 10% wag... \n", + "5789 #Sharemarket LIVE: Sensex off day’s high, up 6... \n", + "5790 #Sensex, #Nifty climb off day's highs, still u... \n", + "\n", + " sentence_embedding_small_bert_L2_128 sentiment \\\n", + "0 [-0.9530864357948303, 0.2135828286409378, 0.10... positive \n", + "1 [-0.4725969433784485, 0.5354134440422058, -0.2... positive \n", + "2 [0.30400288105010986, 0.22862982749938965, -0.... positive \n", + "3 [-1.707902193069458, -0.48472753167152405, -0.... positive \n", + "4 [-2.3011534214019775, 0.2649511396884918, -0.4... positive \n", + "... ... ... \n", + "5786 [-0.21655204892158508, 0.6153537631034851, 0.0... positive \n", + "5787 [-0.19915254414081573, 0.2607441842556, 0.0032... positive \n", + "5788 [-0.4361518919467926, 0.9346759915351868, -0.3... positive \n", + "5789 [-0.6081278920173645, 0.2732301354408264, 0.25... positive \n", + "5790 [-0.5274896621704102, 0.4326432943344116, 0.06... positive \n", + "\n", + " sentiment_confidence text \\\n", + "0 1.0 Kickers on my watchlist XIDE TIT SOQ PNK CPW B... \n", + "1 1.0 user: AAP MOVIE. 55% return for the FEA/GEED i... \n", + "2 1.0 user I'd be afraid to short AMZN - they are lo... \n", + "3 1.0 MNTA Over 12.00 \n", + "4 1.0 OI Over 21.37 \n", + "... ... ... \n", + "5786 1.0 Industry body CII said #discoms are likely to ... \n", + "5787 1.0 #Gold prices slip below Rs 46,000 as #investor... \n", + "5788 1.0 Workers at Bajaj Auto have agreed to a 10% wag... \n", + "5789 1.0 #Sharemarket LIVE: Sensex off day’s high, up 6... \n", + "5790 1.0 #Sensex, #Nifty climb off day's highs, still u... \n", + "\n", + " y \n", + "0 positive \n", + "1 positive \n", + "2 positive \n", + "3 positive \n", + "4 positive \n", + "... ... \n", + "5786 negative \n", + "5787 negative \n", + "5788 positive \n", + "5789 positive \n", + "5790 positive \n", + "\n", + "[5791 rows x 6 columns]" + ] + }, + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "from sklearn.metrics import classification_report\n", + "# load a trainable pipeline by specifying the train. prefix and fit it on a datset with label and text columns\n", + "# by default the Universal Sentence Encoder (USE) Sentence embeddings are used for generation\n", + "trainable_pipe = nlp.load('train.sentiment')\n", + "fitted_pipe = trainable_pipe.fit(train_df)\n", + "\n", + "# predict with the trainable pipeline on dataset and get predictions\n", + "preds = fitted_pipe.predict(train_df,output_level='document')\n", + "#sentence detector that is part of the pipe generates sone NaNs. lets drop them first\n", + "preds.dropna(inplace=True)\n", + "print(classification_report(preds['y'], preds['sentiment']))\n", + "\n", + "preds" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "lVyOE2wV0fw_" + }, + "source": [ + "# Test the fitted pipe on new example" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 150 + }, + "id": "qdCUg2MR0PD2", + "outputId": "d68ec313-a55c-4d59-c162-4b985b238ebc" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "sentence_detector_dl download started this may take some time.\n", + "Approximate size to download 354.6 KB\n", + "[OK!]\n", + "Warning::Spark Session already created, some configs may not take.\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", + "
sentencesentence_embedding_small_bert_L2_128sentimentsentiment_confidence
0Bitcoin is going to the moon![-1.0531491041183472, -0.2827455699443817, -0....positive1.0
\n", + "
\n", + "
\n", + "\n", + "
\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "
\n", + "\n", + "
\n", + "
\n" + ], + "text/plain": [ + " sentence \\\n", + "0 Bitcoin is going to the moon! \n", + "\n", + " sentence_embedding_small_bert_L2_128 sentiment \\\n", + "0 [-1.0531491041183472, -0.2827455699443817, -0.... positive \n", + "\n", + " sentiment_confidence \n", + "0 1.0 " + ] + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "fitted_pipe.predict(\"Bitcoin is going to the moon!\")" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "xflpwrVjjBVD" + }, + "source": [ + "## Configure pipe training parameters" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "UtsAUGTmOTms", + "outputId": "8b700f48-678d-4e18-fab7-b03a3eba15b0" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "The following parameters are configurable for this NLU pipeline (You can copy paste the examples) :\n", + ">>> component_list['bert_sentence_embeddings@sent_small_bert_L2_128'] has settable params:\n", + "component_list['bert_sentence_embeddings@sent_small_bert_L2_128'].setBatchSize(8) | Info: Size of every batch | Currently set to : 8\n", + "component_list['bert_sentence_embeddings@sent_small_bert_L2_128'].setEngine('tensorflow') | Info: Deep Learning engine used for this model | Currently set to : tensorflow\n", + "component_list['bert_sentence_embeddings@sent_small_bert_L2_128'].setIsLong(False) | Info: Use Long type instead of Int type for inputs buffer - Some Bert models require Long instead of Int. | Currently set to : False\n", + "component_list['bert_sentence_embeddings@sent_small_bert_L2_128'].setMaxSentenceLength(128) | Info: Max sentence length to process | Currently set to : 128\n", + "component_list['bert_sentence_embeddings@sent_small_bert_L2_128'].setDimension(128) | Info: Number of embedding dimensions | Currently set to : 128\n", + "component_list['bert_sentence_embeddings@sent_small_bert_L2_128'].setCaseSensitive(False) | Info: whether to ignore case in tokens for embeddings matching | Currently set to : False\n", + "component_list['bert_sentence_embeddings@sent_small_bert_L2_128'].setStorageRef('sent_small_bert_L2_128') | Info: unique reference name for identification | Currently set to : sent_small_bert_L2_128\n", + ">>> component_list['document_assembler'] has settable params:\n", + "component_list['document_assembler'].setCleanupMode('shrink') | Info: possible values: disabled, inplace, inplace_full, shrink, shrink_full, each, each_full, delete_full | Currently set to : shrink\n", + ">>> component_list['sentiment_dl@sent_small_bert_L2_128'] has settable params:\n", + "component_list['sentiment_dl@sent_small_bert_L2_128'].setEngine('tensorflow') | Info: Deep Learning engine used for this model | Currently set to : tensorflow\n", + "component_list['sentiment_dl@sent_small_bert_L2_128'].setThreshold(0.6) | Info: The minimum threshold for the final result otheriwse it will be neutral | Currently set to : 0.6\n", + "component_list['sentiment_dl@sent_small_bert_L2_128'].setThresholdLabel('neutral') | Info: In case the score is less than threshold, what should be the label. Default is neutral. | Currently set to : neutral\n", + "component_list['sentiment_dl@sent_small_bert_L2_128'].setStorageRef('sent_small_bert_L2_128') | Info: unique reference name for identification | Currently set to : sent_small_bert_L2_128\n" + ] + } + ], + "source": [ + "trainable_pipe.print_info()" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "2GJdDNV9jEIe" + }, + "source": [ + "## Retrain with new parameters" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 806 + }, + "id": "mptfvHx-MMMX", + "outputId": "57b240b3-3c7d-4fd1-a1e7-3d0f6212a02a" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Warning::Spark Session already created, some configs may not take.\n", + "Warning::Spark Session already created, some configs may not take.\n", + "sent_small_bert_L2_128 download started this may take some time.\n", + "Approximate size to download 16.1 MB\n", + "[OK!]\n", + " precision recall f1-score support\n", + "\n", + " negative 0.00 0.00 0.00 2106\n", + " positive 0.64 1.00 0.78 3685\n", + "\n", + " accuracy 0.64 5791\n", + " macro avg 0.32 0.50 0.39 5791\n", + "weighted avg 0.40 0.64 0.49 5791\n", + "\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", + " \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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
documentsentence_embedding_small_bert_L2_128sentimentsentiment_confidencetexty
0Kickers on my watchlist XIDE TIT SOQ PNK CPW B...[-0.9530864357948303, 0.2135828286409378, 0.10...positive1.0Kickers on my watchlist XIDE TIT SOQ PNK CPW B...positive
1user: AAP MOVIE. 55% return for the FEA/GEED i...[-0.4725969433784485, 0.5354134440422058, -0.2...positive1.0user: AAP MOVIE. 55% return for the FEA/GEED i...positive
2user I'd be afraid to short AMZN - they are lo...[0.30400288105010986, 0.22862982749938965, -0....positive1.0user I'd be afraid to short AMZN - they are lo...positive
3MNTA Over 12.00[-1.707902193069458, -0.48472753167152405, -0....positive1.0MNTA Over 12.00positive
4OI Over 21.37[-2.3011534214019775, 0.2649511396884918, -0.4...positive1.0OI Over 21.37positive
.....................
5786Industry body CII said #discoms are likely to ...[-0.21655204892158508, 0.6153537631034851, 0.0...positive1.0Industry body CII said #discoms are likely to ...negative
5787#Gold prices slip below Rs 46,000 as #investor...[-0.19915254414081573, 0.2607441842556, 0.0032...positive1.0#Gold prices slip below Rs 46,000 as #investor...negative
5788Workers at Bajaj Auto have agreed to a 10% wag...[-0.4361518919467926, 0.9346759915351868, -0.3...positive1.0Workers at Bajaj Auto have agreed to a 10% wag...positive
5789#Sharemarket LIVE: Sensex off day’s high, up 6...[-0.6081278920173645, 0.2732301354408264, 0.25...positive1.0#Sharemarket LIVE: Sensex off day’s high, up 6...positive
5790#Sensex, #Nifty climb off day's highs, still u...[-0.5274896621704102, 0.4326432943344116, 0.06...positive1.0#Sensex, #Nifty climb off day's highs, still u...positive
\n", + "

5791 rows × 6 columns

\n", + "
\n", + "
\n", + "\n", + "
\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "
\n", + "\n", + "\n", + "
\n", + " \n", + "\n", + "\n", + "\n", + " \n", + "
\n", + "
\n", + "
\n" + ], + "text/plain": [ + " document \\\n", + "0 Kickers on my watchlist XIDE TIT SOQ PNK CPW B... \n", + "1 user: AAP MOVIE. 55% return for the FEA/GEED i... \n", + "2 user I'd be afraid to short AMZN - they are lo... \n", + "3 MNTA Over 12.00 \n", + "4 OI Over 21.37 \n", + "... ... \n", + "5786 Industry body CII said #discoms are likely to ... \n", + "5787 #Gold prices slip below Rs 46,000 as #investor... \n", + "5788 Workers at Bajaj Auto have agreed to a 10% wag... \n", + "5789 #Sharemarket LIVE: Sensex off day’s high, up 6... \n", + "5790 #Sensex, #Nifty climb off day's highs, still u... \n", + "\n", + " sentence_embedding_small_bert_L2_128 sentiment \\\n", + "0 [-0.9530864357948303, 0.2135828286409378, 0.10... positive \n", + "1 [-0.4725969433784485, 0.5354134440422058, -0.2... positive \n", + "2 [0.30400288105010986, 0.22862982749938965, -0.... positive \n", + "3 [-1.707902193069458, -0.48472753167152405, -0.... positive \n", + "4 [-2.3011534214019775, 0.2649511396884918, -0.4... positive \n", + "... ... ... \n", + "5786 [-0.21655204892158508, 0.6153537631034851, 0.0... positive \n", + "5787 [-0.19915254414081573, 0.2607441842556, 0.0032... positive \n", + "5788 [-0.4361518919467926, 0.9346759915351868, -0.3... positive \n", + "5789 [-0.6081278920173645, 0.2732301354408264, 0.25... positive \n", + "5790 [-0.5274896621704102, 0.4326432943344116, 0.06... positive \n", + "\n", + " sentiment_confidence text \\\n", + "0 1.0 Kickers on my watchlist XIDE TIT SOQ PNK CPW B... \n", + "1 1.0 user: AAP MOVIE. 55% return for the FEA/GEED i... \n", + "2 1.0 user I'd be afraid to short AMZN - they are lo... \n", + "3 1.0 MNTA Over 12.00 \n", + "4 1.0 OI Over 21.37 \n", + "... ... ... \n", + "5786 1.0 Industry body CII said #discoms are likely to ... \n", + "5787 1.0 #Gold prices slip below Rs 46,000 as #investor... \n", + "5788 1.0 Workers at Bajaj Auto have agreed to a 10% wag... \n", + "5789 1.0 #Sharemarket LIVE: Sensex off day’s high, up 6... \n", + "5790 1.0 #Sensex, #Nifty climb off day's highs, still u... \n", + "\n", + " y \n", + "0 positive \n", + "1 positive \n", + "2 positive \n", + "3 positive \n", + "4 positive \n", + "... ... \n", + "5786 negative \n", + "5787 negative \n", + "5788 positive \n", + "5789 positive \n", + "5790 positive \n", + "\n", + "[5791 rows x 6 columns]" + ] + }, + "execution_count": 8, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Train longer!\n", + "trainable_pipe = nlp.load('train.sentiment')\n", + "trainable_pipe['trainable_sentiment_dl'].setMaxEpochs(5)\n", + "fitted_pipe = trainable_pipe.fit(train_df)\n", + "# predict with the trainable pipeline on dataset and get predictions\n", + "preds = fitted_pipe.predict(train_df,output_level='document')\n", + "\n", + "#sentence detector that is part of the pipe generates sone NaNs. lets drop them first\n", + "preds.dropna(inplace=True)\n", + "print(classification_report(preds['y'], preds['sentiment']))\n", + "\n", + "preds" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "qFoT-s1MjTSS" + }, + "source": [ + "# Try training with different Embeddings" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "nxWFzQOhjWC8", + "outputId": "34e045c7-7402-448a-d52e-cb6ce06c9a00" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "For language NLU provides the following Models : \n", + "nlu.load('am.embed_sentence.xlm_roberta') returns Spark NLP model_anno_obj sent_xlm_roberta_base_finetuned_amharic\n", + "For language NLU provides the following Models : \n", + "nlu.load('de.embed_sentence.bert.base_cased') returns Spark NLP model_anno_obj sent_bert_base_cased\n", + "For language NLU provides the following Models : \n", + "nlu.load('el.embed_sentence.bert.base_uncased') returns Spark NLP model_anno_obj sent_bert_base_uncased\n", + "For language NLU provides the following Models : \n", + "nlu.load('en.embed_sentence') returns Spark NLP model_anno_obj tfhub_use\n", + "nlu.load('en.embed_sentence.albert') returns Spark NLP model_anno_obj albert_base_uncased\n", + "nlu.load('en.embed_sentence.bert') returns Spark NLP model_anno_obj sent_bert_base_uncased\n", + "nlu.load('en.embed_sentence.bert.base_uncased_legal') returns Spark NLP model_anno_obj sent_bert_base_uncased_legal\n", + "nlu.load('en.embed_sentence.bert.finetuned') returns Spark NLP model_anno_obj sbert_setfit_finetuned_financial_text_classification\n", + "nlu.load('en.embed_sentence.bert.pubmed') returns Spark NLP model_anno_obj sent_bert_pubmed\n", + "nlu.load('en.embed_sentence.bert.pubmed_squad2') returns Spark NLP model_anno_obj sent_bert_pubmed_squad2\n", + "nlu.load('en.embed_sentence.bert.wiki_books') returns Spark NLP model_anno_obj sent_bert_wiki_books\n", + "nlu.load('en.embed_sentence.bert.wiki_books_mnli') returns Spark NLP model_anno_obj sent_bert_wiki_books_mnli\n", + "nlu.load('en.embed_sentence.bert.wiki_books_qnli') returns Spark NLP model_anno_obj sent_bert_wiki_books_qnli\n", + "nlu.load('en.embed_sentence.bert.wiki_books_qqp') returns Spark NLP model_anno_obj sent_bert_wiki_books_qqp\n", + "nlu.load('en.embed_sentence.bert.wiki_books_squad2') returns Spark NLP model_anno_obj sent_bert_wiki_books_squad2\n", + "nlu.load('en.embed_sentence.bert.wiki_books_sst2') returns Spark NLP model_anno_obj sent_bert_wiki_books_sst2\n", + "nlu.load('en.embed_sentence.bert_base_cased') returns Spark NLP model_anno_obj sent_bert_base_cased\n", + "nlu.load('en.embed_sentence.bert_base_uncased') returns Spark NLP model_anno_obj sent_bert_base_uncased\n", + "nlu.load('en.embed_sentence.bert_large_cased') returns Spark NLP model_anno_obj sent_bert_large_cased\n", + "nlu.load('en.embed_sentence.bert_large_uncased') returns Spark NLP model_anno_obj sent_bert_large_uncased\n", + "nlu.load('en.embed_sentence.bert_use_cmlm_en_base') returns Spark NLP model_anno_obj sent_bert_use_cmlm_en_base\n", + "nlu.load('en.embed_sentence.bert_use_cmlm_en_large') returns Spark NLP model_anno_obj sent_bert_use_cmlm_en_large\n", + "nlu.load('en.embed_sentence.biobert.clinical_base_cased') returns Spark NLP model_anno_obj sent_biobert_clinical_base_cased\n", + "nlu.load('en.embed_sentence.biobert.discharge_base_cased') returns Spark NLP model_anno_obj sent_biobert_discharge_base_cased\n", + "nlu.load('en.embed_sentence.biobert.pmc_base_cased') returns Spark NLP model_anno_obj sent_biobert_pmc_base_cased\n", + "nlu.load('en.embed_sentence.biobert.pubmed_base_cased') returns Spark NLP model_anno_obj sent_biobert_pubmed_base_cased\n", + "nlu.load('en.embed_sentence.biobert.pubmed_large_cased') returns Spark NLP model_anno_obj sent_biobert_pubmed_large_cased\n", + "nlu.load('en.embed_sentence.biobert.pubmed_pmc_base_cased') returns Spark NLP model_anno_obj sent_biobert_pubmed_pmc_base_cased\n", + "nlu.load('en.embed_sentence.covidbert.large_uncased') returns Spark NLP model_anno_obj sent_covidbert_large_uncased\n", + "nlu.load('en.embed_sentence.distil_roberta.distilled_base') returns Spark NLP model_anno_obj sent_distilroberta_base\n", + "nlu.load('en.embed_sentence.doc2vec') returns Spark NLP model_anno_obj doc2vec_gigaword_300\n", + "nlu.load('en.embed_sentence.doc2vec.gigaword_300') returns Spark NLP model_anno_obj doc2vec_gigaword_300\n", + "nlu.load('en.embed_sentence.doc2vec.gigaword_wiki_300') returns Spark NLP model_anno_obj doc2vec_gigaword_wiki_300\n", + "nlu.load('en.embed_sentence.electra') returns Spark NLP model_anno_obj sent_electra_small_uncased\n", + "nlu.load('en.embed_sentence.electra_base_uncased') returns Spark NLP model_anno_obj sent_electra_base_uncased\n", + "nlu.load('en.embed_sentence.electra_large_uncased') returns Spark NLP model_anno_obj sent_electra_large_uncased\n", + "nlu.load('en.embed_sentence.electra_small_uncased') returns Spark NLP model_anno_obj sent_electra_small_uncased\n", + "nlu.load('en.embed_sentence.roberta.base') returns Spark NLP model_anno_obj sent_roberta_base\n", + "nlu.load('en.embed_sentence.roberta.large') returns Spark NLP model_anno_obj sent_roberta_large\n", + "nlu.load('en.embed_sentence.small_bert_L10_128') returns Spark NLP model_anno_obj sent_small_bert_L10_128\n", + "nlu.load('en.embed_sentence.small_bert_L10_256') returns Spark NLP model_anno_obj sent_small_bert_L10_256\n", + "nlu.load('en.embed_sentence.small_bert_L10_512') returns Spark NLP model_anno_obj sent_small_bert_L10_512\n", + "nlu.load('en.embed_sentence.small_bert_L10_768') returns Spark NLP model_anno_obj sent_small_bert_L10_768\n", + "nlu.load('en.embed_sentence.small_bert_L12_128') returns Spark NLP model_anno_obj sent_small_bert_L12_128\n", + "nlu.load('en.embed_sentence.small_bert_L12_256') returns Spark NLP model_anno_obj sent_small_bert_L12_256\n", + "nlu.load('en.embed_sentence.small_bert_L12_512') returns Spark NLP model_anno_obj sent_small_bert_L12_512\n", + "nlu.load('en.embed_sentence.small_bert_L12_768') returns Spark NLP model_anno_obj sent_small_bert_L12_768\n", + "nlu.load('en.embed_sentence.small_bert_L2_128') returns Spark NLP model_anno_obj sent_small_bert_L2_128\n", + "nlu.load('en.embed_sentence.small_bert_L2_256') returns Spark NLP model_anno_obj sent_small_bert_L2_256\n", + "nlu.load('en.embed_sentence.small_bert_L2_512') returns Spark NLP model_anno_obj sent_small_bert_L2_512\n", + "nlu.load('en.embed_sentence.small_bert_L2_768') returns Spark NLP model_anno_obj sent_small_bert_L2_768\n", + "nlu.load('en.embed_sentence.small_bert_L4_128') returns Spark NLP model_anno_obj sent_small_bert_L4_128\n", + "nlu.load('en.embed_sentence.small_bert_L4_256') returns Spark NLP model_anno_obj sent_small_bert_L4_256\n", + "nlu.load('en.embed_sentence.small_bert_L4_512') returns Spark NLP model_anno_obj sent_small_bert_L4_512\n", + "nlu.load('en.embed_sentence.small_bert_L4_768') returns Spark NLP model_anno_obj sent_small_bert_L4_768\n", + "nlu.load('en.embed_sentence.small_bert_L6_128') returns Spark NLP model_anno_obj sent_small_bert_L6_128\n", + "nlu.load('en.embed_sentence.small_bert_L6_256') returns Spark NLP model_anno_obj sent_small_bert_L6_256\n", + "nlu.load('en.embed_sentence.small_bert_L6_512') returns Spark NLP model_anno_obj sent_small_bert_L6_512\n", + "nlu.load('en.embed_sentence.small_bert_L6_768') returns Spark NLP model_anno_obj sent_small_bert_L6_768\n", + "nlu.load('en.embed_sentence.small_bert_L8_128') returns Spark NLP model_anno_obj sent_small_bert_L8_128\n", + "nlu.load('en.embed_sentence.small_bert_L8_256') returns Spark NLP model_anno_obj sent_small_bert_L8_256\n", + "nlu.load('en.embed_sentence.small_bert_L8_512') returns Spark NLP model_anno_obj sent_small_bert_L8_512\n", + "nlu.load('en.embed_sentence.small_bert_L8_768') returns Spark NLP model_anno_obj sent_small_bert_L8_768\n", + "nlu.load('en.embed_sentence.tfhub_use') returns Spark NLP model_anno_obj tfhub_use\n", + "nlu.load('en.embed_sentence.tfhub_use.lg') returns Spark NLP model_anno_obj tfhub_use_lg\n", + "nlu.load('en.embed_sentence.use') returns Spark NLP model_anno_obj tfhub_use\n", + "nlu.load('en.embed_sentence.use.lg') returns Spark NLP model_anno_obj tfhub_use_lg\n", + "For language NLU provides the following Models : \n", + "nlu.load('es.embed_sentence.bert.base_cased') returns Spark NLP model_anno_obj sent_bert_base_cased\n", + "nlu.load('es.embed_sentence.bert.base_uncased') returns Spark NLP model_anno_obj sent_bert_base_uncased\n", + "For language NLU provides the following Models : \n", + "nlu.load('fi.embed_sentence.bert') returns Spark NLP model_anno_obj bert_base_finnish_uncased\n", + "nlu.load('fi.embed_sentence.bert.cased') returns Spark NLP model_anno_obj bert_base_finnish_cased\n", + "nlu.load('fi.embed_sentence.bert.uncased') returns Spark NLP model_anno_obj bert_base_finnish_uncased\n", + "For language NLU provides the following Models : \n", + "nlu.load('ha.embed_sentence.xlm_roberta') returns Spark NLP model_anno_obj sent_xlm_roberta_base_finetuned_hausa\n", + "For language NLU provides the following Models : \n", + "nlu.load('ig.embed_sentence.xlm_roberta') returns Spark NLP model_anno_obj sent_xlm_roberta_base_finetuned_igbo\n", + "For language NLU provides the following Models : \n", + "nlu.load('lg.embed_sentence.xlm_roberta') returns Spark NLP model_anno_obj sent_xlm_roberta_base_finetuned_luganda\n", + "For language NLU provides the following Models : \n", + "nlu.load('nl.embed_sentence.bert.base_cased') returns Spark NLP model_anno_obj sent_bert_base_cased\n", + "For language NLU provides the following Models : \n", + "nlu.load('pcm.embed_sentence.xlm_roberta') returns Spark NLP model_anno_obj sent_xlm_roberta_base_finetuned_naija\n", + "For language NLU provides the following Models : \n", + "nlu.load('pt.embed_sentence.bert.base_legal') returns Spark NLP model_anno_obj sbert_legal_bertimbau_base_tsdae_sts\n", + "nlu.load('pt.embed_sentence.bert.cased_large_legal') returns Spark NLP model_anno_obj sbert_bert_large_portuguese_cased_legal_mlm_sts_v0.1\n", + "nlu.load('pt.embed_sentence.bert.large_legal') returns Spark NLP model_anno_obj sbert_legal_bertimbau_large_gpl_sts\n", + "nlu.load('pt.embed_sentence.bert.legal.cased_large_mlm_sts_v0.10.by_stjiris') returns Spark NLP model_anno_obj sbert_bert_large_portuguese_cased_legal_mlm_sts_v0.10\n", + "nlu.load('pt.embed_sentence.bert.legal.cased_large_mlm_sts_v0.2.by_stjiris') returns Spark NLP model_anno_obj sbert_bert_large_portuguese_cased_legal_mlm_sts_v0.2\n", + "nlu.load('pt.embed_sentence.bert.legal.cased_large_mlm_sts_v0.3.by_stjiris') returns Spark NLP model_anno_obj sbert_bert_large_portuguese_cased_legal_mlm_sts_v0.3\n", + "nlu.load('pt.embed_sentence.bert.legal.cased_large_mlm_sts_v0.4.by_stjiris') returns Spark NLP model_anno_obj sbert_bert_large_portuguese_cased_legal_mlm_sts_v0.4\n", + "nlu.load('pt.embed_sentence.bert.legal.cased_large_mlm_sts_v0.5.by_stjiris') returns Spark NLP model_anno_obj sbert_bert_large_portuguese_cased_legal_mlm_sts_v0.5\n", + "nlu.load('pt.embed_sentence.bert.legal.cased_large_mlm_sts_v0.7.by_stjiris') returns Spark NLP model_anno_obj sbert_bert_large_portuguese_cased_legal_mlm_sts_v0.7\n", + "nlu.load('pt.embed_sentence.bert.legal.cased_large_mlm_sts_v0.8.by_stjiris') returns Spark NLP model_anno_obj sbert_bert_large_portuguese_cased_legal_mlm_sts_v0.8\n", + "nlu.load('pt.embed_sentence.bert.legal.cased_large_mlm_sts_v0.9.by_stjiris') returns Spark NLP model_anno_obj sbert_bert_large_portuguese_cased_legal_mlm_sts_v0.9\n", + "nlu.load('pt.embed_sentence.bert.legal.cased_large_mlm_sts_v1.0.by_stjiris') returns Spark NLP model_anno_obj sbert_bert_large_portuguese_cased_legal_mlm_sts_v1.0\n", + "nlu.load('pt.embed_sentence.bert.legal.cased_large_mlm_v0.11_gpl_nli_sts_v0.by_stjiris') returns Spark NLP model_anno_obj sbert_bert_large_portuguese_cased_legal_mlm_v0.11_gpl_nli_sts_v0\n", + "nlu.load('pt.embed_sentence.bert.legal.cased_large_mlm_v0.11_gpl_nli_sts_v1.by_stjiris') returns Spark NLP model_anno_obj sbert_bert_large_portuguese_cased_legal_mlm_v0.11_gpl_nli_sts_v1\n", + "nlu.load('pt.embed_sentence.bert.legal.cased_large_mlm_v0.11_nli_sts_v0.by_stjiris') returns Spark NLP model_anno_obj sbert_bert_large_portuguese_cased_legal_mlm_v0.11_nli_sts_v0\n", + "nlu.load('pt.embed_sentence.bert.legal.cased_large_mlm_v0.11_nli_sts_v1.by_stjiris') returns Spark NLP model_anno_obj sbert_bert_large_portuguese_cased_legal_mlm_v0.11_nli_sts_v1\n", + "nlu.load('pt.embed_sentence.bert.legal.cased_large_mlm_v0.11_sts_v0.by_stjiris') returns Spark NLP model_anno_obj sbert_bert_large_portuguese_cased_legal_mlm_v0.11_sts_v0\n", + "nlu.load('pt.embed_sentence.bert.legal.cased_large_mlm_v0.11_sts_v1.by_stjiris') returns Spark NLP model_anno_obj sbert_bert_large_portuguese_cased_legal_mlm_v0.11_sts_v1\n", + "nlu.load('pt.embed_sentence.bert.v2_base_legal') returns Spark NLP model_anno_obj sbert_legal_bertimbau_sts_base_ma_v2\n", + "nlu.load('pt.embed_sentence.bert.v2_large_legal') returns Spark NLP model_anno_obj sbert_legal_bertimbau_large_tsdae_sts_v2\n", + "nlu.load('pt.embed_sentence.bertimbau.legal.assin.base.by_rufimelo') returns Spark NLP model_anno_obj sbert_legal_bertimbau_sts_base_ma\n", + "nlu.load('pt.embed_sentence.bertimbau.legal.assin2.base.by_rufimelo') returns Spark NLP model_anno_obj sbert_legal_bertimbau_sts_base\n", + "nlu.load('pt.embed_sentence.bertimbau.legal.large_sts_by_rufimelo') returns Spark NLP model_anno_obj sbert_legal_bertimbau_sts_large\n", + "nlu.load('pt.embed_sentence.bertimbau.legal.large_sts_ma.by_rufimelo') returns Spark NLP model_anno_obj sbert_legal_bertimbau_sts_large_ma\n", + "nlu.load('pt.embed_sentence.bertimbau.legal.large_sts_ma_v3.by_rufimelo') returns Spark NLP model_anno_obj sbert_legal_bertimbau_sts_large_ma_v3\n", + "nlu.load('pt.embed_sentence.bertimbau.legal.large_tsdae_sts.by_rufimelo') returns Spark NLP model_anno_obj sbert_legal_bertimbau_large_tsdae_sts\n", + "nlu.load('pt.embed_sentence.bertimbau.legal.large_tsdae_sts_v4.by_rufimelo') returns Spark NLP model_anno_obj sbert_legal_bertimbau_large_tsdae_sts_v4\n", + "nlu.load('pt.embed_sentence.bertimbau.legal.large_tsdae_v4_gpl_sts.by_rufimelo') returns Spark NLP model_anno_obj sbert_legal_bertimbau_large_tsdae_v4_gpl_sts\n", + "nlu.load('pt.embed_sentence.bertimbau.legal.v2_large_sts_v2.by_rufimelo') returns Spark NLP model_anno_obj sbert_legal_bertimbau_sts_large_v2\n", + "nlu.load('pt.embed_sentence.bertimbau.legal.v2_large_v2_sts.by_rufimelo') returns Spark NLP model_anno_obj sbert_legal_bertimbau_large_v2_sts\n", + "For language NLU provides the following Models : \n", + "nlu.load('rw.embed_sentence.xlm_roberta') returns Spark NLP model_anno_obj sent_xlm_roberta_base_finetuned_kinyarwanda\n", + "For language NLU provides the following Models : \n", + "nlu.load('sv.embed_sentence.bert.base_cased') returns Spark NLP model_anno_obj sent_bert_base_cased\n", + "For language NLU provides the following Models : \n", + "nlu.load('sw.embed_sentence.xlm_roberta') returns Spark NLP model_anno_obj sent_xlm_roberta_base_finetuned_swahili\n", + "For language NLU provides the following Models : \n", + "nlu.load('wo.embed_sentence.xlm_roberta') returns Spark NLP model_anno_obj sent_xlm_roberta_base_finetuned_wolof\n", + "For language NLU provides the following Models : \n", + "nlu.load('xx.embed_sentence') returns Spark NLP model_anno_obj sent_bert_multi_cased\n", + "nlu.load('xx.embed_sentence.bert') returns Spark NLP model_anno_obj sent_bert_multi_cased\n", + "nlu.load('xx.embed_sentence.bert.cased') returns Spark NLP model_anno_obj sent_bert_multi_cased\n", + "nlu.load('xx.embed_sentence.bert.muril') returns Spark NLP model_anno_obj sent_bert_muril\n", + "nlu.load('xx.embed_sentence.bert_use_cmlm_multi_base') returns Spark NLP model_anno_obj sent_bert_use_cmlm_multi_base\n", + "nlu.load('xx.embed_sentence.bert_use_cmlm_multi_base_br') returns Spark NLP model_anno_obj sent_bert_use_cmlm_multi_base_br\n", + "nlu.load('xx.embed_sentence.labse') returns Spark NLP model_anno_obj labse\n", + "nlu.load('xx.embed_sentence.xlm_roberta.base') returns Spark NLP model_anno_obj sent_xlm_roberta_base\n", + "For language NLU provides the following Models : \n", + "nlu.load('yo.embed_sentence.xlm_roberta') returns Spark NLP model_anno_obj sent_xlm_roberta_base_finetuned_yoruba\n", + "For language NLU provides the following Models : \n", + "nlu.load('zh.embed_sentence.bert') returns Spark NLP model_anno_obj sbert_chinese_qmc_finance_v1\n", + "nlu.load('zh.embed_sentence.bert.distilled') returns Spark NLP model_anno_obj sbert_chinese_qmc_finance_v1_distill\n" + ] + } + ], + "source": [ + "# We can use nlu.print_components(action='embed_sentence') to see every possibler sentence embedding we could use. Lets use bert!\n", + "nlp.nlu.print_components(action='embed_sentence')" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 858 + }, + "id": "IKK_Ii_gjJfF", + "outputId": "2650912d-7378-4149-9265-8d5e662ebeb8" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Warning::Spark Session already created, some configs may not take.\n", + "Warning::Spark Session already created, some configs may not take.\n", + "sent_small_bert_L2_128 download started this may take some time.\n", + "Approximate size to download 16.1 MB\n", + "[OK!]\n", + " precision recall f1-score support\n", + "\n", + " negative 0.69 0.24 0.36 2106\n", + " neutral 0.00 0.00 0.00 0\n", + " positive 0.72 0.85 0.78 3685\n", + "\n", + " accuracy 0.63 5791\n", + " macro avg 0.47 0.36 0.38 5791\n", + "weighted avg 0.71 0.63 0.63 5791\n", + "\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", + " \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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
documentsentence_embedding_bertsentimentsentiment_confidencetexty
0Kickers on my watchlist XIDE TIT SOQ PNK CPW B...[-0.9530864357948303, 0.2135828286409378, 0.10...positive0.0Kickers on my watchlist XIDE TIT SOQ PNK CPW B...positive
1user: AAP MOVIE. 55% return for the FEA/GEED i...[-0.4725969433784485, 0.5354134440422058, -0.2...positive0.0user: AAP MOVIE. 55% return for the FEA/GEED i...positive
2user I'd be afraid to short AMZN - they are lo...[0.30400288105010986, 0.22862982749938965, -0....positive0.0user I'd be afraid to short AMZN - they are lo...positive
3MNTA Over 12.00[-1.707902193069458, -0.48472753167152405, -0....positive0.0MNTA Over 12.00positive
4OI Over 21.37[-2.3011534214019775, 0.2649511396884918, -0.4...positive0.0OI Over 21.37positive
.....................
5786Industry body CII said #discoms are likely to ...[-0.21655204892158508, 0.6153537631034851, 0.0...negative0.0Industry body CII said #discoms are likely to ...negative
5787#Gold prices slip below Rs 46,000 as #investor...[-0.19915254414081573, 0.2607441842556, 0.0032...negative0.0#Gold prices slip below Rs 46,000 as #investor...negative
5788Workers at Bajaj Auto have agreed to a 10% wag...[-0.4361518919467926, 0.9346759915351868, -0.3...negative0.0Workers at Bajaj Auto have agreed to a 10% wag...positive
5789#Sharemarket LIVE: Sensex off day’s high, up 6...[-0.6081278920173645, 0.2732301354408264, 0.25...neutral0.0#Sharemarket LIVE: Sensex off day’s high, up 6...positive
5790#Sensex, #Nifty climb off day's highs, still u...[-0.5274896621704102, 0.4326432943344116, 0.06...neutral0.0#Sensex, #Nifty climb off day's highs, still u...positive
\n", + "

5791 rows × 6 columns

\n", + "
\n", + "
\n", + "\n", + "
\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "
\n", + "\n", + "\n", + "
\n", + " \n", + "\n", + "\n", + "\n", + " \n", + "
\n", + "
\n", + "
\n" + ], + "text/plain": [ + " document \\\n", + "0 Kickers on my watchlist XIDE TIT SOQ PNK CPW B... \n", + "1 user: AAP MOVIE. 55% return for the FEA/GEED i... \n", + "2 user I'd be afraid to short AMZN - they are lo... \n", + "3 MNTA Over 12.00 \n", + "4 OI Over 21.37 \n", + "... ... \n", + "5786 Industry body CII said #discoms are likely to ... \n", + "5787 #Gold prices slip below Rs 46,000 as #investor... \n", + "5788 Workers at Bajaj Auto have agreed to a 10% wag... \n", + "5789 #Sharemarket LIVE: Sensex off day’s high, up 6... \n", + "5790 #Sensex, #Nifty climb off day's highs, still u... \n", + "\n", + " sentence_embedding_bert sentiment \\\n", + "0 [-0.9530864357948303, 0.2135828286409378, 0.10... positive \n", + "1 [-0.4725969433784485, 0.5354134440422058, -0.2... positive \n", + "2 [0.30400288105010986, 0.22862982749938965, -0.... positive \n", + "3 [-1.707902193069458, -0.48472753167152405, -0.... positive \n", + "4 [-2.3011534214019775, 0.2649511396884918, -0.4... positive \n", + "... ... ... \n", + "5786 [-0.21655204892158508, 0.6153537631034851, 0.0... negative \n", + "5787 [-0.19915254414081573, 0.2607441842556, 0.0032... negative \n", + "5788 [-0.4361518919467926, 0.9346759915351868, -0.3... negative \n", + "5789 [-0.6081278920173645, 0.2732301354408264, 0.25... neutral \n", + "5790 [-0.5274896621704102, 0.4326432943344116, 0.06... neutral \n", + "\n", + " sentiment_confidence text \\\n", + "0 0.0 Kickers on my watchlist XIDE TIT SOQ PNK CPW B... \n", + "1 0.0 user: AAP MOVIE. 55% return for the FEA/GEED i... \n", + "2 0.0 user I'd be afraid to short AMZN - they are lo... \n", + "3 0.0 MNTA Over 12.00 \n", + "4 0.0 OI Over 21.37 \n", + "... ... ... \n", + "5786 0.0 Industry body CII said #discoms are likely to ... \n", + "5787 0.0 #Gold prices slip below Rs 46,000 as #investor... \n", + "5788 0.0 Workers at Bajaj Auto have agreed to a 10% wag... \n", + "5789 0.0 #Sharemarket LIVE: Sensex off day’s high, up 6... \n", + "5790 0.0 #Sensex, #Nifty climb off day's highs, still u... \n", + "\n", + " y \n", + "0 positive \n", + "1 positive \n", + "2 positive \n", + "3 positive \n", + "4 positive \n", + "... ... \n", + "5786 negative \n", + "5787 negative \n", + "5788 positive \n", + "5789 positive \n", + "5790 positive \n", + "\n", + "[5791 rows x 6 columns]" + ] + }, + "execution_count": 10, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "trainable_pipe = nlp.load('embed_sentence.bert train.sentiment')\n", + "# We need to train longer and user smaller LR for NON-USE based sentence embeddings usually\n", + "# We could tune the hyperparameters further with hyperparameter tuning methods like gridsearch\n", + "# Also longer training gives more accuracy\n", + "trainable_pipe['trainable_sentiment_dl'].setMaxEpochs(40)\n", + "trainable_pipe['trainable_sentiment_dl'].setLr(0.0005)\n", + "fitted_pipe = trainable_pipe.fit(train_df)\n", + "# predict with the trainable pipeline on dataset and get predictions\n", + "preds = fitted_pipe.predict(train_df,output_level='document')\n", + "\n", + "#sentence detector that is part of the pipe generates sone NaNs. lets drop them first\n", + "preds.dropna(inplace=True)\n", + "print(classification_report(preds['y'], preds['sentiment']))\n", + "\n", + "preds" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "2BB-NwZUoHSe" + }, + "source": [ + "# 5. Lets save the model" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "eLex095goHwm" + }, + "outputs": [], + "source": [ + "stored_model_path = './models/classifier_dl_trained'\n", + "fitted_pipe.save(stored_model_path)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "e_b2DPd4rCiU" + }, + "source": [ + "# 6. Lets load the model from HDD.\n", + "This makes Offlien NLU usage possible! \n", + "You need to call nlu.load(path=path_to_the_pipe) to load a model/pipeline from disk." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 133 + }, + "id": "SO4uz45MoRgp", + "outputId": "f914162e-6c41-4355-ad11-20c92fd155d1" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Warning::Spark Session already created, some configs may not take.\n", + "Warning::Spark Session already created, some configs may not take.\n", + "Warning::Spark Session already created, some configs may not take.\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", + "
documentsentence_embedding_from_disksentimentsentiment_confidence
0Tesla plans to invest 10M into the ML sector[-0.07111673802137375, 0.9532930850982666, -1....positive0.0
\n", + "
\n", + "
\n", + "\n", + "
\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "
\n", + "\n", + "
\n", + "
\n" + ], + "text/plain": [ + " document \\\n", + "0 Tesla plans to invest 10M into the ML sector \n", + "\n", + " sentence_embedding_from_disk sentiment \\\n", + "0 [-0.07111673802137375, 0.9532930850982666, -1.... positive \n", + "\n", + " sentiment_confidence \n", + "0 0.0 " + ] + }, + "execution_count": 12, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "hdd_pipe = nlp.load(path=stored_model_path)\n", + "\n", + "preds = hdd_pipe.predict('Tesla plans to invest 10M into the ML sector')\n", + "preds" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "e0CVlkk9v6Qi", + "outputId": "20c1ef9d-6769-4a30-ebae-cb37c2ec9f1d" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "The following parameters are configurable for this NLU pipeline (You can copy paste the examples) :\n", + ">>> component_list['document_assembler'] has settable params:\n", + "component_list['document_assembler'].setCleanupMode('shrink') | Info: possible values: disabled, inplace, inplace_full, shrink, shrink_full, each, each_full, delete_full | Currently set to : shrink\n", + ">>> component_list['bert_sentence_embeddings@sent_small_bert_L2_128'] has settable params:\n", + "component_list['bert_sentence_embeddings@sent_small_bert_L2_128'].setBatchSize(8) | Info: Size of every batch | Currently set to : 8\n", + "component_list['bert_sentence_embeddings@sent_small_bert_L2_128'].setCaseSensitive(False) | Info: whether to ignore case in tokens for embeddings matching | Currently set to : False\n", + "component_list['bert_sentence_embeddings@sent_small_bert_L2_128'].setDimension(128) | Info: Number of embedding dimensions | Currently set to : 128\n", + "component_list['bert_sentence_embeddings@sent_small_bert_L2_128'].setMaxSentenceLength(128) | Info: Max sentence length to process | Currently set to : 128\n", + "component_list['bert_sentence_embeddings@sent_small_bert_L2_128'].setEngine('tensorflow') | Info: Deep Learning engine used for this model | Currently set to : tensorflow\n", + "component_list['bert_sentence_embeddings@sent_small_bert_L2_128'].setIsLong(False) | Info: Use Long type instead of Int type for inputs buffer - Some Bert models require Long instead of Int. | Currently set to : False\n", + "component_list['bert_sentence_embeddings@sent_small_bert_L2_128'].setStorageRef('sent_small_bert_L2_128') | Info: unique reference name for identification | Currently set to : sent_small_bert_L2_128\n", + ">>> component_list['sentiment_dl@sent_small_bert_L2_128'] has settable params:\n", + "component_list['sentiment_dl@sent_small_bert_L2_128'].setThreshold(0.6) | Info: The minimum threshold for the final result otheriwse it will be neutral | Currently set to : 0.6\n", + "component_list['sentiment_dl@sent_small_bert_L2_128'].setThresholdLabel('neutral') | Info: In case the score is less than threshold, what should be the label. Default is neutral. | Currently set to : neutral\n", + "component_list['sentiment_dl@sent_small_bert_L2_128'].setEngine('tensorflow') | Info: Deep Learning engine used for this model | Currently set to : tensorflow\n", + "component_list['sentiment_dl@sent_small_bert_L2_128'].setClasses(['positive', 'negative']) | Info: get the tags used to trained this SentimentDLModel | Currently set to : ['positive', 'negative']\n", + "component_list['sentiment_dl@sent_small_bert_L2_128'].setStorageRef('sent_small_bert_L2_128') | Info: unique reference name for identification | Currently set to : sent_small_bert_L2_128\n" + ] + } + ], + "source": [ + "hdd_pipe.print_info()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "73rQbUy-KLpb" + }, + "outputs": [], + "source": [] + } + ], + "metadata": { + "colab": { + "provenance": [] + }, + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "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.11.4" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/examples/colab/Training/binary_text_classification/NLU_training_sentiment_classifier_demo_IMDB.ipynb b/examples/colab/Training/binary_text_classification/NLU_training_sentiment_classifier_demo_IMDB.ipynb index 2c362a88..da0e6868 100644 --- a/examples/colab/Training/binary_text_classification/NLU_training_sentiment_classifier_demo_IMDB.ipynb +++ b/examples/colab/Training/binary_text_classification/NLU_training_sentiment_classifier_demo_IMDB.ipynb @@ -1 +1,3115 @@ -{"nbformat":4,"nbformat_minor":0,"metadata":{"colab":{"name":"NLU_training_sentiment_classifier_demo_IMDB.ipynb","provenance":[],"collapsed_sections":["zkufh760uvF3"],"toc_visible":true},"kernelspec":{"display_name":"Python 3","name":"python3"}},"cells":[{"cell_type":"markdown","metadata":{"id":"zkufh760uvF3"},"source":["![JohnSnowLabs](https://nlp.johnsnowlabs.com/assets/images/logo.png)\n","\n","[![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/JohnSnowLabs/nlu/blob/master/examples/colab/Training/binary_text_classification/NLU_training_sentiment_classifier_demo_IMDB.ipynb)\n","\n","\n","# Training a Sentiment Analysis Classifier with NLU \n","## 2 class IMDB Movie sentiment classifier training\n","With the [SentimentDL model](https://nlp.johnsnowlabs.com/docs/en/annotators#sentimentdl-multi-class-sentiment-analysis-annotator) from Spark NLP you can achieve State Of the Art results on any multi class text classification problem \n","\n","This notebook showcases the following features : \n","\n","- How to train the deep learning classifier\n","- How to store a pipeline to disk\n","- How to load the pipeline from disk (Enables NLU offline mode)\n","\n","You can achieve these results or even better on this dataset with training data:\n","\n","\n","
\n","\n","\n","![image.png](data:image/png;base64,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)\n","\n","\n","\n","You can achieve these results or even better on this dataset with test data:\n","\n","\n","
\n","\n","\n","![image.png](data:image/png;base64,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)\n"]},{"cell_type":"markdown","metadata":{"id":"dur2drhW5Rvi"},"source":["# 1. Install Java 8 and NLU"]},{"cell_type":"code","metadata":{"id":"hFGnBCHavltY","colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"status":"ok","timestamp":1620193225748,"user_tz":-120,"elapsed":116140,"user":{"displayName":"Christian Kasim Loan","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GjqAD-ircKP-s5Eh6JSdkDggDczfqQbJGU_IRb4Hw=s64","userId":"14469489166467359317"}},"outputId":"9ac3d81e-7a53-4711-fa24-e7320fd99723"},"source":["!wget https://setup.johnsnowlabs.com/nlu/colab.sh -O - | bash\n","import nlu"],"execution_count":null,"outputs":[{"output_type":"stream","text":["--2021-05-05 05:38:30-- https://raw.githubusercontent.com/JohnSnowLabs/nlu/master/scripts/colab_setup.sh\n","Resolving raw.githubusercontent.com (raw.githubusercontent.com)... 185.199.108.133, 185.199.109.133, 185.199.110.133, ...\n","Connecting to raw.githubusercontent.com (raw.githubusercontent.com)|185.199.108.133|:443... connected.\n","HTTP request sent, awaiting response... 200 OK\n","Length: 1671 (1.6K) [text/plain]\n","Saving to: ‘STDOUT’\n","\n","\r- 0%[ ] 0 --.-KB/s \rInstalling NLU 3.0.0 with PySpark 3.0.2 and Spark NLP 3.0.1 for Google Colab ...\n","- 100%[===================>] 1.63K --.-KB/s in 0s \n","\n","2021-05-05 05:38:30 (63.2 MB/s) - written to stdout [1671/1671]\n","\n","\u001b[K |████████████████████████████████| 204.8MB 67kB/s \n","\u001b[K |████████████████████████████████| 153kB 73.9MB/s \n","\u001b[K |████████████████████████████████| 204kB 23.9MB/s \n","\u001b[K |████████████████████████████████| 204kB 65.5MB/s \n","\u001b[?25h Building wheel for pyspark (setup.py) ... \u001b[?25l\u001b[?25hdone\n"],"name":"stdout"}]},{"cell_type":"markdown","metadata":{"id":"f4KkTfnR5Ugg"},"source":["# 2. Download IMDB dataset\n","https://www.kaggle.com/lakshmi25npathi/imdb-dataset-of-50k-movie-reviews\n","\n","IMDB dataset having 50K movie reviews for natural language processing or Text analytics.\n","This is a dataset for binary sentiment classification containing substantially more data than previous benchmark datasets. We provide a set of 25,000 highly polar movie reviews for training and 25,000 for testing. So, predict the number of positive and negative reviews using either classification or deep learning algorithms.\n","For more dataset information, please go through the following link,\n","http://ai.stanford.edu/~amaas/data/sentiment/"]},{"cell_type":"code","metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"OrVb5ZMvvrQD","executionInfo":{"status":"ok","timestamp":1620193226173,"user_tz":-120,"elapsed":116555,"user":{"displayName":"Christian Kasim Loan","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GjqAD-ircKP-s5Eh6JSdkDggDczfqQbJGU_IRb4Hw=s64","userId":"14469489166467359317"}},"outputId":"827e3c03-e794-491f-ef27-a5951ecfa716"},"source":["! wget http://ckl-it.de/wp-content/uploads/2021/01/IMDB-Dataset.csv\n"],"execution_count":null,"outputs":[{"output_type":"stream","text":["--2021-05-05 05:40:25-- http://ckl-it.de/wp-content/uploads/2021/01/IMDB-Dataset.csv\n","Resolving ckl-it.de (ckl-it.de)... 217.160.0.108, 2001:8d8:100f:f000::209\n","Connecting to ckl-it.de (ckl-it.de)|217.160.0.108|:80... connected.\n","HTTP request sent, awaiting response... 200 OK\n","Length: 3288450 (3.1M) [text/csv]\n","Saving to: ‘IMDB-Dataset.csv’\n","\n","IMDB-Dataset.csv 100%[===================>] 3.14M 20.6MB/s in 0.2s \n","\n","2021-05-05 05:40:25 (20.6 MB/s) - ‘IMDB-Dataset.csv’ saved [3288450/3288450]\n","\n"],"name":"stdout"}]},{"cell_type":"code","metadata":{"colab":{"base_uri":"https://localhost:8080/","height":406},"id":"y4xSRWIhwT28","executionInfo":{"status":"ok","timestamp":1620193227021,"user_tz":-120,"elapsed":117397,"user":{"displayName":"Christian Kasim Loan","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GjqAD-ircKP-s5Eh6JSdkDggDczfqQbJGU_IRb4Hw=s64","userId":"14469489166467359317"}},"outputId":"91412e47-6ce0-4d25-b00d-e2238146895b"},"source":["import pandas as pd\n","train_path = '/content/IMDB-Dataset.csv'\n","\n","train_df = pd.read_csv(train_path)\n","# the text data to use for classification should be in a column named 'text'\n","# the label column must have name 'y' name be of type str\n","columns=['text','y']\n","train_df = train_df[columns]\n","from sklearn.model_selection import train_test_split\n","\n","train_df, test_df = train_test_split(train_df, test_size=0.2)\n","train_df"],"execution_count":null,"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"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n","
texty
1459Absolutely wonderful drama and Ros is top notc...positive
2428I was totally surprised just how good this mov...positive
2093This is a fine musical with a timeless score b...positive
2370Saw it yesterday night at the Midnight Slam of...negative
2064This show was Fabulous. It was intricate and w...positive
.........
353This film held my interest enough to watch it ...positive
2322After reading the other tepid reviews and comm...positive
1997This movie, despite its list of B, C, and D li...negative
1585One of the most magnificent movies ever made. ...positive
237This movie is not worth anything. I mean, if y...negative
\n","

2000 rows × 2 columns

\n","
"],"text/plain":[" text y\n","1459 Absolutely wonderful drama and Ros is top notc... positive\n","2428 I was totally surprised just how good this mov... positive\n","2093 This is a fine musical with a timeless score b... positive\n","2370 Saw it yesterday night at the Midnight Slam of... negative\n","2064 This show was Fabulous. It was intricate and w... positive\n","... ... ...\n","353 This film held my interest enough to watch it ... positive\n","2322 After reading the other tepid reviews and comm... positive\n","1997 This movie, despite its list of B, C, and D li... negative\n","1585 One of the most magnificent movies ever made. ... positive\n","237 This movie is not worth anything. I mean, if y... negative\n","\n","[2000 rows x 2 columns]"]},"metadata":{"tags":[]},"execution_count":3}]},{"cell_type":"markdown","metadata":{"id":"0296Om2C5anY"},"source":["# 3. Train Deep Learning Classifier using nlu.load('train.sentiment')\n","\n","You dataset label column should be named 'y' and the feature column with text data should be named 'text'"]},{"cell_type":"code","metadata":{"colab":{"base_uri":"https://localhost:8080/","height":1000},"id":"3ZIPkRkWftBG","executionInfo":{"status":"ok","timestamp":1620195366745,"user_tz":-120,"elapsed":11481,"user":{"displayName":"Christian Kasim Loan","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GjqAD-ircKP-s5Eh6JSdkDggDczfqQbJGU_IRb4Hw=s64","userId":"14469489166467359317"}},"outputId":"f826ae3a-a84b-4aab-f612-edb38026ac36"},"source":["import nlu \n","from sklearn.metrics import classification_report\n","\n","# load a trainable pipeline by specifying the train. prefix and fit it on a datset with label and text columns\n","# by default the Universal Sentence Encoder (USE) Sentence embeddings are used for generation\n","trainable_pipe = nlu.load('train.sentiment')\n","fitted_pipe = trainable_pipe.fit(train_df.iloc[:50])\n","\n","# predict with the trainable pipeline on dataset and get predictions\n","preds = fitted_pipe.predict(train_df.iloc[:50],output_level='document')\n","#sentence detector that is part of the pipe generates sone NaNs. lets drop them first\n","preds.dropna(inplace=True)\n","print(classification_report(preds['y'], preds['sentiment']))\n","\n","preds"],"execution_count":null,"outputs":[{"output_type":"stream","text":["tfhub_use download started this may take some time.\n","Approximate size to download 923.7 MB\n","[OK!]\n","sentence_detector_dl download started this may take some time.\n","Approximate size to download 354.6 KB\n","[OK!]\n"," precision recall f1-score support\n","\n"," negative 0.82 0.88 0.85 26\n"," neutral 0.00 0.00 0.00 0\n"," positive 0.85 0.71 0.77 24\n","\n"," accuracy 0.80 50\n"," macro avg 0.56 0.53 0.54 50\n","weighted avg 0.84 0.80 0.81 50\n","\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"," \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"," \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"," \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"," \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"," \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"," \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"," \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"," \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"," \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"," \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"," \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","
sentence_embedding_usetrained_sentiment_confidencetextdocumenttrained_sentimentsentenceyorigin_index
0[0.06351275742053986, 0.040804557502269745, -2...0.971989Absolutely wonderful drama and Ros is top notc...Absolutely wonderful drama and Ros is top notc...negative[Absolutely wonderful drama and Ros is top not...positive1459
1[0.06992700695991516, 0.0012252129381522536, -...0.972120I was totally surprised just how good this mov...I was totally surprised just how good this mov...positive[I was totally surprised just how good this mo...positive2428
2[0.052442848682403564, -0.017640504986047745, ...0.989897This is a fine musical with a timeless score b...This is a fine musical with a timeless score b...positive[This is a fine musical with a timeless score ...positive2093
3[0.04445473477244377, 0.018118631094694138, -0...0.999111Saw it yesterday night at the Midnight Slam of...Saw it yesterday night at the Midnight Slam of...negative[Saw it yesterday night at the Midnight Slam o...negative2370
4[0.01753336377441883, 0.05620148777961731, -0....0.954813This show was Fabulous. It was intricate and w...This show was Fabulous. It was intricate and w...positive[This show was Fabulous., It was intricate and...positive2064
5[0.02791544236242771, -0.028735769912600517, -...0.506074Jean Dujardin gets Connery's mannerisms down p...Jean Dujardin gets Connery's mannerisms down p...neutral[Jean Dujardin gets Connery's mannerisms down ...positive1988
6[0.06690913438796997, 0.03236781805753708, -0....0.982164This is a tongue in cheek movie from the very ...This is a tongue in cheek movie from the very ...positive[This is a tongue in cheek movie from the very...positive1483
7[0.05750656872987747, -0.059703629463911057, -...0.989845I have seen most, if not all of the Laurel & H...I have seen most, if not all of the Laurel & H...negative[I have seen most, if not all of the Laurel & ...negative207
8[-0.04340153560042381, -0.015529784373939037, ...0.991958Although there is melodrama at the center or r...Although there is melodrama at the center or r...positive[Although there is melodrama at the center or ...positive2030
9[-0.032444775104522705, -0.018744193017482758,...0.986264\"Hey Babu Riba\" is a film about a young woman,...\"Hey Babu Riba\" is a film about a young woman,...positive[\"Hey Babu Riba\" is a film about a young woman...positive397
10[0.04818158969283104, 0.006010068114846945, 0....0.991307I have to say the first I watched this film wa...I have to say the first I watched this film wa...negative[I have to say the first I watched this film w...negative1079
11[-0.011373912915587425, 0.033458177000284195, ...0.997292Well, there's no real plot to speak of, it's j...Well, there's no real plot to speak of, it's j...negative[Well, there's no real plot to speak of, it's ...negative308
12[0.059722382575273514, -0.04133075103163719, -...0.999755Why can't a movie be rated a zero? Or even a n...Why can't a movie be rated a zero? Or even a n...negative[Why can't a movie be rated a zero?, Or even a...negative175
13[-0.0024044793099164963, 0.01555465068668127, ...0.915433PREY <br /><br />Aspect ratio: 1.37:1<br /><br...PREY <br /><br />Aspect ratio: 1.37:1<br /><br...positive[PREY <br /><br />Aspect ratio: 1.37:1<br /><b...negative610
14[0.014560171402990818, 0.07181794941425323, 0....0.954957Don't bother trying to watch this terrible min...Don't bother trying to watch this terrible min...negative[Don't bother trying to watch this terrible mi...negative1516
15[0.047474540770053864, -0.01399887353181839, -...0.992878This is one of the most ridiculous westerns th...This is one of the most ridiculous westerns th...negative[This is one of the most ridiculous westerns t...negative1558
16[0.04194203019142151, 0.014816542156040668, -0...0.994948Please don't waste your time. This movie rehas...Please don't waste your time. This movie rehas...negative[Please don't waste your time., This movie reh...negative1691
17[-0.01830967515707016, 0.0020676907151937485, ...0.835862Nice character development in a pretty cool mi...Nice character development in a pretty cool mi...positive[Nice character development in a pretty cool m...positive227
18[-0.028767548501491547, -0.04782490059733391, ...0.994877The Elegant Documentary -<br /><br />Don't wat...The Elegant Documentary -<br /><br />Don't wat...positive[The Elegant Documentary -<br /><br />Don't wa...positive172
19[0.020619677379727364, -0.0368206612765789, -0...0.993641The script was VERY weak w/o enough character ...The script was VERY weak w/o enough character ...negative[The script was VERY weak w/o enough character...negative1687
20[0.025141961872577667, 0.03661772608757019, -0...0.972840Though structured totally different from the b...Though structured totally different from the b...positive[Though structured totally different from the ...positive2496
21[0.05255172401666641, 0.0014638856519013643, -...0.971560I am so excited that Greek is back! This seaso...I am so excited that Greek is back! This seaso...positive[I am so excited that Greek is back!, This sea...positive2162
22[0.05090215429663658, 0.04202255234122276, -0....0.986716Petter Mattei's \"Love in the Time of Money\" is...Petter Mattei's \"Love in the Time of Money\" is...positive[Petter Mattei's \"Love in the Time of Money\" i...positive4
23[0.028773412108421326, 0.025388378649950027, -...0.998700Most Lorne Michaels films seem to fail because...Most Lorne Michaels films seem to fail because...negative[Most Lorne Michaels films seem to fail becaus...negative654
24[0.0029449418652802706, -0.054734643548727036,...0.999298\"Revolt of the Zombies\" proves that having the...\"Revolt of the Zombies\" proves that having the...negative[\"Revolt of the Zombies\" proves that having th...negative126
25[0.045008499175310135, 0.06566429883241653, -0...0.760545Necessarily ridiculous film version the litera...Necessarily ridiculous film version the litera...positive[Necessarily ridiculous film version the liter...negative2316
26[0.03256276622414589, -0.041013315320014954, -...0.964842Supposedly a \"social commentary\" on racism and...Supposedly a \"social commentary\" on racism and...negative[Supposedly a \"social commentary\" on racism an...negative250
27[0.037413761019706726, -0.041003260761499405, ...0.996598I rented the DVD in a video store, as an alter...I rented the DVD in a video store, as an alter...negative[I rented the DVD in a video store, as an alte...negative644
28[-0.0654454156756401, 0.005620448384433985, -0...0.561247If you like original gut wrenching laughter yo...If you like original gut wrenching laughter yo...neutral[If you like original gut wrenching laughter y...positive9
29[0.027594028040766716, -0.024396954104304314, ...0.945314Doctor Mordrid is one of those rare films that...Doctor Mordrid is one of those rare films that...negative[Doctor Mordrid is one of those rare films tha...positive376
30[0.017458664253354073, 0.05214596167206764, -0...0.973781Back in 1982 a little film called MAKING LOVE ...Back in 1982 a little film called MAKING LOVE ...positive[Back in 1982 a little film called MAKING LOVE...positive746
31[0.04889684543013573, 0.029793666675686836, 0....0.9689981936 was the most prolific year for Astaire an...1936 was the most prolific year for Astaire an...positive[1936 was the most prolific year for Astaire a...positive2293
32[0.04028377681970596, 0.05781426653265953, -0....0.989890Tim Taylor is an abusive acholoic drug addict....Tim Taylor is an abusive acholoic drug addict....negative[Tim Taylor is an abusive acholoic drug addict...negative2398
33[0.033708442002534866, -0.06806037575006485, -...0.997308First of all yes I'm white, so I try to tread ...First of all yes I'm white, so I try to tread ...negative[First of all yes I'm white, so I try to tread...negative784
34[-0.05339590832591057, 0.03226976469159126, 0....0.971397I have to say that the events of 9/11 didn't h...I have to say that the events of 9/11 didn't h...positive[I have to say that the events of 9/11 didn't ...positive713
35[0.034553565084934235, -0.002318630227819085, ...0.999211This movie features Charlie Spradling dancing ...This movie features Charlie Spradling dancing ...negative[This movie features Charlie Spradling dancing...negative358
36[-0.03914014622569084, -0.04544996842741966, -...0.991993. . . and that is only if you like the sight o.... . . and that is only if you like the sight o...negative[. . . and that is only if you like the sight ...negative1377
37[-0.037124212831258774, 0.04466667398810387, -...0.890090An interesting movie with Jordana Brewster as ...An interesting movie with Jordana Brewster as ...positive[An interesting movie with Jordana Brewster as...positive1902
38[0.05217211693525314, -0.045366983860731125, -...0.998053Next to the slasher films of the 1970s and 80s...Next to the slasher films of the 1970s and 80s...negative[Next to the slasher films of the 1970s and 80...negative2028
39[0.054036945104599, -0.0035783019848167896, -0...0.994295I saw this movie in a theater while on vacatio...I saw this movie in a theater while on vacatio...negative[I saw this movie in a theater while on vacati...positive929
40[0.004495782777667046, 0.0002409428561804816, ...0.999238Did the first travesty actually make money? Th...Did the first travesty actually make money? Th...negative[Did the first travesty actually make money?, ...negative659
41[0.05336875841021538, 0.01685612089931965, -0....0.979532Jay Craven's criminally ignored film is a sobe...Jay Craven's criminally ignored film is a sobe...positive[Jay Craven's criminally ignored film is a sob...positive2286
42[0.06096196547150612, -0.018674220889806747, -...0.936765This is a great film with an amazing cast. Cri...This is a great film with an amazing cast. Cri...positive[This is a great film with an amazing cast. Cr...positive1198
43[-0.01874159276485443, -0.015269572846591473, ...0.945504I had a hard time staying awake for the two ho...I had a hard time staying awake for the two ho...positive[I had a hard time staying awake for the two h...negative468
44[0.0465228296816349, -0.03501952812075615, -0....0.980367Not the film to see if you want to be intellec...Not the film to see if you want to be intellec...negative[Not the film to see if you want to be intelle...positive1335
45[-0.022962188348174095, -0.05519339069724083, ...0.996134I bought this (it was only $3, ok?) under the ...I bought this (it was only $3, ok?) under the ...negative[I bought this (it was only $3, ok?) under the...negative1322
46[0.05667755752801895, -0.004784214776009321, 0...0.983472I saw it tonight and fell asleep in the movie....I saw it tonight and fell asleep in the movie....negative[I saw it tonight and fell asleep in the movie...negative2141
47[-0.045412369072437286, -0.010548366233706474,...0.998861The opening scene keeps me from rating at abso...The opening scene keeps me from rating at abso...negative[The opening scene keeps me from rating at abs...negative1065
48[0.005430039018392563, -0.021274806931614876, ...0.984353If you are a fan of Zorro, Indiana Jones, or a...If you are a fan of Zorro, Indiana Jones, or a...negative[If you are a fan of Zorro, Indiana Jones, or ...positive2103
49[-0.012310817837715149, 0.036387305706739426, ...0.960394Stan Laurel and Oliver Hardy are the most famo...Stan Laurel and Oliver Hardy are the most famo...negative[Stan Laurel and Oliver Hardy are the most fam...negative588
\n","
"],"text/plain":[" sentence_embedding_use ... origin_index\n","0 [0.06351275742053986, 0.040804557502269745, -2... ... 1459\n","1 [0.06992700695991516, 0.0012252129381522536, -... ... 2428\n","2 [0.052442848682403564, -0.017640504986047745, ... ... 2093\n","3 [0.04445473477244377, 0.018118631094694138, -0... ... 2370\n","4 [0.01753336377441883, 0.05620148777961731, -0.... ... 2064\n","5 [0.02791544236242771, -0.028735769912600517, -... ... 1988\n","6 [0.06690913438796997, 0.03236781805753708, -0.... ... 1483\n","7 [0.05750656872987747, -0.059703629463911057, -... ... 207\n","8 [-0.04340153560042381, -0.015529784373939037, ... ... 2030\n","9 [-0.032444775104522705, -0.018744193017482758,... ... 397\n","10 [0.04818158969283104, 0.006010068114846945, 0.... ... 1079\n","11 [-0.011373912915587425, 0.033458177000284195, ... ... 308\n","12 [0.059722382575273514, -0.04133075103163719, -... ... 175\n","13 [-0.0024044793099164963, 0.01555465068668127, ... ... 610\n","14 [0.014560171402990818, 0.07181794941425323, 0.... ... 1516\n","15 [0.047474540770053864, -0.01399887353181839, -... ... 1558\n","16 [0.04194203019142151, 0.014816542156040668, -0... ... 1691\n","17 [-0.01830967515707016, 0.0020676907151937485, ... ... 227\n","18 [-0.028767548501491547, -0.04782490059733391, ... ... 172\n","19 [0.020619677379727364, -0.0368206612765789, -0... ... 1687\n","20 [0.025141961872577667, 0.03661772608757019, -0... ... 2496\n","21 [0.05255172401666641, 0.0014638856519013643, -... ... 2162\n","22 [0.05090215429663658, 0.04202255234122276, -0.... ... 4\n","23 [0.028773412108421326, 0.025388378649950027, -... ... 654\n","24 [0.0029449418652802706, -0.054734643548727036,... ... 126\n","25 [0.045008499175310135, 0.06566429883241653, -0... ... 2316\n","26 [0.03256276622414589, -0.041013315320014954, -... ... 250\n","27 [0.037413761019706726, -0.041003260761499405, ... ... 644\n","28 [-0.0654454156756401, 0.005620448384433985, -0... ... 9\n","29 [0.027594028040766716, -0.024396954104304314, ... ... 376\n","30 [0.017458664253354073, 0.05214596167206764, -0... ... 746\n","31 [0.04889684543013573, 0.029793666675686836, 0.... ... 2293\n","32 [0.04028377681970596, 0.05781426653265953, -0.... ... 2398\n","33 [0.033708442002534866, -0.06806037575006485, -... ... 784\n","34 [-0.05339590832591057, 0.03226976469159126, 0.... ... 713\n","35 [0.034553565084934235, -0.002318630227819085, ... ... 358\n","36 [-0.03914014622569084, -0.04544996842741966, -... ... 1377\n","37 [-0.037124212831258774, 0.04466667398810387, -... ... 1902\n","38 [0.05217211693525314, -0.045366983860731125, -... ... 2028\n","39 [0.054036945104599, -0.0035783019848167896, -0... ... 929\n","40 [0.004495782777667046, 0.0002409428561804816, ... ... 659\n","41 [0.05336875841021538, 0.01685612089931965, -0.... ... 2286\n","42 [0.06096196547150612, -0.018674220889806747, -... ... 1198\n","43 [-0.01874159276485443, -0.015269572846591473, ... ... 468\n","44 [0.0465228296816349, -0.03501952812075615, -0.... ... 1335\n","45 [-0.022962188348174095, -0.05519339069724083, ... ... 1322\n","46 [0.05667755752801895, -0.004784214776009321, 0... ... 2141\n","47 [-0.045412369072437286, -0.010548366233706474,... ... 1065\n","48 [0.005430039018392563, -0.021274806931614876, ... ... 2103\n","49 [-0.012310817837715149, 0.036387305706739426, ... ... 588\n","\n","[50 rows x 8 columns]"]},"metadata":{"tags":[]},"execution_count":6}]},{"cell_type":"markdown","metadata":{"id":"lVyOE2wV0fw_"},"source":["# 4. Test the fitted pipe on new example"]},{"cell_type":"code","metadata":{"colab":{"base_uri":"https://localhost:8080/","height":77},"id":"qdCUg2MR0PD2","executionInfo":{"status":"ok","timestamp":1620195367250,"user_tz":-120,"elapsed":11297,"user":{"displayName":"Christian Kasim Loan","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GjqAD-ircKP-s5Eh6JSdkDggDczfqQbJGU_IRb4Hw=s64","userId":"14469489166467359317"}},"outputId":"42030190-589e-46f3-d227-e4a8eebc69a2"},"source":["fitted_pipe.predict('It was one of the best films i have ever watched in my entire life !!')"],"execution_count":null,"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","
sentence_embedding_usetrained_sentiment_confidencedocumenttrained_sentimentsentenceorigin_index
0[-0.022810865193605423, 0.015739120543003082, ...0.833494It was one of the best films i have ever watch...negative[It was one of the best films i have ever watc...0
\n","
"],"text/plain":[" sentence_embedding_use ... origin_index\n","0 [-0.022810865193605423, 0.015739120543003082, ... ... 0\n","\n","[1 rows x 6 columns]"]},"metadata":{"tags":[]},"execution_count":7}]},{"cell_type":"markdown","metadata":{"id":"xflpwrVjjBVD"},"source":["## 5. Configure pipe training parameters"]},{"cell_type":"code","metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"UtsAUGTmOTms","executionInfo":{"status":"ok","timestamp":1620195367250,"user_tz":-120,"elapsed":11235,"user":{"displayName":"Christian Kasim Loan","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GjqAD-ircKP-s5Eh6JSdkDggDczfqQbJGU_IRb4Hw=s64","userId":"14469489166467359317"}},"outputId":"40bfeffd-ac62-4ddb-9bfb-dbc13a32ab76"},"source":["trainable_pipe.print_info()"],"execution_count":null,"outputs":[{"output_type":"stream","text":["The following parameters are configurable for this NLU pipeline (You can copy paste the examples) :\n",">>> pipe['sentiment_dl'] has settable params:\n","pipe['sentiment_dl'].setMaxEpochs(1) | Info: Maximum number of epochs to train | Currently set to : 1\n","pipe['sentiment_dl'].setLr(0.005) | Info: Learning Rate | Currently set to : 0.005\n","pipe['sentiment_dl'].setBatchSize(64) | Info: Batch size | Currently set to : 64\n","pipe['sentiment_dl'].setDropout(0.5) | Info: Dropout coefficient | Currently set to : 0.5\n","pipe['sentiment_dl'].setEnableOutputLogs(True) | Info: Whether to use stdout in addition to Spark logs. | Currently set to : True\n","pipe['sentiment_dl'].setThreshold(0.6) | Info: The minimum threshold for the final result otheriwse it will be neutral | Currently set to : 0.6\n","pipe['sentiment_dl'].setThresholdLabel('neutral') | Info: In case the score is less than threshold, what should be the label. Default is neutral. | Currently set to : neutral\n",">>> pipe['use@tfhub_use'] has settable params:\n","pipe['use@tfhub_use'].setDimension(512) | Info: Number of embedding dimensions | Currently set to : 512\n","pipe['use@tfhub_use'].setLoadSP(False) | Info: Whether to load SentencePiece ops file which is required only by multi-lingual models. This is not changeable after it's set with a pretrained model nor it is compatible with Windows. | Currently set to : False\n","pipe['use@tfhub_use'].setStorageRef('tfhub_use') | Info: unique reference name for identification | Currently set to : tfhub_use\n",">>> pipe['deep_sentence_detector@SentenceDetectorDLModel_c83c27f46b97'] has settable params:\n","pipe['deep_sentence_detector@SentenceDetectorDLModel_c83c27f46b97'].setExplodeSentences(False) | Info: whether to explode each sentence into a different row, for better parallelization. Defaults to false. | Currently set to : False\n","pipe['deep_sentence_detector@SentenceDetectorDLModel_c83c27f46b97'].setStorageRef('SentenceDetectorDLModel_c83c27f46b97') | Info: storage unique identifier | Currently set to : SentenceDetectorDLModel_c83c27f46b97\n","pipe['deep_sentence_detector@SentenceDetectorDLModel_c83c27f46b97'].setEncoder(com.johnsnowlabs.nlp.annotators.sentence_detector_dl.SentenceDetectorDLEncoder@260a728d) | Info: Data encoder | Currently set to : com.johnsnowlabs.nlp.annotators.sentence_detector_dl.SentenceDetectorDLEncoder@260a728d\n","pipe['deep_sentence_detector@SentenceDetectorDLModel_c83c27f46b97'].setImpossiblePenultimates(['Bros', 'No', 'al', 'vs', 'etc', 'Fig', 'Dr', 'Prof', 'PhD', 'MD', 'Co', 'Corp', 'Inc', 'bros', 'VS', 'Vs', 'ETC', 'fig', 'dr', 'prof', 'PHD', 'phd', 'md', 'co', 'corp', 'inc', 'Jan', 'Feb', 'Mar', 'Apr', 'Jul', 'Aug', 'Sep', 'Sept', 'Oct', 'Nov', 'Dec', 'St', 'st', 'AM', 'PM', 'am', 'pm', 'e.g', 'f.e', 'i.e']) | Info: Impossible penultimates | Currently set to : ['Bros', 'No', 'al', 'vs', 'etc', 'Fig', 'Dr', 'Prof', 'PhD', 'MD', 'Co', 'Corp', 'Inc', 'bros', 'VS', 'Vs', 'ETC', 'fig', 'dr', 'prof', 'PHD', 'phd', 'md', 'co', 'corp', 'inc', 'Jan', 'Feb', 'Mar', 'Apr', 'Jul', 'Aug', 'Sep', 'Sept', 'Oct', 'Nov', 'Dec', 'St', 'st', 'AM', 'PM', 'am', 'pm', 'e.g', 'f.e', 'i.e']\n","pipe['deep_sentence_detector@SentenceDetectorDLModel_c83c27f46b97'].setModelArchitecture('cnn') | Info: Model architecture (CNN) | Currently set to : cnn\n",">>> pipe['document_assembler'] has settable params:\n","pipe['document_assembler'].setCleanupMode('shrink') | Info: possible values: disabled, inplace, inplace_full, shrink, shrink_full, each, each_full, delete_full | Currently set to : shrink\n"],"name":"stdout"}]},{"cell_type":"markdown","metadata":{"id":"2GJdDNV9jEIe"},"source":["## 6. Retrain with new parameters"]},{"cell_type":"code","metadata":{"colab":{"base_uri":"https://localhost:8080/","height":1000},"id":"mptfvHx-MMMX","executionInfo":{"status":"ok","timestamp":1620195371203,"user_tz":-120,"elapsed":15108,"user":{"displayName":"Christian Kasim Loan","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GjqAD-ircKP-s5Eh6JSdkDggDczfqQbJGU_IRb4Hw=s64","userId":"14469489166467359317"}},"outputId":"c558685c-7b89-42f6-f5d2-75bda38aebef"},"source":["# Train longer!\n","trainable_pipe = nlu.load('train.sentiment')\n","trainable_pipe['trainable_sentiment_dl'].setMaxEpochs(5) \n","fitted_pipe = trainable_pipe.fit(train_df.iloc[:50])\n","# predict with the trainable pipeline on dataset and get predictions\n","preds = fitted_pipe.predict(train_df.iloc[:50],output_level='document')\n","\n","#sentence detector that is part of the pipe generates sone NaNs. lets drop them first\n","preds.dropna(inplace=True)\n","print(classification_report(preds['y'], preds['sentiment']))\n","\n","preds"],"execution_count":null,"outputs":[{"output_type":"stream","text":[" precision recall f1-score support\n","\n"," negative 0.92 0.92 0.92 26\n"," neutral 0.00 0.00 0.00 0\n"," positive 1.00 0.75 0.86 24\n","\n"," accuracy 0.84 50\n"," macro avg 0.64 0.56 0.59 50\n","weighted avg 0.96 0.84 0.89 50\n","\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"," \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"," \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"," \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"," \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"," \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"," \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"," \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"," \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"," \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"," \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"," \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","
sentence_embedding_usetrained_sentiment_confidencetextdocumenttrained_sentimentsentenceyorigin_index
0[0.06351275742053986, 0.040804557502269745, -2...0.564160Absolutely wonderful drama and Ros is top notc...Absolutely wonderful drama and Ros is top notc...neutral[Absolutely wonderful drama and Ros is top not...positive1459
1[0.06992700695991516, 0.0012252129381522536, -...0.853955I was totally surprised just how good this mov...I was totally surprised just how good this mov...positive[I was totally surprised just how good this mo...positive2428
2[0.052442848682403564, -0.017640504986047745, ...0.866541This is a fine musical with a timeless score b...This is a fine musical with a timeless score b...positive[This is a fine musical with a timeless score ...positive2093
3[0.04445473477244377, 0.018118631094694138, -0...0.894689Saw it yesterday night at the Midnight Slam of...Saw it yesterday night at the Midnight Slam of...negative[Saw it yesterday night at the Midnight Slam o...negative2370
4[0.01753336377441883, 0.05620148777961731, -0....0.680551This show was Fabulous. It was intricate and w...This show was Fabulous. It was intricate and w...positive[This show was Fabulous., It was intricate and...positive2064
5[0.02791544236242771, -0.028735769912600517, -...0.566901Jean Dujardin gets Connery's mannerisms down p...Jean Dujardin gets Connery's mannerisms down p...neutral[Jean Dujardin gets Connery's mannerisms down ...positive1988
6[0.06690913438796997, 0.03236781805753708, -0....0.870670This is a tongue in cheek movie from the very ...This is a tongue in cheek movie from the very ...positive[This is a tongue in cheek movie from the very...positive1483
7[0.05750656872987747, -0.059703629463911057, -...0.811313I have seen most, if not all of the Laurel & H...I have seen most, if not all of the Laurel & H...negative[I have seen most, if not all of the Laurel & ...negative207
8[-0.04340153560042381, -0.015529784373939037, ...0.885475Although there is melodrama at the center or r...Although there is melodrama at the center or r...positive[Although there is melodrama at the center or ...positive2030
9[-0.032444775104522705, -0.018744193017482758,...0.880005\"Hey Babu Riba\" is a film about a young woman,...\"Hey Babu Riba\" is a film about a young woman,...positive[\"Hey Babu Riba\" is a film about a young woman...positive397
10[0.04818158969283104, 0.006010068114846945, 0....0.832985I have to say the first I watched this film wa...I have to say the first I watched this film wa...negative[I have to say the first I watched this film w...negative1079
11[-0.011373912915587425, 0.033458177000284195, ...0.881889Well, there's no real plot to speak of, it's j...Well, there's no real plot to speak of, it's j...negative[Well, there's no real plot to speak of, it's ...negative308
12[0.059722382575273514, -0.04133075103163719, -...0.939842Why can't a movie be rated a zero? Or even a n...Why can't a movie be rated a zero? Or even a n...negative[Why can't a movie be rated a zero?, Or even a...negative175
13[-0.0024044793099164963, 0.01555465068668127, ...0.566536PREY <br /><br />Aspect ratio: 1.37:1<br /><br...PREY <br /><br />Aspect ratio: 1.37:1<br /><br...neutral[PREY <br /><br />Aspect ratio: 1.37:1<br /><b...negative610
14[0.014560171402990818, 0.07181794941425323, 0....0.835540Don't bother trying to watch this terrible min...Don't bother trying to watch this terrible min...negative[Don't bother trying to watch this terrible mi...negative1516
15[0.047474540770053864, -0.01399887353181839, -...0.720724This is one of the most ridiculous westerns th...This is one of the most ridiculous westerns th...negative[This is one of the most ridiculous westerns t...negative1558
16[0.04194203019142151, 0.014816542156040668, -0...0.881261Please don't waste your time. This movie rehas...Please don't waste your time. This movie rehas...negative[Please don't waste your time., This movie reh...negative1691
17[-0.01830967515707016, 0.0020676907151937485, ...0.744092Nice character development in a pretty cool mi...Nice character development in a pretty cool mi...positive[Nice character development in a pretty cool m...positive227
18[-0.028767548501491547, -0.04782490059733391, ...0.875401The Elegant Documentary -<br /><br />Don't wat...The Elegant Documentary -<br /><br />Don't wat...positive[The Elegant Documentary -<br /><br />Don't wa...positive172
19[0.020619677379727364, -0.0368206612765789, -0...0.839296The script was VERY weak w/o enough character ...The script was VERY weak w/o enough character ...negative[The script was VERY weak w/o enough character...negative1687
20[0.025141961872577667, 0.03661772608757019, -0...0.849500Though structured totally different from the b...Though structured totally different from the b...positive[Though structured totally different from the ...positive2496
21[0.05255172401666641, 0.0014638856519013643, -...0.840122I am so excited that Greek is back! This seaso...I am so excited that Greek is back! This seaso...positive[I am so excited that Greek is back!, This sea...positive2162
22[0.05090215429663658, 0.04202255234122276, -0....0.874497Petter Mattei's \"Love in the Time of Money\" is...Petter Mattei's \"Love in the Time of Money\" is...positive[Petter Mattei's \"Love in the Time of Money\" i...positive4
23[0.028773412108421326, 0.025388378649950027, -...0.912337Most Lorne Michaels films seem to fail because...Most Lorne Michaels films seem to fail because...negative[Most Lorne Michaels films seem to fail becaus...negative654
24[0.0029449418652802706, -0.054734643548727036,...0.894369\"Revolt of the Zombies\" proves that having the...\"Revolt of the Zombies\" proves that having the...negative[\"Revolt of the Zombies\" proves that having th...negative126
25[0.045008499175310135, 0.06566429883241653, -0...0.562989Necessarily ridiculous film version the litera...Necessarily ridiculous film version the litera...neutral[Necessarily ridiculous film version the liter...negative2316
26[0.03256276622414589, -0.041013315320014954, -...0.753462Supposedly a \"social commentary\" on racism and...Supposedly a \"social commentary\" on racism and...negative[Supposedly a \"social commentary\" on racism an...negative250
27[0.037413761019706726, -0.041003260761499405, ...0.898136I rented the DVD in a video store, as an alter...I rented the DVD in a video store, as an alter...negative[I rented the DVD in a video store, as an alte...negative644
28[-0.0654454156756401, 0.005620448384433985, -0...0.765227If you like original gut wrenching laughter yo...If you like original gut wrenching laughter yo...positive[If you like original gut wrenching laughter y...positive9
29[0.027594028040766716, -0.024396954104304314, ...0.581867Doctor Mordrid is one of those rare films that...Doctor Mordrid is one of those rare films that...neutral[Doctor Mordrid is one of those rare films tha...positive376
30[0.017458664253354073, 0.05214596167206764, -0...0.814803Back in 1982 a little film called MAKING LOVE ...Back in 1982 a little film called MAKING LOVE ...positive[Back in 1982 a little film called MAKING LOVE...positive746
31[0.04889684543013573, 0.029793666675686836, 0....0.7119661936 was the most prolific year for Astaire an...1936 was the most prolific year for Astaire an...positive[1936 was the most prolific year for Astaire a...positive2293
32[0.04028377681970596, 0.05781426653265953, -0....0.823739Tim Taylor is an abusive acholoic drug addict....Tim Taylor is an abusive acholoic drug addict....negative[Tim Taylor is an abusive acholoic drug addict...negative2398
33[0.033708442002534866, -0.06806037575006485, -...0.880034First of all yes I'm white, so I try to tread ...First of all yes I'm white, so I try to tread ...negative[First of all yes I'm white, so I try to tread...negative784
34[-0.05339590832591057, 0.03226976469159126, 0....0.859471I have to say that the events of 9/11 didn't h...I have to say that the events of 9/11 didn't h...positive[I have to say that the events of 9/11 didn't ...positive713
35[0.034553565084934235, -0.002318630227819085, ...0.873029This movie features Charlie Spradling dancing ...This movie features Charlie Spradling dancing ...negative[This movie features Charlie Spradling dancing...negative358
36[-0.03914014622569084, -0.04544996842741966, -...0.919768. . . and that is only if you like the sight o.... . . and that is only if you like the sight o...negative[. . . and that is only if you like the sight ...negative1377
37[-0.037124212831258774, 0.04466667398810387, -...0.825637An interesting movie with Jordana Brewster as ...An interesting movie with Jordana Brewster as ...positive[An interesting movie with Jordana Brewster as...positive1902
38[0.05217211693525314, -0.045366983860731125, -...0.879427Next to the slasher films of the 1970s and 80s...Next to the slasher films of the 1970s and 80s...negative[Next to the slasher films of the 1970s and 80...negative2028
39[0.054036945104599, -0.0035783019848167896, -0...0.673891I saw this movie in a theater while on vacatio...I saw this movie in a theater while on vacatio...negative[I saw this movie in a theater while on vacati...positive929
40[0.004495782777667046, 0.0002409428561804816, ...0.870754Did the first travesty actually make money? Th...Did the first travesty actually make money? Th...negative[Did the first travesty actually make money?, ...negative659
41[0.05336875841021538, 0.01685612089931965, -0....0.839090Jay Craven's criminally ignored film is a sobe...Jay Craven's criminally ignored film is a sobe...positive[Jay Craven's criminally ignored film is a sob...positive2286
42[0.06096196547150612, -0.018674220889806747, -...0.880842This is a great film with an amazing cast. Cri...This is a great film with an amazing cast. Cri...positive[This is a great film with an amazing cast. Cr...positive1198
43[-0.01874159276485443, -0.015269572846591473, ...0.653215I had a hard time staying awake for the two ho...I had a hard time staying awake for the two ho...negative[I had a hard time staying awake for the two h...negative468
44[0.0465228296816349, -0.03501952812075615, -0....0.520477Not the film to see if you want to be intellec...Not the film to see if you want to be intellec...neutral[Not the film to see if you want to be intelle...positive1335
45[-0.022962188348174095, -0.05519339069724083, ...0.916282I bought this (it was only $3, ok?) under the ...I bought this (it was only $3, ok?) under the ...negative[I bought this (it was only $3, ok?) under the...negative1322
46[0.05667755752801895, -0.004784214776009321, 0...0.629980I saw it tonight and fell asleep in the movie....I saw it tonight and fell asleep in the movie....negative[I saw it tonight and fell asleep in the movie...negative2141
47[-0.045412369072437286, -0.010548366233706474,...0.944924The opening scene keeps me from rating at abso...The opening scene keeps me from rating at abso...negative[The opening scene keeps me from rating at abs...negative1065
48[0.005430039018392563, -0.021274806931614876, ...0.716253If you are a fan of Zorro, Indiana Jones, or a...If you are a fan of Zorro, Indiana Jones, or a...negative[If you are a fan of Zorro, Indiana Jones, or ...positive2103
49[-0.012310817837715149, 0.036387305706739426, ...0.831511Stan Laurel and Oliver Hardy are the most famo...Stan Laurel and Oliver Hardy are the most famo...negative[Stan Laurel and Oliver Hardy are the most fam...negative588
\n","
"],"text/plain":[" sentence_embedding_use ... origin_index\n","0 [0.06351275742053986, 0.040804557502269745, -2... ... 1459\n","1 [0.06992700695991516, 0.0012252129381522536, -... ... 2428\n","2 [0.052442848682403564, -0.017640504986047745, ... ... 2093\n","3 [0.04445473477244377, 0.018118631094694138, -0... ... 2370\n","4 [0.01753336377441883, 0.05620148777961731, -0.... ... 2064\n","5 [0.02791544236242771, -0.028735769912600517, -... ... 1988\n","6 [0.06690913438796997, 0.03236781805753708, -0.... ... 1483\n","7 [0.05750656872987747, -0.059703629463911057, -... ... 207\n","8 [-0.04340153560042381, -0.015529784373939037, ... ... 2030\n","9 [-0.032444775104522705, -0.018744193017482758,... ... 397\n","10 [0.04818158969283104, 0.006010068114846945, 0.... ... 1079\n","11 [-0.011373912915587425, 0.033458177000284195, ... ... 308\n","12 [0.059722382575273514, -0.04133075103163719, -... ... 175\n","13 [-0.0024044793099164963, 0.01555465068668127, ... ... 610\n","14 [0.014560171402990818, 0.07181794941425323, 0.... ... 1516\n","15 [0.047474540770053864, -0.01399887353181839, -... ... 1558\n","16 [0.04194203019142151, 0.014816542156040668, -0... ... 1691\n","17 [-0.01830967515707016, 0.0020676907151937485, ... ... 227\n","18 [-0.028767548501491547, -0.04782490059733391, ... ... 172\n","19 [0.020619677379727364, -0.0368206612765789, -0... ... 1687\n","20 [0.025141961872577667, 0.03661772608757019, -0... ... 2496\n","21 [0.05255172401666641, 0.0014638856519013643, -... ... 2162\n","22 [0.05090215429663658, 0.04202255234122276, -0.... ... 4\n","23 [0.028773412108421326, 0.025388378649950027, -... ... 654\n","24 [0.0029449418652802706, -0.054734643548727036,... ... 126\n","25 [0.045008499175310135, 0.06566429883241653, -0... ... 2316\n","26 [0.03256276622414589, -0.041013315320014954, -... ... 250\n","27 [0.037413761019706726, -0.041003260761499405, ... ... 644\n","28 [-0.0654454156756401, 0.005620448384433985, -0... ... 9\n","29 [0.027594028040766716, -0.024396954104304314, ... ... 376\n","30 [0.017458664253354073, 0.05214596167206764, -0... ... 746\n","31 [0.04889684543013573, 0.029793666675686836, 0.... ... 2293\n","32 [0.04028377681970596, 0.05781426653265953, -0.... ... 2398\n","33 [0.033708442002534866, -0.06806037575006485, -... ... 784\n","34 [-0.05339590832591057, 0.03226976469159126, 0.... ... 713\n","35 [0.034553565084934235, -0.002318630227819085, ... ... 358\n","36 [-0.03914014622569084, -0.04544996842741966, -... ... 1377\n","37 [-0.037124212831258774, 0.04466667398810387, -... ... 1902\n","38 [0.05217211693525314, -0.045366983860731125, -... ... 2028\n","39 [0.054036945104599, -0.0035783019848167896, -0... ... 929\n","40 [0.004495782777667046, 0.0002409428561804816, ... ... 659\n","41 [0.05336875841021538, 0.01685612089931965, -0.... ... 2286\n","42 [0.06096196547150612, -0.018674220889806747, -... ... 1198\n","43 [-0.01874159276485443, -0.015269572846591473, ... ... 468\n","44 [0.0465228296816349, -0.03501952812075615, -0.... ... 1335\n","45 [-0.022962188348174095, -0.05519339069724083, ... ... 1322\n","46 [0.05667755752801895, -0.004784214776009321, 0... ... 2141\n","47 [-0.045412369072437286, -0.010548366233706474,... ... 1065\n","48 [0.005430039018392563, -0.021274806931614876, ... ... 2103\n","49 [-0.012310817837715149, 0.036387305706739426, ... ... 588\n","\n","[50 rows x 8 columns]"]},"metadata":{"tags":[]},"execution_count":9}]},{"cell_type":"markdown","metadata":{"id":"qFoT-s1MjTSS"},"source":["# 7. Try training with different Embeddings"]},{"cell_type":"code","metadata":{"id":"nxWFzQOhjWC8","colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"status":"ok","timestamp":1620195371204,"user_tz":-120,"elapsed":15026,"user":{"displayName":"Christian Kasim Loan","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GjqAD-ircKP-s5Eh6JSdkDggDczfqQbJGU_IRb4Hw=s64","userId":"14469489166467359317"}},"outputId":"cfc1e505-40b8-4021-e75d-228cae3cfe4c"},"source":["# We can use nlu.print_components(action='embed_sentence') to see every possibler sentence embedding we could use. Lets use bert!\n","nlu.print_components(action='embed_sentence')"],"execution_count":null,"outputs":[{"output_type":"stream","text":["For language NLU provides the following Models : \n","nlu.load('en.embed_sentence') returns Spark NLP model tfhub_use\n","nlu.load('en.embed_sentence.use') returns Spark NLP model tfhub_use\n","nlu.load('en.embed_sentence.tfhub_use') returns Spark NLP model tfhub_use\n","nlu.load('en.embed_sentence.use.lg') returns Spark NLP model tfhub_use_lg\n","nlu.load('en.embed_sentence.tfhub_use.lg') returns Spark NLP model tfhub_use_lg\n","nlu.load('en.embed_sentence.albert') returns Spark NLP model albert_base_uncased\n","nlu.load('en.embed_sentence.electra') returns Spark NLP model sent_electra_small_uncased\n","nlu.load('en.embed_sentence.electra_small_uncased') returns Spark NLP model sent_electra_small_uncased\n","nlu.load('en.embed_sentence.electra_base_uncased') returns Spark NLP model sent_electra_base_uncased\n","nlu.load('en.embed_sentence.electra_large_uncased') returns Spark NLP model sent_electra_large_uncased\n","nlu.load('en.embed_sentence.bert') returns Spark NLP model sent_bert_base_uncased\n","nlu.load('en.embed_sentence.bert_base_uncased') returns Spark NLP model sent_bert_base_uncased\n","nlu.load('en.embed_sentence.bert_base_cased') returns Spark NLP model sent_bert_base_cased\n","nlu.load('en.embed_sentence.bert_large_uncased') returns Spark NLP model sent_bert_large_uncased\n","nlu.load('en.embed_sentence.bert_large_cased') returns Spark NLP model sent_bert_large_cased\n","nlu.load('en.embed_sentence.biobert.pubmed_base_cased') returns Spark NLP model sent_biobert_pubmed_base_cased\n","nlu.load('en.embed_sentence.biobert.pubmed_large_cased') returns Spark NLP model sent_biobert_pubmed_large_cased\n","nlu.load('en.embed_sentence.biobert.pmc_base_cased') returns Spark NLP model sent_biobert_pmc_base_cased\n","nlu.load('en.embed_sentence.biobert.pubmed_pmc_base_cased') returns Spark NLP model sent_biobert_pubmed_pmc_base_cased\n","nlu.load('en.embed_sentence.biobert.clinical_base_cased') returns Spark NLP model sent_biobert_clinical_base_cased\n","nlu.load('en.embed_sentence.biobert.discharge_base_cased') returns Spark NLP model sent_biobert_discharge_base_cased\n","nlu.load('en.embed_sentence.covidbert.large_uncased') returns Spark NLP model sent_covidbert_large_uncased\n","nlu.load('en.embed_sentence.small_bert_L2_128') returns Spark NLP model sent_small_bert_L2_128\n","nlu.load('en.embed_sentence.small_bert_L4_128') returns Spark NLP model sent_small_bert_L4_128\n","nlu.load('en.embed_sentence.small_bert_L6_128') returns Spark NLP model sent_small_bert_L6_128\n","nlu.load('en.embed_sentence.small_bert_L8_128') returns Spark NLP model sent_small_bert_L8_128\n","nlu.load('en.embed_sentence.small_bert_L10_128') returns Spark NLP model sent_small_bert_L10_128\n","nlu.load('en.embed_sentence.small_bert_L12_128') returns Spark NLP model sent_small_bert_L12_128\n","nlu.load('en.embed_sentence.small_bert_L2_256') returns Spark NLP model sent_small_bert_L2_256\n","nlu.load('en.embed_sentence.small_bert_L4_256') returns Spark NLP model sent_small_bert_L4_256\n","nlu.load('en.embed_sentence.small_bert_L6_256') returns Spark NLP model sent_small_bert_L6_256\n","nlu.load('en.embed_sentence.small_bert_L8_256') returns Spark NLP model sent_small_bert_L8_256\n","nlu.load('en.embed_sentence.small_bert_L10_256') returns Spark NLP model sent_small_bert_L10_256\n","nlu.load('en.embed_sentence.small_bert_L12_256') returns Spark NLP model sent_small_bert_L12_256\n","nlu.load('en.embed_sentence.small_bert_L2_512') returns Spark NLP model sent_small_bert_L2_512\n","nlu.load('en.embed_sentence.small_bert_L4_512') returns Spark NLP model sent_small_bert_L4_512\n","nlu.load('en.embed_sentence.small_bert_L6_512') returns Spark NLP model sent_small_bert_L6_512\n","nlu.load('en.embed_sentence.small_bert_L8_512') returns Spark NLP model sent_small_bert_L8_512\n","nlu.load('en.embed_sentence.small_bert_L10_512') returns Spark NLP model sent_small_bert_L10_512\n","nlu.load('en.embed_sentence.small_bert_L12_512') returns Spark NLP model sent_small_bert_L12_512\n","nlu.load('en.embed_sentence.small_bert_L2_768') returns Spark NLP model sent_small_bert_L2_768\n","nlu.load('en.embed_sentence.small_bert_L4_768') returns Spark NLP model sent_small_bert_L4_768\n","nlu.load('en.embed_sentence.small_bert_L6_768') returns Spark NLP model sent_small_bert_L6_768\n","nlu.load('en.embed_sentence.small_bert_L8_768') returns Spark NLP model sent_small_bert_L8_768\n","nlu.load('en.embed_sentence.small_bert_L10_768') returns Spark NLP model sent_small_bert_L10_768\n","nlu.load('en.embed_sentence.small_bert_L12_768') returns Spark NLP model sent_small_bert_L12_768\n","For language NLU provides the following Models : \n","nlu.load('fi.embed_sentence') returns Spark NLP model sent_bert_finnish_cased\n","nlu.load('fi.embed_sentence.bert.cased') returns Spark NLP model sent_bert_finnish_cased\n","nlu.load('fi.embed_sentence.bert.uncased') returns Spark NLP model sent_bert_finnish_uncased\n","For language NLU provides the following Models : \n","nlu.load('xx.embed_sentence') returns Spark NLP model sent_bert_multi_cased\n","nlu.load('xx.embed_sentence.bert') returns Spark NLP model sent_bert_multi_cased\n","nlu.load('xx.embed_sentence.bert.cased') returns Spark NLP model sent_bert_multi_cased\n","nlu.load('xx.embed_sentence.labse') returns Spark NLP model labse\n"],"name":"stdout"}]},{"cell_type":"code","metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"IKK_Ii_gjJfF","executionInfo":{"status":"ok","timestamp":1620201627380,"user_tz":-120,"elapsed":6271143,"user":{"displayName":"Christian Kasim Loan","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GjqAD-ircKP-s5Eh6JSdkDggDczfqQbJGU_IRb4Hw=s64","userId":"14469489166467359317"}},"outputId":"40fc246a-ca8b-4b81-f02d-30a189cd26f2"},"source":["trainable_pipe = nlu.load('en.embed_sentence.small_bert_L12_768 train.sentiment')\n","# We need to train longer and user smaller LR for NON-USE based sentence embeddings usually\n","# We could tune the hyperparameters further with hyperparameter tuning methods like gridsearch\n","# Also longer training gives more accuracy\n","trainable_pipe['trainable_sentiment_dl'].setMaxEpochs(120) \n","trainable_pipe['trainable_sentiment_dl'].setLr(0.0005) \n","fitted_pipe = trainable_pipe.fit(train_df)\n","# predict with the trainable pipeline on dataset and get predictions\n","preds = fitted_pipe.predict(train_df,output_level='document')\n","\n","#sentence detector that is part of the pipe generates sone NaNs. lets drop them first\n","preds.dropna(inplace=True)\n","print(classification_report(preds['y'], preds['sentiment']))\n","\n","#preds"],"execution_count":null,"outputs":[{"output_type":"stream","text":["sent_small_bert_L12_768 download started this may take some time.\n","Approximate size to download 392.9 MB\n","[OK!]\n","sentence_detector_dl download started this may take some time.\n","Approximate size to download 354.6 KB\n","[OK!]\n"," precision recall f1-score support\n","\n"," negative 0.87 0.77 0.82 988\n"," neutral 0.00 0.00 0.00 0\n"," positive 0.85 0.83 0.84 1012\n","\n"," accuracy 0.80 2000\n"," macro avg 0.57 0.53 0.55 2000\n","weighted avg 0.86 0.80 0.83 2000\n","\n"],"name":"stdout"}]},{"cell_type":"markdown","metadata":{"id":"_1jxw3GnVGlI"},"source":["# 7.1 evaluate on Test Data"]},{"cell_type":"code","metadata":{"id":"Fxx4yNkNVGFl","colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"status":"ok","timestamp":1620201800537,"user_tz":-120,"elapsed":6444231,"user":{"displayName":"Christian Kasim Loan","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GjqAD-ircKP-s5Eh6JSdkDggDczfqQbJGU_IRb4Hw=s64","userId":"14469489166467359317"}},"outputId":"4cd26bf6-b452-4f97-d27e-125ba4adba24"},"source":["preds = fitted_pipe.predict(test_df,output_level='document')\n","\n","#sentence detector that is part of the pipe generates sone NaNs. lets drop them first\n","preds.dropna(inplace=True)\n","print(classification_report(preds['y'], preds['sentiment']))"],"execution_count":null,"outputs":[{"output_type":"stream","text":[" precision recall f1-score support\n","\n"," negative 0.85 0.75 0.80 246\n"," neutral 0.00 0.00 0.00 0\n"," positive 0.84 0.81 0.83 254\n","\n"," accuracy 0.78 500\n"," macro avg 0.56 0.52 0.54 500\n","weighted avg 0.85 0.78 0.81 500\n","\n"],"name":"stdout"}]},{"cell_type":"markdown","metadata":{"id":"2BB-NwZUoHSe"},"source":["# 8. Lets save the model"]},{"cell_type":"code","metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"eLex095goHwm","executionInfo":{"status":"ok","timestamp":1620201947576,"user_tz":-120,"elapsed":6591195,"user":{"displayName":"Christian Kasim Loan","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GjqAD-ircKP-s5Eh6JSdkDggDczfqQbJGU_IRb4Hw=s64","userId":"14469489166467359317"}},"outputId":"2722dd4c-b2c6-453c-9a76-b59de2034549"},"source":["stored_model_path = './models/classifier_dl_trained' \n","fitted_pipe.save(stored_model_path)"],"execution_count":null,"outputs":[{"output_type":"stream","text":["Stored model in ./models/classifier_dl_trained\n"],"name":"stdout"}]},{"cell_type":"markdown","metadata":{"id":"e_b2DPd4rCiU"},"source":["# 9. Lets load the model from HDD.\n","This makes Offlien NLU usage possible! \n","You need to call nlu.load(path=path_to_the_pipe) to load a model/pipeline from disk."]},{"cell_type":"code","metadata":{"colab":{"base_uri":"https://localhost:8080/","height":76},"id":"SO4uz45MoRgp","executionInfo":{"status":"ok","timestamp":1620201958142,"user_tz":-120,"elapsed":6601685,"user":{"displayName":"Christian Kasim Loan","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GjqAD-ircKP-s5Eh6JSdkDggDczfqQbJGU_IRb4Hw=s64","userId":"14469489166467359317"}},"outputId":"e7af7ac1-5347-4bf3-d23b-a1f65df85c97"},"source":["hdd_pipe = nlu.load(path=stored_model_path)\n","\n","preds = hdd_pipe.predict('It was one of the best films i have ever watched in my entire life !!')\n","preds"],"execution_count":null,"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","
sentiment_confidencesentence_embedding_from_disktextdocumentsentenceorigin_indexsentiment
0[0.9986149, 0.9986149][[0.030373765155673027, 0.05577867478132248, 0...It was one of the best films i have ever watch...It was one of the best films i have ever watch...[It was one of the best films i have ever watc...8589934592[positive, positive]
\n","
"],"text/plain":[" sentiment_confidence ... sentiment\n","0 [0.9986149, 0.9986149] ... [positive, positive]\n","\n","[1 rows x 7 columns]"]},"metadata":{"tags":[]},"execution_count":14}]},{"cell_type":"code","metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"e0CVlkk9v6Qi","executionInfo":{"status":"ok","timestamp":1620201958143,"user_tz":-120,"elapsed":6601641,"user":{"displayName":"Christian Kasim Loan","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GjqAD-ircKP-s5Eh6JSdkDggDczfqQbJGU_IRb4Hw=s64","userId":"14469489166467359317"}},"outputId":"5dfa5379-198e-4796-c27b-18f7c92a6ffa"},"source":["hdd_pipe.print_info()"],"execution_count":null,"outputs":[{"output_type":"stream","text":["The following parameters are configurable for this NLU pipeline (You can copy paste the examples) :\n",">>> pipe['document_assembler'] has settable params:\n","pipe['document_assembler'].setCleanupMode('shrink') | Info: possible values: disabled, inplace, inplace_full, shrink, shrink_full, each, each_full, delete_full | Currently set to : shrink\n",">>> pipe['sentence_detector@SentenceDetectorDLModel_c83c27f46b97'] has settable params:\n","pipe['sentence_detector@SentenceDetectorDLModel_c83c27f46b97'].setExplodeSentences(False) | Info: whether to explode each sentence into a different row, for better parallelization. Defaults to false. | Currently set to : False\n","pipe['sentence_detector@SentenceDetectorDLModel_c83c27f46b97'].setStorageRef('SentenceDetectorDLModel_c83c27f46b97') | Info: storage unique identifier | Currently set to : SentenceDetectorDLModel_c83c27f46b97\n","pipe['sentence_detector@SentenceDetectorDLModel_c83c27f46b97'].setEncoder(com.johnsnowlabs.nlp.annotators.sentence_detector_dl.SentenceDetectorDLEncoder@2350f35a) | Info: Data encoder | Currently set to : com.johnsnowlabs.nlp.annotators.sentence_detector_dl.SentenceDetectorDLEncoder@2350f35a\n","pipe['sentence_detector@SentenceDetectorDLModel_c83c27f46b97'].setImpossiblePenultimates(['Bros', 'No', 'al', 'vs', 'etc', 'Fig', 'Dr', 'Prof', 'PhD', 'MD', 'Co', 'Corp', 'Inc', 'bros', 'VS', 'Vs', 'ETC', 'fig', 'dr', 'prof', 'PHD', 'phd', 'md', 'co', 'corp', 'inc', 'Jan', 'Feb', 'Mar', 'Apr', 'Jul', 'Aug', 'Sep', 'Sept', 'Oct', 'Nov', 'Dec', 'St', 'st', 'AM', 'PM', 'am', 'pm', 'e.g', 'f.e', 'i.e']) | Info: Impossible penultimates | Currently set to : ['Bros', 'No', 'al', 'vs', 'etc', 'Fig', 'Dr', 'Prof', 'PhD', 'MD', 'Co', 'Corp', 'Inc', 'bros', 'VS', 'Vs', 'ETC', 'fig', 'dr', 'prof', 'PHD', 'phd', 'md', 'co', 'corp', 'inc', 'Jan', 'Feb', 'Mar', 'Apr', 'Jul', 'Aug', 'Sep', 'Sept', 'Oct', 'Nov', 'Dec', 'St', 'st', 'AM', 'PM', 'am', 'pm', 'e.g', 'f.e', 'i.e']\n","pipe['sentence_detector@SentenceDetectorDLModel_c83c27f46b97'].setModelArchitecture('cnn') | Info: Model architecture (CNN) | Currently set to : cnn\n",">>> pipe['bert_sentence@sent_small_bert_L12_768'] has settable params:\n","pipe['bert_sentence@sent_small_bert_L12_768'].setBatchSize(8) | Info: Size of every batch | Currently set to : 8\n","pipe['bert_sentence@sent_small_bert_L12_768'].setCaseSensitive(False) | Info: whether to ignore case in tokens for embeddings matching | Currently set to : False\n","pipe['bert_sentence@sent_small_bert_L12_768'].setDimension(768) | Info: Number of embedding dimensions | Currently set to : 768\n","pipe['bert_sentence@sent_small_bert_L12_768'].setMaxSentenceLength(128) | Info: Max sentence length to process | Currently set to : 128\n","pipe['bert_sentence@sent_small_bert_L12_768'].setIsLong(False) | Info: Use Long type instead of Int type for inputs buffer - Some Bert models require Long instead of Int. | Currently set to : False\n","pipe['bert_sentence@sent_small_bert_L12_768'].setStorageRef('sent_small_bert_L12_768') | Info: unique reference name for identification | Currently set to : sent_small_bert_L12_768\n",">>> pipe['sentiment_dl@sent_small_bert_L12_768'] has settable params:\n","pipe['sentiment_dl@sent_small_bert_L12_768'].setThreshold(0.6) | Info: The minimum threshold for the final result otheriwse it will be neutral | Currently set to : 0.6\n","pipe['sentiment_dl@sent_small_bert_L12_768'].setThresholdLabel('neutral') | Info: In case the score is less than threshold, what should be the label. Default is neutral. | Currently set to : neutral\n","pipe['sentiment_dl@sent_small_bert_L12_768'].setClasses(['positive', 'negative']) | Info: get the tags used to trained this SentimentDLModel | Currently set to : ['positive', 'negative']\n","pipe['sentiment_dl@sent_small_bert_L12_768'].setStorageRef('sent_small_bert_L12_768') | Info: unique reference name for identification | Currently set to : sent_small_bert_L12_768\n"],"name":"stdout"}]},{"cell_type":"code","metadata":{"id":"mtDcALorKHIx"},"source":[""],"execution_count":null,"outputs":[]}]} \ No newline at end of file +{ + "nbformat": 4, + "nbformat_minor": 0, + "metadata": { + "colab": { + "provenance": [], + "collapsed_sections": [ + "zkufh760uvF3" + ] + }, + "kernelspec": { + "display_name": "Python 3", + "name": "python3" + } + }, + "cells": [ + { + "cell_type": "markdown", + "metadata": { + "id": "zkufh760uvF3" + }, + "source": [ + "![JohnSnowLabs](https://nlp.johnsnowlabs.com/assets/images/logo.png)\n", + "\n", + "[![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/JohnSnowLabs/nlu/blob/master/examples/colab/Training/binary_text_classification/NLU_training_sentiment_classifier_demo_IMDB.ipynb)\n", + "\n", + "\n", + "# Training a Sentiment Analysis Classifier with NLU\n", + "## 2 class IMDB Movie sentiment classifier training\n", + "With the [SentimentDL model](https://nlp.johnsnowlabs.com/docs/en/annotators#sentimentdl-multi-class-sentiment-analysis-annotator) from Spark NLP you can achieve State Of the Art results on any multi class text classification problem\n", + "\n", + "This notebook showcases the following features :\n", + "\n", + "- How to train the deep learning classifier\n", + "- How to store a pipeline to disk\n", + "- How to load the pipeline from disk (Enables NLU offline mode)\n", + "\n", + "You can achieve these results or even better on this dataset with training data:\n", + "\n", + "\n", + "
\n", + "\n", + "\n", + "![image.png](data:image/png;base64,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)\n", + "\n", + "\n", + "\n", + "You can achieve these results or even better on this dataset with test data:\n", + "\n", + "\n", + "
\n", + "\n", + "\n", + "![image.png](data:image/png;base64,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)\n" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "dur2drhW5Rvi" + }, + "source": [ + "# 1. Install Java 8 and NLU" + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "hFGnBCHavltY" + }, + "source": [ + "!pip install -q johnsnowlabs" + ], + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "f4KkTfnR5Ugg" + }, + "source": [ + "# 2. Download IMDB dataset\n", + "https://www.kaggle.com/lakshmi25npathi/imdb-dataset-of-50k-movie-reviews\n", + "\n", + "IMDB dataset having 50K movie reviews for natural language processing or Text analytics.\n", + "This is a dataset for binary sentiment classification containing substantially more data than previous benchmark datasets. We provide a set of 25,000 highly polar movie reviews for training and 25,000 for testing. So, predict the number of positive and negative reviews using either classification or deep learning algorithms.\n", + "For more dataset information, please go through the following link,\n", + "http://ai.stanford.edu/~amaas/data/sentiment/" + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "OrVb5ZMvvrQD" + }, + "source": [ + "! wget https://s3.amazonaws.com/auxdata.johnsnowlabs.com/public/resources/en/classifier-dl/IMDB/IMDB-Dataset.csv\n" + ], + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 424 + }, + "id": "y4xSRWIhwT28", + "outputId": "dd2c7a9f-1f4c-4c30-98ee-9cf666d4d44b" + }, + "source": [ + "import pandas as pd\n", + "from johnsnowlabs import nlp\n", + "train_path = '/content/IMDB-Dataset.csv'\n", + "\n", + "train_df = pd.read_csv(train_path)\n", + "# the text data to use for classification should be in a column named 'text'\n", + "# the label column must have name 'y' name be of type str\n", + "columns=['text','y']\n", + "train_df = train_df[columns]\n", + "from sklearn.model_selection import train_test_split\n", + "\n", + "train_df, test_df = train_test_split(train_df, test_size=0.2)\n", + "train_df" + ], + "execution_count": 2, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + " text y\n", + "11147 I have not seen and heard the original version... negative\n", + "5176 Ghost Story has an interesting feminist reveng... negative\n", + "23853 Christ. A sequel to one of the most cloying fi... negative\n", + "12990 Mendez and Marichal have provided us with a se... positive\n", + "28039 \"Bend It Like Beckham\" is a film that got very... positive\n", + "... ... ...\n", + "30425 This movie is a lot better than the asylums ve... positive\n", + "6508 I concur with everyone above who said anything... negative\n", + "2432 The \"Wrinkle in Time\" book series is my favori... negative\n", + "12347 Clint Eastwood scores big in this thriller fro... positive\n", + "3332 This is the one major problem with this film, ... negative\n", + "\n", + "[39999 rows x 2 columns]" + ], + "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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
texty
11147I have not seen and heard the original version...negative
5176Ghost Story has an interesting feminist reveng...negative
23853Christ. A sequel to one of the most cloying fi...negative
12990Mendez and Marichal have provided us with a se...positive
28039\"Bend It Like Beckham\" is a film that got very...positive
.........
30425This movie is a lot better than the asylums ve...positive
6508I concur with everyone above who said anything...negative
2432The \"Wrinkle in Time\" book series is my favori...negative
12347Clint Eastwood scores big in this thriller fro...positive
3332This is the one major problem with this film, ...negative
\n", + "

39999 rows × 2 columns

\n", + "
\n", + "
\n", + "\n", + "
\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "
\n", + "\n", + "\n", + "
\n", + " \n", + "\n", + "\n", + "\n", + " \n", + "
\n", + "
\n", + "
\n" + ] + }, + "metadata": {}, + "execution_count": 2 + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "0296Om2C5anY" + }, + "source": [ + "# 3. Train Deep Learning Classifier using nlu.load('train.sentiment')\n", + "\n", + "You dataset label column should be named 'y' and the feature column with text data should be named 'text'" + ] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 1000 + }, + "id": "3ZIPkRkWftBG", + "outputId": "a1d1177f-d728-4338-cb76-aff8f37c6a65" + }, + "source": [ + "from johnsnowlabs import nlp\n", + "from sklearn.metrics import classification_report\n", + "\n", + "# load a trainable pipeline by specifying the train. prefix and fit it on a datset with label and text columns\n", + "# by default the Universal Sentence Encoder (USE) Sentence embeddings are used for generation\n", + "trainable_pipe = nlp.load('train.sentiment')\n", + "fitted_pipe = trainable_pipe.fit(train_df.iloc[:50])\n", + "\n", + "# predict with the trainable pipeline on dataset and get predictions\n", + "preds = fitted_pipe.predict(train_df.iloc[:50],output_level='document')\n", + "#sentence detector that is part of the pipe generates sone NaNs. lets drop them first\n", + "preds.dropna(inplace=True)\n", + "print(classification_report(preds['y'], preds['sentiment']))\n", + "\n", + "preds" + ], + "execution_count": null, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Warning::Spark Session already created, some configs may not take.\n", + "Warning::Spark Session already created, some configs may not take.\n", + "sent_small_bert_L2_128 download started this may take some time.\n", + "Approximate size to download 16.1 MB\n", + "[OK!]\n", + " precision recall f1-score support\n", + "\n", + " negative 0.00 0.00 0.00 23\n", + " positive 0.54 1.00 0.70 27\n", + "\n", + " accuracy 0.54 50\n", + " macro avg 0.27 0.50 0.35 50\n", + "weighted avg 0.29 0.54 0.38 50\n", + "\n" + ] + }, + { + "output_type": "execute_result", + "data": { + "text/plain": [ + " document \\\n", + "0 This film has to be viewed in the right frame ... \n", + "1 This is just a long advertisement for the movi... \n", + "2 This movie was physically painful to sit throu... \n", + "3 This movie was one of a handful that actually ... \n", + "4 I was pleasantly pleased with the ending. I ju... \n", + "5 I would purchase this and \"Thirty Seconds Over... \n", + "6 In any number of films, you can find Nicholas ... \n", + "7 This film is quite boring. There are snippets ... \n", + "8 Let's start this review out on a positive note... \n", + "9 Payback is the game being played in this drama... \n", + "10 Anthony Quinn is a master at capturing our hea... \n", + "11 Someone, some day, should do a study of archit... \n", + "12 Thats My Bush is first of all a very entertain... \n", + "13 The Last American Virgin (1982) was one of the... \n", + "14 I experienced Nightbreed for the first time on... \n", + "15 When I checked out the review for this film af... \n", + "16 This movie is a very realistic view of a polic... \n", + "17 The fact that after 50 years, it is still a hi... \n", + "18 One of the great mysteries of life, suffered f... \n", + "19 This movie is the Latino Godfather. An unlikel... \n", + "20 This is one fine movie, I can watch it any tim... \n", + "21 I love Meatballs! Terrific characters and poig... \n", + "22 Clocking in at an interminable three hours and... \n", + "23 Sudden Impact is the 4th of the Dirty Harry fi... \n", + "24 In a genre by itself, this film has a limited ... \n", + "25 The One and only was a great film. I had just ... \n", + "26 If you are 10 years old and never seen a movie... \n", + "27 Even if it were remotely funny, this mouldy wa... \n", + "28 This is one of the best bond games i have ever... \n", + "29 The performances rate better than the rating I... \n", + "30 Chinese Ghost Story III is a totally superfluo... \n", + "31 Fred Williamson, one of the two or three top b... \n", + "32 Vince Lombardi High School has a new principal... \n", + "33 It's hard to comment on this movie. It's one o... \n", + "34 I commend pictures that try something differen... \n", + "35 It's not just that this is a bad movie; it's n... \n", + "36 In order to enjoy 'Fur - An imaginary portrait... \n", + "37 I became a fan of the TV series `Homicide: Lif... \n", + "38 A terminally dull mystery-thriller, which may ... \n", + "39 this movie, while it could be considered an al... \n", + "40 This is the \"Battlefield Earth\" of mini series... \n", + "41 DVD has become the equivalent of the old late ... \n", + "42 I saw this movie when I was very young living ... \n", + "43 This may not be a memorable classic, but it is... \n", + "44 This is a great film for pure entertainment, n... \n", + "45 When I saw this on TV I was nervous...whats if... \n", + "46 This film without doubt is one of the worst I ... \n", + "47 \"Challenge to be Free\" was one of the first fi... \n", + "48 I bought this movie a few days ago, and though... \n", + "49 This movie is not as good as all think. the ac... \n", + "\n", + " sentence_embedding_small_bert_L2_128 sentiment \\\n", + "0 [-0.1513771265745163, 0.3099152743816376, -0.2... positive \n", + "1 [-0.3328755795955658, 0.2796784043312073, 0.10... positive \n", + "2 [-0.6589022278785706, 0.09297071397304535, 0.0... positive \n", + "3 [-0.5372501015663147, 0.5361205339431763, -0.0... positive \n", + "4 [-0.3981836140155792, 0.3446210026741028, -0.0... positive \n", + "5 [-0.4655883014202118, 0.7156240940093994, -0.1... positive \n", + "6 [-0.366023987531662, 0.2559768557548523, -0.03... positive \n", + "7 [-0.4195595383644104, 0.37842151522636414, -0.... positive \n", + "8 [-0.5557488203048706, -0.04156230762600899, 0.... positive \n", + "9 [-0.48163551092147827, 0.21267670392990112, -0... positive \n", + "10 [-0.710480809211731, 0.029913106933236122, -0.... positive \n", + "11 [-0.6811888813972473, -0.06688129156827927, -0... positive \n", + "12 [-0.5853302478790283, 0.4730848968029022, 0.01... positive \n", + "13 [-0.4013202488422394, 0.19056788086891174, -0.... positive \n", + "14 [-0.22270944714546204, 0.22281427681446075, 0.... positive \n", + "15 [-0.39890941977500916, 0.403655081987381, -0.0... positive \n", + "16 [-0.5352460145950317, 0.13765230774879456, -0.... positive \n", + "17 [-0.2797639071941376, -0.11143724620342255, -0... positive \n", + "18 [-0.5399389863014221, 0.385494589805603, -0.17... positive \n", + "19 [-0.37433841824531555, 0.10099871456623077, 0.... positive \n", + "20 [-1.3702389001846313, 0.30410271883010864, -0.... positive \n", + "21 [-0.9990127086639404, 0.07002592086791992, -0.... positive \n", + "22 [-0.27705344557762146, -0.5027639865875244, 0.... positive \n", + "23 [-0.5442849397659302, 0.2992677688598633, -0.2... positive \n", + "24 [-0.14087404310703278, 0.12531475722789764, -0... positive \n", + "25 [-0.68660968542099, 0.14108557999134064, 0.091... positive \n", + "26 [-0.6596466302871704, 0.1337697058916092, -0.1... positive \n", + "27 [-0.6116098761558533, 0.49599868059158325, 0.0... positive \n", + "28 [-0.03306262567639351, -0.01435087714344263, -... positive \n", + "29 [-0.9807755947113037, 0.5014723539352417, -0.4... positive \n", + "30 [0.17701220512390137, -0.3180699050426483, -0.... positive \n", + "31 [-0.3707915246486664, 0.044643059372901917, -0... positive \n", + "32 [-0.49639755487442017, 0.48042890429496765, -0... positive \n", + "33 [-0.3472699224948883, 0.6240038275718689, -0.2... positive \n", + "34 [-0.3393455743789673, 0.5790384411811829, -0.1... positive \n", + "35 [-0.3814673125743866, -0.26899996399879456, -0... positive \n", + "36 [-0.03743020445108414, 0.3995753526687622, -0.... positive \n", + "37 [-0.4682881832122803, -0.018485404551029205, -... positive \n", + "38 [-0.18775352835655212, 0.06152409315109253, -0... positive \n", + "39 [-0.507961094379425, 0.4713260531425476, -0.16... positive \n", + "40 [-0.4353094696998596, 0.027452869340777397, -0... positive \n", + "41 [-0.1517794281244278, 0.2896312475204468, -0.2... positive \n", + "42 [-0.14374561607837677, 0.10458363592624664, -0... positive \n", + "43 [-0.6834889650344849, 0.5808060169219971, -0.2... positive \n", + "44 [-0.5870745778083801, 0.007088684476912022, 0.... positive \n", + "45 [-0.8343449234962463, 0.2768908441066742, -0.5... positive \n", + "46 [-0.48633041977882385, 0.6339375972747803, -0.... positive \n", + "47 [-0.30197039246559143, 0.4937012493610382, -0.... positive \n", + "48 [-0.6582587361335754, 0.1842564195394516, -0.2... positive \n", + "49 [-0.33901163935661316, 0.04764261469244957, 0.... positive \n", + "\n", + " sentiment_confidence text \\\n", + "0 0.0 This film has to be viewed in the right frame ... \n", + "1 0.0 This is just a long advertisement for the movi... \n", + "2 0.0 This movie was physically painful to sit throu... \n", + "3 0.0 This movie was one of a handful that actually ... \n", + "4 0.0 I was pleasantly pleased with the ending. I ju... \n", + "5 0.0 I would purchase this and \"Thirty Seconds Over... \n", + "6 0.0 In any number of films, you can find Nicholas ... \n", + "7 0.0 This film is quite boring. There are snippets ... \n", + "8 0.0 Let's start this review out on a positive note... \n", + "9 0.0 Payback is the game being played in this drama... \n", + "10 0.0 Anthony Quinn is a master at capturing our hea... \n", + "11 0.0 Someone, some day, should do a study of archit... \n", + "12 0.0 Thats My Bush is first of all a very entertain... \n", + "13 0.0 The Last American Virgin (1982) was one of the... \n", + "14 0.0 I experienced Nightbreed for the first time on... \n", + "15 0.0 When I checked out the review for this film af... \n", + "16 0.0 This movie is a very realistic view of a polic... \n", + "17 0.0 The fact that after 50 years, it is still a hi... \n", + "18 0.0 One of the great mysteries of life, suffered f... \n", + "19 0.0 This movie is the Latino Godfather. An unlikel... \n", + "20 0.0 This is one fine movie, I can watch it any tim... \n", + "21 0.0 I love Meatballs! Terrific characters and poig... \n", + "22 0.0 Clocking in at an interminable three hours and... \n", + "23 0.0 Sudden Impact is the 4th of the Dirty Harry fi... \n", + "24 0.0 In a genre by itself, this film has a limited ... \n", + "25 0.0 The One and only was a great film. I had just ... \n", + "26 0.0 If you are 10 years old and never seen a movie... \n", + "27 0.0 Even if it were remotely funny, this mouldy wa... \n", + "28 0.0 This is one of the best bond games i have ever... \n", + "29 0.0 The performances rate better than the rating I... \n", + "30 0.0 Chinese Ghost Story III is a totally superfluo... \n", + "31 0.0 Fred Williamson, one of the two or three top b... \n", + "32 0.0 Vince Lombardi High School has a new principal... \n", + "33 0.0 It's hard to comment on this movie. It's one o... \n", + "34 0.0 I commend pictures that try something differen... \n", + "35 0.0 It's not just that this is a bad movie; it's n... \n", + "36 0.0 In order to enjoy 'Fur - An imaginary portrait... \n", + "37 0.0 I became a fan of the TV series `Homicide: Lif... \n", + "38 0.0 A terminally dull mystery-thriller, which may ... \n", + "39 0.0 this movie, while it could be considered an al... \n", + "40 0.0 This is the \"Battlefield Earth\" of mini series... \n", + "41 0.0 DVD has become the equivalent of the old late ... \n", + "42 0.0 I saw this movie when I was very young living ... \n", + "43 0.0 This may not be a memorable classic, but it is... \n", + "44 0.0 This is a great film for pure entertainment, n... \n", + "45 0.0 When I saw this on TV I was nervous...whats if... \n", + "46 0.0 This film without doubt is one of the worst I ... \n", + "47 0.0 \"Challenge to be Free\" was one of the first fi... \n", + "48 0.0 I bought this movie a few days ago, and though... \n", + "49 0.0 This movie is not as good as all think. the ac... \n", + "\n", + " y \n", + "0 positive \n", + "1 negative \n", + "2 negative \n", + "3 negative \n", + "4 negative \n", + "5 positive \n", + "6 positive \n", + "7 negative \n", + "8 positive \n", + "9 negative \n", + "10 positive \n", + "11 negative \n", + "12 positive \n", + "13 positive \n", + "14 positive \n", + "15 negative \n", + "16 positive \n", + "17 positive \n", + "18 positive \n", + "19 positive \n", + "20 positive \n", + "21 positive \n", + "22 negative \n", + "23 positive \n", + "24 positive \n", + "25 positive \n", + "26 negative \n", + "27 negative \n", + "28 positive \n", + "29 negative \n", + "30 negative \n", + "31 negative \n", + "32 positive \n", + "33 negative \n", + "34 positive \n", + "35 negative \n", + "36 negative \n", + "37 positive \n", + "38 negative \n", + "39 negative \n", + "40 negative \n", + "41 negative \n", + "42 positive \n", + "43 positive \n", + "44 positive \n", + "45 positive \n", + "46 negative \n", + "47 positive \n", + "48 positive \n", + "49 negative " + ], + "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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + "
documentsentence_embedding_small_bert_L2_128sentimentsentiment_confidencetexty
0This film has to be viewed in the right frame ...[-0.1513771265745163, 0.3099152743816376, -0.2...positive0.0This film has to be viewed in the right frame ...positive
1This is just a long advertisement for the movi...[-0.3328755795955658, 0.2796784043312073, 0.10...positive0.0This is just a long advertisement for the movi...negative
2This movie was physically painful to sit throu...[-0.6589022278785706, 0.09297071397304535, 0.0...positive0.0This movie was physically painful to sit throu...negative
3This movie was one of a handful that actually ...[-0.5372501015663147, 0.5361205339431763, -0.0...positive0.0This movie was one of a handful that actually ...negative
4I was pleasantly pleased with the ending. I ju...[-0.3981836140155792, 0.3446210026741028, -0.0...positive0.0I was pleasantly pleased with the ending. I ju...negative
5I would purchase this and \"Thirty Seconds Over...[-0.4655883014202118, 0.7156240940093994, -0.1...positive0.0I would purchase this and \"Thirty Seconds Over...positive
6In any number of films, you can find Nicholas ...[-0.366023987531662, 0.2559768557548523, -0.03...positive0.0In any number of films, you can find Nicholas ...positive
7This film is quite boring. There are snippets ...[-0.4195595383644104, 0.37842151522636414, -0....positive0.0This film is quite boring. There are snippets ...negative
8Let's start this review out on a positive note...[-0.5557488203048706, -0.04156230762600899, 0....positive0.0Let's start this review out on a positive note...positive
9Payback is the game being played in this drama...[-0.48163551092147827, 0.21267670392990112, -0...positive0.0Payback is the game being played in this drama...negative
10Anthony Quinn is a master at capturing our hea...[-0.710480809211731, 0.029913106933236122, -0....positive0.0Anthony Quinn is a master at capturing our hea...positive
11Someone, some day, should do a study of archit...[-0.6811888813972473, -0.06688129156827927, -0...positive0.0Someone, some day, should do a study of archit...negative
12Thats My Bush is first of all a very entertain...[-0.5853302478790283, 0.4730848968029022, 0.01...positive0.0Thats My Bush is first of all a very entertain...positive
13The Last American Virgin (1982) was one of the...[-0.4013202488422394, 0.19056788086891174, -0....positive0.0The Last American Virgin (1982) was one of the...positive
14I experienced Nightbreed for the first time on...[-0.22270944714546204, 0.22281427681446075, 0....positive0.0I experienced Nightbreed for the first time on...positive
15When I checked out the review for this film af...[-0.39890941977500916, 0.403655081987381, -0.0...positive0.0When I checked out the review for this film af...negative
16This movie is a very realistic view of a polic...[-0.5352460145950317, 0.13765230774879456, -0....positive0.0This movie is a very realistic view of a polic...positive
17The fact that after 50 years, it is still a hi...[-0.2797639071941376, -0.11143724620342255, -0...positive0.0The fact that after 50 years, it is still a hi...positive
18One of the great mysteries of life, suffered f...[-0.5399389863014221, 0.385494589805603, -0.17...positive0.0One of the great mysteries of life, suffered f...positive
19This movie is the Latino Godfather. An unlikel...[-0.37433841824531555, 0.10099871456623077, 0....positive0.0This movie is the Latino Godfather. An unlikel...positive
20This is one fine movie, I can watch it any tim...[-1.3702389001846313, 0.30410271883010864, -0....positive0.0This is one fine movie, I can watch it any tim...positive
21I love Meatballs! Terrific characters and poig...[-0.9990127086639404, 0.07002592086791992, -0....positive0.0I love Meatballs! Terrific characters and poig...positive
22Clocking in at an interminable three hours and...[-0.27705344557762146, -0.5027639865875244, 0....positive0.0Clocking in at an interminable three hours and...negative
23Sudden Impact is the 4th of the Dirty Harry fi...[-0.5442849397659302, 0.2992677688598633, -0.2...positive0.0Sudden Impact is the 4th of the Dirty Harry fi...positive
24In a genre by itself, this film has a limited ...[-0.14087404310703278, 0.12531475722789764, -0...positive0.0In a genre by itself, this film has a limited ...positive
25The One and only was a great film. I had just ...[-0.68660968542099, 0.14108557999134064, 0.091...positive0.0The One and only was a great film. I had just ...positive
26If you are 10 years old and never seen a movie...[-0.6596466302871704, 0.1337697058916092, -0.1...positive0.0If you are 10 years old and never seen a movie...negative
27Even if it were remotely funny, this mouldy wa...[-0.6116098761558533, 0.49599868059158325, 0.0...positive0.0Even if it were remotely funny, this mouldy wa...negative
28This is one of the best bond games i have ever...[-0.03306262567639351, -0.01435087714344263, -...positive0.0This is one of the best bond games i have ever...positive
29The performances rate better than the rating I...[-0.9807755947113037, 0.5014723539352417, -0.4...positive0.0The performances rate better than the rating I...negative
30Chinese Ghost Story III is a totally superfluo...[0.17701220512390137, -0.3180699050426483, -0....positive0.0Chinese Ghost Story III is a totally superfluo...negative
31Fred Williamson, one of the two or three top b...[-0.3707915246486664, 0.044643059372901917, -0...positive0.0Fred Williamson, one of the two or three top b...negative
32Vince Lombardi High School has a new principal...[-0.49639755487442017, 0.48042890429496765, -0...positive0.0Vince Lombardi High School has a new principal...positive
33It's hard to comment on this movie. It's one o...[-0.3472699224948883, 0.6240038275718689, -0.2...positive0.0It's hard to comment on this movie. It's one o...negative
34I commend pictures that try something differen...[-0.3393455743789673, 0.5790384411811829, -0.1...positive0.0I commend pictures that try something differen...positive
35It's not just that this is a bad movie; it's n...[-0.3814673125743866, -0.26899996399879456, -0...positive0.0It's not just that this is a bad movie; it's n...negative
36In order to enjoy 'Fur - An imaginary portrait...[-0.03743020445108414, 0.3995753526687622, -0....positive0.0In order to enjoy 'Fur - An imaginary portrait...negative
37I became a fan of the TV series `Homicide: Lif...[-0.4682881832122803, -0.018485404551029205, -...positive0.0I became a fan of the TV series `Homicide: Lif...positive
38A terminally dull mystery-thriller, which may ...[-0.18775352835655212, 0.06152409315109253, -0...positive0.0A terminally dull mystery-thriller, which may ...negative
39this movie, while it could be considered an al...[-0.507961094379425, 0.4713260531425476, -0.16...positive0.0this movie, while it could be considered an al...negative
40This is the \"Battlefield Earth\" of mini series...[-0.4353094696998596, 0.027452869340777397, -0...positive0.0This is the \"Battlefield Earth\" of mini series...negative
41DVD has become the equivalent of the old late ...[-0.1517794281244278, 0.2896312475204468, -0.2...positive0.0DVD has become the equivalent of the old late ...negative
42I saw this movie when I was very young living ...[-0.14374561607837677, 0.10458363592624664, -0...positive0.0I saw this movie when I was very young living ...positive
43This may not be a memorable classic, but it is...[-0.6834889650344849, 0.5808060169219971, -0.2...positive0.0This may not be a memorable classic, but it is...positive
44This is a great film for pure entertainment, n...[-0.5870745778083801, 0.007088684476912022, 0....positive0.0This is a great film for pure entertainment, n...positive
45When I saw this on TV I was nervous...whats if...[-0.8343449234962463, 0.2768908441066742, -0.5...positive0.0When I saw this on TV I was nervous...whats if...positive
46This film without doubt is one of the worst I ...[-0.48633041977882385, 0.6339375972747803, -0....positive0.0This film without doubt is one of the worst I ...negative
47\"Challenge to be Free\" was one of the first fi...[-0.30197039246559143, 0.4937012493610382, -0....positive0.0\"Challenge to be Free\" was one of the first fi...positive
48I bought this movie a few days ago, and though...[-0.6582587361335754, 0.1842564195394516, -0.2...positive0.0I bought this movie a few days ago, and though...positive
49This movie is not as good as all think. the ac...[-0.33901163935661316, 0.04764261469244957, 0....positive0.0This movie is not as good as all think. the ac...negative
\n", + "
\n", + "
\n", + "\n", + "
\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "
\n", + "\n", + "\n", + "
\n", + " \n", + "\n", + "\n", + "\n", + " \n", + "
\n", + "
\n", + "
\n" + ] + }, + "metadata": {}, + "execution_count": 10 + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "lVyOE2wV0fw_" + }, + "source": [ + "# 4. Test the fitted pipe on new example" + ] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 150 + }, + "id": "qdCUg2MR0PD2", + "outputId": "b04708fa-2610-4b7d-fe94-3caf9811a6f7" + }, + "source": [ + "fitted_pipe.predict('It was one of the best films i have ever watched in my entire life !')" + ], + "execution_count": null, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "sentence_detector_dl download started this may take some time.\n", + "Approximate size to download 354.6 KB\n", + "[OK!]\n", + "Warning::Spark Session already created, some configs may not take.\n" + ] + }, + { + "output_type": "execute_result", + "data": { + "text/plain": [ + " sentence \\\n", + "0 It was one of the best films i have ever watch... \n", + "\n", + " sentence_embedding_small_bert_L2_128 sentiment \\\n", + "0 [-0.6158236265182495, -0.5645654201507568, -0.... positive \n", + "\n", + " sentiment_confidence \n", + "0 0.997638 " + ], + "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", + "
sentencesentence_embedding_small_bert_L2_128sentimentsentiment_confidence
0It was one of the best films i have ever watch...[-0.6158236265182495, -0.5645654201507568, -0....positive0.997638
\n", + "
\n", + "
\n", + "\n", + "
\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "
\n", + "\n", + "
\n", + "
\n" + ] + }, + "metadata": {}, + "execution_count": 11 + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "xflpwrVjjBVD" + }, + "source": [ + "## 5. Configure pipe training parameters" + ] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "UtsAUGTmOTms", + "outputId": "3a0f86bb-f26c-4500-fa1b-1bde63e945df" + }, + "source": [ + "trainable_pipe.print_info()" + ], + "execution_count": null, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "The following parameters are configurable for this NLU pipeline (You can copy paste the examples) :\n", + ">>> component_list['bert_sentence_embeddings@sent_small_bert_L2_128'] has settable params:\n", + "component_list['bert_sentence_embeddings@sent_small_bert_L2_128'].setBatchSize(8) | Info: Size of every batch | Currently set to : 8\n", + "component_list['bert_sentence_embeddings@sent_small_bert_L2_128'].setEngine('tensorflow') | Info: Deep Learning engine used for this model | Currently set to : tensorflow\n", + "component_list['bert_sentence_embeddings@sent_small_bert_L2_128'].setIsLong(False) | Info: Use Long type instead of Int type for inputs buffer - Some Bert models require Long instead of Int. | Currently set to : False\n", + "component_list['bert_sentence_embeddings@sent_small_bert_L2_128'].setMaxSentenceLength(128) | Info: Max sentence length to process | Currently set to : 128\n", + "component_list['bert_sentence_embeddings@sent_small_bert_L2_128'].setDimension(128) | Info: Number of embedding dimensions | Currently set to : 128\n", + "component_list['bert_sentence_embeddings@sent_small_bert_L2_128'].setCaseSensitive(False) | Info: whether to ignore case in tokens for embeddings matching | Currently set to : False\n", + "component_list['bert_sentence_embeddings@sent_small_bert_L2_128'].setStorageRef('sent_small_bert_L2_128') | Info: unique reference name for identification | Currently set to : sent_small_bert_L2_128\n", + ">>> component_list['document_assembler'] has settable params:\n", + "component_list['document_assembler'].setCleanupMode('shrink') | Info: possible values: disabled, inplace, inplace_full, shrink, shrink_full, each, each_full, delete_full | Currently set to : shrink\n", + ">>> component_list['sentiment_dl@sent_small_bert_L2_128'] has settable params:\n", + "component_list['sentiment_dl@sent_small_bert_L2_128'].setEngine('tensorflow') | Info: Deep Learning engine used for this model | Currently set to : tensorflow\n", + "component_list['sentiment_dl@sent_small_bert_L2_128'].setThreshold(0.6) | Info: The minimum threshold for the final result otheriwse it will be neutral | Currently set to : 0.6\n", + "component_list['sentiment_dl@sent_small_bert_L2_128'].setThresholdLabel('neutral') | Info: In case the score is less than threshold, what should be the label. Default is neutral. | Currently set to : neutral\n", + "component_list['sentiment_dl@sent_small_bert_L2_128'].setStorageRef('sent_small_bert_L2_128') | Info: unique reference name for identification | Currently set to : sent_small_bert_L2_128\n" + ] + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "2GJdDNV9jEIe" + }, + "source": [ + "## 6. Retrain with new parameters" + ] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 1000 + }, + "id": "mptfvHx-MMMX", + "outputId": "b48d685f-0ad3-4b22-b79f-a0897eaaf8e2" + }, + "source": [ + "# Train longer!\n", + "trainable_pipe = nlp.load('train.sentiment')\n", + "trainable_pipe['trainable_sentiment_dl'].setMaxEpochs(5)\n", + "fitted_pipe = trainable_pipe.fit(train_df.iloc[:50])\n", + "# predict with the trainable pipeline on dataset and get predictions\n", + "preds = fitted_pipe.predict(train_df.iloc[:50],output_level='document')\n", + "\n", + "#sentence detector that is part of the pipe generates sone NaNs. lets drop them first\n", + "preds.dropna(inplace=True)\n", + "print(classification_report(preds['y'], preds['sentiment']))\n", + "\n", + "preds" + ], + "execution_count": null, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Warning::Spark Session already created, some configs may not take.\n", + "Warning::Spark Session already created, some configs may not take.\n", + "sent_small_bert_L2_128 download started this may take some time.\n", + "Approximate size to download 16.1 MB\n", + "[OK!]\n", + " precision recall f1-score support\n", + "\n", + " negative 0.56 1.00 0.72 28\n", + " positive 0.00 0.00 0.00 22\n", + "\n", + " accuracy 0.56 50\n", + " macro avg 0.28 0.50 0.36 50\n", + "weighted avg 0.31 0.56 0.40 50\n", + "\n" + ] + }, + { + "output_type": "execute_result", + "data": { + "text/plain": [ + " document \\\n", + "0 Set in 1945, Skenbart follows a failed Swedish... \n", + "1 I can't believe I watched this whole movie. An... \n", + "2 I'm beginning to see a pattern in the movies I... \n", + "3 Dan, the widowed father of three girls, has hi... \n", + "4 David Webb Peoples meets Paul Anderson...if it... \n", + "5 I love MIDNIGHT COWBOY and have it in my video... \n", + "6 I have NEVER EVER seen such a bad movie before... \n", + "7 I absolutely could not believe the levels of i... \n", + "8 A brash, self-centered Army cadet arrives at W... \n", + "9 The film is a remake of a 1956 BBC serial call... \n", + "10 Though Frank Loesser's songs are some of the f... \n", + "11 Rented(free rental thank goodness) this as sup... \n", + "12 This is one of those movies that make better t... \n", + "13 What can be said of this independent effort be... \n", + "14 Wow. I thought this might be insipid but it wa... \n", + "15 There is part of one sequence where some water... \n", + "16 i got a copy from the writer of this movie on ... \n", + "17 ... or was Honest Iago actually smirking at th... \n", + "18 First of all, I'd like to say that I love the ... \n", + "19 What an embarassment...This doesnt do justice ... \n", + "20 One of the worst movies ever made. Let's start... \n", + "21 This movie is humorous, charming, and easily b... \n", + "22 The movie starts something like a less hyper-k... \n", + "23 I won't say this movie was bad, but it wasn't ... \n", + "24 Wow! In my opinion, THE NET is an excellent, n... \n", + "25 Falsely accused, skirt-chasing chums John Wayn... \n", + "26 The Education of Little Tree is just not as go... \n", + "27 Interesting film about an actual event that to... \n", + "28 I have been a Mario fan for as long as I can r... \n", + "29 This woman never stops talking throughout the ... \n", + "30

I still can't belive Louis Gossett... \n", + "31 Florence Chadwick was actually the far more ac... \n", + "32 This may be one of the best movies I have ever... \n", + "33 Othello is set to burn the eyes of the viewers... \n", + "34 The statistics in this movie were well researc... \n", + "35 Following their daughter's brutal murder,Julie... \n", + "36 Compelling and Innovative! At the beginning of... \n", + "37 I saw this movie when it aired on Lifetime bac... \n", + "38 I really wanted to like this movie. I absolute... \n", + "39 This comment discusses \"North and South Book I... \n", + "40 Rarely have I seen an action/suspense movie th... \n", + "41 This is a 100% improvement over the dross of a... \n", + "42 I liked it better than House Party 2 & 3. The ... \n", + "43 A friend and I went to see this movie. We have... \n", + "44 Whattt was with the sound? It sounded like it ... \n", + "45 My college theater just had a special screenin... \n", + "46 Kingdom County, Vermont, 1927. Noel Lord (Rip ... \n", + "47 Man, I really enjoyed this, if only for Fred W... \n", + "48 You've seen the same tired, worn out clichéd s... \n", + "49 This movie is really genuine and random. It's ... \n", + "\n", + " sentence_embedding_small_bert_L2_128 sentiment \\\n", + "0 [-0.37176743149757385, 0.28505513072013855, -0... negative \n", + "1 [-0.6678956151008606, 0.4565986394882202, -0.3... negative \n", + "2 [-0.4640607237815857, 0.13232995569705963, -0.... negative \n", + "3 [-1.204692006111145, 0.2007242888212204, -0.27... negative \n", + "4 [-0.23281101882457733, 0.1650732308626175, 0.1... negative \n", + "5 [-0.731963574886322, 0.055591657757759094, -0.... negative \n", + "6 [-0.8489042520523071, -0.11029214411973953, -0... negative \n", + "7 [-0.7605423331260681, 0.3872695565223694, -0.2... negative \n", + "8 [-0.6972024440765381, 0.3831547200679779, -0.2... negative \n", + "9 [-0.19118931889533997, 0.3001491129398346, 0.0... negative \n", + "10 [-0.5250385999679565, 0.13566239178180695, -0.... negative \n", + "11 [-0.83491051197052, 0.5083938837051392, -0.224... negative \n", + "12 [-0.2737158536911011, 0.3766928017139435, -0.2... negative \n", + "13 [-0.18508094549179077, 0.3635772466659546, -0.... negative \n", + "14 [-0.4717271327972412, 0.4512611925601959, -0.3... negative \n", + "15 [-0.3119819164276123, 0.24397613108158112, -0.... negative \n", + "16 [-0.4513140022754669, 0.25351178646087646, -0.... negative \n", + "17 [-0.448510080575943, 0.3488628566265106, 0.424... negative \n", + "18 [-0.7053700685501099, -0.1855289489030838, 0.1... negative \n", + "19 [-0.9799928069114685, 0.37281569838523865, -0.... negative \n", + "20 [-0.63435959815979, -0.03198552504181862, -0.3... negative \n", + "21 [-0.5476221442222595, 0.45070168375968933, 0.0... negative \n", + "22 [-0.550375759601593, -0.21221719682216644, -0.... negative \n", + "23 [-0.5449793934822083, 0.3829023241996765, -0.2... negative \n", + "24 [-0.9690271615982056, 0.5579360127449036, -0.3... negative \n", + "25 [-0.7523209452629089, 0.8658801913261414, 0.18... negative \n", + "26 [-0.775317370891571, 0.23664450645446777, -0.0... negative \n", + "27 [-0.7987304329872131, 0.3676035404205322, 0.11... negative \n", + "28 [-0.25044935941696167, -0.36489105224609375, -... negative \n", + "29 [-0.7558593153953552, 0.573503315448761, -0.11... negative \n", + "30 [-0.5051725506782532, 0.4716736972332001, 0.07... negative \n", + "31 [-0.8047178387641907, 0.6103856563568115, -0.2... negative \n", + "32 [-0.9392787218093872, -0.002228498924523592, -... negative \n", + "33 [-0.5233349800109863, -0.0218301210552454, 0.0... negative \n", + "34 [-0.4964343309402466, -0.1613437831401825, 0.0... negative \n", + "35 [-0.45342516899108887, 0.025125373154878616, -... negative \n", + "36 [-0.39057832956314087, 0.07514691352844238, 0.... negative \n", + "37 [-0.4824381172657013, -0.024186618626117706, -... negative \n", + "38 [-0.5213059782981873, 0.08636035025119781, 0.0... negative \n", + "39 [-1.0346614122390747, 0.5499882698059082, -0.0... negative \n", + "40 [0.08839510381221771, -0.08421049267053604, -0... negative \n", + "41 [-0.4159573018550873, 0.1026173010468483, -0.1... negative \n", + "42 [-0.37537163496017456, 0.2604108452796936, 0.0... negative \n", + "43 [-0.30783846974372864, 0.0511380173265934, -0.... negative \n", + "44 [-0.591052234172821, 0.5442489385604858, 0.109... negative \n", + "45 [-0.47453969717025757, 0.33813729882240295, -0... negative \n", + "46 [-0.7206570506095886, 0.63383948802948, -0.231... negative \n", + "47 [-0.9212082624435425, 0.2386074960231781, 0.20... negative \n", + "48 [-0.6829520463943481, 0.18268251419067383, 0.1... negative \n", + "49 [-0.2603294849395752, -0.09567182511091232, -0... negative \n", + "\n", + " sentiment_confidence text \\\n", + "0 3.0 Set in 1945, Skenbart follows a failed Swedish... \n", + "1 2.0 I can't believe I watched this whole movie. An... \n", + "2 3.0 I'm beginning to see a pattern in the movies I... \n", + "3 1.0 Dan, the widowed father of three girls, has hi... \n", + "4 2.0 David Webb Peoples meets Paul Anderson...if it... \n", + "5 3.0 I love MIDNIGHT COWBOY and have it in my video... \n", + "6 2.0 I have NEVER EVER seen such a bad movie before... \n", + "7 2.0 I absolutely could not believe the levels of i... \n", + "8 3.0 A brash, self-centered Army cadet arrives at W... \n", + "9 4.0 The film is a remake of a 1956 BBC serial call... \n", + "10 5.0 Though Frank Loesser's songs are some of the f... \n", + "11 3.0 Rented(free rental thank goodness) this as sup... \n", + "12 3.0 This is one of those movies that make better t... \n", + "13 2.0 What can be said of this independent effort be... \n", + "14 1.0 Wow. I thought this might be insipid but it wa... \n", + "15 1.0 There is part of one sequence where some water... \n", + "16 1.0 i got a copy from the writer of this movie on ... \n", + "17 3.0 ... or was Honest Iago actually smirking at th... \n", + "18 3.0 First of all, I'd like to say that I love the ... \n", + "19 1.0 What an embarassment...This doesnt do justice ... \n", + "20 3.0 One of the worst movies ever made. Let's start... \n", + "21 5.0 This movie is humorous, charming, and easily b... \n", + "22 6.0 The movie starts something like a less hyper-k... \n", + "23 2.0 I won't say this movie was bad, but it wasn't ... \n", + "24 5.0 Wow! In my opinion, THE NET is an excellent, n... \n", + "25 6.0 Falsely accused, skirt-chasing chums John Wayn... \n", + "26 3.0 The Education of Little Tree is just not as go... \n", + "27 3.0 Interesting film about an actual event that to... \n", + "28 7.0 I have been a Mario fan for as long as I can r... \n", + "29 1.0 This woman never stops talking throughout the ... \n", + "30 9.0

I still can't belive Louis Gossett... \n", + "31 9.0 Florence Chadwick was actually the far more ac... \n", + "32 3.0 This may be one of the best movies I have ever... \n", + "33 2.0 Othello is set to burn the eyes of the viewers... \n", + "34 2.0 The statistics in this movie were well researc... \n", + "35 6.0 Following their daughter's brutal murder,Julie... \n", + "36 9.0 Compelling and Innovative! At the beginning of... \n", + "37 2.0 I saw this movie when it aired on Lifetime bac... \n", + "38 2.0 I really wanted to like this movie. I absolute... \n", + "39 9.0 This comment discusses \"North and South Book I... \n", + "40 3.0 Rarely have I seen an action/suspense movie th... \n", + "41 2.0 This is a 100% improvement over the dross of a... \n", + "42 3.0 I liked it better than House Party 2 & 3. The ... \n", + "43 4.0 A friend and I went to see this movie. We have... \n", + "44 1.0 Whattt was with the sound? It sounded like it ... \n", + "45 2.0 My college theater just had a special screenin... \n", + "46 1.0 Kingdom County, Vermont, 1927. Noel Lord (Rip ... \n", + "47 3.0 Man, I really enjoyed this, if only for Fred W... \n", + "48 4.0 You've seen the same tired, worn out clichéd s... \n", + "49 2.0 This movie is really genuine and random. It's ... \n", + "\n", + " y \n", + "0 negative \n", + "1 negative \n", + "2 negative \n", + "3 positive \n", + "4 positive \n", + "5 positive \n", + "6 negative \n", + "7 negative \n", + "8 positive \n", + "9 positive \n", + "10 negative \n", + "11 negative \n", + "12 positive \n", + "13 negative \n", + "14 negative \n", + "15 negative \n", + "16 negative \n", + "17 positive \n", + "18 negative \n", + "19 negative \n", + "20 negative \n", + "21 positive \n", + "22 positive \n", + "23 negative \n", + "24 positive \n", + "25 negative \n", + "26 negative \n", + "27 negative \n", + "28 positive \n", + "29 negative \n", + "30 negative \n", + "31 negative \n", + "32 positive \n", + "33 negative \n", + "34 negative \n", + "35 positive \n", + "36 positive \n", + "37 positive \n", + "38 negative \n", + "39 positive \n", + "40 negative \n", + "41 positive \n", + "42 positive \n", + "43 negative \n", + "44 negative \n", + "45 positive \n", + "46 positive \n", + "47 positive \n", + "48 negative \n", + "49 positive " + ], + "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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + "
documentsentence_embedding_small_bert_L2_128sentimentsentiment_confidencetexty
0Set in 1945, Skenbart follows a failed Swedish...[-0.37176743149757385, 0.28505513072013855, -0...negative3.0Set in 1945, Skenbart follows a failed Swedish...negative
1I can't believe I watched this whole movie. An...[-0.6678956151008606, 0.4565986394882202, -0.3...negative2.0I can't believe I watched this whole movie. An...negative
2I'm beginning to see a pattern in the movies I...[-0.4640607237815857, 0.13232995569705963, -0....negative3.0I'm beginning to see a pattern in the movies I...negative
3Dan, the widowed father of three girls, has hi...[-1.204692006111145, 0.2007242888212204, -0.27...negative1.0Dan, the widowed father of three girls, has hi...positive
4David Webb Peoples meets Paul Anderson...if it...[-0.23281101882457733, 0.1650732308626175, 0.1...negative2.0David Webb Peoples meets Paul Anderson...if it...positive
5I love MIDNIGHT COWBOY and have it in my video...[-0.731963574886322, 0.055591657757759094, -0....negative3.0I love MIDNIGHT COWBOY and have it in my video...positive
6I have NEVER EVER seen such a bad movie before...[-0.8489042520523071, -0.11029214411973953, -0...negative2.0I have NEVER EVER seen such a bad movie before...negative
7I absolutely could not believe the levels of i...[-0.7605423331260681, 0.3872695565223694, -0.2...negative2.0I absolutely could not believe the levels of i...negative
8A brash, self-centered Army cadet arrives at W...[-0.6972024440765381, 0.3831547200679779, -0.2...negative3.0A brash, self-centered Army cadet arrives at W...positive
9The film is a remake of a 1956 BBC serial call...[-0.19118931889533997, 0.3001491129398346, 0.0...negative4.0The film is a remake of a 1956 BBC serial call...positive
10Though Frank Loesser's songs are some of the f...[-0.5250385999679565, 0.13566239178180695, -0....negative5.0Though Frank Loesser's songs are some of the f...negative
11Rented(free rental thank goodness) this as sup...[-0.83491051197052, 0.5083938837051392, -0.224...negative3.0Rented(free rental thank goodness) this as sup...negative
12This is one of those movies that make better t...[-0.2737158536911011, 0.3766928017139435, -0.2...negative3.0This is one of those movies that make better t...positive
13What can be said of this independent effort be...[-0.18508094549179077, 0.3635772466659546, -0....negative2.0What can be said of this independent effort be...negative
14Wow. I thought this might be insipid but it wa...[-0.4717271327972412, 0.4512611925601959, -0.3...negative1.0Wow. I thought this might be insipid but it wa...negative
15There is part of one sequence where some water...[-0.3119819164276123, 0.24397613108158112, -0....negative1.0There is part of one sequence where some water...negative
16i got a copy from the writer of this movie on ...[-0.4513140022754669, 0.25351178646087646, -0....negative1.0i got a copy from the writer of this movie on ...negative
17... or was Honest Iago actually smirking at th...[-0.448510080575943, 0.3488628566265106, 0.424...negative3.0... or was Honest Iago actually smirking at th...positive
18First of all, I'd like to say that I love the ...[-0.7053700685501099, -0.1855289489030838, 0.1...negative3.0First of all, I'd like to say that I love the ...negative
19What an embarassment...This doesnt do justice ...[-0.9799928069114685, 0.37281569838523865, -0....negative1.0What an embarassment...This doesnt do justice ...negative
20One of the worst movies ever made. Let's start...[-0.63435959815979, -0.03198552504181862, -0.3...negative3.0One of the worst movies ever made. Let's start...negative
21This movie is humorous, charming, and easily b...[-0.5476221442222595, 0.45070168375968933, 0.0...negative5.0This movie is humorous, charming, and easily b...positive
22The movie starts something like a less hyper-k...[-0.550375759601593, -0.21221719682216644, -0....negative6.0The movie starts something like a less hyper-k...positive
23I won't say this movie was bad, but it wasn't ...[-0.5449793934822083, 0.3829023241996765, -0.2...negative2.0I won't say this movie was bad, but it wasn't ...negative
24Wow! In my opinion, THE NET is an excellent, n...[-0.9690271615982056, 0.5579360127449036, -0.3...negative5.0Wow! In my opinion, THE NET is an excellent, n...positive
25Falsely accused, skirt-chasing chums John Wayn...[-0.7523209452629089, 0.8658801913261414, 0.18...negative6.0Falsely accused, skirt-chasing chums John Wayn...negative
26The Education of Little Tree is just not as go...[-0.775317370891571, 0.23664450645446777, -0.0...negative3.0The Education of Little Tree is just not as go...negative
27Interesting film about an actual event that to...[-0.7987304329872131, 0.3676035404205322, 0.11...negative3.0Interesting film about an actual event that to...negative
28I have been a Mario fan for as long as I can r...[-0.25044935941696167, -0.36489105224609375, -...negative7.0I have been a Mario fan for as long as I can r...positive
29This woman never stops talking throughout the ...[-0.7558593153953552, 0.573503315448761, -0.11...negative1.0This woman never stops talking throughout the ...negative
30<br /><br />I still can't belive Louis Gossett...[-0.5051725506782532, 0.4716736972332001, 0.07...negative9.0<br /><br />I still can't belive Louis Gossett...negative
31Florence Chadwick was actually the far more ac...[-0.8047178387641907, 0.6103856563568115, -0.2...negative9.0Florence Chadwick was actually the far more ac...negative
32This may be one of the best movies I have ever...[-0.9392787218093872, -0.002228498924523592, -...negative3.0This may be one of the best movies I have ever...positive
33Othello is set to burn the eyes of the viewers...[-0.5233349800109863, -0.0218301210552454, 0.0...negative2.0Othello is set to burn the eyes of the viewers...negative
34The statistics in this movie were well researc...[-0.4964343309402466, -0.1613437831401825, 0.0...negative2.0The statistics in this movie were well researc...negative
35Following their daughter's brutal murder,Julie...[-0.45342516899108887, 0.025125373154878616, -...negative6.0Following their daughter's brutal murder,Julie...positive
36Compelling and Innovative! At the beginning of...[-0.39057832956314087, 0.07514691352844238, 0....negative9.0Compelling and Innovative! At the beginning of...positive
37I saw this movie when it aired on Lifetime bac...[-0.4824381172657013, -0.024186618626117706, -...negative2.0I saw this movie when it aired on Lifetime bac...positive
38I really wanted to like this movie. I absolute...[-0.5213059782981873, 0.08636035025119781, 0.0...negative2.0I really wanted to like this movie. I absolute...negative
39This comment discusses \"North and South Book I...[-1.0346614122390747, 0.5499882698059082, -0.0...negative9.0This comment discusses \"North and South Book I...positive
40Rarely have I seen an action/suspense movie th...[0.08839510381221771, -0.08421049267053604, -0...negative3.0Rarely have I seen an action/suspense movie th...negative
41This is a 100% improvement over the dross of a...[-0.4159573018550873, 0.1026173010468483, -0.1...negative2.0This is a 100% improvement over the dross of a...positive
42I liked it better than House Party 2 & 3. The ...[-0.37537163496017456, 0.2604108452796936, 0.0...negative3.0I liked it better than House Party 2 & 3. The ...positive
43A friend and I went to see this movie. We have...[-0.30783846974372864, 0.0511380173265934, -0....negative4.0A friend and I went to see this movie. We have...negative
44Whattt was with the sound? It sounded like it ...[-0.591052234172821, 0.5442489385604858, 0.109...negative1.0Whattt was with the sound? It sounded like it ...negative
45My college theater just had a special screenin...[-0.47453969717025757, 0.33813729882240295, -0...negative2.0My college theater just had a special screenin...positive
46Kingdom County, Vermont, 1927. Noel Lord (Rip ...[-0.7206570506095886, 0.63383948802948, -0.231...negative1.0Kingdom County, Vermont, 1927. Noel Lord (Rip ...positive
47Man, I really enjoyed this, if only for Fred W...[-0.9212082624435425, 0.2386074960231781, 0.20...negative3.0Man, I really enjoyed this, if only for Fred W...positive
48You've seen the same tired, worn out clichéd s...[-0.6829520463943481, 0.18268251419067383, 0.1...negative4.0You've seen the same tired, worn out clichéd s...negative
49This movie is really genuine and random. It's ...[-0.2603294849395752, -0.09567182511091232, -0...negative2.0This movie is really genuine and random. It's ...positive
\n", + "
\n", + "
\n", + "\n", + "
\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "
\n", + "\n", + "\n", + "
\n", + " \n", + "\n", + "\n", + "\n", + " \n", + "
\n", + "
\n", + "
\n" + ] + }, + "metadata": {}, + "execution_count": 34 + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "qFoT-s1MjTSS" + }, + "source": [ + "# 7. Try training with different Embeddings" + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "nxWFzQOhjWC8", + "colab": { + "base_uri": "https://localhost:8080/" + }, + "outputId": "d940310d-dfc6-45ae-c5dc-50d0141c836f" + }, + "source": [ + "# We can use nlu.print_components(action='embed_sentence') to see every possibler sentence embedding we could use. Lets use bert!\n", + "nlp.nlu.print_components(action='embed_sentence')" + ], + "execution_count": null, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "For language NLU provides the following Models : \n", + "nlu.load('am.embed_sentence.xlm_roberta') returns Spark NLP model_anno_obj sent_xlm_roberta_base_finetuned_amharic\n", + "For language NLU provides the following Models : \n", + "nlu.load('de.embed_sentence.bert.base_cased') returns Spark NLP model_anno_obj sent_bert_base_cased\n", + "For language NLU provides the following Models : \n", + "nlu.load('el.embed_sentence.bert.base_uncased') returns Spark NLP model_anno_obj sent_bert_base_uncased\n", + "For language NLU provides the following Models : \n", + "nlu.load('en.embed_sentence') returns Spark NLP model_anno_obj tfhub_use\n", + "nlu.load('en.embed_sentence.albert') returns Spark NLP model_anno_obj albert_base_uncased\n", + "nlu.load('en.embed_sentence.bert') returns Spark NLP model_anno_obj sent_bert_base_uncased\n", + "nlu.load('en.embed_sentence.bert.base_uncased_legal') returns Spark NLP model_anno_obj sent_bert_base_uncased_legal\n", + "nlu.load('en.embed_sentence.bert.finetuned') returns Spark NLP model_anno_obj sbert_setfit_finetuned_financial_text_classification\n", + "nlu.load('en.embed_sentence.bert.pubmed') returns Spark NLP model_anno_obj sent_bert_pubmed\n", + "nlu.load('en.embed_sentence.bert.pubmed_squad2') returns Spark NLP model_anno_obj sent_bert_pubmed_squad2\n", + "nlu.load('en.embed_sentence.bert.wiki_books') returns Spark NLP model_anno_obj sent_bert_wiki_books\n", + "nlu.load('en.embed_sentence.bert.wiki_books_mnli') returns Spark NLP model_anno_obj sent_bert_wiki_books_mnli\n", + "nlu.load('en.embed_sentence.bert.wiki_books_qnli') returns Spark NLP model_anno_obj sent_bert_wiki_books_qnli\n", + "nlu.load('en.embed_sentence.bert.wiki_books_qqp') returns Spark NLP model_anno_obj sent_bert_wiki_books_qqp\n", + "nlu.load('en.embed_sentence.bert.wiki_books_squad2') returns Spark NLP model_anno_obj sent_bert_wiki_books_squad2\n", + "nlu.load('en.embed_sentence.bert.wiki_books_sst2') returns Spark NLP model_anno_obj sent_bert_wiki_books_sst2\n", + "nlu.load('en.embed_sentence.bert_base_cased') returns Spark NLP model_anno_obj sent_bert_base_cased\n", + "nlu.load('en.embed_sentence.bert_base_uncased') returns Spark NLP model_anno_obj sent_bert_base_uncased\n", + "nlu.load('en.embed_sentence.bert_large_cased') returns Spark NLP model_anno_obj sent_bert_large_cased\n", + "nlu.load('en.embed_sentence.bert_large_uncased') returns Spark NLP model_anno_obj sent_bert_large_uncased\n", + "nlu.load('en.embed_sentence.bert_use_cmlm_en_base') returns Spark NLP model_anno_obj sent_bert_use_cmlm_en_base\n", + "nlu.load('en.embed_sentence.bert_use_cmlm_en_large') returns Spark NLP model_anno_obj sent_bert_use_cmlm_en_large\n", + "nlu.load('en.embed_sentence.biobert.clinical_base_cased') returns Spark NLP model_anno_obj sent_biobert_clinical_base_cased\n", + "nlu.load('en.embed_sentence.biobert.discharge_base_cased') returns Spark NLP model_anno_obj sent_biobert_discharge_base_cased\n", + "nlu.load('en.embed_sentence.biobert.pmc_base_cased') returns Spark NLP model_anno_obj sent_biobert_pmc_base_cased\n", + "nlu.load('en.embed_sentence.biobert.pubmed_base_cased') returns Spark NLP model_anno_obj sent_biobert_pubmed_base_cased\n", + "nlu.load('en.embed_sentence.biobert.pubmed_large_cased') returns Spark NLP model_anno_obj sent_biobert_pubmed_large_cased\n", + "nlu.load('en.embed_sentence.biobert.pubmed_pmc_base_cased') returns Spark NLP model_anno_obj sent_biobert_pubmed_pmc_base_cased\n", + "nlu.load('en.embed_sentence.covidbert.large_uncased') returns Spark NLP model_anno_obj sent_covidbert_large_uncased\n", + "nlu.load('en.embed_sentence.distil_roberta.distilled_base') returns Spark NLP model_anno_obj sent_distilroberta_base\n", + "nlu.load('en.embed_sentence.doc2vec') returns Spark NLP model_anno_obj doc2vec_gigaword_300\n", + "nlu.load('en.embed_sentence.doc2vec.gigaword_300') returns Spark NLP model_anno_obj doc2vec_gigaword_300\n", + "nlu.load('en.embed_sentence.doc2vec.gigaword_wiki_300') returns Spark NLP model_anno_obj doc2vec_gigaword_wiki_300\n", + "nlu.load('en.embed_sentence.electra') returns Spark NLP model_anno_obj sent_electra_small_uncased\n", + "nlu.load('en.embed_sentence.electra_base_uncased') returns Spark NLP model_anno_obj sent_electra_base_uncased\n", + "nlu.load('en.embed_sentence.electra_large_uncased') returns Spark NLP model_anno_obj sent_electra_large_uncased\n", + "nlu.load('en.embed_sentence.electra_small_uncased') returns Spark NLP model_anno_obj sent_electra_small_uncased\n", + "nlu.load('en.embed_sentence.roberta.base') returns Spark NLP model_anno_obj sent_roberta_base\n", + "nlu.load('en.embed_sentence.roberta.large') returns Spark NLP model_anno_obj sent_roberta_large\n", + "nlu.load('en.embed_sentence.small_bert_L10_128') returns Spark NLP model_anno_obj sent_small_bert_L10_128\n", + "nlu.load('en.embed_sentence.small_bert_L10_256') returns Spark NLP model_anno_obj sent_small_bert_L10_256\n", + "nlu.load('en.embed_sentence.small_bert_L10_512') returns Spark NLP model_anno_obj sent_small_bert_L10_512\n", + "nlu.load('en.embed_sentence.small_bert_L10_768') returns Spark NLP model_anno_obj sent_small_bert_L10_768\n", + "nlu.load('en.embed_sentence.small_bert_L12_128') returns Spark NLP model_anno_obj sent_small_bert_L12_128\n", + "nlu.load('en.embed_sentence.small_bert_L12_256') returns Spark NLP model_anno_obj sent_small_bert_L12_256\n", + "nlu.load('en.embed_sentence.small_bert_L12_512') returns Spark NLP model_anno_obj sent_small_bert_L12_512\n", + "nlu.load('en.embed_sentence.small_bert_L12_768') returns Spark NLP model_anno_obj sent_small_bert_L12_768\n", + "nlu.load('en.embed_sentence.small_bert_L2_128') returns Spark NLP model_anno_obj sent_small_bert_L2_128\n", + "nlu.load('en.embed_sentence.small_bert_L2_256') returns Spark NLP model_anno_obj sent_small_bert_L2_256\n", + "nlu.load('en.embed_sentence.small_bert_L2_512') returns Spark NLP model_anno_obj sent_small_bert_L2_512\n", + "nlu.load('en.embed_sentence.small_bert_L2_768') returns Spark NLP model_anno_obj sent_small_bert_L2_768\n", + "nlu.load('en.embed_sentence.small_bert_L4_128') returns Spark NLP model_anno_obj sent_small_bert_L4_128\n", + "nlu.load('en.embed_sentence.small_bert_L4_256') returns Spark NLP model_anno_obj sent_small_bert_L4_256\n", + "nlu.load('en.embed_sentence.small_bert_L4_512') returns Spark NLP model_anno_obj sent_small_bert_L4_512\n", + "nlu.load('en.embed_sentence.small_bert_L4_768') returns Spark NLP model_anno_obj sent_small_bert_L4_768\n", + "nlu.load('en.embed_sentence.small_bert_L6_128') returns Spark NLP model_anno_obj sent_small_bert_L6_128\n", + "nlu.load('en.embed_sentence.small_bert_L6_256') returns Spark NLP model_anno_obj sent_small_bert_L6_256\n", + "nlu.load('en.embed_sentence.small_bert_L6_512') returns Spark NLP model_anno_obj sent_small_bert_L6_512\n", + "nlu.load('en.embed_sentence.small_bert_L6_768') returns Spark NLP model_anno_obj sent_small_bert_L6_768\n", + "nlu.load('en.embed_sentence.small_bert_L8_128') returns Spark NLP model_anno_obj sent_small_bert_L8_128\n", + "nlu.load('en.embed_sentence.small_bert_L8_256') returns Spark NLP model_anno_obj sent_small_bert_L8_256\n", + "nlu.load('en.embed_sentence.small_bert_L8_512') returns Spark NLP model_anno_obj sent_small_bert_L8_512\n", + "nlu.load('en.embed_sentence.small_bert_L8_768') returns Spark NLP model_anno_obj sent_small_bert_L8_768\n", + "nlu.load('en.embed_sentence.tfhub_use') returns Spark NLP model_anno_obj tfhub_use\n", + "nlu.load('en.embed_sentence.tfhub_use.lg') returns Spark NLP model_anno_obj tfhub_use_lg\n", + "nlu.load('en.embed_sentence.use') returns Spark NLP model_anno_obj tfhub_use\n", + "nlu.load('en.embed_sentence.use.lg') returns Spark NLP model_anno_obj tfhub_use_lg\n", + "For language NLU provides the following Models : \n", + "nlu.load('es.embed_sentence.bert.base_cased') returns Spark NLP model_anno_obj sent_bert_base_cased\n", + "nlu.load('es.embed_sentence.bert.base_uncased') returns Spark NLP model_anno_obj sent_bert_base_uncased\n", + "For language NLU provides the following Models : \n", + "nlu.load('fi.embed_sentence.bert') returns Spark NLP model_anno_obj bert_base_finnish_uncased\n", + "nlu.load('fi.embed_sentence.bert.cased') returns Spark NLP model_anno_obj bert_base_finnish_cased\n", + "nlu.load('fi.embed_sentence.bert.uncased') returns Spark NLP model_anno_obj bert_base_finnish_uncased\n", + "For language NLU provides the following Models : \n", + "nlu.load('ha.embed_sentence.xlm_roberta') returns Spark NLP model_anno_obj sent_xlm_roberta_base_finetuned_hausa\n", + "For language NLU provides the following Models : \n", + "nlu.load('ig.embed_sentence.xlm_roberta') returns Spark NLP model_anno_obj sent_xlm_roberta_base_finetuned_igbo\n", + "For language NLU provides the following Models : \n", + "nlu.load('lg.embed_sentence.xlm_roberta') returns Spark NLP model_anno_obj sent_xlm_roberta_base_finetuned_luganda\n", + "For language NLU provides the following Models : \n", + "nlu.load('nl.embed_sentence.bert.base_cased') returns Spark NLP model_anno_obj sent_bert_base_cased\n", + "For language NLU provides the following Models : \n", + "nlu.load('pcm.embed_sentence.xlm_roberta') returns Spark NLP model_anno_obj sent_xlm_roberta_base_finetuned_naija\n", + "For language NLU provides the following Models : \n", + "nlu.load('pt.embed_sentence.bert.base_legal') returns Spark NLP model_anno_obj sbert_legal_bertimbau_base_tsdae_sts\n", + "nlu.load('pt.embed_sentence.bert.cased_large_legal') returns Spark NLP model_anno_obj sbert_bert_large_portuguese_cased_legal_mlm_sts_v0.1\n", + "nlu.load('pt.embed_sentence.bert.large_legal') returns Spark NLP model_anno_obj sbert_legal_bertimbau_large_gpl_sts\n", + "nlu.load('pt.embed_sentence.bert.legal.cased_large_mlm_sts_v0.10.by_stjiris') returns Spark NLP model_anno_obj sbert_bert_large_portuguese_cased_legal_mlm_sts_v0.10\n", + "nlu.load('pt.embed_sentence.bert.legal.cased_large_mlm_sts_v0.2.by_stjiris') returns Spark NLP model_anno_obj sbert_bert_large_portuguese_cased_legal_mlm_sts_v0.2\n", + "nlu.load('pt.embed_sentence.bert.legal.cased_large_mlm_sts_v0.3.by_stjiris') returns Spark NLP model_anno_obj sbert_bert_large_portuguese_cased_legal_mlm_sts_v0.3\n", + "nlu.load('pt.embed_sentence.bert.legal.cased_large_mlm_sts_v0.4.by_stjiris') returns Spark NLP model_anno_obj sbert_bert_large_portuguese_cased_legal_mlm_sts_v0.4\n", + "nlu.load('pt.embed_sentence.bert.legal.cased_large_mlm_sts_v0.5.by_stjiris') returns Spark NLP model_anno_obj sbert_bert_large_portuguese_cased_legal_mlm_sts_v0.5\n", + "nlu.load('pt.embed_sentence.bert.legal.cased_large_mlm_sts_v0.7.by_stjiris') returns Spark NLP model_anno_obj sbert_bert_large_portuguese_cased_legal_mlm_sts_v0.7\n", + "nlu.load('pt.embed_sentence.bert.legal.cased_large_mlm_sts_v0.8.by_stjiris') returns Spark NLP model_anno_obj sbert_bert_large_portuguese_cased_legal_mlm_sts_v0.8\n", + "nlu.load('pt.embed_sentence.bert.legal.cased_large_mlm_sts_v0.9.by_stjiris') returns Spark NLP model_anno_obj sbert_bert_large_portuguese_cased_legal_mlm_sts_v0.9\n", + "nlu.load('pt.embed_sentence.bert.legal.cased_large_mlm_sts_v1.0.by_stjiris') returns Spark NLP model_anno_obj sbert_bert_large_portuguese_cased_legal_mlm_sts_v1.0\n", + "nlu.load('pt.embed_sentence.bert.legal.cased_large_mlm_v0.11_gpl_nli_sts_v0.by_stjiris') returns Spark NLP model_anno_obj sbert_bert_large_portuguese_cased_legal_mlm_v0.11_gpl_nli_sts_v0\n", + "nlu.load('pt.embed_sentence.bert.legal.cased_large_mlm_v0.11_gpl_nli_sts_v1.by_stjiris') returns Spark NLP model_anno_obj sbert_bert_large_portuguese_cased_legal_mlm_v0.11_gpl_nli_sts_v1\n", + "nlu.load('pt.embed_sentence.bert.legal.cased_large_mlm_v0.11_nli_sts_v0.by_stjiris') returns Spark NLP model_anno_obj sbert_bert_large_portuguese_cased_legal_mlm_v0.11_nli_sts_v0\n", + "nlu.load('pt.embed_sentence.bert.legal.cased_large_mlm_v0.11_nli_sts_v1.by_stjiris') returns Spark NLP model_anno_obj sbert_bert_large_portuguese_cased_legal_mlm_v0.11_nli_sts_v1\n", + "nlu.load('pt.embed_sentence.bert.legal.cased_large_mlm_v0.11_sts_v0.by_stjiris') returns Spark NLP model_anno_obj sbert_bert_large_portuguese_cased_legal_mlm_v0.11_sts_v0\n", + "nlu.load('pt.embed_sentence.bert.legal.cased_large_mlm_v0.11_sts_v1.by_stjiris') returns Spark NLP model_anno_obj sbert_bert_large_portuguese_cased_legal_mlm_v0.11_sts_v1\n", + "nlu.load('pt.embed_sentence.bert.v2_base_legal') returns Spark NLP model_anno_obj sbert_legal_bertimbau_sts_base_ma_v2\n", + "nlu.load('pt.embed_sentence.bert.v2_large_legal') returns Spark NLP model_anno_obj sbert_legal_bertimbau_large_tsdae_sts_v2\n", + "nlu.load('pt.embed_sentence.bertimbau.legal.assin.base.by_rufimelo') returns Spark NLP model_anno_obj sbert_legal_bertimbau_sts_base_ma\n", + "nlu.load('pt.embed_sentence.bertimbau.legal.assin2.base.by_rufimelo') returns Spark NLP model_anno_obj sbert_legal_bertimbau_sts_base\n", + "nlu.load('pt.embed_sentence.bertimbau.legal.large_sts_by_rufimelo') returns Spark NLP model_anno_obj sbert_legal_bertimbau_sts_large\n", + "nlu.load('pt.embed_sentence.bertimbau.legal.large_sts_ma.by_rufimelo') returns Spark NLP model_anno_obj sbert_legal_bertimbau_sts_large_ma\n", + "nlu.load('pt.embed_sentence.bertimbau.legal.large_sts_ma_v3.by_rufimelo') returns Spark NLP model_anno_obj sbert_legal_bertimbau_sts_large_ma_v3\n", + "nlu.load('pt.embed_sentence.bertimbau.legal.large_tsdae_sts.by_rufimelo') returns Spark NLP model_anno_obj sbert_legal_bertimbau_large_tsdae_sts\n", + "nlu.load('pt.embed_sentence.bertimbau.legal.large_tsdae_sts_v4.by_rufimelo') returns Spark NLP model_anno_obj sbert_legal_bertimbau_large_tsdae_sts_v4\n", + "nlu.load('pt.embed_sentence.bertimbau.legal.large_tsdae_v4_gpl_sts.by_rufimelo') returns Spark NLP model_anno_obj sbert_legal_bertimbau_large_tsdae_v4_gpl_sts\n", + "nlu.load('pt.embed_sentence.bertimbau.legal.v2_large_sts_v2.by_rufimelo') returns Spark NLP model_anno_obj sbert_legal_bertimbau_sts_large_v2\n", + "nlu.load('pt.embed_sentence.bertimbau.legal.v2_large_v2_sts.by_rufimelo') returns Spark NLP model_anno_obj sbert_legal_bertimbau_large_v2_sts\n", + "For language NLU provides the following Models : \n", + "nlu.load('rw.embed_sentence.xlm_roberta') returns Spark NLP model_anno_obj sent_xlm_roberta_base_finetuned_kinyarwanda\n", + "For language NLU provides the following Models : \n", + "nlu.load('sv.embed_sentence.bert.base_cased') returns Spark NLP model_anno_obj sent_bert_base_cased\n", + "For language NLU provides the following Models : \n", + "nlu.load('sw.embed_sentence.xlm_roberta') returns Spark NLP model_anno_obj sent_xlm_roberta_base_finetuned_swahili\n", + "For language NLU provides the following Models : \n", + "nlu.load('wo.embed_sentence.xlm_roberta') returns Spark NLP model_anno_obj sent_xlm_roberta_base_finetuned_wolof\n", + "For language NLU provides the following Models : \n", + "nlu.load('xx.embed_sentence') returns Spark NLP model_anno_obj sent_bert_multi_cased\n", + "nlu.load('xx.embed_sentence.bert') returns Spark NLP model_anno_obj sent_bert_multi_cased\n", + "nlu.load('xx.embed_sentence.bert.cased') returns Spark NLP model_anno_obj sent_bert_multi_cased\n", + "nlu.load('xx.embed_sentence.bert.muril') returns Spark NLP model_anno_obj sent_bert_muril\n", + "nlu.load('xx.embed_sentence.bert_use_cmlm_multi_base') returns Spark NLP model_anno_obj sent_bert_use_cmlm_multi_base\n", + "nlu.load('xx.embed_sentence.bert_use_cmlm_multi_base_br') returns Spark NLP model_anno_obj sent_bert_use_cmlm_multi_base_br\n", + "nlu.load('xx.embed_sentence.labse') returns Spark NLP model_anno_obj labse\n", + "nlu.load('xx.embed_sentence.xlm_roberta.base') returns Spark NLP model_anno_obj sent_xlm_roberta_base\n", + "For language NLU provides the following Models : \n", + "nlu.load('yo.embed_sentence.xlm_roberta') returns Spark NLP model_anno_obj sent_xlm_roberta_base_finetuned_yoruba\n", + "For language NLU provides the following Models : \n", + "nlu.load('zh.embed_sentence.bert') returns Spark NLP model_anno_obj sbert_chinese_qmc_finance_v1\n", + "nlu.load('zh.embed_sentence.bert.distilled') returns Spark NLP model_anno_obj sbert_chinese_qmc_finance_v1_distill\n" + ] + } + ] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "IKK_Ii_gjJfF", + "outputId": "53181dbd-eea1-4b84-ead4-ea49a27d903d" + }, + "source": [ + "trainable_pipe = nlp.load('en.embed_sentence.small_bert_L12_768 train.sentiment')\n", + "# We need to train longer and user smaller LR for NON-USE based sentence embeddings usually\n", + "# We could tune the hyperparameters further with hyperparameter tuning methods like gridsearch\n", + "# Also longer training gives more accuracy\n", + "trainable_pipe['trainable_sentiment_dl'].setMaxEpochs(120)\n", + "trainable_pipe['trainable_sentiment_dl'].setLr(0.0005)\n", + "fitted_pipe = trainable_pipe.fit(train_df[:100])\n", + "# predict with the trainable pipeline on dataset and get predictions\n", + "preds = fitted_pipe.predict(train_df[:100],output_level='document')\n", + "\n", + "#sentence detector that is part of the pipe generates some NaNs. lets drop them first\n", + "preds.dropna(inplace=True)\n", + "print(classification_report(preds['y'], preds['sentiment']))\n", + "\n", + "#preds" + ], + "execution_count": null, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + " precision recall f1-score support\n", + "\n", + " negative 1.00 0.55 0.71 44\n", + " neutral 0.00 0.00 0.00 0\n", + " positive 0.98 0.88 0.92 56\n", + "\n", + " accuracy 0.73 100\n", + " macro avg 0.66 0.47 0.54 100\n", + "weighted avg 0.99 0.73 0.83 100\n", + "\n" + ] + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "_1jxw3GnVGlI" + }, + "source": [ + "# 7.1 evaluate on Test Data" + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "Fxx4yNkNVGFl", + "colab": { + "base_uri": "https://localhost:8080/" + }, + "outputId": "b9ff1dc4-a29d-4975-9167-0304dfe71278" + }, + "source": [ + "preds = fitted_pipe.predict(test_df[:100],output_level='document')\n", + "\n", + "#sentence detector that is part of the pipe generates sone NaNs. lets drop them first\n", + "preds.dropna(inplace=True)\n", + "print(classification_report(preds['y'], preds['sentiment']))" + ], + "execution_count": null, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + " precision recall f1-score support\n", + "\n", + " negative 0.94 0.34 0.50 50\n", + " neutral 0.00 0.00 0.00 0\n", + " positive 0.76 0.64 0.70 50\n", + "\n", + " accuracy 0.49 100\n", + " macro avg 0.57 0.33 0.40 100\n", + "weighted avg 0.85 0.49 0.60 100\n", + "\n" + ] + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "2BB-NwZUoHSe" + }, + "source": [ + "# 8. Lets save the model" + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "eLex095goHwm" + }, + "source": [ + "stored_model_path = './models/classifier_dl_trained'\n", + "fitted_pipe.save(stored_model_path)" + ], + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "e_b2DPd4rCiU" + }, + "source": [ + "# 9. Lets load the model from HDD.\n", + "This makes Offlien NLU usage possible! \n", + "You need to call nlu.load(path=path_to_the_pipe) to load a model/pipeline from disk." + ] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 133 + }, + "id": "SO4uz45MoRgp", + "outputId": "a1c68191-a229-4990-e847-a8e9e18d4618" + }, + "source": [ + "hdd_pipe = nlp.load(path=stored_model_path)\n", + "\n", + "preds = hdd_pipe.predict('It was one of the best films i have ever watched in my entire life !!')\n", + "preds" + ], + "execution_count": null, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Warning::Spark Session already created, some configs may not take.\n", + "Warning::Spark Session already created, some configs may not take.\n", + "Warning::Spark Session already created, some configs may not take.\n" + ] + }, + { + "output_type": "execute_result", + "data": { + "text/plain": [ + " document \\\n", + "0 It was one of the best films i have ever watch... \n", + "\n", + " sentence_embedding_from_disk sentiment \\\n", + "0 [0.09222032874822617, 0.1172066256403923, 0.19... positive \n", + "\n", + " sentiment_confidence \n", + "0 0.0 " + ], + "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", + "
documentsentence_embedding_from_disksentimentsentiment_confidence
0It was one of the best films i have ever watch...[0.09222032874822617, 0.1172066256403923, 0.19...positive0.0
\n", + "
\n", + "
\n", + "\n", + "
\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "
\n", + "\n", + "
\n", + "
\n" + ] + }, + "metadata": {}, + "execution_count": 8 + } + ] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "e0CVlkk9v6Qi", + "outputId": "651f1a33-cb6b-413e-db68-6e11338b3077" + }, + "source": [ + "hdd_pipe.print_info()" + ], + "execution_count": null, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "The following parameters are configurable for this NLU pipeline (You can copy paste the examples) :\n", + ">>> component_list['document_assembler'] has settable params:\n", + "component_list['document_assembler'].setCleanupMode('shrink') | Info: possible values: disabled, inplace, inplace_full, shrink, shrink_full, each, each_full, delete_full | Currently set to : shrink\n", + ">>> component_list['bert_sentence_embeddings@sent_small_bert_L12_768'] has settable params:\n", + "component_list['bert_sentence_embeddings@sent_small_bert_L12_768'].setBatchSize(8) | Info: Size of every batch | Currently set to : 8\n", + "component_list['bert_sentence_embeddings@sent_small_bert_L12_768'].setCaseSensitive(False) | Info: whether to ignore case in tokens for embeddings matching | Currently set to : False\n", + "component_list['bert_sentence_embeddings@sent_small_bert_L12_768'].setDimension(768) | Info: Number of embedding dimensions | Currently set to : 768\n", + "component_list['bert_sentence_embeddings@sent_small_bert_L12_768'].setMaxSentenceLength(128) | Info: Max sentence length to process | Currently set to : 128\n", + "component_list['bert_sentence_embeddings@sent_small_bert_L12_768'].setEngine('tensorflow') | Info: Deep Learning engine used for this model | Currently set to : tensorflow\n", + "component_list['bert_sentence_embeddings@sent_small_bert_L12_768'].setIsLong(False) | Info: Use Long type instead of Int type for inputs buffer - Some Bert models require Long instead of Int. | Currently set to : False\n", + "component_list['bert_sentence_embeddings@sent_small_bert_L12_768'].setStorageRef('sent_small_bert_L12_768') | Info: unique reference name for identification | Currently set to : sent_small_bert_L12_768\n", + ">>> component_list['sentiment_dl@sent_small_bert_L12_768'] has settable params:\n", + "component_list['sentiment_dl@sent_small_bert_L12_768'].setThreshold(0.6) | Info: The minimum threshold for the final result otheriwse it will be neutral | Currently set to : 0.6\n", + "component_list['sentiment_dl@sent_small_bert_L12_768'].setThresholdLabel('neutral') | Info: In case the score is less than threshold, what should be the label. Default is neutral. | Currently set to : neutral\n", + "component_list['sentiment_dl@sent_small_bert_L12_768'].setEngine('tensorflow') | Info: Deep Learning engine used for this model | Currently set to : tensorflow\n", + "component_list['sentiment_dl@sent_small_bert_L12_768'].setClasses(['positive', 'negative']) | Info: get the tags used to trained this SentimentDLModel | Currently set to : ['positive', 'negative']\n", + "component_list['sentiment_dl@sent_small_bert_L12_768'].setStorageRef('sent_small_bert_L12_768') | Info: unique reference name for identification | Currently set to : sent_small_bert_L12_768\n" + ] + } + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "mtDcALorKHIx" + }, + "source": [], + "execution_count": null, + "outputs": [] + } + ] +} \ No newline at end of file diff --git a/examples/colab/Training/binary_text_classification/NLU_training_sentiment_classifier_demo_apple_twitter.ipynb b/examples/colab/Training/binary_text_classification/NLU_training_sentiment_classifier_demo_apple_twitter.ipynb index a949d4ee..98d1aebe 100644 --- a/examples/colab/Training/binary_text_classification/NLU_training_sentiment_classifier_demo_apple_twitter.ipynb +++ b/examples/colab/Training/binary_text_classification/NLU_training_sentiment_classifier_demo_apple_twitter.ipynb @@ -1 +1,2598 @@ -{"nbformat":4,"nbformat_minor":0,"metadata":{"colab":{"name":"NLU_training_sentiment_classifier_demo_apple_twitter.ipynb","provenance":[],"collapsed_sections":[]},"kernelspec":{"display_name":"Python 3","name":"python3"}},"cells":[{"cell_type":"markdown","metadata":{"id":"RIV-9vEqxTBB"},"source":["![JohnSnowLabs](https://nlp.johnsnowlabs.com/assets/images/logo.png)\n","\n","[![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/JohnSnowLabs/nlu/blob/master/examples/colab/Training/binary_text_classification/NLU_training_sentiment_classifier_demo_apple_twitter.ipynb)\n","\n","\n","\n","# Training a Sentiment Analysis Classifier with NLU \n","## 2 class Apple Tweets sentiment classifier training\n","With the [SentimentDL model](https://nlp.johnsnowlabs.com/docs/en/annotators#sentimentdl-multi-class-sentiment-analysis-annotator) from Spark NLP you can achieve State Of the Art results on any multi class text classification problem \n","\n","This notebook showcases the following features : \n","\n","- How to train the deep learning classifier\n","- How to store a pipeline to disk\n","- How to load the pipeline from disk (Enables NLU offline mode)\n","\n","You can achieve these results or even better on this dataset with training data:\n","\n","
\n","\n","![image.png](data:image/png;base64,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)\n","\n","You can achieve these results or even better on this dataset with test data:\n","\n","\n","\n","
\n","\n","\n","![image.png](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAfQAAACyCAYAAAC0oD1PAAAgAElEQVR4Ae2dO5YUybJF71SYB4OAGXSPgAn0BBgAMjo6Mipyr6shoyKi1lun3t30acPilxWZ6RF5Yq1qj/CPmfk2c7OohE7+85QrBEIgBEIgBELg8AT+c/gdZAMhEAIhEAIhEAJPKegJghAIgRAIgRA4AYEU9BM4MVsIgRAIgRAIgRT0xMCQBD59+vT06tWrJ7WXXt++fXt6/fr107t3755+/vx5qZis20BAnMVbvtNPx/7Hjx9Pb9++/TXn/fv3GzRcNvXr16+/9MmuW+i8zNKsCoHLCaSgX84uK69IIAX9inBvJFo+7Aq6q1dhvXZx5cVORX3qkg0q9HNzptam/zEI8LL6kl8yrk0qBf3ahCM/BB6UwCgFfc4OfnP/+PHj86c5KegPGqwrtp2CvgJSpoRACJyTwFwhZce3+A19yg599K9PENSu+S0em9M+JoEU9Mf0++F2TcL78uXLrz9n1J89K8lxMef79++//vyzztFcPrrkz1C733jqHD1z8RvT3PpOj3+0u/bPaOfsQIaYSDb2uK3YPEK7xj/sib3oz7HVV685LporXchQO8UEm5QIpy6tnVo/tWZNf92r29vF7UsLOutdT439OqfasWb8zZs3z+fSfSTOfvmY7Kl2+Nxr3nc+wFaKo/uePuawfu4Mam+KY7XiCf+658rE9YqBnvXjPuB8YAeyvWXONTlukZ2P3LfQOulcHSAFqQengtuLJHM8CdU59ZnDweHiwLqeKaQcItb6PNnitvlYvZdN+qlXtRV9zOVZXLCh7qfKvOfzkn/Yj+Zx6d59scY/YuEyYOJ9Ln/JT1P+QcYerWxbsoN94OstemE7t1ZjiqWOk3R1+jXXzxtzXI7k+pwa16yZs23LXtfOJZam9ss4501y6WMNXH2/dT9wdQZa73FdmSDXdeteeliHLT6HPuxby+KW81LQb0l7UF31AMhMHRx+G9Cz5vihUZ8OEwegzmerOhAcipp8mNO1HLouEXW2dDLU5/qZU5MC/b4f9Pvhpa+zCRn3ajsmvh+N16JW96P51cdL+5lLcp3OKq/zT53z0uc1dkzFhHRrvZK9/3gMwJE4r/bCaGpc8zVW/cM66deFjTyrD92yZ80ZfBZ0g/9ge90Tqhl3JvSxP/bGM2u1hnVdzLIOJopp95fk6JncpWfJ82f1Sa/bX+3DnpHaFPSRvHEnWxS4NZhJHhyEbo6by3xPetz74at6XIbf+6H0fu5lD/LnipAfftZOJT7tFVnolx4u+mBC/wjtkn+cF9xo2Y/aJf/AgLW0zgke6vOESL+3nX98fI/7NXYQv7DYqrdyIeYlZ00h6DiwDllLNjKOT7xFxtZ9vWQ+9mOHxwJjbhd9xBJMecYWrUGW/MWZZdzXrTnrWucykVPbal8dH+E5BX0EL9zZBh2YmsjrQejmuNl1vo9xv6ZgMJdDuSbByrZ6qJGjg+pJQ/1Ttrp96PdkQt8am9B/q3bJPxonCU7Z5Pvv5pDQnCd9zom1a3R2/mH9Xu0aOxQTiqE9fEucwGmOEXvsONR1SzZOxTU67tmyF2KQZxjJNvqIJTjyjP3OSv6qZ591GptiUmNdMrENPbWt9tXxEZ5T0Efwwp1t0IHxgk7g+mGrc6rJrJk7FBy0uTnIZe6aBDt1aCXLDz+yO1vRR/Koz1pL3xqb0HWrdsk/FAP219nF/qb8A7caF/oNrJOrvilZ6O/8w9he7Ro74LOXb+u+ZIM4TclXfx3XGj+XSzbinyXme3HdKqf6QYywFds9lohHreMSJy/g9VnzOrno0Xgn19egq2vXzuvW3qIvBf0WlAfXQbLRYeLHD5HM17Mnl25LfiiRo9aTWDdHh4RL976W+6U5rkP3rPPW7e/s8D13h54+14Xd927X+IeCMMVEe+i4OPvKVmP6gV2nQ/pqEnYbuHf/7MlTtnlCR3a3V2zxPTN/qu323Omr7JyJZNfxygM9c/E3tae5NVP7ekk/ZwWeaut+6hz5yWOpjncyKjPNqb7rmBCv7FFrOp8xTlttqnti3r3aFPR7kR9Ir4J7tMAcCE9MCYEQuAMBimctvm6KCnp9MfLxR7tPQX80jzf7TUFvoKQrBELgrgRS0LfjT0Hfzux0K1LQT+fSbCgEDk8gBX27C1PQtzPLihAIgRAIgRAYjkAK+nAuiUEhEAIhEAIhsJ1ACvp2ZlkRAiEQAiEQAsMRSEEfziUxKARCIARCIAS2E0hB384sK0IgBEIgBEJgOAIp6MO5JAaFQAiEQAiEwHYCKejbmWVFCIRACIRACAxHIAV9OJfEoBAIgRAIgRDYTiAFfTuzrAiBEAiBEAiB4QikoA/nkhgUAiEQAiEQAtsJpKBvZ5YVIRACIRACITAcgRT04VwSg0IgBEIgBEJgO4EU9O3MsiIEQiAEQiAEhiOQgj6cS2JQCIRACIRACGwnkIK+nVlWhEAIhEAIhMBwBFLQh3NJDAqBEAiBEAiB7QRS0Lczy4oQCIEQCIEQGI5ACvpwLolBIRACIRACIbCdQAr6dmZZEQIhEAIhEALDEUhBH84lMSgEQiAEQiAEthNIQd/OLCtCIARCIARCYDgCKejDuSQGhUAIhEAIhMB2Aino25llRQiEQAiEQAgMRyAFfTiXxKAQCIEQCIEQ2E4gBX07s00rPn369PTq1asntblCIARCIARC4FoEUtAvJPvz58+nd+/eLRbqFPQLAS8se//+/fOLkl6WXr9+/fTt27eFFb8PuwzJkT/lVy58rDF+tObMlziK50v2W2VI1tevX39h68brnF+TT3Tj8XZpzIojvlE7Jcd1vX379unHjx8nIrn/VsRHnGA7xazOGy0fpKBfGBsk+/zmfSHAFyzTIfIDJx9MJbYpNZLhBZyDygHFvzxLDoXorD6v+6tMplh6PzK8gFf/aM6bN28ueglzXUe63yNmxbTGeZV7ic+OxPEatnLW/VyLq+cH6eVlymP7Gva8RGYK+oX0uiC4UFSWbSDQFQx84cV3TuTUfK1HBonRDznrvG9Oz9HGppJYLSJz++qKTi3g9XlO3hnG9ohZcVDc+Yus+sTb+zyGz8DuXnuocUw+GLmYi9VhCjpAv3z58vzmxEcjJGAczzzGPdiZozWM09akVeeQxKt81qt1XXK8j9VAkLyqU/ZJr78ZVn2ug/08UiuOlYFYirVzW2KCf/Br5w/k4jv5pupe0nOU8e5lxWMPBkv7QQ6ckCF2XI9W0PeKWVgS57woEMOMr/UV/kj7OwEx9Pzc+fD3VffvOVxBV+ImYAlongloAlx4dU9y6Z6r45iDTD3r3vWqj8TlutRfL2xyeZpDv6+nj7k8+5y6n6rv7M/aPwkNH+j548eP//LzGg7wnXsZIMY0x4vSGvlHmgMLYo+Y//z58zNXj8E1+9J8MavnRmudKXPOzHbPmBU/sRI3Lzhw1R9lyGcaewS2a2LxkjliTJ7RenyoPANXtZyXS3RcY83hCronlpqEgK5Ez1XnyFGePOo467zt5lBM3B5fw323lrFqr4Kjvnx4UGndnDzknrmFmT6p8QOlfme3xICCpXX4siZIjaED7lt0LNkw0jj74xMw4o5+sVhzwRJOcPYzV+VQ4Ofm1DVHehY78XxpzOILfEN84hs4Mi5GrGHOkbjdy1a4erGmzzlqvOaMe9mM3tMVdH978nucI4eQbAShcwoHw9eT2AFH4nIHM+YtBwr9PoYejXXyCKJqR7XFZZ79Xqy0f09a2rNY1b4pFh1r+pDR+Y2+MxYe9l9jiz138dvx1Tw/X5qDz+Zk1HPZyT5qH/snttjHlpjVmm6++igqyifdXzbs1mFD2n8TEKt6BqbYc2a0ZpTrdAW9HpoKGofJafrhMDCPBOZOos8T0lpndmvRpVbFQT/dYZQNS/txWY9w7y9B7HetL5g/5RPn3flD6/EXss7Uam813hTztUDP7dkZMm+KN+NqO90+fuT7PWIWRuLkl8fpFOczs3UWL71X7HbFXHK7cwBvrRvlOlVB5+BMAcYBXpirI5jjMnQgOkevOSjIm9Ipm//888+nDx8+PCc1t2dpPz73ke7F3YuMfOXPsFC//FaLFC8A3o+fJFtXfVbf2f1R9wcDPwviAD+xrWOK83pWNKe+OD9D/t9/ujU+fob7tTELi6l4rhw7uR7X+HQq/5yB7R57IFdMcSLmPd513/lpD3sulXGqgi4IBLCSCj8OnQPDGG11FP1q9RchdEiqs0l4zHU9Omj0e0vBwGEESj2ojC/th3mP1jpf5+4cOKSe4BiHu/vGY0Dzqn81t8YA8s7S1nirTLRPZ9eN1zNW/bM0fhaWdR9rYhY2lRmyiGnitott1/MIMQubS9vunHd867wpH11qxx7rDlPQ99gsyaomZT1PFdQ99EZGCIRACIRACFybQAr6//78bsS3rWs7P/JDIARCIATOQ+ChCrrcVj+y0kcr3cdW53FxdhICIRACIfAIBB6uoD+CU7PHEAiBEAiBxyOQgv54Ps+OQyAEQiAETkggBf2ETs2WQiAEQiAEHo9ACvrj+Tw7DoEQCIEQOCGBFPQTOjVbCoEQCIEQeDwCKegD+9y/wCN/G39gR8W0EAiBEBiAQAr6hU6g2HbflHWhyNll0pP/ve4fRP5tWJd+KVD9XxjrFw5J2x56/rF6/Du+fIlvytL+t171G7W6uN1Dz1a77j1/j1haw20PPfdmNaL+NXF9b7tT0C/0QAr6heB2WKaE5V8EpMK8tajXNXzlphf1PfTssN2biaBYiI0uEpg4rL3qGs6JF/U99Ky1Z5R5e8TSGm576BmF2Uh2rInrEexNQb/QCyQqkt+FYlYvkx5PiqsXnmwiSc0LL75YW3g4nNV3Wg/jPfQcDb3vH9vFecvLkpj6y5bkVJZ76MG+I7R1/7J5a8xqzRK3vfQcgemtbVwT17e2qdN3qoKu5KNkQhLiY0NP/oIg5zCm1hN7l+zpkxzufT33nsgkU8Xh+/fvzzZpTpcYdUhZr9ZtcYchT4ngkS98LD9wiY3YUYzpn2qV+Oq/Gy25koEP99AzpX/EfgqMx5/HunisuRTP+uFCLrHN80v1IP8I7R6xtIbbHnqOwPMeNi7F9T1s6nSerqB7UtaGlThI0t0zSYsEU5+1hj5Pat0Bc8CSJ1u8iCsovOhojsvUvdZ4HzI119fS/2itc8AH4qJ/Ec/9PMdFfH2u/KLnz58///LXHnrmbBhtrMY4sSgmYiMeSxf+YC6/MfKvFYrzHnqW7BhtfI9YWsNtDz2jsRvBnjVxPYKdsuF0Bd0LqDboybseCpzgB4E5JCXNoc8LbXUysmi1fs4W5nnb6WHcbaTvEVs4fPny5V8vP+r3Ij3HhphQKx9prS6eVYj20DNnw2hjxJ646gWJl0f6YTRnt58JXpK0nn4v6C/RM2fDiGN7xBJ+mOO2h54R+d3bJuJXfKfi+t42ov8hC7p+C64/cwmMw7S1oC8VGH6Dqba4HhzFYVVwPfIlNuKFv2CxhQ/cq38km7499GDbEVqSlth6/HWxP7cfJTzJkD+4kK0+7l+qB9lHaPeIpTXc9tBzBJ73sHEpru9hU6fzIQu6J6wKhQTmCYk+X8cB83kuS/0UB+/nHpm+nj7Xw3zNq0WMsUdqKcbOaMkXlQ+cnb3m6NDqR9ceeqre0Z+19xpj4jwXx3VPXdyLpf+dhT30VL0jP+8VS0vc9tIzMst72bYmru9lm+t9qIKujetQzCUoioPm6SL5198okFUT4POi5s/u6adFrhcV6ez0aI3mTelC5qO01YfdYYOZeHbctMb/SESFy5+1fq2es3CnIBCTXYxqr5wRsWUuDFjD+WEuz5q3Vg8yz9CujSXFobh2OWoNt7V6zsD0lntYE9e3tGdK18MVdIFQ0OvQ+I8nJg4O4/y5lf9WKDk4mXl+CCXPnzsHaA5r1fKXh9BT7WBuLTyd7LP3uQ+nOMO3K+jiw7i4TjFdo+dMrGvMiVG9KNLi1o3XcyGG9Vqjp645+vOaWJor6Nr/Gm5r9Byd5T3sXxPX97DLdZ6qoPvGch8CIRACIRACj0QgBf2RvJ29hkAIhEAInJZACvppXZuNhUAIhEAIPBKBFPRH8nb2GgIhEAIhcFoCKeindW02FgIhEAIh8EgEUtAfydvZawiEQAiEwGkJpKCf1rXZWAiEQAiEwCMRSEF/JG9nryEQAiEQAqclkII+41q+oIEvepmZOjnEl5d0X8AxuSgDIRACIRACIbCRQAr6DLC5gs63ZS0V6hT0GcAvGMI3c9/ytiR+SYaPS8/UN9It6TnSeP0mMjHYelUZYjf1UszcR2Dr8TT1zYRLrPkmOTHtYp+8xPgjcF1itmbcfSN2HbfK/pKzscaWl8xJQb+QHgdnqaBfKD7LZgjoIPmBkw+2JkjJ8K+E1WFdklHXzJh4yCGKKzHNV11uSVzI8AI+5R/O0B9//PEvfx4S3oLRe8RsF6MuF57uL7H3s7JgZob/R0AMPT8orv0fGOJscFZGAZeCfqEnODyjOfTC7RxmWVcw8IUnsrkN1cPJXK2f86cS6pmTY01i4tIVEXh1bTd/irdYK2nq30o4M9c9Ylasxaty8pj0e3zD2dBYrvUEOpZ1dXde6pxbPx+moPNGxD+UwkdKNYlzeBjvfuvSwWC8+3jFx+t67PD13PthU0DQr7YeKOmosuX8GiRVn+u4dbCMoK87aPjL36jnbJ0rMDWekENinBpn3lFb9ieWXB57NX6ZU1vkEKfIqNw4p5Lb+bTKPfJzt7+tMav9w5I4hyE+6/Rondgz58gcb2U7MVxjturXOL6oY/d6PlxBV3EkOAloBbKu+qw+zfXCORX0nQMkzz9m8Tk4HVt8zO85hNjIGP2+nj7m8uxzdE+yRNYjtdo/hwgf6Fn/Ut1aLqzzA0vsIBummsOLWR1jzhlaYo3YU6t9f/78+Zmrx+Ca/Wo+3JDp68QV/hpf6zuXcZT7PWLW90pMel7TOD50X+FHWLuc3P+bAFwVt0tnvWP9b2n3eTpcQfdgFTI5gWBVWx1B8mYdAd4lmeqCaxZ06fKDruea2Oq45hBIa+yv+znDM0z0SY0OHhzUv6UowJGio7j566+/fosfZyYdNYn6+JHv4cEnYJwj+rX3NRfnDV/IP2LMGZWMGuf1eY2eI83ZO2bxjeSKrfuGF1Pimph2/kdidy9bxXTqrNcYv5eNnd5TFHQCXEFbAxf43k+SIej13F3XLugcPunHTj+cHFjs9HbK5m4fZ+rDd/icvYlV7WNsbasYcf51XeejOueoz+xNMeaxRUH3vrk9ah7FnHn4TG0nr1vD2jO07L/G59aY7earb6rwiB1+lQ251hOAW80H9NcYXy/5ujNPUdAp1mq5BxsOqI5hnMPWBfy1C7pswOZOV3eAsftRW38JgsGSj5k313b86/yuGNU5R35WLNaio3OxJXl1MevcOG/+cur3Vf+ReWL7XjFLrkCu2qW43eo/l/3I9x6zcCDPbDkPrL1Ve+iCrmD1t1OShVouJZg5B3SOY+3SYekSIGtp5+RrjnT8+eefTx8+fPjtZYREMPUygo5Ha8XdfTrlY/WrWCwVibWcq96zca8ciN0afyQ2sa1jU2fQz2nlpjXuzzp+hucaO1MxC7+Oh9ZUjlWus0KW2lzbCFSuxHznl22Srzv7cAXd3+Y7uAQx8+ocHQrGaD0p4TjGvPV5cgsJjzmuSwFBv7fq9wt99aAyhyTrMlwP8x6tdb5TPPB1V9AZE9eOPX5x7tV3Z2Re463GvPbsbLrxpTNYuWn+lA/r3CM/r4lZ2E3x8LhVbNbYXqPjyAyvYbvHM+e9nnX8wri33Rm4hp1rZB6uoI8Ebw3gzAmBEAiBEAiBWxBIQb8F5egIgRAIgRAIgSsTSEG/MuCID4EQCIEQCIFbEDhMQb8FjOgIgRAIgRAIgaMSSEE/qudidwiEQAiEQAgYgRR0g5HbEAiBEAiBEDgqgRT0o3oudodACIRACISAEUhBNxi5DYEQCIEQCIGjEkhBP6rnYncIhEAIhEAIGIEUdIOR2xAIgRAIgRA4KoEU9KN6LnaHQAiEQAiEgBFIQTcYuQ2BEAiBEAiBoxJIQT+q52J3CIRACIRACBiBFHSDkdsQCIEQCIEQOCqBFPSjei52h0AIhEAIhIARSEE3GLkNgRAIgRAIgaMSSEE/qudidwiEQAiEQAgYgRR0g5HbEAiBEAiBEDgqgRT0o3oudodACIRACISAEUhBNxi5DYEQCIEQCIGjEkhBP6rnYncIhEAIhEAIGIEUdIOR2xAIgRAIgRA4KoEU9KN6LnaHQAiEQAiEgBFIQTcYuQ2BEAiBEAiBoxJIQT+q52J3CIRACIRACBiBFHSDkdsQCIEQCIEQOCqBFPSjei52h0AIhEAIhIARSEE3GLkNgRAIgRAIgaMSSEE/qudidwiEwKEIvH///unVq1fPP69fv3769u3bZvu/fv36S4ZkzclB36dPnzbrebQFsMI/at+9e/f08+fPXyjkL/H2OfLHSFcK+kjeiC0hEAKnJKCC8fbt26cfP348709Fdq4YdxBUPOqaKpd1zH3z5s1TCjpUpltx1M/URTH3An6JD6fk79Wfgr4XycgJgRAIgYZAVwz0m59+A5wrIlWUCoi/FGhcBab26aVBfV++fHnWkYJeSf7+vFTQeUHyT1V0rxcm7/td8m17DlfQBd4/8uiCVX0+p350QsD7HN68GHO59NU5enZd9XD6mHTVcbmaw44tvIFz4Kds72TdNnSiLQRCYA0B5YladMkN9XzPySMPsYbc4blK65UbNEfz1dbxOR2POiZmczmVfIwf8cXcmnuwPFRBV2BSVAVL9yqE3ifAFMUOKIdgyhE4yg8Bfejh2Ys0cpmj1mUw7n2aIxne5zZrvO5FfQSVz819CITAmAR0vinCFAY9f/z48aKzrNylvFFzg3avPMNvjeiayi9j0rqPVTAV1ym2skwsmaNcPNp1qIJe4VFYAUvR5LnO17Mcx+HqxpHph4A+5PLsLwVLh6eO8+wyqj3McVs035/rmjyHQAiMRUDnVTlHH4GrGJBH1L/l5Zy8Q/7SeskjH9R8UZ/HojK2Ncqz/sIES/wlH4r9XP6+xw4PVdAp2Lwh0XJA/O10CqYcMOcEDg2HRHLoQw/PPqfqYw420rKGAOG5rudZOgmiNftjXdoQCIExCJD8KcRYpbNf+xjr2m6++ig8dXxtjul0PXof+VtMdXkehg1+VTvKdZiCXgELIH0AXVPwblHQOUj+4kAfAVKfpwLC96i1LnNqTfpDIATGIcAvIuQpWbb2/PsuutxFzvvvf//7/HLALw5d6/pdbu5/J1B9Vl+WtMJz8+8S7tNz6IKuAFfgEqgcEn6j7ZBqrtZQWOscZFA4cZrroW+tDOnQ3KqXPuyvtvCsefpzMf5sjP60IRACxyCgfOJ5SWfan9kF+akb0xp+G2d+lUu/WnKZ1uVaTwBu/ukJfvFc3fljvZbrzDxMQdf2BVBFkR/9pRJBd8iaR6FnnjtG47x9Ma7WZdRx/vcP5iwVdOnQXJcvm/RTD1edVw+sZKFP63OFQAgck4Dnpa5ga1fkg6nxmgNrbnMyFKaac3xO7v958fF83THDN8yb8tE9mR6qoN8T1D11U9AVULlCIARCIARCoCOQgt5RGaiPt+z8dj6QU2JKCIRACAxIIAV9QKfIJH4r18c7KeaDOilmhUAIhMBABFLQB3JGTAmBEAiBEAiBSwmkoF9KLutCIARCIARCYCACKegDOSOmhEAIhEAIhMClBFLQLyWXdSEQAiEQAiEwEIEU9IGcEVNCIARCIARC4FICKeiXksu6EAiBEAiBEBiIQAr6QM6IKesJ+Ldudd+ut1aSf/NWJ2cvPWvtufe8+i2JW/+XSf/fLflGLbXdN29VXd2ce/PYU/9LY6nygq9/4RTfW8GY2q0+3HPPR5HlvoFd/Ra+jr+zH2GvKegjeCE2bCKgw+dfu6hC0BXjOaEkvnpofc0eelze6PckLAorxXlLQWDNUqK7xGej85uzb49Ykn/m/j0HYtr9VX06Z+Mjj4mZc6ss4OhxPWIMp6BXz+V5aALdweoS2dImdBjnivleepbsGGlcCa0yUQLb8rK0pqCL7VxhGonJHrbsFUtL3GDPC5ls52x43x57OpuMpYLenYMlf9yD0RAFXbCUSPSPrejjjnqvoOQSeD4SUdsFqvp8jicpjen5+/fvz7/laV5NWBwCl9Hpwaapttrhb4Aaq3olpyZVkoHbonuXNaX/jP2KFf/tXHuEs/t5bu/4d86ne+iZs2G0sY4JBULxJh5rLtbMzRf3tb5ao3P0OXvF0poCwlmAv/JEPS+j87qHfeI0l1M5H7AkzufW3GMfwxR0ihQFTAf+77///tebvIKVQBUs3ddkI8BdoQQuAe9ztIYEg+PcUdiktWsv2ebzqwwCwufQxx55Zk5n21p7zjJPLKqv9KyXQQ7b0l7h+vnz518vdYoj5Gr9HnqW7BhpHCbEHmcLRsTgks3IEU9+nKvW62zxwxw/j0s6jja+VyyRQ2Cm1vMUXHxeN868tP8QECfnOhWP8iXzOCv/SLn/3TAFHYAKRj6O8/sOFckDsAQyz90aOQRdjGs+xUD3dVzz/FCybktLMZYcrirT7dCcbv91DbIepWX/+idtdbDwtfrx4RIL4sbn4x8S4B56luwYaRwm/FPBFGH6xeOSi/XIkwySJ75T3xb/XWLHPddcK5bId8QsHDkXsPc4vyeHI+kWU68D5AdYKnbF2dmPsL9DFXQCmDckWhJDVwAr5KXEIVk4zdcurfO5uucwYSOt5HCxH+kkYHwcGfQxZ7QgYj+3aDlIXiCkV4xq35Q9cCVumOe+30MPco/QEluKU+cyxWrLniTPk6Pit8bwHnq22HTLudeMJcU9+apjSF/lfcv9H1EX3Mi98iGc2Q9+VTvKdZiCXgELIH0AvXZBXyVI0fkAAAjLSURBVFswSI5+iOgjQAgAkltnO/vjZUCty0TGI7X+EsS+p9gyXtup+Z4c99BT9Y7+rNiqMd4lsq37cK5aq+eqp+O9Vc+o87u9TcXg1j24z6SHTzddDjnG+3I/T6D6rItZ8jP1Z17ibUYPXdAVqP4bBYekvkk5yppcfEz3OEmyuapz6Z9qscNlSK9sVeuXZP/5559PHz58+K1Yd0Hkax/1Xlzdx1M+hXktHuJWCxV+d/+s1XMWPxDnMOiYaK/EdxfPlUWVqXHkeiIU685PVd5Rn9fGkpiIq8f31J6ZC0e4ShdXx5+xtD0B4tvjsbLWSp0T/+Spl3bb3sMUdAAq2PnRX4QSdAIadApo5qh1x8gJS4eFg+Eyqg50TbUEADJkk35IlqwjeLrAYAwZtEv2I/vMrft4iodYi5n735kwDtfqG81do8dlHv2eAjDHxOOyMqvru7gWozpvykdH5+n2r4kl8kYX04zhm27OHrnLbX6Ee49n2Na4Foc1/O/Na4iCfm8Io+pXAqiJjuDTWK4QCIEQCIEQgEAKOiQGbLuCzm823RvkgFuISSEQAiEQAjcikIJ+I9CXqOk+PtNHQvroJ1cIhEAIhEAIOIEUdKeR+xAIgRAIgRA4KIEU9IM6LmaHQAiEQAiEgBNIQXcauQ+BEAiBEAiBgxJIQT+o42J2CIRACIRACDiBFHSnkfsQCIEQCIEQOCiBmxZ0/tZ294UIS/xYe4//XQvd+dvlS17KeAiEQAiEwL0InK6g88Urexb+FPR7hee0Xv/WralvI5te/f8ja2Uw7xFe6PieA74xS3vfelUZc/+rJXMvecnfate95xNH4nFpzNZvK6tyyH/4T+0lPrw3q1vrd9/Arn6pF7HKuNrRcsJNC/pLnERRXSrUBPTSvC22oHs0523Zw5nm6vB5AZCva2Jb2q9k+IGVb6sMkqe+YlhjZ/c/CYuzQ9xvKQjIcFZT/uGs/vHHH//y55Lvjji+R8x2Mepy4en+wh/49IjsbmGzmDm3qhOOa+K6rr3lcwr6CtokNnfmimWZcgUC3cHqEtmcasmY+lepSHzyuQq+2k7nnPyjjimh+UuO9tEVkbn9dfOneIu19OnfYPcXtDn5Rxzr4mdrzGrf4lU5iTd95CliWGvQ431HZHhtm5cK+pa4vratc/JnC7oCUf8SmAKlXhxGBYwuAZn6KIKgYrwmDWRXGZrPb00EK/8gC7K0Rhfj9HtLwKNHtvt4F+ydLXLqlqvqwVbJ0Bh7c5ma43xIBm6v7l2Wrz/7vScw9gpn58ZY184VmI4rPtjq/073qH2cUT8LfqbW7h05nDlkVK7OtPPpqJwusavb39aYlV5YEucwdJ8hF3+JO764xPZHWSNONUZ972vj2tfc4362oCuAVNAVOPVyALonyDSPQCOofK0Czucypn4PPK31gkcwq5ghV3rqb1qA9yBHh9qqB7k+v+6HOeh1eVP3musyYUIfMnmWHPrQwzNz2Ntc4E3Zc5Z+sSB+4KFnveh5/Mztl3XOEf8g29czhl987Cz3xBp7VKuz9vnz52euxODa/Wo+L6HI9LViD3+Nr/WdyzjK/R4x63sVN7H1/OjjxKvmwNjHc/87AZgSs1Nsl+L6d8m37Vks6DpoOnAkQQ62AOhewVOLqrag8S6YPLh9q3V+TTA8o19r6fOEUe10Hd18jbtN3X6m1rnspfvOLter9TWxdbbUNUt6zzbO/vUxrQ4fvlf/lqKATznAKuR//fXXr5cF50aCRJePneUeHuIqFrzY0C++ay7iHF+IWS0sNc7r8xo9R5qzd8ziG8kVW/cNfWKK7/DFkZjd21bVIy/qa+L63jZL/2xBZxMKEiU1/eUVJT0FioJKQUOyIzF6u6WgS4cHnmQ7UILTg5c+zeVym+mjZb7byD2HRLLcDq1lnetB5lTLGuTTuv2wk9zObmSwhjkd1yk7ztYvVmKJv9ifGNU+xta24gprX+N+8v4z3RNbYutxTgx639y+Na+eH3ymtpPXrZnTcbQx9l/jc2vMdvPVR57s2NL3yDnjkniBG/mgi1H8qnaUa7agy0iSnDamt3cVdG2Aj+KV7Lrf0Kc22AWl5qqfoqeWIEVOBax++hwoiQlHsH5qvo/rvttPp6eu82ds8ENEX7VLc/Qzp9e5uEzX+Sj3XXGdYruFScef9Z1Oxs7UKrZq0dHZqgV6bs/d+fbzI3kez/W+6p/TdZSxLn4uiVlyhe/b49bvfU63zsdz/zuB6rOluP5dwn16Fgu6NqIirqDQwdSB/PDhw/PB1zOBufYgXgqGpKD1XPR5QddYl5hYo7G5BIVM9PCsxFP1ILO2MJEuLsmTDOTSr8DRy5GY+nyNa+5arsh7hLb6UJw6n8J8iSGHt/oGloyv9T/rjtayTzgQ+zyzH+K7i2cxqmdF6+sLOrLUak3nP59z9Pu1MQu/jkfH0eXiL88j1adH53gL+4lvzxv4RS1X5w/G7tUuFnQ2wqEmaHyzANBB9h82T1D5mO79kKOnzql6eRYwbEEPEOlHVj0cCnjGaF2u2ysb//777+fCWvWgr2vrfqRTP65H62DnLJDHGDbS1v0w/5Fa9+EUD7EWM49VGDGm8S3sNV+6z3p57GuvNV61b4/LbrzG/pR/YKj5S3OYe+R2TczCboqHx20X2zX3aY5k5pom4PEsXlNxj2+YM+WjaU3XH1ks6Nc3YfpvxQtgl2xvYdMIOpQAajEi+M5cVEZgHxtCIARC4GgEhi7oKlojvgXdysldQec3qO43o1vZFT0hEAIhEALjERiioAtL/ShJH2vU307Hw3ddi7qPz8QlH6Fdl3ukh0AIhMARCQxT0I8ILzaHQAiEQAiEwCgEUtBH8UTsCIEQCIEQCIEXEEhBfwG8LA2BEAiBEAiBUQikoI/iidgRAiEQAiEQAi8gkIL+AnhZGgIhEAIhEAKjEEhBH8UTsSMEQiAEQiAEXkAgBf0F8LI0BEIgBEIgBEYhkII+iidiRwiEQAiEQAi8gMD/AeBGopxh7mM1AAAAAElFTkSuQmCC)\n","\n"]},{"cell_type":"code","metadata":{"id":"05-mAOF6ol-0","colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"status":"ok","timestamp":1620187468464,"user_tz":-120,"elapsed":103699,"user":{"displayName":"Christian Kasim Loan","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GjqAD-ircKP-s5Eh6JSdkDggDczfqQbJGU_IRb4Hw=s64","userId":"14469489166467359317"}},"outputId":"c1058df3-e272-4d87-f61e-0589cfd22b84"},"source":["!wget https://setup.johnsnowlabs.com/nlu/colab.sh -O - | bash\n","import nlu"],"execution_count":null,"outputs":[{"output_type":"stream","text":["--2021-05-05 04:02:45-- https://raw.githubusercontent.com/JohnSnowLabs/nlu/master/scripts/colab_setup.sh\n","Resolving raw.githubusercontent.com (raw.githubusercontent.com)... 185.199.108.133, 185.199.109.133, 185.199.110.133, ...\n","Connecting to raw.githubusercontent.com (raw.githubusercontent.com)|185.199.108.133|:443... connected.\n","HTTP request sent, awaiting response... 200 OK\n","Length: 1671 (1.6K) [text/plain]\n","Saving to: ‘STDOUT’\n","\n","\r- 0%[ ] 0 --.-KB/s \r- 100%[===================>] 1.63K --.-KB/s in 0s \n","\n","2021-05-05 04:02:45 (39.1 MB/s) - written to stdout [1671/1671]\n","\n","Installing NLU 3.0.0 with PySpark 3.0.2 and Spark NLP 3.0.1 for Google Colab ...\n","\u001b[K |████████████████████████████████| 204.8MB 73kB/s \n","\u001b[K |████████████████████████████████| 153kB 46.7MB/s \n","\u001b[K |████████████████████████████████| 204kB 21.9MB/s \n","\u001b[K |████████████████████████████████| 204kB 51.4MB/s \n","\u001b[?25h Building wheel for pyspark (setup.py) ... \u001b[?25l\u001b[?25hdone\n"],"name":"stdout"}]},{"cell_type":"markdown","metadata":{"id":"f4KkTfnR5Ugg"},"source":["# 2. Download appple twitter Sentiment dataset \n","https://www.kaggle.com/seriousran/appletwittersentimenttexts\n","\n","this dataset contains tweets made towards apple and today we are going to train our model to predict whether the tweet contains sentiment!\n"]},{"cell_type":"code","metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"OrVb5ZMvvrQD","executionInfo":{"status":"ok","timestamp":1620187468785,"user_tz":-120,"elapsed":104015,"user":{"displayName":"Christian Kasim Loan","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GjqAD-ircKP-s5Eh6JSdkDggDczfqQbJGU_IRb4Hw=s64","userId":"14469489166467359317"}},"outputId":"c6049d62-5149-4669-8f6e-8d4f0f0b7c63"},"source":["! wget http://ckl-it.de/wp-content/uploads/2021/01/apple-twitter-sentiment-texts.csv\n"],"execution_count":null,"outputs":[{"output_type":"stream","text":["--2021-05-05 04:04:28-- http://ckl-it.de/wp-content/uploads/2021/01/apple-twitter-sentiment-texts.csv\n","Resolving ckl-it.de (ckl-it.de)... 217.160.0.108, 2001:8d8:100f:f000::209\n","Connecting to ckl-it.de (ckl-it.de)|217.160.0.108|:80... connected.\n","HTTP request sent, awaiting response... 200 OK\n","Length: 31678 (31K) [text/csv]\n","Saving to: ‘apple-twitter-sentiment-texts.csv’\n","\n","apple-twitter-senti 100%[===================>] 30.94K --.-KB/s in 0.1s \n","\n","2021-05-05 04:04:28 (250 KB/s) - ‘apple-twitter-sentiment-texts.csv’ saved [31678/31678]\n","\n"],"name":"stdout"}]},{"cell_type":"code","metadata":{"colab":{"base_uri":"https://localhost:8080/","height":419},"id":"y4xSRWIhwT28","executionInfo":{"status":"ok","timestamp":1620187470342,"user_tz":-120,"elapsed":105566,"user":{"displayName":"Christian Kasim Loan","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GjqAD-ircKP-s5Eh6JSdkDggDczfqQbJGU_IRb4Hw=s64","userId":"14469489166467359317"}},"outputId":"dcd0fde1-7df8-462f-bf4f-85174437b1a8"},"source":["import pandas as pd\n","train_path = '/content/apple-twitter-sentiment-texts.csv'\n","\n","train_df = pd.read_csv(train_path)\n","# the text data to use for classification should be in a column named 'text'\n","# the label column must have name 'y' name be of type str\n","columns=['text','y']\n","train_df = train_df[columns]\n","train_df = train_df[~train_df[\"y\"].isin([\"neuteral\"])]\n","from sklearn.model_selection import train_test_split\n","\n","train_df, test_df = train_test_split(train_df, test_size=0.2)\n","train_df"],"execution_count":null,"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"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n","
texty
36Theyre not RT @Naivana_: You gotta be kidding ...negative
7Thank you @Apple for fixing the #Swift sourcek...positive
272Washed my earphones by accident, still works. ...positive
146@AppleOfficialll @apple I can't say enough abo...positive
237@OneRepublic @Apple So amazingpositive
.........
247Got to hear about the new patent by apple ... ...positive
157fuck you @applenegative
93#apple earns more #profit in on quarter than #...positive
165This is why I moved over to @Apple... http://t...positive
52I don't know what you're trying to do @apple b...negative
\n","

228 rows × 2 columns

\n","
"],"text/plain":[" text y\n","36 Theyre not RT @Naivana_: You gotta be kidding ... negative\n","7 Thank you @Apple for fixing the #Swift sourcek... positive\n","272 Washed my earphones by accident, still works. ... positive\n","146 @AppleOfficialll @apple I can't say enough abo... positive\n","237 @OneRepublic @Apple So amazing positive\n",".. ... ...\n","247 Got to hear about the new patent by apple ... ... positive\n","157 fuck you @apple negative\n","93 #apple earns more #profit in on quarter than #... positive\n","165 This is why I moved over to @Apple... http://t... positive\n","52 I don't know what you're trying to do @apple b... negative\n","\n","[228 rows x 2 columns]"]},"metadata":{"tags":[]},"execution_count":3}]},{"cell_type":"markdown","metadata":{"id":"0296Om2C5anY"},"source":["# 3. Train Deep Learning Classifier using nlu.load('train.sentiment')\n","\n","You dataset label column should be named 'y' and the feature column with text data should be named 'text'"]},{"cell_type":"code","metadata":{"colab":{"base_uri":"https://localhost:8080/","height":1000},"id":"3ZIPkRkWftBG","executionInfo":{"status":"ok","timestamp":1620188334902,"user_tz":-120,"elapsed":10389,"user":{"displayName":"Christian Kasim Loan","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GjqAD-ircKP-s5Eh6JSdkDggDczfqQbJGU_IRb4Hw=s64","userId":"14469489166467359317"}},"outputId":"5fb3d813-68c4-4fc1-fd1a-d19b98dd828c"},"source":["from sklearn.metrics import classification_report\n","import nlu \n","# load a trainable pipeline by specifying the train. prefix and fit it on a datset with label and text columns\n","# by default the Universal Sentence Encoder (USE) Sentence embeddings are used for generation\n","trainable_pipe = nlu.load('train.sentiment')\n","fitted_pipe = trainable_pipe.fit(train_df.iloc[:50])\n","\n","# predict with the trainable pipeline on dataset and get predictions\n","preds = fitted_pipe.predict(train_df.iloc[:50],output_level='document')\n","#sentence detector that is part of the pipe generates sone NaNs. lets drop them first\n","preds.dropna(inplace=True)\n","print(classification_report(preds['y'], preds['sentiment']))\n","\n","preds"],"execution_count":null,"outputs":[{"output_type":"stream","text":["tfhub_use download started this may take some time.\n","Approximate size to download 923.7 MB\n","[OK!]\n","sentence_detector_dl download started this may take some time.\n","Approximate size to download 354.6 KB\n","[OK!]\n"," precision recall f1-score support\n","\n"," negative 0.00 0.00 0.00 23.0\n"," neutral 0.00 0.00 0.00 0.0\n"," positive 0.00 0.00 0.00 27.0\n","\n"," accuracy 0.00 50.0\n"," macro avg 0.00 0.00 0.00 50.0\n","weighted avg 0.00 0.00 0.00 50.0\n","\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"," \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"," \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"," \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"," \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"," \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"," \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"," \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"," \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"," \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"," \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"," \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","
textsentence_embedding_usesentenceyorigin_indexdocumenttrained_sentimenttrained_sentiment_confidence
0Theyre not RT @Naivana_: You gotta be kidding ...[0.053627125918865204, 0.03388773649930954, 0....[Theyre not RT @Naivana_:, You gotta be kiddi...negative36Theyre not RT @Naivana_: You gotta be kidding ...neutral0.519284
1Thank you @Apple for fixing the #Swift sourcek...[0.01400269940495491, 0.04662228375673294, 0.0...[Thank you @Apple for fixing the #Swift source...positive7Thank you @Apple for fixing the #Swift sourcek...neutral0.526175
2Washed my earphones by accident, still works. ...[0.028794147074222565, 0.060343481600284576, -...[Washed my earphones by accident, still works....positive272Washed my earphones by accident, still works. ...neutral0.546108
3@AppleOfficialll @apple I can't say enough abo...[0.04390808567404747, 0.0024722537491470575, -...[@AppleOfficialll @apple I can't say enough ab...positive146@AppleOfficialll @apple I can't say enough abo...neutral0.535401
4@OneRepublic @Apple So amazing[-0.0420607253909111, 0.05555792152881622, -0....[@OneRepublic @Apple So amazing]positive237@OneRepublic @Apple So amazingneutral0.562668
5The 10 biggest differences between #Mac and #P...[0.046186886727809906, 0.0493854284286499, 0.0...[The 10 biggest differences between #Mac and #...positive213The 10 biggest differences between #Mac and #P...neutral0.541398
6@SamJam Agreed--have to give props to @Apple f...[0.06067856401205063, -0.014465369284152985, -...[@SamJam Agreed--have to give props to @Apple ...positive77@SamJam Agreed--have to give props to @Apple f...neutral0.553645
7@OneRepublic @Apple that looks amazing, don't ...[0.016945000737905502, -0.019095521420240402, ...[@OneRepublic @Apple that looks amazing, don't...positive56@OneRepublic @Apple that looks amazing, don't ...neutral0.548541
8Finally! Brooklyn Is Getting Its Own #Apple St...[0.06617175042629242, -0.018538057804107666, -...[Finally!, Brooklyn Is Getting Its Own #Apple...positive234Finally! Brooklyn Is Getting Its Own #Apple St...neutral0.531661
9RT @ehsonakbary: THE WORLD'S FIRST MURDER VIA ...[0.07017797976732254, 0.03393903002142906, -0....[RT @ehsonakbary: THE WORLD'S FIRST MURDER VIA...negative103RT @ehsonakbary: THE WORLD'S FIRST MURDER VIA ...neutral0.541381
10@SwiftKey @Apple Oh In wish you guys would por...[0.04137858748435974, -0.03665991127490997, -0...[@SwiftKey @Apple Oh In wish you guys would po...negative208@SwiftKey @Apple Oh In wish you guys would por...neutral0.532717
11The king of the phablets! Apple's iPhone 6 plu...[0.07199912518262863, 0.0021514107938855886, -...[The king of the phablets!, Apple's iPhone 6 ...positive250The king of the phablets! Apple's iPhone 6 plu...neutral0.556155
12iPhone6 fell 2 ft. Screen shattered like it wa...[0.0498758926987648, 0.02919364534318447, -0.0...[iPhone6 fell 2 ft., Screen shattered like it ...negative263iPhone6 fell 2 ft. Screen shattered like it wa...neutral0.525769
13Shockingly, iMessage on the desktop is fucked ...[0.056961141526699066, -0.02297591045498848, -...[Shockingly, iMessage on the desktop is fucked...negative107Shockingly, iMessage on the desktop is fucked ...neutral0.515020
14Yeeaaayyy....awesome OS X Yosemite 10.10.1 roc...[0.03625739365816116, 0.0035043705720454454, -...[Yeeaaayyy., ., ., .awesome OS X Yosemite 10.1...positive285Yeeaaayyy....awesome OS X Yosemite 10.10.1 roc...neutral0.542655
15@OneRepublic @Apple Thanks for sharing pics. A...[0.020150689408183098, -0.03949593007564545, 0...[@OneRepublic @Apple Thanks for sharing pics.,...positive138@OneRepublic @Apple Thanks for sharing pics. A...neutral0.568121
16@apple @iBooks is awesome. Thank You![0.0218979399651289, 0.005902431905269623, -0....[@apple @iBooks is awesome., Thank You!]positive198@apple @iBooks is awesome. Thank You!neutral0.559235
17Why I Hate Apple - http://t.co/IbpyJXaOuW #AAP...[0.055701617151498795, 0.04886789247393608, -0...[Why I Hate Apple - http://t.co/IbpyJXaOuW #AA...negative109Why I Hate Apple - http://t.co/IbpyJXaOuW #AAP...neutral0.525435
18yo @Apple , why yall make it so hard to grip t...[0.07655678689479828, 0.0038530321326106787, -...[yo @Apple , why yall make it so hard to grip ...negative225yo @Apple , why yall make it so hard to grip t...neutral0.526321
19@apple Why is your NYC Grand Central store so ...[0.06858145445585251, 0.052669648081064224, 0....[@apple Why is your NYC Grand Central store so...negative131@apple Why is your NYC Grand Central store so ...neutral0.518131
20Love the @Apple is supporting #HourOfCode with...[0.01483983639627695, -0.00843955110758543, -0...[Love the @Apple is supporting #HourOfCode wit...positive219Love the @Apple is supporting #HourOfCode with...neutral0.543223
21Companies i admire : @3QDigital @vaynermedia @...[0.015711167827248573, 0.064913809299469, 0.01...[Companies i admire : @3QDigital @vaynermedia ...positive19Companies i admire : @3QDigital @vaynermedia @...neutral0.539861
22These Damn @Apple Commercials Are Getting Wors...[0.00820611510425806, 0.004215271212160587, -0...[These Damn @Apple Commercials Are Getting Wor...negative142These Damn @Apple Commercials Are Getting Wors...neutral0.513193
23Free s/o @apple for this nice iPad[0.05512142553925514, 0.011973769403994083, -0...[Free s/o @apple for this nice iPad]positive57Free s/o @apple for this nice iPadneutral0.543708
24if I tweet about NANDOS my phone puts it in ca...[0.021839885041117668, 0.07290177792310715, -0...[if I tweet about NANDOS my phone puts it in c...positive140if I tweet about NANDOS my phone puts it in ca...neutral0.538120
25RT @saigeist: the most offensive thing is the ...[0.043079257011413574, -0.045617833733558655, ...[RT @saigeist: the most offensive thing is the...negative178RT @saigeist: the most offensive thing is the ...neutral0.512527
26.@tim_cook That rage when dealing @Apple Geniu...[0.05030369386076927, 0.023012423887848854, -0...[., @tim_cook That rage when dealing @Apple Ge...negative96.@tim_cook That rage when dealing @Apple Geniu...neutral0.517721
27I hate my MacBook now. Fuck this update and fu...[0.04070044681429863, 0.02998330444097519, 0.0...[I hate my MacBook now., Fuck this update and...negative155I hate my MacBook now. Fuck this update and fu...neutral0.510436
28Kantar: iPhone 6 helps Apple gain share over A...[0.06512415409088135, -0.009421378374099731, -...[Kantar: iPhone 6 helps Apple gain share over ...positive41Kantar: iPhone 6 helps Apple gain share over A...neutral0.550157
29@tehhGOAT @Apple do you by accident have me bl...[-0.019428884610533714, 0.055587127804756165, ...[@tehhGOAT @Apple do you by accident have me b...negative17@tehhGOAT @Apple do you by accident have me bl...neutral0.506774
30@fullcircleone ThanX! Big @Apple ThanX goes 2 ...[0.0020813194569200277, -0.025028454139828682,...[@fullcircleone ThanX!, Big @Apple ThanX goes...positive194@fullcircleone ThanX! Big @Apple ThanX goes 2 ...neutral0.553299
31my phone keeps restarting on its own @apple do...[-0.0074605816043913364, 0.026783859357237816,...[my phone keeps restarting on its own @apple d...negative135my phone keeps restarting on its own @apple do...neutral0.513831
32my dad called now my musics arent playing jesu...[0.008138233795762062, -0.026052597910165787, ...[my dad called now my musics arent playing jes...negative187my dad called now my musics arent playing jesu...neutral0.519269
33@apple #greatservice thanks for helping me out...[0.02643176168203354, 0.015369059517979622, -0...[@apple #greatservice thanks for helping me ou...positive201@apple #greatservice thanks for helping me out...neutral0.540207
34@Apple fix addis' phone so we can text each ot...[0.041290853172540665, 0.037915393710136414, -...[@Apple fix addis' phone so we can text each o...negative261@Apple fix addis' phone so we can text each ot...neutral0.521058
35Sorry @samsung but I will be taking my smartph...[0.07281249761581421, 0.0376746729016304, 0.01...[Sorry @samsung but I will be taking my smartp...positive5Sorry @samsung but I will be taking my smartph...neutral0.554886
36@LittleWordBites @TravlandLeisure @Apple &gt;...[0.0581418015062809, -0.042348094284534454, -0...[@LittleWordBites @TravlandLeisure @Apple &gt;...positive195@LittleWordBites @TravlandLeisure @Apple &gt; ...neutral0.571530
37RT @_emilymahon: @nosheenh2oo9 @Apple this is ...[0.05870470777153969, 0.061276875436306, -0.02...[RT @_emilymahon: @nosheenh2oo9 @Apple this is...positive8RT @_emilymahon: @nosheenh2oo9 @Apple this is ...neutral0.546566
38@FaZeNikan @Apple lol iPhone,weak. Get on that...[0.07184943556785583, -0.025483926758170128, -...[@FaZeNikan @Apple lol iPhone,weak., Get on t...negative191@FaZeNikan @Apple lol iPhone,weak. Get on that...neutral0.526558
39RT @hsmoghul: My @apple autocorrect changes Mu...[0.031838081777095795, 0.009894482791423798, 0...[RT @hsmoghul:, My @apple autocorrect changes...positive149RT @hsmoghul: My @apple autocorrect changes Mu...neutral0.541348
40RT @_iamGambino: Thank you @Apple[0.018735762685537338, 0.07813401520252228, -0...[RT @_iamGambino: Thank you @Apple]positive212RT @_iamGambino: Thank you @Appleneutral0.538737
41@lanadelreystan KILL YOURSELF @apple[-0.018729694187641144, 0.05311402678489685, -...[@lanadelreystan KILL YOURSELF @apple]negative245@lanadelreystan KILL YOURSELF @appleneutral0.526904
42Great time had @Apple store on Friday. @Russel...[0.08689077943563461, 0.0028835677076131105, -...[Great time had @Apple store on Friday., @Rus...positive72Great time had @Apple store on Friday. @Russel...neutral0.557536
43@CharlesJMeyer @Apple @Appy_Geek Hasn't Apple ...[0.05127181485295296, 0.03388502821326256, -0....[@CharlesJMeyer @Apple @Appy_Geek Hasn't Apple...negative181@CharlesJMeyer @Apple @Appy_Geek Hasn't Apple ...neutral0.518989
44Left the hoos we 100% now got 50 iPhones are d...[0.009334878996014595, 0.06441717594861984, 0....[Left the hoos we 100% now got 50 iPhones are ...negative86Left the hoos we 100% now got 50 iPhones are d...neutral0.526055
45@apple why is it that your iPhone's alarm fail...[0.013754838146269321, 0.05925201624631882, -0...[@apple why is it that your iPhone's alarm fai...negative69@apple why is it that your iPhone's alarm fail...neutral0.515201
46Changing words that aren't even misspelled lik...[0.005594303365796804, 0.03357389196753502, -0...[Changing words that aren't even misspelled li...negative50Changing words that aren't even misspelled lik...neutral0.510925
47that yosemite update is so annoying i regret i...[0.011035434901714325, -0.046652231365442276, ...[that yosemite update is so annoying i regret ...negative159that yosemite update is so annoying i regret i...neutral0.512430
48Photo: Amazing customer service today @Apple. ...[0.0008898481610231102, 0.025655869394540787, ...[Photo: Amazing customer service today @Apple....positive256Photo: Amazing customer service today @Apple. ...neutral0.563457
49Awesome! @Apple invented peanut-butter-sandwic...[0.0439443401992321, 0.043788887560367584, -0....[Awesome!, @Apple invented peanut-butter-sandw...positive20Awesome! @Apple invented peanut-butter-sandwic...neutral0.547759
\n","
"],"text/plain":[" text ... trained_sentiment_confidence\n","0 Theyre not RT @Naivana_: You gotta be kidding ... ... 0.519284\n","1 Thank you @Apple for fixing the #Swift sourcek... ... 0.526175\n","2 Washed my earphones by accident, still works. ... ... 0.546108\n","3 @AppleOfficialll @apple I can't say enough abo... ... 0.535401\n","4 @OneRepublic @Apple So amazing ... 0.562668\n","5 The 10 biggest differences between #Mac and #P... ... 0.541398\n","6 @SamJam Agreed--have to give props to @Apple f... ... 0.553645\n","7 @OneRepublic @Apple that looks amazing, don't ... ... 0.548541\n","8 Finally! Brooklyn Is Getting Its Own #Apple St... ... 0.531661\n","9 RT @ehsonakbary: THE WORLD'S FIRST MURDER VIA ... ... 0.541381\n","10 @SwiftKey @Apple Oh In wish you guys would por... ... 0.532717\n","11 The king of the phablets! Apple's iPhone 6 plu... ... 0.556155\n","12 iPhone6 fell 2 ft. Screen shattered like it wa... ... 0.525769\n","13 Shockingly, iMessage on the desktop is fucked ... ... 0.515020\n","14 Yeeaaayyy....awesome OS X Yosemite 10.10.1 roc... ... 0.542655\n","15 @OneRepublic @Apple Thanks for sharing pics. A... ... 0.568121\n","16 @apple @iBooks is awesome. Thank You! ... 0.559235\n","17 Why I Hate Apple - http://t.co/IbpyJXaOuW #AAP... ... 0.525435\n","18 yo @Apple , why yall make it so hard to grip t... ... 0.526321\n","19 @apple Why is your NYC Grand Central store so ... ... 0.518131\n","20 Love the @Apple is supporting #HourOfCode with... ... 0.543223\n","21 Companies i admire : @3QDigital @vaynermedia @... ... 0.539861\n","22 These Damn @Apple Commercials Are Getting Wors... ... 0.513193\n","23 Free s/o @apple for this nice iPad ... 0.543708\n","24 if I tweet about NANDOS my phone puts it in ca... ... 0.538120\n","25 RT @saigeist: the most offensive thing is the ... ... 0.512527\n","26 .@tim_cook That rage when dealing @Apple Geniu... ... 0.517721\n","27 I hate my MacBook now. Fuck this update and fu... ... 0.510436\n","28 Kantar: iPhone 6 helps Apple gain share over A... ... 0.550157\n","29 @tehhGOAT @Apple do you by accident have me bl... ... 0.506774\n","30 @fullcircleone ThanX! Big @Apple ThanX goes 2 ... ... 0.553299\n","31 my phone keeps restarting on its own @apple do... ... 0.513831\n","32 my dad called now my musics arent playing jesu... ... 0.519269\n","33 @apple #greatservice thanks for helping me out... ... 0.540207\n","34 @Apple fix addis' phone so we can text each ot... ... 0.521058\n","35 Sorry @samsung but I will be taking my smartph... ... 0.554886\n","36 @LittleWordBites @TravlandLeisure @Apple >... ... 0.571530\n","37 RT @_emilymahon: @nosheenh2oo9 @Apple this is ... ... 0.546566\n","38 @FaZeNikan @Apple lol iPhone,weak. Get on that... ... 0.526558\n","39 RT @hsmoghul: My @apple autocorrect changes Mu... ... 0.541348\n","40 RT @_iamGambino: Thank you @Apple ... 0.538737\n","41 @lanadelreystan KILL YOURSELF @apple ... 0.526904\n","42 Great time had @Apple store on Friday. @Russel... ... 0.557536\n","43 @CharlesJMeyer @Apple @Appy_Geek Hasn't Apple ... ... 0.518989\n","44 Left the hoos we 100% now got 50 iPhones are d... ... 0.526055\n","45 @apple why is it that your iPhone's alarm fail... ... 0.515201\n","46 Changing words that aren't even misspelled lik... ... 0.510925\n","47 that yosemite update is so annoying i regret i... ... 0.512430\n","48 Photo: Amazing customer service today @Apple. ... ... 0.563457\n","49 Awesome! @Apple invented peanut-butter-sandwic... ... 0.547759\n","\n","[50 rows x 8 columns]"]},"metadata":{"tags":[]},"execution_count":6}]},{"cell_type":"markdown","metadata":{"id":"lVyOE2wV0fw_"},"source":["#4. Test the fitted pipe on new example"]},{"cell_type":"code","metadata":{"id":"qdCUg2MR0PD2","colab":{"base_uri":"https://localhost:8080/","height":80},"executionInfo":{"status":"ok","timestamp":1620188335247,"user_tz":-120,"elapsed":10456,"user":{"displayName":"Christian Kasim Loan","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GjqAD-ircKP-s5Eh6JSdkDggDczfqQbJGU_IRb4Hw=s64","userId":"14469489166467359317"}},"outputId":"31d1c18f-b30b-4507-cd1c-4aa13c0bec6d"},"source":["fitted_pipe.predict('I hate the newest update')"],"execution_count":null,"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","
sentence_embedding_usesentenceorigin_indexdocumenttrained_sentimenttrained_sentiment_confidence
0[-0.023322951048612595, -0.04157407209277153, ...[I hate the newest update]0I hate the newest updateneutral0.509875
\n","
"],"text/plain":[" sentence_embedding_use ... trained_sentiment_confidence\n","0 [-0.023322951048612595, -0.04157407209277153, ... ... 0.509875\n","\n","[1 rows x 6 columns]"]},"metadata":{"tags":[]},"execution_count":7}]},{"cell_type":"markdown","metadata":{"id":"xflpwrVjjBVD"},"source":["##5. Configure pipe training parameters"]},{"cell_type":"code","metadata":{"id":"UtsAUGTmOTms","colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"status":"ok","timestamp":1620188335248,"user_tz":-120,"elapsed":10187,"user":{"displayName":"Christian Kasim Loan","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GjqAD-ircKP-s5Eh6JSdkDggDczfqQbJGU_IRb4Hw=s64","userId":"14469489166467359317"}},"outputId":"f0702b13-6ac0-4a3d-87eb-57924a6760b1"},"source":["trainable_pipe.print_info()"],"execution_count":null,"outputs":[{"output_type":"stream","text":["The following parameters are configurable for this NLU pipeline (You can copy paste the examples) :\n",">>> pipe['sentiment_dl'] has settable params:\n","pipe['sentiment_dl'].setMaxEpochs(1) | Info: Maximum number of epochs to train | Currently set to : 1\n","pipe['sentiment_dl'].setLr(0.005) | Info: Learning Rate | Currently set to : 0.005\n","pipe['sentiment_dl'].setBatchSize(64) | Info: Batch size | Currently set to : 64\n","pipe['sentiment_dl'].setDropout(0.5) | Info: Dropout coefficient | Currently set to : 0.5\n","pipe['sentiment_dl'].setEnableOutputLogs(True) | Info: Whether to use stdout in addition to Spark logs. | Currently set to : True\n","pipe['sentiment_dl'].setThreshold(0.6) | Info: The minimum threshold for the final result otheriwse it will be neutral | Currently set to : 0.6\n","pipe['sentiment_dl'].setThresholdLabel('neutral') | Info: In case the score is less than threshold, what should be the label. Default is neutral. | Currently set to : neutral\n",">>> pipe['use@tfhub_use'] has settable params:\n","pipe['use@tfhub_use'].setDimension(512) | Info: Number of embedding dimensions | Currently set to : 512\n","pipe['use@tfhub_use'].setLoadSP(False) | Info: Whether to load SentencePiece ops file which is required only by multi-lingual models. This is not changeable after it's set with a pretrained model nor it is compatible with Windows. | Currently set to : False\n","pipe['use@tfhub_use'].setStorageRef('tfhub_use') | Info: unique reference name for identification | Currently set to : tfhub_use\n",">>> pipe['deep_sentence_detector@SentenceDetectorDLModel_c83c27f46b97'] has settable params:\n","pipe['deep_sentence_detector@SentenceDetectorDLModel_c83c27f46b97'].setExplodeSentences(False) | Info: whether to explode each sentence into a different row, for better parallelization. Defaults to false. | Currently set to : False\n","pipe['deep_sentence_detector@SentenceDetectorDLModel_c83c27f46b97'].setStorageRef('SentenceDetectorDLModel_c83c27f46b97') | Info: storage unique identifier | Currently set to : SentenceDetectorDLModel_c83c27f46b97\n","pipe['deep_sentence_detector@SentenceDetectorDLModel_c83c27f46b97'].setEncoder(com.johnsnowlabs.nlp.annotators.sentence_detector_dl.SentenceDetectorDLEncoder@41fb48fb) | Info: Data encoder | Currently set to : com.johnsnowlabs.nlp.annotators.sentence_detector_dl.SentenceDetectorDLEncoder@41fb48fb\n","pipe['deep_sentence_detector@SentenceDetectorDLModel_c83c27f46b97'].setImpossiblePenultimates(['Bros', 'No', 'al', 'vs', 'etc', 'Fig', 'Dr', 'Prof', 'PhD', 'MD', 'Co', 'Corp', 'Inc', 'bros', 'VS', 'Vs', 'ETC', 'fig', 'dr', 'prof', 'PHD', 'phd', 'md', 'co', 'corp', 'inc', 'Jan', 'Feb', 'Mar', 'Apr', 'Jul', 'Aug', 'Sep', 'Sept', 'Oct', 'Nov', 'Dec', 'St', 'st', 'AM', 'PM', 'am', 'pm', 'e.g', 'f.e', 'i.e']) | Info: Impossible penultimates | Currently set to : ['Bros', 'No', 'al', 'vs', 'etc', 'Fig', 'Dr', 'Prof', 'PhD', 'MD', 'Co', 'Corp', 'Inc', 'bros', 'VS', 'Vs', 'ETC', 'fig', 'dr', 'prof', 'PHD', 'phd', 'md', 'co', 'corp', 'inc', 'Jan', 'Feb', 'Mar', 'Apr', 'Jul', 'Aug', 'Sep', 'Sept', 'Oct', 'Nov', 'Dec', 'St', 'st', 'AM', 'PM', 'am', 'pm', 'e.g', 'f.e', 'i.e']\n","pipe['deep_sentence_detector@SentenceDetectorDLModel_c83c27f46b97'].setModelArchitecture('cnn') | Info: Model architecture (CNN) | Currently set to : cnn\n",">>> pipe['document_assembler'] has settable params:\n","pipe['document_assembler'].setCleanupMode('shrink') | Info: possible values: disabled, inplace, inplace_full, shrink, shrink_full, each, each_full, delete_full | Currently set to : shrink\n"],"name":"stdout"}]},{"cell_type":"markdown","metadata":{"id":"2GJdDNV9jEIe"},"source":["##6. Retrain with new parameters"]},{"cell_type":"code","metadata":{"id":"mptfvHx-MMMX","colab":{"base_uri":"https://localhost:8080/","height":759},"executionInfo":{"status":"ok","timestamp":1620188339611,"user_tz":-120,"elapsed":14279,"user":{"displayName":"Christian Kasim Loan","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GjqAD-ircKP-s5Eh6JSdkDggDczfqQbJGU_IRb4Hw=s64","userId":"14469489166467359317"}},"outputId":"c580024a-2436-4b70-b7bb-c121cd3d6e80"},"source":["# Train longer!\n","trainable_pipe = nlu.load('train.sentiment')\n","trainable_pipe['trainable_sentiment_dl'].setMaxEpochs(5) \n","fitted_pipe = trainable_pipe.fit(train_df.iloc[:100])\n","# predict with the trainable pipeline on dataset and get predictions\n","preds = fitted_pipe.predict(train_df.iloc[:100],output_level='document')\n","\n","#sentence detector that is part of the pipe generates sone NaNs. lets drop them first\n","preds.dropna(inplace=True)\n","print(classification_report(preds['y'], preds['sentiment']))\n","\n","preds"],"execution_count":null,"outputs":[{"output_type":"stream","text":[" precision recall f1-score support\n","\n"," negative 0.94 0.94 0.94 47\n"," neutral 0.00 0.00 0.00 0\n"," positive 0.98 0.91 0.94 53\n","\n"," accuracy 0.92 100\n"," macro avg 0.64 0.61 0.63 100\n","weighted avg 0.96 0.92 0.94 100\n","\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"," \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"," \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"," \n"," \n"," \n"," \n","
textsentence_embedding_usesentenceyorigin_indexdocumenttrained_sentimenttrained_sentiment_confidence
0Theyre not RT @Naivana_: You gotta be kidding ...[0.053627125918865204, 0.03388773649930954, 0....[Theyre not RT @Naivana_:, You gotta be kiddi...negative36Theyre not RT @Naivana_: You gotta be kidding ...negative0.947914
1Thank you @Apple for fixing the #Swift sourcek...[0.01400269940495491, 0.04662228375673294, 0.0...[Thank you @Apple for fixing the #Swift source...positive7Thank you @Apple for fixing the #Swift sourcek...positive0.926184
2Washed my earphones by accident, still works. ...[0.028794147074222565, 0.060343481600284576, -...[Washed my earphones by accident, still works....positive272Washed my earphones by accident, still works. ...positive0.867718
3@AppleOfficialll @apple I can't say enough abo...[0.04390808567404747, 0.0024722537491470575, -...[@AppleOfficialll @apple I can't say enough ab...positive146@AppleOfficialll @apple I can't say enough abo...negative0.707370
4@OneRepublic @Apple So amazing[-0.0420607253909111, 0.05555792152881622, -0....[@OneRepublic @Apple So amazing]positive237@OneRepublic @Apple So amazingpositive0.989958
...........................
95Apple Inc. CEO Donates $291K To Pennsylvania S...[0.036090489476919174, 0.033749453723430634, -...[Apple Inc. CEO Donates $291K To Pennsylvania ...positive4Apple Inc. CEO Donates $291K To Pennsylvania S...neutral0.598268
96Photo: Yaaass. Shoutout to @apple.holidays and...[0.062088269740343094, -0.0338711179792881, -0...[Photo:, Yaaass., Shoutout to @apple., holiday...positive275Photo: Yaaass. Shoutout to @apple.holidays and...positive0.998650
97RT @hypebot: Steve Job's Deposition in #iPod L...[0.06204485893249512, 0.05829763785004616, -0....[RT @hypebot: Steve Job's Deposition in #iPod ...negative141RT @hypebot: Steve Job's Deposition in #iPod L...neutral0.581826
98@apple I have been on hold for 30 minutes than...[0.02501610852777958, 0.04794774204492569, -0....[@apple I have been on hold for 30 minutes tha...negative128@apple I have been on hold for 30 minutes than...negative0.933449
99Wow. Yall needa step it up @Apple RT @heynyla:...[0.027452174574136734, -0.004120523110032082, ...[Wow. Yall needa step it up @Apple RT @heynyla...negative1Wow. Yall needa step it up @Apple RT @heynyla:...negative0.729602
\n","

100 rows × 8 columns

\n","
"],"text/plain":[" text ... trained_sentiment_confidence\n","0 Theyre not RT @Naivana_: You gotta be kidding ... ... 0.947914\n","1 Thank you @Apple for fixing the #Swift sourcek... ... 0.926184\n","2 Washed my earphones by accident, still works. ... ... 0.867718\n","3 @AppleOfficialll @apple I can't say enough abo... ... 0.707370\n","4 @OneRepublic @Apple So amazing ... 0.989958\n",".. ... ... ...\n","95 Apple Inc. CEO Donates $291K To Pennsylvania S... ... 0.598268\n","96 Photo: Yaaass. Shoutout to @apple.holidays and... ... 0.998650\n","97 RT @hypebot: Steve Job's Deposition in #iPod L... ... 0.581826\n","98 @apple I have been on hold for 30 minutes than... ... 0.933449\n","99 Wow. Yall needa step it up @Apple RT @heynyla:... ... 0.729602\n","\n","[100 rows x 8 columns]"]},"metadata":{"tags":[]},"execution_count":9}]},{"cell_type":"markdown","metadata":{"id":"qFoT-s1MjTSS"},"source":["#7. Try training with different Embeddings"]},{"cell_type":"code","metadata":{"id":"nxWFzQOhjWC8","colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"status":"ok","timestamp":1620188339931,"user_tz":-120,"elapsed":14332,"user":{"displayName":"Christian Kasim Loan","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GjqAD-ircKP-s5Eh6JSdkDggDczfqQbJGU_IRb4Hw=s64","userId":"14469489166467359317"}},"outputId":"b6acf5d2-2f7e-4200-a6eb-24c9c4b05592"},"source":["# We can use nlu.print_components(action='embed_sentence') to see every possibler sentence embedding we could use. Lets use bert!\n","nlu.print_components(action='embed_sentence')"],"execution_count":null,"outputs":[{"output_type":"stream","text":["For language NLU provides the following Models : \n","nlu.load('en.embed_sentence') returns Spark NLP model tfhub_use\n","nlu.load('en.embed_sentence.use') returns Spark NLP model tfhub_use\n","nlu.load('en.embed_sentence.tfhub_use') returns Spark NLP model tfhub_use\n","nlu.load('en.embed_sentence.use.lg') returns Spark NLP model tfhub_use_lg\n","nlu.load('en.embed_sentence.tfhub_use.lg') returns Spark NLP model tfhub_use_lg\n","nlu.load('en.embed_sentence.albert') returns Spark NLP model albert_base_uncased\n","nlu.load('en.embed_sentence.electra') returns Spark NLP model sent_electra_small_uncased\n","nlu.load('en.embed_sentence.electra_small_uncased') returns Spark NLP model sent_electra_small_uncased\n","nlu.load('en.embed_sentence.electra_base_uncased') returns Spark NLP model sent_electra_base_uncased\n","nlu.load('en.embed_sentence.electra_large_uncased') returns Spark NLP model sent_electra_large_uncased\n","nlu.load('en.embed_sentence.bert') returns Spark NLP model sent_bert_base_uncased\n","nlu.load('en.embed_sentence.bert_base_uncased') returns Spark NLP model sent_bert_base_uncased\n","nlu.load('en.embed_sentence.bert_base_cased') returns Spark NLP model sent_bert_base_cased\n","nlu.load('en.embed_sentence.bert_large_uncased') returns Spark NLP model sent_bert_large_uncased\n","nlu.load('en.embed_sentence.bert_large_cased') returns Spark NLP model sent_bert_large_cased\n","nlu.load('en.embed_sentence.biobert.pubmed_base_cased') returns Spark NLP model sent_biobert_pubmed_base_cased\n","nlu.load('en.embed_sentence.biobert.pubmed_large_cased') returns Spark NLP model sent_biobert_pubmed_large_cased\n","nlu.load('en.embed_sentence.biobert.pmc_base_cased') returns Spark NLP model sent_biobert_pmc_base_cased\n","nlu.load('en.embed_sentence.biobert.pubmed_pmc_base_cased') returns Spark NLP model sent_biobert_pubmed_pmc_base_cased\n","nlu.load('en.embed_sentence.biobert.clinical_base_cased') returns Spark NLP model sent_biobert_clinical_base_cased\n","nlu.load('en.embed_sentence.biobert.discharge_base_cased') returns Spark NLP model sent_biobert_discharge_base_cased\n","nlu.load('en.embed_sentence.covidbert.large_uncased') returns Spark NLP model sent_covidbert_large_uncased\n","nlu.load('en.embed_sentence.small_bert_L2_128') returns Spark NLP model sent_small_bert_L2_128\n","nlu.load('en.embed_sentence.small_bert_L4_128') returns Spark NLP model sent_small_bert_L4_128\n","nlu.load('en.embed_sentence.small_bert_L6_128') returns Spark NLP model sent_small_bert_L6_128\n","nlu.load('en.embed_sentence.small_bert_L8_128') returns Spark NLP model sent_small_bert_L8_128\n","nlu.load('en.embed_sentence.small_bert_L10_128') returns Spark NLP model sent_small_bert_L10_128\n","nlu.load('en.embed_sentence.small_bert_L12_128') returns Spark NLP model sent_small_bert_L12_128\n","nlu.load('en.embed_sentence.small_bert_L2_256') returns Spark NLP model sent_small_bert_L2_256\n","nlu.load('en.embed_sentence.small_bert_L4_256') returns Spark NLP model sent_small_bert_L4_256\n","nlu.load('en.embed_sentence.small_bert_L6_256') returns Spark NLP model sent_small_bert_L6_256\n","nlu.load('en.embed_sentence.small_bert_L8_256') returns Spark NLP model sent_small_bert_L8_256\n","nlu.load('en.embed_sentence.small_bert_L10_256') returns Spark NLP model sent_small_bert_L10_256\n","nlu.load('en.embed_sentence.small_bert_L12_256') returns Spark NLP model sent_small_bert_L12_256\n","nlu.load('en.embed_sentence.small_bert_L2_512') returns Spark NLP model sent_small_bert_L2_512\n","nlu.load('en.embed_sentence.small_bert_L4_512') returns Spark NLP model sent_small_bert_L4_512\n","nlu.load('en.embed_sentence.small_bert_L6_512') returns Spark NLP model sent_small_bert_L6_512\n","nlu.load('en.embed_sentence.small_bert_L8_512') returns Spark NLP model sent_small_bert_L8_512\n","nlu.load('en.embed_sentence.small_bert_L10_512') returns Spark NLP model sent_small_bert_L10_512\n","nlu.load('en.embed_sentence.small_bert_L12_512') returns Spark NLP model sent_small_bert_L12_512\n","nlu.load('en.embed_sentence.small_bert_L2_768') returns Spark NLP model sent_small_bert_L2_768\n","nlu.load('en.embed_sentence.small_bert_L4_768') returns Spark NLP model sent_small_bert_L4_768\n","nlu.load('en.embed_sentence.small_bert_L6_768') returns Spark NLP model sent_small_bert_L6_768\n","nlu.load('en.embed_sentence.small_bert_L8_768') returns Spark NLP model sent_small_bert_L8_768\n","nlu.load('en.embed_sentence.small_bert_L10_768') returns Spark NLP model sent_small_bert_L10_768\n","nlu.load('en.embed_sentence.small_bert_L12_768') returns Spark NLP model sent_small_bert_L12_768\n","For language NLU provides the following Models : \n","nlu.load('fi.embed_sentence') returns Spark NLP model sent_bert_finnish_cased\n","nlu.load('fi.embed_sentence.bert.cased') returns Spark NLP model sent_bert_finnish_cased\n","nlu.load('fi.embed_sentence.bert.uncased') returns Spark NLP model sent_bert_finnish_uncased\n","For language NLU provides the following Models : \n","nlu.load('xx.embed_sentence') returns Spark NLP model sent_bert_multi_cased\n","nlu.load('xx.embed_sentence.bert') returns Spark NLP model sent_bert_multi_cased\n","nlu.load('xx.embed_sentence.bert.cased') returns Spark NLP model sent_bert_multi_cased\n","nlu.load('xx.embed_sentence.labse') returns Spark NLP model labse\n"],"name":"stdout"}]},{"cell_type":"code","metadata":{"id":"eLex095goHwm","colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"status":"ok","timestamp":1620188495786,"user_tz":-120,"elapsed":170049,"user":{"displayName":"Christian Kasim Loan","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GjqAD-ircKP-s5Eh6JSdkDggDczfqQbJGU_IRb4Hw=s64","userId":"14469489166467359317"}},"outputId":"5043ddfe-4d7a-472d-c7b9-8cf34cc1bb06"},"source":["trainable_pipe = nlu.load('en.embed_sentence.small_bert_L12_768 train.sentiment')\n","# We need to train longer and user smaller LR for NON-USE based sentence embeddings usually\n","# We could tune the hyperparameters further with hyperparameter tuning methods like gridsearch\n","# Also longer training gives more accuracy\n","trainable_pipe['trainable_sentiment_dl'].setMaxEpochs(110) \n","trainable_pipe['trainable_sentiment_dl'].setLr(0.0005) \n","fitted_pipe = trainable_pipe.fit(train_df)\n","# predict with the trainable pipeline on dataset and get predictions\n","preds = fitted_pipe.predict(train_df,output_level='document')\n","\n","#sentence detector that is part of the pipe generates sone NaNs. lets drop them first\n","preds.dropna(inplace=True)\n","print(classification_report(preds['y'], preds['sentiment']))\n","\n","#preds"],"execution_count":null,"outputs":[{"output_type":"stream","text":["sent_small_bert_L12_768 download started this may take some time.\n","Approximate size to download 392.9 MB\n","[OK!]\n","sentence_detector_dl download started this may take some time.\n","Approximate size to download 354.6 KB\n","[OK!]\n"," precision recall f1-score support\n","\n"," negative 0.97 0.83 0.90 114\n"," neutral 0.00 0.00 0.00 0\n"," positive 0.88 0.93 0.90 114\n","\n"," accuracy 0.88 228\n"," macro avg 0.62 0.59 0.60 228\n","weighted avg 0.92 0.88 0.90 228\n","\n"],"name":"stdout"}]},{"cell_type":"markdown","metadata":{"id":"_1jxw3GnVGlI"},"source":["# 7.1 evaluate on Test Data"]},{"cell_type":"code","metadata":{"id":"Fxx4yNkNVGFl","colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"status":"ok","timestamp":1620188505405,"user_tz":-120,"elapsed":179404,"user":{"displayName":"Christian Kasim Loan","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GjqAD-ircKP-s5Eh6JSdkDggDczfqQbJGU_IRb4Hw=s64","userId":"14469489166467359317"}},"outputId":"35e0f9c4-8486-4b24-b00e-387c5f7af5dd"},"source":["preds = fitted_pipe.predict(test_df,output_level='document')\n","\n","#sentence detector that is part of the pipe generates sone NaNs. lets drop them first\n","preds.dropna(inplace=True)\n","print(classification_report(preds['y'], preds['sentiment']))"],"execution_count":null,"outputs":[{"output_type":"stream","text":[" precision recall f1-score support\n","\n"," negative 0.94 0.59 0.72 29\n"," neutral 0.00 0.00 0.00 0\n"," positive 0.79 0.93 0.86 29\n","\n"," accuracy 0.76 58\n"," macro avg 0.58 0.51 0.53 58\n","weighted avg 0.87 0.76 0.79 58\n","\n"],"name":"stdout"}]},{"cell_type":"markdown","metadata":{"id":"2BB-NwZUoHSe"},"source":["# 8. Lets save the model"]},{"cell_type":"code","metadata":{"id":"bZZpObLOtqo8","colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"status":"ok","timestamp":1620188675266,"user_tz":-120,"elapsed":348933,"user":{"displayName":"Christian Kasim Loan","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GjqAD-ircKP-s5Eh6JSdkDggDczfqQbJGU_IRb4Hw=s64","userId":"14469489166467359317"}},"outputId":"776368a9-02df-4524-e80d-b004a10c4306"},"source":["stored_model_path = './models/classifier_dl_trained' \n","fitted_pipe.save(stored_model_path)"],"execution_count":null,"outputs":[{"output_type":"stream","text":["Stored model in ./models/classifier_dl_trained\n"],"name":"stdout"}]},{"cell_type":"markdown","metadata":{"id":"e_b2DPd4rCiU"},"source":["# 9. Lets load the model from HDD.\n","This makes Offlien NLU usage possible! \n","You need to call nlu.load(path=path_to_the_pipe) to load a model/pipeline from disk."]},{"cell_type":"code","metadata":{"id":"SO4uz45MoRgp","colab":{"base_uri":"https://localhost:8080/","height":80},"executionInfo":{"status":"ok","timestamp":1620188686839,"user_tz":-120,"elapsed":360106,"user":{"displayName":"Christian Kasim Loan","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GjqAD-ircKP-s5Eh6JSdkDggDczfqQbJGU_IRb4Hw=s64","userId":"14469489166467359317"}},"outputId":"32ac7000-0278-40e0-fcc2-5eef5cb56094"},"source":["hdd_pipe = nlu.load(path=stored_model_path)\n","\n","preds = hdd_pipe.predict('I hate the newest update')\n","preds"],"execution_count":null,"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","
textsentimentsentenceorigin_indexdocumentsentence_embedding_from_disksentiment_confidence
0I hate the newest update[negative][I hate the newest update]8589934592I hate the newest update[[-0.3084237277507782, -0.11030610650777817, 0...[0.67131346]
\n","
"],"text/plain":[" text ... sentiment_confidence\n","0 I hate the newest update ... [0.67131346]\n","\n","[1 rows x 7 columns]"]},"metadata":{"tags":[]},"execution_count":14}]},{"cell_type":"code","metadata":{"id":"e0CVlkk9v6Qi","colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"status":"ok","timestamp":1620188686840,"user_tz":-120,"elapsed":359738,"user":{"displayName":"Christian Kasim Loan","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GjqAD-ircKP-s5Eh6JSdkDggDczfqQbJGU_IRb4Hw=s64","userId":"14469489166467359317"}},"outputId":"b7915040-d049-4447-c1aa-21dcb0eb27db"},"source":["hdd_pipe.print_info()"],"execution_count":null,"outputs":[{"output_type":"stream","text":["The following parameters are configurable for this NLU pipeline (You can copy paste the examples) :\n",">>> pipe['document_assembler'] has settable params:\n","pipe['document_assembler'].setCleanupMode('shrink') | Info: possible values: disabled, inplace, inplace_full, shrink, shrink_full, each, each_full, delete_full | Currently set to : shrink\n",">>> pipe['sentence_detector@SentenceDetectorDLModel_c83c27f46b97'] has settable params:\n","pipe['sentence_detector@SentenceDetectorDLModel_c83c27f46b97'].setExplodeSentences(False) | Info: whether to explode each sentence into a different row, for better parallelization. Defaults to false. | Currently set to : False\n","pipe['sentence_detector@SentenceDetectorDLModel_c83c27f46b97'].setStorageRef('SentenceDetectorDLModel_c83c27f46b97') | Info: storage unique identifier | Currently set to : SentenceDetectorDLModel_c83c27f46b97\n","pipe['sentence_detector@SentenceDetectorDLModel_c83c27f46b97'].setEncoder(com.johnsnowlabs.nlp.annotators.sentence_detector_dl.SentenceDetectorDLEncoder@3102445a) | Info: Data encoder | Currently set to : com.johnsnowlabs.nlp.annotators.sentence_detector_dl.SentenceDetectorDLEncoder@3102445a\n","pipe['sentence_detector@SentenceDetectorDLModel_c83c27f46b97'].setImpossiblePenultimates(['Bros', 'No', 'al', 'vs', 'etc', 'Fig', 'Dr', 'Prof', 'PhD', 'MD', 'Co', 'Corp', 'Inc', 'bros', 'VS', 'Vs', 'ETC', 'fig', 'dr', 'prof', 'PHD', 'phd', 'md', 'co', 'corp', 'inc', 'Jan', 'Feb', 'Mar', 'Apr', 'Jul', 'Aug', 'Sep', 'Sept', 'Oct', 'Nov', 'Dec', 'St', 'st', 'AM', 'PM', 'am', 'pm', 'e.g', 'f.e', 'i.e']) | Info: Impossible penultimates | Currently set to : ['Bros', 'No', 'al', 'vs', 'etc', 'Fig', 'Dr', 'Prof', 'PhD', 'MD', 'Co', 'Corp', 'Inc', 'bros', 'VS', 'Vs', 'ETC', 'fig', 'dr', 'prof', 'PHD', 'phd', 'md', 'co', 'corp', 'inc', 'Jan', 'Feb', 'Mar', 'Apr', 'Jul', 'Aug', 'Sep', 'Sept', 'Oct', 'Nov', 'Dec', 'St', 'st', 'AM', 'PM', 'am', 'pm', 'e.g', 'f.e', 'i.e']\n","pipe['sentence_detector@SentenceDetectorDLModel_c83c27f46b97'].setModelArchitecture('cnn') | Info: Model architecture (CNN) | Currently set to : cnn\n",">>> pipe['bert_sentence@sent_small_bert_L12_768'] has settable params:\n","pipe['bert_sentence@sent_small_bert_L12_768'].setBatchSize(8) | Info: Size of every batch | Currently set to : 8\n","pipe['bert_sentence@sent_small_bert_L12_768'].setCaseSensitive(False) | Info: whether to ignore case in tokens for embeddings matching | Currently set to : False\n","pipe['bert_sentence@sent_small_bert_L12_768'].setDimension(768) | Info: Number of embedding dimensions | Currently set to : 768\n","pipe['bert_sentence@sent_small_bert_L12_768'].setMaxSentenceLength(128) | Info: Max sentence length to process | Currently set to : 128\n","pipe['bert_sentence@sent_small_bert_L12_768'].setIsLong(False) | Info: Use Long type instead of Int type for inputs buffer - Some Bert models require Long instead of Int. | Currently set to : False\n","pipe['bert_sentence@sent_small_bert_L12_768'].setStorageRef('sent_small_bert_L12_768') | Info: unique reference name for identification | Currently set to : sent_small_bert_L12_768\n",">>> pipe['sentiment_dl@sent_small_bert_L12_768'] has settable params:\n","pipe['sentiment_dl@sent_small_bert_L12_768'].setThreshold(0.6) | Info: The minimum threshold for the final result otheriwse it will be neutral | Currently set to : 0.6\n","pipe['sentiment_dl@sent_small_bert_L12_768'].setThresholdLabel('neutral') | Info: In case the score is less than threshold, what should be the label. Default is neutral. | Currently set to : neutral\n","pipe['sentiment_dl@sent_small_bert_L12_768'].setClasses(['positive', 'negative']) | Info: get the tags used to trained this SentimentDLModel | Currently set to : ['positive', 'negative']\n","pipe['sentiment_dl@sent_small_bert_L12_768'].setStorageRef('sent_small_bert_L12_768') | Info: unique reference name for identification | Currently set to : sent_small_bert_L12_768\n"],"name":"stdout"}]},{"cell_type":"code","metadata":{"id":"cbwS4bE0uT7d"},"source":[""],"execution_count":null,"outputs":[]}]} \ No newline at end of file +{ + "nbformat": 4, + "nbformat_minor": 0, + "metadata": { + "colab": { + "provenance": [] + }, + "kernelspec": { + "display_name": "Python 3", + "name": "python3" + } + }, + "cells": [ + { + "cell_type": "markdown", + "metadata": { + "id": "RIV-9vEqxTBB" + }, + "source": [ + "![JohnSnowLabs](https://nlp.johnsnowlabs.com/assets/images/logo.png)\n", + "\n", + "[![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/JohnSnowLabs/nlu/blob/master/examples/colab/Training/binary_text_classification/NLU_training_sentiment_classifier_demo_apple_twitter.ipynb)\n", + "\n", + "\n", + "\n", + "# Training a Sentiment Analysis Classifier with NLU\n", + "## 2 class Apple Tweets sentiment classifier training\n", + "With the [SentimentDL model](https://nlp.johnsnowlabs.com/docs/en/annotators#sentimentdl-multi-class-sentiment-analysis-annotator) from Spark NLP you can achieve State Of the Art results on any multi class text classification problem\n", + "\n", + "This notebook showcases the following features :\n", + "\n", + "- How to train the deep learning classifier\n", + "- How to store a pipeline to disk\n", + "- How to load the pipeline from disk (Enables NLU offline mode)\n", + "\n", + "You can achieve these results or even better on this dataset with training data:\n", + "\n", + "
\n", + "\n", + "![image.png](data:image/png;base64,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)\n", + "\n", + "You can achieve these results or even better on this dataset with test data:\n", + "\n", + "\n", + "\n", + "
\n", + "\n", + "\n", + "![image.png](data:image/png;base64,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)\n", + "\n" + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "05-mAOF6ol-0" + }, + "source": [ + "!pip install -q johnsnowlabs" + ], + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "f4KkTfnR5Ugg" + }, + "source": [ + "# 2. Download appple twitter Sentiment dataset\n", + "https://www.kaggle.com/seriousran/appletwittersentimenttexts\n", + "\n", + "this dataset contains tweets made towards apple and today we are going to train our model to predict whether the tweet contains sentiment!\n" + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "OrVb5ZMvvrQD" + }, + "source": [ + "! wget https://s3.amazonaws.com/auxdata.johnsnowlabs.com/public/resources/en/classifier-dl/apple-twitter/apple-twitter-sentiment-texts.csv\n" + ], + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 424 + }, + "id": "y4xSRWIhwT28", + "outputId": "fd429b0f-a052-4017-e497-aa73d3566f3e" + }, + "source": [ + "import pandas as pd\n", + "train_path = '/content/apple-twitter-sentiment-texts.csv'\n", + "\n", + "train_df = pd.read_csv(train_path)\n", + "# the text data to use for classification should be in a column named 'text'\n", + "# the label column must have name 'y' name be of type str\n", + "columns=['text','y']\n", + "train_df = train_df[columns]\n", + "train_df = train_df[~train_df[\"y\"].isin([\"neutral\"])]\n", + "from sklearn.model_selection import train_test_split\n", + "\n", + "train_df, test_df = train_test_split(train_df, test_size=0.2)\n", + "train_df" + ], + "execution_count": 3, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + " text y\n", + "44 I'm surprised there isn't more talk about what... negative\n", + "691 over 1 hour on hold with @apple customer servi... negative\n", + "1371 I'm still mad @apple negative\n", + "870 @jokigenki @Apple I think it's like 2011? Can'... negative\n", + "1226 @apple #ios8 The lack of true keyboard integra... negative\n", + "... ... ...\n", + "1392 itunes is awful & is ruining my life fix y... negative\n", + "733 Happy Monday! My camera on my fancy @Apple #iP... negative\n", + "503 Phone just died while it was plug in. @apple w... negative\n", + "634 Whoever downgrades from a iphone 6 to a 5S obv... negative\n", + "891 I can't queue songs on an iPhone @apple @timco... negative\n", + "\n", + "[663 rows x 2 columns]" + ], + "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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
texty
44I'm surprised there isn't more talk about what...negative
691over 1 hour on hold with @apple customer servi...negative
1371I'm still mad @applenegative
870@jokigenki @Apple I think it's like 2011? Can'...negative
1226@apple #ios8 The lack of true keyboard integra...negative
.........
1392itunes is awful &amp; is ruining my life fix y...negative
733Happy Monday! My camera on my fancy @Apple #iP...negative
503Phone just died while it was plug in. @apple w...negative
634Whoever downgrades from a iphone 6 to a 5S obv...negative
891I can't queue songs on an iPhone @apple @timco...negative
\n", + "

663 rows × 2 columns

\n", + "
\n", + "
\n", + "\n", + "
\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "
\n", + "\n", + "\n", + "
\n", + " \n", + "\n", + "\n", + "\n", + " \n", + "
\n", + "
\n", + "
\n" + ] + }, + "metadata": {}, + "execution_count": 3 + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "0296Om2C5anY" + }, + "source": [ + "# 3. Train Deep Learning Classifier using nlu.load('train.sentiment')\n", + "\n", + "You dataset label column should be named 'y' and the feature column with text data should be named 'text'" + ] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 1000 + }, + "id": "3ZIPkRkWftBG", + "outputId": "463803c9-0441-4007-c5c1-133b15f038b4" + }, + "source": [ + "from sklearn.metrics import classification_report\n", + "from johnsnowlabs import nlp\n", + "\n", + "# load a trainable pipeline by specifying the train. prefix and fit it on a datset with label and text columns\n", + "# by default the Universal Sentence Encoder (USE) Sentence embeddings are used for generation\n", + "trainable_pipe = nlp.load('train.sentiment')\n", + "\n", + "fitted_pipe = trainable_pipe.fit(train_df.iloc[:50])\n", + "\n", + "# predict with the trainable pipeline on dataset and get predictions\n", + "preds = fitted_pipe.predict(train_df.iloc[:50],output_level='document')\n", + "#sentence detector that is part of the pipe generates sone NaNs. lets drop them first\n", + "preds.dropna(inplace=True)\n", + "print(classification_report(preds['y'], preds['sentiment']))\n", + "\n", + "preds" + ], + "execution_count": null, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Warning::Spark Session already created, some configs may not take.\n", + "sent_small_bert_L2_128 download started this may take some time.\n", + "Approximate size to download 16.1 MB\n", + "[OK!]\n", + " precision recall f1-score support\n", + "\n", + " negative 0.82 1.00 0.90 41\n", + " positive 0.00 0.00 0.00 9\n", + "\n", + " accuracy 0.82 50\n", + " macro avg 0.41 0.50 0.45 50\n", + "weighted avg 0.67 0.82 0.74 50\n", + "\n" + ] + }, + { + "output_type": "execute_result", + "data": { + "text/plain": [ + " document \\\n", + "0 @apple fucking let everyone name the group cha... \n", + "1 As a die hard @Apple customer, I must say I am... \n", + "2 RT @_iamGambino: Thank you @Apple \n", + "3 YO YOU AINT SHIT @apple \n", + "4 Theyre not RT @Naivana_: You gotta be kidding ... \n", + "5 My MacBook Pro is now as annoying as my ASUS W... \n", + "6 It's just dawned on me that I've probably spen... \n", + "7 Hey @apple @sprint I'm not a fan of your lates... \n", + "8 @apple y'all shitty \n", + "9 YO I DIDNT TOUCH MY PHONE AT ALL AND RIGHT WHE... \n", + "10 FUCK @apple \n", + "11 my iphone6 plus is impossible to hold without ... \n", + "12 @apple last time I checked I thought I bought ... \n", + "13 just need @apple to come out with a charger co... \n", + "14 RT @peterpham: Bought my @AugustSmartLock at t... \n", + "15 Apple's iPhone 6 Plus Amazingly Captures 41% o... \n", + "16 @SamJam Agreed--have to give props to @Apple f... \n", + "17 @jakeflem @Apple Yes It seems to fix it good t... \n", + "18 It shouldn't take a whole week to replace my h... \n", + "19 @nigxnog @Apple bruh that means u type that a ... \n", + "20 I don't undestand how @SYFNews #CreditCare web... \n", + "21 Steve Jobs Predicted Future Of E-Commerce Back... \n", + "22 These Damn @Apple Commercials Are Getting Wors... \n", + "23 Those** PICK UP THE SLACK YOU FUCK BOYS @Apple \n", + "24 hey @apple can I catch a fucking maverick of a... \n", + "25 @apple#ipad #irig For the price to connect my ... \n", + "26 fucking @apple are memer FAGGOTS http://t.co/w... \n", + "27 Safari just crashed on me and I didn't have an... \n", + "28 @Apple deleted users' non-#iTunes music and di... \n", + "29 @PCAudioLabs is in and @Apple is out at Emanon... \n", + "30 @jokigenki @Apple I think it's like 2011? Can'... \n", + "31 RT @tschwettman: hey @apple why won't you let ... \n", + "32 @wastwater1 l agree with you, they're about as... \n", + "33 How do I log into iCloud on my phone? Not the ... \n", + "34 Shout out to @Apple for making crappy iPhone a... \n", + "35 We're so excited to be named to @Apple's 'App ... \n", + "36 my iPhone is fucked. Thanks @apple and @EE wha... \n", + "37 iPhone6 fell 2 ft. Screen shattered like it wa... \n", + "38 CNBCTV: #Chromecast beats #AppleTV #aapl http:... \n", + "39 It makes you smarter. Elevate is @apple app of... \n", + "40 IPhone6 has too many issues, why tf is the ear... \n", + "41 Great time had @Apple store on Friday. @Russel... \n", + "42 Hey @apple are you even thinking about fixing ... \n", + "43 . @apple I don't think the '59' should be so c... \n", + "44 .@apple why do your computers like to crash on... \n", + "45 Ha, poor @apple trying to make its iPad and Ma... \n", + "46 You'll be back in my life soon @apple \n", + "47 iTunes is pissing me tf off @apple \n", + "48 RT @bchmura12: .@apple you suck \n", + "49 Updated to Yosemite on two machines. Both are ... \n", + "\n", + " sentence_embedding_small_bert_L2_128 sentiment \\\n", + "0 [-1.5767942667007446, -0.2661866843700409, 0.1... negative \n", + "1 [-0.1864045411348343, 0.37810075283050537, -0.... negative \n", + "2 [-0.39863264560699463, -0.018525924533605576, ... negative \n", + "3 [-1.3272020816802979, -0.6504784226417542, -0.... negative \n", + "4 [-0.26906388998031616, 0.16873443126678467, 0.... negative \n", + "5 [-0.7138646841049194, -0.03021504543721676, 0.... negative \n", + "6 [-0.08956478536128998, -0.09104951471090317, -... negative \n", + "7 [-0.6237524747848511, 0.10997672379016876, 0.6... negative \n", + "8 [-1.721300482749939, -1.328816533088684, 0.083... negative \n", + "9 [-0.7379449605941772, 0.2959931790828705, -0.4... negative \n", + "10 [-1.0854371786117554, -0.38098257780075073, 0.... negative \n", + "11 [-0.06848365068435669, 0.4246528148651123, 0.1... negative \n", + "12 [-1.1634764671325684, 0.5120655298233032, -0.0... negative \n", + "13 [-0.5657770037651062, 0.8361220359802246, -0.1... negative \n", + "14 [-0.43666037917137146, 0.7088866829872131, 0.4... negative \n", + "15 [-0.1403159201145172, 0.65235835313797, 0.1092... negative \n", + "16 [-0.2358071506023407, 0.060792725533246994, -0... negative \n", + "17 [-1.220468521118164, 0.09469269961118698, -0.0... negative \n", + "18 [-1.0816304683685303, 0.6302781701087952, -0.4... negative \n", + "19 [-1.056034803390503, 0.15630772709846497, 0.51... negative \n", + "20 [-0.6713889241218567, 0.5271422266960144, 0.07... negative \n", + "21 [-0.3053719401359558, 0.9345525503158569, 0.21... negative \n", + "22 [-0.8299529552459717, -0.4301386773586273, -0.... negative \n", + "23 [-1.3581013679504395, -0.15301916003227234, 0.... negative \n", + "24 [-0.6373146772384644, 0.5904020667076111, 0.28... negative \n", + "25 [-0.5737035870552063, 0.6071469783782959, 0.06... negative \n", + "26 [-0.04430821165442467, 0.44264474511146545, 0.... negative \n", + "27 [-0.32811102271080017, 0.6601451635360718, -0.... negative \n", + "28 [-0.3346312940120697, 0.2459762543439865, 0.54... negative \n", + "29 [-0.05351848155260086, 0.6132703423500061, 0.0... negative \n", + "30 [-0.9171913862228394, -0.03775791823863983, 0.... negative \n", + "31 [-0.8461720943450928, 0.45761561393737793, 0.1... negative \n", + "32 [-0.5620263814926147, 0.1833726316690445, 0.10... negative \n", + "33 [-1.0261833667755127, 0.39792588353157043, -0.... negative \n", + "34 [-1.0023715496063232, 0.22417372465133667, 0.0... negative \n", + "35 [-0.3373744487762451, 0.1699923425912857, 0.39... negative \n", + "36 [-0.6871265769004822, 0.16453255712985992, -0.... negative \n", + "37 [-0.38180163502693176, 0.26194843649864197, -0... negative \n", + "38 [0.25390008091926575, 0.2027512639760971, 0.71... negative \n", + "39 [-0.3650900721549988, -0.056419190019369125, 0... negative \n", + "40 [-0.5127007961273193, 0.68586665391922, -0.193... negative \n", + "41 [-0.8063774704933167, 0.4269622266292572, 0.51... negative \n", + "42 [-0.9981245994567871, -0.04270806908607483, 0.... negative \n", + "43 [-1.193355679512024, 0.2766774296760559, -0.14... negative \n", + "44 [-1.2451688051223755, -0.2248333841562271, -0.... negative \n", + "45 [-0.7224618196487427, 0.03269221633672714, -0.... negative \n", + "46 [-1.220320701599121, -0.1481868475675583, -0.3... negative \n", + "47 [-1.0455917119979858, 0.08097667992115021, 0.3... negative \n", + "48 [-0.9056015014648438, -0.7452876567840576, 0.6... negative \n", + "49 [-0.5752751231193542, 0.05041218921542168, -0.... negative \n", + "\n", + " sentiment_confidence text \\\n", + "0 7.0 @apple fucking let everyone name the group cha... \n", + "1 5.0 As a die hard @Apple customer, I must say I am... \n", + "2 9.0 RT @_iamGambino: Thank you @Apple \n", + "3 1.0 YO YOU AINT SHIT @apple \n", + "4 3.0 Theyre not RT @Naivana_: You gotta be kidding ... \n", + "5 1.0 My MacBook Pro is now as annoying as my ASUS W... \n", + "6 3.0 It's just dawned on me that I've probably spen... \n", + "7 3.0 Hey @apple @sprint I'm not a fan of your lates... \n", + "8 1.0 @apple y'all shitty \n", + "9 8.0 YO I DIDNT TOUCH MY PHONE AT ALL AND RIGHT WHE... \n", + "10 2.0 FUCK @apple \n", + "11 1.0 my iphone6 plus is impossible to hold without ... \n", + "12 1.0 @apple last time I checked I thought I bought ... \n", + "13 3.0 just need @apple to come out with a charger co... \n", + "14 1.0 RT @peterpham: Bought my @AugustSmartLock at t... \n", + "15 2.0 Apple's iPhone 6 Plus Amazingly Captures 41% o... \n", + "16 4.0 @SamJam Agreed--have to give props to @Apple f... \n", + "17 2.0 @jakeflem @Apple Yes It seems to fix it good t... \n", + "18 1.0 It shouldn't take a whole week to replace my h... \n", + "19 1.0 @nigxnog @Apple bruh that means u type that a ... \n", + "20 1.0 I don't undestand how @SYFNews #CreditCare web... \n", + "21 6.0 Steve Jobs Predicted Future Of E-Commerce Back... \n", + "22 4.0 These Damn @Apple Commercials Are Getting Wors... \n", + "23 5.0 Those** PICK UP THE SLACK YOU FUCK BOYS @Apple \n", + "24 4.0 hey @apple can I catch a fucking maverick of a... \n", + "25 6.0 @apple#ipad #irig For the price to connect my... \n", + "26 2.0 fucking @apple are memer FAGGOTS http://t.co/w... \n", + "27 6.0 Safari just crashed on me and I didn't have an... \n", + "28 1.0 @Apple deleted users' non-#iTunes music and di... \n", + "29 8.0 @PCAudioLabs is in and @Apple is out at Emanon... \n", + "30 9.0 @jokigenki @Apple I think it's like 2011? Can'... \n", + "31 3.0 RT @tschwettman: hey @apple why won't you let ... \n", + "32 1.0 @wastwater1 l agree with you, they're about as... \n", + "33 6.0 How do I log into iCloud on my phone? Not the ... \n", + "34 3.0 Shout out to @Apple for making crappy iPhone a... \n", + "35 3.0 We're so excited to be named to @Apple's 'App ... \n", + "36 2.0 my iPhone is fucked. Thanks @apple and @EE wha... \n", + "37 1.0 iPhone6 fell 2 ft. Screen shattered like it wa... \n", + "38 1.0 CNBCTV: #Chromecast beats #AppleTV #aapl http... \n", + "39 4.0 It makes you smarter. Elevate is @apple app o... \n", + "40 5.0 IPhone6 has too many issues, why tf is the ea... \n", + "41 4.0 Great time had @Apple store on Friday. @Russel... \n", + "42 1.0 Hey @apple are you even thinking about fixing ... \n", + "43 1.0 . @apple I don't think the '59' should be so c... \n", + "44 5.0 .@apple why do your computers like to crash on... \n", + "45 5.0 Ha, poor @apple trying to make its iPad and Ma... \n", + "46 6.0 You'll be back in my life soon @apple \n", + "47 1.0 iTunes is pissing me tf off @apple \n", + "48 2.0 RT @bchmura12: .@apple you suck \n", + "49 1.0 Updated to Yosemite on two machines. Both are ... \n", + "\n", + " y \n", + "0 negative \n", + "1 negative \n", + "2 positive \n", + "3 negative \n", + "4 negative \n", + "5 negative \n", + "6 negative \n", + "7 negative \n", + "8 negative \n", + "9 negative \n", + "10 negative \n", + "11 negative \n", + "12 negative \n", + "13 negative \n", + "14 positive \n", + "15 positive \n", + "16 positive \n", + "17 negative \n", + "18 negative \n", + "19 negative \n", + "20 negative \n", + "21 positive \n", + "22 negative \n", + "23 negative \n", + "24 negative \n", + "25 negative \n", + "26 negative \n", + "27 negative \n", + "28 negative \n", + "29 negative \n", + "30 negative \n", + "31 negative \n", + "32 negative \n", + "33 negative \n", + "34 negative \n", + "35 positive \n", + "36 negative \n", + "37 negative \n", + "38 negative \n", + "39 positive \n", + "40 negative \n", + "41 positive \n", + "42 negative \n", + "43 negative \n", + "44 negative \n", + "45 negative \n", + "46 positive \n", + "47 negative \n", + "48 negative \n", + "49 negative " + ], + "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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + "
documentsentence_embedding_small_bert_L2_128sentimentsentiment_confidencetexty
0@apple fucking let everyone name the group cha...[-1.5767942667007446, -0.2661866843700409, 0.1...negative7.0@apple fucking let everyone name the group cha...negative
1As a die hard @Apple customer, I must say I am...[-0.1864045411348343, 0.37810075283050537, -0....negative5.0As a die hard @Apple customer, I must say I am...negative
2RT @_iamGambino: Thank you @Apple[-0.39863264560699463, -0.018525924533605576, ...negative9.0RT @_iamGambino: Thank you @Applepositive
3YO YOU AINT SHIT @apple[-1.3272020816802979, -0.6504784226417542, -0....negative1.0YO YOU AINT SHIT @applenegative
4Theyre not RT @Naivana_: You gotta be kidding ...[-0.26906388998031616, 0.16873443126678467, 0....negative3.0Theyre not RT @Naivana_: You gotta be kidding ...negative
5My MacBook Pro is now as annoying as my ASUS W...[-0.7138646841049194, -0.03021504543721676, 0....negative1.0My MacBook Pro is now as annoying as my ASUS W...negative
6It's just dawned on me that I've probably spen...[-0.08956478536128998, -0.09104951471090317, -...negative3.0It's just dawned on me that I've probably spen...negative
7Hey @apple @sprint I'm not a fan of your lates...[-0.6237524747848511, 0.10997672379016876, 0.6...negative3.0Hey @apple @sprint I'm not a fan of your lates...negative
8@apple y'all shitty[-1.721300482749939, -1.328816533088684, 0.083...negative1.0@apple y'all shittynegative
9YO I DIDNT TOUCH MY PHONE AT ALL AND RIGHT WHE...[-0.7379449605941772, 0.2959931790828705, -0.4...negative8.0YO I DIDNT TOUCH MY PHONE AT ALL AND RIGHT WHE...negative
10FUCK @apple[-1.0854371786117554, -0.38098257780075073, 0....negative2.0FUCK @applenegative
11my iphone6 plus is impossible to hold without ...[-0.06848365068435669, 0.4246528148651123, 0.1...negative1.0my iphone6 plus is impossible to hold without ...negative
12@apple last time I checked I thought I bought ...[-1.1634764671325684, 0.5120655298233032, -0.0...negative1.0@apple last time I checked I thought I bought ...negative
13just need @apple to come out with a charger co...[-0.5657770037651062, 0.8361220359802246, -0.1...negative3.0just need @apple to come out with a charger co...negative
14RT @peterpham: Bought my @AugustSmartLock at t...[-0.43666037917137146, 0.7088866829872131, 0.4...negative1.0RT @peterpham: Bought my @AugustSmartLock at t...positive
15Apple's iPhone 6 Plus Amazingly Captures 41% o...[-0.1403159201145172, 0.65235835313797, 0.1092...negative2.0Apple's iPhone 6 Plus Amazingly Captures 41% o...positive
16@SamJam Agreed--have to give props to @Apple f...[-0.2358071506023407, 0.060792725533246994, -0...negative4.0@SamJam Agreed--have to give props to @Apple f...positive
17@jakeflem @Apple Yes It seems to fix it good t...[-1.220468521118164, 0.09469269961118698, -0.0...negative2.0@jakeflem @Apple Yes It seems to fix it good t...negative
18It shouldn't take a whole week to replace my h...[-1.0816304683685303, 0.6302781701087952, -0.4...negative1.0It shouldn't take a whole week to replace my h...negative
19@nigxnog @Apple bruh that means u type that a ...[-1.056034803390503, 0.15630772709846497, 0.51...negative1.0@nigxnog @Apple bruh that means u type that a ...negative
20I don't undestand how @SYFNews #CreditCare web...[-0.6713889241218567, 0.5271422266960144, 0.07...negative1.0I don't undestand how @SYFNews #CreditCare web...negative
21Steve Jobs Predicted Future Of E-Commerce Back...[-0.3053719401359558, 0.9345525503158569, 0.21...negative6.0Steve Jobs Predicted Future Of E-Commerce Back...positive
22These Damn @Apple Commercials Are Getting Wors...[-0.8299529552459717, -0.4301386773586273, -0....negative4.0These Damn @Apple Commercials Are Getting Wors...negative
23Those** PICK UP THE SLACK YOU FUCK BOYS @Apple[-1.3581013679504395, -0.15301916003227234, 0....negative5.0Those** PICK UP THE SLACK YOU FUCK BOYS @Applenegative
24hey @apple can I catch a fucking maverick of a...[-0.6373146772384644, 0.5904020667076111, 0.28...negative4.0hey @apple can I catch a fucking maverick of a...negative
25@apple#ipad #irig For the price to connect my ...[-0.5737035870552063, 0.6071469783782959, 0.06...negative6.0@apple#ipad #irig For the price to connect my...negative
26fucking @apple are memer FAGGOTS http://t.co/w...[-0.04430821165442467, 0.44264474511146545, 0....negative2.0fucking @apple are memer FAGGOTS http://t.co/w...negative
27Safari just crashed on me and I didn't have an...[-0.32811102271080017, 0.6601451635360718, -0....negative6.0Safari just crashed on me and I didn't have an...negative
28@Apple deleted users' non-#iTunes music and di...[-0.3346312940120697, 0.2459762543439865, 0.54...negative1.0@Apple deleted users' non-#iTunes music and di...negative
29@PCAudioLabs is in and @Apple is out at Emanon...[-0.05351848155260086, 0.6132703423500061, 0.0...negative8.0@PCAudioLabs is in and @Apple is out at Emanon...negative
30@jokigenki @Apple I think it's like 2011? Can'...[-0.9171913862228394, -0.03775791823863983, 0....negative9.0@jokigenki @Apple I think it's like 2011? Can'...negative
31RT @tschwettman: hey @apple why won't you let ...[-0.8461720943450928, 0.45761561393737793, 0.1...negative3.0RT @tschwettman: hey @apple why won't you let ...negative
32@wastwater1 l agree with you, they're about as...[-0.5620263814926147, 0.1833726316690445, 0.10...negative1.0@wastwater1 l agree with you, they're about as...negative
33How do I log into iCloud on my phone? Not the ...[-1.0261833667755127, 0.39792588353157043, -0....negative6.0How do I log into iCloud on my phone? Not the ...negative
34Shout out to @Apple for making crappy iPhone a...[-1.0023715496063232, 0.22417372465133667, 0.0...negative3.0Shout out to @Apple for making crappy iPhone a...negative
35We're so excited to be named to @Apple's 'App ...[-0.3373744487762451, 0.1699923425912857, 0.39...negative3.0We're so excited to be named to @Apple's 'App ...positive
36my iPhone is fucked. Thanks @apple and @EE wha...[-0.6871265769004822, 0.16453255712985992, -0....negative2.0my iPhone is fucked. Thanks @apple and @EE wha...negative
37iPhone6 fell 2 ft. Screen shattered like it wa...[-0.38180163502693176, 0.26194843649864197, -0...negative1.0iPhone6 fell 2 ft. Screen shattered like it wa...negative
38CNBCTV: #Chromecast beats #AppleTV #aapl http:...[0.25390008091926575, 0.2027512639760971, 0.71...negative1.0CNBCTV: #Chromecast beats #AppleTV #aapl http...negative
39It makes you smarter. Elevate is @apple app of...[-0.3650900721549988, -0.056419190019369125, 0...negative4.0It makes you smarter. Elevate is @apple app o...positive
40IPhone6 has too many issues, why tf is the ear...[-0.5127007961273193, 0.68586665391922, -0.193...negative5.0IPhone6 has too many issues, why tf is the ea...negative
41Great time had @Apple store on Friday. @Russel...[-0.8063774704933167, 0.4269622266292572, 0.51...negative4.0Great time had @Apple store on Friday. @Russel...positive
42Hey @apple are you even thinking about fixing ...[-0.9981245994567871, -0.04270806908607483, 0....negative1.0Hey @apple are you even thinking about fixing ...negative
43. @apple I don't think the '59' should be so c...[-1.193355679512024, 0.2766774296760559, -0.14...negative1.0. @apple I don't think the '59' should be so c...negative
44.@apple why do your computers like to crash on...[-1.2451688051223755, -0.2248333841562271, -0....negative5.0.@apple why do your computers like to crash on...negative
45Ha, poor @apple trying to make its iPad and Ma...[-0.7224618196487427, 0.03269221633672714, -0....negative5.0Ha, poor @apple trying to make its iPad and Ma...negative
46You'll be back in my life soon @apple[-1.220320701599121, -0.1481868475675583, -0.3...negative6.0You'll be back in my life soon @applepositive
47iTunes is pissing me tf off @apple[-1.0455917119979858, 0.08097667992115021, 0.3...negative1.0iTunes is pissing me tf off @applenegative
48RT @bchmura12: .@apple you suck[-0.9056015014648438, -0.7452876567840576, 0.6...negative2.0RT @bchmura12: .@apple you sucknegative
49Updated to Yosemite on two machines. Both are ...[-0.5752751231193542, 0.05041218921542168, -0....negative1.0Updated to Yosemite on two machines. Both are ...negative
\n", + "
\n", + "
\n", + "\n", + "
\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "
\n", + "\n", + "\n", + "
\n", + " \n", + "\n", + "\n", + "\n", + " \n", + "
\n", + "
\n", + "
\n" + ] + }, + "metadata": {}, + "execution_count": 3 + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "lVyOE2wV0fw_" + }, + "source": [ + "#4. Test the fitted pipe on new example" + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "qdCUg2MR0PD2", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 150 + }, + "outputId": "40c2a76d-9bf9-4b99-e4fe-6db107e98c60" + }, + "source": [ + "fitted_pipe.predict('I hate the newest update')" + ], + "execution_count": null, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "sentence_detector_dl download started this may take some time.\n", + "Approximate size to download 354.6 KB\n", + "[OK!]\n", + "Warning::Spark Session already created, some configs may not take.\n" + ] + }, + { + "output_type": "execute_result", + "data": { + "text/plain": [ + " sentence \\\n", + "0 I hate the newest update \n", + "\n", + " sentence_embedding_small_bert_L2_128 sentiment \\\n", + "0 [-1.3662102222442627, 0.10369864851236343, -0.... negative \n", + "\n", + " sentiment_confidence \n", + "0 1.0 " + ], + "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", + "
sentencesentence_embedding_small_bert_L2_128sentimentsentiment_confidence
0I hate the newest update[-1.3662102222442627, 0.10369864851236343, -0....negative1.0
\n", + "
\n", + "
\n", + "\n", + "
\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "
\n", + "\n", + "
\n", + "
\n" + ] + }, + "metadata": {}, + "execution_count": 4 + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "xflpwrVjjBVD" + }, + "source": [ + "##5. Configure pipe training parameters" + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "UtsAUGTmOTms", + "colab": { + "base_uri": "https://localhost:8080/" + }, + "outputId": "b831ec66-c65f-40f8-af41-e5c00fc87ee9" + }, + "source": [ + "trainable_pipe.print_info()" + ], + "execution_count": null, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "The following parameters are configurable for this NLU pipeline (You can copy paste the examples) :\n", + ">>> component_list['bert_sentence_embeddings@sent_small_bert_L2_128'] has settable params:\n", + "component_list['bert_sentence_embeddings@sent_small_bert_L2_128'].setBatchSize(8) | Info: Size of every batch | Currently set to : 8\n", + "component_list['bert_sentence_embeddings@sent_small_bert_L2_128'].setEngine('tensorflow') | Info: Deep Learning engine used for this model | Currently set to : tensorflow\n", + "component_list['bert_sentence_embeddings@sent_small_bert_L2_128'].setIsLong(False) | Info: Use Long type instead of Int type for inputs buffer - Some Bert models require Long instead of Int. | Currently set to : False\n", + "component_list['bert_sentence_embeddings@sent_small_bert_L2_128'].setMaxSentenceLength(128) | Info: Max sentence length to process | Currently set to : 128\n", + "component_list['bert_sentence_embeddings@sent_small_bert_L2_128'].setDimension(128) | Info: Number of embedding dimensions | Currently set to : 128\n", + "component_list['bert_sentence_embeddings@sent_small_bert_L2_128'].setCaseSensitive(False) | Info: whether to ignore case in tokens for embeddings matching | Currently set to : False\n", + "component_list['bert_sentence_embeddings@sent_small_bert_L2_128'].setStorageRef('sent_small_bert_L2_128') | Info: unique reference name for identification | Currently set to : sent_small_bert_L2_128\n", + ">>> component_list['document_assembler'] has settable params:\n", + "component_list['document_assembler'].setCleanupMode('shrink') | Info: possible values: disabled, inplace, inplace_full, shrink, shrink_full, each, each_full, delete_full | Currently set to : shrink\n", + ">>> component_list['sentiment_dl@sent_small_bert_L2_128'] has settable params:\n", + "component_list['sentiment_dl@sent_small_bert_L2_128'].setEngine('tensorflow') | Info: Deep Learning engine used for this model | Currently set to : tensorflow\n", + "component_list['sentiment_dl@sent_small_bert_L2_128'].setThreshold(0.6) | Info: The minimum threshold for the final result otheriwse it will be neutral | Currently set to : 0.6\n", + "component_list['sentiment_dl@sent_small_bert_L2_128'].setThresholdLabel('neutral') | Info: In case the score is less than threshold, what should be the label. Default is neutral. | Currently set to : neutral\n", + "component_list['sentiment_dl@sent_small_bert_L2_128'].setStorageRef('sent_small_bert_L2_128') | Info: unique reference name for identification | Currently set to : sent_small_bert_L2_128\n" + ] + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "2GJdDNV9jEIe" + }, + "source": [ + "##6. Retrain with new parameters" + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "mptfvHx-MMMX", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 736 + }, + "outputId": "a465590a-6409-4699-93df-734cc3ecde79" + }, + "source": [ + "# Train longer!\n", + "trainable_pipe = nlp.load('train.sentiment')\n", + "trainable_pipe['trainable_sentiment_dl'].setMaxEpochs(5)\n", + "fitted_pipe = trainable_pipe.fit(train_df.iloc[:100])\n", + "# predict with the trainable pipeline on dataset and get predictions\n", + "preds = fitted_pipe.predict(train_df.iloc[:100],output_level='document')\n", + "\n", + "#sentence detector that is part of the pipe generates sone NaNs. lets drop them first\n", + "preds.dropna(inplace=True)\n", + "print(classification_report(preds['y'], preds['sentiment']))\n", + "\n", + "preds" + ], + "execution_count": null, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Warning::Spark Session already created, some configs may not take.\n", + "Warning::Spark Session already created, some configs may not take.\n", + "sent_small_bert_L2_128 download started this may take some time.\n", + "Approximate size to download 16.1 MB\n", + "[OK!]\n", + " precision recall f1-score support\n", + "\n", + " negative 0.82 1.00 0.90 82\n", + " positive 0.00 0.00 0.00 18\n", + "\n", + " accuracy 0.82 100\n", + " macro avg 0.41 0.50 0.45 100\n", + "weighted avg 0.67 0.82 0.74 100\n", + "\n" + ] + }, + { + "output_type": "execute_result", + "data": { + "text/plain": [ + " document \\\n", + "0 @apple fucking let everyone name the group cha... \n", + "1 As a die hard @Apple customer, I must say I am... \n", + "2 RT @_iamGambino: Thank you @Apple \n", + "3 YO YOU AINT SHIT @apple \n", + "4 Theyre not RT @Naivana_: You gotta be kidding ... \n", + ".. ... \n", + "95 @Apple you need to sort your phones out. \n", + "96 Hey @apple, fuck you for thinking I want text ... \n", + "97 @Apple honestly sucks \n", + "98 How long does it really take for a phone to sh... \n", + "99 @whereiscooldude @Cyrus_T_Virus @Apple wait no... \n", + "\n", + " sentence_embedding_small_bert_L2_128 sentiment \\\n", + "0 [-1.5767942667007446, -0.2661866843700409, 0.1... negative \n", + "1 [-0.1864045411348343, 0.37810075283050537, -0.... negative \n", + "2 [-0.39863264560699463, -0.018525924533605576, ... negative \n", + "3 [-1.3272020816802979, -0.6504784226417542, -0.... negative \n", + "4 [-0.26906388998031616, 0.16873443126678467, 0.... negative \n", + ".. ... ... \n", + "95 [-0.788460910320282, 0.194553405046463, 0.0300... negative \n", + "96 [-0.7153223752975464, -0.0814858004450798, 0.2... negative \n", + "97 [-1.2007137537002563, -1.1623204946517944, 0.1... negative \n", + "98 [-0.9548358917236328, 0.6761127710342407, -0.1... negative \n", + "99 [-1.06529700756073, -0.23610278964042664, -0.4... negative \n", + "\n", + " sentiment_confidence text \\\n", + "0 1.0 @apple fucking let everyone name the group cha... \n", + "1 1.0 As a die hard @Apple customer, I must say I am... \n", + "2 1.0 RT @_iamGambino: Thank you @Apple \n", + "3 1.0 YO YOU AINT SHIT @apple \n", + "4 1.0 Theyre not RT @Naivana_: You gotta be kidding ... \n", + ".. ... ... \n", + "95 1.0 @Apple you need to sort your phones out. \n", + "96 1.0 Hey @apple, fuck you for thinking I want text ... \n", + "97 1.0 @Apple honestly sucks \n", + "98 1.0 How long does it really take for a phone to sh... \n", + "99 1.0 @whereiscooldude @Cyrus_T_Virus @Apple wait no... \n", + "\n", + " y \n", + "0 negative \n", + "1 negative \n", + "2 positive \n", + "3 negative \n", + "4 negative \n", + ".. ... \n", + "95 negative \n", + "96 negative \n", + "97 negative \n", + "98 negative \n", + "99 negative \n", + "\n", + "[100 rows x 6 columns]" + ], + "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", + " \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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
documentsentence_embedding_small_bert_L2_128sentimentsentiment_confidencetexty
0@apple fucking let everyone name the group cha...[-1.5767942667007446, -0.2661866843700409, 0.1...negative1.0@apple fucking let everyone name the group cha...negative
1As a die hard @Apple customer, I must say I am...[-0.1864045411348343, 0.37810075283050537, -0....negative1.0As a die hard @Apple customer, I must say I am...negative
2RT @_iamGambino: Thank you @Apple[-0.39863264560699463, -0.018525924533605576, ...negative1.0RT @_iamGambino: Thank you @Applepositive
3YO YOU AINT SHIT @apple[-1.3272020816802979, -0.6504784226417542, -0....negative1.0YO YOU AINT SHIT @applenegative
4Theyre not RT @Naivana_: You gotta be kidding ...[-0.26906388998031616, 0.16873443126678467, 0....negative1.0Theyre not RT @Naivana_: You gotta be kidding ...negative
.....................
95@Apple you need to sort your phones out.[-0.788460910320282, 0.194553405046463, 0.0300...negative1.0@Apple you need to sort your phones out.negative
96Hey @apple, fuck you for thinking I want text ...[-0.7153223752975464, -0.0814858004450798, 0.2...negative1.0Hey @apple, fuck you for thinking I want text ...negative
97@Apple honestly sucks[-1.2007137537002563, -1.1623204946517944, 0.1...negative1.0@Apple honestly sucksnegative
98How long does it really take for a phone to sh...[-0.9548358917236328, 0.6761127710342407, -0.1...negative1.0How long does it really take for a phone to sh...negative
99@whereiscooldude @Cyrus_T_Virus @Apple wait no...[-1.06529700756073, -0.23610278964042664, -0.4...negative1.0@whereiscooldude @Cyrus_T_Virus @Apple wait no...negative
\n", + "

100 rows × 6 columns

\n", + "
\n", + "
\n", + "\n", + "
\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "
\n", + "\n", + "\n", + "
\n", + " \n", + "\n", + "\n", + "\n", + " \n", + "
\n", + "
\n", + "
\n" + ] + }, + "metadata": {}, + "execution_count": 6 + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "qFoT-s1MjTSS" + }, + "source": [ + "#7. Try training with different Embeddings" + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "nxWFzQOhjWC8", + "colab": { + "base_uri": "https://localhost:8080/" + }, + "outputId": "4df8af5e-3076-43eb-cb0e-d2e0799f602e" + }, + "source": [ + "# We can use nlu.print_components(action='embed_sentence') to see every possibler sentence embedding we could use. Lets use bert!\n", + "nlp.nlu.print_components(action='embed_sentence')" + ], + "execution_count": null, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "For language NLU provides the following Models : \n", + "nlu.load('am.embed_sentence.xlm_roberta') returns Spark NLP model_anno_obj sent_xlm_roberta_base_finetuned_amharic\n", + "For language NLU provides the following Models : \n", + "nlu.load('de.embed_sentence.bert.base_cased') returns Spark NLP model_anno_obj sent_bert_base_cased\n", + "For language NLU provides the following Models : \n", + "nlu.load('el.embed_sentence.bert.base_uncased') returns Spark NLP model_anno_obj sent_bert_base_uncased\n", + "For language NLU provides the following Models : \n", + "nlu.load('en.embed_sentence') returns Spark NLP model_anno_obj tfhub_use\n", + "nlu.load('en.embed_sentence.albert') returns Spark NLP model_anno_obj albert_base_uncased\n", + "nlu.load('en.embed_sentence.bert') returns Spark NLP model_anno_obj sent_bert_base_uncased\n", + "nlu.load('en.embed_sentence.bert.base_uncased_legal') returns Spark NLP model_anno_obj sent_bert_base_uncased_legal\n", + "nlu.load('en.embed_sentence.bert.finetuned') returns Spark NLP model_anno_obj sbert_setfit_finetuned_financial_text_classification\n", + "nlu.load('en.embed_sentence.bert.pubmed') returns Spark NLP model_anno_obj sent_bert_pubmed\n", + "nlu.load('en.embed_sentence.bert.pubmed_squad2') returns Spark NLP model_anno_obj sent_bert_pubmed_squad2\n", + "nlu.load('en.embed_sentence.bert.wiki_books') returns Spark NLP model_anno_obj sent_bert_wiki_books\n", + "nlu.load('en.embed_sentence.bert.wiki_books_mnli') returns Spark NLP model_anno_obj sent_bert_wiki_books_mnli\n", + "nlu.load('en.embed_sentence.bert.wiki_books_qnli') returns Spark NLP model_anno_obj sent_bert_wiki_books_qnli\n", + "nlu.load('en.embed_sentence.bert.wiki_books_qqp') returns Spark NLP model_anno_obj sent_bert_wiki_books_qqp\n", + "nlu.load('en.embed_sentence.bert.wiki_books_squad2') returns Spark NLP model_anno_obj sent_bert_wiki_books_squad2\n", + "nlu.load('en.embed_sentence.bert.wiki_books_sst2') returns Spark NLP model_anno_obj sent_bert_wiki_books_sst2\n", + "nlu.load('en.embed_sentence.bert_base_cased') returns Spark NLP model_anno_obj sent_bert_base_cased\n", + "nlu.load('en.embed_sentence.bert_base_uncased') returns Spark NLP model_anno_obj sent_bert_base_uncased\n", + "nlu.load('en.embed_sentence.bert_large_cased') returns Spark NLP model_anno_obj sent_bert_large_cased\n", + "nlu.load('en.embed_sentence.bert_large_uncased') returns Spark NLP model_anno_obj sent_bert_large_uncased\n", + "nlu.load('en.embed_sentence.bert_use_cmlm_en_base') returns Spark NLP model_anno_obj sent_bert_use_cmlm_en_base\n", + "nlu.load('en.embed_sentence.bert_use_cmlm_en_large') returns Spark NLP model_anno_obj sent_bert_use_cmlm_en_large\n", + "nlu.load('en.embed_sentence.biobert.clinical_base_cased') returns Spark NLP model_anno_obj sent_biobert_clinical_base_cased\n", + "nlu.load('en.embed_sentence.biobert.discharge_base_cased') returns Spark NLP model_anno_obj sent_biobert_discharge_base_cased\n", + "nlu.load('en.embed_sentence.biobert.pmc_base_cased') returns Spark NLP model_anno_obj sent_biobert_pmc_base_cased\n", + "nlu.load('en.embed_sentence.biobert.pubmed_base_cased') returns Spark NLP model_anno_obj sent_biobert_pubmed_base_cased\n", + "nlu.load('en.embed_sentence.biobert.pubmed_large_cased') returns Spark NLP model_anno_obj sent_biobert_pubmed_large_cased\n", + "nlu.load('en.embed_sentence.biobert.pubmed_pmc_base_cased') returns Spark NLP model_anno_obj sent_biobert_pubmed_pmc_base_cased\n", + "nlu.load('en.embed_sentence.covidbert.large_uncased') returns Spark NLP model_anno_obj sent_covidbert_large_uncased\n", + "nlu.load('en.embed_sentence.distil_roberta.distilled_base') returns Spark NLP model_anno_obj sent_distilroberta_base\n", + "nlu.load('en.embed_sentence.doc2vec') returns Spark NLP model_anno_obj doc2vec_gigaword_300\n", + "nlu.load('en.embed_sentence.doc2vec.gigaword_300') returns Spark NLP model_anno_obj doc2vec_gigaword_300\n", + "nlu.load('en.embed_sentence.doc2vec.gigaword_wiki_300') returns Spark NLP model_anno_obj doc2vec_gigaword_wiki_300\n", + "nlu.load('en.embed_sentence.electra') returns Spark NLP model_anno_obj sent_electra_small_uncased\n", + "nlu.load('en.embed_sentence.electra_base_uncased') returns Spark NLP model_anno_obj sent_electra_base_uncased\n", + "nlu.load('en.embed_sentence.electra_large_uncased') returns Spark NLP model_anno_obj sent_electra_large_uncased\n", + "nlu.load('en.embed_sentence.electra_small_uncased') returns Spark NLP model_anno_obj sent_electra_small_uncased\n", + "nlu.load('en.embed_sentence.roberta.base') returns Spark NLP model_anno_obj sent_roberta_base\n", + "nlu.load('en.embed_sentence.roberta.large') returns Spark NLP model_anno_obj sent_roberta_large\n", + "nlu.load('en.embed_sentence.small_bert_L10_128') returns Spark NLP model_anno_obj sent_small_bert_L10_128\n", + "nlu.load('en.embed_sentence.small_bert_L10_256') returns Spark NLP model_anno_obj sent_small_bert_L10_256\n", + "nlu.load('en.embed_sentence.small_bert_L10_512') returns Spark NLP model_anno_obj sent_small_bert_L10_512\n", + "nlu.load('en.embed_sentence.small_bert_L10_768') returns Spark NLP model_anno_obj sent_small_bert_L10_768\n", + "nlu.load('en.embed_sentence.small_bert_L12_128') returns Spark NLP model_anno_obj sent_small_bert_L12_128\n", + "nlu.load('en.embed_sentence.small_bert_L12_256') returns Spark NLP model_anno_obj sent_small_bert_L12_256\n", + "nlu.load('en.embed_sentence.small_bert_L12_512') returns Spark NLP model_anno_obj sent_small_bert_L12_512\n", + "nlu.load('en.embed_sentence.small_bert_L12_768') returns Spark NLP model_anno_obj sent_small_bert_L12_768\n", + "nlu.load('en.embed_sentence.small_bert_L2_128') returns Spark NLP model_anno_obj sent_small_bert_L2_128\n", + "nlu.load('en.embed_sentence.small_bert_L2_256') returns Spark NLP model_anno_obj sent_small_bert_L2_256\n", + "nlu.load('en.embed_sentence.small_bert_L2_512') returns Spark NLP model_anno_obj sent_small_bert_L2_512\n", + "nlu.load('en.embed_sentence.small_bert_L2_768') returns Spark NLP model_anno_obj sent_small_bert_L2_768\n", + "nlu.load('en.embed_sentence.small_bert_L4_128') returns Spark NLP model_anno_obj sent_small_bert_L4_128\n", + "nlu.load('en.embed_sentence.small_bert_L4_256') returns Spark NLP model_anno_obj sent_small_bert_L4_256\n", + "nlu.load('en.embed_sentence.small_bert_L4_512') returns Spark NLP model_anno_obj sent_small_bert_L4_512\n", + "nlu.load('en.embed_sentence.small_bert_L4_768') returns Spark NLP model_anno_obj sent_small_bert_L4_768\n", + "nlu.load('en.embed_sentence.small_bert_L6_128') returns Spark NLP model_anno_obj sent_small_bert_L6_128\n", + "nlu.load('en.embed_sentence.small_bert_L6_256') returns Spark NLP model_anno_obj sent_small_bert_L6_256\n", + "nlu.load('en.embed_sentence.small_bert_L6_512') returns Spark NLP model_anno_obj sent_small_bert_L6_512\n", + "nlu.load('en.embed_sentence.small_bert_L6_768') returns Spark NLP model_anno_obj sent_small_bert_L6_768\n", + "nlu.load('en.embed_sentence.small_bert_L8_128') returns Spark NLP model_anno_obj sent_small_bert_L8_128\n", + "nlu.load('en.embed_sentence.small_bert_L8_256') returns Spark NLP model_anno_obj sent_small_bert_L8_256\n", + "nlu.load('en.embed_sentence.small_bert_L8_512') returns Spark NLP model_anno_obj sent_small_bert_L8_512\n", + "nlu.load('en.embed_sentence.small_bert_L8_768') returns Spark NLP model_anno_obj sent_small_bert_L8_768\n", + "nlu.load('en.embed_sentence.tfhub_use') returns Spark NLP model_anno_obj tfhub_use\n", + "nlu.load('en.embed_sentence.tfhub_use.lg') returns Spark NLP model_anno_obj tfhub_use_lg\n", + "nlu.load('en.embed_sentence.use') returns Spark NLP model_anno_obj tfhub_use\n", + "nlu.load('en.embed_sentence.use.lg') returns Spark NLP model_anno_obj tfhub_use_lg\n", + "For language NLU provides the following Models : \n", + "nlu.load('es.embed_sentence.bert.base_cased') returns Spark NLP model_anno_obj sent_bert_base_cased\n", + "nlu.load('es.embed_sentence.bert.base_uncased') returns Spark NLP model_anno_obj sent_bert_base_uncased\n", + "For language NLU provides the following Models : \n", + "nlu.load('fi.embed_sentence.bert') returns Spark NLP model_anno_obj bert_base_finnish_uncased\n", + "nlu.load('fi.embed_sentence.bert.cased') returns Spark NLP model_anno_obj bert_base_finnish_cased\n", + "nlu.load('fi.embed_sentence.bert.uncased') returns Spark NLP model_anno_obj bert_base_finnish_uncased\n", + "For language NLU provides the following Models : \n", + "nlu.load('ha.embed_sentence.xlm_roberta') returns Spark NLP model_anno_obj sent_xlm_roberta_base_finetuned_hausa\n", + "For language NLU provides the following Models : \n", + "nlu.load('ig.embed_sentence.xlm_roberta') returns Spark NLP model_anno_obj sent_xlm_roberta_base_finetuned_igbo\n", + "For language NLU provides the following Models : \n", + "nlu.load('lg.embed_sentence.xlm_roberta') returns Spark NLP model_anno_obj sent_xlm_roberta_base_finetuned_luganda\n", + "For language NLU provides the following Models : \n", + "nlu.load('nl.embed_sentence.bert.base_cased') returns Spark NLP model_anno_obj sent_bert_base_cased\n", + "For language NLU provides the following Models : \n", + "nlu.load('pcm.embed_sentence.xlm_roberta') returns Spark NLP model_anno_obj sent_xlm_roberta_base_finetuned_naija\n", + "For language NLU provides the following Models : \n", + "nlu.load('pt.embed_sentence.bert.base_legal') returns Spark NLP model_anno_obj sbert_legal_bertimbau_base_tsdae_sts\n", + "nlu.load('pt.embed_sentence.bert.cased_large_legal') returns Spark NLP model_anno_obj sbert_bert_large_portuguese_cased_legal_mlm_sts_v0.1\n", + "nlu.load('pt.embed_sentence.bert.large_legal') returns Spark NLP model_anno_obj sbert_legal_bertimbau_large_gpl_sts\n", + "nlu.load('pt.embed_sentence.bert.legal.cased_large_mlm_sts_v0.10.by_stjiris') returns Spark NLP model_anno_obj sbert_bert_large_portuguese_cased_legal_mlm_sts_v0.10\n", + "nlu.load('pt.embed_sentence.bert.legal.cased_large_mlm_sts_v0.2.by_stjiris') returns Spark NLP model_anno_obj sbert_bert_large_portuguese_cased_legal_mlm_sts_v0.2\n", + "nlu.load('pt.embed_sentence.bert.legal.cased_large_mlm_sts_v0.3.by_stjiris') returns Spark NLP model_anno_obj sbert_bert_large_portuguese_cased_legal_mlm_sts_v0.3\n", + "nlu.load('pt.embed_sentence.bert.legal.cased_large_mlm_sts_v0.4.by_stjiris') returns Spark NLP model_anno_obj sbert_bert_large_portuguese_cased_legal_mlm_sts_v0.4\n", + "nlu.load('pt.embed_sentence.bert.legal.cased_large_mlm_sts_v0.5.by_stjiris') returns Spark NLP model_anno_obj sbert_bert_large_portuguese_cased_legal_mlm_sts_v0.5\n", + "nlu.load('pt.embed_sentence.bert.legal.cased_large_mlm_sts_v0.7.by_stjiris') returns Spark NLP model_anno_obj sbert_bert_large_portuguese_cased_legal_mlm_sts_v0.7\n", + "nlu.load('pt.embed_sentence.bert.legal.cased_large_mlm_sts_v0.8.by_stjiris') returns Spark NLP model_anno_obj sbert_bert_large_portuguese_cased_legal_mlm_sts_v0.8\n", + "nlu.load('pt.embed_sentence.bert.legal.cased_large_mlm_sts_v0.9.by_stjiris') returns Spark NLP model_anno_obj sbert_bert_large_portuguese_cased_legal_mlm_sts_v0.9\n", + "nlu.load('pt.embed_sentence.bert.legal.cased_large_mlm_sts_v1.0.by_stjiris') returns Spark NLP model_anno_obj sbert_bert_large_portuguese_cased_legal_mlm_sts_v1.0\n", + "nlu.load('pt.embed_sentence.bert.legal.cased_large_mlm_v0.11_gpl_nli_sts_v0.by_stjiris') returns Spark NLP model_anno_obj sbert_bert_large_portuguese_cased_legal_mlm_v0.11_gpl_nli_sts_v0\n", + "nlu.load('pt.embed_sentence.bert.legal.cased_large_mlm_v0.11_gpl_nli_sts_v1.by_stjiris') returns Spark NLP model_anno_obj sbert_bert_large_portuguese_cased_legal_mlm_v0.11_gpl_nli_sts_v1\n", + "nlu.load('pt.embed_sentence.bert.legal.cased_large_mlm_v0.11_nli_sts_v0.by_stjiris') returns Spark NLP model_anno_obj sbert_bert_large_portuguese_cased_legal_mlm_v0.11_nli_sts_v0\n", + "nlu.load('pt.embed_sentence.bert.legal.cased_large_mlm_v0.11_nli_sts_v1.by_stjiris') returns Spark NLP model_anno_obj sbert_bert_large_portuguese_cased_legal_mlm_v0.11_nli_sts_v1\n", + "nlu.load('pt.embed_sentence.bert.legal.cased_large_mlm_v0.11_sts_v0.by_stjiris') returns Spark NLP model_anno_obj sbert_bert_large_portuguese_cased_legal_mlm_v0.11_sts_v0\n", + "nlu.load('pt.embed_sentence.bert.legal.cased_large_mlm_v0.11_sts_v1.by_stjiris') returns Spark NLP model_anno_obj sbert_bert_large_portuguese_cased_legal_mlm_v0.11_sts_v1\n", + "nlu.load('pt.embed_sentence.bert.v2_base_legal') returns Spark NLP model_anno_obj sbert_legal_bertimbau_sts_base_ma_v2\n", + "nlu.load('pt.embed_sentence.bert.v2_large_legal') returns Spark NLP model_anno_obj sbert_legal_bertimbau_large_tsdae_sts_v2\n", + "nlu.load('pt.embed_sentence.bertimbau.legal.assin.base.by_rufimelo') returns Spark NLP model_anno_obj sbert_legal_bertimbau_sts_base_ma\n", + "nlu.load('pt.embed_sentence.bertimbau.legal.assin2.base.by_rufimelo') returns Spark NLP model_anno_obj sbert_legal_bertimbau_sts_base\n", + "nlu.load('pt.embed_sentence.bertimbau.legal.large_sts_by_rufimelo') returns Spark NLP model_anno_obj sbert_legal_bertimbau_sts_large\n", + "nlu.load('pt.embed_sentence.bertimbau.legal.large_sts_ma.by_rufimelo') returns Spark NLP model_anno_obj sbert_legal_bertimbau_sts_large_ma\n", + "nlu.load('pt.embed_sentence.bertimbau.legal.large_sts_ma_v3.by_rufimelo') returns Spark NLP model_anno_obj sbert_legal_bertimbau_sts_large_ma_v3\n", + "nlu.load('pt.embed_sentence.bertimbau.legal.large_tsdae_sts.by_rufimelo') returns Spark NLP model_anno_obj sbert_legal_bertimbau_large_tsdae_sts\n", + "nlu.load('pt.embed_sentence.bertimbau.legal.large_tsdae_sts_v4.by_rufimelo') returns Spark NLP model_anno_obj sbert_legal_bertimbau_large_tsdae_sts_v4\n", + "nlu.load('pt.embed_sentence.bertimbau.legal.large_tsdae_v4_gpl_sts.by_rufimelo') returns Spark NLP model_anno_obj sbert_legal_bertimbau_large_tsdae_v4_gpl_sts\n", + "nlu.load('pt.embed_sentence.bertimbau.legal.v2_large_sts_v2.by_rufimelo') returns Spark NLP model_anno_obj sbert_legal_bertimbau_sts_large_v2\n", + "nlu.load('pt.embed_sentence.bertimbau.legal.v2_large_v2_sts.by_rufimelo') returns Spark NLP model_anno_obj sbert_legal_bertimbau_large_v2_sts\n", + "For language NLU provides the following Models : \n", + "nlu.load('rw.embed_sentence.xlm_roberta') returns Spark NLP model_anno_obj sent_xlm_roberta_base_finetuned_kinyarwanda\n", + "For language NLU provides the following Models : \n", + "nlu.load('sv.embed_sentence.bert.base_cased') returns Spark NLP model_anno_obj sent_bert_base_cased\n", + "For language NLU provides the following Models : \n", + "nlu.load('sw.embed_sentence.xlm_roberta') returns Spark NLP model_anno_obj sent_xlm_roberta_base_finetuned_swahili\n", + "For language NLU provides the following Models : \n", + "nlu.load('wo.embed_sentence.xlm_roberta') returns Spark NLP model_anno_obj sent_xlm_roberta_base_finetuned_wolof\n", + "For language NLU provides the following Models : \n", + "nlu.load('xx.embed_sentence') returns Spark NLP model_anno_obj sent_bert_multi_cased\n", + "nlu.load('xx.embed_sentence.bert') returns Spark NLP model_anno_obj sent_bert_multi_cased\n", + "nlu.load('xx.embed_sentence.bert.cased') returns Spark NLP model_anno_obj sent_bert_multi_cased\n", + "nlu.load('xx.embed_sentence.bert.muril') returns Spark NLP model_anno_obj sent_bert_muril\n", + "nlu.load('xx.embed_sentence.bert_use_cmlm_multi_base') returns Spark NLP model_anno_obj sent_bert_use_cmlm_multi_base\n", + "nlu.load('xx.embed_sentence.bert_use_cmlm_multi_base_br') returns Spark NLP model_anno_obj sent_bert_use_cmlm_multi_base_br\n", + "nlu.load('xx.embed_sentence.labse') returns Spark NLP model_anno_obj labse\n", + "nlu.load('xx.embed_sentence.xlm_roberta.base') returns Spark NLP model_anno_obj sent_xlm_roberta_base\n", + "For language NLU provides the following Models : \n", + "nlu.load('yo.embed_sentence.xlm_roberta') returns Spark NLP model_anno_obj sent_xlm_roberta_base_finetuned_yoruba\n", + "For language NLU provides the following Models : \n", + "nlu.load('zh.embed_sentence.bert') returns Spark NLP model_anno_obj sbert_chinese_qmc_finance_v1\n", + "nlu.load('zh.embed_sentence.bert.distilled') returns Spark NLP model_anno_obj sbert_chinese_qmc_finance_v1_distill\n" + ] + } + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "eLex095goHwm", + "colab": { + "base_uri": "https://localhost:8080/" + }, + "outputId": "b860cf26-d169-410a-931c-57d98997255f" + }, + "source": [ + "trainable_pipe = nlp.load('en.embed_sentence.small_bert_L12_768 train.sentiment')\n", + "# We need to train longer and user smaller LR for NON-USE based sentence embeddings usually\n", + "# We could tune the hyperparameters further with hyperparameter tuning methods like gridsearch\n", + "# Also longer training gives more accuracy\n", + "trainable_pipe['trainable_sentiment_dl'].setMaxEpochs(110)\n", + "trainable_pipe['trainable_sentiment_dl'].setLr(0.0005)\n", + "fitted_pipe = trainable_pipe.fit(train_df)\n", + "# predict with the trainable pipeline on dataset and get predictions\n", + "preds = fitted_pipe.predict(train_df,output_level='document')\n", + "\n", + "#sentence detector that is part of the pipe generates sone NaNs. lets drop them first\n", + "preds.dropna(inplace=True)\n", + "print(classification_report(preds['y'], preds['sentiment']))\n", + "\n", + "#preds" + ], + "execution_count": null, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Warning::Spark Session already created, some configs may not take.\n", + "Warning::Spark Session already created, some configs may not take.\n", + "sent_small_bert_L12_768 download started this may take some time.\n", + "Approximate size to download 392.9 MB\n", + "[OK!]\n", + " precision recall f1-score support\n", + "\n", + " negative 0.83 1.00 0.91 551\n", + " positive 0.00 0.00 0.00 112\n", + "\n", + " accuracy 0.83 663\n", + " macro avg 0.42 0.50 0.45 663\n", + "weighted avg 0.69 0.83 0.75 663\n", + "\n" + ] + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "_1jxw3GnVGlI" + }, + "source": [ + "# 7.1 evaluate on Test Data" + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "Fxx4yNkNVGFl", + "colab": { + "base_uri": "https://localhost:8080/" + }, + "outputId": "073133f0-e3be-4d87-c114-bc0c0a6d21e1" + }, + "source": [ + "preds = fitted_pipe.predict(test_df,output_level='document')\n", + "\n", + "#sentence detector that is part of the pipe generates sone NaNs. lets drop them first\n", + "preds.dropna(inplace=True)\n", + "print(classification_report(preds['y'], preds['sentiment']))" + ], + "execution_count": null, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + " precision recall f1-score support\n", + "\n", + " negative 0.81 1.00 0.90 135\n", + " positive 0.00 0.00 0.00 31\n", + "\n", + " accuracy 0.81 166\n", + " macro avg 0.41 0.50 0.45 166\n", + "weighted avg 0.66 0.81 0.73 166\n", + "\n" + ] + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "2BB-NwZUoHSe" + }, + "source": [ + "# 8. Lets save the model" + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "bZZpObLOtqo8" + }, + "source": [ + "stored_model_path = './models/classifier_dl_trained'\n", + "fitted_pipe.save(stored_model_path)" + ], + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "e_b2DPd4rCiU" + }, + "source": [ + "# 9. Lets load the model from HDD.\n", + "This makes Offlien NLU usage possible! \n", + "You need to call nlu.load(path=path_to_the_pipe) to load a model/pipeline from disk." + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "SO4uz45MoRgp", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 133 + }, + "outputId": "63658ab4-ed77-46fb-843f-47d0e8eb4bfa" + }, + "source": [ + "hdd_pipe = nlp.load(path=stored_model_path)\n", + "\n", + "preds = hdd_pipe.predict('I hate the newest update')\n", + "preds" + ], + "execution_count": null, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Warning::Spark Session already created, some configs may not take.\n", + "Warning::Spark Session already created, some configs may not take.\n", + "Warning::Spark Session already created, some configs may not take.\n" + ] + }, + { + "output_type": "execute_result", + "data": { + "text/plain": [ + " document \\\n", + "0 I hate the newest update \n", + "\n", + " sentence_embedding_from_disk sentiment \\\n", + "0 [-0.3084234893321991, -0.1103060245513916, 0.1... negative \n", + "\n", + " sentiment_confidence \n", + "0 2.0 " + ], + "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", + "
documentsentence_embedding_from_disksentimentsentiment_confidence
0I hate the newest update[-0.3084234893321991, -0.1103060245513916, 0.1...negative2.0
\n", + "
\n", + "
\n", + "\n", + "
\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "
\n", + "\n", + "
\n", + "
\n" + ] + }, + "metadata": {}, + "execution_count": 12 + } + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "e0CVlkk9v6Qi", + "colab": { + "base_uri": "https://localhost:8080/" + }, + "outputId": "60215391-eb4e-42c0-94ff-51e4dedbe5fe" + }, + "source": [ + "hdd_pipe.print_info()" + ], + "execution_count": null, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "The following parameters are configurable for this NLU pipeline (You can copy paste the examples) :\n", + ">>> component_list['document_assembler'] has settable params:\n", + "component_list['document_assembler'].setCleanupMode('shrink') | Info: possible values: disabled, inplace, inplace_full, shrink, shrink_full, each, each_full, delete_full | Currently set to : shrink\n", + ">>> component_list['bert_sentence_embeddings@sent_small_bert_L12_768'] has settable params:\n", + "component_list['bert_sentence_embeddings@sent_small_bert_L12_768'].setBatchSize(8) | Info: Size of every batch | Currently set to : 8\n", + "component_list['bert_sentence_embeddings@sent_small_bert_L12_768'].setCaseSensitive(False) | Info: whether to ignore case in tokens for embeddings matching | Currently set to : False\n", + "component_list['bert_sentence_embeddings@sent_small_bert_L12_768'].setDimension(768) | Info: Number of embedding dimensions | Currently set to : 768\n", + "component_list['bert_sentence_embeddings@sent_small_bert_L12_768'].setMaxSentenceLength(128) | Info: Max sentence length to process | Currently set to : 128\n", + "component_list['bert_sentence_embeddings@sent_small_bert_L12_768'].setEngine('tensorflow') | Info: Deep Learning engine used for this model | Currently set to : tensorflow\n", + "component_list['bert_sentence_embeddings@sent_small_bert_L12_768'].setIsLong(False) | Info: Use Long type instead of Int type for inputs buffer - Some Bert models require Long instead of Int. | Currently set to : False\n", + "component_list['bert_sentence_embeddings@sent_small_bert_L12_768'].setStorageRef('sent_small_bert_L12_768') | Info: unique reference name for identification | Currently set to : sent_small_bert_L12_768\n", + ">>> component_list['sentiment_dl@sent_small_bert_L12_768'] has settable params:\n", + "component_list['sentiment_dl@sent_small_bert_L12_768'].setThreshold(0.6) | Info: The minimum threshold for the final result otheriwse it will be neutral | Currently set to : 0.6\n", + "component_list['sentiment_dl@sent_small_bert_L12_768'].setThresholdLabel('neutral') | Info: In case the score is less than threshold, what should be the label. Default is neutral. | Currently set to : neutral\n", + "component_list['sentiment_dl@sent_small_bert_L12_768'].setEngine('tensorflow') | Info: Deep Learning engine used for this model | Currently set to : tensorflow\n", + "component_list['sentiment_dl@sent_small_bert_L12_768'].setClasses(['positive', 'negative']) | Info: get the tags used to trained this SentimentDLModel | Currently set to : ['positive', 'negative']\n", + "component_list['sentiment_dl@sent_small_bert_L12_768'].setStorageRef('sent_small_bert_L12_768') | Info: unique reference name for identification | Currently set to : sent_small_bert_L12_768\n" + ] + } + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "cbwS4bE0uT7d" + }, + "source": [], + "execution_count": null, + "outputs": [] + } + ] +} \ No newline at end of file diff --git a/examples/colab/Training/binary_text_classification/NLU_training_sentiment_classifier_demo_covid_19.ipynb b/examples/colab/Training/binary_text_classification/NLU_training_sentiment_classifier_demo_covid_19.ipynb index d55e2c17..89061c68 100644 --- a/examples/colab/Training/binary_text_classification/NLU_training_sentiment_classifier_demo_covid_19.ipynb +++ b/examples/colab/Training/binary_text_classification/NLU_training_sentiment_classifier_demo_covid_19.ipynb @@ -1 +1,4135 @@ -{"nbformat":4,"nbformat_minor":0,"metadata":{"colab":{"name":"NLU_training_sentiment_classifier_demo_covid_19.ipynb","provenance":[],"collapsed_sections":[],"toc_visible":true},"kernelspec":{"display_name":"Python 3","name":"python3"}},"cells":[{"cell_type":"markdown","metadata":{"id":"zkufh760uvF3"},"source":["![JohnSnowLabs](https://nlp.johnsnowlabs.com/assets/images/logo.png)\n","\n","[![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/JohnSnowLabs/nlu/blob/master/examples/colab/Training/binary_text_classification/NLU_training_sentiment_classifier_demo_covid_19.ipynb)\n","\n","\n","\n","# Training a Sentiment Analysis Classifier with NLU \n","## 2 Class COVID-19 Sentiment Classifer Training\n","With the [SentimentDL model](https://nlp.johnsnowlabs.com/docs/en/annotators#sentimentdl-multi-class-sentiment-analysis-annotator) from Spark NLP you can achieve State Of the Art results on any multi class text classification problem \n","\n","This notebook showcases the following features : \n","\n","- How to train the deep learning classifier\n","- How to store a pipeline to disk\n","- How to load the pipeline from disk (Enables NLU offline mode)\n","\n","\n","You can achieve these results or even better on this dataset with training data:\n","\n","\n","
\n","\n","![image.png](data:image/png;base64,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)\n","\n","\n","You can achieve these results or even better on this dataset with training data:\n","\n","\n","
\n","\n","![Screenshot 2021-02-25 190003.png](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAf4AAADTCAYAAABgKnF5AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAAFiUAABYlAUlSJPAAADAHSURBVHhe7Z1PiBVX+r/L30qR7xCJyYCC0uKEAcFRsjCiwVlIr1Q00Ehmk/EfuDDqQsy4MTgbx+BCjAOCSM9mInQgcTSzESEREduFKIIgregoxMX4LzMwxl3/+jl935u3j3Vv1b197b63zueB07dv1alTVe95z3nf8566dWb861//Gs2a8Otf/7r2nxBCCCF6nRmjY9T+F0IIIUTF+X+1TyGEEEIkgAy/EEIIkRAy/EIIIURCyPALIYQQCSHDL4QQQiSEDL8QQgiREDL8QgghRELI8AshhBAJIcMvhBBCJIQMvxBCCJEQMvxCCCFEQsjwi57i66+/zhYtWhQ+2+XevXvZhx9+mO3duzf7+eefa1vFmwQ5I2/qjpQn+xcvXmQfffRRPc8XX3xR2/PmuHbtWv18U3VOIaYbGX4hxBtn1qxZ2bFjx7L79+9nR44cqW2dyJw5c7Jvvvkm5Nm5c2dt65sDB3Dfvn3ZmTNnwjlJ+/fvr+0dB0cAhwAHQYg8zKmdzGBkqpHhFz3FwMBA6KD5bJfFixdnly9fDoYIgyTS5MaNG9n777+fLV26tLblFywS8O6772bz58+vbRWiGsjwCyGEgykHogDXr1/PVq9eXdsqRHWQ4RcNIXRFCOuHH36oz4EyN06I1LA8jx8/rs/PxnnAQqaW8kKncR4/3xrPxTYKvcZl+LnksnPIza7DykAmlF1U1nRTpn5iufA/22KayQU4V7P93YC/188++yw7d+5ctmTJkvDd5MKUA9EgPicL5VGul0usu3GeuH7K7N+0aVP49HUUh57j+mvUht40sb6R7FotbO51Jw6ll2mD3Bt5+PSyi+85lokvA/hO8nVg7cOuA/1Bj9AnK8fydC2jQjRgaGhotK+vb3SsUxl9/vx52HbkyJHRPXv2jL58+TJ8tzxjI6PRu3fvhm1xnvg7+cg/PDwcvrOd/f48jWA/+exYD9fiz9MMrokUE1+rnc/y2nfu2a4hvp9uoqh+7H7IZ/C/r4sy9cO9+zJMJn6bwbaiempUP52kzHVMpm5Nts2OZR/1kycnyDs/eX19Wh5fDvl9nlivJ3Nfk8F0qdH92n5f9/Exvg3atvh+TK5eBuT1OhzLxMr15+Z/yrHjylxfL6ARv2jKsmXLstOnT9dHP3iyDx8+zH788cfwHZgDHRwcDHPnsGbNmuzRo0fZq1evgqd89erVbNeuXfX5dPKtX78+u3TpUvh+69atEFbFs57sKIty/LW1Atd6/vz57OOPP65fK9eDJz/WkUzw4McafrZixYrw/9tvv52988474f9upFn9XLx4MVuwYEG2bt26sA/Wrl0bPkdGRsJnmfpBFv65C87J/HmViSMcpLxRtOl5DCNZphR4kLHRMys87Bg/h0BdsY1nFDzopJXz3nvvBZ189uxZqTY41Vy5cqUeiWsXf7959xPrvdfrVtq67wPJu2rVqhBBm+z1Tycy/KJlnj59GjoUgw4G42dgBOiwzEiQv7+/f0IHefLkybDPiMtoBzqB3bt3188Vh0TLMHfu3NzrePLkyYR77iWK6seHu0kYlZs3b4Z9RlH9WNjTyrDwZ5VB3+zXAJbMGQTki8HAkJhc4lAyjI0oa//lM2/evLpx8jx48KD23zg4cAbnpo7tesq0wamA+zh8+HD433SOcH2njGgZg4zTC2XbOnKdOXNm7dt4vff6g8Ey/KJlGjWYRpD/woULr3WS8U+nOoHvjHECtmzZ0rLxz6MTjkm3smHDhuz27dsT6obkjVgz6GgPHTqUffDBB/VjKY9yU8cMMDIhaoITkGf826HIYfBMZRssAoNpP+1ET+DAgQMdMf6NnCSPd5DyqHJbN2T4RWlomCdOnMhWrlxZD58VQbht4cKF4bhGDZuwJGA8OtH4jeXLl4cOryx518pIlpAiIUEbIVcJZIRB+u6772pbXqed+qG8qo/4WwX9wTkyMFCEjQkvN3rQjmkZRuZ+P7Jl1Gqh6yLKtMHpwmRg8B3jbSN3Ek5BkS4hH0L3RJ0acerUqWD0mTbpZFu3a+7E9MVUIcMvmkLIl9AvITlCczTSVkYJNIo4tGfJOjMa2d///vfwv8/jR0b8zzYLQ9M4G+WxRGjzT3/6U91J4Xy2j86UxP/2BG7etXI+zmVziVUD2TAPevz48bpsvEygqH6QGzIyeZIIQ/uX8BB1saei/dP0fjqmqH6mCjpve1ocHeKZkTx9K8LfsyUM2qefflrLMR6hYp7fyid5mRB1iffz3T93U0SZNjhVUI9+SojE/Xz++efhOmHHjh3BseFaSfQ5eS908k/RY7DRKT8god789AZYiL7Tbd1fM2VNtc62ygye8Kv9L8QEeHip1U5GCCHeJBjUbdu2NTXSODS8ldE/3Cd+QSN+IYQQIiFk+IUQQoiEUKhfCCGESAiN+IUQQoiEkOEXQgghEkKGXwghhEgIGX4hhBAiIWT4hRBCiISQ4RdCCCESQoZfCCGESAgZfiGEECIhZPiFEEKIhJDhF0IIIRJChl8IIYRICBl+IYQQIiFk+IUQQoiEkOEXQgghEkKGXwghhEgIGX4hhBAiIWT4hRBCiISQ4RdCCCESQoZfCCGESAgZfiGEECIhZPiFEEKIhJDhF0IIIRJChl8IIYRICBn+aeLrr7/OFi1aFD6FEEKIqUKGv8P8/PPP2d69e2XQp4kvvvgiOFSkDz/8MLt3715tT3l8GSTqk3oFyqNcv98Sx1WV+L7budc82V27dq229xfifFVvS53QWeRoZcTl5MndUpV1Fl68eJF99NFHIfF/jA3ALOXpI1gdNdpfdJ6uY1R0lJcvX47u2bNndGhoqLZFTBVHjhwZ3bRp0+jz58/Dd+pg9erVo3fv3g3fy0AZ1B/1CJRFmWxvhOWpap0jP+Ro91dGJjFWxvDwcG1Lfv20U2e9TCd0FpnGx8TlxlRdZ8Fk8Ne//jVXFrGskWNfX98EHbVtg4ODIa/fZxSdpxvRiF9UAkY158+fzz777LNszpw5Ydu6deuy999/P/vmm2/C9yIY1T9+/DibN29eNmvWrLCNsj744IPwfyMuXrwYPteuXRs+qwbyQ47IE5AJckbeZUenz549C59vv/12+ITly5dnc+fOrX0br8OvvvoqG+tks8WLF9e2VpdO6Cw8evQoe+eddybIds2aNbX/8qm6ztrIHDkimxhG5WfOnMl2795d17UVK1ZkO3fuDNvpCyzP9evXszGjH/LEFJ2nW+l5w28hlh9++CGEZC1kE4ewLJ/tzwvJ+JCbpTj0FuexMKSVv2TJkuzcuXOhMVsef644JBeHjigvL9zHeX3Iucz9pASGhYb33nvv1bZk2XfffRfqAmNucmsGxv7jjz/OTp48Wa9XPumckW8eyJzOgeOs864S5gytWrWq7gxxz2OjnOzHH3+sG/Qili5dGgza/v37w/Ek/l+5cmW9471x40a2cOHCbP78+eF71emEzoIZ70OHDoVj6Dv27dvXUCerrrOAEUe/GoHsxwa+wfk06Itp+zhSr169CrI5duxYUxkVnadbqcyIf+vWrUGR79+/n124cCF01mZUUfRt27bV95P4n23sAzr44eHh4N2xn4ZBB+RHH+TBk7YyyIOB5zwoB17f7du3sw0bNoSO0fKx3ZQHRWEb51m2bFnY5qER0xnQCRpcI9fGNdP5lrmf1KCxLliwIJs5c2bo/HCSrly5kh08eLDekMtA/VA31C0OFWWgT41GoFUfOSE3ky2g6xjw7du3B/1lXxnQWzpR9JTjSbQd32k+ePAgRFu+/PLLukPb7px3L9ApnbW+B9kx8NiyZUvotwYGBmo5JlJ1nS0Dhn/GjBn1KAkDK/rsEydOZE+ePCnt0PYqlTH8VBqdNlCZPuyCotPALFQJpvQjIyPhk06HkK4ZaLxwyvAKQEOycwB58oz3ZOD8dI50AObx2zXayKDM/aQKhonODxliaGbPnl3bUw4zbByPEwf9/f25xgcnq+ojJ8MME/eLXBipt4I/3hwr5BZH5hhxeeeaUKxFCarKZHUW2RCRIkpA3SAzdNaiVp6UdLYM9Jc4l319fcF58tMlVSaZOX7CZzQuG0nQud+8ebO2NwsVz6jaOhgUAs/PKwKdv386Ni6jUxB+onO8detW6DDzGmrR/aQGjhAyOXv2bOj8vINmo6oiTNY4kTh5jFIPHz4cZMtIwBwxw5ysKo+ckBvys4gahslC/sC+MqDLjGJPnz4d9Jj6QdYYegyfwRyrr7sqO7Sd0FmwgQC6St2gu+jw8ePHX3NYU9DZMtCv078jJ+rAR0cY8FXdAUjG8BN+p3HZSMKSb2wYTjp5DClzZD7Mj0PAyANv2o5tFK6fLJxz/fr12aVLl8I86sOHDyfMRUGZ+0kJGipTMxgnM0wYaiInfn66GXFYGziO42PMSfBRoirC/RNCRt+YpzfMgPj56Wb4sLYRR8xwvuO5bSJudNBVpBM6CzZF4vPHD05CKjpbBmSPgY8HVPS5KcgnCcNvI2genMnDwl8kM6CXL19uOK9rnDp16rVRtnWUPlTfDoTu7ty5E+aX/QNQUHQ/KWLOEh68RW2QDwYnHt0QAsW58w9Lgo1u0QPbbroRd6yMYKmDRg/9VQnu0esbMkHOcaeJzJApso3DzMiVkRVyMxip+qga9UR9+TyEX3HGvdNRFVrRWaIiyJW6sLwGDlP8Cwvk5uewISWdLQK9RX99VAQZN3uQt1KM/6qvd8n7Papt87+55Lea/A6T32Ra8r+5JK/fZ8mXy/9+H7/t5Dff/jxg57d8/jxjjXxCGZbY7rH3AcS/zzWK7idVvHwbycPq0f9e3zC5WxkkrwNg9RvXWZWJ9S2WCXjZ5e2P21he/cTnyaujqlFGZ012RTptKZZbajqb1z9a8v21l1vc1+b1BZZMjmXP023M4E/NB0gWPD6ehD169OiEUDkeYBzyF0IIIXqZZOb424H5nhQe9BBCCJEOGvHXYE6S3xV7eKDJnpQVQgghqoAMvxBCCJEQCvULIYQQCSHDL4QQQiSEDL8QQgiREDL8QgghRELI8Pcg/g1peW+gE0IIIRohw99hzCjnrYzVKfh5IYul8GrhI0eO1LYKYLU3c4jaXdLVXulryS8iY3TiPL0E9+cXqIpX1SsDr5rldahWRp7D2onz9Bqd0KUycktNZ6eKMnrdbcjwi8pAxzY8PBzeR45TxIJKvJGxlQ4Oo8/7u1kjgTJ4Tz/v9PbGvxPn6SW4L+7PFqjivrn/POPSCDrHbdu2hQVQKIMFpuDAgQP1TrIT5+k1OqFLZeSWms5OFWX0uhuR4ReVgA6MBTZ4CZMtHLNu3bqwwAsLlpSBRoyhp1O0VzTzCmeWirWFezpxnl7DFsrhPoH75v7jhWGawYI8sGPHjvBJ1GrXrl3BENmiPJ04Ty/RKV0qkluKOjtVlNHrbiQJw89ojVAMnz4cFodw4xCvD9dbOCdvG+XY/6yRzypkNDIrh+3sB44nFMTyo2xnf17YDQ/djif584rXYflWXq/sl4llpTPqIl7qtRGUwfus/BLI1C1rxrNiGsv2duI8vQT3w335ZWLRZaaYWDIaeZSBpWP9cqeUe+LEiVAGsu3UeXqJTuhSGbmlprNTSZFedyvJjPhZPpfGgLITkuF/kjfIjOosFMYn38saXCoe75lQD6/6pWzKIbHdFAO4hs2bNwfjzn6W5kRZrAFyzjVr1tSP5zpwJGJHRfwCjczWe0eOOFcsjXzw4MG60S6CDtIvZUr9UI/UDcvHsr8T5+kluB+7Z0AHGSlu3749rKXPviKQEwamr68vfMfJ7e/vD8fTVug8O3GeXsPudzK6VEZunTiPeJ0yet2tJGP458+fHzpyM8DWUADjb8bV9vPJ3O5k19XPg2vxK/5h5H0DHBgYmLBKIJ46yiSKoeMj6kLd8QDk7Nmza3vKMzIyEqIwNGictrxFmjpxnl7CDAbtBOd25cqVtT2tQRvcv39/3fmN6dR5eolO6FIZuaWms1NJkV53G5rjd9AgfHgdR+BNEK/4h5H3UQE8Rz8lgQdPxEI0BkeORnf27NnQ8XnHyUY7RVAnjOwtMoQDZliddeI8vQT3w31t3bq1bjAspAzsK4L88+bNC+3JnCkfAWNbJ87Ta3BPk9WlMnLrxHnE65TR625Fht+Bt2zhdUtxQ3rTEH3Ac7QndElMO2jE3xyMMpEUOj+rL0ZBRGz8/GczKAMDTxm+AbM8s83jdeI8vQT3Q+dG6HLp0qW1reNREfDzxs2gE0SH165dW9uShXnQhw8fhmcqOnWeXqITulRGbqnp7FRSpNfdigz/GHTodOx+zj/GPGubtyEfP+OIR+LWEDs5RXDq1CmN+Atg2oRnJXwd8gATUyi+UQLPUBBJITTq6wg9oHPk53z2sCXhUZ6I5kFMaOU8VYF7x/nkPoH75v5jBwlZIlNkGz8bY7JBl4G8PDtBSNqmvMqepyq0okvoIXL1DwobRXJLUWenijJ63ZWwLG/VGR4eHl29evXo3bt3a1vGt23atGn0+fPntS2jo2MNY3TMg5uQhoaGantHw/GUY/u+//770T179oSyPJRJ2ZbPn4fy4vPGkMeOJQ0ODk44T3wdluJ7TBFfh43kbPJFpi9fvqxt/QUv/0YyLXOeKhHrnG8XBrJEpo32x+0CGcaUOU/VKKNLtP1m+8vILTWdnSrK6HW3ofX4hRBCiIRQqF8IIYRICBl+IYQQIiFk+IUQQoiEkOEXQgghEkKGXwghhEgIGX4hhBAiIWT4hRBCiISQ4W8DFmTgLVq8Tatd7O1xZVf/E0IIITqBDH+HsdeWyqBPD+aUkVjoyF692wq+DFL8al//alpLHFNl4oWj2rnfuAxSI+fZ8ua9orZqdEJn7ZW+ReX4c6Ug2yKKZF+mrcd63U7bmHLC+/tEx7DXlqbwqtFug1dl+leRUgetvsaYMvyrfO11nPYaTqtf/1pOe11qVes8vr9YJmWwMvzrrRvVj8n4j3/8Y+VfLdsJnUWm8TFxue3UWdVBFr6tx3Is09btu+l13jHdiEb8ohLgdbOYDktk2oIu69atC0sas1xmGfDuHz9+HBZZshXLKIsFnIxXr16FxU363JKbrHzGeaoK8uP+kCcgE+SMvMuOTp89exY+WSnOYPWyuXPn1r79gi0288knn4TPqtIJnQX0MV7qe82aNbX/xmERGfSYlT/FuOyvXr2a7dq1q97WWa6YxYxu3LgRvpdp69QTx9hSx5RFmXfu3OnqaErPG36ES8jqhx9+mBCSKQrH5IV1bN7dUhwK8/vj4+06lixZEta+pjHnlROH5OJQJ+fIuzbux4ec7Xx550gRDAudn1++FQNCXWDMfai+ETRaVjQ7efJkfaqGT786Hx00eahfq7svv/yysiudmTPkl29Fz8ZGNGH5UTPoRbBkLB0mhofjSfwfr2KG3rM6IjK281WVTugsmN4dOnQoHIMM9+3bV1+dD1mPjUhfcwbE62DkbQXWdtu6OWBl28a0UBv59ywWwmJVpKEG4Zf4O5DXh3XYVzasyDEbN26sH+uxUI9dSyPsuv01gW33x8d58/Lwf9nrryLcv4XtrA5IrGzYqlxMvuiUlRljOkWeKodPY93jk3v+5z//+ZoOloH8HE+KdR+QpcmT/VXW6U7qLCA35Or7NbD+ijoznSVVWW+LMHl7GVibjtt8s7aOjsbytnrI0+9uoTKh/jFhZwMDA+F/W3/60qVL4buFKhl1GBZSs7AOsOb9yMhI7dv0YF6mX8/frslGBhcvXswWLFhQD72CeaDTff3TDZ45URdkeOzYsWz27Nm1PeXgePSC42/fvh229ff3T4jAEAVg29GjR8M66GMNvPIRF3SRiNOZM2eCXBipt4I/HpnxiYx9ZA7ZI8sdO3bUtqTBZHUWvUP/iBJQN7t37w76aVErePr0aXbhwoWQ7t+/X9dbnycliCZ9/vnnQQYWNWUd/d///ve1HOMUtXVC/CZvK+fdd98NUwLdTKXn+H24zM/beiysQwVaZ2QVaOGdqYa5T5Ts1q1b4frtumweEAgH0lnYtWKscFxSBUcImZw9ezZ0fjbnBuybOXNm7VtjTNbmRKIvhw8fDrKlU2A/DZ48JM5BnZw+fToczzxq1UBuyG/r1q11w+TbEfvKgC4TIkVWyMzaG9MqtDPkitz9fHfV6YTOgg0E0FXqBt1FlkyZmMPKsxR+PjtvgJEayIBBIY4QCd3+v//7v/q0Vtm2jrytDNLq1auz3/zmNxOmcLqNShv+Rsbe0+ce3KByrfKobBrGdBh/H7FgHvXhw4fBGfBs2LAhdBZe4Ui+80gJ5tXwsqkzq3M6NDo2Pz/dDHuYxxszjuN4g3m70dHRCQ9S0SH4BwCrBPdPO0LffMQsjkIVYXL1xoxjly1bFv6nPBxX6s+cWf5nG46Xf76lKnRCZ4HBS9zX+QcnOc+MGTOC7nps0CPGwUnigT/ra9tt6zgTv/3tb0PebqWShh9j7R/I4qEWG1kYPETT7CEN3ym1gnWUk/WkuXaeDCU0Fz8AZREBe/pZ/OIsMdKxMFyjOiZ8h2GJjYmNbnH6bLt5/daxWifqn7qmw0DfvBNZJdBFr282Osdg+c4NmSFTZBuHkJEro1tG/gYj1SdPngSZeqfbEnKnDXLuONJQBVrRWfou5OrDzAZ6h/756Sj0Ez1FttQRdeX12nTWOx0pgzy2bNmS/eEPf6j3te20daauemK6Ksz09zD+QSxLeQ/GjFVG0zz+oSNLbDPsYZA4T5wP4mvy5xpr5BOOtcR2j50vfnDE8A+cWMq779Tw8m0kD6vr+CEeyKvnovoloV9VJta3WCbgZZe3v6gNxpA/BZ0uo7MmuyKdtpSn23HfU3WdLcLLrFE/W9TW4/1xP96tzOBPzQfoSfB+t23bFjxXe7hPCCGEEPlUeo5fCCGEEBOR4RdCCCESoudD/UIIIYQoj0b8QgghRELI8AshhBAJIcMvhBBCJIQMvxBCCJEQMvxCCCFEQsjwCyGEEAkhwy+EEEIkhAy/EEIIkRAy/EIIIURCyPALIYQQCSHDL4QQQiSEDL8QQgiREDL8QgghRELI8AshhBAJIcMvhBBCJIQMvxBCCJEQMvxCCCFEQsjwCyGEEAkhwy+EEEIkhAy/EEIIkRAy/EIIIURCyPALIYQQCSHDL4QQQiSEDL8QQgiREDL8QggxjXzxxRfZokWLQvrwww+ze/fu1faU59q1a/Uy8srx57C0d+/e7Oeff67lqB6xTJBBzNdffz0hD8fEFNXPixcvso8++qiepyfkOiqEEGJaOHLkyOimTZtGnz9/Hr4PDQ2Nrl69evTu3bvhexmGh4dfOyYul++kVEAWGzdurMsEOSAP5GvEskaOfX194dMoqh8r12T78uXL0T179oTE/92KRvxCCDENMHI8f/589tlnn2Vz5swJ29atW5e9//772TfffBO+l+HRo0fZO++8k7399tu1LVm2Zs2a2n9psnjx4uzbb78Nn4B8P/jgg+zKlSthNM4o/cyZM9nu3bvreVasWJHt3LkzbCdPmfq5ePFi+NyxY0f4nDVrVrZr167s+vXr2a1bt8K2bqQyhj8OZRHCiYnDOnFIJg7ZkCz0Y/t8ubYtzsN3f644xBRfR14ICqUjrGR5LMTE9XLdja49rywhRPfx7NmzYLDfe++92pYs++6777Jz585ljx8/ntC+m7F27drweejQobrB2rdvX/bxxx/XDZaYCLIfG/hmy5cvr20Znxo4efJkcKRevXpVqn4ePHgQHAqTM9tOnDiR/fjjj6GcbqUShh9Diod7//79kPDY8NL8fA0G8fjx49mFCxfq+Y4dOxY8NKCxbNiwIVSi7SfhBbYKDQ6F4HjOh9do12KfVr7t9w4Fefr7+4M3avkuX74cPFOul/LxKFEuY2RkJHya5ymE6G4wDAsWLMhmzpwZDAbOPCPSgwcP1o1PGTA6jEDnzZuXLVmyJNuyZUs2ODiYDQwM1HKMg1GLBxKpwMBoeHg4W7VqVehDMeozZsyoR0mwD0eOHAlG+8mTJ2F/Uf389NNPwQHo6+sLZSBP+u1ly5YFW4IN6FYqYfhRcG+g8dAQvkGFYFyPHj1aD+vE0HAI4Xz66ae1Le1DuGj//v3h//nz54dyzfvjOn2DtP0GCobjQhlxwzWWLl0ajrlx40ZtS5ZdunRJHr4QPQiOPgab9stgZPbs2bU95bBoH0bo9u3bYcCAAfKDCfojG0SQ1q9fHxyEFIw/fSrRELDoiMGACScI440N8NMlRpn6wXFAxkQDNm/eXNvavVTC8KO8PiyOUbx582Zt7zhz587NrVQPHrNFACaDeYBAeSiLGXFrpHatKBTKEuPLiLFRPw4C5XH/V69enRC2EkJ0N4wmaftnz54NBtsPXmykWQbmmcl/+PDh0DfQ1zB6JcLZyLATGSSM7QcPVQSjf+DAgTDwOn36dH1ghC1gZI+cqAM/yLLnJYrq56233go2g+iyOQ5+4NWsD59uet7wY/jwtHxYnDC4H/F3C+Z5+ukEFIqwUKvYvBMeK4135cqVDaMZQojuA+NCxA8n3gYc9BGEky0kXQZCyvGghUEAg51GEMrG8GHAqkojow/IHgMfR0mJnNqcfZn6wbhja3wkgSnYhw8fdvVArDIP93lOnTo1YcRP5S1cuDA4CDgKefCMAHNgPjzmwfumkdi8DeVs27bttchCq9jDIgbKhFLFzyjEoJgo5F/+8pfsq6++ClEEIUTvgKNOyJ1Rp/VL9AcYqjgkTV9AhJB2HvdhGB+mMv3ontGnn8P2YLyYyyYyyrRhFWlm9MH6Tx8VQcbI0frSMvVjn9gcMNl2/UBs/Fd9vc3Q0FD4/aWlwcHB8DtK/3tMGKvACfni31ry20x+o+nz+DLi/d9///2E8+T9VjSGvL58rokUHxPni3+nC/FvSIUQvYfvl/xvxj3WHzTaH/eBvm+z35b7/c36qCoQ958++Xv3csvrY6Gofqwftjy90B/P4E/NBxA9hkUdiA608+sDIYQQ6VHJUH8KEFKy5wVk9IUQQpRFhr/HYJTPHBS/BuCBHvvZoBBCCFEGhfqFEEKIhNCIXwghhEgIGX4hhBAiIWT4hRBCiISQ4RdCCCESQoZfCCGESAgZflEpWCXLFkBqZ+lRXtlsx1uKX5PKOxRYotPn4bxVBjn6hbBavV/7GaqXGcm/ItvXnU9VX0J2sjob140le+V3o/2kKuutvea42b3G7T3vNelF9RPrNn0DfURXw8/5hKgCvCrTv1KT13E2eg1nIzgmfpWzx15/6l/Laa9yruprUOP7s1eUtvJqUjvGXm9dFs6Z95rUqtAJnSXvxo0bWzrG6qPKOutlkne/saztNb9eR4vqx8q1tmD9Q7M+pBvQiF9UArxwFtjg9cW2IMe6devCQiQsWNIpXr16FRbpGOsgalvGF4HiPFUF+XF/yBOQL3KOF4bpNIykWHo6XkGtKkyVzubBUr4QLwZUFVgg59tvv60vlIN8ecspK+sxGjfdYlVXy8MbUHfu3Bm2k6dM/ZgcWeYYWGRt165dYYXYW7duhW3dSFcbfsIuhE3+9re/1UMo/n8fTonDhHmr7MVhHV8G+/j++PHjetgmDuuQlzy+jLzzFBFfhw9BsS8vnEQef73szwvf5YWzUoBlRllm05YrBlv5kDr1ujIZ6AAwRHQGFhb88ssvc1dUqwLIDfn5ZWLpNMdGOGH5UeT+pqi6cZoqnY2pukNVBmQ/NvCdsHQu7ZkVWmnLOPhl6ofVWm0ZX2Abq/PRNiinW+n6ET9C/ve//51duHAheFEsg/uPf/wjrHeMcAFjybK6tsY9Su07ZsAgsgQj5Vi+Y8eO1Tsz4FybN28OednPkoxUIpVJYplHXpNrx1MWZbZi/O2afBl4lVYGnRzKxhr7Bg11eHg4NFSul++8qhdvlTJsTX+81VRf4UsjY9lklk+mrnCS8O4PHjxYb8hlQQ94JbI5U16PYGBgINTbvn37wn5gBFDFTtQiHLZuO7JgxLN9+/awDnmrnRs6bHL1jmxMCsapkzr79OnTrL+/vy7bZgOAqjtUeVgfag4sRt0vW4y8cGbp7588eRL2F9XPTz/9FBwAi/4xGKMOaBf0x7aEezfS9YafMCojcJg7d24Io3hjDXTEfqEaPDSEb1jI5ujRo03XSOZcg4OD9Tw4E9YACdvgeNi1APkwvhY+KgPXyfUacZjYRpS+zJGRkfBpnmfsrSIPFPpNjhJ6BQwTRhsZ4tjNnj27tqcc1I05ZSQ6A8ryxh8njQaOPqETdCjoBZ1LVbGOD2OMo8l6462AXuMcmVyRG20LZzpPZ1MyTpPVWfqhy5cv12Vrg4k845+CQxWDfrGgGcT6RN9K5BTjjX6aI+ApUz/ImkGXDR67nUrM8cdhbwwpkQEPTkNepXoYafs8GGk/kov3G6145zQ8/wQoCoWyeDDoNkeE0sYNlWvAW7WoAHlwFIhGxE5RKuCZI8ezZ88Gw+QdQfPa24E5Pbz3S5cuhe/WcZI4B3Vy+vTpsO/UqVPhs0ogN+S3devWesfndYx97YDciMqh5xa5M0yfq26c3pTO2oAEhzR2Rm0QkcpoH13CuaSPpp36PpSRPY49deAHY9bPF9XPW2+9Ffpc9NgcB6+v/jmgbqPnDT+K7cPeNprwI/43TdlGap4nc0J2rRam99BwmWbA2NApMq3h56IMFM6ch9RX6qOhEj3BWJhhMgPi56dbxULd1ogt2uIdQBo7dVpFkBu6hY4uXbq0tvX1KFQ7INc8Z9qia3k6XyXelM4CYea4X6JsHFY/J11lGhl9QPboXuxc0ueafMrUD/0CtsY7Us367G6hEiP+GEZefsRP5S1cuDAYxtgDLot1cH5UR6SBOX6vGK1iD4vEEBW4c+dOCNsRVrXpByAMSqPGaTAHImWjD+Ys4cFbHSNbGn08uiFUj8PUbI7ZsPq2MugMiLbg3Rs2ldTNHv5kQBcxxMgTkK9NgfhOE1kiU2Rb9NyLbztxGRgn6tLrfBVpRWcJNyPXMlNK5OUhtbhfypuurCrNjD7wHfmgg+giIDfascmnTP3Yp/UTnJfnBOI+u+vgN33dCr+ntN9M+t9l+v9haGgo/P7S0uDgYPgdJcd7xipwQj7/W0vK8L/XzMN+s+nLiM9RBPn98VwTifN77Pegeb/ptX2+HFLR9aeAr+NG8jB9yfutbawjfI/phB70Guggumj3G+sreL2M98fH5+k1cFyjfVWljM5av5G3P+5T8vKYzubpcxWJZeKT103rC0iN9K6ofky2lqcXZKz1+HsQHiThQb7Dhw9PCEHZrw5SH/0LIYRoTCVD/SnCvBJhvDGPs7ZFCCGEeB2N+HsQ5pu2bdv22i8X7ElzIYQQohEy/EIIIURCKNQvhBBCJIQMvxBCCJEQMvxCCCFEQsjwCyGEEAnRFYafp9R5W1KZt1LF2LGtrJDXKezcvPFJCCGE6AWSGfHb60Snw0EQUwcvN+LVpiQWbrLXcbaCL4PkX+1LeX5BKJ/yVkOrCvF9t3OvebLzTnMj2Vbdse6EziIjL7NG5fhztTPQ6iVimeTprL2+21KerhXVjw0ALU+ZV4FPO/ycr5ex1yXmvULUY68TLcrXCnbuqr+utVfgVZn+lZrtvP6VMvyrfK2Om72Gs6wO9ir2ul27vzIyibEyfFuJ64dP/yruFOiEziLT+Ji43HbqrJeJdSmvjcayttf8eh0tqp9YrmZn8l4H3k1ojl9UArxwFthgxUJbkIMldVmi2S+o0wy8dF6F7Jc3pqyilfeqvnY88kOOyBOQCXJG3mVHp6xqCH4lPlYvY7nsVOmEzgKLxsSrHK5Zs6b23zgsIoMep/I6bxbI+fbbb+sL5Vg7ZmU92jmjdF54xqquloeXn+3cuTNsJ0+Z+rG2v2PHjvBJv7Fr167wFlUWRepW2jL8CGTr1q25YSJCJz7U4cMkJB9KIY+t5tUsRBKXQYpDLv/73/8mlGVhHQvD2Lr3tpQtKQ51xWGfvGkBfy156/6XIT6PXSuwLy+cRB4vH/aTz5cTl5USGBY6P79MrK18iDHP06sYGi0rdrGymdU9n37FrhjrQOJV5qoCckN+fplY7nlshBNeE20GvQiW9KW92AqZJP7v+lXM3iCd0Fkwh5MlvzmGvmHfvn11nUTWY6PY15yBlLHltf3Sudgm2j6OFMtxl6kflj/2yxyzjdX5aBuU0620ZfjNs8xr9AjCRkwYIQRky8eyxCwKacafPMeOHQv76EjyoONFafGgyEcnyzK7g4ODEzqMP//5z0HR7TxXr14NDYAKwTuzde85D3lIbLcK4zyUbefhk+9mACC+H/K0uu6/3btdA9eKYbHz0IhRths3boTvYA2X+0Nm1mnirVKG3RveaqoL9NDIbP1xGh9OEt79wYMH6w25DHj9Vvc4UpRBHTUyTlUf7SM3ky2gvxjw7du3B90v27lZW0eHOZ6EEx7r69OnT7P+/v4kHNlO6az1cfS7DHC2bNkS+seBgYGw34wcn36wkNIgwfpQc2CRBctrmy1DFtgGjPaTJ0/C/qL6+emnn4I9sPVRsDfoLu2C/hhb2K20HernphGOCcQbSASBEDC+hD0QNNB5sr7xpUuXwvcyxB4V3heGkXN7qDR7T72tmR7naQRKQUfvQzp80klZaCjvftqBa7QGCTgxdIJGfF4YGRkJn+Z5cl/eW+V6UOhWRglVBcNE54cMMTSzZ8+u7SmHGTaOx6ECGjP1H2N6Q17Tm6pi7Zz7RS6M1FvBH2+OFXLzxof+4fLly685xVU3UJPVWfSQiJQNShgQoLO+T8ahQp4kZEsdYAh9nqqC7hENgdhBp2/FGcJm4Tz56RKjTP2gozixRAM2b95c29q9tGX48YDwhPB6CGn85z//CfMZKCDKZ6OD2HsnEUppBSoEBaVsoKLwyPIqaLJQsf5acQQMjK33ENvFGqmdw6YgPBh0GiYyRWlj42KOjUUFyIOj4OemUwOdQ45nz54NnZ9frMi89iJM1jiROGfIkqWPcQQYCbDfYw5ZVUf7YG1969at9Y7P65i19SLQZfqL06dPBz2mfpA1/QEdax44Ahgx3/6rRCd0Fog6kd+W6UZ30eHjx4/XHVaepfCDlrwBRhXh3liu3Ose0IdiR5ATdeAHYwws2V9UP2+99Vboc7ET5jj4AYBFArqRtgw/ysMNA8bnk08+Cf/TEf73v/+tG0eUzTxMn1oNRzOPTueLoWSqIA7zdwo6ovharaPjnixc1i4oIZ4nEQwrH4UiLOTxkREcq4cPH06YizLseQWcB+oj1TA/UD9ET+jMrHND3nRsfn66GXFYGziO42MoG33x0agqYm0dHWWe3oijUEWYXL0x49iiqTIifvFxVaETOgt+etXwD05ynrwIaDeHojtBI6MPyAQD7wdUQJ9rbbpM/WDc0WHv/Dfrs7uFtkP93DBePMrzu9/9LjztyCj1V7/6VV1gCxcuzB0plQUvn87VG2RCge0YfSqJxpHn4VLJVDbeX6ORhTUeG2WTL29p3Faxh0ViiArcuXMnOE7xA1Dm4eM0mFxSNvpgzpKvQ2RLo49H5IQ3cZgIPXtdsNEt+mbbTQfjjhXdR98bPfRXJbhH7hV5AjJBznGnicyQKbKNQ8jIFT1HbgZ63Cx6RySAiIDveKtEKzqLLJArdWF5DfpipkT8dBSjT4tQUkfI0Os1eTmmqrLlPhsZfTCZ+KgIMvYP8papH/vkVxPAebF5Xf/Q6tgoti2Ga795HKr9LtJ+z+h/v2i/aSSfTxwL/BaS30TG+/N+Wxmn+Lz2HWybncew7VYG/7PNGKvgCecg+XL99fI51omF+4vP04z4fjgnyZ8HTHZeFkYjucb3kyK+DhvJA1mz3+uqkSfbuG5MjzhXKsRtNZYJeNnl7Y91P66fov1VpYzOmmyKdNpSnm7785Ba6bd6jViXfPK66eWW19dCUf3wne2Wpxf6ha5ejx9PjCdUjx49OmF+Bc/sTYb8ux0eJOFZCpvTA/NwUw/5CyGEaE7bof7phHkYewBDjMO8EuHYMY+ztkUIIYR4na4e8QNzhf7peuBBIz/aTQ3mm/KeL2AOz0dGhBBCiJiuN/xCCCGE6Bw9GeoXQgghRHvI8AshhBAJIcMvhBBCJIQMvxBCCJEQMvxCCCFEQsjwCyGEEAkhwy+EEEIkhAy/EEIIkRAy/EIIIURCyPALIYQQCSHDL4QQQiSEDL8QQgiREDL8QgghRELI8AshhBAJIcMvhBBCJIQMvxBCCJEQMvxCCCFEQsjwCyGEEAkhwy+EEEIkhAy/EEIIkRAy/EIIIURCyPALIYQQCSHDL4QQQiSEDL8QQgiREDL8QgghRELI8AshhBAJIcMvhBBCJIQMvxBCCJEQMvxCCCFEQsjwCyGEEAkhwy+EEEIkQ5b9fx2NnehZtHLIAAAAAElFTkSuQmCC)"]},{"cell_type":"markdown","metadata":{"id":"dur2drhW5Rvi"},"source":["# 1. Install Java 8 and NLU"]},{"cell_type":"code","metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"hFGnBCHavltY","executionInfo":{"status":"ok","timestamp":1620188963860,"user_tz":-120,"elapsed":108208,"user":{"displayName":"Christian Kasim Loan","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GjqAD-ircKP-s5Eh6JSdkDggDczfqQbJGU_IRb4Hw=s64","userId":"14469489166467359317"}},"outputId":"0258b3b7-e331-4f13-8667-00f107198737"},"source":["!wget https://setup.johnsnowlabs.com/nlu/colab.sh -O - | bash\n","import nlu"],"execution_count":null,"outputs":[{"output_type":"stream","text":["--2021-05-05 04:27:36-- https://raw.githubusercontent.com/JohnSnowLabs/nlu/master/scripts/colab_setup.sh\n","Resolving raw.githubusercontent.com (raw.githubusercontent.com)... 185.199.108.133, 185.199.109.133, 185.199.110.133, ...\n","Connecting to raw.githubusercontent.com (raw.githubusercontent.com)|185.199.108.133|:443... connected.\n","HTTP request sent, awaiting response... 200 OK\n","Length: 1671 (1.6K) [text/plain]\n","Saving to: ‘STDOUT’\n","\n","\r- 0%[ ] 0 --.-KB/s \r- 100%[===================>] 1.63K --.-KB/s in 0s \n","\n","2021-05-05 04:27:36 (35.7 MB/s) - written to stdout [1671/1671]\n","\n","Installing NLU 3.0.0 with PySpark 3.0.2 and Spark NLP 3.0.1 for Google Colab ...\n","\u001b[K |████████████████████████████████| 204.8MB 64kB/s \n","\u001b[K |████████████████████████████████| 153kB 46.6MB/s \n","\u001b[K |████████████████████████████████| 204kB 24.2MB/s \n","\u001b[K |████████████████████████████████| 204kB 59.8MB/s \n","\u001b[?25h Building wheel for pyspark (setup.py) ... \u001b[?25l\u001b[?25hdone\n"],"name":"stdout"}]},{"cell_type":"markdown","metadata":{"id":"f4KkTfnR5Ugg"},"source":["# 2. Download Coivd19 NLP Text Sentiemnt Classifcation dataset \n","https://www.kaggle.com/datatattle/covid-19-nlp-text-classification\n","#Context\n","\n","This is a Dataset made of tweets about coivid 19 "]},{"cell_type":"code","metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"OrVb5ZMvvrQD","executionInfo":{"status":"ok","timestamp":1620188965300,"user_tz":-120,"elapsed":109641,"user":{"displayName":"Christian Kasim Loan","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GjqAD-ircKP-s5Eh6JSdkDggDczfqQbJGU_IRb4Hw=s64","userId":"14469489166467359317"}},"outputId":"2e5ecb0f-1fac-4dce-9275-e7a34ec3ff99"},"source":["! wget http://ckl-it.de/wp-content/uploads/2021/02/Corona_NLP_train.csv"],"execution_count":null,"outputs":[{"output_type":"stream","text":["--2021-05-05 04:29:23-- http://ckl-it.de/wp-content/uploads/2021/02/Corona_NLP_train.csv\n","Resolving ckl-it.de (ckl-it.de)... 217.160.0.108, 2001:8d8:100f:f000::209\n","Connecting to ckl-it.de (ckl-it.de)|217.160.0.108|:80... connected.\n","HTTP request sent, awaiting response... 200 OK\n","Length: 5293639 (5.0M) [text/csv]\n","Saving to: ‘Corona_NLP_train.csv’\n","\n","Corona_NLP_train.cs 100%[===================>] 5.05M 4.58MB/s in 1.1s \n","\n","2021-05-05 04:29:25 (4.58 MB/s) - ‘Corona_NLP_train.csv’ saved [5293639/5293639]\n","\n"],"name":"stdout"}]},{"cell_type":"code","metadata":{"colab":{"base_uri":"https://localhost:8080/","height":406},"id":"y4xSRWIhwT28","executionInfo":{"status":"ok","timestamp":1620188966112,"user_tz":-120,"elapsed":110448,"user":{"displayName":"Christian Kasim Loan","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GjqAD-ircKP-s5Eh6JSdkDggDczfqQbJGU_IRb4Hw=s64","userId":"14469489166467359317"}},"outputId":"0946f3a9-aa1e-490d-9763-c34787c6f6b9"},"source":["import pandas as pd\n","train_path = '/content/Corona_NLP_train.csv'\n","\n","train_df = pd.read_csv(train_path)\n","# the text data to use for classification should be in a column named 'text'\n","columns=['text','y']\n","train_df = train_df[columns]\n","from sklearn.model_selection import train_test_split\n","\n","train_df, test_df = train_test_split(train_df, test_size=0.2)\n","train_df"],"execution_count":null,"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"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n","
texty
4204When I was a kid I always wanted to go on the ...positive
5622The selfish morons who panic bought toilet rol...negative
6545Profitero studied keyword search patterns and ...positive
9049From listed funds to builders to landlords, @k...negative
8568Against the back drop of NHS workers, civil se...positive
.........
9513Crude prices could go negative while Alberta's...negative
5209Thank you so much to all of the amazing Health...positive
8606Crime in the COVID 19 era says a man s charged...negative
3066I need a sugar daddy fast! Cause this covid-19...positive
5140#auspol \\r\\r\\r\\n#StayAtHome\\r\\r\\r\\n#COVID?19\\r...negative
\n","

8000 rows × 2 columns

\n","
"],"text/plain":[" text y\n","4204 When I was a kid I always wanted to go on the ... positive\n","5622 The selfish morons who panic bought toilet rol... negative\n","6545 Profitero studied keyword search patterns and ... positive\n","9049 From listed funds to builders to landlords, @k... negative\n","8568 Against the back drop of NHS workers, civil se... positive\n","... ... ...\n","9513 Crude prices could go negative while Alberta's... negative\n","5209 Thank you so much to all of the amazing Health... positive\n","8606 Crime in the COVID 19 era says a man s charged... negative\n","3066 I need a sugar daddy fast! Cause this covid-19... positive\n","5140 #auspol \\r\\r\\r\\n#StayAtHome\\r\\r\\r\\n#COVID?19\\r... negative\n","\n","[8000 rows x 2 columns]"]},"metadata":{"tags":[]},"execution_count":3}]},{"cell_type":"markdown","metadata":{"id":"0296Om2C5anY"},"source":["# 3. Train Deep Learning Classifier using nlu.load('train.sentiment')\n","\n","You dataset label column should be named 'y' and the feature column with text data should be named 'text'"]},{"cell_type":"code","metadata":{"colab":{"base_uri":"https://localhost:8080/","height":1000},"id":"3ZIPkRkWftBG","executionInfo":{"status":"ok","timestamp":1620189094731,"user_tz":-120,"elapsed":239061,"user":{"displayName":"Christian Kasim Loan","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GjqAD-ircKP-s5Eh6JSdkDggDczfqQbJGU_IRb4Hw=s64","userId":"14469489166467359317"}},"outputId":"58819459-f54c-4139-82fa-1de8e437d848"},"source":["import nlu \n","from sklearn.metrics import classification_report\n","\n","# load a trainable pipeline by specifying the train. prefix and fit it on a datset with label and text columns\n","# by default the Universal Sentence Encoder (USE) Sentence embeddings are used for generation\n","trainable_pipe = nlu.load('train.sentiment')\n","fitted_pipe = trainable_pipe.fit(train_df.iloc[:50])\n","\n","# predict with the trainable pipeline on dataset and get predictions\n","preds = fitted_pipe.predict(train_df.iloc[:50],output_level='document')\n","#sentence detector that is part of the pipe generates sone NaNs. lets drop them first\n","preds.dropna(inplace=True)\n","print(classification_report(preds['y'], preds['trainable_sentiment_dl']))\n","\n","preds"],"execution_count":null,"outputs":[{"output_type":"stream","text":["tfhub_use download started this may take some time.\n","Approximate size to download 923.7 MB\n","[OK!]\n","sentence_detector_dl download started this may take some time.\n","Approximate size to download 354.6 KB\n","[OK!]\n"," precision recall f1-score support\n","\n"," negative 0.00 0.00 0.00 19\n"," neutral 0.00 0.00 0.00 0\n"," positive 0.65 1.00 0.78 31\n","\n"," accuracy 0.62 50\n"," macro avg 0.22 0.33 0.26 50\n","weighted avg 0.40 0.62 0.49 50\n","\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"," \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"," \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"," \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"," \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"," \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"," \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"," \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"," \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"," \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"," \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"," \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","
sentence_embedding_usetextyorigin_indexdocumenttrained_sentiment_confidencesentencetrained_sentiment
0[-0.07024706155061722, -0.047160204499959946, ...When I was a kid I always wanted to go on the ...positive4204When I was a kid I always wanted to go on the ...0.782395[When I was a kid I always wanted to go on the...positive
1[-0.012395520694553852, -0.020829271525144577,...The selfish morons who panic bought toilet rol...negative5622The selfish morons who panic bought toilet rol...0.628907[The selfish morons who panic bought toilet ro...positive
2[-0.02502020262181759, -0.08026497811079025, 0...Profitero studied keyword search patterns and ...positive6545Profitero studied keyword search patterns and ...0.716436[Profitero studied keyword search patterns and...positive
3[0.06621277332305908, 0.011142794042825699, -0...From listed funds to builders to landlords, @k...negative9049From listed funds to builders to landlords, @k...0.613169[From listed funds to builders to landlords, @...positive
4[-0.024583933874964714, 0.06747899204492569, 0...Against the back drop of NHS workers, civil se...positive8568Against the back drop of NHS workers, civil se...0.753840[Against the back drop of NHS workers, civil s...positive
5[-0.030639173462986946, 0.07562850415706635, -...\"Your going to lose people to the flu but you'...negative1645\"Your going to lose people to the flu but you'...0.642136[\"Your going to lose people to the flu but you...positive
6[0.020836224779486656, -0.06270623952150345, -...As the COVID 19 outbreak continues to spread f...negative4190As the COVID 19 outbreak continues to spread f...0.636920[As the COVID 19 outbreak continues to spread ...positive
7[0.04782669618725777, -0.0003077308356296271, ...We re tracking daily changes in economic uncer...negative1930We re tracking daily changes in economic uncer...0.618729[We re tracking daily changes in economic unce...positive
8[-0.04952622205018997, -0.024686245247721672, ...I'm slightly confused! All for social distanc...positive4717I'm slightly confused! All for social distanci...0.748444[I'm slightly confused!, All for social distan...positive
9[0.015434695407748222, -0.0009663645178079605,...The knock-on effects of COVID-19 are having a...positive3860The knock-on effects of COVID-19 are having a...0.778461[The knock-on effects of COVID-19 are having ...positive
10[0.01979624293744564, -0.006749877706170082, -...Praise #coronavirus! God Bless the little bug...positive7223Praise #coronavirus! God Bless the little bugs...0.820170[Praise #coronavirus!, God Bless the little bu...positive
11[0.06731504201889038, 0.06525817513465881, -0....For those that think #COVID—19 #Coronavirus ...positive1540For those that think #COVID—19 #Coronavirus i...0.854121[For those that think #COVID—19 #Coronavirus ...positive
12[-0.03877340257167816, -0.04483730345964432, -...Just managed to book a delivery with Sainsbury...negative1003Just managed to book a delivery with Sainsbury...0.658872[Just managed to book a delivery with Sainsbur...positive
13[0.012202774174511433, 0.04586584493517876, -0...Can’t get any in the supermarket but can rece...positive9630Can’t get any in the supermarket but can rece...0.777700[Can’t get any in the supermarket but can rec...positive
14[0.03157752379775047, -0.03581700101494789, -0...Scary. Gun sales up in #USA. Due to food short...negative9278Scary. Gun sales up in #USA. Due to food short...0.597093[Scary. Gun sales up in #USA., Due to food sho...neutral
15[0.07137540727853775, 0.004993322305381298, -0...VR headset companies, now is the time to slash...positive6960VR headset companies, now is the time to slash...0.786807[VR headset companies, now is the time to slas...positive
16[0.07225924730300903, 0.002497387118637562, 0....31% Can’t Pay the Rent: ‘It’s Only Going to...negative377131% Can’t Pay the Rent: ‘It’s Only Going to...0.643341[31% Can’t Pay the Rent: ‘It’s Only Going t...positive
17[0.04617633670568466, 0.03097780980169773, -0....COVID-19 is unprecedented. And to manage the c...negative2605COVID-19 is unprecedented. And to manage the c...0.652922[COVID-19 is unprecedented., And to manage the...positive
18[0.02162887528538704, -0.07251725345849991, -0...Even as government officials have appealed for...negative9976Even as government officials have appealed for...0.594582[Even as government officials have appealed fo...neutral
19[-0.004043699707835913, -0.05827523022890091, ...I'm just wondering where all these panic buyer...negative6191I'm just wondering where all these panic buyer...0.604813[I'm just wondering where all these panic buye...positive
20[-0.006520306225866079, 0.04672585800290108, -...To address the increased demand on our communi...positive4213To address the increased demand on our communi...0.754619[To address the increased demand on our commun...positive
21[0.09055875241756439, -0.03801679238677025, -0...Important phone conversation with @ReedHasting...positive4180Important phone conversation with @ReedHasting...0.824278[Important phone conversation with @ReedHastin...positive
22[0.06983352452516556, 0.045526593923568726, 0....@JeffreeStar hey,I hope you see this tweet,jus...positive4393@JeffreeStar hey,I hope you see this tweet,jus...0.712092[@JeffreeStar hey,I hope you see this tweet,ju...positive
23[0.010531553998589516, -0.041734274476766586, ...In addition to masks we re now also banning ha...positive7906In addition to masks we re now also banning ha...0.804328[In addition to masks we re now also banning h...positive
24[-0.0046012867242097855, -0.00663403794169426,...It'll make bump into April bumpier, drawing do...positive2178It'll make bump into April bumpier, drawing do...0.680699[It'll make bump into April bumpier, drawing d...positive
25[0.02057724818587303, 0.02416279725730419, -0....#ScamAlert! There are some awful folks out the...negative3000#ScamAlert! There are some awful folks out the...0.717378[#ScamAlert!, There are some awful folks out ...positive
26[-0.0029535864014178514, 0.06930557638406754, ...It's April and I'm on #ESA. So how has @GOVUK ...positive8967It's April and I'm on #ESA. So how has @GOVUK ...0.729225[It's April and I'm on #ESA., So how has @GOVU...positive
27[-0.022838125005364418, 0.035331811755895615, ...#THANKYOU times a million to all those on the ...positive8202#THANKYOU times a million to all those on the ...0.817317[#THANKYOU times a million to all those on the...positive
28[0.0058709485456347466, 0.007139457855373621, ...Online shopping doubles down during coronaviru...negative4932Online shopping doubles down during coronaviru...0.656595[Online shopping doubles down during coronavir...positive
29[0.038493022322654724, -0.04178141430020332, 0...Covid-19 is changing the world as we know it. ...positive525Covid-19 is changing the world as we know it. ...0.836061[Covid-19 is changing the world as we know it....positive
30[0.001453789067454636, 0.005407411605119705, -...The whole supermarket delivery model is broken...negative1389The whole supermarket delivery model is broken...0.656143[The whole supermarket delivery model is broke...positive
31[0.07007955759763718, 0.02776280976831913, -0....For brands interested in building long term eq...positive146For brands interested in building long term eq...0.717087[For brands interested in building long term e...positive
32[0.014691045507788658, 0.052066899836063385, 0...@masrour_barzani It is worth mentioning your e...positive2989@masrour_barzani It is worth mentioning your e...0.750604[@masrour_barzani It is worth mentioning your ...positive
33[0.02123432233929634, 0.052282460033893585, -0...When you realize health care workers grocery s...positive9206When you realize health care workers grocery s...0.808270[When you realize health care workers grocery ...positive
34[-0.016208922490477562, 0.041428711265325546, ...\"Sales of shelf-stable, fresh, and frozen seaf...positive5297\"Sales of shelf-stable, fresh, and frozen seaf...0.683432[\"Sales of shelf-stable, fresh, and frozen sea...positive
35[0.0038951593451201916, 0.012588057667016983, ...@HolidayInn @ChoiceHotels @OmniHotels all majo...positive7155@HolidayInn @ChoiceHotels @OmniHotels all majo...0.792782[@HolidayInn @ChoiceHotels @OmniHotels all maj...positive
36[0.027244137600064278, 0.058916911482810974, -...Some silver linings during this covid-19 crisi...negative3295Some silver linings during this covid-19 crisi...0.639766[Some silver linings during this covid-19 cris...positive
37[0.013577781617641449, 0.004573680926114321, 0...Ok people CAN WE STOP BUYING ALL THE HAND SANI...positive1259Ok people CAN WE STOP BUYING ALL THE HAND SANI...0.784130[Ok people CAN WE STOP BUYING ALL THE HAND SAN...positive
38[0.011083973571658134, -0.004668612964451313, ...Your well being is our top priority!\\r\\r\\r\\nWh...positive3510Your well being is our top priority! While oth...0.712732[Your well being is our top priority!, While o...positive
39[0.010227790102362633, 0.03293986618518829, 0....In #France, supermarket chains agree to a one-...positive9662In #France, supermarket chains agree to a one-...0.762242[In #France, supermarket chains agree to a one...positive
40[-0.03131600469350815, 0.054168395698070526, 0...In one week health care workers, truck drivers...positive8688In one week health care workers, truck drivers...0.787212[In one week health care workers, truck driver...positive
41[-0.01420750841498375, 0.031081417575478554, 0...Try your best to support local businesses duri...positive8111Try your best to support local businesses duri...0.765113[Try your best to support local businesses dur...positive
42[0.023995142430067062, -0.014616046100854874, ...Consumer Hero is wishing all businesses and co...positive6005Consumer Hero is wishing all businesses and co...0.732366[Consumer Hero is wishing all businesses and c...positive
43[0.03285776078701019, 0.007155246566981077, -0...The no longer hidden crisis in middle and poor...negative3965The no longer hidden crisis in middle and poor...0.626646[The no longer hidden crisis in middle and poo...positive
44[0.061222951859235764, 0.04071924835443497, -0...@osaeB @markets Two economic positives from CO...positive561@osaeB @markets Two economic positives from CO...0.702125[@osaeB @markets Two economic positives from C...positive
45[0.027163468301296234, -0.029017480090260506, ...Well the #Coronavirus food panic buying isn’t...negative8352Well the #Coronavirus food panic buying isn’t...0.610110[Well the #Coronavirus food panic buying isn’...positive
46[0.04085322096943855, 0.04066244512796402, -0....@Complex This is unacceptable! Where’s Peta? ...positive4370@Complex This is unacceptable! Where’s Peta? ...0.818300[@Complex This is unacceptable!, Where’s Peta...positive
47[0.06088094785809517, 0.02243555523455143, -0....STOP THE PANIC BUYING \\r\\r\\r\\nThere is no shor...negative8241STOP THE PANIC BUYING There is no shortage of ...0.603424[STOP THE PANIC BUYING There is no shortage of...positive
48[-0.05397384986281395, 0.04183822497725487, -0...We often rightly hear about the great work tha...positive5160We often rightly hear about the great work tha...0.831636[We often rightly hear about the great work th...positive
49[-0.009696043096482754, 0.09022427350282669, 0...In these tough and stressful times with 100 s ...negative5159In these tough and stressful times with 100 s ...0.751247[In these tough and stressful times with 100 s...positive
\n","
"],"text/plain":[" sentence_embedding_use ... trained_sentiment\n","0 [-0.07024706155061722, -0.047160204499959946, ... ... positive\n","1 [-0.012395520694553852, -0.020829271525144577,... ... positive\n","2 [-0.02502020262181759, -0.08026497811079025, 0... ... positive\n","3 [0.06621277332305908, 0.011142794042825699, -0... ... positive\n","4 [-0.024583933874964714, 0.06747899204492569, 0... ... positive\n","5 [-0.030639173462986946, 0.07562850415706635, -... ... positive\n","6 [0.020836224779486656, -0.06270623952150345, -... ... positive\n","7 [0.04782669618725777, -0.0003077308356296271, ... ... positive\n","8 [-0.04952622205018997, -0.024686245247721672, ... ... positive\n","9 [0.015434695407748222, -0.0009663645178079605,... ... positive\n","10 [0.01979624293744564, -0.006749877706170082, -... ... positive\n","11 [0.06731504201889038, 0.06525817513465881, -0.... ... positive\n","12 [-0.03877340257167816, -0.04483730345964432, -... ... positive\n","13 [0.012202774174511433, 0.04586584493517876, -0... ... positive\n","14 [0.03157752379775047, -0.03581700101494789, -0... ... neutral\n","15 [0.07137540727853775, 0.004993322305381298, -0... ... positive\n","16 [0.07225924730300903, 0.002497387118637562, 0.... ... positive\n","17 [0.04617633670568466, 0.03097780980169773, -0.... ... positive\n","18 [0.02162887528538704, -0.07251725345849991, -0... ... neutral\n","19 [-0.004043699707835913, -0.05827523022890091, ... ... positive\n","20 [-0.006520306225866079, 0.04672585800290108, -... ... positive\n","21 [0.09055875241756439, -0.03801679238677025, -0... ... positive\n","22 [0.06983352452516556, 0.045526593923568726, 0.... ... positive\n","23 [0.010531553998589516, -0.041734274476766586, ... ... positive\n","24 [-0.0046012867242097855, -0.00663403794169426,... ... positive\n","25 [0.02057724818587303, 0.02416279725730419, -0.... ... positive\n","26 [-0.0029535864014178514, 0.06930557638406754, ... ... positive\n","27 [-0.022838125005364418, 0.035331811755895615, ... ... positive\n","28 [0.0058709485456347466, 0.007139457855373621, ... ... positive\n","29 [0.038493022322654724, -0.04178141430020332, 0... ... positive\n","30 [0.001453789067454636, 0.005407411605119705, -... ... positive\n","31 [0.07007955759763718, 0.02776280976831913, -0.... ... positive\n","32 [0.014691045507788658, 0.052066899836063385, 0... ... positive\n","33 [0.02123432233929634, 0.052282460033893585, -0... ... positive\n","34 [-0.016208922490477562, 0.041428711265325546, ... ... positive\n","35 [0.0038951593451201916, 0.012588057667016983, ... ... positive\n","36 [0.027244137600064278, 0.058916911482810974, -... ... positive\n","37 [0.013577781617641449, 0.004573680926114321, 0... ... positive\n","38 [0.011083973571658134, -0.004668612964451313, ... ... positive\n","39 [0.010227790102362633, 0.03293986618518829, 0.... ... positive\n","40 [-0.03131600469350815, 0.054168395698070526, 0... ... positive\n","41 [-0.01420750841498375, 0.031081417575478554, 0... ... positive\n","42 [0.023995142430067062, -0.014616046100854874, ... ... positive\n","43 [0.03285776078701019, 0.007155246566981077, -0... ... positive\n","44 [0.061222951859235764, 0.04071924835443497, -0... ... positive\n","45 [0.027163468301296234, -0.029017480090260506, ... ... positive\n","46 [0.04085322096943855, 0.04066244512796402, -0.... ... positive\n","47 [0.06088094785809517, 0.02243555523455143, -0.... ... positive\n","48 [-0.05397384986281395, 0.04183822497725487, -0... ... positive\n","49 [-0.009696043096482754, 0.09022427350282669, 0... ... positive\n","\n","[50 rows x 8 columns]"]},"metadata":{"tags":[]},"execution_count":4}]},{"cell_type":"markdown","metadata":{"id":"lVyOE2wV0fw_"},"source":["# 4. Test the fitted pipe on new example"]},{"cell_type":"code","metadata":{"colab":{"base_uri":"https://localhost:8080/","height":77},"id":"qdCUg2MR0PD2","executionInfo":{"status":"ok","timestamp":1620189095590,"user_tz":-120,"elapsed":239915,"user":{"displayName":"Christian Kasim Loan","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GjqAD-ircKP-s5Eh6JSdkDggDczfqQbJGU_IRb4Hw=s64","userId":"14469489166467359317"}},"outputId":"76211d7f-06a9-4d29-8d51-64593429993c"},"source":["fitted_pipe.predict(\"Everything is under control !\")"],"execution_count":null,"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","
sentence_embedding_useorigin_indexdocumenttrained_sentiment_confidencesentencetrained_sentiment
0[0.027917474508285522, -0.06684374064207077, -...0Everything is under control !0.770841[Everything is under control !]positive
\n","
"],"text/plain":[" sentence_embedding_use ... trained_sentiment\n","0 [0.027917474508285522, -0.06684374064207077, -... ... positive\n","\n","[1 rows x 6 columns]"]},"metadata":{"tags":[]},"execution_count":5}]},{"cell_type":"markdown","metadata":{"id":"xflpwrVjjBVD"},"source":["## 5. Configure pipe training parameters"]},{"cell_type":"code","metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"UtsAUGTmOTms","executionInfo":{"status":"ok","timestamp":1620189095591,"user_tz":-120,"elapsed":239911,"user":{"displayName":"Christian Kasim Loan","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GjqAD-ircKP-s5Eh6JSdkDggDczfqQbJGU_IRb4Hw=s64","userId":"14469489166467359317"}},"outputId":"7d9e3f28-7bdc-4a4f-e1cb-2329d5b26dd1"},"source":["trainable_pipe.print_info()"],"execution_count":null,"outputs":[{"output_type":"stream","text":["The following parameters are configurable for this NLU pipeline (You can copy paste the examples) :\n",">>> pipe['sentiment_dl'] has settable params:\n","pipe['sentiment_dl'].setMaxEpochs(1) | Info: Maximum number of epochs to train | Currently set to : 1\n","pipe['sentiment_dl'].setLr(0.005) | Info: Learning Rate | Currently set to : 0.005\n","pipe['sentiment_dl'].setBatchSize(64) | Info: Batch size | Currently set to : 64\n","pipe['sentiment_dl'].setDropout(0.5) | Info: Dropout coefficient | Currently set to : 0.5\n","pipe['sentiment_dl'].setEnableOutputLogs(True) | Info: Whether to use stdout in addition to Spark logs. | Currently set to : True\n","pipe['sentiment_dl'].setThreshold(0.6) | Info: The minimum threshold for the final result otheriwse it will be neutral | Currently set to : 0.6\n","pipe['sentiment_dl'].setThresholdLabel('neutral') | Info: In case the score is less than threshold, what should be the label. Default is neutral. | Currently set to : neutral\n",">>> pipe['use@tfhub_use'] has settable params:\n","pipe['use@tfhub_use'].setDimension(512) | Info: Number of embedding dimensions | Currently set to : 512\n","pipe['use@tfhub_use'].setLoadSP(False) | Info: Whether to load SentencePiece ops file which is required only by multi-lingual models. This is not changeable after it's set with a pretrained model nor it is compatible with Windows. | Currently set to : False\n","pipe['use@tfhub_use'].setStorageRef('tfhub_use') | Info: unique reference name for identification | Currently set to : tfhub_use\n",">>> pipe['deep_sentence_detector@SentenceDetectorDLModel_c83c27f46b97'] has settable params:\n","pipe['deep_sentence_detector@SentenceDetectorDLModel_c83c27f46b97'].setExplodeSentences(False) | Info: whether to explode each sentence into a different row, for better parallelization. Defaults to false. | Currently set to : False\n","pipe['deep_sentence_detector@SentenceDetectorDLModel_c83c27f46b97'].setStorageRef('SentenceDetectorDLModel_c83c27f46b97') | Info: storage unique identifier | Currently set to : SentenceDetectorDLModel_c83c27f46b97\n","pipe['deep_sentence_detector@SentenceDetectorDLModel_c83c27f46b97'].setEncoder(com.johnsnowlabs.nlp.annotators.sentence_detector_dl.SentenceDetectorDLEncoder@d4b5f4f) | Info: Data encoder | Currently set to : com.johnsnowlabs.nlp.annotators.sentence_detector_dl.SentenceDetectorDLEncoder@d4b5f4f\n","pipe['deep_sentence_detector@SentenceDetectorDLModel_c83c27f46b97'].setImpossiblePenultimates(['Bros', 'No', 'al', 'vs', 'etc', 'Fig', 'Dr', 'Prof', 'PhD', 'MD', 'Co', 'Corp', 'Inc', 'bros', 'VS', 'Vs', 'ETC', 'fig', 'dr', 'prof', 'PHD', 'phd', 'md', 'co', 'corp', 'inc', 'Jan', 'Feb', 'Mar', 'Apr', 'Jul', 'Aug', 'Sep', 'Sept', 'Oct', 'Nov', 'Dec', 'St', 'st', 'AM', 'PM', 'am', 'pm', 'e.g', 'f.e', 'i.e']) | Info: Impossible penultimates | Currently set to : ['Bros', 'No', 'al', 'vs', 'etc', 'Fig', 'Dr', 'Prof', 'PhD', 'MD', 'Co', 'Corp', 'Inc', 'bros', 'VS', 'Vs', 'ETC', 'fig', 'dr', 'prof', 'PHD', 'phd', 'md', 'co', 'corp', 'inc', 'Jan', 'Feb', 'Mar', 'Apr', 'Jul', 'Aug', 'Sep', 'Sept', 'Oct', 'Nov', 'Dec', 'St', 'st', 'AM', 'PM', 'am', 'pm', 'e.g', 'f.e', 'i.e']\n","pipe['deep_sentence_detector@SentenceDetectorDLModel_c83c27f46b97'].setModelArchitecture('cnn') | Info: Model architecture (CNN) | Currently set to : cnn\n",">>> pipe['document_assembler'] has settable params:\n","pipe['document_assembler'].setCleanupMode('shrink') | Info: possible values: disabled, inplace, inplace_full, shrink, shrink_full, each, each_full, delete_full | Currently set to : shrink\n"],"name":"stdout"}]},{"cell_type":"markdown","metadata":{"id":"2GJdDNV9jEIe"},"source":["##6. Retrain with new parameters"]},{"cell_type":"code","metadata":{"colab":{"base_uri":"https://localhost:8080/","height":1000},"id":"mptfvHx-MMMX","executionInfo":{"status":"ok","timestamp":1620189100229,"user_tz":-120,"elapsed":244544,"user":{"displayName":"Christian Kasim Loan","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GjqAD-ircKP-s5Eh6JSdkDggDczfqQbJGU_IRb4Hw=s64","userId":"14469489166467359317"}},"outputId":"b7a16d53-fde9-4d97-bb0e-ac3be96d722d"},"source":["# Train longer!\n","trainable_pipe = nlu.load('train.sentiment')\n","trainable_pipe['trainable_sentiment_dl'].setMaxEpochs(5) \n","fitted_pipe = trainable_pipe.fit(train_df.iloc[:50])\n","# predict with the trainable pipeline on dataset and get predictions\n","preds = fitted_pipe.predict(train_df.iloc[:50],output_level='document')\n","\n","#sentence detector that is part of the pipe generates sone NaNs. lets drop them first\n","preds.dropna(inplace=True)\n","print(classification_report(preds['y'], preds['sentiment']))\n","\n","preds"],"execution_count":null,"outputs":[{"output_type":"stream","text":[" precision recall f1-score support\n","\n"," negative 0.00 0.00 0.00 19\n"," neutral 0.00 0.00 0.00 0\n"," positive 0.97 1.00 0.98 31\n","\n"," accuracy 0.62 50\n"," macro avg 0.32 0.33 0.33 50\n","weighted avg 0.60 0.62 0.61 50\n","\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"," \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"," \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"," \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"," \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"," \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"," \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"," \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"," \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"," \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"," \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"," \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","
sentence_embedding_usetextyorigin_indexdocumenttrained_sentiment_confidencesentencetrained_sentiment
0[-0.07024706155061722, -0.047160204499959946, ...When I was a kid I always wanted to go on the ...positive4204When I was a kid I always wanted to go on the ...0.978457[When I was a kid I always wanted to go on the...positive
1[-0.012395520694553852, -0.020829271525144577,...The selfish morons who panic bought toilet rol...negative5622The selfish morons who panic bought toilet rol...0.530837[The selfish morons who panic bought toilet ro...neutral
2[-0.02502020262181759, -0.08026497811079025, 0...Profitero studied keyword search patterns and ...positive6545Profitero studied keyword search patterns and ...0.845908[Profitero studied keyword search patterns and...positive
3[0.06621277332305908, 0.011142794042825699, -0...From listed funds to builders to landlords, @k...negative9049From listed funds to builders to landlords, @k...0.541567[From listed funds to builders to landlords, @...neutral
4[-0.024583933874964714, 0.06747899204492569, 0...Against the back drop of NHS workers, civil se...positive8568Against the back drop of NHS workers, civil se...0.961466[Against the back drop of NHS workers, civil s...positive
5[-0.030639173462986946, 0.07562850415706635, -...\"Your going to lose people to the flu but you'...negative1645\"Your going to lose people to the flu but you'...0.508357[\"Your going to lose people to the flu but you...neutral
6[0.020836224779486656, -0.06270623952150345, -...As the COVID 19 outbreak continues to spread f...negative4190As the COVID 19 outbreak continues to spread f...0.526309[As the COVID 19 outbreak continues to spread ...neutral
7[0.04782669618725777, -0.0003077308356296271, ...We re tracking daily changes in economic uncer...negative1930We re tracking daily changes in economic uncer...0.542942[We re tracking daily changes in economic unce...neutral
8[-0.04952622205018997, -0.024686245247721672, ...I'm slightly confused! All for social distanc...positive4717I'm slightly confused! All for social distanci...0.953167[I'm slightly confused!, All for social distan...positive
9[0.015434695407748222, -0.0009663645178079605,...The knock-on effects of COVID-19 are having a...positive3860The knock-on effects of COVID-19 are having a...0.974030[The knock-on effects of COVID-19 are having ...positive
10[0.01979624293744564, -0.006749877706170082, -...Praise #coronavirus! God Bless the little bug...positive7223Praise #coronavirus! God Bless the little bugs...0.983924[Praise #coronavirus!, God Bless the little bu...positive
11[0.06731504201889038, 0.06525817513465881, -0....For those that think #COVID—19 #Coronavirus ...positive1540For those that think #COVID—19 #Coronavirus i...0.994959[For those that think #COVID—19 #Coronavirus ...positive
12[-0.03877340257167816, -0.04483730345964432, -...Just managed to book a delivery with Sainsbury...negative1003Just managed to book a delivery with Sainsbury...0.519039[Just managed to book a delivery with Sainsbur...neutral
13[0.012202774174511433, 0.04586584493517876, -0...Can’t get any in the supermarket but can rece...positive9630Can’t get any in the supermarket but can rece...0.976869[Can’t get any in the supermarket but can rec...positive
14[0.03157752379775047, -0.03581700101494789, -0...Scary. Gun sales up in #USA. Due to food short...negative9278Scary. Gun sales up in #USA. Due to food short...0.534066[Scary. Gun sales up in #USA., Due to food sho...neutral
15[0.07137540727853775, 0.004993322305381298, -0...VR headset companies, now is the time to slash...positive6960VR headset companies, now is the time to slash...0.949657[VR headset companies, now is the time to slas...positive
16[0.07225924730300903, 0.002497387118637562, 0....31% Can’t Pay the Rent: ‘It’s Only Going to...negative377131% Can’t Pay the Rent: ‘It’s Only Going to...0.517149[31% Can’t Pay the Rent: ‘It’s Only Going t...neutral
17[0.04617633670568466, 0.03097780980169773, -0....COVID-19 is unprecedented. And to manage the c...negative2605COVID-19 is unprecedented. And to manage the c...0.502484[COVID-19 is unprecedented., And to manage the...neutral
18[0.02162887528538704, -0.07251725345849991, -0...Even as government officials have appealed for...negative9976Even as government officials have appealed for...0.543885[Even as government officials have appealed fo...neutral
19[-0.004043699707835913, -0.05827523022890091, ...I'm just wondering where all these panic buyer...negative6191I'm just wondering where all these panic buyer...0.528756[I'm just wondering where all these panic buye...neutral
20[-0.006520306225866079, 0.04672585800290108, -...To address the increased demand on our communi...positive4213To address the increased demand on our communi...0.955490[To address the increased demand on our commun...positive
21[0.09055875241756439, -0.03801679238677025, -0...Important phone conversation with @ReedHasting...positive4180Important phone conversation with @ReedHasting...0.983021[Important phone conversation with @ReedHastin...positive
22[0.06983352452516556, 0.045526593923568726, 0....@JeffreeStar hey,I hope you see this tweet,jus...positive4393@JeffreeStar hey,I hope you see this tweet,jus...0.886496[@JeffreeStar hey,I hope you see this tweet,ju...positive
23[0.010531553998589516, -0.041734274476766586, ...In addition to masks we re now also banning ha...positive7906In addition to masks we re now also banning ha...0.980952[In addition to masks we re now also banning h...positive
24[-0.0046012867242097855, -0.00663403794169426,...It'll make bump into April bumpier, drawing do...positive2178It'll make bump into April bumpier, drawing do...0.780364[It'll make bump into April bumpier, drawing d...positive
25[0.02057724818587303, 0.02416279725730419, -0....#ScamAlert! There are some awful folks out the...negative3000#ScamAlert! There are some awful folks out the...0.547257[#ScamAlert!, There are some awful folks out ...neutral
26[-0.0029535864014178514, 0.06930557638406754, ...It's April and I'm on #ESA. So how has @GOVUK ...positive8967It's April and I'm on #ESA. So how has @GOVUK ...0.844140[It's April and I'm on #ESA., So how has @GOVU...positive
27[-0.022838125005364418, 0.035331811755895615, ...#THANKYOU times a million to all those on the ...positive8202#THANKYOU times a million to all those on the ...0.984350[#THANKYOU times a million to all those on the...positive
28[0.0058709485456347466, 0.007139457855373621, ...Online shopping doubles down during coronaviru...negative4932Online shopping doubles down during coronaviru...0.517497[Online shopping doubles down during coronavir...neutral
29[0.038493022322654724, -0.04178141430020332, 0...Covid-19 is changing the world as we know it. ...positive525Covid-19 is changing the world as we know it. ...0.994486[Covid-19 is changing the world as we know it....positive
30[0.001453789067454636, 0.005407411605119705, -...The whole supermarket delivery model is broken...negative1389The whole supermarket delivery model is broken...0.505307[The whole supermarket delivery model is broke...neutral
31[0.07007955759763718, 0.02776280976831913, -0....For brands interested in building long term eq...positive146For brands interested in building long term eq...0.887487[For brands interested in building long term e...positive
32[0.014691045507788658, 0.052066899836063385, 0...@masrour_barzani It is worth mentioning your e...positive2989@masrour_barzani It is worth mentioning your e...0.946808[@masrour_barzani It is worth mentioning your ...positive
33[0.02123432233929634, 0.052282460033893585, -0...When you realize health care workers grocery s...positive9206When you realize health care workers grocery s...0.988752[When you realize health care workers grocery ...positive
34[-0.016208922490477562, 0.041428711265325546, ...\"Sales of shelf-stable, fresh, and frozen seaf...positive5297\"Sales of shelf-stable, fresh, and frozen seaf...0.841267[\"Sales of shelf-stable, fresh, and frozen sea...positive
35[0.0038951593451201916, 0.012588057667016983, ...@HolidayInn @ChoiceHotels @OmniHotels all majo...positive7155@HolidayInn @ChoiceHotels @OmniHotels all majo...0.972513[@HolidayInn @ChoiceHotels @OmniHotels all maj...positive
36[0.027244137600064278, 0.058916911482810974, -...Some silver linings during this covid-19 crisi...negative3295Some silver linings during this covid-19 crisi...0.500515[Some silver linings during this covid-19 cris...neutral
37[0.013577781617641449, 0.004573680926114321, 0...Ok people CAN WE STOP BUYING ALL THE HAND SANI...positive1259Ok people CAN WE STOP BUYING ALL THE HAND SANI...0.953883[Ok people CAN WE STOP BUYING ALL THE HAND SAN...positive
38[0.011083973571658134, -0.004668612964451313, ...Your well being is our top priority!\\r\\r\\r\\nWh...positive3510Your well being is our top priority! While oth...0.848192[Your well being is our top priority!, While o...positive
39[0.010227790102362633, 0.03293986618518829, 0....In #France, supermarket chains agree to a one-...positive9662In #France, supermarket chains agree to a one-...0.961013[In #France, supermarket chains agree to a one...positive
40[-0.03131600469350815, 0.054168395698070526, 0...In one week health care workers, truck drivers...positive8688In one week health care workers, truck drivers...0.983875[In one week health care workers, truck driver...positive
41[-0.01420750841498375, 0.031081417575478554, 0...Try your best to support local businesses duri...positive8111Try your best to support local businesses duri...0.963043[Try your best to support local businesses dur...positive
42[0.023995142430067062, -0.014616046100854874, ...Consumer Hero is wishing all businesses and co...positive6005Consumer Hero is wishing all businesses and co...0.903110[Consumer Hero is wishing all businesses and c...positive
43[0.03285776078701019, 0.007155246566981077, -0...The no longer hidden crisis in middle and poor...negative3965The no longer hidden crisis in middle and poor...0.530567[The no longer hidden crisis in middle and poo...neutral
44[0.061222951859235764, 0.04071924835443497, -0...@osaeB @markets Two economic positives from CO...positive561@osaeB @markets Two economic positives from CO...0.764335[@osaeB @markets Two economic positives from C...positive
45[0.027163468301296234, -0.029017480090260506, ...Well the #Coronavirus food panic buying isn’t...negative8352Well the #Coronavirus food panic buying isn’t...0.536124[Well the #Coronavirus food panic buying isn’...neutral
46[0.04085322096943855, 0.04066244512796402, -0....@Complex This is unacceptable! Where’s Peta? ...positive4370@Complex This is unacceptable! Where’s Peta? ...0.983527[@Complex This is unacceptable!, Where’s Peta...positive
47[0.06088094785809517, 0.02243555523455143, -0....STOP THE PANIC BUYING \\r\\r\\r\\nThere is no shor...negative8241STOP THE PANIC BUYING There is no shortage of ...0.538391[STOP THE PANIC BUYING There is no shortage of...neutral
48[-0.05397384986281395, 0.04183822497725487, -0...We often rightly hear about the great work tha...positive5160We often rightly hear about the great work tha...0.989714[We often rightly hear about the great work th...positive
49[-0.009696043096482754, 0.09022427350282669, 0...In these tough and stressful times with 100 s ...negative5159In these tough and stressful times with 100 s ...0.822190[In these tough and stressful times with 100 s...positive
\n","
"],"text/plain":[" sentence_embedding_use ... trained_sentiment\n","0 [-0.07024706155061722, -0.047160204499959946, ... ... positive\n","1 [-0.012395520694553852, -0.020829271525144577,... ... neutral\n","2 [-0.02502020262181759, -0.08026497811079025, 0... ... positive\n","3 [0.06621277332305908, 0.011142794042825699, -0... ... neutral\n","4 [-0.024583933874964714, 0.06747899204492569, 0... ... positive\n","5 [-0.030639173462986946, 0.07562850415706635, -... ... neutral\n","6 [0.020836224779486656, -0.06270623952150345, -... ... neutral\n","7 [0.04782669618725777, -0.0003077308356296271, ... ... neutral\n","8 [-0.04952622205018997, -0.024686245247721672, ... ... positive\n","9 [0.015434695407748222, -0.0009663645178079605,... ... positive\n","10 [0.01979624293744564, -0.006749877706170082, -... ... positive\n","11 [0.06731504201889038, 0.06525817513465881, -0.... ... positive\n","12 [-0.03877340257167816, -0.04483730345964432, -... ... neutral\n","13 [0.012202774174511433, 0.04586584493517876, -0... ... positive\n","14 [0.03157752379775047, -0.03581700101494789, -0... ... neutral\n","15 [0.07137540727853775, 0.004993322305381298, -0... ... positive\n","16 [0.07225924730300903, 0.002497387118637562, 0.... ... neutral\n","17 [0.04617633670568466, 0.03097780980169773, -0.... ... neutral\n","18 [0.02162887528538704, -0.07251725345849991, -0... ... neutral\n","19 [-0.004043699707835913, -0.05827523022890091, ... ... neutral\n","20 [-0.006520306225866079, 0.04672585800290108, -... ... positive\n","21 [0.09055875241756439, -0.03801679238677025, -0... ... positive\n","22 [0.06983352452516556, 0.045526593923568726, 0.... ... positive\n","23 [0.010531553998589516, -0.041734274476766586, ... ... positive\n","24 [-0.0046012867242097855, -0.00663403794169426,... ... positive\n","25 [0.02057724818587303, 0.02416279725730419, -0.... ... neutral\n","26 [-0.0029535864014178514, 0.06930557638406754, ... ... positive\n","27 [-0.022838125005364418, 0.035331811755895615, ... ... positive\n","28 [0.0058709485456347466, 0.007139457855373621, ... ... neutral\n","29 [0.038493022322654724, -0.04178141430020332, 0... ... positive\n","30 [0.001453789067454636, 0.005407411605119705, -... ... neutral\n","31 [0.07007955759763718, 0.02776280976831913, -0.... ... positive\n","32 [0.014691045507788658, 0.052066899836063385, 0... ... positive\n","33 [0.02123432233929634, 0.052282460033893585, -0... ... positive\n","34 [-0.016208922490477562, 0.041428711265325546, ... ... positive\n","35 [0.0038951593451201916, 0.012588057667016983, ... ... positive\n","36 [0.027244137600064278, 0.058916911482810974, -... ... neutral\n","37 [0.013577781617641449, 0.004573680926114321, 0... ... positive\n","38 [0.011083973571658134, -0.004668612964451313, ... ... positive\n","39 [0.010227790102362633, 0.03293986618518829, 0.... ... positive\n","40 [-0.03131600469350815, 0.054168395698070526, 0... ... positive\n","41 [-0.01420750841498375, 0.031081417575478554, 0... ... positive\n","42 [0.023995142430067062, -0.014616046100854874, ... ... positive\n","43 [0.03285776078701019, 0.007155246566981077, -0... ... neutral\n","44 [0.061222951859235764, 0.04071924835443497, -0... ... positive\n","45 [0.027163468301296234, -0.029017480090260506, ... ... neutral\n","46 [0.04085322096943855, 0.04066244512796402, -0.... ... positive\n","47 [0.06088094785809517, 0.02243555523455143, -0.... ... neutral\n","48 [-0.05397384986281395, 0.04183822497725487, -0... ... positive\n","49 [-0.009696043096482754, 0.09022427350282669, 0... ... positive\n","\n","[50 rows x 8 columns]"]},"metadata":{"tags":[]},"execution_count":7}]},{"cell_type":"markdown","metadata":{"id":"qFoT-s1MjTSS"},"source":["# 7. Try training with different Embeddings"]},{"cell_type":"code","metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"nxWFzQOhjWC8","executionInfo":{"status":"ok","timestamp":1620189100230,"user_tz":-120,"elapsed":244540,"user":{"displayName":"Christian Kasim Loan","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GjqAD-ircKP-s5Eh6JSdkDggDczfqQbJGU_IRb4Hw=s64","userId":"14469489166467359317"}},"outputId":"04526125-5b61-4628-e7a4-9778daa6da8f"},"source":["# We can use nlu.print_components(action='embed_sentence') to see every possibler sentence embedding we could use. Lets use bert!\n","nlu.print_components(action='embed_sentence')"],"execution_count":null,"outputs":[{"output_type":"stream","text":["For language NLU provides the following Models : \n","nlu.load('en.embed_sentence') returns Spark NLP model tfhub_use\n","nlu.load('en.embed_sentence.use') returns Spark NLP model tfhub_use\n","nlu.load('en.embed_sentence.tfhub_use') returns Spark NLP model tfhub_use\n","nlu.load('en.embed_sentence.use.lg') returns Spark NLP model tfhub_use_lg\n","nlu.load('en.embed_sentence.tfhub_use.lg') returns Spark NLP model tfhub_use_lg\n","nlu.load('en.embed_sentence.albert') returns Spark NLP model albert_base_uncased\n","nlu.load('en.embed_sentence.electra') returns Spark NLP model sent_electra_small_uncased\n","nlu.load('en.embed_sentence.electra_small_uncased') returns Spark NLP model sent_electra_small_uncased\n","nlu.load('en.embed_sentence.electra_base_uncased') returns Spark NLP model sent_electra_base_uncased\n","nlu.load('en.embed_sentence.electra_large_uncased') returns Spark NLP model sent_electra_large_uncased\n","nlu.load('en.embed_sentence.bert') returns Spark NLP model sent_bert_base_uncased\n","nlu.load('en.embed_sentence.bert_base_uncased') returns Spark NLP model sent_bert_base_uncased\n","nlu.load('en.embed_sentence.bert_base_cased') returns Spark NLP model sent_bert_base_cased\n","nlu.load('en.embed_sentence.bert_large_uncased') returns Spark NLP model sent_bert_large_uncased\n","nlu.load('en.embed_sentence.bert_large_cased') returns Spark NLP model sent_bert_large_cased\n","nlu.load('en.embed_sentence.biobert.pubmed_base_cased') returns Spark NLP model sent_biobert_pubmed_base_cased\n","nlu.load('en.embed_sentence.biobert.pubmed_large_cased') returns Spark NLP model sent_biobert_pubmed_large_cased\n","nlu.load('en.embed_sentence.biobert.pmc_base_cased') returns Spark NLP model sent_biobert_pmc_base_cased\n","nlu.load('en.embed_sentence.biobert.pubmed_pmc_base_cased') returns Spark NLP model sent_biobert_pubmed_pmc_base_cased\n","nlu.load('en.embed_sentence.biobert.clinical_base_cased') returns Spark NLP model sent_biobert_clinical_base_cased\n","nlu.load('en.embed_sentence.biobert.discharge_base_cased') returns Spark NLP model sent_biobert_discharge_base_cased\n","nlu.load('en.embed_sentence.covidbert.large_uncased') returns Spark NLP model sent_covidbert_large_uncased\n","nlu.load('en.embed_sentence.small_bert_L2_128') returns Spark NLP model sent_small_bert_L2_128\n","nlu.load('en.embed_sentence.small_bert_L4_128') returns Spark NLP model sent_small_bert_L4_128\n","nlu.load('en.embed_sentence.small_bert_L6_128') returns Spark NLP model sent_small_bert_L6_128\n","nlu.load('en.embed_sentence.small_bert_L8_128') returns Spark NLP model sent_small_bert_L8_128\n","nlu.load('en.embed_sentence.small_bert_L10_128') returns Spark NLP model sent_small_bert_L10_128\n","nlu.load('en.embed_sentence.small_bert_L12_128') returns Spark NLP model sent_small_bert_L12_128\n","nlu.load('en.embed_sentence.small_bert_L2_256') returns Spark NLP model sent_small_bert_L2_256\n","nlu.load('en.embed_sentence.small_bert_L4_256') returns Spark NLP model sent_small_bert_L4_256\n","nlu.load('en.embed_sentence.small_bert_L6_256') returns Spark NLP model sent_small_bert_L6_256\n","nlu.load('en.embed_sentence.small_bert_L8_256') returns Spark NLP model sent_small_bert_L8_256\n","nlu.load('en.embed_sentence.small_bert_L10_256') returns Spark NLP model sent_small_bert_L10_256\n","nlu.load('en.embed_sentence.small_bert_L12_256') returns Spark NLP model sent_small_bert_L12_256\n","nlu.load('en.embed_sentence.small_bert_L2_512') returns Spark NLP model sent_small_bert_L2_512\n","nlu.load('en.embed_sentence.small_bert_L4_512') returns Spark NLP model sent_small_bert_L4_512\n","nlu.load('en.embed_sentence.small_bert_L6_512') returns Spark NLP model sent_small_bert_L6_512\n","nlu.load('en.embed_sentence.small_bert_L8_512') returns Spark NLP model sent_small_bert_L8_512\n","nlu.load('en.embed_sentence.small_bert_L10_512') returns Spark NLP model sent_small_bert_L10_512\n","nlu.load('en.embed_sentence.small_bert_L12_512') returns Spark NLP model sent_small_bert_L12_512\n","nlu.load('en.embed_sentence.small_bert_L2_768') returns Spark NLP model sent_small_bert_L2_768\n","nlu.load('en.embed_sentence.small_bert_L4_768') returns Spark NLP model sent_small_bert_L4_768\n","nlu.load('en.embed_sentence.small_bert_L6_768') returns Spark NLP model sent_small_bert_L6_768\n","nlu.load('en.embed_sentence.small_bert_L8_768') returns Spark NLP model sent_small_bert_L8_768\n","nlu.load('en.embed_sentence.small_bert_L10_768') returns Spark NLP model sent_small_bert_L10_768\n","nlu.load('en.embed_sentence.small_bert_L12_768') returns Spark NLP model sent_small_bert_L12_768\n","For language NLU provides the following Models : \n","nlu.load('fi.embed_sentence') returns Spark NLP model sent_bert_finnish_cased\n","nlu.load('fi.embed_sentence.bert.cased') returns Spark NLP model sent_bert_finnish_cased\n","nlu.load('fi.embed_sentence.bert.uncased') returns Spark NLP model sent_bert_finnish_uncased\n","For language NLU provides the following Models : \n","nlu.load('xx.embed_sentence') returns Spark NLP model sent_bert_multi_cased\n","nlu.load('xx.embed_sentence.bert') returns Spark NLP model sent_bert_multi_cased\n","nlu.load('xx.embed_sentence.bert.cased') returns Spark NLP model sent_bert_multi_cased\n","nlu.load('xx.embed_sentence.labse') returns Spark NLP model labse\n"],"name":"stdout"}]},{"cell_type":"code","metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"IKK_Ii_gjJfF","executionInfo":{"status":"ok","timestamp":1620199760733,"user_tz":-120,"elapsed":6530,"user":{"displayName":"Christian Kasim Loan","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GjqAD-ircKP-s5Eh6JSdkDggDczfqQbJGU_IRb4Hw=s64","userId":"14469489166467359317"}},"outputId":"bb105ac7-fef2-4e67-d5ae-c48d6dd7107c"},"source":["trainable_pipe = nlu.load('en.embed_sentence.small_bert_L12_768 train.sentiment')\n","# We need to train longer and user smaller LR for NON-USE based sentence embeddings usually\n","# We could tune the hyperparameters further with hyperparameter tuning methods like gridsearch\n","# Also longer training gives more accuracy\n","trainable_pipe['trainable_sentiment_dl'].setMaxEpochs(120) \n","trainable_pipe['trainable_sentiment_dl'].setLr(0.0005) \n","fitted_pipe = trainable_pipe.fit(train_df)\n","# predict with the trainable pipeline on dataset and get predictions\n","preds = fitted_pipe.predict(train_df,output_level='document')\n","\n","#sentence detector that is part of the pipe generates sone NaNs. lets drop them first\n","preds.dropna(inplace=True)\n","print(classification_report(preds['y'], preds['sentiment']))\n","\n","#preds"],"execution_count":null,"outputs":[{"output_type":"stream","text":["sent_small_bert_L12_768 download started this may take some time.\n","Approximate size to download 392.9 MB\n","[OK!]\n","sentence_detector_dl download started this may take some time.\n","Approximate size to download 354.6 KB\n","[OK!]\n"," precision recall f1-score support\n","\n"," negative 0.89 0.86 0.87 3982\n"," neutral 0.00 0.00 0.00 0\n"," positive 0.90 0.85 0.87 4018\n","\n"," accuracy 0.85 8000\n"," macro avg 0.60 0.57 0.58 8000\n","weighted avg 0.90 0.85 0.87 8000\n","\n"],"name":"stdout"}]},{"cell_type":"markdown","metadata":{"id":"_1jxw3GnVGlI"},"source":["# 7.1 evaluate on Test Data"]},{"cell_type":"code","metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"Fxx4yNkNVGFl","executionInfo":{"status":"ok","timestamp":1620200260263,"user_tz":-120,"elapsed":491614,"user":{"displayName":"Christian Kasim Loan","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GjqAD-ircKP-s5Eh6JSdkDggDczfqQbJGU_IRb4Hw=s64","userId":"14469489166467359317"}},"outputId":"eff0c644-2484-4180-8c2d-0295eca4d1c5"},"source":["preds = fitted_pipe.predict(test_df,output_level='document')\n","\n","#sentence detector that is part of the pipe generates sone NaNs. lets drop them first\n","preds.dropna(inplace=True)\n","print(classification_report(preds['y'], preds['sentiment']))"],"execution_count":null,"outputs":[{"output_type":"stream","text":[" precision recall f1-score support\n","\n"," negative 0.88 0.81 0.85 1018\n"," neutral 0.00 0.00 0.00 0\n"," positive 0.86 0.85 0.85 982\n","\n"," accuracy 0.83 2000\n"," macro avg 0.58 0.55 0.57 2000\n","weighted avg 0.87 0.83 0.85 2000\n","\n"],"name":"stdout"}]},{"cell_type":"markdown","metadata":{"id":"2BB-NwZUoHSe"},"source":["# 8. Lets save the model"]},{"cell_type":"code","metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"eLex095goHwm","executionInfo":{"status":"ok","timestamp":1620200475138,"user_tz":-120,"elapsed":705445,"user":{"displayName":"Christian Kasim Loan","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GjqAD-ircKP-s5Eh6JSdkDggDczfqQbJGU_IRb4Hw=s64","userId":"14469489166467359317"}},"outputId":"0223e739-965d-4882-cf48-ebc6d1fd45d4"},"source":["stored_model_path = './models/classifier_dl_trained' \n","fitted_pipe.save(stored_model_path)"],"execution_count":null,"outputs":[{"output_type":"stream","text":["Stored model in ./models/classifier_dl_trained\n"],"name":"stdout"}]},{"cell_type":"markdown","metadata":{"id":"e_b2DPd4rCiU"},"source":["# 9. Lets load the model from HDD.\n","This makes Offlien NLU usage possible! \n","You need to call nlu.load(path=path_to_the_pipe) to load a model/pipeline from disk."]},{"cell_type":"code","metadata":{"colab":{"base_uri":"https://localhost:8080/","height":76},"id":"SO4uz45MoRgp","executionInfo":{"status":"ok","timestamp":1620200488257,"user_tz":-120,"elapsed":716709,"user":{"displayName":"Christian Kasim Loan","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GjqAD-ircKP-s5Eh6JSdkDggDczfqQbJGU_IRb4Hw=s64","userId":"14469489166467359317"}},"outputId":"4347e200-966d-415b-d719-090e2e2efcd7"},"source":["hdd_pipe = nlu.load(path=stored_model_path)\n","\n","preds = hdd_pipe.predict('Everything is under control !')\n","preds"],"execution_count":null,"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","
textsentimentorigin_indexdocumentsentiment_confidencesentence_embedding_from_disksentence
0Everything is under control ![negative]8589934592Everything is under control ![0.7562715][[0.3778035342693329, 0.29955393075942993, 0.1...[Everything is under control !]
\n","
"],"text/plain":[" text ... sentence\n","0 Everything is under control ! ... [Everything is under control !]\n","\n","[1 rows x 7 columns]"]},"metadata":{"tags":[]},"execution_count":13}]},{"cell_type":"code","metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"e0CVlkk9v6Qi","executionInfo":{"status":"ok","timestamp":1620200488259,"user_tz":-120,"elapsed":715702,"user":{"displayName":"Christian Kasim Loan","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GjqAD-ircKP-s5Eh6JSdkDggDczfqQbJGU_IRb4Hw=s64","userId":"14469489166467359317"}},"outputId":"a1f2e70d-ac08-428c-9e05-0c83c78f2db6"},"source":["hdd_pipe.print_info()"],"execution_count":null,"outputs":[{"output_type":"stream","text":["The following parameters are configurable for this NLU pipeline (You can copy paste the examples) :\n",">>> pipe['document_assembler'] has settable params:\n","pipe['document_assembler'].setCleanupMode('shrink') | Info: possible values: disabled, inplace, inplace_full, shrink, shrink_full, each, each_full, delete_full | Currently set to : shrink\n",">>> pipe['sentence_detector@SentenceDetectorDLModel_c83c27f46b97'] has settable params:\n","pipe['sentence_detector@SentenceDetectorDLModel_c83c27f46b97'].setExplodeSentences(False) | Info: whether to explode each sentence into a different row, for better parallelization. Defaults to false. | Currently set to : False\n","pipe['sentence_detector@SentenceDetectorDLModel_c83c27f46b97'].setStorageRef('SentenceDetectorDLModel_c83c27f46b97') | Info: storage unique identifier | Currently set to : SentenceDetectorDLModel_c83c27f46b97\n","pipe['sentence_detector@SentenceDetectorDLModel_c83c27f46b97'].setEncoder(com.johnsnowlabs.nlp.annotators.sentence_detector_dl.SentenceDetectorDLEncoder@551e1ab0) | Info: Data encoder | Currently set to : com.johnsnowlabs.nlp.annotators.sentence_detector_dl.SentenceDetectorDLEncoder@551e1ab0\n","pipe['sentence_detector@SentenceDetectorDLModel_c83c27f46b97'].setImpossiblePenultimates(['Bros', 'No', 'al', 'vs', 'etc', 'Fig', 'Dr', 'Prof', 'PhD', 'MD', 'Co', 'Corp', 'Inc', 'bros', 'VS', 'Vs', 'ETC', 'fig', 'dr', 'prof', 'PHD', 'phd', 'md', 'co', 'corp', 'inc', 'Jan', 'Feb', 'Mar', 'Apr', 'Jul', 'Aug', 'Sep', 'Sept', 'Oct', 'Nov', 'Dec', 'St', 'st', 'AM', 'PM', 'am', 'pm', 'e.g', 'f.e', 'i.e']) | Info: Impossible penultimates | Currently set to : ['Bros', 'No', 'al', 'vs', 'etc', 'Fig', 'Dr', 'Prof', 'PhD', 'MD', 'Co', 'Corp', 'Inc', 'bros', 'VS', 'Vs', 'ETC', 'fig', 'dr', 'prof', 'PHD', 'phd', 'md', 'co', 'corp', 'inc', 'Jan', 'Feb', 'Mar', 'Apr', 'Jul', 'Aug', 'Sep', 'Sept', 'Oct', 'Nov', 'Dec', 'St', 'st', 'AM', 'PM', 'am', 'pm', 'e.g', 'f.e', 'i.e']\n","pipe['sentence_detector@SentenceDetectorDLModel_c83c27f46b97'].setModelArchitecture('cnn') | Info: Model architecture (CNN) | Currently set to : cnn\n",">>> pipe['bert_sentence@sent_small_bert_L12_768'] has settable params:\n","pipe['bert_sentence@sent_small_bert_L12_768'].setBatchSize(8) | Info: Size of every batch | Currently set to : 8\n","pipe['bert_sentence@sent_small_bert_L12_768'].setCaseSensitive(False) | Info: whether to ignore case in tokens for embeddings matching | Currently set to : False\n","pipe['bert_sentence@sent_small_bert_L12_768'].setDimension(768) | Info: Number of embedding dimensions | Currently set to : 768\n","pipe['bert_sentence@sent_small_bert_L12_768'].setMaxSentenceLength(128) | Info: Max sentence length to process | Currently set to : 128\n","pipe['bert_sentence@sent_small_bert_L12_768'].setIsLong(False) | Info: Use Long type instead of Int type for inputs buffer - Some Bert models require Long instead of Int. | Currently set to : False\n","pipe['bert_sentence@sent_small_bert_L12_768'].setStorageRef('sent_small_bert_L12_768') | Info: unique reference name for identification | Currently set to : sent_small_bert_L12_768\n",">>> pipe['sentiment_dl@sent_small_bert_L12_768'] has settable params:\n","pipe['sentiment_dl@sent_small_bert_L12_768'].setThreshold(0.6) | Info: The minimum threshold for the final result otheriwse it will be neutral | Currently set to : 0.6\n","pipe['sentiment_dl@sent_small_bert_L12_768'].setThresholdLabel('neutral') | Info: In case the score is less than threshold, what should be the label. Default is neutral. | Currently set to : neutral\n","pipe['sentiment_dl@sent_small_bert_L12_768'].setClasses(['positive', 'negative']) | Info: get the tags used to trained this SentimentDLModel | Currently set to : ['positive', 'negative']\n","pipe['sentiment_dl@sent_small_bert_L12_768'].setStorageRef('sent_small_bert_L12_768') | Info: unique reference name for identification | Currently set to : sent_small_bert_L12_768\n"],"name":"stdout"}]},{"cell_type":"code","metadata":{"id":"-S888rwObpEs"},"source":[""],"execution_count":null,"outputs":[]}]} \ No newline at end of file +{ + "nbformat": 4, + "nbformat_minor": 0, + "metadata": { + "colab": { + "provenance": [] + }, + "kernelspec": { + "display_name": "Python 3", + "name": "python3" + } + }, + "cells": [ + { + "cell_type": "markdown", + "metadata": { + "id": "zkufh760uvF3" + }, + "source": [ + "![JohnSnowLabs](https://nlp.johnsnowlabs.com/assets/images/logo.png)\n", + "\n", + "[![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/JohnSnowLabs/nlu/blob/master/examples/colab/Training/binary_text_classification/NLU_training_sentiment_classifier_demo_covid_19.ipynb)\n", + "\n", + "\n", + "\n", + "# Training a Sentiment Analysis Classifier with NLU\n", + "## 2 Class COVID-19 Sentiment Classifer Training\n", + "With the [SentimentDL model](https://nlp.johnsnowlabs.com/docs/en/annotators#sentimentdl-multi-class-sentiment-analysis-annotator) from Spark NLP you can achieve State Of the Art results on any multi class text classification problem\n", + "\n", + "This notebook showcases the following features :\n", + "\n", + "- How to train the deep learning classifier\n", + "- How to store a pipeline to disk\n", + "- How to load the pipeline from disk (Enables NLU offline mode)\n", + "\n", + "\n", + "You can achieve these results or even better on this dataset with training data:\n", + "\n", + "\n", + "
\n", + "\n", + "![image.png](data:image/png;base64,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)\n", + "\n", + "\n", + "You can achieve these results or even better on this dataset with training data:\n", + "\n", + "\n", + "
\n", + "\n", + "![Screenshot 2021-02-25 190003.png](data:image/png;base64,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)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "dur2drhW5Rvi" + }, + "source": [ + "# 1. Install Java 8 and NLU" + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "hFGnBCHavltY" + }, + "source": [ + "!pip install -q johnsnowlabs" + ], + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "f4KkTfnR5Ugg" + }, + "source": [ + "# 2. Download Coivd19 NLP Text Sentiemnt Classifcation dataset\n", + "https://www.kaggle.com/datatattle/covid-19-nlp-text-classification\n", + "#Context\n", + "\n", + "This is a Dataset made of tweets about covid 19" + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "OrVb5ZMvvrQD" + }, + "source": [ + "! wget https://s3.amazonaws.com/auxdata.johnsnowlabs.com/public/resources/en/classifier-dl/corona_nlp/Corona_NLP_train.csv" + ], + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 424 + }, + "id": "y4xSRWIhwT28", + "outputId": "eaa9efdb-08ed-444f-e53d-c261efcaf812" + }, + "source": [ + "import pandas as pd\n", + "train_path = '/content/Corona_NLP_train.csv'\n", + "\n", + "train_df = pd.read_csv(train_path)\n", + "# the text data to use for classification should be in a column named 'text'\n", + "columns=['text','y']\n", + "train_df = train_df[~train_df[\"y\"].isin([\"neutral\"])]\n", + "\n", + "train_df = train_df[columns]\n", + "from sklearn.model_selection import train_test_split\n", + "\n", + "train_df, test_df = train_test_split(train_df, test_size=0.2)\n", + "train_df" + ], + "execution_count": 1, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + " text y\n", + "20175 What’s the world most dangerous job?\\r\\r\\nSup... negative\n", + "32442 Check out how Coronavirus is transforming Cons... positive\n", + "4860 this was an HOUR after opened My dad was shook... negative\n", + "12605 ScriptCo members have their medications delive... positive\n", + "6444 As we continue to monitor the situation concer... positive\n", + "... ... ...\n", + "34114 Cracking Down on Retail COVID 19 Profiteers in... positive\n", + "36475 @SethAbramson Work. I am very fortunate to hav... positive\n", + "29755 Create a free Amazon Business account to save ... positive\n", + "39000 Best online stores to buy things from Tokyo an... positive\n", + "11120 Bring back the ration book to stop this Panic ... negative\n", + "\n", + "[26758 rows x 2 columns]" + ], + "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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
texty
20175What’s the world most dangerous job?\\r\\r\\nSup...negative
32442Check out how Coronavirus is transforming Cons...positive
4860this was an HOUR after opened My dad was shook...negative
12605ScriptCo members have their medications delive...positive
6444As we continue to monitor the situation concer...positive
.........
34114Cracking Down on Retail COVID 19 Profiteers in...positive
36475@SethAbramson Work. I am very fortunate to hav...positive
29755Create a free Amazon Business account to save ...positive
39000Best online stores to buy things from Tokyo an...positive
11120Bring back the ration book to stop this Panic ...negative
\n", + "

26758 rows × 2 columns

\n", + "
\n", + "
\n", + "\n", + "
\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "
\n", + "\n", + "\n", + "
\n", + " \n", + "\n", + "\n", + "\n", + " \n", + "
\n", + "
\n", + "
\n" + ] + }, + "metadata": {}, + "execution_count": 1 + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "0296Om2C5anY" + }, + "source": [ + "# 3. Train Deep Learning Classifier using nlu.load('train.sentiment')\n", + "\n", + "You dataset label column should be named 'y' and the feature column with text data should be named 'text'" + ] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 1000 + }, + "id": "3ZIPkRkWftBG", + "outputId": "5177ed67-1321-4eec-a83c-e035e5d28f08" + }, + "source": [ + "from johnsnowlabs import nlp\n", + "from sklearn.metrics import classification_report\n", + "\n", + "# load a trainable pipeline by specifying the train. prefix and fit it on a datset with label and text columns\n", + "# by default the Universal Sentence Encoder (USE) Sentence embeddings are used for generation\n", + "trainable_pipe = nlp.load('train.sentiment')\n", + "fitted_pipe = trainable_pipe.fit(train_df.iloc[:50])\n", + "\n", + "# predict with the trainable pipeline on dataset and get predictions\n", + "preds = fitted_pipe.predict(train_df.iloc[:50],output_level='document')\n", + "#sentence detector that is part of the pipe generates sone NaNs. lets drop them first\n", + "preds.dropna(inplace=True)\n", + "print(classification_report(preds['y'], preds['sentiment']))\n", + "\n", + "preds" + ], + "execution_count": 33, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Warning::Spark Session already created, some configs may not take.\n", + "Warning::Spark Session already created, some configs may not take.\n", + "sent_small_bert_L2_128 download started this may take some time.\n", + "Approximate size to download 16.1 MB\n", + "[OK!]\n" + ] + }, + { + "output_type": "stream", + "name": "stderr", + "text": [ + "/usr/local/lib/python3.10/dist-packages/nlu/pipe/pipeline.py:149: SettingWithCopyWarning: \n", + "A value is trying to be set on a copy of a slice from a DataFrame.\n", + "Try using .loc[row_indexer,col_indexer] = value instead\n", + "\n", + "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n", + " dataset.y = dataset.y.apply(str)\n", + "/usr/local/lib/python3.10/dist-packages/nlu/pipe/utils/data_conversion_utils.py:160: SettingWithCopyWarning: \n", + "A value is trying to be set on a copy of a slice from a DataFrame.\n", + "Try using .loc[row_indexer,col_indexer] = value instead\n", + "\n", + "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n", + " data['origin_index'] = data.index\n", + "/usr/local/lib/python3.10/dist-packages/nlu/pipe/utils/data_conversion_utils.py:160: SettingWithCopyWarning: \n", + "A value is trying to be set on a copy of a slice from a DataFrame.\n", + "Try using .loc[row_indexer,col_indexer] = value instead\n", + "\n", + "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n", + " data['origin_index'] = data.index\n" + ] + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + " precision recall f1-score support\n", + "\n", + " negative 0.00 0.00 0.00 21\n", + " positive 0.58 1.00 0.73 29\n", + "\n", + " accuracy 0.58 50\n", + " macro avg 0.29 0.50 0.37 50\n", + "weighted avg 0.34 0.58 0.43 50\n", + "\n" + ] + }, + { + "output_type": "stream", + "name": "stderr", + "text": [ + "/usr/local/lib/python3.10/dist-packages/nlu/pipe/extractors/extractor_methods/base_extractor_methods.py:356: SettingWithCopyWarning: \n", + "A value is trying to be set on a copy of a slice from a DataFrame.\n", + "Try using .loc[row_indexer,col_indexer] = value instead\n", + "\n", + "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n", + " df[cols_to_explode] = df[cols_to_explode].apply(pad_same_level_cols, axis=1)\n", + "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/_classification.py:1344: UndefinedMetricWarning: Precision and F-score are ill-defined and being set to 0.0 in labels with no predicted samples. Use `zero_division` parameter to control this behavior.\n", + " _warn_prf(average, modifier, msg_start, len(result))\n", + "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/_classification.py:1344: UndefinedMetricWarning: Precision and F-score are ill-defined and being set to 0.0 in labels with no predicted samples. Use `zero_division` parameter to control this behavior.\n", + " _warn_prf(average, modifier, msg_start, len(result))\n", + "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/_classification.py:1344: UndefinedMetricWarning: Precision and F-score are ill-defined and being set to 0.0 in labels with no predicted samples. Use `zero_division` parameter to control this behavior.\n", + " _warn_prf(average, modifier, msg_start, len(result))\n" + ] + }, + { + "output_type": "execute_result", + "data": { + "text/plain": [ + " document \\\n", + "0 Over 45 tar sands projects that have already s... \n", + "1 I just got super excited because I found toile... \n", + "2 BE AFRAID, BE VERY AFRAID—INSLEE PROMOTES THE... \n", + "3 A lady fro @CheckersSA Brits tells me to hide ... \n", + "4 Just done an online shop and all the food esse... \n", + "5 @GavinNewsom so let me get this straight crowd... \n", + "6 NY: 18- to 49-year-olds make up more than half... \n", + "7 Emerging market debt prices reflect worst case... \n", + "8 do you clean your #supermarket items due to th... \n", + "9 @flipkartsupport @rsprasad @PMOIndia In his cr... \n", + "10 Several Guernsey women have set up a group of ... \n", + "11 I took Plaquenil for 4 years. Now it's the hot... \n", + "12 Can’t let this die. A little humor in these t... \n", + "13 I’ve been to the grocery store three times si... \n", + "14 That maybe there was a rioter out there who th... \n", + "15 First they release and spread the virus Strip ... \n", + "16 For about a year I have been toying with the i... \n", + "17 Creation Consumer Finance in Belfast are now p... \n", + "18 \"Your going to lose people to the flu but you'... \n", + "19 If you are a #RetailWorker and your store is s... \n", + "20 I love this social distancing.. No one stand c... \n", + "21 #Facebook Ads Fails to Reject COVID-19 Misinfo... \n", + "22 Lease prices decline in March as as the corona... \n", + "23 Complete Shutdown of Karnataka W.E.F 24th Marc... \n", + "24 @MobilePunch Another deceitful palliative in m... \n", + "25 I am anyways under lockdown since 6th March be... \n", + "26 @KFCSA @yumbrands was at your store , the air ... \n", + "27 How to support and save local businesses durin... \n", + "28 This is the latest current information on supe... \n", + "29 If anyone witnesses any shops hiking their pri... \n", + "30 It's about time @eBay_UK stopped allowing peop... \n", + "31 sounds like a good idea - LA market offers spe... \n", + "32 No matter how they're ramping up efforts at #d... \n", + "33 I was wondering if a lovely supermarket would ... \n", + "34 Telangana people, Please dont go out unless it... \n", + "35 Idiots are panic purchasing food in bulk that ... \n", + "36 Following @BBVA_USA's initial offers last week... \n", + "37 Please appreciate your supermarket delivery dr... \n", + "38 When asked, “Why does ADI continue to operate... \n", + "39 The long-term fallout of the #coronavirus lock... \n", + "40 HELP US PACK THE PANTRIES I m live at 12 15 on... \n", + "41 Seeing what’s being left behind at grocery st... \n", + "42 Everyone don t forget condoms when you are hoa... \n", + "43 If you come across any shops charging inflated... \n", + "44 New @SA_Update #consumer insights affecting ve... \n", + "45 How is COVID-19 affecting the pork and commodi... \n", + "46 Unbelievable https://t.co/fBrPYaxNH6 \n", + "47 How prepared are UK supermarkets to fulfill co... \n", + "48 Quakertown Distiller Providing Hand Sanitizer ... \n", + "49 Trump's disastrous dumbfuckery about #coronavi... \n", + "\n", + " sentence_embedding_small_bert_L2_128 sentiment \\\n", + "0 [-0.040878042578697205, 0.7422170639038086, -1... positive \n", + "1 [-0.8823249340057373, 0.2473045289516449, -0.2... positive \n", + "2 [-0.5860391855239868, 0.45967912673950195, -0.... positive \n", + "3 [-1.0504486560821533, 0.03315277025103569, -0.... positive \n", + "4 [-0.7228847742080688, 0.12011835724115372, -0.... positive \n", + "5 [-0.7876735329627991, -0.0005504372529685497, ... positive \n", + "6 [-0.7093901634216309, 0.15827353298664093, -0.... positive \n", + "7 [-0.38020092248916626, 0.469475656747818, -1.0... positive \n", + "8 [-0.9434630870819092, 0.15352500975131989, -0.... positive \n", + "9 [-0.5607839226722717, 0.01385028287768364, -0.... positive \n", + "10 [-0.5054810047149658, 0.3916030824184418, -0.1... positive \n", + "11 [-0.7918602228164673, 0.6628591418266296, -0.4... positive \n", + "12 [-0.6068148016929626, 0.4092712998390198, 0.18... positive \n", + "13 [-1.2009631395339966, 0.18674977123737335, -0.... positive \n", + "14 [-0.9833343029022217, 0.002539500128477812, -0... positive \n", + "15 [-0.903867781162262, 0.3173466622829437, -0.74... positive \n", + "16 [-0.7246012091636658, 0.4053008258342743, -0.2... positive \n", + "17 [-0.08034359663724899, 0.9084559082984924, -0.... positive \n", + "18 [-1.6253035068511963, 0.23702141642570496, -0.... positive \n", + "19 [-0.18891872465610504, 1.0232254266738892, -0.... positive \n", + "20 [-0.7862111330032349, 0.17004938423633575, -0.... positive \n", + "21 [0.09989737719297409, 0.21870799362659454, 0.2... positive \n", + "22 [-0.21414655447006226, 0.6170880794525146, -0.... positive \n", + "23 [-1.0250476598739624, 0.7916482090950012, -0.4... positive \n", + "24 [-0.967275083065033, 0.39687538146972656, -0.3... positive \n", + "25 [-0.8778604865074158, 0.4535127580165863, -0.8... positive \n", + "26 [-1.004093050956726, 0.5079272985458374, -0.48... positive \n", + "27 [-0.7925586700439453, 0.2502853572368622, -0.0... positive \n", + "28 [-1.155573844909668, 1.2174267768859863, -0.72... positive \n", + "29 [-1.0366969108581543, 0.9876224398612976, 0.21... positive \n", + "30 [-0.6213818788528442, 0.8505221009254456, -0.0... positive \n", + "31 [-0.8883647918701172, 0.09247803688049316, 0.0... positive \n", + "32 [-0.6616833209991455, 0.4456593692302704, -0.1... positive \n", + "33 [-0.7988455891609192, 0.3940075635910034, -0.2... positive \n", + "34 [-0.859315812587738, 0.18060781061649323, -0.3... positive \n", + "35 [-1.1440715789794922, 0.10256315022706985, -0.... positive \n", + "36 [-0.4633345901966095, 0.6127039790153503, -0.0... positive \n", + "37 [-0.8110732436180115, 0.9440520405769348, -0.2... positive \n", + "38 [-0.7378478050231934, 1.1133265495300293, -0.6... positive \n", + "39 [-0.4056348204612732, 0.8604288101196289, -0.2... positive \n", + "40 [-1.0248322486877441, 0.3955387771129608, -0.5... positive \n", + "41 [-0.7818620800971985, 0.35503625869750977, 0.1... positive \n", + "42 [-1.7940707206726074, 0.559665322303772, -0.49... positive \n", + "43 [-0.878898024559021, 0.7265058755874634, 0.008... positive \n", + "44 [0.0033321159426122904, 0.9780365228652954, -0... positive \n", + "45 [-0.6315991282463074, 0.5254122018814087, -0.3... positive \n", + "46 [-0.4117434322834015, 0.6890383362770081, 0.51... positive \n", + "47 [-0.5095536112785339, 0.48363006114959717, 0.0... positive \n", + "48 [-1.3492352962493896, 0.669184684753418, -0.38... positive \n", + "49 [-0.7200496792793274, 0.3299054205417633, -0.4... positive \n", + "\n", + " sentiment_confidence text \\\n", + "0 4.0 Over 45 tar sands projects that have already s... \n", + "1 1.0 I just got super excited because I found toile... \n", + "2 3.0 BE AFRAID, BE VERY AFRAID—INSLEE PROMOTES THE... \n", + "3 2.0 A lady fro @CheckersSA Brits tells me to hide ... \n", + "4 3.0 Just done an online shop and all the food esse... \n", + "5 2.0 @GavinNewsom so let me get this straight crow... \n", + "6 2.0 NY: 18- to 49-year-olds make up more than half... \n", + "7 1.0 Emerging market debt prices reflect worst case... \n", + "8 3.0 do you clean your #supermarket items due to t... \n", + "9 3.0 @flipkartsupport @rsprasad\\r\\r\\n@PMOIndia In h... \n", + "10 5.0 Several Guernsey women have set up a group of ... \n", + "11 3.0 I took Plaquenil for 4 years. Now it's the hot... \n", + "12 2.0 Can’t let this die. A little humor in these t... \n", + "13 1.0 I’ve been to the grocery store three times si... \n", + "14 1.0 That maybe there was a rioter out there who th... \n", + "15 3.0 First they release and spread the virus Strip ... \n", + "16 9.0 For about a year I have been toying with the i... \n", + "17 1.0 Creation Consumer Finance in Belfast are now p... \n", + "18 4.0 \"Your going to lose people to the flu but you'... \n", + "19 2.0 If you are a #RetailWorker and your store is s... \n", + "20 8.0 I love this social distancing..\\r\\r\\n\\r\\r\\nNo ... \n", + "21 1.0 #Facebook Ads Fails to Reject COVID-19 Misinfo... \n", + "22 1.0 Lease prices decline in March as as the corona... \n", + "23 5.0 Complete Shutdown of Karnataka W.E.F 24th Marc... \n", + "24 1.0 @MobilePunch Another deceitful palliative in m... \n", + "25 4.0 I am anyways under lockdown since 6th March be... \n", + "26 1.0 @KFCSA @yumbrands was at your store , the air ... \n", + "27 1.0 How to support and save local businesses durin... \n", + "28 7.0 This is the latest current information on supe... \n", + "29 6.0 If anyone witnesses any shops hiking their pri... \n", + "30 1.0 It's about time @eBay_UK stopped allowing peop... \n", + "31 2.0 sounds like a good idea - LA market offers spe... \n", + "32 2.0 No matter how they're ramping up efforts at #d... \n", + "33 1.0 I was wondering if a lovely supermarket would ... \n", + "34 1.0 Telangana people, Please dont go out unless it... \n", + "35 1.0 Idiots are panic purchasing food in bulk that ... \n", + "36 2.0 Following @BBVA_USA's initial offers last week... \n", + "37 3.0 Please appreciate your supermarket delivery dr... \n", + "38 9.0 When asked, “Why does ADI continue to operate... \n", + "39 2.0 The long-term fallout of the #coronavirus lock... \n", + "40 4.0 HELP US PACK THE PANTRIES I m live at 12 15 on... \n", + "41 4.0 Seeing what’s being left behind at grocery st... \n", + "42 2.0 Everyone don t forget condoms when you are hoa... \n", + "43 1.0 If you come across any shops charging inflated... \n", + "44 6.0 New @SA_Update #consumer insights affecting v... \n", + "45 4.0 How is COVID-19 affecting the pork and commodi... \n", + "46 4.0 Unbelievable https://t.co/fBrPYaxNH6 \n", + "47 1.0 How prepared are UK supermarkets to fulfill co... \n", + "48 1.0 Quakertown Distiller Providing Hand Sanitizer ... \n", + "49 1.0 Trump's disastrous dumbfuckery about #coronavi... \n", + "\n", + " y \n", + "0 positive \n", + "1 positive \n", + "2 positive \n", + "3 positive \n", + "4 negative \n", + "5 negative \n", + "6 negative \n", + "7 negative \n", + "8 positive \n", + "9 negative \n", + "10 negative \n", + "11 positive \n", + "12 negative \n", + "13 negative \n", + "14 positive \n", + "15 negative \n", + "16 positive \n", + "17 negative \n", + "18 negative \n", + "19 positive \n", + "20 positive \n", + "21 negative \n", + "22 positive \n", + "23 negative \n", + "24 negative \n", + "25 positive \n", + "26 negative \n", + "27 positive \n", + "28 positive \n", + "29 positive \n", + "30 negative \n", + "31 positive \n", + "32 positive \n", + "33 positive \n", + "34 positive \n", + "35 negative \n", + "36 negative \n", + "37 positive \n", + "38 positive \n", + "39 positive \n", + "40 positive \n", + "41 negative \n", + "42 positive \n", + "43 positive \n", + "44 positive \n", + "45 negative \n", + "46 positive \n", + "47 positive \n", + "48 positive \n", + "49 negative " + ], + "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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + "
documentsentence_embedding_small_bert_L2_128sentimentsentiment_confidencetexty
0Over 45 tar sands projects that have already s...[-0.040878042578697205, 0.7422170639038086, -1...positive4.0Over 45 tar sands projects that have already s...positive
1I just got super excited because I found toile...[-0.8823249340057373, 0.2473045289516449, -0.2...positive1.0I just got super excited because I found toile...positive
2BE AFRAID, BE VERY AFRAID—INSLEE PROMOTES THE...[-0.5860391855239868, 0.45967912673950195, -0....positive3.0BE AFRAID, BE VERY AFRAID—INSLEE PROMOTES THE...positive
3A lady fro @CheckersSA Brits tells me to hide ...[-1.0504486560821533, 0.03315277025103569, -0....positive2.0A lady fro @CheckersSA Brits tells me to hide ...positive
4Just done an online shop and all the food esse...[-0.7228847742080688, 0.12011835724115372, -0....positive3.0Just done an online shop and all the food esse...negative
5@GavinNewsom so let me get this straight crowd...[-0.7876735329627991, -0.0005504372529685497, ...positive2.0@GavinNewsom so let me get this straight crow...negative
6NY: 18- to 49-year-olds make up more than half...[-0.7093901634216309, 0.15827353298664093, -0....positive2.0NY: 18- to 49-year-olds make up more than half...negative
7Emerging market debt prices reflect worst case...[-0.38020092248916626, 0.469475656747818, -1.0...positive1.0Emerging market debt prices reflect worst case...negative
8do you clean your #supermarket items due to th...[-0.9434630870819092, 0.15352500975131989, -0....positive3.0do you clean your #supermarket items due to t...positive
9@flipkartsupport @rsprasad @PMOIndia In his cr...[-0.5607839226722717, 0.01385028287768364, -0....positive3.0@flipkartsupport @rsprasad\\r\\r\\n@PMOIndia In h...negative
10Several Guernsey women have set up a group of ...[-0.5054810047149658, 0.3916030824184418, -0.1...positive5.0Several Guernsey women have set up a group of ...negative
11I took Plaquenil for 4 years. Now it's the hot...[-0.7918602228164673, 0.6628591418266296, -0.4...positive3.0I took Plaquenil for 4 years. Now it's the hot...positive
12Can’t let this die. A little humor in these t...[-0.6068148016929626, 0.4092712998390198, 0.18...positive2.0Can’t let this die. A little humor in these t...negative
13I’ve been to the grocery store three times si...[-1.2009631395339966, 0.18674977123737335, -0....positive1.0I’ve been to the grocery store three times si...negative
14That maybe there was a rioter out there who th...[-0.9833343029022217, 0.002539500128477812, -0...positive1.0That maybe there was a rioter out there who th...positive
15First they release and spread the virus Strip ...[-0.903867781162262, 0.3173466622829437, -0.74...positive3.0First they release and spread the virus Strip ...negative
16For about a year I have been toying with the i...[-0.7246012091636658, 0.4053008258342743, -0.2...positive9.0For about a year I have been toying with the i...positive
17Creation Consumer Finance in Belfast are now p...[-0.08034359663724899, 0.9084559082984924, -0....positive1.0Creation Consumer Finance in Belfast are now p...negative
18\"Your going to lose people to the flu but you'...[-1.6253035068511963, 0.23702141642570496, -0....positive4.0\"Your going to lose people to the flu but you'...negative
19If you are a #RetailWorker and your store is s...[-0.18891872465610504, 1.0232254266738892, -0....positive2.0If you are a #RetailWorker and your store is s...positive
20I love this social distancing.. No one stand c...[-0.7862111330032349, 0.17004938423633575, -0....positive8.0I love this social distancing..\\r\\r\\n\\r\\r\\nNo ...positive
21#Facebook Ads Fails to Reject COVID-19 Misinfo...[0.09989737719297409, 0.21870799362659454, 0.2...positive1.0#Facebook Ads Fails to Reject COVID-19 Misinfo...negative
22Lease prices decline in March as as the corona...[-0.21414655447006226, 0.6170880794525146, -0....positive1.0Lease prices decline in March as as the corona...positive
23Complete Shutdown of Karnataka W.E.F 24th Marc...[-1.0250476598739624, 0.7916482090950012, -0.4...positive5.0Complete Shutdown of Karnataka W.E.F 24th Marc...negative
24@MobilePunch Another deceitful palliative in m...[-0.967275083065033, 0.39687538146972656, -0.3...positive1.0@MobilePunch Another deceitful palliative in m...negative
25I am anyways under lockdown since 6th March be...[-0.8778604865074158, 0.4535127580165863, -0.8...positive4.0I am anyways under lockdown since 6th March be...positive
26@KFCSA @yumbrands was at your store , the air ...[-1.004093050956726, 0.5079272985458374, -0.48...positive1.0@KFCSA @yumbrands was at your store , the air ...negative
27How to support and save local businesses durin...[-0.7925586700439453, 0.2502853572368622, -0.0...positive1.0How to support and save local businesses durin...positive
28This is the latest current information on supe...[-1.155573844909668, 1.2174267768859863, -0.72...positive7.0This is the latest current information on supe...positive
29If anyone witnesses any shops hiking their pri...[-1.0366969108581543, 0.9876224398612976, 0.21...positive6.0If anyone witnesses any shops hiking their pri...positive
30It's about time @eBay_UK stopped allowing peop...[-0.6213818788528442, 0.8505221009254456, -0.0...positive1.0It's about time @eBay_UK stopped allowing peop...negative
31sounds like a good idea - LA market offers spe...[-0.8883647918701172, 0.09247803688049316, 0.0...positive2.0sounds like a good idea - LA market offers spe...positive
32No matter how they're ramping up efforts at #d...[-0.6616833209991455, 0.4456593692302704, -0.1...positive2.0No matter how they're ramping up efforts at #d...positive
33I was wondering if a lovely supermarket would ...[-0.7988455891609192, 0.3940075635910034, -0.2...positive1.0I was wondering if a lovely supermarket would ...positive
34Telangana people, Please dont go out unless it...[-0.859315812587738, 0.18060781061649323, -0.3...positive1.0Telangana people, Please dont go out unless it...positive
35Idiots are panic purchasing food in bulk that ...[-1.1440715789794922, 0.10256315022706985, -0....positive1.0Idiots are panic purchasing food in bulk that ...negative
36Following @BBVA_USA's initial offers last week...[-0.4633345901966095, 0.6127039790153503, -0.0...positive2.0Following @BBVA_USA's initial offers last week...negative
37Please appreciate your supermarket delivery dr...[-0.8110732436180115, 0.9440520405769348, -0.2...positive3.0Please appreciate your supermarket delivery dr...positive
38When asked, “Why does ADI continue to operate...[-0.7378478050231934, 1.1133265495300293, -0.6...positive9.0When asked, “Why does ADI continue to operate...positive
39The long-term fallout of the #coronavirus lock...[-0.4056348204612732, 0.8604288101196289, -0.2...positive2.0The long-term fallout of the #coronavirus lock...positive
40HELP US PACK THE PANTRIES I m live at 12 15 on...[-1.0248322486877441, 0.3955387771129608, -0.5...positive4.0HELP US PACK THE PANTRIES I m live at 12 15 on...positive
41Seeing what’s being left behind at grocery st...[-0.7818620800971985, 0.35503625869750977, 0.1...positive4.0Seeing what’s being left behind at grocery st...negative
42Everyone don t forget condoms when you are hoa...[-1.7940707206726074, 0.559665322303772, -0.49...positive2.0Everyone don t forget condoms when you are hoa...positive
43If you come across any shops charging inflated...[-0.878898024559021, 0.7265058755874634, 0.008...positive1.0If you come across any shops charging inflated...positive
44New @SA_Update #consumer insights affecting ve...[0.0033321159426122904, 0.9780365228652954, -0...positive6.0New @SA_Update #consumer insights affecting v...positive
45How is COVID-19 affecting the pork and commodi...[-0.6315991282463074, 0.5254122018814087, -0.3...positive4.0How is COVID-19 affecting the pork and commodi...negative
46Unbelievable https://t.co/fBrPYaxNH6[-0.4117434322834015, 0.6890383362770081, 0.51...positive4.0Unbelievable https://t.co/fBrPYaxNH6positive
47How prepared are UK supermarkets to fulfill co...[-0.5095536112785339, 0.48363006114959717, 0.0...positive1.0How prepared are UK supermarkets to fulfill co...positive
48Quakertown Distiller Providing Hand Sanitizer ...[-1.3492352962493896, 0.669184684753418, -0.38...positive1.0Quakertown Distiller Providing Hand Sanitizer ...positive
49Trump's disastrous dumbfuckery about #coronavi...[-0.7200496792793274, 0.3299054205417633, -0.4...positive1.0Trump's disastrous dumbfuckery about #coronavi...negative
\n", + "
\n", + "
\n", + "\n", + "
\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "
\n", + "\n", + "\n", + "
\n", + " \n", + "\n", + "\n", + "\n", + " \n", + "
\n", + "
\n", + "
\n" + ] + }, + "metadata": {}, + "execution_count": 33 + } + ] + }, + { + "cell_type": "code", + "source": [ + "preds" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 1000 + }, + "id": "UbEWiXSUO0Qb", + "outputId": "b7ae6af2-3b84-4c6d-a997-d41163e474e0" + }, + "execution_count": 34, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + " document \\\n", + "0 Over 45 tar sands projects that have already s... \n", + "1 I just got super excited because I found toile... \n", + "2 BE AFRAID, BE VERY AFRAID—INSLEE PROMOTES THE... \n", + "3 A lady fro @CheckersSA Brits tells me to hide ... \n", + "4 Just done an online shop and all the food esse... \n", + "5 @GavinNewsom so let me get this straight crowd... \n", + "6 NY: 18- to 49-year-olds make up more than half... \n", + "7 Emerging market debt prices reflect worst case... \n", + "8 do you clean your #supermarket items due to th... \n", + "9 @flipkartsupport @rsprasad @PMOIndia In his cr... \n", + "10 Several Guernsey women have set up a group of ... \n", + "11 I took Plaquenil for 4 years. Now it's the hot... \n", + "12 Can’t let this die. A little humor in these t... \n", + "13 I’ve been to the grocery store three times si... \n", + "14 That maybe there was a rioter out there who th... \n", + "15 First they release and spread the virus Strip ... \n", + "16 For about a year I have been toying with the i... \n", + "17 Creation Consumer Finance in Belfast are now p... \n", + "18 \"Your going to lose people to the flu but you'... \n", + "19 If you are a #RetailWorker and your store is s... \n", + "20 I love this social distancing.. No one stand c... \n", + "21 #Facebook Ads Fails to Reject COVID-19 Misinfo... \n", + "22 Lease prices decline in March as as the corona... \n", + "23 Complete Shutdown of Karnataka W.E.F 24th Marc... \n", + "24 @MobilePunch Another deceitful palliative in m... \n", + "25 I am anyways under lockdown since 6th March be... \n", + "26 @KFCSA @yumbrands was at your store , the air ... \n", + "27 How to support and save local businesses durin... \n", + "28 This is the latest current information on supe... \n", + "29 If anyone witnesses any shops hiking their pri... \n", + "30 It's about time @eBay_UK stopped allowing peop... \n", + "31 sounds like a good idea - LA market offers spe... \n", + "32 No matter how they're ramping up efforts at #d... \n", + "33 I was wondering if a lovely supermarket would ... \n", + "34 Telangana people, Please dont go out unless it... \n", + "35 Idiots are panic purchasing food in bulk that ... \n", + "36 Following @BBVA_USA's initial offers last week... \n", + "37 Please appreciate your supermarket delivery dr... \n", + "38 When asked, “Why does ADI continue to operate... \n", + "39 The long-term fallout of the #coronavirus lock... \n", + "40 HELP US PACK THE PANTRIES I m live at 12 15 on... \n", + "41 Seeing what’s being left behind at grocery st... \n", + "42 Everyone don t forget condoms when you are hoa... \n", + "43 If you come across any shops charging inflated... \n", + "44 New @SA_Update #consumer insights affecting ve... \n", + "45 How is COVID-19 affecting the pork and commodi... \n", + "46 Unbelievable https://t.co/fBrPYaxNH6 \n", + "47 How prepared are UK supermarkets to fulfill co... \n", + "48 Quakertown Distiller Providing Hand Sanitizer ... \n", + "49 Trump's disastrous dumbfuckery about #coronavi... \n", + "\n", + " sentence_embedding_small_bert_L2_128 sentiment \\\n", + "0 [-0.040878042578697205, 0.7422170639038086, -1... positive \n", + "1 [-0.8823249340057373, 0.2473045289516449, -0.2... positive \n", + "2 [-0.5860391855239868, 0.45967912673950195, -0.... positive \n", + "3 [-1.0504486560821533, 0.03315277025103569, -0.... positive \n", + "4 [-0.7228847742080688, 0.12011835724115372, -0.... positive \n", + "5 [-0.7876735329627991, -0.0005504372529685497, ... positive \n", + "6 [-0.7093901634216309, 0.15827353298664093, -0.... positive \n", + "7 [-0.38020092248916626, 0.469475656747818, -1.0... positive \n", + "8 [-0.9434630870819092, 0.15352500975131989, -0.... positive \n", + "9 [-0.5607839226722717, 0.01385028287768364, -0.... positive \n", + "10 [-0.5054810047149658, 0.3916030824184418, -0.1... positive \n", + "11 [-0.7918602228164673, 0.6628591418266296, -0.4... positive \n", + "12 [-0.6068148016929626, 0.4092712998390198, 0.18... positive \n", + "13 [-1.2009631395339966, 0.18674977123737335, -0.... positive \n", + "14 [-0.9833343029022217, 0.002539500128477812, -0... positive \n", + "15 [-0.903867781162262, 0.3173466622829437, -0.74... positive \n", + "16 [-0.7246012091636658, 0.4053008258342743, -0.2... positive \n", + "17 [-0.08034359663724899, 0.9084559082984924, -0.... positive \n", + "18 [-1.6253035068511963, 0.23702141642570496, -0.... positive \n", + "19 [-0.18891872465610504, 1.0232254266738892, -0.... positive \n", + "20 [-0.7862111330032349, 0.17004938423633575, -0.... positive \n", + "21 [0.09989737719297409, 0.21870799362659454, 0.2... positive \n", + "22 [-0.21414655447006226, 0.6170880794525146, -0.... positive \n", + "23 [-1.0250476598739624, 0.7916482090950012, -0.4... positive \n", + "24 [-0.967275083065033, 0.39687538146972656, -0.3... positive \n", + "25 [-0.8778604865074158, 0.4535127580165863, -0.8... positive \n", + "26 [-1.004093050956726, 0.5079272985458374, -0.48... positive \n", + "27 [-0.7925586700439453, 0.2502853572368622, -0.0... positive \n", + "28 [-1.155573844909668, 1.2174267768859863, -0.72... positive \n", + "29 [-1.0366969108581543, 0.9876224398612976, 0.21... positive \n", + "30 [-0.6213818788528442, 0.8505221009254456, -0.0... positive \n", + "31 [-0.8883647918701172, 0.09247803688049316, 0.0... positive \n", + "32 [-0.6616833209991455, 0.4456593692302704, -0.1... positive \n", + "33 [-0.7988455891609192, 0.3940075635910034, -0.2... positive \n", + "34 [-0.859315812587738, 0.18060781061649323, -0.3... positive \n", + "35 [-1.1440715789794922, 0.10256315022706985, -0.... positive \n", + "36 [-0.4633345901966095, 0.6127039790153503, -0.0... positive \n", + "37 [-0.8110732436180115, 0.9440520405769348, -0.2... positive \n", + "38 [-0.7378478050231934, 1.1133265495300293, -0.6... positive \n", + "39 [-0.4056348204612732, 0.8604288101196289, -0.2... positive \n", + "40 [-1.0248322486877441, 0.3955387771129608, -0.5... positive \n", + "41 [-0.7818620800971985, 0.35503625869750977, 0.1... positive \n", + "42 [-1.7940707206726074, 0.559665322303772, -0.49... positive \n", + "43 [-0.878898024559021, 0.7265058755874634, 0.008... positive \n", + "44 [0.0033321159426122904, 0.9780365228652954, -0... positive \n", + "45 [-0.6315991282463074, 0.5254122018814087, -0.3... positive \n", + "46 [-0.4117434322834015, 0.6890383362770081, 0.51... positive \n", + "47 [-0.5095536112785339, 0.48363006114959717, 0.0... positive \n", + "48 [-1.3492352962493896, 0.669184684753418, -0.38... positive \n", + "49 [-0.7200496792793274, 0.3299054205417633, -0.4... positive \n", + "\n", + " sentiment_confidence text \\\n", + "0 4.0 Over 45 tar sands projects that have already s... \n", + "1 1.0 I just got super excited because I found toile... \n", + "2 3.0 BE AFRAID, BE VERY AFRAID—INSLEE PROMOTES THE... \n", + "3 2.0 A lady fro @CheckersSA Brits tells me to hide ... \n", + "4 3.0 Just done an online shop and all the food esse... \n", + "5 2.0 @GavinNewsom so let me get this straight crow... \n", + "6 2.0 NY: 18- to 49-year-olds make up more than half... \n", + "7 1.0 Emerging market debt prices reflect worst case... \n", + "8 3.0 do you clean your #supermarket items due to t... \n", + "9 3.0 @flipkartsupport @rsprasad\\r\\r\\n@PMOIndia In h... \n", + "10 5.0 Several Guernsey women have set up a group of ... \n", + "11 3.0 I took Plaquenil for 4 years. Now it's the hot... \n", + "12 2.0 Can’t let this die. A little humor in these t... \n", + "13 1.0 I’ve been to the grocery store three times si... \n", + "14 1.0 That maybe there was a rioter out there who th... \n", + "15 3.0 First they release and spread the virus Strip ... \n", + "16 9.0 For about a year I have been toying with the i... \n", + "17 1.0 Creation Consumer Finance in Belfast are now p... \n", + "18 4.0 \"Your going to lose people to the flu but you'... \n", + "19 2.0 If you are a #RetailWorker and your store is s... \n", + "20 8.0 I love this social distancing..\\r\\r\\n\\r\\r\\nNo ... \n", + "21 1.0 #Facebook Ads Fails to Reject COVID-19 Misinfo... \n", + "22 1.0 Lease prices decline in March as as the corona... \n", + "23 5.0 Complete Shutdown of Karnataka W.E.F 24th Marc... \n", + "24 1.0 @MobilePunch Another deceitful palliative in m... \n", + "25 4.0 I am anyways under lockdown since 6th March be... \n", + "26 1.0 @KFCSA @yumbrands was at your store , the air ... \n", + "27 1.0 How to support and save local businesses durin... \n", + "28 7.0 This is the latest current information on supe... \n", + "29 6.0 If anyone witnesses any shops hiking their pri... \n", + "30 1.0 It's about time @eBay_UK stopped allowing peop... \n", + "31 2.0 sounds like a good idea - LA market offers spe... \n", + "32 2.0 No matter how they're ramping up efforts at #d... \n", + "33 1.0 I was wondering if a lovely supermarket would ... \n", + "34 1.0 Telangana people, Please dont go out unless it... \n", + "35 1.0 Idiots are panic purchasing food in bulk that ... \n", + "36 2.0 Following @BBVA_USA's initial offers last week... \n", + "37 3.0 Please appreciate your supermarket delivery dr... \n", + "38 9.0 When asked, “Why does ADI continue to operate... \n", + "39 2.0 The long-term fallout of the #coronavirus lock... \n", + "40 4.0 HELP US PACK THE PANTRIES I m live at 12 15 on... \n", + "41 4.0 Seeing what’s being left behind at grocery st... \n", + "42 2.0 Everyone don t forget condoms when you are hoa... \n", + "43 1.0 If you come across any shops charging inflated... \n", + "44 6.0 New @SA_Update #consumer insights affecting v... \n", + "45 4.0 How is COVID-19 affecting the pork and commodi... \n", + "46 4.0 Unbelievable https://t.co/fBrPYaxNH6 \n", + "47 1.0 How prepared are UK supermarkets to fulfill co... \n", + "48 1.0 Quakertown Distiller Providing Hand Sanitizer ... \n", + "49 1.0 Trump's disastrous dumbfuckery about #coronavi... \n", + "\n", + " y \n", + "0 positive \n", + "1 positive \n", + "2 positive \n", + "3 positive \n", + "4 negative \n", + "5 negative \n", + "6 negative \n", + "7 negative \n", + "8 positive \n", + "9 negative \n", + "10 negative \n", + "11 positive \n", + "12 negative \n", + "13 negative \n", + "14 positive \n", + "15 negative \n", + "16 positive \n", + "17 negative \n", + "18 negative \n", + "19 positive \n", + "20 positive \n", + "21 negative \n", + "22 positive \n", + "23 negative \n", + "24 negative \n", + "25 positive \n", + "26 negative \n", + "27 positive \n", + "28 positive \n", + "29 positive \n", + "30 negative \n", + "31 positive \n", + "32 positive \n", + "33 positive \n", + "34 positive \n", + "35 negative \n", + "36 negative \n", + "37 positive \n", + "38 positive \n", + "39 positive \n", + "40 positive \n", + "41 negative \n", + "42 positive \n", + "43 positive \n", + "44 positive \n", + "45 negative \n", + "46 positive \n", + "47 positive \n", + "48 positive \n", + "49 negative " + ], + "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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + "
documentsentence_embedding_small_bert_L2_128sentimentsentiment_confidencetexty
0Over 45 tar sands projects that have already s...[-0.040878042578697205, 0.7422170639038086, -1...positive4.0Over 45 tar sands projects that have already s...positive
1I just got super excited because I found toile...[-0.8823249340057373, 0.2473045289516449, -0.2...positive1.0I just got super excited because I found toile...positive
2BE AFRAID, BE VERY AFRAID—INSLEE PROMOTES THE...[-0.5860391855239868, 0.45967912673950195, -0....positive3.0BE AFRAID, BE VERY AFRAID—INSLEE PROMOTES THE...positive
3A lady fro @CheckersSA Brits tells me to hide ...[-1.0504486560821533, 0.03315277025103569, -0....positive2.0A lady fro @CheckersSA Brits tells me to hide ...positive
4Just done an online shop and all the food esse...[-0.7228847742080688, 0.12011835724115372, -0....positive3.0Just done an online shop and all the food esse...negative
5@GavinNewsom so let me get this straight crowd...[-0.7876735329627991, -0.0005504372529685497, ...positive2.0@GavinNewsom so let me get this straight crow...negative
6NY: 18- to 49-year-olds make up more than half...[-0.7093901634216309, 0.15827353298664093, -0....positive2.0NY: 18- to 49-year-olds make up more than half...negative
7Emerging market debt prices reflect worst case...[-0.38020092248916626, 0.469475656747818, -1.0...positive1.0Emerging market debt prices reflect worst case...negative
8do you clean your #supermarket items due to th...[-0.9434630870819092, 0.15352500975131989, -0....positive3.0do you clean your #supermarket items due to t...positive
9@flipkartsupport @rsprasad @PMOIndia In his cr...[-0.5607839226722717, 0.01385028287768364, -0....positive3.0@flipkartsupport @rsprasad\\r\\r\\n@PMOIndia In h...negative
10Several Guernsey women have set up a group of ...[-0.5054810047149658, 0.3916030824184418, -0.1...positive5.0Several Guernsey women have set up a group of ...negative
11I took Plaquenil for 4 years. Now it's the hot...[-0.7918602228164673, 0.6628591418266296, -0.4...positive3.0I took Plaquenil for 4 years. Now it's the hot...positive
12Can’t let this die. A little humor in these t...[-0.6068148016929626, 0.4092712998390198, 0.18...positive2.0Can’t let this die. A little humor in these t...negative
13I’ve been to the grocery store three times si...[-1.2009631395339966, 0.18674977123737335, -0....positive1.0I’ve been to the grocery store three times si...negative
14That maybe there was a rioter out there who th...[-0.9833343029022217, 0.002539500128477812, -0...positive1.0That maybe there was a rioter out there who th...positive
15First they release and spread the virus Strip ...[-0.903867781162262, 0.3173466622829437, -0.74...positive3.0First they release and spread the virus Strip ...negative
16For about a year I have been toying with the i...[-0.7246012091636658, 0.4053008258342743, -0.2...positive9.0For about a year I have been toying with the i...positive
17Creation Consumer Finance in Belfast are now p...[-0.08034359663724899, 0.9084559082984924, -0....positive1.0Creation Consumer Finance in Belfast are now p...negative
18\"Your going to lose people to the flu but you'...[-1.6253035068511963, 0.23702141642570496, -0....positive4.0\"Your going to lose people to the flu but you'...negative
19If you are a #RetailWorker and your store is s...[-0.18891872465610504, 1.0232254266738892, -0....positive2.0If you are a #RetailWorker and your store is s...positive
20I love this social distancing.. No one stand c...[-0.7862111330032349, 0.17004938423633575, -0....positive8.0I love this social distancing..\\r\\r\\n\\r\\r\\nNo ...positive
21#Facebook Ads Fails to Reject COVID-19 Misinfo...[0.09989737719297409, 0.21870799362659454, 0.2...positive1.0#Facebook Ads Fails to Reject COVID-19 Misinfo...negative
22Lease prices decline in March as as the corona...[-0.21414655447006226, 0.6170880794525146, -0....positive1.0Lease prices decline in March as as the corona...positive
23Complete Shutdown of Karnataka W.E.F 24th Marc...[-1.0250476598739624, 0.7916482090950012, -0.4...positive5.0Complete Shutdown of Karnataka W.E.F 24th Marc...negative
24@MobilePunch Another deceitful palliative in m...[-0.967275083065033, 0.39687538146972656, -0.3...positive1.0@MobilePunch Another deceitful palliative in m...negative
25I am anyways under lockdown since 6th March be...[-0.8778604865074158, 0.4535127580165863, -0.8...positive4.0I am anyways under lockdown since 6th March be...positive
26@KFCSA @yumbrands was at your store , the air ...[-1.004093050956726, 0.5079272985458374, -0.48...positive1.0@KFCSA @yumbrands was at your store , the air ...negative
27How to support and save local businesses durin...[-0.7925586700439453, 0.2502853572368622, -0.0...positive1.0How to support and save local businesses durin...positive
28This is the latest current information on supe...[-1.155573844909668, 1.2174267768859863, -0.72...positive7.0This is the latest current information on supe...positive
29If anyone witnesses any shops hiking their pri...[-1.0366969108581543, 0.9876224398612976, 0.21...positive6.0If anyone witnesses any shops hiking their pri...positive
30It's about time @eBay_UK stopped allowing peop...[-0.6213818788528442, 0.8505221009254456, -0.0...positive1.0It's about time @eBay_UK stopped allowing peop...negative
31sounds like a good idea - LA market offers spe...[-0.8883647918701172, 0.09247803688049316, 0.0...positive2.0sounds like a good idea - LA market offers spe...positive
32No matter how they're ramping up efforts at #d...[-0.6616833209991455, 0.4456593692302704, -0.1...positive2.0No matter how they're ramping up efforts at #d...positive
33I was wondering if a lovely supermarket would ...[-0.7988455891609192, 0.3940075635910034, -0.2...positive1.0I was wondering if a lovely supermarket would ...positive
34Telangana people, Please dont go out unless it...[-0.859315812587738, 0.18060781061649323, -0.3...positive1.0Telangana people, Please dont go out unless it...positive
35Idiots are panic purchasing food in bulk that ...[-1.1440715789794922, 0.10256315022706985, -0....positive1.0Idiots are panic purchasing food in bulk that ...negative
36Following @BBVA_USA's initial offers last week...[-0.4633345901966095, 0.6127039790153503, -0.0...positive2.0Following @BBVA_USA's initial offers last week...negative
37Please appreciate your supermarket delivery dr...[-0.8110732436180115, 0.9440520405769348, -0.2...positive3.0Please appreciate your supermarket delivery dr...positive
38When asked, “Why does ADI continue to operate...[-0.7378478050231934, 1.1133265495300293, -0.6...positive9.0When asked, “Why does ADI continue to operate...positive
39The long-term fallout of the #coronavirus lock...[-0.4056348204612732, 0.8604288101196289, -0.2...positive2.0The long-term fallout of the #coronavirus lock...positive
40HELP US PACK THE PANTRIES I m live at 12 15 on...[-1.0248322486877441, 0.3955387771129608, -0.5...positive4.0HELP US PACK THE PANTRIES I m live at 12 15 on...positive
41Seeing what’s being left behind at grocery st...[-0.7818620800971985, 0.35503625869750977, 0.1...positive4.0Seeing what’s being left behind at grocery st...negative
42Everyone don t forget condoms when you are hoa...[-1.7940707206726074, 0.559665322303772, -0.49...positive2.0Everyone don t forget condoms when you are hoa...positive
43If you come across any shops charging inflated...[-0.878898024559021, 0.7265058755874634, 0.008...positive1.0If you come across any shops charging inflated...positive
44New @SA_Update #consumer insights affecting ve...[0.0033321159426122904, 0.9780365228652954, -0...positive6.0New @SA_Update #consumer insights affecting v...positive
45How is COVID-19 affecting the pork and commodi...[-0.6315991282463074, 0.5254122018814087, -0.3...positive4.0How is COVID-19 affecting the pork and commodi...negative
46Unbelievable https://t.co/fBrPYaxNH6[-0.4117434322834015, 0.6890383362770081, 0.51...positive4.0Unbelievable https://t.co/fBrPYaxNH6positive
47How prepared are UK supermarkets to fulfill co...[-0.5095536112785339, 0.48363006114959717, 0.0...positive1.0How prepared are UK supermarkets to fulfill co...positive
48Quakertown Distiller Providing Hand Sanitizer ...[-1.3492352962493896, 0.669184684753418, -0.38...positive1.0Quakertown Distiller Providing Hand Sanitizer ...positive
49Trump's disastrous dumbfuckery about #coronavi...[-0.7200496792793274, 0.3299054205417633, -0.4...positive1.0Trump's disastrous dumbfuckery about #coronavi...negative
\n", + "
\n", + "
\n", + "\n", + "
\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "
\n", + "\n", + "\n", + "
\n", + " \n", + "\n", + "\n", + "\n", + " \n", + "
\n", + "
\n", + "
\n" + ] + }, + "metadata": {}, + "execution_count": 34 + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "lVyOE2wV0fw_" + }, + "source": [ + "# 4. Test the fitted pipe on new example" + ] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 150 + }, + "id": "qdCUg2MR0PD2", + "outputId": "3c6d4f10-f2ef-4fbf-8488-bf8be3857f92" + }, + "source": [ + "fitted_pipe.predict(\"Everything is under control !\")" + ], + "execution_count": 35, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "sentence_detector_dl download started this may take some time.\n", + "Approximate size to download 354.6 KB\n", + "[OK!]\n", + "Warning::Spark Session already created, some configs may not take.\n" + ] + }, + { + "output_type": "execute_result", + "data": { + "text/plain": [ + " sentence \\\n", + "0 Everything is under control ! \n", + "\n", + " sentence_embedding_small_bert_L2_128 sentiment \\\n", + "0 [-1.6309462785720825, 0.7175763845443726, -0.7... positive \n", + "\n", + " sentiment_confidence \n", + "0 0.999999 " + ], + "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", + "
sentencesentence_embedding_small_bert_L2_128sentimentsentiment_confidence
0Everything is under control ![-1.6309462785720825, 0.7175763845443726, -0.7...positive0.999999
\n", + "
\n", + "
\n", + "\n", + "
\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "
\n", + "\n", + "
\n", + "
\n" + ] + }, + "metadata": {}, + "execution_count": 35 + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "xflpwrVjjBVD" + }, + "source": [ + "## 5. Configure pipe training parameters" + ] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "UtsAUGTmOTms", + "outputId": "b535fdb8-eee3-4825-e3d5-74d4dd7b42a5" + }, + "source": [ + "trainable_pipe.print_info()" + ], + "execution_count": 36, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "The following parameters are configurable for this NLU pipeline (You can copy paste the examples) :\n", + ">>> component_list['bert_sentence_embeddings@sent_small_bert_L2_128'] has settable params:\n", + "component_list['bert_sentence_embeddings@sent_small_bert_L2_128'].setBatchSize(8) | Info: Size of every batch | Currently set to : 8\n", + "component_list['bert_sentence_embeddings@sent_small_bert_L2_128'].setEngine('tensorflow') | Info: Deep Learning engine used for this model | Currently set to : tensorflow\n", + "component_list['bert_sentence_embeddings@sent_small_bert_L2_128'].setIsLong(False) | Info: Use Long type instead of Int type for inputs buffer - Some Bert models require Long instead of Int. | Currently set to : False\n", + "component_list['bert_sentence_embeddings@sent_small_bert_L2_128'].setMaxSentenceLength(128) | Info: Max sentence length to process | Currently set to : 128\n", + "component_list['bert_sentence_embeddings@sent_small_bert_L2_128'].setDimension(128) | Info: Number of embedding dimensions | Currently set to : 128\n", + "component_list['bert_sentence_embeddings@sent_small_bert_L2_128'].setCaseSensitive(False) | Info: whether to ignore case in tokens for embeddings matching | Currently set to : False\n", + "component_list['bert_sentence_embeddings@sent_small_bert_L2_128'].setStorageRef('sent_small_bert_L2_128') | Info: unique reference name for identification | Currently set to : sent_small_bert_L2_128\n", + ">>> component_list['document_assembler'] has settable params:\n", + "component_list['document_assembler'].setCleanupMode('shrink') | Info: possible values: disabled, inplace, inplace_full, shrink, shrink_full, each, each_full, delete_full | Currently set to : shrink\n", + ">>> component_list['sentiment_dl@sent_small_bert_L2_128'] has settable params:\n", + "component_list['sentiment_dl@sent_small_bert_L2_128'].setEngine('tensorflow') | Info: Deep Learning engine used for this model | Currently set to : tensorflow\n", + "component_list['sentiment_dl@sent_small_bert_L2_128'].setThreshold(0.6) | Info: The minimum threshold for the final result otheriwse it will be neutral | Currently set to : 0.6\n", + "component_list['sentiment_dl@sent_small_bert_L2_128'].setThresholdLabel('neutral') | Info: In case the score is less than threshold, what should be the label. Default is neutral. | Currently set to : neutral\n", + "component_list['sentiment_dl@sent_small_bert_L2_128'].setStorageRef('sent_small_bert_L2_128') | Info: unique reference name for identification | Currently set to : sent_small_bert_L2_128\n" + ] + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "2GJdDNV9jEIe" + }, + "source": [ + "##6. Retrain with new parameters" + ] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 1000 + }, + "id": "mptfvHx-MMMX", + "outputId": "c647f370-bd30-43ef-d2a9-b7ffc1948686" + }, + "source": [ + "# Train longer!\n", + "trainable_pipe = nlp.load('train.sentiment')\n", + "trainable_pipe['trainable_sentiment_dl'].setMaxEpochs(5)\n", + "fitted_pipe = trainable_pipe.fit(train_df.iloc[:50])\n", + "# predict with the trainable pipeline on dataset and get predictions\n", + "preds = fitted_pipe.predict(train_df.iloc[:50],output_level='document')\n", + "\n", + "#sentence detector that is part of the pipe generates sone NaNs. lets drop them first\n", + "preds.dropna(inplace=True)\n", + "print(classification_report(preds['y'], preds['sentiment']))\n", + "\n", + "preds" + ], + "execution_count": 37, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Warning::Spark Session already created, some configs may not take.\n", + "Warning::Spark Session already created, some configs may not take.\n", + "sent_small_bert_L2_128 download started this may take some time.\n", + "Approximate size to download 16.1 MB\n", + "[OK!]\n" + ] + }, + { + "output_type": "stream", + "name": "stderr", + "text": [ + "/usr/local/lib/python3.10/dist-packages/nlu/pipe/pipeline.py:149: SettingWithCopyWarning: \n", + "A value is trying to be set on a copy of a slice from a DataFrame.\n", + "Try using .loc[row_indexer,col_indexer] = value instead\n", + "\n", + "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n", + " dataset.y = dataset.y.apply(str)\n", + "/usr/local/lib/python3.10/dist-packages/nlu/pipe/utils/data_conversion_utils.py:160: SettingWithCopyWarning: \n", + "A value is trying to be set on a copy of a slice from a DataFrame.\n", + "Try using .loc[row_indexer,col_indexer] = value instead\n", + "\n", + "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n", + " data['origin_index'] = data.index\n", + "/usr/local/lib/python3.10/dist-packages/nlu/pipe/utils/data_conversion_utils.py:160: SettingWithCopyWarning: \n", + "A value is trying to be set on a copy of a slice from a DataFrame.\n", + "Try using .loc[row_indexer,col_indexer] = value instead\n", + "\n", + "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n", + " data['origin_index'] = data.index\n" + ] + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + " precision recall f1-score support\n", + "\n", + " negative 0.00 0.00 0.00 21\n", + " positive 0.58 1.00 0.73 29\n", + "\n", + " accuracy 0.58 50\n", + " macro avg 0.29 0.50 0.37 50\n", + "weighted avg 0.34 0.58 0.43 50\n", + "\n" + ] + }, + { + "output_type": "stream", + "name": "stderr", + "text": [ + "/usr/local/lib/python3.10/dist-packages/nlu/pipe/extractors/extractor_methods/base_extractor_methods.py:356: SettingWithCopyWarning: \n", + "A value is trying to be set on a copy of a slice from a DataFrame.\n", + "Try using .loc[row_indexer,col_indexer] = value instead\n", + "\n", + "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n", + " df[cols_to_explode] = df[cols_to_explode].apply(pad_same_level_cols, axis=1)\n", + "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/_classification.py:1344: UndefinedMetricWarning: Precision and F-score are ill-defined and being set to 0.0 in labels with no predicted samples. Use `zero_division` parameter to control this behavior.\n", + " _warn_prf(average, modifier, msg_start, len(result))\n", + "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/_classification.py:1344: UndefinedMetricWarning: Precision and F-score are ill-defined and being set to 0.0 in labels with no predicted samples. Use `zero_division` parameter to control this behavior.\n", + " _warn_prf(average, modifier, msg_start, len(result))\n", + "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/_classification.py:1344: UndefinedMetricWarning: Precision and F-score are ill-defined and being set to 0.0 in labels with no predicted samples. Use `zero_division` parameter to control this behavior.\n", + " _warn_prf(average, modifier, msg_start, len(result))\n" + ] + }, + { + "output_type": "execute_result", + "data": { + "text/plain": [ + " document \\\n", + "0 Over 45 tar sands projects that have already s... \n", + "1 I just got super excited because I found toile... \n", + "2 BE AFRAID, BE VERY AFRAID—INSLEE PROMOTES THE... \n", + "3 A lady fro @CheckersSA Brits tells me to hide ... \n", + "4 Just done an online shop and all the food esse... \n", + "5 @GavinNewsom so let me get this straight crowd... \n", + "6 NY: 18- to 49-year-olds make up more than half... \n", + "7 Emerging market debt prices reflect worst case... \n", + "8 do you clean your #supermarket items due to th... \n", + "9 @flipkartsupport @rsprasad @PMOIndia In his cr... \n", + "10 Several Guernsey women have set up a group of ... \n", + "11 I took Plaquenil for 4 years. Now it's the hot... \n", + "12 Can’t let this die. A little humor in these t... \n", + "13 I’ve been to the grocery store three times si... \n", + "14 That maybe there was a rioter out there who th... \n", + "15 First they release and spread the virus Strip ... \n", + "16 For about a year I have been toying with the i... \n", + "17 Creation Consumer Finance in Belfast are now p... \n", + "18 \"Your going to lose people to the flu but you'... \n", + "19 If you are a #RetailWorker and your store is s... \n", + "20 I love this social distancing.. No one stand c... \n", + "21 #Facebook Ads Fails to Reject COVID-19 Misinfo... \n", + "22 Lease prices decline in March as as the corona... \n", + "23 Complete Shutdown of Karnataka W.E.F 24th Marc... \n", + "24 @MobilePunch Another deceitful palliative in m... \n", + "25 I am anyways under lockdown since 6th March be... \n", + "26 @KFCSA @yumbrands was at your store , the air ... \n", + "27 How to support and save local businesses durin... \n", + "28 This is the latest current information on supe... \n", + "29 If anyone witnesses any shops hiking their pri... \n", + "30 It's about time @eBay_UK stopped allowing peop... \n", + "31 sounds like a good idea - LA market offers spe... \n", + "32 No matter how they're ramping up efforts at #d... \n", + "33 I was wondering if a lovely supermarket would ... \n", + "34 Telangana people, Please dont go out unless it... \n", + "35 Idiots are panic purchasing food in bulk that ... \n", + "36 Following @BBVA_USA's initial offers last week... \n", + "37 Please appreciate your supermarket delivery dr... \n", + "38 When asked, “Why does ADI continue to operate... \n", + "39 The long-term fallout of the #coronavirus lock... \n", + "40 HELP US PACK THE PANTRIES I m live at 12 15 on... \n", + "41 Seeing what’s being left behind at grocery st... \n", + "42 Everyone don t forget condoms when you are hoa... \n", + "43 If you come across any shops charging inflated... \n", + "44 New @SA_Update #consumer insights affecting ve... \n", + "45 How is COVID-19 affecting the pork and commodi... \n", + "46 Unbelievable https://t.co/fBrPYaxNH6 \n", + "47 How prepared are UK supermarkets to fulfill co... \n", + "48 Quakertown Distiller Providing Hand Sanitizer ... \n", + "49 Trump's disastrous dumbfuckery about #coronavi... \n", + "\n", + " sentence_embedding_small_bert_L2_128 sentiment \\\n", + "0 [-0.040878042578697205, 0.7422170639038086, -1... positive \n", + "1 [-0.8823249340057373, 0.2473045289516449, -0.2... positive \n", + "2 [-0.5860391855239868, 0.45967912673950195, -0.... positive \n", + "3 [-1.0504486560821533, 0.03315277025103569, -0.... positive \n", + "4 [-0.7228847742080688, 0.12011835724115372, -0.... positive \n", + "5 [-0.7876735329627991, -0.0005504372529685497, ... positive \n", + "6 [-0.7093901634216309, 0.15827353298664093, -0.... positive \n", + "7 [-0.38020092248916626, 0.469475656747818, -1.0... positive \n", + "8 [-0.9434630870819092, 0.15352500975131989, -0.... positive \n", + "9 [-0.5607839226722717, 0.01385028287768364, -0.... positive \n", + "10 [-0.5054810047149658, 0.3916030824184418, -0.1... positive \n", + "11 [-0.7918602228164673, 0.6628591418266296, -0.4... positive \n", + "12 [-0.6068148016929626, 0.4092712998390198, 0.18... positive \n", + "13 [-1.2009631395339966, 0.18674977123737335, -0.... positive \n", + "14 [-0.9833343029022217, 0.002539500128477812, -0... positive \n", + "15 [-0.903867781162262, 0.3173466622829437, -0.74... positive \n", + "16 [-0.7246012091636658, 0.4053008258342743, -0.2... positive \n", + "17 [-0.08034359663724899, 0.9084559082984924, -0.... positive \n", + "18 [-1.6253035068511963, 0.23702141642570496, -0.... positive \n", + "19 [-0.18891872465610504, 1.0232254266738892, -0.... positive \n", + "20 [-0.7862111330032349, 0.17004938423633575, -0.... positive \n", + "21 [0.09989737719297409, 0.21870799362659454, 0.2... positive \n", + "22 [-0.21414655447006226, 0.6170880794525146, -0.... positive \n", + "23 [-1.0250476598739624, 0.7916482090950012, -0.4... positive \n", + "24 [-0.967275083065033, 0.39687538146972656, -0.3... positive \n", + "25 [-0.8778604865074158, 0.4535127580165863, -0.8... positive \n", + "26 [-1.004093050956726, 0.5079272985458374, -0.48... positive \n", + "27 [-0.7925586700439453, 0.2502853572368622, -0.0... positive \n", + "28 [-1.155573844909668, 1.2174267768859863, -0.72... positive \n", + "29 [-1.0366969108581543, 0.9876224398612976, 0.21... positive \n", + "30 [-0.6213818788528442, 0.8505221009254456, -0.0... positive \n", + "31 [-0.8883647918701172, 0.09247803688049316, 0.0... positive \n", + "32 [-0.6616833209991455, 0.4456593692302704, -0.1... positive \n", + "33 [-0.7988455891609192, 0.3940075635910034, -0.2... positive \n", + "34 [-0.859315812587738, 0.18060781061649323, -0.3... positive \n", + "35 [-1.1440715789794922, 0.10256315022706985, -0.... positive \n", + "36 [-0.4633345901966095, 0.6127039790153503, -0.0... positive \n", + "37 [-0.8110732436180115, 0.9440520405769348, -0.2... positive \n", + "38 [-0.7378478050231934, 1.1133265495300293, -0.6... positive \n", + "39 [-0.4056348204612732, 0.8604288101196289, -0.2... positive \n", + "40 [-1.0248322486877441, 0.3955387771129608, -0.5... positive \n", + "41 [-0.7818620800971985, 0.35503625869750977, 0.1... positive \n", + "42 [-1.7940707206726074, 0.559665322303772, -0.49... positive \n", + "43 [-0.878898024559021, 0.7265058755874634, 0.008... positive \n", + "44 [0.0033321159426122904, 0.9780365228652954, -0... positive \n", + "45 [-0.6315991282463074, 0.5254122018814087, -0.3... positive \n", + "46 [-0.4117434322834015, 0.6890383362770081, 0.51... positive \n", + "47 [-0.5095536112785339, 0.48363006114959717, 0.0... positive \n", + "48 [-1.3492352962493896, 0.669184684753418, -0.38... positive \n", + "49 [-0.7200496792793274, 0.3299054205417633, -0.4... positive \n", + "\n", + " sentiment_confidence text \\\n", + "0 3.0 Over 45 tar sands projects that have already s... \n", + "1 2.0 I just got super excited because I found toile... \n", + "2 2.0 BE AFRAID, BE VERY AFRAID—INSLEE PROMOTES THE... \n", + "3 7.0 A lady fro @CheckersSA Brits tells me to hide ... \n", + "4 1.0 Just done an online shop and all the food esse... \n", + "5 7.0 @GavinNewsom so let me get this straight crow... \n", + "6 3.0 NY: 18- to 49-year-olds make up more than half... \n", + "7 4.0 Emerging market debt prices reflect worst case... \n", + "8 3.0 do you clean your #supermarket items due to t... \n", + "9 1.0 @flipkartsupport @rsprasad\\r\\r\\n@PMOIndia In h... \n", + "10 6.0 Several Guernsey women have set up a group of ... \n", + "11 2.0 I took Plaquenil for 4 years. Now it's the hot... \n", + "12 1.0 Can’t let this die. A little humor in these t... \n", + "13 1.0 I’ve been to the grocery store three times si... \n", + "14 8.0 That maybe there was a rioter out there who th... \n", + "15 2.0 First they release and spread the virus Strip ... \n", + "16 7.0 For about a year I have been toying with the i... \n", + "17 2.0 Creation Consumer Finance in Belfast are now p... \n", + "18 5.0 \"Your going to lose people to the flu but you'... \n", + "19 5.0 If you are a #RetailWorker and your store is s... \n", + "20 2.0 I love this social distancing..\\r\\r\\n\\r\\r\\nNo ... \n", + "21 1.0 #Facebook Ads Fails to Reject COVID-19 Misinfo... \n", + "22 1.0 Lease prices decline in March as as the corona... \n", + "23 4.0 Complete Shutdown of Karnataka W.E.F 24th Marc... \n", + "24 1.0 @MobilePunch Another deceitful palliative in m... \n", + "25 3.0 I am anyways under lockdown since 6th March be... \n", + "26 2.0 @KFCSA @yumbrands was at your store , the air ... \n", + "27 1.0 How to support and save local businesses durin... \n", + "28 4.0 This is the latest current information on supe... \n", + "29 2.0 If anyone witnesses any shops hiking their pri... \n", + "30 1.0 It's about time @eBay_UK stopped allowing peop... \n", + "31 2.0 sounds like a good idea - LA market offers spe... \n", + "32 1.0 No matter how they're ramping up efforts at #d... \n", + "33 2.0 I was wondering if a lovely supermarket would ... \n", + "34 1.0 Telangana people, Please dont go out unless it... \n", + "35 1.0 Idiots are panic purchasing food in bulk that ... \n", + "36 8.0 Following @BBVA_USA's initial offers last week... \n", + "37 6.0 Please appreciate your supermarket delivery dr... \n", + "38 1.0 When asked, “Why does ADI continue to operate... \n", + "39 8.0 The long-term fallout of the #coronavirus lock... \n", + "40 2.0 HELP US PACK THE PANTRIES I m live at 12 15 on... \n", + "41 2.0 Seeing what’s being left behind at grocery st... \n", + "42 2.0 Everyone don t forget condoms when you are hoa... \n", + "43 2.0 If you come across any shops charging inflated... \n", + "44 3.0 New @SA_Update #consumer insights affecting v... \n", + "45 2.0 How is COVID-19 affecting the pork and commodi... \n", + "46 1.0 Unbelievable https://t.co/fBrPYaxNH6 \n", + "47 3.0 How prepared are UK supermarkets to fulfill co... \n", + "48 4.0 Quakertown Distiller Providing Hand Sanitizer ... \n", + "49 4.0 Trump's disastrous dumbfuckery about #coronavi... \n", + "\n", + " y \n", + "0 positive \n", + "1 positive \n", + "2 positive \n", + "3 positive \n", + "4 negative \n", + "5 negative \n", + "6 negative \n", + "7 negative \n", + "8 positive \n", + "9 negative \n", + "10 negative \n", + "11 positive \n", + "12 negative \n", + "13 negative \n", + "14 positive \n", + "15 negative \n", + "16 positive \n", + "17 negative \n", + "18 negative \n", + "19 positive \n", + "20 positive \n", + "21 negative \n", + "22 positive \n", + "23 negative \n", + "24 negative \n", + "25 positive \n", + "26 negative \n", + "27 positive \n", + "28 positive \n", + "29 positive \n", + "30 negative \n", + "31 positive \n", + "32 positive \n", + "33 positive \n", + "34 positive \n", + "35 negative \n", + "36 negative \n", + "37 positive \n", + "38 positive \n", + "39 positive \n", + "40 positive \n", + "41 negative \n", + "42 positive \n", + "43 positive \n", + "44 positive \n", + "45 negative \n", + "46 positive \n", + "47 positive \n", + "48 positive \n", + "49 negative " + ], + "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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + "
documentsentence_embedding_small_bert_L2_128sentimentsentiment_confidencetexty
0Over 45 tar sands projects that have already s...[-0.040878042578697205, 0.7422170639038086, -1...positive3.0Over 45 tar sands projects that have already s...positive
1I just got super excited because I found toile...[-0.8823249340057373, 0.2473045289516449, -0.2...positive2.0I just got super excited because I found toile...positive
2BE AFRAID, BE VERY AFRAID—INSLEE PROMOTES THE...[-0.5860391855239868, 0.45967912673950195, -0....positive2.0BE AFRAID, BE VERY AFRAID—INSLEE PROMOTES THE...positive
3A lady fro @CheckersSA Brits tells me to hide ...[-1.0504486560821533, 0.03315277025103569, -0....positive7.0A lady fro @CheckersSA Brits tells me to hide ...positive
4Just done an online shop and all the food esse...[-0.7228847742080688, 0.12011835724115372, -0....positive1.0Just done an online shop and all the food esse...negative
5@GavinNewsom so let me get this straight crowd...[-0.7876735329627991, -0.0005504372529685497, ...positive7.0@GavinNewsom so let me get this straight crow...negative
6NY: 18- to 49-year-olds make up more than half...[-0.7093901634216309, 0.15827353298664093, -0....positive3.0NY: 18- to 49-year-olds make up more than half...negative
7Emerging market debt prices reflect worst case...[-0.38020092248916626, 0.469475656747818, -1.0...positive4.0Emerging market debt prices reflect worst case...negative
8do you clean your #supermarket items due to th...[-0.9434630870819092, 0.15352500975131989, -0....positive3.0do you clean your #supermarket items due to t...positive
9@flipkartsupport @rsprasad @PMOIndia In his cr...[-0.5607839226722717, 0.01385028287768364, -0....positive1.0@flipkartsupport @rsprasad\\r\\r\\n@PMOIndia In h...negative
10Several Guernsey women have set up a group of ...[-0.5054810047149658, 0.3916030824184418, -0.1...positive6.0Several Guernsey women have set up a group of ...negative
11I took Plaquenil for 4 years. Now it's the hot...[-0.7918602228164673, 0.6628591418266296, -0.4...positive2.0I took Plaquenil for 4 years. Now it's the hot...positive
12Can’t let this die. A little humor in these t...[-0.6068148016929626, 0.4092712998390198, 0.18...positive1.0Can’t let this die. A little humor in these t...negative
13I’ve been to the grocery store three times si...[-1.2009631395339966, 0.18674977123737335, -0....positive1.0I’ve been to the grocery store three times si...negative
14That maybe there was a rioter out there who th...[-0.9833343029022217, 0.002539500128477812, -0...positive8.0That maybe there was a rioter out there who th...positive
15First they release and spread the virus Strip ...[-0.903867781162262, 0.3173466622829437, -0.74...positive2.0First they release and spread the virus Strip ...negative
16For about a year I have been toying with the i...[-0.7246012091636658, 0.4053008258342743, -0.2...positive7.0For about a year I have been toying with the i...positive
17Creation Consumer Finance in Belfast are now p...[-0.08034359663724899, 0.9084559082984924, -0....positive2.0Creation Consumer Finance in Belfast are now p...negative
18\"Your going to lose people to the flu but you'...[-1.6253035068511963, 0.23702141642570496, -0....positive5.0\"Your going to lose people to the flu but you'...negative
19If you are a #RetailWorker and your store is s...[-0.18891872465610504, 1.0232254266738892, -0....positive5.0If you are a #RetailWorker and your store is s...positive
20I love this social distancing.. No one stand c...[-0.7862111330032349, 0.17004938423633575, -0....positive2.0I love this social distancing..\\r\\r\\n\\r\\r\\nNo ...positive
21#Facebook Ads Fails to Reject COVID-19 Misinfo...[0.09989737719297409, 0.21870799362659454, 0.2...positive1.0#Facebook Ads Fails to Reject COVID-19 Misinfo...negative
22Lease prices decline in March as as the corona...[-0.21414655447006226, 0.6170880794525146, -0....positive1.0Lease prices decline in March as as the corona...positive
23Complete Shutdown of Karnataka W.E.F 24th Marc...[-1.0250476598739624, 0.7916482090950012, -0.4...positive4.0Complete Shutdown of Karnataka W.E.F 24th Marc...negative
24@MobilePunch Another deceitful palliative in m...[-0.967275083065033, 0.39687538146972656, -0.3...positive1.0@MobilePunch Another deceitful palliative in m...negative
25I am anyways under lockdown since 6th March be...[-0.8778604865074158, 0.4535127580165863, -0.8...positive3.0I am anyways under lockdown since 6th March be...positive
26@KFCSA @yumbrands was at your store , the air ...[-1.004093050956726, 0.5079272985458374, -0.48...positive2.0@KFCSA @yumbrands was at your store , the air ...negative
27How to support and save local businesses durin...[-0.7925586700439453, 0.2502853572368622, -0.0...positive1.0How to support and save local businesses durin...positive
28This is the latest current information on supe...[-1.155573844909668, 1.2174267768859863, -0.72...positive4.0This is the latest current information on supe...positive
29If anyone witnesses any shops hiking their pri...[-1.0366969108581543, 0.9876224398612976, 0.21...positive2.0If anyone witnesses any shops hiking their pri...positive
30It's about time @eBay_UK stopped allowing peop...[-0.6213818788528442, 0.8505221009254456, -0.0...positive1.0It's about time @eBay_UK stopped allowing peop...negative
31sounds like a good idea - LA market offers spe...[-0.8883647918701172, 0.09247803688049316, 0.0...positive2.0sounds like a good idea - LA market offers spe...positive
32No matter how they're ramping up efforts at #d...[-0.6616833209991455, 0.4456593692302704, -0.1...positive1.0No matter how they're ramping up efforts at #d...positive
33I was wondering if a lovely supermarket would ...[-0.7988455891609192, 0.3940075635910034, -0.2...positive2.0I was wondering if a lovely supermarket would ...positive
34Telangana people, Please dont go out unless it...[-0.859315812587738, 0.18060781061649323, -0.3...positive1.0Telangana people, Please dont go out unless it...positive
35Idiots are panic purchasing food in bulk that ...[-1.1440715789794922, 0.10256315022706985, -0....positive1.0Idiots are panic purchasing food in bulk that ...negative
36Following @BBVA_USA's initial offers last week...[-0.4633345901966095, 0.6127039790153503, -0.0...positive8.0Following @BBVA_USA's initial offers last week...negative
37Please appreciate your supermarket delivery dr...[-0.8110732436180115, 0.9440520405769348, -0.2...positive6.0Please appreciate your supermarket delivery dr...positive
38When asked, “Why does ADI continue to operate...[-0.7378478050231934, 1.1133265495300293, -0.6...positive1.0When asked, “Why does ADI continue to operate...positive
39The long-term fallout of the #coronavirus lock...[-0.4056348204612732, 0.8604288101196289, -0.2...positive8.0The long-term fallout of the #coronavirus lock...positive
40HELP US PACK THE PANTRIES I m live at 12 15 on...[-1.0248322486877441, 0.3955387771129608, -0.5...positive2.0HELP US PACK THE PANTRIES I m live at 12 15 on...positive
41Seeing what’s being left behind at grocery st...[-0.7818620800971985, 0.35503625869750977, 0.1...positive2.0Seeing what’s being left behind at grocery st...negative
42Everyone don t forget condoms when you are hoa...[-1.7940707206726074, 0.559665322303772, -0.49...positive2.0Everyone don t forget condoms when you are hoa...positive
43If you come across any shops charging inflated...[-0.878898024559021, 0.7265058755874634, 0.008...positive2.0If you come across any shops charging inflated...positive
44New @SA_Update #consumer insights affecting ve...[0.0033321159426122904, 0.9780365228652954, -0...positive3.0New @SA_Update #consumer insights affecting v...positive
45How is COVID-19 affecting the pork and commodi...[-0.6315991282463074, 0.5254122018814087, -0.3...positive2.0How is COVID-19 affecting the pork and commodi...negative
46Unbelievable https://t.co/fBrPYaxNH6[-0.4117434322834015, 0.6890383362770081, 0.51...positive1.0Unbelievable https://t.co/fBrPYaxNH6positive
47How prepared are UK supermarkets to fulfill co...[-0.5095536112785339, 0.48363006114959717, 0.0...positive3.0How prepared are UK supermarkets to fulfill co...positive
48Quakertown Distiller Providing Hand Sanitizer ...[-1.3492352962493896, 0.669184684753418, -0.38...positive4.0Quakertown Distiller Providing Hand Sanitizer ...positive
49Trump's disastrous dumbfuckery about #coronavi...[-0.7200496792793274, 0.3299054205417633, -0.4...positive4.0Trump's disastrous dumbfuckery about #coronavi...negative
\n", + "
\n", + "
\n", + "\n", + "
\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "
\n", + "\n", + "\n", + "
\n", + " \n", + "\n", + "\n", + "\n", + " \n", + "
\n", + "
\n", + "
\n" + ] + }, + "metadata": {}, + "execution_count": 37 + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "qFoT-s1MjTSS" + }, + "source": [ + "# 7. Try training with different Embeddings" + ] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "nxWFzQOhjWC8", + "outputId": "d5465274-e8a1-4443-f2b4-950f2387cfbc" + }, + "source": [ + "# We can use nlu.print_components(action='embed_sentence') to see every possibler sentence embedding we could use. Lets use bert!\n", + "nlp.nlu.print_components(action='embed_sentence')" + ], + "execution_count": 39, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "For language NLU provides the following Models : \n", + "nlu.load('am.embed_sentence.xlm_roberta') returns Spark NLP model_anno_obj sent_xlm_roberta_base_finetuned_amharic\n", + "For language NLU provides the following Models : \n", + "nlu.load('de.embed_sentence.bert.base_cased') returns Spark NLP model_anno_obj sent_bert_base_cased\n", + "For language NLU provides the following Models : \n", + "nlu.load('el.embed_sentence.bert.base_uncased') returns Spark NLP model_anno_obj sent_bert_base_uncased\n", + "For language NLU provides the following Models : \n", + "nlu.load('en.embed_sentence') returns Spark NLP model_anno_obj tfhub_use\n", + "nlu.load('en.embed_sentence.albert') returns Spark NLP model_anno_obj albert_base_uncased\n", + "nlu.load('en.embed_sentence.bert') returns Spark NLP model_anno_obj sent_bert_base_uncased\n", + "nlu.load('en.embed_sentence.bert.base_uncased_legal') returns Spark NLP model_anno_obj sent_bert_base_uncased_legal\n", + "nlu.load('en.embed_sentence.bert.finetuned') returns Spark NLP model_anno_obj sbert_setfit_finetuned_financial_text_classification\n", + "nlu.load('en.embed_sentence.bert.pubmed') returns Spark NLP model_anno_obj sent_bert_pubmed\n", + "nlu.load('en.embed_sentence.bert.pubmed_squad2') returns Spark NLP model_anno_obj sent_bert_pubmed_squad2\n", + "nlu.load('en.embed_sentence.bert.wiki_books') returns Spark NLP model_anno_obj sent_bert_wiki_books\n", + "nlu.load('en.embed_sentence.bert.wiki_books_mnli') returns Spark NLP model_anno_obj sent_bert_wiki_books_mnli\n", + "nlu.load('en.embed_sentence.bert.wiki_books_qnli') returns Spark NLP model_anno_obj sent_bert_wiki_books_qnli\n", + "nlu.load('en.embed_sentence.bert.wiki_books_qqp') returns Spark NLP model_anno_obj sent_bert_wiki_books_qqp\n", + "nlu.load('en.embed_sentence.bert.wiki_books_squad2') returns Spark NLP model_anno_obj sent_bert_wiki_books_squad2\n", + "nlu.load('en.embed_sentence.bert.wiki_books_sst2') returns Spark NLP model_anno_obj sent_bert_wiki_books_sst2\n", + "nlu.load('en.embed_sentence.bert_base_cased') returns Spark NLP model_anno_obj sent_bert_base_cased\n", + "nlu.load('en.embed_sentence.bert_base_uncased') returns Spark NLP model_anno_obj sent_bert_base_uncased\n", + "nlu.load('en.embed_sentence.bert_large_cased') returns Spark NLP model_anno_obj sent_bert_large_cased\n", + "nlu.load('en.embed_sentence.bert_large_uncased') returns Spark NLP model_anno_obj sent_bert_large_uncased\n", + "nlu.load('en.embed_sentence.bert_use_cmlm_en_base') returns Spark NLP model_anno_obj sent_bert_use_cmlm_en_base\n", + "nlu.load('en.embed_sentence.bert_use_cmlm_en_large') returns Spark NLP model_anno_obj sent_bert_use_cmlm_en_large\n", + "nlu.load('en.embed_sentence.biobert.clinical_base_cased') returns Spark NLP model_anno_obj sent_biobert_clinical_base_cased\n", + "nlu.load('en.embed_sentence.biobert.discharge_base_cased') returns Spark NLP model_anno_obj sent_biobert_discharge_base_cased\n", + "nlu.load('en.embed_sentence.biobert.pmc_base_cased') returns Spark NLP model_anno_obj sent_biobert_pmc_base_cased\n", + "nlu.load('en.embed_sentence.biobert.pubmed_base_cased') returns Spark NLP model_anno_obj sent_biobert_pubmed_base_cased\n", + "nlu.load('en.embed_sentence.biobert.pubmed_large_cased') returns Spark NLP model_anno_obj sent_biobert_pubmed_large_cased\n", + "nlu.load('en.embed_sentence.biobert.pubmed_pmc_base_cased') returns Spark NLP model_anno_obj sent_biobert_pubmed_pmc_base_cased\n", + "nlu.load('en.embed_sentence.covidbert.large_uncased') returns Spark NLP model_anno_obj sent_covidbert_large_uncased\n", + "nlu.load('en.embed_sentence.distil_roberta.distilled_base') returns Spark NLP model_anno_obj sent_distilroberta_base\n", + "nlu.load('en.embed_sentence.doc2vec') returns Spark NLP model_anno_obj doc2vec_gigaword_300\n", + "nlu.load('en.embed_sentence.doc2vec.gigaword_300') returns Spark NLP model_anno_obj doc2vec_gigaword_300\n", + "nlu.load('en.embed_sentence.doc2vec.gigaword_wiki_300') returns Spark NLP model_anno_obj doc2vec_gigaword_wiki_300\n", + "nlu.load('en.embed_sentence.electra') returns Spark NLP model_anno_obj sent_electra_small_uncased\n", + "nlu.load('en.embed_sentence.electra_base_uncased') returns Spark NLP model_anno_obj sent_electra_base_uncased\n", + "nlu.load('en.embed_sentence.electra_large_uncased') returns Spark NLP model_anno_obj sent_electra_large_uncased\n", + "nlu.load('en.embed_sentence.electra_small_uncased') returns Spark NLP model_anno_obj sent_electra_small_uncased\n", + "nlu.load('en.embed_sentence.roberta.base') returns Spark NLP model_anno_obj sent_roberta_base\n", + "nlu.load('en.embed_sentence.roberta.large') returns Spark NLP model_anno_obj sent_roberta_large\n", + "nlu.load('en.embed_sentence.small_bert_L10_128') returns Spark NLP model_anno_obj sent_small_bert_L10_128\n", + "nlu.load('en.embed_sentence.small_bert_L10_256') returns Spark NLP model_anno_obj sent_small_bert_L10_256\n", + "nlu.load('en.embed_sentence.small_bert_L10_512') returns Spark NLP model_anno_obj sent_small_bert_L10_512\n", + "nlu.load('en.embed_sentence.small_bert_L10_768') returns Spark NLP model_anno_obj sent_small_bert_L10_768\n", + "nlu.load('en.embed_sentence.small_bert_L12_128') returns Spark NLP model_anno_obj sent_small_bert_L12_128\n", + "nlu.load('en.embed_sentence.small_bert_L12_256') returns Spark NLP model_anno_obj sent_small_bert_L12_256\n", + "nlu.load('en.embed_sentence.small_bert_L12_512') returns Spark NLP model_anno_obj sent_small_bert_L12_512\n", + "nlu.load('en.embed_sentence.small_bert_L12_768') returns Spark NLP model_anno_obj sent_small_bert_L12_768\n", + "nlu.load('en.embed_sentence.small_bert_L2_128') returns Spark NLP model_anno_obj sent_small_bert_L2_128\n", + "nlu.load('en.embed_sentence.small_bert_L2_256') returns Spark NLP model_anno_obj sent_small_bert_L2_256\n", + "nlu.load('en.embed_sentence.small_bert_L2_512') returns Spark NLP model_anno_obj sent_small_bert_L2_512\n", + "nlu.load('en.embed_sentence.small_bert_L2_768') returns Spark NLP model_anno_obj sent_small_bert_L2_768\n", + "nlu.load('en.embed_sentence.small_bert_L4_128') returns Spark NLP model_anno_obj sent_small_bert_L4_128\n", + "nlu.load('en.embed_sentence.small_bert_L4_256') returns Spark NLP model_anno_obj sent_small_bert_L4_256\n", + "nlu.load('en.embed_sentence.small_bert_L4_512') returns Spark NLP model_anno_obj sent_small_bert_L4_512\n", + "nlu.load('en.embed_sentence.small_bert_L4_768') returns Spark NLP model_anno_obj sent_small_bert_L4_768\n", + "nlu.load('en.embed_sentence.small_bert_L6_128') returns Spark NLP model_anno_obj sent_small_bert_L6_128\n", + "nlu.load('en.embed_sentence.small_bert_L6_256') returns Spark NLP model_anno_obj sent_small_bert_L6_256\n", + "nlu.load('en.embed_sentence.small_bert_L6_512') returns Spark NLP model_anno_obj sent_small_bert_L6_512\n", + "nlu.load('en.embed_sentence.small_bert_L6_768') returns Spark NLP model_anno_obj sent_small_bert_L6_768\n", + "nlu.load('en.embed_sentence.small_bert_L8_128') returns Spark NLP model_anno_obj sent_small_bert_L8_128\n", + "nlu.load('en.embed_sentence.small_bert_L8_256') returns Spark NLP model_anno_obj sent_small_bert_L8_256\n", + "nlu.load('en.embed_sentence.small_bert_L8_512') returns Spark NLP model_anno_obj sent_small_bert_L8_512\n", + "nlu.load('en.embed_sentence.small_bert_L8_768') returns Spark NLP model_anno_obj sent_small_bert_L8_768\n", + "nlu.load('en.embed_sentence.tfhub_use') returns Spark NLP model_anno_obj tfhub_use\n", + "nlu.load('en.embed_sentence.tfhub_use.lg') returns Spark NLP model_anno_obj tfhub_use_lg\n", + "nlu.load('en.embed_sentence.use') returns Spark NLP model_anno_obj tfhub_use\n", + "nlu.load('en.embed_sentence.use.lg') returns Spark NLP model_anno_obj tfhub_use_lg\n", + "For language NLU provides the following Models : \n", + "nlu.load('es.embed_sentence.bert.base_cased') returns Spark NLP model_anno_obj sent_bert_base_cased\n", + "nlu.load('es.embed_sentence.bert.base_uncased') returns Spark NLP model_anno_obj sent_bert_base_uncased\n", + "For language NLU provides the following Models : \n", + "nlu.load('fi.embed_sentence.bert') returns Spark NLP model_anno_obj bert_base_finnish_uncased\n", + "nlu.load('fi.embed_sentence.bert.cased') returns Spark NLP model_anno_obj bert_base_finnish_cased\n", + "nlu.load('fi.embed_sentence.bert.uncased') returns Spark NLP model_anno_obj bert_base_finnish_uncased\n", + "For language NLU provides the following Models : \n", + "nlu.load('ha.embed_sentence.xlm_roberta') returns Spark NLP model_anno_obj sent_xlm_roberta_base_finetuned_hausa\n", + "For language NLU provides the following Models : \n", + "nlu.load('ig.embed_sentence.xlm_roberta') returns Spark NLP model_anno_obj sent_xlm_roberta_base_finetuned_igbo\n", + "For language NLU provides the following Models : \n", + "nlu.load('lg.embed_sentence.xlm_roberta') returns Spark NLP model_anno_obj sent_xlm_roberta_base_finetuned_luganda\n", + "For language NLU provides the following Models : \n", + "nlu.load('nl.embed_sentence.bert.base_cased') returns Spark NLP model_anno_obj sent_bert_base_cased\n", + "For language NLU provides the following Models : \n", + "nlu.load('pcm.embed_sentence.xlm_roberta') returns Spark NLP model_anno_obj sent_xlm_roberta_base_finetuned_naija\n", + "For language NLU provides the following Models : \n", + "nlu.load('pt.embed_sentence.bert.base_legal') returns Spark NLP model_anno_obj sbert_legal_bertimbau_base_tsdae_sts\n", + "nlu.load('pt.embed_sentence.bert.cased_large_legal') returns Spark NLP model_anno_obj sbert_bert_large_portuguese_cased_legal_mlm_sts_v0.1\n", + "nlu.load('pt.embed_sentence.bert.large_legal') returns Spark NLP model_anno_obj sbert_legal_bertimbau_large_gpl_sts\n", + "nlu.load('pt.embed_sentence.bert.legal.cased_large_mlm_sts_v0.10.by_stjiris') returns Spark NLP model_anno_obj sbert_bert_large_portuguese_cased_legal_mlm_sts_v0.10\n", + "nlu.load('pt.embed_sentence.bert.legal.cased_large_mlm_sts_v0.2.by_stjiris') returns Spark NLP model_anno_obj sbert_bert_large_portuguese_cased_legal_mlm_sts_v0.2\n", + "nlu.load('pt.embed_sentence.bert.legal.cased_large_mlm_sts_v0.3.by_stjiris') returns Spark NLP model_anno_obj sbert_bert_large_portuguese_cased_legal_mlm_sts_v0.3\n", + "nlu.load('pt.embed_sentence.bert.legal.cased_large_mlm_sts_v0.4.by_stjiris') returns Spark NLP model_anno_obj sbert_bert_large_portuguese_cased_legal_mlm_sts_v0.4\n", + "nlu.load('pt.embed_sentence.bert.legal.cased_large_mlm_sts_v0.5.by_stjiris') returns Spark NLP model_anno_obj sbert_bert_large_portuguese_cased_legal_mlm_sts_v0.5\n", + "nlu.load('pt.embed_sentence.bert.legal.cased_large_mlm_sts_v0.7.by_stjiris') returns Spark NLP model_anno_obj sbert_bert_large_portuguese_cased_legal_mlm_sts_v0.7\n", + "nlu.load('pt.embed_sentence.bert.legal.cased_large_mlm_sts_v0.8.by_stjiris') returns Spark NLP model_anno_obj sbert_bert_large_portuguese_cased_legal_mlm_sts_v0.8\n", + "nlu.load('pt.embed_sentence.bert.legal.cased_large_mlm_sts_v0.9.by_stjiris') returns Spark NLP model_anno_obj sbert_bert_large_portuguese_cased_legal_mlm_sts_v0.9\n", + "nlu.load('pt.embed_sentence.bert.legal.cased_large_mlm_sts_v1.0.by_stjiris') returns Spark NLP model_anno_obj sbert_bert_large_portuguese_cased_legal_mlm_sts_v1.0\n", + "nlu.load('pt.embed_sentence.bert.legal.cased_large_mlm_v0.11_gpl_nli_sts_v0.by_stjiris') returns Spark NLP model_anno_obj sbert_bert_large_portuguese_cased_legal_mlm_v0.11_gpl_nli_sts_v0\n", + "nlu.load('pt.embed_sentence.bert.legal.cased_large_mlm_v0.11_gpl_nli_sts_v1.by_stjiris') returns Spark NLP model_anno_obj sbert_bert_large_portuguese_cased_legal_mlm_v0.11_gpl_nli_sts_v1\n", + "nlu.load('pt.embed_sentence.bert.legal.cased_large_mlm_v0.11_nli_sts_v0.by_stjiris') returns Spark NLP model_anno_obj sbert_bert_large_portuguese_cased_legal_mlm_v0.11_nli_sts_v0\n", + "nlu.load('pt.embed_sentence.bert.legal.cased_large_mlm_v0.11_nli_sts_v1.by_stjiris') returns Spark NLP model_anno_obj sbert_bert_large_portuguese_cased_legal_mlm_v0.11_nli_sts_v1\n", + "nlu.load('pt.embed_sentence.bert.legal.cased_large_mlm_v0.11_sts_v0.by_stjiris') returns Spark NLP model_anno_obj sbert_bert_large_portuguese_cased_legal_mlm_v0.11_sts_v0\n", + "nlu.load('pt.embed_sentence.bert.legal.cased_large_mlm_v0.11_sts_v1.by_stjiris') returns Spark NLP model_anno_obj sbert_bert_large_portuguese_cased_legal_mlm_v0.11_sts_v1\n", + "nlu.load('pt.embed_sentence.bert.v2_base_legal') returns Spark NLP model_anno_obj sbert_legal_bertimbau_sts_base_ma_v2\n", + "nlu.load('pt.embed_sentence.bert.v2_large_legal') returns Spark NLP model_anno_obj sbert_legal_bertimbau_large_tsdae_sts_v2\n", + "nlu.load('pt.embed_sentence.bertimbau.legal.assin.base.by_rufimelo') returns Spark NLP model_anno_obj sbert_legal_bertimbau_sts_base_ma\n", + "nlu.load('pt.embed_sentence.bertimbau.legal.assin2.base.by_rufimelo') returns Spark NLP model_anno_obj sbert_legal_bertimbau_sts_base\n", + "nlu.load('pt.embed_sentence.bertimbau.legal.large_sts_by_rufimelo') returns Spark NLP model_anno_obj sbert_legal_bertimbau_sts_large\n", + "nlu.load('pt.embed_sentence.bertimbau.legal.large_sts_ma.by_rufimelo') returns Spark NLP model_anno_obj sbert_legal_bertimbau_sts_large_ma\n", + "nlu.load('pt.embed_sentence.bertimbau.legal.large_sts_ma_v3.by_rufimelo') returns Spark NLP model_anno_obj sbert_legal_bertimbau_sts_large_ma_v3\n", + "nlu.load('pt.embed_sentence.bertimbau.legal.large_tsdae_sts.by_rufimelo') returns Spark NLP model_anno_obj sbert_legal_bertimbau_large_tsdae_sts\n", + "nlu.load('pt.embed_sentence.bertimbau.legal.large_tsdae_sts_v4.by_rufimelo') returns Spark NLP model_anno_obj sbert_legal_bertimbau_large_tsdae_sts_v4\n", + "nlu.load('pt.embed_sentence.bertimbau.legal.large_tsdae_v4_gpl_sts.by_rufimelo') returns Spark NLP model_anno_obj sbert_legal_bertimbau_large_tsdae_v4_gpl_sts\n", + "nlu.load('pt.embed_sentence.bertimbau.legal.v2_large_sts_v2.by_rufimelo') returns Spark NLP model_anno_obj sbert_legal_bertimbau_sts_large_v2\n", + "nlu.load('pt.embed_sentence.bertimbau.legal.v2_large_v2_sts.by_rufimelo') returns Spark NLP model_anno_obj sbert_legal_bertimbau_large_v2_sts\n", + "For language NLU provides the following Models : \n", + "nlu.load('rw.embed_sentence.xlm_roberta') returns Spark NLP model_anno_obj sent_xlm_roberta_base_finetuned_kinyarwanda\n", + "For language NLU provides the following Models : \n", + "nlu.load('sv.embed_sentence.bert.base_cased') returns Spark NLP model_anno_obj sent_bert_base_cased\n", + "For language NLU provides the following Models : \n", + "nlu.load('sw.embed_sentence.xlm_roberta') returns Spark NLP model_anno_obj sent_xlm_roberta_base_finetuned_swahili\n", + "For language NLU provides the following Models : \n", + "nlu.load('wo.embed_sentence.xlm_roberta') returns Spark NLP model_anno_obj sent_xlm_roberta_base_finetuned_wolof\n", + "For language NLU provides the following Models : \n", + "nlu.load('xx.embed_sentence') returns Spark NLP model_anno_obj sent_bert_multi_cased\n", + "nlu.load('xx.embed_sentence.bert') returns Spark NLP model_anno_obj sent_bert_multi_cased\n", + "nlu.load('xx.embed_sentence.bert.cased') returns Spark NLP model_anno_obj sent_bert_multi_cased\n", + "nlu.load('xx.embed_sentence.bert.muril') returns Spark NLP model_anno_obj sent_bert_muril\n", + "nlu.load('xx.embed_sentence.bert_use_cmlm_multi_base') returns Spark NLP model_anno_obj sent_bert_use_cmlm_multi_base\n", + "nlu.load('xx.embed_sentence.bert_use_cmlm_multi_base_br') returns Spark NLP model_anno_obj sent_bert_use_cmlm_multi_base_br\n", + "nlu.load('xx.embed_sentence.labse') returns Spark NLP model_anno_obj labse\n", + "nlu.load('xx.embed_sentence.xlm_roberta.base') returns Spark NLP model_anno_obj sent_xlm_roberta_base\n", + "For language NLU provides the following Models : \n", + "nlu.load('yo.embed_sentence.xlm_roberta') returns Spark NLP model_anno_obj sent_xlm_roberta_base_finetuned_yoruba\n", + "For language NLU provides the following Models : \n", + "nlu.load('zh.embed_sentence.bert') returns Spark NLP model_anno_obj sbert_chinese_qmc_finance_v1\n", + "nlu.load('zh.embed_sentence.bert.distilled') returns Spark NLP model_anno_obj sbert_chinese_qmc_finance_v1_distill\n" + ] + } + ] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "IKK_Ii_gjJfF", + "outputId": "45dea83e-2a0c-4d09-a723-f877ea7527dd" + }, + "source": [ + "trainable_pipe = nlp.load('en.embed_sentence.small_bert_L12_768 train.sentiment')\n", + "# We need to train longer and user smaller LR for NON-USE based sentence embeddings usually\n", + "# We could tune the hyperparameters further with hyperparameter tuning methods like gridsearch\n", + "# Also longer training gives more accuracy\n", + "trainable_pipe['trainable_sentiment_dl'].setMaxEpochs(120)\n", + "trainable_pipe['trainable_sentiment_dl'].setLr(0.0005)\n", + "fitted_pipe = trainable_pipe.fit(train_df[:500])\n", + "# predict with the trainable pipeline on dataset and get predictions\n", + "preds = fitted_pipe.predict(train_df[:500],output_level='document')\n", + "\n", + "#sentence detector that is part of the pipe generates some NaNs. lets drop them first\n", + "preds.dropna(inplace=True)\n", + "print(classification_report(preds['y'], preds['sentiment']))\n", + "\n", + "#preds" + ], + "execution_count": 4, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Warning::Spark Session already created, some configs may not take.\n", + "Warning::Spark Session already created, some configs may not take.\n", + "sent_small_bert_L12_768 download started this may take some time.\n", + "Approximate size to download 392.9 MB\n", + "[OK!]\n", + " precision recall f1-score support\n", + "\n", + " negative 0.84 0.56 0.67 229\n", + " neutral 0.00 0.00 0.00 0\n", + " positive 0.86 0.71 0.78 271\n", + "\n", + " accuracy 0.64 500\n", + " macro avg 0.57 0.42 0.48 500\n", + "weighted avg 0.85 0.64 0.73 500\n", + "\n" + ] + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "_1jxw3GnVGlI" + }, + "source": [ + "# 7.1 evaluate on Test Data" + ] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "Fxx4yNkNVGFl", + "outputId": "0f64b81d-884b-46b8-d571-6e32cc0e1a64" + }, + "source": [ + "preds = fitted_pipe.predict(test_df[:100],output_level='document')\n", + "\n", + "#sentence detector that is part of the pipe generates sone NaNs. lets drop them first\n", + "preds.dropna(inplace=True)\n", + "print(classification_report(preds['y'], preds['sentiment']))" + ], + "execution_count": 5, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + " precision recall f1-score support\n", + "\n", + " negative 0.68 0.35 0.47 48\n", + " neutral 0.00 0.00 0.00 0\n", + " positive 0.77 0.63 0.69 52\n", + "\n", + " accuracy 0.50 100\n", + " macro avg 0.48 0.33 0.39 100\n", + "weighted avg 0.73 0.50 0.58 100\n", + "\n" + ] + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "2BB-NwZUoHSe" + }, + "source": [ + "# 8. Lets save the model" + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "eLex095goHwm" + }, + "source": [ + "stored_model_path = './models/classifier_dl_trained'\n", + "fitted_pipe.save(stored_model_path)" + ], + "execution_count": 6, + "outputs": [] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "e_b2DPd4rCiU" + }, + "source": [ + "# 9. Lets load the model from HDD.\n", + "This makes Offlien NLU usage possible! \n", + "You need to call nlu.load(path=path_to_the_pipe) to load a model/pipeline from disk." + ] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 133 + }, + "id": "SO4uz45MoRgp", + "outputId": "12ba7df2-7ee4-432a-c5bd-52014e1b26ea" + }, + "source": [ + "hdd_pipe = nlp.load(path=stored_model_path)\n", + "\n", + "preds = hdd_pipe.predict('Everything is under control !')\n", + "preds" + ], + "execution_count": 7, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Warning::Spark Session already created, some configs may not take.\n", + "Warning::Spark Session already created, some configs may not take.\n", + "Warning::Spark Session already created, some configs may not take.\n" + ] + }, + { + "output_type": "execute_result", + "data": { + "text/plain": [ + " document \\\n", + "0 Everything is under control ! \n", + "\n", + " sentence_embedding_from_disk sentiment \\\n", + "0 [0.37780365347862244, 0.29955413937568665, 0.1... negative \n", + "\n", + " sentiment_confidence \n", + "0 0.0 " + ], + "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", + "
documentsentence_embedding_from_disksentimentsentiment_confidence
0Everything is under control ![0.37780365347862244, 0.29955413937568665, 0.1...negative0.0
\n", + "
\n", + "
\n", + "\n", + "
\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "
\n", + "\n", + "
\n", + "
\n" + ] + }, + "metadata": {}, + "execution_count": 7 + } + ] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "e0CVlkk9v6Qi", + "outputId": "3faff34f-7934-4ea7-f0ee-dc6fcf274b15" + }, + "source": [ + "hdd_pipe.print_info()" + ], + "execution_count": 8, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "The following parameters are configurable for this NLU pipeline (You can copy paste the examples) :\n", + ">>> component_list['document_assembler'] has settable params:\n", + "component_list['document_assembler'].setCleanupMode('shrink') | Info: possible values: disabled, inplace, inplace_full, shrink, shrink_full, each, each_full, delete_full | Currently set to : shrink\n", + ">>> component_list['bert_sentence_embeddings@sent_small_bert_L12_768'] has settable params:\n", + "component_list['bert_sentence_embeddings@sent_small_bert_L12_768'].setBatchSize(8) | Info: Size of every batch | Currently set to : 8\n", + "component_list['bert_sentence_embeddings@sent_small_bert_L12_768'].setCaseSensitive(False) | Info: whether to ignore case in tokens for embeddings matching | Currently set to : False\n", + "component_list['bert_sentence_embeddings@sent_small_bert_L12_768'].setDimension(768) | Info: Number of embedding dimensions | Currently set to : 768\n", + "component_list['bert_sentence_embeddings@sent_small_bert_L12_768'].setMaxSentenceLength(128) | Info: Max sentence length to process | Currently set to : 128\n", + "component_list['bert_sentence_embeddings@sent_small_bert_L12_768'].setEngine('tensorflow') | Info: Deep Learning engine used for this model | Currently set to : tensorflow\n", + "component_list['bert_sentence_embeddings@sent_small_bert_L12_768'].setIsLong(False) | Info: Use Long type instead of Int type for inputs buffer - Some Bert models require Long instead of Int. | Currently set to : False\n", + "component_list['bert_sentence_embeddings@sent_small_bert_L12_768'].setStorageRef('sent_small_bert_L12_768') | Info: unique reference name for identification | Currently set to : sent_small_bert_L12_768\n", + ">>> component_list['sentiment_dl@sent_small_bert_L12_768'] has settable params:\n", + "component_list['sentiment_dl@sent_small_bert_L12_768'].setThreshold(0.6) | Info: The minimum threshold for the final result otheriwse it will be neutral | Currently set to : 0.6\n", + "component_list['sentiment_dl@sent_small_bert_L12_768'].setThresholdLabel('neutral') | Info: In case the score is less than threshold, what should be the label. Default is neutral. | Currently set to : neutral\n", + "component_list['sentiment_dl@sent_small_bert_L12_768'].setEngine('tensorflow') | Info: Deep Learning engine used for this model | Currently set to : tensorflow\n", + "component_list['sentiment_dl@sent_small_bert_L12_768'].setClasses(['positive', 'negative']) | Info: get the tags used to trained this SentimentDLModel | Currently set to : ['positive', 'negative']\n", + "component_list['sentiment_dl@sent_small_bert_L12_768'].setStorageRef('sent_small_bert_L12_768') | Info: unique reference name for identification | Currently set to : sent_small_bert_L12_768\n" + ] + } + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "-S888rwObpEs" + }, + "source": [], + "execution_count": null, + "outputs": [] + } + ] +} \ No newline at end of file diff --git a/examples/colab/Training/binary_text_classification/NLU_training_sentiment_classifier_demo_finanical_news.ipynb b/examples/colab/Training/binary_text_classification/NLU_training_sentiment_classifier_demo_finanical_news.ipynb index ba58febd..28ac9124 100644 --- a/examples/colab/Training/binary_text_classification/NLU_training_sentiment_classifier_demo_finanical_news.ipynb +++ b/examples/colab/Training/binary_text_classification/NLU_training_sentiment_classifier_demo_finanical_news.ipynb @@ -1 +1,2600 @@ -{"nbformat":4,"nbformat_minor":0,"metadata":{"colab":{"name":"NLU_training_sentiment_classifier_demo_finanical_news.ipynb","provenance":[],"collapsed_sections":[],"toc_visible":true},"kernelspec":{"name":"python3","display_name":"Python 3"}},"cells":[{"cell_type":"markdown","metadata":{"id":"zkufh760uvF3"},"source":["![JohnSnowLabs](https://nlp.johnsnowlabs.com/assets/images/logo.png)\n","\n","[![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/JohnSnowLabs/nlu/blob/master/examples/colab/Training/binary_text_classification/NLU_training_sentiment_classifier_demo_finanical_news.ipynb)\n","\n","\n","\n","# Training a Sentiment Analysis Classifier with NLU \n","## 2 class Finance News sentiment classifier training\n","With the [SentimentDL model](https://nlp.johnsnowlabs.com/docs/en/annotators#sentimentdl-multi-class-sentiment-analysis-annotator) from Spark NLP you can achieve State Of the Art results on any multi class text classification problem \n","\n","This notebook showcases the following features : \n","\n","- How to train the deep learning classifier\n","- How to store a pipeline to disk\n","- How to load the pipeline from disk (Enables NLU offline mode)\n","\n","You can achieve these results or even better on this dataset with training data:\n","\n","
\n","\n","![image.png](data:image/png;base64,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)\n","\n","\n","\n","\n","You can achieve these results or even better on this dataset with test data:\n","\n","\n","
\n","\n","\n","![image.png](data:image/png;base64,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)"]},{"cell_type":"markdown","metadata":{"id":"dur2drhW5Rvi"},"source":["# 1. Install Java 8 and NLU"]},{"cell_type":"code","metadata":{"id":"hFGnBCHavltY","colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"status":"ok","timestamp":1620191453470,"user_tz":-120,"elapsed":108117,"user":{"displayName":"Christian Kasim Loan","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GjqAD-ircKP-s5Eh6JSdkDggDczfqQbJGU_IRb4Hw=s64","userId":"14469489166467359317"}},"outputId":"128e625c-21cf-4c76-969d-d58ba57f0b9f"},"source":["!wget https://setup.johnsnowlabs.com/nlu/colab.sh -O - | bash\n","import nlu"],"execution_count":null,"outputs":[{"output_type":"stream","text":["--2021-05-05 05:09:06-- https://raw.githubusercontent.com/JohnSnowLabs/nlu/master/scripts/colab_setup.sh\n","Resolving raw.githubusercontent.com (raw.githubusercontent.com)... 185.199.108.133, 185.199.109.133, 185.199.110.133, ...\n","Connecting to raw.githubusercontent.com (raw.githubusercontent.com)|185.199.108.133|:443... connected.\n","HTTP request sent, awaiting response... 200 OK\n","Length: 1671 (1.6K) [text/plain]\n","Saving to: ‘STDOUT’\n","\n","- 0%[ ] 0 --.-KB/s Installing NLU 3.0.0 with PySpark 3.0.2 and Spark NLP 3.0.1 for Google Colab ...\n","- 100%[===================>] 1.63K --.-KB/s in 0.001s \n","\n","2021-05-05 05:09:06 (1.82 MB/s) - written to stdout [1671/1671]\n","\n","\u001b[K |████████████████████████████████| 204.8MB 64kB/s \n","\u001b[K |████████████████████████████████| 153kB 46.5MB/s \n","\u001b[K |████████████████████████████████| 204kB 21.5MB/s \n","\u001b[K |████████████████████████████████| 204kB 50.1MB/s \n","\u001b[?25h Building wheel for pyspark (setup.py) ... \u001b[?25l\u001b[?25hdone\n"],"name":"stdout"}]},{"cell_type":"markdown","metadata":{"id":"f4KkTfnR5Ugg"},"source":["# 2. Download Finanical News Sentiment dataset \n","https://www.kaggle.com/ankurzing/sentiment-analysis-for-financial-news\n","\n","This dataset contains the sentiments for financial news headlines from the perspective of a retail investor. Further details about the dataset can be found in: Malo, P., Sinha, A., Takala, P., Korhonen, P. and Wallenius, J. (2014): “Good debt or bad debt: Detecting semantic orientations in economic texts.” Journal of the American Society for Information Science and Technology."]},{"cell_type":"code","metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"OrVb5ZMvvrQD","executionInfo":{"status":"ok","timestamp":1620191454511,"user_tz":-120,"elapsed":109150,"user":{"displayName":"Christian Kasim Loan","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GjqAD-ircKP-s5Eh6JSdkDggDczfqQbJGU_IRb4Hw=s64","userId":"14469489166467359317"}},"outputId":"6b206aaa-ecb1-43a7-8d4a-1eae242989d4"},"source":["! wget http://ckl-it.de/wp-content/uploads/2021/01/all-data.csv\n"],"execution_count":null,"outputs":[{"output_type":"stream","text":["--2021-05-05 05:10:53-- http://ckl-it.de/wp-content/uploads/2021/01/all-data.csv\n","Resolving ckl-it.de (ckl-it.de)... 217.160.0.108, 2001:8d8:100f:f000::209\n","Connecting to ckl-it.de (ckl-it.de)|217.160.0.108|:80... connected.\n","HTTP request sent, awaiting response... 200 OK\n","Length: 704799 (688K) [text/csv]\n","Saving to: ‘all-data.csv’\n","\n","all-data.csv 100%[===================>] 688.28K 1.22MB/s in 0.5s \n","\n","2021-05-05 05:10:54 (1.22 MB/s) - ‘all-data.csv’ saved [704799/704799]\n","\n"],"name":"stdout"}]},{"cell_type":"code","metadata":{"colab":{"base_uri":"https://localhost:8080/","height":406},"id":"y4xSRWIhwT28","executionInfo":{"status":"ok","timestamp":1620191455016,"user_tz":-120,"elapsed":109649,"user":{"displayName":"Christian Kasim Loan","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GjqAD-ircKP-s5Eh6JSdkDggDczfqQbJGU_IRb4Hw=s64","userId":"14469489166467359317"}},"outputId":"a2eb3af1-eb9a-413f-ffb8-eedd69c82cd6"},"source":["import pandas as pd\n","train_path = '/content/all-data.csv'\n","\n","train_df = pd.read_csv(train_path)\n","# the text data to use for classification should be in a column named 'text'\n","# the label column must have name 'y' name be of type str\n","columns=['text','y']\n","train_df = train_df[columns]\n","train_df = train_df[~train_df[\"y\"].isin([\"neutral\"])]\n","from sklearn.model_selection import train_test_split\n","\n","train_df, test_df = train_test_split(train_df, test_size=0.2)\n","train_df"],"execution_count":null,"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"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n","
texty
951Finnish software developer Basware Oyj said on...positive
829Comptel , a vendor of dynamic Operations Suppo...positive
760Espoon kaupunki awarded contracts for personal...positive
770Net cash flow from operations is expected to r...positive
811The shopping center to be opened in St. Peters...positive
.........
12Finnish Talentum reports its operating profit ...positive
981The financial impact is estimated to be an ann...positive
4773`` I am extremely delighted with this project ...positive
4080Cost cutting measures , which have produced ar...positive
1944Paper maker Stora Enso Oyj said Friday it has ...positive
\n","

1573 rows × 2 columns

\n","
"],"text/plain":[" text y\n","951 Finnish software developer Basware Oyj said on... positive\n","829 Comptel , a vendor of dynamic Operations Suppo... positive\n","760 Espoon kaupunki awarded contracts for personal... positive\n","770 Net cash flow from operations is expected to r... positive\n","811 The shopping center to be opened in St. Peters... positive\n","... ... ...\n","12 Finnish Talentum reports its operating profit ... positive\n","981 The financial impact is estimated to be an ann... positive\n","4773 `` I am extremely delighted with this project ... positive\n","4080 Cost cutting measures , which have produced ar... positive\n","1944 Paper maker Stora Enso Oyj said Friday it has ... positive\n","\n","[1573 rows x 2 columns]"]},"metadata":{"tags":[]},"execution_count":3}]},{"cell_type":"markdown","metadata":{"id":"0296Om2C5anY"},"source":["# 3. Train Deep Learning Classifier using nlu.load('train.sentiment')\n","\n","You dataset label column should be named 'y' and the feature column with text data should be named 'text'"]},{"cell_type":"code","metadata":{"colab":{"base_uri":"https://localhost:8080/","height":1000},"id":"3ZIPkRkWftBG","executionInfo":{"status":"ok","timestamp":1620191586887,"user_tz":-120,"elapsed":241515,"user":{"displayName":"Christian Kasim Loan","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GjqAD-ircKP-s5Eh6JSdkDggDczfqQbJGU_IRb4Hw=s64","userId":"14469489166467359317"}},"outputId":"da31ed6e-519a-420d-9bdd-3dd95b8d0c78"},"source":["import nlu \n","from sklearn.metrics import classification_report\n","\n","# load a trainable pipeline by specifying the train. prefix and fit it on a datset with label and text columns\n","# by default the Universal Sentence Encoder (USE) Sentence embeddings are used for generation\n","trainable_pipe = nlu.load('train.sentiment')\n","fitted_pipe = trainable_pipe.fit(train_df.iloc[:50])\n","\n","# predict with the trainable pipeline on dataset and get predictions\n","preds = fitted_pipe.predict(train_df.iloc[:50],output_level='document')\n","#sentence detector that is part of the pipe generates sone NaNs. lets drop them first\n","preds.dropna(inplace=True)\n","print(classification_report(preds['y'], preds['sentiment']))\n","\n","preds"],"execution_count":null,"outputs":[{"output_type":"stream","text":["tfhub_use download started this may take some time.\n","Approximate size to download 923.7 MB\n","[OK!]\n","sentence_detector_dl download started this may take some time.\n","Approximate size to download 354.6 KB\n","[OK!]\n"," precision recall f1-score support\n","\n"," negative 0.00 0.00 0.00 14\n"," positive 0.72 1.00 0.84 36\n","\n"," accuracy 0.72 50\n"," macro avg 0.36 0.50 0.42 50\n","weighted avg 0.52 0.72 0.60 50\n","\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"," \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"," \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"," \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"," \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"," \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"," \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"," \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"," \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"," \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"," \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"," \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","
origin_indextrained_sentiment_confidenceytextdocumenttrained_sentimentsentencesentence_embedding_use
09510.985986positiveFinnish software developer Basware Oyj said on...Finnish software developer Basware Oyj said on...positive[Finnish software developer Basware Oyj said o...[0.015306072309613228, -0.002737046219408512, ...
18290.989200positiveComptel , a vendor of dynamic Operations Suppo...Comptel , a vendor of dynamic Operations Suppo...positive[Comptel , a vendor of dynamic Operations Supp...[0.04115989804267883, -0.013678845949470997, -...
27600.968155positiveEspoon kaupunki awarded contracts for personal...Espoon kaupunki awarded contracts for personal...positive[Espoon kaupunki awarded contracts for persona...[0.050158627331256866, 0.011978656984865665, 0...
37700.983851positiveNet cash flow from operations is expected to r...Net cash flow from operations is expected to r...positive[Net cash flow from operations is expected to ...[0.06134718284010887, 0.020957626402378082, -0...
48110.974798positiveThe shopping center to be opened in St. Peters...The shopping center to be opened in St. Peters...positive[The shopping center to be opened in St. Peter...[0.030753908678889275, -0.009971680119633675, ...
544420.965111negativeCash flow from operations in January-December ...Cash flow from operations in January-December ...positive[Cash flow from operations in January-December...[0.05352102592587471, 0.06253479421138763, -0....
6250.984061positiveNordea Group 's operating profit increased in ...Nordea Group 's operating profit increased in ...positive[Nordea Group 's operating profit increased in...[0.0497022308409214, 0.023793146014213562, -0....
73780.989835positiveThe Finnish supplier of BSS-OSS and VAS for te...The Finnish supplier of BSS-OSS and VAS for te...positive[The Finnish supplier of BSS-OSS and VAS for t...[0.03325969725847244, -0.004926654975861311, -...
840960.973341positiveFollowing the transaction , Lundbeck has world...Following the transaction , Lundbeck has world...positive[Following the transaction , Lundbeck has worl...[0.07471615076065063, -0.04718644917011261, -0...
91690.981174positiveBoth operating profit and net sales for the th...Both operating profit and net sales for the th...positive[Both operating profit and net sales for the t...[0.03235051780939102, 0.03737620636820793, -0....
101450.985590positiveFinnish Okmetic that manufactures and processe...Finnish Okmetic that manufactures and processe...positive[Finnish Okmetic that manufactures and process...[0.05688846856355667, -0.01949388161301613, -0...
119410.966510positiveCargotec Germany GmbH has been awarded a contr...Cargotec Germany GmbH has been awarded a contr...positive[Cargotec Germany GmbH has been awarded a cont...[0.041768044233322144, -0.019827384501695633, ...
127000.984256positiveFor the current year , Raute expects its net s...For the current year , Raute expects its net s...positive[For the current year , Raute expects its net ...[0.07800783962011337, 0.009446296840906143, -0...
1344170.973687negativeOperating profit , excluding non-recurring ite...Operating profit , excluding non-recurring ite...positive[Operating profit , excluding non-recurring it...[0.038493648171424866, 0.03324933722615242, -0...
1440320.970608negativeOperating loss of the Pulp & Paper Machinery u...Operating loss of the Pulp & Paper Machinery u...positive[Operating loss of the Pulp & Paper Machinery ...[0.03237569332122803, 0.05145535245537758, -0....
153700.977541positiveThe airline has ordered nine Airbus A350-900 a...The airline has ordered nine Airbus A350-900 a...positive[The airline has ordered nine Airbus A350-900 ...[0.011570269241929054, 0.03636825457215309, -0...
1620030.981171positiveAirbus has 100 firm orders for the A350 and 89...Airbus has 100 firm orders for the A350 and 89...positive[Airbus has 100 firm orders for the A350 and 8...[0.038183026015758514, 0.03844863548874855, -0...
176100.973718positiveIn addition , Cramo and Peab have signed exclu...In addition , Cramo and Peab have signed exclu...positive[In addition , Cramo and Peab have signed excl...[0.0708921030163765, -0.003263903083279729, -0...
181070.974965positiveIn the fourth quarter of 2008 , net sales incr...In the fourth quarter of 2008 , net sales incr...positive[In the fourth quarter of 2008 , net sales inc...[0.05488097295165062, 0.057823579758405685, -0...
1916010.981420positiveTekla will implement the renewal in software v...Tekla will implement the renewal in software v...positive[Tekla will implement the renewal in software ...[0.007560136262327433, -0.07031573355197906, -...
2044600.977390positiveTechnical indicators for the stock are bullish...Technical indicators for the stock are bullish...positive[Technical indicators for the stock are bullis...[0.02970636636018753, -0.03946929797530174, -0...
2148420.978522negativeOperating profit fell to EUR 35.4 mn from EUR ...Operating profit fell to EUR 35.4 mn from EUR ...positive[Operating profit fell to EUR 35.4 mn from EUR...[0.04256516322493553, 0.04907069727778435, -0....
2218630.988105positiveThe Basware Connectivity services allow compan...The Basware Connectivity services allow compan...positive[The Basware Connectivity services allow compa...[0.029763543978333473, 0.010379478335380554, 0...
236480.982175positiveIn the first nine months of 2010 , the company...In the first nine months of 2010 , the company...positive[In the first nine months of 2010 , the compan...[0.01850833371281624, 0.04868901148438454, -0....
2439940.952864negativeReturn on investment ROI was 4.1 % compared to...Return on investment ROI was 4.1 % compared to...positive[Return on investment ROI was 4.1 % compared t...[0.0815257877111435, 0.05799625441431999, -0.0...
2546430.965377negativeRevenue for the quarter totaled 27.4 billion ,...Revenue for the quarter totaled 27.4 billion ,...positive[Revenue for the quarter totaled 27.4 billion ...[0.02374003455042839, 0.031523674726486206, -0...
26450.989241positiveThe agreement strengthens our long-term partne...The agreement strengthens our long-term partne...positive[The agreement strengthens our long-term partn...[0.06433788686990738, 0.027824176475405693, -0...
272760.976970positiveRuukki has signed a contract to deliver and in...Ruukki has signed a contract to deliver and in...positive[Ruukki has signed a contract to deliver and i...[0.07258088141679764, 0.018949447199702263, -0...
2843590.957311negativeThe total number of filling stations has been ...The total number of filling stations has been ...positive[The total number of filling stations has been...[-0.08472520112991333, 0.025925278663635254, -...
291310.961769positiveThe major breweries increased their domestic b...The major breweries increased their domestic b...positive[The major breweries increased their domestic ...[-0.006784140598028898, -0.0337284579873085, -...
303020.983410positiveThe transactions would increase earnings per s...The transactions would increase earnings per s...positive[The transactions would increase earnings per ...[0.03781255707144737, -0.05154890567064285, -0...
314200.951963negativeCompared with the FTSE 100 index , which rose ...Compared with the FTSE 100 index , which rose ...positive[Compared with the FTSE 100 index , which rose...[0.033254701644182205, 0.03514326363801956, -0...
3244100.957335negativeNordic banks have already had to write off siz...Nordic banks have already had to write off siz...positive[Nordic banks have already had to write off si...[0.059580087661743164, 0.029068391770124435, -...
3312130.955761positiveEmployees are also better prepared to answer c...Employees are also better prepared to answer c...positive[Employees are also better prepared to answer ...[-0.06203755363821983, 0.001560033531859517, -...
345940.975450positiveThe company recorded revenues of E658 .1 milli...The company recorded revenues of E658 .1 milli...positive[The company recorded revenues of E658 .1 mill...[-0.00406982097774744, 0.07419776916503906, -0...
357810.981393positiveThanksto improvements in demand and the adjust...Thanksto improvements in demand and the adjust...positive[Thanksto improvements in demand and the adjus...[0.06293173134326935, 0.018011141568422318, -0...
366460.971967positiveFor the first nine months of 2010 , Talvivaara...For the first nine months of 2010 , Talvivaara...positive[For the first nine months of 2010 , Talvivaar...[0.05364197865128517, 0.025862835347652435, -0...
37860.985699positiveThe acquisition will considerably increase Kem...The acquisition will considerably increase Kem...positive[The acquisition will considerably increase Ke...[0.07686954736709595, 0.008272827602922916, -0...
384080.983062positiveTo our members and partners , the use of IT wi...To our members and partners , the use of IT wi...positive[To our members and partners , the use of IT w...[0.03138357028365135, -0.008651087991893291, -...
3947360.933318negativeIn food trade , sales amounted to EUR320 .1 m ...In food trade , sales amounted to EUR320 .1 m ...positive[In food trade , sales amounted to EUR320 .1 m...[0.06947962194681168, 0.015812069177627563, -0...
40170.988272positiveIncap Contract Manufacturing Services Pvt Ltd ...Incap Contract Manufacturing Services Pvt Ltd ...positive[Incap Contract Manufacturing Services Pvt Ltd...[0.05365738272666931, -0.055247869342565536, -...
417410.980143positive` Our strategic cooperation with Rentakran bri...` Our strategic cooperation with Rentakran bri...positive[` Our strategic cooperation with Rentakran br...[0.020993076264858246, 0.004286216571927071, -...
421940.988024positiveFinnish messaging solutions developer Tecnomen...Finnish messaging solutions developer Tecnomen...positive[Finnish messaging solutions developer Tecnome...[-0.00443086214363575, -0.01589011400938034, -...
431840.954769positiveEBIT margin was up from 1.4 % to 5.1 % .EBIT margin was up from 1.4 % to 5.1 % .positive[EBIT margin was up from 1.4 % to 5.1 % .][0.04300238937139511, -0.08182621747255325, -0...
446620.981895positiveAccording to Sepp+Ænen , the new technology UM...According to Sepp+Ænen , the new technology UM...positive[According to Sepp+Ænen , the new technology U...[0.060580458492040634, 0.02758965454995632, -0...
4546570.985490negativeFinnish Scanfil , a systems supplier and contr...Finnish Scanfil , a systems supplier and contr...positive[Finnish Scanfil , a systems supplier and cont...[0.056254126131534576, 0.05756135284900665, -0...
4643970.970407negativeFrost sold shares for $ 19 million at $ 6.06-7...Frost sold shares for $ 19 million at $ 6.06-7...positive[Frost sold shares for $ 19 million at $ 6.06-...[0.07948038727045059, 0.01797480694949627, -0....
4742830.876012negativeThis is bad news for the barbeque season .This is bad news for the barbeque season .positive[This is bad news for the barbeque season .][0.033248767256736755, -0.0037416787818074226,...
48440.981696positiveSales increased due to growing market rates an...Sales increased due to growing market rates an...positive[Sales increased due to growing market rates a...[0.047733016312122345, 0.010620158165693283, 0...
4940360.971800negativeOperating loss totalled EUR 3.2 mn , compared ...Operating loss totalled EUR 3.2 mn , compared ...positive[Operating loss totalled EUR 3.2 mn , compared...[0.056506961584091187, 0.03850569948554039, -0...
\n","
"],"text/plain":[" origin_index ... sentence_embedding_use\n","0 951 ... [0.015306072309613228, -0.002737046219408512, ...\n","1 829 ... [0.04115989804267883, -0.013678845949470997, -...\n","2 760 ... [0.050158627331256866, 0.011978656984865665, 0...\n","3 770 ... [0.06134718284010887, 0.020957626402378082, -0...\n","4 811 ... [0.030753908678889275, -0.009971680119633675, ...\n","5 4442 ... [0.05352102592587471, 0.06253479421138763, -0....\n","6 25 ... [0.0497022308409214, 0.023793146014213562, -0....\n","7 378 ... [0.03325969725847244, -0.004926654975861311, -...\n","8 4096 ... [0.07471615076065063, -0.04718644917011261, -0...\n","9 169 ... [0.03235051780939102, 0.03737620636820793, -0....\n","10 145 ... [0.05688846856355667, -0.01949388161301613, -0...\n","11 941 ... [0.041768044233322144, -0.019827384501695633, ...\n","12 700 ... [0.07800783962011337, 0.009446296840906143, -0...\n","13 4417 ... [0.038493648171424866, 0.03324933722615242, -0...\n","14 4032 ... [0.03237569332122803, 0.05145535245537758, -0....\n","15 370 ... [0.011570269241929054, 0.03636825457215309, -0...\n","16 2003 ... [0.038183026015758514, 0.03844863548874855, -0...\n","17 610 ... [0.0708921030163765, -0.003263903083279729, -0...\n","18 107 ... [0.05488097295165062, 0.057823579758405685, -0...\n","19 1601 ... [0.007560136262327433, -0.07031573355197906, -...\n","20 4460 ... [0.02970636636018753, -0.03946929797530174, -0...\n","21 4842 ... [0.04256516322493553, 0.04907069727778435, -0....\n","22 1863 ... [0.029763543978333473, 0.010379478335380554, 0...\n","23 648 ... [0.01850833371281624, 0.04868901148438454, -0....\n","24 3994 ... [0.0815257877111435, 0.05799625441431999, -0.0...\n","25 4643 ... [0.02374003455042839, 0.031523674726486206, -0...\n","26 45 ... [0.06433788686990738, 0.027824176475405693, -0...\n","27 276 ... [0.07258088141679764, 0.018949447199702263, -0...\n","28 4359 ... [-0.08472520112991333, 0.025925278663635254, -...\n","29 131 ... [-0.006784140598028898, -0.0337284579873085, -...\n","30 302 ... [0.03781255707144737, -0.05154890567064285, -0...\n","31 420 ... [0.033254701644182205, 0.03514326363801956, -0...\n","32 4410 ... [0.059580087661743164, 0.029068391770124435, -...\n","33 1213 ... [-0.06203755363821983, 0.001560033531859517, -...\n","34 594 ... [-0.00406982097774744, 0.07419776916503906, -0...\n","35 781 ... [0.06293173134326935, 0.018011141568422318, -0...\n","36 646 ... [0.05364197865128517, 0.025862835347652435, -0...\n","37 86 ... [0.07686954736709595, 0.008272827602922916, -0...\n","38 408 ... [0.03138357028365135, -0.008651087991893291, -...\n","39 4736 ... [0.06947962194681168, 0.015812069177627563, -0...\n","40 17 ... [0.05365738272666931, -0.055247869342565536, -...\n","41 741 ... [0.020993076264858246, 0.004286216571927071, -...\n","42 194 ... [-0.00443086214363575, -0.01589011400938034, -...\n","43 184 ... [0.04300238937139511, -0.08182621747255325, -0...\n","44 662 ... [0.060580458492040634, 0.02758965454995632, -0...\n","45 4657 ... [0.056254126131534576, 0.05756135284900665, -0...\n","46 4397 ... [0.07948038727045059, 0.01797480694949627, -0....\n","47 4283 ... [0.033248767256736755, -0.0037416787818074226,...\n","48 44 ... [0.047733016312122345, 0.010620158165693283, 0...\n","49 4036 ... [0.056506961584091187, 0.03850569948554039, -0...\n","\n","[50 rows x 8 columns]"]},"metadata":{"tags":[]},"execution_count":4}]},{"cell_type":"markdown","metadata":{"id":"lVyOE2wV0fw_"},"source":["# 4. Test the fitted pipe on new example"]},{"cell_type":"code","metadata":{"colab":{"base_uri":"https://localhost:8080/","height":97},"id":"qdCUg2MR0PD2","executionInfo":{"status":"ok","timestamp":1620191587668,"user_tz":-120,"elapsed":242291,"user":{"displayName":"Christian Kasim Loan","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GjqAD-ircKP-s5Eh6JSdkDggDczfqQbJGU_IRb4Hw=s64","userId":"14469489166467359317"}},"outputId":"06353129-c349-4f77-dfcf-efda0464c20e"},"source":["fitted_pipe.predict('According to the most recent update there has been a major decrese in the rate of oil')"],"execution_count":null,"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","
origin_indextrained_sentiment_confidencedocumenttrained_sentimentsentencesentence_embedding_use
000.94103According to the most recent update there has ...positive[According to the most recent update there has...[0.009911456145346165, 0.04162858799099922, -0...
\n","
"],"text/plain":[" origin_index ... sentence_embedding_use\n","0 0 ... [0.009911456145346165, 0.04162858799099922, -0...\n","\n","[1 rows x 6 columns]"]},"metadata":{"tags":[]},"execution_count":5}]},{"cell_type":"markdown","metadata":{"id":"xflpwrVjjBVD"},"source":["## 5. Configure pipe training parameters"]},{"cell_type":"code","metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"UtsAUGTmOTms","executionInfo":{"status":"ok","timestamp":1620191587670,"user_tz":-120,"elapsed":242288,"user":{"displayName":"Christian Kasim Loan","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GjqAD-ircKP-s5Eh6JSdkDggDczfqQbJGU_IRb4Hw=s64","userId":"14469489166467359317"}},"outputId":"75f6cff2-4c64-4eb3-a5a3-cf4d142940c8"},"source":["trainable_pipe.print_info()"],"execution_count":null,"outputs":[{"output_type":"stream","text":["The following parameters are configurable for this NLU pipeline (You can copy paste the examples) :\n",">>> pipe['sentiment_dl'] has settable params:\n","pipe['sentiment_dl'].setMaxEpochs(1) | Info: Maximum number of epochs to train | Currently set to : 1\n","pipe['sentiment_dl'].setLr(0.005) | Info: Learning Rate | Currently set to : 0.005\n","pipe['sentiment_dl'].setBatchSize(64) | Info: Batch size | Currently set to : 64\n","pipe['sentiment_dl'].setDropout(0.5) | Info: Dropout coefficient | Currently set to : 0.5\n","pipe['sentiment_dl'].setEnableOutputLogs(True) | Info: Whether to use stdout in addition to Spark logs. | Currently set to : True\n","pipe['sentiment_dl'].setThreshold(0.6) | Info: The minimum threshold for the final result otheriwse it will be neutral | Currently set to : 0.6\n","pipe['sentiment_dl'].setThresholdLabel('neutral') | Info: In case the score is less than threshold, what should be the label. Default is neutral. | Currently set to : neutral\n",">>> pipe['use@tfhub_use'] has settable params:\n","pipe['use@tfhub_use'].setDimension(512) | Info: Number of embedding dimensions | Currently set to : 512\n","pipe['use@tfhub_use'].setLoadSP(False) | Info: Whether to load SentencePiece ops file which is required only by multi-lingual models. This is not changeable after it's set with a pretrained model nor it is compatible with Windows. | Currently set to : False\n","pipe['use@tfhub_use'].setStorageRef('tfhub_use') | Info: unique reference name for identification | Currently set to : tfhub_use\n",">>> pipe['deep_sentence_detector@SentenceDetectorDLModel_c83c27f46b97'] has settable params:\n","pipe['deep_sentence_detector@SentenceDetectorDLModel_c83c27f46b97'].setExplodeSentences(False) | Info: whether to explode each sentence into a different row, for better parallelization. Defaults to false. | Currently set to : False\n","pipe['deep_sentence_detector@SentenceDetectorDLModel_c83c27f46b97'].setStorageRef('SentenceDetectorDLModel_c83c27f46b97') | Info: storage unique identifier | Currently set to : SentenceDetectorDLModel_c83c27f46b97\n","pipe['deep_sentence_detector@SentenceDetectorDLModel_c83c27f46b97'].setEncoder(com.johnsnowlabs.nlp.annotators.sentence_detector_dl.SentenceDetectorDLEncoder@3933547a) | Info: Data encoder | Currently set to : com.johnsnowlabs.nlp.annotators.sentence_detector_dl.SentenceDetectorDLEncoder@3933547a\n","pipe['deep_sentence_detector@SentenceDetectorDLModel_c83c27f46b97'].setImpossiblePenultimates(['Bros', 'No', 'al', 'vs', 'etc', 'Fig', 'Dr', 'Prof', 'PhD', 'MD', 'Co', 'Corp', 'Inc', 'bros', 'VS', 'Vs', 'ETC', 'fig', 'dr', 'prof', 'PHD', 'phd', 'md', 'co', 'corp', 'inc', 'Jan', 'Feb', 'Mar', 'Apr', 'Jul', 'Aug', 'Sep', 'Sept', 'Oct', 'Nov', 'Dec', 'St', 'st', 'AM', 'PM', 'am', 'pm', 'e.g', 'f.e', 'i.e']) | Info: Impossible penultimates | Currently set to : ['Bros', 'No', 'al', 'vs', 'etc', 'Fig', 'Dr', 'Prof', 'PhD', 'MD', 'Co', 'Corp', 'Inc', 'bros', 'VS', 'Vs', 'ETC', 'fig', 'dr', 'prof', 'PHD', 'phd', 'md', 'co', 'corp', 'inc', 'Jan', 'Feb', 'Mar', 'Apr', 'Jul', 'Aug', 'Sep', 'Sept', 'Oct', 'Nov', 'Dec', 'St', 'st', 'AM', 'PM', 'am', 'pm', 'e.g', 'f.e', 'i.e']\n","pipe['deep_sentence_detector@SentenceDetectorDLModel_c83c27f46b97'].setModelArchitecture('cnn') | Info: Model architecture (CNN) | Currently set to : cnn\n",">>> pipe['document_assembler'] has settable params:\n","pipe['document_assembler'].setCleanupMode('shrink') | Info: possible values: disabled, inplace, inplace_full, shrink, shrink_full, each, each_full, delete_full | Currently set to : shrink\n"],"name":"stdout"}]},{"cell_type":"markdown","metadata":{"id":"2GJdDNV9jEIe"},"source":["## 6. Retrain with new parameters"]},{"cell_type":"code","metadata":{"colab":{"base_uri":"https://localhost:8080/","height":759},"id":"mptfvHx-MMMX","executionInfo":{"status":"ok","timestamp":1620191593284,"user_tz":-120,"elapsed":247897,"user":{"displayName":"Christian Kasim Loan","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GjqAD-ircKP-s5Eh6JSdkDggDczfqQbJGU_IRb4Hw=s64","userId":"14469489166467359317"}},"outputId":"eea9eda8-11d0-4568-c277-46105770062f"},"source":["# Train longer!\n","trainable_pipe = nlu.load('train.sentiment')\n","trainable_pipe['trainable_sentiment_dl'].setMaxEpochs(5) \n","fitted_pipe = trainable_pipe.fit(train_df.iloc[:100])\n","# predict with the trainable pipeline on dataset and get predictions\n","preds = fitted_pipe.predict(train_df.iloc[:100],output_level='document')\n","\n","#sentence detector that is part of the pipe generates sone NaNs. lets drop them first\n","preds.dropna(inplace=True)\n","print(classification_report(preds['y'], preds['sentiment']))\n","\n","preds"],"execution_count":null,"outputs":[{"output_type":"stream","text":[" precision recall f1-score support\n","\n"," negative 0.00 0.00 0.00 31\n"," neutral 0.00 0.00 0.00 0\n"," positive 0.86 0.99 0.92 69\n","\n"," accuracy 0.68 100\n"," macro avg 0.29 0.33 0.31 100\n","weighted avg 0.59 0.68 0.63 100\n","\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"," \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"," \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"," \n"," \n"," \n"," \n","
origin_indextrained_sentiment_confidenceytextdocumenttrained_sentimentsentencesentence_embedding_use
09510.999660positiveFinnish software developer Basware Oyj said on...Finnish software developer Basware Oyj said on...positive[Finnish software developer Basware Oyj said o...[0.015306072309613228, -0.002737046219408512, ...
18290.999917positiveComptel , a vendor of dynamic Operations Suppo...Comptel , a vendor of dynamic Operations Suppo...positive[Comptel , a vendor of dynamic Operations Supp...[0.04115989804267883, -0.013678845949470997, -...
27600.997053positiveEspoon kaupunki awarded contracts for personal...Espoon kaupunki awarded contracts for personal...positive[Espoon kaupunki awarded contracts for persona...[0.050158627331256866, 0.011978656984865665, 0...
37700.958511positiveNet cash flow from operations is expected to r...Net cash flow from operations is expected to r...positive[Net cash flow from operations is expected to ...[0.06134718284010887, 0.020957626402378082, -0...
48110.978840positiveThe shopping center to be opened in St. Peters...The shopping center to be opened in St. Peters...positive[The shopping center to be opened in St. Peter...[0.030753908678889275, -0.009971680119633675, ...
...........................
956890.897502positiveFinnish Sampo Bank , of Danish Danske Bank gro...Finnish Sampo Bank , of Danish Danske Bank gro...positive[Finnish Sampo Bank , of Danish Danske Bank gr...[0.06391362845897675, 0.028690673410892487, -0...
9619980.979267positiveTalentum expects that the net sales of its cor...Talentum expects that the net sales of its cor...positive[Talentum expects that the net sales of its co...[0.07739534974098206, 0.037561606615781784, -0...
9744580.997499positiveefficiency improvement measures 20 January 201...efficiency improvement measures 20 January 201...positive[efficiency improvement measures 20 January 20...[0.056025125086307526, 0.054798685014247894, -...
9844150.518980negativeOperating profit , excluding non-recurring ite...Operating profit , excluding non-recurring ite...neutral[Operating profit , excluding non-recurring it...[0.031145866960287094, 0.051556773483753204, -...
9947520.516453negativeOperating profit totaled EUR 9.4 mn , down fro...Operating profit totaled EUR 9.4 mn , down fro...neutral[Operating profit totaled EUR 9.4 mn , down fr...[0.04533316195011139, 0.06103566288948059, -0....
\n","

100 rows × 8 columns

\n","
"],"text/plain":[" origin_index ... sentence_embedding_use\n","0 951 ... [0.015306072309613228, -0.002737046219408512, ...\n","1 829 ... [0.04115989804267883, -0.013678845949470997, -...\n","2 760 ... [0.050158627331256866, 0.011978656984865665, 0...\n","3 770 ... [0.06134718284010887, 0.020957626402378082, -0...\n","4 811 ... [0.030753908678889275, -0.009971680119633675, ...\n",".. ... ... ...\n","95 689 ... [0.06391362845897675, 0.028690673410892487, -0...\n","96 1998 ... [0.07739534974098206, 0.037561606615781784, -0...\n","97 4458 ... [0.056025125086307526, 0.054798685014247894, -...\n","98 4415 ... [0.031145866960287094, 0.051556773483753204, -...\n","99 4752 ... [0.04533316195011139, 0.06103566288948059, -0....\n","\n","[100 rows x 8 columns]"]},"metadata":{"tags":[]},"execution_count":7}]},{"cell_type":"markdown","metadata":{"id":"qFoT-s1MjTSS"},"source":["#7. Try training with different Embeddings"]},{"cell_type":"code","metadata":{"id":"nxWFzQOhjWC8","colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"status":"ok","timestamp":1620191593285,"user_tz":-120,"elapsed":247893,"user":{"displayName":"Christian Kasim Loan","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GjqAD-ircKP-s5Eh6JSdkDggDczfqQbJGU_IRb4Hw=s64","userId":"14469489166467359317"}},"outputId":"c9c63c03-471b-4c63-bf5f-4bf1107c521b"},"source":["# We can use nlu.print_components(action='embed_sentence') to see every possibler sentence embedding we could use. Lets use bert!\n","nlu.print_components(action='embed_sentence')"],"execution_count":null,"outputs":[{"output_type":"stream","text":["For language NLU provides the following Models : \n","nlu.load('en.embed_sentence') returns Spark NLP model tfhub_use\n","nlu.load('en.embed_sentence.use') returns Spark NLP model tfhub_use\n","nlu.load('en.embed_sentence.tfhub_use') returns Spark NLP model tfhub_use\n","nlu.load('en.embed_sentence.use.lg') returns Spark NLP model tfhub_use_lg\n","nlu.load('en.embed_sentence.tfhub_use.lg') returns Spark NLP model tfhub_use_lg\n","nlu.load('en.embed_sentence.albert') returns Spark NLP model albert_base_uncased\n","nlu.load('en.embed_sentence.electra') returns Spark NLP model sent_electra_small_uncased\n","nlu.load('en.embed_sentence.electra_small_uncased') returns Spark NLP model sent_electra_small_uncased\n","nlu.load('en.embed_sentence.electra_base_uncased') returns Spark NLP model sent_electra_base_uncased\n","nlu.load('en.embed_sentence.electra_large_uncased') returns Spark NLP model sent_electra_large_uncased\n","nlu.load('en.embed_sentence.bert') returns Spark NLP model sent_bert_base_uncased\n","nlu.load('en.embed_sentence.bert_base_uncased') returns Spark NLP model sent_bert_base_uncased\n","nlu.load('en.embed_sentence.bert_base_cased') returns Spark NLP model sent_bert_base_cased\n","nlu.load('en.embed_sentence.bert_large_uncased') returns Spark NLP model sent_bert_large_uncased\n","nlu.load('en.embed_sentence.bert_large_cased') returns Spark NLP model sent_bert_large_cased\n","nlu.load('en.embed_sentence.biobert.pubmed_base_cased') returns Spark NLP model sent_biobert_pubmed_base_cased\n","nlu.load('en.embed_sentence.biobert.pubmed_large_cased') returns Spark NLP model sent_biobert_pubmed_large_cased\n","nlu.load('en.embed_sentence.biobert.pmc_base_cased') returns Spark NLP model sent_biobert_pmc_base_cased\n","nlu.load('en.embed_sentence.biobert.pubmed_pmc_base_cased') returns Spark NLP model sent_biobert_pubmed_pmc_base_cased\n","nlu.load('en.embed_sentence.biobert.clinical_base_cased') returns Spark NLP model sent_biobert_clinical_base_cased\n","nlu.load('en.embed_sentence.biobert.discharge_base_cased') returns Spark NLP model sent_biobert_discharge_base_cased\n","nlu.load('en.embed_sentence.covidbert.large_uncased') returns Spark NLP model sent_covidbert_large_uncased\n","nlu.load('en.embed_sentence.small_bert_L2_128') returns Spark NLP model sent_small_bert_L2_128\n","nlu.load('en.embed_sentence.small_bert_L4_128') returns Spark NLP model sent_small_bert_L4_128\n","nlu.load('en.embed_sentence.small_bert_L6_128') returns Spark NLP model sent_small_bert_L6_128\n","nlu.load('en.embed_sentence.small_bert_L8_128') returns Spark NLP model sent_small_bert_L8_128\n","nlu.load('en.embed_sentence.small_bert_L10_128') returns Spark NLP model sent_small_bert_L10_128\n","nlu.load('en.embed_sentence.small_bert_L12_128') returns Spark NLP model sent_small_bert_L12_128\n","nlu.load('en.embed_sentence.small_bert_L2_256') returns Spark NLP model sent_small_bert_L2_256\n","nlu.load('en.embed_sentence.small_bert_L4_256') returns Spark NLP model sent_small_bert_L4_256\n","nlu.load('en.embed_sentence.small_bert_L6_256') returns Spark NLP model sent_small_bert_L6_256\n","nlu.load('en.embed_sentence.small_bert_L8_256') returns Spark NLP model sent_small_bert_L8_256\n","nlu.load('en.embed_sentence.small_bert_L10_256') returns Spark NLP model sent_small_bert_L10_256\n","nlu.load('en.embed_sentence.small_bert_L12_256') returns Spark NLP model sent_small_bert_L12_256\n","nlu.load('en.embed_sentence.small_bert_L2_512') returns Spark NLP model sent_small_bert_L2_512\n","nlu.load('en.embed_sentence.small_bert_L4_512') returns Spark NLP model sent_small_bert_L4_512\n","nlu.load('en.embed_sentence.small_bert_L6_512') returns Spark NLP model sent_small_bert_L6_512\n","nlu.load('en.embed_sentence.small_bert_L8_512') returns Spark NLP model sent_small_bert_L8_512\n","nlu.load('en.embed_sentence.small_bert_L10_512') returns Spark NLP model sent_small_bert_L10_512\n","nlu.load('en.embed_sentence.small_bert_L12_512') returns Spark NLP model sent_small_bert_L12_512\n","nlu.load('en.embed_sentence.small_bert_L2_768') returns Spark NLP model sent_small_bert_L2_768\n","nlu.load('en.embed_sentence.small_bert_L4_768') returns Spark NLP model sent_small_bert_L4_768\n","nlu.load('en.embed_sentence.small_bert_L6_768') returns Spark NLP model sent_small_bert_L6_768\n","nlu.load('en.embed_sentence.small_bert_L8_768') returns Spark NLP model sent_small_bert_L8_768\n","nlu.load('en.embed_sentence.small_bert_L10_768') returns Spark NLP model sent_small_bert_L10_768\n","nlu.load('en.embed_sentence.small_bert_L12_768') returns Spark NLP model sent_small_bert_L12_768\n","For language NLU provides the following Models : \n","nlu.load('fi.embed_sentence') returns Spark NLP model sent_bert_finnish_cased\n","nlu.load('fi.embed_sentence.bert.cased') returns Spark NLP model sent_bert_finnish_cased\n","nlu.load('fi.embed_sentence.bert.uncased') returns Spark NLP model sent_bert_finnish_uncased\n","For language NLU provides the following Models : \n","nlu.load('xx.embed_sentence') returns Spark NLP model sent_bert_multi_cased\n","nlu.load('xx.embed_sentence.bert') returns Spark NLP model sent_bert_multi_cased\n","nlu.load('xx.embed_sentence.bert.cased') returns Spark NLP model sent_bert_multi_cased\n","nlu.load('xx.embed_sentence.labse') returns Spark NLP model labse\n"],"name":"stdout"}]},{"cell_type":"code","metadata":{"id":"IKK_Ii_gjJfF","colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"status":"ok","timestamp":1620192376887,"user_tz":-120,"elapsed":1031491,"user":{"displayName":"Christian Kasim Loan","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GjqAD-ircKP-s5Eh6JSdkDggDczfqQbJGU_IRb4Hw=s64","userId":"14469489166467359317"}},"outputId":"3beccb4a-b2c7-437a-8725-753d99011c4e"},"source":["trainable_pipe = nlu.load('en.embed_sentence.small_bert_L12_768 train.sentiment')\n","# We need to train longer and user smaller LR for NON-USE based sentence embeddings usually\n","# We could tune the hyperparameters further with hyperparameter tuning methods like gridsearch\n","# Also longer training gives more accuracy\n","trainable_pipe['trainable_sentiment_dl'].setMaxEpochs(70) \n","trainable_pipe['trainable_sentiment_dl'].setLr(0.0005) \n","fitted_pipe = trainable_pipe.fit(train_df)\n","# predict with the trainable pipeline on dataset and get predictions\n","preds = fitted_pipe.predict(train_df,output_level='document')\n","\n","#sentence detector that is part of the pipe generates sone NaNs. lets drop them first\n","preds.dropna(inplace=True)\n","print(classification_report(preds['y'], preds['sentiment']))\n","\n","#preds"],"execution_count":null,"outputs":[{"output_type":"stream","text":["sent_small_bert_L12_768 download started this may take some time.\n","Approximate size to download 392.9 MB\n","[OK!]\n","sentence_detector_dl download started this may take some time.\n","Approximate size to download 354.6 KB\n","[OK!]\n"," precision recall f1-score support\n","\n"," negative 0.87 0.84 0.86 488\n"," neutral 0.00 0.00 0.00 0\n"," positive 0.96 0.92 0.94 1085\n","\n"," accuracy 0.90 1573\n"," macro avg 0.61 0.59 0.60 1573\n","weighted avg 0.94 0.90 0.92 1573\n","\n"],"name":"stdout"}]},{"cell_type":"markdown","metadata":{"id":"_1jxw3GnVGlI"},"source":["# 7.1 evaluate on Test Data"]},{"cell_type":"code","metadata":{"id":"Fxx4yNkNVGFl","colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"status":"ok","timestamp":1620192438491,"user_tz":-120,"elapsed":1093091,"user":{"displayName":"Christian Kasim Loan","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GjqAD-ircKP-s5Eh6JSdkDggDczfqQbJGU_IRb4Hw=s64","userId":"14469489166467359317"}},"outputId":"2ca09f36-0316-41af-9eba-61d6aeaf1f54"},"source":["preds = fitted_pipe.predict(test_df,output_level='document')\n","\n","#sentence detector that is part of the pipe generates sone NaNs. lets drop them first\n","preds.dropna(inplace=True)\n","print(classification_report(preds['y'], preds['sentiment']))"],"execution_count":null,"outputs":[{"output_type":"stream","text":[" precision recall f1-score support\n","\n"," negative 0.84 0.76 0.80 116\n"," neutral 0.00 0.00 0.00 0\n"," positive 0.95 0.90 0.93 278\n","\n"," accuracy 0.86 394\n"," macro avg 0.60 0.55 0.57 394\n","weighted avg 0.92 0.86 0.89 394\n","\n"],"name":"stdout"}]},{"cell_type":"markdown","metadata":{"id":"2BB-NwZUoHSe"},"source":["# 8. Lets save the model"]},{"cell_type":"code","metadata":{"id":"eLex095goHwm","colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"status":"ok","timestamp":1620192662123,"user_tz":-120,"elapsed":1316719,"user":{"displayName":"Christian Kasim Loan","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GjqAD-ircKP-s5Eh6JSdkDggDczfqQbJGU_IRb4Hw=s64","userId":"14469489166467359317"}},"outputId":"a91b2529-2d79-400d-ce51-107c2afa2195"},"source":["stored_model_path = './models/classifier_dl_trained' \n","fitted_pipe.save(stored_model_path)"],"execution_count":null,"outputs":[{"output_type":"stream","text":["Stored model in ./models/classifier_dl_trained\n"],"name":"stdout"}]},{"cell_type":"markdown","metadata":{"id":"e_b2DPd4rCiU"},"source":["# 9. Lets load the model from HDD.\n","This makes Offlien NLU usage possible! \n","You need to call nlu.load(path=path_to_the_pipe) to load a model/pipeline from disk."]},{"cell_type":"code","metadata":{"id":"SO4uz45MoRgp","colab":{"base_uri":"https://localhost:8080/","height":94},"executionInfo":{"status":"ok","timestamp":1620192674556,"user_tz":-120,"elapsed":1329148,"user":{"displayName":"Christian Kasim Loan","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GjqAD-ircKP-s5Eh6JSdkDggDczfqQbJGU_IRb4Hw=s64","userId":"14469489166467359317"}},"outputId":"864c1c25-cebd-4f7b-c5cd-06ff11db537b"},"source":["hdd_pipe = nlu.load(path=stored_model_path)\n","\n","preds = hdd_pipe.predict('According to the most recent update there has been a major decrese in the rate of oil')\n","preds"],"execution_count":null,"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","
origin_indexsentimentsentence_embedding_from_disktextsentiment_confidencedocumentsentence
08589934592[negative][[-0.021685948595404625, 0.13073018193244934, ...According to the most recent update there has ...[0.86657214]According to the most recent update there has ...[According to the most recent update there has...
\n","
"],"text/plain":[" origin_index ... sentence\n","0 8589934592 ... [According to the most recent update there has...\n","\n","[1 rows x 7 columns]"]},"metadata":{"tags":[]},"execution_count":12}]},{"cell_type":"code","metadata":{"id":"e0CVlkk9v6Qi","colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"status":"ok","timestamp":1620192674557,"user_tz":-120,"elapsed":1329144,"user":{"displayName":"Christian Kasim Loan","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GjqAD-ircKP-s5Eh6JSdkDggDczfqQbJGU_IRb4Hw=s64","userId":"14469489166467359317"}},"outputId":"53e0a6b8-7742-4428-d203-cfa5c1c499b0"},"source":["hdd_pipe.print_info()"],"execution_count":null,"outputs":[{"output_type":"stream","text":["The following parameters are configurable for this NLU pipeline (You can copy paste the examples) :\n",">>> pipe['document_assembler'] has settable params:\n","pipe['document_assembler'].setCleanupMode('shrink') | Info: possible values: disabled, inplace, inplace_full, shrink, shrink_full, each, each_full, delete_full | Currently set to : shrink\n",">>> pipe['sentence_detector@SentenceDetectorDLModel_c83c27f46b97'] has settable params:\n","pipe['sentence_detector@SentenceDetectorDLModel_c83c27f46b97'].setExplodeSentences(False) | Info: whether to explode each sentence into a different row, for better parallelization. Defaults to false. | Currently set to : False\n","pipe['sentence_detector@SentenceDetectorDLModel_c83c27f46b97'].setStorageRef('SentenceDetectorDLModel_c83c27f46b97') | Info: storage unique identifier | Currently set to : SentenceDetectorDLModel_c83c27f46b97\n","pipe['sentence_detector@SentenceDetectorDLModel_c83c27f46b97'].setEncoder(com.johnsnowlabs.nlp.annotators.sentence_detector_dl.SentenceDetectorDLEncoder@dcd6682) | Info: Data encoder | Currently set to : com.johnsnowlabs.nlp.annotators.sentence_detector_dl.SentenceDetectorDLEncoder@dcd6682\n","pipe['sentence_detector@SentenceDetectorDLModel_c83c27f46b97'].setImpossiblePenultimates(['Bros', 'No', 'al', 'vs', 'etc', 'Fig', 'Dr', 'Prof', 'PhD', 'MD', 'Co', 'Corp', 'Inc', 'bros', 'VS', 'Vs', 'ETC', 'fig', 'dr', 'prof', 'PHD', 'phd', 'md', 'co', 'corp', 'inc', 'Jan', 'Feb', 'Mar', 'Apr', 'Jul', 'Aug', 'Sep', 'Sept', 'Oct', 'Nov', 'Dec', 'St', 'st', 'AM', 'PM', 'am', 'pm', 'e.g', 'f.e', 'i.e']) | Info: Impossible penultimates | Currently set to : ['Bros', 'No', 'al', 'vs', 'etc', 'Fig', 'Dr', 'Prof', 'PhD', 'MD', 'Co', 'Corp', 'Inc', 'bros', 'VS', 'Vs', 'ETC', 'fig', 'dr', 'prof', 'PHD', 'phd', 'md', 'co', 'corp', 'inc', 'Jan', 'Feb', 'Mar', 'Apr', 'Jul', 'Aug', 'Sep', 'Sept', 'Oct', 'Nov', 'Dec', 'St', 'st', 'AM', 'PM', 'am', 'pm', 'e.g', 'f.e', 'i.e']\n","pipe['sentence_detector@SentenceDetectorDLModel_c83c27f46b97'].setModelArchitecture('cnn') | Info: Model architecture (CNN) | Currently set to : cnn\n",">>> pipe['bert_sentence@sent_small_bert_L12_768'] has settable params:\n","pipe['bert_sentence@sent_small_bert_L12_768'].setBatchSize(8) | Info: Size of every batch | Currently set to : 8\n","pipe['bert_sentence@sent_small_bert_L12_768'].setCaseSensitive(False) | Info: whether to ignore case in tokens for embeddings matching | Currently set to : False\n","pipe['bert_sentence@sent_small_bert_L12_768'].setDimension(768) | Info: Number of embedding dimensions | Currently set to : 768\n","pipe['bert_sentence@sent_small_bert_L12_768'].setMaxSentenceLength(128) | Info: Max sentence length to process | Currently set to : 128\n","pipe['bert_sentence@sent_small_bert_L12_768'].setIsLong(False) | Info: Use Long type instead of Int type for inputs buffer - Some Bert models require Long instead of Int. | Currently set to : False\n","pipe['bert_sentence@sent_small_bert_L12_768'].setStorageRef('sent_small_bert_L12_768') | Info: unique reference name for identification | Currently set to : sent_small_bert_L12_768\n",">>> pipe['sentiment_dl@sent_small_bert_L12_768'] has settable params:\n","pipe['sentiment_dl@sent_small_bert_L12_768'].setThreshold(0.6) | Info: The minimum threshold for the final result otheriwse it will be neutral | Currently set to : 0.6\n","pipe['sentiment_dl@sent_small_bert_L12_768'].setThresholdLabel('neutral') | Info: In case the score is less than threshold, what should be the label. Default is neutral. | Currently set to : neutral\n","pipe['sentiment_dl@sent_small_bert_L12_768'].setClasses(['positive', 'negative']) | Info: get the tags used to trained this SentimentDLModel | Currently set to : ['positive', 'negative']\n","pipe['sentiment_dl@sent_small_bert_L12_768'].setStorageRef('sent_small_bert_L12_768') | Info: unique reference name for identification | Currently set to : sent_small_bert_L12_768\n"],"name":"stdout"}]}]} \ No newline at end of file +{ + "nbformat": 4, + "nbformat_minor": 0, + "metadata": { + "colab": { + "provenance": [] + }, + "kernelspec": { + "name": "python3", + "display_name": "Python 3" + } + }, + "cells": [ + { + "cell_type": "markdown", + "metadata": { + "id": "zkufh760uvF3" + }, + "source": [ + "![JohnSnowLabs](https://nlp.johnsnowlabs.com/assets/images/logo.png)\n", + "\n", + "[![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/JohnSnowLabs/nlu/blob/master/examples/colab/Training/binary_text_classification/NLU_training_sentiment_classifier_demo_finanical_news.ipynb)\n", + "\n", + "\n", + "\n", + "# Training a Sentiment Analysis Classifier with NLU\n", + "## 2 class Finance News sentiment classifier training\n", + "With the [SentimentDL model](https://nlp.johnsnowlabs.com/docs/en/annotators#sentimentdl-multi-class-sentiment-analysis-annotator) from Spark NLP you can achieve State Of the Art results on any multi class text classification problem\n", + "\n", + "This notebook showcases the following features :\n", + "\n", + "- How to train the deep learning classifier\n", + "- How to store a pipeline to disk\n", + "- How to load the pipeline from disk (Enables NLU offline mode)\n", + "\n", + "You can achieve these results or even better on this dataset with training data:\n", + "\n", + "
\n", + "\n", + "![image.png](data:image/png;base64,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)\n", + "\n", + "\n", + "\n", + "\n", + "You can achieve these results or even better on this dataset with test data:\n", + "\n", + "\n", + "
\n", + "\n", + "\n", + "![image.png](data:image/png;base64,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)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "dur2drhW5Rvi" + }, + "source": [ + "# 1. Install Java 8 and NLU" + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "hFGnBCHavltY" + }, + "source": [ + "!pip install -q johnsnowlabs" + ], + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "f4KkTfnR5Ugg" + }, + "source": [ + "# 2. Download Finanical News Sentiment dataset\n", + "https://www.kaggle.com/ankurzing/sentiment-analysis-for-financial-news\n", + "\n", + "This dataset contains the sentiments for financial news headlines from the perspective of a retail investor. Further details about the dataset can be found in: Malo, P., Sinha, A., Takala, P., Korhonen, P. and Wallenius, J. (2014): “Good debt or bad debt: Detecting semantic orientations in economic texts.” Journal of the American Society for Information Science and Technology." + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "OrVb5ZMvvrQD" + }, + "source": [ + "! wget https://s3.amazonaws.com/auxdata.johnsnowlabs.com/public/resources/en/classifier-dl/financial_news/all-data.csv\n" + ], + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 424 + }, + "id": "y4xSRWIhwT28", + "outputId": "4b2c74bd-7563-44ca-9201-d1e76f4899e3" + }, + "source": [ + "import pandas as pd\n", + "train_path = '/content/all-data.csv'\n", + "\n", + "train_df = pd.read_csv(train_path)\n", + "# the text data to use for classification should be in a column named 'text'\n", + "# the label column must have name 'y' name be of type str\n", + "columns=['text','y']\n", + "train_df = train_df[columns]\n", + "train_df = train_df[~train_df[\"y\"].isin([\"neutral\"])]\n", + "from sklearn.model_selection import train_test_split\n", + "\n", + "train_df, test_df = train_test_split(train_df, test_size=0.2)\n", + "train_df" + ], + "execution_count": 3, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + " text y\n", + "4631 The OMX Nordic 40 OMXN40 index , comprising th... negative\n", + "4512 Dubai Nokia has announced the launch of `` Com... positive\n", + "2860 credit 20 November 2009 - Finnish glass techno... positive\n", + "1780 HELSINKI AFX - Outokumpu said its technology u... positive\n", + "845 Helsingin Uutiset , Vantaan Sanomat and Lansiv... positive\n", + "... ... ...\n", + "186 EPS for the quarter was EUR0 .00 , as compared... positive\n", + "47 The company also estimates the already carried... positive\n", + "1492 A realignment of interests in the sector is cl... positive\n", + "2094 European traffic grew nearly 30 % . positive\n", + "4452 The period 's sales dropped to EUR30 .6 m from... negative\n", + "\n", + "[1573 rows x 2 columns]" + ], + "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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
texty
4631The OMX Nordic 40 OMXN40 index , comprising th...negative
4512Dubai Nokia has announced the launch of `` Com...positive
2860credit 20 November 2009 - Finnish glass techno...positive
1780HELSINKI AFX - Outokumpu said its technology u...positive
845Helsingin Uutiset , Vantaan Sanomat and Lansiv...positive
.........
186EPS for the quarter was EUR0 .00 , as compared...positive
47The company also estimates the already carried...positive
1492A realignment of interests in the sector is cl...positive
2094European traffic grew nearly 30 % .positive
4452The period 's sales dropped to EUR30 .6 m from...negative
\n", + "

1573 rows × 2 columns

\n", + "
\n", + "
\n", + "\n", + "
\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "
\n", + "\n", + "\n", + "
\n", + " \n", + "\n", + "\n", + "\n", + " \n", + "
\n", + "
\n", + "
\n" + ] + }, + "metadata": {}, + "execution_count": 3 + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "0296Om2C5anY" + }, + "source": [ + "# 3. Train Deep Learning Classifier using nlu.load('train.sentiment')\n", + "\n", + "You dataset label column should be named 'y' and the feature column with text data should be named 'text'" + ] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 1000 + }, + "id": "3ZIPkRkWftBG", + "outputId": "cd7d4cb2-deba-4161-c04f-c93016fee93c" + }, + "source": [ + "from johnsnowlabs import nlp\n", + "from sklearn.metrics import classification_report\n", + "\n", + "# load a trainable pipeline by specifying the train. prefix and fit it on a datset with label and text columns\n", + "# by default the Universal Sentence Encoder (USE) Sentence embeddings are used for generation\n", + "trainable_pipe = nlp.load('train.sentiment')\n", + "fitted_pipe = trainable_pipe.fit(train_df.iloc[:50])\n", + "\n", + "# predict with the trainable pipeline on dataset and get predictions\n", + "preds = fitted_pipe.predict(train_df.iloc[:50],output_level='document')\n", + "#sentence detector that is part of the pipe generates sone NaNs. lets drop them first\n", + "preds.dropna(inplace=True)\n", + "print(classification_report(preds['y'], preds['sentiment']))\n", + "\n", + "preds" + ], + "execution_count": 4, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Warning::Spark Session already created, some configs may not take.\n", + "sent_small_bert_L2_128 download started this may take some time.\n", + "Approximate size to download 16.1 MB\n", + "[OK!]\n", + " precision recall f1-score support\n", + "\n", + " negative 0.00 0.00 0.00 17\n", + " positive 0.66 1.00 0.80 33\n", + "\n", + " accuracy 0.66 50\n", + " macro avg 0.33 0.50 0.40 50\n", + "weighted avg 0.44 0.66 0.52 50\n", + "\n" + ] + }, + { + "output_type": "execute_result", + "data": { + "text/plain": [ + " document \\\n", + "0 The OMX Nordic 40 OMXN40 index , comprising th... \n", + "1 Dubai Nokia has announced the launch of `` Com... \n", + "2 credit 20 November 2009 - Finnish glass techno... \n", + "3 HELSINKI AFX - Outokumpu said its technology u... \n", + "4 Helsingin Uutiset , Vantaan Sanomat and Lansiv... \n", + "5 Operating profit totaled EUR 5.5 mn , up from ... \n", + "6 Excluding non-recurring items , pre-tax profit... \n", + "7 1 February 2011 - Finnish textile and clothing... \n", + "8 `` There 's the issue of thieves stealing them... \n", + "9 Estonian telecoms company Elisa 's customer nu... \n", + "10 Net sales for the financial year 2006 are expe... \n", + "11 55 workers in +_m+_l will be affected by the c... \n", + "12 The Helsinki-based company , which also owns t... \n", + "13 YIT lodged counter claims against Neste Oil to... \n", + "14 Kaido Kaare , general director for Atria Eesti... \n", + "15 Mobile phone shipments jumped 26 percent to al... \n", + "16 `` After this purchase , Cramo will become the... \n", + "17 The court found TelecomInvest 's arguments con... \n", + "18 Operating profit for 2009 lower than outlook p... \n", + "19 Vanhanen said the strike would be `` extremely... \n", + "20 Construction volumes meanwhile grow at a rate ... \n", + "21 Operating profit for the six-month period decr... \n", + "22 Raisio 's malting capacity was in full use in ... \n", + "23 Both operating profit and turnover for the six... \n", + "24 Our superior customer centricity and expertise... \n", + "25 Commission income rose by 25.7 % to EUR 16.1 m... \n", + "26 The personnel reduction will be carried out in... \n", + "27 The result will also be burdened by increased ... \n", + "28 Employees are also better prepared to answer c... \n", + "29 It generated an operating loss of EUR 96.3 mn ... \n", + "30 In addition , the company will reduce a maximu... \n", + "31 Forestries were also higher , driven by yester... \n", + "32 In the second quarter of 2010 , the group 's n... \n", + "33 It is a solid credit that has been compared to... \n", + "34 He said he has been losing five families a mon... \n", + "35 In Finland , media group Talentum will start p... \n", + "36 Finnish pharmaceuticals company Orion 's net s... \n", + "37 `` The margarine business has been put into go... \n", + "38 Operating profit excluding non-recurring items... \n", + "39 MD Henning Bahr of Stockmann Gruppen praises t... \n", + "40 Based on the first quarter result , existing o... \n", + "41 Both operating profit and net sales for the 12... \n", + "42 In Sweden , operating profit for the period un... \n", + "43 To our members and partners , the use of IT wi... \n", + "44 Of the sales price , a sales gain of some 3.1 ... \n", + "45 It is a disappointment to see the plan folded . \n", + "46 Progress Group , QPR 's representative in Saud... \n", + "47 The new agreement , which expands a long-estab... \n", + "48 With CapMan as a partner , we will be able to ... \n", + "49 `` Overall , we 're pleased with the startup c... \n", + "\n", + " sentence_embedding_small_bert_L2_128 sentiment \\\n", + "0 [-0.5881205201148987, 0.19063492119312286, -0.... positive \n", + "1 [-0.37779635190963745, -0.20781250298023224, -... positive \n", + "2 [-0.4517509937286377, 0.6735780239105225, -0.2... positive \n", + "3 [-0.10504205524921417, 0.31528422236442566, -0... positive \n", + "4 [-1.087294101715088, -0.1457926332950592, -0.1... positive \n", + "5 [-0.643149197101593, -0.04868743568658829, -0.... positive \n", + "6 [-0.7197213172912598, 0.31680017709732056, -0.... positive \n", + "7 [-0.31616416573524475, 0.5464960336685181, -0.... positive \n", + "8 [-1.2100399732589722, 0.25674229860305786, 0.3... positive \n", + "9 [-0.3009508550167084, 0.6154500842094421, -0.4... positive \n", + "10 [-0.7339814305305481, 0.9638439416885376, -0.6... positive \n", + "11 [-1.243334174156189, 0.8785222172737122, -0.93... positive \n", + "12 [-0.7551414370536804, 0.16214342415332794, -0.... positive \n", + "13 [-1.143906831741333, 1.0500915050506592, -0.84... positive \n", + "14 [-0.9822889566421509, 0.27106359601020813, -0.... positive \n", + "15 [-0.46120399236679077, 0.09638205915689468, -0... positive \n", + "16 [-0.7024871706962585, 0.37345775961875916, -0.... positive \n", + "17 [-0.8505982756614685, -0.07158830016851425, 0.... positive \n", + "18 [-0.6575804352760315, 0.68410724401474, -0.230... positive \n", + "19 [-0.7677791714668274, -0.44950076937675476, -0... positive \n", + "20 [-1.4539079666137695, 0.1873081475496292, -0.8... positive \n", + "21 [-1.0161586999893188, 0.548879861831665, -0.86... positive \n", + "22 [-1.2556798458099365, 0.37126457691192627, -1.... positive \n", + "23 [-0.8761054873466492, 0.2913503050804138, -0.8... positive \n", + "24 [-0.11308443546295166, 0.5551179647445679, -0.... positive \n", + "25 [-0.7847265601158142, 0.2198852002620697, -0.5... positive \n", + "26 [-0.8359718918800354, -0.18021883070468903, -0... positive \n", + "27 [-0.6881139278411865, 1.2389051914215088, -1.0... positive \n", + "28 [-1.3386954069137573, 0.24523791670799255, -0.... positive \n", + "29 [-0.7223557829856873, 0.23957425355911255, -0.... positive \n", + "30 [-0.9004239439964294, 1.6903105974197388, -0.9... positive \n", + "31 [-0.9628726840019226, 0.23581582307815552, 0.2... positive \n", + "32 [-0.9420221447944641, 0.34946343302726746, -0.... positive \n", + "33 [-0.0682043731212616, 0.5560981035232544, -0.8... positive \n", + "34 [-1.1294713020324707, 0.507931113243103, -0.73... positive \n", + "35 [-0.6348045468330383, 0.3473186492919922, -0.2... positive \n", + "36 [-0.8268173933029175, 0.19876690208911896, -0.... positive \n", + "37 [-0.6286064386367798, 0.48110127449035645, -0.... positive \n", + "38 [-0.7780808210372925, 0.021108699962496758, -0... positive \n", + "39 [-0.39700981974601746, 0.9596268534660339, -0.... positive \n", + "40 [-0.7781174182891846, 0.9358287453651428, -1.0... positive \n", + "41 [-0.7753643989562988, 0.8645752668380737, -0.6... positive \n", + "42 [-0.8275543451309204, 0.10950104892253876, -0.... positive \n", + "43 [-0.798611581325531, 0.7145741581916809, -0.40... positive \n", + "44 [-0.8446655869483948, 0.8184226751327515, -0.3... positive \n", + "45 [-1.0249158143997192, 0.8160240054130554, 0.03... positive \n", + "46 [-0.17222441732883453, 0.3021131455898285, -0.... positive \n", + "47 [-0.5851113796234131, 0.6877164244651794, -0.6... positive \n", + "48 [-0.2812011241912842, 1.1173006296157837, -0.3... positive \n", + "49 [-0.7001730799674988, 0.15320643782615662, 0.3... positive \n", + "\n", + " sentiment_confidence text \\\n", + "0 7.0 The OMX Nordic 40 OMXN40 index , comprising th... \n", + "1 2.0 Dubai Nokia has announced the launch of `` Com... \n", + "2 5.0 credit 20 November 2009 - Finnish glass techno... \n", + "3 1.0 HELSINKI AFX - Outokumpu said its technology u... \n", + "4 2.0 Helsingin Uutiset , Vantaan Sanomat and Lansiv... \n", + "5 1.0 Operating profit totaled EUR 5.5 mn , up from ... \n", + "6 5.0 Excluding non-recurring items , pre-tax profit... \n", + "7 8.0 1 February 2011 - Finnish textile and clothing... \n", + "8 6.0 `` There 's the issue of thieves stealing them... \n", + "9 6.0 Estonian telecoms company Elisa 's customer nu... \n", + "10 3.0 Net sales for the financial year 2006 are expe... \n", + "11 3.0 55 workers in +_m+_l will be affected by the c... \n", + "12 1.0 The Helsinki-based company , which also owns t... \n", + "13 1.0 YIT lodged counter claims against Neste Oil to... \n", + "14 4.0 Kaido Kaare , general director for Atria Eesti... \n", + "15 2.0 Mobile phone shipments jumped 26 percent to al... \n", + "16 3.0 `` After this purchase , Cramo will become the... \n", + "17 2.0 The court found TelecomInvest 's arguments con... \n", + "18 7.0 Operating profit for 2009 lower than outlook p... \n", + "19 4.0 Vanhanen said the strike would be `` extremely... \n", + "20 8.0 Construction volumes meanwhile grow at a rate ... \n", + "21 2.0 Operating profit for the six-month period decr... \n", + "22 9.0 Raisio 's malting capacity was in full use in ... \n", + "23 5.0 Both operating profit and turnover for the six... \n", + "24 3.0 Our superior customer centricity and expertise... \n", + "25 6.0 Commission income rose by 25.7 % to EUR 16.1 m... \n", + "26 8.0 The personnel reduction will be carried out in... \n", + "27 9.0 The result will also be burdened by increased ... \n", + "28 2.0 Employees are also better prepared to answer c... \n", + "29 2.0 It generated an operating loss of EUR 96.3 mn ... \n", + "30 2.0 In addition , the company will reduce a maximu... \n", + "31 4.0 Forestries were also higher , driven by yester... \n", + "32 3.0 In the second quarter of 2010 , the group 's n... \n", + "33 2.0 It is a solid credit that has been compared to... \n", + "34 9.0 He said he has been losing five families a mon... \n", + "35 3.0 In Finland , media group Talentum will start p... \n", + "36 1.0 Finnish pharmaceuticals company Orion 's net s... \n", + "37 2.0 `` The margarine business has been put into go... \n", + "38 2.0 Operating profit excluding non-recurring items... \n", + "39 1.0 MD Henning Bahr of Stockmann Gruppen praises t... \n", + "40 9.0 Based on the first quarter result , existing o... \n", + "41 3.0 Both operating profit and net sales for the 12... \n", + "42 3.0 In Sweden , operating profit for the period un... \n", + "43 3.0 To our members and partners , the use of IT wi... \n", + "44 1.0 Of the sales price , a sales gain of some 3.1 ... \n", + "45 1.0 It is a disappointment to see the plan folded . \n", + "46 9.0 Progress Group , QPR 's representative in Saud... \n", + "47 9.0 The new agreement , which expands a long-estab... \n", + "48 4.0 With CapMan as a partner , we will be able to ... \n", + "49 2.0 `` Overall , we 're pleased with the startup c... \n", + "\n", + " y \n", + "0 negative \n", + "1 positive \n", + "2 positive \n", + "3 positive \n", + "4 positive \n", + "5 positive \n", + "6 positive \n", + "7 positive \n", + "8 negative \n", + "9 positive \n", + "10 negative \n", + "11 negative \n", + "12 positive \n", + "13 negative \n", + "14 positive \n", + "15 positive \n", + "16 positive \n", + "17 positive \n", + "18 negative \n", + "19 negative \n", + "20 positive \n", + "21 negative \n", + "22 positive \n", + "23 positive \n", + "24 positive \n", + "25 positive \n", + "26 negative \n", + "27 negative \n", + "28 positive \n", + "29 negative \n", + "30 negative \n", + "31 positive \n", + "32 positive \n", + "33 positive \n", + "34 negative \n", + "35 negative \n", + "36 positive \n", + "37 positive \n", + "38 negative \n", + "39 positive \n", + "40 negative \n", + "41 positive \n", + "42 positive \n", + "43 positive \n", + "44 positive \n", + "45 negative \n", + "46 positive \n", + "47 positive \n", + "48 positive \n", + "49 positive " + ], + "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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + "
documentsentence_embedding_small_bert_L2_128sentimentsentiment_confidencetexty
0The OMX Nordic 40 OMXN40 index , comprising th...[-0.5881205201148987, 0.19063492119312286, -0....positive7.0The OMX Nordic 40 OMXN40 index , comprising th...negative
1Dubai Nokia has announced the launch of `` Com...[-0.37779635190963745, -0.20781250298023224, -...positive2.0Dubai Nokia has announced the launch of `` Com...positive
2credit 20 November 2009 - Finnish glass techno...[-0.4517509937286377, 0.6735780239105225, -0.2...positive5.0credit 20 November 2009 - Finnish glass techno...positive
3HELSINKI AFX - Outokumpu said its technology u...[-0.10504205524921417, 0.31528422236442566, -0...positive1.0HELSINKI AFX - Outokumpu said its technology u...positive
4Helsingin Uutiset , Vantaan Sanomat and Lansiv...[-1.087294101715088, -0.1457926332950592, -0.1...positive2.0Helsingin Uutiset , Vantaan Sanomat and Lansiv...positive
5Operating profit totaled EUR 5.5 mn , up from ...[-0.643149197101593, -0.04868743568658829, -0....positive1.0Operating profit totaled EUR 5.5 mn , up from ...positive
6Excluding non-recurring items , pre-tax profit...[-0.7197213172912598, 0.31680017709732056, -0....positive5.0Excluding non-recurring items , pre-tax profit...positive
71 February 2011 - Finnish textile and clothing...[-0.31616416573524475, 0.5464960336685181, -0....positive8.01 February 2011 - Finnish textile and clothing...positive
8`` There 's the issue of thieves stealing them...[-1.2100399732589722, 0.25674229860305786, 0.3...positive6.0`` There 's the issue of thieves stealing them...negative
9Estonian telecoms company Elisa 's customer nu...[-0.3009508550167084, 0.6154500842094421, -0.4...positive6.0Estonian telecoms company Elisa 's customer nu...positive
10Net sales for the financial year 2006 are expe...[-0.7339814305305481, 0.9638439416885376, -0.6...positive3.0Net sales for the financial year 2006 are expe...negative
1155 workers in +_m+_l will be affected by the c...[-1.243334174156189, 0.8785222172737122, -0.93...positive3.055 workers in +_m+_l will be affected by the c...negative
12The Helsinki-based company , which also owns t...[-0.7551414370536804, 0.16214342415332794, -0....positive1.0The Helsinki-based company , which also owns t...positive
13YIT lodged counter claims against Neste Oil to...[-1.143906831741333, 1.0500915050506592, -0.84...positive1.0YIT lodged counter claims against Neste Oil to...negative
14Kaido Kaare , general director for Atria Eesti...[-0.9822889566421509, 0.27106359601020813, -0....positive4.0Kaido Kaare , general director for Atria Eesti...positive
15Mobile phone shipments jumped 26 percent to al...[-0.46120399236679077, 0.09638205915689468, -0...positive2.0Mobile phone shipments jumped 26 percent to al...positive
16`` After this purchase , Cramo will become the...[-0.7024871706962585, 0.37345775961875916, -0....positive3.0`` After this purchase , Cramo will become the...positive
17The court found TelecomInvest 's arguments con...[-0.8505982756614685, -0.07158830016851425, 0....positive2.0The court found TelecomInvest 's arguments con...positive
18Operating profit for 2009 lower than outlook p...[-0.6575804352760315, 0.68410724401474, -0.230...positive7.0Operating profit for 2009 lower than outlook p...negative
19Vanhanen said the strike would be `` extremely...[-0.7677791714668274, -0.44950076937675476, -0...positive4.0Vanhanen said the strike would be `` extremely...negative
20Construction volumes meanwhile grow at a rate ...[-1.4539079666137695, 0.1873081475496292, -0.8...positive8.0Construction volumes meanwhile grow at a rate ...positive
21Operating profit for the six-month period decr...[-1.0161586999893188, 0.548879861831665, -0.86...positive2.0Operating profit for the six-month period decr...negative
22Raisio 's malting capacity was in full use in ...[-1.2556798458099365, 0.37126457691192627, -1....positive9.0Raisio 's malting capacity was in full use in ...positive
23Both operating profit and turnover for the six...[-0.8761054873466492, 0.2913503050804138, -0.8...positive5.0Both operating profit and turnover for the six...positive
24Our superior customer centricity and expertise...[-0.11308443546295166, 0.5551179647445679, -0....positive3.0Our superior customer centricity and expertise...positive
25Commission income rose by 25.7 % to EUR 16.1 m...[-0.7847265601158142, 0.2198852002620697, -0.5...positive6.0Commission income rose by 25.7 % to EUR 16.1 m...positive
26The personnel reduction will be carried out in...[-0.8359718918800354, -0.18021883070468903, -0...positive8.0The personnel reduction will be carried out in...negative
27The result will also be burdened by increased ...[-0.6881139278411865, 1.2389051914215088, -1.0...positive9.0The result will also be burdened by increased ...negative
28Employees are also better prepared to answer c...[-1.3386954069137573, 0.24523791670799255, -0....positive2.0Employees are also better prepared to answer c...positive
29It generated an operating loss of EUR 96.3 mn ...[-0.7223557829856873, 0.23957425355911255, -0....positive2.0It generated an operating loss of EUR 96.3 mn ...negative
30In addition , the company will reduce a maximu...[-0.9004239439964294, 1.6903105974197388, -0.9...positive2.0In addition , the company will reduce a maximu...negative
31Forestries were also higher , driven by yester...[-0.9628726840019226, 0.23581582307815552, 0.2...positive4.0Forestries were also higher , driven by yester...positive
32In the second quarter of 2010 , the group 's n...[-0.9420221447944641, 0.34946343302726746, -0....positive3.0In the second quarter of 2010 , the group 's n...positive
33It is a solid credit that has been compared to...[-0.0682043731212616, 0.5560981035232544, -0.8...positive2.0It is a solid credit that has been compared to...positive
34He said he has been losing five families a mon...[-1.1294713020324707, 0.507931113243103, -0.73...positive9.0He said he has been losing five families a mon...negative
35In Finland , media group Talentum will start p...[-0.6348045468330383, 0.3473186492919922, -0.2...positive3.0In Finland , media group Talentum will start p...negative
36Finnish pharmaceuticals company Orion 's net s...[-0.8268173933029175, 0.19876690208911896, -0....positive1.0Finnish pharmaceuticals company Orion 's net s...positive
37`` The margarine business has been put into go...[-0.6286064386367798, 0.48110127449035645, -0....positive2.0`` The margarine business has been put into go...positive
38Operating profit excluding non-recurring items...[-0.7780808210372925, 0.021108699962496758, -0...positive2.0Operating profit excluding non-recurring items...negative
39MD Henning Bahr of Stockmann Gruppen praises t...[-0.39700981974601746, 0.9596268534660339, -0....positive1.0MD Henning Bahr of Stockmann Gruppen praises t...positive
40Based on the first quarter result , existing o...[-0.7781174182891846, 0.9358287453651428, -1.0...positive9.0Based on the first quarter result , existing o...negative
41Both operating profit and net sales for the 12...[-0.7753643989562988, 0.8645752668380737, -0.6...positive3.0Both operating profit and net sales for the 12...positive
42In Sweden , operating profit for the period un...[-0.8275543451309204, 0.10950104892253876, -0....positive3.0In Sweden , operating profit for the period un...positive
43To our members and partners , the use of IT wi...[-0.798611581325531, 0.7145741581916809, -0.40...positive3.0To our members and partners , the use of IT wi...positive
44Of the sales price , a sales gain of some 3.1 ...[-0.8446655869483948, 0.8184226751327515, -0.3...positive1.0Of the sales price , a sales gain of some 3.1 ...positive
45It is a disappointment to see the plan folded .[-1.0249158143997192, 0.8160240054130554, 0.03...positive1.0It is a disappointment to see the plan folded .negative
46Progress Group , QPR 's representative in Saud...[-0.17222441732883453, 0.3021131455898285, -0....positive9.0Progress Group , QPR 's representative in Saud...positive
47The new agreement , which expands a long-estab...[-0.5851113796234131, 0.6877164244651794, -0.6...positive9.0The new agreement , which expands a long-estab...positive
48With CapMan as a partner , we will be able to ...[-0.2812011241912842, 1.1173006296157837, -0.3...positive4.0With CapMan as a partner , we will be able to ...positive
49`` Overall , we 're pleased with the startup c...[-0.7001730799674988, 0.15320643782615662, 0.3...positive2.0`` Overall , we 're pleased with the startup c...positive
\n", + "
\n", + "
\n", + "\n", + "
\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "
\n", + "\n", + "\n", + "
\n", + " \n", + "\n", + "\n", + "\n", + " \n", + "
\n", + "
\n", + "
\n" + ] + }, + "metadata": {}, + "execution_count": 4 + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "lVyOE2wV0fw_" + }, + "source": [ + "# 4. Test the fitted pipe on new example" + ] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 150 + }, + "id": "qdCUg2MR0PD2", + "outputId": "c19ba3ab-6cd4-472e-c800-0bdfd0d1c3c5" + }, + "source": [ + "fitted_pipe.predict('According to the most recent update there has been a major decrese in the rate of oil')" + ], + "execution_count": 5, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "sentence_detector_dl download started this may take some time.\n", + "Approximate size to download 354.6 KB\n", + "[OK!]\n", + "Warning::Spark Session already created, some configs may not take.\n" + ] + }, + { + "output_type": "execute_result", + "data": { + "text/plain": [ + " sentence \\\n", + "0 According to the most recent update there has ... \n", + "\n", + " sentence_embedding_small_bert_L2_128 sentiment \\\n", + "0 [-0.9835950136184692, 0.07015661895275116, -0.... positive \n", + "\n", + " sentiment_confidence \n", + "0 1.0 " + ], + "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", + "
sentencesentence_embedding_small_bert_L2_128sentimentsentiment_confidence
0According to the most recent update there has ...[-0.9835950136184692, 0.07015661895275116, -0....positive1.0
\n", + "
\n", + "
\n", + "\n", + "
\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "
\n", + "\n", + "
\n", + "
\n" + ] + }, + "metadata": {}, + "execution_count": 5 + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "xflpwrVjjBVD" + }, + "source": [ + "## 5. Configure pipe training parameters" + ] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "UtsAUGTmOTms", + "outputId": "e5c0181c-13c7-4bd9-9270-4fbbd2cc1ea6" + }, + "source": [ + "trainable_pipe.print_info()" + ], + "execution_count": 6, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "The following parameters are configurable for this NLU pipeline (You can copy paste the examples) :\n", + ">>> component_list['bert_sentence_embeddings@sent_small_bert_L2_128'] has settable params:\n", + "component_list['bert_sentence_embeddings@sent_small_bert_L2_128'].setBatchSize(8) | Info: Size of every batch | Currently set to : 8\n", + "component_list['bert_sentence_embeddings@sent_small_bert_L2_128'].setEngine('tensorflow') | Info: Deep Learning engine used for this model | Currently set to : tensorflow\n", + "component_list['bert_sentence_embeddings@sent_small_bert_L2_128'].setIsLong(False) | Info: Use Long type instead of Int type for inputs buffer - Some Bert models require Long instead of Int. | Currently set to : False\n", + "component_list['bert_sentence_embeddings@sent_small_bert_L2_128'].setMaxSentenceLength(128) | Info: Max sentence length to process | Currently set to : 128\n", + "component_list['bert_sentence_embeddings@sent_small_bert_L2_128'].setDimension(128) | Info: Number of embedding dimensions | Currently set to : 128\n", + "component_list['bert_sentence_embeddings@sent_small_bert_L2_128'].setCaseSensitive(False) | Info: whether to ignore case in tokens for embeddings matching | Currently set to : False\n", + "component_list['bert_sentence_embeddings@sent_small_bert_L2_128'].setStorageRef('sent_small_bert_L2_128') | Info: unique reference name for identification | Currently set to : sent_small_bert_L2_128\n", + ">>> component_list['document_assembler'] has settable params:\n", + "component_list['document_assembler'].setCleanupMode('shrink') | Info: possible values: disabled, inplace, inplace_full, shrink, shrink_full, each, each_full, delete_full | Currently set to : shrink\n", + ">>> component_list['sentiment_dl@sent_small_bert_L2_128'] has settable params:\n", + "component_list['sentiment_dl@sent_small_bert_L2_128'].setEngine('tensorflow') | Info: Deep Learning engine used for this model | Currently set to : tensorflow\n", + "component_list['sentiment_dl@sent_small_bert_L2_128'].setThreshold(0.6) | Info: The minimum threshold for the final result otheriwse it will be neutral | Currently set to : 0.6\n", + "component_list['sentiment_dl@sent_small_bert_L2_128'].setThresholdLabel('neutral') | Info: In case the score is less than threshold, what should be the label. Default is neutral. | Currently set to : neutral\n", + "component_list['sentiment_dl@sent_small_bert_L2_128'].setStorageRef('sent_small_bert_L2_128') | Info: unique reference name for identification | Currently set to : sent_small_bert_L2_128\n" + ] + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "2GJdDNV9jEIe" + }, + "source": [ + "## 6. Retrain with new parameters" + ] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 719 + }, + "id": "mptfvHx-MMMX", + "outputId": "71701494-c69a-4ea6-a803-677b18ebaffd" + }, + "source": [ + "# Train longer!\n", + "trainable_pipe = nlp.load('train.sentiment')\n", + "trainable_pipe['trainable_sentiment_dl'].setMaxEpochs(5)\n", + "fitted_pipe = trainable_pipe.fit(train_df.iloc[:100])\n", + "# predict with the trainable pipeline on dataset and get predictions\n", + "preds = fitted_pipe.predict(train_df.iloc[:100],output_level='document')\n", + "\n", + "#sentence detector that is part of the pipe generates sone NaNs. lets drop them first\n", + "preds.dropna(inplace=True)\n", + "print(classification_report(preds['y'], preds['sentiment']))\n", + "\n", + "preds" + ], + "execution_count": 7, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Warning::Spark Session already created, some configs may not take.\n", + "Warning::Spark Session already created, some configs may not take.\n", + "sent_small_bert_L2_128 download started this may take some time.\n", + "Approximate size to download 16.1 MB\n", + "[OK!]\n", + " precision recall f1-score support\n", + "\n", + " negative 0.00 0.00 0.00 30\n", + " positive 0.70 1.00 0.82 70\n", + "\n", + " accuracy 0.70 100\n", + " macro avg 0.35 0.50 0.41 100\n", + "weighted avg 0.49 0.70 0.58 100\n", + "\n" + ] + }, + { + "output_type": "execute_result", + "data": { + "text/plain": [ + " document \\\n", + "0 The OMX Nordic 40 OMXN40 index , comprising th... \n", + "1 Dubai Nokia has announced the launch of `` Com... \n", + "2 credit 20 November 2009 - Finnish glass techno... \n", + "3 HELSINKI AFX - Outokumpu said its technology u... \n", + "4 Helsingin Uutiset , Vantaan Sanomat and Lansiv... \n", + ".. ... \n", + "95 Ruukki Group calculates that it has lost EUR 4... \n", + "96 This is the second successful effort for the f... \n", + "97 For the first nine months of 2010 , Talvivaara... \n", + "98 Nordea sees a return to positive growth for th... \n", + "99 In the third quarter , net sales increased by ... \n", + "\n", + " sentence_embedding_small_bert_L2_128 sentiment \\\n", + "0 [-0.5881205201148987, 0.19063492119312286, -0.... positive \n", + "1 [-0.37779635190963745, -0.20781250298023224, -... positive \n", + "2 [-0.4517509937286377, 0.6735780239105225, -0.2... positive \n", + "3 [-0.10504205524921417, 0.31528422236442566, -0... positive \n", + "4 [-1.087294101715088, -0.1457926332950592, -0.1... positive \n", + ".. ... ... \n", + "95 [-1.1240153312683105, 0.029101694002747536, -0... positive \n", + "96 [-1.0914063453674316, 0.636502742767334, -0.13... positive \n", + "97 [-1.4264403581619263, -0.3568509817123413, -0.... positive \n", + "98 [-0.5386144518852234, -0.5268656611442566, -0.... positive \n", + "99 [-0.8460788726806641, 0.5203403830528259, -0.8... positive \n", + "\n", + " sentiment_confidence text \\\n", + "0 1.0 The OMX Nordic 40 OMXN40 index , comprising th... \n", + "1 1.0 Dubai Nokia has announced the launch of `` Com... \n", + "2 1.0 credit 20 November 2009 - Finnish glass techno... \n", + "3 1.0 HELSINKI AFX - Outokumpu said its technology u... \n", + "4 1.0 Helsingin Uutiset , Vantaan Sanomat and Lansiv... \n", + ".. ... ... \n", + "95 1.0 Ruukki Group calculates that it has lost EUR 4... \n", + "96 1.0 This is the second successful effort for the f... \n", + "97 1.0 For the first nine months of 2010 , Talvivaara... \n", + "98 1.0 Nordea sees a return to positive growth for th... \n", + "99 1.0 In the third quarter , net sales increased by ... \n", + "\n", + " y \n", + "0 negative \n", + "1 positive \n", + "2 positive \n", + "3 positive \n", + "4 positive \n", + ".. ... \n", + "95 negative \n", + "96 positive \n", + "97 positive \n", + "98 positive \n", + "99 positive \n", + "\n", + "[100 rows x 6 columns]" + ], + "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", + " \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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
documentsentence_embedding_small_bert_L2_128sentimentsentiment_confidencetexty
0The OMX Nordic 40 OMXN40 index , comprising th...[-0.5881205201148987, 0.19063492119312286, -0....positive1.0The OMX Nordic 40 OMXN40 index , comprising th...negative
1Dubai Nokia has announced the launch of `` Com...[-0.37779635190963745, -0.20781250298023224, -...positive1.0Dubai Nokia has announced the launch of `` Com...positive
2credit 20 November 2009 - Finnish glass techno...[-0.4517509937286377, 0.6735780239105225, -0.2...positive1.0credit 20 November 2009 - Finnish glass techno...positive
3HELSINKI AFX - Outokumpu said its technology u...[-0.10504205524921417, 0.31528422236442566, -0...positive1.0HELSINKI AFX - Outokumpu said its technology u...positive
4Helsingin Uutiset , Vantaan Sanomat and Lansiv...[-1.087294101715088, -0.1457926332950592, -0.1...positive1.0Helsingin Uutiset , Vantaan Sanomat and Lansiv...positive
.....................
95Ruukki Group calculates that it has lost EUR 4...[-1.1240153312683105, 0.029101694002747536, -0...positive1.0Ruukki Group calculates that it has lost EUR 4...negative
96This is the second successful effort for the f...[-1.0914063453674316, 0.636502742767334, -0.13...positive1.0This is the second successful effort for the f...positive
97For the first nine months of 2010 , Talvivaara...[-1.4264403581619263, -0.3568509817123413, -0....positive1.0For the first nine months of 2010 , Talvivaara...positive
98Nordea sees a return to positive growth for th...[-0.5386144518852234, -0.5268656611442566, -0....positive1.0Nordea sees a return to positive growth for th...positive
99In the third quarter , net sales increased by ...[-0.8460788726806641, 0.5203403830528259, -0.8...positive1.0In the third quarter , net sales increased by ...positive
\n", + "

100 rows × 6 columns

\n", + "
\n", + "
\n", + "\n", + "
\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "
\n", + "\n", + "\n", + "
\n", + " \n", + "\n", + "\n", + "\n", + " \n", + "
\n", + "
\n", + "
\n" + ] + }, + "metadata": {}, + "execution_count": 7 + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "qFoT-s1MjTSS" + }, + "source": [ + "#7. Try training with different Embeddings" + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "nxWFzQOhjWC8", + "colab": { + "base_uri": "https://localhost:8080/" + }, + "outputId": "fae0ba7b-3630-493e-f3ed-74e126ab96d2" + }, + "source": [ + "# We can use nlu.print_components(action='embed_sentence') to see every possibler sentence embedding we could use. Lets use bert!\n", + "nlp.nlu.print_components(action='embed_sentence')" + ], + "execution_count": 8, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "For language NLU provides the following Models : \n", + "nlu.load('am.embed_sentence.xlm_roberta') returns Spark NLP model_anno_obj sent_xlm_roberta_base_finetuned_amharic\n", + "For language NLU provides the following Models : \n", + "nlu.load('de.embed_sentence.bert.base_cased') returns Spark NLP model_anno_obj sent_bert_base_cased\n", + "For language NLU provides the following Models : \n", + "nlu.load('el.embed_sentence.bert.base_uncased') returns Spark NLP model_anno_obj sent_bert_base_uncased\n", + "For language NLU provides the following Models : \n", + "nlu.load('en.embed_sentence') returns Spark NLP model_anno_obj tfhub_use\n", + "nlu.load('en.embed_sentence.albert') returns Spark NLP model_anno_obj albert_base_uncased\n", + "nlu.load('en.embed_sentence.bert') returns Spark NLP model_anno_obj sent_bert_base_uncased\n", + "nlu.load('en.embed_sentence.bert.base_uncased_legal') returns Spark NLP model_anno_obj sent_bert_base_uncased_legal\n", + "nlu.load('en.embed_sentence.bert.finetuned') returns Spark NLP model_anno_obj sbert_setfit_finetuned_financial_text_classification\n", + "nlu.load('en.embed_sentence.bert.pubmed') returns Spark NLP model_anno_obj sent_bert_pubmed\n", + "nlu.load('en.embed_sentence.bert.pubmed_squad2') returns Spark NLP model_anno_obj sent_bert_pubmed_squad2\n", + "nlu.load('en.embed_sentence.bert.wiki_books') returns Spark NLP model_anno_obj sent_bert_wiki_books\n", + "nlu.load('en.embed_sentence.bert.wiki_books_mnli') returns Spark NLP model_anno_obj sent_bert_wiki_books_mnli\n", + "nlu.load('en.embed_sentence.bert.wiki_books_qnli') returns Spark NLP model_anno_obj sent_bert_wiki_books_qnli\n", + "nlu.load('en.embed_sentence.bert.wiki_books_qqp') returns Spark NLP model_anno_obj sent_bert_wiki_books_qqp\n", + "nlu.load('en.embed_sentence.bert.wiki_books_squad2') returns Spark NLP model_anno_obj sent_bert_wiki_books_squad2\n", + "nlu.load('en.embed_sentence.bert.wiki_books_sst2') returns Spark NLP model_anno_obj sent_bert_wiki_books_sst2\n", + "nlu.load('en.embed_sentence.bert_base_cased') returns Spark NLP model_anno_obj sent_bert_base_cased\n", + "nlu.load('en.embed_sentence.bert_base_uncased') returns Spark NLP model_anno_obj sent_bert_base_uncased\n", + "nlu.load('en.embed_sentence.bert_large_cased') returns Spark NLP model_anno_obj sent_bert_large_cased\n", + "nlu.load('en.embed_sentence.bert_large_uncased') returns Spark NLP model_anno_obj sent_bert_large_uncased\n", + "nlu.load('en.embed_sentence.bert_use_cmlm_en_base') returns Spark NLP model_anno_obj sent_bert_use_cmlm_en_base\n", + "nlu.load('en.embed_sentence.bert_use_cmlm_en_large') returns Spark NLP model_anno_obj sent_bert_use_cmlm_en_large\n", + "nlu.load('en.embed_sentence.biobert.clinical_base_cased') returns Spark NLP model_anno_obj sent_biobert_clinical_base_cased\n", + "nlu.load('en.embed_sentence.biobert.discharge_base_cased') returns Spark NLP model_anno_obj sent_biobert_discharge_base_cased\n", + "nlu.load('en.embed_sentence.biobert.pmc_base_cased') returns Spark NLP model_anno_obj sent_biobert_pmc_base_cased\n", + "nlu.load('en.embed_sentence.biobert.pubmed_base_cased') returns Spark NLP model_anno_obj sent_biobert_pubmed_base_cased\n", + "nlu.load('en.embed_sentence.biobert.pubmed_large_cased') returns Spark NLP model_anno_obj sent_biobert_pubmed_large_cased\n", + "nlu.load('en.embed_sentence.biobert.pubmed_pmc_base_cased') returns Spark NLP model_anno_obj sent_biobert_pubmed_pmc_base_cased\n", + "nlu.load('en.embed_sentence.covidbert.large_uncased') returns Spark NLP model_anno_obj sent_covidbert_large_uncased\n", + "nlu.load('en.embed_sentence.distil_roberta.distilled_base') returns Spark NLP model_anno_obj sent_distilroberta_base\n", + "nlu.load('en.embed_sentence.doc2vec') returns Spark NLP model_anno_obj doc2vec_gigaword_300\n", + "nlu.load('en.embed_sentence.doc2vec.gigaword_300') returns Spark NLP model_anno_obj doc2vec_gigaword_300\n", + "nlu.load('en.embed_sentence.doc2vec.gigaword_wiki_300') returns Spark NLP model_anno_obj doc2vec_gigaword_wiki_300\n", + "nlu.load('en.embed_sentence.electra') returns Spark NLP model_anno_obj sent_electra_small_uncased\n", + "nlu.load('en.embed_sentence.electra_base_uncased') returns Spark NLP model_anno_obj sent_electra_base_uncased\n", + "nlu.load('en.embed_sentence.electra_large_uncased') returns Spark NLP model_anno_obj sent_electra_large_uncased\n", + "nlu.load('en.embed_sentence.electra_small_uncased') returns Spark NLP model_anno_obj sent_electra_small_uncased\n", + "nlu.load('en.embed_sentence.roberta.base') returns Spark NLP model_anno_obj sent_roberta_base\n", + "nlu.load('en.embed_sentence.roberta.large') returns Spark NLP model_anno_obj sent_roberta_large\n", + "nlu.load('en.embed_sentence.small_bert_L10_128') returns Spark NLP model_anno_obj sent_small_bert_L10_128\n", + "nlu.load('en.embed_sentence.small_bert_L10_256') returns Spark NLP model_anno_obj sent_small_bert_L10_256\n", + "nlu.load('en.embed_sentence.small_bert_L10_512') returns Spark NLP model_anno_obj sent_small_bert_L10_512\n", + "nlu.load('en.embed_sentence.small_bert_L10_768') returns Spark NLP model_anno_obj sent_small_bert_L10_768\n", + "nlu.load('en.embed_sentence.small_bert_L12_128') returns Spark NLP model_anno_obj sent_small_bert_L12_128\n", + "nlu.load('en.embed_sentence.small_bert_L12_256') returns Spark NLP model_anno_obj sent_small_bert_L12_256\n", + "nlu.load('en.embed_sentence.small_bert_L12_512') returns Spark NLP model_anno_obj sent_small_bert_L12_512\n", + "nlu.load('en.embed_sentence.small_bert_L12_768') returns Spark NLP model_anno_obj sent_small_bert_L12_768\n", + "nlu.load('en.embed_sentence.small_bert_L2_128') returns Spark NLP model_anno_obj sent_small_bert_L2_128\n", + "nlu.load('en.embed_sentence.small_bert_L2_256') returns Spark NLP model_anno_obj sent_small_bert_L2_256\n", + "nlu.load('en.embed_sentence.small_bert_L2_512') returns Spark NLP model_anno_obj sent_small_bert_L2_512\n", + "nlu.load('en.embed_sentence.small_bert_L2_768') returns Spark NLP model_anno_obj sent_small_bert_L2_768\n", + "nlu.load('en.embed_sentence.small_bert_L4_128') returns Spark NLP model_anno_obj sent_small_bert_L4_128\n", + "nlu.load('en.embed_sentence.small_bert_L4_256') returns Spark NLP model_anno_obj sent_small_bert_L4_256\n", + "nlu.load('en.embed_sentence.small_bert_L4_512') returns Spark NLP model_anno_obj sent_small_bert_L4_512\n", + "nlu.load('en.embed_sentence.small_bert_L4_768') returns Spark NLP model_anno_obj sent_small_bert_L4_768\n", + "nlu.load('en.embed_sentence.small_bert_L6_128') returns Spark NLP model_anno_obj sent_small_bert_L6_128\n", + "nlu.load('en.embed_sentence.small_bert_L6_256') returns Spark NLP model_anno_obj sent_small_bert_L6_256\n", + "nlu.load('en.embed_sentence.small_bert_L6_512') returns Spark NLP model_anno_obj sent_small_bert_L6_512\n", + "nlu.load('en.embed_sentence.small_bert_L6_768') returns Spark NLP model_anno_obj sent_small_bert_L6_768\n", + "nlu.load('en.embed_sentence.small_bert_L8_128') returns Spark NLP model_anno_obj sent_small_bert_L8_128\n", + "nlu.load('en.embed_sentence.small_bert_L8_256') returns Spark NLP model_anno_obj sent_small_bert_L8_256\n", + "nlu.load('en.embed_sentence.small_bert_L8_512') returns Spark NLP model_anno_obj sent_small_bert_L8_512\n", + "nlu.load('en.embed_sentence.small_bert_L8_768') returns Spark NLP model_anno_obj sent_small_bert_L8_768\n", + "nlu.load('en.embed_sentence.tfhub_use') returns Spark NLP model_anno_obj tfhub_use\n", + "nlu.load('en.embed_sentence.tfhub_use.lg') returns Spark NLP model_anno_obj tfhub_use_lg\n", + "nlu.load('en.embed_sentence.use') returns Spark NLP model_anno_obj tfhub_use\n", + "nlu.load('en.embed_sentence.use.lg') returns Spark NLP model_anno_obj tfhub_use_lg\n", + "For language NLU provides the following Models : \n", + "nlu.load('es.embed_sentence.bert.base_cased') returns Spark NLP model_anno_obj sent_bert_base_cased\n", + "nlu.load('es.embed_sentence.bert.base_uncased') returns Spark NLP model_anno_obj sent_bert_base_uncased\n", + "For language NLU provides the following Models : \n", + "nlu.load('fi.embed_sentence.bert') returns Spark NLP model_anno_obj bert_base_finnish_uncased\n", + "nlu.load('fi.embed_sentence.bert.cased') returns Spark NLP model_anno_obj bert_base_finnish_cased\n", + "nlu.load('fi.embed_sentence.bert.uncased') returns Spark NLP model_anno_obj bert_base_finnish_uncased\n", + "For language NLU provides the following Models : \n", + "nlu.load('ha.embed_sentence.xlm_roberta') returns Spark NLP model_anno_obj sent_xlm_roberta_base_finetuned_hausa\n", + "For language NLU provides the following Models : \n", + "nlu.load('ig.embed_sentence.xlm_roberta') returns Spark NLP model_anno_obj sent_xlm_roberta_base_finetuned_igbo\n", + "For language NLU provides the following Models : \n", + "nlu.load('lg.embed_sentence.xlm_roberta') returns Spark NLP model_anno_obj sent_xlm_roberta_base_finetuned_luganda\n", + "For language NLU provides the following Models : \n", + "nlu.load('nl.embed_sentence.bert.base_cased') returns Spark NLP model_anno_obj sent_bert_base_cased\n", + "For language NLU provides the following Models : \n", + "nlu.load('pcm.embed_sentence.xlm_roberta') returns Spark NLP model_anno_obj sent_xlm_roberta_base_finetuned_naija\n", + "For language NLU provides the following Models : \n", + "nlu.load('pt.embed_sentence.bert.base_legal') returns Spark NLP model_anno_obj sbert_legal_bertimbau_base_tsdae_sts\n", + "nlu.load('pt.embed_sentence.bert.cased_large_legal') returns Spark NLP model_anno_obj sbert_bert_large_portuguese_cased_legal_mlm_sts_v0.1\n", + "nlu.load('pt.embed_sentence.bert.large_legal') returns Spark NLP model_anno_obj sbert_legal_bertimbau_large_gpl_sts\n", + "nlu.load('pt.embed_sentence.bert.legal.cased_large_mlm_sts_v0.10.by_stjiris') returns Spark NLP model_anno_obj sbert_bert_large_portuguese_cased_legal_mlm_sts_v0.10\n", + "nlu.load('pt.embed_sentence.bert.legal.cased_large_mlm_sts_v0.2.by_stjiris') returns Spark NLP model_anno_obj sbert_bert_large_portuguese_cased_legal_mlm_sts_v0.2\n", + "nlu.load('pt.embed_sentence.bert.legal.cased_large_mlm_sts_v0.3.by_stjiris') returns Spark NLP model_anno_obj sbert_bert_large_portuguese_cased_legal_mlm_sts_v0.3\n", + "nlu.load('pt.embed_sentence.bert.legal.cased_large_mlm_sts_v0.4.by_stjiris') returns Spark NLP model_anno_obj sbert_bert_large_portuguese_cased_legal_mlm_sts_v0.4\n", + "nlu.load('pt.embed_sentence.bert.legal.cased_large_mlm_sts_v0.5.by_stjiris') returns Spark NLP model_anno_obj sbert_bert_large_portuguese_cased_legal_mlm_sts_v0.5\n", + "nlu.load('pt.embed_sentence.bert.legal.cased_large_mlm_sts_v0.7.by_stjiris') returns Spark NLP model_anno_obj sbert_bert_large_portuguese_cased_legal_mlm_sts_v0.7\n", + "nlu.load('pt.embed_sentence.bert.legal.cased_large_mlm_sts_v0.8.by_stjiris') returns Spark NLP model_anno_obj sbert_bert_large_portuguese_cased_legal_mlm_sts_v0.8\n", + "nlu.load('pt.embed_sentence.bert.legal.cased_large_mlm_sts_v0.9.by_stjiris') returns Spark NLP model_anno_obj sbert_bert_large_portuguese_cased_legal_mlm_sts_v0.9\n", + "nlu.load('pt.embed_sentence.bert.legal.cased_large_mlm_sts_v1.0.by_stjiris') returns Spark NLP model_anno_obj sbert_bert_large_portuguese_cased_legal_mlm_sts_v1.0\n", + "nlu.load('pt.embed_sentence.bert.legal.cased_large_mlm_v0.11_gpl_nli_sts_v0.by_stjiris') returns Spark NLP model_anno_obj sbert_bert_large_portuguese_cased_legal_mlm_v0.11_gpl_nli_sts_v0\n", + "nlu.load('pt.embed_sentence.bert.legal.cased_large_mlm_v0.11_gpl_nli_sts_v1.by_stjiris') returns Spark NLP model_anno_obj sbert_bert_large_portuguese_cased_legal_mlm_v0.11_gpl_nli_sts_v1\n", + "nlu.load('pt.embed_sentence.bert.legal.cased_large_mlm_v0.11_nli_sts_v0.by_stjiris') returns Spark NLP model_anno_obj sbert_bert_large_portuguese_cased_legal_mlm_v0.11_nli_sts_v0\n", + "nlu.load('pt.embed_sentence.bert.legal.cased_large_mlm_v0.11_nli_sts_v1.by_stjiris') returns Spark NLP model_anno_obj sbert_bert_large_portuguese_cased_legal_mlm_v0.11_nli_sts_v1\n", + "nlu.load('pt.embed_sentence.bert.legal.cased_large_mlm_v0.11_sts_v0.by_stjiris') returns Spark NLP model_anno_obj sbert_bert_large_portuguese_cased_legal_mlm_v0.11_sts_v0\n", + "nlu.load('pt.embed_sentence.bert.legal.cased_large_mlm_v0.11_sts_v1.by_stjiris') returns Spark NLP model_anno_obj sbert_bert_large_portuguese_cased_legal_mlm_v0.11_sts_v1\n", + "nlu.load('pt.embed_sentence.bert.v2_base_legal') returns Spark NLP model_anno_obj sbert_legal_bertimbau_sts_base_ma_v2\n", + "nlu.load('pt.embed_sentence.bert.v2_large_legal') returns Spark NLP model_anno_obj sbert_legal_bertimbau_large_tsdae_sts_v2\n", + "nlu.load('pt.embed_sentence.bertimbau.legal.assin.base.by_rufimelo') returns Spark NLP model_anno_obj sbert_legal_bertimbau_sts_base_ma\n", + "nlu.load('pt.embed_sentence.bertimbau.legal.assin2.base.by_rufimelo') returns Spark NLP model_anno_obj sbert_legal_bertimbau_sts_base\n", + "nlu.load('pt.embed_sentence.bertimbau.legal.large_sts_by_rufimelo') returns Spark NLP model_anno_obj sbert_legal_bertimbau_sts_large\n", + "nlu.load('pt.embed_sentence.bertimbau.legal.large_sts_ma.by_rufimelo') returns Spark NLP model_anno_obj sbert_legal_bertimbau_sts_large_ma\n", + "nlu.load('pt.embed_sentence.bertimbau.legal.large_sts_ma_v3.by_rufimelo') returns Spark NLP model_anno_obj sbert_legal_bertimbau_sts_large_ma_v3\n", + "nlu.load('pt.embed_sentence.bertimbau.legal.large_tsdae_sts.by_rufimelo') returns Spark NLP model_anno_obj sbert_legal_bertimbau_large_tsdae_sts\n", + "nlu.load('pt.embed_sentence.bertimbau.legal.large_tsdae_sts_v4.by_rufimelo') returns Spark NLP model_anno_obj sbert_legal_bertimbau_large_tsdae_sts_v4\n", + "nlu.load('pt.embed_sentence.bertimbau.legal.large_tsdae_v4_gpl_sts.by_rufimelo') returns Spark NLP model_anno_obj sbert_legal_bertimbau_large_tsdae_v4_gpl_sts\n", + "nlu.load('pt.embed_sentence.bertimbau.legal.v2_large_sts_v2.by_rufimelo') returns Spark NLP model_anno_obj sbert_legal_bertimbau_sts_large_v2\n", + "nlu.load('pt.embed_sentence.bertimbau.legal.v2_large_v2_sts.by_rufimelo') returns Spark NLP model_anno_obj sbert_legal_bertimbau_large_v2_sts\n", + "For language NLU provides the following Models : \n", + "nlu.load('rw.embed_sentence.xlm_roberta') returns Spark NLP model_anno_obj sent_xlm_roberta_base_finetuned_kinyarwanda\n", + "For language NLU provides the following Models : \n", + "nlu.load('sv.embed_sentence.bert.base_cased') returns Spark NLP model_anno_obj sent_bert_base_cased\n", + "For language NLU provides the following Models : \n", + "nlu.load('sw.embed_sentence.xlm_roberta') returns Spark NLP model_anno_obj sent_xlm_roberta_base_finetuned_swahili\n", + "For language NLU provides the following Models : \n", + "nlu.load('wo.embed_sentence.xlm_roberta') returns Spark NLP model_anno_obj sent_xlm_roberta_base_finetuned_wolof\n", + "For language NLU provides the following Models : \n", + "nlu.load('xx.embed_sentence') returns Spark NLP model_anno_obj sent_bert_multi_cased\n", + "nlu.load('xx.embed_sentence.bert') returns Spark NLP model_anno_obj sent_bert_multi_cased\n", + "nlu.load('xx.embed_sentence.bert.cased') returns Spark NLP model_anno_obj sent_bert_multi_cased\n", + "nlu.load('xx.embed_sentence.bert.muril') returns Spark NLP model_anno_obj sent_bert_muril\n", + "nlu.load('xx.embed_sentence.bert_use_cmlm_multi_base') returns Spark NLP model_anno_obj sent_bert_use_cmlm_multi_base\n", + "nlu.load('xx.embed_sentence.bert_use_cmlm_multi_base_br') returns Spark NLP model_anno_obj sent_bert_use_cmlm_multi_base_br\n", + "nlu.load('xx.embed_sentence.labse') returns Spark NLP model_anno_obj labse\n", + "nlu.load('xx.embed_sentence.xlm_roberta.base') returns Spark NLP model_anno_obj sent_xlm_roberta_base\n", + "For language NLU provides the following Models : \n", + "nlu.load('yo.embed_sentence.xlm_roberta') returns Spark NLP model_anno_obj sent_xlm_roberta_base_finetuned_yoruba\n", + "For language NLU provides the following Models : \n", + "nlu.load('zh.embed_sentence.bert') returns Spark NLP model_anno_obj sbert_chinese_qmc_finance_v1\n", + "nlu.load('zh.embed_sentence.bert.distilled') returns Spark NLP model_anno_obj sbert_chinese_qmc_finance_v1_distill\n" + ] + } + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "IKK_Ii_gjJfF", + "colab": { + "base_uri": "https://localhost:8080/" + }, + "outputId": "7e528684-a7d5-431a-ca4b-626adf50a7e9" + }, + "source": [ + "trainable_pipe = nlp.load('en.embed_sentence.small_bert_L12_768 train.sentiment')\n", + "# We need to train longer and user smaller LR for NON-USE based sentence embeddings usually\n", + "# We could tune the hyperparameters further with hyperparameter tuning methods like gridsearch\n", + "# Also longer training gives more accuracy\n", + "trainable_pipe['trainable_sentiment_dl'].setMaxEpochs(70)\n", + "trainable_pipe['trainable_sentiment_dl'].setLr(0.0005)\n", + "fitted_pipe = trainable_pipe.fit(train_df)\n", + "# predict with the trainable pipeline on dataset and get predictions\n", + "preds = fitted_pipe.predict(train_df,output_level='document')\n", + "\n", + "#sentence detector that is part of the pipe generates sone NaNs. lets drop them first\n", + "preds.dropna(inplace=True)\n", + "print(classification_report(preds['y'], preds['sentiment']))\n", + "\n", + "#preds" + ], + "execution_count": 9, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Warning::Spark Session already created, some configs may not take.\n", + "Warning::Spark Session already created, some configs may not take.\n", + "sent_small_bert_L12_768 download started this may take some time.\n", + "Approximate size to download 392.9 MB\n", + "[OK!]\n", + " precision recall f1-score support\n", + "\n", + " negative 0.88 0.82 0.85 482\n", + " neutral 0.00 0.00 0.00 0\n", + " positive 0.96 0.92 0.94 1091\n", + "\n", + " accuracy 0.89 1573\n", + " macro avg 0.61 0.58 0.60 1573\n", + "weighted avg 0.94 0.89 0.91 1573\n", + "\n" + ] + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "_1jxw3GnVGlI" + }, + "source": [ + "# 7.1 evaluate on Test Data" + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "Fxx4yNkNVGFl", + "colab": { + "base_uri": "https://localhost:8080/" + }, + "outputId": "fdb96659-2395-48af-dd53-673b935bd767" + }, + "source": [ + "preds = fitted_pipe.predict(test_df,output_level='document')\n", + "\n", + "#sentence detector that is part of the pipe generates sone NaNs. lets drop them first\n", + "preds.dropna(inplace=True)\n", + "print(classification_report(preds['y'], preds['sentiment']))" + ], + "execution_count": 10, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + " precision recall f1-score support\n", + "\n", + " negative 0.81 0.75 0.78 122\n", + " neutral 0.00 0.00 0.00 0\n", + " positive 0.92 0.89 0.90 272\n", + "\n", + " accuracy 0.85 394\n", + " macro avg 0.58 0.55 0.56 394\n", + "weighted avg 0.88 0.85 0.86 394\n", + "\n" + ] + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "2BB-NwZUoHSe" + }, + "source": [ + "# 8. Lets save the model" + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "eLex095goHwm" + }, + "source": [ + "stored_model_path = './models/classifier_dl_trained'\n", + "fitted_pipe.save(stored_model_path)" + ], + "execution_count": 11, + "outputs": [] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "e_b2DPd4rCiU" + }, + "source": [ + "# 9. Lets load the model from HDD.\n", + "This makes Offlien NLU usage possible! \n", + "You need to call nlu.load(path=path_to_the_pipe) to load a model/pipeline from disk." + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "SO4uz45MoRgp", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 133 + }, + "outputId": "a59aec27-0b97-463f-a8a3-52de96bed3ee" + }, + "source": [ + "hdd_pipe = nlp.load(path=stored_model_path)\n", + "\n", + "preds = hdd_pipe.predict('According to the most recent update there has been a major decrese in the rate of oil')\n", + "preds" + ], + "execution_count": 12, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Warning::Spark Session already created, some configs may not take.\n", + "Warning::Spark Session already created, some configs may not take.\n", + "Warning::Spark Session already created, some configs may not take.\n" + ] + }, + { + "output_type": "execute_result", + "data": { + "text/plain": [ + " document \\\n", + "0 According to the most recent update there has ... \n", + "\n", + " sentence_embedding_from_disk sentiment \\\n", + "0 [-0.02168591320514679, 0.13073040544986725, 0.... negative \n", + "\n", + " sentiment_confidence \n", + "0 0.0 " + ], + "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", + "
documentsentence_embedding_from_disksentimentsentiment_confidence
0According to the most recent update there has ...[-0.02168591320514679, 0.13073040544986725, 0....negative0.0
\n", + "
\n", + "
\n", + "\n", + "
\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "
\n", + "\n", + "
\n", + "
\n" + ] + }, + "metadata": {}, + "execution_count": 12 + } + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "e0CVlkk9v6Qi", + "colab": { + "base_uri": "https://localhost:8080/" + }, + "outputId": "0f3fa874-643e-4ff5-e0f4-0060f585fbfa" + }, + "source": [ + "hdd_pipe.print_info()" + ], + "execution_count": 13, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "The following parameters are configurable for this NLU pipeline (You can copy paste the examples) :\n", + ">>> component_list['document_assembler'] has settable params:\n", + "component_list['document_assembler'].setCleanupMode('shrink') | Info: possible values: disabled, inplace, inplace_full, shrink, shrink_full, each, each_full, delete_full | Currently set to : shrink\n", + ">>> component_list['bert_sentence_embeddings@sent_small_bert_L12_768'] has settable params:\n", + "component_list['bert_sentence_embeddings@sent_small_bert_L12_768'].setBatchSize(8) | Info: Size of every batch | Currently set to : 8\n", + "component_list['bert_sentence_embeddings@sent_small_bert_L12_768'].setCaseSensitive(False) | Info: whether to ignore case in tokens for embeddings matching | Currently set to : False\n", + "component_list['bert_sentence_embeddings@sent_small_bert_L12_768'].setDimension(768) | Info: Number of embedding dimensions | Currently set to : 768\n", + "component_list['bert_sentence_embeddings@sent_small_bert_L12_768'].setMaxSentenceLength(128) | Info: Max sentence length to process | Currently set to : 128\n", + "component_list['bert_sentence_embeddings@sent_small_bert_L12_768'].setEngine('tensorflow') | Info: Deep Learning engine used for this model | Currently set to : tensorflow\n", + "component_list['bert_sentence_embeddings@sent_small_bert_L12_768'].setIsLong(False) | Info: Use Long type instead of Int type for inputs buffer - Some Bert models require Long instead of Int. | Currently set to : False\n", + "component_list['bert_sentence_embeddings@sent_small_bert_L12_768'].setStorageRef('sent_small_bert_L12_768') | Info: unique reference name for identification | Currently set to : sent_small_bert_L12_768\n", + ">>> component_list['sentiment_dl@sent_small_bert_L12_768'] has settable params:\n", + "component_list['sentiment_dl@sent_small_bert_L12_768'].setThreshold(0.6) | Info: The minimum threshold for the final result otheriwse it will be neutral | Currently set to : 0.6\n", + "component_list['sentiment_dl@sent_small_bert_L12_768'].setThresholdLabel('neutral') | Info: In case the score is less than threshold, what should be the label. Default is neutral. | Currently set to : neutral\n", + "component_list['sentiment_dl@sent_small_bert_L12_768'].setEngine('tensorflow') | Info: Deep Learning engine used for this model | Currently set to : tensorflow\n", + "component_list['sentiment_dl@sent_small_bert_L12_768'].setClasses(['positive', 'negative']) | Info: get the tags used to trained this SentimentDLModel | Currently set to : ['positive', 'negative']\n", + "component_list['sentiment_dl@sent_small_bert_L12_768'].setStorageRef('sent_small_bert_L12_768') | Info: unique reference name for identification | Currently set to : sent_small_bert_L12_768\n" + ] + } + ] + } + ] +} \ No newline at end of file diff --git a/examples/colab/Training/binary_text_classification/NLU_training_sentiment_classifier_demo_natural_disasters.ipynb b/examples/colab/Training/binary_text_classification/NLU_training_sentiment_classifier_demo_natural_disasters.ipynb index 3d45e611..8393bb2e 100644 --- a/examples/colab/Training/binary_text_classification/NLU_training_sentiment_classifier_demo_natural_disasters.ipynb +++ b/examples/colab/Training/binary_text_classification/NLU_training_sentiment_classifier_demo_natural_disasters.ipynb @@ -1 +1,3547 @@ -{"nbformat":4,"nbformat_minor":0,"metadata":{"colab":{"name":"NLU_training_sentiment_classifier_demo_natural_disasters.ipynb","provenance":[],"collapsed_sections":["zkufh760uvF3"]},"kernelspec":{"display_name":"Python 3","name":"python3"}},"cells":[{"cell_type":"markdown","metadata":{"id":"zkufh760uvF3"},"source":["![JohnSnowLabs](https://nlp.johnsnowlabs.com/assets/images/logo.png)\n","\n","[![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/JohnSnowLabs/nlu/blob/master/examples/colab/Training/binary_text_classification/NLU_training_sentiment_classifier_demo_natural_disasters.ipynb)\n","\n","\n","# Training a Sentiment Analysis Classifier with NLU \n","## 2 Class Natural Disasters Sentiment Classifer Training\n","With the [SentimentDL model](https://nlp.johnsnowlabs.com/docs/en/annotators#sentimentdl-multi-class-sentiment-analysis-annotator) from Spark NLP you can achieve State Of the Art results on any multi class text classification problem \n","\n","This notebook showcases the following features : \n","\n","- How to train the deep learning classifier\n","- How to store a pipeline to disk\n","- How to load the pipeline from disk (Enables NLU offline mode)\n","\n","You can achieve these results or even better on this dataset with training data:\n","\n","\n","
\n","\n","![image.png](data:image/png;base64,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)\n","\n","You can achieve these results or even better on this dataset with test data:\n","\n","\n","
\n","\n","\n","![Screenshot 2021-02-25 142700.png](data:image/png;base64,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)"]},{"cell_type":"markdown","metadata":{"id":"dur2drhW5Rvi"},"source":["# 1. Install Java 8 and NLU"]},{"cell_type":"code","metadata":{"id":"hFGnBCHavltY","colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"status":"ok","timestamp":1620193265134,"user_tz":-120,"elapsed":142818,"user":{"displayName":"Christian Kasim Loan","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GjqAD-ircKP-s5Eh6JSdkDggDczfqQbJGU_IRb4Hw=s64","userId":"14469489166467359317"}},"outputId":"52bc1bd1-c902-4d24-b470-579f3f4ab6d2"},"source":["!wget https://setup.johnsnowlabs.com/nlu/colab.sh -O - | bash\n","import nlu"],"execution_count":null,"outputs":[{"output_type":"stream","text":["--2021-05-05 05:38:43-- https://raw.githubusercontent.com/JohnSnowLabs/nlu/master/scripts/colab_setup.sh\n","Resolving raw.githubusercontent.com (raw.githubusercontent.com)... 185.199.109.133, 185.199.108.133, 185.199.111.133, ...\n","Connecting to raw.githubusercontent.com (raw.githubusercontent.com)|185.199.109.133|:443... connected.\n","HTTP request sent, awaiting response... 200 OK\n","Length: 1671 (1.6K) [text/plain]\n","Saving to: ‘STDOUT’\n","\n","- 100%[===================>] 1.63K --.-KB/s in 0s \n","\n","2021-05-05 05:38:43 (30.6 MB/s) - written to stdout [1671/1671]\n","\n","Installing NLU 3.0.0 with PySpark 3.0.2 and Spark NLP 3.0.1 for Google Colab ...\n","\u001b[K |████████████████████████████████| 204.8MB 73kB/s \n","\u001b[K |████████████████████████████████| 153kB 45.7MB/s \n","\u001b[K |████████████████████████████████| 204kB 19.8MB/s \n","\u001b[K |████████████████████████████████| 204kB 41.4MB/s \n","\u001b[?25h Building wheel for pyspark (setup.py) ... \u001b[?25l\u001b[?25hdone\n"],"name":"stdout"}]},{"cell_type":"markdown","metadata":{"id":"f4KkTfnR5Ugg"},"source":["# 2. Download Disaster Sentiment dataset \n","https://www.kaggle.com/vstepanenko/disaster-tweets\n","#Context\n","\n","The file contains over 11,000 tweets associated with disaster keywords like “crash”, “quarantine”, and “bush fires” as well as the location and keyword itself. The data structure was inherited from Disasters on social media\n","\n","The tweets were collected on Jan 14th, 2020.\n","\n","Some of the topics people were tweeting:\n","\n","The eruption of Taal Volcano in Batangas, Philippines\n","Coronavirus\n","Bushfires in Australia\n","Iran downing of the airplane flight PS752\n","Disclaimer: The dataset contains text that may be considered profane, vulgar, or offensive."]},{"cell_type":"code","metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"OrVb5ZMvvrQD","executionInfo":{"status":"ok","timestamp":1620193268178,"user_tz":-120,"elapsed":145852,"user":{"displayName":"Christian Kasim Loan","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GjqAD-ircKP-s5Eh6JSdkDggDczfqQbJGU_IRb4Hw=s64","userId":"14469489166467359317"}},"outputId":"d989f5b9-0f5c-4afc-94d4-04eb3f7613a4"},"source":["! wget http://ckl-it.de/wp-content/uploads/2021/02/tweets.csv\n"],"execution_count":null,"outputs":[{"output_type":"stream","text":["--2021-05-05 05:41:04-- http://ckl-it.de/wp-content/uploads/2021/02/tweets.csv\n","Resolving ckl-it.de (ckl-it.de)... 217.160.0.108, 2001:8d8:100f:f000::209\n","Connecting to ckl-it.de (ckl-it.de)|217.160.0.108|:80... connected.\n","HTTP request sent, awaiting response... 200 OK\n","Length: 1207952 (1.2M) [text/csv]\n","Saving to: ‘tweets.csv’\n","\n","tweets.csv 100%[===================>] 1.15M 654KB/s in 1.8s \n","\n","2021-05-05 05:41:07 (654 KB/s) - ‘tweets.csv’ saved [1207952/1207952]\n","\n"],"name":"stdout"}]},{"cell_type":"code","metadata":{"colab":{"base_uri":"https://localhost:8080/","height":406},"id":"y4xSRWIhwT28","executionInfo":{"status":"ok","timestamp":1620193269115,"user_tz":-120,"elapsed":146783,"user":{"displayName":"Christian Kasim Loan","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GjqAD-ircKP-s5Eh6JSdkDggDczfqQbJGU_IRb4Hw=s64","userId":"14469489166467359317"}},"outputId":"5f4be6e9-1900-4776-ee93-9ad537c2daf0"},"source":["import pandas as pd\n","train_path = '/content/tweets.csv'\n","\n","train_df = pd.read_csv(train_path,sep=\",\", encoding='latin-1')\n","# the text data to use for classification should be in a column named 'text'\n","columns=['text','y']\n","train_df = train_df.dropna()\n","positive = train_df[train_df['y']==(\"positive\")].iloc[:1500]\n","negative = train_df[train_df['y']==(\"negative\")].iloc[:1500]\n","positive = positive.append(negative, ignore_index = True)\n","positive = positive.sample(frac=1).reset_index(drop=True)\n","train_df = positive\n","from sklearn.model_selection import train_test_split\n","\n","train_df, test_df = train_test_split(train_df, test_size=0.2)\n","train_df"],"execution_count":null,"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"," \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"," \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","
Unnamed: 0idkeywordlocationtexttargety
23102375.06350.0heat%20waveChandigarh, IndiaBihar District Magistrate Issues Order to Clos...1.0positive
20441607.03937.0destroyedScotland, but like at the topYOU THERE, PACHIRISU PUNK, PREPARE TO BE DESTR...0.0negative
2473809.0272.0annihilatedUSAA devastating and thorough refutation of and N...0.0negative
1369152.03817.0desolateUnited States Air Forcebubby finally gonna help with desolate while i...0.0negative
1880305.04609.0earthquakeChileTemblor: mb 4.5 SOUTHEAST OF EASTER ISLAND: Ma...1.0positive
........................
15312759.0110.0aftershockNYCThe magnitude 5.9 quake in #PuertoRico this mo...1.0positive
903182.03256.0debrisRepublic of the PhilippinesHello everyone. Tito Sotto is wrong. Cloud see...0.0negative
2621287.04008.0destructionRecife, BrasilBear witness to his destruction. West Coast, #...0.0negative
12355131.02863.0curfewVehariKASHMIR STILL UNDER CURFEW 🔒🔗ðÂ...1.0positive
22641300.08294.0quarantinedÜT: 45.246915,-76.163963Chinese woman with mystery virus quarantined i...1.0positive
\n","

2400 rows × 7 columns

\n","
"],"text/plain":[" Unnamed: 0 id ... target y\n","2310 2375.0 6350.0 ... 1.0 positive\n","2044 1607.0 3937.0 ... 0.0 negative\n","2473 809.0 272.0 ... 0.0 negative\n","1369 152.0 3817.0 ... 0.0 negative\n","1880 305.0 4609.0 ... 1.0 positive\n","... ... ... ... ... ...\n","1531 2759.0 110.0 ... 1.0 positive\n","903 182.0 3256.0 ... 0.0 negative\n","2621 287.0 4008.0 ... 0.0 negative\n","1235 5131.0 2863.0 ... 1.0 positive\n","2264 1300.0 8294.0 ... 1.0 positive\n","\n","[2400 rows x 7 columns]"]},"metadata":{"tags":[]},"execution_count":3}]},{"cell_type":"markdown","metadata":{"id":"0296Om2C5anY"},"source":["# 3. Train Deep Learning Classifier using nlu.load('train.sentiment')\n","\n","You dataset label column should be named 'y' and the feature column with text data should be named 'text'"]},{"cell_type":"code","metadata":{"colab":{"base_uri":"https://localhost:8080/","height":1000},"id":"3ZIPkRkWftBG","executionInfo":{"status":"ok","timestamp":1620195355299,"user_tz":-120,"elapsed":13046,"user":{"displayName":"Christian Kasim Loan","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GjqAD-ircKP-s5Eh6JSdkDggDczfqQbJGU_IRb4Hw=s64","userId":"14469489166467359317"}},"outputId":"72a7378b-68c0-42ae-f41c-44d717e82f46"},"source":["import nlu \n","from sklearn.metrics import classification_report\n","# load a trainable pipeline by specifying the train. prefix and fit it on a datset with label and text columns\n","# by default the Universal Sentence Encoder (USE) Sentence embeddings are used for generation\n","trainable_pipe = nlu.load('train.sentiment')\n","fitted_pipe = trainable_pipe.fit(train_df.iloc[:50])\n","\n","# predict with the trainable pipeline on dataset and get predictions\n","preds = fitted_pipe.predict(train_df.iloc[:50],output_level='document')\n","#sentence detector that is part of the pipe generates sone NaNs. lets drop them first\n","preds.dropna(inplace=True)\n","print(classification_report(preds['y'], preds['sentiment']))\n","\n","preds"],"execution_count":null,"outputs":[{"output_type":"stream","text":["tfhub_use download started this may take some time.\n","Approximate size to download 923.7 MB\n","[OK!]\n","sentence_detector_dl download started this may take some time.\n","Approximate size to download 354.6 KB\n","[OK!]\n"," precision recall f1-score support\n","\n"," negative 1.00 0.20 0.33 25\n"," neutral 0.00 0.00 0.00 0\n"," positive 0.86 0.96 0.91 25\n","\n"," accuracy 0.58 50\n"," macro avg 0.62 0.39 0.41 50\n","weighted avg 0.93 0.58 0.62 50\n","\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"," \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"," \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"," \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"," \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"," \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"," \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"," \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"," \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"," \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"," \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"," \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"," \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"," \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"," \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"," \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"," \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"," \n"," \n","
ytrained_sentimenttextsentenceidtargetdocumenttrained_sentiment_confidencekeywordorigin_indexsentence_embedding_useUnnamed: 0location
0positivepositiveBihar District Magistrate Issues Order to Clos...[Bihar District Magistrate Issues Order to Clo...6350.01.0Bihar District Magistrate Issues Order to Clos...0.714817heat%20wave2310[0.01817215047776699, -0.042255766689777374, -...2375.0Chandigarh, India
1negativenegativeYOU THERE, PACHIRISU PUNK, PREPARE TO BE DESTR...[YOU THERE, PACHIRISU PUNK, PREPARE TO BE DEST...3937.00.0YOU THERE, PACHIRISU PUNK, PREPARE TO BE DESTR...0.624722destroyed2044[0.01567729189991951, 0.00028937371098436415, ...1607.0Scotland, but like at the top
2negativeneutralA devastating and thorough refutation of and N...[A devastating and thorough refutation of and ...272.00.0A devastating and thorough refutation of and N...0.516126annihilated2473[0.030531354248523712, 0.018328234553337097, -...809.0USA
3negativenegativebubby finally gonna help with desolate while i...[bubby finally gonna help with desolate while ...3817.00.0bubby finally gonna help with desolate while i...0.635754desolate1369[-0.010298581793904305, -0.023482605814933777,...152.0United States Air Force
4positivepositiveTemblor: mb 4.5 SOUTHEAST OF EASTER ISLAND: Ma...[Temblor: mb 4.5 SOUTHEAST OF EASTER ISLAND:, ...4609.01.0Temblor: mb 4.5 SOUTHEAST OF EASTER ISLAND: Ma...0.688311earthquake1880[-0.07005153596401215, -0.042087431997060776, ...305.0Chile
5positivepositiveHuman body parts have been found in a bag on a...[Human body parts have been found in a bag on ...1333.01.0Human body parts have been found in a bag on a...0.672013body%20bag936[-0.01760876551270485, -0.07565091550350189, -...1765.0Dublin, Ireland
6negativeneutralJFC!!! Racist comment ! I guess all \"lazy\" may...[JFC!!!, Racist comment !, I guess all \"lazy\" ...1709.00.0JFC!!! Racist comment ! I guess all \"lazy\" may...0.577475buildings%20burning2032[0.023510590195655823, 0.002154689282178879, -...2141.0Southern OBX
7positivepositive14/17:27 EST Severe Thunderstorm Warning for p...[14/17:27 EST Severe Thunderstorm Warning for ...10191.01.014/17:27 EST Severe Thunderstorm Warning for p...0.727776thunderstorm647[-0.0552973710000515, 0.024097146466374397, -0...5108.0Queensland, Australia
8negativepositiveRoadworks are co-ordinated and approved by a g...[Roadworks are co-ordinated and approved by a ...4845.00.0Roadworks are co-ordinated and approved by a g...0.669093emergency%20services1081[-0.05318903550505638, 0.018101226538419724, -...2228.0Edinburgh
9positivepositiveIran Protests: 1,500 killed 5,000 Injured 7,00...[Iran Protests: 1,500 killed 5,000 Injured 7,0...6776.01.0Iran Protests: 1,500 killed 5,000 Injured 7,00...0.727720injured1759[0.03859921544790268, -0.010697060264647007, -...4651.0Ohio River Valley
10negativepositiveKwara State Governor, Mallam purchased Truck f...[Kwara State Governor, Mallam purchased Truck ...5632.00.0Kwara State Governor, Mallam purchased Truck f...0.653245fire%20truck1551[-0.013514711521565914, -0.004037567414343357,...2225.0Ilorin, Nigeria
11negativeneutralI’m wondering if framing these pictures t...[I’m wondering if framing these pictures ...5718.00.0I’m wondering if framing these pictures t...0.545631flattened237[0.03829433023929596, -0.08540338277816772, -0...2171.0ZellRepublik🌍
12negativeneutralTransparency makes everything better: individu...[Transparency makes everything better: individ...5503.00.0Transparency makes everything better: individu...0.597684fear593[0.0025042055640369654, 0.027974789962172508, ...1037.0North East England
13positiveneutralIf I didn't need my Crutch I would seriously w...[If I didn't need my Crutch I would seriously ...1280.01.0If I didn't need my Crutch I would seriously w...0.583970bloody914[0.043823741376399994, 0.057542573660612106, -...819.0Guildford
14negativepositiveImagine you get a phone call from the Israeli ...[Imagine you get a phone call from the Israeli...1552.00.0Imagine you get a phone call from the Israeli ...0.644661bombed596[-0.02263369970023632, -0.04711006581783295, -...2227.0Uganda, Nigeria
15negativepositive[Breaking] Nirbhaya Rape: Supreme Court dismis...[[Breaking] Nirbhaya Rape: Supreme Court dismi...3127.00.0[Breaking] Nirbhaya Rape: Supreme Court dismis...0.660057death2715[-0.014349669218063354, -0.07226337492465973, ...812.0India
16positivepositivethis storm is quite violent oh lord imagine ir...[this storm is quite violent oh lord imagine i...10739.01.0this storm is quite violent oh lord imagine ir...0.662823violent%20storm1010[-0.02750890888273716, 0.021164197474718094, -...5069.0ireland , 20
17negativeneutralYeah France is doing fantastic with all the mi...[Yeah France is doing fantastic with all the m...2347.00.0Yeah France is doing fantastic with all the mi...0.536393collapse2853[0.027280263602733612, 0.015566764399409294, -...399.0South Africa
18negativeneutralHe seems to be crumbling more rapidly now. The...[He seems to be crumbling more rapidly now., ...3350.00.0He seems to be crumbling more rapidly now. The...0.568037deluge1481[0.11189540475606918, -0.009536723606288433, 0...375.0Midwest Red State
19negativeneutral#coup 9/11 vs Cal Fires So is this an attack o...[#coup 9/11 vs Cal Fires So is this an attack ...1779.00.0#coup 9/11 vs Cal Fires So is this an attack o...0.583260buildings%20on%20fire429[-0.015312806703150272, 0.030779404565691948, ...2388.0OnFreedomRoad.com
20positivepositive6 months of videos of protesters smashing, bur...[6 months of videos of protesters smashing, bu...3599.01.06 months of videos of protesters smashing, bur...0.709840derail427[-0.02566157653927803, 0.009822700172662735, -...2900.0hk island, govt held, not K&NT
21positivepositiveMexican Border City on High Alert Over ‘S...[Mexican Border City on High Alert Over ‘...9696.01.0Mexican Border City on High Alert Over ‘S...0.687776suicide%20bomber2907[0.015122084878385067, -0.0711512491106987, -0...5733.0Colorado, USA
22negativeneutralAmazing light show or a battle for your health...[Amazing light show or a battle for your healt...3909.00.0Amazing light show or a battle for your health...0.530186destroy107[0.001234019990079105, -0.06394369900226593, 0...1805.0Brisbane, Queensland
23positivepositiveEmergency services called to a collision on th...[Emergency services called to a collision on t...4877.01.0Emergency services called to a collision on th...0.689470emergency%20services2844[-0.05413218215107918, -0.0021766768768429756,...2548.0United Kingdom
24positivepositiveHEADLINE: \"6.4 earthquake strikes Puerto Rico,...[HEADLINE: \"6.4 earthquake strikes Puerto Rico...9125.01.0HEADLINE: \"6.4 earthquake strikes Puerto Rico,...0.757030seismic1497[0.004592240322381258, -0.03824039548635483, -...6523.0Florida, USA
25negativenegative“You were like a breath of fresh air. ItÃ...[“You were like a breath of fresh air., I...4466.00.0“You were like a breath of fresh air. ItÃ...0.613734drowning1452[-0.03848513588309288, 0.07503059506416321, -0...2700.0Cairo
26negativeneutralThe arsonist turns up with a fire extinguisher...[The arsonist turns up with a fire extinguishe...510.00.0The arsonist turns up with a fire extinguisher...0.532903arsonist2801[-0.001973913051187992, -0.017796456813812256,...761.0NSW. Gumbaynggirr country.
27positivepositiveM7: all lanes have reopened inbound between J5...[M7:, all lanes have reopened inbound between ...2560.01.0M7: all lanes have reopened inbound between J5...0.689800collision1277[-0.04796949401497841, -0.07411075383424759, -...5460.0M50 Dublin
28positivepositiveHi Respected #Friends Hello #TweeterWorld #Nam...[Hi Respected #Friends Hello #TweeterWorld #Na...679.01.0Hi Respected #Friends Hello #TweeterWorld #Nam...0.642852avalanche2212[0.004341206979006529, 0.01691211760044098, 0....6874.0Another World♥️♦️♠ïÂ...
29negativeneutrali wouldn’t even be surprised if they some...[i wouldn’t even be surprised if they som...2284.00.0i wouldn’t even be surprised if they some...0.580780cliff%20fall311[-0.0520143061876297, 0.0450257770717144, -0.0...674.0she/they ⚢
30positivepositive3.5 magnitude earthquake recorded in Bulgan ai...[3.5 magnitude earthquake recorded in Bulgan a...4638.01.03.5 magnitude earthquake recorded in Bulgan ai...0.725532earthquake2961[-0.01304821576923132, -0.023747781291604042, ...6976.0Jigjidjav St, Ulaanbaatar
31positivepositiveTrumps Presidency =2024 Oil spill in Alaska ha...[Trumps Presidency =2024 Oil spill in Alaska h...7931.01.0Trumps Presidency =2024 Oil spill in Alaska ha...0.603689oil%20spill2644[-0.01266513578593731, 0.07648883014917374, -0...1905.0Kelowna, British Columbia
32positivepositiveA fire outbreak has razed down 39 shops, ravag...[A fire outbreak has razed down 39 shops, rava...8394.01.0A fire outbreak has razed down 39 shops, ravag...0.679642razed1982[0.061840321868658066, 0.020564774051308632, -...3117.0Abuja, Nigeria
33negativenegativeWhen technical brains speak to a raging debate...[When technical brains speak to a raging debat...221.00.0When technical brains speak to a raging debate...0.609269ambulance2063[0.02085897885262966, 0.03478141874074936, 0.0...1296.0Ghana
34positivepositiveA wildlife rehab center in South Carolina says...[A wildlife rehab center in South Carolina say...8617.01.0A wildlife rehab center in South Carolina says...0.654906rescuers221[0.05315405875444412, -0.013145094737410545, -...442.0California, USA
35negativeneutralhey you former russian spy electrocute me[hey you former russian spy electrocute me]4657.00.0hey you former russian spy electrocute me0.573599electrocute156[-0.019302884116768837, -0.0029615701641887426...504.0𝚙𝚋&𝚓 𝚑𝚘ð...
36negativeneutralJKP cop Devinder Singh's sordid saga vindicate...[JKP cop Devinder Singh's sordid saga vindicat...3018.00.0JKP cop Devinder Singh's sordid saga vindicate...0.588211danger1676[-0.020209699869155884, -0.05051594600081444, ...1889.0DELHI, KASHMIR
37negativeneutralTime will tell when I fall off a cliff or high...[Time will tell when I fall off a cliff or hig...2277.00.0Time will tell when I fall off a cliff or high...0.521615cliff%20fall505[0.008356968872249126, 0.07969766110181808, 0....1335.0Sydney, Australia
38positivepositiveJUST IN: An earthquake was felt in parts of CA...[JUST IN: An earthquake was felt in parts of C...4622.01.0JUST IN: An earthquake was felt in parts of CA...0.761350earthquake2858[0.03384742885828018, -0.022578943520784378, -...6461.0Pasig City
39negativenegativeThis tweet blew up and this is where people pr...[This tweet blew up and this is where people p...1029.00.0This tweet blew up and this is where people pr...0.602517blew%20up1090[0.056242309510707855, -0.023219745606184006, ...1686.0ENFP / 4w3
40negativeneutralWe thrown him as debris should be out of the h...[We thrown him as debris should be out of the ...3277.00.0We thrown him as debris should be out of the h...0.566319debris1729[0.07086315006017685, -0.04039449617266655, -0...169.0Lahore, Pakistan
41negativeneutral“Key compoNts I appreciate as a transport...[“Key compoNts I appreciate as a transpor...5424.00.0“Key compoNts I appreciate as a transport...0.505895fatalities329[0.06842903792858124, -0.02750425413250923, -0...2833.0California, USA
42positivepositive#childsafety | Local flu death of boy is one o...[#childsafety | Local flu death of boy is one ...3193.01.0#childsafety | Local flu death of boy is one o...0.702334deaths2469[-0.023012271150946617, 0.03902702406048775, -...2076.0Los Angeles, Ca
43positivepositiveA fire outbreak has razed down shops, ravaging...[A fire outbreak has razed down shops, ravagin...8413.01.0A fire outbreak has razed down shops, ravaging...0.718965razed833[0.05622481927275658, 0.0063430992886424065, 0...1372.0Abuja
44positivepositiveDeath toll in Pakistan mosque suicide bombing ...[Death toll in Pakistan mosque suicide bombing...9707.01.0Death toll in Pakistan mosque suicide bombing ...0.765301suicide%20bombing1440[-0.021320270374417305, -0.04400596395134926, ...1737.0Deutschland 🇩🇪
45positivepositivehttps://t.co/CggAt6G2TK Blocked drains, 13th J...[https://t.co/CggAt6G2TK Blocked drains, 13th ...8770.01.0https://t.co/CggAt6G2TK Blocked drains, 13th J...0.664557rubble1282[0.04071395844221115, -0.021260187029838562, -...5288.0Cymru
46negativeneutralUpdate at 18:15 Tuesday to do list - Sleep in ...[Update at 18:15 Tuesday to do list - Sleep in...2268.00.0Update at 18:15 Tuesday to do list - Sleep in ...0.582058cliff%20fall2768[0.04768536612391472, 0.009061871096491814, 0....528.0Plotskiville
47positivepositiveChina sinkhole: Six people killed in Xining as...[China sinkhole: Six people killed in Xining a...3236.01.0China sinkhole: Six people killed in Xining as...0.776652deaths2167[-0.03895467147231102, -0.053079184144735336, ...2861.0Queens, NY
48positivepositiveLawyer who gave aid to anti-CAA protestors ele...[Lawyer who gave aid to anti-CAA protestors el...4727.01.0Lawyer who gave aid to anti-CAA protestors ele...0.691819electrocuted408[-0.016440408304333687, -0.03521612286567688, ...2992.0Bengaluru, India
49positivepositiveA local veterinarian takes care of the horses ...[A local veterinarian takes care of the horses...5121.01.0A local veterinarian takes care of the horses ...0.613162evacuation2140[-0.06955872476100922, 0.06343398988246918, -0...1479.0Republic of the Philippines
\n","
"],"text/plain":[" y ... location\n","0 positive ... Chandigarh, India\n","1 negative ... Scotland, but like at the top\n","2 negative ... USA\n","3 negative ... United States Air Force\n","4 positive ... Chile\n","5 positive ... Dublin, Ireland\n","6 negative ... Southern OBX\n","7 positive ... Queensland, Australia\n","8 negative ... Edinburgh\n","9 positive ... Ohio River Valley\n","10 negative ... Ilorin, Nigeria\n","11 negative ... ZellRepublik🌍\n","12 negative ... North East England\n","13 positive ... Guildford\n","14 negative ... Uganda, Nigeria\n","15 negative ... India\n","16 positive ... ireland , 20\n","17 negative ... South Africa\n","18 negative ... Midwest Red State\n","19 negative ... OnFreedomRoad.com\n","20 positive ... hk island, govt held, not K&NT\n","21 positive ... Colorado, USA\n","22 negative ... Brisbane, Queensland\n","23 positive ... United Kingdom\n","24 positive ... Florida, USA\n","25 negative ... Cairo\n","26 negative ... NSW. Gumbaynggirr country.\n","27 positive ... M50 Dublin\n","28 positive ... Another World♥️♦️♠ïÂ...\n","29 negative ... she/they ⚢\n","30 positive ... Jigjidjav St, Ulaanbaatar\n","31 positive ... Kelowna, British Columbia\n","32 positive ... Abuja, Nigeria\n","33 negative ... Ghana\n","34 positive ... California, USA\n","35 negative ... 𝚙𝚋&𝚓 𝚑𝚘ð...\n","36 negative ... DELHI, KASHMIR\n","37 negative ... Sydney, Australia\n","38 positive ... Pasig City\n","39 negative ... ENFP / 4w3\n","40 negative ... Lahore, Pakistan\n","41 negative ... California, USA\n","42 positive ... Los Angeles, Ca\n","43 positive ... Abuja\n","44 positive ... Deutschland 🇩🇪\n","45 positive ... Cymru\n","46 negative ... Plotskiville\n","47 positive ... Queens, NY\n","48 positive ... Bengaluru, India\n","49 positive ... Republic of the Philippines\n","\n","[50 rows x 13 columns]"]},"metadata":{"tags":[]},"execution_count":6}]},{"cell_type":"markdown","metadata":{"id":"lVyOE2wV0fw_"},"source":["# 4. Test the fitted pipe on new example"]},{"cell_type":"code","metadata":{"colab":{"base_uri":"https://localhost:8080/","height":77},"id":"qdCUg2MR0PD2","executionInfo":{"status":"ok","timestamp":1620195355927,"user_tz":-120,"elapsed":13003,"user":{"displayName":"Christian Kasim Loan","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GjqAD-ircKP-s5Eh6JSdkDggDczfqQbJGU_IRb4Hw=s64","userId":"14469489166467359317"}},"outputId":"40252d3c-3637-4c1d-e499-da32fb741d2d"},"source":["fitted_pipe.predict(\"All the buildings in the capital were destroyed\")"],"execution_count":null,"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","
documenttrained_sentiment_confidenceorigin_indextrained_sentimentsentence_embedding_usesentence
0All the buildings in the capital were destroyed0.6979480positive[0.01043090783059597, 0.06007970869541168, -0....[All the buildings in the capital were destroyed]
\n","
"],"text/plain":[" document ... sentence\n","0 All the buildings in the capital were destroyed ... [All the buildings in the capital were destroyed]\n","\n","[1 rows x 6 columns]"]},"metadata":{"tags":[]},"execution_count":7}]},{"cell_type":"markdown","metadata":{"id":"xflpwrVjjBVD"},"source":["## 5. Configure pipe training parameters"]},{"cell_type":"code","metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"UtsAUGTmOTms","executionInfo":{"status":"ok","timestamp":1620195355927,"user_tz":-120,"elapsed":12923,"user":{"displayName":"Christian Kasim Loan","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GjqAD-ircKP-s5Eh6JSdkDggDczfqQbJGU_IRb4Hw=s64","userId":"14469489166467359317"}},"outputId":"3245d07d-0864-4e67-8b47-44378f110787"},"source":["trainable_pipe.print_info()"],"execution_count":null,"outputs":[{"output_type":"stream","text":["The following parameters are configurable for this NLU pipeline (You can copy paste the examples) :\n",">>> pipe['sentiment_dl'] has settable params:\n","pipe['sentiment_dl'].setMaxEpochs(1) | Info: Maximum number of epochs to train | Currently set to : 1\n","pipe['sentiment_dl'].setLr(0.005) | Info: Learning Rate | Currently set to : 0.005\n","pipe['sentiment_dl'].setBatchSize(64) | Info: Batch size | Currently set to : 64\n","pipe['sentiment_dl'].setDropout(0.5) | Info: Dropout coefficient | Currently set to : 0.5\n","pipe['sentiment_dl'].setEnableOutputLogs(True) | Info: Whether to use stdout in addition to Spark logs. | Currently set to : True\n","pipe['sentiment_dl'].setThreshold(0.6) | Info: The minimum threshold for the final result otheriwse it will be neutral | Currently set to : 0.6\n","pipe['sentiment_dl'].setThresholdLabel('neutral') | Info: In case the score is less than threshold, what should be the label. Default is neutral. | Currently set to : neutral\n",">>> pipe['use@tfhub_use'] has settable params:\n","pipe['use@tfhub_use'].setDimension(512) | Info: Number of embedding dimensions | Currently set to : 512\n","pipe['use@tfhub_use'].setLoadSP(False) | Info: Whether to load SentencePiece ops file which is required only by multi-lingual models. This is not changeable after it's set with a pretrained model nor it is compatible with Windows. | Currently set to : False\n","pipe['use@tfhub_use'].setStorageRef('tfhub_use') | Info: unique reference name for identification | Currently set to : tfhub_use\n",">>> pipe['deep_sentence_detector@SentenceDetectorDLModel_c83c27f46b97'] has settable params:\n","pipe['deep_sentence_detector@SentenceDetectorDLModel_c83c27f46b97'].setExplodeSentences(False) | Info: whether to explode each sentence into a different row, for better parallelization. Defaults to false. | Currently set to : False\n","pipe['deep_sentence_detector@SentenceDetectorDLModel_c83c27f46b97'].setStorageRef('SentenceDetectorDLModel_c83c27f46b97') | Info: storage unique identifier | Currently set to : SentenceDetectorDLModel_c83c27f46b97\n","pipe['deep_sentence_detector@SentenceDetectorDLModel_c83c27f46b97'].setEncoder(com.johnsnowlabs.nlp.annotators.sentence_detector_dl.SentenceDetectorDLEncoder@29bdbc21) | Info: Data encoder | Currently set to : com.johnsnowlabs.nlp.annotators.sentence_detector_dl.SentenceDetectorDLEncoder@29bdbc21\n","pipe['deep_sentence_detector@SentenceDetectorDLModel_c83c27f46b97'].setImpossiblePenultimates(['Bros', 'No', 'al', 'vs', 'etc', 'Fig', 'Dr', 'Prof', 'PhD', 'MD', 'Co', 'Corp', 'Inc', 'bros', 'VS', 'Vs', 'ETC', 'fig', 'dr', 'prof', 'PHD', 'phd', 'md', 'co', 'corp', 'inc', 'Jan', 'Feb', 'Mar', 'Apr', 'Jul', 'Aug', 'Sep', 'Sept', 'Oct', 'Nov', 'Dec', 'St', 'st', 'AM', 'PM', 'am', 'pm', 'e.g', 'f.e', 'i.e']) | Info: Impossible penultimates | Currently set to : ['Bros', 'No', 'al', 'vs', 'etc', 'Fig', 'Dr', 'Prof', 'PhD', 'MD', 'Co', 'Corp', 'Inc', 'bros', 'VS', 'Vs', 'ETC', 'fig', 'dr', 'prof', 'PHD', 'phd', 'md', 'co', 'corp', 'inc', 'Jan', 'Feb', 'Mar', 'Apr', 'Jul', 'Aug', 'Sep', 'Sept', 'Oct', 'Nov', 'Dec', 'St', 'st', 'AM', 'PM', 'am', 'pm', 'e.g', 'f.e', 'i.e']\n","pipe['deep_sentence_detector@SentenceDetectorDLModel_c83c27f46b97'].setModelArchitecture('cnn') | Info: Model architecture (CNN) | Currently set to : cnn\n",">>> pipe['document_assembler'] has settable params:\n","pipe['document_assembler'].setCleanupMode('shrink') | Info: possible values: disabled, inplace, inplace_full, shrink, shrink_full, each, each_full, delete_full | Currently set to : shrink\n"],"name":"stdout"}]},{"cell_type":"markdown","metadata":{"id":"2GJdDNV9jEIe"},"source":["## 6. Retrain with new parameters"]},{"cell_type":"code","metadata":{"colab":{"base_uri":"https://localhost:8080/","height":1000},"id":"mptfvHx-MMMX","executionInfo":{"status":"ok","timestamp":1620195360521,"user_tz":-120,"elapsed":17440,"user":{"displayName":"Christian Kasim Loan","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GjqAD-ircKP-s5Eh6JSdkDggDczfqQbJGU_IRb4Hw=s64","userId":"14469489166467359317"}},"outputId":"012313a9-d3a0-4c42-9b27-656e59001a1e"},"source":["# Train longer!\n","trainable_pipe = nlu.load('train.sentiment')\n","trainable_pipe['trainable_sentiment_dl'].setMaxEpochs(5) \n","fitted_pipe = trainable_pipe.fit(train_df.iloc[:50])\n","# predict with the trainable pipeline on dataset and get predictions\n","preds = fitted_pipe.predict(train_df.iloc[:50],output_level='document')\n","\n","#sentence detector that is part of the pipe generates sone NaNs. lets drop them first\n","preds.dropna(inplace=True)\n","print(classification_report(preds['y'], preds['sentiment']))\n","\n","preds"],"execution_count":null,"outputs":[{"output_type":"stream","text":[" precision recall f1-score support\n","\n"," negative 0.96 0.96 0.96 25\n"," neutral 0.00 0.00 0.00 0\n"," positive 1.00 0.96 0.98 25\n","\n"," accuracy 0.96 50\n"," macro avg 0.65 0.64 0.65 50\n","weighted avg 0.98 0.96 0.97 50\n","\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"," \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"," \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"," \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"," \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"," \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"," \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"," \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"," \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"," \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"," \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"," \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"," \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"," \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"," \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"," \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"," \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"," \n"," \n","
ytrained_sentimenttextsentenceidtargetdocumenttrained_sentiment_confidencekeywordorigin_indexsentence_embedding_useUnnamed: 0location
0positivepositiveBihar District Magistrate Issues Order to Clos...[Bihar District Magistrate Issues Order to Clo...6350.01.0Bihar District Magistrate Issues Order to Clos...0.970833heat%20wave2310[0.01817215047776699, -0.042255766689777374, -...2375.0Chandigarh, India
1negativenegativeYOU THERE, PACHIRISU PUNK, PREPARE TO BE DESTR...[YOU THERE, PACHIRISU PUNK, PREPARE TO BE DEST...3937.00.0YOU THERE, PACHIRISU PUNK, PREPARE TO BE DESTR...0.982484destroyed2044[0.01567729189991951, 0.00028937371098436415, ...1607.0Scotland, but like at the top
2negativenegativeA devastating and thorough refutation of and N...[A devastating and thorough refutation of and ...272.00.0A devastating and thorough refutation of and N...0.969792annihilated2473[0.030531354248523712, 0.018328234553337097, -...809.0USA
3negativenegativebubby finally gonna help with desolate while i...[bubby finally gonna help with desolate while ...3817.00.0bubby finally gonna help with desolate while i...0.985924desolate1369[-0.010298581793904305, -0.023482605814933777,...152.0United States Air Force
4positivepositiveTemblor: mb 4.5 SOUTHEAST OF EASTER ISLAND: Ma...[Temblor: mb 4.5 SOUTHEAST OF EASTER ISLAND:, ...4609.01.0Temblor: mb 4.5 SOUTHEAST OF EASTER ISLAND: Ma...0.973546earthquake1880[-0.07005153596401215, -0.042087431997060776, ...305.0Chile
5positivepositiveHuman body parts have been found in a bag on a...[Human body parts have been found in a bag on ...1333.01.0Human body parts have been found in a bag on a...0.974148body%20bag936[-0.01760876551270485, -0.07565091550350189, -...1765.0Dublin, Ireland
6negativenegativeJFC!!! Racist comment ! I guess all \"lazy\" may...[JFC!!!, Racist comment !, I guess all \"lazy\" ...1709.00.0JFC!!! Racist comment ! I guess all \"lazy\" may...0.960352buildings%20burning2032[0.023510590195655823, 0.002154689282178879, -...2141.0Southern OBX
7positivepositive14/17:27 EST Severe Thunderstorm Warning for p...[14/17:27 EST Severe Thunderstorm Warning for ...10191.01.014/17:27 EST Severe Thunderstorm Warning for p...0.981230thunderstorm647[-0.0552973710000515, 0.024097146466374397, -0...5108.0Queensland, Australia
8negativenegativeRoadworks are co-ordinated and approved by a g...[Roadworks are co-ordinated and approved by a ...4845.00.0Roadworks are co-ordinated and approved by a g...0.755662emergency%20services1081[-0.05318903550505638, 0.018101226538419724, -...2228.0Edinburgh
9positivepositiveIran Protests: 1,500 killed 5,000 Injured 7,00...[Iran Protests: 1,500 killed 5,000 Injured 7,0...6776.01.0Iran Protests: 1,500 killed 5,000 Injured 7,00...0.982878injured1759[0.03859921544790268, -0.010697060264647007, -...4651.0Ohio River Valley
10negativenegativeKwara State Governor, Mallam purchased Truck f...[Kwara State Governor, Mallam purchased Truck ...5632.00.0Kwara State Governor, Mallam purchased Truck f...0.745413fire%20truck1551[-0.013514711521565914, -0.004037567414343357,...2225.0Ilorin, Nigeria
11negativenegativeI’m wondering if framing these pictures t...[I’m wondering if framing these pictures ...5718.00.0I’m wondering if framing these pictures t...0.951121flattened237[0.03829433023929596, -0.08540338277816772, -0...2171.0ZellRepublik🌍
12negativenegativeTransparency makes everything better: individu...[Transparency makes everything better: individ...5503.00.0Transparency makes everything better: individu...0.979479fear593[0.0025042055640369654, 0.027974789962172508, ...1037.0North East England
13positivenegativeIf I didn't need my Crutch I would seriously w...[If I didn't need my Crutch I would seriously ...1280.01.0If I didn't need my Crutch I would seriously w...0.620800bloody914[0.043823741376399994, 0.057542573660612106, -...819.0Guildford
14negativenegativeImagine you get a phone call from the Israeli ...[Imagine you get a phone call from the Israeli...1552.00.0Imagine you get a phone call from the Israeli ...0.894990bombed596[-0.02263369970023632, -0.04711006581783295, -...2227.0Uganda, Nigeria
15negativeneutral[Breaking] Nirbhaya Rape: Supreme Court dismis...[[Breaking] Nirbhaya Rape: Supreme Court dismi...3127.00.0[Breaking] Nirbhaya Rape: Supreme Court dismis...0.502236death2715[-0.014349669218063354, -0.07226337492465973, ...812.0India
16positivepositivethis storm is quite violent oh lord imagine ir...[this storm is quite violent oh lord imagine i...10739.01.0this storm is quite violent oh lord imagine ir...0.917719violent%20storm1010[-0.02750890888273716, 0.021164197474718094, -...5069.0ireland , 20
17negativenegativeYeah France is doing fantastic with all the mi...[Yeah France is doing fantastic with all the m...2347.00.0Yeah France is doing fantastic with all the mi...0.935926collapse2853[0.027280263602733612, 0.015566764399409294, -...399.0South Africa
18negativenegativeHe seems to be crumbling more rapidly now. The...[He seems to be crumbling more rapidly now., ...3350.00.0He seems to be crumbling more rapidly now. The...0.980057deluge1481[0.11189540475606918, -0.009536723606288433, 0...375.0Midwest Red State
19negativenegative#coup 9/11 vs Cal Fires So is this an attack o...[#coup 9/11 vs Cal Fires So is this an attack ...1779.00.0#coup 9/11 vs Cal Fires So is this an attack o...0.926649buildings%20on%20fire429[-0.015312806703150272, 0.030779404565691948, ...2388.0OnFreedomRoad.com
20positivepositive6 months of videos of protesters smashing, bur...[6 months of videos of protesters smashing, bu...3599.01.06 months of videos of protesters smashing, bur...0.905132derail427[-0.02566157653927803, 0.009822700172662735, -...2900.0hk island, govt held, not K&NT
21positivepositiveMexican Border City on High Alert Over ‘S...[Mexican Border City on High Alert Over ‘...9696.01.0Mexican Border City on High Alert Over ‘S...0.714104suicide%20bomber2907[0.015122084878385067, -0.0711512491106987, -0...5733.0Colorado, USA
22negativenegativeAmazing light show or a battle for your health...[Amazing light show or a battle for your healt...3909.00.0Amazing light show or a battle for your health...0.970722destroy107[0.001234019990079105, -0.06394369900226593, 0...1805.0Brisbane, Queensland
23positivepositiveEmergency services called to a collision on th...[Emergency services called to a collision on t...4877.01.0Emergency services called to a collision on th...0.953050emergency%20services2844[-0.05413218215107918, -0.0021766768768429756,...2548.0United Kingdom
24positivepositiveHEADLINE: \"6.4 earthquake strikes Puerto Rico,...[HEADLINE: \"6.4 earthquake strikes Puerto Rico...9125.01.0HEADLINE: \"6.4 earthquake strikes Puerto Rico,...0.992927seismic1497[0.004592240322381258, -0.03824039548635483, -...6523.0Florida, USA
25negativenegative“You were like a breath of fresh air. ItÃ...[“You were like a breath of fresh air., I...4466.00.0“You were like a breath of fresh air. ItÃ...0.984222drowning1452[-0.03848513588309288, 0.07503059506416321, -0...2700.0Cairo
26negativenegativeThe arsonist turns up with a fire extinguisher...[The arsonist turns up with a fire extinguishe...510.00.0The arsonist turns up with a fire extinguisher...0.971530arsonist2801[-0.001973913051187992, -0.017796456813812256,...761.0NSW. Gumbaynggirr country.
27positivepositiveM7: all lanes have reopened inbound between J5...[M7:, all lanes have reopened inbound between ...2560.01.0M7: all lanes have reopened inbound between J5...0.924938collision1277[-0.04796949401497841, -0.07411075383424759, -...5460.0M50 Dublin
28positivepositiveHi Respected #Friends Hello #TweeterWorld #Nam...[Hi Respected #Friends Hello #TweeterWorld #Na...679.01.0Hi Respected #Friends Hello #TweeterWorld #Nam...0.817334avalanche2212[0.004341206979006529, 0.01691211760044098, 0....6874.0Another World♥️♦️♠ïÂ...
29negativenegativei wouldn’t even be surprised if they some...[i wouldn’t even be surprised if they som...2284.00.0i wouldn’t even be surprised if they some...0.974524cliff%20fall311[-0.0520143061876297, 0.0450257770717144, -0.0...674.0she/they ⚢
30positivepositive3.5 magnitude earthquake recorded in Bulgan ai...[3.5 magnitude earthquake recorded in Bulgan a...4638.01.03.5 magnitude earthquake recorded in Bulgan ai...0.988485earthquake2961[-0.01304821576923132, -0.023747781291604042, ...6976.0Jigjidjav St, Ulaanbaatar
31positivepositiveTrumps Presidency =2024 Oil spill in Alaska ha...[Trumps Presidency =2024 Oil spill in Alaska h...7931.01.0Trumps Presidency =2024 Oil spill in Alaska ha...0.639585oil%20spill2644[-0.01266513578593731, 0.07648883014917374, -0...1905.0Kelowna, British Columbia
32positivepositiveA fire outbreak has razed down 39 shops, ravag...[A fire outbreak has razed down 39 shops, rava...8394.01.0A fire outbreak has razed down 39 shops, ravag...0.933097razed1982[0.061840321868658066, 0.020564774051308632, -...3117.0Abuja, Nigeria
33negativenegativeWhen technical brains speak to a raging debate...[When technical brains speak to a raging debat...221.00.0When technical brains speak to a raging debate...0.985238ambulance2063[0.02085897885262966, 0.03478141874074936, 0.0...1296.0Ghana
34positivepositiveA wildlife rehab center in South Carolina says...[A wildlife rehab center in South Carolina say...8617.01.0A wildlife rehab center in South Carolina says...0.941231rescuers221[0.05315405875444412, -0.013145094737410545, -...442.0California, USA
35negativenegativehey you former russian spy electrocute me[hey you former russian spy electrocute me]4657.00.0hey you former russian spy electrocute me0.983450electrocute156[-0.019302884116768837, -0.0029615701641887426...504.0𝚙𝚋&𝚓 𝚑𝚘ð...
36negativenegativeJKP cop Devinder Singh's sordid saga vindicate...[JKP cop Devinder Singh's sordid saga vindicat...3018.00.0JKP cop Devinder Singh's sordid saga vindicate...0.974994danger1676[-0.020209699869155884, -0.05051594600081444, ...1889.0DELHI, KASHMIR
37negativenegativeTime will tell when I fall off a cliff or high...[Time will tell when I fall off a cliff or hig...2277.00.0Time will tell when I fall off a cliff or high...0.960691cliff%20fall505[0.008356968872249126, 0.07969766110181808, 0....1335.0Sydney, Australia
38positivepositiveJUST IN: An earthquake was felt in parts of CA...[JUST IN: An earthquake was felt in parts of C...4622.01.0JUST IN: An earthquake was felt in parts of CA...0.995373earthquake2858[0.03384742885828018, -0.022578943520784378, -...6461.0Pasig City
39negativenegativeThis tweet blew up and this is where people pr...[This tweet blew up and this is where people p...1029.00.0This tweet blew up and this is where people pr...0.977069blew%20up1090[0.056242309510707855, -0.023219745606184006, ...1686.0ENFP / 4w3
40negativenegativeWe thrown him as debris should be out of the h...[We thrown him as debris should be out of the ...3277.00.0We thrown him as debris should be out of the h...0.972861debris1729[0.07086315006017685, -0.04039449617266655, -0...169.0Lahore, Pakistan
41negativenegative“Key compoNts I appreciate as a transport...[“Key compoNts I appreciate as a transpor...5424.00.0“Key compoNts I appreciate as a transport...0.978197fatalities329[0.06842903792858124, -0.02750425413250923, -0...2833.0California, USA
42positivepositive#childsafety | Local flu death of boy is one o...[#childsafety | Local flu death of boy is one ...3193.01.0#childsafety | Local flu death of boy is one o...0.983754deaths2469[-0.023012271150946617, 0.03902702406048775, -...2076.0Los Angeles, Ca
43positivepositiveA fire outbreak has razed down shops, ravaging...[A fire outbreak has razed down shops, ravagin...8413.01.0A fire outbreak has razed down shops, ravaging...0.979082razed833[0.05622481927275658, 0.0063430992886424065, 0...1372.0Abuja
44positivepositiveDeath toll in Pakistan mosque suicide bombing ...[Death toll in Pakistan mosque suicide bombing...9707.01.0Death toll in Pakistan mosque suicide bombing ...0.991969suicide%20bombing1440[-0.021320270374417305, -0.04400596395134926, ...1737.0Deutschland 🇩🇪
45positivepositivehttps://t.co/CggAt6G2TK Blocked drains, 13th J...[https://t.co/CggAt6G2TK Blocked drains, 13th ...8770.01.0https://t.co/CggAt6G2TK Blocked drains, 13th J...0.875209rubble1282[0.04071395844221115, -0.021260187029838562, -...5288.0Cymru
46negativenegativeUpdate at 18:15 Tuesday to do list - Sleep in ...[Update at 18:15 Tuesday to do list - Sleep in...2268.00.0Update at 18:15 Tuesday to do list - Sleep in ...0.935865cliff%20fall2768[0.04768536612391472, 0.009061871096491814, 0....528.0Plotskiville
47positivepositiveChina sinkhole: Six people killed in Xining as...[China sinkhole: Six people killed in Xining a...3236.01.0China sinkhole: Six people killed in Xining as...0.997117deaths2167[-0.03895467147231102, -0.053079184144735336, ...2861.0Queens, NY
48positivepositiveLawyer who gave aid to anti-CAA protestors ele...[Lawyer who gave aid to anti-CAA protestors el...4727.01.0Lawyer who gave aid to anti-CAA protestors ele...0.802344electrocuted408[-0.016440408304333687, -0.03521612286567688, ...2992.0Bengaluru, India
49positivepositiveA local veterinarian takes care of the horses ...[A local veterinarian takes care of the horses...5121.01.0A local veterinarian takes care of the horses ...0.800290evacuation2140[-0.06955872476100922, 0.06343398988246918, -0...1479.0Republic of the Philippines
\n","
"],"text/plain":[" y ... location\n","0 positive ... Chandigarh, India\n","1 negative ... Scotland, but like at the top\n","2 negative ... USA\n","3 negative ... United States Air Force\n","4 positive ... Chile\n","5 positive ... Dublin, Ireland\n","6 negative ... Southern OBX\n","7 positive ... Queensland, Australia\n","8 negative ... Edinburgh\n","9 positive ... Ohio River Valley\n","10 negative ... Ilorin, Nigeria\n","11 negative ... ZellRepublik🌍\n","12 negative ... North East England\n","13 positive ... Guildford\n","14 negative ... Uganda, Nigeria\n","15 negative ... India\n","16 positive ... ireland , 20\n","17 negative ... South Africa\n","18 negative ... Midwest Red State\n","19 negative ... OnFreedomRoad.com\n","20 positive ... hk island, govt held, not K&NT\n","21 positive ... Colorado, USA\n","22 negative ... Brisbane, Queensland\n","23 positive ... United Kingdom\n","24 positive ... Florida, USA\n","25 negative ... Cairo\n","26 negative ... NSW. Gumbaynggirr country.\n","27 positive ... M50 Dublin\n","28 positive ... Another World♥️♦️♠ïÂ...\n","29 negative ... she/they ⚢\n","30 positive ... Jigjidjav St, Ulaanbaatar\n","31 positive ... Kelowna, British Columbia\n","32 positive ... Abuja, Nigeria\n","33 negative ... Ghana\n","34 positive ... California, USA\n","35 negative ... 𝚙𝚋&𝚓 𝚑𝚘ð...\n","36 negative ... DELHI, KASHMIR\n","37 negative ... Sydney, Australia\n","38 positive ... Pasig City\n","39 negative ... ENFP / 4w3\n","40 negative ... Lahore, Pakistan\n","41 negative ... California, USA\n","42 positive ... Los Angeles, Ca\n","43 positive ... Abuja\n","44 positive ... Deutschland 🇩🇪\n","45 positive ... Cymru\n","46 negative ... Plotskiville\n","47 positive ... Queens, NY\n","48 positive ... Bengaluru, India\n","49 positive ... Republic of the Philippines\n","\n","[50 rows x 13 columns]"]},"metadata":{"tags":[]},"execution_count":9}]},{"cell_type":"markdown","metadata":{"id":"qFoT-s1MjTSS"},"source":["# 7. Try training with different Embeddings"]},{"cell_type":"code","metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"nxWFzQOhjWC8","executionInfo":{"status":"ok","timestamp":1620195360523,"user_tz":-120,"elapsed":17367,"user":{"displayName":"Christian Kasim Loan","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GjqAD-ircKP-s5Eh6JSdkDggDczfqQbJGU_IRb4Hw=s64","userId":"14469489166467359317"}},"outputId":"a6f5b9b8-5045-4e08-8b35-82c76519b21a"},"source":["# We can use nlu.print_components(action='embed_sentence') to see every possibler sentence embedding we could use. Lets use bert!\n","nlu.print_components(action='embed_sentence')"],"execution_count":null,"outputs":[{"output_type":"stream","text":["For language NLU provides the following Models : \n","nlu.load('en.embed_sentence') returns Spark NLP model tfhub_use\n","nlu.load('en.embed_sentence.use') returns Spark NLP model tfhub_use\n","nlu.load('en.embed_sentence.tfhub_use') returns Spark NLP model tfhub_use\n","nlu.load('en.embed_sentence.use.lg') returns Spark NLP model tfhub_use_lg\n","nlu.load('en.embed_sentence.tfhub_use.lg') returns Spark NLP model tfhub_use_lg\n","nlu.load('en.embed_sentence.albert') returns Spark NLP model albert_base_uncased\n","nlu.load('en.embed_sentence.electra') returns Spark NLP model sent_electra_small_uncased\n","nlu.load('en.embed_sentence.electra_small_uncased') returns Spark NLP model sent_electra_small_uncased\n","nlu.load('en.embed_sentence.electra_base_uncased') returns Spark NLP model sent_electra_base_uncased\n","nlu.load('en.embed_sentence.electra_large_uncased') returns Spark NLP model sent_electra_large_uncased\n","nlu.load('en.embed_sentence.bert') returns Spark NLP model sent_bert_base_uncased\n","nlu.load('en.embed_sentence.bert_base_uncased') returns Spark NLP model sent_bert_base_uncased\n","nlu.load('en.embed_sentence.bert_base_cased') returns Spark NLP model sent_bert_base_cased\n","nlu.load('en.embed_sentence.bert_large_uncased') returns Spark NLP model sent_bert_large_uncased\n","nlu.load('en.embed_sentence.bert_large_cased') returns Spark NLP model sent_bert_large_cased\n","nlu.load('en.embed_sentence.biobert.pubmed_base_cased') returns Spark NLP model sent_biobert_pubmed_base_cased\n","nlu.load('en.embed_sentence.biobert.pubmed_large_cased') returns Spark NLP model sent_biobert_pubmed_large_cased\n","nlu.load('en.embed_sentence.biobert.pmc_base_cased') returns Spark NLP model sent_biobert_pmc_base_cased\n","nlu.load('en.embed_sentence.biobert.pubmed_pmc_base_cased') returns Spark NLP model sent_biobert_pubmed_pmc_base_cased\n","nlu.load('en.embed_sentence.biobert.clinical_base_cased') returns Spark NLP model sent_biobert_clinical_base_cased\n","nlu.load('en.embed_sentence.biobert.discharge_base_cased') returns Spark NLP model sent_biobert_discharge_base_cased\n","nlu.load('en.embed_sentence.covidbert.large_uncased') returns Spark NLP model sent_covidbert_large_uncased\n","nlu.load('en.embed_sentence.small_bert_L2_128') returns Spark NLP model sent_small_bert_L2_128\n","nlu.load('en.embed_sentence.small_bert_L4_128') returns Spark NLP model sent_small_bert_L4_128\n","nlu.load('en.embed_sentence.small_bert_L6_128') returns Spark NLP model sent_small_bert_L6_128\n","nlu.load('en.embed_sentence.small_bert_L8_128') returns Spark NLP model sent_small_bert_L8_128\n","nlu.load('en.embed_sentence.small_bert_L10_128') returns Spark NLP model sent_small_bert_L10_128\n","nlu.load('en.embed_sentence.small_bert_L12_128') returns Spark NLP model sent_small_bert_L12_128\n","nlu.load('en.embed_sentence.small_bert_L2_256') returns Spark NLP model sent_small_bert_L2_256\n","nlu.load('en.embed_sentence.small_bert_L4_256') returns Spark NLP model sent_small_bert_L4_256\n","nlu.load('en.embed_sentence.small_bert_L6_256') returns Spark NLP model sent_small_bert_L6_256\n","nlu.load('en.embed_sentence.small_bert_L8_256') returns Spark NLP model sent_small_bert_L8_256\n","nlu.load('en.embed_sentence.small_bert_L10_256') returns Spark NLP model sent_small_bert_L10_256\n","nlu.load('en.embed_sentence.small_bert_L12_256') returns Spark NLP model sent_small_bert_L12_256\n","nlu.load('en.embed_sentence.small_bert_L2_512') returns Spark NLP model sent_small_bert_L2_512\n","nlu.load('en.embed_sentence.small_bert_L4_512') returns Spark NLP model sent_small_bert_L4_512\n","nlu.load('en.embed_sentence.small_bert_L6_512') returns Spark NLP model sent_small_bert_L6_512\n","nlu.load('en.embed_sentence.small_bert_L8_512') returns Spark NLP model sent_small_bert_L8_512\n","nlu.load('en.embed_sentence.small_bert_L10_512') returns Spark NLP model sent_small_bert_L10_512\n","nlu.load('en.embed_sentence.small_bert_L12_512') returns Spark NLP model sent_small_bert_L12_512\n","nlu.load('en.embed_sentence.small_bert_L2_768') returns Spark NLP model sent_small_bert_L2_768\n","nlu.load('en.embed_sentence.small_bert_L4_768') returns Spark NLP model sent_small_bert_L4_768\n","nlu.load('en.embed_sentence.small_bert_L6_768') returns Spark NLP model sent_small_bert_L6_768\n","nlu.load('en.embed_sentence.small_bert_L8_768') returns Spark NLP model sent_small_bert_L8_768\n","nlu.load('en.embed_sentence.small_bert_L10_768') returns Spark NLP model sent_small_bert_L10_768\n","nlu.load('en.embed_sentence.small_bert_L12_768') returns Spark NLP model sent_small_bert_L12_768\n","For language NLU provides the following Models : \n","nlu.load('fi.embed_sentence') returns Spark NLP model sent_bert_finnish_cased\n","nlu.load('fi.embed_sentence.bert.cased') returns Spark NLP model sent_bert_finnish_cased\n","nlu.load('fi.embed_sentence.bert.uncased') returns Spark NLP model sent_bert_finnish_uncased\n","For language NLU provides the following Models : \n","nlu.load('xx.embed_sentence') returns Spark NLP model sent_bert_multi_cased\n","nlu.load('xx.embed_sentence.bert') returns Spark NLP model sent_bert_multi_cased\n","nlu.load('xx.embed_sentence.bert.cased') returns Spark NLP model sent_bert_multi_cased\n","nlu.load('xx.embed_sentence.labse') returns Spark NLP model labse\n"],"name":"stdout"}]},{"cell_type":"code","metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"IKK_Ii_gjJfF","executionInfo":{"status":"ok","timestamp":1620197099679,"user_tz":-120,"elapsed":1756488,"user":{"displayName":"Christian Kasim Loan","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GjqAD-ircKP-s5Eh6JSdkDggDczfqQbJGU_IRb4Hw=s64","userId":"14469489166467359317"}},"outputId":"3d7b9ee2-2fd2-4d3b-ce7b-124efcd30af1"},"source":["trainable_pipe = nlu.load('en.embed_sentence.small_bert_L12_768 train.sentiment')\n","# We need to train longer and user smaller LR for NON-USE based sentence embeddings usually\n","# We could tune the hyperparameters further with hyperparameter tuning methods like gridsearch\n","# Also longer training gives more accuracy\n","trainable_pipe['trainable_sentiment_dl'].setMaxEpochs(120) \n","trainable_pipe['trainable_sentiment_dl'].setLr(0.0005) \n","fitted_pipe = trainable_pipe.fit(train_df)\n","# predict with the trainable pipeline on dataset and get predictions\n","preds = fitted_pipe.predict(train_df,output_level='document')\n","\n","#sentence detector that is part of the pipe generates sone NaNs. lets drop them first\n","preds.dropna(inplace=True)\n","print(classification_report(preds['y'], preds['sentiment']))\n","\n","#preds"],"execution_count":null,"outputs":[{"output_type":"stream","text":["sent_small_bert_L12_768 download started this may take some time.\n","Approximate size to download 392.9 MB\n","[OK!]\n","sentence_detector_dl download started this may take some time.\n","Approximate size to download 354.6 KB\n","[OK!]\n"," precision recall f1-score support\n","\n"," negative 0.87 0.82 0.85 1206\n"," neutral 0.00 0.00 0.00 0\n"," positive 0.87 0.84 0.86 1194\n","\n"," accuracy 0.83 2400\n"," macro avg 0.58 0.56 0.57 2400\n","weighted avg 0.87 0.83 0.85 2400\n","\n"],"name":"stdout"}]},{"cell_type":"markdown","metadata":{"id":"_1jxw3GnVGlI"},"source":["# 7.1 evaluate on Test Data"]},{"cell_type":"code","metadata":{"id":"Fxx4yNkNVGFl","colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"status":"ok","timestamp":1620197219831,"user_tz":-120,"elapsed":1876555,"user":{"displayName":"Christian Kasim Loan","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GjqAD-ircKP-s5Eh6JSdkDggDczfqQbJGU_IRb4Hw=s64","userId":"14469489166467359317"}},"outputId":"6725b153-10a5-43cc-fc81-b4e1ad6c235d"},"source":["preds = fitted_pipe.predict(test_df,output_level='document')\n","\n","#sentence detector that is part of the pipe generates sone NaNs. lets drop them first\n","preds.dropna(inplace=True)\n","print(classification_report(preds['y'], preds['sentiment']))"],"execution_count":null,"outputs":[{"output_type":"stream","text":[" precision recall f1-score support\n","\n"," negative 0.84 0.82 0.83 294\n"," neutral 0.00 0.00 0.00 0\n"," positive 0.86 0.80 0.83 306\n","\n"," accuracy 0.81 600\n"," macro avg 0.56 0.54 0.55 600\n","weighted avg 0.85 0.81 0.83 600\n","\n"],"name":"stdout"}]},{"cell_type":"markdown","metadata":{"id":"2BB-NwZUoHSe"},"source":["# 8. Lets save the model"]},{"cell_type":"code","metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"eLex095goHwm","executionInfo":{"status":"ok","timestamp":1620197385034,"user_tz":-120,"elapsed":2041682,"user":{"displayName":"Christian Kasim Loan","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GjqAD-ircKP-s5Eh6JSdkDggDczfqQbJGU_IRb4Hw=s64","userId":"14469489166467359317"}},"outputId":"cd6b37e7-3b61-4489-975b-55303938873c"},"source":["stored_model_path = './models/classifier_dl_trained' \n","fitted_pipe.save(stored_model_path)"],"execution_count":null,"outputs":[{"output_type":"stream","text":["Stored model in ./models/classifier_dl_trained\n"],"name":"stdout"}]},{"cell_type":"markdown","metadata":{"id":"e_b2DPd4rCiU"},"source":["# 9. Lets load the model from HDD.\n","This makes Offlien NLU usage possible! \n","You need to call nlu.load(path=path_to_the_pipe) to load a model/pipeline from disk."]},{"cell_type":"code","metadata":{"colab":{"base_uri":"https://localhost:8080/","height":95},"id":"SO4uz45MoRgp","executionInfo":{"status":"ok","timestamp":1620197397239,"user_tz":-120,"elapsed":2053806,"user":{"displayName":"Christian Kasim Loan","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GjqAD-ircKP-s5Eh6JSdkDggDczfqQbJGU_IRb4Hw=s64","userId":"14469489166467359317"}},"outputId":"dd9ecdc5-e223-4474-cc4e-a847f818f556"},"source":["hdd_pipe = nlu.load(path=stored_model_path)\n","\n","preds = hdd_pipe.predict('All the buildings in the capital were destroyed')\n","preds"],"execution_count":null,"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","
textsentimentdocumentorigin_indexsentiment_confidencesentencesentence_embedding_from_disk
0All the buildings in the capital were destroyed[positive]All the buildings in the capital were destroyed8589934592[0.99480504][All the buildings in the capital were destroyed][[-0.393466055393219, 0.33815130591392517, -0....
\n","
"],"text/plain":[" text ... sentence_embedding_from_disk\n","0 All the buildings in the capital were destroyed ... [[-0.393466055393219, 0.33815130591392517, -0....\n","\n","[1 rows x 7 columns]"]},"metadata":{"tags":[]},"execution_count":14}]},{"cell_type":"code","metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"e0CVlkk9v6Qi","executionInfo":{"status":"ok","timestamp":1620197397239,"user_tz":-120,"elapsed":2051781,"user":{"displayName":"Christian Kasim Loan","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GjqAD-ircKP-s5Eh6JSdkDggDczfqQbJGU_IRb4Hw=s64","userId":"14469489166467359317"}},"outputId":"5c3d3b1b-32f4-48f1-c69f-2b7344657eba"},"source":["hdd_pipe.print_info()"],"execution_count":null,"outputs":[{"output_type":"stream","text":["The following parameters are configurable for this NLU pipeline (You can copy paste the examples) :\n",">>> pipe['document_assembler'] has settable params:\n","pipe['document_assembler'].setCleanupMode('shrink') | Info: possible values: disabled, inplace, inplace_full, shrink, shrink_full, each, each_full, delete_full | Currently set to : shrink\n",">>> pipe['sentence_detector@SentenceDetectorDLModel_c83c27f46b97'] has settable params:\n","pipe['sentence_detector@SentenceDetectorDLModel_c83c27f46b97'].setExplodeSentences(False) | Info: whether to explode each sentence into a different row, for better parallelization. Defaults to false. | Currently set to : False\n","pipe['sentence_detector@SentenceDetectorDLModel_c83c27f46b97'].setStorageRef('SentenceDetectorDLModel_c83c27f46b97') | Info: storage unique identifier | Currently set to : SentenceDetectorDLModel_c83c27f46b97\n","pipe['sentence_detector@SentenceDetectorDLModel_c83c27f46b97'].setEncoder(com.johnsnowlabs.nlp.annotators.sentence_detector_dl.SentenceDetectorDLEncoder@103a8839) | Info: Data encoder | Currently set to : com.johnsnowlabs.nlp.annotators.sentence_detector_dl.SentenceDetectorDLEncoder@103a8839\n","pipe['sentence_detector@SentenceDetectorDLModel_c83c27f46b97'].setImpossiblePenultimates(['Bros', 'No', 'al', 'vs', 'etc', 'Fig', 'Dr', 'Prof', 'PhD', 'MD', 'Co', 'Corp', 'Inc', 'bros', 'VS', 'Vs', 'ETC', 'fig', 'dr', 'prof', 'PHD', 'phd', 'md', 'co', 'corp', 'inc', 'Jan', 'Feb', 'Mar', 'Apr', 'Jul', 'Aug', 'Sep', 'Sept', 'Oct', 'Nov', 'Dec', 'St', 'st', 'AM', 'PM', 'am', 'pm', 'e.g', 'f.e', 'i.e']) | Info: Impossible penultimates | Currently set to : ['Bros', 'No', 'al', 'vs', 'etc', 'Fig', 'Dr', 'Prof', 'PhD', 'MD', 'Co', 'Corp', 'Inc', 'bros', 'VS', 'Vs', 'ETC', 'fig', 'dr', 'prof', 'PHD', 'phd', 'md', 'co', 'corp', 'inc', 'Jan', 'Feb', 'Mar', 'Apr', 'Jul', 'Aug', 'Sep', 'Sept', 'Oct', 'Nov', 'Dec', 'St', 'st', 'AM', 'PM', 'am', 'pm', 'e.g', 'f.e', 'i.e']\n","pipe['sentence_detector@SentenceDetectorDLModel_c83c27f46b97'].setModelArchitecture('cnn') | Info: Model architecture (CNN) | Currently set to : cnn\n",">>> pipe['bert_sentence@sent_small_bert_L12_768'] has settable params:\n","pipe['bert_sentence@sent_small_bert_L12_768'].setBatchSize(8) | Info: Size of every batch | Currently set to : 8\n","pipe['bert_sentence@sent_small_bert_L12_768'].setCaseSensitive(False) | Info: whether to ignore case in tokens for embeddings matching | Currently set to : False\n","pipe['bert_sentence@sent_small_bert_L12_768'].setDimension(768) | Info: Number of embedding dimensions | Currently set to : 768\n","pipe['bert_sentence@sent_small_bert_L12_768'].setMaxSentenceLength(128) | Info: Max sentence length to process | Currently set to : 128\n","pipe['bert_sentence@sent_small_bert_L12_768'].setIsLong(False) | Info: Use Long type instead of Int type for inputs buffer - Some Bert models require Long instead of Int. | Currently set to : False\n","pipe['bert_sentence@sent_small_bert_L12_768'].setStorageRef('sent_small_bert_L12_768') | Info: unique reference name for identification | Currently set to : sent_small_bert_L12_768\n",">>> pipe['sentiment_dl@sent_small_bert_L12_768'] has settable params:\n","pipe['sentiment_dl@sent_small_bert_L12_768'].setThreshold(0.6) | Info: The minimum threshold for the final result otheriwse it will be neutral | Currently set to : 0.6\n","pipe['sentiment_dl@sent_small_bert_L12_768'].setThresholdLabel('neutral') | Info: In case the score is less than threshold, what should be the label. Default is neutral. | Currently set to : neutral\n","pipe['sentiment_dl@sent_small_bert_L12_768'].setClasses(['positive', 'negative']) | Info: get the tags used to trained this SentimentDLModel | Currently set to : ['positive', 'negative']\n","pipe['sentiment_dl@sent_small_bert_L12_768'].setStorageRef('sent_small_bert_L12_768') | Info: unique reference name for identification | Currently set to : sent_small_bert_L12_768\n"],"name":"stdout"}]},{"cell_type":"code","metadata":{"id":"F_mfqyyyKGkV"},"source":[""],"execution_count":null,"outputs":[]}]} \ No newline at end of file +{ + "nbformat": 4, + "nbformat_minor": 0, + "metadata": { + "colab": { + "provenance": [], + "collapsed_sections": [ + "zkufh760uvF3" + ] + }, + "kernelspec": { + "display_name": "Python 3", + "name": "python3" + } + }, + "cells": [ + { + "cell_type": "markdown", + "metadata": { + "id": "zkufh760uvF3" + }, + "source": [ + "![JohnSnowLabs](https://nlp.johnsnowlabs.com/assets/images/logo.png)\n", + "\n", + "[![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/JohnSnowLabs/nlu/blob/master/examples/colab/Training/binary_text_classification/NLU_training_sentiment_classifier_demo_natural_disasters.ipynb)\n", + "\n", + "\n", + "# Training a Sentiment Analysis Classifier with NLU\n", + "## 2 Class Natural Disasters Sentiment Classifer Training\n", + "With the [SentimentDL model](https://nlp.johnsnowlabs.com/docs/en/annotators#sentimentdl-multi-class-sentiment-analysis-annotator) from Spark NLP you can achieve State Of the Art results on any multi class text classification problem\n", + "\n", + "This notebook showcases the following features :\n", + "\n", + "- How to train the deep learning classifier\n", + "- How to store a pipeline to disk\n", + "- How to load the pipeline from disk (Enables NLU offline mode)\n", + "\n", + "You can achieve these results or even better on this dataset with training data:\n", + "\n", + "\n", + "
\n", + "\n", + "![image.png](data:image/png;base64,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)\n", + "\n", + "You can achieve these results or even better on this dataset with test data:\n", + "\n", + "\n", + "
\n", + "\n", + "\n", + "![Screenshot 2021-02-25 142700.png](data:image/png;base64,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)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "dur2drhW5Rvi" + }, + "source": [ + "# 1. Install Java 8 and NLU" + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "hFGnBCHavltY" + }, + "source": [ + "!pip install -q johnsnowlabs" + ], + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "f4KkTfnR5Ugg" + }, + "source": [ + "# 2. Download Disaster Sentiment dataset\n", + "https://www.kaggle.com/vstepanenko/disaster-tweets\n", + "#Context\n", + "\n", + "The file contains over 11,000 tweets associated with disaster keywords like “crash”, “quarantine”, and “bush fires” as well as the location and keyword itself. The data structure was inherited from Disasters on social media\n", + "\n", + "The tweets were collected on Jan 14th, 2020.\n", + "\n", + "Some of the topics people were tweeting:\n", + "\n", + "The eruption of Taal Volcano in Batangas, Philippines\n", + "Coronavirus\n", + "Bushfires in Australia\n", + "Iran downing of the airplane flight PS752\n", + "Disclaimer: The dataset contains text that may be considered profane, vulgar, or offensive." + ] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "OrVb5ZMvvrQD", + "outputId": "aae15220-50fe-4645-9720-2b2e368f049b" + }, + "source": [ + "! wget https://s3.amazonaws.com/auxdata.johnsnowlabs.com/public/resources/en/classifier-dl/disaster_tweets/tweets.csv\n" + ], + "execution_count": 2, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "--2023-11-03 13:51:47-- https://s3.amazonaws.com/auxdata.johnsnowlabs.com/public/resources/en/classifier-dl/disaster_tweets/tweets.csv\n", + "Resolving s3.amazonaws.com (s3.amazonaws.com)... 54.231.197.160, 52.217.86.86, 52.217.175.88, ...\n", + "Connecting to s3.amazonaws.com (s3.amazonaws.com)|54.231.197.160|:443... connected.\n", + "HTTP request sent, awaiting response... 200 OK\n", + "Length: 1615005 (1.5M) [text/csv]\n", + "Saving to: ‘tweets.csv’\n", + "\n", + "tweets.csv 100%[===================>] 1.54M 3.54MB/s in 0.4s \n", + "\n", + "2023-11-03 13:51:48 (3.54 MB/s) - ‘tweets.csv’ saved [1615005/1615005]\n", + "\n" + ] + } + ] + }, + { + "cell_type": "code", + "source": [ + "train_df" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 424 + }, + "id": "3Fu5MWAddMSF", + "outputId": "e4c88301-1f62-419f-8990-83340362379d" + }, + "execution_count": 5, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + " id keyword location \\\n", + "2 2 ablaze New York City \n", + "3 3 ablaze Morgantown, WV \n", + "5 5 ablaze OC \n", + "6 6 ablaze London, England \n", + "7 7 ablaze Bharat \n", + "... ... ... ... \n", + "11362 11362 wrecked feuille d'érable \n", + "11365 11365 wrecked Blue State in a red sea \n", + "11366 11366 wrecked arohaonces \n", + "11367 11367 wrecked 🇵🇭 \n", + "11368 11368 wrecked auroraborealis \n", + "\n", + " text target \n", + "2 Arsonist sets cars ablaze at dealership https:... 1 \n", + "3 Arsonist sets cars ablaze at dealership https:... 1 \n", + "5 If this child was Chinese, this tweet would ha... 0 \n", + "6 Several houses have been set ablaze in Ngemsib... 1 \n", + "7 Asansol: A BJP office in Salanpur village was ... 1 \n", + "... ... ... \n", + "11362 Stell wrecked ako palagi sayo. Haha. #ALABTopS... 0 \n", + "11365 Media should have warned us well in advance. T... 0 \n", + "11366 i feel directly attacked 💀 i consider moonb... 0 \n", + "11367 i feel directly attacked 💀 i consider moonb... 0 \n", + "11368 ok who remember \"outcast\" nd the \"dora\" au?? T... 0 \n", + "\n", + "[7952 rows x 5 columns]" + ], + "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", + " \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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
idkeywordlocationtexttarget
22ablazeNew York CityArsonist sets cars ablaze at dealership https:...1
33ablazeMorgantown, WVArsonist sets cars ablaze at dealership https:...1
55ablazeOCIf this child was Chinese, this tweet would ha...0
66ablazeLondon, EnglandSeveral houses have been set ablaze in Ngemsib...1
77ablazeBharatAsansol: A BJP office in Salanpur village was ...1
..................
1136211362wreckedfeuille d'érableStell wrecked ako palagi sayo. Haha. #ALABTopS...0
1136511365wreckedBlue State in a red seaMedia should have warned us well in advance. T...0
1136611366wreckedarohaoncesi feel directly attacked 💀 i consider moonb...0
1136711367wrecked🇵🇭i feel directly attacked 💀 i consider moonb...0
1136811368wreckedauroraborealisok who remember \"outcast\" nd the \"dora\" au?? T...0
\n", + "

7952 rows × 5 columns

\n", + "
\n", + "
\n", + "\n", + "
\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "
\n", + "\n", + "\n", + "
\n", + " \n", + "\n", + "\n", + "\n", + " \n", + "
\n", + "
\n", + "
\n" + ] + }, + "metadata": {}, + "execution_count": 5 + } + ] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 458 + }, + "id": "y4xSRWIhwT28", + "outputId": "d01f0b51-19d4-4d9c-f22d-4897c6b2bd20" + }, + "source": [ + "import pandas as pd\n", + "train_path = '/content/tweets.csv'\n", + "\n", + "train_df = pd.read_csv(train_path,sep=\",\", encoding='latin-1')\n", + "train_df.rename(columns={'target': 'y'}, inplace=True)\n", + "\n", + "# the text data to use for classification should be in a column named 'text'\n", + "columns=['text','y']\n", + "train_df = train_df.dropna()\n", + "\n", + "train_df = train_df[columns]\n", + "train_df = train_df[~train_df[\"y\"].isin([\"neutral\"])]\n", + "train_df['y'] = train_df['y'].replace({0: 'negative', 1: 'positive'})\n", + "\n", + "positive = train_df[train_df['y']==(\"positive\")].iloc[:1500]\n", + "negative = train_df[train_df['y']==(\"negative\")].iloc[:1500]\n", + "positive = positive.append(negative, ignore_index = True)\n", + "positive = positive.sample(frac=1).reset_index(drop=True)\n", + "train_df = positive\n", + "\n", + "from sklearn.model_selection import train_test_split\n", + "\n", + "train_df, test_df = train_test_split(train_df, test_size=0.2)\n", + "train_df\n" + ], + "execution_count": 19, + "outputs": [ + { + "output_type": "stream", + "name": "stderr", + "text": [ + ":17: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " positive = positive.append(negative, ignore_index = True)\n" + ] + }, + { + "output_type": "execute_result", + "data": { + "text/plain": [ + " text y\n", + "1786 Arsonist sets cars ablaze at dealership https:... positive\n", + "2465 Travis Manawa [about Brandon's group]: I think... negative\n", + "1318 If a scientist said if you jump off a cliff yo... negative\n", + "2177 #StormBrendon is also bringing high winds, so ... positive\n", + "293 Like , I'm really talking about blending gener... negative\n", + "... ... ...\n", + "666 US Troops Clear Rubble from Iraq Base Days Aft... positive\n", + "2843 can we create an anti-bioterrorism commission? negative\n", + "312 When cultures collide! #southernspain https://... negative\n", + "2072 A look inside a tree that has been struck by l... positive\n", + "2024 Two lanes have been closed while emergency ser... positive\n", + "\n", + "[2400 rows x 2 columns]" + ], + "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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
texty
1786Arsonist sets cars ablaze at dealership https:...positive
2465Travis Manawa [about Brandon's group]: I think...negative
1318If a scientist said if you jump off a cliff yo...negative
2177#StormBrendon is also bringing high winds, so ...positive
293Like , I'm really talking about blending gener...negative
.........
666US Troops Clear Rubble from Iraq Base Days Aft...positive
2843can we create an anti-bioterrorism commission?negative
312When cultures collide! #southernspain https://...negative
2072A look inside a tree that has been struck by l...positive
2024Two lanes have been closed while emergency ser...positive
\n", + "

2400 rows × 2 columns

\n", + "
\n", + "
\n", + "\n", + "
\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "
\n", + "\n", + "\n", + "
\n", + " \n", + "\n", + "\n", + "\n", + " \n", + "
\n", + "
\n", + "
\n" + ] + }, + "metadata": {}, + "execution_count": 19 + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "0296Om2C5anY" + }, + "source": [ + "# 3. Train Deep Learning Classifier using nlu.load('train.sentiment')\n", + "\n", + "You dataset label column should be named 'y' and the feature column with text data should be named 'text'" + ] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 1000 + }, + "id": "3ZIPkRkWftBG", + "outputId": "3e5f0825-bfd1-402a-e273-5e1656753bd9" + }, + "source": [ + "from johnsnowlabs import nlp\n", + "from sklearn.metrics import classification_report\n", + "# load a trainable pipeline by specifying the train. prefix and fit it on a datset with label and text columns\n", + "# by default the Universal Sentence Encoder (USE) Sentence embeddings are used for generation\n", + "trainable_pipe = nlp.load('train.sentiment')\n", + "fitted_pipe = trainable_pipe.fit(train_df.iloc[:50])\n", + "\n", + "# predict with the trainable pipeline on dataset and get predictions\n", + "preds = fitted_pipe.predict(train_df.iloc[:50],output_level='document')\n", + "#sentence detector that is part of the pipe generates sone NaNs. lets drop them first\n", + "preds.dropna(inplace=True)\n", + "print(classification_report(preds['y'], preds['sentiment']))\n", + "\n", + "preds" + ], + "execution_count": 20, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Warning::Spark Session already created, some configs may not take.\n", + "sent_small_bert_L2_128 download started this may take some time.\n", + "Approximate size to download 16.1 MB\n", + "[OK!]\n", + " precision recall f1-score support\n", + "\n", + " negative 0.56 1.00 0.72 28\n", + " positive 0.00 0.00 0.00 22\n", + "\n", + " accuracy 0.56 50\n", + " macro avg 0.28 0.50 0.36 50\n", + "weighted avg 0.31 0.56 0.40 50\n", + "\n" + ] + }, + { + "output_type": "execute_result", + "data": { + "text/plain": [ + " document \\\n", + "0 Arsonist sets cars ablaze at dealership https:... \n", + "1 Travis Manawa [about Brandon's group]: I think... \n", + "2 If a scientist said if you jump off a cliff yo... \n", + "3 #StormBrendon is also bringing high winds, so ... \n", + "4 Like , I'm really talking about blending gener... \n", + "5 Seriously though... If that defender was taken... \n", + "6 Chemical Hazard - Advice for Cobram. For more ... \n", + "7 2,400 jobs are at stake should the deal fall t... \n", + "8 Western Cape blood stocks down to just four da... \n", + "9 Last night in Sweden 🇸🇪 2 BOMBINGS. - Th... \n", + "10 BREAKING: Ukrainian President Volodymyr Zelens... \n", + "11 Here's what you can learn from the conservativ... \n", + "12 Rajneeti News (Stardust: Oldest material on ea... \n", + "13 In 2008, Laskar and Gastineau simulated 2500 f... \n", + "14 Why are you still calling it a plane crash ðŸ§... \n", + "15 Report recieved of a 9 vehicle RTC on M66 betw... \n", + "16 ** Cleared ** The vehicles involved in the col... \n", + "17 105 is the number to call if you have a power ... \n", + "18 Stress is something that affects many of us. I... \n", + "19 Re: #AustraliaBushfires, a question for any #f... \n", + "20 Enormous exploding sinkhole in China swallows ... \n", + "21 This creature who’s soul is no longer claren... \n", + "22 In 70 CE Titus the son of the Roman Emperor Ve... \n", + "23 #BREAKING: Trudeau says the 57 Canadians kille... \n", + "24 airplane accident answers. The US designated t... \n", + "25 Unlike previous State of the nation addresses,... \n", + "26 Woodbury takes emergency action to address #wa... \n", + "27 Mudslide closes Kailua-bound lane of Pali High... \n", + "28 ᴏʀᴘʜᴀɴs... ᴛʜᴇʏ'ʀᴇ ɴᴏᴛ ... \n", + "29 Eduardo Degrano looks at the damage to his hom... \n", + "30 darinde...how i wish i could put these in hot ... \n", + "31 Earthquake Information No.1 Date and Time: 14 ... \n", + "32 “It’s a blight on the country as a whole.â... \n", + "33 I don't mind being your enemy if you're an ene... \n", + "34 A follow-up to yesterday's Pakistan post: In t... \n", + "35 “Passed away.” This euphemistic trash is p... \n", + "36 I wonder how many homes could have been saved ... \n", + "37 I just zoom it and took ss and feel attack.. H... \n", + "38 Human Body Parts Discovered In Bag In Dublin h... \n", + "39 It is not just an Australian problem. We need ... \n", + "40 If I didn't need my Crutch I would seriously w... \n", + "41 But it eventually will have to work without...... \n", + "42 ... #MAGA5G.LiVEViL+ my recommended read not f... \n", + "43 This earlier collision N'bound between J9 Red ... \n", + "44 I feel attacked. https://t.co/PrtvRimq6y \n", + "45 For the past several months, after imposing a ... \n", + "46 Yuck! Looks like she's wearing a body bag. May... \n", + "47 Such a loss to and the people of NE Fife. pays... \n", + "48 This rain going dumb, it’s flooding now \n", + "49 WEATHER ALERT: Severe Thunderstorm Warning inc... \n", + "\n", + " sentence_embedding_small_bert_L2_128 sentiment \\\n", + "0 [-0.1667916625738144, 1.0302923917770386, 0.18... negative \n", + "1 [-0.9610550999641418, 0.13062980771064758, -0.... negative \n", + "2 [-0.6688402891159058, 0.640354335308075, 0.369... negative \n", + "3 [-1.0540131330490112, 0.8802893757820129, -0.6... negative \n", + "4 [-1.0963889360427856, -0.39644378423690796, 0.... negative \n", + "5 [-0.9136804938316345, 0.593141496181488, -0.13... negative \n", + "6 [-0.38091930747032166, 0.6411349177360535, 0.1... negative \n", + "7 [-0.44847720861434937, 0.5910513997077942, -0.... negative \n", + "8 [-0.5973049402236938, 0.3307306170463562, -0.1... negative \n", + "9 [-0.5309799313545227, -0.5059896111488342, -0.... negative \n", + "10 [-1.1355115175247192, -0.24506860971450806, -0... negative \n", + "11 [-1.1318162679672241, 0.4271548390388489, -0.1... negative \n", + "12 [-0.4446831941604614, -0.11513718217611313, 0.... negative \n", + "13 [-0.7734904885292053, -0.19835318624973297, -0... negative \n", + "14 [-0.12437181919813156, 1.112841010093689, 0.27... negative \n", + "15 [-0.38135823607444763, 1.1142768859863281, -0.... negative \n", + "16 [-0.2368348389863968, 0.9701917171478271, -0.3... negative \n", + "17 [-0.8241100907325745, 1.1454272270202637, -0.0... negative \n", + "18 [-0.9658268690109253, 0.5662633776664734, -0.2... negative \n", + "19 [-0.6997240781784058, 0.5168095827102661, 0.12... negative \n", + "20 [-0.5793707370758057, -0.18351595103740692, -0... negative \n", + "21 [-0.4663412868976593, 0.04406387358903885, 0.1... negative \n", + "22 [-0.8847564458847046, -0.1676793396472931, -0.... negative \n", + "23 [-0.45176926255226135, -0.1339559406042099, -0... negative \n", + "24 [-0.2922760844230652, 0.3953195810317993, -0.1... negative \n", + "25 [-0.8965665698051453, 0.9926007986068726, -0.3... negative \n", + "26 [-0.7830190658569336, 0.8649871349334717, 0.20... negative \n", + "27 [-0.42747634649276733, 0.13894236087799072, -0... negative \n", + "28 [-0.5791727304458618, 0.11972904205322266, 0.4... negative \n", + "29 [-1.1623308658599854, 0.569926917552948, -0.58... negative \n", + "30 [-1.5163923501968384, 0.6165133118629456, -0.5... negative \n", + "31 [-1.085410714149475, -0.15019290149211884, -0.... negative \n", + "32 [-0.5412101745605469, 0.611747682094574, -0.00... negative \n", + "33 [-0.6546711325645447, 0.43016937375068665, -0.... negative \n", + "34 [-1.091268539428711, -0.17232197523117065, -0.... negative \n", + "35 [-1.0350548028945923, 0.04470200464129448, -0.... negative \n", + "36 [-0.6520278453826904, 0.6858862042427063, -0.3... negative \n", + "37 [-0.9297969937324524, -0.12180554866790771, 0.... negative \n", + "38 [-0.6394882202148438, 0.8264853954315186, 0.34... negative \n", + "39 [-0.7464641332626343, 0.9418659806251526, -0.3... negative \n", + "40 [-1.1001498699188232, 1.0316743850708008, -0.3... negative \n", + "41 [-0.6016444563865662, 0.95436030626297, -0.232... negative \n", + "42 [-0.8835289478302002, 0.3090209364891052, 0.29... negative \n", + "43 [-0.19473275542259216, 0.8363125920295715, 0.0... negative \n", + "44 [-0.4955633580684662, 0.16522228717803955, 0.6... negative \n", + "45 [-0.5843112468719482, 0.04129549860954285, 0.2... negative \n", + "46 [-1.058443307876587, 0.23154138028621674, -0.4... negative \n", + "47 [-0.9249093532562256, -0.045939963310956955, -... negative \n", + "48 [-1.7112693786621094, 0.5982310175895691, -0.2... negative \n", + "49 [-0.7861663699150085, 0.22981716692447662, -0.... negative \n", + "\n", + " sentiment_confidence text \\\n", + "0 8.0 Arsonist sets cars ablaze at dealership https:... \n", + "1 2.0 Travis Manawa [about Brandon's group]: I think... \n", + "2 3.0 If a scientist said if you jump off a cliff yo... \n", + "3 4.0 #StormBrendon is also bringing high winds, so ... \n", + "4 1.0 Like , I'm really talking about blending gener... \n", + "5 4.0 Seriously though... If that defender was taken... \n", + "6 3.0 Chemical Hazard - Advice for Cobram. For more ... \n", + "7 5.0 2,400 jobs are at stake should the deal fall t... \n", + "8 8.0 Western Cape blood stocks down to just four da... \n", + "9 0.0 Last night in Sweden 🇸🇪 2 BOMBINGS. - Th... \n", + "10 0.0 BREAKING: Ukrainian President Volodymyr Zelens... \n", + "11 3.0 Here's what you can learn from the conservativ... \n", + "12 0.0 Rajneeti News (Stardust: Oldest material on ea... \n", + "13 8.0 In 2008, Laskar and Gastineau simulated 2500 f... \n", + "14 2.0 Why are you still calling it a plane crash ðŸ§... \n", + "15 0.0 Report recieved of a 9 vehicle RTC on M66 betw... \n", + "16 0.0 ** Cleared ** The vehicles involved in the col... \n", + "17 3.0 105 is the number to call if you have a power ... \n", + "18 6.0 Stress is something that affects many of us. I... \n", + "19 5.0 Re: #AustraliaBushfires, a question for any #f... \n", + "20 9.0 Enormous exploding sinkhole in China swallows ... \n", + "21 3.0 This creature who’s soul is no longer claren... \n", + "22 9.0 In 70 CE Titus the son of the Roman Emperor Ve... \n", + "23 0.0 #BREAKING: Trudeau says the 57 Canadians kille... \n", + "24 5.0 airplane accident answers. The US designated t... \n", + "25 4.0 Unlike previous State of the nation addresses,... \n", + "26 7.0 Woodbury takes emergency action to address #wa... \n", + "27 0.0 Mudslide closes Kailua-bound lane of Pali High... \n", + "28 9.0 ᴏʀᴘʜᴀɴs... ᴛʜᴇʏ'ʀᴇ ɴᴏᴛ ... \n", + "29 2.0 Eduardo Degrano looks at the damage to his hom... \n", + "30 1.0 darinde...how i wish i could put these in hot ... \n", + "31 0.0 Earthquake Information No.1 Date and Time: 14 ... \n", + "32 4.0 “It’s a blight on the country as a whole.â... \n", + "33 1.0 I don't mind being your enemy if you're an ene... \n", + "34 9.0 A follow-up to yesterday's Pakistan post: In t... \n", + "35 3.0 “Passed away.” This euphemistic trash is p... \n", + "36 3.0 I wonder how many homes could have been saved ... \n", + "37 2.0 I just zoom it and took ss and feel attack.. H... \n", + "38 6.0 Human Body Parts Discovered In Bag In Dublin h... \n", + "39 5.0 It is not just an Australian problem. We need ... \n", + "40 2.0 If I didn't need my Crutch I would seriously w... \n", + "41 2.0 But it eventually will have to work without...... \n", + "42 2.0 ... #MAGA5G.LiVEViL+ my recommended read not f... \n", + "43 8.0 This earlier collision N'bound between J9 Red ... \n", + "44 2.0 I feel attacked. https://t.co/PrtvRimq6y \n", + "45 8.0 For the past several months, after imposing a ... \n", + "46 1.0 Yuck! Looks like she's wearing a body bag. May... \n", + "47 1.0 Such a loss to and the people of NE Fife. pays... \n", + "48 2.0 This rain going dumb, it’s flooding now \n", + "49 0.0 WEATHER ALERT: Severe Thunderstorm Warning inc... \n", + "\n", + " y \n", + "0 positive \n", + "1 negative \n", + "2 negative \n", + "3 positive \n", + "4 negative \n", + "5 positive \n", + "6 positive \n", + "7 negative \n", + "8 negative \n", + "9 positive \n", + "10 positive \n", + "11 negative \n", + "12 negative \n", + "13 negative \n", + "14 negative \n", + "15 positive \n", + "16 positive \n", + "17 positive \n", + "18 negative \n", + "19 negative \n", + "20 positive \n", + "21 negative \n", + "22 positive \n", + "23 positive \n", + "24 negative \n", + "25 negative \n", + "26 positive \n", + "27 positive \n", + "28 negative \n", + "29 negative \n", + "30 negative \n", + "31 positive \n", + "32 negative \n", + "33 negative \n", + "34 positive \n", + "35 negative \n", + "36 negative \n", + "37 negative \n", + "38 positive \n", + "39 negative \n", + "40 positive \n", + "41 negative \n", + "42 negative \n", + "43 positive \n", + "44 negative \n", + "45 positive \n", + "46 negative \n", + "47 negative \n", + "48 positive \n", + "49 positive " + ], + "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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + "
documentsentence_embedding_small_bert_L2_128sentimentsentiment_confidencetexty
0Arsonist sets cars ablaze at dealership https:...[-0.1667916625738144, 1.0302923917770386, 0.18...negative8.0Arsonist sets cars ablaze at dealership https:...positive
1Travis Manawa [about Brandon's group]: I think...[-0.9610550999641418, 0.13062980771064758, -0....negative2.0Travis Manawa [about Brandon's group]: I think...negative
2If a scientist said if you jump off a cliff yo...[-0.6688402891159058, 0.640354335308075, 0.369...negative3.0If a scientist said if you jump off a cliff yo...negative
3#StormBrendon is also bringing high winds, so ...[-1.0540131330490112, 0.8802893757820129, -0.6...negative4.0#StormBrendon is also bringing high winds, so ...positive
4Like , I'm really talking about blending gener...[-1.0963889360427856, -0.39644378423690796, 0....negative1.0Like , I'm really talking about blending gener...negative
5Seriously though... If that defender was taken...[-0.9136804938316345, 0.593141496181488, -0.13...negative4.0Seriously though... If that defender was taken...positive
6Chemical Hazard - Advice for Cobram. For more ...[-0.38091930747032166, 0.6411349177360535, 0.1...negative3.0Chemical Hazard - Advice for Cobram. For more ...positive
72,400 jobs are at stake should the deal fall t...[-0.44847720861434937, 0.5910513997077942, -0....negative5.02,400 jobs are at stake should the deal fall t...negative
8Western Cape blood stocks down to just four da...[-0.5973049402236938, 0.3307306170463562, -0.1...negative8.0Western Cape blood stocks down to just four da...negative
9Last night in Sweden 🇸🇪 2 BOMBINGS. - Th...[-0.5309799313545227, -0.5059896111488342, -0....negative0.0Last night in Sweden 🇸🇪 2 BOMBINGS. - Th...positive
10BREAKING: Ukrainian President Volodymyr Zelens...[-1.1355115175247192, -0.24506860971450806, -0...negative0.0BREAKING: Ukrainian President Volodymyr Zelens...positive
11Here's what you can learn from the conservativ...[-1.1318162679672241, 0.4271548390388489, -0.1...negative3.0Here's what you can learn from the conservativ...negative
12Rajneeti News (Stardust: Oldest material on ea...[-0.4446831941604614, -0.11513718217611313, 0....negative0.0Rajneeti News (Stardust: Oldest material on ea...negative
13In 2008, Laskar and Gastineau simulated 2500 f...[-0.7734904885292053, -0.19835318624973297, -0...negative8.0In 2008, Laskar and Gastineau simulated 2500 f...negative
14Why are you still calling it a plane crash ðŸ§...[-0.12437181919813156, 1.112841010093689, 0.27...negative2.0Why are you still calling it a plane crash ðŸ§...negative
15Report recieved of a 9 vehicle RTC on M66 betw...[-0.38135823607444763, 1.1142768859863281, -0....negative0.0Report recieved of a 9 vehicle RTC on M66 betw...positive
16** Cleared ** The vehicles involved in the col...[-0.2368348389863968, 0.9701917171478271, -0.3...negative0.0** Cleared ** The vehicles involved in the col...positive
17105 is the number to call if you have a power ...[-0.8241100907325745, 1.1454272270202637, -0.0...negative3.0105 is the number to call if you have a power ...positive
18Stress is something that affects many of us. I...[-0.9658268690109253, 0.5662633776664734, -0.2...negative6.0Stress is something that affects many of us. I...negative
19Re: #AustraliaBushfires, a question for any #f...[-0.6997240781784058, 0.5168095827102661, 0.12...negative5.0Re: #AustraliaBushfires, a question for any #f...negative
20Enormous exploding sinkhole in China swallows ...[-0.5793707370758057, -0.18351595103740692, -0...negative9.0Enormous exploding sinkhole in China swallows ...positive
21This creature who’s soul is no longer claren...[-0.4663412868976593, 0.04406387358903885, 0.1...negative3.0This creature who’s soul is no longer claren...negative
22In 70 CE Titus the son of the Roman Emperor Ve...[-0.8847564458847046, -0.1676793396472931, -0....negative9.0In 70 CE Titus the son of the Roman Emperor Ve...positive
23#BREAKING: Trudeau says the 57 Canadians kille...[-0.45176926255226135, -0.1339559406042099, -0...negative0.0#BREAKING: Trudeau says the 57 Canadians kille...positive
24airplane accident answers. The US designated t...[-0.2922760844230652, 0.3953195810317993, -0.1...negative5.0airplane accident answers. The US designated t...negative
25Unlike previous State of the nation addresses,...[-0.8965665698051453, 0.9926007986068726, -0.3...negative4.0Unlike previous State of the nation addresses,...negative
26Woodbury takes emergency action to address #wa...[-0.7830190658569336, 0.8649871349334717, 0.20...negative7.0Woodbury takes emergency action to address #wa...positive
27Mudslide closes Kailua-bound lane of Pali High...[-0.42747634649276733, 0.13894236087799072, -0...negative0.0Mudslide closes Kailua-bound lane of Pali High...positive
28ᴏʀᴘʜᴀɴs... ᴛʜᴇʏ'ʀᴇ ɴᴏᴛ ...[-0.5791727304458618, 0.11972904205322266, 0.4...negative9.0ᴏʀᴘʜᴀɴs... ᴛʜᴇʏ'ʀᴇ ɴᴏᴛ ...negative
29Eduardo Degrano looks at the damage to his hom...[-1.1623308658599854, 0.569926917552948, -0.58...negative2.0Eduardo Degrano looks at the damage to his hom...negative
30darinde...how i wish i could put these in hot ...[-1.5163923501968384, 0.6165133118629456, -0.5...negative1.0darinde...how i wish i could put these in hot ...negative
31Earthquake Information No.1 Date and Time: 14 ...[-1.085410714149475, -0.15019290149211884, -0....negative0.0Earthquake Information No.1 Date and Time: 14 ...positive
32“It’s a blight on the country as a whole.â...[-0.5412101745605469, 0.611747682094574, -0.00...negative4.0“It’s a blight on the country as a whole.â...negative
33I don't mind being your enemy if you're an ene...[-0.6546711325645447, 0.43016937375068665, -0....negative1.0I don't mind being your enemy if you're an ene...negative
34A follow-up to yesterday's Pakistan post: In t...[-1.091268539428711, -0.17232197523117065, -0....negative9.0A follow-up to yesterday's Pakistan post: In t...positive
35“Passed away.” This euphemistic trash is p...[-1.0350548028945923, 0.04470200464129448, -0....negative3.0“Passed away.” This euphemistic trash is p...negative
36I wonder how many homes could have been saved ...[-0.6520278453826904, 0.6858862042427063, -0.3...negative3.0I wonder how many homes could have been saved ...negative
37I just zoom it and took ss and feel attack.. H...[-0.9297969937324524, -0.12180554866790771, 0....negative2.0I just zoom it and took ss and feel attack.. H...negative
38Human Body Parts Discovered In Bag In Dublin h...[-0.6394882202148438, 0.8264853954315186, 0.34...negative6.0Human Body Parts Discovered In Bag In Dublin h...positive
39It is not just an Australian problem. We need ...[-0.7464641332626343, 0.9418659806251526, -0.3...negative5.0It is not just an Australian problem. We need ...negative
40If I didn't need my Crutch I would seriously w...[-1.1001498699188232, 1.0316743850708008, -0.3...negative2.0If I didn't need my Crutch I would seriously w...positive
41But it eventually will have to work without......[-0.6016444563865662, 0.95436030626297, -0.232...negative2.0But it eventually will have to work without......negative
42... #MAGA5G.LiVEViL+ my recommended read not f...[-0.8835289478302002, 0.3090209364891052, 0.29...negative2.0... #MAGA5G.LiVEViL+ my recommended read not f...negative
43This earlier collision N'bound between J9 Red ...[-0.19473275542259216, 0.8363125920295715, 0.0...negative8.0This earlier collision N'bound between J9 Red ...positive
44I feel attacked. https://t.co/PrtvRimq6y[-0.4955633580684662, 0.16522228717803955, 0.6...negative2.0I feel attacked. https://t.co/PrtvRimq6ynegative
45For the past several months, after imposing a ...[-0.5843112468719482, 0.04129549860954285, 0.2...negative8.0For the past several months, after imposing a ...positive
46Yuck! Looks like she's wearing a body bag. May...[-1.058443307876587, 0.23154138028621674, -0.4...negative1.0Yuck! Looks like she's wearing a body bag. May...negative
47Such a loss to and the people of NE Fife. pays...[-0.9249093532562256, -0.045939963310956955, -...negative1.0Such a loss to and the people of NE Fife. pays...negative
48This rain going dumb, it’s flooding now[-1.7112693786621094, 0.5982310175895691, -0.2...negative2.0This rain going dumb, it’s flooding nowpositive
49WEATHER ALERT: Severe Thunderstorm Warning inc...[-0.7861663699150085, 0.22981716692447662, -0....negative0.0WEATHER ALERT: Severe Thunderstorm Warning inc...positive
\n", + "
\n", + "
\n", + "\n", + "
\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "
\n", + "\n", + "\n", + "
\n", + " \n", + "\n", + "\n", + "\n", + " \n", + "
\n", + "
\n", + "
\n" + ] + }, + "metadata": {}, + "execution_count": 20 + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "lVyOE2wV0fw_" + }, + "source": [ + "# 4. Test the fitted pipe on new example" + ] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 150 + }, + "id": "qdCUg2MR0PD2", + "outputId": "26791371-6cec-4fc7-cd18-feee3ab9ff33" + }, + "source": [ + "fitted_pipe.predict(\"All the buildings in the capital were destroyed\")" + ], + "execution_count": 21, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "sentence_detector_dl download started this may take some time.\n", + "Approximate size to download 354.6 KB\n", + "[OK!]\n", + "Warning::Spark Session already created, some configs may not take.\n" + ] + }, + { + "output_type": "execute_result", + "data": { + "text/plain": [ + " sentence \\\n", + "0 All the buildings in the capital were destroyed \n", + "\n", + " sentence_embedding_small_bert_L2_128 sentiment \\\n", + "0 [-0.33511286973953247, 0.3084930181503296, -1.... negative \n", + "\n", + " sentiment_confidence \n", + "0 0.99924 " + ], + "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", + "
sentencesentence_embedding_small_bert_L2_128sentimentsentiment_confidence
0All the buildings in the capital were destroyed[-0.33511286973953247, 0.3084930181503296, -1....negative0.99924
\n", + "
\n", + "
\n", + "\n", + "
\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "
\n", + "\n", + "
\n", + "
\n" + ] + }, + "metadata": {}, + "execution_count": 21 + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "xflpwrVjjBVD" + }, + "source": [ + "## 5. Configure pipe training parameters" + ] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "UtsAUGTmOTms", + "outputId": "f3a5243e-8d0b-4d05-c78c-2432e227fb1f" + }, + "source": [ + "trainable_pipe.print_info()" + ], + "execution_count": 22, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "The following parameters are configurable for this NLU pipeline (You can copy paste the examples) :\n", + ">>> component_list['bert_sentence_embeddings@sent_small_bert_L2_128'] has settable params:\n", + "component_list['bert_sentence_embeddings@sent_small_bert_L2_128'].setBatchSize(8) | Info: Size of every batch | Currently set to : 8\n", + "component_list['bert_sentence_embeddings@sent_small_bert_L2_128'].setEngine('tensorflow') | Info: Deep Learning engine used for this model | Currently set to : tensorflow\n", + "component_list['bert_sentence_embeddings@sent_small_bert_L2_128'].setIsLong(False) | Info: Use Long type instead of Int type for inputs buffer - Some Bert models require Long instead of Int. | Currently set to : False\n", + "component_list['bert_sentence_embeddings@sent_small_bert_L2_128'].setMaxSentenceLength(128) | Info: Max sentence length to process | Currently set to : 128\n", + "component_list['bert_sentence_embeddings@sent_small_bert_L2_128'].setDimension(128) | Info: Number of embedding dimensions | Currently set to : 128\n", + "component_list['bert_sentence_embeddings@sent_small_bert_L2_128'].setCaseSensitive(False) | Info: whether to ignore case in tokens for embeddings matching | Currently set to : False\n", + "component_list['bert_sentence_embeddings@sent_small_bert_L2_128'].setStorageRef('sent_small_bert_L2_128') | Info: unique reference name for identification | Currently set to : sent_small_bert_L2_128\n", + ">>> component_list['document_assembler'] has settable params:\n", + "component_list['document_assembler'].setCleanupMode('shrink') | Info: possible values: disabled, inplace, inplace_full, shrink, shrink_full, each, each_full, delete_full | Currently set to : shrink\n", + ">>> component_list['sentiment_dl@sent_small_bert_L2_128'] has settable params:\n", + "component_list['sentiment_dl@sent_small_bert_L2_128'].setEngine('tensorflow') | Info: Deep Learning engine used for this model | Currently set to : tensorflow\n", + "component_list['sentiment_dl@sent_small_bert_L2_128'].setThreshold(0.6) | Info: The minimum threshold for the final result otheriwse it will be neutral | Currently set to : 0.6\n", + "component_list['sentiment_dl@sent_small_bert_L2_128'].setThresholdLabel('neutral') | Info: In case the score is less than threshold, what should be the label. Default is neutral. | Currently set to : neutral\n", + "component_list['sentiment_dl@sent_small_bert_L2_128'].setStorageRef('sent_small_bert_L2_128') | Info: unique reference name for identification | Currently set to : sent_small_bert_L2_128\n" + ] + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "2GJdDNV9jEIe" + }, + "source": [ + "## 6. Retrain with new parameters" + ] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 1000 + }, + "id": "mptfvHx-MMMX", + "outputId": "57da7cc5-2818-4378-a208-e63a5368ce52" + }, + "source": [ + "# Train longer!\n", + "trainable_pipe = nlp.load('train.sentiment')\n", + "trainable_pipe['trainable_sentiment_dl'].setMaxEpochs(5)\n", + "fitted_pipe = trainable_pipe.fit(train_df.iloc[:50])\n", + "# predict with the trainable pipeline on dataset and get predictions\n", + "preds = fitted_pipe.predict(train_df.iloc[:50],output_level='document')\n", + "\n", + "#sentence detector that is part of the pipe generates sone NaNs. lets drop them first\n", + "preds.dropna(inplace=True)\n", + "print(classification_report(preds['y'], preds['sentiment']))\n", + "\n", + "preds" + ], + "execution_count": 23, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Warning::Spark Session already created, some configs may not take.\n", + "Warning::Spark Session already created, some configs may not take.\n", + "sent_small_bert_L2_128 download started this may take some time.\n", + "Approximate size to download 16.1 MB\n", + "[OK!]\n", + " precision recall f1-score support\n", + "\n", + " negative 0.56 1.00 0.72 28\n", + " positive 0.00 0.00 0.00 22\n", + "\n", + " accuracy 0.56 50\n", + " macro avg 0.28 0.50 0.36 50\n", + "weighted avg 0.31 0.56 0.40 50\n", + "\n" + ] + }, + { + "output_type": "execute_result", + "data": { + "text/plain": [ + " document \\\n", + "0 Arsonist sets cars ablaze at dealership https:... \n", + "1 Travis Manawa [about Brandon's group]: I think... \n", + "2 If a scientist said if you jump off a cliff yo... \n", + "3 #StormBrendon is also bringing high winds, so ... \n", + "4 Like , I'm really talking about blending gener... \n", + "5 Seriously though... If that defender was taken... \n", + "6 Chemical Hazard - Advice for Cobram. For more ... \n", + "7 2,400 jobs are at stake should the deal fall t... \n", + "8 Western Cape blood stocks down to just four da... \n", + "9 Last night in Sweden 🇸🇪 2 BOMBINGS. - Th... \n", + "10 BREAKING: Ukrainian President Volodymyr Zelens... \n", + "11 Here's what you can learn from the conservativ... \n", + "12 Rajneeti News (Stardust: Oldest material on ea... \n", + "13 In 2008, Laskar and Gastineau simulated 2500 f... \n", + "14 Why are you still calling it a plane crash ðŸ§... \n", + "15 Report recieved of a 9 vehicle RTC on M66 betw... \n", + "16 ** Cleared ** The vehicles involved in the col... \n", + "17 105 is the number to call if you have a power ... \n", + "18 Stress is something that affects many of us. I... \n", + "19 Re: #AustraliaBushfires, a question for any #f... \n", + "20 Enormous exploding sinkhole in China swallows ... \n", + "21 This creature who’s soul is no longer claren... \n", + "22 In 70 CE Titus the son of the Roman Emperor Ve... \n", + "23 #BREAKING: Trudeau says the 57 Canadians kille... \n", + "24 airplane accident answers. The US designated t... \n", + "25 Unlike previous State of the nation addresses,... \n", + "26 Woodbury takes emergency action to address #wa... \n", + "27 Mudslide closes Kailua-bound lane of Pali High... \n", + "28 ᴏʀᴘʜᴀɴs... ᴛʜᴇʏ'ʀᴇ ɴᴏᴛ ... \n", + "29 Eduardo Degrano looks at the damage to his hom... \n", + "30 darinde...how i wish i could put these in hot ... \n", + "31 Earthquake Information No.1 Date and Time: 14 ... \n", + "32 “It’s a blight on the country as a whole.â... \n", + "33 I don't mind being your enemy if you're an ene... \n", + "34 A follow-up to yesterday's Pakistan post: In t... \n", + "35 “Passed away.” This euphemistic trash is p... \n", + "36 I wonder how many homes could have been saved ... \n", + "37 I just zoom it and took ss and feel attack.. H... \n", + "38 Human Body Parts Discovered In Bag In Dublin h... \n", + "39 It is not just an Australian problem. We need ... \n", + "40 If I didn't need my Crutch I would seriously w... \n", + "41 But it eventually will have to work without...... \n", + "42 ... #MAGA5G.LiVEViL+ my recommended read not f... \n", + "43 This earlier collision N'bound between J9 Red ... \n", + "44 I feel attacked. https://t.co/PrtvRimq6y \n", + "45 For the past several months, after imposing a ... \n", + "46 Yuck! Looks like she's wearing a body bag. May... \n", + "47 Such a loss to and the people of NE Fife. pays... \n", + "48 This rain going dumb, it’s flooding now \n", + "49 WEATHER ALERT: Severe Thunderstorm Warning inc... \n", + "\n", + " sentence_embedding_small_bert_L2_128 sentiment \\\n", + "0 [-0.1667916625738144, 1.0302923917770386, 0.18... negative \n", + "1 [-0.9610550999641418, 0.13062980771064758, -0.... negative \n", + "2 [-0.6688402891159058, 0.640354335308075, 0.369... negative \n", + "3 [-1.0540131330490112, 0.8802893757820129, -0.6... negative \n", + "4 [-1.0963889360427856, -0.39644378423690796, 0.... negative \n", + "5 [-0.9136804938316345, 0.593141496181488, -0.13... negative \n", + "6 [-0.38091930747032166, 0.6411349177360535, 0.1... negative \n", + "7 [-0.44847720861434937, 0.5910513997077942, -0.... negative \n", + "8 [-0.5973049402236938, 0.3307306170463562, -0.1... negative \n", + "9 [-0.5309799313545227, -0.5059896111488342, -0.... negative \n", + "10 [-1.1355115175247192, -0.24506860971450806, -0... negative \n", + "11 [-1.1318162679672241, 0.4271548390388489, -0.1... negative \n", + "12 [-0.4446831941604614, -0.11513718217611313, 0.... negative \n", + "13 [-0.7734904885292053, -0.19835318624973297, -0... negative \n", + "14 [-0.12437181919813156, 1.112841010093689, 0.27... negative \n", + "15 [-0.38135823607444763, 1.1142768859863281, -0.... negative \n", + "16 [-0.2368348389863968, 0.9701917171478271, -0.3... negative \n", + "17 [-0.8241100907325745, 1.1454272270202637, -0.0... negative \n", + "18 [-0.9658268690109253, 0.5662633776664734, -0.2... negative \n", + "19 [-0.6997240781784058, 0.5168095827102661, 0.12... negative \n", + "20 [-0.5793707370758057, -0.18351595103740692, -0... negative \n", + "21 [-0.4663412868976593, 0.04406387358903885, 0.1... negative \n", + "22 [-0.8847564458847046, -0.1676793396472931, -0.... negative \n", + "23 [-0.45176926255226135, -0.1339559406042099, -0... negative \n", + "24 [-0.2922760844230652, 0.3953195810317993, -0.1... negative \n", + "25 [-0.8965665698051453, 0.9926007986068726, -0.3... negative \n", + "26 [-0.7830190658569336, 0.8649871349334717, 0.20... negative \n", + "27 [-0.42747634649276733, 0.13894236087799072, -0... negative \n", + "28 [-0.5791727304458618, 0.11972904205322266, 0.4... negative \n", + "29 [-1.1623308658599854, 0.569926917552948, -0.58... negative \n", + "30 [-1.5163923501968384, 0.6165133118629456, -0.5... negative \n", + "31 [-1.085410714149475, -0.15019290149211884, -0.... negative \n", + "32 [-0.5412101745605469, 0.611747682094574, -0.00... negative \n", + "33 [-0.6546711325645447, 0.43016937375068665, -0.... negative \n", + "34 [-1.091268539428711, -0.17232197523117065, -0.... negative \n", + "35 [-1.0350548028945923, 0.04470200464129448, -0.... negative \n", + "36 [-0.6520278453826904, 0.6858862042427063, -0.3... negative \n", + "37 [-0.9297969937324524, -0.12180554866790771, 0.... negative \n", + "38 [-0.6394882202148438, 0.8264853954315186, 0.34... negative \n", + "39 [-0.7464641332626343, 0.9418659806251526, -0.3... negative \n", + "40 [-1.1001498699188232, 1.0316743850708008, -0.3... negative \n", + "41 [-0.6016444563865662, 0.95436030626297, -0.232... negative \n", + "42 [-0.8835289478302002, 0.3090209364891052, 0.29... negative \n", + "43 [-0.19473275542259216, 0.8363125920295715, 0.0... negative \n", + "44 [-0.4955633580684662, 0.16522228717803955, 0.6... negative \n", + "45 [-0.5843112468719482, 0.04129549860954285, 0.2... negative \n", + "46 [-1.058443307876587, 0.23154138028621674, -0.4... negative \n", + "47 [-0.9249093532562256, -0.045939963310956955, -... negative \n", + "48 [-1.7112693786621094, 0.5982310175895691, -0.2... negative \n", + "49 [-0.7861663699150085, 0.22981716692447662, -0.... negative \n", + "\n", + " sentiment_confidence text \\\n", + "0 0.0 Arsonist sets cars ablaze at dealership https:... \n", + "1 8.0 Travis Manawa [about Brandon's group]: I think... \n", + "2 3.0 If a scientist said if you jump off a cliff yo... \n", + "3 8.0 #StormBrendon is also bringing high winds, so ... \n", + "4 1.0 Like , I'm really talking about blending gener... \n", + "5 5.0 Seriously though... If that defender was taken... \n", + "6 9.0 Chemical Hazard - Advice for Cobram. For more ... \n", + "7 6.0 2,400 jobs are at stake should the deal fall t... \n", + "8 0.0 Western Cape blood stocks down to just four da... \n", + "9 0.0 Last night in Sweden 🇸🇪 2 BOMBINGS. - Th... \n", + "10 0.0 BREAKING: Ukrainian President Volodymyr Zelens... \n", + "11 1.0 Here's what you can learn from the conservativ... \n", + "12 0.0 Rajneeti News (Stardust: Oldest material on ea... \n", + "13 0.0 In 2008, Laskar and Gastineau simulated 2500 f... \n", + "14 4.0 Why are you still calling it a plane crash ðŸ§... \n", + "15 0.0 Report recieved of a 9 vehicle RTC on M66 betw... \n", + "16 0.0 ** Cleared ** The vehicles involved in the col... \n", + "17 6.0 105 is the number to call if you have a power ... \n", + "18 2.0 Stress is something that affects many of us. I... \n", + "19 0.0 Re: #AustraliaBushfires, a question for any #f... \n", + "20 0.0 Enormous exploding sinkhole in China swallows ... \n", + "21 3.0 This creature who’s soul is no longer claren... \n", + "22 0.0 In 70 CE Titus the son of the Roman Emperor Ve... \n", + "23 0.0 #BREAKING: Trudeau says the 57 Canadians kille... \n", + "24 0.0 airplane accident answers. The US designated t... \n", + "25 3.0 Unlike previous State of the nation addresses,... \n", + "26 0.0 Woodbury takes emergency action to address #wa... \n", + "27 0.0 Mudslide closes Kailua-bound lane of Pali High... \n", + "28 2.0 ᴏʀᴘʜᴀɴs... ᴛʜᴇʏ'ʀᴇ ɴᴏᴛ ... \n", + "29 7.0 Eduardo Degrano looks at the damage to his hom... \n", + "30 3.0 darinde...how i wish i could put these in hot ... \n", + "31 0.0 Earthquake Information No.1 Date and Time: 14 ... \n", + "32 6.0 “It’s a blight on the country as a whole.â... \n", + "33 7.0 I don't mind being your enemy if you're an ene... \n", + "34 0.0 A follow-up to yesterday's Pakistan post: In t... \n", + "35 2.0 “Passed away.” This euphemistic trash is p... \n", + "36 4.0 I wonder how many homes could have been saved ... \n", + "37 1.0 I just zoom it and took ss and feel attack.. H... \n", + "38 0.0 Human Body Parts Discovered In Bag In Dublin h... \n", + "39 5.0 It is not just an Australian problem. We need ... \n", + "40 7.0 If I didn't need my Crutch I would seriously w... \n", + "41 3.0 But it eventually will have to work without...... \n", + "42 2.0 ... #MAGA5G.LiVEViL+ my recommended read not f... \n", + "43 0.0 This earlier collision N'bound between J9 Red ... \n", + "44 6.0 I feel attacked. https://t.co/PrtvRimq6y \n", + "45 0.0 For the past several months, after imposing a ... \n", + "46 2.0 Yuck! Looks like she's wearing a body bag. May... \n", + "47 5.0 Such a loss to and the people of NE Fife. pays... \n", + "48 2.0 This rain going dumb, it’s flooding now \n", + "49 0.0 WEATHER ALERT: Severe Thunderstorm Warning inc... \n", + "\n", + " y \n", + "0 positive \n", + "1 negative \n", + "2 negative \n", + "3 positive \n", + "4 negative \n", + "5 positive \n", + "6 positive \n", + "7 negative \n", + "8 negative \n", + "9 positive \n", + "10 positive \n", + "11 negative \n", + "12 negative \n", + "13 negative \n", + "14 negative \n", + "15 positive \n", + "16 positive \n", + "17 positive \n", + "18 negative \n", + "19 negative \n", + "20 positive \n", + "21 negative \n", + "22 positive \n", + "23 positive \n", + "24 negative \n", + "25 negative \n", + "26 positive \n", + "27 positive \n", + "28 negative \n", + "29 negative \n", + "30 negative \n", + "31 positive \n", + "32 negative \n", + "33 negative \n", + "34 positive \n", + "35 negative \n", + "36 negative \n", + "37 negative \n", + "38 positive \n", + "39 negative \n", + "40 positive \n", + "41 negative \n", + "42 negative \n", + "43 positive \n", + "44 negative \n", + "45 positive \n", + "46 negative \n", + "47 negative \n", + "48 positive \n", + "49 positive " + ], + "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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + "
documentsentence_embedding_small_bert_L2_128sentimentsentiment_confidencetexty
0Arsonist sets cars ablaze at dealership https:...[-0.1667916625738144, 1.0302923917770386, 0.18...negative0.0Arsonist sets cars ablaze at dealership https:...positive
1Travis Manawa [about Brandon's group]: I think...[-0.9610550999641418, 0.13062980771064758, -0....negative8.0Travis Manawa [about Brandon's group]: I think...negative
2If a scientist said if you jump off a cliff yo...[-0.6688402891159058, 0.640354335308075, 0.369...negative3.0If a scientist said if you jump off a cliff yo...negative
3#StormBrendon is also bringing high winds, so ...[-1.0540131330490112, 0.8802893757820129, -0.6...negative8.0#StormBrendon is also bringing high winds, so ...positive
4Like , I'm really talking about blending gener...[-1.0963889360427856, -0.39644378423690796, 0....negative1.0Like , I'm really talking about blending gener...negative
5Seriously though... If that defender was taken...[-0.9136804938316345, 0.593141496181488, -0.13...negative5.0Seriously though... If that defender was taken...positive
6Chemical Hazard - Advice for Cobram. For more ...[-0.38091930747032166, 0.6411349177360535, 0.1...negative9.0Chemical Hazard - Advice for Cobram. For more ...positive
72,400 jobs are at stake should the deal fall t...[-0.44847720861434937, 0.5910513997077942, -0....negative6.02,400 jobs are at stake should the deal fall t...negative
8Western Cape blood stocks down to just four da...[-0.5973049402236938, 0.3307306170463562, -0.1...negative0.0Western Cape blood stocks down to just four da...negative
9Last night in Sweden 🇸🇪 2 BOMBINGS. - Th...[-0.5309799313545227, -0.5059896111488342, -0....negative0.0Last night in Sweden 🇸🇪 2 BOMBINGS. - Th...positive
10BREAKING: Ukrainian President Volodymyr Zelens...[-1.1355115175247192, -0.24506860971450806, -0...negative0.0BREAKING: Ukrainian President Volodymyr Zelens...positive
11Here's what you can learn from the conservativ...[-1.1318162679672241, 0.4271548390388489, -0.1...negative1.0Here's what you can learn from the conservativ...negative
12Rajneeti News (Stardust: Oldest material on ea...[-0.4446831941604614, -0.11513718217611313, 0....negative0.0Rajneeti News (Stardust: Oldest material on ea...negative
13In 2008, Laskar and Gastineau simulated 2500 f...[-0.7734904885292053, -0.19835318624973297, -0...negative0.0In 2008, Laskar and Gastineau simulated 2500 f...negative
14Why are you still calling it a plane crash ðŸ§...[-0.12437181919813156, 1.112841010093689, 0.27...negative4.0Why are you still calling it a plane crash ðŸ§...negative
15Report recieved of a 9 vehicle RTC on M66 betw...[-0.38135823607444763, 1.1142768859863281, -0....negative0.0Report recieved of a 9 vehicle RTC on M66 betw...positive
16** Cleared ** The vehicles involved in the col...[-0.2368348389863968, 0.9701917171478271, -0.3...negative0.0** Cleared ** The vehicles involved in the col...positive
17105 is the number to call if you have a power ...[-0.8241100907325745, 1.1454272270202637, -0.0...negative6.0105 is the number to call if you have a power ...positive
18Stress is something that affects many of us. I...[-0.9658268690109253, 0.5662633776664734, -0.2...negative2.0Stress is something that affects many of us. I...negative
19Re: #AustraliaBushfires, a question for any #f...[-0.6997240781784058, 0.5168095827102661, 0.12...negative0.0Re: #AustraliaBushfires, a question for any #f...negative
20Enormous exploding sinkhole in China swallows ...[-0.5793707370758057, -0.18351595103740692, -0...negative0.0Enormous exploding sinkhole in China swallows ...positive
21This creature who’s soul is no longer claren...[-0.4663412868976593, 0.04406387358903885, 0.1...negative3.0This creature who’s soul is no longer claren...negative
22In 70 CE Titus the son of the Roman Emperor Ve...[-0.8847564458847046, -0.1676793396472931, -0....negative0.0In 70 CE Titus the son of the Roman Emperor Ve...positive
23#BREAKING: Trudeau says the 57 Canadians kille...[-0.45176926255226135, -0.1339559406042099, -0...negative0.0#BREAKING: Trudeau says the 57 Canadians kille...positive
24airplane accident answers. The US designated t...[-0.2922760844230652, 0.3953195810317993, -0.1...negative0.0airplane accident answers. The US designated t...negative
25Unlike previous State of the nation addresses,...[-0.8965665698051453, 0.9926007986068726, -0.3...negative3.0Unlike previous State of the nation addresses,...negative
26Woodbury takes emergency action to address #wa...[-0.7830190658569336, 0.8649871349334717, 0.20...negative0.0Woodbury takes emergency action to address #wa...positive
27Mudslide closes Kailua-bound lane of Pali High...[-0.42747634649276733, 0.13894236087799072, -0...negative0.0Mudslide closes Kailua-bound lane of Pali High...positive
28ᴏʀᴘʜᴀɴs... ᴛʜᴇʏ'ʀᴇ ɴᴏᴛ ...[-0.5791727304458618, 0.11972904205322266, 0.4...negative2.0ᴏʀᴘʜᴀɴs... ᴛʜᴇʏ'ʀᴇ ɴᴏᴛ ...negative
29Eduardo Degrano looks at the damage to his hom...[-1.1623308658599854, 0.569926917552948, -0.58...negative7.0Eduardo Degrano looks at the damage to his hom...negative
30darinde...how i wish i could put these in hot ...[-1.5163923501968384, 0.6165133118629456, -0.5...negative3.0darinde...how i wish i could put these in hot ...negative
31Earthquake Information No.1 Date and Time: 14 ...[-1.085410714149475, -0.15019290149211884, -0....negative0.0Earthquake Information No.1 Date and Time: 14 ...positive
32“It’s a blight on the country as a whole.â...[-0.5412101745605469, 0.611747682094574, -0.00...negative6.0“It’s a blight on the country as a whole.â...negative
33I don't mind being your enemy if you're an ene...[-0.6546711325645447, 0.43016937375068665, -0....negative7.0I don't mind being your enemy if you're an ene...negative
34A follow-up to yesterday's Pakistan post: In t...[-1.091268539428711, -0.17232197523117065, -0....negative0.0A follow-up to yesterday's Pakistan post: In t...positive
35“Passed away.” This euphemistic trash is p...[-1.0350548028945923, 0.04470200464129448, -0....negative2.0“Passed away.” This euphemistic trash is p...negative
36I wonder how many homes could have been saved ...[-0.6520278453826904, 0.6858862042427063, -0.3...negative4.0I wonder how many homes could have been saved ...negative
37I just zoom it and took ss and feel attack.. H...[-0.9297969937324524, -0.12180554866790771, 0....negative1.0I just zoom it and took ss and feel attack.. H...negative
38Human Body Parts Discovered In Bag In Dublin h...[-0.6394882202148438, 0.8264853954315186, 0.34...negative0.0Human Body Parts Discovered In Bag In Dublin h...positive
39It is not just an Australian problem. We need ...[-0.7464641332626343, 0.9418659806251526, -0.3...negative5.0It is not just an Australian problem. We need ...negative
40If I didn't need my Crutch I would seriously w...[-1.1001498699188232, 1.0316743850708008, -0.3...negative7.0If I didn't need my Crutch I would seriously w...positive
41But it eventually will have to work without......[-0.6016444563865662, 0.95436030626297, -0.232...negative3.0But it eventually will have to work without......negative
42... #MAGA5G.LiVEViL+ my recommended read not f...[-0.8835289478302002, 0.3090209364891052, 0.29...negative2.0... #MAGA5G.LiVEViL+ my recommended read not f...negative
43This earlier collision N'bound between J9 Red ...[-0.19473275542259216, 0.8363125920295715, 0.0...negative0.0This earlier collision N'bound between J9 Red ...positive
44I feel attacked. https://t.co/PrtvRimq6y[-0.4955633580684662, 0.16522228717803955, 0.6...negative6.0I feel attacked. https://t.co/PrtvRimq6ynegative
45For the past several months, after imposing a ...[-0.5843112468719482, 0.04129549860954285, 0.2...negative0.0For the past several months, after imposing a ...positive
46Yuck! Looks like she's wearing a body bag. May...[-1.058443307876587, 0.23154138028621674, -0.4...negative2.0Yuck! Looks like she's wearing a body bag. May...negative
47Such a loss to and the people of NE Fife. pays...[-0.9249093532562256, -0.045939963310956955, -...negative5.0Such a loss to and the people of NE Fife. pays...negative
48This rain going dumb, it’s flooding now[-1.7112693786621094, 0.5982310175895691, -0.2...negative2.0This rain going dumb, it’s flooding nowpositive
49WEATHER ALERT: Severe Thunderstorm Warning inc...[-0.7861663699150085, 0.22981716692447662, -0....negative0.0WEATHER ALERT: Severe Thunderstorm Warning inc...positive
\n", + "
\n", + "
\n", + "\n", + "
\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "
\n", + "\n", + "\n", + "
\n", + " \n", + "\n", + "\n", + "\n", + " \n", + "
\n", + "
\n", + "
\n" + ] + }, + "metadata": {}, + "execution_count": 23 + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "qFoT-s1MjTSS" + }, + "source": [ + "# 7. Try training with different Embeddings" + ] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "nxWFzQOhjWC8", + "outputId": "a05a0ef1-4d3e-4c7f-87b7-3ff1849608a3" + }, + "source": [ + "# We can use nlu.print_components(action='embed_sentence') to see every possibler sentence embedding we could use. Lets use bert!\n", + "nlp.nlu.print_components(action='embed_sentence')" + ], + "execution_count": 24, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "For language NLU provides the following Models : \n", + "nlu.load('am.embed_sentence.xlm_roberta') returns Spark NLP model_anno_obj sent_xlm_roberta_base_finetuned_amharic\n", + "For language NLU provides the following Models : \n", + "nlu.load('de.embed_sentence.bert.base_cased') returns Spark NLP model_anno_obj sent_bert_base_cased\n", + "For language NLU provides the following Models : \n", + "nlu.load('el.embed_sentence.bert.base_uncased') returns Spark NLP model_anno_obj sent_bert_base_uncased\n", + "For language NLU provides the following Models : \n", + "nlu.load('en.embed_sentence') returns Spark NLP model_anno_obj tfhub_use\n", + "nlu.load('en.embed_sentence.albert') returns Spark NLP model_anno_obj albert_base_uncased\n", + "nlu.load('en.embed_sentence.bert') returns Spark NLP model_anno_obj sent_bert_base_uncased\n", + "nlu.load('en.embed_sentence.bert.base_uncased_legal') returns Spark NLP model_anno_obj sent_bert_base_uncased_legal\n", + "nlu.load('en.embed_sentence.bert.finetuned') returns Spark NLP model_anno_obj sbert_setfit_finetuned_financial_text_classification\n", + "nlu.load('en.embed_sentence.bert.pubmed') returns Spark NLP model_anno_obj sent_bert_pubmed\n", + "nlu.load('en.embed_sentence.bert.pubmed_squad2') returns Spark NLP model_anno_obj sent_bert_pubmed_squad2\n", + "nlu.load('en.embed_sentence.bert.wiki_books') returns Spark NLP model_anno_obj sent_bert_wiki_books\n", + "nlu.load('en.embed_sentence.bert.wiki_books_mnli') returns Spark NLP model_anno_obj sent_bert_wiki_books_mnli\n", + "nlu.load('en.embed_sentence.bert.wiki_books_qnli') returns Spark NLP model_anno_obj sent_bert_wiki_books_qnli\n", + "nlu.load('en.embed_sentence.bert.wiki_books_qqp') returns Spark NLP model_anno_obj sent_bert_wiki_books_qqp\n", + "nlu.load('en.embed_sentence.bert.wiki_books_squad2') returns Spark NLP model_anno_obj sent_bert_wiki_books_squad2\n", + "nlu.load('en.embed_sentence.bert.wiki_books_sst2') returns Spark NLP model_anno_obj sent_bert_wiki_books_sst2\n", + "nlu.load('en.embed_sentence.bert_base_cased') returns Spark NLP model_anno_obj sent_bert_base_cased\n", + "nlu.load('en.embed_sentence.bert_base_uncased') returns Spark NLP model_anno_obj sent_bert_base_uncased\n", + "nlu.load('en.embed_sentence.bert_large_cased') returns Spark NLP model_anno_obj sent_bert_large_cased\n", + "nlu.load('en.embed_sentence.bert_large_uncased') returns Spark NLP model_anno_obj sent_bert_large_uncased\n", + "nlu.load('en.embed_sentence.bert_use_cmlm_en_base') returns Spark NLP model_anno_obj sent_bert_use_cmlm_en_base\n", + "nlu.load('en.embed_sentence.bert_use_cmlm_en_large') returns Spark NLP model_anno_obj sent_bert_use_cmlm_en_large\n", + "nlu.load('en.embed_sentence.biobert.clinical_base_cased') returns Spark NLP model_anno_obj sent_biobert_clinical_base_cased\n", + "nlu.load('en.embed_sentence.biobert.discharge_base_cased') returns Spark NLP model_anno_obj sent_biobert_discharge_base_cased\n", + "nlu.load('en.embed_sentence.biobert.pmc_base_cased') returns Spark NLP model_anno_obj sent_biobert_pmc_base_cased\n", + "nlu.load('en.embed_sentence.biobert.pubmed_base_cased') returns Spark NLP model_anno_obj sent_biobert_pubmed_base_cased\n", + "nlu.load('en.embed_sentence.biobert.pubmed_large_cased') returns Spark NLP model_anno_obj sent_biobert_pubmed_large_cased\n", + "nlu.load('en.embed_sentence.biobert.pubmed_pmc_base_cased') returns Spark NLP model_anno_obj sent_biobert_pubmed_pmc_base_cased\n", + "nlu.load('en.embed_sentence.covidbert.large_uncased') returns Spark NLP model_anno_obj sent_covidbert_large_uncased\n", + "nlu.load('en.embed_sentence.distil_roberta.distilled_base') returns Spark NLP model_anno_obj sent_distilroberta_base\n", + "nlu.load('en.embed_sentence.doc2vec') returns Spark NLP model_anno_obj doc2vec_gigaword_300\n", + "nlu.load('en.embed_sentence.doc2vec.gigaword_300') returns Spark NLP model_anno_obj doc2vec_gigaword_300\n", + "nlu.load('en.embed_sentence.doc2vec.gigaword_wiki_300') returns Spark NLP model_anno_obj doc2vec_gigaword_wiki_300\n", + "nlu.load('en.embed_sentence.electra') returns Spark NLP model_anno_obj sent_electra_small_uncased\n", + "nlu.load('en.embed_sentence.electra_base_uncased') returns Spark NLP model_anno_obj sent_electra_base_uncased\n", + "nlu.load('en.embed_sentence.electra_large_uncased') returns Spark NLP model_anno_obj sent_electra_large_uncased\n", + "nlu.load('en.embed_sentence.electra_small_uncased') returns Spark NLP model_anno_obj sent_electra_small_uncased\n", + "nlu.load('en.embed_sentence.roberta.base') returns Spark NLP model_anno_obj sent_roberta_base\n", + "nlu.load('en.embed_sentence.roberta.large') returns Spark NLP model_anno_obj sent_roberta_large\n", + "nlu.load('en.embed_sentence.small_bert_L10_128') returns Spark NLP model_anno_obj sent_small_bert_L10_128\n", + "nlu.load('en.embed_sentence.small_bert_L10_256') returns Spark NLP model_anno_obj sent_small_bert_L10_256\n", + "nlu.load('en.embed_sentence.small_bert_L10_512') returns Spark NLP model_anno_obj sent_small_bert_L10_512\n", + "nlu.load('en.embed_sentence.small_bert_L10_768') returns Spark NLP model_anno_obj sent_small_bert_L10_768\n", + "nlu.load('en.embed_sentence.small_bert_L12_128') returns Spark NLP model_anno_obj sent_small_bert_L12_128\n", + "nlu.load('en.embed_sentence.small_bert_L12_256') returns Spark NLP model_anno_obj sent_small_bert_L12_256\n", + "nlu.load('en.embed_sentence.small_bert_L12_512') returns Spark NLP model_anno_obj sent_small_bert_L12_512\n", + "nlu.load('en.embed_sentence.small_bert_L12_768') returns Spark NLP model_anno_obj sent_small_bert_L12_768\n", + "nlu.load('en.embed_sentence.small_bert_L2_128') returns Spark NLP model_anno_obj sent_small_bert_L2_128\n", + "nlu.load('en.embed_sentence.small_bert_L2_256') returns Spark NLP model_anno_obj sent_small_bert_L2_256\n", + "nlu.load('en.embed_sentence.small_bert_L2_512') returns Spark NLP model_anno_obj sent_small_bert_L2_512\n", + "nlu.load('en.embed_sentence.small_bert_L2_768') returns Spark NLP model_anno_obj sent_small_bert_L2_768\n", + "nlu.load('en.embed_sentence.small_bert_L4_128') returns Spark NLP model_anno_obj sent_small_bert_L4_128\n", + "nlu.load('en.embed_sentence.small_bert_L4_256') returns Spark NLP model_anno_obj sent_small_bert_L4_256\n", + "nlu.load('en.embed_sentence.small_bert_L4_512') returns Spark NLP model_anno_obj sent_small_bert_L4_512\n", + "nlu.load('en.embed_sentence.small_bert_L4_768') returns Spark NLP model_anno_obj sent_small_bert_L4_768\n", + "nlu.load('en.embed_sentence.small_bert_L6_128') returns Spark NLP model_anno_obj sent_small_bert_L6_128\n", + "nlu.load('en.embed_sentence.small_bert_L6_256') returns Spark NLP model_anno_obj sent_small_bert_L6_256\n", + "nlu.load('en.embed_sentence.small_bert_L6_512') returns Spark NLP model_anno_obj sent_small_bert_L6_512\n", + "nlu.load('en.embed_sentence.small_bert_L6_768') returns Spark NLP model_anno_obj sent_small_bert_L6_768\n", + "nlu.load('en.embed_sentence.small_bert_L8_128') returns Spark NLP model_anno_obj sent_small_bert_L8_128\n", + "nlu.load('en.embed_sentence.small_bert_L8_256') returns Spark NLP model_anno_obj sent_small_bert_L8_256\n", + "nlu.load('en.embed_sentence.small_bert_L8_512') returns Spark NLP model_anno_obj sent_small_bert_L8_512\n", + "nlu.load('en.embed_sentence.small_bert_L8_768') returns Spark NLP model_anno_obj sent_small_bert_L8_768\n", + "nlu.load('en.embed_sentence.tfhub_use') returns Spark NLP model_anno_obj tfhub_use\n", + "nlu.load('en.embed_sentence.tfhub_use.lg') returns Spark NLP model_anno_obj tfhub_use_lg\n", + "nlu.load('en.embed_sentence.use') returns Spark NLP model_anno_obj tfhub_use\n", + "nlu.load('en.embed_sentence.use.lg') returns Spark NLP model_anno_obj tfhub_use_lg\n", + "For language NLU provides the following Models : \n", + "nlu.load('es.embed_sentence.bert.base_cased') returns Spark NLP model_anno_obj sent_bert_base_cased\n", + "nlu.load('es.embed_sentence.bert.base_uncased') returns Spark NLP model_anno_obj sent_bert_base_uncased\n", + "For language NLU provides the following Models : \n", + "nlu.load('fi.embed_sentence.bert') returns Spark NLP model_anno_obj bert_base_finnish_uncased\n", + "nlu.load('fi.embed_sentence.bert.cased') returns Spark NLP model_anno_obj bert_base_finnish_cased\n", + "nlu.load('fi.embed_sentence.bert.uncased') returns Spark NLP model_anno_obj bert_base_finnish_uncased\n", + "For language NLU provides the following Models : \n", + "nlu.load('ha.embed_sentence.xlm_roberta') returns Spark NLP model_anno_obj sent_xlm_roberta_base_finetuned_hausa\n", + "For language NLU provides the following Models : \n", + "nlu.load('ig.embed_sentence.xlm_roberta') returns Spark NLP model_anno_obj sent_xlm_roberta_base_finetuned_igbo\n", + "For language NLU provides the following Models : \n", + "nlu.load('lg.embed_sentence.xlm_roberta') returns Spark NLP model_anno_obj sent_xlm_roberta_base_finetuned_luganda\n", + "For language NLU provides the following Models : \n", + "nlu.load('nl.embed_sentence.bert.base_cased') returns Spark NLP model_anno_obj sent_bert_base_cased\n", + "For language NLU provides the following Models : \n", + "nlu.load('pcm.embed_sentence.xlm_roberta') returns Spark NLP model_anno_obj sent_xlm_roberta_base_finetuned_naija\n", + "For language NLU provides the following Models : \n", + "nlu.load('pt.embed_sentence.bert.base_legal') returns Spark NLP model_anno_obj sbert_legal_bertimbau_base_tsdae_sts\n", + "nlu.load('pt.embed_sentence.bert.cased_large_legal') returns Spark NLP model_anno_obj sbert_bert_large_portuguese_cased_legal_mlm_sts_v0.1\n", + "nlu.load('pt.embed_sentence.bert.large_legal') returns Spark NLP model_anno_obj sbert_legal_bertimbau_large_gpl_sts\n", + "nlu.load('pt.embed_sentence.bert.legal.cased_large_mlm_sts_v0.10.by_stjiris') returns Spark NLP model_anno_obj sbert_bert_large_portuguese_cased_legal_mlm_sts_v0.10\n", + "nlu.load('pt.embed_sentence.bert.legal.cased_large_mlm_sts_v0.2.by_stjiris') returns Spark NLP model_anno_obj sbert_bert_large_portuguese_cased_legal_mlm_sts_v0.2\n", + "nlu.load('pt.embed_sentence.bert.legal.cased_large_mlm_sts_v0.3.by_stjiris') returns Spark NLP model_anno_obj sbert_bert_large_portuguese_cased_legal_mlm_sts_v0.3\n", + "nlu.load('pt.embed_sentence.bert.legal.cased_large_mlm_sts_v0.4.by_stjiris') returns Spark NLP model_anno_obj sbert_bert_large_portuguese_cased_legal_mlm_sts_v0.4\n", + "nlu.load('pt.embed_sentence.bert.legal.cased_large_mlm_sts_v0.5.by_stjiris') returns Spark NLP model_anno_obj sbert_bert_large_portuguese_cased_legal_mlm_sts_v0.5\n", + "nlu.load('pt.embed_sentence.bert.legal.cased_large_mlm_sts_v0.7.by_stjiris') returns Spark NLP model_anno_obj sbert_bert_large_portuguese_cased_legal_mlm_sts_v0.7\n", + "nlu.load('pt.embed_sentence.bert.legal.cased_large_mlm_sts_v0.8.by_stjiris') returns Spark NLP model_anno_obj sbert_bert_large_portuguese_cased_legal_mlm_sts_v0.8\n", + "nlu.load('pt.embed_sentence.bert.legal.cased_large_mlm_sts_v0.9.by_stjiris') returns Spark NLP model_anno_obj sbert_bert_large_portuguese_cased_legal_mlm_sts_v0.9\n", + "nlu.load('pt.embed_sentence.bert.legal.cased_large_mlm_sts_v1.0.by_stjiris') returns Spark NLP model_anno_obj sbert_bert_large_portuguese_cased_legal_mlm_sts_v1.0\n", + "nlu.load('pt.embed_sentence.bert.legal.cased_large_mlm_v0.11_gpl_nli_sts_v0.by_stjiris') returns Spark NLP model_anno_obj sbert_bert_large_portuguese_cased_legal_mlm_v0.11_gpl_nli_sts_v0\n", + "nlu.load('pt.embed_sentence.bert.legal.cased_large_mlm_v0.11_gpl_nli_sts_v1.by_stjiris') returns Spark NLP model_anno_obj sbert_bert_large_portuguese_cased_legal_mlm_v0.11_gpl_nli_sts_v1\n", + "nlu.load('pt.embed_sentence.bert.legal.cased_large_mlm_v0.11_nli_sts_v0.by_stjiris') returns Spark NLP model_anno_obj sbert_bert_large_portuguese_cased_legal_mlm_v0.11_nli_sts_v0\n", + "nlu.load('pt.embed_sentence.bert.legal.cased_large_mlm_v0.11_nli_sts_v1.by_stjiris') returns Spark NLP model_anno_obj sbert_bert_large_portuguese_cased_legal_mlm_v0.11_nli_sts_v1\n", + "nlu.load('pt.embed_sentence.bert.legal.cased_large_mlm_v0.11_sts_v0.by_stjiris') returns Spark NLP model_anno_obj sbert_bert_large_portuguese_cased_legal_mlm_v0.11_sts_v0\n", + "nlu.load('pt.embed_sentence.bert.legal.cased_large_mlm_v0.11_sts_v1.by_stjiris') returns Spark NLP model_anno_obj sbert_bert_large_portuguese_cased_legal_mlm_v0.11_sts_v1\n", + "nlu.load('pt.embed_sentence.bert.v2_base_legal') returns Spark NLP model_anno_obj sbert_legal_bertimbau_sts_base_ma_v2\n", + "nlu.load('pt.embed_sentence.bert.v2_large_legal') returns Spark NLP model_anno_obj sbert_legal_bertimbau_large_tsdae_sts_v2\n", + "nlu.load('pt.embed_sentence.bertimbau.legal.assin.base.by_rufimelo') returns Spark NLP model_anno_obj sbert_legal_bertimbau_sts_base_ma\n", + "nlu.load('pt.embed_sentence.bertimbau.legal.assin2.base.by_rufimelo') returns Spark NLP model_anno_obj sbert_legal_bertimbau_sts_base\n", + "nlu.load('pt.embed_sentence.bertimbau.legal.large_sts_by_rufimelo') returns Spark NLP model_anno_obj sbert_legal_bertimbau_sts_large\n", + "nlu.load('pt.embed_sentence.bertimbau.legal.large_sts_ma.by_rufimelo') returns Spark NLP model_anno_obj sbert_legal_bertimbau_sts_large_ma\n", + "nlu.load('pt.embed_sentence.bertimbau.legal.large_sts_ma_v3.by_rufimelo') returns Spark NLP model_anno_obj sbert_legal_bertimbau_sts_large_ma_v3\n", + "nlu.load('pt.embed_sentence.bertimbau.legal.large_tsdae_sts.by_rufimelo') returns Spark NLP model_anno_obj sbert_legal_bertimbau_large_tsdae_sts\n", + "nlu.load('pt.embed_sentence.bertimbau.legal.large_tsdae_sts_v4.by_rufimelo') returns Spark NLP model_anno_obj sbert_legal_bertimbau_large_tsdae_sts_v4\n", + "nlu.load('pt.embed_sentence.bertimbau.legal.large_tsdae_v4_gpl_sts.by_rufimelo') returns Spark NLP model_anno_obj sbert_legal_bertimbau_large_tsdae_v4_gpl_sts\n", + "nlu.load('pt.embed_sentence.bertimbau.legal.v2_large_sts_v2.by_rufimelo') returns Spark NLP model_anno_obj sbert_legal_bertimbau_sts_large_v2\n", + "nlu.load('pt.embed_sentence.bertimbau.legal.v2_large_v2_sts.by_rufimelo') returns Spark NLP model_anno_obj sbert_legal_bertimbau_large_v2_sts\n", + "For language NLU provides the following Models : \n", + "nlu.load('rw.embed_sentence.xlm_roberta') returns Spark NLP model_anno_obj sent_xlm_roberta_base_finetuned_kinyarwanda\n", + "For language NLU provides the following Models : \n", + "nlu.load('sv.embed_sentence.bert.base_cased') returns Spark NLP model_anno_obj sent_bert_base_cased\n", + "For language NLU provides the following Models : \n", + "nlu.load('sw.embed_sentence.xlm_roberta') returns Spark NLP model_anno_obj sent_xlm_roberta_base_finetuned_swahili\n", + "For language NLU provides the following Models : \n", + "nlu.load('wo.embed_sentence.xlm_roberta') returns Spark NLP model_anno_obj sent_xlm_roberta_base_finetuned_wolof\n", + "For language NLU provides the following Models : \n", + "nlu.load('xx.embed_sentence') returns Spark NLP model_anno_obj sent_bert_multi_cased\n", + "nlu.load('xx.embed_sentence.bert') returns Spark NLP model_anno_obj sent_bert_multi_cased\n", + "nlu.load('xx.embed_sentence.bert.cased') returns Spark NLP model_anno_obj sent_bert_multi_cased\n", + "nlu.load('xx.embed_sentence.bert.muril') returns Spark NLP model_anno_obj sent_bert_muril\n", + "nlu.load('xx.embed_sentence.bert_use_cmlm_multi_base') returns Spark NLP model_anno_obj sent_bert_use_cmlm_multi_base\n", + "nlu.load('xx.embed_sentence.bert_use_cmlm_multi_base_br') returns Spark NLP model_anno_obj sent_bert_use_cmlm_multi_base_br\n", + "nlu.load('xx.embed_sentence.labse') returns Spark NLP model_anno_obj labse\n", + "nlu.load('xx.embed_sentence.xlm_roberta.base') returns Spark NLP model_anno_obj sent_xlm_roberta_base\n", + "For language NLU provides the following Models : \n", + "nlu.load('yo.embed_sentence.xlm_roberta') returns Spark NLP model_anno_obj sent_xlm_roberta_base_finetuned_yoruba\n", + "For language NLU provides the following Models : \n", + "nlu.load('zh.embed_sentence.bert') returns Spark NLP model_anno_obj sbert_chinese_qmc_finance_v1\n", + "nlu.load('zh.embed_sentence.bert.distilled') returns Spark NLP model_anno_obj sbert_chinese_qmc_finance_v1_distill\n" + ] + } + ] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "IKK_Ii_gjJfF", + "outputId": "ea0aed1f-ffd4-4e0c-f85d-d977fbecdcb0" + }, + "source": [ + "trainable_pipe = nlp.load('en.embed_sentence.small_bert_L12_768 train.sentiment')\n", + "# We need to train longer and user smaller LR for NON-USE based sentence embeddings usually\n", + "# We could tune the hyperparameters further with hyperparameter tuning methods like gridsearch\n", + "# Also longer training gives more accuracy\n", + "trainable_pipe['trainable_sentiment_dl'].setMaxEpochs(120)\n", + "trainable_pipe['trainable_sentiment_dl'].setLr(0.0005)\n", + "fitted_pipe = trainable_pipe.fit(train_df)\n", + "# predict with the trainable pipeline on dataset and get predictions\n", + "preds = fitted_pipe.predict(train_df,output_level='document')\n", + "\n", + "#sentence detector that is part of the pipe generates sone NaNs. lets drop them first\n", + "preds.dropna(inplace=True)\n", + "print(classification_report(preds['y'], preds['sentiment']))\n", + "\n", + "#preds" + ], + "execution_count": 25, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Warning::Spark Session already created, some configs may not take.\n", + "Warning::Spark Session already created, some configs may not take.\n", + "sent_small_bert_L12_768 download started this may take some time.\n", + "Approximate size to download 392.9 MB\n", + "[OK!]\n", + " precision recall f1-score support\n", + "\n", + " negative 0.88 0.85 0.86 1203\n", + " neutral 0.00 0.00 0.00 0\n", + " positive 0.88 0.84 0.86 1197\n", + "\n", + " accuracy 0.85 2400\n", + " macro avg 0.59 0.56 0.58 2400\n", + "weighted avg 0.88 0.85 0.86 2400\n", + "\n" + ] + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "_1jxw3GnVGlI" + }, + "source": [ + "# 7.1 evaluate on Test Data" + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "Fxx4yNkNVGFl", + "colab": { + "base_uri": "https://localhost:8080/" + }, + "outputId": "33633053-c610-4438-cced-15052ff15ffa" + }, + "source": [ + "preds = fitted_pipe.predict(test_df,output_level='document')\n", + "\n", + "#sentence detector that is part of the pipe generates sone NaNs. lets drop them first\n", + "preds.dropna(inplace=True)\n", + "print(classification_report(preds['y'], preds['sentiment']))" + ], + "execution_count": 26, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + " precision recall f1-score support\n", + "\n", + " negative 0.85 0.83 0.84 297\n", + " neutral 0.00 0.00 0.00 0\n", + " positive 0.85 0.81 0.83 303\n", + "\n", + " accuracy 0.82 600\n", + " macro avg 0.57 0.55 0.56 600\n", + "weighted avg 0.85 0.82 0.84 600\n", + "\n" + ] + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "2BB-NwZUoHSe" + }, + "source": [ + "# 8. Lets save the model" + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "eLex095goHwm" + }, + "source": [ + "stored_model_path = './models/classifier_dl_trained'\n", + "fitted_pipe.save(stored_model_path)" + ], + "execution_count": 27, + "outputs": [] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "e_b2DPd4rCiU" + }, + "source": [ + "# 9. Lets load the model from HDD.\n", + "This makes Offlien NLU usage possible! \n", + "You need to call nlu.load(path=path_to_the_pipe) to load a model/pipeline from disk." + ] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 133 + }, + "id": "SO4uz45MoRgp", + "outputId": "e9b8ab40-ee03-47b2-de2b-99a0cdb54b5b" + }, + "source": [ + "hdd_pipe = nlp.load(path=stored_model_path)\n", + "\n", + "preds = hdd_pipe.predict('All the buildings in the capital were destroyed')\n", + "preds" + ], + "execution_count": 28, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Warning::Spark Session already created, some configs may not take.\n", + "Warning::Spark Session already created, some configs may not take.\n", + "Warning::Spark Session already created, some configs may not take.\n" + ] + }, + { + "output_type": "execute_result", + "data": { + "text/plain": [ + " document \\\n", + "0 All the buildings in the capital were destroyed \n", + "\n", + " sentence_embedding_from_disk sentiment \\\n", + "0 [-0.39346593618392944, 0.33815115690231323, -0... positive \n", + "\n", + " sentiment_confidence \n", + "0 0.0 " + ], + "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", + "
documentsentence_embedding_from_disksentimentsentiment_confidence
0All the buildings in the capital were destroyed[-0.39346593618392944, 0.33815115690231323, -0...positive0.0
\n", + "
\n", + "
\n", + "\n", + "
\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "
\n", + "\n", + "
\n", + "
\n" + ] + }, + "metadata": {}, + "execution_count": 28 + } + ] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "e0CVlkk9v6Qi", + "outputId": "adae61bf-6000-4e21-f24c-d8a547449cd1" + }, + "source": [ + "hdd_pipe.print_info()" + ], + "execution_count": 29, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "The following parameters are configurable for this NLU pipeline (You can copy paste the examples) :\n", + ">>> component_list['document_assembler'] has settable params:\n", + "component_list['document_assembler'].setCleanupMode('shrink') | Info: possible values: disabled, inplace, inplace_full, shrink, shrink_full, each, each_full, delete_full | Currently set to : shrink\n", + ">>> component_list['bert_sentence_embeddings@sent_small_bert_L12_768'] has settable params:\n", + "component_list['bert_sentence_embeddings@sent_small_bert_L12_768'].setBatchSize(8) | Info: Size of every batch | Currently set to : 8\n", + "component_list['bert_sentence_embeddings@sent_small_bert_L12_768'].setCaseSensitive(False) | Info: whether to ignore case in tokens for embeddings matching | Currently set to : False\n", + "component_list['bert_sentence_embeddings@sent_small_bert_L12_768'].setDimension(768) | Info: Number of embedding dimensions | Currently set to : 768\n", + "component_list['bert_sentence_embeddings@sent_small_bert_L12_768'].setMaxSentenceLength(128) | Info: Max sentence length to process | Currently set to : 128\n", + "component_list['bert_sentence_embeddings@sent_small_bert_L12_768'].setEngine('tensorflow') | Info: Deep Learning engine used for this model | Currently set to : tensorflow\n", + "component_list['bert_sentence_embeddings@sent_small_bert_L12_768'].setIsLong(False) | Info: Use Long type instead of Int type for inputs buffer - Some Bert models require Long instead of Int. | Currently set to : False\n", + "component_list['bert_sentence_embeddings@sent_small_bert_L12_768'].setStorageRef('sent_small_bert_L12_768') | Info: unique reference name for identification | Currently set to : sent_small_bert_L12_768\n", + ">>> component_list['sentiment_dl@sent_small_bert_L12_768'] has settable params:\n", + "component_list['sentiment_dl@sent_small_bert_L12_768'].setThreshold(0.6) | Info: The minimum threshold for the final result otheriwse it will be neutral | Currently set to : 0.6\n", + "component_list['sentiment_dl@sent_small_bert_L12_768'].setThresholdLabel('neutral') | Info: In case the score is less than threshold, what should be the label. Default is neutral. | Currently set to : neutral\n", + "component_list['sentiment_dl@sent_small_bert_L12_768'].setEngine('tensorflow') | Info: Deep Learning engine used for this model | Currently set to : tensorflow\n", + "component_list['sentiment_dl@sent_small_bert_L12_768'].setClasses(['positive', 'negative']) | Info: get the tags used to trained this SentimentDLModel | Currently set to : ['positive', 'negative']\n", + "component_list['sentiment_dl@sent_small_bert_L12_768'].setStorageRef('sent_small_bert_L12_768') | Info: unique reference name for identification | Currently set to : sent_small_bert_L12_768\n" + ] + } + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "F_mfqyyyKGkV" + }, + "source": [], + "execution_count": null, + "outputs": [] + } + ] +} \ No newline at end of file diff --git a/examples/colab/Training/binary_text_classification/NLU_training_sentiment_classifier_demo_reddit.ipynb b/examples/colab/Training/binary_text_classification/NLU_training_sentiment_classifier_demo_reddit.ipynb index 0afe36d8..ab2cc6cc 100644 --- a/examples/colab/Training/binary_text_classification/NLU_training_sentiment_classifier_demo_reddit.ipynb +++ b/examples/colab/Training/binary_text_classification/NLU_training_sentiment_classifier_demo_reddit.ipynb @@ -1 +1,3059 @@ -{"nbformat":4,"nbformat_minor":0,"metadata":{"colab":{"name":"NLU_training_sentiment_classifier_demo_reddit.ipynb","provenance":[],"collapsed_sections":[]},"kernelspec":{"display_name":"Python 3","name":"python3"}},"cells":[{"cell_type":"markdown","metadata":{"id":"zkufh760uvF3"},"source":["![JohnSnowLabs](https://nlp.johnsnowlabs.com/assets/images/logo.png)\n","\n","[![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/JohnSnowLabs/nlu/blob/master/examples/colab/Training/binary_text_classification/NLU_training_sentiment_classifier_demo_reddit.ipynb)\n","\n","\n","# Training a Sentiment Analysis Classifier with NLU \n","## 2 class Reddit comment sentiment classifier training\n","With the [SentimentDL model](https://nlp.johnsnowlabs.com/docs/en/annotators#sentimentdl-multi-class-sentiment-analysis-annotator) from Spark NLP you can achieve State Of the Art results on any multi class text classification problem \n","\n","This notebook showcases the following features : \n","\n","- How to train the deep learning classifier\n","- How to store a pipeline to disk\n","- How to load the pipeline from disk (Enables NLU offline mode)\n","\n"]},{"cell_type":"markdown","metadata":{"id":"dur2drhW5Rvi"},"source":["# 1. Install Java 8 and NLU"]},{"cell_type":"code","metadata":{"id":"hFGnBCHavltY","colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"status":"ok","timestamp":1620193274509,"user_tz":-120,"elapsed":122976,"user":{"displayName":"Christian Kasim Loan","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GjqAD-ircKP-s5Eh6JSdkDggDczfqQbJGU_IRb4Hw=s64","userId":"14469489166467359317"}},"outputId":"f1d2ff21-6e64-4c99-fcae-ae5d060d0530"},"source":["!wget https://setup.johnsnowlabs.com/nlu/colab.sh -O - | bash\n","import nlu"],"execution_count":null,"outputs":[{"output_type":"stream","text":["--2021-05-05 05:39:12-- https://raw.githubusercontent.com/JohnSnowLabs/nlu/master/scripts/colab_setup.sh\n","Resolving raw.githubusercontent.com (raw.githubusercontent.com)... 185.199.108.133, 185.199.109.133, 185.199.111.133, ...\n","Connecting to raw.githubusercontent.com (raw.githubusercontent.com)|185.199.108.133|:443... connected.\n","HTTP request sent, awaiting response... 200 OK\n","Length: 1671 (1.6K) [text/plain]\n","Saving to: ‘STDOUT’\n","\n","\r- 0%[ ] 0 --.-KB/s \rInstalling NLU 3.0.0 with PySpark 3.0.2 and Spark NLP 3.0.1 for Google Colab ...\n","- 100%[===================>] 1.63K --.-KB/s in 0s \n","\n","2021-05-05 05:39:12 (39.8 MB/s) - written to stdout [1671/1671]\n","\n","\u001b[K |████████████████████████████████| 204.8MB 64kB/s \n","\u001b[K |████████████████████████████████| 153kB 47.9MB/s \n","\u001b[K |████████████████████████████████| 204kB 17.3MB/s \n","\u001b[K |████████████████████████████████| 204kB 49.5MB/s \n","\u001b[?25h Building wheel for pyspark (setup.py) ... \u001b[?25l\u001b[?25hdone\n"],"name":"stdout"}]},{"cell_type":"markdown","metadata":{"id":"f4KkTfnR5Ugg"},"source":["# 2. Download Reddit Sentiment dataset \n","https://www.kaggle.com/cosmos98/twitter-and-reddit-sentimental-analysis-dataset\n","#Context\n","\n","This is was a Dataset Created as a part of the university Project On Sentimental Analysis On Multi-Source Social Media Platforms using PySpark."]},{"cell_type":"code","metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"OrVb5ZMvvrQD","executionInfo":{"status":"ok","timestamp":1620193275331,"user_tz":-120,"elapsed":123790,"user":{"displayName":"Christian Kasim Loan","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GjqAD-ircKP-s5Eh6JSdkDggDczfqQbJGU_IRb4Hw=s64","userId":"14469489166467359317"}},"outputId":"b398d517-d3af-4205-83ac-7994eb80fffc"},"source":["! wget http://ckl-it.de/wp-content/uploads/2021/01/Reddit_Data.csv\n"],"execution_count":null,"outputs":[{"output_type":"stream","text":["--2021-05-05 05:41:14-- http://ckl-it.de/wp-content/uploads/2021/01/Reddit_Data.csv\n","Resolving ckl-it.de (ckl-it.de)... 217.160.0.108, 2001:8d8:100f:f000::209\n","Connecting to ckl-it.de (ckl-it.de)|217.160.0.108|:80... connected.\n","HTTP request sent, awaiting response... 200 OK\n","Length: 153265 (150K) [text/csv]\n","Saving to: ‘Reddit_Data.csv’\n","\n","Reddit_Data.csv 100%[===================>] 149.67K 402KB/s in 0.4s \n","\n","2021-05-05 05:41:14 (402 KB/s) - ‘Reddit_Data.csv’ saved [153265/153265]\n","\n"],"name":"stdout"}]},{"cell_type":"code","metadata":{"colab":{"base_uri":"https://localhost:8080/","height":406},"id":"y4xSRWIhwT28","executionInfo":{"status":"ok","timestamp":1620193275333,"user_tz":-120,"elapsed":123787,"user":{"displayName":"Christian Kasim Loan","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GjqAD-ircKP-s5Eh6JSdkDggDczfqQbJGU_IRb4Hw=s64","userId":"14469489166467359317"}},"outputId":"34fa4591-c90f-4147-f536-038a9f383019"},"source":["import pandas as pd\n","train_path = '/content/Reddit_Data.csv'\n","\n","train_df = pd.read_csv(train_path)\n","# the text data to use for classification should be in a column named 'text'\n","columns=['text','y']\n","train_df = train_df[columns]\n","train_df"],"execution_count":null,"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"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n","
texty
0its true they had cut the power what douchebag...positive
1fuck giroud better finishing like this monthpositive
2looks shit now but still proud madepositive
3pelor the burning hate the best evil godnegative
4can ask what you with something this powerfulpositive
.........
595bangali desh bechne main sabse aagepositive
596national media channels were gaged not cover t...positive
597been following these threads from the beginni...negative
598pretty sure this sarcasm satire the news 1500...positive
599much would love for namo our next hard imagin...positive
\n","

600 rows × 2 columns

\n","
"],"text/plain":[" text y\n","0 its true they had cut the power what douchebag... positive\n","1 fuck giroud better finishing like this month positive\n","2 looks shit now but still proud made positive\n","3 pelor the burning hate the best evil god negative\n","4 can ask what you with something this powerful positive\n",".. ... ...\n","595 bangali desh bechne main sabse aage positive\n","596 national media channels were gaged not cover t... positive\n","597 been following these threads from the beginni... negative\n","598 pretty sure this sarcasm satire the news 1500... positive\n","599 much would love for namo our next hard imagin... positive\n","\n","[600 rows x 2 columns]"]},"metadata":{"tags":[]},"execution_count":3}]},{"cell_type":"markdown","metadata":{"id":"0296Om2C5anY"},"source":["# 3. Train Deep Learning Classifier using nlu.load('train.sentiment')\n","\n","You dataset label column should be named 'y' and the feature column with text data should be named 'text'"]},{"cell_type":"code","metadata":{"colab":{"base_uri":"https://localhost:8080/","height":1000},"id":"3ZIPkRkWftBG","executionInfo":{"status":"ok","timestamp":1620195831144,"user_tz":-120,"elapsed":11077,"user":{"displayName":"Christian Kasim Loan","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GjqAD-ircKP-s5Eh6JSdkDggDczfqQbJGU_IRb4Hw=s64","userId":"14469489166467359317"}},"outputId":"40e942ab-8923-4f23-acc6-e600cf4e7e16"},"source":["from sklearn.metrics import classification_report\n","import nlu \n","# load a trainable pipeline by specifying the train. prefix and fit it on a datset with label and text columns\n","# by default the Universal Sentence Encoder (USE) Sentence embeddings are used for generation\n","trainable_pipe = nlu.load('train.sentiment')\n","fitted_pipe = trainable_pipe.fit(train_df.iloc[:50])\n","\n","# predict with the trainable pipeline on dataset and get predictions\n","preds = fitted_pipe.predict(train_df.iloc[:50],output_level='document')\n","#sentence detector that is part of the pipe generates sone NaNs. lets drop them first\n","preds.dropna(inplace=True)\n","print(classification_report(preds['y'], preds['sentiment']))\n","\n","preds"],"execution_count":null,"outputs":[{"output_type":"stream","text":["tfhub_use download started this may take some time.\n","Approximate size to download 923.7 MB\n","[OK!]\n","sentence_detector_dl download started this may take some time.\n","Approximate size to download 354.6 KB\n","[OK!]\n"," precision recall f1-score support\n","\n"," negative 0.00 0.00 0.00 24\n"," neutral 0.00 0.00 0.00 0\n"," positive 0.72 1.00 0.84 26\n","\n"," accuracy 0.52 50\n"," macro avg 0.24 0.33 0.28 50\n","weighted avg 0.38 0.52 0.44 50\n","\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"," \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"," \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"," \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"," \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"," \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"," \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"," \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"," \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"," \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"," \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"," \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","
origin_indextextysentencesentence_embedding_usetrained_sentimenttrained_sentiment_confidencedocument
00its true they had cut the power what douchebag...positive[its true they had cut the power what doucheba...[0.033111296594142914, 0.053994592279195786, -...positive0.626655its true they had cut the power what douchebag...
11fuck giroud better finishing like this monthpositive[fuck giroud better finishing like this month][0.0678204670548439, 0.01411951333284378, -0.0...positive0.653644fuck giroud better finishing like this month
22looks shit now but still proud madepositive[looks shit now but still proud made][0.03247417137026787, -0.09844466298818588, -0...positive0.660186looks shit now but still proud made
33pelor the burning hate the best evil godnegative[pelor the burning hate the best evil god][0.04032062366604805, 0.07666622847318649, -0....neutral0.578461pelor the burning hate the best evil god
44can ask what you with something this powerfulpositive[can ask what you with something this powerful][0.015518003143370152, -0.05116305500268936, -...positive0.691478can ask what you with something this powerful
55aap’ shazia ilmi from puram constituency lag...negative[aap’ shazia ilmi from puram constituency la...[0.02478150464594364, -0.06508146971464157, -0...positive0.612378aap’ shazia ilmi from puram constituency lag...
66fuck yeahnegative[fuck yeah][0.046024102717638016, -0.02504798397421837, -...neutral0.586349fuck yeah
77honestly really surprised alice ranked that lo...positive[honestly really surprised alice ranked that l...[-0.035716041922569275, -0.04127982258796692, ...positive0.654837honestly really surprised alice ranked that lo...
88didn care about politics before now hatenegative[didn care about politics before now hate][-0.006816443987190723, 0.06221264228224754, -...neutral0.581450didn care about politics before now hate
99hard nips and goosebumpsnegative[hard nips and goosebumps][-0.02919699251651764, -0.030449824407696724, ...neutral0.580563hard nips and goosebumps
1010varadabhai ndtv trying too well dilute bjp tre...negative[varadabhai ndtv trying too well dilute bjp tr...[0.04727796092629433, -0.06792476028203964, -0...positive0.621601varadabhai ndtv trying too well dilute bjp tre...
1111old man has lost his mindpositive[old man has lost his mind][0.039657335728406906, -0.04277808964252472, -...positive0.639790old man has lost his mind
1212why this being downvoted you might ask both mo...negative[why this being downvoted you might ask both m...[0.06581216305494308, -0.06079106032848358, -0...positive0.629655why this being downvoted you might ask both mo...
1313hasnt changed all apolitical before simply do...positive[hasnt changed all apolitical before simply do...[0.03509754315018654, -0.004639611579477787, -...positive0.624468hasnt changed all apolitical before simply don...
1414for one campaign pretty much just snatched the...negative[for one campaign pretty much just snatched th...[0.017386479303240776, 0.0443551279604435, -0....positive0.618989for one campaign pretty much just snatched the...
1515vajpayee managed forge much broader coalition ...positive[vajpayee managed forge much broader coalition...[0.0372871570289135, -0.051079731434583664, -0...positive0.661443vajpayee managed forge much broader coalition ...
1616lol this only proves how desperate they are ge...positive[lol this only proves how desperate they are g...[0.05233633145689964, -0.03147873282432556, 0....positive0.615814lol this only proves how desperate they are ge...
1717dont hate aap but your questions are example ...negative[dont hate aap but your questions are example ...[0.026356501504778862, -0.04044199362397194, -...positive0.614039dont hate aap but your questions are example w...
1818what were the other policies you discussed not...negative[what were the other policies you discussed no...[-0.07521010935306549, 0.008543566800653934, 0...neutral0.581745what were the other policies you discussed not...
1919wow lots favorites this bracket haqua tsukushi...positive[wow lots favorites this bracket haqua tsukush...[-0.069316066801548, -0.015458517707884312, -0...positive0.663116wow lots favorites this bracket haqua tsukushi...
2020sorry know this isn what you asked just ventin...negative[sorry know this isn what you asked just venti...[0.016777774319052696, -0.05478339642286301, -...positive0.618847sorry know this isn what you asked just ventin...
2121coming out strongly against gujarat chief min...positive[coming out strongly against gujarat chief min...[0.06856724619865417, -0.019821861758828163, -...positive0.640057coming out strongly against gujarat chief mini...
2222there one tool bjp can use their manifesto whi...positive[there one tool bjp can use their manifesto wh...[0.057847339659929276, -0.05365725979208946, -...positive0.648467there one tool bjp can use their manifesto whi...
2323jakiro spotted the middle top maybepositive[jakiro spotted the middle top maybe][-0.011690961197018623, -0.024473996832966805,...positive0.678376jakiro spotted the middle top maybe
2424family mormon have never tried explain them t...positive[family mormon have never tried explain them t...[0.03987010195851326, -0.0009543427731841803, ...positive0.678150family mormon have never tried explain them th...
2525with these results would have grudgingly accep...negative[with these results would have grudgingly acce...[0.034668292850255966, -0.05392604321241379, -...positive0.632179with these results would have grudgingly accep...
2626tea partier expresses support for namo after ...negative[tea partier expresses support for namo after ...[0.032365716993808746, -0.056087080389261246, ...neutral0.587468tea partier expresses support for namo after e...
2727politically would stupid move take stand right...negative[politically would stupid move take stand righ...[-0.00040777752292342484, -0.01262842211872339...neutral0.593538politically would stupid move take stand right...
2828wtf whynegative[wtf why][0.025807170197367668, -0.07080958038568497, -...neutral0.584124wtf why
2929have actually seen lot users views change dur...positive[have actually seen lot users views change dur...[-0.009333955124020576, 0.01388698909431696, -...positive0.649225have actually seen lot users views change duri...
3030truth told there not insignificant percentage ...positive[truth told there not insignificant percentage...[0.03927519917488098, -0.05597652122378349, -0...positive0.649703truth told there not insignificant percentage ...
3131was anti bjp and neutral cong became anti bjp ...positive[was anti bjp and neutral cong became anti bjp...[0.03805134445428848, -0.030298737809062004, -...positive0.639704was anti bjp and neutral cong became anti bjp ...
3232most religions have dogmatic orthodox well eso...positive[most religions have dogmatic orthodox well es...[0.03939439728856087, -0.02040349319577217, -0...positive0.684981most religions have dogmatic orthodox well eso...
3333laureatte sen said christian schools are perfe...positive[laureatte sen said christian schools are perf...[0.05267934128642082, 0.05836360529065132, 0.0...positive0.647901laureatte sen said christian schools are perfe...
3434need stop watching the garbage that you watch...positive[need stop watching the garbage that you watch...[-0.012382612563669682, 0.01988200470805168, 0...positive0.653579need stop watching the garbage that you watch ...
3535gandhi mandela hitler mao plato chandragupt ma...negative[gandhi mandela hitler mao plato chandragupt m...[0.027552243322134018, 0.013075066730380058, 0...neutral0.593626gandhi mandela hitler mao plato chandragupt ma...
3636hate aap for the other thread points such the...negative[hate aap for the other thread points such the...[0.014617362059652805, -0.038017578423023224, ...positive0.618540hate aap for the other thread points such the ...
3737absolutely agree with you subsidies the worst ...negative[absolutely agree with you subsidies the worst...[0.0109744006767869, 0.0033110964577645063, -0...positive0.623482absolutely agree with you subsidies the worst ...
3838are you corrupt mind have you benefited throu...negative[are you corrupt mind have you benefited throu...[0.03834373503923416, -0.06521473079919815, -0...neutral0.599771are you corrupt mind have you benefited throug...
3939congress needs bogeyman modi without the bad g...positive[congress needs bogeyman modi without the bad ...[0.03138439729809761, -0.06221967190504074, -0...positive0.649323congress needs bogeyman modi without the bad g...
4040protip don type uppercase text all caps harder...negative[protip don type uppercase text all caps harde...[0.044019922614097595, 0.025341013446450233, 0...neutral0.567544protip don type uppercase text all caps harder...
4141brother trog very wrathful indeed but his wil...positive[brother trog very wrathful indeed but his wil...[-0.024625714868307114, 0.06193268671631813, 0...positive0.654243brother trog very wrathful indeed but his will...
4242start off saying that the craftsmanship this ...positive[start off saying that the craftsmanship this ...[0.05780624598264694, -0.06291750818490982, -0...positive0.707086start off saying that the craftsmanship this p...
4343have made request unban namoarmy hell moron h...negative[have made request unban namoarmy hell moron h...[0.015555822290480137, -0.012748800218105316, ...neutral0.578515have made request unban namoarmy hell moron ho...
4444child modi worked his father’ tea shop and ...negative[child modi worked his father’ tea shop and ...[0.05774841457605362, -0.05956699699163437, -0...positive0.608462child modi worked his father’ tea shop and y...
4545namo tea yuupea horrible rhyme knownegative[namo tea yuupea horrible rhyme know][0.025534288957715034, 0.004176765214651823, -...neutral0.576838namo tea yuupea horrible rhyme know
4646great agility from akpom cut back and bendpositive[great agility from akpom cut back and bend][0.06865684688091278, -0.02164856530725956, -0...positive0.676614great agility from akpom cut back and bend
4747from undecided pro aap they are not perfect bu...positive[from undecided pro aap they are not perfect b...[0.01590304635465145, -0.0683458000421524, -0....positive0.651092from undecided pro aap they are not perfect bu...
4848woah there don insane with pray mean you don w...negative[woah there don insane with pray mean you don ...[0.050547026097774506, -0.01725909113883972, 0...neutral0.573394woah there don insane with pray mean you don w...
4949porngress wont announce their candidate cuz th...positive[porngress wont announce their candidate cuz t...[0.05935536324977875, -0.051609162241220474, -...positive0.662533porngress wont announce their candidate cuz th...
\n","
"],"text/plain":[" origin_index ... document\n","0 0 ... its true they had cut the power what douchebag...\n","1 1 ... fuck giroud better finishing like this month\n","2 2 ... looks shit now but still proud made\n","3 3 ... pelor the burning hate the best evil god\n","4 4 ... can ask what you with something this powerful\n","5 5 ... aap’ shazia ilmi from puram constituency lag...\n","6 6 ... fuck yeah\n","7 7 ... honestly really surprised alice ranked that lo...\n","8 8 ... didn care about politics before now hate\n","9 9 ... hard nips and goosebumps\n","10 10 ... varadabhai ndtv trying too well dilute bjp tre...\n","11 11 ... old man has lost his mind\n","12 12 ... why this being downvoted you might ask both mo...\n","13 13 ... hasnt changed all apolitical before simply don...\n","14 14 ... for one campaign pretty much just snatched the...\n","15 15 ... vajpayee managed forge much broader coalition ...\n","16 16 ... lol this only proves how desperate they are ge...\n","17 17 ... dont hate aap but your questions are example w...\n","18 18 ... what were the other policies you discussed not...\n","19 19 ... wow lots favorites this bracket haqua tsukushi...\n","20 20 ... sorry know this isn what you asked just ventin...\n","21 21 ... coming out strongly against gujarat chief mini...\n","22 22 ... there one tool bjp can use their manifesto whi...\n","23 23 ... jakiro spotted the middle top maybe\n","24 24 ... family mormon have never tried explain them th...\n","25 25 ... with these results would have grudgingly accep...\n","26 26 ... tea partier expresses support for namo after e...\n","27 27 ... politically would stupid move take stand right...\n","28 28 ... wtf why\n","29 29 ... have actually seen lot users views change duri...\n","30 30 ... truth told there not insignificant percentage ...\n","31 31 ... was anti bjp and neutral cong became anti bjp ...\n","32 32 ... most religions have dogmatic orthodox well eso...\n","33 33 ... laureatte sen said christian schools are perfe...\n","34 34 ... need stop watching the garbage that you watch ...\n","35 35 ... gandhi mandela hitler mao plato chandragupt ma...\n","36 36 ... hate aap for the other thread points such the ...\n","37 37 ... absolutely agree with you subsidies the worst ...\n","38 38 ... are you corrupt mind have you benefited throug...\n","39 39 ... congress needs bogeyman modi without the bad g...\n","40 40 ... protip don type uppercase text all caps harder...\n","41 41 ... brother trog very wrathful indeed but his will...\n","42 42 ... start off saying that the craftsmanship this p...\n","43 43 ... have made request unban namoarmy hell moron ho...\n","44 44 ... child modi worked his father’ tea shop and y...\n","45 45 ... namo tea yuupea horrible rhyme know\n","46 46 ... great agility from akpom cut back and bend\n","47 47 ... from undecided pro aap they are not perfect bu...\n","48 48 ... woah there don insane with pray mean you don w...\n","49 49 ... porngress wont announce their candidate cuz th...\n","\n","[50 rows x 8 columns]"]},"metadata":{"tags":[]},"execution_count":6}]},{"cell_type":"markdown","metadata":{"id":"lVyOE2wV0fw_"},"source":["# Test the fitted pipe on new example"]},{"cell_type":"code","metadata":{"colab":{"base_uri":"https://localhost:8080/","height":77},"id":"qdCUg2MR0PD2","executionInfo":{"status":"ok","timestamp":1620195831996,"user_tz":-120,"elapsed":11264,"user":{"displayName":"Christian Kasim Loan","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GjqAD-ircKP-s5Eh6JSdkDggDczfqQbJGU_IRb4Hw=s64","userId":"14469489166467359317"}},"outputId":"68ed8568-654b-41bc-fa22-0ea363e1fb2d"},"source":["fitted_pipe.predict(\"Indian prime minister was assinated!\")"],"execution_count":null,"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","
origin_indexsentencesentence_embedding_usetrained_sentimenttrained_sentiment_confidencedocument
00[Indian prime minister was assinated!][0.012644989416003227, -0.04661174491047859, -...positive0.6117Indian prime minister was assinated!
\n","
"],"text/plain":[" origin_index ... document\n","0 0 ... Indian prime minister was assinated!\n","\n","[1 rows x 6 columns]"]},"metadata":{"tags":[]},"execution_count":7}]},{"cell_type":"markdown","metadata":{"id":"xflpwrVjjBVD"},"source":["## Configure pipe training parameters"]},{"cell_type":"code","metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"UtsAUGTmOTms","executionInfo":{"status":"ok","timestamp":1620195831997,"user_tz":-120,"elapsed":11180,"user":{"displayName":"Christian Kasim Loan","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GjqAD-ircKP-s5Eh6JSdkDggDczfqQbJGU_IRb4Hw=s64","userId":"14469489166467359317"}},"outputId":"69dd4215-3f29-4231-9213-0fe956bc520f"},"source":["trainable_pipe.print_info()"],"execution_count":null,"outputs":[{"output_type":"stream","text":["The following parameters are configurable for this NLU pipeline (You can copy paste the examples) :\n",">>> pipe['sentiment_dl'] has settable params:\n","pipe['sentiment_dl'].setMaxEpochs(1) | Info: Maximum number of epochs to train | Currently set to : 1\n","pipe['sentiment_dl'].setLr(0.005) | Info: Learning Rate | Currently set to : 0.005\n","pipe['sentiment_dl'].setBatchSize(64) | Info: Batch size | Currently set to : 64\n","pipe['sentiment_dl'].setDropout(0.5) | Info: Dropout coefficient | Currently set to : 0.5\n","pipe['sentiment_dl'].setEnableOutputLogs(True) | Info: Whether to use stdout in addition to Spark logs. | Currently set to : True\n","pipe['sentiment_dl'].setThreshold(0.6) | Info: The minimum threshold for the final result otheriwse it will be neutral | Currently set to : 0.6\n","pipe['sentiment_dl'].setThresholdLabel('neutral') | Info: In case the score is less than threshold, what should be the label. Default is neutral. | Currently set to : neutral\n",">>> pipe['use@tfhub_use'] has settable params:\n","pipe['use@tfhub_use'].setDimension(512) | Info: Number of embedding dimensions | Currently set to : 512\n","pipe['use@tfhub_use'].setLoadSP(False) | Info: Whether to load SentencePiece ops file which is required only by multi-lingual models. This is not changeable after it's set with a pretrained model nor it is compatible with Windows. | Currently set to : False\n","pipe['use@tfhub_use'].setStorageRef('tfhub_use') | Info: unique reference name for identification | Currently set to : tfhub_use\n",">>> pipe['deep_sentence_detector@SentenceDetectorDLModel_c83c27f46b97'] has settable params:\n","pipe['deep_sentence_detector@SentenceDetectorDLModel_c83c27f46b97'].setExplodeSentences(False) | Info: whether to explode each sentence into a different row, for better parallelization. Defaults to false. | Currently set to : False\n","pipe['deep_sentence_detector@SentenceDetectorDLModel_c83c27f46b97'].setStorageRef('SentenceDetectorDLModel_c83c27f46b97') | Info: storage unique identifier | Currently set to : SentenceDetectorDLModel_c83c27f46b97\n","pipe['deep_sentence_detector@SentenceDetectorDLModel_c83c27f46b97'].setEncoder(com.johnsnowlabs.nlp.annotators.sentence_detector_dl.SentenceDetectorDLEncoder@3350ae7a) | Info: Data encoder | Currently set to : com.johnsnowlabs.nlp.annotators.sentence_detector_dl.SentenceDetectorDLEncoder@3350ae7a\n","pipe['deep_sentence_detector@SentenceDetectorDLModel_c83c27f46b97'].setImpossiblePenultimates(['Bros', 'No', 'al', 'vs', 'etc', 'Fig', 'Dr', 'Prof', 'PhD', 'MD', 'Co', 'Corp', 'Inc', 'bros', 'VS', 'Vs', 'ETC', 'fig', 'dr', 'prof', 'PHD', 'phd', 'md', 'co', 'corp', 'inc', 'Jan', 'Feb', 'Mar', 'Apr', 'Jul', 'Aug', 'Sep', 'Sept', 'Oct', 'Nov', 'Dec', 'St', 'st', 'AM', 'PM', 'am', 'pm', 'e.g', 'f.e', 'i.e']) | Info: Impossible penultimates | Currently set to : ['Bros', 'No', 'al', 'vs', 'etc', 'Fig', 'Dr', 'Prof', 'PhD', 'MD', 'Co', 'Corp', 'Inc', 'bros', 'VS', 'Vs', 'ETC', 'fig', 'dr', 'prof', 'PHD', 'phd', 'md', 'co', 'corp', 'inc', 'Jan', 'Feb', 'Mar', 'Apr', 'Jul', 'Aug', 'Sep', 'Sept', 'Oct', 'Nov', 'Dec', 'St', 'st', 'AM', 'PM', 'am', 'pm', 'e.g', 'f.e', 'i.e']\n","pipe['deep_sentence_detector@SentenceDetectorDLModel_c83c27f46b97'].setModelArchitecture('cnn') | Info: Model architecture (CNN) | Currently set to : cnn\n",">>> pipe['document_assembler'] has settable params:\n","pipe['document_assembler'].setCleanupMode('shrink') | Info: possible values: disabled, inplace, inplace_full, shrink, shrink_full, each, each_full, delete_full | Currently set to : shrink\n"],"name":"stdout"}]},{"cell_type":"markdown","metadata":{"id":"2GJdDNV9jEIe"},"source":["## Retrain with new parameters"]},{"cell_type":"code","metadata":{"colab":{"base_uri":"https://localhost:8080/","height":1000},"id":"mptfvHx-MMMX","executionInfo":{"status":"ok","timestamp":1620195837227,"user_tz":-120,"elapsed":16321,"user":{"displayName":"Christian Kasim Loan","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GjqAD-ircKP-s5Eh6JSdkDggDczfqQbJGU_IRb4Hw=s64","userId":"14469489166467359317"}},"outputId":"a46b8835-74db-4f5e-dd91-87d9277cb5b3"},"source":["# Train longer!\n","trainable_pipe = nlu.load('train.sentiment')\n","trainable_pipe['trainable_sentiment_dl'].setMaxEpochs(5) \n","fitted_pipe = trainable_pipe.fit(train_df.iloc[:50])\n","# predict with the trainable pipeline on dataset and get predictions\n","preds = fitted_pipe.predict(train_df.iloc[:50],output_level='document')\n","\n","#sentence detector that is part of the pipe generates sone NaNs. lets drop them first\n","preds.dropna(inplace=True)\n","print(classification_report(preds['y'], preds['sentiment']))\n","\n","preds"],"execution_count":null,"outputs":[{"output_type":"stream","text":[" precision recall f1-score support\n","\n"," negative 1.00 0.83 0.91 24\n"," neutral 0.00 0.00 0.00 0\n"," positive 1.00 1.00 1.00 26\n","\n"," accuracy 0.92 50\n"," macro avg 0.67 0.61 0.64 50\n","weighted avg 1.00 0.92 0.96 50\n","\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"," \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"," \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"," \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"," \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"," \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"," \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"," \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"," \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"," \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"," \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"," \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","
origin_indextextysentencesentence_embedding_usetrained_sentimenttrained_sentiment_confidencedocument
00its true they had cut the power what douchebag...positive[its true they had cut the power what doucheba...[0.033111296594142914, 0.053994592279195786, -...positive0.761194its true they had cut the power what douchebag...
11fuck giroud better finishing like this monthpositive[fuck giroud better finishing like this month][0.0678204670548439, 0.01411951333284378, -0.0...positive0.938677fuck giroud better finishing like this month
22looks shit now but still proud madepositive[looks shit now but still proud made][0.03247417137026787, -0.09844466298818588, -0...positive0.954937looks shit now but still proud made
33pelor the burning hate the best evil godnegative[pelor the burning hate the best evil god][0.04032062366604805, 0.07666622847318649, -0....negative0.810980pelor the burning hate the best evil god
44can ask what you with something this powerfulpositive[can ask what you with something this powerful][0.015518003143370152, -0.05116305500268936, -...positive0.956043can ask what you with something this powerful
55aap’ shazia ilmi from puram constituency lag...negative[aap’ shazia ilmi from puram constituency la...[0.02478150464594364, -0.06508146971464157, -0...negative0.708917aap’ shazia ilmi from puram constituency lag...
66fuck yeahnegative[fuck yeah][0.046024102717638016, -0.02504798397421837, -...negative0.731940fuck yeah
77honestly really surprised alice ranked that lo...positive[honestly really surprised alice ranked that l...[-0.035716041922569275, -0.04127982258796692, ...positive0.966494honestly really surprised alice ranked that lo...
88didn care about politics before now hatenegative[didn care about politics before now hate][-0.006816443987190723, 0.06221264228224754, -...negative0.672320didn care about politics before now hate
99hard nips and goosebumpsnegative[hard nips and goosebumps][-0.02919699251651764, -0.030449824407696724, ...negative0.604969hard nips and goosebumps
1010varadabhai ndtv trying too well dilute bjp tre...negative[varadabhai ndtv trying too well dilute bjp tr...[0.04727796092629433, -0.06792476028203964, -0...negative0.639880varadabhai ndtv trying too well dilute bjp tre...
1111old man has lost his mindpositive[old man has lost his mind][0.039657335728406906, -0.04277808964252472, -...positive0.929136old man has lost his mind
1212why this being downvoted you might ask both mo...negative[why this being downvoted you might ask both m...[0.06581216305494308, -0.06079106032848358, -0...neutral0.546161why this being downvoted you might ask both mo...
1313hasnt changed all apolitical before simply do...positive[hasnt changed all apolitical before simply do...[0.03509754315018654, -0.004639611579477787, -...positive0.883017hasnt changed all apolitical before simply don...
1414for one campaign pretty much just snatched the...negative[for one campaign pretty much just snatched th...[0.017386479303240776, 0.0443551279604435, -0....negative0.636396for one campaign pretty much just snatched the...
1515vajpayee managed forge much broader coalition ...positive[vajpayee managed forge much broader coalition...[0.0372871570289135, -0.051079731434583664, -0...positive0.848566vajpayee managed forge much broader coalition ...
1616lol this only proves how desperate they are ge...positive[lol this only proves how desperate they are g...[0.05233633145689964, -0.03147873282432556, 0....positive0.819890lol this only proves how desperate they are ge...
1717dont hate aap but your questions are example ...negative[dont hate aap but your questions are example ...[0.026356501504778862, -0.04044199362397194, -...negative0.724538dont hate aap but your questions are example w...
1818what were the other policies you discussed not...negative[what were the other policies you discussed no...[-0.07521010935306549, 0.008543566800653934, 0...negative0.732422what were the other policies you discussed not...
1919wow lots favorites this bracket haqua tsukushi...positive[wow lots favorites this bracket haqua tsukush...[-0.069316066801548, -0.015458517707884312, -0...positive0.971349wow lots favorites this bracket haqua tsukushi...
2020sorry know this isn what you asked just ventin...negative[sorry know this isn what you asked just venti...[0.016777774319052696, -0.05478339642286301, -...negative0.623325sorry know this isn what you asked just ventin...
2121coming out strongly against gujarat chief min...positive[coming out strongly against gujarat chief min...[0.06856724619865417, -0.019821861758828163, -...positive0.736283coming out strongly against gujarat chief mini...
2222there one tool bjp can use their manifesto whi...positive[there one tool bjp can use their manifesto wh...[0.057847339659929276, -0.05365725979208946, -...positive0.870023there one tool bjp can use their manifesto whi...
2323jakiro spotted the middle top maybepositive[jakiro spotted the middle top maybe][-0.011690961197018623, -0.024473996832966805,...positive0.965604jakiro spotted the middle top maybe
2424family mormon have never tried explain them t...positive[family mormon have never tried explain them t...[0.03987010195851326, -0.0009543427731841803, ...positive0.964053family mormon have never tried explain them th...
2525with these results would have grudgingly accep...negative[with these results would have grudgingly acce...[0.034668292850255966, -0.05392604321241379, -...neutral0.521401with these results would have grudgingly accep...
2626tea partier expresses support for namo after ...negative[tea partier expresses support for namo after ...[0.032365716993808746, -0.056087080389261246, ...negative0.837552tea partier expresses support for namo after e...
2727politically would stupid move take stand right...negative[politically would stupid move take stand righ...[-0.00040777752292342484, -0.01262842211872339...neutral0.541656politically would stupid move take stand right...
2828wtf whynegative[wtf why][0.025807170197367668, -0.07080958038568497, -...negative0.747054wtf why
2929have actually seen lot users views change dur...positive[have actually seen lot users views change dur...[-0.009333955124020576, 0.01388698909431696, -...positive0.818759have actually seen lot users views change duri...
3030truth told there not insignificant percentage ...positive[truth told there not insignificant percentage...[0.03927519917488098, -0.05597652122378349, -0...positive0.776765truth told there not insignificant percentage ...
3131was anti bjp and neutral cong became anti bjp ...positive[was anti bjp and neutral cong became anti bjp...[0.03805134445428848, -0.030298737809062004, -...positive0.630857was anti bjp and neutral cong became anti bjp ...
3232most religions have dogmatic orthodox well eso...positive[most religions have dogmatic orthodox well es...[0.03939439728856087, -0.02040349319577217, -0...positive0.972607most religions have dogmatic orthodox well eso...
3333laureatte sen said christian schools are perfe...positive[laureatte sen said christian schools are perf...[0.05267934128642082, 0.05836360529065132, 0.0...positive0.911020laureatte sen said christian schools are perfe...
3434need stop watching the garbage that you watch...positive[need stop watching the garbage that you watch...[-0.012382612563669682, 0.01988200470805168, 0...positive0.954440need stop watching the garbage that you watch ...
3535gandhi mandela hitler mao plato chandragupt ma...negative[gandhi mandela hitler mao plato chandragupt m...[0.027552243322134018, 0.013075066730380058, 0...negative0.767667gandhi mandela hitler mao plato chandragupt ma...
3636hate aap for the other thread points such the...negative[hate aap for the other thread points such the...[0.014617362059652805, -0.038017578423023224, ...negative0.690414hate aap for the other thread points such the ...
3737absolutely agree with you subsidies the worst ...negative[absolutely agree with you subsidies the worst...[0.0109744006767869, 0.0033110964577645063, -0...neutral0.581476absolutely agree with you subsidies the worst ...
3838are you corrupt mind have you benefited throu...negative[are you corrupt mind have you benefited throu...[0.03834373503923416, -0.06521473079919815, -0...negative0.783217are you corrupt mind have you benefited throug...
3939congress needs bogeyman modi without the bad g...positive[congress needs bogeyman modi without the bad ...[0.03138439729809761, -0.06221967190504074, -0...positive0.764358congress needs bogeyman modi without the bad g...
4040protip don type uppercase text all caps harder...negative[protip don type uppercase text all caps harde...[0.044019922614097595, 0.025341013446450233, 0...negative0.738550protip don type uppercase text all caps harder...
4141brother trog very wrathful indeed but his wil...positive[brother trog very wrathful indeed but his wil...[-0.024625714868307114, 0.06193268671631813, 0...positive0.923871brother trog very wrathful indeed but his will...
4242start off saying that the craftsmanship this ...positive[start off saying that the craftsmanship this ...[0.05780624598264694, -0.06291750818490982, -0...positive0.985073start off saying that the craftsmanship this p...
4343have made request unban namoarmy hell moron h...negative[have made request unban namoarmy hell moron h...[0.015555822290480137, -0.012748800218105316, ...negative0.796430have made request unban namoarmy hell moron ho...
4444child modi worked his father’ tea shop and ...negative[child modi worked his father’ tea shop and ...[0.05774841457605362, -0.05956699699163437, -0...negative0.709697child modi worked his father’ tea shop and y...
4545namo tea yuupea horrible rhyme knownegative[namo tea yuupea horrible rhyme know][0.025534288957715034, 0.004176765214651823, -...negative0.851523namo tea yuupea horrible rhyme know
4646great agility from akpom cut back and bendpositive[great agility from akpom cut back and bend][0.06865684688091278, -0.02164856530725956, -0...positive0.966416great agility from akpom cut back and bend
4747from undecided pro aap they are not perfect bu...positive[from undecided pro aap they are not perfect b...[0.01590304635465145, -0.0683458000421524, -0....positive0.891286from undecided pro aap they are not perfect bu...
4848woah there don insane with pray mean you don w...negative[woah there don insane with pray mean you don ...[0.050547026097774506, -0.01725909113883972, 0...negative0.798072woah there don insane with pray mean you don w...
4949porngress wont announce their candidate cuz th...positive[porngress wont announce their candidate cuz t...[0.05935536324977875, -0.051609162241220474, -...positive0.858500porngress wont announce their candidate cuz th...
\n","
"],"text/plain":[" origin_index ... document\n","0 0 ... its true they had cut the power what douchebag...\n","1 1 ... fuck giroud better finishing like this month\n","2 2 ... looks shit now but still proud made\n","3 3 ... pelor the burning hate the best evil god\n","4 4 ... can ask what you with something this powerful\n","5 5 ... aap’ shazia ilmi from puram constituency lag...\n","6 6 ... fuck yeah\n","7 7 ... honestly really surprised alice ranked that lo...\n","8 8 ... didn care about politics before now hate\n","9 9 ... hard nips and goosebumps\n","10 10 ... varadabhai ndtv trying too well dilute bjp tre...\n","11 11 ... old man has lost his mind\n","12 12 ... why this being downvoted you might ask both mo...\n","13 13 ... hasnt changed all apolitical before simply don...\n","14 14 ... for one campaign pretty much just snatched the...\n","15 15 ... vajpayee managed forge much broader coalition ...\n","16 16 ... lol this only proves how desperate they are ge...\n","17 17 ... dont hate aap but your questions are example w...\n","18 18 ... what were the other policies you discussed not...\n","19 19 ... wow lots favorites this bracket haqua tsukushi...\n","20 20 ... sorry know this isn what you asked just ventin...\n","21 21 ... coming out strongly against gujarat chief mini...\n","22 22 ... there one tool bjp can use their manifesto whi...\n","23 23 ... jakiro spotted the middle top maybe\n","24 24 ... family mormon have never tried explain them th...\n","25 25 ... with these results would have grudgingly accep...\n","26 26 ... tea partier expresses support for namo after e...\n","27 27 ... politically would stupid move take stand right...\n","28 28 ... wtf why\n","29 29 ... have actually seen lot users views change duri...\n","30 30 ... truth told there not insignificant percentage ...\n","31 31 ... was anti bjp and neutral cong became anti bjp ...\n","32 32 ... most religions have dogmatic orthodox well eso...\n","33 33 ... laureatte sen said christian schools are perfe...\n","34 34 ... need stop watching the garbage that you watch ...\n","35 35 ... gandhi mandela hitler mao plato chandragupt ma...\n","36 36 ... hate aap for the other thread points such the ...\n","37 37 ... absolutely agree with you subsidies the worst ...\n","38 38 ... are you corrupt mind have you benefited throug...\n","39 39 ... congress needs bogeyman modi without the bad g...\n","40 40 ... protip don type uppercase text all caps harder...\n","41 41 ... brother trog very wrathful indeed but his will...\n","42 42 ... start off saying that the craftsmanship this p...\n","43 43 ... have made request unban namoarmy hell moron ho...\n","44 44 ... child modi worked his father’ tea shop and y...\n","45 45 ... namo tea yuupea horrible rhyme know\n","46 46 ... great agility from akpom cut back and bend\n","47 47 ... from undecided pro aap they are not perfect bu...\n","48 48 ... woah there don insane with pray mean you don w...\n","49 49 ... porngress wont announce their candidate cuz th...\n","\n","[50 rows x 8 columns]"]},"metadata":{"tags":[]},"execution_count":9}]},{"cell_type":"markdown","metadata":{"id":"qFoT-s1MjTSS"},"source":["# Try training with different Embeddings"]},{"cell_type":"code","metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"nxWFzQOhjWC8","executionInfo":{"status":"ok","timestamp":1620195837230,"user_tz":-120,"elapsed":16237,"user":{"displayName":"Christian Kasim Loan","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GjqAD-ircKP-s5Eh6JSdkDggDczfqQbJGU_IRb4Hw=s64","userId":"14469489166467359317"}},"outputId":"2e5d8344-8b95-40fc-b43e-04c0b4aaaa45"},"source":["# We can use nlu.print_components(action='embed_sentence') to see every possibler sentence embedding we could use. Lets use bert!\n","nlu.print_components(action='embed_sentence')"],"execution_count":null,"outputs":[{"output_type":"stream","text":["For language NLU provides the following Models : \n","nlu.load('en.embed_sentence') returns Spark NLP model tfhub_use\n","nlu.load('en.embed_sentence.use') returns Spark NLP model tfhub_use\n","nlu.load('en.embed_sentence.tfhub_use') returns Spark NLP model tfhub_use\n","nlu.load('en.embed_sentence.use.lg') returns Spark NLP model tfhub_use_lg\n","nlu.load('en.embed_sentence.tfhub_use.lg') returns Spark NLP model tfhub_use_lg\n","nlu.load('en.embed_sentence.albert') returns Spark NLP model albert_base_uncased\n","nlu.load('en.embed_sentence.electra') returns Spark NLP model sent_electra_small_uncased\n","nlu.load('en.embed_sentence.electra_small_uncased') returns Spark NLP model sent_electra_small_uncased\n","nlu.load('en.embed_sentence.electra_base_uncased') returns Spark NLP model sent_electra_base_uncased\n","nlu.load('en.embed_sentence.electra_large_uncased') returns Spark NLP model sent_electra_large_uncased\n","nlu.load('en.embed_sentence.bert') returns Spark NLP model sent_bert_base_uncased\n","nlu.load('en.embed_sentence.bert_base_uncased') returns Spark NLP model sent_bert_base_uncased\n","nlu.load('en.embed_sentence.bert_base_cased') returns Spark NLP model sent_bert_base_cased\n","nlu.load('en.embed_sentence.bert_large_uncased') returns Spark NLP model sent_bert_large_uncased\n","nlu.load('en.embed_sentence.bert_large_cased') returns Spark NLP model sent_bert_large_cased\n","nlu.load('en.embed_sentence.biobert.pubmed_base_cased') returns Spark NLP model sent_biobert_pubmed_base_cased\n","nlu.load('en.embed_sentence.biobert.pubmed_large_cased') returns Spark NLP model sent_biobert_pubmed_large_cased\n","nlu.load('en.embed_sentence.biobert.pmc_base_cased') returns Spark NLP model sent_biobert_pmc_base_cased\n","nlu.load('en.embed_sentence.biobert.pubmed_pmc_base_cased') returns Spark NLP model sent_biobert_pubmed_pmc_base_cased\n","nlu.load('en.embed_sentence.biobert.clinical_base_cased') returns Spark NLP model sent_biobert_clinical_base_cased\n","nlu.load('en.embed_sentence.biobert.discharge_base_cased') returns Spark NLP model sent_biobert_discharge_base_cased\n","nlu.load('en.embed_sentence.covidbert.large_uncased') returns Spark NLP model sent_covidbert_large_uncased\n","nlu.load('en.embed_sentence.small_bert_L2_128') returns Spark NLP model sent_small_bert_L2_128\n","nlu.load('en.embed_sentence.small_bert_L4_128') returns Spark NLP model sent_small_bert_L4_128\n","nlu.load('en.embed_sentence.small_bert_L6_128') returns Spark NLP model sent_small_bert_L6_128\n","nlu.load('en.embed_sentence.small_bert_L8_128') returns Spark NLP model sent_small_bert_L8_128\n","nlu.load('en.embed_sentence.small_bert_L10_128') returns Spark NLP model sent_small_bert_L10_128\n","nlu.load('en.embed_sentence.small_bert_L12_128') returns Spark NLP model sent_small_bert_L12_128\n","nlu.load('en.embed_sentence.small_bert_L2_256') returns Spark NLP model sent_small_bert_L2_256\n","nlu.load('en.embed_sentence.small_bert_L4_256') returns Spark NLP model sent_small_bert_L4_256\n","nlu.load('en.embed_sentence.small_bert_L6_256') returns Spark NLP model sent_small_bert_L6_256\n","nlu.load('en.embed_sentence.small_bert_L8_256') returns Spark NLP model sent_small_bert_L8_256\n","nlu.load('en.embed_sentence.small_bert_L10_256') returns Spark NLP model sent_small_bert_L10_256\n","nlu.load('en.embed_sentence.small_bert_L12_256') returns Spark NLP model sent_small_bert_L12_256\n","nlu.load('en.embed_sentence.small_bert_L2_512') returns Spark NLP model sent_small_bert_L2_512\n","nlu.load('en.embed_sentence.small_bert_L4_512') returns Spark NLP model sent_small_bert_L4_512\n","nlu.load('en.embed_sentence.small_bert_L6_512') returns Spark NLP model sent_small_bert_L6_512\n","nlu.load('en.embed_sentence.small_bert_L8_512') returns Spark NLP model sent_small_bert_L8_512\n","nlu.load('en.embed_sentence.small_bert_L10_512') returns Spark NLP model sent_small_bert_L10_512\n","nlu.load('en.embed_sentence.small_bert_L12_512') returns Spark NLP model sent_small_bert_L12_512\n","nlu.load('en.embed_sentence.small_bert_L2_768') returns Spark NLP model sent_small_bert_L2_768\n","nlu.load('en.embed_sentence.small_bert_L4_768') returns Spark NLP model sent_small_bert_L4_768\n","nlu.load('en.embed_sentence.small_bert_L6_768') returns Spark NLP model sent_small_bert_L6_768\n","nlu.load('en.embed_sentence.small_bert_L8_768') returns Spark NLP model sent_small_bert_L8_768\n","nlu.load('en.embed_sentence.small_bert_L10_768') returns Spark NLP model sent_small_bert_L10_768\n","nlu.load('en.embed_sentence.small_bert_L12_768') returns Spark NLP model sent_small_bert_L12_768\n","For language NLU provides the following Models : \n","nlu.load('fi.embed_sentence') returns Spark NLP model sent_bert_finnish_cased\n","nlu.load('fi.embed_sentence.bert.cased') returns Spark NLP model sent_bert_finnish_cased\n","nlu.load('fi.embed_sentence.bert.uncased') returns Spark NLP model sent_bert_finnish_uncased\n","For language NLU provides the following Models : \n","nlu.load('xx.embed_sentence') returns Spark NLP model sent_bert_multi_cased\n","nlu.load('xx.embed_sentence.bert') returns Spark NLP model sent_bert_multi_cased\n","nlu.load('xx.embed_sentence.bert.cased') returns Spark NLP model sent_bert_multi_cased\n","nlu.load('xx.embed_sentence.labse') returns Spark NLP model labse\n"],"name":"stdout"}]},{"cell_type":"code","metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"IKK_Ii_gjJfF","executionInfo":{"status":"ok","timestamp":1620196320027,"user_tz":-120,"elapsed":499014,"user":{"displayName":"Christian Kasim Loan","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GjqAD-ircKP-s5Eh6JSdkDggDczfqQbJGU_IRb4Hw=s64","userId":"14469489166467359317"}},"outputId":"4237cd32-fd39-444f-f6a9-9a6de947a62f"},"source":["trainable_pipe = nlu.load('en.embed_sentence.small_bert_L12_768 train.sentiment')\n","# We need to train longer and user smaller LR for NON-USE based sentence embeddings usually\n","# We could tune the hyperparameters further with hyperparameter tuning methods like gridsearch\n","# Also longer training gives more accuracy\n","trainable_pipe['trainable_sentiment_dl'].setMaxEpochs(70) \n","trainable_pipe['trainable_sentiment_dl'].setLr(0.0005) \n","fitted_pipe = trainable_pipe.fit(train_df)\n","# predict with the trainable pipeline on dataset and get predictions\n","preds = fitted_pipe.predict(train_df,output_level='document')\n","\n","#sentence detector that is part of the pipe generates sone NaNs. lets drop them first\n","preds.dropna(inplace=True)\n","print(classification_report(preds['y'], preds['sentiment']))\n","\n","#preds"],"execution_count":null,"outputs":[{"output_type":"stream","text":["sent_small_bert_L12_768 download started this may take some time.\n","Approximate size to download 392.9 MB\n","[OK!]\n","sentence_detector_dl download started this may take some time.\n","Approximate size to download 354.6 KB\n","[OK!]\n"," precision recall f1-score support\n","\n"," negative 0.86 0.80 0.83 300\n"," neutral 0.00 0.00 0.00 0\n"," positive 0.90 0.70 0.79 300\n","\n"," accuracy 0.75 600\n"," macro avg 0.59 0.50 0.54 600\n","weighted avg 0.88 0.75 0.81 600\n","\n"],"name":"stdout"}]},{"cell_type":"markdown","metadata":{"id":"2BB-NwZUoHSe"},"source":["# 5. Lets save the model"]},{"cell_type":"code","metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"eLex095goHwm","executionInfo":{"status":"ok","timestamp":1620196504424,"user_tz":-120,"elapsed":683325,"user":{"displayName":"Christian Kasim Loan","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GjqAD-ircKP-s5Eh6JSdkDggDczfqQbJGU_IRb4Hw=s64","userId":"14469489166467359317"}},"outputId":"798b31d7-cec2-48c8-ae29-7d4577ed9097"},"source":["stored_model_path = './models/classifier_dl_trained' \n","fitted_pipe.save(stored_model_path)"],"execution_count":null,"outputs":[{"output_type":"stream","text":["Stored model in ./models/classifier_dl_trained\n"],"name":"stdout"}]},{"cell_type":"markdown","metadata":{"id":"e_b2DPd4rCiU"},"source":["# 6. Lets load the model from HDD.\n","This makes Offlien NLU usage possible! \n","You need to call nlu.load(path=path_to_the_pipe) to load a model/pipeline from disk."]},{"cell_type":"code","metadata":{"colab":{"base_uri":"https://localhost:8080/","height":77},"id":"SO4uz45MoRgp","executionInfo":{"status":"ok","timestamp":1620196519636,"user_tz":-120,"elapsed":698457,"user":{"displayName":"Christian Kasim Loan","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GjqAD-ircKP-s5Eh6JSdkDggDczfqQbJGU_IRb4Hw=s64","userId":"14469489166467359317"}},"outputId":"662503b6-694f-4990-e121-80f6a9f2dcae"},"source":["hdd_pipe = nlu.load(path=stored_model_path)\n","\n","preds = hdd_pipe.predict('Indian prime minister was assinated')\n","preds"],"execution_count":null,"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","
origin_indextextsentence_embedding_from_disksentencesentiment_confidencesentimentdocument
08589934592Indian prime minister was assinated[[-0.09739551693201065, 0.23939256370067596, 0...[Indian prime minister was assinated][0.81195][negative]Indian prime minister was assinated
\n","
"],"text/plain":[" origin_index ... document\n","0 8589934592 ... Indian prime minister was assinated\n","\n","[1 rows x 7 columns]"]},"metadata":{"tags":[]},"execution_count":13}]},{"cell_type":"code","metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"e0CVlkk9v6Qi","executionInfo":{"status":"ok","timestamp":1620196519638,"user_tz":-120,"elapsed":698413,"user":{"displayName":"Christian Kasim Loan","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GjqAD-ircKP-s5Eh6JSdkDggDczfqQbJGU_IRb4Hw=s64","userId":"14469489166467359317"}},"outputId":"10c659fe-32a8-479b-e994-6827d8240a64"},"source":["hdd_pipe.print_info()"],"execution_count":null,"outputs":[{"output_type":"stream","text":["The following parameters are configurable for this NLU pipeline (You can copy paste the examples) :\n",">>> pipe['document_assembler'] has settable params:\n","pipe['document_assembler'].setCleanupMode('shrink') | Info: possible values: disabled, inplace, inplace_full, shrink, shrink_full, each, each_full, delete_full | Currently set to : shrink\n",">>> pipe['sentence_detector@SentenceDetectorDLModel_c83c27f46b97'] has settable params:\n","pipe['sentence_detector@SentenceDetectorDLModel_c83c27f46b97'].setExplodeSentences(False) | Info: whether to explode each sentence into a different row, for better parallelization. Defaults to false. | Currently set to : False\n","pipe['sentence_detector@SentenceDetectorDLModel_c83c27f46b97'].setStorageRef('SentenceDetectorDLModel_c83c27f46b97') | Info: storage unique identifier | Currently set to : SentenceDetectorDLModel_c83c27f46b97\n","pipe['sentence_detector@SentenceDetectorDLModel_c83c27f46b97'].setEncoder(com.johnsnowlabs.nlp.annotators.sentence_detector_dl.SentenceDetectorDLEncoder@2d9c5454) | Info: Data encoder | Currently set to : com.johnsnowlabs.nlp.annotators.sentence_detector_dl.SentenceDetectorDLEncoder@2d9c5454\n","pipe['sentence_detector@SentenceDetectorDLModel_c83c27f46b97'].setImpossiblePenultimates(['Bros', 'No', 'al', 'vs', 'etc', 'Fig', 'Dr', 'Prof', 'PhD', 'MD', 'Co', 'Corp', 'Inc', 'bros', 'VS', 'Vs', 'ETC', 'fig', 'dr', 'prof', 'PHD', 'phd', 'md', 'co', 'corp', 'inc', 'Jan', 'Feb', 'Mar', 'Apr', 'Jul', 'Aug', 'Sep', 'Sept', 'Oct', 'Nov', 'Dec', 'St', 'st', 'AM', 'PM', 'am', 'pm', 'e.g', 'f.e', 'i.e']) | Info: Impossible penultimates | Currently set to : ['Bros', 'No', 'al', 'vs', 'etc', 'Fig', 'Dr', 'Prof', 'PhD', 'MD', 'Co', 'Corp', 'Inc', 'bros', 'VS', 'Vs', 'ETC', 'fig', 'dr', 'prof', 'PHD', 'phd', 'md', 'co', 'corp', 'inc', 'Jan', 'Feb', 'Mar', 'Apr', 'Jul', 'Aug', 'Sep', 'Sept', 'Oct', 'Nov', 'Dec', 'St', 'st', 'AM', 'PM', 'am', 'pm', 'e.g', 'f.e', 'i.e']\n","pipe['sentence_detector@SentenceDetectorDLModel_c83c27f46b97'].setModelArchitecture('cnn') | Info: Model architecture (CNN) | Currently set to : cnn\n",">>> pipe['bert_sentence@sent_small_bert_L12_768'] has settable params:\n","pipe['bert_sentence@sent_small_bert_L12_768'].setBatchSize(8) | Info: Size of every batch | Currently set to : 8\n","pipe['bert_sentence@sent_small_bert_L12_768'].setCaseSensitive(False) | Info: whether to ignore case in tokens for embeddings matching | Currently set to : False\n","pipe['bert_sentence@sent_small_bert_L12_768'].setDimension(768) | Info: Number of embedding dimensions | Currently set to : 768\n","pipe['bert_sentence@sent_small_bert_L12_768'].setMaxSentenceLength(128) | Info: Max sentence length to process | Currently set to : 128\n","pipe['bert_sentence@sent_small_bert_L12_768'].setIsLong(False) | Info: Use Long type instead of Int type for inputs buffer - Some Bert models require Long instead of Int. | Currently set to : False\n","pipe['bert_sentence@sent_small_bert_L12_768'].setStorageRef('sent_small_bert_L12_768') | Info: unique reference name for identification | Currently set to : sent_small_bert_L12_768\n",">>> pipe['sentiment_dl@sent_small_bert_L12_768'] has settable params:\n","pipe['sentiment_dl@sent_small_bert_L12_768'].setThreshold(0.6) | Info: The minimum threshold for the final result otheriwse it will be neutral | Currently set to : 0.6\n","pipe['sentiment_dl@sent_small_bert_L12_768'].setThresholdLabel('neutral') | Info: In case the score is less than threshold, what should be the label. Default is neutral. | Currently set to : neutral\n","pipe['sentiment_dl@sent_small_bert_L12_768'].setClasses(['positive', 'negative']) | Info: get the tags used to trained this SentimentDLModel | Currently set to : ['positive', 'negative']\n","pipe['sentiment_dl@sent_small_bert_L12_768'].setStorageRef('sent_small_bert_L12_768') | Info: unique reference name for identification | Currently set to : sent_small_bert_L12_768\n"],"name":"stdout"}]},{"cell_type":"code","metadata":{"id":"2LJTK79JKF9-"},"source":[""],"execution_count":null,"outputs":[]}]} \ No newline at end of file +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": { + "id": "zkufh760uvF3" + }, + "source": [ + "![JohnSnowLabs](https://nlp.johnsnowlabs.com/assets/images/logo.png)\n", + "\n", + "[![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/JohnSnowLabs/nlu/blob/master/examples/colab/Training/binary_text_classification/NLU_training_sentiment_classifier_demo_reddit.ipynb)\n", + "\n", + "\n", + "# Training a Sentiment Analysis Classifier with NLU\n", + "## 2 class Reddit comment sentiment classifier training\n", + "With the [SentimentDL model](https://nlp.johnsnowlabs.com/docs/en/annotators#sentimentdl-multi-class-sentiment-analysis-annotator) from Spark NLP you can achieve State Of the Art results on any multi class text classification problem\n", + "\n", + "This notebook showcases the following features :\n", + "\n", + "- How to train the deep learning classifier\n", + "- How to store a pipeline to disk\n", + "- How to load the pipeline from disk (Enables NLU offline mode)\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "dur2drhW5Rvi" + }, + "source": [ + "# 1. Install Java 8 and NLU" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "hFGnBCHavltY" + }, + "outputs": [], + "source": [ + "!pip install -q johnsnowlabs" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "f4KkTfnR5Ugg" + }, + "source": [ + "# 2. Download Reddit Sentiment dataset\n", + "https://www.kaggle.com/cosmos98/twitter-and-reddit-sentimental-analysis-dataset\n", + "#Context\n", + "\n", + "This is was a Dataset Created as a part of the university Project On Sentimental Analysis On Multi-Source Social Media Platforms using PySpark." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "OrVb5ZMvvrQD" + }, + "outputs": [], + "source": [ + "! wget https://s3.amazonaws.com/auxdata.johnsnowlabs.com/public/resources/en/classifier-dl/reddit_twitter_sentiment/Reddit_Data.csv\n" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 424 + }, + "id": "y4xSRWIhwT28", + "outputId": "4928f1b2-102c-4519-83f7-6bfa6205749a" + }, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + "
\n", + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \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", + "
texty
0title edit 56dd brend ambasittur for vidya sec...negative
1this reminds kunkka old dota loading screen ar...positive
2meanwhile the other news cms intenttargetnegative
3lovely finish there giroudpositive
4glad see kurisu made with surprising results d...positive
.........
595true india needs top universities and not fdi...positive
596why did miyaichi come off earlypositive
597indian media has lost its credibility now ital...negative
598malaysia french satellite find further debris ...negative
599tell many people you can vote for modi this go...positive
\n", + "

600 rows × 2 columns

\n", + "
\n", + "
\n", + "\n", + "
\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "
\n", + "\n", + "\n", + "
\n", + " \n", + "\n", + "\n", + "\n", + " \n", + "
\n", + "
\n", + "
\n" + ], + "text/plain": [ + " text y\n", + "0 title edit 56dd brend ambasittur for vidya sec... negative\n", + "1 this reminds kunkka old dota loading screen ar... positive\n", + "2 meanwhile the other news cms intenttarget negative\n", + "3 lovely finish there giroud positive\n", + "4 glad see kurisu made with surprising results d... positive\n", + ".. ... ...\n", + "595 true india needs top universities and not fdi... positive\n", + "596 why did miyaichi come off early positive\n", + "597 indian media has lost its credibility now ital... negative\n", + "598 malaysia french satellite find further debris ... negative\n", + "599 tell many people you can vote for modi this go... positive\n", + "\n", + "[600 rows x 2 columns]" + ] + }, + "execution_count": 3, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "import pandas as pd\n", + "train_path = '/content/Reddit_Data.csv'\n", + "\n", + "train_df = pd.read_csv(train_path)\n", + "# the text data to use for classification should be in a column named 'text'\n", + "columns=['text','y']\n", + "train_df = train_df[columns]\n", + "train_df" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "0296Om2C5anY" + }, + "source": [ + "# 3. Train Deep Learning Classifier using nlu.load('train.sentiment')\n", + "\n", + "You dataset label column should be named 'y' and the feature column with text data should be named 'text'" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 1000 + }, + "id": "3ZIPkRkWftBG", + "outputId": "7896942b-7b84-4b21-ee47-a3c59de61166" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Warning::Spark Session already created, some configs may not take.\n", + "sent_small_bert_L2_128 download started this may take some time.\n", + "Approximate size to download 16.1 MB\n", + "[OK!]\n", + " precision recall f1-score support\n", + "\n", + " negative 0.00 0.00 0.00 20\n", + " positive 0.60 1.00 0.75 30\n", + "\n", + " accuracy 0.60 50\n", + " macro avg 0.30 0.50 0.37 50\n", + "weighted avg 0.36 0.60 0.45 50\n", + "\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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + "
documentsentence_embedding_small_bert_L2_128sentimentsentiment_confidencetexty
0title edit 56dd brend ambasittur for vidya secret[-0.13924618065357208, 0.03819392994046211, -0...positive2.0title edit 56dd brend ambasittur for vidya sec...negative
1this reminds kunkka old dota loading screen ar...[-0.05514780059456825, -0.02986345998942852, -...positive1.0this reminds kunkka old dota loading screen ar...positive
2meanwhile the other news cms intenttarget[-1.3784979581832886, -0.05633991211652756, 0....positive7.0meanwhile the other news cms intenttargetnegative
3lovely finish there giroud[-1.026403546333313, -0.5962088108062744, -0.5...positive4.0lovely finish there giroudpositive
4glad see kurisu made with surprising results d...[-1.3281804323196411, -0.3425588011741638, 0.2...positive2.0glad see kurisu made with surprising results d...positive
5wee jas lawful neutral god death magic and nec...[-1.090584635734558, -0.39823225140571594, -0....positive9.0wee jas lawful neutral god death magic and nec...positive
6holy fuck this amazing[-2.318075656890869, -0.10535052418708801, -0....positive7.0holy fuck this amazingpositive
7yougaiz yougaiz who interested parineeti chopr...[-0.7263230085372925, -0.9229655861854553, 0.1...positive9.0yougaiz yougaiz who interested parineeti chopr...positive
8not whole lot has changed except the fact that...[-1.1650828123092651, 0.09717072546482086, -0....positive8.0not whole lot has changed except the fact that...positive
9different times different cultures same point ...[-1.5615334510803223, -0.6228992938995361, -0....positive3.0different times different cultures same point ...positive
10too much attention[-1.473575234413147, 0.6288167834281921, -0.68...positive3.0too much attentionpositive
11its nice and all but your monitors make want b...[-0.8991073966026306, 0.8156149983406067, -0.2...positive1.0its nice and all but your monitors make want b...positive
12india turns into toi comments section the mome...[-0.7343364357948303, -0.12650255858898163, 0....positive3.0india turns into toi comments section the mom...positive
13nice build man pretty damn sexy can ask why ti...[-1.21924889087677, 0.21342627704143524, -0.40...positive1.0nice build man pretty damn sexy can ask why ti...positive
14rofl why are you asking permission you and you...[-0.8997104167938232, 0.45302870869636536, -0....positive7.0rofl why are you asking permission you and you...positive
15seriously did you infographic maker even consi...[-0.8621772527694702, 0.4609760046005249, -0.1...positive2.0seriously did you infographic maker even consi...negative
16cliche but you can wrong with cyric mean was m...[-1.3570650815963745, -0.10502084344625473, -0...positive1.0cliche but you can wrong with cyric mean was ...negative
17from whatever heard this the model modi speech...[-0.8209349513053894, 0.2195633053779602, -0.2...positive2.0from whatever heard this the model modi speech...positive
18heard there was direct line narendra modi whic...[-0.4502873718738556, -0.10798719525337219, -0...positive3.0heard there was direct line narendra modi whi...positive
19truth told there not insignificant percentage ...[-0.6922494173049927, 0.08739931136369705, -0....positive8.0truth told there not insignificant percentage ...positive
20many them fear namo being prime minister could...[-1.3202203512191772, -0.021619228646159172, -...positive2.0many them fear namo being prime minister coul...positive
21source will have accommodate hindus from bangl...[-0.6071749329566956, 0.21432138979434967, -0....positive1.0source will have accommodate hindus from bang...negative
22confirmed woman and this india 186 comments le...[-0.7401843070983887, -0.4919162094593048, -0....positive3.0confirmed woman and this india 186 comments l...positive
23prepared for downvotes but after watching seve...[-0.5390527844429016, 1.0651843547821045, -0.5...positive2.0prepared for downvotes but after watching sev...negative
24delhi not sleeping after long day see congress...[-1.3164680004119873, 0.059689976274967194, -0...positive4.0delhi not sleeping after long day see congres...negative
25would like bjp come out support scrapping sec ...[-0.39008525013923645, 0.6130499243736267, -0....positive2.0would like bjp come out support scrapping sec...negative
26update still found debris black boxes evidence...[-0.5251181721687317, 0.5843355059623718, -0.2...positive1.0update still found debris black boxes evidenc...negative
27there one tool bjp can use their manifesto whi...[-0.42395493388175964, 0.3328923285007477, -0....positive2.0there one tool bjp can use their manifesto whi...positive
28wtf why[-1.0021588802337646, 1.2250791788101196, 0.05...positive4.0wtf whynegative
29fantastic strike the[-0.6758270859718323, -0.2134172022342682, -0....positive2.0fantastic strike thepositive
30you mean the ruling coalition government hatch...[-0.5493559837341309, -0.2645500600337982, -0....positive1.0you mean the ruling coalition government hatch...negative
31before used anti rss result anti bjp very skep...[-0.11697939038276672, 0.26724380254745483, 0....positive7.0before used anti rss result anti bjp very ske...positive
32first understand that you are not anyway contr...[-1.1990007162094116, -0.23811395466327667, -0...positive1.0first understand that you are not anyway contr...positive
33personally for shooting muslims and internetof...[-1.314710259437561, -0.07083063572645187, -0....positive8.0personally for shooting muslims and internetof...negative
34nice build one thing caught eye absolute splur...[-0.3646998703479767, -0.6708006262779236, -0....positive8.0nice build one thing caught eye absolute splur...positive
35looks shit now but still proud made[-1.128523588180542, 0.31619158387184143, 0.02...positive1.0looks shit now but still proud madepositive
36what wrong with that another lame ass attempt ...[-1.9695912599563599, 0.27932408452033997, 0.0...positive1.0what wrong with that another lame ass attempt ...negative
37how difficult was get the length and bend the ...[-1.2320657968521118, 0.9790331721305847, -0.5...positive8.0how difficult was get the length and bend the ...positive
38very impressed with gnabry movement and linkin...[-0.3107994794845581, 0.3307916522026062, -0.1...positive4.0very impressed with gnabry movement and linki...positive
39here interesting tidbit what the like off pert...[-0.308876633644104, 0.49783819913864136, -0.2...positive2.0here interesting tidbit what the like off pert...negative
40false dichotomy either you are for for bjp you...[-0.6038466691970825, 0.2866456210613251, -0.3...positive3.0false dichotomy either you are for for bjp you...negative
41angry namo bhaktas the survival the angry namo...[-1.20363450050354, -1.119809627532959, -0.183...positive4.0angry namo bhaktas the survival the angry namo...negative
42this would issue these people were prosecuted ...[-0.853580892086029, 0.8160178661346436, 0.117...positive4.0this would issue these people were prosecuted ...negative
43hate free india would boring love hate relatio...[-0.28927552700042725, -0.9648609757423401, -0...positive2.0hate free india would boring love hate relati...negative
44this getting bit silly now[-1.1343425512313843, -0.030997686088085175, 0...positive5.0this getting bit silly nownegative
45giroud should done better but great ball rosicky[-1.308074951171875, -0.03950951248407364, -0....positive3.0giroud should done better but great ball rosickypositive
46jakiro spotted the middle top maybe[-2.2450177669525146, -0.5104915499687195, -0....positive2.0jakiro spotted the middle top maybepositive
47won vote for aap anymore that for sure though ...[-0.7843935489654541, -0.32822510600090027, 0....positive5.0won vote for aap anymore that for sure though...negative
48regardless the opposition all girouds goals ha...[-1.635783076286316, 0.30238792300224304, -0.7...positive2.0regardless the opposition all girouds goals ha...positive
49directly pleading people who oppose modi just ...[-0.7491450905799866, -0.4327720105648041, 0.0...positive1.0directly pleading people who oppose modi just...positive
\n", + "
\n", + "
\n", + "\n", + "
\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "
\n", + "\n", + "\n", + "
\n", + " \n", + "\n", + "\n", + "\n", + " \n", + "
\n", + "
\n", + "
\n" + ], + "text/plain": [ + " document \\\n", + "0 title edit 56dd brend ambasittur for vidya secret \n", + "1 this reminds kunkka old dota loading screen ar... \n", + "2 meanwhile the other news cms intenttarget \n", + "3 lovely finish there giroud \n", + "4 glad see kurisu made with surprising results d... \n", + "5 wee jas lawful neutral god death magic and nec... \n", + "6 holy fuck this amazing \n", + "7 yougaiz yougaiz who interested parineeti chopr... \n", + "8 not whole lot has changed except the fact that... \n", + "9 different times different cultures same point ... \n", + "10 too much attention \n", + "11 its nice and all but your monitors make want b... \n", + "12 india turns into toi comments section the mome... \n", + "13 nice build man pretty damn sexy can ask why ti... \n", + "14 rofl why are you asking permission you and you... \n", + "15 seriously did you infographic maker even consi... \n", + "16 cliche but you can wrong with cyric mean was m... \n", + "17 from whatever heard this the model modi speech... \n", + "18 heard there was direct line narendra modi whic... \n", + "19 truth told there not insignificant percentage ... \n", + "20 many them fear namo being prime minister could... \n", + "21 source will have accommodate hindus from bangl... \n", + "22 confirmed woman and this india 186 comments le... \n", + "23 prepared for downvotes but after watching seve... \n", + "24 delhi not sleeping after long day see congress... \n", + "25 would like bjp come out support scrapping sec ... \n", + "26 update still found debris black boxes evidence... \n", + "27 there one tool bjp can use their manifesto whi... \n", + "28 wtf why \n", + "29 fantastic strike the \n", + "30 you mean the ruling coalition government hatch... \n", + "31 before used anti rss result anti bjp very skep... \n", + "32 first understand that you are not anyway contr... \n", + "33 personally for shooting muslims and internetof... \n", + "34 nice build one thing caught eye absolute splur... \n", + "35 looks shit now but still proud made \n", + "36 what wrong with that another lame ass attempt ... \n", + "37 how difficult was get the length and bend the ... \n", + "38 very impressed with gnabry movement and linkin... \n", + "39 here interesting tidbit what the like off pert... \n", + "40 false dichotomy either you are for for bjp you... \n", + "41 angry namo bhaktas the survival the angry namo... \n", + "42 this would issue these people were prosecuted ... \n", + "43 hate free india would boring love hate relatio... \n", + "44 this getting bit silly now \n", + "45 giroud should done better but great ball rosicky \n", + "46 jakiro spotted the middle top maybe \n", + "47 won vote for aap anymore that for sure though ... \n", + "48 regardless the opposition all girouds goals ha... \n", + "49 directly pleading people who oppose modi just ... \n", + "\n", + " sentence_embedding_small_bert_L2_128 sentiment \\\n", + "0 [-0.13924618065357208, 0.03819392994046211, -0... positive \n", + "1 [-0.05514780059456825, -0.02986345998942852, -... positive \n", + "2 [-1.3784979581832886, -0.05633991211652756, 0.... positive \n", + "3 [-1.026403546333313, -0.5962088108062744, -0.5... positive \n", + "4 [-1.3281804323196411, -0.3425588011741638, 0.2... positive \n", + "5 [-1.090584635734558, -0.39823225140571594, -0.... positive \n", + "6 [-2.318075656890869, -0.10535052418708801, -0.... positive \n", + "7 [-0.7263230085372925, -0.9229655861854553, 0.1... positive \n", + "8 [-1.1650828123092651, 0.09717072546482086, -0.... positive \n", + "9 [-1.5615334510803223, -0.6228992938995361, -0.... positive \n", + "10 [-1.473575234413147, 0.6288167834281921, -0.68... positive \n", + "11 [-0.8991073966026306, 0.8156149983406067, -0.2... positive \n", + "12 [-0.7343364357948303, -0.12650255858898163, 0.... positive \n", + "13 [-1.21924889087677, 0.21342627704143524, -0.40... positive \n", + "14 [-0.8997104167938232, 0.45302870869636536, -0.... positive \n", + "15 [-0.8621772527694702, 0.4609760046005249, -0.1... positive \n", + "16 [-1.3570650815963745, -0.10502084344625473, -0... positive \n", + "17 [-0.8209349513053894, 0.2195633053779602, -0.2... positive \n", + "18 [-0.4502873718738556, -0.10798719525337219, -0... positive \n", + "19 [-0.6922494173049927, 0.08739931136369705, -0.... positive \n", + "20 [-1.3202203512191772, -0.021619228646159172, -... positive \n", + "21 [-0.6071749329566956, 0.21432138979434967, -0.... positive \n", + "22 [-0.7401843070983887, -0.4919162094593048, -0.... positive \n", + "23 [-0.5390527844429016, 1.0651843547821045, -0.5... positive \n", + "24 [-1.3164680004119873, 0.059689976274967194, -0... positive \n", + "25 [-0.39008525013923645, 0.6130499243736267, -0.... positive \n", + "26 [-0.5251181721687317, 0.5843355059623718, -0.2... positive \n", + "27 [-0.42395493388175964, 0.3328923285007477, -0.... positive \n", + "28 [-1.0021588802337646, 1.2250791788101196, 0.05... positive \n", + "29 [-0.6758270859718323, -0.2134172022342682, -0.... positive \n", + "30 [-0.5493559837341309, -0.2645500600337982, -0.... positive \n", + "31 [-0.11697939038276672, 0.26724380254745483, 0.... positive \n", + "32 [-1.1990007162094116, -0.23811395466327667, -0... positive \n", + "33 [-1.314710259437561, -0.07083063572645187, -0.... positive \n", + "34 [-0.3646998703479767, -0.6708006262779236, -0.... positive \n", + "35 [-1.128523588180542, 0.31619158387184143, 0.02... positive \n", + "36 [-1.9695912599563599, 0.27932408452033997, 0.0... positive \n", + "37 [-1.2320657968521118, 0.9790331721305847, -0.5... positive \n", + "38 [-0.3107994794845581, 0.3307916522026062, -0.1... positive \n", + "39 [-0.308876633644104, 0.49783819913864136, -0.2... positive \n", + "40 [-0.6038466691970825, 0.2866456210613251, -0.3... positive \n", + "41 [-1.20363450050354, -1.119809627532959, -0.183... positive \n", + "42 [-0.853580892086029, 0.8160178661346436, 0.117... positive \n", + "43 [-0.28927552700042725, -0.9648609757423401, -0... positive \n", + "44 [-1.1343425512313843, -0.030997686088085175, 0... positive \n", + "45 [-1.308074951171875, -0.03950951248407364, -0.... positive \n", + "46 [-2.2450177669525146, -0.5104915499687195, -0.... positive \n", + "47 [-0.7843935489654541, -0.32822510600090027, 0.... positive \n", + "48 [-1.635783076286316, 0.30238792300224304, -0.7... positive \n", + "49 [-0.7491450905799866, -0.4327720105648041, 0.0... positive \n", + "\n", + " sentiment_confidence text \\\n", + "0 2.0 title edit 56dd brend ambasittur for vidya sec... \n", + "1 1.0 this reminds kunkka old dota loading screen ar... \n", + "2 7.0 meanwhile the other news cms intenttarget \n", + "3 4.0 lovely finish there giroud \n", + "4 2.0 glad see kurisu made with surprising results d... \n", + "5 9.0 wee jas lawful neutral god death magic and nec... \n", + "6 7.0 holy fuck this amazing \n", + "7 9.0 yougaiz yougaiz who interested parineeti chopr... \n", + "8 8.0 not whole lot has changed except the fact that... \n", + "9 3.0 different times different cultures same point ... \n", + "10 3.0 too much attention \n", + "11 1.0 its nice and all but your monitors make want b... \n", + "12 3.0 india turns into toi comments section the mom... \n", + "13 1.0 nice build man pretty damn sexy can ask why ti... \n", + "14 7.0 rofl why are you asking permission you and you... \n", + "15 2.0 seriously did you infographic maker even consi... \n", + "16 1.0 cliche but you can wrong with cyric mean was ... \n", + "17 2.0 from whatever heard this the model modi speech... \n", + "18 3.0 heard there was direct line narendra modi whi... \n", + "19 8.0 truth told there not insignificant percentage ... \n", + "20 2.0 many them fear namo being prime minister coul... \n", + "21 1.0 source will have accommodate hindus from bang... \n", + "22 3.0 confirmed woman and this india 186 comments l... \n", + "23 2.0 prepared for downvotes but after watching sev... \n", + "24 4.0 delhi not sleeping after long day see congres... \n", + "25 2.0 would like bjp come out support scrapping sec... \n", + "26 1.0 update still found debris black boxes evidenc... \n", + "27 2.0 there one tool bjp can use their manifesto whi... \n", + "28 4.0 wtf why \n", + "29 2.0 fantastic strike the \n", + "30 1.0 you mean the ruling coalition government hatch... \n", + "31 7.0 before used anti rss result anti bjp very ske... \n", + "32 1.0 first understand that you are not anyway contr... \n", + "33 8.0 personally for shooting muslims and internetof... \n", + "34 8.0 nice build one thing caught eye absolute splur... \n", + "35 1.0 looks shit now but still proud made \n", + "36 1.0 what wrong with that another lame ass attempt ... \n", + "37 8.0 how difficult was get the length and bend the ... \n", + "38 4.0 very impressed with gnabry movement and linki... \n", + "39 2.0 here interesting tidbit what the like off pert... \n", + "40 3.0 false dichotomy either you are for for bjp you... \n", + "41 4.0 angry namo bhaktas the survival the angry namo... \n", + "42 4.0 this would issue these people were prosecuted ... \n", + "43 2.0 hate free india would boring love hate relati... \n", + "44 5.0 this getting bit silly now \n", + "45 3.0 giroud should done better but great ball rosicky \n", + "46 2.0 jakiro spotted the middle top maybe \n", + "47 5.0 won vote for aap anymore that for sure though... \n", + "48 2.0 regardless the opposition all girouds goals ha... \n", + "49 1.0 directly pleading people who oppose modi just... \n", + "\n", + " y \n", + "0 negative \n", + "1 positive \n", + "2 negative \n", + "3 positive \n", + "4 positive \n", + "5 positive \n", + "6 positive \n", + "7 positive \n", + "8 positive \n", + "9 positive \n", + "10 positive \n", + "11 positive \n", + "12 positive \n", + "13 positive \n", + "14 positive \n", + "15 negative \n", + "16 negative \n", + "17 positive \n", + "18 positive \n", + "19 positive \n", + "20 positive \n", + "21 negative \n", + "22 positive \n", + "23 negative \n", + "24 negative \n", + "25 negative \n", + "26 negative \n", + "27 positive \n", + "28 negative \n", + "29 positive \n", + "30 negative \n", + "31 positive \n", + "32 positive \n", + "33 negative \n", + "34 positive \n", + "35 positive \n", + "36 negative \n", + "37 positive \n", + "38 positive \n", + "39 negative \n", + "40 negative \n", + "41 negative \n", + "42 negative \n", + "43 negative \n", + "44 negative \n", + "45 positive \n", + "46 positive \n", + "47 negative \n", + "48 positive \n", + "49 positive " + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "from sklearn.metrics import classification_report\n", + "from johnsnowlabs import nlp\n", + "# load a trainable pipeline by specifying the train. prefix and fit it on a datset with label and text columns\n", + "# by default the Universal Sentence Encoder (USE) Sentence embeddings are used for generation\n", + "trainable_pipe = nlp.load('train.sentiment')\n", + "fitted_pipe = trainable_pipe.fit(train_df.iloc[:50])\n", + "\n", + "# predict with the trainable pipeline on dataset and get predictions\n", + "preds = fitted_pipe.predict(train_df.iloc[:50],output_level='document')\n", + "#sentence detector that is part of the pipe generates sone NaNs. lets drop them first\n", + "preds.dropna(inplace=True)\n", + "print(classification_report(preds['y'], preds['sentiment']))\n", + "\n", + "preds" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "lVyOE2wV0fw_" + }, + "source": [ + "# Test the fitted pipe on new example" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 150 + }, + "id": "qdCUg2MR0PD2", + "outputId": "ea8e288d-2016-4777-99f5-9dd729a25e3f" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "sentence_detector_dl download started this may take some time.\n", + "Approximate size to download 354.6 KB\n", + "[OK!]\n", + "Warning::Spark Session already created, some configs may not take.\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", + "
sentencesentence_embedding_small_bert_L2_128sentimentsentiment_confidence
0Indian prime minister was assinated![-0.7613918781280518, 0.7001779079437256, -0.1...positive0.999982
\n", + "
\n", + "
\n", + "\n", + "
\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "
\n", + "\n", + "
\n", + "
\n" + ], + "text/plain": [ + " sentence \\\n", + "0 Indian prime minister was assinated! \n", + "\n", + " sentence_embedding_small_bert_L2_128 sentiment \\\n", + "0 [-0.7613918781280518, 0.7001779079437256, -0.1... positive \n", + "\n", + " sentiment_confidence \n", + "0 0.999982 " + ] + }, + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "fitted_pipe.predict(\"Indian prime minister was assinated!\")" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "xflpwrVjjBVD" + }, + "source": [ + "## Configure pipe training parameters" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "UtsAUGTmOTms", + "outputId": "12c0a69d-9fbc-41de-9de3-f923097e9b54" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "The following parameters are configurable for this NLU pipeline (You can copy paste the examples) :\n", + ">>> component_list['bert_sentence_embeddings@sent_small_bert_L2_128'] has settable params:\n", + "component_list['bert_sentence_embeddings@sent_small_bert_L2_128'].setBatchSize(8) | Info: Size of every batch | Currently set to : 8\n", + "component_list['bert_sentence_embeddings@sent_small_bert_L2_128'].setEngine('tensorflow') | Info: Deep Learning engine used for this model | Currently set to : tensorflow\n", + "component_list['bert_sentence_embeddings@sent_small_bert_L2_128'].setIsLong(False) | Info: Use Long type instead of Int type for inputs buffer - Some Bert models require Long instead of Int. | Currently set to : False\n", + "component_list['bert_sentence_embeddings@sent_small_bert_L2_128'].setMaxSentenceLength(128) | Info: Max sentence length to process | Currently set to : 128\n", + "component_list['bert_sentence_embeddings@sent_small_bert_L2_128'].setDimension(128) | Info: Number of embedding dimensions | Currently set to : 128\n", + "component_list['bert_sentence_embeddings@sent_small_bert_L2_128'].setCaseSensitive(False) | Info: whether to ignore case in tokens for embeddings matching | Currently set to : False\n", + "component_list['bert_sentence_embeddings@sent_small_bert_L2_128'].setStorageRef('sent_small_bert_L2_128') | Info: unique reference name for identification | Currently set to : sent_small_bert_L2_128\n", + ">>> component_list['document_assembler'] has settable params:\n", + "component_list['document_assembler'].setCleanupMode('shrink') | Info: possible values: disabled, inplace, inplace_full, shrink, shrink_full, each, each_full, delete_full | Currently set to : shrink\n", + ">>> component_list['sentiment_dl@sent_small_bert_L2_128'] has settable params:\n", + "component_list['sentiment_dl@sent_small_bert_L2_128'].setEngine('tensorflow') | Info: Deep Learning engine used for this model | Currently set to : tensorflow\n", + "component_list['sentiment_dl@sent_small_bert_L2_128'].setThreshold(0.6) | Info: The minimum threshold for the final result otheriwse it will be neutral | Currently set to : 0.6\n", + "component_list['sentiment_dl@sent_small_bert_L2_128'].setThresholdLabel('neutral') | Info: In case the score is less than threshold, what should be the label. Default is neutral. | Currently set to : neutral\n", + "component_list['sentiment_dl@sent_small_bert_L2_128'].setStorageRef('sent_small_bert_L2_128') | Info: unique reference name for identification | Currently set to : sent_small_bert_L2_128\n" + ] + } + ], + "source": [ + "trainable_pipe.print_info()" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "2GJdDNV9jEIe" + }, + "source": [ + "## Retrain with new parameters" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 1000 + }, + "id": "mptfvHx-MMMX", + "outputId": "0905f3b3-babb-401a-f027-eb2e8475da37" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Warning::Spark Session already created, some configs may not take.\n", + "Warning::Spark Session already created, some configs may not take.\n", + "sent_small_bert_L2_128 download started this may take some time.\n", + "Approximate size to download 16.1 MB\n", + "[OK!]\n", + " precision recall f1-score support\n", + "\n", + " negative 0.00 0.00 0.00 20\n", + " positive 0.60 1.00 0.75 30\n", + "\n", + " accuracy 0.60 50\n", + " macro avg 0.30 0.50 0.37 50\n", + "weighted avg 0.36 0.60 0.45 50\n", + "\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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + "
documentsentence_embedding_small_bert_L2_128sentimentsentiment_confidencetexty
0title edit 56dd brend ambasittur for vidya secret[-0.13924618065357208, 0.03819392994046211, -0...positive2.0title edit 56dd brend ambasittur for vidya sec...negative
1this reminds kunkka old dota loading screen ar...[-0.05514780059456825, -0.02986345998942852, -...positive2.0this reminds kunkka old dota loading screen ar...positive
2meanwhile the other news cms intenttarget[-1.3784979581832886, -0.05633991211652756, 0....positive4.0meanwhile the other news cms intenttargetnegative
3lovely finish there giroud[-1.026403546333313, -0.5962088108062744, -0.5...positive9.0lovely finish there giroudpositive
4glad see kurisu made with surprising results d...[-1.3281804323196411, -0.3425588011741638, 0.2...positive4.0glad see kurisu made with surprising results d...positive
5wee jas lawful neutral god death magic and nec...[-1.090584635734558, -0.39823225140571594, -0....positive4.0wee jas lawful neutral god death magic and nec...positive
6holy fuck this amazing[-2.318075656890869, -0.10535052418708801, -0....positive2.0holy fuck this amazingpositive
7yougaiz yougaiz who interested parineeti chopr...[-0.7263230085372925, -0.9229655861854553, 0.1...positive2.0yougaiz yougaiz who interested parineeti chopr...positive
8not whole lot has changed except the fact that...[-1.1650828123092651, 0.09717072546482086, -0....positive3.0not whole lot has changed except the fact that...positive
9different times different cultures same point ...[-1.5615334510803223, -0.6228992938995361, -0....positive1.0different times different cultures same point ...positive
10too much attention[-1.473575234413147, 0.6288167834281921, -0.68...positive1.0too much attentionpositive
11its nice and all but your monitors make want b...[-0.8991073966026306, 0.8156149983406067, -0.2...positive3.0its nice and all but your monitors make want b...positive
12india turns into toi comments section the mome...[-0.7343364357948303, -0.12650255858898163, 0....positive1.0india turns into toi comments section the mom...positive
13nice build man pretty damn sexy can ask why ti...[-1.21924889087677, 0.21342627704143524, -0.40...positive1.0nice build man pretty damn sexy can ask why ti...positive
14rofl why are you asking permission you and you...[-0.8997104167938232, 0.45302870869636536, -0....positive1.0rofl why are you asking permission you and you...positive
15seriously did you infographic maker even consi...[-0.8621772527694702, 0.4609760046005249, -0.1...positive2.0seriously did you infographic maker even consi...negative
16cliche but you can wrong with cyric mean was m...[-1.3570650815963745, -0.10502084344625473, -0...positive3.0cliche but you can wrong with cyric mean was ...negative
17from whatever heard this the model modi speech...[-0.8209349513053894, 0.2195633053779602, -0.2...positive6.0from whatever heard this the model modi speech...positive
18heard there was direct line narendra modi whic...[-0.4502873718738556, -0.10798719525337219, -0...positive1.0heard there was direct line narendra modi whi...positive
19truth told there not insignificant percentage ...[-0.6922494173049927, 0.08739931136369705, -0....positive1.0truth told there not insignificant percentage ...positive
20many them fear namo being prime minister could...[-1.3202203512191772, -0.021619228646159172, -...positive7.0many them fear namo being prime minister coul...positive
21source will have accommodate hindus from bangl...[-0.6071749329566956, 0.21432138979434967, -0....positive4.0source will have accommodate hindus from bang...negative
22confirmed woman and this india 186 comments le...[-0.7401843070983887, -0.4919162094593048, -0....positive1.0confirmed woman and this india 186 comments l...positive
23prepared for downvotes but after watching seve...[-0.5390527844429016, 1.0651843547821045, -0.5...positive1.0prepared for downvotes but after watching sev...negative
24delhi not sleeping after long day see congress...[-1.3164680004119873, 0.059689976274967194, -0...positive7.0delhi not sleeping after long day see congres...negative
25would like bjp come out support scrapping sec ...[-0.39008525013923645, 0.6130499243736267, -0....positive1.0would like bjp come out support scrapping sec...negative
26update still found debris black boxes evidence...[-0.5251181721687317, 0.5843355059623718, -0.2...positive4.0update still found debris black boxes evidenc...negative
27there one tool bjp can use their manifesto whi...[-0.42395493388175964, 0.3328923285007477, -0....positive3.0there one tool bjp can use their manifesto whi...positive
28wtf why[-1.0021588802337646, 1.2250791788101196, 0.05...positive1.0wtf whynegative
29fantastic strike the[-0.6758270859718323, -0.2134172022342682, -0....positive2.0fantastic strike thepositive
30you mean the ruling coalition government hatch...[-0.5493559837341309, -0.2645500600337982, -0....positive2.0you mean the ruling coalition government hatch...negative
31before used anti rss result anti bjp very skep...[-0.11697939038276672, 0.26724380254745483, 0....positive1.0before used anti rss result anti bjp very ske...positive
32first understand that you are not anyway contr...[-1.1990007162094116, -0.23811395466327667, -0...positive7.0first understand that you are not anyway contr...positive
33personally for shooting muslims and internetof...[-1.314710259437561, -0.07083063572645187, -0....positive5.0personally for shooting muslims and internetof...negative
34nice build one thing caught eye absolute splur...[-0.3646998703479767, -0.6708006262779236, -0....positive4.0nice build one thing caught eye absolute splur...positive
35looks shit now but still proud made[-1.128523588180542, 0.31619158387184143, 0.02...positive4.0looks shit now but still proud madepositive
36what wrong with that another lame ass attempt ...[-1.9695912599563599, 0.27932408452033997, 0.0...positive1.0what wrong with that another lame ass attempt ...negative
37how difficult was get the length and bend the ...[-1.2320657968521118, 0.9790331721305847, -0.5...positive4.0how difficult was get the length and bend the ...positive
38very impressed with gnabry movement and linkin...[-0.3107994794845581, 0.3307916522026062, -0.1...positive5.0very impressed with gnabry movement and linki...positive
39here interesting tidbit what the like off pert...[-0.308876633644104, 0.49783819913864136, -0.2...positive3.0here interesting tidbit what the like off pert...negative
40false dichotomy either you are for for bjp you...[-0.6038466691970825, 0.2866456210613251, -0.3...positive1.0false dichotomy either you are for for bjp you...negative
41angry namo bhaktas the survival the angry namo...[-1.20363450050354, -1.119809627532959, -0.183...positive3.0angry namo bhaktas the survival the angry namo...negative
42this would issue these people were prosecuted ...[-0.853580892086029, 0.8160178661346436, 0.117...positive1.0this would issue these people were prosecuted ...negative
43hate free india would boring love hate relatio...[-0.28927552700042725, -0.9648609757423401, -0...positive9.0hate free india would boring love hate relati...negative
44this getting bit silly now[-1.1343425512313843, -0.030997686088085175, 0...positive1.0this getting bit silly nownegative
45giroud should done better but great ball rosicky[-1.308074951171875, -0.03950951248407364, -0....positive1.0giroud should done better but great ball rosickypositive
46jakiro spotted the middle top maybe[-2.2450177669525146, -0.5104915499687195, -0....positive5.0jakiro spotted the middle top maybepositive
47won vote for aap anymore that for sure though ...[-0.7843935489654541, -0.32822510600090027, 0....positive3.0won vote for aap anymore that for sure though...negative
48regardless the opposition all girouds goals ha...[-1.635783076286316, 0.30238792300224304, -0.7...positive3.0regardless the opposition all girouds goals ha...positive
49directly pleading people who oppose modi just ...[-0.7491450905799866, -0.4327720105648041, 0.0...positive1.0directly pleading people who oppose modi just...positive
\n", + "
\n", + "
\n", + "\n", + "
\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "
\n", + "\n", + "\n", + "
\n", + " \n", + "\n", + "\n", + "\n", + " \n", + "
\n", + "
\n", + "
\n" + ], + "text/plain": [ + " document \\\n", + "0 title edit 56dd brend ambasittur for vidya secret \n", + "1 this reminds kunkka old dota loading screen ar... \n", + "2 meanwhile the other news cms intenttarget \n", + "3 lovely finish there giroud \n", + "4 glad see kurisu made with surprising results d... \n", + "5 wee jas lawful neutral god death magic and nec... \n", + "6 holy fuck this amazing \n", + "7 yougaiz yougaiz who interested parineeti chopr... \n", + "8 not whole lot has changed except the fact that... \n", + "9 different times different cultures same point ... \n", + "10 too much attention \n", + "11 its nice and all but your monitors make want b... \n", + "12 india turns into toi comments section the mome... \n", + "13 nice build man pretty damn sexy can ask why ti... \n", + "14 rofl why are you asking permission you and you... \n", + "15 seriously did you infographic maker even consi... \n", + "16 cliche but you can wrong with cyric mean was m... \n", + "17 from whatever heard this the model modi speech... \n", + "18 heard there was direct line narendra modi whic... \n", + "19 truth told there not insignificant percentage ... \n", + "20 many them fear namo being prime minister could... \n", + "21 source will have accommodate hindus from bangl... \n", + "22 confirmed woman and this india 186 comments le... \n", + "23 prepared for downvotes but after watching seve... \n", + "24 delhi not sleeping after long day see congress... \n", + "25 would like bjp come out support scrapping sec ... \n", + "26 update still found debris black boxes evidence... \n", + "27 there one tool bjp can use their manifesto whi... \n", + "28 wtf why \n", + "29 fantastic strike the \n", + "30 you mean the ruling coalition government hatch... \n", + "31 before used anti rss result anti bjp very skep... \n", + "32 first understand that you are not anyway contr... \n", + "33 personally for shooting muslims and internetof... \n", + "34 nice build one thing caught eye absolute splur... \n", + "35 looks shit now but still proud made \n", + "36 what wrong with that another lame ass attempt ... \n", + "37 how difficult was get the length and bend the ... \n", + "38 very impressed with gnabry movement and linkin... \n", + "39 here interesting tidbit what the like off pert... \n", + "40 false dichotomy either you are for for bjp you... \n", + "41 angry namo bhaktas the survival the angry namo... \n", + "42 this would issue these people were prosecuted ... \n", + "43 hate free india would boring love hate relatio... \n", + "44 this getting bit silly now \n", + "45 giroud should done better but great ball rosicky \n", + "46 jakiro spotted the middle top maybe \n", + "47 won vote for aap anymore that for sure though ... \n", + "48 regardless the opposition all girouds goals ha... \n", + "49 directly pleading people who oppose modi just ... \n", + "\n", + " sentence_embedding_small_bert_L2_128 sentiment \\\n", + "0 [-0.13924618065357208, 0.03819392994046211, -0... positive \n", + "1 [-0.05514780059456825, -0.02986345998942852, -... positive \n", + "2 [-1.3784979581832886, -0.05633991211652756, 0.... positive \n", + "3 [-1.026403546333313, -0.5962088108062744, -0.5... positive \n", + "4 [-1.3281804323196411, -0.3425588011741638, 0.2... positive \n", + "5 [-1.090584635734558, -0.39823225140571594, -0.... positive \n", + "6 [-2.318075656890869, -0.10535052418708801, -0.... positive \n", + "7 [-0.7263230085372925, -0.9229655861854553, 0.1... positive \n", + "8 [-1.1650828123092651, 0.09717072546482086, -0.... positive \n", + "9 [-1.5615334510803223, -0.6228992938995361, -0.... positive \n", + "10 [-1.473575234413147, 0.6288167834281921, -0.68... positive \n", + "11 [-0.8991073966026306, 0.8156149983406067, -0.2... positive \n", + "12 [-0.7343364357948303, -0.12650255858898163, 0.... positive \n", + "13 [-1.21924889087677, 0.21342627704143524, -0.40... positive \n", + "14 [-0.8997104167938232, 0.45302870869636536, -0.... positive \n", + "15 [-0.8621772527694702, 0.4609760046005249, -0.1... positive \n", + "16 [-1.3570650815963745, -0.10502084344625473, -0... positive \n", + "17 [-0.8209349513053894, 0.2195633053779602, -0.2... positive \n", + "18 [-0.4502873718738556, -0.10798719525337219, -0... positive \n", + "19 [-0.6922494173049927, 0.08739931136369705, -0.... positive \n", + "20 [-1.3202203512191772, -0.021619228646159172, -... positive \n", + "21 [-0.6071749329566956, 0.21432138979434967, -0.... positive \n", + "22 [-0.7401843070983887, -0.4919162094593048, -0.... positive \n", + "23 [-0.5390527844429016, 1.0651843547821045, -0.5... positive \n", + "24 [-1.3164680004119873, 0.059689976274967194, -0... positive \n", + "25 [-0.39008525013923645, 0.6130499243736267, -0.... positive \n", + "26 [-0.5251181721687317, 0.5843355059623718, -0.2... positive \n", + "27 [-0.42395493388175964, 0.3328923285007477, -0.... positive \n", + "28 [-1.0021588802337646, 1.2250791788101196, 0.05... positive \n", + "29 [-0.6758270859718323, -0.2134172022342682, -0.... positive \n", + "30 [-0.5493559837341309, -0.2645500600337982, -0.... positive \n", + "31 [-0.11697939038276672, 0.26724380254745483, 0.... positive \n", + "32 [-1.1990007162094116, -0.23811395466327667, -0... positive \n", + "33 [-1.314710259437561, -0.07083063572645187, -0.... positive \n", + "34 [-0.3646998703479767, -0.6708006262779236, -0.... positive \n", + "35 [-1.128523588180542, 0.31619158387184143, 0.02... positive \n", + "36 [-1.9695912599563599, 0.27932408452033997, 0.0... positive \n", + "37 [-1.2320657968521118, 0.9790331721305847, -0.5... positive \n", + "38 [-0.3107994794845581, 0.3307916522026062, -0.1... positive \n", + "39 [-0.308876633644104, 0.49783819913864136, -0.2... positive \n", + "40 [-0.6038466691970825, 0.2866456210613251, -0.3... positive \n", + "41 [-1.20363450050354, -1.119809627532959, -0.183... positive \n", + "42 [-0.853580892086029, 0.8160178661346436, 0.117... positive \n", + "43 [-0.28927552700042725, -0.9648609757423401, -0... positive \n", + "44 [-1.1343425512313843, -0.030997686088085175, 0... positive \n", + "45 [-1.308074951171875, -0.03950951248407364, -0.... positive \n", + "46 [-2.2450177669525146, -0.5104915499687195, -0.... positive \n", + "47 [-0.7843935489654541, -0.32822510600090027, 0.... positive \n", + "48 [-1.635783076286316, 0.30238792300224304, -0.7... positive \n", + "49 [-0.7491450905799866, -0.4327720105648041, 0.0... positive \n", + "\n", + " sentiment_confidence text \\\n", + "0 2.0 title edit 56dd brend ambasittur for vidya sec... \n", + "1 2.0 this reminds kunkka old dota loading screen ar... \n", + "2 4.0 meanwhile the other news cms intenttarget \n", + "3 9.0 lovely finish there giroud \n", + "4 4.0 glad see kurisu made with surprising results d... \n", + "5 4.0 wee jas lawful neutral god death magic and nec... \n", + "6 2.0 holy fuck this amazing \n", + "7 2.0 yougaiz yougaiz who interested parineeti chopr... \n", + "8 3.0 not whole lot has changed except the fact that... \n", + "9 1.0 different times different cultures same point ... \n", + "10 1.0 too much attention \n", + "11 3.0 its nice and all but your monitors make want b... \n", + "12 1.0 india turns into toi comments section the mom... \n", + "13 1.0 nice build man pretty damn sexy can ask why ti... \n", + "14 1.0 rofl why are you asking permission you and you... \n", + "15 2.0 seriously did you infographic maker even consi... \n", + "16 3.0 cliche but you can wrong with cyric mean was ... \n", + "17 6.0 from whatever heard this the model modi speech... \n", + "18 1.0 heard there was direct line narendra modi whi... \n", + "19 1.0 truth told there not insignificant percentage ... \n", + "20 7.0 many them fear namo being prime minister coul... \n", + "21 4.0 source will have accommodate hindus from bang... \n", + "22 1.0 confirmed woman and this india 186 comments l... \n", + "23 1.0 prepared for downvotes but after watching sev... \n", + "24 7.0 delhi not sleeping after long day see congres... \n", + "25 1.0 would like bjp come out support scrapping sec... \n", + "26 4.0 update still found debris black boxes evidenc... \n", + "27 3.0 there one tool bjp can use their manifesto whi... \n", + "28 1.0 wtf why \n", + "29 2.0 fantastic strike the \n", + "30 2.0 you mean the ruling coalition government hatch... \n", + "31 1.0 before used anti rss result anti bjp very ske... \n", + "32 7.0 first understand that you are not anyway contr... \n", + "33 5.0 personally for shooting muslims and internetof... \n", + "34 4.0 nice build one thing caught eye absolute splur... \n", + "35 4.0 looks shit now but still proud made \n", + "36 1.0 what wrong with that another lame ass attempt ... \n", + "37 4.0 how difficult was get the length and bend the ... \n", + "38 5.0 very impressed with gnabry movement and linki... \n", + "39 3.0 here interesting tidbit what the like off pert... \n", + "40 1.0 false dichotomy either you are for for bjp you... \n", + "41 3.0 angry namo bhaktas the survival the angry namo... \n", + "42 1.0 this would issue these people were prosecuted ... \n", + "43 9.0 hate free india would boring love hate relati... \n", + "44 1.0 this getting bit silly now \n", + "45 1.0 giroud should done better but great ball rosicky \n", + "46 5.0 jakiro spotted the middle top maybe \n", + "47 3.0 won vote for aap anymore that for sure though... \n", + "48 3.0 regardless the opposition all girouds goals ha... \n", + "49 1.0 directly pleading people who oppose modi just... \n", + "\n", + " y \n", + "0 negative \n", + "1 positive \n", + "2 negative \n", + "3 positive \n", + "4 positive \n", + "5 positive \n", + "6 positive \n", + "7 positive \n", + "8 positive \n", + "9 positive \n", + "10 positive \n", + "11 positive \n", + "12 positive \n", + "13 positive \n", + "14 positive \n", + "15 negative \n", + "16 negative \n", + "17 positive \n", + "18 positive \n", + "19 positive \n", + "20 positive \n", + "21 negative \n", + "22 positive \n", + "23 negative \n", + "24 negative \n", + "25 negative \n", + "26 negative \n", + "27 positive \n", + "28 negative \n", + "29 positive \n", + "30 negative \n", + "31 positive \n", + "32 positive \n", + "33 negative \n", + "34 positive \n", + "35 positive \n", + "36 negative \n", + "37 positive \n", + "38 positive \n", + "39 negative \n", + "40 negative \n", + "41 negative \n", + "42 negative \n", + "43 negative \n", + "44 negative \n", + "45 positive \n", + "46 positive \n", + "47 negative \n", + "48 positive \n", + "49 positive " + ] + }, + "execution_count": 8, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Train longer!\n", + "trainable_pipe = nlp.load('train.sentiment')\n", + "trainable_pipe['trainable_sentiment_dl'].setMaxEpochs(5)\n", + "fitted_pipe = trainable_pipe.fit(train_df.iloc[:50])\n", + "# predict with the trainable pipeline on dataset and get predictions\n", + "preds = fitted_pipe.predict(train_df.iloc[:50],output_level='document')\n", + "\n", + "#sentence detector that is part of the pipe generates sone NaNs. lets drop them first\n", + "preds.dropna(inplace=True)\n", + "print(classification_report(preds['y'], preds['sentiment']))\n", + "\n", + "preds" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "qFoT-s1MjTSS" + }, + "source": [ + "# Try training with different Embeddings" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "nxWFzQOhjWC8", + "outputId": "29e977d1-d916-4b2c-db7f-3acad2f6bcaa" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "For language NLU provides the following Models : \n", + "nlu.load('am.embed_sentence.xlm_roberta') returns Spark NLP model_anno_obj sent_xlm_roberta_base_finetuned_amharic\n", + "For language NLU provides the following Models : \n", + "nlu.load('de.embed_sentence.bert.base_cased') returns Spark NLP model_anno_obj sent_bert_base_cased\n", + "For language NLU provides the following Models : \n", + "nlu.load('el.embed_sentence.bert.base_uncased') returns Spark NLP model_anno_obj sent_bert_base_uncased\n", + "For language NLU provides the following Models : \n", + "nlu.load('en.embed_sentence') returns Spark NLP model_anno_obj tfhub_use\n", + "nlu.load('en.embed_sentence.albert') returns Spark NLP model_anno_obj albert_base_uncased\n", + "nlu.load('en.embed_sentence.bert') returns Spark NLP model_anno_obj sent_bert_base_uncased\n", + "nlu.load('en.embed_sentence.bert.base_uncased_legal') returns Spark NLP model_anno_obj sent_bert_base_uncased_legal\n", + "nlu.load('en.embed_sentence.bert.finetuned') returns Spark NLP model_anno_obj sbert_setfit_finetuned_financial_text_classification\n", + "nlu.load('en.embed_sentence.bert.pubmed') returns Spark NLP model_anno_obj sent_bert_pubmed\n", + "nlu.load('en.embed_sentence.bert.pubmed_squad2') returns Spark NLP model_anno_obj sent_bert_pubmed_squad2\n", + "nlu.load('en.embed_sentence.bert.wiki_books') returns Spark NLP model_anno_obj sent_bert_wiki_books\n", + "nlu.load('en.embed_sentence.bert.wiki_books_mnli') returns Spark NLP model_anno_obj sent_bert_wiki_books_mnli\n", + "nlu.load('en.embed_sentence.bert.wiki_books_qnli') returns Spark NLP model_anno_obj sent_bert_wiki_books_qnli\n", + "nlu.load('en.embed_sentence.bert.wiki_books_qqp') returns Spark NLP model_anno_obj sent_bert_wiki_books_qqp\n", + "nlu.load('en.embed_sentence.bert.wiki_books_squad2') returns Spark NLP model_anno_obj sent_bert_wiki_books_squad2\n", + "nlu.load('en.embed_sentence.bert.wiki_books_sst2') returns Spark NLP model_anno_obj sent_bert_wiki_books_sst2\n", + "nlu.load('en.embed_sentence.bert_base_cased') returns Spark NLP model_anno_obj sent_bert_base_cased\n", + "nlu.load('en.embed_sentence.bert_base_uncased') returns Spark NLP model_anno_obj sent_bert_base_uncased\n", + "nlu.load('en.embed_sentence.bert_large_cased') returns Spark NLP model_anno_obj sent_bert_large_cased\n", + "nlu.load('en.embed_sentence.bert_large_uncased') returns Spark NLP model_anno_obj sent_bert_large_uncased\n", + "nlu.load('en.embed_sentence.bert_use_cmlm_en_base') returns Spark NLP model_anno_obj sent_bert_use_cmlm_en_base\n", + "nlu.load('en.embed_sentence.bert_use_cmlm_en_large') returns Spark NLP model_anno_obj sent_bert_use_cmlm_en_large\n", + "nlu.load('en.embed_sentence.biobert.clinical_base_cased') returns Spark NLP model_anno_obj sent_biobert_clinical_base_cased\n", + "nlu.load('en.embed_sentence.biobert.discharge_base_cased') returns Spark NLP model_anno_obj sent_biobert_discharge_base_cased\n", + "nlu.load('en.embed_sentence.biobert.pmc_base_cased') returns Spark NLP model_anno_obj sent_biobert_pmc_base_cased\n", + "nlu.load('en.embed_sentence.biobert.pubmed_base_cased') returns Spark NLP model_anno_obj sent_biobert_pubmed_base_cased\n", + "nlu.load('en.embed_sentence.biobert.pubmed_large_cased') returns Spark NLP model_anno_obj sent_biobert_pubmed_large_cased\n", + "nlu.load('en.embed_sentence.biobert.pubmed_pmc_base_cased') returns Spark NLP model_anno_obj sent_biobert_pubmed_pmc_base_cased\n", + "nlu.load('en.embed_sentence.covidbert.large_uncased') returns Spark NLP model_anno_obj sent_covidbert_large_uncased\n", + "nlu.load('en.embed_sentence.distil_roberta.distilled_base') returns Spark NLP model_anno_obj sent_distilroberta_base\n", + "nlu.load('en.embed_sentence.doc2vec') returns Spark NLP model_anno_obj doc2vec_gigaword_300\n", + "nlu.load('en.embed_sentence.doc2vec.gigaword_300') returns Spark NLP model_anno_obj doc2vec_gigaword_300\n", + "nlu.load('en.embed_sentence.doc2vec.gigaword_wiki_300') returns Spark NLP model_anno_obj doc2vec_gigaword_wiki_300\n", + "nlu.load('en.embed_sentence.electra') returns Spark NLP model_anno_obj sent_electra_small_uncased\n", + "nlu.load('en.embed_sentence.electra_base_uncased') returns Spark NLP model_anno_obj sent_electra_base_uncased\n", + "nlu.load('en.embed_sentence.electra_large_uncased') returns Spark NLP model_anno_obj sent_electra_large_uncased\n", + "nlu.load('en.embed_sentence.electra_small_uncased') returns Spark NLP model_anno_obj sent_electra_small_uncased\n", + "nlu.load('en.embed_sentence.roberta.base') returns Spark NLP model_anno_obj sent_roberta_base\n", + "nlu.load('en.embed_sentence.roberta.large') returns Spark NLP model_anno_obj sent_roberta_large\n", + "nlu.load('en.embed_sentence.small_bert_L10_128') returns Spark NLP model_anno_obj sent_small_bert_L10_128\n", + "nlu.load('en.embed_sentence.small_bert_L10_256') returns Spark NLP model_anno_obj sent_small_bert_L10_256\n", + "nlu.load('en.embed_sentence.small_bert_L10_512') returns Spark NLP model_anno_obj sent_small_bert_L10_512\n", + "nlu.load('en.embed_sentence.small_bert_L10_768') returns Spark NLP model_anno_obj sent_small_bert_L10_768\n", + "nlu.load('en.embed_sentence.small_bert_L12_128') returns Spark NLP model_anno_obj sent_small_bert_L12_128\n", + "nlu.load('en.embed_sentence.small_bert_L12_256') returns Spark NLP model_anno_obj sent_small_bert_L12_256\n", + "nlu.load('en.embed_sentence.small_bert_L12_512') returns Spark NLP model_anno_obj sent_small_bert_L12_512\n", + "nlu.load('en.embed_sentence.small_bert_L12_768') returns Spark NLP model_anno_obj sent_small_bert_L12_768\n", + "nlu.load('en.embed_sentence.small_bert_L2_128') returns Spark NLP model_anno_obj sent_small_bert_L2_128\n", + "nlu.load('en.embed_sentence.small_bert_L2_256') returns Spark NLP model_anno_obj sent_small_bert_L2_256\n", + "nlu.load('en.embed_sentence.small_bert_L2_512') returns Spark NLP model_anno_obj sent_small_bert_L2_512\n", + "nlu.load('en.embed_sentence.small_bert_L2_768') returns Spark NLP model_anno_obj sent_small_bert_L2_768\n", + "nlu.load('en.embed_sentence.small_bert_L4_128') returns Spark NLP model_anno_obj sent_small_bert_L4_128\n", + "nlu.load('en.embed_sentence.small_bert_L4_256') returns Spark NLP model_anno_obj sent_small_bert_L4_256\n", + "nlu.load('en.embed_sentence.small_bert_L4_512') returns Spark NLP model_anno_obj sent_small_bert_L4_512\n", + "nlu.load('en.embed_sentence.small_bert_L4_768') returns Spark NLP model_anno_obj sent_small_bert_L4_768\n", + "nlu.load('en.embed_sentence.small_bert_L6_128') returns Spark NLP model_anno_obj sent_small_bert_L6_128\n", + "nlu.load('en.embed_sentence.small_bert_L6_256') returns Spark NLP model_anno_obj sent_small_bert_L6_256\n", + "nlu.load('en.embed_sentence.small_bert_L6_512') returns Spark NLP model_anno_obj sent_small_bert_L6_512\n", + "nlu.load('en.embed_sentence.small_bert_L6_768') returns Spark NLP model_anno_obj sent_small_bert_L6_768\n", + "nlu.load('en.embed_sentence.small_bert_L8_128') returns Spark NLP model_anno_obj sent_small_bert_L8_128\n", + "nlu.load('en.embed_sentence.small_bert_L8_256') returns Spark NLP model_anno_obj sent_small_bert_L8_256\n", + "nlu.load('en.embed_sentence.small_bert_L8_512') returns Spark NLP model_anno_obj sent_small_bert_L8_512\n", + "nlu.load('en.embed_sentence.small_bert_L8_768') returns Spark NLP model_anno_obj sent_small_bert_L8_768\n", + "nlu.load('en.embed_sentence.tfhub_use') returns Spark NLP model_anno_obj tfhub_use\n", + "nlu.load('en.embed_sentence.tfhub_use.lg') returns Spark NLP model_anno_obj tfhub_use_lg\n", + "nlu.load('en.embed_sentence.use') returns Spark NLP model_anno_obj tfhub_use\n", + "nlu.load('en.embed_sentence.use.lg') returns Spark NLP model_anno_obj tfhub_use_lg\n", + "For language NLU provides the following Models : \n", + "nlu.load('es.embed_sentence.bert.base_cased') returns Spark NLP model_anno_obj sent_bert_base_cased\n", + "nlu.load('es.embed_sentence.bert.base_uncased') returns Spark NLP model_anno_obj sent_bert_base_uncased\n", + "For language NLU provides the following Models : \n", + "nlu.load('fi.embed_sentence.bert') returns Spark NLP model_anno_obj bert_base_finnish_uncased\n", + "nlu.load('fi.embed_sentence.bert.cased') returns Spark NLP model_anno_obj bert_base_finnish_cased\n", + "nlu.load('fi.embed_sentence.bert.uncased') returns Spark NLP model_anno_obj bert_base_finnish_uncased\n", + "For language NLU provides the following Models : \n", + "nlu.load('ha.embed_sentence.xlm_roberta') returns Spark NLP model_anno_obj sent_xlm_roberta_base_finetuned_hausa\n", + "For language NLU provides the following Models : \n", + "nlu.load('ig.embed_sentence.xlm_roberta') returns Spark NLP model_anno_obj sent_xlm_roberta_base_finetuned_igbo\n", + "For language NLU provides the following Models : \n", + "nlu.load('lg.embed_sentence.xlm_roberta') returns Spark NLP model_anno_obj sent_xlm_roberta_base_finetuned_luganda\n", + "For language NLU provides the following Models : \n", + "nlu.load('nl.embed_sentence.bert.base_cased') returns Spark NLP model_anno_obj sent_bert_base_cased\n", + "For language NLU provides the following Models : \n", + "nlu.load('pcm.embed_sentence.xlm_roberta') returns Spark NLP model_anno_obj sent_xlm_roberta_base_finetuned_naija\n", + "For language NLU provides the following Models : \n", + "nlu.load('pt.embed_sentence.bert.base_legal') returns Spark NLP model_anno_obj sbert_legal_bertimbau_base_tsdae_sts\n", + "nlu.load('pt.embed_sentence.bert.cased_large_legal') returns Spark NLP model_anno_obj sbert_bert_large_portuguese_cased_legal_mlm_sts_v0.1\n", + "nlu.load('pt.embed_sentence.bert.large_legal') returns Spark NLP model_anno_obj sbert_legal_bertimbau_large_gpl_sts\n", + "nlu.load('pt.embed_sentence.bert.legal.cased_large_mlm_sts_v0.10.by_stjiris') returns Spark NLP model_anno_obj sbert_bert_large_portuguese_cased_legal_mlm_sts_v0.10\n", + "nlu.load('pt.embed_sentence.bert.legal.cased_large_mlm_sts_v0.2.by_stjiris') returns Spark NLP model_anno_obj sbert_bert_large_portuguese_cased_legal_mlm_sts_v0.2\n", + "nlu.load('pt.embed_sentence.bert.legal.cased_large_mlm_sts_v0.3.by_stjiris') returns Spark NLP model_anno_obj sbert_bert_large_portuguese_cased_legal_mlm_sts_v0.3\n", + "nlu.load('pt.embed_sentence.bert.legal.cased_large_mlm_sts_v0.4.by_stjiris') returns Spark NLP model_anno_obj sbert_bert_large_portuguese_cased_legal_mlm_sts_v0.4\n", + "nlu.load('pt.embed_sentence.bert.legal.cased_large_mlm_sts_v0.5.by_stjiris') returns Spark NLP model_anno_obj sbert_bert_large_portuguese_cased_legal_mlm_sts_v0.5\n", + "nlu.load('pt.embed_sentence.bert.legal.cased_large_mlm_sts_v0.7.by_stjiris') returns Spark NLP model_anno_obj sbert_bert_large_portuguese_cased_legal_mlm_sts_v0.7\n", + "nlu.load('pt.embed_sentence.bert.legal.cased_large_mlm_sts_v0.8.by_stjiris') returns Spark NLP model_anno_obj sbert_bert_large_portuguese_cased_legal_mlm_sts_v0.8\n", + "nlu.load('pt.embed_sentence.bert.legal.cased_large_mlm_sts_v0.9.by_stjiris') returns Spark NLP model_anno_obj sbert_bert_large_portuguese_cased_legal_mlm_sts_v0.9\n", + "nlu.load('pt.embed_sentence.bert.legal.cased_large_mlm_sts_v1.0.by_stjiris') returns Spark NLP model_anno_obj sbert_bert_large_portuguese_cased_legal_mlm_sts_v1.0\n", + "nlu.load('pt.embed_sentence.bert.legal.cased_large_mlm_v0.11_gpl_nli_sts_v0.by_stjiris') returns Spark NLP model_anno_obj sbert_bert_large_portuguese_cased_legal_mlm_v0.11_gpl_nli_sts_v0\n", + "nlu.load('pt.embed_sentence.bert.legal.cased_large_mlm_v0.11_gpl_nli_sts_v1.by_stjiris') returns Spark NLP model_anno_obj sbert_bert_large_portuguese_cased_legal_mlm_v0.11_gpl_nli_sts_v1\n", + "nlu.load('pt.embed_sentence.bert.legal.cased_large_mlm_v0.11_nli_sts_v0.by_stjiris') returns Spark NLP model_anno_obj sbert_bert_large_portuguese_cased_legal_mlm_v0.11_nli_sts_v0\n", + "nlu.load('pt.embed_sentence.bert.legal.cased_large_mlm_v0.11_nli_sts_v1.by_stjiris') returns Spark NLP model_anno_obj sbert_bert_large_portuguese_cased_legal_mlm_v0.11_nli_sts_v1\n", + "nlu.load('pt.embed_sentence.bert.legal.cased_large_mlm_v0.11_sts_v0.by_stjiris') returns Spark NLP model_anno_obj sbert_bert_large_portuguese_cased_legal_mlm_v0.11_sts_v0\n", + "nlu.load('pt.embed_sentence.bert.legal.cased_large_mlm_v0.11_sts_v1.by_stjiris') returns Spark NLP model_anno_obj sbert_bert_large_portuguese_cased_legal_mlm_v0.11_sts_v1\n", + "nlu.load('pt.embed_sentence.bert.v2_base_legal') returns Spark NLP model_anno_obj sbert_legal_bertimbau_sts_base_ma_v2\n", + "nlu.load('pt.embed_sentence.bert.v2_large_legal') returns Spark NLP model_anno_obj sbert_legal_bertimbau_large_tsdae_sts_v2\n", + "nlu.load('pt.embed_sentence.bertimbau.legal.assin.base.by_rufimelo') returns Spark NLP model_anno_obj sbert_legal_bertimbau_sts_base_ma\n", + "nlu.load('pt.embed_sentence.bertimbau.legal.assin2.base.by_rufimelo') returns Spark NLP model_anno_obj sbert_legal_bertimbau_sts_base\n", + "nlu.load('pt.embed_sentence.bertimbau.legal.large_sts_by_rufimelo') returns Spark NLP model_anno_obj sbert_legal_bertimbau_sts_large\n", + "nlu.load('pt.embed_sentence.bertimbau.legal.large_sts_ma.by_rufimelo') returns Spark NLP model_anno_obj sbert_legal_bertimbau_sts_large_ma\n", + "nlu.load('pt.embed_sentence.bertimbau.legal.large_sts_ma_v3.by_rufimelo') returns Spark NLP model_anno_obj sbert_legal_bertimbau_sts_large_ma_v3\n", + "nlu.load('pt.embed_sentence.bertimbau.legal.large_tsdae_sts.by_rufimelo') returns Spark NLP model_anno_obj sbert_legal_bertimbau_large_tsdae_sts\n", + "nlu.load('pt.embed_sentence.bertimbau.legal.large_tsdae_sts_v4.by_rufimelo') returns Spark NLP model_anno_obj sbert_legal_bertimbau_large_tsdae_sts_v4\n", + "nlu.load('pt.embed_sentence.bertimbau.legal.large_tsdae_v4_gpl_sts.by_rufimelo') returns Spark NLP model_anno_obj sbert_legal_bertimbau_large_tsdae_v4_gpl_sts\n", + "nlu.load('pt.embed_sentence.bertimbau.legal.v2_large_sts_v2.by_rufimelo') returns Spark NLP model_anno_obj sbert_legal_bertimbau_sts_large_v2\n", + "nlu.load('pt.embed_sentence.bertimbau.legal.v2_large_v2_sts.by_rufimelo') returns Spark NLP model_anno_obj sbert_legal_bertimbau_large_v2_sts\n", + "For language NLU provides the following Models : \n", + "nlu.load('rw.embed_sentence.xlm_roberta') returns Spark NLP model_anno_obj sent_xlm_roberta_base_finetuned_kinyarwanda\n", + "For language NLU provides the following Models : \n", + "nlu.load('sv.embed_sentence.bert.base_cased') returns Spark NLP model_anno_obj sent_bert_base_cased\n", + "For language NLU provides the following Models : \n", + "nlu.load('sw.embed_sentence.xlm_roberta') returns Spark NLP model_anno_obj sent_xlm_roberta_base_finetuned_swahili\n", + "For language NLU provides the following Models : \n", + "nlu.load('wo.embed_sentence.xlm_roberta') returns Spark NLP model_anno_obj sent_xlm_roberta_base_finetuned_wolof\n", + "For language NLU provides the following Models : \n", + "nlu.load('xx.embed_sentence') returns Spark NLP model_anno_obj sent_bert_multi_cased\n", + "nlu.load('xx.embed_sentence.bert') returns Spark NLP model_anno_obj sent_bert_multi_cased\n", + "nlu.load('xx.embed_sentence.bert.cased') returns Spark NLP model_anno_obj sent_bert_multi_cased\n", + "nlu.load('xx.embed_sentence.bert.muril') returns Spark NLP model_anno_obj sent_bert_muril\n", + "nlu.load('xx.embed_sentence.bert_use_cmlm_multi_base') returns Spark NLP model_anno_obj sent_bert_use_cmlm_multi_base\n", + "nlu.load('xx.embed_sentence.bert_use_cmlm_multi_base_br') returns Spark NLP model_anno_obj sent_bert_use_cmlm_multi_base_br\n", + "nlu.load('xx.embed_sentence.labse') returns Spark NLP model_anno_obj labse\n", + "nlu.load('xx.embed_sentence.xlm_roberta.base') returns Spark NLP model_anno_obj sent_xlm_roberta_base\n", + "For language NLU provides the following Models : \n", + "nlu.load('yo.embed_sentence.xlm_roberta') returns Spark NLP model_anno_obj sent_xlm_roberta_base_finetuned_yoruba\n", + "For language NLU provides the following Models : \n", + "nlu.load('zh.embed_sentence.bert') returns Spark NLP model_anno_obj sbert_chinese_qmc_finance_v1\n", + "nlu.load('zh.embed_sentence.bert.distilled') returns Spark NLP model_anno_obj sbert_chinese_qmc_finance_v1_distill\n" + ] + } + ], + "source": [ + "# We can use nlu.print_components(action='embed_sentence') to see every possibler sentence embedding we could use. Lets use bert!\n", + "nlp.nlu.print_components(action='embed_sentence')" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "IKK_Ii_gjJfF", + "outputId": "c1ba963c-f065-4eed-88a8-35316200b992" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Warning::Spark Session already created, some configs may not take.\n", + "Warning::Spark Session already created, some configs may not take.\n", + "sent_small_bert_L12_768 download started this may take some time.\n", + "Approximate size to download 392.9 MB\n", + "[OK!]\n", + " precision recall f1-score support\n", + "\n", + " negative 0.87 0.78 0.82 300\n", + " neutral 0.00 0.00 0.00 0\n", + " positive 0.91 0.68 0.77 300\n", + "\n", + " accuracy 0.73 600\n", + " macro avg 0.59 0.49 0.53 600\n", + "weighted avg 0.89 0.73 0.80 600\n", + "\n" + ] + } + ], + "source": [ + "trainable_pipe = nlp.load('en.embed_sentence.small_bert_L12_768 train.sentiment')\n", + "# We need to train longer and user smaller LR for NON-USE based sentence embeddings usually\n", + "# We could tune the hyperparameters further with hyperparameter tuning methods like gridsearch\n", + "# Also longer training gives more accuracy\n", + "trainable_pipe['trainable_sentiment_dl'].setMaxEpochs(70)\n", + "trainable_pipe['trainable_sentiment_dl'].setLr(0.0005)\n", + "fitted_pipe = trainable_pipe.fit(train_df)\n", + "# predict with the trainable pipeline on dataset and get predictions\n", + "preds = fitted_pipe.predict(train_df,output_level='document')\n", + "\n", + "#sentence detector that is part of the pipe generates some NaNs. lets drop them first\n", + "preds.dropna(inplace=True)\n", + "print(classification_report(preds['y'], preds['sentiment']))\n", + "\n", + "#preds" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "2BB-NwZUoHSe" + }, + "source": [ + "# 5. Lets save the model" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": { + "id": "eLex095goHwm" + }, + "outputs": [], + "source": [ + "stored_model_path = './models/classifier_dl_trained'\n", + "fitted_pipe.save(stored_model_path)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "e_b2DPd4rCiU" + }, + "source": [ + "# 6. Lets load the model from HDD.\n", + "This makes Offlien NLU usage possible! \n", + "You need to call nlu.load(path=path_to_the_pipe) to load a model/pipeline from disk." + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 133 + }, + "id": "SO4uz45MoRgp", + "outputId": "ac7bafb1-cd05-4082-86f8-403384f6edfa" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Warning::Spark Session already created, some configs may not take.\n", + "Warning::Spark Session already created, some configs may not take.\n", + "Warning::Spark Session already created, some configs may not take.\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", + "
documentsentence_embedding_from_disksentimentsentiment_confidence
0Indian prime minister was assinated[-0.09739536792039871, 0.23939242959022522, 0....negative0.0
\n", + "
\n", + "
\n", + "\n", + "
\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "
\n", + "\n", + "
\n", + "
\n" + ], + "text/plain": [ + " document \\\n", + "0 Indian prime minister was assinated \n", + "\n", + " sentence_embedding_from_disk sentiment \\\n", + "0 [-0.09739536792039871, 0.23939242959022522, 0.... negative \n", + "\n", + " sentiment_confidence \n", + "0 0.0 " + ] + }, + "execution_count": 13, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "hdd_pipe = nlp.load(path=stored_model_path)\n", + "\n", + "preds = hdd_pipe.predict('Indian prime minister was assinated')\n", + "preds" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "e0CVlkk9v6Qi", + "outputId": "b82bb85a-9063-49ca-8be2-51f4f735b1ea" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "The following parameters are configurable for this NLU pipeline (You can copy paste the examples) :\n", + ">>> component_list['document_assembler'] has settable params:\n", + "component_list['document_assembler'].setCleanupMode('shrink') | Info: possible values: disabled, inplace, inplace_full, shrink, shrink_full, each, each_full, delete_full | Currently set to : shrink\n", + ">>> component_list['bert_sentence_embeddings@sent_small_bert_L12_768'] has settable params:\n", + "component_list['bert_sentence_embeddings@sent_small_bert_L12_768'].setBatchSize(8) | Info: Size of every batch | Currently set to : 8\n", + "component_list['bert_sentence_embeddings@sent_small_bert_L12_768'].setCaseSensitive(False) | Info: whether to ignore case in tokens for embeddings matching | Currently set to : False\n", + "component_list['bert_sentence_embeddings@sent_small_bert_L12_768'].setDimension(768) | Info: Number of embedding dimensions | Currently set to : 768\n", + "component_list['bert_sentence_embeddings@sent_small_bert_L12_768'].setMaxSentenceLength(128) | Info: Max sentence length to process | Currently set to : 128\n", + "component_list['bert_sentence_embeddings@sent_small_bert_L12_768'].setEngine('tensorflow') | Info: Deep Learning engine used for this model | Currently set to : tensorflow\n", + "component_list['bert_sentence_embeddings@sent_small_bert_L12_768'].setIsLong(False) | Info: Use Long type instead of Int type for inputs buffer - Some Bert models require Long instead of Int. | Currently set to : False\n", + "component_list['bert_sentence_embeddings@sent_small_bert_L12_768'].setStorageRef('sent_small_bert_L12_768') | Info: unique reference name for identification | Currently set to : sent_small_bert_L12_768\n", + ">>> component_list['sentiment_dl@sent_small_bert_L12_768'] has settable params:\n", + "component_list['sentiment_dl@sent_small_bert_L12_768'].setThreshold(0.6) | Info: The minimum threshold for the final result otheriwse it will be neutral | Currently set to : 0.6\n", + "component_list['sentiment_dl@sent_small_bert_L12_768'].setThresholdLabel('neutral') | Info: In case the score is less than threshold, what should be the label. Default is neutral. | Currently set to : neutral\n", + "component_list['sentiment_dl@sent_small_bert_L12_768'].setEngine('tensorflow') | Info: Deep Learning engine used for this model | Currently set to : tensorflow\n", + "component_list['sentiment_dl@sent_small_bert_L12_768'].setClasses(['positive', 'negative']) | Info: get the tags used to trained this SentimentDLModel | Currently set to : ['positive', 'negative']\n", + "component_list['sentiment_dl@sent_small_bert_L12_768'].setStorageRef('sent_small_bert_L12_768') | Info: unique reference name for identification | Currently set to : sent_small_bert_L12_768\n" + ] + } + ], + "source": [ + "hdd_pipe.print_info()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "2LJTK79JKF9-" + }, + "outputs": [], + "source": [] + } + ], + "metadata": { + "colab": { + "provenance": [] + }, + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "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.11.4" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/examples/colab/Training/binary_text_classification/NLU_training_sentiment_classifier_demo_stock_market.ipynb b/examples/colab/Training/binary_text_classification/NLU_training_sentiment_classifier_demo_stock_market.ipynb index 95dd396d..de01a31d 100644 --- a/examples/colab/Training/binary_text_classification/NLU_training_sentiment_classifier_demo_stock_market.ipynb +++ b/examples/colab/Training/binary_text_classification/NLU_training_sentiment_classifier_demo_stock_market.ipynb @@ -1 +1,3260 @@ -{"nbformat":4,"nbformat_minor":0,"metadata":{"colab":{"name":"NLU_training_sentiment_classifier_demo_stock_market.ipynb","provenance":[],"collapsed_sections":[]},"kernelspec":{"display_name":"Python 3","name":"python3"}},"cells":[{"cell_type":"markdown","metadata":{"id":"zkufh760uvF3"},"source":["![JohnSnowLabs](https://nlp.johnsnowlabs.com/assets/images/logo.png)\n","\n","[![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/JohnSnowLabs/nlu/blob/master/examples/colab/Training/binary_text_classification/NLU_training_sentiment_classifier_demo_stock_market.ipynb)\n","\n","\n","# Training a Sentiment Analysis Classifier with NLU \n","## 2 Class Demo Stock Market Sentiment Training\n","With the [SentimentDL model](https://nlp.johnsnowlabs.com/docs/en/annotators#sentimentdl-multi-class-sentiment-analysis-annotator) from Spark NLP you can achieve State Of the Art results on any multi class text classification problem \n","\n","This notebook showcases the following features : \n","\n","- How to train the deep learning classifier\n","- How to store a pipeline to disk\n","- How to load the pipeline from disk (Enables NLU offline mode)\n","\n","\n","You can achieve these results or even better on this dataset with training data:\n","\n","\n","
\n","\n","\n","![image.png](data:image/png;base64,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)\n","\n","\n","\n","\n","You can achieve these results or even better on this dataset with test data:\n","\n","\n","
\n","\n","![img.png](data:image/png;base64,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)\n"]},{"cell_type":"markdown","metadata":{"id":"dur2drhW5Rvi"},"source":["# 1. Install Java 8 and NLU"]},{"cell_type":"code","metadata":{"id":"hFGnBCHavltY","colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"status":"ok","timestamp":1620214514012,"user_tz":-120,"elapsed":124849,"user":{"displayName":"Christian Kasim Loan","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GjqAD-ircKP-s5Eh6JSdkDggDczfqQbJGU_IRb4Hw=s64","userId":"14469489166467359317"}},"outputId":"ef6ce0ba-22d9-46dc-f409-ed1c02167849"},"source":["!wget https://setup.johnsnowlabs.com/nlu/colab.sh -O - | bash\n","import nlu"],"execution_count":null,"outputs":[{"output_type":"stream","text":["--2021-05-05 11:33:09-- https://raw.githubusercontent.com/JohnSnowLabs/nlu/master/scripts/colab_setup.sh\n","Resolving raw.githubusercontent.com (raw.githubusercontent.com)... 185.199.108.133, 185.199.109.133, 185.199.110.133, ...\n","Connecting to raw.githubusercontent.com (raw.githubusercontent.com)|185.199.108.133|:443... connected.\n","HTTP request sent, awaiting response... 200 OK\n","Length: 1671 (1.6K) [text/plain]\n","Saving to: ‘STDOUT’\n","\n","Installing NLU 3.0.0 with PySpark 3.0.2 and Spark NLP 3.0.1 for Google Colab ...\n","- 100%[===================>] 1.63K --.-KB/s in 0s \n","\n","2021-05-05 11:33:09 (53.5 MB/s) - written to stdout [1671/1671]\n","\n","\u001b[K |████████████████████████████████| 204.8MB 70kB/s \n","\u001b[K |████████████████████████████████| 153kB 48.1MB/s \n","\u001b[K |████████████████████████████████| 204kB 22.4MB/s \n","\u001b[K |████████████████████████████████| 204kB 49.2MB/s \n","\u001b[?25h Building wheel for pyspark (setup.py) ... \u001b[?25l\u001b[?25hdone\n"],"name":"stdout"}]},{"cell_type":"markdown","metadata":{"id":"f4KkTfnR5Ugg"},"source":["# 2. Download Stock Market Sentiment dataset \n","https://www.kaggle.com/yash612/stockmarket-sentiment-dataset\n","#Context\n","\n","Gathered Stock news from Multiple twitter Handles regarding Economic news dividing into two parts : Negative and positive."]},{"cell_type":"code","metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"OrVb5ZMvvrQD","executionInfo":{"status":"ok","timestamp":1620214515441,"user_tz":-120,"elapsed":126265,"user":{"displayName":"Christian Kasim Loan","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GjqAD-ircKP-s5Eh6JSdkDggDczfqQbJGU_IRb4Hw=s64","userId":"14469489166467359317"}},"outputId":"2bfba990-0ff7-4660-8ba5-8821eb540304"},"source":["! wget http://ckl-it.de/wp-content/uploads/2021/02/stock_data.csv\n"],"execution_count":null,"outputs":[{"output_type":"stream","text":["--2021-05-05 11:35:13-- http://ckl-it.de/wp-content/uploads/2021/02/stock_data.csv\n","Resolving ckl-it.de (ckl-it.de)... 217.160.0.108, 2001:8d8:100f:f000::209\n","Connecting to ckl-it.de (ckl-it.de)|217.160.0.108|:80... connected.\n","HTTP request sent, awaiting response... 200 OK\n","Length: 758217 (740K) [text/csv]\n","Saving to: ‘stock_data.csv’\n","\n","stock_data.csv 100%[===================>] 740.45K 819KB/s in 0.9s \n","\n","2021-05-05 11:35:15 (819 KB/s) - ‘stock_data.csv’ saved [758217/758217]\n","\n"],"name":"stdout"}]},{"cell_type":"code","metadata":{"colab":{"base_uri":"https://localhost:8080/","height":391},"id":"y4xSRWIhwT28","executionInfo":{"status":"ok","timestamp":1620214516379,"user_tz":-120,"elapsed":127196,"user":{"displayName":"Christian Kasim Loan","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GjqAD-ircKP-s5Eh6JSdkDggDczfqQbJGU_IRb4Hw=s64","userId":"14469489166467359317"}},"outputId":"9495fbc4-9641-44c5-bfbc-85b564fb7b12"},"source":["import pandas as pd\n","train_path = '/content/stock_data.csv'\n","\n","train_df = pd.read_csv(train_path)\n","# the text data to use for classification should be in a column named 'text'\n","columns=['text','y']\n","train_df = train_df[columns]\n","from sklearn.model_selection import train_test_split\n","\n","train_df, test_df = train_test_split(train_df, test_size=0.2)\n","train_df"],"execution_count":null,"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"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n","
texty
3761P see what happened from October to Dec that s...negative
1428AAP Closed my short for positiveK Will short a...negative
3091AAP It may be wise to hold off on buying #AAP ...negative
620RT @DaveCBenoit: The banking system is not bui...negative
1611Sensex Slumps Over positive,000 Points From Da...negative
.........
1281The rodeo clown sent BK screaming into the S...negative
1895WMT breaking out of channel + All MAs are lini...positive
3458keep an eye on IDA presentation bout postive d...positive
3399DNDN Good place to lock in (some) profit at 7...positive
2303VVS breaking out of a flag setup. MACD cross-u...positive
\n","

3200 rows × 2 columns

\n","
"],"text/plain":[" text y\n","3761 P see what happened from October to Dec that s... negative\n","1428 AAP Closed my short for positiveK Will short a... negative\n","3091 AAP It may be wise to hold off on buying #AAP ... negative\n","620 RT @DaveCBenoit: The banking system is not bui... negative\n","1611 Sensex Slumps Over positive,000 Points From Da... negative\n","... ... ...\n","1281 The rodeo clown sent BK screaming into the S... negative\n","1895 WMT breaking out of channel + All MAs are lini... positive\n","3458 keep an eye on IDA presentation bout postive d... positive\n","3399 DNDN Good place to lock in (some) profit at 7... positive\n","2303 VVS breaking out of a flag setup. MACD cross-u... positive\n","\n","[3200 rows x 2 columns]"]},"metadata":{"tags":[]},"execution_count":3}]},{"cell_type":"markdown","metadata":{"id":"0296Om2C5anY"},"source":["# 3. Train Deep Learning Classifier using nlu.load('train.sentiment')\n","\n","You dataset label column should be named 'y' and the feature column with text data should be named 'text'"]},{"cell_type":"code","metadata":{"colab":{"base_uri":"https://localhost:8080/","height":1000},"id":"3ZIPkRkWftBG","executionInfo":{"status":"ok","timestamp":1620215080750,"user_tz":-120,"elapsed":569,"user":{"displayName":"Christian Kasim Loan","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GjqAD-ircKP-s5Eh6JSdkDggDczfqQbJGU_IRb4Hw=s64","userId":"14469489166467359317"}},"outputId":"2c6c1232-26f2-4727-e184-f343eb0d699f"},"source":["import nlu \n","from sklearn.metrics import classification_report\n","\n","# load a trainable pipeline by specifying the train. prefix and fit it on a datset with label and text columns\n","# by default the Universal Sentence Encoder (USE) Sentence embeddings are used for generation\n","trainable_pipe = nlu.load('train.sentiment')\n","fitted_pipe = trainable_pipe.fit(train_df.iloc[:50])\n","\n","# predict with the trainable pipeline on dataset and get predictions\n","preds = fitted_pipe.predict(train_df.iloc[:50],output_level='document')\n","#sentence detector that is part of the pipe generates sone NaNs. lets drop them first\n","preds.dropna(inplace=True)\n","print(classification_report(preds['y'], preds['sentiment']))\n","\n","preds"],"execution_count":null,"outputs":[{"output_type":"stream","text":[" precision recall f1-score support\n","\n"," negative 0.00 0.00 0.00 22\n"," neutral 0.00 0.00 0.00 0\n"," positive 1.00 0.11 0.19 28\n","\n"," accuracy 0.06 50\n"," macro avg 0.33 0.04 0.06 50\n","weighted avg 0.56 0.06 0.11 50\n","\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"," \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"," \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"," \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"," \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"," \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"," \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"," \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"," \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"," \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"," \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"," \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","
ysentence_embedding_usetrained_sentiment_confidenceorigin_indextrained_sentimentdocumenttextsentence
0negative[-0.03631044551730156, -0.02809535153210163, -...0.5324203761neutralP see what happened from October to Dec that s...P see what happened from October to Dec that s...[P see what happened from October to Dec that ...
1negative[-0.019356619566679, 0.02282714657485485, 0.00...0.5286911428neutralAAP Closed my short for positiveK Will short a...AAP Closed my short for positiveK Will short a...[AAP Closed my short for positiveK Will short ...
2negative[0.03622237220406532, -0.06491724401712418, 0....0.5183083091neutralAAP It may be wise to hold off on buying #AAP ...AAP It may be wise to hold off on buying #AAP ...[AAP It may be wise to hold off on buying #AAP...
3negative[0.038874898105859756, 0.025729672983288765, -...0.538483620neutralRT @DaveCBenoit: The banking system is not bui...RT @DaveCBenoit: The banking system is not bui...[RT @DaveCBenoit:, The banking system is not ...
4negative[0.04230193793773651, -0.02588844671845436, -0...0.5263581611neutralSensex Slumps Over positive,000 Points From Da...Sensex Slumps Over positive,000 Points From Da...[Sensex Slumps Over positive,000 Points From D...
5negative[-0.000432533270213753, -0.009179827757179737,...0.530686876neutralSelling your home to a computer was supposed t...Selling your home to a computer was supposed t...[Selling your home to a computer was supposed ...
6positive[0.06600425392389297, -0.022004421800374985, -...0.5810161678neutraled Daily Triangle on HEO,..... pdating ong and...ed Daily Triangle on HEO,..... pdating ong an...[ed Daily Triangle on HEO,., .... pdating ong ...
7positive[-0.017160149291157722, -0.03617899864912033, ...0.549800482neutralP breaking out after expanding from Shark Patt...P breaking out after expanding from Shark Patt...[P breaking out after expanding from Shark Pat...
8positive[0.026538891717791557, -0.06604061275720596, -...0.5685792540neutralActing well above 26.positive9 flat base trigg...Acting well above 26.positive9 flat base trigg...[Acting well above 26.positive9 flat base trig...
9positive[0.08514805138111115, -0.024943925440311432, -...0.5240132183neutralCYBX broke out to all time highs accompained b...CYBX broke out to all time highs accompained b...[CYBX broke out to all time highs accompained ...
10positive[0.05149979144334793, -0.061731286346912384, -...0.5183143998neutralsolid day with MGM AAP SBX leading the way for...solid day with MGM AAP SBX leading the way for...[solid day with MGM AAP SBX leading the way fo...
11negative[0.03843201324343681, -0.0733688548207283, -0....0.51609119neutralAAP 465 is resistance and heading to 435 in th...AAP 465 is resistance and heading to 435 in th...[AAP 465 is resistance and heading to 435 in t...
12negative[0.02629232406616211, -0.014554189518094063, -...0.522850219neutralCO pointed out this wknd - huge Outside Day - ...CO pointed out this wknd - huge Outside Day - ...[CO pointed out this wknd - huge Outside Day -...
13positive[0.05966312810778618, -0.08997906744480133, -0...0.6118911041positiveVVS ong set up:VVS ong set up:[VVS ong set up:]
14positive[-0.003521521808579564, -0.011022194288671017,...0.5450922763neutralDDD come on 40! I got some calls at 0.positive...DDD come on 40! I got some calls at 0.positive...[DDD come on 40!, I got some calls at 0.posit...
15positive[0.07560215145349503, -0.009755599312484264, -...0.5360571683neutralWMB might fill this gap and reverse.WMB might fill this gap and reverse.[WMB might fill this gap and reverse.]
16negative[-0.0117484824731946, -0.007429660763591528, -...0.5360932565neutralHeard on the Street: Funeral providers would s...Heard on the Street: Funeral providers would s...[Heard on the Street: Funeral providers would ...
17positive[-0.03314466401934624, -0.04437091201543808, -...0.6207772065positiveuser welcome to the TK clubuser welcome to the TK club[user welcome to the TK club]
18positive[-0.018701869994401932, 0.03903575986623764, -...0.5894172308neutraled Weekly Triangle on DVAX,....Scaling Ped Weekly Triangle on DVAX,....Scaling P[ed Weekly Triangle on DVAX,., ., .., Scaling P]
19positive[-0.011695394292473793, 0.05609796568751335, -...0.5150303355neutralAAP What does Al Gore know that we don't?AAP What does Al Gore know that we don't?[AAP What does Al Gore know that we don't?]
20positive[0.04774581268429756, -0.03589113429188728, -0...0.5819802594neutraluser CSN, yesterday I bough at 25Kpositive.237...user CSN, yesterday I bough at 25Kpositive.237...[user CSN, yesterday I bough at 25Kpositive., ...
21positive[0.04126836359500885, -0.0008074558572843671, ...0.5546333099neutralFAO is deciding its direction #waitforitFAO is deciding its direction #waitforit[FAO is deciding its direction #waitforit]
22negative[0.017080938443541527, 0.021576160565018654, 0...0.5193002091neutralEN Take your profits and run. Nice run up,but ...EN Take your profits and run. Nice run up,but ...[EN Take your profits and run., Nice run up,bu...
23negative[0.04716206341981888, -0.021414492279291153, -...0.5340851819neutralGOOG reminds me so much of AAP in Sept bouncin...GOOG reminds me so much of AAP in Sept bounci...[GOOG reminds me so much of AAP in Sept bounci...
24positive[0.023834621533751488, -0.07077112793922424, -...0.5004513913neutralAAP doji being put in on 60 min after 7 down c...AAP doji being put in on 60 min after 7 down c...[AAP doji being put in on 60 min after 7 down ...
25negative[0.1026904433965683, 0.013861684128642082, -0....0.5103883117neutralJames Dinsmore attributes Bancroft Fundâ€â„...James Dinsmore attributes Bancroft Fundâ€â„...[James Dinsmore attributes Bancroft Fundâ€â...
26positive[0.006304154172539711, -0.0644269809126854, -0...0.518708695neutralSEV nicely green on red marketSEV nicely green on red market[SEV nicely green on red market]
27negative[0.06555721163749695, 0.023601243272423744, -0...0.5154422916neutralVS option trader closes out Feb 50C selling po...VS option trader closes out Feb 50C selling po...[VS option trader closes out Feb 50C selling p...
28positive[-0.0012494433904066682, -0.017743036150932312...0.596320692neutralAON Continuation on good volumeAON Continuation on good volume[AON Continuation on good volume]
29positive[0.04852033779025078, 0.00623974809423089, -0....0.513316475neutralWatch for SGY to break its downward trend line...Watch for SGY to break its downward trend line...[Watch for SGY to break its downward trend lin...
30positive[0.05204714462161064, 0.03000013716518879, -0....0.5568723159neutralSXC - breaking above key downward channel leve...SXC - breaking above key downward channel leve...[SXC - breaking above key downward channel lev...
31negative[0.053190235048532486, -0.023420613259077072, ...0.5245742102neutralGovernment May Slash Borrowing From Market In ...Government May Slash Borrowing From Market In ...[Government May Slash Borrowing From Market In...
32negative[0.013695711269974709, 0.031249094754457474, -...0.5019411689neutralCS - To those that doubted me; today is you're...CS - To those that doubted me; today is you're...[CS - To those that doubted me; today is you'r...
33positive[0.03522776812314987, -0.00036802110844291747,...0.5074912455neutralPAB has resistance from June to Sept but Over ...PAB has resistance from June to Sept but Over ...[PAB has resistance from June to Sept but Over...
34negative[-0.05846807360649109, -0.027525130659341812, ...0.5235262337neutralBAC anyone think this might slush and fall bel...BAC anyone think this might slush and fall bel...[BAC anyone think this might slush and fall be...
35positive[0.05771354213356972, -0.03869543969631195, -0...0.5037133529neutralwith little whips on pops and drops don't go a...with little whips on pops and drops don't go a...[with little whips on pops and drops don't go ...
36negative[-0.049992404878139496, -0.017947403714060783,...0.5362742076neutralGreen Weekly Triangle on CYTX,....pdatingGreen Weekly Triangle on CYTX,....pdating[Green Weekly Triangle on CYTX,., ...pdating]
37positive[0.006133062299340963, -0.05417517572641373, -...0.5463193012neutralreports next Wed. user: ATW: Barclays starts a...reports next Wed. user: ATW: Barclays starts ...[reports next Wed. user: ATW:, Barclays start...
38negative[0.041309256106615067, 0.02620919793844223, -0...0.5188533805neutralNKD target positive50 - positive2 points to be...NKD target positive50 - positive2 points to be...[NKD target positive50 - positive2 points to b...
39positive[0.0385039821267128, -0.040522705763578415, -0...0.5228533789neutralPositive GOOG earnings pushed NQ_F higher and ...Positive GOOG earnings pushed NQ_F higher and ...[Positive GOOG earnings pushed NQ_F higher and...
40positive[0.05128449201583862, -0.04454624652862549, -0...0.5520433625neutralSSQ pulling back as suspected. uckily sold nea...SSQ pulling back as suspected. uckily sold nea...[SSQ pulling back as suspected., uckily sold n...
41negative[0.018300753086805344, -0.04134758561849594, -...0.519100851neutralNKE potential short for many reasons. Check F ...NKE potential short for many reasons. Check F ...[NKE potential short for many reasons., Check ...
42negative[0.09244795143604279, 0.015826726332306862, -0...0.534414608neutralSupply-chain finance has become popular in rec...Supply-chain finance has become popular in rec...[Supply-chain finance has become popular in re...
43positive[0.042959753423929214, 0.004588234703987837, -...0.536310546neutralAEG Over 28.23AEG Over 28.23[AEG Over 28.23]
44negative[0.004285166040062904, -0.07630395889282227, -...0.5061021225neutralAAP Free-falling Now to 457AAP Free-falling Now to 457[AAP Free-falling Now to 457]
45positive[0.017030321061611176, -0.022644072771072388, ...0.5005681227neutralBAC positivepositive.75 to positivepositive.80...BAC positivepositive.75 to positivepositive.80...[BAC positivepositive., 75 to positivepositive...
46positive[0.030308598652482033, 0.02380680851638317, -0...0.5136423991neutralNVDA not working so far still holding though.NVDA not working so far still holding though.[NVDA not working so far still holding though.]
47negative[0.05175251513719559, 0.05424535647034645, -0....0.5129991467neutralCAT Once she loses 86.50 ookout Below!!! Strai...CAT Once she loses 86.50 ookout Below!!! Strai...[CAT Once she loses 86.50 ookout Below!, !!, S...
48positive[-0.022420072928071022, -0.06559137254953384, ...0.6001781000positiveMy setup alerts went bonkers today..One of man...My setup alerts went bonkers today..One of man...[My setup alerts went bonkers today., ., One o...
49positive[0.03310457989573479, -0.038539715111255646, -...0.554509282neutralSWHC Obama/Biden to speak tomorrow on gun cont...SWHC Obama/Biden to speak tomorrow on gun cont...[SWHC Obama/Biden to speak tomorrow on gun con...
\n","
"],"text/plain":[" y ... sentence\n","0 negative ... [P see what happened from October to Dec that ...\n","1 negative ... [AAP Closed my short for positiveK Will short ...\n","2 negative ... [AAP It may be wise to hold off on buying #AAP...\n","3 negative ... [RT @DaveCBenoit:, The banking system is not ...\n","4 negative ... [Sensex Slumps Over positive,000 Points From D...\n","5 negative ... [Selling your home to a computer was supposed ...\n","6 positive ... [ed Daily Triangle on HEO,., .... pdating ong ...\n","7 positive ... [P breaking out after expanding from Shark Pat...\n","8 positive ... [Acting well above 26.positive9 flat base trig...\n","9 positive ... [CYBX broke out to all time highs accompained ...\n","10 positive ... [solid day with MGM AAP SBX leading the way fo...\n","11 negative ... [AAP 465 is resistance and heading to 435 in t...\n","12 negative ... [CO pointed out this wknd - huge Outside Day -...\n","13 positive ... [VVS ong set up:]\n","14 positive ... [DDD come on 40!, I got some calls at 0.posit...\n","15 positive ... [WMB might fill this gap and reverse.]\n","16 negative ... [Heard on the Street: Funeral providers would ...\n","17 positive ... [user welcome to the TK club]\n","18 positive ... [ed Weekly Triangle on DVAX,., ., .., Scaling P]\n","19 positive ... [AAP What does Al Gore know that we don't?]\n","20 positive ... [user CSN, yesterday I bough at 25Kpositive., ...\n","21 positive ... [FAO is deciding its direction #waitforit]\n","22 negative ... [EN Take your profits and run., Nice run up,bu...\n","23 negative ... [GOOG reminds me so much of AAP in Sept bounci...\n","24 positive ... [AAP doji being put in on 60 min after 7 down ...\n","25 negative ... [James Dinsmore attributes Bancroft Fundâ€â...\n","26 positive ... [SEV nicely green on red market]\n","27 negative ... [VS option trader closes out Feb 50C selling p...\n","28 positive ... [AON Continuation on good volume]\n","29 positive ... [Watch for SGY to break its downward trend lin...\n","30 positive ... [SXC - breaking above key downward channel lev...\n","31 negative ... [Government May Slash Borrowing From Market In...\n","32 negative ... [CS - To those that doubted me; today is you'r...\n","33 positive ... [PAB has resistance from June to Sept but Over...\n","34 negative ... [BAC anyone think this might slush and fall be...\n","35 positive ... [with little whips on pops and drops don't go ...\n","36 negative ... [Green Weekly Triangle on CYTX,., ...pdating]\n","37 positive ... [reports next Wed. user: ATW:, Barclays start...\n","38 negative ... [NKD target positive50 - positive2 points to b...\n","39 positive ... [Positive GOOG earnings pushed NQ_F higher and...\n","40 positive ... [SSQ pulling back as suspected., uckily sold n...\n","41 negative ... [NKE potential short for many reasons., Check ...\n","42 negative ... [Supply-chain finance has become popular in re...\n","43 positive ... [AEG Over 28.23]\n","44 negative ... [AAP Free-falling Now to 457]\n","45 positive ... [BAC positivepositive., 75 to positivepositive...\n","46 positive ... [NVDA not working so far still holding though.]\n","47 negative ... [CAT Once she loses 86.50 ookout Below!, !!, S...\n","48 positive ... [My setup alerts went bonkers today., ., One o...\n","49 positive ... [SWHC Obama/Biden to speak tomorrow on gun con...\n","\n","[50 rows x 8 columns]"]},"metadata":{"tags":[]},"execution_count":5}]},{"cell_type":"markdown","metadata":{"id":"lVyOE2wV0fw_"},"source":["# 4. Test the fitted pipe on new example"]},{"cell_type":"code","metadata":{"colab":{"base_uri":"https://localhost:8080/","height":76},"id":"qdCUg2MR0PD2","executionInfo":{"status":"ok","timestamp":1620215088558,"user_tz":-120,"elapsed":1570,"user":{"displayName":"Christian Kasim Loan","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GjqAD-ircKP-s5Eh6JSdkDggDczfqQbJGU_IRb4Hw=s64","userId":"14469489166467359317"}},"outputId":"54f6d037-8cbc-4273-8c9c-04e5599e76cf"},"source":["fitted_pipe.predict(\"Bitcoin dropped by 50 percent!\")"],"execution_count":null,"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","
sentence_embedding_usetrained_sentiment_confidenceorigin_indextrained_sentimentdocumentsentence
0[0.06509937345981598, -0.05708129703998566, -0...0.5020210neutralBitcoin dropped by 50 percent![Bitcoin dropped by 50 percent!]
\n","
"],"text/plain":[" sentence_embedding_use ... sentence\n","0 [0.06509937345981598, -0.05708129703998566, -0... ... [Bitcoin dropped by 50 percent!]\n","\n","[1 rows x 6 columns]"]},"metadata":{"tags":[]},"execution_count":6}]},{"cell_type":"markdown","metadata":{"id":"xflpwrVjjBVD"},"source":["## 5. Configure pipe training parameters"]},{"cell_type":"code","metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"UtsAUGTmOTms","executionInfo":{"status":"ok","timestamp":1620215088559,"user_tz":-120,"elapsed":1284,"user":{"displayName":"Christian Kasim Loan","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GjqAD-ircKP-s5Eh6JSdkDggDczfqQbJGU_IRb4Hw=s64","userId":"14469489166467359317"}},"outputId":"e6190008-9310-45be-f3ac-e47fc541a70f"},"source":["trainable_pipe.print_info()"],"execution_count":null,"outputs":[{"output_type":"stream","text":["The following parameters are configurable for this NLU pipeline (You can copy paste the examples) :\n",">>> pipe['sentiment_dl'] has settable params:\n","pipe['sentiment_dl'].setMaxEpochs(1) | Info: Maximum number of epochs to train | Currently set to : 1\n","pipe['sentiment_dl'].setLr(0.005) | Info: Learning Rate | Currently set to : 0.005\n","pipe['sentiment_dl'].setBatchSize(64) | Info: Batch size | Currently set to : 64\n","pipe['sentiment_dl'].setDropout(0.5) | Info: Dropout coefficient | Currently set to : 0.5\n","pipe['sentiment_dl'].setEnableOutputLogs(True) | Info: Whether to use stdout in addition to Spark logs. | Currently set to : True\n","pipe['sentiment_dl'].setThreshold(0.6) | Info: The minimum threshold for the final result otheriwse it will be neutral | Currently set to : 0.6\n","pipe['sentiment_dl'].setThresholdLabel('neutral') | Info: In case the score is less than threshold, what should be the label. Default is neutral. | Currently set to : neutral\n",">>> pipe['use@tfhub_use'] has settable params:\n","pipe['use@tfhub_use'].setDimension(512) | Info: Number of embedding dimensions | Currently set to : 512\n","pipe['use@tfhub_use'].setLoadSP(False) | Info: Whether to load SentencePiece ops file which is required only by multi-lingual models. This is not changeable after it's set with a pretrained model nor it is compatible with Windows. | Currently set to : False\n","pipe['use@tfhub_use'].setStorageRef('tfhub_use') | Info: unique reference name for identification | Currently set to : tfhub_use\n",">>> pipe['deep_sentence_detector@SentenceDetectorDLModel_c83c27f46b97'] has settable params:\n","pipe['deep_sentence_detector@SentenceDetectorDLModel_c83c27f46b97'].setExplodeSentences(False) | Info: whether to explode each sentence into a different row, for better parallelization. Defaults to false. | Currently set to : False\n","pipe['deep_sentence_detector@SentenceDetectorDLModel_c83c27f46b97'].setStorageRef('SentenceDetectorDLModel_c83c27f46b97') | Info: storage unique identifier | Currently set to : SentenceDetectorDLModel_c83c27f46b97\n","pipe['deep_sentence_detector@SentenceDetectorDLModel_c83c27f46b97'].setEncoder(com.johnsnowlabs.nlp.annotators.sentence_detector_dl.SentenceDetectorDLEncoder@45181116) | Info: Data encoder | Currently set to : com.johnsnowlabs.nlp.annotators.sentence_detector_dl.SentenceDetectorDLEncoder@45181116\n","pipe['deep_sentence_detector@SentenceDetectorDLModel_c83c27f46b97'].setImpossiblePenultimates(['Bros', 'No', 'al', 'vs', 'etc', 'Fig', 'Dr', 'Prof', 'PhD', 'MD', 'Co', 'Corp', 'Inc', 'bros', 'VS', 'Vs', 'ETC', 'fig', 'dr', 'prof', 'PHD', 'phd', 'md', 'co', 'corp', 'inc', 'Jan', 'Feb', 'Mar', 'Apr', 'Jul', 'Aug', 'Sep', 'Sept', 'Oct', 'Nov', 'Dec', 'St', 'st', 'AM', 'PM', 'am', 'pm', 'e.g', 'f.e', 'i.e']) | Info: Impossible penultimates | Currently set to : ['Bros', 'No', 'al', 'vs', 'etc', 'Fig', 'Dr', 'Prof', 'PhD', 'MD', 'Co', 'Corp', 'Inc', 'bros', 'VS', 'Vs', 'ETC', 'fig', 'dr', 'prof', 'PHD', 'phd', 'md', 'co', 'corp', 'inc', 'Jan', 'Feb', 'Mar', 'Apr', 'Jul', 'Aug', 'Sep', 'Sept', 'Oct', 'Nov', 'Dec', 'St', 'st', 'AM', 'PM', 'am', 'pm', 'e.g', 'f.e', 'i.e']\n","pipe['deep_sentence_detector@SentenceDetectorDLModel_c83c27f46b97'].setModelArchitecture('cnn') | Info: Model architecture (CNN) | Currently set to : cnn\n",">>> pipe['document_assembler'] has settable params:\n","pipe['document_assembler'].setCleanupMode('shrink') | Info: possible values: disabled, inplace, inplace_full, shrink, shrink_full, each, each_full, delete_full | Currently set to : shrink\n"],"name":"stdout"}]},{"cell_type":"markdown","metadata":{"id":"2GJdDNV9jEIe"},"source":["## 6. Retrain with new parameters"]},{"cell_type":"code","metadata":{"colab":{"base_uri":"https://localhost:8080/","height":1000},"id":"mptfvHx-MMMX","executionInfo":{"status":"ok","timestamp":1620215094052,"user_tz":-120,"elapsed":6547,"user":{"displayName":"Christian Kasim Loan","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GjqAD-ircKP-s5Eh6JSdkDggDczfqQbJGU_IRb4Hw=s64","userId":"14469489166467359317"}},"outputId":"b0386b8b-b130-4d65-d972-1ecb8cefbe17"},"source":["# Train longer!\n","trainable_pipe = nlu.load('train.sentiment')\n","trainable_pipe['trainable_sentiment_dl'].setMaxEpochs(5) \n","fitted_pipe = trainable_pipe.fit(train_df.iloc[:50])\n","# predict with the trainable pipeline on dataset and get predictions\n","preds = fitted_pipe.predict(train_df.iloc[:50],output_level='document')\n","\n","#sentence detector that is part of the pipe generates sone NaNs. lets drop them first\n","preds.dropna(inplace=True)\n","print(classification_report(preds['y'], preds['sentiment']))\n","\n","preds"],"execution_count":null,"outputs":[{"output_type":"stream","text":[" precision recall f1-score support\n","\n"," negative 1.00 0.73 0.84 22\n"," neutral 0.00 0.00 0.00 0\n"," positive 0.90 1.00 0.95 28\n","\n"," accuracy 0.88 50\n"," macro avg 0.63 0.58 0.60 50\n","weighted avg 0.95 0.88 0.90 50\n","\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"," \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"," \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"," \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"," \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"," \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"," \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"," \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"," \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"," \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"," \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"," \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","
ysentence_embedding_usetrained_sentiment_confidenceorigin_indextrained_sentimentdocumenttextsentence
0negative[-0.03631044551730156, -0.02809535153210163, -...0.6731803761negativeP see what happened from October to Dec that s...P see what happened from October to Dec that s...[P see what happened from October to Dec that ...
1negative[-0.019356619566679, 0.02282714657485485, 0.00...0.6922761428negativeAAP Closed my short for positiveK Will short a...AAP Closed my short for positiveK Will short a...[AAP Closed my short for positiveK Will short ...
2negative[0.03622237220406532, -0.06491724401712418, 0....0.7049433091negativeAAP It may be wise to hold off on buying #AAP ...AAP It may be wise to hold off on buying #AAP ...[AAP It may be wise to hold off on buying #AAP...
3negative[0.038874898105859756, 0.025729672983288765, -...0.737828620negativeRT @DaveCBenoit: The banking system is not bui...RT @DaveCBenoit: The banking system is not bui...[RT @DaveCBenoit:, The banking system is not ...
4negative[0.04230193793773651, -0.02588844671845436, -0...0.6906601611negativeSensex Slumps Over positive,000 Points From Da...Sensex Slumps Over positive,000 Points From Da...[Sensex Slumps Over positive,000 Points From D...
5negative[-0.000432533270213753, -0.009179827757179737,...0.674662876negativeSelling your home to a computer was supposed t...Selling your home to a computer was supposed t...[Selling your home to a computer was supposed ...
6positive[0.06600425392389297, -0.022004421800374985, -...0.9834131678positiveed Daily Triangle on HEO,..... pdating ong and...ed Daily Triangle on HEO,..... pdating ong an...[ed Daily Triangle on HEO,., .... pdating ong ...
7positive[-0.017160149291157722, -0.03617899864912033, ...0.958774482positiveP breaking out after expanding from Shark Patt...P breaking out after expanding from Shark Patt...[P breaking out after expanding from Shark Pat...
8positive[0.026538891717791557, -0.06604061275720596, -...0.9457012540positiveActing well above 26.positive9 flat base trigg...Acting well above 26.positive9 flat base trigg...[Acting well above 26.positive9 flat base trig...
9positive[0.08514805138111115, -0.024943925440311432, -...0.8974082183positiveCYBX broke out to all time highs accompained b...CYBX broke out to all time highs accompained b...[CYBX broke out to all time highs accompained ...
10positive[0.05149979144334793, -0.061731286346912384, -...0.8397003998positivesolid day with MGM AAP SBX leading the way for...solid day with MGM AAP SBX leading the way for...[solid day with MGM AAP SBX leading the way fo...
11negative[0.03843201324343681, -0.0733688548207283, -0....0.64935919negativeAAP 465 is resistance and heading to 435 in th...AAP 465 is resistance and heading to 435 in th...[AAP 465 is resistance and heading to 435 in t...
12negative[0.02629232406616211, -0.014554189518094063, -...0.696317219negativeCO pointed out this wknd - huge Outside Day - ...CO pointed out this wknd - huge Outside Day - ...[CO pointed out this wknd - huge Outside Day -...
13positive[0.05966312810778618, -0.08997906744480133, -0...0.9940201041positiveVVS ong set up:VVS ong set up:[VVS ong set up:]
14positive[-0.003521521808579564, -0.011022194288671017,...0.8601492763positiveDDD come on 40! I got some calls at 0.positive...DDD come on 40! I got some calls at 0.positive...[DDD come on 40!, I got some calls at 0.posit...
15positive[0.07560215145349503, -0.009755599312484264, -...0.9619401683positiveWMB might fill this gap and reverse.WMB might fill this gap and reverse.[WMB might fill this gap and reverse.]
16negative[-0.0117484824731946, -0.007429660763591528, -...0.7038312565negativeHeard on the Street: Funeral providers would s...Heard on the Street: Funeral providers would s...[Heard on the Street: Funeral providers would ...
17positive[-0.03314466401934624, -0.04437091201543808, -...0.9941792065positiveuser welcome to the TK clubuser welcome to the TK club[user welcome to the TK club]
18positive[-0.018701869994401932, 0.03903575986623764, -...0.9915202308positiveed Weekly Triangle on DVAX,....Scaling Ped Weekly Triangle on DVAX,....Scaling P[ed Weekly Triangle on DVAX,., ., .., Scaling P]
19positive[-0.011695394292473793, 0.05609796568751335, -...0.7255993355positiveAAP What does Al Gore know that we don't?AAP What does Al Gore know that we don't?[AAP What does Al Gore know that we don't?]
20positive[0.04774581268429756, -0.03589113429188728, -0...0.9736692594positiveuser CSN, yesterday I bough at 25Kpositive.237...user CSN, yesterday I bough at 25Kpositive.237...[user CSN, yesterday I bough at 25Kpositive., ...
21positive[0.04126836359500885, -0.0008074558572843671, ...0.9860873099positiveFAO is deciding its direction #waitforitFAO is deciding its direction #waitforit[FAO is deciding its direction #waitforit]
22negative[0.017080938443541527, 0.021576160565018654, 0...0.6751472091negativeEN Take your profits and run. Nice run up,but ...EN Take your profits and run. Nice run up,but ...[EN Take your profits and run., Nice run up,bu...
23negative[0.04716206341981888, -0.021414492279291153, -...0.7596261819negativeGOOG reminds me so much of AAP in Sept bouncin...GOOG reminds me so much of AAP in Sept bounci...[GOOG reminds me so much of AAP in Sept bounci...
24positive[0.023834621533751488, -0.07077112793922424, -...0.6932933913positiveAAP doji being put in on 60 min after 7 down c...AAP doji being put in on 60 min after 7 down c...[AAP doji being put in on 60 min after 7 down ...
25negative[0.1026904433965683, 0.013861684128642082, -0....0.5872683117neutralJames Dinsmore attributes Bancroft Fundâ€â„...James Dinsmore attributes Bancroft Fundâ€â„...[James Dinsmore attributes Bancroft Fundâ€â...
26positive[0.006304154172539711, -0.0644269809126854, -0...0.875854695positiveSEV nicely green on red marketSEV nicely green on red market[SEV nicely green on red market]
27negative[0.06555721163749695, 0.023601243272423744, -0...0.6741482916negativeVS option trader closes out Feb 50C selling po...VS option trader closes out Feb 50C selling po...[VS option trader closes out Feb 50C selling p...
28positive[-0.0012494433904066682, -0.017743036150932312...0.984582692positiveAON Continuation on good volumeAON Continuation on good volume[AON Continuation on good volume]
29positive[0.04852033779025078, 0.00623974809423089, -0....0.778999475positiveWatch for SGY to break its downward trend line...Watch for SGY to break its downward trend line...[Watch for SGY to break its downward trend lin...
30positive[0.05204714462161064, 0.03000013716518879, -0....0.9838673159positiveSXC - breaking above key downward channel leve...SXC - breaking above key downward channel leve...[SXC - breaking above key downward channel lev...
31negative[0.053190235048532486, -0.023420613259077072, ...0.7254562102negativeGovernment May Slash Borrowing From Market In ...Government May Slash Borrowing From Market In ...[Government May Slash Borrowing From Market In...
32negative[0.013695711269974709, 0.031249094754457474, -...0.5771591689neutralCS - To those that doubted me; today is you're...CS - To those that doubted me; today is you're...[CS - To those that doubted me; today is you'r...
33positive[0.03522776812314987, -0.00036802110844291747,...0.7498482455positivePAB has resistance from June to Sept but Over ...PAB has resistance from June to Sept but Over ...[PAB has resistance from June to Sept but Over...
34negative[-0.05846807360649109, -0.027525130659341812, ...0.6835942337negativeBAC anyone think this might slush and fall bel...BAC anyone think this might slush and fall bel...[BAC anyone think this might slush and fall be...
35positive[0.05771354213356972, -0.03869543969631195, -0...0.7768923529positivewith little whips on pops and drops don't go a...with little whips on pops and drops don't go a...[with little whips on pops and drops don't go ...
36negative[-0.049992404878139496, -0.017947403714060783,...0.9157352076positiveGreen Weekly Triangle on CYTX,....pdatingGreen Weekly Triangle on CYTX,....pdating[Green Weekly Triangle on CYTX,., ...pdating]
37positive[0.006133062299340963, -0.05417517572641373, -...0.9254943012positivereports next Wed. user: ATW: Barclays starts a...reports next Wed. user: ATW: Barclays starts ...[reports next Wed. user: ATW:, Barclays start...
38negative[0.041309256106615067, 0.02620919793844223, -0...0.7255683805positiveNKD target positive50 - positive2 points to be...NKD target positive50 - positive2 points to be...[NKD target positive50 - positive2 points to b...
39positive[0.0385039821267128, -0.040522705763578415, -0...0.8798513789positivePositive GOOG earnings pushed NQ_F higher and ...Positive GOOG earnings pushed NQ_F higher and ...[Positive GOOG earnings pushed NQ_F higher and...
40positive[0.05128449201583862, -0.04454624652862549, -0...0.9641383625positiveSSQ pulling back as suspected. uckily sold nea...SSQ pulling back as suspected. uckily sold nea...[SSQ pulling back as suspected., uckily sold n...
41negative[0.018300753086805344, -0.04134758561849594, -...0.644012851positiveNKE potential short for many reasons. Check F ...NKE potential short for many reasons. Check F ...[NKE potential short for many reasons., Check ...
42negative[0.09244795143604279, 0.015826726332306862, -0...0.729759608negativeSupply-chain finance has become popular in rec...Supply-chain finance has become popular in rec...[Supply-chain finance has become popular in re...
43positive[0.042959753423929214, 0.004588234703987837, -...0.985379546positiveAEG Over 28.23AEG Over 28.23[AEG Over 28.23]
44negative[0.004285166040062904, -0.07630395889282227, -...0.6042511225negativeAAP Free-falling Now to 457AAP Free-falling Now to 457[AAP Free-falling Now to 457]
45positive[0.017030321061611176, -0.022644072771072388, ...0.8393841227positiveBAC positivepositive.75 to positivepositive.80...BAC positivepositive.75 to positivepositive.80...[BAC positivepositive., 75 to positivepositive...
46positive[0.030308598652482033, 0.02380680851638317, -0...0.8881663991positiveNVDA not working so far still holding though.NVDA not working so far still holding though.[NVDA not working so far still holding though.]
47negative[0.05175251513719559, 0.05424535647034645, -0....0.5692521467neutralCAT Once she loses 86.50 ookout Below!!! Strai...CAT Once she loses 86.50 ookout Below!!! Strai...[CAT Once she loses 86.50 ookout Below!, !!, S...
48positive[-0.022420072928071022, -0.06559137254953384, ...0.9863961000positiveMy setup alerts went bonkers today..One of man...My setup alerts went bonkers today..One of man...[My setup alerts went bonkers today., ., One o...
49positive[0.03310457989573479, -0.038539715111255646, -...0.925892282positiveSWHC Obama/Biden to speak tomorrow on gun cont...SWHC Obama/Biden to speak tomorrow on gun cont...[SWHC Obama/Biden to speak tomorrow on gun con...
\n","
"],"text/plain":[" y ... sentence\n","0 negative ... [P see what happened from October to Dec that ...\n","1 negative ... [AAP Closed my short for positiveK Will short ...\n","2 negative ... [AAP It may be wise to hold off on buying #AAP...\n","3 negative ... [RT @DaveCBenoit:, The banking system is not ...\n","4 negative ... [Sensex Slumps Over positive,000 Points From D...\n","5 negative ... [Selling your home to a computer was supposed ...\n","6 positive ... [ed Daily Triangle on HEO,., .... pdating ong ...\n","7 positive ... [P breaking out after expanding from Shark Pat...\n","8 positive ... [Acting well above 26.positive9 flat base trig...\n","9 positive ... [CYBX broke out to all time highs accompained ...\n","10 positive ... [solid day with MGM AAP SBX leading the way fo...\n","11 negative ... [AAP 465 is resistance and heading to 435 in t...\n","12 negative ... [CO pointed out this wknd - huge Outside Day -...\n","13 positive ... [VVS ong set up:]\n","14 positive ... [DDD come on 40!, I got some calls at 0.posit...\n","15 positive ... [WMB might fill this gap and reverse.]\n","16 negative ... [Heard on the Street: Funeral providers would ...\n","17 positive ... [user welcome to the TK club]\n","18 positive ... [ed Weekly Triangle on DVAX,., ., .., Scaling P]\n","19 positive ... [AAP What does Al Gore know that we don't?]\n","20 positive ... [user CSN, yesterday I bough at 25Kpositive., ...\n","21 positive ... [FAO is deciding its direction #waitforit]\n","22 negative ... [EN Take your profits and run., Nice run up,bu...\n","23 negative ... [GOOG reminds me so much of AAP in Sept bounci...\n","24 positive ... [AAP doji being put in on 60 min after 7 down ...\n","25 negative ... [James Dinsmore attributes Bancroft Fundâ€â...\n","26 positive ... [SEV nicely green on red market]\n","27 negative ... [VS option trader closes out Feb 50C selling p...\n","28 positive ... [AON Continuation on good volume]\n","29 positive ... [Watch for SGY to break its downward trend lin...\n","30 positive ... [SXC - breaking above key downward channel lev...\n","31 negative ... [Government May Slash Borrowing From Market In...\n","32 negative ... [CS - To those that doubted me; today is you'r...\n","33 positive ... [PAB has resistance from June to Sept but Over...\n","34 negative ... [BAC anyone think this might slush and fall be...\n","35 positive ... [with little whips on pops and drops don't go ...\n","36 negative ... [Green Weekly Triangle on CYTX,., ...pdating]\n","37 positive ... [reports next Wed. user: ATW:, Barclays start...\n","38 negative ... [NKD target positive50 - positive2 points to b...\n","39 positive ... [Positive GOOG earnings pushed NQ_F higher and...\n","40 positive ... [SSQ pulling back as suspected., uckily sold n...\n","41 negative ... [NKE potential short for many reasons., Check ...\n","42 negative ... [Supply-chain finance has become popular in re...\n","43 positive ... [AEG Over 28.23]\n","44 negative ... [AAP Free-falling Now to 457]\n","45 positive ... [BAC positivepositive., 75 to positivepositive...\n","46 positive ... [NVDA not working so far still holding though.]\n","47 negative ... [CAT Once she loses 86.50 ookout Below!, !!, S...\n","48 positive ... [My setup alerts went bonkers today., ., One o...\n","49 positive ... [SWHC Obama/Biden to speak tomorrow on gun con...\n","\n","[50 rows x 8 columns]"]},"metadata":{"tags":[]},"execution_count":8}]},{"cell_type":"markdown","metadata":{"id":"qFoT-s1MjTSS"},"source":["# 7. Try training with different Embeddings"]},{"cell_type":"code","metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"nxWFzQOhjWC8","executionInfo":{"status":"ok","timestamp":1620215094053,"user_tz":-120,"elapsed":6283,"user":{"displayName":"Christian Kasim Loan","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GjqAD-ircKP-s5Eh6JSdkDggDczfqQbJGU_IRb4Hw=s64","userId":"14469489166467359317"}},"outputId":"f410569a-7055-427d-c7dd-1388947b8f37"},"source":["# We can use nlu.print_components(action='embed_sentence') to see every possibler sentence embedding we could use. Lets use bert!\n","nlu.print_components(action='embed_sentence')"],"execution_count":null,"outputs":[{"output_type":"stream","text":["For language NLU provides the following Models : \n","nlu.load('en.embed_sentence') returns Spark NLP model tfhub_use\n","nlu.load('en.embed_sentence.use') returns Spark NLP model tfhub_use\n","nlu.load('en.embed_sentence.tfhub_use') returns Spark NLP model tfhub_use\n","nlu.load('en.embed_sentence.use.lg') returns Spark NLP model tfhub_use_lg\n","nlu.load('en.embed_sentence.tfhub_use.lg') returns Spark NLP model tfhub_use_lg\n","nlu.load('en.embed_sentence.albert') returns Spark NLP model albert_base_uncased\n","nlu.load('en.embed_sentence.electra') returns Spark NLP model sent_electra_small_uncased\n","nlu.load('en.embed_sentence.electra_small_uncased') returns Spark NLP model sent_electra_small_uncased\n","nlu.load('en.embed_sentence.electra_base_uncased') returns Spark NLP model sent_electra_base_uncased\n","nlu.load('en.embed_sentence.electra_large_uncased') returns Spark NLP model sent_electra_large_uncased\n","nlu.load('en.embed_sentence.bert') returns Spark NLP model sent_bert_base_uncased\n","nlu.load('en.embed_sentence.bert_base_uncased') returns Spark NLP model sent_bert_base_uncased\n","nlu.load('en.embed_sentence.bert_base_cased') returns Spark NLP model sent_bert_base_cased\n","nlu.load('en.embed_sentence.bert_large_uncased') returns Spark NLP model sent_bert_large_uncased\n","nlu.load('en.embed_sentence.bert_large_cased') returns Spark NLP model sent_bert_large_cased\n","nlu.load('en.embed_sentence.biobert.pubmed_base_cased') returns Spark NLP model sent_biobert_pubmed_base_cased\n","nlu.load('en.embed_sentence.biobert.pubmed_large_cased') returns Spark NLP model sent_biobert_pubmed_large_cased\n","nlu.load('en.embed_sentence.biobert.pmc_base_cased') returns Spark NLP model sent_biobert_pmc_base_cased\n","nlu.load('en.embed_sentence.biobert.pubmed_pmc_base_cased') returns Spark NLP model sent_biobert_pubmed_pmc_base_cased\n","nlu.load('en.embed_sentence.biobert.clinical_base_cased') returns Spark NLP model sent_biobert_clinical_base_cased\n","nlu.load('en.embed_sentence.biobert.discharge_base_cased') returns Spark NLP model sent_biobert_discharge_base_cased\n","nlu.load('en.embed_sentence.covidbert.large_uncased') returns Spark NLP model sent_covidbert_large_uncased\n","nlu.load('en.embed_sentence.small_bert_L2_128') returns Spark NLP model sent_small_bert_L2_128\n","nlu.load('en.embed_sentence.small_bert_L4_128') returns Spark NLP model sent_small_bert_L4_128\n","nlu.load('en.embed_sentence.small_bert_L6_128') returns Spark NLP model sent_small_bert_L6_128\n","nlu.load('en.embed_sentence.small_bert_L8_128') returns Spark NLP model sent_small_bert_L8_128\n","nlu.load('en.embed_sentence.small_bert_L10_128') returns Spark NLP model sent_small_bert_L10_128\n","nlu.load('en.embed_sentence.small_bert_L12_128') returns Spark NLP model sent_small_bert_L12_128\n","nlu.load('en.embed_sentence.small_bert_L2_256') returns Spark NLP model sent_small_bert_L2_256\n","nlu.load('en.embed_sentence.small_bert_L4_256') returns Spark NLP model sent_small_bert_L4_256\n","nlu.load('en.embed_sentence.small_bert_L6_256') returns Spark NLP model sent_small_bert_L6_256\n","nlu.load('en.embed_sentence.small_bert_L8_256') returns Spark NLP model sent_small_bert_L8_256\n","nlu.load('en.embed_sentence.small_bert_L10_256') returns Spark NLP model sent_small_bert_L10_256\n","nlu.load('en.embed_sentence.small_bert_L12_256') returns Spark NLP model sent_small_bert_L12_256\n","nlu.load('en.embed_sentence.small_bert_L2_512') returns Spark NLP model sent_small_bert_L2_512\n","nlu.load('en.embed_sentence.small_bert_L4_512') returns Spark NLP model sent_small_bert_L4_512\n","nlu.load('en.embed_sentence.small_bert_L6_512') returns Spark NLP model sent_small_bert_L6_512\n","nlu.load('en.embed_sentence.small_bert_L8_512') returns Spark NLP model sent_small_bert_L8_512\n","nlu.load('en.embed_sentence.small_bert_L10_512') returns Spark NLP model sent_small_bert_L10_512\n","nlu.load('en.embed_sentence.small_bert_L12_512') returns Spark NLP model sent_small_bert_L12_512\n","nlu.load('en.embed_sentence.small_bert_L2_768') returns Spark NLP model sent_small_bert_L2_768\n","nlu.load('en.embed_sentence.small_bert_L4_768') returns Spark NLP model sent_small_bert_L4_768\n","nlu.load('en.embed_sentence.small_bert_L6_768') returns Spark NLP model sent_small_bert_L6_768\n","nlu.load('en.embed_sentence.small_bert_L8_768') returns Spark NLP model sent_small_bert_L8_768\n","nlu.load('en.embed_sentence.small_bert_L10_768') returns Spark NLP model sent_small_bert_L10_768\n","nlu.load('en.embed_sentence.small_bert_L12_768') returns Spark NLP model sent_small_bert_L12_768\n","For language NLU provides the following Models : \n","nlu.load('fi.embed_sentence') returns Spark NLP model sent_bert_finnish_cased\n","nlu.load('fi.embed_sentence.bert.cased') returns Spark NLP model sent_bert_finnish_cased\n","nlu.load('fi.embed_sentence.bert.uncased') returns Spark NLP model sent_bert_finnish_uncased\n","For language NLU provides the following Models : \n","nlu.load('xx.embed_sentence') returns Spark NLP model sent_bert_multi_cased\n","nlu.load('xx.embed_sentence.bert') returns Spark NLP model sent_bert_multi_cased\n","nlu.load('xx.embed_sentence.bert.cased') returns Spark NLP model sent_bert_multi_cased\n","nlu.load('xx.embed_sentence.labse') returns Spark NLP model labse\n"],"name":"stdout"}]},{"cell_type":"code","metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"IKK_Ii_gjJfF","executionInfo":{"status":"ok","timestamp":1620216889890,"user_tz":-120,"elapsed":1801997,"user":{"displayName":"Christian Kasim Loan","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GjqAD-ircKP-s5Eh6JSdkDggDczfqQbJGU_IRb4Hw=s64","userId":"14469489166467359317"}},"outputId":"3ef316f8-15cb-47fa-e781-d26594a43df4"},"source":["trainable_pipe = nlu.load('en.embed_sentence.small_bert_L12_768 train.sentiment')\n","# We need to train longer and user smaller LR for NON-USE based sentence embeddings usually\n","# We could tune the hyperparameters further with hyperparameter tuning methods like gridsearch\n","# Also longer training gives more accuracy\n","trainable_pipe['trainable_sentiment_dl'].setMaxEpochs(120) \n","trainable_pipe['trainable_sentiment_dl'].setLr(0.0005) \n","fitted_pipe = trainable_pipe.fit(train_df)\n","# predict with the trainable pipeline on dataset and get predictions\n","preds = fitted_pipe.predict(train_df,output_level='document')\n","\n","#sentence detector that is part of the pipe generates sone NaNs. lets drop them first\n","preds.dropna(inplace=True)\n","print(classification_report(preds['y'], preds['sentiment']))\n","\n","#preds"],"execution_count":null,"outputs":[{"output_type":"stream","text":["sent_small_bert_L12_768 download started this may take some time.\n","Approximate size to download 392.9 MB\n","[OK!]\n","sentence_detector_dl download started this may take some time.\n","Approximate size to download 354.6 KB\n","[OK!]\n"," precision recall f1-score support\n","\n"," negative 0.81 0.68 0.74 1586\n"," neutral 0.00 0.00 0.00 0\n"," positive 0.80 0.73 0.76 1614\n","\n"," accuracy 0.71 3200\n"," macro avg 0.54 0.47 0.50 3200\n","weighted avg 0.80 0.71 0.75 3200\n","\n"],"name":"stdout"}]},{"cell_type":"markdown","metadata":{"id":"_1jxw3GnVGlI"},"source":["# 7.1 evaluate on Test Data"]},{"cell_type":"code","metadata":{"id":"Fxx4yNkNVGFl","colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"status":"ok","timestamp":1620217006865,"user_tz":-120,"elapsed":1918670,"user":{"displayName":"Christian Kasim Loan","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GjqAD-ircKP-s5Eh6JSdkDggDczfqQbJGU_IRb4Hw=s64","userId":"14469489166467359317"}},"outputId":"41c4545d-ae7f-47e8-8d6a-19d1a555a10c"},"source":["preds = fitted_pipe.predict(test_df,output_level='document')\n","\n","#sentence detector that is part of the pipe generates sone NaNs. lets drop them first\n","preds.dropna(inplace=True)\n","print(classification_report(preds['y'], preds['sentiment']))"],"execution_count":null,"outputs":[{"output_type":"stream","text":[" precision recall f1-score support\n","\n"," negative 0.76 0.62 0.68 414\n"," neutral 0.00 0.00 0.00 0\n"," positive 0.72 0.67 0.69 386\n","\n"," accuracy 0.64 800\n"," macro avg 0.49 0.43 0.46 800\n","weighted avg 0.74 0.64 0.69 800\n","\n"],"name":"stdout"}]},{"cell_type":"markdown","metadata":{"id":"2BB-NwZUoHSe"},"source":["# 8. Lets save the model"]},{"cell_type":"code","metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"eLex095goHwm","executionInfo":{"status":"ok","timestamp":1620217179981,"user_tz":-120,"elapsed":2091513,"user":{"displayName":"Christian Kasim Loan","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GjqAD-ircKP-s5Eh6JSdkDggDczfqQbJGU_IRb4Hw=s64","userId":"14469489166467359317"}},"outputId":"0f025bcd-eab2-47ee-8440-0425138fea27"},"source":["stored_model_path = './models/classifier_dl_trained' \n","fitted_pipe.save(stored_model_path)"],"execution_count":null,"outputs":[{"output_type":"stream","text":["Stored model in ./models/classifier_dl_trained\n"],"name":"stdout"}]},{"cell_type":"markdown","metadata":{"id":"e_b2DPd4rCiU"},"source":["# 9. Lets load the model from HDD.\n","This makes Offlien NLU usage possible! \n","You need to call nlu.load(path=path_to_the_pipe) to load a model/pipeline from disk."]},{"cell_type":"code","metadata":{"colab":{"base_uri":"https://localhost:8080/","height":76},"id":"SO4uz45MoRgp","executionInfo":{"status":"ok","timestamp":1620217194005,"user_tz":-120,"elapsed":2104313,"user":{"displayName":"Christian Kasim Loan","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GjqAD-ircKP-s5Eh6JSdkDggDczfqQbJGU_IRb4Hw=s64","userId":"14469489166467359317"}},"outputId":"004beb68-0b86-41b8-efb7-0c6382311f17"},"source":["hdd_pipe = nlu.load(path=\"./models/classifier_dl_trained\")\n","\n","preds = hdd_pipe.predict('Bitcoin dropped by 50 percent!!')\n","preds"],"execution_count":null,"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","
sentimentsentence_embedding_from_disksentiment_confidencedocumenttextorigin_indexsentence
0[negative, negative][[0.17410096526145935, 0.14491602778434753, 0....[0.7221757, 0.7221757]Bitcoin dropped by 50 percent!!Bitcoin dropped by 50 percent!!8589934592[Bitcoin dropped by 50 percent!, !]
\n","
"],"text/plain":[" sentiment ... sentence\n","0 [negative, negative] ... [Bitcoin dropped by 50 percent!, !]\n","\n","[1 rows x 7 columns]"]},"metadata":{"tags":[]},"execution_count":13}]},{"cell_type":"code","metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"e0CVlkk9v6Qi","executionInfo":{"status":"ok","timestamp":1620217194006,"user_tz":-120,"elapsed":2104171,"user":{"displayName":"Christian Kasim Loan","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GjqAD-ircKP-s5Eh6JSdkDggDczfqQbJGU_IRb4Hw=s64","userId":"14469489166467359317"}},"outputId":"206b4d33-57de-4b00-a731-8182c4359e00"},"source":["hdd_pipe.print_info()"],"execution_count":null,"outputs":[{"output_type":"stream","text":["The following parameters are configurable for this NLU pipeline (You can copy paste the examples) :\n",">>> pipe['document_assembler'] has settable params:\n","pipe['document_assembler'].setCleanupMode('shrink') | Info: possible values: disabled, inplace, inplace_full, shrink, shrink_full, each, each_full, delete_full | Currently set to : shrink\n",">>> pipe['sentence_detector@SentenceDetectorDLModel_c83c27f46b97'] has settable params:\n","pipe['sentence_detector@SentenceDetectorDLModel_c83c27f46b97'].setExplodeSentences(False) | Info: whether to explode each sentence into a different row, for better parallelization. Defaults to false. | Currently set to : False\n","pipe['sentence_detector@SentenceDetectorDLModel_c83c27f46b97'].setStorageRef('SentenceDetectorDLModel_c83c27f46b97') | Info: storage unique identifier | Currently set to : SentenceDetectorDLModel_c83c27f46b97\n","pipe['sentence_detector@SentenceDetectorDLModel_c83c27f46b97'].setEncoder(com.johnsnowlabs.nlp.annotators.sentence_detector_dl.SentenceDetectorDLEncoder@160b9ba) | Info: Data encoder | Currently set to : com.johnsnowlabs.nlp.annotators.sentence_detector_dl.SentenceDetectorDLEncoder@160b9ba\n","pipe['sentence_detector@SentenceDetectorDLModel_c83c27f46b97'].setImpossiblePenultimates(['Bros', 'No', 'al', 'vs', 'etc', 'Fig', 'Dr', 'Prof', 'PhD', 'MD', 'Co', 'Corp', 'Inc', 'bros', 'VS', 'Vs', 'ETC', 'fig', 'dr', 'prof', 'PHD', 'phd', 'md', 'co', 'corp', 'inc', 'Jan', 'Feb', 'Mar', 'Apr', 'Jul', 'Aug', 'Sep', 'Sept', 'Oct', 'Nov', 'Dec', 'St', 'st', 'AM', 'PM', 'am', 'pm', 'e.g', 'f.e', 'i.e']) | Info: Impossible penultimates | Currently set to : ['Bros', 'No', 'al', 'vs', 'etc', 'Fig', 'Dr', 'Prof', 'PhD', 'MD', 'Co', 'Corp', 'Inc', 'bros', 'VS', 'Vs', 'ETC', 'fig', 'dr', 'prof', 'PHD', 'phd', 'md', 'co', 'corp', 'inc', 'Jan', 'Feb', 'Mar', 'Apr', 'Jul', 'Aug', 'Sep', 'Sept', 'Oct', 'Nov', 'Dec', 'St', 'st', 'AM', 'PM', 'am', 'pm', 'e.g', 'f.e', 'i.e']\n","pipe['sentence_detector@SentenceDetectorDLModel_c83c27f46b97'].setModelArchitecture('cnn') | Info: Model architecture (CNN) | Currently set to : cnn\n",">>> pipe['bert_sentence@sent_small_bert_L12_768'] has settable params:\n","pipe['bert_sentence@sent_small_bert_L12_768'].setBatchSize(8) | Info: Size of every batch | Currently set to : 8\n","pipe['bert_sentence@sent_small_bert_L12_768'].setCaseSensitive(False) | Info: whether to ignore case in tokens for embeddings matching | Currently set to : False\n","pipe['bert_sentence@sent_small_bert_L12_768'].setDimension(768) | Info: Number of embedding dimensions | Currently set to : 768\n","pipe['bert_sentence@sent_small_bert_L12_768'].setMaxSentenceLength(128) | Info: Max sentence length to process | Currently set to : 128\n","pipe['bert_sentence@sent_small_bert_L12_768'].setIsLong(False) | Info: Use Long type instead of Int type for inputs buffer - Some Bert models require Long instead of Int. | Currently set to : False\n","pipe['bert_sentence@sent_small_bert_L12_768'].setStorageRef('sent_small_bert_L12_768') | Info: unique reference name for identification | Currently set to : sent_small_bert_L12_768\n",">>> pipe['sentiment_dl@sent_small_bert_L12_768'] has settable params:\n","pipe['sentiment_dl@sent_small_bert_L12_768'].setThreshold(0.6) | Info: The minimum threshold for the final result otheriwse it will be neutral | Currently set to : 0.6\n","pipe['sentiment_dl@sent_small_bert_L12_768'].setThresholdLabel('neutral') | Info: In case the score is less than threshold, what should be the label. Default is neutral. | Currently set to : neutral\n","pipe['sentiment_dl@sent_small_bert_L12_768'].setClasses(['positive', 'negative']) | Info: get the tags used to trained this SentimentDLModel | Currently set to : ['positive', 'negative']\n","pipe['sentiment_dl@sent_small_bert_L12_768'].setStorageRef('sent_small_bert_L12_768') | Info: unique reference name for identification | Currently set to : sent_small_bert_L12_768\n"],"name":"stdout"}]},{"cell_type":"code","metadata":{"id":"-CdcbSd7WEpm"},"source":[""],"execution_count":null,"outputs":[]}]} \ No newline at end of file +{ + "nbformat": 4, + "nbformat_minor": 0, + "metadata": { + "colab": { + "provenance": [] + }, + "kernelspec": { + "display_name": "Python 3", + "name": "python3" + } + }, + "cells": [ + { + "cell_type": "markdown", + "metadata": { + "id": "zkufh760uvF3" + }, + "source": [ + "![JohnSnowLabs](https://nlp.johnsnowlabs.com/assets/images/logo.png)\n", + "\n", + "[![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/JohnSnowLabs/nlu/blob/master/examples/colab/Training/binary_text_classification/NLU_training_sentiment_classifier_demo_stock_market.ipynb)\n", + "\n", + "\n", + "# Training a Sentiment Analysis Classifier with NLU\n", + "## 2 Class Demo Stock Market Sentiment Training\n", + "With the [SentimentDL model](https://nlp.johnsnowlabs.com/docs/en/annotators#sentimentdl-multi-class-sentiment-analysis-annotator) from Spark NLP you can achieve State Of the Art results on any multi class text classification problem\n", + "\n", + "This notebook showcases the following features :\n", + "\n", + "- How to train the deep learning classifier\n", + "- How to store a pipeline to disk\n", + "- How to load the pipeline from disk (Enables NLU offline mode)\n", + "\n", + "\n", + "You can achieve these results or even better on this dataset with training data:\n", + "\n", + "\n", + "
\n", + "\n", + "\n", + "![image.png](data:image/png;base64,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)\n", + "\n", + "\n", + "\n", + "\n", + "You can achieve these results or even better on this dataset with test data:\n", + "\n", + "\n", + "
\n", + "\n", + "![img.png](data:image/png;base64,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)\n" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "dur2drhW5Rvi" + }, + "source": [ + "# 1. Install Java 8 and NLU" + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "hFGnBCHavltY" + }, + "source": [ + "!pip install -q johnsnowlabs\n" + ], + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "f4KkTfnR5Ugg" + }, + "source": [ + "# 2. Download Stock Market Sentiment dataset\n", + "https://www.kaggle.com/yash612/stockmarket-sentiment-dataset\n", + "#Context\n", + "\n", + "Gathered Stock news from Multiple twitter Handles regarding Economic news dividing into two parts : Negative and positive." + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "OrVb5ZMvvrQD" + }, + "source": [ + "! wget https://s3.amazonaws.com/auxdata.johnsnowlabs.com/public/resources/en/classifier-dl/stock_data/stock_data.csv\n" + ], + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 424 + }, + "id": "y4xSRWIhwT28", + "outputId": "2bb5e57a-472c-4812-dca5-aa29adad67ae" + }, + "source": [ + "import pandas as pd\n", + "train_path = '/content/stock_data.csv'\n", + "\n", + "train_df = pd.read_csv(train_path)\n", + "# the text data to use for classification should be in a column named 'text'\n", + "columns=['text','y']\n", + "train_df = train_df[columns]\n", + "train_df.y = train_df.y.astype(str)\n", + "train_df.y = train_df.y.str.replace('-1','negative')\n", + "train_df.y = train_df.y.str.replace('1','positive')\n", + "from sklearn.model_selection import train_test_split\n", + "\n", + "train_df, test_df = train_test_split(train_df, test_size=0.2)\n", + "train_df" + ], + "execution_count": 4, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + " text y\n", + "3971 Taking profits on CMG from 321, not time to a ... positive\n", + "4113 STI 5 min 1 - and 30 min opening range, added ... positive\n", + "1878 ong EN with stop arnd 39.40- entry 40.10 positive\n", + "3270 Adding short BWS to portfolio. I think next ye... negative\n", + "5073 The banks for years rode consumer spending and... negative\n", + "... ... ...\n", + "5591 Sensex, Nifty End Mixed Despite RBI's Steep Re... negative\n", + "2338 ZNGA Merrill upgraded this on 2/5 - just a ret... negative\n", + "984 AMAT reached very high overbought conditions. ... positive\n", + "2883 GOOG reminds me so much of AAP in Sept bounci... negative\n", + "4309 AAP 425 has been the BY target for the last fe... positive\n", + "\n", + "[4632 rows x 2 columns]" + ], + "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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
texty
3971Taking profits on CMG from 321, not time to a ...positive
4113STI 5 min 1 - and 30 min opening range, added ...positive
1878ong EN with stop arnd 39.40- entry 40.10positive
3270Adding short BWS to portfolio. I think next ye...negative
5073The banks for years rode consumer spending and...negative
.........
5591Sensex, Nifty End Mixed Despite RBI's Steep Re...negative
2338ZNGA Merrill upgraded this on 2/5 - just a ret...negative
984AMAT reached very high overbought conditions. ...positive
2883GOOG reminds me so much of AAP in Sept bounci...negative
4309AAP 425 has been the BY target for the last fe...positive
\n", + "

4632 rows × 2 columns

\n", + "
\n", + "
\n", + "\n", + "
\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "
\n", + "\n", + "\n", + "
\n", + " \n", + "\n", + "\n", + "\n", + " \n", + "
\n", + "
\n", + "
\n" + ] + }, + "metadata": {}, + "execution_count": 4 + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "0296Om2C5anY" + }, + "source": [ + "# 3. Train Deep Learning Classifier using nlu.load('train.sentiment')\n", + "\n", + "You dataset label column should be named 'y' and the feature column with text data should be named 'text'" + ] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 1000 + }, + "id": "3ZIPkRkWftBG", + "outputId": "91339d2a-72ec-490e-8531-2481e68d1447" + }, + "source": [ + "from johnsnowlabs import nlp\n", + "from sklearn.metrics import classification_report\n", + "\n", + "# load a trainable pipeline by specifying the train. prefix and fit it on a datset with label and text columns\n", + "# by default the Universal Sentence Encoder (USE) Sentence embeddings are used for generation\n", + "trainable_pipe = nlp.load('train.sentiment')\n", + "fitted_pipe = trainable_pipe.fit(train_df.iloc[:50])\n", + "\n", + "# predict with the trainable pipeline on dataset and get predictions\n", + "preds = fitted_pipe.predict(train_df.iloc[:50],output_level='document')\n", + "#sentence detector that is part of the pipe generates sone NaNs. lets drop them first\n", + "preds.dropna(inplace=True)\n", + "print(classification_report(preds['y'], preds['sentiment']))\n", + "\n", + "preds" + ], + "execution_count": 6, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Warning::Spark Session already created, some configs may not take.\n", + "sent_small_bert_L2_128 download started this may take some time.\n", + "Approximate size to download 16.1 MB\n", + "[OK!]\n" + ] + }, + { + "output_type": "stream", + "name": "stderr", + "text": [ + "/usr/local/lib/python3.10/dist-packages/nlu/pipe/pipeline.py:149: SettingWithCopyWarning: \n", + "A value is trying to be set on a copy of a slice from a DataFrame.\n", + "Try using .loc[row_indexer,col_indexer] = value instead\n", + "\n", + "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n", + " dataset.y = dataset.y.apply(str)\n", + "/usr/local/lib/python3.10/dist-packages/nlu/pipe/utils/data_conversion_utils.py:160: SettingWithCopyWarning: \n", + "A value is trying to be set on a copy of a slice from a DataFrame.\n", + "Try using .loc[row_indexer,col_indexer] = value instead\n", + "\n", + "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n", + " data['origin_index'] = data.index\n", + "/usr/local/lib/python3.10/dist-packages/nlu/pipe/utils/data_conversion_utils.py:160: SettingWithCopyWarning: \n", + "A value is trying to be set on a copy of a slice from a DataFrame.\n", + "Try using .loc[row_indexer,col_indexer] = value instead\n", + "\n", + "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n", + " data['origin_index'] = data.index\n" + ] + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + " precision recall f1-score support\n", + "\n", + " negative 0.00 0.00 0.00 17\n", + " positive 0.66 1.00 0.80 33\n", + "\n", + " accuracy 0.66 50\n", + " macro avg 0.33 0.50 0.40 50\n", + "weighted avg 0.44 0.66 0.52 50\n", + "\n" + ] + }, + { + "output_type": "stream", + "name": "stderr", + "text": [ + "/usr/local/lib/python3.10/dist-packages/nlu/pipe/extractors/extractor_methods/base_extractor_methods.py:356: SettingWithCopyWarning: \n", + "A value is trying to be set on a copy of a slice from a DataFrame.\n", + "Try using .loc[row_indexer,col_indexer] = value instead\n", + "\n", + "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n", + " df[cols_to_explode] = df[cols_to_explode].apply(pad_same_level_cols, axis=1)\n", + "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/_classification.py:1344: UndefinedMetricWarning: Precision and F-score are ill-defined and being set to 0.0 in labels with no predicted samples. Use `zero_division` parameter to control this behavior.\n", + " _warn_prf(average, modifier, msg_start, len(result))\n", + "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/_classification.py:1344: UndefinedMetricWarning: Precision and F-score are ill-defined and being set to 0.0 in labels with no predicted samples. Use `zero_division` parameter to control this behavior.\n", + " _warn_prf(average, modifier, msg_start, len(result))\n", + "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/_classification.py:1344: UndefinedMetricWarning: Precision and F-score are ill-defined and being set to 0.0 in labels with no predicted samples. Use `zero_division` parameter to control this behavior.\n", + " _warn_prf(average, modifier, msg_start, len(result))\n" + ] + }, + { + "output_type": "execute_result", + "data": { + "text/plain": [ + " document \\\n", + "0 Taking profits on CMG from 321, not time to a ... \n", + "1 STI 5 min 1 - and 30 min opening range, added ... \n", + "2 ong EN with stop arnd 39.40- entry 40.10 \n", + "3 Adding short BWS to portfolio. I think next ye... \n", + "4 The banks for years rode consumer spending and... \n", + "5 of some of the most watched biotechs AMGN look... \n", + "6 GOOG here is the leader of the pack for the ri... \n", + "7 user another good read. keep em coming and tha... \n", + "8 GTXI long 5.16, will take early assuming no ga... \n", + "9 Sen. Kelly Loeffler and her husband, New York ... \n", + "10 WMT if i had enough cash on hand i'd be shorti... \n", + "11 BAC Bank Of America Is The Best Bank Stock On ... \n", + "12 agree user: hedge funds sold AAP in Q4. We'll ... \n", + "13 user: Mr AAP is going to have to stop hanging ... \n", + "14 BAC Obama is slowing the rally... Ouch ! \n", + "15 A couple biotech stocks that are setting up we... \n", + "16 BAC next stop 10.50 \n", + "17 STEM continuing move up - possiby getting some... \n", + "18 CDX taking some off \n", + "19 AJ stopped out +6% for a nice gain \n", + "20 with FCX gapping well above ideal entry lookin... \n", + "21 Rupee Edges Lower To 76.43 Against Dollar Amid... \n", + "22 ACX Today's P reads very positive.Would like t... \n", + "23 KWK this one is heavily oversold here, think w... \n", + "24 user: GEVO the beginning of a new uptrend: \n", + "25 Health insurance stocks should hold up fairly ... \n", + "26 CBMX that is unbelievable!!!!!!! but I am happ... \n", + "27 Global markets rise following fresh signals th... \n", + "28 My SHOTS, various strats, AXDX CMCO DGIT D ECY... \n", + "29 this could be the last good chance to short AMZN \n", + "30 HFC - Great group. ooks good. More here -> \n", + "31 RT @WSJheard: Heard on the Street's @jackycwon... \n", + "32 MON How quickly investors forget the massive b... \n", + "33 EA if price doesn't hold above 9SMA then 16.71... \n", + "34 NKD well above the moving averages, look for s... \n", + "35 AAP looking to take some off around 429, shoul... \n", + "36 Selling ICE Short check out my video analysis \n", + "37 CAT Bingo, it is Bingo everywhere today. \n", + "38 HAO like it on a pop over 6 w vol \n", + "39 user: AAP nothing like firing of CEO to make i... \n", + "40 Coronavirus Crisis: GoAir Decides To Reduce Pa... \n", + "41 As the coronavirus pandemic intensifies, adher... \n", + "42 notable 52wk highs [20 > /sh < 50] AFCE AK ACO... \n", + "43 AAP PMI Manufacturing Index ---> In Few minute... \n", + "44 SPW pauses, SCTY continues its run, up > 20% i... \n", + "45 RT @josephttwallace: Glutted Oil Markets’ Ne... \n", + "46 GOOG keep in mind there are about 1,000 contra... \n", + "47 V and MA FYI: When they tagged the 50d's yeste... \n", + "48 GOOG holding up well \n", + "49 JPMorgan Chase Chief Executive James Dimon ret... \n", + "\n", + " sentence_embedding_small_bert_L2_128 sentiment \\\n", + "0 [-1.1575689315795898, 0.2715361416339874, -0.2... positive \n", + "1 [-1.3090834617614746, -0.1740988940000534, -0.... positive \n", + "2 [-1.189386248588562, 0.4811112582683563, -0.66... positive \n", + "3 [-0.6736384630203247, 0.7296571731567383, -0.1... positive \n", + "4 [-0.3878522217273712, 0.5501695275306702, -0.0... positive \n", + "5 [-0.31379231810569763, 0.5748125910758972, -0.... positive \n", + "6 [-0.5645806193351746, 0.6001827716827393, 0.08... positive \n", + "7 [-1.0190978050231934, 0.7494890093803406, 0.07... positive \n", + "8 [-0.2726511061191559, 0.32721856236457825, -0.... positive \n", + "9 [-0.28392985463142395, 1.012831449508667, -0.0... positive \n", + "10 [-1.1887261867523193, 0.9961069226264954, -0.4... positive \n", + "11 [0.3251396119594574, 0.9818293452262878, -0.51... positive \n", + "12 [-0.5504413843154907, 1.0578975677490234, -0.3... positive \n", + "13 [-0.5393702983856201, 1.2257893085479736, -0.2... positive \n", + "14 [-1.0150749683380127, 0.10769235342741013, -0.... positive \n", + "15 [-0.09664952009916306, -0.05535533279180527, -... positive \n", + "16 [-1.4360231161117554, 0.030535195022821426, -0... positive \n", + "17 [-0.6773928999900818, 0.3930101990699768, -0.6... positive \n", + "18 [-1.3559353351593018, 0.2133549153804779, -0.5... positive \n", + "19 [-1.078188419342041, -0.23945243656635284, -0.... positive \n", + "20 [-0.7907727956771851, 0.7457559108734131, -0.3... positive \n", + "21 [-0.41530898213386536, 0.15534837543964386, -0... positive \n", + "22 [-0.8882211446762085, 0.13111452758312225, 0.1... positive \n", + "23 [-0.4115653336048126, 0.23945458233356476, 0.2... positive \n", + "24 [-0.8558018207550049, 0.20911763608455658, -0.... positive \n", + "25 [-0.6992183327674866, 0.873347282409668, -0.33... positive \n", + "26 [-0.7398191690444946, 0.0032342064660042524, 0... positive \n", + "27 [-0.46590617299079895, 0.5152156949043274, -0.... positive \n", + "28 [-0.9121986627578735, 0.18954770267009735, 0.5... positive \n", + "29 [-1.4936555624008179, -0.08102501928806305, -0... positive \n", + "30 [-1.282071590423584, 0.452540785074234, -0.020... positive \n", + "31 [-0.16953450441360474, 0.5467158555984497, 0.4... positive \n", + "32 [-1.0020204782485962, 0.06035422161221504, -0.... positive \n", + "33 [-0.6850847005844116, 0.7942832708358765, -0.2... positive \n", + "34 [-1.168450117111206, 0.5925496816635132, -0.27... positive \n", + "35 [-0.9121736884117126, 0.7181501388549805, -0.6... positive \n", + "36 [-1.0185582637786865, 0.23524264991283417, -0.... positive \n", + "37 [-1.0476768016815186, -0.31251490116119385, 0.... positive \n", + "38 [-0.397280752658844, -0.7803610563278198, -0.0... positive \n", + "39 [0.2457299381494522, 0.9597267508506775, -0.56... positive \n", + "40 [-0.18016083538532257, 0.4278823137283325, -0.... positive \n", + "41 [-0.7261321544647217, -0.19837094843387604, -0... positive \n", + "42 [-1.047921895980835, 0.6981227993965149, 0.153... positive \n", + "43 [-0.7834053039550781, 0.5567207336425781, -0.6... positive \n", + "44 [-0.8796350955963135, 0.21304339170455933, -0.... positive \n", + "45 [-0.24904966354370117, 0.5449734926223755, 0.1... positive \n", + "46 [-0.6386780738830566, 0.6693974137306213, -0.7... positive \n", + "47 [-1.3859288692474365, 0.1374266892671585, -0.2... positive \n", + "48 [-0.9325542449951172, 0.7117096185684204, -0.2... positive \n", + "49 [-0.5751636624336243, 0.5106868147850037, -0.1... positive \n", + "\n", + " sentiment_confidence text \\\n", + "0 3.0 Taking profits on CMG from 321, not time to a ... \n", + "1 3.0 STI 5 min 1 - and 30 min opening range, added ... \n", + "2 2.0 ong EN with stop arnd 39.40- entry 40.10 \n", + "3 8.0 Adding short BWS to portfolio. I think next ye... \n", + "4 6.0 The banks for years rode consumer spending and... \n", + "5 3.0 of some of the most watched biotechs AMGN look... \n", + "6 7.0 GOOG here is the leader of the pack for the ri... \n", + "7 5.0 user another good read. keep em coming and tha... \n", + "8 1.0 GTXI long 5.16, will take early assuming no ga... \n", + "9 1.0 Sen. Kelly Loeffler and her husband, New York ... \n", + "10 1.0 WMT if i had enough cash on hand i'd be shorti... \n", + "11 2.0 BAC Bank Of America Is The Best Bank Stock On ... \n", + "12 5.0 agree user: hedge funds sold AAP in Q4. We'll ... \n", + "13 2.0 user: Mr AAP is going to have to stop hanging ... \n", + "14 2.0 BAC Obama is slowing the rally... Ouch ! \n", + "15 2.0 A couple biotech stocks that are setting up we... \n", + "16 2.0 BAC next stop 10.50 \n", + "17 4.0 STEM continuing move up - possiby getting some... \n", + "18 5.0 CDX taking some off \n", + "19 1.0 AJ stopped out +6% for a nice gain \n", + "20 2.0 with FCX gapping well above ideal entry lookin... \n", + "21 1.0 Rupee Edges Lower To 76.43 Against Dollar Amid... \n", + "22 4.0 ACX Today's P reads very positive.Would like t... \n", + "23 2.0 KWK this one is heavily oversold here, think w... \n", + "24 7.0 user: GEVO the beginning of a new uptrend: \n", + "25 1.0 Health insurance stocks should hold up fairly ... \n", + "26 5.0 CBMX that is unbelievable!!!!!!! but I am hap... \n", + "27 5.0 Global markets rise following fresh signals th... \n", + "28 8.0 My SHOTS, various strats, AXDX CMCO DGIT D ECY... \n", + "29 5.0 this could be the last good chance to short AMZN \n", + "30 1.0 HFC - Great group. ooks good. More here -> \n", + "31 2.0 RT @WSJheard: Heard on the Street's @jackycwon... \n", + "32 2.0 MON How quickly investors forget the massive b... \n", + "33 2.0 EA if price doesn't hold above 9SMA then 16.71... \n", + "34 3.0 NKD well above the moving averages, look for s... \n", + "35 2.0 AAP looking to take some off around 429, shoul... \n", + "36 1.0 Selling ICE Short check out my video analysis \n", + "37 1.0 CAT Bingo, it is Bingo everywhere today. \n", + "38 7.0 HAO like it on a pop over 6 w vol \n", + "39 2.0 user: AAP nothing like firing of CEO to make i... \n", + "40 7.0 Coronavirus Crisis: GoAir Decides To Reduce Pa... \n", + "41 3.0 As the coronavirus pandemic intensifies, adher... \n", + "42 2.0 notable 52wk highs [20 > /sh < 50] AFCE AK ACO... \n", + "43 6.0 AAP PMI Manufacturing Index ---> In Few minute... \n", + "44 1.0 SPW pauses, SCTY continues its run, up > 20% i... \n", + "45 1.0 RT @josephttwallace: Glutted Oil Markets’ Ne... \n", + "46 3.0 GOOG keep in mind there are about 1,000 contra... \n", + "47 2.0 V and MA FYI: When they tagged the 50d's yeste... \n", + "48 4.0 GOOG holding up well \n", + "49 3.0 JPMorgan Chase Chief Executive James Dimon ret... \n", + "\n", + " y \n", + "0 positive \n", + "1 positive \n", + "2 positive \n", + "3 negative \n", + "4 negative \n", + "5 positive \n", + "6 negative \n", + "7 negative \n", + "8 positive \n", + "9 positive \n", + "10 negative \n", + "11 positive \n", + "12 positive \n", + "13 positive \n", + "14 negative \n", + "15 positive \n", + "16 negative \n", + "17 positive \n", + "18 positive \n", + "19 positive \n", + "20 positive \n", + "21 negative \n", + "22 positive \n", + "23 positive \n", + "24 positive \n", + "25 negative \n", + "26 positive \n", + "27 positive \n", + "28 negative \n", + "29 negative \n", + "30 positive \n", + "31 positive \n", + "32 positive \n", + "33 positive \n", + "34 positive \n", + "35 positive \n", + "36 negative \n", + "37 positive \n", + "38 positive \n", + "39 positive \n", + "40 negative \n", + "41 negative \n", + "42 positive \n", + "43 negative \n", + "44 positive \n", + "45 negative \n", + "46 negative \n", + "47 positive \n", + "48 positive \n", + "49 positive " + ], + "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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + "
documentsentence_embedding_small_bert_L2_128sentimentsentiment_confidencetexty
0Taking profits on CMG from 321, not time to a ...[-1.1575689315795898, 0.2715361416339874, -0.2...positive3.0Taking profits on CMG from 321, not time to a ...positive
1STI 5 min 1 - and 30 min opening range, added ...[-1.3090834617614746, -0.1740988940000534, -0....positive3.0STI 5 min 1 - and 30 min opening range, added ...positive
2ong EN with stop arnd 39.40- entry 40.10[-1.189386248588562, 0.4811112582683563, -0.66...positive2.0ong EN with stop arnd 39.40- entry 40.10positive
3Adding short BWS to portfolio. I think next ye...[-0.6736384630203247, 0.7296571731567383, -0.1...positive8.0Adding short BWS to portfolio. I think next ye...negative
4The banks for years rode consumer spending and...[-0.3878522217273712, 0.5501695275306702, -0.0...positive6.0The banks for years rode consumer spending and...negative
5of some of the most watched biotechs AMGN look...[-0.31379231810569763, 0.5748125910758972, -0....positive3.0of some of the most watched biotechs AMGN look...positive
6GOOG here is the leader of the pack for the ri...[-0.5645806193351746, 0.6001827716827393, 0.08...positive7.0GOOG here is the leader of the pack for the ri...negative
7user another good read. keep em coming and tha...[-1.0190978050231934, 0.7494890093803406, 0.07...positive5.0user another good read. keep em coming and tha...negative
8GTXI long 5.16, will take early assuming no ga...[-0.2726511061191559, 0.32721856236457825, -0....positive1.0GTXI long 5.16, will take early assuming no ga...positive
9Sen. Kelly Loeffler and her husband, New York ...[-0.28392985463142395, 1.012831449508667, -0.0...positive1.0Sen. Kelly Loeffler and her husband, New York ...positive
10WMT if i had enough cash on hand i'd be shorti...[-1.1887261867523193, 0.9961069226264954, -0.4...positive1.0WMT if i had enough cash on hand i'd be shorti...negative
11BAC Bank Of America Is The Best Bank Stock On ...[0.3251396119594574, 0.9818293452262878, -0.51...positive2.0BAC Bank Of America Is The Best Bank Stock On ...positive
12agree user: hedge funds sold AAP in Q4. We'll ...[-0.5504413843154907, 1.0578975677490234, -0.3...positive5.0agree user: hedge funds sold AAP in Q4. We'll ...positive
13user: Mr AAP is going to have to stop hanging ...[-0.5393702983856201, 1.2257893085479736, -0.2...positive2.0user: Mr AAP is going to have to stop hanging ...positive
14BAC Obama is slowing the rally... Ouch ![-1.0150749683380127, 0.10769235342741013, -0....positive2.0BAC Obama is slowing the rally... Ouch !negative
15A couple biotech stocks that are setting up we...[-0.09664952009916306, -0.05535533279180527, -...positive2.0A couple biotech stocks that are setting up we...positive
16BAC next stop 10.50[-1.4360231161117554, 0.030535195022821426, -0...positive2.0BAC next stop 10.50negative
17STEM continuing move up - possiby getting some...[-0.6773928999900818, 0.3930101990699768, -0.6...positive4.0STEM continuing move up - possiby getting some...positive
18CDX taking some off[-1.3559353351593018, 0.2133549153804779, -0.5...positive5.0CDX taking some offpositive
19AJ stopped out +6% for a nice gain[-1.078188419342041, -0.23945243656635284, -0....positive1.0AJ stopped out +6% for a nice gainpositive
20with FCX gapping well above ideal entry lookin...[-0.7907727956771851, 0.7457559108734131, -0.3...positive2.0with FCX gapping well above ideal entry lookin...positive
21Rupee Edges Lower To 76.43 Against Dollar Amid...[-0.41530898213386536, 0.15534837543964386, -0...positive1.0Rupee Edges Lower To 76.43 Against Dollar Amid...negative
22ACX Today's P reads very positive.Would like t...[-0.8882211446762085, 0.13111452758312225, 0.1...positive4.0ACX Today's P reads very positive.Would like t...positive
23KWK this one is heavily oversold here, think w...[-0.4115653336048126, 0.23945458233356476, 0.2...positive2.0KWK this one is heavily oversold here, think w...positive
24user: GEVO the beginning of a new uptrend:[-0.8558018207550049, 0.20911763608455658, -0....positive7.0user: GEVO the beginning of a new uptrend:positive
25Health insurance stocks should hold up fairly ...[-0.6992183327674866, 0.873347282409668, -0.33...positive1.0Health insurance stocks should hold up fairly ...negative
26CBMX that is unbelievable!!!!!!! but I am happ...[-0.7398191690444946, 0.0032342064660042524, 0...positive5.0CBMX that is unbelievable!!!!!!! but I am hap...positive
27Global markets rise following fresh signals th...[-0.46590617299079895, 0.5152156949043274, -0....positive5.0Global markets rise following fresh signals th...positive
28My SHOTS, various strats, AXDX CMCO DGIT D ECY...[-0.9121986627578735, 0.18954770267009735, 0.5...positive8.0My SHOTS, various strats, AXDX CMCO DGIT D ECY...negative
29this could be the last good chance to short AMZN[-1.4936555624008179, -0.08102501928806305, -0...positive5.0this could be the last good chance to short AMZNnegative
30HFC - Great group. ooks good. More here ->[-1.282071590423584, 0.452540785074234, -0.020...positive1.0HFC - Great group. ooks good. More here ->positive
31RT @WSJheard: Heard on the Street's @jackycwon...[-0.16953450441360474, 0.5467158555984497, 0.4...positive2.0RT @WSJheard: Heard on the Street's @jackycwon...positive
32MON How quickly investors forget the massive b...[-1.0020204782485962, 0.06035422161221504, -0....positive2.0MON How quickly investors forget the massive b...positive
33EA if price doesn't hold above 9SMA then 16.71...[-0.6850847005844116, 0.7942832708358765, -0.2...positive2.0EA if price doesn't hold above 9SMA then 16.71...positive
34NKD well above the moving averages, look for s...[-1.168450117111206, 0.5925496816635132, -0.27...positive3.0NKD well above the moving averages, look for s...positive
35AAP looking to take some off around 429, shoul...[-0.9121736884117126, 0.7181501388549805, -0.6...positive2.0AAP looking to take some off around 429, shoul...positive
36Selling ICE Short check out my video analysis[-1.0185582637786865, 0.23524264991283417, -0....positive1.0Selling ICE Short check out my video analysisnegative
37CAT Bingo, it is Bingo everywhere today.[-1.0476768016815186, -0.31251490116119385, 0....positive1.0CAT Bingo, it is Bingo everywhere today.positive
38HAO like it on a pop over 6 w vol[-0.397280752658844, -0.7803610563278198, -0.0...positive7.0HAO like it on a pop over 6 w volpositive
39user: AAP nothing like firing of CEO to make i...[0.2457299381494522, 0.9597267508506775, -0.56...positive2.0user: AAP nothing like firing of CEO to make i...positive
40Coronavirus Crisis: GoAir Decides To Reduce Pa...[-0.18016083538532257, 0.4278823137283325, -0....positive7.0Coronavirus Crisis: GoAir Decides To Reduce Pa...negative
41As the coronavirus pandemic intensifies, adher...[-0.7261321544647217, -0.19837094843387604, -0...positive3.0As the coronavirus pandemic intensifies, adher...negative
42notable 52wk highs [20 > /sh < 50] AFCE AK ACO...[-1.047921895980835, 0.6981227993965149, 0.153...positive2.0notable 52wk highs [20 > /sh < 50] AFCE AK ACO...positive
43AAP PMI Manufacturing Index ---> In Few minute...[-0.7834053039550781, 0.5567207336425781, -0.6...positive6.0AAP PMI Manufacturing Index ---> In Few minute...negative
44SPW pauses, SCTY continues its run, up > 20% i...[-0.8796350955963135, 0.21304339170455933, -0....positive1.0SPW pauses, SCTY continues its run, up > 20% i...positive
45RT @josephttwallace: Glutted Oil Markets’ Ne...[-0.24904966354370117, 0.5449734926223755, 0.1...positive1.0RT @josephttwallace: Glutted Oil Markets’ Ne...negative
46GOOG keep in mind there are about 1,000 contra...[-0.6386780738830566, 0.6693974137306213, -0.7...positive3.0GOOG keep in mind there are about 1,000 contra...negative
47V and MA FYI: When they tagged the 50d's yeste...[-1.3859288692474365, 0.1374266892671585, -0.2...positive2.0V and MA FYI: When they tagged the 50d's yeste...positive
48GOOG holding up well[-0.9325542449951172, 0.7117096185684204, -0.2...positive4.0GOOG holding up wellpositive
49JPMorgan Chase Chief Executive James Dimon ret...[-0.5751636624336243, 0.5106868147850037, -0.1...positive3.0JPMorgan Chase Chief Executive James Dimon ret...positive
\n", + "
\n", + "
\n", + "\n", + "
\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "
\n", + "\n", + "\n", + "
\n", + " \n", + "\n", + "\n", + "\n", + " \n", + "
\n", + "
\n", + "
\n" + ] + }, + "metadata": {}, + "execution_count": 6 + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "lVyOE2wV0fw_" + }, + "source": [ + "# 4. Test the fitted pipe on new example" + ] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 150 + }, + "id": "qdCUg2MR0PD2", + "outputId": "3c226560-fe14-42eb-e537-0535e6d0819f" + }, + "source": [ + "fitted_pipe.predict(\"Bitcoin dropped by 50 percent!\")" + ], + "execution_count": 7, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "sentence_detector_dl download started this may take some time.\n", + "Approximate size to download 354.6 KB\n", + "[OK!]\n", + "Warning::Spark Session already created, some configs may not take.\n" + ] + }, + { + "output_type": "execute_result", + "data": { + "text/plain": [ + " sentence \\\n", + "0 Bitcoin dropped by 50 percent! \n", + "\n", + " sentence_embedding_small_bert_L2_128 sentiment \\\n", + "0 [-1.7797279357910156, 0.3090762495994568, -0.2... positive \n", + "\n", + " sentiment_confidence \n", + "0 1.0 " + ], + "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", + "
sentencesentence_embedding_small_bert_L2_128sentimentsentiment_confidence
0Bitcoin dropped by 50 percent![-1.7797279357910156, 0.3090762495994568, -0.2...positive1.0
\n", + "
\n", + "
\n", + "\n", + "
\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "
\n", + "\n", + "
\n", + "
\n" + ] + }, + "metadata": {}, + "execution_count": 7 + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "xflpwrVjjBVD" + }, + "source": [ + "## 5. Configure pipe training parameters" + ] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "UtsAUGTmOTms", + "outputId": "f9404635-50b4-4278-b7e1-95f0c05692ff" + }, + "source": [ + "trainable_pipe.print_info()" + ], + "execution_count": 8, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "The following parameters are configurable for this NLU pipeline (You can copy paste the examples) :\n", + ">>> component_list['bert_sentence_embeddings@sent_small_bert_L2_128'] has settable params:\n", + "component_list['bert_sentence_embeddings@sent_small_bert_L2_128'].setBatchSize(8) | Info: Size of every batch | Currently set to : 8\n", + "component_list['bert_sentence_embeddings@sent_small_bert_L2_128'].setEngine('tensorflow') | Info: Deep Learning engine used for this model | Currently set to : tensorflow\n", + "component_list['bert_sentence_embeddings@sent_small_bert_L2_128'].setIsLong(False) | Info: Use Long type instead of Int type for inputs buffer - Some Bert models require Long instead of Int. | Currently set to : False\n", + "component_list['bert_sentence_embeddings@sent_small_bert_L2_128'].setMaxSentenceLength(128) | Info: Max sentence length to process | Currently set to : 128\n", + "component_list['bert_sentence_embeddings@sent_small_bert_L2_128'].setDimension(128) | Info: Number of embedding dimensions | Currently set to : 128\n", + "component_list['bert_sentence_embeddings@sent_small_bert_L2_128'].setCaseSensitive(False) | Info: whether to ignore case in tokens for embeddings matching | Currently set to : False\n", + "component_list['bert_sentence_embeddings@sent_small_bert_L2_128'].setStorageRef('sent_small_bert_L2_128') | Info: unique reference name for identification | Currently set to : sent_small_bert_L2_128\n", + ">>> component_list['document_assembler'] has settable params:\n", + "component_list['document_assembler'].setCleanupMode('shrink') | Info: possible values: disabled, inplace, inplace_full, shrink, shrink_full, each, each_full, delete_full | Currently set to : shrink\n", + ">>> component_list['sentiment_dl@sent_small_bert_L2_128'] has settable params:\n", + "component_list['sentiment_dl@sent_small_bert_L2_128'].setEngine('tensorflow') | Info: Deep Learning engine used for this model | Currently set to : tensorflow\n", + "component_list['sentiment_dl@sent_small_bert_L2_128'].setThreshold(0.6) | Info: The minimum threshold for the final result otheriwse it will be neutral | Currently set to : 0.6\n", + "component_list['sentiment_dl@sent_small_bert_L2_128'].setThresholdLabel('neutral') | Info: In case the score is less than threshold, what should be the label. Default is neutral. | Currently set to : neutral\n", + "component_list['sentiment_dl@sent_small_bert_L2_128'].setStorageRef('sent_small_bert_L2_128') | Info: unique reference name for identification | Currently set to : sent_small_bert_L2_128\n" + ] + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "2GJdDNV9jEIe" + }, + "source": [ + "## 6. Retrain with new parameters" + ] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 1000 + }, + "id": "mptfvHx-MMMX", + "outputId": "bf0f4962-bb67-4c9a-c92c-96b64cbfdf51" + }, + "source": [ + "# Train longer!\n", + "trainable_pipe = nlp.load('train.sentiment')\n", + "trainable_pipe['trainable_sentiment_dl'].setMaxEpochs(5)\n", + "fitted_pipe = trainable_pipe.fit(train_df.iloc[:50])\n", + "# predict with the trainable pipeline on dataset and get predictions\n", + "preds = fitted_pipe.predict(train_df.iloc[:50],output_level='document')\n", + "\n", + "#sentence detector that is part of the pipe generates sone NaNs. lets drop them first\n", + "preds.dropna(inplace=True)\n", + "print(classification_report(preds['y'], preds['sentiment']))\n", + "\n", + "preds" + ], + "execution_count": 9, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Warning::Spark Session already created, some configs may not take.\n", + "Warning::Spark Session already created, some configs may not take.\n", + "sent_small_bert_L2_128 download started this may take some time.\n", + "Approximate size to download 16.1 MB\n", + "[OK!]\n" + ] + }, + { + "output_type": "stream", + "name": "stderr", + "text": [ + "/usr/local/lib/python3.10/dist-packages/nlu/pipe/pipeline.py:149: SettingWithCopyWarning: \n", + "A value is trying to be set on a copy of a slice from a DataFrame.\n", + "Try using .loc[row_indexer,col_indexer] = value instead\n", + "\n", + "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n", + " dataset.y = dataset.y.apply(str)\n", + "/usr/local/lib/python3.10/dist-packages/nlu/pipe/utils/data_conversion_utils.py:160: SettingWithCopyWarning: \n", + "A value is trying to be set on a copy of a slice from a DataFrame.\n", + "Try using .loc[row_indexer,col_indexer] = value instead\n", + "\n", + "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n", + " data['origin_index'] = data.index\n", + "/usr/local/lib/python3.10/dist-packages/nlu/pipe/utils/data_conversion_utils.py:160: SettingWithCopyWarning: \n", + "A value is trying to be set on a copy of a slice from a DataFrame.\n", + "Try using .loc[row_indexer,col_indexer] = value instead\n", + "\n", + "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n", + " data['origin_index'] = data.index\n" + ] + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + " precision recall f1-score support\n", + "\n", + " negative 0.00 0.00 0.00 17\n", + " positive 0.66 1.00 0.80 33\n", + "\n", + " accuracy 0.66 50\n", + " macro avg 0.33 0.50 0.40 50\n", + "weighted avg 0.44 0.66 0.52 50\n", + "\n" + ] + }, + { + "output_type": "stream", + "name": "stderr", + "text": [ + "/usr/local/lib/python3.10/dist-packages/nlu/pipe/extractors/extractor_methods/base_extractor_methods.py:356: SettingWithCopyWarning: \n", + "A value is trying to be set on a copy of a slice from a DataFrame.\n", + "Try using .loc[row_indexer,col_indexer] = value instead\n", + "\n", + "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n", + " df[cols_to_explode] = df[cols_to_explode].apply(pad_same_level_cols, axis=1)\n", + "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/_classification.py:1344: UndefinedMetricWarning: Precision and F-score are ill-defined and being set to 0.0 in labels with no predicted samples. Use `zero_division` parameter to control this behavior.\n", + " _warn_prf(average, modifier, msg_start, len(result))\n", + "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/_classification.py:1344: UndefinedMetricWarning: Precision and F-score are ill-defined and being set to 0.0 in labels with no predicted samples. Use `zero_division` parameter to control this behavior.\n", + " _warn_prf(average, modifier, msg_start, len(result))\n", + "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/_classification.py:1344: UndefinedMetricWarning: Precision and F-score are ill-defined and being set to 0.0 in labels with no predicted samples. Use `zero_division` parameter to control this behavior.\n", + " _warn_prf(average, modifier, msg_start, len(result))\n" + ] + }, + { + "output_type": "execute_result", + "data": { + "text/plain": [ + " document \\\n", + "0 Taking profits on CMG from 321, not time to a ... \n", + "1 STI 5 min 1 - and 30 min opening range, added ... \n", + "2 ong EN with stop arnd 39.40- entry 40.10 \n", + "3 Adding short BWS to portfolio. I think next ye... \n", + "4 The banks for years rode consumer spending and... \n", + "5 of some of the most watched biotechs AMGN look... \n", + "6 GOOG here is the leader of the pack for the ri... \n", + "7 user another good read. keep em coming and tha... \n", + "8 GTXI long 5.16, will take early assuming no ga... \n", + "9 Sen. Kelly Loeffler and her husband, New York ... \n", + "10 WMT if i had enough cash on hand i'd be shorti... \n", + "11 BAC Bank Of America Is The Best Bank Stock On ... \n", + "12 agree user: hedge funds sold AAP in Q4. We'll ... \n", + "13 user: Mr AAP is going to have to stop hanging ... \n", + "14 BAC Obama is slowing the rally... Ouch ! \n", + "15 A couple biotech stocks that are setting up we... \n", + "16 BAC next stop 10.50 \n", + "17 STEM continuing move up - possiby getting some... \n", + "18 CDX taking some off \n", + "19 AJ stopped out +6% for a nice gain \n", + "20 with FCX gapping well above ideal entry lookin... \n", + "21 Rupee Edges Lower To 76.43 Against Dollar Amid... \n", + "22 ACX Today's P reads very positive.Would like t... \n", + "23 KWK this one is heavily oversold here, think w... \n", + "24 user: GEVO the beginning of a new uptrend: \n", + "25 Health insurance stocks should hold up fairly ... \n", + "26 CBMX that is unbelievable!!!!!!! but I am happ... \n", + "27 Global markets rise following fresh signals th... \n", + "28 My SHOTS, various strats, AXDX CMCO DGIT D ECY... \n", + "29 this could be the last good chance to short AMZN \n", + "30 HFC - Great group. ooks good. More here -> \n", + "31 RT @WSJheard: Heard on the Street's @jackycwon... \n", + "32 MON How quickly investors forget the massive b... \n", + "33 EA if price doesn't hold above 9SMA then 16.71... \n", + "34 NKD well above the moving averages, look for s... \n", + "35 AAP looking to take some off around 429, shoul... \n", + "36 Selling ICE Short check out my video analysis \n", + "37 CAT Bingo, it is Bingo everywhere today. \n", + "38 HAO like it on a pop over 6 w vol \n", + "39 user: AAP nothing like firing of CEO to make i... \n", + "40 Coronavirus Crisis: GoAir Decides To Reduce Pa... \n", + "41 As the coronavirus pandemic intensifies, adher... \n", + "42 notable 52wk highs [20 > /sh < 50] AFCE AK ACO... \n", + "43 AAP PMI Manufacturing Index ---> In Few minute... \n", + "44 SPW pauses, SCTY continues its run, up > 20% i... \n", + "45 RT @josephttwallace: Glutted Oil Markets’ Ne... \n", + "46 GOOG keep in mind there are about 1,000 contra... \n", + "47 V and MA FYI: When they tagged the 50d's yeste... \n", + "48 GOOG holding up well \n", + "49 JPMorgan Chase Chief Executive James Dimon ret... \n", + "\n", + " sentence_embedding_small_bert_L2_128 sentiment \\\n", + "0 [-1.1575689315795898, 0.2715361416339874, -0.2... positive \n", + "1 [-1.3090834617614746, -0.1740988940000534, -0.... positive \n", + "2 [-1.189386248588562, 0.4811112582683563, -0.66... positive \n", + "3 [-0.6736384630203247, 0.7296571731567383, -0.1... positive \n", + "4 [-0.3878522217273712, 0.5501695275306702, -0.0... positive \n", + "5 [-0.31379231810569763, 0.5748125910758972, -0.... positive \n", + "6 [-0.5645806193351746, 0.6001827716827393, 0.08... positive \n", + "7 [-1.0190978050231934, 0.7494890093803406, 0.07... positive \n", + "8 [-0.2726511061191559, 0.32721856236457825, -0.... positive \n", + "9 [-0.28392985463142395, 1.012831449508667, -0.0... positive \n", + "10 [-1.1887261867523193, 0.9961069226264954, -0.4... positive \n", + "11 [0.3251396119594574, 0.9818293452262878, -0.51... positive \n", + "12 [-0.5504413843154907, 1.0578975677490234, -0.3... positive \n", + "13 [-0.5393702983856201, 1.2257893085479736, -0.2... positive \n", + "14 [-1.0150749683380127, 0.10769235342741013, -0.... positive \n", + "15 [-0.09664952009916306, -0.05535533279180527, -... positive \n", + "16 [-1.4360231161117554, 0.030535195022821426, -0... positive \n", + "17 [-0.6773928999900818, 0.3930101990699768, -0.6... positive \n", + "18 [-1.3559353351593018, 0.2133549153804779, -0.5... positive \n", + "19 [-1.078188419342041, -0.23945243656635284, -0.... positive \n", + "20 [-0.7907727956771851, 0.7457559108734131, -0.3... positive \n", + "21 [-0.41530898213386536, 0.15534837543964386, -0... positive \n", + "22 [-0.8882211446762085, 0.13111452758312225, 0.1... positive \n", + "23 [-0.4115653336048126, 0.23945458233356476, 0.2... positive \n", + "24 [-0.8558018207550049, 0.20911763608455658, -0.... positive \n", + "25 [-0.6992183327674866, 0.873347282409668, -0.33... positive \n", + "26 [-0.7398191690444946, 0.0032342064660042524, 0... positive \n", + "27 [-0.46590617299079895, 0.5152156949043274, -0.... positive \n", + "28 [-0.9121986627578735, 0.18954770267009735, 0.5... positive \n", + "29 [-1.4936555624008179, -0.08102501928806305, -0... positive \n", + "30 [-1.282071590423584, 0.452540785074234, -0.020... positive \n", + "31 [-0.16953450441360474, 0.5467158555984497, 0.4... positive \n", + "32 [-1.0020204782485962, 0.06035422161221504, -0.... positive \n", + "33 [-0.6850847005844116, 0.7942832708358765, -0.2... positive \n", + "34 [-1.168450117111206, 0.5925496816635132, -0.27... positive \n", + "35 [-0.9121736884117126, 0.7181501388549805, -0.6... positive \n", + "36 [-1.0185582637786865, 0.23524264991283417, -0.... positive \n", + "37 [-1.0476768016815186, -0.31251490116119385, 0.... positive \n", + "38 [-0.397280752658844, -0.7803610563278198, -0.0... positive \n", + "39 [0.2457299381494522, 0.9597267508506775, -0.56... positive \n", + "40 [-0.18016083538532257, 0.4278823137283325, -0.... positive \n", + "41 [-0.7261321544647217, -0.19837094843387604, -0... positive \n", + "42 [-1.047921895980835, 0.6981227993965149, 0.153... positive \n", + "43 [-0.7834053039550781, 0.5567207336425781, -0.6... positive \n", + "44 [-0.8796350955963135, 0.21304339170455933, -0.... positive \n", + "45 [-0.24904966354370117, 0.5449734926223755, 0.1... positive \n", + "46 [-0.6386780738830566, 0.6693974137306213, -0.7... positive \n", + "47 [-1.3859288692474365, 0.1374266892671585, -0.2... positive \n", + "48 [-0.9325542449951172, 0.7117096185684204, -0.2... positive \n", + "49 [-0.5751636624336243, 0.5106868147850037, -0.1... positive \n", + "\n", + " sentiment_confidence text \\\n", + "0 4.0 Taking profits on CMG from 321, not time to a ... \n", + "1 7.0 STI 5 min 1 - and 30 min opening range, added ... \n", + "2 4.0 ong EN with stop arnd 39.40- entry 40.10 \n", + "3 7.0 Adding short BWS to portfolio. I think next ye... \n", + "4 4.0 The banks for years rode consumer spending and... \n", + "5 1.0 of some of the most watched biotechs AMGN look... \n", + "6 5.0 GOOG here is the leader of the pack for the ri... \n", + "7 1.0 user another good read. keep em coming and tha... \n", + "8 7.0 GTXI long 5.16, will take early assuming no ga... \n", + "9 1.0 Sen. Kelly Loeffler and her husband, New York ... \n", + "10 9.0 WMT if i had enough cash on hand i'd be shorti... \n", + "11 9.0 BAC Bank Of America Is The Best Bank Stock On ... \n", + "12 3.0 agree user: hedge funds sold AAP in Q4. We'll ... \n", + "13 2.0 user: Mr AAP is going to have to stop hanging ... \n", + "14 1.0 BAC Obama is slowing the rally... Ouch ! \n", + "15 5.0 A couple biotech stocks that are setting up we... \n", + "16 1.0 BAC next stop 10.50 \n", + "17 8.0 STEM continuing move up - possiby getting some... \n", + "18 1.0 CDX taking some off \n", + "19 5.0 AJ stopped out +6% for a nice gain \n", + "20 4.0 with FCX gapping well above ideal entry lookin... \n", + "21 4.0 Rupee Edges Lower To 76.43 Against Dollar Amid... \n", + "22 1.0 ACX Today's P reads very positive.Would like t... \n", + "23 2.0 KWK this one is heavily oversold here, think w... \n", + "24 8.0 user: GEVO the beginning of a new uptrend: \n", + "25 4.0 Health insurance stocks should hold up fairly ... \n", + "26 2.0 CBMX that is unbelievable!!!!!!! but I am hap... \n", + "27 4.0 Global markets rise following fresh signals th... \n", + "28 3.0 My SHOTS, various strats, AXDX CMCO DGIT D ECY... \n", + "29 1.0 this could be the last good chance to short AMZN \n", + "30 6.0 HFC - Great group. ooks good. More here -> \n", + "31 3.0 RT @WSJheard: Heard on the Street's @jackycwon... \n", + "32 2.0 MON How quickly investors forget the massive b... \n", + "33 2.0 EA if price doesn't hold above 9SMA then 16.71... \n", + "34 7.0 NKD well above the moving averages, look for s... \n", + "35 8.0 AAP looking to take some off around 429, shoul... \n", + "36 1.0 Selling ICE Short check out my video analysis \n", + "37 1.0 CAT Bingo, it is Bingo everywhere today. \n", + "38 2.0 HAO like it on a pop over 6 w vol \n", + "39 4.0 user: AAP nothing like firing of CEO to make i... \n", + "40 8.0 Coronavirus Crisis: GoAir Decides To Reduce Pa... \n", + "41 6.0 As the coronavirus pandemic intensifies, adher... \n", + "42 7.0 notable 52wk highs [20 > /sh < 50] AFCE AK ACO... \n", + "43 7.0 AAP PMI Manufacturing Index ---> In Few minute... \n", + "44 3.0 SPW pauses, SCTY continues its run, up > 20% i... \n", + "45 2.0 RT @josephttwallace: Glutted Oil Markets’ Ne... \n", + "46 4.0 GOOG keep in mind there are about 1,000 contra... \n", + "47 1.0 V and MA FYI: When they tagged the 50d's yeste... \n", + "48 2.0 GOOG holding up well \n", + "49 6.0 JPMorgan Chase Chief Executive James Dimon ret... \n", + "\n", + " y \n", + "0 positive \n", + "1 positive \n", + "2 positive \n", + "3 negative \n", + "4 negative \n", + "5 positive \n", + "6 negative \n", + "7 negative \n", + "8 positive \n", + "9 positive \n", + "10 negative \n", + "11 positive \n", + "12 positive \n", + "13 positive \n", + "14 negative \n", + "15 positive \n", + "16 negative \n", + "17 positive \n", + "18 positive \n", + "19 positive \n", + "20 positive \n", + "21 negative \n", + "22 positive \n", + "23 positive \n", + "24 positive \n", + "25 negative \n", + "26 positive \n", + "27 positive \n", + "28 negative \n", + "29 negative \n", + "30 positive \n", + "31 positive \n", + "32 positive \n", + "33 positive \n", + "34 positive \n", + "35 positive \n", + "36 negative \n", + "37 positive \n", + "38 positive \n", + "39 positive \n", + "40 negative \n", + "41 negative \n", + "42 positive \n", + "43 negative \n", + "44 positive \n", + "45 negative \n", + "46 negative \n", + "47 positive \n", + "48 positive \n", + "49 positive " + ], + "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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + "
documentsentence_embedding_small_bert_L2_128sentimentsentiment_confidencetexty
0Taking profits on CMG from 321, not time to a ...[-1.1575689315795898, 0.2715361416339874, -0.2...positive4.0Taking profits on CMG from 321, not time to a ...positive
1STI 5 min 1 - and 30 min opening range, added ...[-1.3090834617614746, -0.1740988940000534, -0....positive7.0STI 5 min 1 - and 30 min opening range, added ...positive
2ong EN with stop arnd 39.40- entry 40.10[-1.189386248588562, 0.4811112582683563, -0.66...positive4.0ong EN with stop arnd 39.40- entry 40.10positive
3Adding short BWS to portfolio. I think next ye...[-0.6736384630203247, 0.7296571731567383, -0.1...positive7.0Adding short BWS to portfolio. I think next ye...negative
4The banks for years rode consumer spending and...[-0.3878522217273712, 0.5501695275306702, -0.0...positive4.0The banks for years rode consumer spending and...negative
5of some of the most watched biotechs AMGN look...[-0.31379231810569763, 0.5748125910758972, -0....positive1.0of some of the most watched biotechs AMGN look...positive
6GOOG here is the leader of the pack for the ri...[-0.5645806193351746, 0.6001827716827393, 0.08...positive5.0GOOG here is the leader of the pack for the ri...negative
7user another good read. keep em coming and tha...[-1.0190978050231934, 0.7494890093803406, 0.07...positive1.0user another good read. keep em coming and tha...negative
8GTXI long 5.16, will take early assuming no ga...[-0.2726511061191559, 0.32721856236457825, -0....positive7.0GTXI long 5.16, will take early assuming no ga...positive
9Sen. Kelly Loeffler and her husband, New York ...[-0.28392985463142395, 1.012831449508667, -0.0...positive1.0Sen. Kelly Loeffler and her husband, New York ...positive
10WMT if i had enough cash on hand i'd be shorti...[-1.1887261867523193, 0.9961069226264954, -0.4...positive9.0WMT if i had enough cash on hand i'd be shorti...negative
11BAC Bank Of America Is The Best Bank Stock On ...[0.3251396119594574, 0.9818293452262878, -0.51...positive9.0BAC Bank Of America Is The Best Bank Stock On ...positive
12agree user: hedge funds sold AAP in Q4. We'll ...[-0.5504413843154907, 1.0578975677490234, -0.3...positive3.0agree user: hedge funds sold AAP in Q4. We'll ...positive
13user: Mr AAP is going to have to stop hanging ...[-0.5393702983856201, 1.2257893085479736, -0.2...positive2.0user: Mr AAP is going to have to stop hanging ...positive
14BAC Obama is slowing the rally... Ouch ![-1.0150749683380127, 0.10769235342741013, -0....positive1.0BAC Obama is slowing the rally... Ouch !negative
15A couple biotech stocks that are setting up we...[-0.09664952009916306, -0.05535533279180527, -...positive5.0A couple biotech stocks that are setting up we...positive
16BAC next stop 10.50[-1.4360231161117554, 0.030535195022821426, -0...positive1.0BAC next stop 10.50negative
17STEM continuing move up - possiby getting some...[-0.6773928999900818, 0.3930101990699768, -0.6...positive8.0STEM continuing move up - possiby getting some...positive
18CDX taking some off[-1.3559353351593018, 0.2133549153804779, -0.5...positive1.0CDX taking some offpositive
19AJ stopped out +6% for a nice gain[-1.078188419342041, -0.23945243656635284, -0....positive5.0AJ stopped out +6% for a nice gainpositive
20with FCX gapping well above ideal entry lookin...[-0.7907727956771851, 0.7457559108734131, -0.3...positive4.0with FCX gapping well above ideal entry lookin...positive
21Rupee Edges Lower To 76.43 Against Dollar Amid...[-0.41530898213386536, 0.15534837543964386, -0...positive4.0Rupee Edges Lower To 76.43 Against Dollar Amid...negative
22ACX Today's P reads very positive.Would like t...[-0.8882211446762085, 0.13111452758312225, 0.1...positive1.0ACX Today's P reads very positive.Would like t...positive
23KWK this one is heavily oversold here, think w...[-0.4115653336048126, 0.23945458233356476, 0.2...positive2.0KWK this one is heavily oversold here, think w...positive
24user: GEVO the beginning of a new uptrend:[-0.8558018207550049, 0.20911763608455658, -0....positive8.0user: GEVO the beginning of a new uptrend:positive
25Health insurance stocks should hold up fairly ...[-0.6992183327674866, 0.873347282409668, -0.33...positive4.0Health insurance stocks should hold up fairly ...negative
26CBMX that is unbelievable!!!!!!! but I am happ...[-0.7398191690444946, 0.0032342064660042524, 0...positive2.0CBMX that is unbelievable!!!!!!! but I am hap...positive
27Global markets rise following fresh signals th...[-0.46590617299079895, 0.5152156949043274, -0....positive4.0Global markets rise following fresh signals th...positive
28My SHOTS, various strats, AXDX CMCO DGIT D ECY...[-0.9121986627578735, 0.18954770267009735, 0.5...positive3.0My SHOTS, various strats, AXDX CMCO DGIT D ECY...negative
29this could be the last good chance to short AMZN[-1.4936555624008179, -0.08102501928806305, -0...positive1.0this could be the last good chance to short AMZNnegative
30HFC - Great group. ooks good. More here ->[-1.282071590423584, 0.452540785074234, -0.020...positive6.0HFC - Great group. ooks good. More here ->positive
31RT @WSJheard: Heard on the Street's @jackycwon...[-0.16953450441360474, 0.5467158555984497, 0.4...positive3.0RT @WSJheard: Heard on the Street's @jackycwon...positive
32MON How quickly investors forget the massive b...[-1.0020204782485962, 0.06035422161221504, -0....positive2.0MON How quickly investors forget the massive b...positive
33EA if price doesn't hold above 9SMA then 16.71...[-0.6850847005844116, 0.7942832708358765, -0.2...positive2.0EA if price doesn't hold above 9SMA then 16.71...positive
34NKD well above the moving averages, look for s...[-1.168450117111206, 0.5925496816635132, -0.27...positive7.0NKD well above the moving averages, look for s...positive
35AAP looking to take some off around 429, shoul...[-0.9121736884117126, 0.7181501388549805, -0.6...positive8.0AAP looking to take some off around 429, shoul...positive
36Selling ICE Short check out my video analysis[-1.0185582637786865, 0.23524264991283417, -0....positive1.0Selling ICE Short check out my video analysisnegative
37CAT Bingo, it is Bingo everywhere today.[-1.0476768016815186, -0.31251490116119385, 0....positive1.0CAT Bingo, it is Bingo everywhere today.positive
38HAO like it on a pop over 6 w vol[-0.397280752658844, -0.7803610563278198, -0.0...positive2.0HAO like it on a pop over 6 w volpositive
39user: AAP nothing like firing of CEO to make i...[0.2457299381494522, 0.9597267508506775, -0.56...positive4.0user: AAP nothing like firing of CEO to make i...positive
40Coronavirus Crisis: GoAir Decides To Reduce Pa...[-0.18016083538532257, 0.4278823137283325, -0....positive8.0Coronavirus Crisis: GoAir Decides To Reduce Pa...negative
41As the coronavirus pandemic intensifies, adher...[-0.7261321544647217, -0.19837094843387604, -0...positive6.0As the coronavirus pandemic intensifies, adher...negative
42notable 52wk highs [20 > /sh < 50] AFCE AK ACO...[-1.047921895980835, 0.6981227993965149, 0.153...positive7.0notable 52wk highs [20 > /sh < 50] AFCE AK ACO...positive
43AAP PMI Manufacturing Index ---> In Few minute...[-0.7834053039550781, 0.5567207336425781, -0.6...positive7.0AAP PMI Manufacturing Index ---> In Few minute...negative
44SPW pauses, SCTY continues its run, up > 20% i...[-0.8796350955963135, 0.21304339170455933, -0....positive3.0SPW pauses, SCTY continues its run, up > 20% i...positive
45RT @josephttwallace: Glutted Oil Markets’ Ne...[-0.24904966354370117, 0.5449734926223755, 0.1...positive2.0RT @josephttwallace: Glutted Oil Markets’ Ne...negative
46GOOG keep in mind there are about 1,000 contra...[-0.6386780738830566, 0.6693974137306213, -0.7...positive4.0GOOG keep in mind there are about 1,000 contra...negative
47V and MA FYI: When they tagged the 50d's yeste...[-1.3859288692474365, 0.1374266892671585, -0.2...positive1.0V and MA FYI: When they tagged the 50d's yeste...positive
48GOOG holding up well[-0.9325542449951172, 0.7117096185684204, -0.2...positive2.0GOOG holding up wellpositive
49JPMorgan Chase Chief Executive James Dimon ret...[-0.5751636624336243, 0.5106868147850037, -0.1...positive6.0JPMorgan Chase Chief Executive James Dimon ret...positive
\n", + "
\n", + "
\n", + "\n", + "
\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "
\n", + "\n", + "\n", + "
\n", + " \n", + "\n", + "\n", + "\n", + " \n", + "
\n", + "
\n", + "
\n" + ] + }, + "metadata": {}, + "execution_count": 9 + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "qFoT-s1MjTSS" + }, + "source": [ + "# 7. Try training with different Embeddings" + ] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "nxWFzQOhjWC8", + "outputId": "017238a7-20f7-432a-ecff-d987390c1221" + }, + "source": [ + "# We can use nlu.print_components(action='embed_sentence') to see every possibler sentence embedding we could use. Lets use bert!\n", + "nlp.nlu.print_components(action='embed_sentence')" + ], + "execution_count": 10, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "For language NLU provides the following Models : \n", + "nlu.load('am.embed_sentence.xlm_roberta') returns Spark NLP model_anno_obj sent_xlm_roberta_base_finetuned_amharic\n", + "For language NLU provides the following Models : \n", + "nlu.load('de.embed_sentence.bert.base_cased') returns Spark NLP model_anno_obj sent_bert_base_cased\n", + "For language NLU provides the following Models : \n", + "nlu.load('el.embed_sentence.bert.base_uncased') returns Spark NLP model_anno_obj sent_bert_base_uncased\n", + "For language NLU provides the following Models : \n", + "nlu.load('en.embed_sentence') returns Spark NLP model_anno_obj tfhub_use\n", + "nlu.load('en.embed_sentence.albert') returns Spark NLP model_anno_obj albert_base_uncased\n", + "nlu.load('en.embed_sentence.bert') returns Spark NLP model_anno_obj sent_bert_base_uncased\n", + "nlu.load('en.embed_sentence.bert.base_uncased_legal') returns Spark NLP model_anno_obj sent_bert_base_uncased_legal\n", + "nlu.load('en.embed_sentence.bert.finetuned') returns Spark NLP model_anno_obj sbert_setfit_finetuned_financial_text_classification\n", + "nlu.load('en.embed_sentence.bert.pubmed') returns Spark NLP model_anno_obj sent_bert_pubmed\n", + "nlu.load('en.embed_sentence.bert.pubmed_squad2') returns Spark NLP model_anno_obj sent_bert_pubmed_squad2\n", + "nlu.load('en.embed_sentence.bert.wiki_books') returns Spark NLP model_anno_obj sent_bert_wiki_books\n", + "nlu.load('en.embed_sentence.bert.wiki_books_mnli') returns Spark NLP model_anno_obj sent_bert_wiki_books_mnli\n", + "nlu.load('en.embed_sentence.bert.wiki_books_qnli') returns Spark NLP model_anno_obj sent_bert_wiki_books_qnli\n", + "nlu.load('en.embed_sentence.bert.wiki_books_qqp') returns Spark NLP model_anno_obj sent_bert_wiki_books_qqp\n", + "nlu.load('en.embed_sentence.bert.wiki_books_squad2') returns Spark NLP model_anno_obj sent_bert_wiki_books_squad2\n", + "nlu.load('en.embed_sentence.bert.wiki_books_sst2') returns Spark NLP model_anno_obj sent_bert_wiki_books_sst2\n", + "nlu.load('en.embed_sentence.bert_base_cased') returns Spark NLP model_anno_obj sent_bert_base_cased\n", + "nlu.load('en.embed_sentence.bert_base_uncased') returns Spark NLP model_anno_obj sent_bert_base_uncased\n", + "nlu.load('en.embed_sentence.bert_large_cased') returns Spark NLP model_anno_obj sent_bert_large_cased\n", + "nlu.load('en.embed_sentence.bert_large_uncased') returns Spark NLP model_anno_obj sent_bert_large_uncased\n", + "nlu.load('en.embed_sentence.bert_use_cmlm_en_base') returns Spark NLP model_anno_obj sent_bert_use_cmlm_en_base\n", + "nlu.load('en.embed_sentence.bert_use_cmlm_en_large') returns Spark NLP model_anno_obj sent_bert_use_cmlm_en_large\n", + "nlu.load('en.embed_sentence.biobert.clinical_base_cased') returns Spark NLP model_anno_obj sent_biobert_clinical_base_cased\n", + "nlu.load('en.embed_sentence.biobert.discharge_base_cased') returns Spark NLP model_anno_obj sent_biobert_discharge_base_cased\n", + "nlu.load('en.embed_sentence.biobert.pmc_base_cased') returns Spark NLP model_anno_obj sent_biobert_pmc_base_cased\n", + "nlu.load('en.embed_sentence.biobert.pubmed_base_cased') returns Spark NLP model_anno_obj sent_biobert_pubmed_base_cased\n", + "nlu.load('en.embed_sentence.biobert.pubmed_large_cased') returns Spark NLP model_anno_obj sent_biobert_pubmed_large_cased\n", + "nlu.load('en.embed_sentence.biobert.pubmed_pmc_base_cased') returns Spark NLP model_anno_obj sent_biobert_pubmed_pmc_base_cased\n", + "nlu.load('en.embed_sentence.covidbert.large_uncased') returns Spark NLP model_anno_obj sent_covidbert_large_uncased\n", + "nlu.load('en.embed_sentence.distil_roberta.distilled_base') returns Spark NLP model_anno_obj sent_distilroberta_base\n", + "nlu.load('en.embed_sentence.doc2vec') returns Spark NLP model_anno_obj doc2vec_gigaword_300\n", + "nlu.load('en.embed_sentence.doc2vec.gigaword_300') returns Spark NLP model_anno_obj doc2vec_gigaword_300\n", + "nlu.load('en.embed_sentence.doc2vec.gigaword_wiki_300') returns Spark NLP model_anno_obj doc2vec_gigaword_wiki_300\n", + "nlu.load('en.embed_sentence.electra') returns Spark NLP model_anno_obj sent_electra_small_uncased\n", + "nlu.load('en.embed_sentence.electra_base_uncased') returns Spark NLP model_anno_obj sent_electra_base_uncased\n", + "nlu.load('en.embed_sentence.electra_large_uncased') returns Spark NLP model_anno_obj sent_electra_large_uncased\n", + "nlu.load('en.embed_sentence.electra_small_uncased') returns Spark NLP model_anno_obj sent_electra_small_uncased\n", + "nlu.load('en.embed_sentence.roberta.base') returns Spark NLP model_anno_obj sent_roberta_base\n", + "nlu.load('en.embed_sentence.roberta.large') returns Spark NLP model_anno_obj sent_roberta_large\n", + "nlu.load('en.embed_sentence.small_bert_L10_128') returns Spark NLP model_anno_obj sent_small_bert_L10_128\n", + "nlu.load('en.embed_sentence.small_bert_L10_256') returns Spark NLP model_anno_obj sent_small_bert_L10_256\n", + "nlu.load('en.embed_sentence.small_bert_L10_512') returns Spark NLP model_anno_obj sent_small_bert_L10_512\n", + "nlu.load('en.embed_sentence.small_bert_L10_768') returns Spark NLP model_anno_obj sent_small_bert_L10_768\n", + "nlu.load('en.embed_sentence.small_bert_L12_128') returns Spark NLP model_anno_obj sent_small_bert_L12_128\n", + "nlu.load('en.embed_sentence.small_bert_L12_256') returns Spark NLP model_anno_obj sent_small_bert_L12_256\n", + "nlu.load('en.embed_sentence.small_bert_L12_512') returns Spark NLP model_anno_obj sent_small_bert_L12_512\n", + "nlu.load('en.embed_sentence.small_bert_L12_768') returns Spark NLP model_anno_obj sent_small_bert_L12_768\n", + "nlu.load('en.embed_sentence.small_bert_L2_128') returns Spark NLP model_anno_obj sent_small_bert_L2_128\n", + "nlu.load('en.embed_sentence.small_bert_L2_256') returns Spark NLP model_anno_obj sent_small_bert_L2_256\n", + "nlu.load('en.embed_sentence.small_bert_L2_512') returns Spark NLP model_anno_obj sent_small_bert_L2_512\n", + "nlu.load('en.embed_sentence.small_bert_L2_768') returns Spark NLP model_anno_obj sent_small_bert_L2_768\n", + "nlu.load('en.embed_sentence.small_bert_L4_128') returns Spark NLP model_anno_obj sent_small_bert_L4_128\n", + "nlu.load('en.embed_sentence.small_bert_L4_256') returns Spark NLP model_anno_obj sent_small_bert_L4_256\n", + "nlu.load('en.embed_sentence.small_bert_L4_512') returns Spark NLP model_anno_obj sent_small_bert_L4_512\n", + "nlu.load('en.embed_sentence.small_bert_L4_768') returns Spark NLP model_anno_obj sent_small_bert_L4_768\n", + "nlu.load('en.embed_sentence.small_bert_L6_128') returns Spark NLP model_anno_obj sent_small_bert_L6_128\n", + "nlu.load('en.embed_sentence.small_bert_L6_256') returns Spark NLP model_anno_obj sent_small_bert_L6_256\n", + "nlu.load('en.embed_sentence.small_bert_L6_512') returns Spark NLP model_anno_obj sent_small_bert_L6_512\n", + "nlu.load('en.embed_sentence.small_bert_L6_768') returns Spark NLP model_anno_obj sent_small_bert_L6_768\n", + "nlu.load('en.embed_sentence.small_bert_L8_128') returns Spark NLP model_anno_obj sent_small_bert_L8_128\n", + "nlu.load('en.embed_sentence.small_bert_L8_256') returns Spark NLP model_anno_obj sent_small_bert_L8_256\n", + "nlu.load('en.embed_sentence.small_bert_L8_512') returns Spark NLP model_anno_obj sent_small_bert_L8_512\n", + "nlu.load('en.embed_sentence.small_bert_L8_768') returns Spark NLP model_anno_obj sent_small_bert_L8_768\n", + "nlu.load('en.embed_sentence.tfhub_use') returns Spark NLP model_anno_obj tfhub_use\n", + "nlu.load('en.embed_sentence.tfhub_use.lg') returns Spark NLP model_anno_obj tfhub_use_lg\n", + "nlu.load('en.embed_sentence.use') returns Spark NLP model_anno_obj tfhub_use\n", + "nlu.load('en.embed_sentence.use.lg') returns Spark NLP model_anno_obj tfhub_use_lg\n", + "For language NLU provides the following Models : \n", + "nlu.load('es.embed_sentence.bert.base_cased') returns Spark NLP model_anno_obj sent_bert_base_cased\n", + "nlu.load('es.embed_sentence.bert.base_uncased') returns Spark NLP model_anno_obj sent_bert_base_uncased\n", + "For language NLU provides the following Models : \n", + "nlu.load('fi.embed_sentence.bert') returns Spark NLP model_anno_obj bert_base_finnish_uncased\n", + "nlu.load('fi.embed_sentence.bert.cased') returns Spark NLP model_anno_obj bert_base_finnish_cased\n", + "nlu.load('fi.embed_sentence.bert.uncased') returns Spark NLP model_anno_obj bert_base_finnish_uncased\n", + "For language NLU provides the following Models : \n", + "nlu.load('ha.embed_sentence.xlm_roberta') returns Spark NLP model_anno_obj sent_xlm_roberta_base_finetuned_hausa\n", + "For language NLU provides the following Models : \n", + "nlu.load('ig.embed_sentence.xlm_roberta') returns Spark NLP model_anno_obj sent_xlm_roberta_base_finetuned_igbo\n", + "For language NLU provides the following Models : \n", + "nlu.load('lg.embed_sentence.xlm_roberta') returns Spark NLP model_anno_obj sent_xlm_roberta_base_finetuned_luganda\n", + "For language NLU provides the following Models : \n", + "nlu.load('nl.embed_sentence.bert.base_cased') returns Spark NLP model_anno_obj sent_bert_base_cased\n", + "For language NLU provides the following Models : \n", + "nlu.load('pcm.embed_sentence.xlm_roberta') returns Spark NLP model_anno_obj sent_xlm_roberta_base_finetuned_naija\n", + "For language NLU provides the following Models : \n", + "nlu.load('pt.embed_sentence.bert.base_legal') returns Spark NLP model_anno_obj sbert_legal_bertimbau_base_tsdae_sts\n", + "nlu.load('pt.embed_sentence.bert.cased_large_legal') returns Spark NLP model_anno_obj sbert_bert_large_portuguese_cased_legal_mlm_sts_v0.1\n", + "nlu.load('pt.embed_sentence.bert.large_legal') returns Spark NLP model_anno_obj sbert_legal_bertimbau_large_gpl_sts\n", + "nlu.load('pt.embed_sentence.bert.legal.cased_large_mlm_sts_v0.10.by_stjiris') returns Spark NLP model_anno_obj sbert_bert_large_portuguese_cased_legal_mlm_sts_v0.10\n", + "nlu.load('pt.embed_sentence.bert.legal.cased_large_mlm_sts_v0.2.by_stjiris') returns Spark NLP model_anno_obj sbert_bert_large_portuguese_cased_legal_mlm_sts_v0.2\n", + "nlu.load('pt.embed_sentence.bert.legal.cased_large_mlm_sts_v0.3.by_stjiris') returns Spark NLP model_anno_obj sbert_bert_large_portuguese_cased_legal_mlm_sts_v0.3\n", + "nlu.load('pt.embed_sentence.bert.legal.cased_large_mlm_sts_v0.4.by_stjiris') returns Spark NLP model_anno_obj sbert_bert_large_portuguese_cased_legal_mlm_sts_v0.4\n", + "nlu.load('pt.embed_sentence.bert.legal.cased_large_mlm_sts_v0.5.by_stjiris') returns Spark NLP model_anno_obj sbert_bert_large_portuguese_cased_legal_mlm_sts_v0.5\n", + "nlu.load('pt.embed_sentence.bert.legal.cased_large_mlm_sts_v0.7.by_stjiris') returns Spark NLP model_anno_obj sbert_bert_large_portuguese_cased_legal_mlm_sts_v0.7\n", + "nlu.load('pt.embed_sentence.bert.legal.cased_large_mlm_sts_v0.8.by_stjiris') returns Spark NLP model_anno_obj sbert_bert_large_portuguese_cased_legal_mlm_sts_v0.8\n", + "nlu.load('pt.embed_sentence.bert.legal.cased_large_mlm_sts_v0.9.by_stjiris') returns Spark NLP model_anno_obj sbert_bert_large_portuguese_cased_legal_mlm_sts_v0.9\n", + "nlu.load('pt.embed_sentence.bert.legal.cased_large_mlm_sts_v1.0.by_stjiris') returns Spark NLP model_anno_obj sbert_bert_large_portuguese_cased_legal_mlm_sts_v1.0\n", + "nlu.load('pt.embed_sentence.bert.legal.cased_large_mlm_v0.11_gpl_nli_sts_v0.by_stjiris') returns Spark NLP model_anno_obj sbert_bert_large_portuguese_cased_legal_mlm_v0.11_gpl_nli_sts_v0\n", + "nlu.load('pt.embed_sentence.bert.legal.cased_large_mlm_v0.11_gpl_nli_sts_v1.by_stjiris') returns Spark NLP model_anno_obj sbert_bert_large_portuguese_cased_legal_mlm_v0.11_gpl_nli_sts_v1\n", + "nlu.load('pt.embed_sentence.bert.legal.cased_large_mlm_v0.11_nli_sts_v0.by_stjiris') returns Spark NLP model_anno_obj sbert_bert_large_portuguese_cased_legal_mlm_v0.11_nli_sts_v0\n", + "nlu.load('pt.embed_sentence.bert.legal.cased_large_mlm_v0.11_nli_sts_v1.by_stjiris') returns Spark NLP model_anno_obj sbert_bert_large_portuguese_cased_legal_mlm_v0.11_nli_sts_v1\n", + "nlu.load('pt.embed_sentence.bert.legal.cased_large_mlm_v0.11_sts_v0.by_stjiris') returns Spark NLP model_anno_obj sbert_bert_large_portuguese_cased_legal_mlm_v0.11_sts_v0\n", + "nlu.load('pt.embed_sentence.bert.legal.cased_large_mlm_v0.11_sts_v1.by_stjiris') returns Spark NLP model_anno_obj sbert_bert_large_portuguese_cased_legal_mlm_v0.11_sts_v1\n", + "nlu.load('pt.embed_sentence.bert.v2_base_legal') returns Spark NLP model_anno_obj sbert_legal_bertimbau_sts_base_ma_v2\n", + "nlu.load('pt.embed_sentence.bert.v2_large_legal') returns Spark NLP model_anno_obj sbert_legal_bertimbau_large_tsdae_sts_v2\n", + "nlu.load('pt.embed_sentence.bertimbau.legal.assin.base.by_rufimelo') returns Spark NLP model_anno_obj sbert_legal_bertimbau_sts_base_ma\n", + "nlu.load('pt.embed_sentence.bertimbau.legal.assin2.base.by_rufimelo') returns Spark NLP model_anno_obj sbert_legal_bertimbau_sts_base\n", + "nlu.load('pt.embed_sentence.bertimbau.legal.large_sts_by_rufimelo') returns Spark NLP model_anno_obj sbert_legal_bertimbau_sts_large\n", + "nlu.load('pt.embed_sentence.bertimbau.legal.large_sts_ma.by_rufimelo') returns Spark NLP model_anno_obj sbert_legal_bertimbau_sts_large_ma\n", + "nlu.load('pt.embed_sentence.bertimbau.legal.large_sts_ma_v3.by_rufimelo') returns Spark NLP model_anno_obj sbert_legal_bertimbau_sts_large_ma_v3\n", + "nlu.load('pt.embed_sentence.bertimbau.legal.large_tsdae_sts.by_rufimelo') returns Spark NLP model_anno_obj sbert_legal_bertimbau_large_tsdae_sts\n", + "nlu.load('pt.embed_sentence.bertimbau.legal.large_tsdae_sts_v4.by_rufimelo') returns Spark NLP model_anno_obj sbert_legal_bertimbau_large_tsdae_sts_v4\n", + "nlu.load('pt.embed_sentence.bertimbau.legal.large_tsdae_v4_gpl_sts.by_rufimelo') returns Spark NLP model_anno_obj sbert_legal_bertimbau_large_tsdae_v4_gpl_sts\n", + "nlu.load('pt.embed_sentence.bertimbau.legal.v2_large_sts_v2.by_rufimelo') returns Spark NLP model_anno_obj sbert_legal_bertimbau_sts_large_v2\n", + "nlu.load('pt.embed_sentence.bertimbau.legal.v2_large_v2_sts.by_rufimelo') returns Spark NLP model_anno_obj sbert_legal_bertimbau_large_v2_sts\n", + "For language NLU provides the following Models : \n", + "nlu.load('rw.embed_sentence.xlm_roberta') returns Spark NLP model_anno_obj sent_xlm_roberta_base_finetuned_kinyarwanda\n", + "For language NLU provides the following Models : \n", + "nlu.load('sv.embed_sentence.bert.base_cased') returns Spark NLP model_anno_obj sent_bert_base_cased\n", + "For language NLU provides the following Models : \n", + "nlu.load('sw.embed_sentence.xlm_roberta') returns Spark NLP model_anno_obj sent_xlm_roberta_base_finetuned_swahili\n", + "For language NLU provides the following Models : \n", + "nlu.load('wo.embed_sentence.xlm_roberta') returns Spark NLP model_anno_obj sent_xlm_roberta_base_finetuned_wolof\n", + "For language NLU provides the following Models : \n", + "nlu.load('xx.embed_sentence') returns Spark NLP model_anno_obj sent_bert_multi_cased\n", + "nlu.load('xx.embed_sentence.bert') returns Spark NLP model_anno_obj sent_bert_multi_cased\n", + "nlu.load('xx.embed_sentence.bert.cased') returns Spark NLP model_anno_obj sent_bert_multi_cased\n", + "nlu.load('xx.embed_sentence.bert.muril') returns Spark NLP model_anno_obj sent_bert_muril\n", + "nlu.load('xx.embed_sentence.bert_use_cmlm_multi_base') returns Spark NLP model_anno_obj sent_bert_use_cmlm_multi_base\n", + "nlu.load('xx.embed_sentence.bert_use_cmlm_multi_base_br') returns Spark NLP model_anno_obj sent_bert_use_cmlm_multi_base_br\n", + "nlu.load('xx.embed_sentence.labse') returns Spark NLP model_anno_obj labse\n", + "nlu.load('xx.embed_sentence.xlm_roberta.base') returns Spark NLP model_anno_obj sent_xlm_roberta_base\n", + "For language NLU provides the following Models : \n", + "nlu.load('yo.embed_sentence.xlm_roberta') returns Spark NLP model_anno_obj sent_xlm_roberta_base_finetuned_yoruba\n", + "For language NLU provides the following Models : \n", + "nlu.load('zh.embed_sentence.bert') returns Spark NLP model_anno_obj sbert_chinese_qmc_finance_v1\n", + "nlu.load('zh.embed_sentence.bert.distilled') returns Spark NLP model_anno_obj sbert_chinese_qmc_finance_v1_distill\n" + ] + } + ] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "IKK_Ii_gjJfF", + "outputId": "34ce4144-5adf-404e-a0aa-aec86b7ff166" + }, + "source": [ + "trainable_pipe = nlp.load('en.embed_sentence.small_bert_L12_768 train.sentiment')\n", + "# We need to train longer and user smaller LR for NON-USE based sentence embeddings usually\n", + "# We could tune the hyperparameters further with hyperparameter tuning methods like gridsearch\n", + "# Also longer training gives more accuracy\n", + "trainable_pipe['trainable_sentiment_dl'].setMaxEpochs(120)\n", + "trainable_pipe['trainable_sentiment_dl'].setLr(0.0005)\n", + "fitted_pipe = trainable_pipe.fit(train_df)\n", + "# predict with the trainable pipeline on dataset and get predictions\n", + "preds = fitted_pipe.predict(train_df,output_level='document')\n", + "\n", + "#sentence detector that is part of the pipe generates sone NaNs. lets drop them first\n", + "preds.dropna(inplace=True)\n", + "print(classification_report(preds['y'], preds['sentiment']))\n", + "\n", + "#preds" + ], + "execution_count": 12, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Warning::Spark Session already created, some configs may not take.\n", + "Warning::Spark Session already created, some configs may not take.\n", + "sent_small_bert_L12_768 download started this may take some time.\n", + "Approximate size to download 392.9 MB\n", + "[OK!]\n" + ] + }, + { + "output_type": "stream", + "name": "stderr", + "text": [ + "/usr/local/lib/python3.10/dist-packages/nlu/pipe/extractors/extractor_methods/base_extractor_methods.py:356: SettingWithCopyWarning: \n", + "A value is trying to be set on a copy of a slice from a DataFrame.\n", + "Try using .loc[row_indexer,col_indexer] = value instead\n", + "\n", + "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n", + " df[cols_to_explode] = df[cols_to_explode].apply(pad_same_level_cols, axis=1)\n" + ] + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + " precision recall f1-score support\n", + "\n", + " negative 0.79 0.54 0.64 1671\n", + " neutral 0.00 0.00 0.00 0\n", + " positive 0.82 0.86 0.84 2961\n", + "\n", + " accuracy 0.74 4632\n", + " macro avg 0.54 0.46 0.49 4632\n", + "weighted avg 0.81 0.74 0.76 4632\n", + "\n" + ] + }, + { + "output_type": "stream", + "name": "stderr", + "text": [ + "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/_classification.py:1344: UndefinedMetricWarning: Recall and F-score are ill-defined and being set to 0.0 in labels with no true samples. Use `zero_division` parameter to control this behavior.\n", + " _warn_prf(average, modifier, msg_start, len(result))\n", + "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/_classification.py:1344: UndefinedMetricWarning: Recall and F-score are ill-defined and being set to 0.0 in labels with no true samples. Use `zero_division` parameter to control this behavior.\n", + " _warn_prf(average, modifier, msg_start, len(result))\n", + "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/_classification.py:1344: UndefinedMetricWarning: Recall and F-score are ill-defined and being set to 0.0 in labels with no true samples. Use `zero_division` parameter to control this behavior.\n", + " _warn_prf(average, modifier, msg_start, len(result))\n" + ] + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "_1jxw3GnVGlI" + }, + "source": [ + "# 7.1 evaluate on Test Data" + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "Fxx4yNkNVGFl", + "colab": { + "base_uri": "https://localhost:8080/" + }, + "outputId": "c788a55c-8686-4835-e3d4-c8fa5551cae0" + }, + "source": [ + "preds = fitted_pipe.predict(test_df,output_level='document')\n", + "\n", + "#sentence detector that is part of the pipe generates sone NaNs. lets drop them first\n", + "preds.dropna(inplace=True)\n", + "print(classification_report(preds['y'], preds['sentiment']))" + ], + "execution_count": 13, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + " precision recall f1-score support\n", + "\n", + " negative 0.69 0.45 0.54 435\n", + " neutral 0.00 0.00 0.00 0\n", + " positive 0.76 0.80 0.78 724\n", + "\n", + " accuracy 0.67 1159\n", + " macro avg 0.48 0.41 0.44 1159\n", + "weighted avg 0.73 0.67 0.69 1159\n", + "\n" + ] + }, + { + "output_type": "stream", + "name": "stderr", + "text": [ + "/usr/local/lib/python3.10/dist-packages/nlu/pipe/extractors/extractor_methods/base_extractor_methods.py:356: SettingWithCopyWarning: \n", + "A value is trying to be set on a copy of a slice from a DataFrame.\n", + "Try using .loc[row_indexer,col_indexer] = value instead\n", + "\n", + "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n", + " df[cols_to_explode] = df[cols_to_explode].apply(pad_same_level_cols, axis=1)\n", + "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/_classification.py:1344: UndefinedMetricWarning: Recall and F-score are ill-defined and being set to 0.0 in labels with no true samples. Use `zero_division` parameter to control this behavior.\n", + " _warn_prf(average, modifier, msg_start, len(result))\n", + "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/_classification.py:1344: UndefinedMetricWarning: Recall and F-score are ill-defined and being set to 0.0 in labels with no true samples. Use `zero_division` parameter to control this behavior.\n", + " _warn_prf(average, modifier, msg_start, len(result))\n", + "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/_classification.py:1344: UndefinedMetricWarning: Recall and F-score are ill-defined and being set to 0.0 in labels with no true samples. Use `zero_division` parameter to control this behavior.\n", + " _warn_prf(average, modifier, msg_start, len(result))\n" + ] + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "2BB-NwZUoHSe" + }, + "source": [ + "# 8. Lets save the model" + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "eLex095goHwm" + }, + "source": [ + "stored_model_path = './models/classifier_dl_trained'\n", + "fitted_pipe.save(stored_model_path)" + ], + "execution_count": 14, + "outputs": [] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "e_b2DPd4rCiU" + }, + "source": [ + "# 9. Lets load the model from HDD.\n", + "This makes Offlien NLU usage possible! \n", + "You need to call nlu.load(path=path_to_the_pipe) to load a model/pipeline from disk." + ] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 133 + }, + "id": "SO4uz45MoRgp", + "outputId": "d78b4bfd-544c-4add-9583-9356de5ebb7e" + }, + "source": [ + "hdd_pipe = nlp.load(path=\"./models/classifier_dl_trained\")\n", + "\n", + "preds = hdd_pipe.predict('Bitcoin dropped by 50 percent!!')\n", + "preds" + ], + "execution_count": 15, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Warning::Spark Session already created, some configs may not take.\n", + "Warning::Spark Session already created, some configs may not take.\n", + "Warning::Spark Session already created, some configs may not take.\n" + ] + }, + { + "output_type": "execute_result", + "data": { + "text/plain": [ + " document \\\n", + "0 Bitcoin dropped by 50 percent!! \n", + "\n", + " sentence_embedding_from_disk sentiment \\\n", + "0 [0.20597122609615326, 0.16840754449367523, 0.0... negative \n", + "\n", + " sentiment_confidence \n", + "0 0.0 " + ], + "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", + "
documentsentence_embedding_from_disksentimentsentiment_confidence
0Bitcoin dropped by 50 percent!![0.20597122609615326, 0.16840754449367523, 0.0...negative0.0
\n", + "
\n", + "
\n", + "\n", + "
\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "
\n", + "\n", + "
\n", + "
\n" + ] + }, + "metadata": {}, + "execution_count": 15 + } + ] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "e0CVlkk9v6Qi", + "outputId": "ae53e7f2-6371-4473-ca8e-5074f5341f31" + }, + "source": [ + "hdd_pipe.print_info()" + ], + "execution_count": 16, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "The following parameters are configurable for this NLU pipeline (You can copy paste the examples) :\n", + ">>> component_list['document_assembler'] has settable params:\n", + "component_list['document_assembler'].setCleanupMode('shrink') | Info: possible values: disabled, inplace, inplace_full, shrink, shrink_full, each, each_full, delete_full | Currently set to : shrink\n", + ">>> component_list['bert_sentence_embeddings@sent_small_bert_L12_768'] has settable params:\n", + "component_list['bert_sentence_embeddings@sent_small_bert_L12_768'].setBatchSize(8) | Info: Size of every batch | Currently set to : 8\n", + "component_list['bert_sentence_embeddings@sent_small_bert_L12_768'].setCaseSensitive(False) | Info: whether to ignore case in tokens for embeddings matching | Currently set to : False\n", + "component_list['bert_sentence_embeddings@sent_small_bert_L12_768'].setDimension(768) | Info: Number of embedding dimensions | Currently set to : 768\n", + "component_list['bert_sentence_embeddings@sent_small_bert_L12_768'].setMaxSentenceLength(128) | Info: Max sentence length to process | Currently set to : 128\n", + "component_list['bert_sentence_embeddings@sent_small_bert_L12_768'].setEngine('tensorflow') | Info: Deep Learning engine used for this model | Currently set to : tensorflow\n", + "component_list['bert_sentence_embeddings@sent_small_bert_L12_768'].setIsLong(False) | Info: Use Long type instead of Int type for inputs buffer - Some Bert models require Long instead of Int. | Currently set to : False\n", + "component_list['bert_sentence_embeddings@sent_small_bert_L12_768'].setStorageRef('sent_small_bert_L12_768') | Info: unique reference name for identification | Currently set to : sent_small_bert_L12_768\n", + ">>> component_list['sentiment_dl@sent_small_bert_L12_768'] has settable params:\n", + "component_list['sentiment_dl@sent_small_bert_L12_768'].setThreshold(0.6) | Info: The minimum threshold for the final result otheriwse it will be neutral | Currently set to : 0.6\n", + "component_list['sentiment_dl@sent_small_bert_L12_768'].setThresholdLabel('neutral') | Info: In case the score is less than threshold, what should be the label. Default is neutral. | Currently set to : neutral\n", + "component_list['sentiment_dl@sent_small_bert_L12_768'].setEngine('tensorflow') | Info: Deep Learning engine used for this model | Currently set to : tensorflow\n", + "component_list['sentiment_dl@sent_small_bert_L12_768'].setClasses(['positive', 'negative']) | Info: get the tags used to trained this SentimentDLModel | Currently set to : ['positive', 'negative']\n", + "component_list['sentiment_dl@sent_small_bert_L12_768'].setStorageRef('sent_small_bert_L12_768') | Info: unique reference name for identification | Currently set to : sent_small_bert_L12_768\n" + ] + } + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "-CdcbSd7WEpm" + }, + "source": [], + "execution_count": null, + "outputs": [] + } + ] +} \ No newline at end of file diff --git a/examples/colab/Training/binary_text_classification/NLU_training_sentiment_classifier_demo_twitter.ipynb b/examples/colab/Training/binary_text_classification/NLU_training_sentiment_classifier_demo_twitter.ipynb index baa09395..7b54e0b9 100644 --- a/examples/colab/Training/binary_text_classification/NLU_training_sentiment_classifier_demo_twitter.ipynb +++ b/examples/colab/Training/binary_text_classification/NLU_training_sentiment_classifier_demo_twitter.ipynb @@ -1 +1,3158 @@ -{"nbformat":4,"nbformat_minor":0,"metadata":{"colab":{"name":"NLU_training_sentiment_classifier_demo_twitter.ipynb","provenance":[],"collapsed_sections":["zkufh760uvF3"]},"kernelspec":{"display_name":"Python 3","name":"python3"}},"cells":[{"cell_type":"markdown","metadata":{"id":"zkufh760uvF3"},"source":["![JohnSnowLabs](https://nlp.johnsnowlabs.com/assets/images/logo.png)\n","\n","[![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/JohnSnowLabs/nlu/blob/master/examples/colab/Training/binary_text_classification/NLU_training_sentiment_classifier_demo_twitter.ipynb)\n","\n","\n","\n","# Training a Sentiment Analysis Classifier with NLU \n","## 2 class twitter classifier training\n","With the [SentimentDL model](https://nlp.johnsnowlabs.com/docs/en/annotators#sentimentdl-multi-class-sentiment-analysis-annotator) from Spark NLP you can achieve State Of the Art results on any multi class text classification problem \n","\n","This notebook showcases the following features : \n","\n","- How to train the deep learning classifier\n","- How to store a pipeline to disk\n","- How to load the pipeline from disk (Enables NLU offline mode)\n","\n"]},{"cell_type":"markdown","metadata":{"id":"dur2drhW5Rvi"},"source":["# 1. Install Java 8 and NLU"]},{"cell_type":"code","metadata":{"id":"hFGnBCHavltY","colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"status":"ok","timestamp":1620214509349,"user_tz":-120,"elapsed":123909,"user":{"displayName":"Christian Kasim Loan","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GjqAD-ircKP-s5Eh6JSdkDggDczfqQbJGU_IRb4Hw=s64","userId":"14469489166467359317"}},"outputId":"faee9bf7-4d8f-4a48-be35-6966ac6ebd02"},"source":["!wget https://setup.johnsnowlabs.com/nlu/colab.sh -O - | bash\n","import nlu"],"execution_count":null,"outputs":[{"output_type":"stream","text":["--2021-05-05 11:33:05-- https://raw.githubusercontent.com/JohnSnowLabs/nlu/master/scripts/colab_setup.sh\n","Resolving raw.githubusercontent.com (raw.githubusercontent.com)... 185.199.108.133, 185.199.109.133, 185.199.110.133, ...\n","Connecting to raw.githubusercontent.com (raw.githubusercontent.com)|185.199.108.133|:443... connected.\n","HTTP request sent, awaiting response... 200 OK\n","Length: 1671 (1.6K) [text/plain]\n","Saving to: ‘STDOUT’\n","\n","Installing NLU 3.0.0 with PySpark 3.0.2 and Spark NLP 3.0.1 for Google Colab ...\n","- 100%[===================>] 1.63K --.-KB/s in 0s \n","\n","2021-05-05 11:33:06 (47.6 MB/s) - written to stdout [1671/1671]\n","\n","\u001b[K |████████████████████████████████| 204.8MB 67kB/s \n","\u001b[K |████████████████████████████████| 153kB 44.1MB/s \n","\u001b[K |████████████████████████████████| 204kB 22.3MB/s \n","\u001b[K |████████████████████████████████| 204kB 54.6MB/s \n","\u001b[?25h Building wheel for pyspark (setup.py) ... \u001b[?25l\u001b[?25hdone\n"],"name":"stdout"}]},{"cell_type":"markdown","metadata":{"id":"f4KkTfnR5Ugg"},"source":["# 2. Download twitter Sentiment dataset \n","https://www.kaggle.com/cosmos98/twitter-and-reddit-sentimental-analysis-dataset\n","#Context\n","\n","This is was a Dataset Created as a part of the university Project On Sentimental Analysis On Multi-Source Social Media Platforms using PySpark."]},{"cell_type":"code","metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"OrVb5ZMvvrQD","executionInfo":{"status":"ok","timestamp":1620214509351,"user_tz":-120,"elapsed":123894,"user":{"displayName":"Christian Kasim Loan","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GjqAD-ircKP-s5Eh6JSdkDggDczfqQbJGU_IRb4Hw=s64","userId":"14469489166467359317"}},"outputId":"7beb4eab-22ec-4f40-d7bf-6460b1fe261d"},"source":["! wget http://ckl-it.de/wp-content/uploads/2021/01/Twitter_Data.csv\n"],"execution_count":null,"outputs":[{"output_type":"stream","text":["--2021-05-05 11:35:08-- http://ckl-it.de/wp-content/uploads/2021/01/Twitter_Data.csv\n","Resolving ckl-it.de (ckl-it.de)... 217.160.0.108, 2001:8d8:100f:f000::209\n","Connecting to ckl-it.de (ckl-it.de)|217.160.0.108|:80... connected.\n","HTTP request sent, awaiting response... 200 OK\n","Length: 99657 (97K) [text/csv]\n","Saving to: ‘Twitter_Data.csv’\n","\n","Twitter_Data.csv 100%[===================>] 97.32K 310KB/s in 0.3s \n","\n","2021-05-05 11:35:08 (310 KB/s) - ‘Twitter_Data.csv’ saved [99657/99657]\n","\n"],"name":"stdout"}]},{"cell_type":"code","metadata":{"colab":{"base_uri":"https://localhost:8080/","height":391},"id":"y4xSRWIhwT28","executionInfo":{"status":"ok","timestamp":1620214509356,"user_tz":-120,"elapsed":123892,"user":{"displayName":"Christian Kasim Loan","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GjqAD-ircKP-s5Eh6JSdkDggDczfqQbJGU_IRb4Hw=s64","userId":"14469489166467359317"}},"outputId":"5e36e540-7943-4bd4-85e2-956979503db7"},"source":["import pandas as pd\n","train_path = '/content/Twitter_Data.csv'\n","\n","train_df = pd.read_csv(train_path)\n","# the text data to use for classification should be in a column named 'text'\n","# the label column must have name 'y' name be of type str\n","columns=['text','y']\n","train_df = train_df[columns]\n","train_df"],"execution_count":null,"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"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n","
texty
0how narendra modi has almost killed the indian...negative
1you think was modi behind that accidentnegative
2kamal haasan takes chowkidar modi kamal haasan...negative
3connected name with surname not bcz religion c...negative
4anyone better than modi when nehruji expired s...positive
.........
595perception makes fool some call “foreign inv...negative
596when will see your tweet for justice for you a...negative
597haha congress going gaga over this after looti...positive
598this movie shows the life histiry narendra mod...negative
599modi left his year old wife and returned her r...positive
\n","

600 rows × 2 columns

\n","
"],"text/plain":[" text y\n","0 how narendra modi has almost killed the indian... negative\n","1 you think was modi behind that accident negative\n","2 kamal haasan takes chowkidar modi kamal haasan... negative\n","3 connected name with surname not bcz religion c... negative\n","4 anyone better than modi when nehruji expired s... positive\n",".. ... ...\n","595 perception makes fool some call “foreign inv... negative\n","596 when will see your tweet for justice for you a... negative\n","597 haha congress going gaga over this after looti... positive\n","598 this movie shows the life histiry narendra mod... negative\n","599 modi left his year old wife and returned her r... positive\n","\n","[600 rows x 2 columns]"]},"metadata":{"tags":[]},"execution_count":3}]},{"cell_type":"markdown","metadata":{"id":"0296Om2C5anY"},"source":["# 3. Train Deep Learning Classifier using nlu.load('train.sentiment')\n","\n","You dataset label column should be named 'y' and the feature column with text data should be named 'text'"]},{"cell_type":"code","metadata":{"colab":{"base_uri":"https://localhost:8080/","height":1000},"id":"3ZIPkRkWftBG","executionInfo":{"status":"ok","timestamp":1620214645691,"user_tz":-120,"elapsed":260221,"user":{"displayName":"Christian Kasim Loan","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GjqAD-ircKP-s5Eh6JSdkDggDczfqQbJGU_IRb4Hw=s64","userId":"14469489166467359317"}},"outputId":"c3d16617-f157-4732-8139-86dc380efcca"},"source":["from sklearn.metrics import classification_report\n","import nlu \n","# load a trainable pipeline by specifying the train. prefix and fit it on a datset with label and text columns\n","# by default the Universal Sentence Encoder (USE) Sentence embeddings are used for generation\n","trainable_pipe = nlu.load('train.sentiment')\n","fitted_pipe = trainable_pipe.fit(train_df.iloc[:50])\n","\n","# predict with the trainable pipeline on dataset and get predictions\n","preds = fitted_pipe.predict(train_df.iloc[:50],output_level='document')\n","#sentence detector that is part of the pipe generates sone NaNs. lets drop them first\n","preds.dropna(inplace=True)\n","print(classification_report(preds['y'], preds['sentiment']))\n","\n","preds"],"execution_count":null,"outputs":[{"output_type":"stream","text":["tfhub_use download started this may take some time.\n","Approximate size to download 923.7 MB\n","[OK!]\n","sentence_detector_dl download started this may take some time.\n","Approximate size to download 354.6 KB\n","[OK!]\n"," precision recall f1-score support\n","\n"," negative 0.54 1.00 0.70 27\n"," positive 0.00 0.00 0.00 23\n","\n"," accuracy 0.54 50\n"," macro avg 0.27 0.50 0.35 50\n","weighted avg 0.29 0.54 0.38 50\n","\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"," \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"," \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"," \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"," \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"," \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"," \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"," \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"," \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"," \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"," \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"," \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","
sentence_embedding_usetrained_sentimentyorigin_indextexttrained_sentiment_confidencedocumentsentence
0[0.060062434524297714, -0.05557167902588844, -...negativenegative0how narendra modi has almost killed the indian...0.781124how narendra modi has almost killed the indian...[how narendra modi has almost killed the india...
1[0.05362718552350998, -0.004547705873847008, -...negativenegative1you think was modi behind that accident0.772585you think was modi behind that accident[you think was modi behind that accident]
2[0.07274721562862396, -0.061593908816576004, -...negativenegative2kamal haasan takes chowkidar modi kamal haasan...0.778565kamal haasan takes chowkidar modi kamal haasan...[kamal haasan takes chowkidar modi kamal haasa...
3[0.06106054410338402, -0.060213156044483185, -...negativenegative3connected name with surname not bcz religion c...0.732274connected name with surname not bcz religion c...[connected name with surname not bcz religion ...
4[0.0737471729516983, 0.006071774289011955, -0....negativepositive4anyone better than modi when nehruji expired s...0.783452anyone better than modi when nehruji expired s...[anyone better than modi when nehruji expired ...
5[0.05888386443257332, -0.0646616667509079, -0....negativenegative5\\r\\nmodiji wont tired crying foul\\r\\nmain chow...0.788001modiji wont tired crying foul main chowkidar h...[modiji wont tired crying foul main chowkidar ...
6[0.058948416262865067, -0.029682165011763573, ...negativenegative6poor chap modi hasn’ given him anything can ...0.781363poor chap modi hasn’ given him anything can ...[poor chap modi hasn’ given him anything can...
7[0.051331546157598495, -0.06789953261613846, -...negativenegative7green underwear missing ive been doubting isi ...0.767519green underwear missing ive been doubting isi ...[green underwear missing ive been doubting isi...
8[0.044129759073257446, -0.06111813709139824, -...negativepositive8congress years wasnt able complete one rafale ...0.754464congress years wasnt able complete one rafale ...[congress years wasnt able complete one rafale...
9[0.03665374591946602, -0.03695330768823624, -0...negativenegative9asked learn from how treat minority well does ...0.693848asked learn from how treat minority well does ...[asked learn from how treat minority well does...
10[0.07035735249519348, -0.06952506303787231, -0...negativenegative10stop bull shitting worry about criminal vivek ...0.785139stop bull shitting worry about criminal vivek ...[stop bull shitting worry about criminal vivek...
11[0.013958276249468327, -0.030759528279304504, ...negativepositive11drswamys timesnow last year debate nearly mill...0.731118drswamys timesnow last year debate nearly mill...[drswamys timesnow last year debate nearly mil...
12[0.026277026161551476, -0.06238812580704689, -...negativenegative12asshole bahujan radical marxist grow brain kno...0.784451asshole bahujan radical marxist grow brain kno...[asshole bahujan radical marxist grow brain kn...
13[0.07457270473241806, -0.058670494705438614, -...negativepositive13from selling dreams 2014 selling tshirts 2019 ...0.761034from selling dreams 2014 selling tshirts 2019 ...[from selling dreams 2014 selling tshirts 2019...
14[0.061704088002443314, -0.04553354158997536, -...negativepositive14very true sir thats why they are against modi ...0.772205very true sir thats why they are against modi ...[very true sir thats why they are against modi...
15[0.053420260548591614, -0.0038897113408893347,...negativenegative15they are giving jobs citizen india what you ar...0.769769they are giving jobs citizen india what you ar...[they are giving jobs citizen india what you a...
16[0.027197618037462234, -0.036435648798942566, ...negativenegative16congress has always attempted empower people g...0.762557congress has always attempted empower people g...[congress has always attempted empower people ...
17[0.06601184606552124, -0.020045213401317596, -...negativepositive17have never said that modi succeed yet even als...0.779734have never said that modi succeed yet even als...[have never said that modi succeed yet even al...
18[0.046943631023168564, -0.06800007820129395, -...negativepositive18\\r\\nthe foundation for new india 2022 has alre...0.755853the foundation for new india 2022 has already ...[the foundation for new india 2022 has already...
19[0.05615750327706337, -0.002462629694491625, -...negativenegative19only rahul gandhis politics love can defeat th...0.770993only rahul gandhis politics love can defeat th...[only rahul gandhis politics love can defeat t...
20[0.030352214351296425, -0.06195472553372383, 0...negativenegative20one step time navigating thru looteyns when ev...0.758632one step time navigating thru looteyns when ev...[one step time navigating thru looteyns when e...
21[0.07535804808139801, -0.05643236264586449, -0...negativenegative21why sir mam shabana azami hate much that have ...0.778967why sir mam shabana azami hate much that have ...[why sir mam shabana azami hate much that have...
22[0.05986170098185539, -0.0674145296216011, -0....negativenegative22modi will remain for next 510 years and till t...0.782218modi will remain for next 510 years and till t...[modi will remain for next 510 years and till ...
23[0.023959942162036896, -0.01397246215492487, -...negativepositive23pledge your first vote for modi0.753846pledge your first vote for modi[pledge your first vote for modi]
24[0.04451165348291397, -0.06473662704229355, -0...negativepositive24why need modi lead bjp government again 2019 j...0.775316why need modi lead bjp government again 2019 j...[why need modi lead bjp government again 2019 ...
25[0.06561190634965897, -0.0614917054772377, -0....negativenegative25raghuram rajan sent list high profile bank fra...0.791679raghuram rajan sent list high profile bank fra...[raghuram rajan sent list high profile bank fr...
26[0.05217093229293823, -0.05785880237817764, -0...negativenegative26modi govts slashing indias education budget cl...0.764641modi govts slashing indias education budget cl...[modi govts slashing indias education budget c...
27[0.04579754173755646, -0.051767487078905106, -...negativepositive27why are you hell bent manoj tiwari just her ph...0.748229why are you hell bent manoj tiwari just her ph...[why are you hell bent manoj tiwari just her p...
28[0.047987841069698334, -0.050984784960746765, ...negativenegative28know going into dirty details nehru family its...0.768564know going into dirty details nehru family its...[know going into dirty details nehru family it...
29[0.04509664326906204, -0.05019481107592583, -0...negativenegative29momota begum will let her state become total s...0.745878momota begum will let her state become total s...[momota begum will let her state become total ...
30[0.04315190762281418, -0.04578147828578949, -0...negativepositive30thanks anu sharma will vote and make sure peop...0.768158thanks anu sharma will vote and make sure peop...[thanks anu sharma will vote and make sure peo...
31[0.0144237345084548, -0.052222371101379395, -0...negativepositive31those who themselves dont know how many father...0.752480those who themselves dont know how many father...[those who themselves dont know how many fathe...
32[0.02492097206413746, -0.0531931146979332, -0....negativepositive32the star campaigner myth bjp lost more than as...0.785754the star campaigner myth bjp lost more than as...[the star campaigner myth bjp lost more than a...
33[0.040389616042375565, -0.06375984847545624, -...negativenegative33modi also live for few years only like you not...0.763549modi also live for few years only like you not...[modi also live for few years only like you no...
34[0.06742898374795914, -0.060488566756248474, -...negativepositive34narendra modi more brainy than all the drswamy...0.741321narendra modi more brainy than all the drswamy...[narendra modi more brainy than all the drswam...
35[0.06360629200935364, -0.06786973774433136, -0...negativenegative35have started calling chowkidaar narendra modi ...0.771774have started calling chowkidaar narendra modi ...[have started calling chowkidaar narendra modi...
36[0.024233123287558556, -0.05243394151329994, -...negativepositive36this the difference confident leaders call upo...0.758803this the difference confident leaders call upo...[this the difference confident leaders call up...
37[0.039280060678720474, -0.05146652087569237, -...negativenegative37jawans killed the border\\r\\ncrimes against wom...0.774826jawans killed the border crimes against women ...[jawans killed the border crimes against women...
38[0.05051109194755554, -0.0660049319267273, 0.0...negativenegative38tag this fast growing youtuber cared abt this ...0.789172tag this fast growing youtuber cared abt this ...[tag this fast growing youtuber cared abt this...
39[-0.010975896380841732, -0.059168506413698196,...negativepositive39think hindus should back off and let them suff...0.702905think hindus should back off and let them suff...[think hindus should back off and let them suf...
40[0.02310813218355179, -0.027600247412919998, -...negativepositive40yes cannot make any knee jerk moves drastic ac...0.664961yes cannot make any knee jerk moves drastic ac...[yes cannot make any knee jerk moves drastic a...
41[0.043231260031461716, -0.07101075351238251, -...negativenegative41why picked chairman the devious aadhaar isnt h...0.783011why picked chairman the devious aadhaar isnt h...[why picked chairman the devious aadhaar isnt ...
42[0.04160398617386818, -0.06572042405605316, -0...negativepositive42due automation and artificial intelligence fur...0.748431due automation and artificial intelligence fur...[due automation and artificial intelligence fu...
43[-0.00038854932063259184, -0.04599419981241226...negativepositive43weak state capacity exacerbated excessive acco...0.776327weak state capacity exacerbated excessive acco...[weak state capacity exacerbated excessive acc...
44[-0.02063656784594059, -0.07548005133867264, -...negativepositive44our narendra modi ordered indian air force tak...0.734817our narendra modi ordered indian air force tak...[our narendra modi ordered indian air force ta...
45[0.01779576577246189, -0.06789527088403702, -0...negativenegative45why vote modi dynasty visionary 3no high level...0.758230why vote modi dynasty visionary 3no high level...[why vote modi dynasty visionary 3no high leve...
46[0.065566785633564, -0.04119298234581947, -0.0...negativenegative46its modi chor corrupt maha thugbandhan janta w...0.783157its modi chor corrupt maha thugbandhan janta w...[its modi chor corrupt maha thugbandhan janta ...
47[0.03988223522901535, -0.04965453967452049, -0...negativepositive47before modis arrival 2014 all supported him fo...0.767342before modis arrival 2014 all supported him fo...[before modis arrival 2014 all supported him f...
48[0.010842484422028065, 0.01363383699208498, -0...negativepositive48think you forgot dollar india handled exceptio...0.767096think you forgot dollar india handled exceptio...[think you forgot dollar india handled excepti...
49[-0.01967957802116871, 0.05570048466324806, -0...negativepositive49tulsi gabbard rejected interviews with tyt but...0.677169tulsi gabbard rejected interviews with tyt but...[tulsi gabbard rejected interviews with tyt bu...
\n","
"],"text/plain":[" sentence_embedding_use ... sentence\n","0 [0.060062434524297714, -0.05557167902588844, -... ... [how narendra modi has almost killed the india...\n","1 [0.05362718552350998, -0.004547705873847008, -... ... [you think was modi behind that accident]\n","2 [0.07274721562862396, -0.061593908816576004, -... ... [kamal haasan takes chowkidar modi kamal haasa...\n","3 [0.06106054410338402, -0.060213156044483185, -... ... [connected name with surname not bcz religion ...\n","4 [0.0737471729516983, 0.006071774289011955, -0.... ... [anyone better than modi when nehruji expired ...\n","5 [0.05888386443257332, -0.0646616667509079, -0.... ... [modiji wont tired crying foul main chowkidar ...\n","6 [0.058948416262865067, -0.029682165011763573, ... ... [poor chap modi hasn’ given him anything can...\n","7 [0.051331546157598495, -0.06789953261613846, -... ... [green underwear missing ive been doubting isi...\n","8 [0.044129759073257446, -0.06111813709139824, -... ... [congress years wasnt able complete one rafale...\n","9 [0.03665374591946602, -0.03695330768823624, -0... ... [asked learn from how treat minority well does...\n","10 [0.07035735249519348, -0.06952506303787231, -0... ... [stop bull shitting worry about criminal vivek...\n","11 [0.013958276249468327, -0.030759528279304504, ... ... [drswamys timesnow last year debate nearly mil...\n","12 [0.026277026161551476, -0.06238812580704689, -... ... [asshole bahujan radical marxist grow brain kn...\n","13 [0.07457270473241806, -0.058670494705438614, -... ... [from selling dreams 2014 selling tshirts 2019...\n","14 [0.061704088002443314, -0.04553354158997536, -... ... [very true sir thats why they are against modi...\n","15 [0.053420260548591614, -0.0038897113408893347,... ... [they are giving jobs citizen india what you a...\n","16 [0.027197618037462234, -0.036435648798942566, ... ... [congress has always attempted empower people ...\n","17 [0.06601184606552124, -0.020045213401317596, -... ... [have never said that modi succeed yet even al...\n","18 [0.046943631023168564, -0.06800007820129395, -... ... [the foundation for new india 2022 has already...\n","19 [0.05615750327706337, -0.002462629694491625, -... ... [only rahul gandhis politics love can defeat t...\n","20 [0.030352214351296425, -0.06195472553372383, 0... ... [one step time navigating thru looteyns when e...\n","21 [0.07535804808139801, -0.05643236264586449, -0... ... [why sir mam shabana azami hate much that have...\n","22 [0.05986170098185539, -0.0674145296216011, -0.... ... [modi will remain for next 510 years and till ...\n","23 [0.023959942162036896, -0.01397246215492487, -... ... [pledge your first vote for modi]\n","24 [0.04451165348291397, -0.06473662704229355, -0... ... [why need modi lead bjp government again 2019 ...\n","25 [0.06561190634965897, -0.0614917054772377, -0.... ... [raghuram rajan sent list high profile bank fr...\n","26 [0.05217093229293823, -0.05785880237817764, -0... ... [modi govts slashing indias education budget c...\n","27 [0.04579754173755646, -0.051767487078905106, -... ... [why are you hell bent manoj tiwari just her p...\n","28 [0.047987841069698334, -0.050984784960746765, ... ... [know going into dirty details nehru family it...\n","29 [0.04509664326906204, -0.05019481107592583, -0... ... [momota begum will let her state become total ...\n","30 [0.04315190762281418, -0.04578147828578949, -0... ... [thanks anu sharma will vote and make sure peo...\n","31 [0.0144237345084548, -0.052222371101379395, -0... ... [those who themselves dont know how many fathe...\n","32 [0.02492097206413746, -0.0531931146979332, -0.... ... [the star campaigner myth bjp lost more than a...\n","33 [0.040389616042375565, -0.06375984847545624, -... ... [modi also live for few years only like you no...\n","34 [0.06742898374795914, -0.060488566756248474, -... ... [narendra modi more brainy than all the drswam...\n","35 [0.06360629200935364, -0.06786973774433136, -0... ... [have started calling chowkidaar narendra modi...\n","36 [0.024233123287558556, -0.05243394151329994, -... ... [this the difference confident leaders call up...\n","37 [0.039280060678720474, -0.05146652087569237, -... ... [jawans killed the border crimes against women...\n","38 [0.05051109194755554, -0.0660049319267273, 0.0... ... [tag this fast growing youtuber cared abt this...\n","39 [-0.010975896380841732, -0.059168506413698196,... ... [think hindus should back off and let them suf...\n","40 [0.02310813218355179, -0.027600247412919998, -... ... [yes cannot make any knee jerk moves drastic a...\n","41 [0.043231260031461716, -0.07101075351238251, -... ... [why picked chairman the devious aadhaar isnt ...\n","42 [0.04160398617386818, -0.06572042405605316, -0... ... [due automation and artificial intelligence fu...\n","43 [-0.00038854932063259184, -0.04599419981241226... ... [weak state capacity exacerbated excessive acc...\n","44 [-0.02063656784594059, -0.07548005133867264, -... ... [our narendra modi ordered indian air force ta...\n","45 [0.01779576577246189, -0.06789527088403702, -0... ... [why vote modi dynasty visionary 3no high leve...\n","46 [0.065566785633564, -0.04119298234581947, -0.0... ... [its modi chor corrupt maha thugbandhan janta ...\n","47 [0.03988223522901535, -0.04965453967452049, -0... ... [before modis arrival 2014 all supported him f...\n","48 [0.010842484422028065, 0.01363383699208498, -0... ... [think you forgot dollar india handled excepti...\n","49 [-0.01967957802116871, 0.05570048466324806, -0... ... [tulsi gabbard rejected interviews with tyt bu...\n","\n","[50 rows x 8 columns]"]},"metadata":{"tags":[]},"execution_count":4}]},{"cell_type":"markdown","metadata":{"id":"lVyOE2wV0fw_"},"source":["# Test the fitted pipe on new example"]},{"cell_type":"code","metadata":{"colab":{"base_uri":"https://localhost:8080/","height":76},"id":"qdCUg2MR0PD2","executionInfo":{"status":"ok","timestamp":1620214646472,"user_tz":-120,"elapsed":260997,"user":{"displayName":"Christian Kasim Loan","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GjqAD-ircKP-s5Eh6JSdkDggDczfqQbJGU_IRb4Hw=s64","userId":"14469489166467359317"}},"outputId":"7fe8bbe8-421a-4231-971e-8527629b7bc8"},"source":["fitted_pipe.predict('the president of india just died')"],"execution_count":null,"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","
sentence_embedding_usetrained_sentimentorigin_indextrained_sentiment_confidencedocumentsentence
0[0.013345886953175068, -0.021778283640742302, ...negative00.722135the president of india just died[the president of india just died]
\n","
"],"text/plain":[" sentence_embedding_use ... sentence\n","0 [0.013345886953175068, -0.021778283640742302, ... ... [the president of india just died]\n","\n","[1 rows x 6 columns]"]},"metadata":{"tags":[]},"execution_count":5}]},{"cell_type":"markdown","metadata":{"id":"xflpwrVjjBVD"},"source":["## Configure pipe training parameters"]},{"cell_type":"code","metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"UtsAUGTmOTms","executionInfo":{"status":"ok","timestamp":1620214646475,"user_tz":-120,"elapsed":260995,"user":{"displayName":"Christian Kasim Loan","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GjqAD-ircKP-s5Eh6JSdkDggDczfqQbJGU_IRb4Hw=s64","userId":"14469489166467359317"}},"outputId":"47f312f8-22c4-432e-a7e0-e152aedf6585"},"source":["trainable_pipe.print_info()"],"execution_count":null,"outputs":[{"output_type":"stream","text":["The following parameters are configurable for this NLU pipeline (You can copy paste the examples) :\n",">>> pipe['sentiment_dl'] has settable params:\n","pipe['sentiment_dl'].setMaxEpochs(1) | Info: Maximum number of epochs to train | Currently set to : 1\n","pipe['sentiment_dl'].setLr(0.005) | Info: Learning Rate | Currently set to : 0.005\n","pipe['sentiment_dl'].setBatchSize(64) | Info: Batch size | Currently set to : 64\n","pipe['sentiment_dl'].setDropout(0.5) | Info: Dropout coefficient | Currently set to : 0.5\n","pipe['sentiment_dl'].setEnableOutputLogs(True) | Info: Whether to use stdout in addition to Spark logs. | Currently set to : True\n","pipe['sentiment_dl'].setThreshold(0.6) | Info: The minimum threshold for the final result otheriwse it will be neutral | Currently set to : 0.6\n","pipe['sentiment_dl'].setThresholdLabel('neutral') | Info: In case the score is less than threshold, what should be the label. Default is neutral. | Currently set to : neutral\n",">>> pipe['use@tfhub_use'] has settable params:\n","pipe['use@tfhub_use'].setDimension(512) | Info: Number of embedding dimensions | Currently set to : 512\n","pipe['use@tfhub_use'].setLoadSP(False) | Info: Whether to load SentencePiece ops file which is required only by multi-lingual models. This is not changeable after it's set with a pretrained model nor it is compatible with Windows. | Currently set to : False\n","pipe['use@tfhub_use'].setStorageRef('tfhub_use') | Info: unique reference name for identification | Currently set to : tfhub_use\n",">>> pipe['deep_sentence_detector@SentenceDetectorDLModel_c83c27f46b97'] has settable params:\n","pipe['deep_sentence_detector@SentenceDetectorDLModel_c83c27f46b97'].setExplodeSentences(False) | Info: whether to explode each sentence into a different row, for better parallelization. Defaults to false. | Currently set to : False\n","pipe['deep_sentence_detector@SentenceDetectorDLModel_c83c27f46b97'].setStorageRef('SentenceDetectorDLModel_c83c27f46b97') | Info: storage unique identifier | Currently set to : SentenceDetectorDLModel_c83c27f46b97\n","pipe['deep_sentence_detector@SentenceDetectorDLModel_c83c27f46b97'].setEncoder(com.johnsnowlabs.nlp.annotators.sentence_detector_dl.SentenceDetectorDLEncoder@3e286d29) | Info: Data encoder | Currently set to : com.johnsnowlabs.nlp.annotators.sentence_detector_dl.SentenceDetectorDLEncoder@3e286d29\n","pipe['deep_sentence_detector@SentenceDetectorDLModel_c83c27f46b97'].setImpossiblePenultimates(['Bros', 'No', 'al', 'vs', 'etc', 'Fig', 'Dr', 'Prof', 'PhD', 'MD', 'Co', 'Corp', 'Inc', 'bros', 'VS', 'Vs', 'ETC', 'fig', 'dr', 'prof', 'PHD', 'phd', 'md', 'co', 'corp', 'inc', 'Jan', 'Feb', 'Mar', 'Apr', 'Jul', 'Aug', 'Sep', 'Sept', 'Oct', 'Nov', 'Dec', 'St', 'st', 'AM', 'PM', 'am', 'pm', 'e.g', 'f.e', 'i.e']) | Info: Impossible penultimates | Currently set to : ['Bros', 'No', 'al', 'vs', 'etc', 'Fig', 'Dr', 'Prof', 'PhD', 'MD', 'Co', 'Corp', 'Inc', 'bros', 'VS', 'Vs', 'ETC', 'fig', 'dr', 'prof', 'PHD', 'phd', 'md', 'co', 'corp', 'inc', 'Jan', 'Feb', 'Mar', 'Apr', 'Jul', 'Aug', 'Sep', 'Sept', 'Oct', 'Nov', 'Dec', 'St', 'st', 'AM', 'PM', 'am', 'pm', 'e.g', 'f.e', 'i.e']\n","pipe['deep_sentence_detector@SentenceDetectorDLModel_c83c27f46b97'].setModelArchitecture('cnn') | Info: Model architecture (CNN) | Currently set to : cnn\n",">>> pipe['document_assembler'] has settable params:\n","pipe['document_assembler'].setCleanupMode('shrink') | Info: possible values: disabled, inplace, inplace_full, shrink, shrink_full, each, each_full, delete_full | Currently set to : shrink\n"],"name":"stdout"}]},{"cell_type":"markdown","metadata":{"id":"2GJdDNV9jEIe"},"source":["## Retrain with new parameters"]},{"cell_type":"code","metadata":{"colab":{"base_uri":"https://localhost:8080/","height":1000},"id":"mptfvHx-MMMX","executionInfo":{"status":"ok","timestamp":1620214651490,"user_tz":-120,"elapsed":266005,"user":{"displayName":"Christian Kasim Loan","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GjqAD-ircKP-s5Eh6JSdkDggDczfqQbJGU_IRb4Hw=s64","userId":"14469489166467359317"}},"outputId":"d2862ef6-efc5-46b8-cf34-077b6ee3f4b5"},"source":["# Train longer!\n","trainable_pipe = nlu.load('train.sentiment')\n","trainable_pipe['trainable_sentiment_dl'].setMaxEpochs(5) \n","fitted_pipe = trainable_pipe.fit(train_df.iloc[:50])\n","# predict with the trainable pipeline on dataset and get predictions\n","preds = fitted_pipe.predict(train_df.iloc[:50],output_level='document')\n","\n","#sentence detector that is part of the pipe generates sone NaNs. lets drop them first\n","preds.dropna(inplace=True)\n","print(classification_report(preds['y'], preds['sentiment']))\n","\n","preds"],"execution_count":null,"outputs":[{"output_type":"stream","text":[" precision recall f1-score support\n","\n"," negative 0.79 0.96 0.87 27\n"," neutral 0.00 0.00 0.00 0\n"," positive 1.00 0.09 0.16 23\n","\n"," accuracy 0.56 50\n"," macro avg 0.60 0.35 0.34 50\n","weighted avg 0.89 0.56 0.54 50\n","\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"," \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"," \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"," \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"," \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"," \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"," \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"," \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"," \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"," \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"," \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"," \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","
sentence_embedding_usetrained_sentimentyorigin_indextexttrained_sentiment_confidencedocumentsentence
0[0.060062434524297714, -0.05557167902588844, -...negativenegative0how narendra modi has almost killed the indian...0.689142how narendra modi has almost killed the indian...[how narendra modi has almost killed the india...
1[0.05362718552350998, -0.004547705873847008, -...negativenegative1you think was modi behind that accident0.689483you think was modi behind that accident[you think was modi behind that accident]
2[0.07274721562862396, -0.061593908816576004, -...negativenegative2kamal haasan takes chowkidar modi kamal haasan...0.707988kamal haasan takes chowkidar modi kamal haasan...[kamal haasan takes chowkidar modi kamal haasa...
3[0.06106054410338402, -0.060213156044483185, -...negativenegative3connected name with surname not bcz religion c...0.675382connected name with surname not bcz religion c...[connected name with surname not bcz religion ...
4[0.0737471729516983, 0.006071774289011955, -0....negativepositive4anyone better than modi when nehruji expired s...0.638730anyone better than modi when nehruji expired s...[anyone better than modi when nehruji expired ...
5[0.05888386443257332, -0.0646616667509079, -0....negativenegative5\\r\\nmodiji wont tired crying foul\\r\\nmain chow...0.723110modiji wont tired crying foul main chowkidar h...[modiji wont tired crying foul main chowkidar ...
6[0.058948416262865067, -0.029682165011763573, ...negativenegative6poor chap modi hasn’ given him anything can ...0.690602poor chap modi hasn’ given him anything can ...[poor chap modi hasn’ given him anything can...
7[0.051331546157598495, -0.06789953261613846, -...negativenegative7green underwear missing ive been doubting isi ...0.705077green underwear missing ive been doubting isi ...[green underwear missing ive been doubting isi...
8[0.044129759073257446, -0.06111813709139824, -...neutralpositive8congress years wasnt able complete one rafale ...0.561979congress years wasnt able complete one rafale ...[congress years wasnt able complete one rafale...
9[0.03665374591946602, -0.03695330768823624, -0...negativenegative9asked learn from how treat minority well does ...0.746584asked learn from how treat minority well does ...[asked learn from how treat minority well does...
10[0.07035735249519348, -0.06952506303787231, -0...negativenegative10stop bull shitting worry about criminal vivek ...0.768111stop bull shitting worry about criminal vivek ...[stop bull shitting worry about criminal vivek...
11[0.013958276249468327, -0.030759528279304504, ...neutralpositive11drswamys timesnow last year debate nearly mill...0.511294drswamys timesnow last year debate nearly mill...[drswamys timesnow last year debate nearly mil...
12[0.026277026161551476, -0.06238812580704689, -...negativenegative12asshole bahujan radical marxist grow brain kno...0.689268asshole bahujan radical marxist grow brain kno...[asshole bahujan radical marxist grow brain kn...
13[0.07457270473241806, -0.058670494705438614, -...negativepositive13from selling dreams 2014 selling tshirts 2019 ...0.641822from selling dreams 2014 selling tshirts 2019 ...[from selling dreams 2014 selling tshirts 2019...
14[0.061704088002443314, -0.04553354158997536, -...negativepositive14very true sir thats why they are against modi ...0.651230very true sir thats why they are against modi ...[very true sir thats why they are against modi...
15[0.053420260548591614, -0.0038897113408893347,...negativenegative15they are giving jobs citizen india what you ar...0.706768they are giving jobs citizen india what you ar...[they are giving jobs citizen india what you a...
16[0.027197618037462234, -0.036435648798942566, ...negativenegative16congress has always attempted empower people g...0.607062congress has always attempted empower people g...[congress has always attempted empower people ...
17[0.06601184606552124, -0.020045213401317596, -...negativepositive17have never said that modi succeed yet even als...0.628577have never said that modi succeed yet even als...[have never said that modi succeed yet even al...
18[0.046943631023168564, -0.06800007820129395, -...neutralpositive18\\r\\nthe foundation for new india 2022 has alre...0.547697the foundation for new india 2022 has already ...[the foundation for new india 2022 has already...
19[0.05615750327706337, -0.002462629694491625, -...negativenegative19only rahul gandhis politics love can defeat th...0.632572only rahul gandhis politics love can defeat th...[only rahul gandhis politics love can defeat t...
20[0.030352214351296425, -0.06195472553372383, 0...negativenegative20one step time navigating thru looteyns when ev...0.635106one step time navigating thru looteyns when ev...[one step time navigating thru looteyns when e...
21[0.07535804808139801, -0.05643236264586449, -0...negativenegative21why sir mam shabana azami hate much that have ...0.738669why sir mam shabana azami hate much that have ...[why sir mam shabana azami hate much that have...
22[0.05986170098185539, -0.0674145296216011, -0....negativenegative22modi will remain for next 510 years and till t...0.659078modi will remain for next 510 years and till t...[modi will remain for next 510 years and till ...
23[0.023959942162036896, -0.01397246215492487, -...neutralpositive23pledge your first vote for modi0.555447pledge your first vote for modi[pledge your first vote for modi]
24[0.04451165348291397, -0.06473662704229355, -0...neutralpositive24why need modi lead bjp government again 2019 j...0.578395why need modi lead bjp government again 2019 j...[why need modi lead bjp government again 2019 ...
25[0.06561190634965897, -0.0614917054772377, -0....negativenegative25raghuram rajan sent list high profile bank fra...0.706507raghuram rajan sent list high profile bank fra...[raghuram rajan sent list high profile bank fr...
26[0.05217093229293823, -0.05785880237817764, -0...negativenegative26modi govts slashing indias education budget cl...0.607360modi govts slashing indias education budget cl...[modi govts slashing indias education budget c...
27[0.04579754173755646, -0.051767487078905106, -...neutralpositive27why are you hell bent manoj tiwari just her ph...0.588993why are you hell bent manoj tiwari just her ph...[why are you hell bent manoj tiwari just her p...
28[0.047987841069698334, -0.050984784960746765, ...negativenegative28know going into dirty details nehru family its...0.753084know going into dirty details nehru family its...[know going into dirty details nehru family it...
29[0.04509664326906204, -0.05019481107592583, -0...negativenegative29momota begum will let her state become total s...0.615988momota begum will let her state become total s...[momota begum will let her state become total ...
30[0.04315190762281418, -0.04578147828578949, -0...neutralpositive30thanks anu sharma will vote and make sure peop...0.555271thanks anu sharma will vote and make sure peop...[thanks anu sharma will vote and make sure peo...
31[0.0144237345084548, -0.052222371101379395, -0...negativepositive31those who themselves dont know how many father...0.631877those who themselves dont know how many father...[those who themselves dont know how many fathe...
32[0.02492097206413746, -0.0531931146979332, -0....neutralpositive32the star campaigner myth bjp lost more than as...0.586682the star campaigner myth bjp lost more than as...[the star campaigner myth bjp lost more than a...
33[0.040389616042375565, -0.06375984847545624, -...neutralnegative33modi also live for few years only like you not...0.587196modi also live for few years only like you not...[modi also live for few years only like you no...
34[0.06742898374795914, -0.060488566756248474, -...neutralpositive34narendra modi more brainy than all the drswamy...0.533663narendra modi more brainy than all the drswamy...[narendra modi more brainy than all the drswam...
35[0.06360629200935364, -0.06786973774433136, -0...negativenegative35have started calling chowkidaar narendra modi ...0.672972have started calling chowkidaar narendra modi ...[have started calling chowkidaar narendra modi...
36[0.024233123287558556, -0.05243394151329994, -...neutralpositive36this the difference confident leaders call upo...0.510922this the difference confident leaders call upo...[this the difference confident leaders call up...
37[0.039280060678720474, -0.05146652087569237, -...negativenegative37jawans killed the border\\r\\ncrimes against wom...0.701794jawans killed the border crimes against women ...[jawans killed the border crimes against women...
38[0.05051109194755554, -0.0660049319267273, 0.0...negativenegative38tag this fast growing youtuber cared abt this ...0.714883tag this fast growing youtuber cared abt this ...[tag this fast growing youtuber cared abt this...
39[-0.010975896380841732, -0.059168506413698196,...neutralpositive39think hindus should back off and let them suff...0.553189think hindus should back off and let them suff...[think hindus should back off and let them suf...
40[0.02310813218355179, -0.027600247412919998, -...positivepositive40yes cannot make any knee jerk moves drastic ac...0.671809yes cannot make any knee jerk moves drastic ac...[yes cannot make any knee jerk moves drastic a...
41[0.043231260031461716, -0.07101075351238251, -...negativenegative41why picked chairman the devious aadhaar isnt h...0.709371why picked chairman the devious aadhaar isnt h...[why picked chairman the devious aadhaar isnt ...
42[0.04160398617386818, -0.06572042405605316, -0...neutralpositive42due automation and artificial intelligence fur...0.553482due automation and artificial intelligence fur...[due automation and artificial intelligence fu...
43[-0.00038854932063259184, -0.04599419981241226...negativepositive43weak state capacity exacerbated excessive acco...0.609747weak state capacity exacerbated excessive acco...[weak state capacity exacerbated excessive acc...
44[-0.02063656784594059, -0.07548005133867264, -...neutralpositive44our narendra modi ordered indian air force tak...0.513191our narendra modi ordered indian air force tak...[our narendra modi ordered indian air force ta...
45[0.01779576577246189, -0.06789527088403702, -0...negativenegative45why vote modi dynasty visionary 3no high level...0.635148why vote modi dynasty visionary 3no high level...[why vote modi dynasty visionary 3no high leve...
46[0.065566785633564, -0.04119298234581947, -0.0...negativenegative46its modi chor corrupt maha thugbandhan janta w...0.687171its modi chor corrupt maha thugbandhan janta w...[its modi chor corrupt maha thugbandhan janta ...
47[0.03988223522901535, -0.04965453967452049, -0...neutralpositive47before modis arrival 2014 all supported him fo...0.557571before modis arrival 2014 all supported him fo...[before modis arrival 2014 all supported him f...
48[0.010842484422028065, 0.01363383699208498, -0...negativepositive48think you forgot dollar india handled exceptio...0.615532think you forgot dollar india handled exceptio...[think you forgot dollar india handled excepti...
49[-0.01967957802116871, 0.05570048466324806, -0...positivepositive49tulsi gabbard rejected interviews with tyt but...0.604604tulsi gabbard rejected interviews with tyt but...[tulsi gabbard rejected interviews with tyt bu...
\n","
"],"text/plain":[" sentence_embedding_use ... sentence\n","0 [0.060062434524297714, -0.05557167902588844, -... ... [how narendra modi has almost killed the india...\n","1 [0.05362718552350998, -0.004547705873847008, -... ... [you think was modi behind that accident]\n","2 [0.07274721562862396, -0.061593908816576004, -... ... [kamal haasan takes chowkidar modi kamal haasa...\n","3 [0.06106054410338402, -0.060213156044483185, -... ... [connected name with surname not bcz religion ...\n","4 [0.0737471729516983, 0.006071774289011955, -0.... ... [anyone better than modi when nehruji expired ...\n","5 [0.05888386443257332, -0.0646616667509079, -0.... ... [modiji wont tired crying foul main chowkidar ...\n","6 [0.058948416262865067, -0.029682165011763573, ... ... [poor chap modi hasn’ given him anything can...\n","7 [0.051331546157598495, -0.06789953261613846, -... ... [green underwear missing ive been doubting isi...\n","8 [0.044129759073257446, -0.06111813709139824, -... ... [congress years wasnt able complete one rafale...\n","9 [0.03665374591946602, -0.03695330768823624, -0... ... [asked learn from how treat minority well does...\n","10 [0.07035735249519348, -0.06952506303787231, -0... ... [stop bull shitting worry about criminal vivek...\n","11 [0.013958276249468327, -0.030759528279304504, ... ... [drswamys timesnow last year debate nearly mil...\n","12 [0.026277026161551476, -0.06238812580704689, -... ... [asshole bahujan radical marxist grow brain kn...\n","13 [0.07457270473241806, -0.058670494705438614, -... ... [from selling dreams 2014 selling tshirts 2019...\n","14 [0.061704088002443314, -0.04553354158997536, -... ... [very true sir thats why they are against modi...\n","15 [0.053420260548591614, -0.0038897113408893347,... ... [they are giving jobs citizen india what you a...\n","16 [0.027197618037462234, -0.036435648798942566, ... ... [congress has always attempted empower people ...\n","17 [0.06601184606552124, -0.020045213401317596, -... ... [have never said that modi succeed yet even al...\n","18 [0.046943631023168564, -0.06800007820129395, -... ... [the foundation for new india 2022 has already...\n","19 [0.05615750327706337, -0.002462629694491625, -... ... [only rahul gandhis politics love can defeat t...\n","20 [0.030352214351296425, -0.06195472553372383, 0... ... [one step time navigating thru looteyns when e...\n","21 [0.07535804808139801, -0.05643236264586449, -0... ... [why sir mam shabana azami hate much that have...\n","22 [0.05986170098185539, -0.0674145296216011, -0.... ... [modi will remain for next 510 years and till ...\n","23 [0.023959942162036896, -0.01397246215492487, -... ... [pledge your first vote for modi]\n","24 [0.04451165348291397, -0.06473662704229355, -0... ... [why need modi lead bjp government again 2019 ...\n","25 [0.06561190634965897, -0.0614917054772377, -0.... ... [raghuram rajan sent list high profile bank fr...\n","26 [0.05217093229293823, -0.05785880237817764, -0... ... [modi govts slashing indias education budget c...\n","27 [0.04579754173755646, -0.051767487078905106, -... ... [why are you hell bent manoj tiwari just her p...\n","28 [0.047987841069698334, -0.050984784960746765, ... ... [know going into dirty details nehru family it...\n","29 [0.04509664326906204, -0.05019481107592583, -0... ... [momota begum will let her state become total ...\n","30 [0.04315190762281418, -0.04578147828578949, -0... ... [thanks anu sharma will vote and make sure peo...\n","31 [0.0144237345084548, -0.052222371101379395, -0... ... [those who themselves dont know how many fathe...\n","32 [0.02492097206413746, -0.0531931146979332, -0.... ... [the star campaigner myth bjp lost more than a...\n","33 [0.040389616042375565, -0.06375984847545624, -... ... [modi also live for few years only like you no...\n","34 [0.06742898374795914, -0.060488566756248474, -... ... [narendra modi more brainy than all the drswam...\n","35 [0.06360629200935364, -0.06786973774433136, -0... ... [have started calling chowkidaar narendra modi...\n","36 [0.024233123287558556, -0.05243394151329994, -... ... [this the difference confident leaders call up...\n","37 [0.039280060678720474, -0.05146652087569237, -... ... [jawans killed the border crimes against women...\n","38 [0.05051109194755554, -0.0660049319267273, 0.0... ... [tag this fast growing youtuber cared abt this...\n","39 [-0.010975896380841732, -0.059168506413698196,... ... [think hindus should back off and let them suf...\n","40 [0.02310813218355179, -0.027600247412919998, -... ... [yes cannot make any knee jerk moves drastic a...\n","41 [0.043231260031461716, -0.07101075351238251, -... ... [why picked chairman the devious aadhaar isnt ...\n","42 [0.04160398617386818, -0.06572042405605316, -0... ... [due automation and artificial intelligence fu...\n","43 [-0.00038854932063259184, -0.04599419981241226... ... [weak state capacity exacerbated excessive acc...\n","44 [-0.02063656784594059, -0.07548005133867264, -... ... [our narendra modi ordered indian air force ta...\n","45 [0.01779576577246189, -0.06789527088403702, -0... ... [why vote modi dynasty visionary 3no high leve...\n","46 [0.065566785633564, -0.04119298234581947, -0.0... ... [its modi chor corrupt maha thugbandhan janta ...\n","47 [0.03988223522901535, -0.04965453967452049, -0... ... [before modis arrival 2014 all supported him f...\n","48 [0.010842484422028065, 0.01363383699208498, -0... ... [think you forgot dollar india handled excepti...\n","49 [-0.01967957802116871, 0.05570048466324806, -0... ... [tulsi gabbard rejected interviews with tyt bu...\n","\n","[50 rows x 8 columns]"]},"metadata":{"tags":[]},"execution_count":7}]},{"cell_type":"markdown","metadata":{"id":"qFoT-s1MjTSS"},"source":["# Try training with different Embeddings"]},{"cell_type":"code","metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"nxWFzQOhjWC8","executionInfo":{"status":"ok","timestamp":1620214651491,"user_tz":-120,"elapsed":266002,"user":{"displayName":"Christian Kasim Loan","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GjqAD-ircKP-s5Eh6JSdkDggDczfqQbJGU_IRb4Hw=s64","userId":"14469489166467359317"}},"outputId":"36b0db66-250d-499a-acce-976bd9e188e9"},"source":["# We can use nlu.print_components(action='embed_sentence') to see every possibler sentence embedding we could use. Lets use bert!\n","nlu.print_components(action='embed_sentence')"],"execution_count":null,"outputs":[{"output_type":"stream","text":["For language NLU provides the following Models : \n","nlu.load('en.embed_sentence') returns Spark NLP model tfhub_use\n","nlu.load('en.embed_sentence.use') returns Spark NLP model tfhub_use\n","nlu.load('en.embed_sentence.tfhub_use') returns Spark NLP model tfhub_use\n","nlu.load('en.embed_sentence.use.lg') returns Spark NLP model tfhub_use_lg\n","nlu.load('en.embed_sentence.tfhub_use.lg') returns Spark NLP model tfhub_use_lg\n","nlu.load('en.embed_sentence.albert') returns Spark NLP model albert_base_uncased\n","nlu.load('en.embed_sentence.electra') returns Spark NLP model sent_electra_small_uncased\n","nlu.load('en.embed_sentence.electra_small_uncased') returns Spark NLP model sent_electra_small_uncased\n","nlu.load('en.embed_sentence.electra_base_uncased') returns Spark NLP model sent_electra_base_uncased\n","nlu.load('en.embed_sentence.electra_large_uncased') returns Spark NLP model sent_electra_large_uncased\n","nlu.load('en.embed_sentence.bert') returns Spark NLP model sent_bert_base_uncased\n","nlu.load('en.embed_sentence.bert_base_uncased') returns Spark NLP model sent_bert_base_uncased\n","nlu.load('en.embed_sentence.bert_base_cased') returns Spark NLP model sent_bert_base_cased\n","nlu.load('en.embed_sentence.bert_large_uncased') returns Spark NLP model sent_bert_large_uncased\n","nlu.load('en.embed_sentence.bert_large_cased') returns Spark NLP model sent_bert_large_cased\n","nlu.load('en.embed_sentence.biobert.pubmed_base_cased') returns Spark NLP model sent_biobert_pubmed_base_cased\n","nlu.load('en.embed_sentence.biobert.pubmed_large_cased') returns Spark NLP model sent_biobert_pubmed_large_cased\n","nlu.load('en.embed_sentence.biobert.pmc_base_cased') returns Spark NLP model sent_biobert_pmc_base_cased\n","nlu.load('en.embed_sentence.biobert.pubmed_pmc_base_cased') returns Spark NLP model sent_biobert_pubmed_pmc_base_cased\n","nlu.load('en.embed_sentence.biobert.clinical_base_cased') returns Spark NLP model sent_biobert_clinical_base_cased\n","nlu.load('en.embed_sentence.biobert.discharge_base_cased') returns Spark NLP model sent_biobert_discharge_base_cased\n","nlu.load('en.embed_sentence.covidbert.large_uncased') returns Spark NLP model sent_covidbert_large_uncased\n","nlu.load('en.embed_sentence.small_bert_L2_128') returns Spark NLP model sent_small_bert_L2_128\n","nlu.load('en.embed_sentence.small_bert_L4_128') returns Spark NLP model sent_small_bert_L4_128\n","nlu.load('en.embed_sentence.small_bert_L6_128') returns Spark NLP model sent_small_bert_L6_128\n","nlu.load('en.embed_sentence.small_bert_L8_128') returns Spark NLP model sent_small_bert_L8_128\n","nlu.load('en.embed_sentence.small_bert_L10_128') returns Spark NLP model sent_small_bert_L10_128\n","nlu.load('en.embed_sentence.small_bert_L12_128') returns Spark NLP model sent_small_bert_L12_128\n","nlu.load('en.embed_sentence.small_bert_L2_256') returns Spark NLP model sent_small_bert_L2_256\n","nlu.load('en.embed_sentence.small_bert_L4_256') returns Spark NLP model sent_small_bert_L4_256\n","nlu.load('en.embed_sentence.small_bert_L6_256') returns Spark NLP model sent_small_bert_L6_256\n","nlu.load('en.embed_sentence.small_bert_L8_256') returns Spark NLP model sent_small_bert_L8_256\n","nlu.load('en.embed_sentence.small_bert_L10_256') returns Spark NLP model sent_small_bert_L10_256\n","nlu.load('en.embed_sentence.small_bert_L12_256') returns Spark NLP model sent_small_bert_L12_256\n","nlu.load('en.embed_sentence.small_bert_L2_512') returns Spark NLP model sent_small_bert_L2_512\n","nlu.load('en.embed_sentence.small_bert_L4_512') returns Spark NLP model sent_small_bert_L4_512\n","nlu.load('en.embed_sentence.small_bert_L6_512') returns Spark NLP model sent_small_bert_L6_512\n","nlu.load('en.embed_sentence.small_bert_L8_512') returns Spark NLP model sent_small_bert_L8_512\n","nlu.load('en.embed_sentence.small_bert_L10_512') returns Spark NLP model sent_small_bert_L10_512\n","nlu.load('en.embed_sentence.small_bert_L12_512') returns Spark NLP model sent_small_bert_L12_512\n","nlu.load('en.embed_sentence.small_bert_L2_768') returns Spark NLP model sent_small_bert_L2_768\n","nlu.load('en.embed_sentence.small_bert_L4_768') returns Spark NLP model sent_small_bert_L4_768\n","nlu.load('en.embed_sentence.small_bert_L6_768') returns Spark NLP model sent_small_bert_L6_768\n","nlu.load('en.embed_sentence.small_bert_L8_768') returns Spark NLP model sent_small_bert_L8_768\n","nlu.load('en.embed_sentence.small_bert_L10_768') returns Spark NLP model sent_small_bert_L10_768\n","nlu.load('en.embed_sentence.small_bert_L12_768') returns Spark NLP model sent_small_bert_L12_768\n","For language NLU provides the following Models : \n","nlu.load('fi.embed_sentence') returns Spark NLP model sent_bert_finnish_cased\n","nlu.load('fi.embed_sentence.bert.cased') returns Spark NLP model sent_bert_finnish_cased\n","nlu.load('fi.embed_sentence.bert.uncased') returns Spark NLP model sent_bert_finnish_uncased\n","For language NLU provides the following Models : \n","nlu.load('xx.embed_sentence') returns Spark NLP model sent_bert_multi_cased\n","nlu.load('xx.embed_sentence.bert') returns Spark NLP model sent_bert_multi_cased\n","nlu.load('xx.embed_sentence.bert.cased') returns Spark NLP model sent_bert_multi_cased\n","nlu.load('xx.embed_sentence.labse') returns Spark NLP model labse\n"],"name":"stdout"}]},{"cell_type":"code","metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"IKK_Ii_gjJfF","executionInfo":{"status":"ok","timestamp":1620215021948,"user_tz":-120,"elapsed":636454,"user":{"displayName":"Christian Kasim Loan","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GjqAD-ircKP-s5Eh6JSdkDggDczfqQbJGU_IRb4Hw=s64","userId":"14469489166467359317"}},"outputId":"8669ed6f-b02a-4b6a-b1f4-9dc850d2d384"},"source":["trainable_pipe = nlu.load('en.embed_sentence.small_bert_L12_768 train.sentiment')\n","# We need to train longer and user smaller LR for NON-USE based sentence embeddings usually\n","# We could tune the hyperparameters further with hyperparameter tuning methods like gridsearch\n","# Also longer training gives more accuracy\n","trainable_pipe['trainable_sentiment_dl'].setMaxEpochs(100) \n","trainable_pipe['trainable_sentiment_dl'].setLr(0.0005) \n","fitted_pipe = trainable_pipe.fit(train_df)\n","# predict with the trainable pipeline on dataset and get predictions\n","preds = fitted_pipe.predict(train_df,output_level='document')\n","\n","#sentence detector that is part of the pipe generates sone NaNs. lets drop them first\n","preds.dropna(inplace=True)\n","print(classification_report(preds['y'], preds['sentiment']))\n","\n","#preds"],"execution_count":null,"outputs":[{"output_type":"stream","text":["sent_small_bert_L12_768 download started this may take some time.\n","Approximate size to download 392.9 MB\n","[OK!]\n","sentence_detector_dl download started this may take some time.\n","Approximate size to download 354.6 KB\n","[OK!]\n"," precision recall f1-score support\n","\n"," negative 0.78 0.67 0.72 300\n"," neutral 0.00 0.00 0.00 0\n"," positive 0.86 0.56 0.67 300\n","\n"," accuracy 0.61 600\n"," macro avg 0.54 0.41 0.46 600\n","weighted avg 0.82 0.61 0.70 600\n","\n"],"name":"stdout"}]},{"cell_type":"markdown","metadata":{"id":"2BB-NwZUoHSe"},"source":["# 5. Lets save the model"]},{"cell_type":"code","metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"eLex095goHwm","executionInfo":{"status":"ok","timestamp":1620215202403,"user_tz":-120,"elapsed":816905,"user":{"displayName":"Christian Kasim Loan","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GjqAD-ircKP-s5Eh6JSdkDggDczfqQbJGU_IRb4Hw=s64","userId":"14469489166467359317"}},"outputId":"3b42a600-3686-4fe9-a430-93647db780af"},"source":["stored_model_path = './models/classifier_dl_trained' \n","fitted_pipe.save(stored_model_path)"],"execution_count":null,"outputs":[{"output_type":"stream","text":["Stored model in ./models/classifier_dl_trained\n"],"name":"stdout"}]},{"cell_type":"markdown","metadata":{"id":"e_b2DPd4rCiU"},"source":["# 6. Lets load the model from HDD.\n","This makes Offlien NLU usage possible! \n","You need to call nlu.load(path=path_to_the_pipe) to load a model/pipeline from disk."]},{"cell_type":"code","metadata":{"id":"SO4uz45MoRgp","colab":{"base_uri":"https://localhost:8080/","height":76},"executionInfo":{"status":"ok","timestamp":1620215216214,"user_tz":-120,"elapsed":830714,"user":{"displayName":"Christian Kasim Loan","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GjqAD-ircKP-s5Eh6JSdkDggDczfqQbJGU_IRb4Hw=s64","userId":"14469489166467359317"}},"outputId":"fce06315-d677-491f-9a59-c276b6d23b62"},"source":["hdd_pipe = nlu.load(path=stored_model_path)\n","\n","preds = hdd_pipe.predict('the president of india just died')\n","preds"],"execution_count":null,"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","
sentimentsentence_embedding_from_diskorigin_indextextsentiment_confidencedocumentsentence
0[positive][[0.009460609406232834, -0.07943306118249893, ...8589934592the president of india just died[0.8165338]the president of india just died[the president of india just died]
\n","
"],"text/plain":[" sentiment ... sentence\n","0 [positive] ... [the president of india just died]\n","\n","[1 rows x 7 columns]"]},"metadata":{"tags":[]},"execution_count":11}]},{"cell_type":"code","metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"e0CVlkk9v6Qi","executionInfo":{"status":"ok","timestamp":1620215216215,"user_tz":-120,"elapsed":830711,"user":{"displayName":"Christian Kasim Loan","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GjqAD-ircKP-s5Eh6JSdkDggDczfqQbJGU_IRb4Hw=s64","userId":"14469489166467359317"}},"outputId":"d0978b3b-d8fd-4c14-e00b-7e5e34450ea7"},"source":["hdd_pipe.print_info()"],"execution_count":null,"outputs":[{"output_type":"stream","text":["The following parameters are configurable for this NLU pipeline (You can copy paste the examples) :\n",">>> pipe['document_assembler'] has settable params:\n","pipe['document_assembler'].setCleanupMode('shrink') | Info: possible values: disabled, inplace, inplace_full, shrink, shrink_full, each, each_full, delete_full | Currently set to : shrink\n",">>> pipe['sentence_detector@SentenceDetectorDLModel_c83c27f46b97'] has settable params:\n","pipe['sentence_detector@SentenceDetectorDLModel_c83c27f46b97'].setExplodeSentences(False) | Info: whether to explode each sentence into a different row, for better parallelization. Defaults to false. | Currently set to : False\n","pipe['sentence_detector@SentenceDetectorDLModel_c83c27f46b97'].setStorageRef('SentenceDetectorDLModel_c83c27f46b97') | Info: storage unique identifier | Currently set to : SentenceDetectorDLModel_c83c27f46b97\n","pipe['sentence_detector@SentenceDetectorDLModel_c83c27f46b97'].setEncoder(com.johnsnowlabs.nlp.annotators.sentence_detector_dl.SentenceDetectorDLEncoder@3c74a4cb) | Info: Data encoder | Currently set to : com.johnsnowlabs.nlp.annotators.sentence_detector_dl.SentenceDetectorDLEncoder@3c74a4cb\n","pipe['sentence_detector@SentenceDetectorDLModel_c83c27f46b97'].setImpossiblePenultimates(['Bros', 'No', 'al', 'vs', 'etc', 'Fig', 'Dr', 'Prof', 'PhD', 'MD', 'Co', 'Corp', 'Inc', 'bros', 'VS', 'Vs', 'ETC', 'fig', 'dr', 'prof', 'PHD', 'phd', 'md', 'co', 'corp', 'inc', 'Jan', 'Feb', 'Mar', 'Apr', 'Jul', 'Aug', 'Sep', 'Sept', 'Oct', 'Nov', 'Dec', 'St', 'st', 'AM', 'PM', 'am', 'pm', 'e.g', 'f.e', 'i.e']) | Info: Impossible penultimates | Currently set to : ['Bros', 'No', 'al', 'vs', 'etc', 'Fig', 'Dr', 'Prof', 'PhD', 'MD', 'Co', 'Corp', 'Inc', 'bros', 'VS', 'Vs', 'ETC', 'fig', 'dr', 'prof', 'PHD', 'phd', 'md', 'co', 'corp', 'inc', 'Jan', 'Feb', 'Mar', 'Apr', 'Jul', 'Aug', 'Sep', 'Sept', 'Oct', 'Nov', 'Dec', 'St', 'st', 'AM', 'PM', 'am', 'pm', 'e.g', 'f.e', 'i.e']\n","pipe['sentence_detector@SentenceDetectorDLModel_c83c27f46b97'].setModelArchitecture('cnn') | Info: Model architecture (CNN) | Currently set to : cnn\n",">>> pipe['bert_sentence@sent_small_bert_L12_768'] has settable params:\n","pipe['bert_sentence@sent_small_bert_L12_768'].setBatchSize(8) | Info: Size of every batch | Currently set to : 8\n","pipe['bert_sentence@sent_small_bert_L12_768'].setCaseSensitive(False) | Info: whether to ignore case in tokens for embeddings matching | Currently set to : False\n","pipe['bert_sentence@sent_small_bert_L12_768'].setDimension(768) | Info: Number of embedding dimensions | Currently set to : 768\n","pipe['bert_sentence@sent_small_bert_L12_768'].setMaxSentenceLength(128) | Info: Max sentence length to process | Currently set to : 128\n","pipe['bert_sentence@sent_small_bert_L12_768'].setIsLong(False) | Info: Use Long type instead of Int type for inputs buffer - Some Bert models require Long instead of Int. | Currently set to : False\n","pipe['bert_sentence@sent_small_bert_L12_768'].setStorageRef('sent_small_bert_L12_768') | Info: unique reference name for identification | Currently set to : sent_small_bert_L12_768\n",">>> pipe['sentiment_dl@sent_small_bert_L12_768'] has settable params:\n","pipe['sentiment_dl@sent_small_bert_L12_768'].setThreshold(0.6) | Info: The minimum threshold for the final result otheriwse it will be neutral | Currently set to : 0.6\n","pipe['sentiment_dl@sent_small_bert_L12_768'].setThresholdLabel('neutral') | Info: In case the score is less than threshold, what should be the label. Default is neutral. | Currently set to : neutral\n","pipe['sentiment_dl@sent_small_bert_L12_768'].setClasses(['positive', 'negative']) | Info: get the tags used to trained this SentimentDLModel | Currently set to : ['positive', 'negative']\n","pipe['sentiment_dl@sent_small_bert_L12_768'].setStorageRef('sent_small_bert_L12_768') | Info: unique reference name for identification | Currently set to : sent_small_bert_L12_768\n"],"name":"stdout"}]}]} \ No newline at end of file +{ + "nbformat": 4, + "nbformat_minor": 0, + "metadata": { + "colab": { + "provenance": [], + "collapsed_sections": [ + "zkufh760uvF3" + ] + }, + "kernelspec": { + "display_name": "Python 3", + "name": "python3" + } + }, + "cells": [ + { + "cell_type": "markdown", + "metadata": { + "id": "zkufh760uvF3" + }, + "source": [ + "![JohnSnowLabs](https://nlp.johnsnowlabs.com/assets/images/logo.png)\n", + "\n", + "[![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/JohnSnowLabs/nlu/blob/master/examples/colab/Training/binary_text_classification/NLU_training_sentiment_classifier_demo_twitter.ipynb)\n", + "\n", + "\n", + "\n", + "# Training a Sentiment Analysis Classifier with NLU\n", + "## 2 class twitter classifier training\n", + "With the [SentimentDL model](https://nlp.johnsnowlabs.com/docs/en/annotators#sentimentdl-multi-class-sentiment-analysis-annotator) from Spark NLP you can achieve State Of the Art results on any multi class text classification problem\n", + "\n", + "This notebook showcases the following features :\n", + "\n", + "- How to train the deep learning classifier\n", + "- How to store a pipeline to disk\n", + "- How to load the pipeline from disk (Enables NLU offline mode)\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "dur2drhW5Rvi" + }, + "source": [ + "# 1. Install Java 8 and NLU" + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "hFGnBCHavltY" + }, + "source": [ + "!pip install -q johnsnowlabs" + ], + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "f4KkTfnR5Ugg" + }, + "source": [ + "# 2. Download twitter Sentiment dataset\n", + "https://www.kaggle.com/cosmos98/twitter-and-reddit-sentimental-analysis-dataset\n", + "#Context\n", + "\n", + "This is was a Dataset Created as a part of the university Project On Sentimental Analysis On Multi-Source Social Media Platforms using PySpark." + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "OrVb5ZMvvrQD" + }, + "source": [ + "! wget https://s3.amazonaws.com/auxdata.johnsnowlabs.com/public/resources/en/classifier-dl/reddit_twitter_sentiment/Twitter_Data.csv\n" + ], + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 424 + }, + "id": "y4xSRWIhwT28", + "outputId": "cb744bdd-bf86-4bec-b200-e8249a2e3f1c" + }, + "source": [ + "import pandas as pd\n", + "train_path = '/content/Twitter_Data.csv'\n", + "\n", + "train_df = pd.read_csv(train_path)\n", + "# the text data to use for classification should be in a column named 'text'\n", + "# the label column must have name 'y' name be of type str\n", + "train_df = train_df.rename(columns={'clean_text': 'text'})\n", + "\n", + "columns=['text','y']\n", + "train_df = train_df[columns]\n", + "train_df" + ], + "execution_count": 5, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + " text y\n", + "0 new post added mumbai press official site prod... positive\n", + "1 not wrong the actual temperature might but and... positive\n", + "2 why pakistan crying name modi every day how na... negative\n", + "3 congress years wasnt able complete one rafale ... positive\n", + "4 public toilet near kanagadurga temple nizampet... positive\n", + ".. ... ...\n", + "595 jai hind modi very nice thought positive\n", + "596 after going thru all the comedy speeches shri ... positive\n", + "597 mistry man not then why drag modi the nri foll... negative\n", + "598 why modi have not held single press conference... negative\n", + "599 modi government which fails protect its women ... negative\n", + "\n", + "[600 rows x 2 columns]" + ], + "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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
texty
0new post added mumbai press official site prod...positive
1not wrong the actual temperature might but and...positive
2why pakistan crying name modi every day how na...negative
3congress years wasnt able complete one rafale ...positive
4public toilet near kanagadurga temple nizampet...positive
.........
595jai hind modi very nice thoughtpositive
596after going thru all the comedy speeches shri ...positive
597mistry man not then why drag modi the nri foll...negative
598why modi have not held single press conference...negative
599modi government which fails protect its women ...negative
\n", + "

600 rows × 2 columns

\n", + "
\n", + "
\n", + "\n", + "
\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "
\n", + "\n", + "\n", + "
\n", + " \n", + "\n", + "\n", + "\n", + " \n", + "
\n", + "
\n", + "
\n" + ] + }, + "metadata": {}, + "execution_count": 5 + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "0296Om2C5anY" + }, + "source": [ + "# 3. Train Deep Learning Classifier using nlu.load('train.sentiment')\n", + "\n", + "You dataset label column should be named 'y' and the feature column with text data should be named 'text'" + ] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 1000 + }, + "id": "3ZIPkRkWftBG", + "outputId": "fbb3d3a1-9cf5-4ecc-89a4-fdb6e0d59d17" + }, + "source": [ + "from sklearn.metrics import classification_report\n", + "from johnsnowlabs import nlp\n", + "# load a trainable pipeline by specifying the train. prefix and fit it on a datset with label and text columns\n", + "# by default the Universal Sentence Encoder (USE) Sentence embeddings are used for generation\n", + "trainable_pipe = nlp.load('train.sentiment')\n", + "fitted_pipe = trainable_pipe.fit(train_df.iloc[:50])\n", + "\n", + "# predict with the trainable pipeline on dataset and get predictions\n", + "preds = fitted_pipe.predict(train_df.iloc[:50],output_level='document')\n", + "#sentence detector that is part of the pipe generates sone NaNs. lets drop them first\n", + "preds.dropna(inplace=True)\n", + "print(classification_report(preds['y'], preds['sentiment']))\n", + "\n", + "preds" + ], + "execution_count": 6, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Warning::Spark Session already created, some configs may not take.\n", + "sent_small_bert_L2_128 download started this may take some time.\n", + "Approximate size to download 16.1 MB\n", + "[OK!]\n" + ] + }, + { + "output_type": "stream", + "name": "stderr", + "text": [ + "/usr/local/lib/python3.10/dist-packages/nlu/pipe/pipeline.py:149: SettingWithCopyWarning: \n", + "A value is trying to be set on a copy of a slice from a DataFrame.\n", + "Try using .loc[row_indexer,col_indexer] = value instead\n", + "\n", + "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n", + " dataset.y = dataset.y.apply(str)\n", + "/usr/local/lib/python3.10/dist-packages/nlu/pipe/utils/data_conversion_utils.py:160: SettingWithCopyWarning: \n", + "A value is trying to be set on a copy of a slice from a DataFrame.\n", + "Try using .loc[row_indexer,col_indexer] = value instead\n", + "\n", + "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n", + " data['origin_index'] = data.index\n", + "/usr/local/lib/python3.10/dist-packages/nlu/pipe/utils/data_conversion_utils.py:160: SettingWithCopyWarning: \n", + "A value is trying to be set on a copy of a slice from a DataFrame.\n", + "Try using .loc[row_indexer,col_indexer] = value instead\n", + "\n", + "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n", + " data['origin_index'] = data.index\n" + ] + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + " precision recall f1-score support\n", + "\n", + " negative 0.00 0.00 0.00 19\n", + " positive 0.62 1.00 0.77 31\n", + "\n", + " accuracy 0.62 50\n", + " macro avg 0.31 0.50 0.38 50\n", + "weighted avg 0.38 0.62 0.47 50\n", + "\n" + ] + }, + { + "output_type": "stream", + "name": "stderr", + "text": [ + "/usr/local/lib/python3.10/dist-packages/nlu/pipe/extractors/extractor_methods/base_extractor_methods.py:356: SettingWithCopyWarning: \n", + "A value is trying to be set on a copy of a slice from a DataFrame.\n", + "Try using .loc[row_indexer,col_indexer] = value instead\n", + "\n", + "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n", + " df[cols_to_explode] = df[cols_to_explode].apply(pad_same_level_cols, axis=1)\n", + "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/_classification.py:1344: UndefinedMetricWarning: Precision and F-score are ill-defined and being set to 0.0 in labels with no predicted samples. Use `zero_division` parameter to control this behavior.\n", + " _warn_prf(average, modifier, msg_start, len(result))\n", + "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/_classification.py:1344: UndefinedMetricWarning: Precision and F-score are ill-defined and being set to 0.0 in labels with no predicted samples. Use `zero_division` parameter to control this behavior.\n", + " _warn_prf(average, modifier, msg_start, len(result))\n", + "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/_classification.py:1344: UndefinedMetricWarning: Precision and F-score are ill-defined and being set to 0.0 in labels with no predicted samples. Use `zero_division` parameter to control this behavior.\n", + " _warn_prf(average, modifier, msg_start, len(result))\n" + ] + }, + { + "output_type": "execute_result", + "data": { + "text/plain": [ + " document \\\n", + "0 new post added mumbai press official site prod... \n", + "1 not wrong the actual temperature might but and... \n", + "2 why pakistan crying name modi every day how na... \n", + "3 congress years wasnt able complete one rafale ... \n", + "4 public toilet near kanagadurga temple nizampet... \n", + "5 the foundation for new india 2022 has already ... \n", + "6 dear governorani can you let the people indian... \n", + "7 this daft donkey’ dick aap was born the iac mo... \n", + "8 major reason for social hatred and strife modi... \n", + "9 demo was black money caught modi did inspite r... \n", + "10 one the best ministers modis cabinet \n", + "11 raghuram rajan sent list high profile bank fra... \n", + "12 governor kalyan singh aligarh 23rd march all a... \n", + "13 this campaign low hanging fruit seems giving f... \n", + "14 strict policing that too health system sir reg... \n", + "15 shatrughan sinha was far bigger public figure ... \n", + "16 people wish your vision india and least intere... \n", + "17 chowkidar hee chor hain baap chor beta bada ch... \n", + "18 with modi all his drawbacks atleast know what ... \n", + "19 compare that with modi’ 2014 “vikas purush” el... \n", + "20 with welfare delivery gst ibc and feo place mo... \n", + "21 young and dynamic chowkidar says you are not w... \n", + "22 dont forget petrol prices have risen ₹ modi go... \n", + "23 prime minister narendra modi has urged voters ... \n", + "24 when someone asks random question economy sche... \n", + "25 from whatsapp have two options this elections ... \n", + "26 heres interesting section work which gives com... \n", + "27 know why you willpapu his chamchas nothing tar... \n", + "28 only rahul gandhis politics love can defeat th... \n", + "29 one see the fake calculation calsi chek kariye... \n", + "30 being born religion where female deities worsh... \n", + "31 narendra modi became and despite biased viciou... \n", + "32 think hindus should back off and let them suff... \n", + "33 from the very beginningmodi doing wada faramos... \n", + "34 women are powerful nature wat hinduism states ... \n", + "35 almost 4000 crore spent but the ganga more pol... \n", + "36 seriously must have sick mind call small kid r... \n", + "37 agree with you was unrequired was kinda uncomf... \n", + "38 rajdeep think 4got that imran not indian never... \n", + "39 the great modi trap ways congress has walked into \n", + "40 has come new meanings nationalism hindu and su... \n", + "41 modi govt hindus are behaving wildly \n", + "42 sir one request why bjp candidate contesting f... \n", + "43 vapas lana hai desh agey badana hai vote for m... \n", + "44 even with massive mandate 336 seats the nda go... \n", + "45 can promise what can delivered epf pension uni... \n", + "46 and even print this seriously whats this elect... \n", + "47 she has asked three questions from modi and he... \n", + "48 dear all tsunami favour modi 2019 coming from ... \n", + "49 rahul gandhis politics love can defeat the mod... \n", + "\n", + " sentence_embedding_small_bert_L2_128 sentiment \\\n", + "0 [-0.2672112286090851, 0.22553667426109314, -0.... positive \n", + "1 [-1.243513822555542, 0.24190887808799744, -0.4... positive \n", + "2 [-0.7444853782653809, -0.0514342300593853, -0.... positive \n", + "3 [-0.34242647886276245, 0.46881920099258423, -0... positive \n", + "4 [-1.1381851434707642, 0.512217104434967, -0.74... positive \n", + "5 [-0.4057338237762451, 1.0029019117355347, -0.9... positive \n", + "6 [-1.4633989334106445, 0.0006002967129461467, -... positive \n", + "7 [0.04606145992875099, 0.3098487854003906, 0.02... positive \n", + "8 [-0.9470604658126831, 0.27183642983436584, -1.... positive \n", + "9 [-0.7136786580085754, 0.0788763239979744, -0.5... positive \n", + "10 [-0.3664279282093048, 0.3727397918701172, -0.4... positive \n", + "11 [-1.0506610870361328, 0.20963071286678314, -0.... positive \n", + "12 [-0.20803016424179077, 0.07477151602506638, -0... positive \n", + "13 [-1.2681258916854858, 0.24513696134090424, -0.... positive \n", + "14 [-0.9757605195045471, 1.0792640447616577, -0.4... positive \n", + "15 [-0.5276148319244385, 0.2546652853488922, -0.1... positive \n", + "16 [-1.0698672533035278, 0.5003032088279724, -0.4... positive \n", + "17 [-0.5458223223686218, -0.23064681887626648, -0... positive \n", + "18 [-0.8066104054450989, -0.014454682357609272, -... positive \n", + "19 [-0.5401442646980286, -0.41557249426841736, -0... positive \n", + "20 [-0.5764278769493103, 1.2036645412445068, -1.0... positive \n", + "21 [-0.08391488343477249, -0.43613195419311523, 0... positive \n", + "22 [-0.10981855541467667, 0.5448974370956421, -0.... positive \n", + "23 [0.27992355823516846, 0.0582934208214283, -0.2... positive \n", + "24 [-0.5603336691856384, -0.1663953959941864, -0.... positive \n", + "25 [0.02258816733956337, -0.18138407170772552, -0... positive \n", + "26 [-1.3662021160125732, 0.042950600385665894, 0.... positive \n", + "27 [-1.0259658098220825, 0.31534343957901, -0.242... positive \n", + "28 [-0.411965548992157, -0.5224093198776245, -0.6... positive \n", + "29 [-1.0891247987747192, -0.5220181345939636, -0.... positive \n", + "30 [-1.0681140422821045, -0.6835974454879761, -0.... positive \n", + "31 [-0.20442193746566772, -0.3683846890926361, -0... positive \n", + "32 [-0.9112239480018616, 0.17845268547534943, -0.... positive \n", + "33 [-1.3499250411987305, 0.23698307573795319, -0.... positive \n", + "34 [-0.47838863730430603, 0.19593238830566406, -0... positive \n", + "35 [-1.229308009147644, -0.07380063086748123, -0.... positive \n", + "36 [-0.8348453640937805, -0.03178590536117554, -0... positive \n", + "37 [-0.4827183485031128, 0.08657485246658325, -0.... positive \n", + "38 [-0.6942201852798462, -0.3642423152923584, -0.... positive \n", + "39 [-0.9660191535949707, -0.2219739854335785, -0.... positive \n", + "40 [-0.03318127244710922, 0.04329724237322807, 0.... positive \n", + "41 [-0.5563615560531616, 0.4725855588912964, 0.10... positive \n", + "42 [-0.6955257654190063, 0.37047961354255676, -0.... positive \n", + "43 [-0.8704789876937866, -0.22370557487010956, -0... positive \n", + "44 [-0.20755957067012787, 0.34972018003463745, -0... positive \n", + "45 [-1.3415300846099854, 1.6326956748962402, -0.6... positive \n", + "46 [-1.4377732276916504, -0.11478081345558167, 0.... positive \n", + "47 [-1.193617343902588, -0.02149897627532482, 0.1... positive \n", + "48 [-0.5854026675224304, -0.21378959715366364, -0... positive \n", + "49 [-0.39933672547340393, -0.5969381332397461, -0... positive \n", + "\n", + " sentiment_confidence text \\\n", + "0 8.0 new post added mumbai press official site prod... \n", + "1 8.0 not wrong the actual temperature might but and... \n", + "2 2.0 why pakistan crying name modi every day how na... \n", + "3 2.0 congress years wasnt able complete one rafale ... \n", + "4 1.0 public toilet near kanagadurga temple nizampet... \n", + "5 7.0 \\nthe foundation for new india 2022 has alread... \n", + "6 3.0 dear governorani can you let the people indian... \n", + "7 6.0 this daft donkey’ dick aap was born the iac mo... \n", + "8 5.0 major reason for social hatred and strife modi... \n", + "9 1.0 demo was black money caught modi did inspite r... \n", + "10 1.0 one the best ministers modis cabinet \n", + "11 8.0 raghuram rajan sent list high profile bank fra... \n", + "12 1.0 governor kalyan singh aligarh 23rd march all a... \n", + "13 3.0 this campaign low hanging fruit seems giving f... \n", + "14 1.0 strict policing that too health system sir reg... \n", + "15 6.0 shatrughan sinha was far bigger public figure ... \n", + "16 1.0 people wish your vision india and least intere... \n", + "17 7.0 chowkidar hee chor hain baap chor beta bada ch... \n", + "18 7.0 with modi all his drawbacks atleast know what ... \n", + "19 2.0 compare that with modi’ 2014 “vikas purush” el... \n", + "20 7.0 with welfare delivery gst ibc and feo place mo... \n", + "21 2.0 young and dynamic chowkidar says you are not w... \n", + "22 5.0 dont forget petrol prices have risen ₹ modi go... \n", + "23 1.0 prime minister narendra modi has urged voters ... \n", + "24 1.0 when someone asks random question economy sche... \n", + "25 2.0 from whatsapp have two options this elections ... \n", + "26 1.0 heres interesting section work which gives com... \n", + "27 6.0 know why you willpapu his chamchas nothing tar... \n", + "28 2.0 only rahul gandhis politics love can defeat th... \n", + "29 2.0 one see the fake calculation calsi chek kariye... \n", + "30 2.0 being born religion where female deities worsh... \n", + "31 3.0 narendra modi became and despite biased viciou... \n", + "32 6.0 think hindus should back off and let them suff... \n", + "33 3.0 from the very beginningmodi doing wada faramos... \n", + "34 5.0 women are powerful nature wat hinduism states ... \n", + "35 1.0 almost 4000 crore spent but the ganga more pol... \n", + "36 1.0 seriously must have sick mind call small kid r... \n", + "37 7.0 agree with you was unrequired was kinda uncomf... \n", + "38 4.0 rajdeep think 4got that imran not indian never... \n", + "39 6.0 the great modi trap ways congress has walked i... \n", + "40 2.0 has come new meanings nationalism hindu and su... \n", + "41 3.0 modi govt hindus are behaving wildly \n", + "42 1.0 sir one request why bjp candidate contesting f... \n", + "43 1.0 vapas lana hai\\ndesh agey badana hai\\nvote for... \n", + "44 2.0 even with massive mandate 336 seats the nda go... \n", + "45 3.0 can promise what can delivered epf pension uni... \n", + "46 2.0 and even print this seriously whats this elect... \n", + "47 1.0 she has asked three questions from modi and he... \n", + "48 2.0 dear all tsunami favour modi 2019 coming from ... \n", + "49 4.0 rahul gandhis politics love can defeat the mod... \n", + "\n", + " y \n", + "0 positive \n", + "1 positive \n", + "2 negative \n", + "3 positive \n", + "4 positive \n", + "5 positive \n", + "6 negative \n", + "7 negative \n", + "8 positive \n", + "9 positive \n", + "10 positive \n", + "11 negative \n", + "12 positive \n", + "13 positive \n", + "14 positive \n", + "15 positive \n", + "16 negative \n", + "17 positive \n", + "18 positive \n", + "19 negative \n", + "20 positive \n", + "21 positive \n", + "22 negative \n", + "23 positive \n", + "24 negative \n", + "25 positive \n", + "26 positive \n", + "27 negative \n", + "28 negative \n", + "29 negative \n", + "30 positive \n", + "31 negative \n", + "32 positive \n", + "33 negative \n", + "34 positive \n", + "35 positive \n", + "36 negative \n", + "37 positive \n", + "38 negative \n", + "39 positive \n", + "40 positive \n", + "41 positive \n", + "42 negative \n", + "43 positive \n", + "44 positive \n", + "45 positive \n", + "46 negative \n", + "47 positive \n", + "48 negative \n", + "49 negative " + ], + "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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + "
documentsentence_embedding_small_bert_L2_128sentimentsentiment_confidencetexty
0new post added mumbai press official site prod...[-0.2672112286090851, 0.22553667426109314, -0....positive8.0new post added mumbai press official site prod...positive
1not wrong the actual temperature might but and...[-1.243513822555542, 0.24190887808799744, -0.4...positive8.0not wrong the actual temperature might but and...positive
2why pakistan crying name modi every day how na...[-0.7444853782653809, -0.0514342300593853, -0....positive2.0why pakistan crying name modi every day how na...negative
3congress years wasnt able complete one rafale ...[-0.34242647886276245, 0.46881920099258423, -0...positive2.0congress years wasnt able complete one rafale ...positive
4public toilet near kanagadurga temple nizampet...[-1.1381851434707642, 0.512217104434967, -0.74...positive1.0public toilet near kanagadurga temple nizampet...positive
5the foundation for new india 2022 has already ...[-0.4057338237762451, 1.0029019117355347, -0.9...positive7.0\\nthe foundation for new india 2022 has alread...positive
6dear governorani can you let the people indian...[-1.4633989334106445, 0.0006002967129461467, -...positive3.0dear governorani can you let the people indian...negative
7this daft donkey’ dick aap was born the iac mo...[0.04606145992875099, 0.3098487854003906, 0.02...positive6.0this daft donkey’ dick aap was born the iac mo...negative
8major reason for social hatred and strife modi...[-0.9470604658126831, 0.27183642983436584, -1....positive5.0major reason for social hatred and strife modi...positive
9demo was black money caught modi did inspite r...[-0.7136786580085754, 0.0788763239979744, -0.5...positive1.0demo was black money caught modi did inspite r...positive
10one the best ministers modis cabinet[-0.3664279282093048, 0.3727397918701172, -0.4...positive1.0one the best ministers modis cabinetpositive
11raghuram rajan sent list high profile bank fra...[-1.0506610870361328, 0.20963071286678314, -0....positive8.0raghuram rajan sent list high profile bank fra...negative
12governor kalyan singh aligarh 23rd march all a...[-0.20803016424179077, 0.07477151602506638, -0...positive1.0governor kalyan singh aligarh 23rd march all a...positive
13this campaign low hanging fruit seems giving f...[-1.2681258916854858, 0.24513696134090424, -0....positive3.0this campaign low hanging fruit seems giving f...positive
14strict policing that too health system sir reg...[-0.9757605195045471, 1.0792640447616577, -0.4...positive1.0strict policing that too health system sir reg...positive
15shatrughan sinha was far bigger public figure ...[-0.5276148319244385, 0.2546652853488922, -0.1...positive6.0shatrughan sinha was far bigger public figure ...positive
16people wish your vision india and least intere...[-1.0698672533035278, 0.5003032088279724, -0.4...positive1.0people wish your vision india and least intere...negative
17chowkidar hee chor hain baap chor beta bada ch...[-0.5458223223686218, -0.23064681887626648, -0...positive7.0chowkidar hee chor hain baap chor beta bada ch...positive
18with modi all his drawbacks atleast know what ...[-0.8066104054450989, -0.014454682357609272, -...positive7.0with modi all his drawbacks atleast know what ...positive
19compare that with modi’ 2014 “vikas purush” el...[-0.5401442646980286, -0.41557249426841736, -0...positive2.0compare that with modi’ 2014 “vikas purush” el...negative
20with welfare delivery gst ibc and feo place mo...[-0.5764278769493103, 1.2036645412445068, -1.0...positive7.0with welfare delivery gst ibc and feo place mo...positive
21young and dynamic chowkidar says you are not w...[-0.08391488343477249, -0.43613195419311523, 0...positive2.0young and dynamic chowkidar says you are not w...positive
22dont forget petrol prices have risen ₹ modi go...[-0.10981855541467667, 0.5448974370956421, -0....positive5.0dont forget petrol prices have risen ₹ modi go...negative
23prime minister narendra modi has urged voters ...[0.27992355823516846, 0.0582934208214283, -0.2...positive1.0prime minister narendra modi has urged voters ...positive
24when someone asks random question economy sche...[-0.5603336691856384, -0.1663953959941864, -0....positive1.0when someone asks random question economy sche...negative
25from whatsapp have two options this elections ...[0.02258816733956337, -0.18138407170772552, -0...positive2.0from whatsapp have two options this elections ...positive
26heres interesting section work which gives com...[-1.3662021160125732, 0.042950600385665894, 0....positive1.0heres interesting section work which gives com...positive
27know why you willpapu his chamchas nothing tar...[-1.0259658098220825, 0.31534343957901, -0.242...positive6.0know why you willpapu his chamchas nothing tar...negative
28only rahul gandhis politics love can defeat th...[-0.411965548992157, -0.5224093198776245, -0.6...positive2.0only rahul gandhis politics love can defeat th...negative
29one see the fake calculation calsi chek kariye...[-1.0891247987747192, -0.5220181345939636, -0....positive2.0one see the fake calculation calsi chek kariye...negative
30being born religion where female deities worsh...[-1.0681140422821045, -0.6835974454879761, -0....positive2.0being born religion where female deities worsh...positive
31narendra modi became and despite biased viciou...[-0.20442193746566772, -0.3683846890926361, -0...positive3.0narendra modi became and despite biased viciou...negative
32think hindus should back off and let them suff...[-0.9112239480018616, 0.17845268547534943, -0....positive6.0think hindus should back off and let them suff...positive
33from the very beginningmodi doing wada faramos...[-1.3499250411987305, 0.23698307573795319, -0....positive3.0from the very beginningmodi doing wada faramos...negative
34women are powerful nature wat hinduism states ...[-0.47838863730430603, 0.19593238830566406, -0...positive5.0women are powerful nature wat hinduism states ...positive
35almost 4000 crore spent but the ganga more pol...[-1.229308009147644, -0.07380063086748123, -0....positive1.0almost 4000 crore spent but the ganga more pol...positive
36seriously must have sick mind call small kid r...[-0.8348453640937805, -0.03178590536117554, -0...positive1.0seriously must have sick mind call small kid r...negative
37agree with you was unrequired was kinda uncomf...[-0.4827183485031128, 0.08657485246658325, -0....positive7.0agree with you was unrequired was kinda uncomf...positive
38rajdeep think 4got that imran not indian never...[-0.6942201852798462, -0.3642423152923584, -0....positive4.0rajdeep think 4got that imran not indian never...negative
39the great modi trap ways congress has walked into[-0.9660191535949707, -0.2219739854335785, -0....positive6.0the great modi trap ways congress has walked i...positive
40has come new meanings nationalism hindu and su...[-0.03318127244710922, 0.04329724237322807, 0....positive2.0has come new meanings nationalism hindu and su...positive
41modi govt hindus are behaving wildly[-0.5563615560531616, 0.4725855588912964, 0.10...positive3.0modi govt hindus are behaving wildlypositive
42sir one request why bjp candidate contesting f...[-0.6955257654190063, 0.37047961354255676, -0....positive1.0sir one request why bjp candidate contesting f...negative
43vapas lana hai desh agey badana hai vote for m...[-0.8704789876937866, -0.22370557487010956, -0...positive1.0vapas lana hai\\ndesh agey badana hai\\nvote for...positive
44even with massive mandate 336 seats the nda go...[-0.20755957067012787, 0.34972018003463745, -0...positive2.0even with massive mandate 336 seats the nda go...positive
45can promise what can delivered epf pension uni...[-1.3415300846099854, 1.6326956748962402, -0.6...positive3.0can promise what can delivered epf pension uni...positive
46and even print this seriously whats this elect...[-1.4377732276916504, -0.11478081345558167, 0....positive2.0and even print this seriously whats this elect...negative
47she has asked three questions from modi and he...[-1.193617343902588, -0.02149897627532482, 0.1...positive1.0she has asked three questions from modi and he...positive
48dear all tsunami favour modi 2019 coming from ...[-0.5854026675224304, -0.21378959715366364, -0...positive2.0dear all tsunami favour modi 2019 coming from ...negative
49rahul gandhis politics love can defeat the mod...[-0.39933672547340393, -0.5969381332397461, -0...positive4.0rahul gandhis politics love can defeat the mod...negative
\n", + "
\n", + "
\n", + "\n", + "
\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "
\n", + "\n", + "\n", + "
\n", + " \n", + "\n", + "\n", + "\n", + " \n", + "
\n", + "
\n", + "
\n" + ] + }, + "metadata": {}, + "execution_count": 6 + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "lVyOE2wV0fw_" + }, + "source": [ + "# Test the fitted pipe on new example" + ] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 150 + }, + "id": "qdCUg2MR0PD2", + "outputId": "7372f9d4-4492-4784-a7dd-d1bef74201bb" + }, + "source": [ + "fitted_pipe.predict('the president of india just died')" + ], + "execution_count": 7, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "sentence_detector_dl download started this may take some time.\n", + "Approximate size to download 354.6 KB\n", + "[OK!]\n", + "Warning::Spark Session already created, some configs may not take.\n" + ] + }, + { + "output_type": "execute_result", + "data": { + "text/plain": [ + " sentence \\\n", + "0 the president of india just died \n", + "\n", + " sentence_embedding_small_bert_L2_128 sentiment \\\n", + "0 [-0.9852966070175171, 0.5659735798835754, -1.0... positive \n", + "\n", + " sentiment_confidence \n", + "0 1.0 " + ], + "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", + "
sentencesentence_embedding_small_bert_L2_128sentimentsentiment_confidence
0the president of india just died[-0.9852966070175171, 0.5659735798835754, -1.0...positive1.0
\n", + "
\n", + "
\n", + "\n", + "
\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "
\n", + "\n", + "
\n", + "
\n" + ] + }, + "metadata": {}, + "execution_count": 7 + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "xflpwrVjjBVD" + }, + "source": [ + "## Configure pipe training parameters" + ] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "UtsAUGTmOTms", + "outputId": "e3503721-ee9a-4c98-b35b-d861cbc98880" + }, + "source": [ + "trainable_pipe.print_info()" + ], + "execution_count": 8, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "The following parameters are configurable for this NLU pipeline (You can copy paste the examples) :\n", + ">>> component_list['bert_sentence_embeddings@sent_small_bert_L2_128'] has settable params:\n", + "component_list['bert_sentence_embeddings@sent_small_bert_L2_128'].setBatchSize(8) | Info: Size of every batch | Currently set to : 8\n", + "component_list['bert_sentence_embeddings@sent_small_bert_L2_128'].setEngine('tensorflow') | Info: Deep Learning engine used for this model | Currently set to : tensorflow\n", + "component_list['bert_sentence_embeddings@sent_small_bert_L2_128'].setIsLong(False) | Info: Use Long type instead of Int type for inputs buffer - Some Bert models require Long instead of Int. | Currently set to : False\n", + "component_list['bert_sentence_embeddings@sent_small_bert_L2_128'].setMaxSentenceLength(128) | Info: Max sentence length to process | Currently set to : 128\n", + "component_list['bert_sentence_embeddings@sent_small_bert_L2_128'].setDimension(128) | Info: Number of embedding dimensions | Currently set to : 128\n", + "component_list['bert_sentence_embeddings@sent_small_bert_L2_128'].setCaseSensitive(False) | Info: whether to ignore case in tokens for embeddings matching | Currently set to : False\n", + "component_list['bert_sentence_embeddings@sent_small_bert_L2_128'].setStorageRef('sent_small_bert_L2_128') | Info: unique reference name for identification | Currently set to : sent_small_bert_L2_128\n", + ">>> component_list['document_assembler'] has settable params:\n", + "component_list['document_assembler'].setCleanupMode('shrink') | Info: possible values: disabled, inplace, inplace_full, shrink, shrink_full, each, each_full, delete_full | Currently set to : shrink\n", + ">>> component_list['sentiment_dl@sent_small_bert_L2_128'] has settable params:\n", + "component_list['sentiment_dl@sent_small_bert_L2_128'].setEngine('tensorflow') | Info: Deep Learning engine used for this model | Currently set to : tensorflow\n", + "component_list['sentiment_dl@sent_small_bert_L2_128'].setThreshold(0.6) | Info: The minimum threshold for the final result otheriwse it will be neutral | Currently set to : 0.6\n", + "component_list['sentiment_dl@sent_small_bert_L2_128'].setThresholdLabel('neutral') | Info: In case the score is less than threshold, what should be the label. Default is neutral. | Currently set to : neutral\n", + "component_list['sentiment_dl@sent_small_bert_L2_128'].setStorageRef('sent_small_bert_L2_128') | Info: unique reference name for identification | Currently set to : sent_small_bert_L2_128\n" + ] + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "2GJdDNV9jEIe" + }, + "source": [ + "## Retrain with new parameters" + ] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 1000 + }, + "id": "mptfvHx-MMMX", + "outputId": "ffccac34-9684-41f4-d1e7-7f07951fd516" + }, + "source": [ + "# Train longer!\n", + "trainable_pipe = nlp.load('train.sentiment')\n", + "trainable_pipe['trainable_sentiment_dl'].setMaxEpochs(5)\n", + "fitted_pipe = trainable_pipe.fit(train_df.iloc[:50])\n", + "# predict with the trainable pipeline on dataset and get predictions\n", + "preds = fitted_pipe.predict(train_df.iloc[:50],output_level='document')\n", + "\n", + "#sentence detector that is part of the pipe generates sone NaNs. lets drop them first\n", + "preds.dropna(inplace=True)\n", + "print(classification_report(preds['y'], preds['sentiment']))\n", + "\n", + "preds" + ], + "execution_count": 9, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Warning::Spark Session already created, some configs may not take.\n", + "Warning::Spark Session already created, some configs may not take.\n", + "sent_small_bert_L2_128 download started this may take some time.\n", + "Approximate size to download 16.1 MB\n", + "[OK!]\n" + ] + }, + { + "output_type": "stream", + "name": "stderr", + "text": [ + "/usr/local/lib/python3.10/dist-packages/nlu/pipe/pipeline.py:149: SettingWithCopyWarning: \n", + "A value is trying to be set on a copy of a slice from a DataFrame.\n", + "Try using .loc[row_indexer,col_indexer] = value instead\n", + "\n", + "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n", + " dataset.y = dataset.y.apply(str)\n", + "/usr/local/lib/python3.10/dist-packages/nlu/pipe/utils/data_conversion_utils.py:160: SettingWithCopyWarning: \n", + "A value is trying to be set on a copy of a slice from a DataFrame.\n", + "Try using .loc[row_indexer,col_indexer] = value instead\n", + "\n", + "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n", + " data['origin_index'] = data.index\n", + "/usr/local/lib/python3.10/dist-packages/nlu/pipe/utils/data_conversion_utils.py:160: SettingWithCopyWarning: \n", + "A value is trying to be set on a copy of a slice from a DataFrame.\n", + "Try using .loc[row_indexer,col_indexer] = value instead\n", + "\n", + "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n", + " data['origin_index'] = data.index\n" + ] + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + " precision recall f1-score support\n", + "\n", + " negative 0.00 0.00 0.00 19\n", + " positive 0.62 1.00 0.77 31\n", + "\n", + " accuracy 0.62 50\n", + " macro avg 0.31 0.50 0.38 50\n", + "weighted avg 0.38 0.62 0.47 50\n", + "\n" + ] + }, + { + "output_type": "stream", + "name": "stderr", + "text": [ + "/usr/local/lib/python3.10/dist-packages/nlu/pipe/extractors/extractor_methods/base_extractor_methods.py:356: SettingWithCopyWarning: \n", + "A value is trying to be set on a copy of a slice from a DataFrame.\n", + "Try using .loc[row_indexer,col_indexer] = value instead\n", + "\n", + "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n", + " df[cols_to_explode] = df[cols_to_explode].apply(pad_same_level_cols, axis=1)\n", + "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/_classification.py:1344: UndefinedMetricWarning: Precision and F-score are ill-defined and being set to 0.0 in labels with no predicted samples. Use `zero_division` parameter to control this behavior.\n", + " _warn_prf(average, modifier, msg_start, len(result))\n", + "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/_classification.py:1344: UndefinedMetricWarning: Precision and F-score are ill-defined and being set to 0.0 in labels with no predicted samples. Use `zero_division` parameter to control this behavior.\n", + " _warn_prf(average, modifier, msg_start, len(result))\n", + "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/_classification.py:1344: UndefinedMetricWarning: Precision and F-score are ill-defined and being set to 0.0 in labels with no predicted samples. Use `zero_division` parameter to control this behavior.\n", + " _warn_prf(average, modifier, msg_start, len(result))\n" + ] + }, + { + "output_type": "execute_result", + "data": { + "text/plain": [ + " document \\\n", + "0 new post added mumbai press official site prod... \n", + "1 not wrong the actual temperature might but and... \n", + "2 why pakistan crying name modi every day how na... \n", + "3 congress years wasnt able complete one rafale ... \n", + "4 public toilet near kanagadurga temple nizampet... \n", + "5 the foundation for new india 2022 has already ... \n", + "6 dear governorani can you let the people indian... \n", + "7 this daft donkey’ dick aap was born the iac mo... \n", + "8 major reason for social hatred and strife modi... \n", + "9 demo was black money caught modi did inspite r... \n", + "10 one the best ministers modis cabinet \n", + "11 raghuram rajan sent list high profile bank fra... \n", + "12 governor kalyan singh aligarh 23rd march all a... \n", + "13 this campaign low hanging fruit seems giving f... \n", + "14 strict policing that too health system sir reg... \n", + "15 shatrughan sinha was far bigger public figure ... \n", + "16 people wish your vision india and least intere... \n", + "17 chowkidar hee chor hain baap chor beta bada ch... \n", + "18 with modi all his drawbacks atleast know what ... \n", + "19 compare that with modi’ 2014 “vikas purush” el... \n", + "20 with welfare delivery gst ibc and feo place mo... \n", + "21 young and dynamic chowkidar says you are not w... \n", + "22 dont forget petrol prices have risen ₹ modi go... \n", + "23 prime minister narendra modi has urged voters ... \n", + "24 when someone asks random question economy sche... \n", + "25 from whatsapp have two options this elections ... \n", + "26 heres interesting section work which gives com... \n", + "27 know why you willpapu his chamchas nothing tar... \n", + "28 only rahul gandhis politics love can defeat th... \n", + "29 one see the fake calculation calsi chek kariye... \n", + "30 being born religion where female deities worsh... \n", + "31 narendra modi became and despite biased viciou... \n", + "32 think hindus should back off and let them suff... \n", + "33 from the very beginningmodi doing wada faramos... \n", + "34 women are powerful nature wat hinduism states ... \n", + "35 almost 4000 crore spent but the ganga more pol... \n", + "36 seriously must have sick mind call small kid r... \n", + "37 agree with you was unrequired was kinda uncomf... \n", + "38 rajdeep think 4got that imran not indian never... \n", + "39 the great modi trap ways congress has walked into \n", + "40 has come new meanings nationalism hindu and su... \n", + "41 modi govt hindus are behaving wildly \n", + "42 sir one request why bjp candidate contesting f... \n", + "43 vapas lana hai desh agey badana hai vote for m... \n", + "44 even with massive mandate 336 seats the nda go... \n", + "45 can promise what can delivered epf pension uni... \n", + "46 and even print this seriously whats this elect... \n", + "47 she has asked three questions from modi and he... \n", + "48 dear all tsunami favour modi 2019 coming from ... \n", + "49 rahul gandhis politics love can defeat the mod... \n", + "\n", + " sentence_embedding_small_bert_L2_128 sentiment \\\n", + "0 [-0.2672112286090851, 0.22553667426109314, -0.... positive \n", + "1 [-1.243513822555542, 0.24190887808799744, -0.4... positive \n", + "2 [-0.7444853782653809, -0.0514342300593853, -0.... positive \n", + "3 [-0.34242647886276245, 0.46881920099258423, -0... positive \n", + "4 [-1.1381851434707642, 0.512217104434967, -0.74... positive \n", + "5 [-0.4057338237762451, 1.0029019117355347, -0.9... positive \n", + "6 [-1.4633989334106445, 0.0006002967129461467, -... positive \n", + "7 [0.04606145992875099, 0.3098487854003906, 0.02... positive \n", + "8 [-0.9470604658126831, 0.27183642983436584, -1.... positive \n", + "9 [-0.7136786580085754, 0.0788763239979744, -0.5... positive \n", + "10 [-0.3664279282093048, 0.3727397918701172, -0.4... positive \n", + "11 [-1.0506610870361328, 0.20963071286678314, -0.... positive \n", + "12 [-0.20803016424179077, 0.07477151602506638, -0... positive \n", + "13 [-1.2681258916854858, 0.24513696134090424, -0.... positive \n", + "14 [-0.9757605195045471, 1.0792640447616577, -0.4... positive \n", + "15 [-0.5276148319244385, 0.2546652853488922, -0.1... positive \n", + "16 [-1.0698672533035278, 0.5003032088279724, -0.4... positive \n", + "17 [-0.5458223223686218, -0.23064681887626648, -0... positive \n", + "18 [-0.8066104054450989, -0.014454682357609272, -... positive \n", + "19 [-0.5401442646980286, -0.41557249426841736, -0... positive \n", + "20 [-0.5764278769493103, 1.2036645412445068, -1.0... positive \n", + "21 [-0.08391488343477249, -0.43613195419311523, 0... positive \n", + "22 [-0.10981855541467667, 0.5448974370956421, -0.... positive \n", + "23 [0.27992355823516846, 0.0582934208214283, -0.2... positive \n", + "24 [-0.5603336691856384, -0.1663953959941864, -0.... positive \n", + "25 [0.02258816733956337, -0.18138407170772552, -0... positive \n", + "26 [-1.3662021160125732, 0.042950600385665894, 0.... positive \n", + "27 [-1.0259658098220825, 0.31534343957901, -0.242... positive \n", + "28 [-0.411965548992157, -0.5224093198776245, -0.6... positive \n", + "29 [-1.0891247987747192, -0.5220181345939636, -0.... positive \n", + "30 [-1.0681140422821045, -0.6835974454879761, -0.... positive \n", + "31 [-0.20442193746566772, -0.3683846890926361, -0... positive \n", + "32 [-0.9112239480018616, 0.17845268547534943, -0.... positive \n", + "33 [-1.3499250411987305, 0.23698307573795319, -0.... positive \n", + "34 [-0.47838863730430603, 0.19593238830566406, -0... positive \n", + "35 [-1.229308009147644, -0.07380063086748123, -0.... positive \n", + "36 [-0.8348453640937805, -0.03178590536117554, -0... positive \n", + "37 [-0.4827183485031128, 0.08657485246658325, -0.... positive \n", + "38 [-0.6942201852798462, -0.3642423152923584, -0.... positive \n", + "39 [-0.9660191535949707, -0.2219739854335785, -0.... positive \n", + "40 [-0.03318127244710922, 0.04329724237322807, 0.... positive \n", + "41 [-0.5563615560531616, 0.4725855588912964, 0.10... positive \n", + "42 [-0.6955257654190063, 0.37047961354255676, -0.... positive \n", + "43 [-0.8704789876937866, -0.22370557487010956, -0... positive \n", + "44 [-0.20755957067012787, 0.34972018003463745, -0... positive \n", + "45 [-1.3415300846099854, 1.6326956748962402, -0.6... positive \n", + "46 [-1.4377732276916504, -0.11478081345558167, 0.... positive \n", + "47 [-1.193617343902588, -0.02149897627532482, 0.1... positive \n", + "48 [-0.5854026675224304, -0.21378959715366364, -0... positive \n", + "49 [-0.39933672547340393, -0.5969381332397461, -0... positive \n", + "\n", + " sentiment_confidence text \\\n", + "0 5.0 new post added mumbai press official site prod... \n", + "1 1.0 not wrong the actual temperature might but and... \n", + "2 1.0 why pakistan crying name modi every day how na... \n", + "3 8.0 congress years wasnt able complete one rafale ... \n", + "4 2.0 public toilet near kanagadurga temple nizampet... \n", + "5 9.0 \\nthe foundation for new india 2022 has alread... \n", + "6 2.0 dear governorani can you let the people indian... \n", + "7 1.0 this daft donkey’ dick aap was born the iac mo... \n", + "8 1.0 major reason for social hatred and strife modi... \n", + "9 1.0 demo was black money caught modi did inspite r... \n", + "10 5.0 one the best ministers modis cabinet \n", + "11 3.0 raghuram rajan sent list high profile bank fra... \n", + "12 8.0 governor kalyan singh aligarh 23rd march all a... \n", + "13 2.0 this campaign low hanging fruit seems giving f... \n", + "14 2.0 strict policing that too health system sir reg... \n", + "15 8.0 shatrughan sinha was far bigger public figure ... \n", + "16 3.0 people wish your vision india and least intere... \n", + "17 4.0 chowkidar hee chor hain baap chor beta bada ch... \n", + "18 1.0 with modi all his drawbacks atleast know what ... \n", + "19 6.0 compare that with modi’ 2014 “vikas purush” el... \n", + "20 1.0 with welfare delivery gst ibc and feo place mo... \n", + "21 5.0 young and dynamic chowkidar says you are not w... \n", + "22 1.0 dont forget petrol prices have risen ₹ modi go... \n", + "23 7.0 prime minister narendra modi has urged voters ... \n", + "24 2.0 when someone asks random question economy sche... \n", + "25 5.0 from whatsapp have two options this elections ... \n", + "26 1.0 heres interesting section work which gives com... \n", + "27 1.0 know why you willpapu his chamchas nothing tar... \n", + "28 6.0 only rahul gandhis politics love can defeat th... \n", + "29 6.0 one see the fake calculation calsi chek kariye... \n", + "30 2.0 being born religion where female deities worsh... \n", + "31 1.0 narendra modi became and despite biased viciou... \n", + "32 2.0 think hindus should back off and let them suff... \n", + "33 2.0 from the very beginningmodi doing wada faramos... \n", + "34 1.0 women are powerful nature wat hinduism states ... \n", + "35 2.0 almost 4000 crore spent but the ganga more pol... \n", + "36 4.0 seriously must have sick mind call small kid r... \n", + "37 2.0 agree with you was unrequired was kinda uncomf... \n", + "38 2.0 rajdeep think 4got that imran not indian never... \n", + "39 9.0 the great modi trap ways congress has walked i... \n", + "40 1.0 has come new meanings nationalism hindu and su... \n", + "41 1.0 modi govt hindus are behaving wildly \n", + "42 1.0 sir one request why bjp candidate contesting f... \n", + "43 1.0 vapas lana hai\\ndesh agey badana hai\\nvote for... \n", + "44 4.0 even with massive mandate 336 seats the nda go... \n", + "45 2.0 can promise what can delivered epf pension uni... \n", + "46 9.0 and even print this seriously whats this elect... \n", + "47 1.0 she has asked three questions from modi and he... \n", + "48 4.0 dear all tsunami favour modi 2019 coming from ... \n", + "49 5.0 rahul gandhis politics love can defeat the mod... \n", + "\n", + " y \n", + "0 positive \n", + "1 positive \n", + "2 negative \n", + "3 positive \n", + "4 positive \n", + "5 positive \n", + "6 negative \n", + "7 negative \n", + "8 positive \n", + "9 positive \n", + "10 positive \n", + "11 negative \n", + "12 positive \n", + "13 positive \n", + "14 positive \n", + "15 positive \n", + "16 negative \n", + "17 positive \n", + "18 positive \n", + "19 negative \n", + "20 positive \n", + "21 positive \n", + "22 negative \n", + "23 positive \n", + "24 negative \n", + "25 positive \n", + "26 positive \n", + "27 negative \n", + "28 negative \n", + "29 negative \n", + "30 positive \n", + "31 negative \n", + "32 positive \n", + "33 negative \n", + "34 positive \n", + "35 positive \n", + "36 negative \n", + "37 positive \n", + "38 negative \n", + "39 positive \n", + "40 positive \n", + "41 positive \n", + "42 negative \n", + "43 positive \n", + "44 positive \n", + "45 positive \n", + "46 negative \n", + "47 positive \n", + "48 negative \n", + "49 negative " + ], + "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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + "
documentsentence_embedding_small_bert_L2_128sentimentsentiment_confidencetexty
0new post added mumbai press official site prod...[-0.2672112286090851, 0.22553667426109314, -0....positive5.0new post added mumbai press official site prod...positive
1not wrong the actual temperature might but and...[-1.243513822555542, 0.24190887808799744, -0.4...positive1.0not wrong the actual temperature might but and...positive
2why pakistan crying name modi every day how na...[-0.7444853782653809, -0.0514342300593853, -0....positive1.0why pakistan crying name modi every day how na...negative
3congress years wasnt able complete one rafale ...[-0.34242647886276245, 0.46881920099258423, -0...positive8.0congress years wasnt able complete one rafale ...positive
4public toilet near kanagadurga temple nizampet...[-1.1381851434707642, 0.512217104434967, -0.74...positive2.0public toilet near kanagadurga temple nizampet...positive
5the foundation for new india 2022 has already ...[-0.4057338237762451, 1.0029019117355347, -0.9...positive9.0\\nthe foundation for new india 2022 has alread...positive
6dear governorani can you let the people indian...[-1.4633989334106445, 0.0006002967129461467, -...positive2.0dear governorani can you let the people indian...negative
7this daft donkey’ dick aap was born the iac mo...[0.04606145992875099, 0.3098487854003906, 0.02...positive1.0this daft donkey’ dick aap was born the iac mo...negative
8major reason for social hatred and strife modi...[-0.9470604658126831, 0.27183642983436584, -1....positive1.0major reason for social hatred and strife modi...positive
9demo was black money caught modi did inspite r...[-0.7136786580085754, 0.0788763239979744, -0.5...positive1.0demo was black money caught modi did inspite r...positive
10one the best ministers modis cabinet[-0.3664279282093048, 0.3727397918701172, -0.4...positive5.0one the best ministers modis cabinetpositive
11raghuram rajan sent list high profile bank fra...[-1.0506610870361328, 0.20963071286678314, -0....positive3.0raghuram rajan sent list high profile bank fra...negative
12governor kalyan singh aligarh 23rd march all a...[-0.20803016424179077, 0.07477151602506638, -0...positive8.0governor kalyan singh aligarh 23rd march all a...positive
13this campaign low hanging fruit seems giving f...[-1.2681258916854858, 0.24513696134090424, -0....positive2.0this campaign low hanging fruit seems giving f...positive
14strict policing that too health system sir reg...[-0.9757605195045471, 1.0792640447616577, -0.4...positive2.0strict policing that too health system sir reg...positive
15shatrughan sinha was far bigger public figure ...[-0.5276148319244385, 0.2546652853488922, -0.1...positive8.0shatrughan sinha was far bigger public figure ...positive
16people wish your vision india and least intere...[-1.0698672533035278, 0.5003032088279724, -0.4...positive3.0people wish your vision india and least intere...negative
17chowkidar hee chor hain baap chor beta bada ch...[-0.5458223223686218, -0.23064681887626648, -0...positive4.0chowkidar hee chor hain baap chor beta bada ch...positive
18with modi all his drawbacks atleast know what ...[-0.8066104054450989, -0.014454682357609272, -...positive1.0with modi all his drawbacks atleast know what ...positive
19compare that with modi’ 2014 “vikas purush” el...[-0.5401442646980286, -0.41557249426841736, -0...positive6.0compare that with modi’ 2014 “vikas purush” el...negative
20with welfare delivery gst ibc and feo place mo...[-0.5764278769493103, 1.2036645412445068, -1.0...positive1.0with welfare delivery gst ibc and feo place mo...positive
21young and dynamic chowkidar says you are not w...[-0.08391488343477249, -0.43613195419311523, 0...positive5.0young and dynamic chowkidar says you are not w...positive
22dont forget petrol prices have risen ₹ modi go...[-0.10981855541467667, 0.5448974370956421, -0....positive1.0dont forget petrol prices have risen ₹ modi go...negative
23prime minister narendra modi has urged voters ...[0.27992355823516846, 0.0582934208214283, -0.2...positive7.0prime minister narendra modi has urged voters ...positive
24when someone asks random question economy sche...[-0.5603336691856384, -0.1663953959941864, -0....positive2.0when someone asks random question economy sche...negative
25from whatsapp have two options this elections ...[0.02258816733956337, -0.18138407170772552, -0...positive5.0from whatsapp have two options this elections ...positive
26heres interesting section work which gives com...[-1.3662021160125732, 0.042950600385665894, 0....positive1.0heres interesting section work which gives com...positive
27know why you willpapu his chamchas nothing tar...[-1.0259658098220825, 0.31534343957901, -0.242...positive1.0know why you willpapu his chamchas nothing tar...negative
28only rahul gandhis politics love can defeat th...[-0.411965548992157, -0.5224093198776245, -0.6...positive6.0only rahul gandhis politics love can defeat th...negative
29one see the fake calculation calsi chek kariye...[-1.0891247987747192, -0.5220181345939636, -0....positive6.0one see the fake calculation calsi chek kariye...negative
30being born religion where female deities worsh...[-1.0681140422821045, -0.6835974454879761, -0....positive2.0being born religion where female deities worsh...positive
31narendra modi became and despite biased viciou...[-0.20442193746566772, -0.3683846890926361, -0...positive1.0narendra modi became and despite biased viciou...negative
32think hindus should back off and let them suff...[-0.9112239480018616, 0.17845268547534943, -0....positive2.0think hindus should back off and let them suff...positive
33from the very beginningmodi doing wada faramos...[-1.3499250411987305, 0.23698307573795319, -0....positive2.0from the very beginningmodi doing wada faramos...negative
34women are powerful nature wat hinduism states ...[-0.47838863730430603, 0.19593238830566406, -0...positive1.0women are powerful nature wat hinduism states ...positive
35almost 4000 crore spent but the ganga more pol...[-1.229308009147644, -0.07380063086748123, -0....positive2.0almost 4000 crore spent but the ganga more pol...positive
36seriously must have sick mind call small kid r...[-0.8348453640937805, -0.03178590536117554, -0...positive4.0seriously must have sick mind call small kid r...negative
37agree with you was unrequired was kinda uncomf...[-0.4827183485031128, 0.08657485246658325, -0....positive2.0agree with you was unrequired was kinda uncomf...positive
38rajdeep think 4got that imran not indian never...[-0.6942201852798462, -0.3642423152923584, -0....positive2.0rajdeep think 4got that imran not indian never...negative
39the great modi trap ways congress has walked into[-0.9660191535949707, -0.2219739854335785, -0....positive9.0the great modi trap ways congress has walked i...positive
40has come new meanings nationalism hindu and su...[-0.03318127244710922, 0.04329724237322807, 0....positive1.0has come new meanings nationalism hindu and su...positive
41modi govt hindus are behaving wildly[-0.5563615560531616, 0.4725855588912964, 0.10...positive1.0modi govt hindus are behaving wildlypositive
42sir one request why bjp candidate contesting f...[-0.6955257654190063, 0.37047961354255676, -0....positive1.0sir one request why bjp candidate contesting f...negative
43vapas lana hai desh agey badana hai vote for m...[-0.8704789876937866, -0.22370557487010956, -0...positive1.0vapas lana hai\\ndesh agey badana hai\\nvote for...positive
44even with massive mandate 336 seats the nda go...[-0.20755957067012787, 0.34972018003463745, -0...positive4.0even with massive mandate 336 seats the nda go...positive
45can promise what can delivered epf pension uni...[-1.3415300846099854, 1.6326956748962402, -0.6...positive2.0can promise what can delivered epf pension uni...positive
46and even print this seriously whats this elect...[-1.4377732276916504, -0.11478081345558167, 0....positive9.0and even print this seriously whats this elect...negative
47she has asked three questions from modi and he...[-1.193617343902588, -0.02149897627532482, 0.1...positive1.0she has asked three questions from modi and he...positive
48dear all tsunami favour modi 2019 coming from ...[-0.5854026675224304, -0.21378959715366364, -0...positive4.0dear all tsunami favour modi 2019 coming from ...negative
49rahul gandhis politics love can defeat the mod...[-0.39933672547340393, -0.5969381332397461, -0...positive5.0rahul gandhis politics love can defeat the mod...negative
\n", + "
\n", + "
\n", + "\n", + "
\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "
\n", + "\n", + "\n", + "
\n", + " \n", + "\n", + "\n", + "\n", + " \n", + "
\n", + "
\n", + "
\n" + ] + }, + "metadata": {}, + "execution_count": 9 + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "qFoT-s1MjTSS" + }, + "source": [ + "# Try training with different Embeddings" + ] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "nxWFzQOhjWC8", + "outputId": "6e781fd6-e1eb-4641-b3e1-6f6f4e50b7a8" + }, + "source": [ + "# We can use nlu.print_components(action='embed_sentence') to see every possibler sentence embedding we could use. Lets use bert!\n", + "nlp.nlu.print_components(action='embed_sentence')" + ], + "execution_count": 10, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "For language NLU provides the following Models : \n", + "nlu.load('am.embed_sentence.xlm_roberta') returns Spark NLP model_anno_obj sent_xlm_roberta_base_finetuned_amharic\n", + "For language NLU provides the following Models : \n", + "nlu.load('de.embed_sentence.bert.base_cased') returns Spark NLP model_anno_obj sent_bert_base_cased\n", + "For language NLU provides the following Models : \n", + "nlu.load('el.embed_sentence.bert.base_uncased') returns Spark NLP model_anno_obj sent_bert_base_uncased\n", + "For language NLU provides the following Models : \n", + "nlu.load('en.embed_sentence') returns Spark NLP model_anno_obj tfhub_use\n", + "nlu.load('en.embed_sentence.albert') returns Spark NLP model_anno_obj albert_base_uncased\n", + "nlu.load('en.embed_sentence.bert') returns Spark NLP model_anno_obj sent_bert_base_uncased\n", + "nlu.load('en.embed_sentence.bert.base_uncased_legal') returns Spark NLP model_anno_obj sent_bert_base_uncased_legal\n", + "nlu.load('en.embed_sentence.bert.finetuned') returns Spark NLP model_anno_obj sbert_setfit_finetuned_financial_text_classification\n", + "nlu.load('en.embed_sentence.bert.pubmed') returns Spark NLP model_anno_obj sent_bert_pubmed\n", + "nlu.load('en.embed_sentence.bert.pubmed_squad2') returns Spark NLP model_anno_obj sent_bert_pubmed_squad2\n", + "nlu.load('en.embed_sentence.bert.wiki_books') returns Spark NLP model_anno_obj sent_bert_wiki_books\n", + "nlu.load('en.embed_sentence.bert.wiki_books_mnli') returns Spark NLP model_anno_obj sent_bert_wiki_books_mnli\n", + "nlu.load('en.embed_sentence.bert.wiki_books_qnli') returns Spark NLP model_anno_obj sent_bert_wiki_books_qnli\n", + "nlu.load('en.embed_sentence.bert.wiki_books_qqp') returns Spark NLP model_anno_obj sent_bert_wiki_books_qqp\n", + "nlu.load('en.embed_sentence.bert.wiki_books_squad2') returns Spark NLP model_anno_obj sent_bert_wiki_books_squad2\n", + "nlu.load('en.embed_sentence.bert.wiki_books_sst2') returns Spark NLP model_anno_obj sent_bert_wiki_books_sst2\n", + "nlu.load('en.embed_sentence.bert_base_cased') returns Spark NLP model_anno_obj sent_bert_base_cased\n", + "nlu.load('en.embed_sentence.bert_base_uncased') returns Spark NLP model_anno_obj sent_bert_base_uncased\n", + "nlu.load('en.embed_sentence.bert_large_cased') returns Spark NLP model_anno_obj sent_bert_large_cased\n", + "nlu.load('en.embed_sentence.bert_large_uncased') returns Spark NLP model_anno_obj sent_bert_large_uncased\n", + "nlu.load('en.embed_sentence.bert_use_cmlm_en_base') returns Spark NLP model_anno_obj sent_bert_use_cmlm_en_base\n", + "nlu.load('en.embed_sentence.bert_use_cmlm_en_large') returns Spark NLP model_anno_obj sent_bert_use_cmlm_en_large\n", + "nlu.load('en.embed_sentence.biobert.clinical_base_cased') returns Spark NLP model_anno_obj sent_biobert_clinical_base_cased\n", + "nlu.load('en.embed_sentence.biobert.discharge_base_cased') returns Spark NLP model_anno_obj sent_biobert_discharge_base_cased\n", + "nlu.load('en.embed_sentence.biobert.pmc_base_cased') returns Spark NLP model_anno_obj sent_biobert_pmc_base_cased\n", + "nlu.load('en.embed_sentence.biobert.pubmed_base_cased') returns Spark NLP model_anno_obj sent_biobert_pubmed_base_cased\n", + "nlu.load('en.embed_sentence.biobert.pubmed_large_cased') returns Spark NLP model_anno_obj sent_biobert_pubmed_large_cased\n", + "nlu.load('en.embed_sentence.biobert.pubmed_pmc_base_cased') returns Spark NLP model_anno_obj sent_biobert_pubmed_pmc_base_cased\n", + "nlu.load('en.embed_sentence.covidbert.large_uncased') returns Spark NLP model_anno_obj sent_covidbert_large_uncased\n", + "nlu.load('en.embed_sentence.distil_roberta.distilled_base') returns Spark NLP model_anno_obj sent_distilroberta_base\n", + "nlu.load('en.embed_sentence.doc2vec') returns Spark NLP model_anno_obj doc2vec_gigaword_300\n", + "nlu.load('en.embed_sentence.doc2vec.gigaword_300') returns Spark NLP model_anno_obj doc2vec_gigaword_300\n", + "nlu.load('en.embed_sentence.doc2vec.gigaword_wiki_300') returns Spark NLP model_anno_obj doc2vec_gigaword_wiki_300\n", + "nlu.load('en.embed_sentence.electra') returns Spark NLP model_anno_obj sent_electra_small_uncased\n", + "nlu.load('en.embed_sentence.electra_base_uncased') returns Spark NLP model_anno_obj sent_electra_base_uncased\n", + "nlu.load('en.embed_sentence.electra_large_uncased') returns Spark NLP model_anno_obj sent_electra_large_uncased\n", + "nlu.load('en.embed_sentence.electra_small_uncased') returns Spark NLP model_anno_obj sent_electra_small_uncased\n", + "nlu.load('en.embed_sentence.roberta.base') returns Spark NLP model_anno_obj sent_roberta_base\n", + "nlu.load('en.embed_sentence.roberta.large') returns Spark NLP model_anno_obj sent_roberta_large\n", + "nlu.load('en.embed_sentence.small_bert_L10_128') returns Spark NLP model_anno_obj sent_small_bert_L10_128\n", + "nlu.load('en.embed_sentence.small_bert_L10_256') returns Spark NLP model_anno_obj sent_small_bert_L10_256\n", + "nlu.load('en.embed_sentence.small_bert_L10_512') returns Spark NLP model_anno_obj sent_small_bert_L10_512\n", + "nlu.load('en.embed_sentence.small_bert_L10_768') returns Spark NLP model_anno_obj sent_small_bert_L10_768\n", + "nlu.load('en.embed_sentence.small_bert_L12_128') returns Spark NLP model_anno_obj sent_small_bert_L12_128\n", + "nlu.load('en.embed_sentence.small_bert_L12_256') returns Spark NLP model_anno_obj sent_small_bert_L12_256\n", + "nlu.load('en.embed_sentence.small_bert_L12_512') returns Spark NLP model_anno_obj sent_small_bert_L12_512\n", + "nlu.load('en.embed_sentence.small_bert_L12_768') returns Spark NLP model_anno_obj sent_small_bert_L12_768\n", + "nlu.load('en.embed_sentence.small_bert_L2_128') returns Spark NLP model_anno_obj sent_small_bert_L2_128\n", + "nlu.load('en.embed_sentence.small_bert_L2_256') returns Spark NLP model_anno_obj sent_small_bert_L2_256\n", + "nlu.load('en.embed_sentence.small_bert_L2_512') returns Spark NLP model_anno_obj sent_small_bert_L2_512\n", + "nlu.load('en.embed_sentence.small_bert_L2_768') returns Spark NLP model_anno_obj sent_small_bert_L2_768\n", + "nlu.load('en.embed_sentence.small_bert_L4_128') returns Spark NLP model_anno_obj sent_small_bert_L4_128\n", + "nlu.load('en.embed_sentence.small_bert_L4_256') returns Spark NLP model_anno_obj sent_small_bert_L4_256\n", + "nlu.load('en.embed_sentence.small_bert_L4_512') returns Spark NLP model_anno_obj sent_small_bert_L4_512\n", + "nlu.load('en.embed_sentence.small_bert_L4_768') returns Spark NLP model_anno_obj sent_small_bert_L4_768\n", + "nlu.load('en.embed_sentence.small_bert_L6_128') returns Spark NLP model_anno_obj sent_small_bert_L6_128\n", + "nlu.load('en.embed_sentence.small_bert_L6_256') returns Spark NLP model_anno_obj sent_small_bert_L6_256\n", + "nlu.load('en.embed_sentence.small_bert_L6_512') returns Spark NLP model_anno_obj sent_small_bert_L6_512\n", + "nlu.load('en.embed_sentence.small_bert_L6_768') returns Spark NLP model_anno_obj sent_small_bert_L6_768\n", + "nlu.load('en.embed_sentence.small_bert_L8_128') returns Spark NLP model_anno_obj sent_small_bert_L8_128\n", + "nlu.load('en.embed_sentence.small_bert_L8_256') returns Spark NLP model_anno_obj sent_small_bert_L8_256\n", + "nlu.load('en.embed_sentence.small_bert_L8_512') returns Spark NLP model_anno_obj sent_small_bert_L8_512\n", + "nlu.load('en.embed_sentence.small_bert_L8_768') returns Spark NLP model_anno_obj sent_small_bert_L8_768\n", + "nlu.load('en.embed_sentence.tfhub_use') returns Spark NLP model_anno_obj tfhub_use\n", + "nlu.load('en.embed_sentence.tfhub_use.lg') returns Spark NLP model_anno_obj tfhub_use_lg\n", + "nlu.load('en.embed_sentence.use') returns Spark NLP model_anno_obj tfhub_use\n", + "nlu.load('en.embed_sentence.use.lg') returns Spark NLP model_anno_obj tfhub_use_lg\n", + "For language NLU provides the following Models : \n", + "nlu.load('es.embed_sentence.bert.base_cased') returns Spark NLP model_anno_obj sent_bert_base_cased\n", + "nlu.load('es.embed_sentence.bert.base_uncased') returns Spark NLP model_anno_obj sent_bert_base_uncased\n", + "For language NLU provides the following Models : \n", + "nlu.load('fi.embed_sentence.bert') returns Spark NLP model_anno_obj bert_base_finnish_uncased\n", + "nlu.load('fi.embed_sentence.bert.cased') returns Spark NLP model_anno_obj bert_base_finnish_cased\n", + "nlu.load('fi.embed_sentence.bert.uncased') returns Spark NLP model_anno_obj bert_base_finnish_uncased\n", + "For language NLU provides the following Models : \n", + "nlu.load('ha.embed_sentence.xlm_roberta') returns Spark NLP model_anno_obj sent_xlm_roberta_base_finetuned_hausa\n", + "For language NLU provides the following Models : \n", + "nlu.load('ig.embed_sentence.xlm_roberta') returns Spark NLP model_anno_obj sent_xlm_roberta_base_finetuned_igbo\n", + "For language NLU provides the following Models : \n", + "nlu.load('lg.embed_sentence.xlm_roberta') returns Spark NLP model_anno_obj sent_xlm_roberta_base_finetuned_luganda\n", + "For language NLU provides the following Models : \n", + "nlu.load('nl.embed_sentence.bert.base_cased') returns Spark NLP model_anno_obj sent_bert_base_cased\n", + "For language NLU provides the following Models : \n", + "nlu.load('pcm.embed_sentence.xlm_roberta') returns Spark NLP model_anno_obj sent_xlm_roberta_base_finetuned_naija\n", + "For language NLU provides the following Models : \n", + "nlu.load('pt.embed_sentence.bert.base_legal') returns Spark NLP model_anno_obj sbert_legal_bertimbau_base_tsdae_sts\n", + "nlu.load('pt.embed_sentence.bert.cased_large_legal') returns Spark NLP model_anno_obj sbert_bert_large_portuguese_cased_legal_mlm_sts_v0.1\n", + "nlu.load('pt.embed_sentence.bert.large_legal') returns Spark NLP model_anno_obj sbert_legal_bertimbau_large_gpl_sts\n", + "nlu.load('pt.embed_sentence.bert.legal.cased_large_mlm_sts_v0.10.by_stjiris') returns Spark NLP model_anno_obj sbert_bert_large_portuguese_cased_legal_mlm_sts_v0.10\n", + "nlu.load('pt.embed_sentence.bert.legal.cased_large_mlm_sts_v0.2.by_stjiris') returns Spark NLP model_anno_obj sbert_bert_large_portuguese_cased_legal_mlm_sts_v0.2\n", + "nlu.load('pt.embed_sentence.bert.legal.cased_large_mlm_sts_v0.3.by_stjiris') returns Spark NLP model_anno_obj sbert_bert_large_portuguese_cased_legal_mlm_sts_v0.3\n", + "nlu.load('pt.embed_sentence.bert.legal.cased_large_mlm_sts_v0.4.by_stjiris') returns Spark NLP model_anno_obj sbert_bert_large_portuguese_cased_legal_mlm_sts_v0.4\n", + "nlu.load('pt.embed_sentence.bert.legal.cased_large_mlm_sts_v0.5.by_stjiris') returns Spark NLP model_anno_obj sbert_bert_large_portuguese_cased_legal_mlm_sts_v0.5\n", + "nlu.load('pt.embed_sentence.bert.legal.cased_large_mlm_sts_v0.7.by_stjiris') returns Spark NLP model_anno_obj sbert_bert_large_portuguese_cased_legal_mlm_sts_v0.7\n", + "nlu.load('pt.embed_sentence.bert.legal.cased_large_mlm_sts_v0.8.by_stjiris') returns Spark NLP model_anno_obj sbert_bert_large_portuguese_cased_legal_mlm_sts_v0.8\n", + "nlu.load('pt.embed_sentence.bert.legal.cased_large_mlm_sts_v0.9.by_stjiris') returns Spark NLP model_anno_obj sbert_bert_large_portuguese_cased_legal_mlm_sts_v0.9\n", + "nlu.load('pt.embed_sentence.bert.legal.cased_large_mlm_sts_v1.0.by_stjiris') returns Spark NLP model_anno_obj sbert_bert_large_portuguese_cased_legal_mlm_sts_v1.0\n", + "nlu.load('pt.embed_sentence.bert.legal.cased_large_mlm_v0.11_gpl_nli_sts_v0.by_stjiris') returns Spark NLP model_anno_obj sbert_bert_large_portuguese_cased_legal_mlm_v0.11_gpl_nli_sts_v0\n", + "nlu.load('pt.embed_sentence.bert.legal.cased_large_mlm_v0.11_gpl_nli_sts_v1.by_stjiris') returns Spark NLP model_anno_obj sbert_bert_large_portuguese_cased_legal_mlm_v0.11_gpl_nli_sts_v1\n", + "nlu.load('pt.embed_sentence.bert.legal.cased_large_mlm_v0.11_nli_sts_v0.by_stjiris') returns Spark NLP model_anno_obj sbert_bert_large_portuguese_cased_legal_mlm_v0.11_nli_sts_v0\n", + "nlu.load('pt.embed_sentence.bert.legal.cased_large_mlm_v0.11_nli_sts_v1.by_stjiris') returns Spark NLP model_anno_obj sbert_bert_large_portuguese_cased_legal_mlm_v0.11_nli_sts_v1\n", + "nlu.load('pt.embed_sentence.bert.legal.cased_large_mlm_v0.11_sts_v0.by_stjiris') returns Spark NLP model_anno_obj sbert_bert_large_portuguese_cased_legal_mlm_v0.11_sts_v0\n", + "nlu.load('pt.embed_sentence.bert.legal.cased_large_mlm_v0.11_sts_v1.by_stjiris') returns Spark NLP model_anno_obj sbert_bert_large_portuguese_cased_legal_mlm_v0.11_sts_v1\n", + "nlu.load('pt.embed_sentence.bert.v2_base_legal') returns Spark NLP model_anno_obj sbert_legal_bertimbau_sts_base_ma_v2\n", + "nlu.load('pt.embed_sentence.bert.v2_large_legal') returns Spark NLP model_anno_obj sbert_legal_bertimbau_large_tsdae_sts_v2\n", + "nlu.load('pt.embed_sentence.bertimbau.legal.assin.base.by_rufimelo') returns Spark NLP model_anno_obj sbert_legal_bertimbau_sts_base_ma\n", + "nlu.load('pt.embed_sentence.bertimbau.legal.assin2.base.by_rufimelo') returns Spark NLP model_anno_obj sbert_legal_bertimbau_sts_base\n", + "nlu.load('pt.embed_sentence.bertimbau.legal.large_sts_by_rufimelo') returns Spark NLP model_anno_obj sbert_legal_bertimbau_sts_large\n", + "nlu.load('pt.embed_sentence.bertimbau.legal.large_sts_ma.by_rufimelo') returns Spark NLP model_anno_obj sbert_legal_bertimbau_sts_large_ma\n", + "nlu.load('pt.embed_sentence.bertimbau.legal.large_sts_ma_v3.by_rufimelo') returns Spark NLP model_anno_obj sbert_legal_bertimbau_sts_large_ma_v3\n", + "nlu.load('pt.embed_sentence.bertimbau.legal.large_tsdae_sts.by_rufimelo') returns Spark NLP model_anno_obj sbert_legal_bertimbau_large_tsdae_sts\n", + "nlu.load('pt.embed_sentence.bertimbau.legal.large_tsdae_sts_v4.by_rufimelo') returns Spark NLP model_anno_obj sbert_legal_bertimbau_large_tsdae_sts_v4\n", + "nlu.load('pt.embed_sentence.bertimbau.legal.large_tsdae_v4_gpl_sts.by_rufimelo') returns Spark NLP model_anno_obj sbert_legal_bertimbau_large_tsdae_v4_gpl_sts\n", + "nlu.load('pt.embed_sentence.bertimbau.legal.v2_large_sts_v2.by_rufimelo') returns Spark NLP model_anno_obj sbert_legal_bertimbau_sts_large_v2\n", + "nlu.load('pt.embed_sentence.bertimbau.legal.v2_large_v2_sts.by_rufimelo') returns Spark NLP model_anno_obj sbert_legal_bertimbau_large_v2_sts\n", + "For language NLU provides the following Models : \n", + "nlu.load('rw.embed_sentence.xlm_roberta') returns Spark NLP model_anno_obj sent_xlm_roberta_base_finetuned_kinyarwanda\n", + "For language NLU provides the following Models : \n", + "nlu.load('sv.embed_sentence.bert.base_cased') returns Spark NLP model_anno_obj sent_bert_base_cased\n", + "For language NLU provides the following Models : \n", + "nlu.load('sw.embed_sentence.xlm_roberta') returns Spark NLP model_anno_obj sent_xlm_roberta_base_finetuned_swahili\n", + "For language NLU provides the following Models : \n", + "nlu.load('wo.embed_sentence.xlm_roberta') returns Spark NLP model_anno_obj sent_xlm_roberta_base_finetuned_wolof\n", + "For language NLU provides the following Models : \n", + "nlu.load('xx.embed_sentence') returns Spark NLP model_anno_obj sent_bert_multi_cased\n", + "nlu.load('xx.embed_sentence.bert') returns Spark NLP model_anno_obj sent_bert_multi_cased\n", + "nlu.load('xx.embed_sentence.bert.cased') returns Spark NLP model_anno_obj sent_bert_multi_cased\n", + "nlu.load('xx.embed_sentence.bert.muril') returns Spark NLP model_anno_obj sent_bert_muril\n", + "nlu.load('xx.embed_sentence.bert_use_cmlm_multi_base') returns Spark NLP model_anno_obj sent_bert_use_cmlm_multi_base\n", + "nlu.load('xx.embed_sentence.bert_use_cmlm_multi_base_br') returns Spark NLP model_anno_obj sent_bert_use_cmlm_multi_base_br\n", + "nlu.load('xx.embed_sentence.labse') returns Spark NLP model_anno_obj labse\n", + "nlu.load('xx.embed_sentence.xlm_roberta.base') returns Spark NLP model_anno_obj sent_xlm_roberta_base\n", + "For language NLU provides the following Models : \n", + "nlu.load('yo.embed_sentence.xlm_roberta') returns Spark NLP model_anno_obj sent_xlm_roberta_base_finetuned_yoruba\n", + "For language NLU provides the following Models : \n", + "nlu.load('zh.embed_sentence.bert') returns Spark NLP model_anno_obj sbert_chinese_qmc_finance_v1\n", + "nlu.load('zh.embed_sentence.bert.distilled') returns Spark NLP model_anno_obj sbert_chinese_qmc_finance_v1_distill\n" + ] + } + ] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "IKK_Ii_gjJfF", + "outputId": "ae16a73d-eb90-4d1f-f1d0-9769c28ce54f" + }, + "source": [ + "trainable_pipe = nlp.load('en.embed_sentence.small_bert_L12_768 train.sentiment')\n", + "# We need to train longer and user smaller LR for NON-USE based sentence embeddings usually\n", + "# We could tune the hyperparameters further with hyperparameter tuning methods like gridsearch\n", + "# Also longer training gives more accuracy\n", + "trainable_pipe['trainable_sentiment_dl'].setMaxEpochs(100)\n", + "trainable_pipe['trainable_sentiment_dl'].setLr(0.0005)\n", + "fitted_pipe = trainable_pipe.fit(train_df)\n", + "# predict with the trainable pipeline on dataset and get predictions\n", + "preds = fitted_pipe.predict(train_df,output_level='document')\n", + "\n", + "#sentence detector that is part of the pipe generates sone NaNs. lets drop them first\n", + "preds.dropna(inplace=True)\n", + "print(classification_report(preds['y'], preds['sentiment']))\n", + "\n", + "#preds" + ], + "execution_count": 11, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Warning::Spark Session already created, some configs may not take.\n", + "Warning::Spark Session already created, some configs may not take.\n", + "sent_small_bert_L12_768 download started this may take some time.\n", + "Approximate size to download 392.9 MB\n", + "[OK!]\n", + " precision recall f1-score support\n", + "\n", + " negative 0.78 0.65 0.71 300\n", + " neutral 0.00 0.00 0.00 0\n", + " positive 0.89 0.52 0.65 300\n", + "\n", + " accuracy 0.58 600\n", + " macro avg 0.55 0.39 0.45 600\n", + "weighted avg 0.83 0.58 0.68 600\n", + "\n" + ] + }, + { + "output_type": "stream", + "name": "stderr", + "text": [ + "/usr/local/lib/python3.10/dist-packages/nlu/pipe/extractors/extractor_methods/base_extractor_methods.py:356: SettingWithCopyWarning: \n", + "A value is trying to be set on a copy of a slice from a DataFrame.\n", + "Try using .loc[row_indexer,col_indexer] = value instead\n", + "\n", + "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n", + " df[cols_to_explode] = df[cols_to_explode].apply(pad_same_level_cols, axis=1)\n", + "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/_classification.py:1344: UndefinedMetricWarning: Recall and F-score are ill-defined and being set to 0.0 in labels with no true samples. Use `zero_division` parameter to control this behavior.\n", + " _warn_prf(average, modifier, msg_start, len(result))\n", + "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/_classification.py:1344: UndefinedMetricWarning: Recall and F-score are ill-defined and being set to 0.0 in labels with no true samples. Use `zero_division` parameter to control this behavior.\n", + " _warn_prf(average, modifier, msg_start, len(result))\n", + "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/_classification.py:1344: UndefinedMetricWarning: Recall and F-score are ill-defined and being set to 0.0 in labels with no true samples. Use `zero_division` parameter to control this behavior.\n", + " _warn_prf(average, modifier, msg_start, len(result))\n" + ] + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "2BB-NwZUoHSe" + }, + "source": [ + "# 5. Lets save the model" + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "eLex095goHwm" + }, + "source": [ + "stored_model_path = './models/classifier_dl_trained'\n", + "fitted_pipe.save(stored_model_path)" + ], + "execution_count": 12, + "outputs": [] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "e_b2DPd4rCiU" + }, + "source": [ + "# 6. Lets load the model from HDD.\n", + "This makes Offlien NLU usage possible! \n", + "You need to call nlu.load(path=path_to_the_pipe) to load a model/pipeline from disk." + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "SO4uz45MoRgp", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 133 + }, + "outputId": "5634381d-e25b-49dd-d720-860be456d9cd" + }, + "source": [ + "hdd_pipe = nlp.load(path=stored_model_path)\n", + "\n", + "preds = hdd_pipe.predict('the president of india just died')\n", + "preds" + ], + "execution_count": 13, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Warning::Spark Session already created, some configs may not take.\n", + "Warning::Spark Session already created, some configs may not take.\n", + "Warning::Spark Session already created, some configs may not take.\n" + ] + }, + { + "output_type": "execute_result", + "data": { + "text/plain": [ + " document \\\n", + "0 the president of india just died \n", + "\n", + " sentence_embedding_from_disk sentiment \\\n", + "0 [0.009459968656301498, -0.07943318039178848, 0... positive \n", + "\n", + " sentiment_confidence \n", + "0 0.0 " + ], + "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", + "
documentsentence_embedding_from_disksentimentsentiment_confidence
0the president of india just died[0.009459968656301498, -0.07943318039178848, 0...positive0.0
\n", + "
\n", + "
\n", + "\n", + "
\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "
\n", + "\n", + "
\n", + "
\n" + ] + }, + "metadata": {}, + "execution_count": 13 + } + ] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "e0CVlkk9v6Qi", + "outputId": "54c80119-8661-4b08-f9c3-952193759535" + }, + "source": [ + "hdd_pipe.print_info()" + ], + "execution_count": 14, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "The following parameters are configurable for this NLU pipeline (You can copy paste the examples) :\n", + ">>> component_list['document_assembler'] has settable params:\n", + "component_list['document_assembler'].setCleanupMode('shrink') | Info: possible values: disabled, inplace, inplace_full, shrink, shrink_full, each, each_full, delete_full | Currently set to : shrink\n", + ">>> component_list['bert_sentence_embeddings@sent_small_bert_L12_768'] has settable params:\n", + "component_list['bert_sentence_embeddings@sent_small_bert_L12_768'].setBatchSize(8) | Info: Size of every batch | Currently set to : 8\n", + "component_list['bert_sentence_embeddings@sent_small_bert_L12_768'].setCaseSensitive(False) | Info: whether to ignore case in tokens for embeddings matching | Currently set to : False\n", + "component_list['bert_sentence_embeddings@sent_small_bert_L12_768'].setDimension(768) | Info: Number of embedding dimensions | Currently set to : 768\n", + "component_list['bert_sentence_embeddings@sent_small_bert_L12_768'].setMaxSentenceLength(128) | Info: Max sentence length to process | Currently set to : 128\n", + "component_list['bert_sentence_embeddings@sent_small_bert_L12_768'].setEngine('tensorflow') | Info: Deep Learning engine used for this model | Currently set to : tensorflow\n", + "component_list['bert_sentence_embeddings@sent_small_bert_L12_768'].setIsLong(False) | Info: Use Long type instead of Int type for inputs buffer - Some Bert models require Long instead of Int. | Currently set to : False\n", + "component_list['bert_sentence_embeddings@sent_small_bert_L12_768'].setStorageRef('sent_small_bert_L12_768') | Info: unique reference name for identification | Currently set to : sent_small_bert_L12_768\n", + ">>> component_list['sentiment_dl@sent_small_bert_L12_768'] has settable params:\n", + "component_list['sentiment_dl@sent_small_bert_L12_768'].setThreshold(0.6) | Info: The minimum threshold for the final result otheriwse it will be neutral | Currently set to : 0.6\n", + "component_list['sentiment_dl@sent_small_bert_L12_768'].setThresholdLabel('neutral') | Info: In case the score is less than threshold, what should be the label. Default is neutral. | Currently set to : neutral\n", + "component_list['sentiment_dl@sent_small_bert_L12_768'].setEngine('tensorflow') | Info: Deep Learning engine used for this model | Currently set to : tensorflow\n", + "component_list['sentiment_dl@sent_small_bert_L12_768'].setClasses(['positive', 'negative']) | Info: get the tags used to trained this SentimentDLModel | Currently set to : ['positive', 'negative']\n", + "component_list['sentiment_dl@sent_small_bert_L12_768'].setStorageRef('sent_small_bert_L12_768') | Info: unique reference name for identification | Currently set to : sent_small_bert_L12_768\n" + ] + } + ] + } + ] +} \ No newline at end of file diff --git a/examples/colab/Training/entity_resolution/sentence_entity_resolution_training.ipynb b/examples/colab/Training/entity_resolution/sentence_entity_resolution_training.ipynb index b2e05ebc..9cb8e254 100644 --- a/examples/colab/Training/entity_resolution/sentence_entity_resolution_training.ipynb +++ b/examples/colab/Training/entity_resolution/sentence_entity_resolution_training.ipynb @@ -3,9 +3,7 @@ "nbformat_minor": 0, "metadata": { "colab": { - "name": "sentence_entity_resolution_training.ipynb", - "provenance": [], - "collapsed_sections": [] + "provenance": [] }, "kernelspec": { "display_name": "Python 3", @@ -32,19 +30,19 @@ "\n", "# Sentence Entity Resolution training\n", "Named Entities are sub pieces in textual data which are labled with classes. \n", - "These classes and strings are still ambious though and it is not possible to group semantically identically entities withouth any definition of `terminology`. \n", + "These classes and strings are still ambious though and it is not possible to group semantically identically entities withouth any definition of `terminology`.\n", "With the `Sentence Resolver` you can train a state of the art deep learning architecture to map entities to their unique terminological representation.\n", "\n", - "A concrete example would be : \n", + "A concrete example would be :\n", "\n", - "- The `TSLA` stock is good to buy. \n", + "- The `TSLA` stock is good to buy.\n", "- `Tesla, Inc`. is a great company to invest int\n", "- The price of `Teslas` stocks is going up\n", "\n", "`TSLA` , `Tesla`, `Teslas` can be extracted by an NER model an labled as `company` entity class. But we cannot tell programmatically, if all the referring to the same sematic concept, in this case company. \n", "\n", "To solve this abigous problem, we can introduce a Terminlogy, where the Tesla company has the ID 21 and every other company in our portfolio get a unique ID aswell. \n", - "With a defined terminology at hand and a labled dataset, we can train a chunk resolver to map textually different but semantically equivalent `company entities` to `the same id`. \n", + "With a defined terminology at hand and a labled dataset, we can train a chunk resolver to map textually different but semantically equivalent `company entities` to `the same id`.\n", "\n", "\n", "\n", @@ -53,9 +51,7 @@ "\n", "\n", "\n", - "## 1. Install NLU, dependecies and Authenticate\n", - "\n", - "See the [install docs](https://nlu.johnsnowlabs.com/docs/en/install#super-quickstart-on-google-colab-or-kaggle) and [authentification docs](https://nlu.johnsnowlabs.com/docs/en/examples_hc#authorize-access-to-licensed-features-and-install-healthcare-dependencies) for more infos \n" + "## 1. Colab Setup\n" ] }, { @@ -64,54 +60,60 @@ "id": "qlZgaz0oXtb6" }, "source": [ - "!wget http://setup.johnsnowlabs.com/nlu/colab.sh -O - | bash\n", - "import nlu\n", - "import pandas as pd " + "# Install the johnsnowlabs library\n", + "! pip install -q johnsnowlabs" ], "execution_count": null, "outputs": [] }, { - "cell_type": "markdown", + "cell_type": "code", + "source": [ + "from google.colab import files\n", + "print('Please Upload your John Snow Labs License using the button below')\n", + "license_keys = files.upload()" + ], "metadata": { - "id": "hp4j0_IluV3y" + "id": "tiyJEsGmN9Hy" }, + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "code", "source": [ - "# Train Sentence Resolver\n", + "from johnsnowlabs import nlp\n", "\n", - "This is a mini example to make you familiar with the dataset structure you must provide for training. \n", - "Train a chunk resolver on a dataset with columns named `y` , `_y` and `text`. `y` is a label, `_y` is an extra identifier label, `text` is the raw text\n" - ] + "# After uploading your license run this to install all licensed Python Wheels and pre-download Jars the Spark Session JVM\n", + "nlp.install()" + ], + "metadata": { + "id": "adVFDvmDOBfG" + }, + "execution_count": null, + "outputs": [] }, { "cell_type": "code", + "source": [ + "spark=nlp.start()" + ], "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "id": "BEHVidCG3wO2", - "outputId": "87628d73-4cd0-47d5-ad04-71b34fcea8df" + "id": "1AM75UupORAA" + }, + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "hp4j0_IluV3y" }, "source": [ - "import nlu\n", - "SPARK_NLP_LICENSE =\"????\"\n", - "AWS_ACCESS_KEY_ID = \"????\"\n", - "AWS_SECRET_ACCESS_KEY =\"????\"\n", - "JSL_SECRET =\"????\"\n", - "nlu.auth(SPARK_NLP_LICENSE,AWS_ACCESS_KEY_ID,AWS_SECRET_ACCESS_KEY,JSL_SECRET)" - ], - "execution_count": 1, - "outputs": [ - { - "output_type": "execute_result", - "data": { - "text/plain": [ - "" - ] - }, - "metadata": {}, - "execution_count": 1 - } + "# Train Sentence Resolver\n", + "\n", + "This is a mini example to make you familiar with the dataset structure you must provide for training.\n", + "Train a chunk resolver on a dataset with columns named `y` , `_y` and `text`. `y` is a label, `_y` is an extra identifier label, `text` is the raw text\n" ] }, { @@ -119,14 +121,14 @@ "metadata": { "colab": { "base_uri": "https://localhost:8080/", - "height": 277 + "height": 559 }, "id": "cib1vJ_1tJRr", - "outputId": "ef575edd-a7a5-45b8-89b6-7edea30cb2ea" + "outputId": "e56c920a-fea6-46d2-bd91-9b040fe3aac8" }, "source": [ - "import pandas as pd \n", - "import nlu\n", + "import pandas as pd\n", + "\n", "dataset = pd.DataFrame({\n", " 'text': ['The Tesla company is good to invest is', 'TSLA is good to invest','TESLA INC. we should buy','PUT ALL MONEY IN TSLA inc!!'],\n", " 'y': ['23','23','23','23'],\n", @@ -134,29 +136,90 @@ "\n", "})\n", "\n", - "trainable_pipe = nlu.load('train.resolve_sentence')\n", + "trainable_pipe = nlp.load('train.resolve_sentence')\n", "fitted_pipe = trainable_pipe.fit(dataset)\n", "fitted_pipe.predict(dataset.text)" ], - "execution_count": 2, + "execution_count": 5, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ - "tfhub_use download started this may take some time.\n", - "Approximate size to download 923.7 MB\n", + "Warning::Spark Session already created, some configs may not take.\n", + "Warning::Spark Session already created, some configs may not take.\n", + "setInputCols in SentenceEntityResolverApproach_d4f860f61823 expecting 1 columns. Provided column amount: 2. Which should be columns from the following annotators: ['sentence_embeddings']\n", + "sent_small_bert_L2_128 download started this may take some time.\n", + "Approximate size to download 16.1 MB\n", "[OK!]\n", "sentence_detector_dl download started this may take some time.\n", "Approximate size to download 354.6 KB\n", - "[OK!]\n" + "[OK!]\n", + "Warning::Spark Session already created, some configs may not take.\n" ] }, { "output_type": "execute_result", "data": { + "text/plain": [ + " document \\\n", + "0 The Tesla company is good to invest is \n", + "1 TSLA is good to invest \n", + "2 TESLA INC. we should buy \n", + "3 PUT ALL MONEY IN TSLA inc!! \n", + "\n", + " resolution_sentence_entity_resolver_code \\\n", + "0 23 \n", + "1 23 \n", + "2 23 \n", + "3 23 \n", + "\n", + " resolution_sentence_entity_resolver_confidence \\\n", + "0 1.0000 \n", + "1 1.0000 \n", + "2 1.0000 \n", + "3 1.0000 \n", + "\n", + " resolution_sentence_entity_resolver_distance \\\n", + "0 0.0000 \n", + "1 0.0000 \n", + "2 0.0000 \n", + "3 0.0000 \n", + "\n", + " resolution_sentence_entity_resolver_origin_sentence \\\n", + "0 0 \n", + "1 0 \n", + "2 0 \n", + "3 0 \n", + "\n", + " resolution_sentence_entity_resolver_resolved_text \\\n", + "0 TESLA \n", + "1 TESLA \n", + "2 TESLA \n", + "3 TESLA \n", + "\n", + " resolution_sentence_entity_resolver_target_text \\\n", + "0 The Tesla company is good to invest is \n", + "1 TSLA is good to invest \n", + "2 TESLA INC. we should buy \n", + "3 PUT ALL MONEY IN TSLA inc!! \n", + "\n", + " resolution_sentence_entity_resolver_token \\\n", + "0 The Tesla company is good to invest is \n", + "1 TSLA is good to invest \n", + "2 TESLA INC. we should buy \n", + "3 PUT ALL MONEY IN TSLA inc!! \n", + "\n", + " sentence_embedding_small_bert_L2_128 \n", + "0 [[0.5044986009597778, 0.7948187589645386, -0.6... \n", + "1 [[-1.1105577945709229, 0.8402332067489624, -1.... \n", + "2 [[-0.6380321979522705, 0.5634128451347351, -0.... \n", + "3 [[-1.7485851049423218, 0.26517942547798157, -0... " + ], "text/html": [ - "
\n", + "\n", + "
\n", + "
\n", "\n", + "\n", + " \n", + "
\n", + "\n", + "\n", + "
\n", + " \n", + "\n", + "\n", + "\n", + " \n", + "
\n", + "
\n", + "
\n" ] }, "metadata": {}, - "execution_count": 2 + "execution_count": 5 } ] }, @@ -255,39 +532,45 @@ "base_uri": "https://localhost:8080/" }, "id": "LYqhWOcWbqgD", - "outputId": "9bcb5e12-82f9-41ca-932f-2e9e0d0acf6a" + "outputId": "174f56aa-d817-4c36-ac13-b7067646837b" }, "source": [ "# We can configurevarious parameters on the Chunk resolver\n", "trainable_pipe.print_info()\n" ], - "execution_count": 4, + "execution_count": 6, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "The following parameters are configurable for this NLU pipeline (You can copy paste the examples) :\n", - ">>> pipe['sentence_resolver'] has settable params:\n", - "pipe['sentence_resolver'].setNormalizedCol('_y') | Info: Column name for the original, normalized description | Currently set to : _y\n", - "pipe['sentence_resolver'].setDistanceFunction('EUCLIDIAN') | Info: What distance function to use for WMD: 'EUCLIDEAN' or 'COSINE' | Currently set to : EUCLIDIAN\n", - "pipe['sentence_resolver'].setNeighbours(25) | Info: Number of neighbours to consider in the KNN query to calculate WMD | Currently set to : 25\n", - "pipe['sentence_resolver'].setThreshold(1000.0) | Info: Threshold value for the last distance calculated | Currently set to : 1000.0\n", - "pipe['sentence_resolver'].setMissAsEmpty(True) | Info: whether or not to return an empty annotation on unmatched chunks | Currently set to : True\n", - "pipe['sentence_resolver'].setReturnCosineDistances(True) | Info: Extract Cosine Distances. TRUE or False | Currently set to : True\n", - "pipe['sentence_resolver'].setCaseSensitive(False) | Info: whether to ignore case in tokens for embeddings matching | Currently set to : False\n", - ">>> pipe['use@tfhub_use'] has settable params:\n", - "pipe['use@tfhub_use'].setDimension(512) | Info: Number of embedding dimensions | Currently set to : 512\n", - "pipe['use@tfhub_use'].setLoadSP(False) | Info: Whether to load SentencePiece ops file which is required only by multi-lingual models. This is not changeable after it's set with a pretrained model nor it is compatible with Windows. | Currently set to : False\n", - "pipe['use@tfhub_use'].setStorageRef('tfhub_use') | Info: unique reference name for identification | Currently set to : tfhub_use\n", - ">>> pipe['deep_sentence_detector@SentenceDetectorDLModel_c83c27f46b97'] has settable params:\n", - "pipe['deep_sentence_detector@SentenceDetectorDLModel_c83c27f46b97'].setExplodeSentences(False) | Info: whether to explode each sentence into a different row, for better parallelization. Defaults to false. | Currently set to : False\n", - "pipe['deep_sentence_detector@SentenceDetectorDLModel_c83c27f46b97'].setStorageRef('SentenceDetectorDLModel_c83c27f46b97') | Info: storage unique identifier | Currently set to : SentenceDetectorDLModel_c83c27f46b97\n", - "pipe['deep_sentence_detector@SentenceDetectorDLModel_c83c27f46b97'].setEncoder(com.johnsnowlabs.nlp.annotators.sentence_detector_dl.SentenceDetectorDLEncoder@31dd891e) | Info: Data encoder | Currently set to : com.johnsnowlabs.nlp.annotators.sentence_detector_dl.SentenceDetectorDLEncoder@31dd891e\n", - "pipe['deep_sentence_detector@SentenceDetectorDLModel_c83c27f46b97'].setImpossiblePenultimates(['Bros', 'No', 'al', 'vs', 'etc', 'Fig', 'Dr', 'Prof', 'PhD', 'MD', 'Co', 'Corp', 'Inc', 'bros', 'VS', 'Vs', 'ETC', 'fig', 'dr', 'prof', 'PHD', 'phd', 'md', 'co', 'corp', 'inc', 'Jan', 'Feb', 'Mar', 'Apr', 'Jul', 'Aug', 'Sep', 'Sept', 'Oct', 'Nov', 'Dec', 'St', 'st', 'AM', 'PM', 'am', 'pm', 'e.g', 'f.e', 'i.e']) | Info: Impossible penultimates | Currently set to : ['Bros', 'No', 'al', 'vs', 'etc', 'Fig', 'Dr', 'Prof', 'PhD', 'MD', 'Co', 'Corp', 'Inc', 'bros', 'VS', 'Vs', 'ETC', 'fig', 'dr', 'prof', 'PHD', 'phd', 'md', 'co', 'corp', 'inc', 'Jan', 'Feb', 'Mar', 'Apr', 'Jul', 'Aug', 'Sep', 'Sept', 'Oct', 'Nov', 'Dec', 'St', 'st', 'AM', 'PM', 'am', 'pm', 'e.g', 'f.e', 'i.e']\n", - "pipe['deep_sentence_detector@SentenceDetectorDLModel_c83c27f46b97'].setModelArchitecture('cnn') | Info: Model architecture (CNN) | Currently set to : cnn\n", - ">>> pipe['document_assembler'] has settable params:\n", - "pipe['document_assembler'].setCleanupMode('shrink') | Info: possible values: disabled, inplace, inplace_full, shrink, shrink_full, each, each_full, delete_full | Currently set to : shrink\n" + ">>> component_list['bert_sentence_embeddings@sent_small_bert_L2_128'] has settable params:\n", + "component_list['bert_sentence_embeddings@sent_small_bert_L2_128'].setBatchSize(8) | Info: Size of every batch | Currently set to : 8\n", + "component_list['bert_sentence_embeddings@sent_small_bert_L2_128'].setEngine('tensorflow') | Info: Deep Learning engine used for this model | Currently set to : tensorflow\n", + "component_list['bert_sentence_embeddings@sent_small_bert_L2_128'].setIsLong(False) | Info: Use Long type instead of Int type for inputs buffer - Some Bert models require Long instead of Int. | Currently set to : False\n", + "component_list['bert_sentence_embeddings@sent_small_bert_L2_128'].setMaxSentenceLength(128) | Info: Max sentence length to process | Currently set to : 128\n", + "component_list['bert_sentence_embeddings@sent_small_bert_L2_128'].setDimension(128) | Info: Number of embedding dimensions | Currently set to : 128\n", + "component_list['bert_sentence_embeddings@sent_small_bert_L2_128'].setCaseSensitive(False) | Info: whether to ignore case in tokens for embeddings matching | Currently set to : False\n", + "component_list['bert_sentence_embeddings@sent_small_bert_L2_128'].setStorageRef('sent_small_bert_L2_128') | Info: unique reference name for identification | Currently set to : sent_small_bert_L2_128\n", + ">>> component_list['document_assembler'] has settable params:\n", + "component_list['document_assembler'].setCleanupMode('shrink') | Info: possible values: disabled, inplace, inplace_full, shrink, shrink_full, each, each_full, delete_full | Currently set to : shrink\n", + ">>> component_list['sentence_entity_resolver@sent_small_bert_L2_128'] has settable params:\n", + "component_list['sentence_entity_resolver@sent_small_bert_L2_128'].setAux_label_col('aux_label') | Info: Auxiliary label which maps resolved entities to additional labels | Currently set to : aux_label\n", + "component_list['sentence_entity_resolver@sent_small_bert_L2_128'].setEnableInMemoryStorage(False) | Info: whether to load whole indexed storage in memory (in-memory lookup) | Currently set to : False\n", + "component_list['sentence_entity_resolver@sent_small_bert_L2_128'].setIncludeStorage(True) | Info: whether to include indexed storage in trained model | Currently set to : True\n", + "component_list['sentence_entity_resolver@sent_small_bert_L2_128'].setReturnAllKEmbeddings(False) | Info: Whether to return all embeddings of all K candidates of the resolution. Embeddings will be in the metadata. Increase in RAM usage to be expected | Currently set to : False\n", + "component_list['sentence_entity_resolver@sent_small_bert_L2_128'].setReturnEuclideanDistances(True) | Info: Whether to Euclidean distances of the k closest candidates for a chunk/token. | Currently set to : True\n", + "component_list['sentence_entity_resolver@sent_small_bert_L2_128'].setDistanceFunction('EUCLIDIAN') | Info: What distance function to use for Word Mover's Distance (WMD). Either 'EUCLIDEAN' or 'COSINE' | Currently set to : EUCLIDIAN\n", + "component_list['sentence_entity_resolver@sent_small_bert_L2_128'].setMissAsEmpty(True) | Info: whether or not to return an empty annotation on unmatched chunks | Currently set to : True\n", + "component_list['sentence_entity_resolver@sent_small_bert_L2_128'].setNeighbours(25) | Info: Number of neighbours to consider in the KNN query to calculate Word Mover's Distance (WMD) | Currently set to : 25\n", + "component_list['sentence_entity_resolver@sent_small_bert_L2_128'].setReturnCosineDistances(True) | Info: Extract Cosine Distances. TRUE or False | Currently set to : True\n", + "component_list['sentence_entity_resolver@sent_small_bert_L2_128'].setThreshold(1000.0) | Info: Threshold value for the last distance calculated | Currently set to : 1000.0\n", + "component_list['sentence_entity_resolver@sent_small_bert_L2_128'].setCaseSensitive(False) | Info: whether to ignore case in tokens for embeddings matching | Currently set to : False\n", + "component_list['sentence_entity_resolver@sent_small_bert_L2_128'].setConfidenceFunction('SOFTMAX') | Info: what function to use to calculate confidence: Either 'INVERSE' or 'SOFTMAX'. | Currently set to : SOFTMAX\n", + "component_list['sentence_entity_resolver@sent_small_bert_L2_128'].setDimension(128) | Info: Number of embedding dimensions | Currently set to : 128\n", + "component_list['sentence_entity_resolver@sent_small_bert_L2_128'].setStorageRef('sent_small_bert_L2_128') | Info: unique reference name for identification | Currently set to : sent_small_bert_L2_128\n", + "component_list['sentence_entity_resolver@sent_small_bert_L2_128'].setUseAuxLabel(False) | Info: Use AuxLabel Col or not | Currently set to : False\n" ] } ] @@ -311,7 +594,7 @@ "!wget -q https://raw.githubusercontent.com/JohnSnowLabs/spark-nlp-workshop/master/tutorials/Certification_Trainings/Healthcare/data/AskAPatient.fold-0.test.txt\n", "!wget -q https://raw.githubusercontent.com/JohnSnowLabs/spark-nlp-workshop/master/tutorials/Certification_Trainings/Healthcare/data/AskAPatient.fold-0.train.txt" ], - "execution_count": 5, + "execution_count": 7, "outputs": [] }, { @@ -319,10 +602,10 @@ "metadata": { "colab": { "base_uri": "https://localhost:8080/", - "height": 414 + "height": 424 }, "id": "Fo30y4S6bRgz", - "outputId": "87fcb8a9-5f3f-4d6c-c448-e0e3de661516" + "outputId": "f335847d-973d-4081-877b-958d5c91b330" }, "source": [ "import pandas as pd\n", @@ -338,8 +621,26 @@ { "output_type": "execute_result", "data": { + "text/plain": [ + " y _y text\n", + "0 108367008 Dislocation of joint Dislocation of joint\n", + "1 3384011000036100 Arthrotec Arthrotec\n", + "2 166717003 Serum creatinine raised Serum creatinine raised\n", + "3 3877011000036101 Lipitor Lipitor\n", + "4 402234004 Foot eczema Foot eczema\n", + ".. ... ... ...\n", + "245 162290004 Dry eyes Dry eyes\n", + "246 419723007 Mentally dull Mentally dull\n", + "247 4216011000036104 Norvasc Norvasc\n", + "248 13791008 Asthenia Asthenia\n", + "249 162059005 Upset stomach Upset stomach\n", + "\n", + "[250 rows x 3 columns]" + ], "text/html": [ - "
\n", + "\n", + "
\n", + "
\n", "\n", + "\n", + " \n", + "
\n", + "\n", + "\n", + "
\n", + " \n", + "\n", + "\n", + "\n", + " \n", + "
\n", + "
\n", + "
\n" ] }, "metadata": {}, @@ -462,37 +955,241 @@ "id": "5ngBy_2CbwIY", "colab": { "base_uri": "https://localhost:8080/", - "height": 704 + "height": 808 }, - "outputId": "b178136e-cf46-46d9-a63d-dceb54a94d45" + "outputId": "50f25786-0dc4-448e-c5f5-d1cd417acd6b" }, "source": [ "# Healthcare Embeddings\n", - "trainable_pipe = nlu.load('en.embed_sentence.bert.jsl_tiny_umls_uncased train.resolve_sentence')\n", - "trainable_pipe['sentence_resolver'].setNeighbours(4) \n", + "trainable_pipe = nlp.load('en.embed_sentence.bert.jsl_tiny_umls_uncased train.resolve_sentence')\n", + "trainable_pipe['trainable_sentence_entity_resolver'].setNeighbours(4)\n", "fitted_pipe = trainable_pipe.fit(aap_tr)\n", "prediction = fitted_pipe.predict(aap_tr)\n", "prediction" ], - "execution_count": 11, + "execution_count": 12, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ + "Warning::Spark Session already created, some configs may not take.\n", + "Warning::Spark Session already created, some configs may not take.\n", "sbert_jsl_tiny_umls_uncased download started this may take some time.\n", "Approximate size to download 15.8 MB\n", "[OK!]\n", + "setInputCols in SentenceEntityResolverApproach_2520cda31704 expecting 1 columns. Provided column amount: 2. Which should be columns from the following annotators: ['sentence_embeddings']\n", "sentence_detector_dl download started this may take some time.\n", "Approximate size to download 354.6 KB\n", - "[OK!]\n" + "[OK!]\n", + "Warning::Spark Session already created, some configs may not take.\n" ] }, { "output_type": "execute_result", "data": { + "text/plain": [ + " _y document \\\n", + "0 Dislocation of joint Dislocation of joint \n", + "1 Arthrotec Arthrotec \n", + "2 Serum creatinine raised Serum creatinine raised \n", + "3 Lipitor Lipitor \n", + "4 Foot eczema Foot eczema \n", + ".. ... ... \n", + "245 Dry eyes Dry eyes \n", + "246 Mentally dull Mentally dull \n", + "247 Norvasc Norvasc \n", + "248 Asthenia Asthenia \n", + "249 Upset stomach Upset stomach \n", + "\n", + " resolution_sentence_entity_resolver_code \\\n", + "0 108367008 \n", + "1 3384011000036100 \n", + "2 166717003 \n", + "3 3877011000036101 \n", + "4 402234004 \n", + ".. ... \n", + "245 162290004 \n", + "246 419723007 \n", + "247 4216011000036104 \n", + "248 13791008 \n", + "249 162059005 \n", + "\n", + " resolution_sentence_entity_resolver_confidence \\\n", + "0 0.9992 \n", + "1 0.9921 \n", + "2 0.9975 \n", + "3 1.0000 \n", + "4 0.9942 \n", + ".. ... \n", + "245 0.9981 \n", + "246 1.0000 \n", + "247 0.9864 \n", + "248 1.0000 \n", + "249 0.9960 \n", + "\n", + " resolution_sentence_entity_resolver_distance \\\n", + "0 0.0000 \n", + "1 0.0000 \n", + "2 0.0000 \n", + "3 0.0000 \n", + "4 0.0000 \n", + ".. ... \n", + "245 0.0000 \n", + "246 0.0000 \n", + "247 0.0000 \n", + "248 0.0000 \n", + "249 0.0000 \n", + "\n", + " resolution_sentence_entity_resolver_k_codes \\\n", + "0 [[108367008, 21288011000036105, 404640003]] \n", + "1 [[3384011000036100, 57676002]] \n", + "2 [[166717003, 39575007, 13644009, 124055002]] \n", + "3 NaN \n", + "4 [[402234004, 21930011000036101, 41710110000361... \n", + ".. ... \n", + "245 [[162290004, 238810007, 404640003]] \n", + "246 NaN \n", + "247 [[4216011000036104, 2929011000036108, 367391008]] \n", + "248 NaN \n", + "249 [[162059005, 271681002, 25064002]] \n", + "\n", + " resolution_sentence_entity_resolver_k_confidences \\\n", + "0 [[0.9992, 0.0005, 0.0004]] \n", + "1 [[0.9921, 0.0079]] \n", + "2 [[0.9975, 0.0011, 0.0009, 0.0005]] \n", + "3 NaN \n", + "4 [[0.9942, 0.0025, 0.0020, 0.0013]] \n", + ".. ... \n", + "245 [[0.9981, 0.0013, 0.0006]] \n", + "246 NaN \n", + "247 [[0.9864, 0.0080, 0.0056]] \n", + "248 NaN \n", + "249 [[0.9960, 0.0030, 0.0010]] \n", + "\n", + " resolution_sentence_entity_resolver_k_cos_distances \\\n", + "0 [[0.0000, 0.2300, 0.2344]] \n", + "1 [[0.0000, 0.0922]] \n", + "2 [[0.0000, 0.1798, 0.2049, 0.2325]] \n", + "3 NaN \n", + "4 [[0.0000, 0.1463, 0.1500, 0.1788]] \n", + ".. ... \n", + "245 [[0.0000, 0.1612, 0.2016]] \n", + "246 NaN \n", + "247 [[0.0000, 0.0863, 0.1000]] \n", + "248 NaN \n", + "249 [[0.0000, 0.1238, 0.1752]] \n", + "\n", + " resolution_sentence_entity_resolver_k_distances \\\n", + "0 [[0.0000, 7.7017, 7.9164]] \n", + "1 [[0.0000, 4.8368]] \n", + "2 [[0.0000, 6.7997, 7.0506, 7.5232]] \n", + "3 NaN \n", + "4 [[0.0000, 6.0054, 6.1894, 6.6619]] \n", + ".. ... \n", + "245 [[0.0000, 6.6192, 7.4328]] \n", + "246 NaN \n", + "247 [[0.0000, 4.8183, 5.1746]] \n", + "248 NaN \n", + "249 [[0.0000, 5.8050, 6.9000]] \n", + "\n", + " resolution_sentence_entity_resolver_k_resolution \\\n", + "0 [[Dislocation of joint, diclofenac, Dizziness]] \n", + "1 [[Arthrotec, Arthralgia]] \n", + "2 [[Serum creatinine raised, Urine looks dark, H... \n", + "3 NaN \n", + "4 [[Foot eczema, ezetimibe, Celebrex, Arthralgia]] \n", + ".. ... \n", + "245 [[Dry eyes, Flushing, Dizziness]] \n", + "246 NaN \n", + "247 [[Norvasc, Nexium, Malaise]] \n", + "248 NaN \n", + "249 [[Upset stomach, Stomach ache, Headache]] \n", + "\n", + " resolution_sentence_entity_resolver_origin_sentence \\\n", + "0 0 \n", + "1 0 \n", + "2 0 \n", + "3 0 \n", + "4 0 \n", + ".. ... \n", + "245 0 \n", + "246 0 \n", + "247 0 \n", + "248 0 \n", + "249 0 \n", + "\n", + " resolution_sentence_entity_resolver_resolved_text \\\n", + "0 Dislocation of joint \n", + "1 Arthrotec \n", + "2 Serum creatinine raised \n", + "3 Lipitor \n", + "4 Foot eczema \n", + ".. ... \n", + "245 Dry eyes \n", + "246 Mentally dull \n", + "247 Norvasc \n", + "248 Asthenia \n", + "249 Upset stomach \n", + "\n", + " resolution_sentence_entity_resolver_target_text \\\n", + "0 Dislocation of joint \n", + "1 Arthrotec \n", + "2 Serum creatinine raised \n", + "3 Lipitor \n", + "4 Foot eczema \n", + ".. ... \n", + "245 Dry eyes \n", + "246 Mentally dull \n", + "247 Norvasc \n", + "248 Asthenia \n", + "249 Upset stomach \n", + "\n", + " resolution_sentence_entity_resolver_token \\\n", + "0 Dislocation of joint \n", + "1 Arthrotec \n", + "2 Serum creatinine raised \n", + "3 Lipitor \n", + "4 Foot eczema \n", + ".. ... \n", + "245 Dry eyes \n", + "246 Mentally dull \n", + "247 Norvasc \n", + "248 Asthenia \n", + "249 Upset stomach \n", + "\n", + " sentence_embedding_bert \\\n", + "0 [[-0.9687817692756653, -0.31864216923713684, -... \n", + "1 [[-0.7108752131462097, -0.5266207456588745, -0... \n", + "2 [[-0.5410001277923584, -2.0953280925750732, 0.... \n", + "3 [[-0.45240962505340576, -1.394622564315796, -0... \n", + "4 [[-0.763110876083374, -0.40250054001808167, -0... \n", + ".. ... \n", + "245 [[-0.03702589124441147, -1.3459508419036865, -... \n", + "246 [[-0.9327226281166077, -1.3695887327194214, -0... \n", + "247 [[-0.4530910551548004, -1.576862096786499, -0.... \n", + "248 [[-0.5592130422592163, -1.6610543727874756, -0... \n", + "249 [[-2.242663860321045, -0.9422457814216614, 0.0... \n", + "\n", + " text y \n", + "0 Dislocation of joint 108367008 \n", + "1 Arthrotec 3384011000036100 \n", + "2 Serum creatinine raised 166717003 \n", + "3 Lipitor 3877011000036101 \n", + "4 Foot eczema 402234004 \n", + ".. ... ... \n", + "245 Dry eyes 162290004 \n", + "246 Mentally dull 419723007 \n", + "247 Norvasc 4216011000036104 \n", + "248 Asthenia 13791008 \n", + "249 Upset stomach 162059005 \n", + "\n", + "[250 rows x 17 columns]" + ], "text/html": [ - "
\n", + "\n", + "
\n", + "
\n", "\n", + "\n", + " \n", + "
\n", + "\n", + "\n", + "
\n", + " \n", + "\n", + "\n", + "\n", + " \n", + "
\n", + "
\n", + "
\n" ] }, "metadata": {}, - "execution_count": 11 + "execution_count": 12 } ] }, { "cell_type": "code", + "source": [], "metadata": { - "id": "yZT2id3Mxu_Q" + "id": "Yg52noo6PIYV" }, - "source": [ - "" - ], "execution_count": null, "outputs": [] } diff --git a/examples/colab/Training/named_entity_recognition/NLU_training_NER_demo.ipynb b/examples/colab/Training/named_entity_recognition/NLU_training_NER_demo.ipynb index 568a5a74..654405df 100644 --- a/examples/colab/Training/named_entity_recognition/NLU_training_NER_demo.ipynb +++ b/examples/colab/Training/named_entity_recognition/NLU_training_NER_demo.ipynb @@ -1 +1,2348 @@ -{"nbformat":4,"nbformat_minor":0,"metadata":{"colab":{"name":"NLU_training_NER_demo.ipynb","provenance":[],"collapsed_sections":[]},"kernelspec":{"name":"python3","display_name":"Python 3"}},"cells":[{"cell_type":"markdown","metadata":{"id":"zkufh760uvF3"},"source":["![JohnSnowLabs](https://nlp.johnsnowlabs.com/assets/images/logo.png)\n","\n","[![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/JohnSnowLabs/nlu/blob/master/examples/colab/Training/named_entity_recognition/NLU_training_NER_demo.ipynb)\n","\n","\n","\n","# Training a Named Entity Recognition (NER) model with NLU \n","With the [NER_DL model](https://nlp.johnsnowlabs.com/docs/en/annotators#ner-dl-named-entity-recognition-deep-learning-annotator) from Spark NLP you can achieve State Of the Art results on any NER problem \n","\n","This notebook showcases the following features : \n","\n","- How to train the deep learning classifier\n","- How to store a pipeline to disk\n","- How to load the pipeline from disk (Enables NLU offline mode)\n","\n"]},{"cell_type":"markdown","metadata":{"id":"dur2drhW5Rvi"},"source":["# 1. Install Java 8 and NLU"]},{"cell_type":"code","metadata":{"id":"hFGnBCHavltY","colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"status":"ok","timestamp":1620191530267,"user_tz":-300,"elapsed":115129,"user":{"displayName":"ahmed lone","photoUrl":"","userId":"02458088882398909889"}},"outputId":"23d94588-aeb0-4b83-fc5c-9345a0274e99"},"source":["!wget https://setup.johnsnowlabs.com/nlu/colab.sh -O - | bash\n"," \n","\n","import nlu"],"execution_count":null,"outputs":[{"output_type":"stream","text":["--2021-05-05 05:10:15-- https://raw.githubusercontent.com/JohnSnowLabs/nlu/master/scripts/colab_setup.sh\n","Resolving raw.githubusercontent.com (raw.githubusercontent.com)... 185.199.110.133, 185.199.109.133, 185.199.111.133, ...\n","Connecting to raw.githubusercontent.com (raw.githubusercontent.com)|185.199.110.133|:443... connected.\n","HTTP request sent, awaiting response... 200 OK\n","Length: 1671 (1.6K) [text/plain]\n","Saving to: ‘STDOUT’\n","\n","\r- 0%[ ] 0 --.-KB/s Installing NLU 3.0.0 with PySpark 3.0.2 and Spark NLP 3.0.1 for Google Colab ...\n","\r- 100%[===================>] 1.63K --.-KB/s in 0.001s \n","\n","2021-05-05 05:10:16 (1.54 MB/s) - written to stdout [1671/1671]\n","\n","\u001b[K |████████████████████████████████| 204.8MB 72kB/s \n","\u001b[K |████████████████████████████████| 153kB 52.9MB/s \n","\u001b[K |████████████████████████████████| 204kB 22.3MB/s \n","\u001b[K |████████████████████████████████| 204kB 46.2MB/s \n","\u001b[?25h Building wheel for pyspark (setup.py) ... \u001b[?25l\u001b[?25hdone\n"],"name":"stdout"}]},{"cell_type":"markdown","metadata":{"id":"f4KkTfnR5Ugg"},"source":["# 2. Download conll2003 dataset"]},{"cell_type":"code","metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"OrVb5ZMvvrQD","executionInfo":{"status":"ok","timestamp":1620191531629,"user_tz":-300,"elapsed":116460,"user":{"displayName":"ahmed lone","photoUrl":"","userId":"02458088882398909889"}},"outputId":"ba3d6f05-3c79-4939-f31e-437137762cd3"},"source":["! wget https://github.com/patverga/torch-ner-nlp-from-scratch/raw/master/data/conll2003/eng.train"],"execution_count":null,"outputs":[{"output_type":"stream","text":["--2021-05-05 05:12:10-- https://github.com/patverga/torch-ner-nlp-from-scratch/raw/master/data/conll2003/eng.train\n","Resolving github.com (github.com)... 140.82.114.3\n","Connecting to github.com (github.com)|140.82.114.3|:443... connected.\n","HTTP request sent, awaiting response... 302 Found\n","Location: https://raw.githubusercontent.com/patverga/torch-ner-nlp-from-scratch/master/data/conll2003/eng.train [following]\n","--2021-05-05 05:12:10-- https://raw.githubusercontent.com/patverga/torch-ner-nlp-from-scratch/master/data/conll2003/eng.train\n","Resolving raw.githubusercontent.com (raw.githubusercontent.com)... 185.199.108.133, 185.199.109.133, 185.199.110.133, ...\n","Connecting to raw.githubusercontent.com (raw.githubusercontent.com)|185.199.108.133|:443... connected.\n","HTTP request sent, awaiting response... 200 OK\n","Length: 3283420 (3.1M) [text/plain]\n","Saving to: ‘eng.train’\n","\n","eng.train 100%[===================>] 3.13M --.-KB/s in 0.09s \n","\n","2021-05-05 05:12:11 (36.4 MB/s) - ‘eng.train’ saved [3283420/3283420]\n","\n"],"name":"stdout"}]},{"cell_type":"markdown","metadata":{"id":"0296Om2C5anY"},"source":["# 3. Train Deep Learning Classifier using nlu.load('train.ner')\n","\n","You dataset label column should be named 'y' and the feature column with text data should be named 'text'"]},{"cell_type":"code","metadata":{"colab":{"base_uri":"https://localhost:8080/","height":199},"id":"3ZIPkRkWftBG","executionInfo":{"status":"ok","timestamp":1620192283869,"user_tz":-300,"elapsed":868676,"user":{"displayName":"ahmed lone","photoUrl":"","userId":"02458088882398909889"}},"outputId":"a62cbe12-b235-482a-87e9-98d5f5de5444"},"source":["import nlu\n","# load a trainable pipeline by specifying the train. prefix and fit it on a datset with label and text columns\n","# Since there are no\n","train_path = '/content/eng.train'\n","trainable_pipe = nlu.load('train.ner')\n","fitted_pipe = trainable_pipe.fit(dataset_path=train_path)\n","\n","# predict with the trainable pipeline on dataset and get predictions\n","preds = fitted_pipe.predict('Donald Trump and Angela Merkel dont share many oppinions')\n","preds"],"execution_count":null,"outputs":[{"output_type":"stream","text":["sentence_detector_dl download started this may take some time.\n","Approximate size to download 354.6 KB\n","[OK!]\n","glove_100d download started this may take some time.\n","Approximate size to download 145.3 MB\n","[OK!]\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","
sentenceword_embedding_glovedocumententities_classentitiestokenorigin_index
0[Donald Trump and Angela Merkel dont share man...[[-0.5496799945831299, -0.488319993019104, 0.5...Donald Trump and Angela Merkel dont share many...[PER, PER][Donald Trump, Angela Merkel][Donald, Trump, and, Angela, Merkel, dont, sha...0
\n","
"],"text/plain":[" sentence ... origin_index\n","0 [Donald Trump and Angela Merkel dont share man... ... 0\n","\n","[1 rows x 7 columns]"]},"metadata":{"tags":[]},"execution_count":3}]},{"cell_type":"code","metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"owFhjKqzQiv5","executionInfo":{"status":"ok","timestamp":1620192283871,"user_tz":-300,"elapsed":868665,"user":{"displayName":"ahmed lone","photoUrl":"","userId":"02458088882398909889"}},"outputId":"327dc82a-49c2-4362-c982-31e8208ca9f4"},"source":["# Check out the Parameters of the NER model we can configure\n","trainable_pipe.print_info()"],"execution_count":null,"outputs":[{"output_type":"stream","text":["The following parameters are configurable for this NLU pipeline (You can copy paste the examples) :\n",">>> pipe['named_entity_recognizer_dl'] has settable params:\n","pipe['named_entity_recognizer_dl'].setMinEpochs(0) | Info: Minimum number of epochs to train | Currently set to : 0\n","pipe['named_entity_recognizer_dl'].setMaxEpochs(2) | Info: Maximum number of epochs to train | Currently set to : 2\n","pipe['named_entity_recognizer_dl'].setLr(0.001) | Info: Learning Rate | Currently set to : 0.001\n","pipe['named_entity_recognizer_dl'].setPo(0.005) | Info: Learning rate decay coefficient. Real Learning Rage = lr / (1 + po * epoch) | Currently set to : 0.005\n","pipe['named_entity_recognizer_dl'].setBatchSize(8) | Info: Batch size | Currently set to : 8\n","pipe['named_entity_recognizer_dl'].setDropout(0.5) | Info: Dropout coefficient | Currently set to : 0.5\n","pipe['named_entity_recognizer_dl'].setVerbose(0) | Info: Level of verbosity during training | Currently set to : 0\n","pipe['named_entity_recognizer_dl'].setUseContrib(True) | Info: whether to use contrib LSTM Cells. Not compatible with Windows. Might slightly improve accuracy. | Currently set to : True\n","pipe['named_entity_recognizer_dl'].setValidationSplit(0.0) | Info: Choose the proportion of training dataset to be validated against the model on each Epoch. The value should be between 0.0 and 1.0 and by default it is 0.0 and off. | Currently set to : 0.0\n","pipe['named_entity_recognizer_dl'].setEvaluationLogExtended(False) | Info: Choose the proportion of training dataset to be validated against the model on each Epoch. The value should be between 0.0 and 1.0 and by default it is 0.0 and off. | Currently set to : False\n","pipe['named_entity_recognizer_dl'].setIncludeConfidence(True) | Info: whether to include confidence scores in annotation metadata | Currently set to : True\n","pipe['named_entity_recognizer_dl'].setEnableOutputLogs(False) | Info: Whether to use stdout in addition to Spark logs. | Currently set to : False\n","pipe['named_entity_recognizer_dl'].setEnableMemoryOptimizer(False) | Info: Whether to optimize for large datasets or not. Enabling this option can slow down training. | Currently set to : False\n",">>> pipe['deep_sentence_detector@SentenceDetectorDLModel_c83c27f46b97'] has settable params:\n","pipe['deep_sentence_detector@SentenceDetectorDLModel_c83c27f46b97'].setExplodeSentences(False) | Info: whether to explode each sentence into a different row, for better parallelization. Defaults to false. | Currently set to : False\n","pipe['deep_sentence_detector@SentenceDetectorDLModel_c83c27f46b97'].setStorageRef('SentenceDetectorDLModel_c83c27f46b97') | Info: storage unique identifier | Currently set to : SentenceDetectorDLModel_c83c27f46b97\n","pipe['deep_sentence_detector@SentenceDetectorDLModel_c83c27f46b97'].setEncoder(com.johnsnowlabs.nlp.annotators.sentence_detector_dl.SentenceDetectorDLEncoder@4b329158) | Info: Data encoder | Currently set to : com.johnsnowlabs.nlp.annotators.sentence_detector_dl.SentenceDetectorDLEncoder@4b329158\n","pipe['deep_sentence_detector@SentenceDetectorDLModel_c83c27f46b97'].setImpossiblePenultimates(['Bros', 'No', 'al', 'vs', 'etc', 'Fig', 'Dr', 'Prof', 'PhD', 'MD', 'Co', 'Corp', 'Inc', 'bros', 'VS', 'Vs', 'ETC', 'fig', 'dr', 'prof', 'PHD', 'phd', 'md', 'co', 'corp', 'inc', 'Jan', 'Feb', 'Mar', 'Apr', 'Jul', 'Aug', 'Sep', 'Sept', 'Oct', 'Nov', 'Dec', 'St', 'st', 'AM', 'PM', 'am', 'pm', 'e.g', 'f.e', 'i.e']) | Info: Impossible penultimates | Currently set to : ['Bros', 'No', 'al', 'vs', 'etc', 'Fig', 'Dr', 'Prof', 'PhD', 'MD', 'Co', 'Corp', 'Inc', 'bros', 'VS', 'Vs', 'ETC', 'fig', 'dr', 'prof', 'PHD', 'phd', 'md', 'co', 'corp', 'inc', 'Jan', 'Feb', 'Mar', 'Apr', 'Jul', 'Aug', 'Sep', 'Sept', 'Oct', 'Nov', 'Dec', 'St', 'st', 'AM', 'PM', 'am', 'pm', 'e.g', 'f.e', 'i.e']\n","pipe['deep_sentence_detector@SentenceDetectorDLModel_c83c27f46b97'].setModelArchitecture('cnn') | Info: Model architecture (CNN) | Currently set to : cnn\n",">>> pipe['glove@glove_100d'] has settable params:\n","pipe['glove@glove_100d'].setIncludeStorage(True) | Info: whether to include indexed storage in trained model | Currently set to : True\n","pipe['glove@glove_100d'].setCaseSensitive(False) | Info: whether to ignore case in tokens for embeddings matching | Currently set to : False\n","pipe['glove@glove_100d'].setDimension(100) | Info: Number of embedding dimensions | Currently set to : 100\n","pipe['glove@glove_100d'].setStorageRef('glove_100d') | Info: unique reference name for identification | Currently set to : glove_100d\n",">>> pipe['default_tokenizer'] has settable params:\n","pipe['default_tokenizer'].setTargetPattern('\\S+') | Info: pattern to grab from text as token candidates. Defaults \\S+ | Currently set to : \\S+\n","pipe['default_tokenizer'].setContextChars(['.', ',', ';', ':', '!', '?', '*', '-', '(', ')', '\"', \"'\"]) | Info: character list used to separate from token boundaries | Currently set to : ['.', ',', ';', ':', '!', '?', '*', '-', '(', ')', '\"', \"'\"]\n","pipe['default_tokenizer'].setCaseSensitiveExceptions(True) | Info: Whether to care for case sensitiveness in exceptions | Currently set to : True\n","pipe['default_tokenizer'].setMinLength(0) | Info: Set the minimum allowed legth for each token | Currently set to : 0\n","pipe['default_tokenizer'].setMaxLength(99999) | Info: Set the maximum allowed legth for each token | Currently set to : 99999\n",">>> pipe['document_assembler'] has settable params:\n","pipe['document_assembler'].setCleanupMode('shrink') | Info: possible values: disabled, inplace, inplace_full, shrink, shrink_full, each, each_full, delete_full | Currently set to : shrink\n",">>> pipe['chunk_converter@entities'] has settable params:\n"],"name":"stdout"}]},{"cell_type":"markdown","metadata":{"id":"25RTuUXMFyEA"},"source":["# 4. Lets use BERT embeddings instead of the default Glove_100d ones!"]},{"cell_type":"code","metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"QMxPpeiDGNVi","executionInfo":{"status":"ok","timestamp":1620192283872,"user_tz":-300,"elapsed":868623,"user":{"displayName":"ahmed lone","photoUrl":"","userId":"02458088882398909889"}},"outputId":"3e37419d-f473-4282-9a72-5fd03a5153c2"},"source":["# We can use nlu.print_components(action='embed') to see every possibler sentence embedding we could use. Lets use bert!\n","nlu.print_components(action='embed')"],"execution_count":null,"outputs":[{"output_type":"stream","text":["For language NLU provides the following Models : \n","nlu.load('en.embed') returns Spark NLP model glove_100d\n","nlu.load('en.embed.glove') returns Spark NLP model glove_100d\n","nlu.load('en.embed.glove.100d') returns Spark NLP model glove_100d\n","nlu.load('en.embed.bert') returns Spark NLP model bert_base_uncased\n","nlu.load('en.embed.bert.base_uncased') returns Spark NLP model bert_base_uncased\n","nlu.load('en.embed.bert.base_cased') returns Spark NLP model bert_base_cased\n","nlu.load('en.embed.bert.large_uncased') returns Spark NLP model bert_large_uncased\n","nlu.load('en.embed.bert.large_cased') returns Spark NLP model bert_large_cased\n","nlu.load('en.embed.biobert') returns Spark NLP model biobert_pubmed_base_cased\n","nlu.load('en.embed.biobert.pubmed_base_cased') returns Spark NLP model biobert_pubmed_base_cased\n","nlu.load('en.embed.biobert.pubmed_large_cased') returns Spark NLP model biobert_pubmed_large_cased\n","nlu.load('en.embed.biobert.pmc_base_cased') returns Spark NLP model biobert_pmc_base_cased\n","nlu.load('en.embed.biobert.pubmed_pmc_base_cased') returns Spark NLP model biobert_pubmed_pmc_base_cased\n","nlu.load('en.embed.biobert.clinical_base_cased') returns Spark NLP model biobert_clinical_base_cased\n","nlu.load('en.embed.biobert.discharge_base_cased') returns Spark NLP model biobert_discharge_base_cased\n","nlu.load('en.embed.elmo') returns Spark NLP model elmo\n","nlu.load('en.embed.use') returns Spark NLP model tfhub_use\n","nlu.load('en.embed.albert') returns Spark NLP model albert_base_uncased\n","nlu.load('en.embed.albert.base_uncased') returns Spark NLP model albert_base_uncased\n","nlu.load('en.embed.albert.large_uncased') returns Spark NLP model albert_large_uncased\n","nlu.load('en.embed.albert.xlarge_uncased') returns Spark NLP model albert_xlarge_uncased\n","nlu.load('en.embed.albert.xxlarge_uncased') returns Spark NLP model albert_xxlarge_uncased\n","nlu.load('en.embed.xlnet') returns Spark NLP model xlnet_base_cased\n","nlu.load('en.embed.xlnet_base_cased') returns Spark NLP model xlnet_base_cased\n","nlu.load('en.embed.xlnet_large_cased') returns Spark NLP model xlnet_large_cased\n","nlu.load('en.embed.electra') returns Spark NLP model electra_small_uncased\n","nlu.load('en.embed.electra.small_uncased') returns Spark NLP model electra_small_uncased\n","nlu.load('en.embed.electra.base_uncased') returns Spark NLP model electra_base_uncased\n","nlu.load('en.embed.electra.large_uncased') returns Spark NLP model electra_large_uncased\n","nlu.load('en.embed.covidbert') returns Spark NLP model covidbert_large_uncased\n","nlu.load('en.embed.covidbert.large_uncased') returns Spark NLP model covidbert_large_uncased\n","nlu.load('en.embed.bert.small_L2_128') returns Spark NLP model small_bert_L2_128\n","nlu.load('en.embed.bert.small_L4_128') returns Spark NLP model small_bert_L4_128\n","nlu.load('en.embed.bert.small_L6_128') returns Spark NLP model small_bert_L6_128\n","nlu.load('en.embed.bert.small_L8_128') returns Spark NLP model small_bert_L8_128\n","nlu.load('en.embed.bert.small_L10_128') returns Spark NLP model small_bert_L10_128\n","nlu.load('en.embed.bert.small_L12_128') returns Spark NLP model small_bert_L12_128\n","nlu.load('en.embed.bert.small_L2_256') returns Spark NLP model small_bert_L2_256\n","nlu.load('en.embed.bert.small_L4_256') returns Spark NLP model small_bert_L4_256\n","nlu.load('en.embed.bert.small_L6_256') returns Spark NLP model small_bert_L6_256\n","nlu.load('en.embed.bert.small_L8_256') returns Spark NLP model small_bert_L8_256\n","nlu.load('en.embed.bert.small_L10_256') returns Spark NLP model small_bert_L10_256\n","nlu.load('en.embed.bert.small_L12_256') returns Spark NLP model small_bert_L12_256\n","nlu.load('en.embed.bert.small_L2_512') returns Spark NLP model small_bert_L2_512\n","nlu.load('en.embed.bert.small_L4_512') returns Spark NLP model small_bert_L4_512\n","nlu.load('en.embed.bert.small_L6_512') returns Spark NLP model small_bert_L6_512\n","nlu.load('en.embed.bert.small_L8_512') returns Spark NLP model small_bert_L8_512\n","nlu.load('en.embed.bert.small_L10_512') returns Spark NLP model small_bert_L10_512\n","nlu.load('en.embed.bert.small_L12_512') returns Spark NLP model small_bert_L12_512\n","nlu.load('en.embed.bert.small_L2_768') returns Spark NLP model small_bert_L2_768\n","nlu.load('en.embed.bert.small_L4_768') returns Spark NLP model small_bert_L4_768\n","nlu.load('en.embed.bert.small_L6_768') returns Spark NLP model small_bert_L6_768\n","nlu.load('en.embed.bert.small_L8_768') returns Spark NLP model small_bert_L8_768\n","nlu.load('en.embed.bert.small_L10_768') returns Spark NLP model small_bert_L10_768\n","nlu.load('en.embed.bert.small_L12_768') returns Spark NLP model small_bert_L12_768\n","For language NLU provides the following Models : \n","nlu.load('ar.embed') returns Spark NLP model arabic_w2v_cc_300d\n","nlu.load('ar.embed.cbow') returns Spark NLP model arabic_w2v_cc_300d\n","nlu.load('ar.embed.cbow.300d') returns Spark NLP model arabic_w2v_cc_300d\n","nlu.load('ar.embed.aner') returns Spark NLP model arabic_w2v_cc_300d\n","nlu.load('ar.embed.aner.300d') returns Spark NLP model arabic_w2v_cc_300d\n","nlu.load('ar.embed.glove') returns Spark NLP model arabic_w2v_cc_300d\n","For language NLU provides the following Models : \n","nlu.load('bn.embed.glove') returns Spark NLP model bengaliner_cc_300d\n","nlu.load('bn.embed') returns Spark NLP model bengaliner_cc_300d\n","For language NLU provides the following Models : \n","nlu.load('fi.embed.bert.') returns Spark NLP model bert_finnish_cased\n","nlu.load('fi.embed.bert.cased.') returns Spark NLP model bert_finnish_cased\n","nlu.load('fi.embed.bert.uncased.') returns Spark NLP model bert_finnish_uncased\n","For language NLU provides the following Models : \n","nlu.load('he.embed') returns Spark NLP model hebrew_cc_300d\n","nlu.load('he.embed.glove') returns Spark NLP model hebrew_cc_300d\n","nlu.load('he.embed.cbow_300d') returns Spark NLP model hebrew_cc_300d\n","For language NLU provides the following Models : \n","nlu.load('hi.embed') returns Spark NLP model hindi_cc_300d\n","For language NLU provides the following Models : \n","nlu.load('fa.embed') returns Spark NLP model persian_w2v_cc_300d\n","nlu.load('fa.embed.word2vec') returns Spark NLP model persian_w2v_cc_300d\n","nlu.load('fa.embed.word2vec.300d') returns Spark NLP model persian_w2v_cc_300d\n","For language NLU provides the following Models : \n","nlu.load('zh.embed') returns Spark NLP model bert_base_chinese\n","nlu.load('zh.embed.bert') returns Spark NLP model bert_base_chinese\n","For language NLU provides the following Models : \n","nlu.load('ur.embed') returns Spark NLP model urduvec_140M_300d\n","nlu.load('ur.embed.glove.300d') returns Spark NLP model urduvec_140M_300d\n","nlu.load('ur.embed.urdu_vec_140M_300d') returns Spark NLP model urduvec_140M_300d\n","For language NLU provides the following Models : \n","nlu.load('xx.embed') returns Spark NLP model glove_840B_300\n","nlu.load('xx.embed.glove.840B_300') returns Spark NLP model glove_840B_300\n","nlu.load('xx.embed.glove.6B_300') returns Spark NLP model glove_6B_300\n","nlu.load('xx.embed.bert_multi_cased') returns Spark NLP model bert_multi_cased\n","nlu.load('xx.embed.bert') returns Spark NLP model bert_multi_cased\n"],"name":"stdout"}]},{"cell_type":"code","metadata":{"colab":{"base_uri":"https://localhost:8080/","height":199},"id":"Xz7xnvbCFxE3","executionInfo":{"status":"ok","timestamp":1620193033467,"user_tz":-300,"elapsed":1617963,"user":{"displayName":"ahmed lone","photoUrl":"","userId":"02458088882398909889"}},"outputId":"9b215cae-fab0-4333-dc4b-224fb80f29e4"},"source":["# Add bert word embeddings to pipe \n","fitted_pipe = nlu.load('bert train.ner').fit(dataset_path=train_path)\n","\n","# predict with the trainable pipeline on dataset and get predictions\n","preds = fitted_pipe.predict('Donald Trump and Angela Merkel dont share many oppinions')\n","preds"],"execution_count":null,"outputs":[{"output_type":"stream","text":["small_bert_L2_128 download started this may take some time.\n","Approximate size to download 16.1 MB\n","[OK!]\n","sentence_detector_dl download started this may take some time.\n","Approximate size to download 354.6 KB\n","[OK!]\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","
sentencedocumentword_embedding_bertentities_classentitiestokenorigin_index
0[Donald Trump and Angela Merkel dont share man...Donald Trump and Angela Merkel dont share many...[[-0.447601318359375, 1.0348621606826782, 0.51...[PER, PER][Donald Trump, Angela Merkel dont][Donald, Trump, and, Angela, Merkel, dont, sha...0
\n","
"],"text/plain":[" sentence ... origin_index\n","0 [Donald Trump and Angela Merkel dont share man... ... 0\n","\n","[1 rows x 7 columns]"]},"metadata":{"tags":[]},"execution_count":6}]},{"cell_type":"markdown","metadata":{"id":"2BB-NwZUoHSe"},"source":["# 5. Lets save the model"]},{"cell_type":"code","metadata":{"id":"eLex095goHwm","colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"status":"ok","timestamp":1620193052249,"user_tz":-300,"elapsed":1636720,"user":{"displayName":"ahmed lone","photoUrl":"","userId":"02458088882398909889"}},"outputId":"b30131b2-f8ff-443f-d8ff-98b5ff26d4a2"},"source":["stored_model_path = './models/classifier_dl_trained' \n","fitted_pipe.save(stored_model_path)"],"execution_count":null,"outputs":[{"output_type":"stream","text":["Stored model in ./models/classifier_dl_trained\n"],"name":"stdout"}]},{"cell_type":"markdown","metadata":{"id":"e_b2DPd4rCiU"},"source":["# 6. Lets load the model from HDD.\n","This makes Offlien NLU usage possible! \n","You need to call nlu.load(path=path_to_the_pipe) to load a model/pipeline from disk."]},{"cell_type":"code","metadata":{"id":"SO4uz45MoRgp","colab":{"base_uri":"https://localhost:8080/","height":97},"executionInfo":{"status":"ok","timestamp":1620193057841,"user_tz":-300,"elapsed":1642287,"user":{"displayName":"ahmed lone","photoUrl":"","userId":"02458088882398909889"}},"outputId":"2e60866d-9d3b-4785-ce39-cefea4b2ea17"},"source":["hdd_pipe = nlu.load(path=stored_model_path)\n","\n","preds = hdd_pipe.predict('Donald Trump and Angela Merkel dont share many oppinions on laws about cheeseburgers')\n","preds"],"execution_count":null,"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","
textsentenceorigin_indexdocumententities_classentitiestokenword_embedding_from_disk
0Donald Trump and Angela Merkel dont share many...[Donald Trump and Angela Merkel dont share man...8589934592Donald Trump and Angela Merkel dont share many...[PER, PER][Donald Trump, Angela Merkel dont][Donald, Trump, and, Angela, Merkel, dont, sha...[[-0.6870571374893188, 1.1118954420089722, 0.5...
\n","
"],"text/plain":[" text ... word_embedding_from_disk\n","0 Donald Trump and Angela Merkel dont share many... ... [[-0.6870571374893188, 1.1118954420089722, 0.5...\n","\n","[1 rows x 8 columns]"]},"metadata":{"tags":[]},"execution_count":8}]},{"cell_type":"code","metadata":{"id":"e0CVlkk9v6Qi","colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"status":"ok","timestamp":1620193057843,"user_tz":-300,"elapsed":1642279,"user":{"displayName":"ahmed lone","photoUrl":"","userId":"02458088882398909889"}},"outputId":"95443872-f5fc-4431-b803-20e2020949c1"},"source":["hdd_pipe.print_info()"],"execution_count":null,"outputs":[{"output_type":"stream","text":["The following parameters are configurable for this NLU pipeline (You can copy paste the examples) :\n",">>> pipe['document_assembler'] has settable params:\n","pipe['document_assembler'].setCleanupMode('shrink') | Info: possible values: disabled, inplace, inplace_full, shrink, shrink_full, each, each_full, delete_full | Currently set to : shrink\n",">>> pipe['sentence_detector@SentenceDetectorDLModel_c83c27f46b97'] has settable params:\n","pipe['sentence_detector@SentenceDetectorDLModel_c83c27f46b97'].setExplodeSentences(False) | Info: whether to explode each sentence into a different row, for better parallelization. Defaults to false. | Currently set to : False\n","pipe['sentence_detector@SentenceDetectorDLModel_c83c27f46b97'].setStorageRef('SentenceDetectorDLModel_c83c27f46b97') | Info: storage unique identifier | Currently set to : SentenceDetectorDLModel_c83c27f46b97\n","pipe['sentence_detector@SentenceDetectorDLModel_c83c27f46b97'].setEncoder(com.johnsnowlabs.nlp.annotators.sentence_detector_dl.SentenceDetectorDLEncoder@75127717) | Info: Data encoder | Currently set to : com.johnsnowlabs.nlp.annotators.sentence_detector_dl.SentenceDetectorDLEncoder@75127717\n","pipe['sentence_detector@SentenceDetectorDLModel_c83c27f46b97'].setImpossiblePenultimates(['Bros', 'No', 'al', 'vs', 'etc', 'Fig', 'Dr', 'Prof', 'PhD', 'MD', 'Co', 'Corp', 'Inc', 'bros', 'VS', 'Vs', 'ETC', 'fig', 'dr', 'prof', 'PHD', 'phd', 'md', 'co', 'corp', 'inc', 'Jan', 'Feb', 'Mar', 'Apr', 'Jul', 'Aug', 'Sep', 'Sept', 'Oct', 'Nov', 'Dec', 'St', 'st', 'AM', 'PM', 'am', 'pm', 'e.g', 'f.e', 'i.e']) | Info: Impossible penultimates | Currently set to : ['Bros', 'No', 'al', 'vs', 'etc', 'Fig', 'Dr', 'Prof', 'PhD', 'MD', 'Co', 'Corp', 'Inc', 'bros', 'VS', 'Vs', 'ETC', 'fig', 'dr', 'prof', 'PHD', 'phd', 'md', 'co', 'corp', 'inc', 'Jan', 'Feb', 'Mar', 'Apr', 'Jul', 'Aug', 'Sep', 'Sept', 'Oct', 'Nov', 'Dec', 'St', 'st', 'AM', 'PM', 'am', 'pm', 'e.g', 'f.e', 'i.e']\n","pipe['sentence_detector@SentenceDetectorDLModel_c83c27f46b97'].setModelArchitecture('cnn') | Info: Model architecture (CNN) | Currently set to : cnn\n",">>> pipe['default_tokenizer'] has settable params:\n","pipe['default_tokenizer'].setCaseSensitiveExceptions(True) | Info: Whether to care for case sensitiveness in exceptions | Currently set to : True\n","pipe['default_tokenizer'].setTargetPattern('\\S+') | Info: pattern to grab from text as token candidates. Defaults \\S+ | Currently set to : \\S+\n","pipe['default_tokenizer'].setMaxLength(99999) | Info: Set the maximum allowed length for each token | Currently set to : 99999\n","pipe['default_tokenizer'].setMinLength(0) | Info: Set the minimum allowed length for each token | Currently set to : 0\n",">>> pipe['bert@small_bert_L2_128'] has settable params:\n","pipe['bert@small_bert_L2_128'].setBatchSize(8) | Info: Size of every batch | Currently set to : 8\n","pipe['bert@small_bert_L2_128'].setCaseSensitive(False) | Info: whether to ignore case in tokens for embeddings matching | Currently set to : False\n","pipe['bert@small_bert_L2_128'].setDimension(128) | Info: Number of embedding dimensions | Currently set to : 128\n","pipe['bert@small_bert_L2_128'].setMaxSentenceLength(128) | Info: Max sentence length to process | Currently set to : 128\n","pipe['bert@small_bert_L2_128'].setStorageRef('small_bert_L2_128') | Info: unique reference name for identification | Currently set to : small_bert_L2_128\n",">>> pipe['named_entity_recognizer_dl@small_bert_L2_128'] has settable params:\n","pipe['named_entity_recognizer_dl@small_bert_L2_128'].setBatchSize(8) | Info: Size of every batch | Currently set to : 8\n","pipe['named_entity_recognizer_dl@small_bert_L2_128'].setIncludeConfidence(True) | Info: whether to include confidence scores in annotation metadata | Currently set to : True\n","pipe['named_entity_recognizer_dl@small_bert_L2_128'].setClasses(['O', 'B-ORG', 'I-ORG', 'I-MISC', 'I-PER', 'B-LOC', 'B-MISC', 'I-LOC']) | Info: get the tags used to trained this NerDLModel | Currently set to : ['O', 'B-ORG', 'I-ORG', 'I-MISC', 'I-PER', 'B-LOC', 'B-MISC', 'I-LOC']\n","pipe['named_entity_recognizer_dl@small_bert_L2_128'].setStorageRef('small_bert_L2_128') | Info: unique reference name for identification | Currently set to : small_bert_L2_128\n",">>> pipe['ner_to_chunk_converter'] has settable params:\n","pipe['ner_to_chunk_converter'].setPreservePosition(True) | Info: Whether to preserve the original position of the tokens in the original document or use the modified tokens | Currently set to : True\n"],"name":"stdout"}]},{"cell_type":"code","metadata":{"id":"USD6d66Sw6_P"},"source":[""],"execution_count":null,"outputs":[]}]} \ No newline at end of file +{ + "nbformat": 4, + "nbformat_minor": 0, + "metadata": { + "colab": { + "provenance": [] + }, + "kernelspec": { + "name": "python3", + "display_name": "Python 3" + } + }, + "cells": [ + { + "cell_type": "markdown", + "metadata": { + "id": "zkufh760uvF3" + }, + "source": [ + "![JohnSnowLabs](https://nlp.johnsnowlabs.com/assets/images/logo.png)\n", + "\n", + "[![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/JohnSnowLabs/nlu/blob/master/examples/colab/Training/named_entity_recognition/NLU_training_NER_demo.ipynb)\n", + "\n", + "\n", + "\n", + "# Training a Named Entity Recognition (NER) model with NLU\n", + "With the [NER_DL model](https://nlp.johnsnowlabs.com/docs/en/annotators#ner-dl-named-entity-recognition-deep-learning-annotator) from Spark NLP you can achieve State Of the Art results on any NER problem\n", + "\n", + "This notebook showcases the following features :\n", + "\n", + "- How to train the deep learning classifier\n", + "- How to store a pipeline to disk\n", + "- How to load the pipeline from disk (Enables NLU offline mode)\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "dur2drhW5Rvi" + }, + "source": [ + "# 1. Colab Setup" + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "hFGnBCHavltY" + }, + "source": [ + "# Install the johnsnowlabs library\n", + "! pip install -q johnsnowlabs\n" + ], + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "f4KkTfnR5Ugg" + }, + "source": [ + "# 2. Download conll2003 dataset" + ] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "OrVb5ZMvvrQD", + "outputId": "3b928110-85ec-43b4-fb0b-59b7f8a1e82b" + }, + "source": [ + "! wget https://github.com/patverga/torch-ner-nlp-from-scratch/raw/master/data/conll2003/eng.train" + ], + "execution_count": 2, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "--2023-10-27 13:23:45-- https://github.com/patverga/torch-ner-nlp-from-scratch/raw/master/data/conll2003/eng.train\n", + "Resolving github.com (github.com)... 140.82.112.4\n", + "Connecting to github.com (github.com)|140.82.112.4|:443... connected.\n", + "HTTP request sent, awaiting response... 302 Found\n", + "Location: https://raw.githubusercontent.com/patverga/torch-ner-nlp-from-scratch/master/data/conll2003/eng.train [following]\n", + "--2023-10-27 13:23:45-- https://raw.githubusercontent.com/patverga/torch-ner-nlp-from-scratch/master/data/conll2003/eng.train\n", + "Resolving raw.githubusercontent.com (raw.githubusercontent.com)... 185.199.111.133, 185.199.109.133, 185.199.108.133, ...\n", + "Connecting to raw.githubusercontent.com (raw.githubusercontent.com)|185.199.111.133|:443... connected.\n", + "HTTP request sent, awaiting response... 200 OK\n", + "Length: 3283420 (3.1M) [text/plain]\n", + "Saving to: ‘eng.train’\n", + "\n", + "eng.train 100%[===================>] 3.13M --.-KB/s in 0.09s \n", + "\n", + "2023-10-27 13:23:46 (35.7 MB/s) - ‘eng.train’ saved [3283420/3283420]\n", + "\n" + ] + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "0296Om2C5anY" + }, + "source": [ + "# 3. Train Deep Learning Classifier using nlu.load('train.ner')\n", + "\n", + "You dataset label column should be named 'y' and the feature column with text data should be named 'text'" + ] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 286 + }, + "id": "3ZIPkRkWftBG", + "outputId": "fc7f1e4b-6286-4171-8b65-46d7567e607b" + }, + "source": [ + "from johnsnowlabs import nlp\n", + "# load a trainable pipeline by specifying the train. prefix and fit it on a dataset with label and text columns\n", + "# Since there are no\n", + "train_path = '/content/eng.train'\n", + "trainable_pipe = nlp.load('train.ner')\n", + "fitted_pipe = trainable_pipe.fit(dataset_path=train_path)\n", + "\n", + "# predict with the trainable pipeline on dataset and get predictions\n", + "preds = fitted_pipe.predict('Donald Trump and Angela Merkel dont share many oppinions')\n", + "preds" + ], + "execution_count": 3, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Warning::Spark Session already created, some configs may not take.\n", + "small_bert_L2_128 download started this may take some time.\n", + "Approximate size to download 16.1 MB\n", + "[OK!]\n", + "sentence_detector_dl download started this may take some time.\n", + "Approximate size to download 354.6 KB\n", + "[OK!]\n", + "Warning::Spark Session already created, some configs may not take.\n" + ] + }, + { + "output_type": "execute_result", + "data": { + "text/plain": [ + " document entities_ner \\\n", + "0 Donald Trump and Angela Merkel dont share many... Donald Trump \n", + "0 Donald Trump and Angela Merkel dont share many... Angela Merkel dont \n", + "\n", + " entities_ner_class entities_ner_confidence entities_ner_origin_chunk \\\n", + "0 PER 0.9544 0 \n", + "0 PER 0.88476664 1 \n", + "\n", + " entities_ner_origin_sentence \\\n", + "0 0 \n", + "0 0 \n", + "\n", + " word_embedding_bert \n", + "0 [[-0.44760167598724365, 1.0348622798919678, 0.... \n", + "0 [[-0.44760167598724365, 1.0348622798919678, 0.... " + ], + "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", + "
documententities_nerentities_ner_classentities_ner_confidenceentities_ner_origin_chunkentities_ner_origin_sentenceword_embedding_bert
0Donald Trump and Angela Merkel dont share many...Donald TrumpPER0.954400[[-0.44760167598724365, 1.0348622798919678, 0....
0Donald Trump and Angela Merkel dont share many...Angela Merkel dontPER0.8847666410[[-0.44760167598724365, 1.0348622798919678, 0....
\n", + "
\n", + "
\n", + "\n", + "
\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "
\n", + "\n", + "\n", + "
\n", + " \n", + "\n", + "\n", + "\n", + " \n", + "
\n", + "
\n", + "
\n" + ] + }, + "metadata": {}, + "execution_count": 3 + } + ] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "owFhjKqzQiv5", + "outputId": "7be23961-d30c-4176-cb25-ad9b6920806c" + }, + "source": [ + "# Check out the Parameters of the NER model we can configure\n", + "trainable_pipe.print_info()" + ], + "execution_count": 4, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "The following parameters are configurable for this NLU pipeline (You can copy paste the examples) :\n", + ">>> component_list['document_assembler'] has settable params:\n", + "component_list['document_assembler'].setCleanupMode('shrink') | Info: possible values: disabled, inplace, inplace_full, shrink, shrink_full, each, each_full, delete_full | Currently set to : shrink\n", + ">>> component_list['bert_embeddings@small_bert_L2_128'] has settable params:\n", + "component_list['bert_embeddings@small_bert_L2_128'].setBatchSize(8) | Info: Size of every batch | Currently set to : 8\n", + "component_list['bert_embeddings@small_bert_L2_128'].setEngine('tensorflow') | Info: Deep Learning engine used for this model | Currently set to : tensorflow\n", + "component_list['bert_embeddings@small_bert_L2_128'].setMaxSentenceLength(128) | Info: Max sentence length to process | Currently set to : 128\n", + "component_list['bert_embeddings@small_bert_L2_128'].setDimension(128) | Info: Number of embedding dimensions | Currently set to : 128\n", + "component_list['bert_embeddings@small_bert_L2_128'].setCaseSensitive(False) | Info: whether to ignore case in tokens for embeddings matching | Currently set to : False\n", + "component_list['bert_embeddings@small_bert_L2_128'].setStorageRef('small_bert_L2_128') | Info: unique reference name for identification | Currently set to : small_bert_L2_128\n", + ">>> component_list['tokenizer'] has settable params:\n", + "component_list['tokenizer'].setTargetPattern('\\S+') | Info: pattern to grab from text as token candidates. Defaults \\S+ | Currently set to : \\S+\n", + "component_list['tokenizer'].setContextChars(['.', ',', ';', ':', '!', '?', '*', '-', '(', ')', '\"', \"'\"]) | Info: character list used to separate from token boundaries | Currently set to : ['.', ',', ';', ':', '!', '?', '*', '-', '(', ')', '\"', \"'\"]\n", + "component_list['tokenizer'].setCaseSensitiveExceptions(True) | Info: Whether to care for case sensitiveness in exceptions | Currently set to : True\n", + "component_list['tokenizer'].setMinLength(0) | Info: Set the minimum allowed length for each token | Currently set to : 0\n", + "component_list['tokenizer'].setMaxLength(99999) | Info: Set the maximum allowed length for each token | Currently set to : 99999\n", + ">>> component_list['chunk_converter@entities'] has settable params:\n", + ">>> component_list['ner_dl@small_bert_L2_128'] has settable params:\n", + "component_list['ner_dl@small_bert_L2_128'].setBatchSize(8) | Info: Size of every batch | Currently set to : 8\n", + "component_list['ner_dl@small_bert_L2_128'].setEngine('tensorflow') | Info: Deep Learning engine used for this model | Currently set to : tensorflow\n", + "component_list['ner_dl@small_bert_L2_128'].setIncludeConfidence(True) | Info: whether to include confidence scores in annotation metadata | Currently set to : True\n", + "component_list['ner_dl@small_bert_L2_128'].setIncludeAllConfidenceScores(False) | Info: whether to include all confidence scores in annotation metadata or just the score of the predicted tag | Currently set to : False\n", + "component_list['ner_dl@small_bert_L2_128'].setStorageRef('small_bert_L2_128') | Info: unique reference name for identification | Currently set to : small_bert_L2_128\n" + ] + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "25RTuUXMFyEA" + }, + "source": [ + "# 4. Lets use BERT embeddings instead of the default Glove_100d ones!" + ] + }, + { + "cell_type": "code", + "source": [ + "nlp.nlu.print_components(action='embed')\n" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "ixhWEXz6Yc7z", + "outputId": "b03dbb2d-7e23-43fc-a642-2a1f941f2719" + }, + "execution_count": 8, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "For language NLU provides the following Models : \n", + "nlu.load('af.embed.w2v_cc_300d') returns Spark NLP model_anno_obj w2v_cc_300d\n", + "For language NLU provides the following Models : \n", + "nlu.load('als.embed.w2v_cc_300d') returns Spark NLP model_anno_obj w2v_cc_300d\n", + "For language NLU provides the following Models : \n", + "nlu.load('am.embed.am_roberta') returns Spark NLP model_anno_obj roberta_embeddings_am_roberta\n", + "nlu.load('am.embed.w2v_cc_300d') returns Spark NLP model_anno_obj w2v_cc_300d\n", + "nlu.load('am.embed.xlm_roberta') returns Spark NLP model_anno_obj xlm_roberta_base_finetuned_amharic\n", + "For language NLU provides the following Models : \n", + "nlu.load('an.embed.w2v_cc_300d') returns Spark NLP model_anno_obj w2v_cc_300d\n", + "For language NLU provides the following Models : \n", + "nlu.load('ar.embed') returns Spark NLP model_anno_obj arabic_w2v_cc_300d\n", + "nlu.load('ar.embed.AraBertMo_base_V1') returns Spark NLP model_anno_obj bert_embeddings_AraBertMo_base_V1\n", + "nlu.load('ar.embed.Ara_DialectBERT') returns Spark NLP model_anno_obj bert_embeddings_Ara_DialectBERT\n", + "nlu.load('ar.embed.DarijaBERT') returns Spark NLP model_anno_obj bert_embeddings_DarijaBERT\n", + "nlu.load('ar.embed.MARBERT') returns Spark NLP model_anno_obj bert_embeddings_MARBERT\n", + "nlu.load('ar.embed.MARBERTv2') returns Spark NLP model_anno_obj bert_embeddings_MARBERTv2\n", + "nlu.load('ar.embed.albert') returns Spark NLP model_anno_obj albert_embeddings_albert_base_arabic\n", + "nlu.load('ar.embed.albert_large_arabic') returns Spark NLP model_anno_obj albert_embeddings_albert_large_arabic\n", + "nlu.load('ar.embed.albert_xlarge_arabic') returns Spark NLP model_anno_obj albert_embeddings_albert_xlarge_arabic\n", + "nlu.load('ar.embed.aner') returns Spark NLP model_anno_obj arabic_w2v_cc_300d\n", + "nlu.load('ar.embed.aner.300d') returns Spark NLP model_anno_obj arabic_w2v_cc_300d\n", + "nlu.load('ar.embed.arabert_c19') returns Spark NLP model_anno_obj bert_embeddings_arabert_c19\n", + "nlu.load('ar.embed.arbert') returns Spark NLP model_anno_obj bert_embeddings_ARBERT\n", + "nlu.load('ar.embed.bert') returns Spark NLP model_anno_obj bert_embeddings_arbert\n", + "nlu.load('ar.embed.bert.base') returns Spark NLP model_anno_obj bert_embeddings_base_arabert\n", + "nlu.load('ar.embed.bert.base.by_asafaya') returns Spark NLP model_anno_obj bert_embeddings_base_arabic\n", + "nlu.load('ar.embed.bert.base.v1.by_aubmindlab') returns Spark NLP model_anno_obj bert_embeddings_base_arabertv01\n", + "nlu.load('ar.embed.bert.base.v2.by_aubmindlab') returns Spark NLP model_anno_obj bert_embeddings_base_arabertv02\n", + "nlu.load('ar.embed.bert.base_mix.by_camel_lab') returns Spark NLP model_anno_obj bert_embeddings_base_arabic_camel_mix\n", + "nlu.load('ar.embed.bert.base_msa.by_camel_lab') returns Spark NLP model_anno_obj bert_embeddings_base_arabic_camel_msa\n", + "nlu.load('ar.embed.bert.base_msa_eighth.by_camel_lab') returns Spark NLP model_anno_obj bert_embeddings_base_arabic_camel_msa_eighth\n", + "nlu.load('ar.embed.bert.base_msa_half.by_camel_lab') returns Spark NLP model_anno_obj bert_embeddings_base_arabic_camel_msa_half\n", + "nlu.load('ar.embed.bert.base_msa_quarter.by_camel_lab') returns Spark NLP model_anno_obj bert_embeddings_base_arabic_camel_msa_quarter\n", + "nlu.load('ar.embed.bert.base_msa_sixteenth.by_camel_lab') returns Spark NLP model_anno_obj bert_embeddings_base_arabic_camel_msa_sixteenth\n", + "nlu.load('ar.embed.bert.by_ubc_nlp') returns Spark NLP model_anno_obj bert_embeddings_marbert\n", + "nlu.load('ar.embed.bert.cased_base') returns Spark NLP model_anno_obj bert_embeddings_base_ar_cased\n", + "nlu.load('ar.embed.bert.large') returns Spark NLP model_anno_obj bert_embeddings_large_arabertv02\n", + "nlu.load('ar.embed.bert.large.by_asafaya') returns Spark NLP model_anno_obj bert_embeddings_large_arabic\n", + "nlu.load('ar.embed.bert.medium') returns Spark NLP model_anno_obj bert_embeddings_medium_arabic\n", + "nlu.load('ar.embed.bert.mini') returns Spark NLP model_anno_obj bert_embeddings_mini_arabic\n", + "nlu.load('ar.embed.bert.v2') returns Spark NLP model_anno_obj bert_embeddings_marbertv2\n", + "nlu.load('ar.embed.bert.v2_base') returns Spark NLP model_anno_obj bert_embeddings_base_arabertv2\n", + "nlu.load('ar.embed.bert.v2_large') returns Spark NLP model_anno_obj bert_embeddings_large_arabertv2\n", + "nlu.load('ar.embed.bert_base_arabert') returns Spark NLP model_anno_obj bert_embeddings_bert_base_arabert\n", + "nlu.load('ar.embed.bert_base_arabertv01') returns Spark NLP model_anno_obj bert_embeddings_bert_base_arabertv01\n", + "nlu.load('ar.embed.bert_base_arabertv02') returns Spark NLP model_anno_obj bert_embeddings_bert_base_arabertv02\n", + "nlu.load('ar.embed.bert_base_arabertv02_twitter') returns Spark NLP model_anno_obj bert_embeddings_bert_base_arabertv02_twitter\n", + "nlu.load('ar.embed.bert_base_arabertv2') returns Spark NLP model_anno_obj bert_embeddings_bert_base_arabertv2\n", + "nlu.load('ar.embed.bert_base_arabic') returns Spark NLP model_anno_obj bert_embeddings_bert_base_arabic\n", + "nlu.load('ar.embed.bert_base_arabic_camelbert_mix') returns Spark NLP model_anno_obj bert_embeddings_bert_base_arabic_camelbert_mix\n", + "nlu.load('ar.embed.bert_base_arabic_camelbert_msa') returns Spark NLP model_anno_obj bert_embeddings_bert_base_arabic_camelbert_msa\n", + "nlu.load('ar.embed.bert_base_arabic_camelbert_msa_eighth') returns Spark NLP model_anno_obj bert_embeddings_bert_base_arabic_camelbert_msa_eighth\n", + "nlu.load('ar.embed.bert_base_arabic_camelbert_msa_half') returns Spark NLP model_anno_obj bert_embeddings_bert_base_arabic_camelbert_msa_half\n", + "nlu.load('ar.embed.bert_base_arabic_camelbert_msa_quarter') returns Spark NLP model_anno_obj bert_embeddings_bert_base_arabic_camelbert_msa_quarter\n", + "nlu.load('ar.embed.bert_base_arabic_camelbert_msa_sixteenth') returns Spark NLP model_anno_obj bert_embeddings_bert_base_arabic_camelbert_msa_sixteenth\n", + "nlu.load('ar.embed.bert_base_qarib') returns Spark NLP model_anno_obj bert_embeddings_bert_base_qarib\n", + "nlu.load('ar.embed.bert_base_qarib60_1790k') returns Spark NLP model_anno_obj bert_embeddings_bert_base_qarib60_1790k\n", + "nlu.load('ar.embed.bert_base_qarib60_860k') returns Spark NLP model_anno_obj bert_embeddings_bert_base_qarib60_860k\n", + "nlu.load('ar.embed.bert_large_arabertv02') returns Spark NLP model_anno_obj bert_embeddings_bert_large_arabertv02\n", + "nlu.load('ar.embed.bert_large_arabertv02_twitter') returns Spark NLP model_anno_obj bert_embeddings_bert_large_arabertv02_twitter\n", + "nlu.load('ar.embed.bert_large_arabertv2') returns Spark NLP model_anno_obj bert_embeddings_bert_large_arabertv2\n", + "nlu.load('ar.embed.bert_large_arabic') returns Spark NLP model_anno_obj bert_embeddings_bert_large_arabic\n", + "nlu.load('ar.embed.bert_medium_arabic') returns Spark NLP model_anno_obj bert_embeddings_bert_medium_arabic\n", + "nlu.load('ar.embed.bert_mini_arabic') returns Spark NLP model_anno_obj bert_embeddings_bert_mini_arabic\n", + "nlu.load('ar.embed.cbow') returns Spark NLP model_anno_obj arabic_w2v_cc_300d\n", + "nlu.load('ar.embed.cbow.300d') returns Spark NLP model_anno_obj arabic_w2v_cc_300d\n", + "nlu.load('ar.embed.distilbert') returns Spark NLP model_anno_obj distilbert_embeddings_distilbert_base_ar_cased\n", + "nlu.load('ar.embed.dziribert') returns Spark NLP model_anno_obj bert_embeddings_dziribert\n", + "nlu.load('ar.embed.electra.base') returns Spark NLP model_anno_obj electra_embeddings_araelectra_base_generator\n", + "nlu.load('ar.embed.glove') returns Spark NLP model_anno_obj arabic_w2v_cc_300d\n", + "nlu.load('ar.embed.mbert_ar_c19') returns Spark NLP model_anno_obj bert_embeddings_mbert_ar_c19\n", + "nlu.load('ar.embed.multi_dialect_bert_base_arabic') returns Spark NLP model_anno_obj bert_embeddings_multi_dialect_bert_base_arabic\n", + "For language NLU provides the following Models : \n", + "nlu.load('arz.embed.w2v_cc_300d') returns Spark NLP model_anno_obj w2v_cc_300d\n", + "For language NLU provides the following Models : \n", + "nlu.load('as.embed.w2v_cc_300d') returns Spark NLP model_anno_obj w2v_cc_300d\n", + "For language NLU provides the following Models : \n", + "nlu.load('ast.embed.w2v_cc_300d') returns Spark NLP model_anno_obj w2v_cc_300d\n", + "For language NLU provides the following Models : \n", + "nlu.load('az.embed.w2v_cc_300d') returns Spark NLP model_anno_obj w2v_cc_300d\n", + "For language NLU provides the following Models : \n", + "nlu.load('azb.embed.w2v_cc_300d') returns Spark NLP model_anno_obj w2v_cc_300d\n", + "For language NLU provides the following Models : \n", + "nlu.load('ba.embed.w2v_cc_300d') returns Spark NLP model_anno_obj w2v_cc_300d\n", + "For language NLU provides the following Models : \n", + "nlu.load('bar.embed.w2v_cc_300d') returns Spark NLP model_anno_obj w2v_cc_300d\n", + "For language NLU provides the following Models : \n", + "nlu.load('bcl.embed.w2v_cc_300d') returns Spark NLP model_anno_obj w2v_cc_300d\n", + "For language NLU provides the following Models : \n", + "nlu.load('be.embed.w2v_cc_300d') returns Spark NLP model_anno_obj w2v_cc_300d\n", + "For language NLU provides the following Models : \n", + "nlu.load('bg.embed.bert.cased_base') returns Spark NLP model_anno_obj bert_embeddings_base_bg_cased\n", + "nlu.load('bg.embed.roberta.base') returns Spark NLP model_anno_obj roberta_embeddings_base_bulgarian\n", + "nlu.load('bg.embed.roberta.small') returns Spark NLP model_anno_obj roberta_embeddings_small_bulgarian\n", + "nlu.load('bg.embed.w2v_cc_300d') returns Spark NLP model_anno_obj w2v_cc_300d\n", + "For language NLU provides the following Models : \n", + "nlu.load('bh.embed.w2v_cc_300d') returns Spark NLP model_anno_obj w2v_cc_300d\n", + "For language NLU provides the following Models : \n", + "nlu.load('bn.embed') returns Spark NLP model_anno_obj bengali_cc_300d\n", + "nlu.load('bn.embed.bangala_bert') returns Spark NLP model_anno_obj bert_embeddings_bangla_bert_base\n", + "nlu.load('bn.embed.bangla_bert') returns Spark NLP model_anno_obj bert_embeddings_bangla_bert\n", + "nlu.load('bn.embed.bert') returns Spark NLP model_anno_obj bert_embeddings_indic_transformers\n", + "nlu.load('bn.embed.bert.base') returns Spark NLP model_anno_obj bert_embeddings_bangla_base\n", + "nlu.load('bn.embed.distil_bert') returns Spark NLP model_anno_obj distilbert_embeddings_indic_transformers\n", + "nlu.load('bn.embed.glove') returns Spark NLP model_anno_obj bengali_cc_300d\n", + "nlu.load('bn.embed.indic_transformers_bn_bert') returns Spark NLP model_anno_obj bert_embeddings_indic_transformers_bn_bert\n", + "nlu.load('bn.embed.indic_transformers_bn_distilbert') returns Spark NLP model_anno_obj distilbert_embeddings_indic_transformers_bn_distilbert\n", + "nlu.load('bn.embed.muril_adapted_local') returns Spark NLP model_anno_obj bert_embeddings_muril_adapted_local\n", + "nlu.load('bn.embed.roberta') returns Spark NLP model_anno_obj roberta_embeddings_indic_transformers\n", + "nlu.load('bn.embed.w2v_cc_300d') returns Spark NLP model_anno_obj w2v_cc_300d\n", + "nlu.load('bn.embed.xlmr_roberta') returns Spark NLP model_anno_obj xlmroberta_embeddings_indic_transformers_bn_xlmroberta\n", + "For language NLU provides the following Models : \n", + "nlu.load('bo.embed.w2v_cc_300d') returns Spark NLP model_anno_obj w2v_cc_300d\n", + "For language NLU provides the following Models : \n", + "nlu.load('bpy.embed.w2v_cc_300d') returns Spark NLP model_anno_obj w2v_cc_300d\n", + "For language
NLU provides the following Models : \n", + "nlu.load('br.embed.w2v_cc_300d') returns Spark NLP model_anno_obj w2v_cc_300d\n", + "For language NLU provides the following Models : \n", + "nlu.load('bs.embed.w2v_cc_300d') returns Spark NLP model_anno_obj w2v_cc_300d\n", + "For language NLU provides the following Models : \n", + "nlu.load('ca.embed.w2v_cc_300d') returns Spark NLP model_anno_obj w2v_cc_300d\n", + "For language NLU provides the following Models : \n", + "nlu.load('ce.embed.w2v_cc_300d') returns Spark NLP model_anno_obj w2v_cc_300d\n", + "For language NLU provides the following Models : \n", + "nlu.load('ceb.embed.w2v_cc_300d') returns Spark NLP model_anno_obj w2v_cc_300d\n", + "For language NLU provides the following Models : \n", + "nlu.load('co.embed.roberta.small') returns Spark NLP model_anno_obj roberta_embeddings_codeberta_small_v1\n", + "nlu.load('co.embed.w2v_cc_300d') returns Spark NLP model_anno_obj w2v_cc_300d\n", + "For language NLU provides the following Models : \n", + "nlu.load('cs.embed.bert') returns Spark NLP model_anno_obj bert_embeddings_fernet_c5\n", + "nlu.load('cs.embed.roberta.news.') returns Spark NLP model_anno_obj roberta_embeddings_fernet_news\n", + "nlu.load('cs.embed.w2v_cc_300d') returns Spark NLP model_anno_obj w2v_cc_300d\n", + "For language NLU provides the following Models : \n", + "nlu.load('cv.embed.w2v_cc_300d') returns Spark NLP model_anno_obj w2v_cc_300d\n", + "For language NLU provides the following Models : \n", + "nlu.load('cy.embed.w2v_cc_300d') returns Spark NLP model_anno_obj w2v_cc_300d\n", + "For language NLU provides the following Models : \n", + "nlu.load('da.embed.bert.cased_base') returns Spark NLP model_anno_obj bert_embeddings_base_da_cased\n", + "nlu.load('da.embed.w2v_cc_300d') returns Spark NLP model_anno_obj w2v_cc_300d\n", + "For language NLU provides the following Models : \n", + "nlu.load('de.embed.albert_german_ner') returns Spark NLP model_anno_obj albert_embeddings_albert_german_ner\n", + "nlu.load('de.embed.bert') returns Spark NLP model_anno_obj bert_base_german_cased\n", + "nlu.load('de.embed.bert.base') returns Spark NLP model_anno_obj bert_embeddings_g_base\n", + "nlu.load('de.embed.bert.by_smanjil') returns Spark NLP model_anno_obj bert_embeddings_german_medbert\n", + "nlu.load('de.embed.bert.cased_base') returns Spark NLP model_anno_obj bert_embeddings_base_de_cased\n", + "nlu.load('de.embed.bert.cased_base.by_dbmdz') returns Spark NLP model_anno_obj bert_embeddings_dbmdz_base_german_cased\n", + "nlu.load('de.embed.bert.cased_base.by_uploaded by huggingface') returns Spark NLP model_anno_obj bert_embeddings_base_german_cased\n", + "nlu.load('de.embed.bert.finance') returns Spark NLP model_anno_obj bert_sentence_embeddings_financial\n", + "nlu.load('de.embed.bert.large') returns Spark NLP model_anno_obj bert_embeddings_g_large\n", + "nlu.load('de.embed.bert.uncased') returns Spark NLP model_anno_obj bert_base_german_uncased\n", + "nlu.load('de.embed.bert.uncased_base') returns Spark NLP model_anno_obj bert_embeddings_base_german_uncased\n", + "nlu.load('de.embed.bert_base_5lang_cased') returns Spark NLP model_anno_obj bert_embeddings_bert_base_5lang_cased\n", + "nlu.load('de.embed.bert_base_de_cased') returns Spark NLP model_anno_obj bert_embeddings_bert_base_de_cased\n", + "nlu.load('de.embed.bert_base_german_cased_oldvocab') returns Spark NLP model_anno_obj bert_embeddings_bert_base_german_cased_oldvocab\n", + "nlu.load('de.embed.bert_base_german_dbmdz_cased') returns Spark NLP model_anno_obj bert_embeddings_bert_base_german_dbmdz_cased\n", + "nlu.load('de.embed.bert_base_german_dbmdz_uncased') returns Spark NLP model_anno_obj bert_embeddings_bert_base_german_dbmdz_uncased\n", + "nlu.load('de.embed.bert_base_german_uncased') returns Spark NLP model_anno_obj bert_embeddings_bert_base_german_uncased\n", + "nlu.load('de.embed.bert_base_historical_german_rw_cased') returns Spark NLP model_anno_obj bert_embeddings_bert_base_historical_german_rw_cased\n", + "nlu.load('de.embed.distilbert_base_de_cased') returns Spark NLP model_anno_obj distilbert_embeddings_distilbert_base_de_cased\n", + "nlu.load('de.embed.distilbert_base_german_cased') returns Spark NLP model_anno_obj distilbert_embeddings_distilbert_base_german_cased\n", + "nlu.load('de.embed.electra.base') returns Spark NLP model_anno_obj electra_embeddings_gelectra_base_generator\n", + "nlu.load('de.embed.electra.cased_base_64d') returns Spark NLP model_anno_obj electra_embeddings_electra_base_gc4_64k_0_cased_generator\n", + "nlu.load('de.embed.electra.cased_base_gc4_64k_100000.by_stefan_it') returns Spark NLP model_anno_obj electra_embeddings_electra_base_gc4_64k_100000_cased_generator\n", + "nlu.load('de.embed.electra.cased_base_gc4_64k_1000000.by_stefan_it') returns Spark NLP model_anno_obj electra_embeddings_electra_base_gc4_64k_1000000_cased_generator\n", + "nlu.load('de.embed.electra.cased_base_gc4_64k_200000.by_stefan_it') returns Spark NLP model_anno_obj electra_embeddings_electra_base_gc4_64k_200000_cased_generator\n", + "nlu.load('de.embed.electra.cased_base_gc4_64k_300000.by_stefan_it') returns Spark NLP model_anno_obj electra_embeddings_electra_base_gc4_64k_300000_cased_generator\n", + "nlu.load('de.embed.electra.cased_base_gc4_64k_400000.by_stefan_it') returns Spark NLP model_anno_obj electra_embeddings_electra_base_gc4_64k_400000_cased_generator\n", + "nlu.load('de.embed.electra.cased_base_gc4_64k_500000.by_stefan_it') returns Spark NLP model_anno_obj electra_embeddings_electra_base_gc4_64k_500000_cased_generator\n", + "nlu.load('de.embed.electra.cased_base_gc4_64k_600000.by_stefan_it') returns Spark NLP model_anno_obj electra_embeddings_electra_base_gc4_64k_600000_cased_generator\n", + "nlu.load('de.embed.electra.cased_base_gc4_64k_700000.by_stefan_it') returns Spark NLP model_anno_obj electra_embeddings_electra_base_gc4_64k_700000_cased_generator\n", + "nlu.load('de.embed.electra.cased_base_gc4_64k_800000.by_stefan_it') returns Spark NLP model_anno_obj electra_embeddings_electra_base_gc4_64k_800000_cased_generator\n", + "nlu.load('de.embed.electra.cased_base_gc4_64k_900000.by_stefan_it') returns Spark NLP model_anno_obj electra_embeddings_electra_base_gc4_64k_900000_cased_generator\n", + "nlu.load('de.embed.electra.large') returns Spark NLP model_anno_obj electra_embeddings_gelectra_large_generator\n", + "nlu.load('de.embed.gbert_base') returns Spark NLP model_anno_obj bert_embeddings_gbert_base\n", + "nlu.load('de.embed.gbert_large') returns Spark NLP model_anno_obj bert_embeddings_gbert_large\n", + "nlu.load('de.embed.german_financial_statements_bert') returns Spark NLP model_anno_obj bert_embeddings_german_financial_statements_bert\n", + "nlu.load('de.embed.medbert') returns Spark NLP model_anno_obj bert_embeddings_German_MedBERT\n", + "nlu.load('de.embed.roberta') returns Spark NLP model_anno_obj roberta_embeddings_hotelbert\n", + "nlu.load('de.embed.roberta.small') returns Spark NLP model_anno_obj roberta_embeddings_hotelbert_small\n", + "nlu.load('de.embed.roberta_base_wechsel_german') returns Spark NLP model_anno_obj roberta_embeddings_roberta_base_wechsel_german\n", + "For language NLU provides the following Models : \n", + "nlu.load('diq.embed.w2v_cc_300d') returns Spark NLP model_anno_obj w2v_cc_300d\n", + "For language NLU provides the following Models : \n", + "nlu.load('dv.embed.w2v_cc_300d') returns Spark NLP model_anno_obj w2v_cc_300d\n", + "For language NLU provides the following Models : \n", + "nlu.load('el.embed.bert.base_uncased') returns Spark NLP model_anno_obj bert_base_uncased\n", + "nlu.load('el.embed.bert.cased_base') returns Spark NLP model_anno_obj bert_embeddings_base_el_cased\n", + "nlu.load('el.embed.bert.uncased_base') returns Spark NLP model_anno_obj bert_embeddings_greeksocial_base_greek_uncased_v1\n", + "nlu.load('el.embed.roberta.uncased_base') returns Spark NLP model_anno_obj roberta_embeddings_palobert_base_greek_uncased_v1\n", + "For language NLU provides the following Models : \n", + "nlu.load('eml.embed.w2v_cc_300d') returns Spark NLP model_anno_obj w2v_cc_300d\n", + "For language NLU provides the following Models : \n", + "nlu.load('en.embed') returns Spark NLP model_anno_obj glove_100d\n", + "nlu.load('en.embed.Bible_roberta_base') returns Spark NLP model_anno_obj roberta_embeddings_Bible_roberta_base\n", + "nlu.load('en.embed.COVID_SciBERT') returns Spark NLP model_anno_obj bert_embeddings_COVID_SciBERT\n", + "nlu.load('en.embed.DiLBERT') returns Spark NLP model_anno_obj bert_embeddings_DiLBERT\n", + "nlu.load('en.embed.FinancialBERT') returns Spark NLP model_anno_obj bert_embeddings_FinancialBERT\n", + "nlu.load('en.embed.SecBERT') returns Spark NLP model_anno_obj bert_embeddings_SecBERT\n", + "nlu.load('en.embed.SecRoBERTa') returns Spark NLP model_anno_obj roberta_embeddings_SecRoBERTa\n", + "nlu.load('en.embed.agriculture_bert_uncased') returns Spark NLP model_anno_obj bert_embeddings_agriculture_bert_uncased\n", + "nlu.load('en.embed.albert') returns Spark NLP model_anno_obj albert_base_uncased\n", + "nlu.load('en.embed.albert.base_uncased') returns Spark NLP model_anno_obj albert_base_uncased\n", + "nlu.load('en.embed.albert.large_uncased') returns Spark NLP model_anno_obj albert_large_uncased\n", + "nlu.load('en.embed.albert.xlarge_uncased') returns Spark NLP model_anno_obj albert_xlarge_uncased\n", + "nlu.load('en.embed.albert.xxlarge_uncased') returns Spark NLP model_anno_obj albert_xxlarge_uncased\n", + "nlu.load('en.embed.albert_base_v1') returns Spark NLP model_anno_obj albert_embeddings_albert_base_v1\n", + "nlu.load('en.embed.albert_xlarge_v1') returns Spark NLP model_anno_obj albert_embeddings_albert_xlarge_v1\n", + "nlu.load('en.embed.albert_xxlarge_v1') returns Spark NLP model_anno_obj albert_embeddings_albert_xxlarge_v1\n", + "nlu.load('en.embed.bert') returns Spark NLP model_anno_obj bert_base_uncased\n", + "nlu.load('en.embed.bert.base') returns Spark NLP model_anno_obj bert_embeddings_v_2021_base\n", + "nlu.load('en.embed.bert.base_cased') returns Spark NLP model_anno_obj bert_base_cased\n", + "nlu.load('en.embed.bert.base_uncased') returns Spark NLP model_anno_obj bert_base_uncased\n", + "nlu.load('en.embed.bert.base_uncased_legal') returns Spark NLP model_anno_obj bert_base_uncased_legal\n", + "nlu.load('en.embed.bert.by_anferico') returns Spark NLP model_anno_obj bert_embeddings_for_patents\n", + "nlu.load('en.embed.bert.by_beatrice_portelli') returns Spark NLP model_anno_obj bert_embeddings_dilbert\n", + "nlu.load('en.embed.bert.by_law_ai') returns Spark NLP model_anno_obj bert_embeddings_incaselawbert\n", + "nlu.load('en.embed.bert.by_philschmid') returns Spark NLP model_anno_obj bert_embeddings_fin_pretrain_yiyanghkust\n", + "nlu.load('en.embed.bert.cased_base') returns Spark NLP model_anno_obj bert_embeddings_jobbert_base_cased\n", + "nlu.load('en.embed.bert.cased_base.by_ayansinha') returns Spark NLP model_anno_obj bert_embeddings_lic_class_scancode_base_cased_l32_1\n", + "nlu.load('en.embed.bert.cased_base.by_geotrend') returns Spark NLP model_anno_obj bert_embeddings_base_en_cased\n", + "nlu.load('en.embed.bert.cased_base.by_model_attribution_challenge') returns Spark NLP model_anno_obj bert_embeddings_model_attribution_challenge_base_cased\n", + "nlu.load('en.embed.bert.cased_base.by_uploaded by huggingface') returns Spark NLP model_anno_obj bert_embeddings_base_cased\n", + "nlu.load('en.embed.bert.cased_large') returns Spark NLP model_anno_obj bert_embeddings_large_cased\n", + "nlu.load('en.embed.bert.cased_large_whole_word_masking') returns Spark NLP model_anno_obj bert_embeddings_large_cased_whole_word_masking\n", + "nlu.load('en.embed.bert.contracts.large_small_finetuned_legal') returns Spark NLP model_anno_obj bert_embeddings_bert_small_finetuned_legal_contracts_larger20_5_1\n", + "nlu.load('en.embed.bert.contracts.large_small_finetuned_legal.by_muhtasham') returns Spark NLP model_anno_obj bert_embeddings_bert_small_finetuned_legal_contracts_larger4010\n", + "nlu.load('en.embed.bert.contracts.small_finetuned_legal') returns Spark NLP model_anno_obj bert_embeddings_bert_small_finetuned_legal_contracts10train10val\n", + "nlu.load('en.embed.bert.contracts.uncased_base') returns Spark NLP model_anno_obj bert_base_uncased_contracts\n", + "nlu.load('en.embed.bert.covid_bio_clinical.finetuned') returns Spark NLP model_anno_obj bert_embeddings_bioclinicalbert_finetuned_covid_papers\n", + "nlu.load('en.embed.bert.large') returns Spark NLP model_anno_obj bert_embeddings_v_2021_large\n", + "nlu.load('en.embed.bert.large_cased') returns Spark NLP model_anno_obj bert_large_cased\n", + "nlu.load('en.embed.bert.large_legal_7m') returns Spark NLP model_anno_obj bert_embeddings_legalbert_large_1.7m_1\n", + "nlu.load('en.embed.bert.large_legal_7m.by_pile_of_law') returns Spark NLP model_anno_obj bert_embeddings_legalbert_large_1.7m_2\n", + "nlu.load('en.embed.bert.large_uncased') returns Spark NLP model_anno_obj bert_large_uncased\n", + "nlu.load('en.embed.bert.legal') returns Spark NLP model_anno_obj bert_embeddings_inlegalbert\n", + "nlu.load('en.embed.bert.phs') returns Spark NLP model_anno_obj bert_embeddings_phs_bert\n", + "nlu.load('en.embed.bert.pubmed') returns Spark NLP model_anno_obj bert_pubmed\n", + "nlu.load('en.embed.bert.pubmed.uncased') returns Spark NLP model_anno_obj bert_biomed_pubmed_uncased\n", + "nlu.load('en.embed.bert.pubmed_squad2') returns Spark NLP model_anno_obj bert_pubmed_squad2\n", + "nlu.load('en.embed.bert.small_L10_128') returns Spark NLP model_anno_obj small_bert_L10_128\n", + "nlu.load('en.embed.bert.small_L10_256') returns Spark NLP model_anno_obj small_bert_L10_256\n", + "nlu.load('en.embed.bert.small_L10_512') returns Spark NLP model_anno_obj small_bert_L10_512\n", + "nlu.load('en.embed.bert.small_L10_768') returns Spark NLP model_anno_obj small_bert_L10_768\n", + "nlu.load('en.embed.bert.small_L12_128') returns Spark NLP model_anno_obj small_bert_L12_128\n", + "nlu.load('en.embed.bert.small_L12_256') returns Spark NLP model_anno_obj small_bert_L12_256\n", + "nlu.load('en.embed.bert.small_L12_512') returns Spark NLP model_anno_obj small_bert_L12_512\n", + "nlu.load('en.embed.bert.small_L12_768') returns Spark NLP model_anno_obj small_bert_L12_768\n", + "nlu.load('en.embed.bert.small_L2_128') returns Spark NLP model_anno_obj small_bert_L2_128\n", + "nlu.load('en.embed.bert.small_L2_256') returns Spark NLP model_anno_obj small_bert_L2_256\n", + "nlu.load('en.embed.bert.small_L2_512') returns Spark NLP model_anno_obj small_bert_L2_512\n", + "nlu.load('en.embed.bert.small_L2_768') returns Spark NLP model_anno_obj small_bert_L2_768\n", + "nlu.load('en.embed.bert.small_L4_128') returns Spark NLP model_anno_obj small_bert_L4_128\n", + "nlu.load('en.embed.bert.small_L4_256') returns Spark NLP model_anno_obj small_bert_L4_256\n", + "nlu.load('en.embed.bert.small_L4_512') returns Spark NLP model_anno_obj small_bert_L4_512\n", + "nlu.load('en.embed.bert.small_L4_768') returns Spark NLP model_anno_obj small_bert_L4_768\n", + "nlu.load('en.embed.bert.small_L6_128') returns Spark NLP model_anno_obj small_bert_L6_128\n", + "nlu.load('en.embed.bert.small_L6_256') returns Spark NLP model_anno_obj small_bert_L6_256\n", + "nlu.load('en.embed.bert.small_L6_512') returns Spark NLP model_anno_obj small_bert_L6_512\n", + "nlu.load('en.embed.bert.small_L6_768') returns Spark NLP model_anno_obj small_bert_L6_768\n", + "nlu.load('en.embed.bert.small_L8_128') returns Spark NLP model_anno_obj small_bert_L8_128\n", + "nlu.load('en.embed.bert.small_L8_256') returns Spark NLP model_anno_obj small_bert_L8_256\n", + "nlu.load('en.embed.bert.small_L8_512') returns Spark NLP model_anno_obj small_bert_L8_512\n", + "nlu.load('en.embed.bert.small_L8_768') returns Spark NLP model_anno_obj small_bert_L8_768\n", + "nlu.load('en.embed.bert.small_finetuned_legal') returns Spark NLP model_anno_obj bert_embeddings_bert_small_finetuned_legal_definitions\n", + "nlu.load('en.embed.bert.small_finetuned_legal.by_muhtasham') returns Spark NLP model_anno_obj bert_embeddings_bert_small_finetuned_legal_definitions_longer\n", + "nlu.load('en.embed.bert.tiny_finetuned_legal') returns Spark NLP model_anno_obj bert_embeddings_bert_tiny_finetuned_legal_definitions\n", + "nlu.load('en.embed.bert.uncased_base') returns Spark NLP model_anno_obj bert_embeddings_base_uncased\n", + "nlu.load('en.embed.bert.uncased_base.by_model_attribution_challenge') returns Spark NLP model_anno_obj bert_embeddings_model_attribution_challenge_base_uncased\n", + "nlu.load('en.embed.bert.uncased_base_finetuned_legal') returns Spark NLP model_anno_obj bert_embeddings_legal_bert_base_uncased_finetuned_rramicus\n", + "nlu.load('en.embed.bert.uncased_base_finetuned_legal.by_hatemestinbejaia') returns Spark NLP model_anno_obj bert_embeddings_legal_bert_base_uncased_finetuned_ledgarscotus7\n", + "nlu.load('en.embed.bert.uncased_large') returns Spark NLP model_anno_obj bert_embeddings_large_uncased\n", + "nlu.load('en.embed.bert.uncased_large_whole_word_masking') returns Spark NLP model_anno_obj bert_embeddings_large_uncased_whole_word_masking\n", + "nlu.load('en.embed.bert.wiki_books') returns Spark NLP model_anno_obj bert_wiki_books\n", + "nlu.load('en.embed.bert.wiki_books_mnli') returns Spark NLP model_anno_obj bert_wiki_books_mnli\n", + "nlu.load('en.embed.bert.wiki_books_qnli') returns Spark NLP model_anno_obj bert_wiki_books_qnli\n", + "nlu.load('en.embed.bert.wiki_books_qqp') returns Spark NLP model_anno_obj bert_wiki_books_qqp\n", + "nlu.load('en.embed.bert.wiki_books_squad2') returns Spark NLP model_anno_obj bert_wiki_books_squad2\n", + "nlu.load('en.embed.bert.wiki_books_sst2') returns Spark NLP model_anno_obj bert_wiki_books_sst2\n", + "nlu.load('en.embed.bert_base_5lang_cased') returns Spark NLP model_anno_obj bert_embeddings_bert_base_5lang_cased\n", + "nlu.load('en.embed.bert_base_en_cased') returns Spark NLP model_anno_obj bert_embeddings_bert_base_en_cased\n", + "nlu.load('en.embed.bert_base_uncased_dstc9') returns Spark NLP model_anno_obj bert_embeddings_bert_base_uncased_dstc9\n", + "nlu.load('en.embed.bert_base_uncased_mnli_sparse_70_unstructured_no_classifier') returns Spark NLP model_anno_obj bert_embeddings_bert_base_uncased_mnli_sparse_70_unstructured_no_classifier\n", + "nlu.load('en.embed.bert_base_uncased_sparse_70_unstructured') returns Spark NLP model_anno_obj bert_embeddings_bert_base_uncased_sparse_70_unstructured\n", + "nlu.load('en.embed.bert_for_patents') returns Spark NLP model_anno_obj bert_embeddings_bert_for_patents\n", + "nlu.load('en.embed.bert_large_cased_whole_word_masking') returns Spark NLP model_anno_obj bert_embeddings_bert_large_cased_whole_word_masking\n", + "nlu.load('en.embed.bert_large_uncased_whole_word_masking') returns Spark NLP model_anno_obj bert_embeddings_bert_large_uncased_whole_word_masking\n", + "nlu.load('en.embed.bert_political_election2020_twitter_mlm') returns Spark NLP model_anno_obj bert_embeddings_bert_political_election2020_twitter_mlm\n", + "nlu.load('en.embed.biobert') returns Spark NLP model_anno_obj biobert_pubmed_base_cased\n", + "nlu.load('en.embed.biobert.clinical_base_cased') returns Spark NLP model_anno_obj biobert_clinical_base_cased\n", + "nlu.load('en.embed.biobert.discharge_base_cased') returns Spark NLP model_anno_obj biobert_discharge_base_cased\n", + "nlu.load('en.embed.biobert.pmc_base_cased') returns Spark NLP model_anno_obj biobert_pmc_base_cased\n", + "nlu.load('en.embed.biobert.pubmed.cased_base') returns Spark NLP model_anno_obj biobert_pubmed_base_cased_v1.2\n", + "nlu.load('en.embed.biobert.pubmed_large_cased') returns Spark NLP model_anno_obj biobert_pubmed_large_cased\n", + "nlu.load('en.embed.biobert.pubmed_pmc_base_cased') returns Spark NLP model_anno_obj biobert_pubmed_pmc_base_cased\n", + "nlu.load('en.embed.bioformer.cased') returns Spark NLP model_anno_obj bert_embeddings_bioformer_cased_v1.0\n", + "nlu.load('en.embed.chEMBL26_smiles_v2') returns Spark NLP model_anno_obj roberta_embeddings_chEMBL26_smiles_v2\n", + "nlu.load('en.embed.chEMBL_smiles_v1') returns Spark NLP model_anno_obj roberta_embeddings_chEMBL_smiles_v1\n", + "nlu.load('en.embed.chemical_bert_uncased') returns Spark NLP model_anno_obj bert_embeddings_chemical_bert_uncased\n", + "nlu.load('en.embed.childes_bert') returns Spark NLP model_anno_obj bert_embeddings_childes_bert\n", + "nlu.load('en.embed.clinical_pubmed_bert_base_128') returns Spark NLP model_anno_obj bert_embeddings_clinical_pubmed_bert_base_128\n", + "nlu.load('en.embed.clinical_pubmed_bert_base_512') returns Spark NLP model_anno_obj bert_embeddings_clinical_pubmed_bert_base_512\n", + "nlu.load('en.embed.covidbert') returns Spark NLP model_anno_obj covidbert_large_uncased\n", + "nlu.load('en.embed.covidbert.large_uncased') returns Spark NLP model_anno_obj covidbert_large_uncased\n", + "nlu.load('en.embed.crosloengual_bert') returns Spark NLP model_anno_obj bert_embeddings_crosloengual_bert\n", + "nlu.load('en.embed.danbert_small_cased') returns Spark NLP model_anno_obj bert_embeddings_danbert_small_cased\n", + "nlu.load('en.embed.deberta_base_uncased') returns Spark NLP model_anno_obj bert_embeddings_deberta_base_uncased\n", + "nlu.load('en.embed.deberta_v3_base') returns Spark NLP model_anno_obj deberta_v3_base\n", + "nlu.load('en.embed.deberta_v3_large') returns Spark NLP model_anno_obj deberta_v3_large\n", + "nlu.load('en.embed.deberta_v3_small') returns Spark NLP model_anno_obj deberta_v3_small\n", + "nlu.load('en.embed.deberta_v3_xsmall') returns Spark NLP model_anno_obj deberta_v3_xsmall\n", + "nlu.load('en.embed.distil_bert') returns Spark NLP model_anno_obj distilbert_embeddings_test_text\n", + "nlu.load('en.embed.distil_bert.finetuned') returns Spark NLP model_anno_obj distilbert_embeddings_finetuned_sarcasm_classification\n", + "nlu.load('en.embed.distil_bert.uncased_base') returns Spark NLP model_anno_obj distilbert_embeddings_base_uncased\n", + "nlu.load('en.embed.distil_bert.uncased_base_sparse_85_unstructured_pruneofa.by_intel') returns Spark NLP model_anno_obj distilbert_embeddings_base_uncased_sparse_85_unstructured_pruneofa\n", + "nlu.load('en.embed.distil_bert.uncased_base_sparse_90_unstructured_pruneofa.by_intel') returns Spark NLP model_anno_obj distilbert_embeddings_base_uncased_sparse_90_unstructured_pruneofa\n", + "nlu.load('en.embed.distilbert') returns Spark NLP model_anno_obj distilbert_base_cased\n", + "nlu.load('en.embed.distilbert.base') returns Spark NLP model_anno_obj distilbert_base_cased\n", + "nlu.load('en.embed.distilbert.base.uncased') returns Spark NLP model_anno_obj distilbert_base_uncased\n", + "nlu.load('en.embed.distilbert_base_en_cased') returns Spark NLP model_anno_obj distilbert_embeddings_distilbert_base_en_cased\n", + "nlu.load('en.embed.distilbert_base_uncased_sparse_85_unstructured_pruneofa') returns Spark NLP model_anno_obj distilbert_embeddings_distilbert_base_uncased_sparse_85_unstructured_pruneofa\n", + "nlu.load('en.embed.distilbert_base_uncased_sparse_90_unstructured_pruneofa') returns Spark NLP model_anno_obj distilbert_embeddings_distilbert_base_uncased_sparse_90_unstructured_pruneofa\n", + "nlu.load('en.embed.distilroberta') returns Spark NLP model_anno_obj distilroberta_base\n", + "nlu.load('en.embed.distilroberta_base') returns Spark NLP model_anno_obj roberta_embeddings_distilroberta_base\n", + "nlu.load('en.embed.distilroberta_base_climate_d') returns Spark NLP model_anno_obj roberta_embeddings_distilroberta_base_climate_d\n", + "nlu.load('en.embed.distilroberta_base_climate_d_s') returns Spark NLP model_anno_obj roberta_embeddings_distilroberta_base_climate_d_s\n", + "nlu.load('en.embed.distilroberta_base_climate_f') returns Spark NLP model_anno_obj roberta_embeddings_distilroberta_base_climate_f\n", + "nlu.load('en.embed.distilroberta_base_finetuned_jira_qt_issue_title') returns Spark NLP model_anno_obj roberta_embeddings_distilroberta_base_finetuned_jira_qt_issue_title\n", + "nlu.load('en.embed.distilroberta_base_finetuned_jira_qt_issue_titles_and_bodies') returns Spark NLP model_anno_obj roberta_embeddings_distilroberta_base_finetuned_jira_qt_issue_titles_and_bodies\n", + "nlu.load('en.embed.e') returns Spark NLP model_anno_obj bert_biolink_base\n", + "nlu.load('en.embed.electra') returns Spark NLP model_anno_obj electra_small_uncased\n", + "nlu.load('en.embed.electra.base') returns Spark NLP model_anno_obj electra_embeddings_electra_base_generator\n", + "nlu.load('en.embed.electra.base_uncased') returns Spark NLP model_anno_obj electra_base_uncased\n", + "nlu.load('en.embed.electra.large') returns Spark NLP model_anno_obj electra_embeddings_electra_large_generator\n", + "nlu.load('en.embed.electra.large_uncased') returns Spark NLP model_anno_obj electra_large_uncased\n", + "nlu.load('en.embed.electra.medical') returns Spark NLP model_anno_obj electra_medal_acronym\n", + "nlu.load('en.embed.electra.small') returns Spark NLP model_anno_obj electra_embeddings_electra_small_generator\n", + "nlu.load('en.embed.electra.small_uncased') returns Spark NLP model_anno_obj electra_small_uncased\n", + "nlu.load('en.embed.elmo') returns Spark NLP model_anno_obj elmo\n", + "nlu.load('en.embed.fairlex_ecthr_minilm') returns Spark NLP model_anno_obj roberta_embeddings_fairlex_ecthr_minilm\n", + "nlu.load('en.embed.fairlex_scotus_minilm') returns Spark NLP model_anno_obj roberta_embeddings_fairlex_scotus_minilm\n", + "nlu.load('en.embed.false_positives_scancode_bert_base_uncased_L8_1') returns Spark NLP model_anno_obj bert_embeddings_false_positives_scancode_bert_base_uncased_L8_1\n", + "nlu.load('en.embed.finbert_pretrain_yiyanghkust') returns Spark NLP model_anno_obj bert_embeddings_finbert_pretrain_yiyanghkust\n", + "nlu.load('en.embed.finest_bert') returns Spark NLP model_anno_obj bert_embeddings_finest_bert\n", + "nlu.load('en.embed.ge') returns Spark NLP model_anno_obj bert_biolink_large\n", + "nlu.load('en.embed.glove') returns Spark NLP model_anno_obj glove_100d\n", + "nlu.load('en.embed.glove.100d') returns Spark NLP model_anno_obj glove_100d\n", + "nlu.load('en.embed.hateBERT') returns Spark NLP model_anno_obj bert_embeddings_hateBERT\n", + "nlu.load('en.embed.legal.osf_lemmatized_legal') returns Spark NLP model_anno_obj word2vec_osf_lemmatized_legal\n", + "nlu.load('en.embed.legal.osf_raw_legal') returns Spark NLP model_anno_obj word2vec_osf_raw_legal\n", + "nlu.load('en.embed.legal.osf_replaced_lemmatized_legal') returns Spark NLP model_anno_obj word2vec_osf_replaced_lemmatized_legal\n", + "nlu.load('en.embed.legal.osf_replaced_raw_legal') returns Spark NLP model_anno_obj word2vec_osf_replaced_raw_legal\n", + "nlu.load('en.embed.legal_bert_base_uncased') returns Spark NLP model_anno_obj bert_embeddings_legal_bert_base_uncased\n", + "nlu.load('en.embed.legal_bert_small_uncased') returns Spark NLP model_anno_obj bert_embeddings_legal_bert_small_uncased\n", + "nlu.load('en.embed.legal_roberta_base') returns Spark NLP model_anno_obj roberta_embeddings_legal_roberta_base\n", + "nlu.load('en.embed.legalbert.legal.by_zlucia') returns Spark NLP model_anno_obj bert_embeddings_legalbert\n", + "nlu.load('en.embed.legalbert.legal.custom.by_zlucia') returns Spark NLP model_anno_obj bert_embeddings_custom_legalbert\n", + "nlu.load('en.embed.lic_class_scancode_bert_base_cased_L32_1') returns Spark NLP model_anno_obj bert_embeddings_lic_class_scancode_bert_base_cased_L32_1\n", + "nlu.load('en.embed.longformer') returns Spark NLP model_anno_obj longformer_base_4096\n", + "nlu.load('en.embed.longformer.base_legal') returns Spark NLP model_anno_obj legal_longformer_base\n", + "nlu.load('en.embed.longformer.clinical') returns Spark NLP model_anno_obj clinical_longformer\n", + "nlu.load('en.embed.longformer.large') returns Spark NLP model_anno_obj longformer_large_4096\n", + "nlu.load('en.embed.muppet_roberta_base') returns Spark NLP model_anno_obj roberta_embeddings_muppet_roberta_base\n", + "nlu.load('en.embed.muppet_roberta_large') returns Spark NLP model_anno_obj roberta_embeddings_muppet_roberta_large\n", + "nlu.load('en.embed.muril_adapted_local') returns Spark NLP model_anno_obj bert_embeddings_muril_adapted_local\n", + "nlu.load('en.embed.netbert') returns Spark NLP model_anno_obj bert_embeddings_netbert\n", + "nlu.load('en.embed.pmc_med_bio_mlm_roberta_large') returns Spark NLP model_anno_obj roberta_embeddings_pmc_med_bio_mlm_roberta_large\n", + "nlu.load('en.embed.pos.uncased_base') returns Spark NLP model_anno_obj bert_embeddings_false_positives_scancode_base_uncased_l8_1\n", + "nlu.load('en.embed.psych_search') returns Spark NLP model_anno_obj bert_embeddings_psych_search\n", + "nlu.load('en.embed.roberta') returns Spark NLP model_anno_obj roberta_base\n", + "nlu.load('en.embed.roberta.base') returns Spark NLP model_anno_obj roberta_base\n", + "nlu.load('en.embed.roberta.base.by_model_attribution_challenge') returns Spark NLP model_anno_obj roberta_embeddings_model_attribution_challenge_base\n", + "nlu.load('en.embed.roberta.base_finetuned') returns Spark NLP model_anno_obj roberta_embeddings_ruperta_base_finetuned_spa_constitution\n", + "nlu.load('en.embed.roberta.base_legal') returns Spark NLP model_anno_obj roberta_embeddings_legal_base\n", + "nlu.load('en.embed.roberta.cord19.1m') returns Spark NLP model_anno_obj roberta_embeddings_cord19_1m7k\n", + "nlu.load('en.embed.roberta.distilled_base') returns Spark NLP model_anno_obj roberta_embeddings_distil_base\n", + "nlu.load('en.embed.roberta.financial') returns Spark NLP model_anno_obj roberta_embeddings_financial\n", + "nlu.load('en.embed.roberta.large') returns Spark NLP model_anno_obj roberta_large\n", + "nlu.load('en.embed.roberta_pubmed') returns Spark NLP model_anno_obj roberta_embeddings_roberta_pubmed\n", + "nlu.load('en.embed.scibert.cord19_scibert.finetuned') returns Spark NLP model_anno_obj bert_embeddings_scibert_scivocab_finetuned_cord19\n", + "nlu.load('en.embed.scibert.covid_scibert.') returns Spark NLP model_anno_obj bert_embeddings_covid_scibert\n", + "nlu.load('en.embed.sec_bert_base') returns Spark NLP model_anno_obj bert_embeddings_sec_bert_base\n", + "nlu.load('en.embed.sec_bert_num') returns Spark NLP model_anno_obj bert_embeddings_sec_bert_num\n", + "nlu.load('en.embed.sec_bert_sh') returns Spark NLP model_anno_obj bert_embeddings_sec_bert_sh\n", + "nlu.load('en.embed.w2v_cc_300d') returns Spark NLP model_anno_obj w2v_cc_300d\n", + "nlu.load('en.embed.word2vec.gigaword') returns Spark NLP model_anno_obj word2vec_gigaword_300\n", + "nlu.load('en.embed.word2vec.gigaword_wiki') returns Spark NLP model_anno_obj word2vec_gigaword_wiki_300\n", + "nlu.load('en.embed.xlmr_roberta') returns Spark NLP model_anno_obj xlmroberta_embeddings_litlat_bert\n", + "nlu.load('en.embed.xlnet') returns Spark NLP model_anno_obj xlnet_base_cased\n", + "nlu.load('en.embed.xlnet_base_cased') returns Spark NLP model_anno_obj xlnet_base_cased\n", + "nlu.load('en.embed.xlnet_large_cased') returns Spark NLP model_anno_obj xlnet_large_cased\n", + "For language NLU provides the following Models : \n", + "nlu.load('eo.embed.w2v_cc_300d') returns Spark NLP model_anno_obj w2v_cc_300d\n", + "For language NLU provides the following Models : \n", + "nlu.load('es.embed.RoBERTalex') returns Spark NLP model_anno_obj roberta_embeddings_RoBERTalex\n", + "nlu.load('es.embed.RuPERTa_base') returns Spark NLP model_anno_obj roberta_embeddings_RuPERTa_base\n", + "nlu.load('es.embed.alberti_bert_base_multilingual_cased') returns Spark NLP model_anno_obj bert_embeddings_alberti_bert_base_multilingual_cased\n", + "nlu.load('es.embed.bert.base_cased') returns Spark NLP model_anno_obj bert_base_cased\n", + "nlu.load('es.embed.bert.base_legal') returns Spark NLP model_anno_obj legalectra_base\n", + "nlu.load('es.embed.bert.base_uncased') returns Spark NLP model_anno_obj bert_base_uncased\n", + "nlu.load('es.embed.bert.cased_base') returns Spark NLP model_anno_obj bert_embeddings_base_es_cased\n", + "nlu.load('es.embed.bert.cased_base.by_dccuchile') returns Spark NLP model_anno_obj bert_embeddings_base_spanish_wwm_cased\n", + "nlu.load('es.embed.bert.small_legal') returns Spark NLP model_anno_obj legalectra_small\n", + "nlu.load('es.embed.bert.uncased_base') returns Spark NLP model_anno_obj bert_embeddings_base_spanish_wwm_uncased\n", + "nlu.load('es.embed.bert_base_5lang_cased') returns Spark NLP model_anno_obj bert_embeddings_bert_base_5lang_cased\n", + "nlu.load('es.embed.bert_base_es_cased') returns Spark NLP model_anno_obj bert_embeddings_bert_base_es_cased\n", + "nlu.load('es.embed.bertin_base_gaussian') returns Spark NLP model_anno_obj roberta_embeddings_bertin_base_gaussian\n", + "nlu.load('es.embed.bertin_base_gaussian_exp_512seqlen') returns Spark NLP model_anno_obj roberta_embeddings_bertin_base_gaussian_exp_512seqlen\n", + "nlu.load('es.embed.bertin_base_random') returns Spark NLP model_anno_obj roberta_embeddings_bertin_base_random\n", + "nlu.load('es.embed.bertin_base_random_exp_512seqlen') returns Spark NLP model_anno_obj roberta_embeddings_bertin_base_random_exp_512seqlen\n", + "nlu.load('es.embed.bertin_base_stepwise') returns Spark NLP model_anno_obj roberta_embeddings_bertin_base_stepwise\n", + "nlu.load('es.embed.bertin_base_stepwise_exp_512seqlen') returns Spark NLP model_anno_obj roberta_embeddings_bertin_base_stepwise_exp_512seqlen\n", + "nlu.load('es.embed.bertin_roberta_base_spanish') returns Spark NLP model_anno_obj roberta_embeddings_bertin_roberta_base_spanish\n", + "nlu.load('es.embed.bertin_roberta_large_spanish') returns Spark NLP model_anno_obj roberta_embeddings_bertin_roberta_large_spanish\n", + "nlu.load('es.embed.beto_gn_base_cased') returns Spark NLP model_anno_obj bert_embeddings_beto_gn_base_cased\n", + "nlu.load('es.embed.distilbert_base_es_cased') returns Spark NLP model_anno_obj distilbert_embeddings_distilbert_base_es_cased\n", + "nlu.load('es.embed.distilbert_base_es_multilingual_cased') returns Spark NLP model_anno_obj distilbert_embeddings_distilbert_base_es_multilingual_cased\n", + "nlu.load('es.embed.dpr_spanish_passage_encoder_allqa_base') returns Spark NLP model_anno_obj bert_embeddings_dpr_spanish_passage_encoder_allqa_base\n", + "nlu.load('es.embed.dpr_spanish_passage_encoder_squades_base') returns Spark NLP model_anno_obj bert_embeddings_dpr_spanish_passage_encoder_squades_base\n", + "nlu.load('es.embed.dpr_spanish_question_encoder_allqa_base') returns Spark NLP model_anno_obj bert_embeddings_dpr_spanish_question_encoder_allqa_base\n", + "nlu.load('es.embed.dpr_spanish_question_encoder_squades_base') returns Spark NLP model_anno_obj bert_embeddings_dpr_spanish_question_encoder_squades_base\n", + "nlu.load('es.embed.electra.base') returns Spark NLP model_anno_obj electra_embeddings_electricidad_base_generator\n", + "nlu.load('es.embed.jurisbert') returns Spark NLP model_anno_obj roberta_embeddings_jurisbert\n", + "nlu.load('es.embed.legal.cbow.cased_d100') returns Spark NLP model_anno_obj word2vec_cbow_legal_d100_cased\n", + "nlu.load('es.embed.legal.cbow.cased_d300') returns Spark NLP model_anno_obj word2vec_cbow_legal_d300_cased\n", + "nlu.load('es.embed.legal.cbow.cased_d50') returns Spark NLP model_anno_obj word2vec_cbow_legal_d50_cased\n", + "nlu.load('es.embed.legal.cbow.uncased_d100') returns Spark NLP model_anno_obj word2vec_cbow_legal_d100_uncased\n", + "nlu.load('es.embed.legal.cbow.uncased_d300') returns Spark NLP model_anno_obj word2vec_cbow_legal_d300_uncased\n", + "nlu.load('es.embed.legal.cbow.uncased_d50') returns Spark NLP model_anno_obj word2vec_cbow_legal_d50_uncased\n", + "nlu.load('es.embed.legal.skipgram.cased_d100') returns Spark NLP model_anno_obj word2vec_skipgram_legal_d100_cased\n", + "nlu.load('es.embed.legal.skipgram.cased_d300') returns Spark NLP model_anno_obj word2vec_skipgram_legal_d300_cased\n", + "nlu.load('es.embed.legal.skipgram.cased_d50') returns Spark NLP model_anno_obj word2vec_skipgram_legal_d50_cased\n", + "nlu.load('es.embed.legal.skipgram.uncased_d100') returns Spark NLP model_anno_obj word2vec_skipgram_legal_d100_uncased\n", + "nlu.load('es.embed.legal.skipgram.uncased_d300') returns Spark NLP model_anno_obj word2vec_skipgram_legal_d300_uncased\n", + "nlu.load('es.embed.legal.skipgram.uncased_d50') returns Spark NLP model_anno_obj word2vec_skipgram_legal_d50_uncased\n", + "nlu.load('es.embed.longformer.base_legal') returns Spark NLP model_anno_obj longformer_legal_base_8192\n", + "nlu.load('es.embed.longformer.legal') returns Spark NLP model_anno_obj longformer_legal_embeddings\n", + "nlu.load('es.embed.mlm_spanish_roberta_base') returns Spark NLP model_anno_obj roberta_embeddings_mlm_spanish_roberta_base\n", + "nlu.load('es.embed.roberta_base_bne') returns Spark NLP model_anno_obj roberta_embeddings_roberta_base_bne\n", + "nlu.load('es.embed.roberta_large_bne') returns Spark NLP model_anno_obj roberta_embeddings_roberta_large_bne\n", + "nlu.load('es.embed.w2v_cc_300d') returns Spark NLP model_anno_obj w2v_cc_300d\n", + "For language NLU provides the following Models : \n", + "nlu.load('et.embed.camembert') returns Spark NLP model_anno_obj camembert_embeddings_est_roberta\n", + "nlu.load('et.embed.w2v_cc_300d') returns Spark NLP model_anno_obj w2v_cc_300d\n", + "For language NLU provides the following Models : \n", + "nlu.load('eu.embed.roberta') returns Spark NLP model_anno_obj roberta_embeddings_robasqu\n", + "nlu.load('eu.embed.w2v_cc_300d') returns Spark NLP model_anno_obj w2v_cc_300d\n", + "For language NLU provides the following Models : \n", + "nlu.load('fa.embed') returns Spark NLP model_anno_obj persian_w2v_cc_300d\n", + "nlu.load('fa.embed.albert') returns Spark NLP model_anno_obj albert_embeddings_albert_fa_base_v2\n", + "nlu.load('fa.embed.albert_fa_zwnj_base_v2') returns Spark NLP model_anno_obj albert_embeddings_albert_fa_zwnj_base_v2\n", + "nlu.load('fa.embed.bert.base') returns Spark NLP model_anno_obj bert_embeddings_fa_zwnj_base\n", + "nlu.load('fa.embed.bert.uncased_base') returns Spark NLP model_anno_obj bert_embeddings_fa_base_uncased\n", + "nlu.load('fa.embed.distilbert_fa_zwnj_base') returns Spark NLP model_anno_obj distilbert_embeddings_distilbert_fa_zwnj_base\n", + "nlu.load('fa.embed.roberta_fa_zwnj_base') returns Spark NLP model_anno_obj roberta_embeddings_roberta_fa_zwnj_base\n", + "nlu.load('fa.embed.word2vec') returns Spark NLP model_anno_obj persian_w2v_cc_300d\n", + "nlu.load('fa.embed.word2vec.300d') returns Spark NLP model_anno_obj persian_w2v_cc_300d\n", + "For language NLU provides the following Models : \n", + "nlu.load('fi.embed.bert.cased_base') returns Spark NLP model_anno_obj bert_embeddings_base_finnish_cased_v1\n", + "nlu.load('fi.embed.bert.uncased_base') returns Spark NLP model_anno_obj bert_embeddings_base_finnish_uncased_v1\n", + "nlu.load('fi.embed.w2v_cc_300d') returns Spark NLP model_anno_obj w2v_cc_300d\n", + "For language NLU provides the following Models : \n", + "nlu.load('fr.embed.albert') returns Spark NLP model_anno_obj albert_embeddings_fralbert_base\n", + "nlu.load('fr.embed.bert.cased_base') returns Spark NLP model_anno_obj bert_embeddings_base_fr_cased\n", + "nlu.load('fr.embed.bert_5lang_cased') returns Spark NLP model_anno_obj bert_embeddings_bert_base_5lang_cased\n", + "nlu.load('fr.embed.bert_base_fr_cased') returns Spark NLP model_anno_obj bert_embeddings_bert_base_fr_cased\n", + "nlu.load('fr.embed.camembert') returns Spark NLP model_anno_obj camembert_embeddings_dummy\n", + "nlu.load('fr.embed.camembert.91m_generic') returns Spark NLP model_anno_obj camembert_embeddings_generic_model_r91m\n", + "nlu.load('fr.embed.camembert.adverse_drug_event_generic') returns Spark NLP model_anno_obj camembert_embeddings_adeimousa_generic_model\n", + "nlu.load('fr.embed.camembert.base') returns Spark NLP model_anno_obj camembert_embeddings_dataikunlp_camembert_base\n", + "nlu.load('fr.embed.camembert.by_ebtihal') returns Spark NLP model_anno_obj camembert_embeddings_arbertmo\n", + "nlu.load('fr.embed.camembert.by_ghani_25') returns Spark NLP model_anno_obj camembert_embeddings_summfinfr\n", + "nlu.load('fr.embed.camembert.by_hueynemud') returns Spark NLP model_anno_obj camembert_embeddings_das22_10_camembert_pretrained\n", + "nlu.load('fr.embed.camembert.by_jodsa') returns Spark NLP model_anno_obj camembert_embeddings_camembert_mlm\n", + "nlu.load('fr.embed.camembert.distilled_base') returns Spark NLP model_anno_obj camembert_embeddings_distilcamembert_base\n", + "nlu.load('fr.embed.camembert.generic') returns Spark NLP model_anno_obj camembert_embeddings_doyyingface_generic_model\n", + "nlu.load('fr.embed.camembert.generic.by_adam1224') returns Spark NLP model_anno_obj camembert_embeddings_adam1224_generic_model\n", + "nlu.load('fr.embed.camembert.generic.by_aliasdasd') returns Spark NLP model_anno_obj camembert_embeddings_aliasdasd_generic_model\n", + "nlu.load('fr.embed.camembert.generic.by_ankitkupadhyay') returns Spark NLP model_anno_obj camembert_embeddings_ankitkupadhyay_generic_model\n", + "nlu.load('fr.embed.camembert.generic.by_codingjacob') returns Spark NLP model_anno_obj camembert_embeddings_codingjacob_generic_model\n", + "nlu.load('fr.embed.camembert.generic.by_cylee') returns Spark NLP model_anno_obj camembert_embeddings_cylee_generic_model\n", + "nlu.load('fr.embed.camembert.generic.by_devtrent') returns Spark NLP model_anno_obj camembert_embeddings_devtrent_generic_model\n", + "nlu.load('fr.embed.camembert.generic.by_dianeshan') returns Spark NLP model_anno_obj camembert_embeddings_dianeshan_generic_model\n", + "nlu.load('fr.embed.camembert.generic.by_edge2992') returns Spark NLP model_anno_obj camembert_embeddings_edge2992_generic_model\n", + "nlu.load('fr.embed.camembert.generic.by_eduardopds') returns Spark NLP model_anno_obj camembert_embeddings_eduardopds_generic_model\n", + "nlu.load('fr.embed.camembert.generic.by_elliotsmith') returns Spark NLP model_anno_obj camembert_embeddings_elliotsmith_generic_model\n", + "nlu.load('fr.embed.camembert.generic.by_elusive_magnolia') returns Spark NLP model_anno_obj camembert_embeddings_elusive_magnolia_generic_model\n", + "nlu.load('fr.embed.camembert.generic.by_ericchchiu') returns Spark NLP model_anno_obj camembert_embeddings_ericchchiu_generic_model\n", + "nlu.load('fr.embed.camembert.generic.by_fjluque') returns Spark NLP model_anno_obj camembert_embeddings_fjluque_generic_model\n", + "nlu.load('fr.embed.camembert.generic.by_gulabpatel') returns Spark NLP model_anno_obj camembert_embeddings_new_generic_model\n", + "nlu.load('fr.embed.camembert.generic.by_h4d35') returns Spark NLP model_anno_obj camembert_embeddings_h4d35_generic_model\n", + "nlu.load('fr.embed.camembert.generic.by_hackertec') returns Spark NLP model_anno_obj camembert_embeddings_generic2\n", + "nlu.load('fr.embed.camembert.generic.by_hasanmurad') returns Spark NLP model_anno_obj camembert_embeddings_hasanmurad_generic_model\n", + "nlu.load('fr.embed.camembert.generic.by_hasanmuradbuet') returns Spark NLP model_anno_obj camembert_embeddings_hasanmuradbuet_generic_model\n", + "nlu.load('fr.embed.camembert.generic.by_henrywang') returns Spark NLP model_anno_obj camembert_embeddings_henrywang_generic_model\n", + "nlu.load('fr.embed.camembert.generic.by_jcai1') returns Spark NLP model_anno_obj camembert_embeddings_jcai1_generic_model\n", + "nlu.load('fr.embed.camembert.generic.by_joe8zhang') returns Spark NLP model_anno_obj camembert_embeddings_joe8zhang_generic_model\n", + "nlu.load('fr.embed.camembert.generic.by_jonathansum') returns Spark NLP model_anno_obj camembert_embeddings_jonathansum_generic_model\n", + "nlu.load('fr.embed.camembert.generic.by_juliencarbonnell') returns Spark NLP model_anno_obj camembert_embeddings_juliencarbonnell_generic_model\n", + "nlu.load('fr.embed.camembert.generic.by_katrin_kc') returns Spark NLP model_anno_obj camembert_embeddings_katrin_kc_generic_model\n", + "nlu.load('fr.embed.camembert.generic.by_katster') returns Spark NLP model_anno_obj camembert_embeddings_katster_generic_model\n", + "nlu.load('fr.embed.camembert.generic.by_kaushikacharya') returns Spark NLP model_anno_obj camembert_embeddings_kaushikacharya_generic_model\n", + "nlu.load('fr.embed.camembert.generic.by_leisa') returns Spark NLP model_anno_obj camembert_embeddings_leisa_generic_model\n", + "nlu.load('fr.embed.camembert.generic.by_lewtun') returns Spark NLP model_anno_obj camembert_embeddings_lewtun_generic_model\n", + "nlu.load('fr.embed.camembert.generic.by_lijingxin') returns Spark NLP model_anno_obj camembert_embeddings_lijingxin_generic_model\n", + "nlu.load('fr.embed.camembert.generic.by_linyi') returns Spark NLP model_anno_obj camembert_embeddings_linyi_generic_model\n", + "nlu.load('fr.embed.camembert.generic.by_mbateman') returns Spark NLP model_anno_obj camembert_embeddings_mbateman_generic_model\n", + "nlu.load('fr.embed.camembert.generic.by_mohammadrea76') returns Spark NLP model_anno_obj camembert_embeddings_mohammadrea76_generic_model\n", + "nlu.load('fr.embed.camembert.generic.by_myx4567') returns Spark NLP model_anno_obj camembert_embeddings_myx4567_generic_model\n", + "nlu.load('fr.embed.camembert.generic.by_osanseviero') returns Spark NLP model_anno_obj camembert_embeddings_generic_model_test\n", + "nlu.load('fr.embed.camembert.generic.by_peterhsu') returns Spark NLP model_anno_obj camembert_embeddings_peterhsu_generic_model\n", + "nlu.load('fr.embed.camembert.generic.by_pgperrone') returns Spark NLP model_anno_obj camembert_embeddings_pgperrone_generic_model\n", + "nlu.load('fr.embed.camembert.generic.by_safik') returns Spark NLP model_anno_obj camembert_embeddings_safik_generic_model\n", + "nlu.load('fr.embed.camembert.generic.by_sebu') returns Spark NLP model_anno_obj camembert_embeddings_sebu_generic_model\n", + "nlu.load('fr.embed.camembert.generic.by_seyfullah') returns Spark NLP model_anno_obj camembert_embeddings_seyfullah_generic_model\n", + "nlu.load('fr.embed.camembert.generic.by_sonny') returns Spark NLP model_anno_obj camembert_embeddings_sonny_generic_model\n", + "nlu.load('fr.embed.camembert.generic.by_tnagata') returns Spark NLP model_anno_obj camembert_embeddings_tnagata_generic_model\n", + "nlu.load('fr.embed.camembert.generic.by_tpanza') returns Spark NLP model_anno_obj camembert_embeddings_tpanza_generic_model\n", + "nlu.load('fr.embed.camembert.generic.by_wangst') returns Spark NLP model_anno_obj camembert_embeddings_wangst_generic_model\n", + "nlu.load('fr.embed.camembert.generic.by_weipeng') returns Spark NLP model_anno_obj camembert_embeddings_weipeng_generic_model\n", + "nlu.load('fr.embed.camembert.generic.by_xkang') returns Spark NLP model_anno_obj camembert_embeddings_xkang_generic_model\n", + "nlu.load('fr.embed.camembert.generic.by_yancong') returns Spark NLP model_anno_obj camembert_embeddings_yancong_generic_model\n", + "nlu.load('fr.embed.camembert.generic.by_ysharma') returns Spark NLP model_anno_obj camembert_embeddings_ysharma_generic_model_2\n", + "nlu.load('fr.embed.camembert.generic.by_zhenghuabin') returns Spark NLP model_anno_obj camembert_embeddings_zhenghuabin_generic_model\n", + "nlu.load('fr.embed.camembert.generic_v2.by_fjluque') returns Spark NLP model_anno_obj camembert_embeddings_fjluque_generic_model2\n", + "nlu.load('fr.embed.camembert.generic_v2.by_hackertec') returns Spark NLP model_anno_obj camembert_embeddings_hackertec_generic\n", + "nlu.load('fr.embed.camembert.generic_v2.by_lijingxin') returns Spark NLP model_anno_obj camembert_embeddings_lijingxin_generic_model_2\n", + "nlu.load('fr.embed.camembert.generic_v2.by_osanseviero') returns Spark NLP model_anno_obj camembert_embeddings_osanseviero_generic_model\n", + "nlu.load('fr.embed.camembert.generic_v2.by_peterhsu') returns Spark NLP model_anno_obj camembert_embeddings_tf_generic_model\n", + "nlu.load('fr.embed.camembert.tweet.base') returns Spark NLP model_anno_obj camembert_embeddings_bertweetfr_base\n", + "nlu.load('fr.embed.camembert_base') returns Spark NLP model_anno_obj camembert_base\n", + "nlu.load('fr.embed.camembert_base_ccnet') returns Spark NLP model_anno_obj camembert_base_ccnet\n", + "nlu.load('fr.embed.camembert_ccnet4g') returns Spark NLP model_anno_obj camembert_base_ccnet_4gb\n", + "nlu.load('fr.embed.camembert_large') returns Spark NLP model_anno_obj camembert_large\n", + "nlu.load('fr.embed.camembert_oscar_4g') returns Spark NLP model_anno_obj camembert_base_oscar_4gb\n", + "nlu.load('fr.embed.camembert_wiki_4g') returns Spark NLP model_anno_obj camembert_base_wikipedia_4gb\n", + "nlu.load('fr.embed.distilbert') returns Spark NLP model_anno_obj distilbert_embeddings_distilbert_base_fr_cased\n", + "nlu.load('fr.embed.electra.cased_base') returns Spark NLP model_anno_obj electra_embeddings_electra_base_french_europeana_cased_generator\n", + "nlu.load('fr.embed.french_roberta') returns Spark NLP model_anno_obj roberta_embeddings_french_roberta\n", + "nlu.load('fr.embed.roberta_base_wechsel_french') returns Spark NLP model_anno_obj roberta_embeddings_roberta_base_wechsel_french\n", + "nlu.load('fr.embed.w2v_cc_300d') returns Spark NLP model_anno_obj w2v_cc_300d\n", + "nlu.load('fr.embed.word2vec_wac_200') returns Spark NLP model_anno_obj word2vec_wac_200\n", + "nlu.load('fr.embed.word2vec_wiki_1000') returns Spark NLP model_anno_obj word2vec_wiki_1000\n", + "For language NLU provides the following Models : \n", + "nlu.load('frr.embed.w2v_cc_300d') returns Spark NLP model_anno_obj w2v_cc_300d\n", + "For language NLU provides the following Models : \n", + "nlu.load('fy.embed.bert.cased_base') returns Spark NLP model_anno_obj bert_embeddings_base_dutch_cased_frisian\n", + "nlu.load('fy.embed.w2v_cc_300d') returns Spark NLP model_anno_obj w2v_cc_300d\n", + "For language NLU provides the following Models : \n", + "nlu.load('gd.embed.w2v_cc_300d') returns Spark NLP model_anno_obj w2v_cc_300d\n", + "For language NLU provides the following Models : \n", + "nlu.load('gl.embed.roberta') returns Spark NLP model_anno_obj roberta_embeddings_robertinh\n", + "nlu.load('gl.embed.w2v_cc_300d') returns Spark NLP model_anno_obj w2v_cc_300d\n", + "For language NLU provides the following Models : \n", + "nlu.load('gom.embed.w2v_cc_300d') returns Spark NLP model_anno_obj w2v_cc_300d\n", + "For language NLU provides the following Models : \n", + "nlu.load('gu.embed.RoBERTa_hindi_guj_san') returns Spark NLP model_anno_obj roberta_embeddings_RoBERTa_hindi_guj_san\n", + "For language NLU provides the following Models : \n", + "nlu.load('gv.embed.w2v_cc_300d') returns Spark NLP model_anno_obj w2v_cc_300d\n", + "For language NLU provides the following Models : \n", + "nlu.load('ha.embed.bert.cased_multilingual_base_finetuned') returns Spark NLP model_anno_obj bert_embeddings_base_multilingual_cased_finetuned_hausa\n", + "nlu.load('ha.embed.bert.cased_multilingual_base_finetuned.by_davlan') returns Spark NLP model_anno_obj bert_embeddings_base_multilingual_cased_finetuned_swahili\n", + "nlu.load('ha.embed.xlm_roberta') returns Spark NLP model_anno_obj xlm_roberta_base_finetuned_hausa\n", + "For language NLU provides the following Models : \n", + "nlu.load('he.embed') returns Spark NLP model_anno_obj hebrew_cc_300d\n", + "nlu.load('he.embed.bert.base') returns Spark NLP model_anno_obj bert_embeddings_onlplab_aleph_base\n", + "nlu.load('he.embed.bert.legal') returns Spark NLP model_anno_obj bert_embeddings_legal_hebert\n", + "nlu.load('he.embed.bert.legal.by_avichr') returns Spark NLP model_anno_obj bert_embeddings_legal_hebert_ft\n", + "nlu.load('he.embed.cbow_300d') returns Spark NLP model_anno_obj hebrew_cc_300d\n", + "nlu.load('he.embed.glove') returns Spark NLP model_anno_obj hebrew_cc_300d\n", + "For language NLU provides the following Models : \n", + "nlu.load('hi.embed') returns Spark NLP model_anno_obj hindi_cc_300d\n", + "nlu.load('hi.embed.RoBERTa_hindi_guj_san') returns Spark NLP model_anno_obj roberta_embeddings_RoBERTa_hindi_guj_san\n", + "nlu.load('hi.embed.bert') returns Spark NLP model_anno_obj bert_embeddings_indic_transformers\n", + "nlu.load('hi.embed.bert.cased_base') returns Spark NLP model_anno_obj bert_embeddings_base_hi_cased\n", + "nlu.load('hi.embed.bert_hi_cased') returns Spark NLP model_anno_obj bert_embeddings_bert_base_hi_cased\n", + "nlu.load('hi.embed.distil_bert') returns Spark NLP model_anno_obj distilbert_embeddings_indic_transformers\n", + "nlu.load('hi.embed.distilbert_base_hi_cased') returns Spark NLP model_anno_obj distilbert_embeddings_distilbert_base_hi_cased\n", + "nlu.load('hi.embed.indic_transformers_hi_bert') returns Spark NLP model_anno_obj bert_embeddings_indic_transformers_hi_bert\n", + "nlu.load('hi.embed.indic_transformers_hi_distilbert') returns Spark NLP model_anno_obj distilbert_embeddings_indic_transformers_hi_distilbert\n", + "nlu.load('hi.embed.indic_transformers_hi_roberta') returns Spark NLP model_anno_obj roberta_embeddings_indic_transformers_hi_roberta\n", + "nlu.load('hi.embed.muril_adapted_local') returns Spark NLP model_anno_obj bert_embeddings_muril_adapted_local\n", + "nlu.load('hi.embed.roberta') returns Spark NLP model_anno_obj roberta_embeddings_hindi\n", + "nlu.load('hi.embed.roberta.by_neuralspace_reverie') returns Spark NLP model_anno_obj roberta_embeddings_indic_transformers\n", + "nlu.load('hi.embed.xlmr_roberta') returns Spark NLP model_anno_obj xlmroberta_embeddings_indic_transformers_hi_xlmroberta\n", + "For language NLU provides the following Models : \n", + "nlu.load('hif.embed.w2v_cc_300d') returns Spark NLP model_anno_obj w2v_cc_300d\n", + "For language
NLU provides the following Models : \n", + "nlu.load('hr.embed.w2v_cc_300d') returns Spark NLP model_anno_obj w2v_cc_300d\n", + "For language NLU provides the following Models : \n", + "nlu.load('hsb.embed.w2v_cc_300d') returns Spark NLP model_anno_obj w2v_cc_300d\n", + "For language NLU provides the following Models : \n", + "nlu.load('hy.embed.w2v_cc_300d') returns Spark NLP model_anno_obj w2v_cc_300d\n", + "For language NLU provides the following Models : \n", + "nlu.load('id.embed.bert.base') returns Spark NLP model_anno_obj bert_embeddings_base_indonesian_1.5g\n", + "nlu.load('id.embed.bert.base_522m') returns Spark NLP model_anno_obj bert_embeddings_base_indonesian_522m\n", + "nlu.load('id.embed.distilbert') returns Spark NLP model_anno_obj distilbert_embeddings_distilbert_base_indonesian\n", + "nlu.load('id.embed.indo_roberta_small') returns Spark NLP model_anno_obj roberta_embeddings_indo_roberta_small\n", + "nlu.load('id.embed.indonesian_roberta_base') returns Spark NLP model_anno_obj roberta_embeddings_indonesian_roberta_base\n", + "nlu.load('id.embed.indonesian_roberta_large') returns Spark NLP model_anno_obj roberta_embeddings_indonesian_roberta_large\n", + "nlu.load('id.embed.roberta.base_522m') returns Spark NLP model_anno_obj roberta_embeddings_base_indonesian_522m\n", + "nlu.load('id.embed.roberta.small') returns Spark NLP model_anno_obj roberta_embeddings_indo_small\n", + "nlu.load('id.embed.roberta_base_indonesian_522M') returns Spark NLP model_anno_obj roberta_embeddings_roberta_base_indonesian_522M\n", + "For language NLU provides the following Models : \n", + "nlu.load('ig.embed.xlm_roberta') returns Spark NLP model_anno_obj xlm_roberta_base_finetuned_igbo\n", + "For language NLU provides the following Models : \n", + "nlu.load('it.embed.BERTino') returns Spark NLP model_anno_obj distilbert_embeddings_BERTino\n", + "nlu.load('it.embed.bert') returns Spark NLP model_anno_obj bert_base_italian_cased\n", + "nlu.load('it.embed.bert.cased_base') returns Spark NLP model_anno_obj bert_embeddings_base_it_cased\n", + "nlu.load('it.embed.bert.cased_base.by_dbmdz') returns Spark NLP model_anno_obj bert_embeddings_base_italian_cased\n", + "nlu.load('it.embed.bert.cased_xxl_base') returns Spark NLP model_anno_obj bert_embeddings_base_italian_xxl_cased\n", + "nlu.load('it.embed.bert.uncased') returns Spark NLP model_anno_obj bert_base_italian_uncased\n", + "nlu.load('it.embed.bert.uncased_base') returns Spark NLP model_anno_obj bert_embeddings_base_italian_uncased\n", + "nlu.load('it.embed.bert.uncased_xxl_base') returns Spark NLP model_anno_obj bert_embeddings_base_italian_xxl_uncased\n", + "nlu.load('it.embed.bert_base_italian_xxl_cased') returns Spark NLP model_anno_obj bert_embeddings_bert_base_italian_xxl_cased\n", + "nlu.load('it.embed.bert_base_italian_xxl_uncased') returns Spark NLP model_anno_obj bert_embeddings_bert_base_italian_xxl_uncased\n", + "nlu.load('it.embed.bert_it_cased') returns Spark NLP model_anno_obj bert_embeddings_bert_base_it_cased\n", + "nlu.load('it.embed.camembert.cased') returns Spark NLP model_anno_obj camembert_embeddings_umberto_commoncrawl_cased_v1\n", + "nlu.load('it.embed.camembert.uncased') returns Spark NLP model_anno_obj camembert_embeddings_umberto_wikipedia_uncased_v1\n", + "nlu.load('it.embed.chefberto_italian_cased') returns Spark NLP model_anno_obj bert_embeddings_chefberto_italian_cased\n", + "nlu.load('it.embed.distil_bert') returns Spark NLP model_anno_obj distilbert_embeddings_bertino\n", + "nlu.load('it.embed.distilbert_base_it_cased') returns Spark NLP model_anno_obj distilbert_embeddings_distilbert_base_it_cased\n", + "nlu.load('it.embed.electra.cased_xxl_base') returns Spark NLP model_anno_obj electra_embeddings_electra_base_italian_xxl_cased_generator\n", + "nlu.load('it.embed.hseBert_it_cased') returns Spark NLP model_anno_obj bert_embeddings_hseBert_it_cased\n", + "nlu.load('it.embed.wineberto_italian_cased') returns Spark NLP model_anno_obj bert_embeddings_wineberto_italian_cased\n", + "nlu.load('it.embed.word2vec') returns Spark NLP model_anno_obj w2v_cc_300d\n", + "For language NLU provides the following Models : \n", + "nlu.load('ja.embed.albert_base_japanese_v1') returns Spark NLP model_anno_obj albert_embeddings_albert_base_japanese_v1\n", + "nlu.load('ja.embed.bert.base') returns Spark NLP model_anno_obj bert_base_japanese\n", + "nlu.load('ja.embed.bert.base_whole_word_masking') returns Spark NLP model_anno_obj bert_embeddings_base_japanese_char_whole_word_masking\n", + "nlu.load('ja.embed.bert.base_whole_word_masking.by_cl_tohoku') returns Spark NLP model_anno_obj bert_embeddings_base_japanese_whole_word_masking\n", + "nlu.load('ja.embed.bert.cased_base') returns Spark NLP model_anno_obj bert_embeddings_base_ja_cased\n", + "nlu.load('ja.embed.bert.large') returns Spark NLP model_anno_obj bert_embeddings_large_japanese\n", + "nlu.load('ja.embed.bert.large.by_cl_tohoku') returns Spark NLP model_anno_obj bert_embeddings_large_japanese_char\n", + "nlu.load('ja.embed.bert.v2_base') returns Spark NLP model_anno_obj bert_embeddings_base_japanese_char_v2\n", + "nlu.load('ja.embed.bert.v2_base.by_cl_tohoku') returns Spark NLP model_anno_obj bert_embeddings_base_japanese_v2\n", + "nlu.load('ja.embed.bert.wiki.base.by_cl_tohoku') returns Spark NLP model_anno_obj bert_embeddings_base_japanese\n", + "nlu.load('ja.embed.bert.wiki.base_char.by_cl_tohoku') returns Spark NLP model_anno_obj bert_embeddings_base_japanese_char\n", + "nlu.load('ja.embed.bert_base_ja_cased') returns Spark NLP model_anno_obj bert_embeddings_bert_base_ja_cased\n", + "nlu.load('ja.embed.bert_base_japanese_basic_char_v2') returns Spark NLP model_anno_obj bert_embeddings_bert_base_japanese_basic_char_v2\n", + "nlu.load('ja.embed.bert_base_japanese_char') returns Spark NLP model_anno_obj bert_embeddings_bert_base_japanese_char\n", + "nlu.load('ja.embed.bert_base_japanese_char_extended') returns Spark NLP model_anno_obj bert_embeddings_bert_base_japanese_char_extended\n", + "nlu.load('ja.embed.bert_base_japanese_char_v2') returns Spark NLP model_anno_obj bert_embeddings_bert_base_japanese_char_v2\n", + "nlu.load('ja.embed.bert_base_japanese_char_whole_word_masking') returns Spark NLP model_anno_obj bert_embeddings_bert_base_japanese_char_whole_word_masking\n", + "nlu.load('ja.embed.bert_base_japanese_v2') returns Spark NLP model_anno_obj bert_embeddings_bert_base_japanese_v2\n", + "nlu.load('ja.embed.bert_base_japanese_whole_word_masking') returns Spark NLP model_anno_obj bert_embeddings_bert_base_japanese_whole_word_masking\n", + "nlu.load('ja.embed.bert_large_japanese') returns Spark NLP model_anno_obj bert_embeddings_bert_large_japanese\n", + "nlu.load('ja.embed.bert_large_japanese_char') returns Spark NLP model_anno_obj bert_embeddings_bert_large_japanese_char\n", + "nlu.load('ja.embed.bert_large_japanese_char_extended') returns Spark NLP model_anno_obj bert_embeddings_bert_large_japanese_char_extended\n", + "nlu.load('ja.embed.bert_small_japanese') returns Spark NLP model_anno_obj bert_embeddings_bert_small_japanese\n", + "nlu.load('ja.embed.bert_small_japanese_fin') returns Spark NLP model_anno_obj bert_embeddings_bert_small_japanese_fin\n", + "nlu.load('ja.embed.distilbert_base_ja_cased') returns Spark NLP model_anno_obj distilbert_embeddings_distilbert_base_ja_cased\n", + "nlu.load('ja.embed.electra.base') returns Spark NLP model_anno_obj electra_embeddings_electra_base_japanese_generator\n", + "nlu.load('ja.embed.electra.small') returns Spark NLP model_anno_obj electra_embeddings_electra_small_japanese_fin_generator\n", + "nlu.load('ja.embed.electra.small.by_cinnamon') returns Spark NLP model_anno_obj electra_embeddings_electra_small_japanese_generator\n", + "nlu.load('ja.embed.electra.small_paper_japanese_fin_generator.small.by_izumi_lab') returns Spark NLP model_anno_obj electra_embeddings_electra_small_paper_japanese_fin_generator\n", + "nlu.load('ja.embed.electra.small_paper_japanese_generator.small.by_izumi_lab') returns Spark NLP model_anno_obj electra_embeddings_electra_small_paper_japanese_generator\n", + "nlu.load('ja.embed.glove.cc_300d') returns Spark NLP model_anno_obj japanese_cc_300d\n", + "For language NLU provides the following Models : \n", + "nlu.load('jv.embed.bert.imdb_javanese.small') returns Spark NLP model_anno_obj bert_embeddings_javanese_small_imdb\n", + "nlu.load('jv.embed.bert.small') returns Spark NLP model_anno_obj bert_embeddings_javanese_small\n", + "nlu.load('jv.embed.distil_bert.imdb_javanese.small') returns Spark NLP model_anno_obj distilbert_embeddings_javanese_small_imdb\n", + "nlu.load('jv.embed.distil_bert.small') returns Spark NLP model_anno_obj distilbert_embeddings_javanese_small\n", + "nlu.load('jv.embed.distilbert') returns Spark NLP model_anno_obj distilbert_embeddings_javanese_distilbert_small\n", + "nlu.load('jv.embed.javanese_bert_small') returns Spark NLP model_anno_obj bert_embeddings_javanese_bert_small\n", + "nlu.load('jv.embed.javanese_bert_small_imdb') returns Spark NLP model_anno_obj bert_embeddings_javanese_bert_small_imdb\n", + "nlu.load('jv.embed.javanese_distilbert_small_imdb') returns Spark NLP model_anno_obj distilbert_embeddings_javanese_distilbert_small_imdb\n", + "nlu.load('jv.embed.javanese_roberta_small') returns Spark NLP model_anno_obj roberta_embeddings_javanese_roberta_small\n", + "nlu.load('jv.embed.javanese_roberta_small_imdb') returns Spark NLP model_anno_obj roberta_embeddings_javanese_roberta_small_imdb\n", + "nlu.load('jv.embed.roberta.imdb_javanese.small') returns Spark NLP model_anno_obj roberta_embeddings_javanese_small_imdb\n", + "nlu.load('jv.embed.roberta.small') returns Spark NLP model_anno_obj roberta_embeddings_javanese_small\n", + "For language NLU provides the following Models : \n", + "nlu.load('ka.embed.w2v_cc_300d') returns Spark NLP model_anno_obj w2v_cc_300d\n", + "For language NLU provides the following Models : \n", + "nlu.load('kn.embed.KNUBert') returns Spark NLP model_anno_obj roberta_embeddings_KNUBert\n", + "nlu.load('kn.embed.KanBERTo') returns Spark NLP model_anno_obj roberta_embeddings_KanBERTo\n", + "For language NLU provides the following Models : \n", + "nlu.load('ko.embed.KR_FinBert') returns Spark NLP model_anno_obj bert_embeddings_KR_FinBert\n", + "nlu.load('ko.embed.bert') returns Spark NLP model_anno_obj bert_embeddings_bert_base\n", + "nlu.load('ko.embed.bert.base') returns Spark NLP model_anno_obj bert_embeddings_kor_base\n", + "nlu.load('ko.embed.bert_base_v1_sports') returns Spark NLP model_anno_obj bert_embeddings_bert_base_v1_sports\n", + "nlu.load('ko.embed.bert_kor_base') returns Spark NLP model_anno_obj bert_embeddings_bert_kor_base\n", + "nlu.load('ko.embed.dbert') returns Spark NLP model_anno_obj bert_embeddings_dbert\n", + "nlu.load('ko.embed.electra') returns Spark NLP model_anno_obj electra_embeddings_kr_electra_generator\n", + "nlu.load('ko.embed.electra.base') returns Spark NLP model_anno_obj electra_embeddings_finance_koelectra_base_generator\n", + "nlu.load('ko.embed.electra.by_deeq') returns Spark NLP model_anno_obj electra_embeddings_delectra_generator\n", + "nlu.load('ko.embed.electra.small') returns Spark NLP model_anno_obj electra_embeddings_finance_koelectra_small_generator\n", + "nlu.load('ko.embed.electra.small.by_monologg') returns Spark NLP model_anno_obj electra_embeddings_koelectra_small_generator\n", + "nlu.load('ko.embed.electra.v2_base') returns Spark NLP model_anno_obj electra_embeddings_koelectra_base_v2_generator\n", + "nlu.load('ko.embed.koelelectra.base.by_monologg') returns Spark NLP model_anno_obj electra_embeddings_koelectra_base_generator\n", + "nlu.load('ko.embed.koelelectra.base_v3.by_monologg') returns Spark NLP model_anno_obj electra_embeddings_koelectra_base_v3_generator\n", + "nlu.load('ko.embed.roberta_ko_small') returns Spark NLP model_anno_obj roberta_embeddings_roberta_ko_small\n", + "For language NLU provides the following Models : \n", + "nlu.load('la.embed.bert') returns Spark NLP model_anno_obj bert_embeddings_cicero_similis\n", + "For language NLU provides the following Models : \n", + "nlu.load('lb.embed.w2v_cc_300d') returns Spark NLP model_anno_obj w2v_cc_300d\n", + "For language NLU provides the following Models : \n", + "nlu.load('lg.embed.xlm_roberta') returns Spark NLP model_anno_obj xlm_roberta_base_finetuned_luganda\n", + "For language NLU provides the following Models : \n", + "nlu.load('lmo.embed.w2v_cc_300d') returns Spark NLP model_anno_obj w2v_cc_300d\n", + "For language NLU provides the following Models : \n", + "nlu.load('lou.embed.xlm_roberta') returns Spark NLP model_anno_obj xlm_roberta_base_finetuned_luo\n", + "For language NLU provides the following Models : \n", + "nlu.load('lt.embed.bert.cased_base') returns Spark NLP model_anno_obj bert_embeddings_base_lt_cased\n", + "nlu.load('lt.embed.w2v_cc_300d') returns Spark NLP model_anno_obj w2v_cc_300d\n", + "For language NLU provides the following Models : \n", + "nlu.load('lu.embed.bert.medium') returns Spark NLP model_anno_obj bert_embeddings_medium_luxembourgish\n", + "For language NLU provides the following Models : \n", + "nlu.load('mai.embed.w2v_cc_300d') returns Spark NLP model_anno_obj w2v_cc_300d\n", + "For language NLU provides the following Models : \n", + "nlu.load('mg.embed.w2v_cc_300d') returns Spark NLP model_anno_obj w2v_cc_300d\n", + "For language NLU provides the following Models : \n", + "nlu.load('min.embed.w2v_cc_300d') returns Spark NLP model_anno_obj w2v_cc_300d\n", + "For language NLU provides the following Models : \n", + "nlu.load('mk.embed.w2v_cc_300d') returns Spark NLP model_anno_obj w2v_cc_300d\n", + "For language NLU provides the following Models : \n", + "nlu.load('ml.embed.w2v_cc_300d') returns Spark NLP model_anno_obj w2v_cc_300d\n", + "For language NLU provides the following Models : \n", + "nlu.load('mn.embed.w2v_cc_300d') returns Spark NLP model_anno_obj w2v_cc_300d\n", + "For language NLU provides the following Models : \n", + "nlu.load('mr.embed.albert') returns Spark NLP model_anno_obj albert_embeddings_marathi_albert\n", + "nlu.load('mr.embed.albert_v2') returns Spark NLP model_anno_obj albert_embeddings_marathi_albert_v2\n", + "nlu.load('mr.embed.distil_bert') returns Spark NLP model_anno_obj distilbert_embeddings_marathi\n", + "nlu.load('mr.embed.distilbert') returns Spark NLP model_anno_obj distilbert_embeddings_marathi_distilbert\n", + "nlu.load('mr.embed.marathi_bert') returns Spark NLP model_anno_obj bert_embeddings_marathi_bert\n", + "nlu.load('mr.embed.muril_adapted_local') returns Spark NLP model_anno_obj bert_embeddings_muril_adapted_local\n", + "nlu.load('mr.embed.xlmr_roberta') returns Spark NLP model_anno_obj xlmroberta_embeddings_marathi_roberta\n", + "For language NLU provides the following Models : \n", + "nlu.load('ms.embed.albert') returns Spark NLP model_anno_obj albert_embeddings_albert_large_bahasa_cased\n", + "nlu.load('ms.embed.albert_base_bahasa_cased') returns Spark NLP model_anno_obj albert_embeddings_albert_base_bahasa_cased\n", + "nlu.load('ms.embed.albert_tiny_bahasa_cased') returns Spark NLP model_anno_obj albert_embeddings_albert_tiny_bahasa_cased\n", + "nlu.load('ms.embed.bert') returns Spark NLP model_anno_obj bert_embeddings_melayubert\n", + "nlu.load('ms.embed.distil_bert.small') returns Spark NLP model_anno_obj distilbert_embeddings_malaysian_small\n", + "nlu.load('ms.embed.distilbert') returns Spark NLP model_anno_obj distilbert_embeddings_malaysian_distilbert_small\n", + "nlu.load('ms.embed.w2v_cc_300d') returns Spark NLP model_anno_obj w2v_cc_300d\n", + "For language NLU provides the following Models : \n", + "nlu.load('mt.embed.camembert') returns Spark NLP model_anno_obj camembert_embeddings_camembert_aux_amandes\n", + "nlu.load('mt.embed.w2v_cc_300d') returns Spark NLP model_anno_obj w2v_cc_300d\n", + "For language NLU provides the following Models : \n", + "nlu.load('mwl.embed.w2v_cc_300d') returns Spark NLP model_anno_obj w2v_cc_300d\n", + "For language NLU provides the following Models : \n", + "nlu.load('my.embed.w2v_cc_300d') returns Spark NLP model_anno_obj w2v_cc_300d\n", + "For language NLU provides the following Models : \n", + "nlu.load('myv.embed.w2v_cc_300d') returns Spark NLP model_anno_obj w2v_cc_300d\n", + "For language NLU provides the following Models : \n", + "nlu.load('mzn.embed.w2v_cc_300d') returns Spark NLP model_anno_obj w2v_cc_300d\n", + "For language NLU provides the following Models : \n", + "nlu.load('nah.embed.w2v_cc_300d') returns Spark NLP model_anno_obj w2v_cc_300d\n", + "For language NLU provides the following Models : \n", + "nlu.load('nap.embed.w2v_cc_300d') returns Spark NLP model_anno_obj w2v_cc_300d\n", + "For language NLU provides the following Models : \n", + "nlu.load('nds.embed.w2v_cc_300d') returns Spark NLP model_anno_obj w2v_cc_300d\n", + "For language NLU provides the following Models : \n", + "nlu.load('ne.embed.w2v_cc_300d') returns Spark NLP model_anno_obj w2v_cc_300d\n", + "For language NLU provides the following Models : \n", + "nlu.load('new.embed.w2v_cc_300d') returns Spark NLP model_anno_obj w2v_cc_300d\n", + "For language NLU provides the following Models : \n", + "nlu.load('nl.embed') returns Spark NLP model_anno_obj dutch_cc_300d\n", + "nlu.load('nl.embed.bert') returns Spark NLP model_anno_obj bert_base_dutch_cased\n", + "nlu.load('nl.embed.bert.base_cased') returns Spark NLP model_anno_obj bert_base_cased\n", + "nlu.load('nl.embed.bert.cased_base') returns Spark NLP model_anno_obj bert_embeddings_base_dutch_cased\n", + "nlu.load('nl.embed.bert.cased_base.by_geotrend') returns Spark NLP model_anno_obj bert_embeddings_base_nl_cased\n", + "nlu.load('nl.embed.distilbert_base_cased') returns Spark NLP model_anno_obj distilbert_embeddings_distilbert_base_nl_cased\n", + "nlu.load('nl.embed.robbert_v2_dutch_base') returns Spark NLP model_anno_obj roberta_embeddings_robbert_v2_dutch_base\n", + "nlu.load('nl.embed.robbertje_1_gb_bort') returns Spark NLP model_anno_obj roberta_embeddings_robbertje_1_gb_bort\n", + "nlu.load('nl.embed.robbertje_1_gb_merged') returns Spark NLP model_anno_obj roberta_embeddings_robbertje_1_gb_merged\n", + "nlu.load('nl.embed.robbertje_1_gb_non_shuffled') returns Spark NLP model_anno_obj roberta_embeddings_robbertje_1_gb_non_shuffled\n", + "nlu.load('nl.embed.robbertje_1_gb_shuffled') returns Spark NLP model_anno_obj roberta_embeddings_robbertje_1_gb_shuffled\n", + "nlu.load('nl.embed.roberta') returns Spark NLP model_anno_obj roberta_embeddings_medroberta.nl\n", + "nlu.load('nl.embed.roberta.conll.v2_base') returns Spark NLP model_anno_obj roberta_embeddings_pdelobelle_robbert_v2_dutch_base\n", + "nlu.load('nl.embed.w2v_cc_300d') returns Spark NLP model_anno_obj w2v_cc_300d\n", + "For language NLU provides the following Models : \n", + "nlu.load('nn.embed.w2v_cc_300d') returns Spark NLP model_anno_obj w2v_cc_300d\n", + "For language NLU provides the following Models : \n", + "nlu.load('no.embed.bert') returns Spark NLP model_anno_obj bert_embeddings_norbert\n", + "nlu.load('no.embed.bert.by_ltgoslo') returns Spark NLP model_anno_obj bert_embeddings_norbert2\n", + "nlu.load('no.embed.bert.cased_base') returns Spark NLP model_anno_obj bert_embeddings_base_no_cased\n", + "nlu.load('no.embed.w2v_cc_300d') returns Spark NLP model_anno_obj w2v_cc_300d\n", + "For language NLU provides the following Models : \n", + "nlu.load('nso.embed.w2v_cc_300d') returns Spark NLP model_anno_obj w2v_cc_300d\n", + "For language NLU provides the following Models : \n", + "nlu.load('oc.embed.w2v_cc_300d') returns Spark NLP model_anno_obj w2v_cc_300d\n", + "For language NLU provides the following Models : \n", + "nlu.load('or.embed.w2v_cc_300d') returns Spark NLP model_anno_obj w2v_cc_300d\n", + "For language NLU provides the following Models : \n", + "nlu.load('os.embed.w2v_cc_300d') returns Spark NLP model_anno_obj w2v_cc_300d\n", + "For language NLU provides the following Models : \n", + "nlu.load('pa.embed.muril_adapted_local') returns Spark NLP model_anno_obj bert_embeddings_muril_adapted_local\n", + "nlu.load('pa.embed.w2v_cc_300d') returns Spark NLP model_anno_obj w2v_cc_300d\n", + "For language NLU provides the following Models : \n", + "nlu.load('pcm.embed.xlm_roberta') returns Spark NLP model_anno_obj xlm_roberta_base_finetuned_naija\n", + "For language NLU provides the following Models : \n", + "nlu.load('pfl.embed.w2v_cc_300d') returns Spark NLP model_anno_obj w2v_cc_300d\n", + "For language NLU provides the following Models : \n", + "nlu.load('pl.embed.bert.cased_base') returns Spark NLP model_anno_obj bert_embeddings_base_pl_cased\n", + "nlu.load('pl.embed.distilbert_base_cased') returns Spark NLP model_anno_obj distilbert_embeddings_distilbert_base_pl_cased\n", + "nlu.load('pl.embed.w2v_cc_300d') returns Spark NLP model_anno_obj w2v_cc_300d\n", + "For language NLU provides the following Models : \n", + "nlu.load('pms.embed.w2v_cc_300d') returns Spark NLP model_anno_obj w2v_cc_300d\n", + "For language NLU provides the following Models : \n", + "nlu.load('pnb.embed.w2v_cc_300d') returns Spark NLP model_anno_obj w2v_cc_300d\n", + "For language NLU provides the following Models : \n", + "nlu.load('ps.embed.w2v_cc_300d') returns Spark NLP model_anno_obj w2v_cc_300d\n", + "For language NLU provides the following Models : \n", + "nlu.load('pt.embed.BR_BERTo') returns Spark NLP model_anno_obj roberta_embeddings_BR_BERTo\n", + "nlu.load('pt.embed.bert.cased_base') returns Spark NLP model_anno_obj bert_embeddings_base_portuguese_cased\n", + "nlu.load('pt.embed.bert.cased_base.by_geotrend') returns Spark NLP model_anno_obj bert_embeddings_base_pt_cased\n", + "nlu.load('pt.embed.bert_base_cased_pt_lenerbr') returns Spark NLP model_anno_obj bert_embeddings_bert_base_cased_pt_lenerbr\n", + "nlu.load('pt.embed.bert_base_gl_cased') returns Spark NLP model_anno_obj bert_embeddings_bert_base_gl_cased\n", + "nlu.load('pt.embed.bert_base_portuguese_cased') returns Spark NLP model_anno_obj bert_embeddings_bert_base_portuguese_cased\n", + "nlu.load('pt.embed.bert_base_portuguese_cased_finetuned_peticoes') returns Spark NLP model_anno_obj bert_embeddings_bert_base_portuguese_cased_finetuned_peticoes\n", + "nlu.load('pt.embed.bert_base_portuguese_cased_finetuned_tcu_acordaos') returns Spark NLP model_anno_obj bert_embeddings_bert_base_portuguese_cased_finetuned_tcu_acordaos\n", + "nlu.load('pt.embed.bert_base_pt_cased') returns Spark NLP model_anno_obj bert_embeddings_bert_base_pt_cased\n", + "nlu.load('pt.embed.bert_large_cased_pt_lenerbr') returns Spark NLP model_anno_obj bert_embeddings_bert_large_cased_pt_lenerbr\n", + "nlu.load('pt.embed.bert_large_portuguese_cased') returns Spark NLP model_anno_obj bert_embeddings_bert_large_portuguese_cased\n", + "nlu.load('pt.embed.bert_small_gl_cased') returns Spark NLP model_anno_obj bert_embeddings_bert_small_gl_cased\n", + "nlu.load('pt.embed.biobert') returns Spark NLP model_anno_obj bert_embeddings_biobertpt_all\n", + "nlu.load('pt.embed.biobert.by_pucpr') returns Spark NLP model_anno_obj bert_embeddings_biobertpt_bio\n", + "nlu.load('pt.embed.biobert.clinical.by_pucpr') returns Spark NLP model_anno_obj bert_embeddings_biobertpt_clin\n", + "nlu.load('pt.embed.distilbert_base_cased') returns Spark NLP model_anno_obj distilbert_embeddings_distilbert_base_pt_cased\n", + "nlu.load('pt.embed.gs_all') returns Spark NLP model_anno_obj biobert_embeddings_all\n", + "nlu.load('pt.embed.gs_biomedical') returns Spark NLP model_anno_obj biobert_embeddings_biomedical\n", + "nlu.load('pt.embed.gs_clinical') returns Spark NLP model_anno_obj biobert_embeddings_clinical\n", + "nlu.load('pt.embed.w2v_cc_300d') returns Spark NLP model_anno_obj w2v_cc_300d\n", + "For language NLU provides the following Models : \n", + "nlu.load('qu.embed.w2v_cc_300d') returns Spark NLP model_anno_obj w2v_cc_300d\n", + "For language NLU provides the following Models : \n", + "nlu.load('rm.embed.w2v_cc_300d') returns Spark NLP model_anno_obj w2v_cc_300d\n", + "For language NLU provides the following Models : \n", + "nlu.load('ro.embed.ALR_BERT') returns Spark NLP model_anno_obj albert_embeddings_ALR_BERT\n", + "nlu.load('ro.embed.bert.cased_base') returns Spark NLP model_anno_obj bert_base_cased\n", + "nlu.load('ro.embed.bert.cased_base.by_geotrend') returns Spark NLP model_anno_obj bert_embeddings_base_ro_cased\n", + "nlu.load('ro.embed.distilbert_base_cased') returns Spark NLP model_anno_obj distilbert_embeddings_distilbert_base_ro_cased\n", + "nlu.load('ro.embed.w2v_cc_300d') returns Spark NLP model_anno_obj w2v_cc_300d\n", + "For language NLU provides the following Models : \n", + "nlu.load('ru.embed.bert.cased_base') returns Spark NLP model_anno_obj bert_embeddings_base_ru_cased\n", + "nlu.load('ru.embed.bert_base_ru_cased') returns Spark NLP model_anno_obj bert_embeddings_bert_base_ru_cased\n", + "nlu.load('ru.embed.distilbert_base_cased') returns Spark NLP model_anno_obj distilbert_embeddings_distilbert_base_ru_cased\n", + "nlu.load('ru.embed.roberta_base_russian_v0') returns Spark NLP model_anno_obj roberta_embeddings_roberta_base_russian_v0\n", + "nlu.load('ru.embed.ruRoberta_large') returns Spark NLP model_anno_obj roberta_embeddings_ruRoberta_large\n", + "nlu.load('ru.embed.w2v_cc_300d') returns Spark NLP model_anno_obj w2v_cc_300d\n", + "For language NLU provides the following Models : \n", + "nlu.load('rw.embed.xlm_roberta') returns Spark NLP model_anno_obj xlm_roberta_base_finetuned_kinyarwanda\n", + "For language NLU provides the following Models : \n", + "nlu.load('sa.embed.w2v_cc_300d') returns Spark NLP model_anno_obj w2v_cc_300d\n", + "For language NLU provides the following Models : \n", + "nlu.load('sah.embed.w2v_cc_300d') returns Spark NLP model_anno_obj w2v_cc_300d\n", + "For language NLU provides the following Models : \n", + "nlu.load('sc.embed.w2v_cc_300d') returns Spark NLP model_anno_obj w2v_cc_300d\n", + "For language NLU provides the following Models : \n", + "nlu.load('scn.embed.w2v_cc_300d') returns Spark NLP model_anno_obj w2v_cc_300d\n", + "For language NLU provides the following Models : \n", + "nlu.load('sco.embed.w2v_cc_300d') returns Spark NLP model_anno_obj w2v_cc_300d\n", + "For language NLU provides the following Models : \n", + "nlu.load('sd.embed.w2v_cc_300d') returns Spark NLP model_anno_obj w2v_cc_300d\n", + "For language NLU provides the following Models : \n", + "nlu.load('sh.embed.w2v_cc_300d') returns Spark NLP model_anno_obj w2v_cc_300d\n", + "For language NLU provides the following Models : \n", + "nlu.load('si.embed.roberta') returns Spark NLP model_anno_obj roberta_embeddings_sinhalaberto\n", + "nlu.load('si.embed.w2v_cc_300d') returns Spark NLP model_anno_obj w2v_cc_300d\n", + "For language NLU provides the following Models : \n", + "nlu.load('sk.embed.bert') returns Spark NLP model_anno_obj bert_embeddings_fernet_cc\n", + "nlu.load('sk.embed.roberta') returns Spark NLP model_anno_obj roberta_embeddings_slovakbert\n", + "nlu.load('sk.embed.roberta.news.') returns Spark NLP model_anno_obj roberta_embeddings_fernet_news\n", + "nlu.load('sk.embed.w2v_cc_300d') returns Spark NLP model_anno_obj w2v_cc_300d\n", + "For language NLU provides the following Models : \n", + "nlu.load('sl.embed.camembert') returns Spark NLP model_anno_obj camembert_embeddings_sloberta\n", + "nlu.load('sl.embed.w2v_cc_300d') returns Spark NLP model_anno_obj w2v_cc_300d\n", + "For language NLU provides the following Models : \n", + "nlu.load('so.embed.w2v_cc_300d') returns Spark NLP model_anno_obj w2v_cc_300d\n", + "For language NLU provides the following Models : \n", + "nlu.load('sq.embed.w2v_cc_300d') returns Spark NLP model_anno_obj w2v_cc_300d\n", + "For language NLU provides the following Models : \n", + "nlu.load('sr.embed.w2v_cc_300d') returns Spark NLP model_anno_obj w2v_cc_300d\n", + "For language NLU provides the following Models : \n", + "nlu.load('su.embed.sundanese_roberta_base') returns Spark NLP model_anno_obj roberta_embeddings_sundanese_roberta_base\n", + "nlu.load('su.embed.w2v_cc_300d') returns Spark NLP model_anno_obj w2v_cc_300d\n", + "For language NLU provides the following Models : \n", + "nlu.load('sv.embed.bert.base_cased') returns Spark NLP model_anno_obj bert_base_cased\n", + "nlu.load('sv.embed.bert.cased_base') returns Spark NLP model_anno_obj bert_embeddings_kb_base_swedish_cased\n", + "nlu.load('sv.embed.bert.cased_base.by_kblab') returns Spark NLP model_anno_obj bert_embeddings_kblab_base_swedish_cased\n", + "nlu.load('sv.embed.bert.distilled_cased') returns Spark NLP model_anno_obj bert_embeddings_kb_distilled_cased\n", + "nlu.load('sv.embed.w2v_cc_300d') returns Spark NLP model_anno_obj w2v_cc_300d\n", + "For language NLU provides the following Models : \n", + "nlu.load('sw.embed.bert.cased_base') returns Spark NLP model_anno_obj bert_embeddings_base_sw_cased\n", + "nlu.load('sw.embed.w2v_cc_300d') returns Spark NLP model_anno_obj w2v_cc_300d\n", + "nlu.load('sw.embed.xlm_roberta') returns Spark NLP model_anno_obj xlm_roberta_base_finetuned_swahili\n", + "For language NLU provides the following Models : \n", + "nlu.load('ta.embed.muril_adapted_local') returns Spark NLP model_anno_obj bert_embeddings_muril_adapted_local\n", + "nlu.load('ta.embed.w2v_cc_300d') returns Spark NLP model_anno_obj w2v_cc_300d\n", + "For language NLU provides the following Models : \n", + "nlu.load('te.embed.bert') returns Spark NLP model_anno_obj bert_embeddings_indic_transformers\n", + "nlu.load('te.embed.distil_bert') returns Spark NLP model_anno_obj distilbert_embeddings_indic_transformers\n", + "nlu.load('te.embed.distilbert') returns Spark NLP model_anno_obj distilbert_uncased\n", + "nlu.load('te.embed.indic_transformers_te_bert') returns Spark NLP model_anno_obj bert_embeddings_indic_transformers_te_bert\n", + "nlu.load('te.embed.indic_transformers_te_roberta') returns Spark NLP model_anno_obj roberta_embeddings_indic_transformers_te_roberta\n", + "nlu.load('te.embed.muril_adapted_local') returns Spark NLP model_anno_obj bert_embeddings_muril_adapted_local\n", + "nlu.load('te.embed.roberta') returns Spark NLP model_anno_obj roberta_embeddings_indic_transformers\n", + "nlu.load('te.embed.telugu_bertu') returns Spark NLP model_anno_obj bert_embeddings_telugu_bertu\n", + "nlu.load('te.embed.w2v_cc_300d') returns Spark NLP model_anno_obj w2v_cc_300d\n", + "nlu.load('te.embed.xlmr_roberta') returns Spark NLP model_anno_obj xlmroberta_embeddings_indic_transformers_te_xlmroberta\n", + "For language NLU provides the following Models : \n", + "nlu.load('tg.embed.w2v_cc_300d') returns Spark NLP model_anno_obj w2v_cc_300d\n", + "For language NLU provides the following Models : \n", + "nlu.load('th.embed.bert.cased_base') returns Spark NLP model_anno_obj bert_embeddings_base_th_cased\n", + "nlu.load('th.embed.distilbert_base_cased') returns Spark NLP model_anno_obj distilbert_embeddings_distilbert_base_th_cased\n", + "nlu.load('th.embed.w2v_cc_300d') returns Spark NLP model_anno_obj w2v_cc_300d\n", + "For language NLU provides the following Models : \n", + "nlu.load('tk.embed.w2v_cc_300d') returns Spark NLP model_anno_obj w2v_cc_300d\n", + "For language NLU provides the following Models : \n", + "nlu.load('tl.embed.electra.cased_base') returns Spark NLP model_anno_obj electra_embeddings_electra_tagalog_base_cased_generator\n", + "nlu.load('tl.embed.electra.cased_small') returns Spark NLP model_anno_obj electra_embeddings_electra_tagalog_small_cased_generator\n", + "nlu.load('tl.embed.electra.uncased_base') returns Spark NLP model_anno_obj electra_embeddings_electra_tagalog_base_uncased_generator\n", + "nlu.load('tl.embed.electra.uncased_small') returns Spark NLP model_anno_obj electra_embeddings_electra_tagalog_small_uncased_generator\n", + "nlu.load('tl.embed.roberta.base') returns Spark NLP model_anno_obj roberta_embeddings_tagalog_base\n", + "nlu.load('tl.embed.roberta.large') returns Spark NLP model_anno_obj roberta_embeddings_tagalog_large\n", + "nlu.load('tl.embed.roberta_tagalog_base') returns Spark NLP model_anno_obj roberta_embeddings_roberta_tagalog_base\n", + "nlu.load('tl.embed.roberta_tagalog_large') returns Spark NLP model_anno_obj roberta_embeddings_roberta_tagalog_large\n", + "nlu.load('tl.embed.w2v_cc_300d') returns Spark NLP model_anno_obj w2v_cc_300d\n", + "For language NLU provides the following Models : \n", + "nlu.load('tn.embed.roberta') returns Spark NLP model_anno_obj roberta_embeddings_tswanabert\n", + "For language NLU provides the following Models : \n", + "nlu.load('tr.embed.bert') returns Spark NLP model_anno_obj bert_base_turkish_cased\n", + "nlu.load('tr.embed.bert.cased_base') returns Spark NLP model_anno_obj bert_embeddings_base_tr_cased\n", + "nlu.load('tr.embed.bert.uncased') returns Spark NLP model_anno_obj bert_base_turkish_uncased\n", + "nlu.load('tr.embed.bert_cased') returns Spark NLP model_anno_obj bert_embeddings_bert_base_tr_cased\n", + "nlu.load('tr.embed.distilbert_base_cased') returns Spark NLP model_anno_obj distilbert_embeddings_distilbert_base_tr_cased\n", + "nlu.load('tr.embed.electra.cased_base') returns Spark NLP model_anno_obj electra_embeddings_electra_base_turkish_mc4_cased_generator\n", + "nlu.load('tr.embed.electra.uncased_base') returns Spark NLP model_anno_obj electra_embeddings_electra_base_turkish_mc4_uncased_generator\n", + "nlu.load('tr.embed.w2v_cc_300d') returns Spark NLP model_anno_obj w2v_cc_300d\n", + "For language NLU provides the following Models : \n", + "nlu.load('tt.embed.w2v_cc_300d') returns Spark NLP model_anno_obj w2v_cc_300d\n", + "For language NLU provides the following Models : \n", + "nlu.load('ug.embed.w2v_cc_300d') returns Spark NLP model_anno_obj w2v_cc_300d\n", + "For language NLU provides the following Models : \n", + "nlu.load('uk.embed.bert.cased_base') returns Spark NLP model_anno_obj bert_embeddings_base_uk_cased\n", + "nlu.load('uk.embed.distilbert_base_cased') returns Spark NLP model_anno_obj distilbert_embeddings_distilbert_base_uk_cased\n", + "nlu.load('uk.embed.ukr_roberta_base') returns Spark NLP model_anno_obj roberta_embeddings_ukr_roberta_base\n", + "nlu.load('uk.embed.w2v_cc_300d') returns Spark NLP model_anno_obj w2v_cc_300d\n", + "nlu.load('uk.embed.xlmr_roberta.base') returns Spark NLP model_anno_obj xlmroberta_embeddings_xlm_roberta_base\n", + "For language NLU provides the following Models : \n", + "nlu.load('ur.embed') returns Spark NLP model_anno_obj urduvec_140M_300d\n", + "nlu.load('ur.embed.bert.cased_base') returns Spark NLP model_anno_obj bert_embeddings_base_ur_cased\n", + "nlu.load('ur.embed.bert_cased') returns Spark NLP model_anno_obj bert_embeddings_bert_base_ur_cased\n", + "nlu.load('ur.embed.distilbert_base_cased') returns Spark NLP model_anno_obj distilbert_embeddings_distilbert_base_ur_cased\n", + "nlu.load('ur.embed.glove.300d') returns Spark NLP model_anno_obj urduvec_140M_300d\n", + "nlu.load('ur.embed.muril_adapted_local') returns Spark NLP model_anno_obj bert_embeddings_muril_adapted_local\n", + "nlu.load('ur.embed.roberta_urdu_small') returns Spark NLP model_anno_obj roberta_embeddings_roberta_urdu_small\n", + "nlu.load('ur.embed.urdu_vec_140M_300d') returns Spark NLP model_anno_obj urduvec_140M_300d\n", + "nlu.load('ur.embed.w2v_cc_300d') returns Spark NLP model_anno_obj w2v_cc_300d\n", + "For language NLU provides the following Models : \n", + "nlu.load('uz.embed.w2v_cc_300d') returns Spark NLP model_anno_obj w2v_cc_300d\n", + "For language NLU provides the following Models : \n", + "nlu.load('vec.embed.w2v_cc_300d') returns Spark NLP model_anno_obj w2v_cc_300d\n", + "For language NLU provides the following Models : \n", + "nlu.load('vi.embed.bert.cased_base') returns Spark NLP model_anno_obj bert_embeddings_base_vi_cased\n", + "nlu.load('vi.embed.bert_cased') returns Spark NLP model_anno_obj bert_embeddings_bert_base_vi_cased\n", + "nlu.load('vi.embed.distilbert.cased') returns Spark NLP model_anno_obj distilbert_base_cased\n", + "nlu.load('vi.embed.w2v_cc_300d') returns Spark NLP model_anno_obj w2v_cc_300d\n", + "For language NLU provides the following Models : \n", + "nlu.load('vls.embed.w2v_cc_300d') returns Spark NLP model_anno_obj w2v_cc_300d\n", + "For language NLU provides the following Models : \n", + "nlu.load('vo.embed.w2v_cc_300d') returns Spark NLP model_anno_obj w2v_cc_300d\n", + "For language NLU provides the following Models : \n", + "nlu.load('wa.embed.w2v_cc_300d') returns Spark NLP model_anno_obj w2v_cc_300d\n", + "For language NLU provides the following Models : \n", + "nlu.load('war.embed.w2v_cc_300d') returns Spark NLP model_anno_obj w2v_cc_300d\n", + "For language NLU provides the following Models : \n", + "nlu.load('wo.embed.xlm_roberta') returns Spark NLP model_anno_obj xlm_roberta_base_finetuned_wolof\n", + "For language NLU provides the following Models : \n", + "nlu.load('xmf.embed.w2v_cc_300d') returns Spark NLP model_anno_obj w2v_cc_300d\n", + "For language NLU provides the following Models : \n", + "nlu.load('xx.embed') returns Spark NLP model_anno_obj glove_840B_300\n", + "nlu.load('xx.embed.albert.indic') returns Spark NLP model_anno_obj albert_indic\n", + "nlu.load('xx.embed.bert') returns Spark NLP model_anno_obj bert_multi_cased\n", + "nlu.load('xx.embed.bert.muril') returns Spark NLP model_anno_obj bert_muril\n", + "nlu.load('xx.embed.bert_base_multilingual_cased') returns Spark NLP model_anno_obj bert_base_multilingual_cased\n", + "nlu.load('xx.embed.bert_base_multilingual_uncased') returns Spark NLP model_anno_obj bert_base_multilingual_uncased\n", + "nlu.load('xx.embed.bert_multi_cased') returns Spark NLP model_anno_obj bert_multi_cased\n", + "nlu.load('xx.embed.distilbert') returns Spark NLP model_anno_obj distilbert_base_multilingual_cased\n", + "nlu.load('xx.embed.glove.6B_300') returns Spark NLP model_anno_obj glove_6B_300\n", + "nlu.load('xx.embed.glove.840B_300') returns Spark NLP model_anno_obj glove_840B_300\n", + "nlu.load('xx.embed.glove.glove_6B_100') returns Spark NLP model_anno_obj glove_6B_100\n", + "nlu.load('xx.embed.mdeberta_v3_base') returns Spark NLP model_anno_obj mdeberta_v3_base\n", + "nlu.load('xx.embed.xlm') returns Spark NLP model_anno_obj xlm_roberta_base\n", + "nlu.load('xx.embed.xlm.base') returns Spark NLP model_anno_obj xlm_roberta_base\n", + "nlu.load('xx.embed.xlm.twitter') returns Spark NLP model_anno_obj twitter_xlm_roberta_base\n", + "nlu.load('xx.embed.xlm_roberta_large') returns Spark NLP model_anno_obj xlm_roberta_large\n", + "nlu.load('xx.embed.xlm_roberta_xtreme_base') returns Spark NLP model_anno_obj xlm_roberta_xtreme_base\n", + "nlu.load('xx.embed.xlmr_roberta.base') returns Spark NLP model_anno_obj xlmroberta_embeddings_afriberta_base\n", + "nlu.load('xx.embed.xlmr_roberta.large') returns Spark NLP model_anno_obj xlmroberta_embeddings_afriberta_large\n", + "nlu.load('xx.embed.xlmr_roberta.large.by_hfl') returns Spark NLP model_anno_obj xlmroberta_embeddings_cino_large\n", + "nlu.load('xx.embed.xlmr_roberta.large_128d') returns Spark NLP model_anno_obj xlmroberta_embeddings_roberta_large_eng_ara_128k\n", + "nlu.load('xx.embed.xlmr_roberta.mini_lm_mini') returns Spark NLP model_anno_obj xlmroberta_embeddings_fairlex_fscs_minilm\n", + "nlu.load('xx.embed.xlmr_roberta.small') returns Spark NLP model_anno_obj xlmroberta_embeddings_afriberta_small\n", + "nlu.load('xx.embed.xlmr_roberta.v2_base') returns Spark NLP model_anno_obj xlmroberta_embeddings_cino_base_v2\n", + "nlu.load('xx.embed.xlmr_roberta.v2_large') returns Spark NLP model_anno_obj xlmroberta_embeddings_cino_large_v2\n", + "nlu.load('xx.embed.xlmr_roberta.v2_small') returns Spark NLP model_anno_obj xlmroberta_embeddings_cino_small_v2\n", + "For language NLU provides the following Models : \n", + "nlu.load('yi.embed.w2v_cc_300d') returns Spark NLP model_anno_obj w2v_cc_300d\n", + "For language NLU provides the following Models : \n", + "nlu.load('yo.embed.bert.cased_multilingual_base_finetuned') returns Spark NLP model_anno_obj bert_embeddings_base_multilingual_cased_finetuned_yoruba\n", + "nlu.load('yo.embed.w2v_cc_300d') returns Spark NLP model_anno_obj w2v_cc_300d\n", + "nlu.load('yo.embed.xlm_roberta') returns Spark NLP model_anno_obj xlm_roberta_base_finetuned_yoruba\n", + "For language NLU provides the following Models : \n", + "nlu.load('zea.embed.w2v_cc_300d') returns Spark NLP model_anno_obj w2v_cc_300d\n", + "For language NLU provides the following Models : \n", + "nlu.load('zh.embed') returns Spark NLP model_anno_obj bert_base_chinese\n", + "nlu.load('zh.embed.bert') returns Spark NLP model_anno_obj bert_base_chinese\n", + "nlu.load('zh.embed.bert.10l_128d_128d') returns Spark NLP model_anno_obj bert_embeddings_chinese_roberta_l_10_h_128\n", + "nlu.load('zh.embed.bert.10l_256d_256d') returns Spark NLP model_anno_obj bert_embeddings_chinese_roberta_l_10_h_256\n", + "nlu.load('zh.embed.bert.10l_512d_512d') returns Spark NLP model_anno_obj bert_embeddings_chinese_roberta_l_10_h_512\n", + "nlu.load('zh.embed.bert.10l_768d_768d') returns Spark NLP model_anno_obj bert_embeddings_chinese_roberta_l_10_h_768\n", + "nlu.load('zh.embed.bert.12l_128d_128d') returns Spark NLP model_anno_obj bert_embeddings_chinese_roberta_l_12_h_128\n", + "nlu.load('zh.embed.bert.12l_256d_256d') returns Spark NLP model_anno_obj bert_embeddings_chinese_roberta_l_12_h_256\n", + "nlu.load('zh.embed.bert.12l_512d_512d') returns Spark NLP model_anno_obj bert_embeddings_chinese_roberta_l_12_h_512\n", + "nlu.load('zh.embed.bert.12l_768d_768d') returns Spark NLP model_anno_obj bert_embeddings_chinese_roberta_l_12_h_768\n", + "nlu.load('zh.embed.bert.2l_128d_128d') returns Spark NLP model_anno_obj bert_embeddings_chinese_roberta_l_2_h_128\n", + "nlu.load('zh.embed.bert.2l_256d_256d') returns Spark NLP model_anno_obj bert_embeddings_chinese_roberta_l_2_h_256\n", + "nlu.load('zh.embed.bert.2l_512d_512d') returns Spark NLP model_anno_obj bert_embeddings_chinese_roberta_l_2_h_512\n", + "nlu.load('zh.embed.bert.2l_768d_768d') returns Spark NLP model_anno_obj bert_embeddings_chinese_roberta_l_2_h_768\n", + "nlu.load('zh.embed.bert.4l_128d_128d') returns Spark NLP model_anno_obj bert_embeddings_chinese_roberta_l_4_h_128\n", + "nlu.load('zh.embed.bert.4l_256d_256d') returns Spark NLP model_anno_obj bert_embeddings_chinese_roberta_l_4_h_256\n", + "nlu.load('zh.embed.bert.4l_512d_512d') returns Spark NLP model_anno_obj bert_embeddings_chinese_roberta_l_4_h_512\n", + "nlu.load('zh.embed.bert.4l_768d_768d') returns Spark NLP model_anno_obj bert_embeddings_chinese_roberta_l_4_h_768\n", + "nlu.load('zh.embed.bert.6l_128d_128d') returns Spark NLP model_anno_obj bert_embeddings_chinese_roberta_l_6_h_128\n", + "nlu.load('zh.embed.bert.6l_256d_256d') returns Spark NLP model_anno_obj bert_embeddings_chinese_roberta_l_6_h_256\n", + "nlu.load('zh.embed.bert.6l_512d_512d') returns Spark NLP model_anno_obj bert_embeddings_chinese_roberta_l_6_h_512\n", + "nlu.load('zh.embed.bert.6l_768d_768d') returns Spark NLP model_anno_obj bert_embeddings_chinese_roberta_l_6_h_768\n", + "nlu.load('zh.embed.bert.8l_128d_128d') returns Spark NLP model_anno_obj bert_embeddings_chinese_roberta_l_8_h_128\n", + "nlu.load('zh.embed.bert.8l_256d_256d') returns Spark NLP model_anno_obj bert_embeddings_chinese_roberta_l_8_h_256\n", + "nlu.load('zh.embed.bert.8l_512d_512d') returns Spark NLP model_anno_obj bert_embeddings_chinese_roberta_l_8_h_512\n", + "nlu.load('zh.embed.bert.8l_768d_768d') returns Spark NLP model_anno_obj bert_embeddings_chinese_roberta_l_8_h_768\n", + "nlu.load('zh.embed.bert.base') returns Spark NLP model_anno_obj bert_embeddings_base_chinese\n", + "nlu.load('zh.embed.bert.base.by_model_attribution_challenge') returns Spark NLP model_anno_obj bert_embeddings_model_attribution_challenge_base_chinese\n", + "nlu.load('zh.embed.bert.base.by_ptrsxu') returns Spark NLP model_anno_obj bert_embeddings_ptrsxu_base_chinese\n", + "nlu.load('zh.embed.bert.by_ptrsxu') returns Spark NLP model_anno_obj bert_embeddings_ptrsxu_chinese_wwm_ext\n", + "nlu.load('zh.embed.bert.by_qinluo') returns Spark NLP model_anno_obj bert_embeddings_wo_chinese_plus\n", + "nlu.load('zh.embed.bert.cased_base') returns Spark NLP model_anno_obj bert_embeddings_base_zh_cased\n", + "nlu.load('zh.embed.bert.chinese_wwm') returns Spark NLP model_anno_obj bert_embeddings_chinese_wwm\n", + "nlu.load('zh.embed.bert.large') returns Spark NLP model_anno_obj bert_embeddings_chinese_lert_large\n", + "nlu.load('zh.embed.bert.large.by_hfl') returns Spark NLP model_anno_obj bert_embeddings_chinese_mac_large\n", + "nlu.load('zh.embed.bert.lert.base.by_hfl') returns Spark NLP model_anno_obj bert_embeddings_chinese_lert_base\n", + "nlu.load('zh.embed.bert.mac.base.by_hfl') returns Spark NLP model_anno_obj bert_embeddings_chinese_mac_base\n", + "nlu.load('zh.embed.bert.mini') returns Spark NLP model_anno_obj bert_embeddings_minirbt_h256\n", + "nlu.load('zh.embed.bert.mini.by_hfl') returns Spark NLP model_anno_obj bert_embeddings_minirbt_h288\n", + "nlu.load('zh.embed.bert.rbt4_h312.by_hfl') returns Spark NLP model_anno_obj bert_embeddings_rbt4_h312\n", + "nlu.load('zh.embed.bert.small') returns Spark NLP model_anno_obj bert_embeddings_chinese_lert_small\n", + "nlu.load('zh.embed.bert.wwm') returns Spark NLP model_anno_obj chinese_bert_wwm\n", + "nlu.load('zh.embed.bert.wwm_ext.by_hfl') returns Spark NLP model_anno_obj bert_embeddings_hfl_chinese_wwm_ext\n", + "nlu.load('zh.embed.bert_5lang_cased') returns Spark NLP model_anno_obj bert_embeddings_bert_base_5lang_cased\n", + "nlu.load('zh.embed.bert_base_chinese_jinyong') returns Spark NLP model_anno_obj bert_embeddings_bert_base_chinese_jinyong\n", + "nlu.load('zh.embed.bert_base_zh_cased') returns Spark NLP model_anno_obj bert_embeddings_bert_base_zh_cased\n", + "nlu.load('zh.embed.bert_large_chinese') returns Spark NLP model_anno_obj bert_embeddings_bert_large_chinese\n", + "nlu.load('zh.embed.chinese_bert_wwm_ext') returns Spark NLP model_anno_obj bert_embeddings_chinese_bert_wwm_ext\n", + "nlu.load('zh.embed.chinese_macbert_base') returns Spark NLP model_anno_obj bert_embeddings_chinese_macbert_base\n", + "nlu.load('zh.embed.chinese_macbert_large') returns Spark NLP model_anno_obj bert_embeddings_chinese_macbert_large\n", + "nlu.load('zh.embed.chinese_roberta_wwm_ext') returns Spark NLP model_anno_obj bert_embeddings_chinese_roberta_wwm_ext\n", + "nlu.load('zh.embed.chinese_roberta_wwm_ext_large') returns Spark NLP model_anno_obj bert_embeddings_chinese_roberta_wwm_ext_large\n", + "nlu.load('zh.embed.chinese_roberta_wwm_large_ext_fix_mlm') returns Spark NLP model_anno_obj bert_embeddings_chinese_roberta_wwm_large_ext_fix_mlm\n", + "nlu.load('zh.embed.distilbert_base_cased') returns Spark NLP model_anno_obj distilbert_embeddings_distilbert_base_zh_cased\n", + "nlu.load('zh.embed.env_bert_chinese') returns Spark NLP model_anno_obj bert_embeddings_env_bert_chinese\n", + "nlu.load('zh.embed.jdt_fin_roberta_wwm') returns Spark NLP model_anno_obj bert_embeddings_jdt_fin_roberta_wwm\n", + "nlu.load('zh.embed.jdt_fin_roberta_wwm_large') returns Spark NLP model_anno_obj bert_embeddings_jdt_fin_roberta_wwm_large\n", + "nlu.load('zh.embed.macbert4csc_base_chinese') returns Spark NLP model_anno_obj bert_embeddings_macbert4csc_base_chinese\n", + "nlu.load('zh.embed.mengzi_bert_base') returns Spark NLP model_anno_obj bert_embeddings_mengzi_bert_base\n", + "nlu.load('zh.embed.mengzi_bert_base_fin') returns Spark NLP model_anno_obj bert_embeddings_mengzi_bert_base_fin\n", + "nlu.load('zh.embed.mengzi_oscar_base') returns Spark NLP model_anno_obj bert_embeddings_mengzi_oscar_base\n", + "nlu.load('zh.embed.mengzi_oscar_base_caption') returns Spark NLP model_anno_obj bert_embeddings_mengzi_oscar_base_caption\n", + "nlu.load('zh.embed.mengzi_oscar_base_retrieval') returns Spark NLP model_anno_obj bert_embeddings_mengzi_oscar_base_retrieval\n", + "nlu.load('zh.embed.rbt3') returns Spark NLP model_anno_obj bert_embeddings_rbt3\n", + "nlu.load('zh.embed.rbt4') returns Spark NLP model_anno_obj bert_embeddings_rbt4\n", + "nlu.load('zh.embed.rbt6') returns Spark NLP model_anno_obj bert_embeddings_rbt6\n", + "nlu.load('zh.embed.rbtl3') returns Spark NLP model_anno_obj bert_embeddings_rbtl3\n", + "nlu.load('zh.embed.roberta.wwm_ext.by_hfl') returns Spark NLP model_anno_obj bert_embeddings_hfl_chinese_roberta_wwm_ext\n", + "nlu.load('zh.embed.roberta_base_wechsel_chinese') returns Spark NLP model_anno_obj roberta_embeddings_roberta_base_wechsel_chinese\n", + "nlu.load('zh.embed.sikubert') returns Spark NLP model_anno_obj bert_embeddings_sikubert\n", + "nlu.load('zh.embed.sikuroberta') returns Spark NLP model_anno_obj bert_embeddings_sikuroberta\n", + "nlu.load('zh.embed.uer_large') returns Spark NLP model_anno_obj bert_embeddings_uer_large\n", + "nlu.load('zh.embed.w2v_cc_300d') returns Spark NLP model_anno_obj w2v_cc_300d\n", + "nlu.load('zh.embed.wobert_chinese_base') returns Spark NLP model_anno_obj bert_embeddings_wobert_chinese_base\n", + "nlu.load('zh.embed.wobert_chinese_plus') returns Spark NLP model_anno_obj bert_embeddings_wobert_chinese_plus\n", + "nlu.load('zh.embed.wobert_chinese_plus_base') returns Spark NLP model_anno_obj bert_embeddings_wobert_chinese_plus_base\n", + "nlu.load('zh.embed.xlmr_roberta.mini_lm_mini') returns Spark NLP model_anno_obj xlmroberta_embeddings_fairlex_cail_minilm\n", + "nlu.load('zh.embed.xlnet') returns Spark NLP model_anno_obj chinese_xlnet_base\n", + "For language NLU provides the following Models : \n", + "nlu.load('zu.embed.roberta') returns Spark NLP model_anno_obj roberta_embeddings_zuberta\n" + ] + } + ] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 303 + }, + "id": "Xz7xnvbCFxE3", + "outputId": "39864822-1fde-4fbf-c44c-d15e62d9707a" + }, + "source": [ + "# Add bert word embeddings to pipe\n", + "fitted_pipe = nlp.load('bert train.ner').fit(dataset_path=train_path)\n", + "\n", + "# predict with the trainable pipeline on dataset and get predictions\n", + "preds = fitted_pipe.predict('Donald Trump and Angela Merkel dont share many oppinions')\n", + "preds" + ], + "execution_count": 9, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Warning::Spark Session already created, some configs may not take.\n", + "Warning::Spark Session already created, some configs may not take.\n", + "small_bert_L2_128 download started this may take some time.\n", + "Approximate size to download 16.1 MB\n", + "[OK!]\n", + "sentence_detector_dl download started this may take some time.\n", + "Approximate size to download 354.6 KB\n", + "[OK!]\n", + "Warning::Spark Session already created, some configs may not take.\n" + ] + }, + { + "output_type": "execute_result", + "data": { + "text/plain": [ + " document entities_ner \\\n", + "0 Donald Trump and Angela Merkel dont share many... Donald Trump \n", + "0 Donald Trump and Angela Merkel dont share many... Angela Merkel dont \n", + "\n", + " entities_ner_class entities_ner_confidence entities_ner_origin_chunk \\\n", + "0 PER 0.9427 0 \n", + "0 PER 0.9236667 1 \n", + "\n", + " entities_ner_origin_sentence \\\n", + "0 0 \n", + "0 0 \n", + "\n", + " word_embedding_bert \n", + "0 [[-0.44760167598724365, 1.0348622798919678, 0.... \n", + "0 [[-0.44760167598724365, 1.0348622798919678, 0.... " + ], + "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", + "
documententities_nerentities_ner_classentities_ner_confidenceentities_ner_origin_chunkentities_ner_origin_sentenceword_embedding_bert
0Donald Trump and Angela Merkel dont share many...Donald TrumpPER0.942700[[-0.44760167598724365, 1.0348622798919678, 0....
0Donald Trump and Angela Merkel dont share many...Angela Merkel dontPER0.923666710[[-0.44760167598724365, 1.0348622798919678, 0....
\n", + "
\n", + "
\n", + "\n", + "
\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "
\n", + "\n", + "\n", + "
\n", + " \n", + "\n", + "\n", + "\n", + " \n", + "
\n", + "
\n", + "
\n" + ] + }, + "metadata": {}, + "execution_count": 9 + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "2BB-NwZUoHSe" + }, + "source": [ + "# 5. Lets save the model" + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "eLex095goHwm" + }, + "source": [ + "stored_model_path = './models/classifier_dl_trained'\n", + "fitted_pipe.save(stored_model_path)" + ], + "execution_count": 10, + "outputs": [] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "e_b2DPd4rCiU" + }, + "source": [ + "# 6. Lets load the model from HDD.\n", + "This makes Offlien NLU usage possible! \n", + "You need to call nlu.load(path=path_to_the_pipe) to load a model/pipeline from disk." + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "SO4uz45MoRgp", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 199 + }, + "outputId": "6987b2bc-9d70-4082-b8b5-915477ecb6e7" + }, + "source": [ + "hdd_pipe = nlp.load(path=stored_model_path)\n", + "\n", + "preds = hdd_pipe.predict('Donald Trump and Angela Merkel dont share many oppinions on laws about cheeseburgers')\n", + "preds" + ], + "execution_count": 11, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Warning::Spark Session already created, some configs may not take.\n", + "Warning::Spark Session already created, some configs may not take.\n", + "Warning::Spark Session already created, some configs may not take.\n" + ] + }, + { + "output_type": "execute_result", + "data": { + "text/plain": [ + " document entities_from_disk \\\n", + "0 Donald Trump and Angela Merkel dont share many... Donald Trump \n", + "0 Donald Trump and Angela Merkel dont share many... Angela Merkel dont \n", + "\n", + " entities_from_disk_class entities_from_disk_confidence \\\n", + "0 PER 0.9282 \n", + "0 PER 0.8248 \n", + "\n", + " entities_from_disk_origin_chunk entities_from_disk_origin_sentence \\\n", + "0 0 0 \n", + "0 1 0 \n", + "\n", + " word_embedding_from_disk \n", + "0 [[-0.687057375907898, 1.1118954420089722, 0.58... \n", + "0 [[-0.687057375907898, 1.1118954420089722, 0.58... " + ], + "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", + "
documententities_from_diskentities_from_disk_classentities_from_disk_confidenceentities_from_disk_origin_chunkentities_from_disk_origin_sentenceword_embedding_from_disk
0Donald Trump and Angela Merkel dont share many...Donald TrumpPER0.928200[[-0.687057375907898, 1.1118954420089722, 0.58...
0Donald Trump and Angela Merkel dont share many...Angela Merkel dontPER0.824810[[-0.687057375907898, 1.1118954420089722, 0.58...
\n", + "
\n", + "
\n", + "\n", + "
\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "
\n", + "\n", + "\n", + "
\n", + " \n", + "\n", + "\n", + "\n", + " \n", + "
\n", + "
\n", + "
\n" + ] + }, + "metadata": {}, + "execution_count": 11 + } + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "e0CVlkk9v6Qi", + "colab": { + "base_uri": "https://localhost:8080/" + }, + "outputId": "be0a118f-72a6-4cd7-9968-2f644036f4fa" + }, + "source": [ + "hdd_pipe.print_info()" + ], + "execution_count": 12, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "The following parameters are configurable for this NLU pipeline (You can copy paste the examples) :\n", + ">>> component_list['document_assembler'] has settable params:\n", + "component_list['document_assembler'].setCleanupMode('shrink') | Info: possible values: disabled, inplace, inplace_full, shrink, shrink_full, each, each_full, delete_full | Currently set to : shrink\n", + ">>> component_list['sentence_detector_dl'] has settable params:\n", + "component_list['sentence_detector_dl'].setCustomBounds([]) | Info: characters used to explicitly mark sentence bounds | Currently set to : []\n", + "component_list['sentence_detector_dl'].setExplodeSentences(False) | Info: whether to explode each sentence into a different row, for better parallelization. Defaults to false. | Currently set to : False\n", + "component_list['sentence_detector_dl'].setMaxLength(99999) | Info: Set the maximum allowed length for each sentence | Currently set to : 99999\n", + "component_list['sentence_detector_dl'].setMinLength(0) | Info: Set the minimum allowed length for each sentence. | Currently set to : 0\n", + "component_list['sentence_detector_dl'].setUseCustomBoundsOnly(False) | Info: Only utilize custom bounds in sentence detection | Currently set to : False\n", + "component_list['sentence_detector_dl'].setEngine('tensorflow') | Info: Deep Learning engine used for this model | Currently set to : tensorflow\n", + "component_list['sentence_detector_dl'].setSplitLength(2147483647) | Info: length at which sentences will be forcibly split. | Currently set to : 2147483647\n", + "component_list['sentence_detector_dl'].setStorageRef('SentenceDetectorDLModel_c83c27f46b97') | Info: storage unique identifier | Currently set to : SentenceDetectorDLModel_c83c27f46b97\n", + "component_list['sentence_detector_dl'].setEncoder(com.johnsnowlabs.nlp.annotators.sentence_detector_dl.SentenceDetectorDLEncoder@3d7fecba) | Info: Data encoder | Currently set to : com.johnsnowlabs.nlp.annotators.sentence_detector_dl.SentenceDetectorDLEncoder@3d7fecba\n", + "component_list['sentence_detector_dl'].setImpossiblePenultimates(['Bros', 'No', 'al', 'vs', 'etc', 'Fig', 'Dr', 'Prof', 'PhD', 'MD', 'Co', 'Corp', 'Inc', 'bros', 'VS', 'Vs', 'ETC', 'fig', 'dr', 'prof', 'PHD', 'phd', 'md', 'co', 'corp', 'inc', 'Jan', 'Feb', 'Mar', 'Apr', 'Jul', 'Aug', 'Sep', 'Sept', 'Oct', 'Nov', 'Dec', 'St', 'st', 'AM', 'PM', 'am', 'pm', 'e.g', 'f.e', 'i.e']) | Info: Impossible penultimates - list of strings which a sentence can't end with | Currently set to : ['Bros', 'No', 'al', 'vs', 'etc', 'Fig', 'Dr', 'Prof', 'PhD', 'MD', 'Co', 'Corp', 'Inc', 'bros', 'VS', 'Vs', 'ETC', 'fig', 'dr', 'prof', 'PHD', 'phd', 'md', 'co', 'corp', 'inc', 'Jan', 'Feb', 'Mar', 'Apr', 'Jul', 'Aug', 'Sep', 'Sept', 'Oct', 'Nov', 'Dec', 'St', 'st', 'AM', 'PM', 'am', 'pm', 'e.g', 'f.e', 'i.e']\n", + "component_list['sentence_detector_dl'].setModelArchitecture('cnn') | Info: Model architecture (CNN) | Currently set to : cnn\n", + ">>> component_list['tokenizer'] has settable params:\n", + "component_list['tokenizer'].setCaseSensitiveExceptions(True) | Info: Whether to care for case sensitiveness in exceptions | Currently set to : True\n", + "component_list['tokenizer'].setTargetPattern('\\S+') | Info: pattern to grab from text as token candidates. Defaults \\S+ | Currently set to : \\S+\n", + "component_list['tokenizer'].setMaxLength(99999) | Info: Set the maximum allowed length for each token | Currently set to : 99999\n", + "component_list['tokenizer'].setMinLength(0) | Info: Set the minimum allowed length for each token | Currently set to : 0\n", + ">>> component_list['bert_embeddings@small_bert_L2_128'] has settable params:\n", + "component_list['bert_embeddings@small_bert_L2_128'].setBatchSize(8) | Info: Size of every batch | Currently set to : 8\n", + "component_list['bert_embeddings@small_bert_L2_128'].setCaseSensitive(False) | Info: whether to ignore case in tokens for embeddings matching | Currently set to : False\n", + "component_list['bert_embeddings@small_bert_L2_128'].setDimension(128) | Info: Number of embedding dimensions | Currently set to : 128\n", + "component_list['bert_embeddings@small_bert_L2_128'].setMaxSentenceLength(128) | Info: Max sentence length to process | Currently set to : 128\n", + "component_list['bert_embeddings@small_bert_L2_128'].setEngine('tensorflow') | Info: Deep Learning engine used for this model | Currently set to : tensorflow\n", + "component_list['bert_embeddings@small_bert_L2_128'].setStorageRef('small_bert_L2_128') | Info: unique reference name for identification | Currently set to : small_bert_L2_128\n", + ">>> component_list['ner_dl@small_bert_L2_128'] has settable params:\n", + "component_list['ner_dl@small_bert_L2_128'].setBatchSize(8) | Info: Size of every batch | Currently set to : 8\n", + "component_list['ner_dl@small_bert_L2_128'].setIncludeAllConfidenceScores(False) | Info: whether to include all confidence scores in annotation metadata or just the score of the predicted tag | Currently set to : False\n", + "component_list['ner_dl@small_bert_L2_128'].setIncludeConfidence(True) | Info: whether to include confidence scores in annotation metadata | Currently set to : True\n", + "component_list['ner_dl@small_bert_L2_128'].setEngine('tensorflow') | Info: Deep Learning engine used for this model | Currently set to : tensorflow\n", + "component_list['ner_dl@small_bert_L2_128'].setClasses(['O', 'B-ORG', 'I-ORG', 'I-MISC', 'I-PER', 'B-LOC', 'B-MISC', 'I-LOC']) | Info: get the tags used to trained this NerDLModel | Currently set to : ['O', 'B-ORG', 'I-ORG', 'I-MISC', 'I-PER', 'B-LOC', 'B-MISC', 'I-LOC']\n", + "component_list['ner_dl@small_bert_L2_128'].setStorageRef('small_bert_L2_128') | Info: unique reference name for identification | Currently set to : small_bert_L2_128\n", + ">>> component_list['ner_converter'] has settable params:\n", + "component_list['ner_converter'].setNerHasNoSchema(False) | Info: set this to true if your NER tags coming from a model that does not have a IOB/IOB2 schema | Currently set to : False\n", + "component_list['ner_converter'].setPreservePosition(True) | Info: Whether to preserve the original position of the tokens in the original document or use the modified tokens | Currently set to : True\n" + ] + } + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "USD6d66Sw6_P" + }, + "source": [], + "execution_count": null, + "outputs": [] + } + ] +} \ No newline at end of file diff --git a/examples/colab/Training/part_of_speech/NLU_training_POS_demo.ipynb b/examples/colab/Training/part_of_speech/NLU_training_POS_demo.ipynb index a6a23e1a..ff85dd72 100644 --- a/examples/colab/Training/part_of_speech/NLU_training_POS_demo.ipynb +++ b/examples/colab/Training/part_of_speech/NLU_training_POS_demo.ipynb @@ -1 +1,891 @@ -{"nbformat":4,"nbformat_minor":0,"metadata":{"colab":{"name":"NLU_training_POS_demo.ipynb","provenance":[],"collapsed_sections":[]},"kernelspec":{"name":"python3","display_name":"Python 3"}},"cells":[{"cell_type":"markdown","metadata":{"id":"zkufh760uvF3"},"source":["![JohnSnowLabs](https://nlp.johnsnowlabs.com/assets/images/logo.png)\n","\n","[![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/JohnSnowLabs/nlu/blob/master/examples/colab/Training/part_of_speech/NLU_training_POS_demo.ipynb)\n","\n","\n","\n","# Training a Named Entity Recognition (POS) model with NLU \n","With the [POS tagger](https://nlp.johnsnowlabs.com/docs/en/annotators#postagger-part-of-speech-tagger) from Spark NLP you can achieve State Of the Art results on any POS problem.\n","It uses an Averaged Percetron Model approach under the hood.\n","\n","This notebook showcases the following features : \n","\n","- How to train the deep learning POS classifier\n","- How to store a pipeline to disk\n","- How to load the pipeline from disk (Enables NLU offline mode)\n","\n"]},{"cell_type":"markdown","metadata":{"id":"dur2drhW5Rvi"},"source":["# 1. Install Java 8 and NLU"]},{"cell_type":"code","metadata":{"id":"hFGnBCHavltY"},"source":["import os\n","! apt-get update -qq > /dev/null \n","# Install java\n","! apt-get install -y openjdk-8-jdk-headless -qq > /dev/null\n","os.environ[\"JAVA_HOME\"] = \"/usr/lib/jvm/java-8-openjdk-amd64\"\n","os.environ[\"PATH\"] = os.environ[\"JAVA_HOME\"] + \"/bin:\" + os.environ[\"PATH\"]\n","! pip install nlu pyspark==2.4.7 > /dev/null \n","\n","import nlu"],"execution_count":null,"outputs":[]},{"cell_type":"markdown","metadata":{"id":"IWp5LbydCkqC"},"source":[""]},{"cell_type":"markdown","metadata":{"id":"f4KkTfnR5Ugg"},"source":["# 2. Download French POS dataset"]},{"cell_type":"code","metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"OrVb5ZMvvrQD","executionInfo":{"status":"ok","timestamp":1607932039873,"user_tz":-60,"elapsed":80981,"user":{"displayName":"Christian Kasim Loan","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GjqAD-ircKP-s5Eh6JSdkDggDczfqQbJGU_IRb4Hw=s64","userId":"14469489166467359317"}},"outputId":"76f3b769-a646-444b-fdfc-d764d4b74e45"},"source":["! wget https://s3.amazonaws.com/auxdata.johnsnowlabs.com/public/resources/fr/pos/UD_French/UD_French-GSD_2.3.txt"],"execution_count":null,"outputs":[{"output_type":"stream","text":["--2020-12-14 07:47:19-- https://s3.amazonaws.com/auxdata.johnsnowlabs.com/public/resources/fr/pos/UD_French/UD_French-GSD_2.3.txt\n","Resolving s3.amazonaws.com (s3.amazonaws.com)... 52.216.143.238\n","Connecting to s3.amazonaws.com (s3.amazonaws.com)|52.216.143.238|:443... connected.\n","HTTP request sent, awaiting response... 200 OK\n","Length: 3565213 (3.4M) [text/plain]\n","Saving to: ‘UD_French-GSD_2.3.txt’\n","\n","UD_French-GSD_2.3.t 100%[===================>] 3.40M 15.8MB/s in 0.2s \n","\n","2020-12-14 07:47:19 (15.8 MB/s) - ‘UD_French-GSD_2.3.txt’ saved [3565213/3565213]\n","\n"],"name":"stdout"}]},{"cell_type":"markdown","metadata":{"id":"0296Om2C5anY"},"source":["# 3. Train Deep Learning Classifier using nlu.load('train.pos')\n","\n","You dataset label column should be named 'y' and the feature column with text data should be named 'text'"]},{"cell_type":"code","metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"3ZIPkRkWftBG","executionInfo":{"status":"ok","timestamp":1607932112061,"user_tz":-60,"elapsed":153158,"user":{"displayName":"Christian Kasim Loan","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GjqAD-ircKP-s5Eh6JSdkDggDczfqQbJGU_IRb4Hw=s64","userId":"14469489166467359317"}},"outputId":"c6032381-0446-484a-8c4e-0ad9fc500c48"},"source":["import nlu\n","# load a trainable pipeline by specifying the train. prefix and fit it on a datset with label and text columns\n","# Since there are no\n","train_path = '/content/UD_French-GSD_2.3.txt'\n","trainable_pipe = nlu.load('train.pos')\n","fitted_pipe = trainable_pipe.fit(dataset_path=train_path)\n","\n","# predict with the trainable pipeline on dataset and get predictions\n","preds = fitted_pipe.predict('Donald Trump and Angela Merkel dont share many oppinions')\n","preds"],"execution_count":null,"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"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n","
tokenpos
origin_index
0DonaldPROPN
0TrumpPROPN
0andCCONJ
0AngelaPROPN
0MerkelPROPN
0dontPRON
0shareVERB
0manyADJ
0oppinionsNOUN
\n","
"],"text/plain":[" token pos\n","origin_index \n","0 Donald PROPN\n","0 Trump PROPN\n","0 and CCONJ\n","0 Angela PROPN\n","0 Merkel PROPN\n","0 dont PRON\n","0 share VERB\n","0 many ADJ\n","0 oppinions NOUN"]},"metadata":{"tags":[]},"execution_count":3}]},{"cell_type":"markdown","metadata":{"id":"2BB-NwZUoHSe"},"source":["# 4. Lets save the model"]},{"cell_type":"code","metadata":{"id":"eLex095goHwm","colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"status":"ok","timestamp":1607932114637,"user_tz":-60,"elapsed":155726,"user":{"displayName":"Christian Kasim Loan","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GjqAD-ircKP-s5Eh6JSdkDggDczfqQbJGU_IRb4Hw=s64","userId":"14469489166467359317"}},"outputId":"24d34ea2-dcc1-42b2-a5c6-10d345b76a3c"},"source":["stored_model_path = './models/pos_trained' \n","fitted_pipe.save(stored_model_path)"],"execution_count":null,"outputs":[{"output_type":"stream","text":["Stored model in ./models/pos_trained\n"],"name":"stdout"}]},{"cell_type":"markdown","metadata":{"id":"e_b2DPd4rCiU"},"source":["# 5. Lets load the model from HDD.\n","This makes Offlien NLU usage possible! \n","You need to call nlu.load(path=path_to_the_pipe) to load a model/pipeline from disk."]},{"cell_type":"code","metadata":{"id":"SO4uz45MoRgp","colab":{"base_uri":"https://localhost:8080/","height":485},"executionInfo":{"status":"ok","timestamp":1607932120301,"user_tz":-60,"elapsed":161383,"user":{"displayName":"Christian Kasim Loan","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GjqAD-ircKP-s5Eh6JSdkDggDczfqQbJGU_IRb4Hw=s64","userId":"14469489166467359317"}},"outputId":"db790b35-a51d-4226-8a0b-bb3e9e39e368"},"source":["hdd_pipe = nlu.load(path=stored_model_path)\n","\n","preds = hdd_pipe.predict('Donald Trump and Angela Merkel dont share many oppinions on laws about cheeseburgers')\n","preds"],"execution_count":null,"outputs":[{"output_type":"stream","text":["Fitting on empty Dataframe, could not infer correct training method!\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"," \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","
tokenpos
origin_index
0DonaldPROPN
0TrumpPROPN
0andCCONJ
0AngelaPROPN
0MerkelPROPN
0dontPRON
0shareVERB
0manyADJ
0oppinionsNOUN
0onPRON
0lawsVERB
0aboutADV
0cheeseburgersNOUN
\n","
"],"text/plain":[" token pos\n","origin_index \n","0 Donald PROPN\n","0 Trump PROPN\n","0 and CCONJ\n","0 Angela PROPN\n","0 Merkel PROPN\n","0 dont PRON\n","0 share VERB\n","0 many ADJ\n","0 oppinions NOUN\n","0 on PRON\n","0 laws VERB\n","0 about ADV\n","0 cheeseburgers NOUN"]},"metadata":{"tags":[]},"execution_count":5}]},{"cell_type":"code","metadata":{"id":"e0CVlkk9v6Qi","colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"status":"ok","timestamp":1607932120301,"user_tz":-60,"elapsed":161374,"user":{"displayName":"Christian Kasim Loan","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GjqAD-ircKP-s5Eh6JSdkDggDczfqQbJGU_IRb4Hw=s64","userId":"14469489166467359317"}},"outputId":"6bb7769e-f545-40b8-f0ef-90fd9f32c149"},"source":["hdd_pipe.print_info()"],"execution_count":null,"outputs":[{"output_type":"stream","text":["The following parameters are configurable for this NLU pipeline (You can copy paste the examples) :\n",">>> pipe['document_assembler'] has settable params:\n","pipe['document_assembler'].setCleanupMode('shrink') | Info: possible values: disabled, inplace, inplace_full, shrink, shrink_full, each, each_full, delete_full | Currently set to : shrink\n",">>> pipe['sentence_detector'] has settable params:\n","pipe['sentence_detector'].setCustomBounds([]) | Info: characters used to explicitly mark sentence bounds | Currently set to : []\n","pipe['sentence_detector'].setDetectLists(True) | Info: whether detect lists during sentence detection | Currently set to : True\n","pipe['sentence_detector'].setExplodeSentences(False) | Info: whether to explode each sentence into a different row, for better parallelization. Defaults to false. | Currently set to : False\n","pipe['sentence_detector'].setMaxLength(99999) | Info: Set the maximum allowed length for each sentence | Currently set to : 99999\n","pipe['sentence_detector'].setMinLength(0) | Info: Set the minimum allowed length for each sentence. | Currently set to : 0\n","pipe['sentence_detector'].setUseAbbreviations(True) | Info: whether to apply abbreviations at sentence detection | Currently set to : True\n","pipe['sentence_detector'].setUseCustomBoundsOnly(False) | Info: Only utilize custom bounds in sentence detection | Currently set to : False\n",">>> pipe['regex_tokenizer'] has settable params:\n","pipe['regex_tokenizer'].setCaseSensitiveExceptions(True) | Info: Whether to care for case sensitiveness in exceptions | Currently set to : True\n","pipe['regex_tokenizer'].setTargetPattern('\\S+') | Info: pattern to grab from text as token candidates. Defaults \\S+ | Currently set to : \\S+\n","pipe['regex_tokenizer'].setMaxLength(99999) | Info: Set the maximum allowed length for each token | Currently set to : 99999\n","pipe['regex_tokenizer'].setMinLength(0) | Info: Set the minimum allowed length for each token | Currently set to : 0\n",">>> pipe['sentiment_dl'] has settable params:\n"],"name":"stdout"}]},{"cell_type":"code","metadata":{"id":"o3jCHbIsMZrn"},"source":[""],"execution_count":null,"outputs":[]}]} \ No newline at end of file +{ + "nbformat": 4, + "nbformat_minor": 0, + "metadata": { + "colab": { + "provenance": [] + }, + "kernelspec": { + "name": "python3", + "display_name": "Python 3" + } + }, + "cells": [ + { + "cell_type": "markdown", + "metadata": { + "id": "zkufh760uvF3" + }, + "source": [ + "![JohnSnowLabs](https://nlp.johnsnowlabs.com/assets/images/logo.png)\n", + "\n", + "[![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/JohnSnowLabs/nlu/blob/master/examples/colab/Training/part_of_speech/NLU_training_POS_demo.ipynb)\n", + "\n", + "\n", + "\n", + "# Training a Named Entity Recognition (POS) model with NLU\n", + "With the [POS tagger](https://nlp.johnsnowlabs.com/docs/en/annotators#postagger-part-of-speech-tagger) from Spark NLP you can achieve State Of the Art results on any POS problem.\n", + "It uses an Averaged Percetron Model approach under the hood.\n", + "\n", + "This notebook showcases the following features :\n", + "\n", + "- How to train the deep learning POS classifier\n", + "- How to store a pipeline to disk\n", + "- How to load the pipeline from disk (Enables NLU offline mode)\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "dur2drhW5Rvi" + }, + "source": [ + "# 1. Colab Setup" + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "hFGnBCHavltY" + }, + "source": [ + "# Install the johnsnowlabs library\n", + "! pip install -q johnsnowlabs" + ], + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "f4KkTfnR5Ugg" + }, + "source": [ + "# 2. Download French POS dataset" + ] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "OrVb5ZMvvrQD", + "outputId": "3a9d194f-c90e-4159-f5c2-6603697e596a" + }, + "source": [ + "! wget https://s3.amazonaws.com/auxdata.johnsnowlabs.com/public/resources/fr/pos/UD_French/UD_French-GSD_2.3.txt" + ], + "execution_count": 2, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "--2023-10-27 13:16:24-- https://s3.amazonaws.com/auxdata.johnsnowlabs.com/public/resources/fr/pos/UD_French/UD_French-GSD_2.3.txt\n", + "Resolving s3.amazonaws.com (s3.amazonaws.com)... 52.217.10.150, 54.231.138.136, 52.217.116.224, ...\n", + "Connecting to s3.amazonaws.com (s3.amazonaws.com)|52.217.10.150|:443... connected.\n", + "HTTP request sent, awaiting response... 200 OK\n", + "Length: 3565213 (3.4M) [text/plain]\n", + "Saving to: ‘UD_French-GSD_2.3.txt’\n", + "\n", + "UD_French-GSD_2.3.t 100%[===================>] 3.40M 14.4MB/s in 0.2s \n", + "\n", + "2023-10-27 13:16:25 (14.4 MB/s) - ‘UD_French-GSD_2.3.txt’ saved [3565213/3565213]\n", + "\n" + ] + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "0296Om2C5anY" + }, + "source": [ + "# 3. Train Deep Learning Classifier using nlu.load('train.pos')\n", + "\n", + "You dataset label column should be named 'y' and the feature column with text data should be named 'text'" + ] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 418 + }, + "id": "3ZIPkRkWftBG", + "outputId": "8eeec2a8-5eeb-4303-d168-e25ac2b0da9d" + }, + "source": [ + "from johnsnowlabs import nlp\n", + "# load a trainable pipeline by specifying the train. prefix and fit it on a datset with label and text columns\n", + "# Since there are no\n", + "train_path = '/content/UD_French-GSD_2.3.txt'\n", + "trainable_pipe = nlp.load('train.pos')\n", + "fitted_pipe = trainable_pipe.fit(dataset_path=train_path)\n", + "\n", + "# predict with the trainable pipeline on dataset and get predictions\n", + "preds = fitted_pipe.predict('Donald Trump and Angela Merkel dont share many oppinions')\n", + "preds" + ], + "execution_count": 3, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Warning::Spark Session already created, some configs may not take.\n", + "sentence_detector_dl download started this may take some time.\n", + "Approximate size to download 354.6 KB\n", + "[OK!]\n", + "Warning::Spark Session already created, some configs may not take.\n" + ] + }, + { + "output_type": "execute_result", + "data": { + "text/plain": [ + " pos token\n", + "0 9_NUM Donald\n", + "0 1_NUM Trump\n", + "0 6_NUM and\n", + "0 7_NUM Angela\n", + "0 7_NUM Merkel\n", + "0 7_NUM dont\n", + "0 7_NUM share\n", + "0 6_NUM many\n", + "0 940_NUM oppinions" + ], + "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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
postoken
09_NUMDonald
01_NUMTrump
06_NUMand
07_NUMAngela
07_NUMMerkel
07_NUMdont
07_NUMshare
06_NUMmany
0940_NUMoppinions
\n", + "
\n", + "
\n", + "\n", + "
\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "
\n", + "\n", + "\n", + "
\n", + " \n", + "\n", + "\n", + "\n", + " \n", + "
\n", + "
\n", + "
\n" + ] + }, + "metadata": {}, + "execution_count": 3 + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "2BB-NwZUoHSe" + }, + "source": [ + "# 4. Lets save the model" + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "eLex095goHwm" + }, + "source": [ + "stored_model_path = './models/pos_trained'\n", + "fitted_pipe.save(stored_model_path)" + ], + "execution_count": 4, + "outputs": [] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "e_b2DPd4rCiU" + }, + "source": [ + "# 5. Lets load the model from HDD.\n", + "This makes Offlien NLU usage possible! \n", + "You need to call nlu.load(path=path_to_the_pipe) to load a model/pipeline from disk." + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "SO4uz45MoRgp", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 509 + }, + "outputId": "d93e1dd6-71dd-45cb-9ca5-69c5002f94f0" + }, + "source": [ + "hdd_pipe = nlp.load(path=stored_model_path)\n", + "\n", + "preds = hdd_pipe.predict('Donald Trump and Angela Merkel dont share many oppinions on laws about cheeseburgers')\n", + "preds" + ], + "execution_count": 5, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Warning::Spark Session already created, some configs may not take.\n", + "Warning::Spark Session already created, some configs may not take.\n", + "Warning::Spark Session already created, some configs may not take.\n" + ] + }, + { + "output_type": "execute_result", + "data": { + "text/plain": [ + " pos token\n", + "0 9_NUM Donald\n", + "0 1_NUM Trump\n", + "0 6_NUM and\n", + "0 7_NUM Angela\n", + "0 7_NUM Merkel\n", + "0 7_NUM dont\n", + "0 7_NUM share\n", + "0 7_NUM many\n", + "0 7_NUM oppinions\n", + "0 7_NUM on\n", + "0 7_NUM laws\n", + "0 6_NUM about\n", + "0 940_NUM cheeseburgers" + ], + "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", + " \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", + "
postoken
09_NUMDonald
01_NUMTrump
06_NUMand
07_NUMAngela
07_NUMMerkel
07_NUMdont
07_NUMshare
07_NUMmany
07_NUMoppinions
07_NUMon
07_NUMlaws
06_NUMabout
0940_NUMcheeseburgers
\n", + "
\n", + "
\n", + "\n", + "
\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "
\n", + "\n", + "\n", + "
\n", + " \n", + "\n", + "\n", + "\n", + " \n", + "
\n", + "
\n", + "
\n" + ] + }, + "metadata": {}, + "execution_count": 5 + } + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "e0CVlkk9v6Qi", + "colab": { + "base_uri": "https://localhost:8080/" + }, + "outputId": "1d002cad-1b60-4ef8-8b42-90a4a34c97b5" + }, + "source": [ + "hdd_pipe.print_info()" + ], + "execution_count": 6, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "The following parameters are configurable for this NLU pipeline (You can copy paste the examples) :\n", + ">>> component_list['document_assembler'] has settable params:\n", + "component_list['document_assembler'].setCleanupMode('shrink') | Info: possible values: disabled, inplace, inplace_full, shrink, shrink_full, each, each_full, delete_full | Currently set to : shrink\n", + ">>> component_list['sentence_detector_dl'] has settable params:\n", + "component_list['sentence_detector_dl'].setCustomBounds([]) | Info: characters used to explicitly mark sentence bounds | Currently set to : []\n", + "component_list['sentence_detector_dl'].setExplodeSentences(False) | Info: whether to explode each sentence into a different row, for better parallelization. Defaults to false. | Currently set to : False\n", + "component_list['sentence_detector_dl'].setMaxLength(99999) | Info: Set the maximum allowed length for each sentence | Currently set to : 99999\n", + "component_list['sentence_detector_dl'].setMinLength(0) | Info: Set the minimum allowed length for each sentence. | Currently set to : 0\n", + "component_list['sentence_detector_dl'].setUseCustomBoundsOnly(False) | Info: Only utilize custom bounds in sentence detection | Currently set to : False\n", + "component_list['sentence_detector_dl'].setEngine('tensorflow') | Info: Deep Learning engine used for this model | Currently set to : tensorflow\n", + "component_list['sentence_detector_dl'].setSplitLength(2147483647) | Info: length at which sentences will be forcibly split. | Currently set to : 2147483647\n", + "component_list['sentence_detector_dl'].setStorageRef('SentenceDetectorDLModel_c83c27f46b97') | Info: storage unique identifier | Currently set to : SentenceDetectorDLModel_c83c27f46b97\n", + "component_list['sentence_detector_dl'].setEncoder(com.johnsnowlabs.nlp.annotators.sentence_detector_dl.SentenceDetectorDLEncoder@1bf9ccd7) | Info: Data encoder | Currently set to : com.johnsnowlabs.nlp.annotators.sentence_detector_dl.SentenceDetectorDLEncoder@1bf9ccd7\n", + "component_list['sentence_detector_dl'].setImpossiblePenultimates(['Bros', 'No', 'al', 'vs', 'etc', 'Fig', 'Dr', 'Prof', 'PhD', 'MD', 'Co', 'Corp', 'Inc', 'bros', 'VS', 'Vs', 'ETC', 'fig', 'dr', 'prof', 'PHD', 'phd', 'md', 'co', 'corp', 'inc', 'Jan', 'Feb', 'Mar', 'Apr', 'Jul', 'Aug', 'Sep', 'Sept', 'Oct', 'Nov', 'Dec', 'St', 'st', 'AM', 'PM', 'am', 'pm', 'e.g', 'f.e', 'i.e']) | Info: Impossible penultimates - list of strings which a sentence can't end with | Currently set to : ['Bros', 'No', 'al', 'vs', 'etc', 'Fig', 'Dr', 'Prof', 'PhD', 'MD', 'Co', 'Corp', 'Inc', 'bros', 'VS', 'Vs', 'ETC', 'fig', 'dr', 'prof', 'PHD', 'phd', 'md', 'co', 'corp', 'inc', 'Jan', 'Feb', 'Mar', 'Apr', 'Jul', 'Aug', 'Sep', 'Sept', 'Oct', 'Nov', 'Dec', 'St', 'st', 'AM', 'PM', 'am', 'pm', 'e.g', 'f.e', 'i.e']\n", + "component_list['sentence_detector_dl'].setModelArchitecture('cnn') | Info: Model architecture (CNN) | Currently set to : cnn\n", + ">>> component_list['tokenizer'] has settable params:\n", + "component_list['tokenizer'].setCaseSensitiveExceptions(True) | Info: Whether to care for case sensitiveness in exceptions | Currently set to : True\n", + "component_list['tokenizer'].setTargetPattern('\\S+') | Info: pattern to grab from text as token candidates. Defaults \\S+ | Currently set to : \\S+\n", + "component_list['tokenizer'].setMaxLength(99999) | Info: Set the maximum allowed length for each token | Currently set to : 99999\n", + "component_list['tokenizer'].setMinLength(0) | Info: Set the minimum allowed length for each token | Currently set to : 0\n", + ">>> component_list['pos'] has settable params:\n" + ] + } + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "o3jCHbIsMZrn" + }, + "source": [], + "execution_count": null, + "outputs": [] + } + ] +} \ No newline at end of file diff --git a/examples/colab/spark_nlp_utilities/NLU_utils_for_Spark_NLP.ipynb b/examples/colab/spark_nlp_utilities/NLU_utils_for_Spark_NLP.ipynb index b1817d4e..8eb56d1d 100644 --- a/examples/colab/spark_nlp_utilities/NLU_utils_for_Spark_NLP.ipynb +++ b/examples/colab/spark_nlp_utilities/NLU_utils_for_Spark_NLP.ipynb @@ -1,1172 +1,1498 @@ { - "nbformat": 4, - "nbformat_minor": 0, - "metadata": { - "colab": { - "name": "NLU_utils_for_Spark_NLP.ipynb", - "provenance": [], - "collapsed_sections": [] - }, - "kernelspec": { - "name": "python3", - "display_name": "Python 3" - }, - "language_info": { - "name": "python" - } - }, - "cells": [ - { - "cell_type": "markdown", - "source": [ - "![JohnSnowLabs](https://nlp.johnsnowlabs.com/assets/images/logo.png)\n", - "\n", - "\n", - "\n", - "[![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/JohnSnowLabs/nlu/blob/master/examples/colab/spark_nlp_utilities/NLU_utils_for_Spark_NLP.ipynb)\n", - "# NLU utilities for Spark NLP\n", - "This notebook showcases various utils provided for Spark NLP by NLU" - ], - "metadata": { - "id": "CUpEfC3JcETa", - "pycharm": { - "name": "#%% md\n" - } - } - }, - { - "cell_type": "markdown", - "source": [ - "## Install and Authorize" - ], - "metadata": { - "id": "11sKij2tcQKo", - "pycharm": { - "name": "#%% md\n" - } - } - }, - { - "cell_type": "code", - "source": [ - "%%capture\n", - "import nlu\n", - "! pip install nlu pyspark==3.1.1\n", - "SPARK_NLP_LICENSE = \"YOUR SECRETS HERE\"\n", - "AWS_ACCESS_KEY_ID = \"YOUR SECRETS HERE\"\n", - "AWS_SECRET_ACCESS_KEY = \"YOUR SECRETS HERE\"\n", - "JSL_SECRET = \"YOUR SECRETS HERE\"\n", - "nlu.auth(SPARK_NLP_LICENSE, AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY, JSL_SECRET)" - ], - "metadata": { - "id": "WN9uZX9z2KDU", - "pycharm": { - "name": "#%%\n" - } - }, - "execution_count": null, - "outputs": [] - }, - { - "cell_type": "markdown", - "source": [ - "## nlu.viz(pipe,data) \n", - "\n", - "Visualize input data with an already configured Spark NLP pipeline, \n", - "for Algorithms of type (Ner,Assertion, Relation, Resolution, Dependency) \n", - "using [Spark NLP Display](https://nlp.johnsnowlabs.com/docs/en/display) \n", - "Automatically infers applicable viz type and output columns to use for visualization. \n", - "\n", - "\n", - "\n", - "If a pipeline has multiple models candidates that can be used for a viz, \n", - "the first Annotator that is vizzable will be used to create viz. \n", - "You can specify which type of viz to create with the viz_type parameter \n", - " \n", - "Output columns to use for the viz are automatically deducted from the pipeline, by using the \n", - "first annotator that provides the correct output type for a specific viz. \n", - "You can specify which columns to use for a viz by using the \n", - "corresponding ner_col, pos_col, dep_untyped_col, dep_typed_col, resolution_col, relation_col, assertion_col, parameters.\n" - ], - "metadata": { - "id": "GpG5Bn3JarDD", - "pycharm": { - "name": "#%% md\n" - } - } - }, - { - "cell_type": "code", - "source": [ - "# works with Pipeline, LightPipeline, PipelineModel, List[Annotator] \n", - "from sparknlp.pretrained import PretrainedPipeline, LightPipeline\n", - "\n", - "ade_pipeline = PretrainedPipeline('explain_clinical_doc_ade', 'en', 'clinical/models')\n", - "text = \"\"\"I have an allergic reaction to vancomycin. \n", - " My skin has be itchy, sore throat/burning/itchy, and numbness in tongue and gums. \n", - " I would not recommend this dr\t- new conversion tool\n" - ], - "metadata": { + "nbformat": 4, + "nbformat_minor": 0, + "metadata": { "colab": { - "base_uri": "https://localhost:8080/", - "height": 295 + "provenance": [] }, - "id": "gX5c-KFAFsO1", - "outputId": "609bdd0f-2a40-4018-d070-bd8592c4c8d8", - "pycharm": { - "name": "#%%\n" + "kernelspec": { + "name": "python3", + "display_name": "Python 3" + }, + "language_info": { + "name": "python" } - }, - "execution_count": 26, - "outputs": [ + }, + "cells": [ { - "output_type": "stream", - "name": "stdout", - "text": [ - "explain_clinical_doc_ade download started this may take some time.\n", - "Approx size to download 462.2 MB\n", - "[OK!]\n" - ] + "cell_type": "markdown", + "source": [ + "![JohnSnowLabs](https://nlp.johnsnowlabs.com/assets/images/logo.png)\n", + "\n", + "\n", + "\n", + "[![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/JohnSnowLabs/nlu/blob/master/examples/colab/spark_nlp_utilities/NLU_utils_for_Spark_NLP.ipynb)\n", + "# NLU utilities for Spark NLP\n", + "This notebook showcases various utils provided for Spark NLP by NLU" + ], + "metadata": { + "id": "CUpEfC3JcETa", + "pycharm": { + "name": "#%% md\n" + } + } }, { - "output_type": "display_data", - "data": { - "text/plain": [ - "" + "cell_type": "markdown", + "source": [ + "## Colab Setup" ], - "text/html": [ - "\n", - "\n", - " I have an allergic reaction ADEpresent to vancomycin.
My skin has be
itchy ADEpresent , sore throat/burning/itchy ADEpresent , and numbness in tongue and gums ADEpresent .
I would not recommend this drug to anyone, especially since I have never had such an adverse reaction to any other medication.
" - ] - }, - "metadata": {} - } - ] - }, - { - "cell_type": "markdown", - "source": [ - "## nlu.to_pretty_df(pipe,data) \n", - "\n", - "Annotates a Pandas Dataframe/Pandas Series/Numpy Array/Spark DataFrame/Python List strings /Python String \n", - "with given Spark NLP pipeline, which is assumed to be complete and runnable and returns it in a pythonic pandas dataframe format.\n", - "\n", - "\n", - "Annotators are grouped internally by NLU into output levels `token`,`sentence`, `document`,`chunk` and `relation`\n", - "Same level annotators output columns are zipped and exploded together to create the final output df. \n", - "Additionally, most keys from the metadata dictionary in the result annotations will be collected and expanded into their own columns in the resulting Dataframe, with special handling for Annotators that encode multiple metadata fields inside of one, seperated by strings like `|||` or `:::`.\n", - "Some columns are omitted from metadata to reduce total amount of output columns, these can be re-enabled by setting `metadata=True`\n", - "\n", - "For a given pipeline output level is automatically set to the last anntators output level by default.\n", - "This can be changed by defining `to_preddty_df(pipe,text,output_level='my_level'` for levels `token`,`sentence`, `document`,`chunk` and `relation` . " - ], - "metadata": { - "id": "jqXbQZoZa4fA", - "pycharm": { - "name": "#%% md\n" - } - } - }, - { - "cell_type": "code", - "source": [ - "# works with Pipeline, LightPipeline, PipelineModel, List[Annotator] \n", - "\n", - "text = \"\"\"I have an allergic reaction to vancomycin. \n", - " My skin has be itchy, sore throat/burning/itchy, and numbness in tongue and gums. \n", - " I would not recommend this drug to anyone, especially since I have never had such an adverse reaction to any other medication.\"\"\"\n", - "ade_assert_cols = ['assertion', 'entities_ner_chunks_ade_assertion',\t 'entities_ner_chunks_ade_assertion_class','assertion_confidence']\n", - "df = nlu.to_pretty_df(ade_pipeline,text)\n", - "df[ade_assert_cols]\n" - ], - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/", - "height": 206 + "metadata": { + "id": "11sKij2tcQKo", + "pycharm": { + "name": "#%% md\n" + } + } + }, + { + "cell_type": "code", + "source": [ + "!pip install -q johnsnowlabs" + ], + "metadata": { + "id": "WN9uZX9z2KDU", + "pycharm": { + "name": "#%%\n" + } + }, + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "code", + "source": [ + "from google.colab import files\n", + "print('Please Upload your John Snow Labs License using the button below')\n", + "license_keys = files.upload()" + ], + "metadata": { + "id": "Ke87QahOJQpM" + }, + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "code", + "source": [ + "from johnsnowlabs import nlp\n", + "\n", + "# After uploading your license run this to install all licensed Python Wheels and pre-download Jars the Spark Session JVM\n", + "nlp.install()" + ], + "metadata": { + "id": "p_-OAEtMJmD9" + }, + "execution_count": null, + "outputs": [] }, - "id": "amg15blSGANo", - "outputId": "82985bb1-0c98-4ada-c3a9-cc67f2d975f3", - "pycharm": { - "name": "#%%\n" - } - }, - "execution_count": 66, - "outputs": [ { - "output_type": "execute_result", - "data": { - "text/plain": [ - " assertion entities_ner_chunks_ade_assertion \\\n", - "0 present allergic reaction \n", - "0 present itchy \n", - "0 present sore throat/burning/itchy \n", - "0 present numbness in tongue and gums \n", - "0 NaN NaN \n", - "\n", - " entities_ner_chunks_ade_assertion_class assertion_confidence \n", - "0 ADE 0.998 \n", - "0 ADE 0.8414 \n", - "0 ADE 0.9019 \n", - "0 ADE 0.9991 \n", - "0 NaN NaN " + "cell_type": "code", + "source": [ + "from johnsnowlabs import nlp\n", + "spark=nlp.start()" ], - "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", - " \n", - " \n", - " \n", - "
assertionentities_ner_chunks_ade_assertionentities_ner_chunks_ade_assertion_classassertion_confidence
0presentallergic reactionADE0.998
0presentitchyADE0.8414
0presentsore throat/burning/itchyADE0.9019
0presentnumbness in tongue and gumsADE0.9991
0NaNNaNNaNNaN
\n", - "
\n", - " \n", - " \n", - " \n", - "\n", - " \n", - "
\n", - "
\n", - " " + "metadata": { + "id": "B_xUxj9QJpjX" + }, + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "markdown", + "source": [ + "## nlu.viz(pipe,data)\n", + "\n", + "Visualize input data with an already configured Spark NLP pipeline, \n", + "for Algorithms of type (Ner,Assertion, Relation, Resolution, Dependency) \n", + "using [Spark NLP Display](https://nlp.johnsnowlabs.com/docs/en/display) \n", + "Automatically infers applicable viz type and output columns to use for visualization. \n", + "\n", + "\n", + "\n", + "If a pipeline has multiple models candidates that can be used for a viz, \n", + "the first Annotator that is vizzable will be used to create viz. \n", + "You can specify which type of viz to create with the viz_type parameter \n", + " \n", + "Output columns to use for the viz are automatically deducted from the pipeline, by using the \n", + "first annotator that provides the correct output type for a specific viz. \n", + "You can specify which columns to use for a viz by using the \n", + "corresponding ner_col, pos_col, dep_untyped_col, dep_typed_col, resolution_col, relation_col, assertion_col, parameters.\n" + ], + "metadata": { + "id": "GpG5Bn3JarDD", + "pycharm": { + "name": "#%% md\n" + } + } + }, + { + "cell_type": "code", + "source": [ + "from johnsnowlabs import nlp\n", + "\n", + "ade_pipeline = nlp.PretrainedPipeline('explain_clinical_doc_ade', 'en', 'clinical/models')\n", + "\n", + "text = \"\"\"I have an allergic reaction to vancomycin.\n", + " My skin has be itchy, sore throat/burning/itchy, and numbness in tongue and gums.\n", + " I would not recommend this dr\t- new conversion tool\"\"\"\n", + "nlp.nlu.viz(ade_pipeline,text)" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 330 + }, + "id": "gX5c-KFAFsO1", + "outputId": "ba32dcd3-935f-4e28-cfac-5c5068918002", + "pycharm": { + "name": "#%%\n" + } + }, + "execution_count": 12, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "explain_clinical_doc_ade download started this may take some time.\n", + "Approx size to download 462.6 MB\n", + "[OK!]\n", + "Warning::Spark Session already created, some configs may not take.\n", + "Warning::Spark Session already created, some configs may not take.\n" + ] + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "\n", + "\n", + " I have an allergic reaction ADEpresent to vancomycin.
My skin has be
itchy ADEpresent , sore throat/burning/itchy ADEpresent , and numbness in tongue and gums ADEpresent .
I would not recommend this dr\t- new conversion tool
" + ] + }, + "metadata": {} + } ] - }, - "metadata": {}, - "execution_count": 66 - } - ] - }, - { - "cell_type": "markdown", - "source": [ - "## nlu.to_nlu_pipe(pipe)\n", - "\n", - "Convert a pipeline or list of annotators into a NLU pipeline making `.predict()` and `.viz()` avaiable for every Spark NLP pipeline.\n", - "Assumes the pipeline is already runnable.\n" - ], - "metadata": { - "id": "KI5u-6aia8bo", - "pycharm": { - "name": "#%% md\n" - } - } - }, - { - "cell_type": "code", - "source": [ - "\n", - "text = \"\"\"I have an allergic reaction to vancomycin. \n", - " My skin has be itchy, sore throat/burning/itchy, and numbness in tongue and gums. \n", - " I would not recommend this drug to anyone, especially since I have never had such an adverse reaction to any other medication.\"\"\"\n", - "nlu_pipe = nlu.to_nlu_pipe(ade_pipeline)\n", - "nlu_pipe.viz(text)\n", - "nlu_pipe.predict(text)[ade_assert_cols]\n", - "\n" - ], - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/", - "height": 432 }, - "id": "xuZL1uTmF5SJ", - "outputId": "3ffc84d3-4da4-4a72-bedb-3831dc31b6dd", - "pycharm": { - "name": "#%%\n" - } - }, - "execution_count": 69, - "outputs": [ { - "output_type": "display_data", - "data": { - "text/plain": [ - "" + "cell_type": "markdown", + "source": [ + "## nlu.to_pretty_df(pipe,data)\n", + "\n", + "Annotates a Pandas Dataframe/Pandas Series/Numpy Array/Spark DataFrame/Python List strings /Python String \n", + "with given Spark NLP pipeline, which is assumed to be complete and runnable and returns it in a pythonic pandas dataframe format.\n", + "\n", + "\n", + "Annotators are grouped internally by NLU into output levels `token`,`sentence`, `document`,`chunk` and `relation`\n", + "Same level annotators output columns are zipped and exploded together to create the final output df.\n", + "Additionally, most keys from the metadata dictionary in the result annotations will be collected and expanded into their own columns in the resulting Dataframe, with special handling for Annotators that encode multiple metadata fields inside of one, seperated by strings like `|||` or `:::`.\n", + "Some columns are omitted from metadata to reduce total amount of output columns, these can be re-enabled by setting `metadata=True`\n", + "\n", + "For a given pipeline output level is automatically set to the last anntators output level by default.\n", + "This can be changed by defining `to_preddty_df(pipe,text,output_level='my_level'` for levels `token`,`sentence`, `document`,`chunk` and `relation` ." + ], + "metadata": { + "id": "jqXbQZoZa4fA", + "pycharm": { + "name": "#%% md\n" + } + } + }, + { + "cell_type": "code", + "source": [ + "# works with Pipeline, LightPipeline, PipelineModel, List[Annotator]\n", + "\n", + "text = \"\"\"I have an allergic reaction to vancomycin.\n", + " My skin has be itchy, sore throat/burning/itchy, and numbness in tongue and gums.\n", + " I would not recommend this drug to anyone, especially since I have never had such an adverse reaction to any other medication.\"\"\"\n", + "ade_assert_cols = ['assertion', 'entities_ner_chunks_ade_assertion',\t 'entities_ner_chunks_ade_assertion_class','assertion_confidence']\n", + "df = nlp.to_pretty_df(ade_pipeline,text)\n", + "df[ade_assert_cols]\n" ], - "text/html": [ - "\n", - "\n", - " I have an allergic reaction ADEpresent to vancomycin.
My skin has be
itchy ADEpresent , sore throat/burning/itchy ADEpresent , and numbness in tongue and gums ADEpresent .
I would not recommend this drug to anyone, especially since I have never had such an adverse reaction to any other medication.
" + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 241 + }, + "id": "amg15blSGANo", + "outputId": "851139e4-3ee6-43e9-cddc-2081596ea650", + "pycharm": { + "name": "#%%\n" + } + }, + "execution_count": 10, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Warning::Spark Session already created, some configs may not take.\n", + "Warning::Spark Session already created, some configs may not take.\n" + ] + }, + { + "output_type": "execute_result", + "data": { + "text/plain": [ + " assertion entities_ner_chunks_ade_assertion \\\n", + "0 present allergic reaction \n", + "0 present itchy \n", + "0 present sore throat/burning/itchy \n", + "0 present numbness in tongue and gums \n", + "0 NaN NaN \n", + "\n", + " entities_ner_chunks_ade_assertion_class assertion_confidence \n", + "0 ADE 0.9532 \n", + "0 ADE 0.9641 \n", + "0 ADE 0.9184 \n", + "0 ADE 0.9998 \n", + "0 NaN NaN " + ], + "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", + " \n", + " \n", + "
assertionentities_ner_chunks_ade_assertionentities_ner_chunks_ade_assertion_classassertion_confidence
0presentallergic reactionADE0.9532
0presentitchyADE0.9641
0presentsore throat/burning/itchyADE0.9184
0presentnumbness in tongue and gumsADE0.9998
0NaNNaNNaNNaN
\n", + "
\n", + "
\n", + "\n", + "
\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "
\n", + "\n", + "\n", + "
\n", + " \n", + "\n", + "\n", + "\n", + " \n", + "
\n", + "
\n", + "
\n" + ] + }, + "metadata": {}, + "execution_count": 10 + } ] - }, - "metadata": {} }, { - "output_type": "execute_result", - "data": { - "text/plain": [ - " assertion entities_ner_chunks_ade_assertion \\\n", - "0 present allergic reaction \n", - "0 present itchy \n", - "0 present sore throat/burning/itchy \n", - "0 present numbness in tongue and gums \n", - "0 NaN NaN \n", - "\n", - " entities_ner_chunks_ade_assertion_class assertion_confidence \n", - "0 ADE 0.998 \n", - "0 ADE 0.8414 \n", - "0 ADE 0.9019 \n", - "0 ADE 0.9991 \n", - "0 NaN NaN " + "cell_type": "markdown", + "source": [ + "## nlu.to_nlu_pipe(pipe)\n", + "\n", + "Convert a pipeline or list of annotators into a NLU pipeline making `.predict()` and `.viz()` avaiable for every Spark NLP pipeline.\n", + "Assumes the pipeline is already runnable.\n" ], - "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", - " \n", - " \n", - " \n", - "
assertionentities_ner_chunks_ade_assertionentities_ner_chunks_ade_assertion_classassertion_confidence
0presentallergic reactionADE0.998
0presentitchyADE0.8414
0presentsore throat/burning/itchyADE0.9019
0presentnumbness in tongue and gumsADE0.9991
0NaNNaNNaNNaN
\n", - "
\n", - " \n", - " \n", - " \n", - "\n", - " \n", - "
\n", - "
\n", - " " + "metadata": { + "id": "KI5u-6aia8bo", + "pycharm": { + "name": "#%% md\n" + } + } + }, + { + "cell_type": "code", + "source": [ + "\n", + "text = \"\"\"I have an allergic reaction to vancomycin.\n", + " My skin has be itchy, sore throat/burning/itchy, and numbness in tongue and gums.\n", + " I would not recommend this drug to anyone, especially since I have never had such an adverse reaction to any other medication.\"\"\"\n", + "nlu_pipe = nlp.to_nlu_pipe(ade_pipeline)\n", + "nlu_pipe.viz(text)\n", + "nlu_pipe.predict(text)[ade_assert_cols]\n", + "\n" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 467 + }, + "id": "xuZL1uTmF5SJ", + "outputId": "df5ffc84-ccde-467b-87a1-ca9214f85050", + "pycharm": { + "name": "#%%\n" + } + }, + "execution_count": 13, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Warning::Spark Session already created, some configs may not take.\n", + "Warning::Spark Session already created, some configs may not take.\n" + ] + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "\n", + "\n", + " I have an allergic reaction ADEpresent to vancomycin.
My skin has be
itchy ADEpresent , sore throat/burning/itchy ADEpresent , and numbness in tongue and gums ADEpresent .
I would not recommend this drug to anyone, especially since I have never had such an adverse reaction to any other medication.
" + ] + }, + "metadata": {} + }, + { + "output_type": "execute_result", + "data": { + "text/plain": [ + " assertion entities_ner_chunks_ade_assertion \\\n", + "0 present allergic reaction \n", + "0 present itchy \n", + "0 present sore throat/burning/itchy \n", + "0 present numbness in tongue and gums \n", + "0 NaN NaN \n", + "\n", + " entities_ner_chunks_ade_assertion_class assertion_confidence \n", + "0 ADE 0.9532 \n", + "0 ADE 0.9641 \n", + "0 ADE 0.9184 \n", + "0 ADE 0.9998 \n", + "0 NaN NaN " + ], + "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", + " \n", + " \n", + "
assertionentities_ner_chunks_ade_assertionentities_ner_chunks_ade_assertion_classassertion_confidence
0presentallergic reactionADE0.9532
0presentitchyADE0.9641
0presentsore throat/burning/itchyADE0.9184
0presentnumbness in tongue and gumsADE0.9998
0NaNNaNNaNNaN
\n", + "
\n", + "
\n", + "\n", + "
\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "
\n", + "\n", + "\n", + "
\n", + " \n", + "\n", + "\n", + "\n", + " \n", + "
\n", + "
\n", + "
\n" + ] + }, + "metadata": {}, + "execution_count": 13 + } ] - }, - "metadata": {}, - "execution_count": 69 - } - ] - }, - { - "cell_type": "markdown", - "source": [ - "## nlu.autocomplete_pipeline(pipe)\n", - "\n", - "Auto-Complete a pipeline or single annotator into a runnable pipeline by harnessing NLU's DAG Autocompletion algorithm and returns it as NLU pipeline.\n", - "The standard Spark pipeline is avaiable on the `.vanilla_transformer_pipe` attribute of the returned nlu pipe\n", - "\n", - "Every Annotator and Pipeline of Annotators defines a `DAG` of tasks, with various dependencies that must be satisfied in `topoligical order`.\n", - "NLU enables the completion of an incomplete DAG by finding or creating a path between\n", - "the very first input node which is almost always is `DocumentAssembler/MultiDocumentAssembler` \n", - "and the very last node(s), which is given by the `topoligical sorting` the iterable annotators parameter. \n", - "Paths are created by resolving input features of annotators to the corrrosponding providers with matching storage references.\n" - ], - "metadata": { - "id": "txeCLCtWbSVp", - "pycharm": { - "name": "#%% md\n" - } - } - }, - { - "cell_type": "code", - "source": [ - "from sparknlp_jsl.annotator import RelationExtractionModel\n", - "text = \"\"\"I have an allergic reaction to vancomycin. \n", - " My skin has be itchy, sore throat/burning/itchy, and numbness in tongue and gums. \n", - " I would not recommend this drug to anyone, especially since I have never had such an adverse reaction to any other medication.\"\"\"\n", - "\n", - "re_model = RelationExtractionModel().pretrained(\"re_ade_clinical\", \"en\", 'clinical/models')\n", - "\n", - "nlu_pipe = nlu.autocomplete_pipeline(re_model)\n", - "df = nlu_pipe.predict(text)\n", - "cols = [\n", - "'relation_RelationExtractionModel_1fb1dfa024c7',\n", - "'relation_RelationExtractionModel_1fb1dfa024c7_confidence',\n", - "'relation_RelationExtractionModel_1fb1dfa024c7_entity1',\n", - "'relation_RelationExtractionModel_1fb1dfa024c7_entity2',\n", - "'relation_RelationExtractionModel_1fb1dfa024c7_entity2_class',\n", - "]\n", - "\n", - "df[cols]" - ], - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/", - "height": 846 }, - "id": "Pk8ThwOaGHW2", - "outputId": "3547f237-ca2d-4ff0-97cd-2dc13839fa7d", - "pycharm": { - "name": "#%%\n" - } - }, - "execution_count": 73, - "outputs": [ { - "output_type": "stream", - "name": "stdout", - "text": [ - "re_ade_clinical download started this may take some time.\n", - "Approximate size to download 10.9 MB\n", - "[OK!]\n", - "embeddings_clinical download started this may take some time.\n", - "Approximate size to download 1.6 GB\n", - "[OK!]\n", - "pos_anc download started this may take some time.\n", - "Approximate size to download 3.9 MB\n", - "[OK!]\n", - "dependency_conllu download started this may take some time.\n", - "Approximate size to download 16.7 MB\n", - "[OK!]\n", - "ner_jsl download started this may take some time.\n", - "[OK!]\n", - "sentence_detector_dl download started this may take some time.\n", - "Approximate size to download 354.6 KB\n", - "[OK!]\n" - ] + "cell_type": "markdown", + "source": [ + "## nlu.autocomplete_pipeline(pipe)\n", + "\n", + "Auto-Complete a pipeline or single annotator into a runnable pipeline by harnessing NLU's DAG Autocompletion algorithm and returns it as NLU pipeline.\n", + "The standard Spark pipeline is avaiable on the `.vanilla_transformer_pipe` attribute of the returned nlu pipe\n", + "\n", + "Every Annotator and Pipeline of Annotators defines a `DAG` of tasks, with various dependencies that must be satisfied in `topoligical order`.\n", + "NLU enables the completion of an incomplete DAG by finding or creating a path between\n", + "the very first input node which is almost always is `DocumentAssembler/MultiDocumentAssembler`\n", + "and the very last node(s), which is given by the `topoligical sorting` the iterable annotators parameter.\n", + "Paths are created by resolving input features of annotators to the corrrosponding providers with matching storage references.\n" + ], + "metadata": { + "id": "txeCLCtWbSVp", + "pycharm": { + "name": "#%% md\n" + } + } }, { - "output_type": "execute_result", - "data": { - "text/plain": [ - " relation_RelationExtractionModel_1fb1dfa024c7 \\\n", - "0 1 \n", - "0 1 \n", - "0 1 \n", - "0 1 \n", - "0 1 \n", - "0 0 \n", - "0 1 \n", - "0 1 \n", - "0 1 \n", - "0 0 \n", - "0 0 \n", - "0 1 \n", - "0 0 \n", - "0 1 \n", - "0 1 \n", - "0 1 \n", - "\n", - " relation_RelationExtractionModel_1fb1dfa024c7_confidence \\\n", - "0 1.0 \n", - "0 0.9999999 \n", - "0 0.99998033 \n", - "0 0.9562254 \n", - "0 0.9990915 \n", - "0 0.94292736 \n", - "0 0.80632734 \n", - "0 0.52616316 \n", - "0 0.9999474 \n", - "0 0.9946185 \n", - "0 0.99416226 \n", - "0 0.9893037 \n", - "0 0.999969 \n", - "0 1.0 \n", - "0 1.0 \n", - "0 1.0 \n", - "\n", - " relation_RelationExtractionModel_1fb1dfa024c7_entity1 \\\n", - "0 allergic reaction \n", - "0 skin \n", - "0 skin \n", - "0 skin \n", - "0 skin \n", - "0 skin \n", - "0 itchy \n", - "0 itchy \n", - "0 itchy \n", - "0 itchy \n", - "0 sore throat/burning/itchy \n", - "0 sore throat/burning/itchy \n", - "0 sore throat/burning/itchy \n", - "0 numbness \n", - "0 numbness \n", - "0 tongue \n", - "\n", - " relation_RelationExtractionModel_1fb1dfa024c7_entity2 \\\n", - "0 vancomycin \n", - "0 itchy \n", - "0 sore throat/burning/itchy \n", - "0 numbness \n", - "0 tongue \n", - "0 gums \n", - "0 sore throat/burning/itchy \n", - "0 numbness \n", - "0 tongue \n", - "0 gums \n", - "0 numbness \n", - "0 tongue \n", - "0 gums \n", - "0 tongue \n", - "0 gums \n", - "0 gums \n", - "\n", - " relation_RelationExtractionModel_1fb1dfa024c7_entity2_class \n", - "0 Drug_Ingredient \n", - "0 Symptom \n", - "0 Symptom \n", - "0 Symptom \n", - "0 External_body_part_or_region \n", - "0 External_body_part_or_region \n", - "0 Symptom \n", - "0 Symptom \n", - "0 External_body_part_or_region \n", - "0 External_body_part_or_region \n", - "0 Symptom \n", - "0 External_body_part_or_region \n", - "0 External_body_part_or_region \n", - "0 External_body_part_or_region \n", - "0 External_body_part_or_region \n", - "0 External_body_part_or_region " + "cell_type": "code", + "source": [ + "from johnsnowlabs import medical\n", + "text = \"\"\"I have an allergic reaction to vancomycin.\n", + " My skin has be itchy, sore throat/burning/itchy, and numbness in tongue and gums.\n", + " I would not recommend this drug to anyone, especially since I have never had such an adverse reaction to any other medication.\"\"\"\n", + "\n", + "re_model = medical.RelationExtractionModel().pretrained(\"re_ade_clinical\", \"en\", 'clinical/models')\n", + "\n", + "nlu_pipe = nlp.autocomplete_pipeline(re_model)\n", + "df = nlu_pipe.predict(text)\n", + "cols = [\n", + "'relation_RelationExtractionModel_1fb1dfa024c7',\n", + "'relation_RelationExtractionModel_1fb1dfa024c7_confidence',\n", + "'relation_RelationExtractionModel_1fb1dfa024c7_entity1',\n", + "'relation_RelationExtractionModel_1fb1dfa024c7_entity2',\n", + "'relation_RelationExtractionModel_1fb1dfa024c7_entity2_class',\n", + "]\n", + "\n", + "df[cols]" ], - "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", - " \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", - " \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", - "
relation_RelationExtractionModel_1fb1dfa024c7relation_RelationExtractionModel_1fb1dfa024c7_confidencerelation_RelationExtractionModel_1fb1dfa024c7_entity1relation_RelationExtractionModel_1fb1dfa024c7_entity2relation_RelationExtractionModel_1fb1dfa024c7_entity2_class
011.0allergic reactionvancomycinDrug_Ingredient
010.9999999skinitchySymptom
010.99998033skinsore throat/burning/itchySymptom
010.9562254skinnumbnessSymptom
010.9990915skintongueExternal_body_part_or_region
000.94292736skingumsExternal_body_part_or_region
010.80632734itchysore throat/burning/itchySymptom
010.52616316itchynumbnessSymptom
010.9999474itchytongueExternal_body_part_or_region
000.9946185itchygumsExternal_body_part_or_region
000.99416226sore throat/burning/itchynumbnessSymptom
010.9893037sore throat/burning/itchytongueExternal_body_part_or_region
000.999969sore throat/burning/itchygumsExternal_body_part_or_region
011.0numbnesstongueExternal_body_part_or_region
011.0numbnessgumsExternal_body_part_or_region
011.0tonguegumsExternal_body_part_or_region
\n", - "
\n", - " \n", - " \n", - " \n", - "\n", - " \n", - "
\n", - "
\n", - " " + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 601 + }, + "id": "Pk8ThwOaGHW2", + "outputId": "e118b2f3-2271-45c8-9447-da54314ef26d", + "pycharm": { + "name": "#%%\n" + } + }, + "execution_count": 14, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "re_ade_clinical download started this may take some time.\n", + "[OK!]\n", + "Warning::Spark Session already created, some configs may not take.\n", + "embeddings_clinical download started this may take some time.\n", + "Approximate size to download 1.6 GB\n", + "[OK!]\n", + "pos_anc download started this may take some time.\n", + "Approximate size to download 3.9 MB\n", + "[OK!]\n", + "dependency_conllu download started this may take some time.\n", + "Approximate size to download 16.7 MB\n", + "[OK!]\n", + "ner_jsl download started this may take some time.\n", + "[OK!]\n", + "sentence_detector_dl download started this may take some time.\n", + "Approximate size to download 354.6 KB\n", + "[OK!]\n", + "Warning::Spark Session already created, some configs may not take.\n" + ] + }, + { + "output_type": "execute_result", + "data": { + "text/plain": [ + " relation_RelationExtractionModel_1fb1dfa024c7 \\\n", + "0 1 \n", + "0 1 \n", + "0 1 \n", + "0 1 \n", + "0 1 \n", + "0 1 \n", + "0 0 \n", + "\n", + " relation_RelationExtractionModel_1fb1dfa024c7_confidence \\\n", + "0 0.5657 \n", + "0 0.9604 \n", + "0 0.9604 \n", + "0 0.9604 \n", + "0 0.667 \n", + "0 0.667 \n", + "0 0.75065005 \n", + "\n", + " relation_RelationExtractionModel_1fb1dfa024c7_entity1 \\\n", + "0 allergic reaction \n", + "0 skin \n", + "0 skin \n", + "0 skin \n", + "0 itchy \n", + "0 itchy \n", + "0 sore throat/burning/itchy \n", + "\n", + " relation_RelationExtractionModel_1fb1dfa024c7_entity2 \\\n", + "0 vancomycin \n", + "0 itchy \n", + "0 sore throat/burning/itchy \n", + "0 numbness in tongue and gums \n", + "0 sore throat/burning/itchy \n", + "0 numbness in tongue and gums \n", + "0 numbness in tongue and gums \n", + "\n", + " relation_RelationExtractionModel_1fb1dfa024c7_entity2_class \n", + "0 Drug_Ingredient \n", + "0 Symptom \n", + "0 Symptom \n", + "0 Symptom \n", + "0 Symptom \n", + "0 Symptom \n", + "0 Symptom " + ], + "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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
relation_RelationExtractionModel_1fb1dfa024c7relation_RelationExtractionModel_1fb1dfa024c7_confidencerelation_RelationExtractionModel_1fb1dfa024c7_entity1relation_RelationExtractionModel_1fb1dfa024c7_entity2relation_RelationExtractionModel_1fb1dfa024c7_entity2_class
010.5657allergic reactionvancomycinDrug_Ingredient
010.9604skinitchySymptom
010.9604skinsore throat/burning/itchySymptom
010.9604skinnumbness in tongue and gumsSymptom
010.667itchysore throat/burning/itchySymptom
010.667itchynumbness in tongue and gumsSymptom
000.75065005sore throat/burning/itchynumbness in tongue and gumsSymptom
\n", + "
\n", + "
\n", + "\n", + "
\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "
\n", + "\n", + "\n", + "
\n", + " \n", + "\n", + "\n", + "\n", + " \n", + "
\n", + "
\n", + "
\n" + ] + }, + "metadata": {}, + "execution_count": 14 + } ] - }, - "metadata": {}, - "execution_count": 73 - } - ] - }, - { - "cell_type": "code", - "source": [], - "metadata": { - "id": "9P3-EmI0l6Dx", - "pycharm": { - "name": "#%%\n" + }, + { + "cell_type": "code", + "source": [], + "metadata": { + "id": "9P3-EmI0l6Dx", + "pycharm": { + "name": "#%%\n" + } + }, + "execution_count": null, + "outputs": [] } - }, - "execution_count": null, - "outputs": [] - } - ] + ] } \ No newline at end of file diff --git a/examples/colab/visualization/NLU_visualizations_tutorial.ipynb b/examples/colab/visualization/NLU_visualizations_tutorial.ipynb index 5b0daac7..7568c0da 100644 --- a/examples/colab/visualization/NLU_visualizations_tutorial.ipynb +++ b/examples/colab/visualization/NLU_visualizations_tutorial.ipynb @@ -3,9 +3,7 @@ "nbformat_minor": 0, "metadata": { "colab": { - "name": "NLU_visualizations_tutorial.ipynb", - "provenance": [], - "collapsed_sections": [] + "provenance": [] }, "kernelspec": { "display_name": "Python 3", @@ -26,7 +24,7 @@ "\n", "[![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/JohnSnowLabs/nlu/blob/master/examples/colab/visualization/NLU_visualizations_tutorial.ipynb)\n", "\n", - "# With NLU and [Spark-NLP-Display](https://github.com/JohnSnowLabs/spark-nlp-display) you can visualize the outputs of various NLP models \n", + "# With NLU and [Spark-NLP-Display](https://github.com/JohnSnowLabs/spark-nlp-display) you can visualize the outputs of various NLP models\n", "visualization\n", "## Available vizualizations\n", "\n", @@ -43,74 +41,69 @@ "id": "5sQOK29tNYlL" }, "source": [ - "# Install NLU" + "# Colab Setup" ] }, { "cell_type": "code", "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "id": "Fgyayzo48ziU", - "outputId": "0ee261dd-47bb-441c-98dd-31c21ab39172" + "id": "Fgyayzo48ziU" }, "source": [ - "!wget https://setup.johnsnowlabs.com/nlu/colab.sh -O - | bash\n", - "import nlu" + "# Install the johnsnowlabs library\n", + "! pip install -q johnsnowlabs" ], - "execution_count": 1, - "outputs": [ - { - "output_type": "stream", - "name": "stdout", - "text": [ - "--2022-07-16 18:24:31-- https://setup.johnsnowlabs.com/nlu/colab.sh\n", - "Resolving setup.johnsnowlabs.com (setup.johnsnowlabs.com)... 51.158.130.125\n", - "Connecting to setup.johnsnowlabs.com (setup.johnsnowlabs.com)|51.158.130.125|:443... connected.\n", - "HTTP request sent, awaiting response... 302 Moved Temporarily\n", - "Location: https://raw.githubusercontent.com/JohnSnowLabs/nlu/master/scripts/colab_setup.sh [following]\n", - "--2022-07-16 18:24:31-- https://raw.githubusercontent.com/JohnSnowLabs/nlu/master/scripts/colab_setup.sh\n", - "Resolving raw.githubusercontent.com (raw.githubusercontent.com)... 185.199.110.133, 185.199.109.133, 185.199.111.133, ...\n", - "Connecting to raw.githubusercontent.com (raw.githubusercontent.com)|185.199.110.133|:443... connected.\n", - "HTTP request sent, awaiting response... 200 OK\n", - "Length: 1662 (1.6K) [text/plain]\n", - "Saving to: ‘STDOUT’\n", - "\n", - "- 100%[===================>] 1.62K --.-KB/s in 0s \n", - "\n", - "2022-07-16 18:24:32 (31.1 MB/s) - written to stdout [1662/1662]\n", - "\n", - "Installing NLU 3.4.4 with PySpark 3.0.3 and Spark NLP 3.4.4 for Google Colab ...\n", - "Get:1 http://security.ubuntu.com/ubuntu bionic-security InRelease [88.7 kB]\n", - "Hit:2 https://developer.download.nvidia.com/compute/cuda/repos/ubuntu1804/x86_64 InRelease\n", - "Get:3 https://cloud.r-project.org/bin/linux/ubuntu bionic-cran40/ InRelease [3,626 B]\n", - "Hit:4 http://archive.ubuntu.com/ubuntu bionic InRelease\n", - "Hit:5 http://ppa.launchpad.net/c2d4u.team/c2d4u4.0+/ubuntu bionic InRelease\n", - "Ign:6 https://developer.download.nvidia.com/compute/machine-learning/repos/ubuntu1804/x86_64 InRelease\n", - "Hit:7 https://developer.download.nvidia.com/compute/machine-learning/repos/ubuntu1804/x86_64 Release\n", - "Get:8 http://archive.ubuntu.com/ubuntu bionic-updates InRelease [88.7 kB]\n", - "Hit:9 http://ppa.launchpad.net/cran/libgit2/ubuntu bionic InRelease\n", - "Hit:10 http://ppa.launchpad.net/deadsnakes/ppa/ubuntu bionic InRelease\n", - "Get:11 http://archive.ubuntu.com/ubuntu bionic-backports InRelease [74.6 kB]\n", - "Hit:12 http://ppa.launchpad.net/graphics-drivers/ppa/ubuntu bionic InRelease\n", - "Get:13 http://security.ubuntu.com/ubuntu bionic-security/restricted amd64 Packages [1,057 kB]\n", - "Get:14 http://security.ubuntu.com/ubuntu bionic-security/universe amd64 Packages [1,526 kB]\n", - "Get:15 http://security.ubuntu.com/ubuntu bionic-security/main amd64 Packages [2,897 kB]\n", - "Get:17 http://archive.ubuntu.com/ubuntu bionic-updates/main amd64 Packages [3,329 kB]\n", - "Get:18 http://archive.ubuntu.com/ubuntu bionic-updates/universe amd64 Packages [2,302 kB]\n", - "Fetched 11.4 MB in 4s (2,838 kB/s)\n", - "Reading package lists... Done\n", - "tar: spark-3.0.2-bin-hadoop2.7.tgz: Cannot open: No such file or directory\n", - "tar: Error is not recoverable: exiting now\n", - "\u001b[K |████████████████████████████████| 209.1 MB 49 kB/s \n", - "\u001b[K |████████████████████████████████| 145 kB 53.2 MB/s \n", - "\u001b[K |████████████████████████████████| 531 kB 54.8 MB/s \n", - "\u001b[K |████████████████████████████████| 198 kB 55.0 MB/s \n", - "\u001b[?25h Building wheel for pyspark (setup.py) ... \u001b[?25l\u001b[?25hdone\n" - ] - } - ] + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "markdown", + "source": [ + "# Upload License for Licensed visualizations\n", + "After NER example Licensed visualizations will start with licensed model. To be able to use Licensed visualizations, upload you license and run the following cells. If you will not use Licensed visualizations, you can skip the following cells.\n" + ], + "metadata": { + "id": "-lyRf41WGpyn" + } + }, + { + "cell_type": "code", + "source": [ + "from google.colab import files\n", + "print('Please Upload your John Snow Labs License using the button below')\n", + "license_keys = files.upload()" + ], + "metadata": { + "id": "qUpu6nmzGbgB" + }, + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "code", + "source": [ + "from johnsnowlabs import nlp\n", + "\n", + "# After uploading your license run this to install all licensed Python Wheels and pre-download Jars the Spark Session JVM\n", + "nlp.install()" + ], + "metadata": { + "id": "Yanv3DX1GcVK" + }, + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "code", + "source": [ + "from johnsnowlabs import nlp\n", + "spark=nlp.start()" + ], + "metadata": { + "id": "Fw5Jm5gXGjd8" + }, + "execution_count": null, + "outputs": [] }, { "cell_type": "markdown", @@ -127,62 +120,28 @@ "metadata": { "colab": { "base_uri": "https://localhost:8080/", - "height": 636 + "height": 192 }, "id": "EwIk8DSLlje4", - "outputId": "9b39d98f-65b0-4fcf-cedf-640b9225aea3" + "outputId": "57f4a7f2-9427-4c15-a18a-3b6730b81cb5" }, "source": [ - "nlu.load('ner').viz(\"Donald Trump from America and Angela Merkel from Germany don't share many oppinions.\")" + "from johnsnowlabs import nlp\n", + "\n", + "nlp.load('ner').viz(\"Donald Trump from America and Angela Merkel from Germany don't share many oppinions.\")" ], - "execution_count": 2, + "execution_count": null, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ + "Warning::Spark Session already created, some configs may not take.\n", + "Warning::Spark Session already created, some configs may not take.\n", "onto_recognize_entities_sm download started this may take some time.\n", - "Approx size to download 160.1 MB\n", - "[OK!]\n" - ] - }, - { - "output_type": "stream", - "name": "stderr", - "text": [ - "WARNING: pip is being invoked by an old script wrapper. This will fail in a future version of pip.\n", - "Please see https://github.com/pypa/pip/issues/5599 for advice on fixing the underlying issue.\n", - "To avoid this problem you can invoke Python with '-m pip' instead of running pip directly.\n" - ] - }, - { - "output_type": "stream", - "name": "stdout", - "text": [ - "Looking in indexes: https://pypi.org/simple, https://us-python.pkg.dev/colab-wheels/public/simple/\n", - "Collecting spark-nlp-display\n", - " Downloading spark_nlp_display-4.0-py3-none-any.whl (95 kB)\n", - "Requirement already satisfied: pandas in /usr/local/lib/python3.7/dist-packages (from spark-nlp-display) (1.3.5)\n", - "Requirement already satisfied: spark-nlp in /usr/local/lib/python3.7/dist-packages (from spark-nlp-display) (4.0.1)\n", - "Requirement already satisfied: numpy in /usr/local/lib/python3.7/dist-packages (from spark-nlp-display) (1.21.6)\n", - "Requirement already satisfied: ipython in /usr/local/lib/python3.7/dist-packages (from spark-nlp-display) (5.5.0)\n", - "Collecting svgwrite==1.4\n", - " Downloading svgwrite-1.4-py3-none-any.whl (66 kB)\n", - "Requirement already satisfied: decorator in /usr/local/lib/python3.7/dist-packages (from ipython->spark-nlp-display) (4.4.2)\n", - "Requirement already satisfied: pickleshare in /usr/local/lib/python3.7/dist-packages (from ipython->spark-nlp-display) (0.7.5)\n", - "Requirement already satisfied: traitlets>=4.2 in /usr/local/lib/python3.7/dist-packages (from ipython->spark-nlp-display) (5.1.1)\n", - "Requirement already satisfied: setuptools>=18.5 in /usr/local/lib/python3.7/dist-packages (from ipython->spark-nlp-display) (57.4.0)\n", - "Requirement already satisfied: prompt-toolkit<2.0.0,>=1.0.4 in /usr/local/lib/python3.7/dist-packages (from ipython->spark-nlp-display) (1.0.18)\n", - "Requirement already satisfied: pygments in /usr/local/lib/python3.7/dist-packages (from ipython->spark-nlp-display) (2.6.1)\n", - "Requirement already satisfied: simplegeneric>0.8 in /usr/local/lib/python3.7/dist-packages (from ipython->spark-nlp-display) (0.8.1)\n", - "Requirement already satisfied: pexpect in /usr/local/lib/python3.7/dist-packages (from ipython->spark-nlp-display) (4.8.0)\n", - "Requirement already satisfied: wcwidth in /usr/local/lib/python3.7/dist-packages (from prompt-toolkit<2.0.0,>=1.0.4->ipython->spark-nlp-display) (0.2.5)\n", - "Requirement already satisfied: six>=1.9.0 in /usr/local/lib/python3.7/dist-packages (from prompt-toolkit<2.0.0,>=1.0.4->ipython->spark-nlp-display) (1.15.0)\n", - "Requirement already satisfied: python-dateutil>=2.7.3 in /usr/local/lib/python3.7/dist-packages (from pandas->spark-nlp-display) (2.8.2)\n", - "Requirement already satisfied: pytz>=2017.3 in /usr/local/lib/python3.7/dist-packages (from pandas->spark-nlp-display) (2022.1)\n", - "Requirement already satisfied: ptyprocess>=0.5 in /usr/local/lib/python3.7/dist-packages (from pexpect->ipython->spark-nlp-display) (0.7.0)\n", - "Installing collected packages: svgwrite, spark-nlp-display\n", - "Successfully installed spark-nlp-display-4.0 svgwrite-1.4\n" + "Approx size to download 159 MB\n", + "[OK!]\n", + "Warning::Spark Session already created, some configs may not take.\n" ] }, { @@ -272,7 +231,7 @@ " }\n", "\n", "\n", - " Donald Trump PERSON from America GPE and Angela Merkel PERSON from Germany GPE don't share many oppinions." + " Donald Trump PERSON from America GPE and Angela Merkel PERSON from Germany GPE don't share many oppinions." ] }, "metadata": {} @@ -285,7 +244,7 @@ "id": "7PbHZHel14Ot" }, "source": [ - "# Visualize Dependency tree \n", + "# Visualize Dependency tree\n", "Visualizes the structure of the labeled dependency tree and part of speech tags" ] }, @@ -294,29 +253,32 @@ "metadata": { "colab": { "base_uri": "https://localhost:8080/", - "height": 535 + "height": 580 }, "id": "VtA6h62SVxTQ", - "outputId": "139ec924-499d-4a13-aa0e-b46ad11d9f9e" + "outputId": "b3f096dc-9e64-4bd0-b1bb-66b444bdae33" }, "source": [ - "nlu.load('dep.typed').viz(\"Billy went to the mall\")" + "nlp.load('dep.typed').viz(\"Billy went to the mall\")" ], - "execution_count": 3, + "execution_count": null, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ + "Warning::Spark Session already created, some configs may not take.\n", + "Warning::Spark Session already created, some configs may not take.\n", "dependency_typed_conllu download started this may take some time.\n", "Approximate size to download 2.4 MB\n", "[OK!]\n", + "pos_anc download started this may take some time.\n", + "Approximate size to download 3.9 MB\n", + "[OK!]\n", "dependency_conllu download started this may take some time.\n", "Approximate size to download 16.7 MB\n", "[OK!]\n", - "pos_anc download started this may take some time.\n", - "Approximate size to download 3.9 MB\n", - "[OK!]\n" + "Warning::Spark Session already created, some configs may not take.\n" ] }, { @@ -330,7 +292,7 @@ " font-family: \"Lucida\"; \n", " src: url(\"data:application/x-font-ttf;charset=utf-8;base64,AAEAAAAPAIAAAwBwRUJEVFYYYjAAAAD8AABgtEVCTEM/0hIZAABhsAAAFQhPUy8yhDq8bwAAdrgAAABWY21hcAsuGiUAAHcQAAAGRGN2dCBD1E2KAAB9VAAAAPRmcGdtLlHKAwAAfkgAAAAdZ2x5ZjN05rEAAH5oAAD3pmhlYWS3KoptAAF2EAAAADZoaGVhCyQFvAABdkgAAAAkaG10eIWDdo8AAXZsAAAKZGxvY2FFpYI+AAGA0AAABTRtYXhwBDwB9wABhgQAAAAgbmFtZbG45HUAAYYkAAAGT3Bvc3QJ91RUAAGMdAAAF7hwcmVwFtVKZwABpCwAAAD+AAIAAAAAAAADBAEBBAOAgACAAgMABAOgoAQDAAQDoOCg4AUDAAQDQOBA4EAEAwAEA2DAYMAEAwAEA0DAoGACAQEEA4CABQIBBANAgICAQAUCAAQDgEBAQIADAwAEA0CgQAMDAAMDQOBAAgIBAQNAgAECAQIDwAEBAQEDgAUDAAQDICBAgIAEAwAEA0CgoEAEAwAEA0DAQOAEAwAEA8BggOAEAwAEA8DAIMAEAwAEAyBg4CAEAwAEA+DAIMAEAwAEA0CA4EAEAwAEA+AgQEAEAwAEA0DgoEAEAwAEA0DgIEADAQEDA4AAgAQCAAMDQABAgAMCAAMDQIBAAwMAAwPgAOADAgEDA4BAgAQCAQQDwEAAgAUDAAQDYKCggGAEAwAEA0Cg4KAEAwAEA+DAoMAEAwAEA2CAgGAEAwAEA8CgoMAEAwAEA+DggOAEAwAEA8DggIAEAwAEA2CAoGAEAwAEA6DgoKAEAwAEA+BAQOAEAwAEA2AgIMAEAwAEA6DAoKAEAwAEA4CAgOAEAwAEA6Dg4KAEAwAEA6Dg4KAEAwAEA0CgoEAEAwAEA+DAgIAFAwAEA0CgoEAgBAMABAPgwKCgBAMABANgwCDABAMABAPgQEBABAMABAOgoKBABAMABAOgoEBABAMABAOgoODgBAMABAOgQKCgBAMABAOgQEBABAMABAPgQIDgBQIBBAPAgICAwAUDAAQDgIBAICAFAgEEA8BAQEDAAgMABANAoAEDAAAD4AICAQQDgEADAwADA8BgoAQDAAQDgMCgwAMDAAMDYIBgBAMABAMgYKBgAwMAAwNgwGAEAwAEA2BA4EAEAwADA2DgIMAEAwAEA4DAoKAEAgAEA0AAwEAFAgAEA0AAwECABAMABAOAoMCgBAIABAPAQEBAAwMAAwPg4KADAwADA8CgoAMDAAMDQKBABAMAAwPAoMCABAMAAwNgoGAgAwMAAwPggIADAwADA2BAwAQDAAQDQOBAIAMDAAMDoKBgAwMAAwOgoEADAwADA6Dg4AMDAAMDoECgBAMAAwOgoECAAwMAAwPgQOAFAgAEA0BAgEBABQEBBAOAgICAgAUCAQQDgIBAgIACAwADA0CgBAMABAPgQOCgBAMABANAQOCgBQMABANggIBggAQDAAQDIOCA4AQDAAQD4KDgoAQDAAQDoECgQAQDAAQDoKCgQAQDAAQDIMBgoAQDAAQDgMBgoAQDAAQD4MBgoAQDAAQDoMBgoAQDAAQD4MBgoAQDAAQDQMBgoAQDAAMDYIBggAQDAAQDIGDAYAQDAAQDgGDAYAQDAAQD4GDAYAQDAAQDoGDAYAQDAAQDIMBAQAQCAAQDgMBAQAQDAAQD4MBAQAQDAAQDoMBAQAQDAAQD4MCgoAQDAAQDIECgQAQDAAQDgECgQAQDAAQD4ECgQAQDAAQDoECgQAQDAAQD4ECgQAQDAAQDIKCgYAQDAAQDgKCgYAQDAAQD4KCgYAQDAAQDoKCgYAUDAAQDQOBAQEADAwAEA0CgQAUDAAQDQOCA4EAEAwAEAyBAwGAFAwAEA0CAQCBAAgIBAwPAwAUDAAQDYOBgYGAEAwAEA0CgwKAEAwAEA0DgoEAFAwAEA0Cg4KBAAgMABAPg4AICAQQDQIABAwAEA6AFAwAEAyDgQOCABAMABANgoMCgBAMABANgoKDAAwMAAwPgQOAEAwAEA0DgQOAFAwAEA2CAYADgBQMABAPAIMAA4AQDAAQDoEDgQAQDAAMDoKDAgAQDAAQDgECgQAQDAAQD4EBA4AQDAAQD4KCgoAMDAAMD4KCgBQMABAMgQEBAgAMDAAQDwGCgAwMABANAoEAEAwAEA0CgQOADAwADA+BA4AMDAAMDYKDABAIABANAAEDABQEBBAOAAICAgAIDAAID4CAFAwAEAyAgoKBABQMABAMgQOBAgAQDAAQDQKBAoAQDAAQDQKCg4AMDAAMDYMBgAwMAAwPAYMABAwABA6AAAAAAAwQDAAQDgEDgoAQDAAQD4EDgoAQDAAQD4ECgQAQDAAQDYODAYAMDAAMDYOBgAQMAAgPgAQMAAgPgAgMABAOgoAIDAAQDoKACAgEEA4BAAgIBBANAgAUDAAQDQADgAEAEAwAEA0CgoEAFAwAEA6CgoECABAMABAOgoEBAAwMAAwOgQKAEAgEEA0CAgEAEAgEEA4BAQIAEAwAEA2CA4KAEAwAEA2Cg4KAFAwAEA0DgQOBAAgIBAwPAwAICAQEDQIACAwABA6CgBQMABANAoECgQAQDAAQD4EDgoAQDAAQD4OCA4AQDAAQDIEDgoAQDAAQDoOCA4AQDAAQDgOCA4AQDAAQDIOBA4AQDAAQD4OBA4AQDAAQDoOBA4AQDAAQDgOBA4AQDAAQDIECgQAQDAAQD4ECgQAQDAAQDgECgQAQDAAQDIKCgQAQDAAQD4KCgQAQDAAQDgKCgQAMCAAMDwEBAAgMABANAoAIDAAQDYMABAwAEA+ACAwAEA6BAAQEBBAOAAwMABANAoEABAQEAA4ABAwAEA6ABAQIAA4ACAwAEA6BABAMABAOAwIDgBAMABAPAYMBABAMABAPgwCDABAMABAOgYEDABAMABAPg4EDgBAMABAPg4EDgBQEBBAOAgACAgAQDAAQDwOCgwAQDAAQDwECgQAQDAAQDIKBAQAUDAAQDIKCgQIAEAwAEA4DgwIAFAwAEA4DAoMCAAQMAAgPgAwMAAwOgQKADAwAEA8BA4AMDAAQDwEDgAwMABAPAYMAFAwAEA4CAYCBgBQMABAOAgCBgIAUDAAQDwECgYCAEAwAEA2BA4EAEAwAEA+BgoGAFAwAEA6BgYCBABAMABANA4EDgBQMABANgwCDAQAQDAAMDYEDAQAQDAAQDIGCAYAQDAAQDIGCAYAQDAAQDoGCAYAQDAAQDoGCAYAQDAAQDYGCgYAECAQIDwAEDAAQD4AEBAQIDgAQDAAQD4EDgoAQDAAQD4MBgoAQDAAQD4EDgoAQDAAQD4MBgoAUDAAQDQKDgoCAEAwADA8BgoCAEAwAEA+BggGAEAwAEA+BggGAEAwAEA0BggGAEAwAEA0BggGAEAwAEA+DAoMAEAwAEA2BgoGAEAwAEA8DgoMAEAwAEA+DggOAEAwAEA+BgwGAEAwAEA+DggOAEAwAEA+BgwGAEAwAEA0DggOAEAwAEA0BgwGAFAwAEA+DggOAgBAMAAwNgwGAgBAMABAOg4IDgBAMABAOgYMBgBAMABAPgYKBgBQIBBAPAwMBAgAQDAAQDQGCgYAUCAQQDgMDAQIAFAwAEA2CAoGCABQMABAMgYOAgwAQDAAQD4KDgoAQDAAQD4IDgoAQDAAQDoODgoAQDAAQDwIDAoAQDAAQD4OBA4AQDAAQD4MBAQAQDAAQD4OBA4AQDAAQD4MBAQAQDAAQD4OBA4AQDAAQD4MBAQAUDAAQD4EBA4CAFAwAEA0AAwEAgBAMABAPgoKDABQMABAOgAOCgQAQDAAQD4OAgwAUDAAQD4ADAQIAFAwAEA6DAoKBABQMABAOAoMCgQAMDAAMDoMCgBAMABANAgIDgBAMABAPgQEBABQMABAOAgIDgQAUCAAQDwEBAQIAEAwAEA6CggOAEAwAEA+BgQEAEAwAEA4CggOAEAwAEA8BAYEAEAwAEAyDg4KAEAwAEAyDAoKAFAwAEA6Dg4KBABAMAAwPAoKBABAMABAPgoOCgBAMABAPgwKCgBAMABAOAwKCgBQMABAOg4OCgIAQDAAMDwKCgIAQDAAQD4ECgQAQDAAQD4ECgQAQDAAQD4ECgQAQDAAQD4ECgQAQDAAQDoECgQAQDAAQDoECgQAQDAAQDIODAoAQDAAQDIOCAgAUDAAQD4MCgoEAEAwADA+CAgEAEAwAEA+Dg4KAEAwAEA6DggIAEAwAEA+DAIMAEAwAEAyBgQMAEAwAEA+DAIMAEAwAEA+BgQMAFAwAEA+BAQECABQMABANA4EAgQAQDAAQD4OBAQAQDAAQDYOBAIAQDAAQD4EDgQAQDAAQD4OBAIAQDAAQD4KCgQAQDAAQD4KCgYAQDAAQD4KCgQAQDAAQD4KCgYAQDAAQD4KCgQAQDAAQD4KCgYAQDAAQD4KCgQAQDAAQDQKCgQAQDAAQDoKCgQAQDAAQDoKCgYAUDAAQDoKCgQCAEAwADA6CgYCAEAwAEA+Cg4OAEAwAEA+Cg4OAEAwAEA+CgQEAFAwAEA+CgoECABAMABAMg4EDgBAMABAMg4EDgBAMABANA4EDgBAMABANA4EDgBAMABAMgQMBABAMABAPA4KDgBAMABAOgwGCgBAMABAMgYMDgBAMABAMg4ECgBAMABANg4KDABAMABAMgYKDABAIAAwNAAECAAgEBBAOAgAIDAAQDQKAEAwAEA8Cg4KABAQEDA4AEAwAEA+DgQGAEAwAEA4Cg4KAEAwAEA+DAQOAEAwAEA8CgoEAEAwAEA6DAQEAEAwAEA8CgQOAEAwAEA+BAQCAEAwAEA0Cg4KAEAwAEA+DAoMAEAwAEA+CAgIAEAwAEA0CgoOAEAwAEA+DggOAEAwAEA+BAgOAEAwAEA6DgoKAEAwAEA0DgoEAEAwAEA+BAQOAEAwAEA6DAoKAEAwAEA0BAoKAEAwAEA+DgoKAEAwAEA6Dg4KAEAwAEA+BAAOAEAwAEA0CgoEAEAwAEA+CgoKAEAwAEA+DAgIAEAwAEA+BAgOAEAwAEA+BAQEAEAwAEA6BAQEAFAwAEA0CgoEBABAMABAOgQKCgBAMABAPgoOBABAMABANAoEDgBAMABAOg4EDgBAMABAOgoEBABAMABANAYKBgBAMABANAYMBgBQMABANAwKCgIAQCAQQDgACAQAQDAAQD4KCgQAMDAAMDYKBgBQMABAPgwKDAgAQDAAMDoKBAQAQDAAQDYECgQAMDAAMDYMBgBQMABAPgQIBgIAQDAAMDwKCgIAQDAAQDQOCgQAMCAQMDgIBAAwMAAwOgwKAEAwAEA4BAoKAEAwADA6CgwIADAwADA6CgQAUDAAQD4EDgQOADAwADA0CgQAQDAAMDQKDAgAQDAAMDYIBgIAMDAAMDYKBAAwMAAwPgQEADAwADA6CgQAUDAAQDQECgQEAEAwADA6BAoKAFAwAEA0DgoEBAAwMAAwOg4OAEAwAEA6BAQCAEAwAEA6CgoEAEAwAEA0BAoEAEAwAEA0CgoEAEAwAEA0CgoOAEAwAEA6DggOAEAwAEA+BAYGAEAwAEA0DggIAEAwAEA2DggGAEAwAEA2DAIMAEAwAEA+BAQOAEAwAEA6DgQOAEAgEEA8BAQIAEAwAEA8DA4OAEAwAEA8DAoOAEAwAEA+BAYGAEAwAEA0CgwKAEAwAEA+CgQIAFAwAEA6CgoOBABAMABANAoOCgBAMABAPggODABAMABAPgwKDABAMABAPggICABQMABANgYKDgoAQDAAQD4OCA4AQDAAQD4EDg4AQDAAQDwMAgwAQDAAQDoODgoAQDAAQD4KDgoAQDAAQDoMCgoAQDAAQDYGCgoAQDAAQDoODgoAQDAAQDoOCgoAQDAAQDQKCgQAQDAAQD4KCgoAQDAAQD4MCAgAQDAAQDYICAYAQDAAQD4EBAQAQDAAQDoKBAgAUDAAQDQECgQEAEAwAEA6BAoKAFAwAEA6CgoOAgBAMABAOgoGAgBAMABAOgoKDgBQMABAOgoKDgIAQDAAQDwEBgYAQDAAQDoKDg4AQCAQQDgIDAwAQDAAQDwOAgwAQDAAQDwKCgwAQDAAQD4GCgoAMDAAMDwGCgBAMABAMgQKBAAwMAAwPg4OADAwADA+CAgAQDAAMDYGDgoAMDAAMDYMBgAwMAAwPgQOADAwADA8BgwAMDAAMDoOCgAwMAAwOg4KADAwADA6DAoAMDAAMDYGCgAwMAAwPg4KADAwADA6DgoAMDAAMDQKBAAwMAAwPgoKAEAwADA8CgwIADAwADA2CAYAMDAAMD4EBABAMAAwOgoECABQMABANAQKBAQAMDAAMDoECgBAMAAwOgoOAgAwMAAwOgYCADAwADA6Cg4AQDAAMDoKDgIAMDAAMDwGBgAwMAAwOg4OADAgEDA4DAwAMDAAMDwGDAAwMAAwPAoMADAwADA+BgoAQDAAQDoGDAYAUDAAQDwIDAoCAEAwAEA0DggIADAwADA2DAYAMDAAMDYEDABAIABANAAMBABAMABAOgAMBABQIABANAAMBAgAMDAAMDwODgAwMAAwPAoOAEAwAEA8CAwKAEAwAEA0CgwKAFAwAEA+CgoECABAMAAwOgoOBABAMABAMg4ICABAMABAMg4ICABAMABAOAoODgBAMABAOAoODgBAMABAMgoODgBAMABAMgoODgBAMABAOgoODgBAMABAOgoODgBAMABAOAoEBABQMABAOAoKBAgAEDAAID4AIDAAED4OAEAwAEA6CgAKABAwAEA+ADAwADAyBAgAMDAAQDwKCgBAMABAMgwEDgBAMABAPA4KCgBAMABAPAwODgBQMABAOgwOBgYAUDAAQDwOBA4GAFAwAEA8DgQOBgBQMABAPA4EDgYAMDAAMDQOBABQMABANA4EBAQAMDAAMDQOBABQMABANAQEDgQAMDAAMDQOBABQMABANA4EDgQAUDAAQDQODgQOADAwADA4CA4AMDAAMDQKCgBQMABAPgAOAA4AQDAAQDQKCg4AIDAAID4IAFAgEEA0CAgICABQIABANAQEBAgAEDAAID4AUBAQQDgICAgIADAgECA8CAgAMCAAIDwEBAAwIBBAOAgMADAgAEA0BAwAUCAQQDgIDAgIAFAgAEA0BAwEBAAwMAAgPgQEADAwAEA0BA4AUDAAQDQEDgQEADAwADA+AA4AUBAQQDgICAgIAEAgEDA8CAwIADAgECA8CAgAQCAQMDwIDAgAQCAAMDwEDAQAMCAAIDwEBABAIAAwPAQMBABAIBBAOAwIDAAwIBBAOAgMAEAgEEA4DAgMAEAgAEA0DAQMADAgAEA0BAwAQCAAQDQMBAwAUCAQQDgMCAwIAFAgEEA4CAwICABQIBBAOAwIDAgAUCAAQDQMBAwEAFAgAEA0BAwEBABQIABANAwEDAQAQDAAMD4ADgQAMDAAID4EBABAMAAwPgAOBABAMABANA4ADgAwMABANAQOAEAwAEA0DgAOAFAwAEA0DgQOBABQMABANAQOBAQAUDAAQDQOAA4EADAwAEA+Dg4AMDAAID4ODgBQMABAPg4ODg4AUCAAQDwMDAwMAFAgEEA8DAwMDABQMABAOgAKAAoAUDAAQDoECgQKAFAwAEA+Cg4KDgAwMAAwPg4OACAwADA+DgBAMABANAQODgAwMAAwPA4MAEAwAEA+DgQEADAwADA2DgYAMDAAMD4KDgBQMABAPg4KDg4AUDAAQD4ICggOAEAwAEA0Cg4EAEAwAEA0DgoEADAwADA6BAoAUDAAQDQKBA4EAEAwAEAyBgoEAEAwAEA0DgQOAEAwAEA0DgQOAEAwAEA6Dg4EAEAwAEA0Dg4EAEAwAEA2BAwMAFAwAEA2BAQKCgAAAAAAQFAQIFBICAgACAAgMBBQSgoAQEAAQEUPBg8AYDAAUEQODAYOBABQQABQRQoGBQoAUEAAUEQKBQoHACAQIFBICABgMBBQQgQICAQCAGAwEFBIBAICBAgAQDAQUEQKBAoAMDAQMEQOBAAgIBAQRAgAEDAQIE4AEBAgEEgAYEAAUEECAgQICABQMBBQRAoKCgQAUDAQUEQMBAQOAFAwEFBMAgQIDgBQMBBQTAIMAgwAUEAAUEIGCg8CAFAwEFBOCAwCDABQMBBQRAgMCgQAUDAQUE4CBAQEAFAwEFBECgQKBABQMBBQRAoGAgQAQBAgQEgAAAgAUCAQQEQAAAQIADAgEDBECAQAMDAQME4ADgAwIBAwSAQIAFAwEFBMAgQABABgQABQRgkLCwgHAEAwEEBECg4KAEAwEEBMDAoMAEAwEEBGCAgGAEAwEEBMCgoMAEAwEEBODggOAEAwEEBODggIAEAwEEBGCAoGAEAwEEBKDgoKAEAwEEBOBAQOAEAwEEBGAgIMAEAwEEBKDAoKAEAwEEBICAgOAEBAAEBJDw8JAEAwEEBKDg4KAEAwEEBECgoEAEAwEEBODAgIAFAwEEBECgoEAgBAMBBATgwKCgBAMBBARgwCDABAMBBATgQEBABAMBBASgoKBABAMBBASgoEBABAMBBASgoODgBAMBBASgQKCgBAMBBASgQEBABAMBBATgQIDgBgIBBQTAgICAgMAGBAAFBIBAQCAQEAYCAQUEwEBAQEDABAMBBQRAQKCgAQQAAATwAgIBBQSAQAMDAQMEwGDgBQMBBQSAgMCgwAMDAQMEYIBgBQMBBQQgIGCgYAMDAQMEYMBgBQMBBQQgQOBAQAQDAQMEYOAgwAUDAQUEgIDAoKAFAgEFBEAAwEBABgIBBQRAAMBAQIAFAwEFBICAoMCgBQIBBQTAQEBAQAMDAQME4OCgAwMBAwTAoKADAwEDBECgQAQDAQMEwKDAgAQDAQMEYKBgIAMDAQME4ICAAwMBAwRgQMAEAwEEBEDgQCADAwEDBKCgYAMDAQMEoKBAAwQAAwSQ8GADAwEDBKBAoAQDAQMEoKBAgAMDAQME4EDgBgMBBQQgQIBAQCAGAQIFBICAgICAgAYDAQUEgEAgQECAAgQAAwRQoAUDAQUEoECg4KAFAwEFBEDgoOCgBQMBBARggIBggAUDAQUEIODggOAFAwEFBOCg4OCgBQMBBQSgQKCgQAUDAQUEoKCgoEAFAwEFBCBAwGDgBQMBBQSAQMBg4AUDAQUEQKDAYOAFAwEFBKAAwGDgBQQABQRQoGAwcAUDAQUEQKDAYOAEAwEDBGCAYIAFAwEFBCBAYMBgBQMBBQSAQGDAYAUDAQUEQKBgwGAFAwEFBKAAYMBgBQMBBQQgQMBAQAUCAQUEgEDAQEAFAwEFBECgwEBABQMBBQSgAMBAQAUEAAUEUKBgUFAFAwEFBCBAQKBABQMBBQSAQECgQAUDAQUEQKBAoEAFAwEFBKAAQKBABQQABQRQoCBQIAUDAQUEIECgoGAFAwEFBIBAoKBgBQMBBQRAoKCgYAUDAQUEoACgoGAFAwEFBEDgQEBAAwMBBQRAoEAFAwEFBEDggOBABQQABQQgQGDAcAYDAQUEYECgQCDAAgIBAwTAwAYEAAUEcNDQUFBQBQQABQRAoKCQoAUEAAUEYNDw0GAGBAAFBGCQ8JDwYAMEAAUE8FBQAgICBQRAgAEDAQUEoAUEAAQEIPBA8EAEBAAEBHCw4LAEAwEEBGCgoMADBAADBGCwYAQDAQQEQOBA4AUDAQUEYIBgAOAFAwEFBMAgwADgBQMBBQSgoEDgQAQDAQMEoKDAgAUDAQUEQCBgoEAEBAAEBPBAQPAEBAAEBPBQUFADBAADBPBQUAYDAQUEIEBAQECABAMBBQTAIODgBAMBBQRAoKBABQMBBQRAoKBA4AMEAAME8GCwAwMBAwRgoMAGAwEFBEAAQEAgwAUBAgQEgACAgIACAwECBOAgBgQABQQQEBCgoEAGAwEFBCBA4EBAgAUEAAUEUKAAUKAEAwEEBECgoOADBAADBFCgUAMEAAMEoFCgAQMBAQSgAAAAAAQFAwEFBIBAoOCgBQMBBQTgQKDgoAUDAQUE4ECgoEAEBAAEBHCwoHADBAADBHCgUAEDAQIE4AEEAAIE8AIEAAUEoFACBAAFBFCgAgIBBQSAQAICAQUEQIAFAwEEBEAA4ABABAMBBARAoKBABgMBBQSgAKCgQIAFAwEFBKCgQEBABAQABQSQYGCQBAIBBARAgIBABAIBBASAQECABQQABQQwQPBQUAUEAAUEMFDwUFAFAwEFBEDgQOBAAgIBAwTAwAICAQEEQIACBAABBFCgBQQABQSgUKBQoAUDAQUE4ECg4KAFAwEFBODg4IDgBQMBBQQgQKDgoAUDAQUEoODggOAFAwEFBIDg4IDgBQMBBQQg4EBA4AUDAQUE4OBAQOAFAwEFBKDgQEDgBQMBBQSA4EBA4AUDAQUEIECgoEAFAwEFBOBAoKBABQMBBQSAQKCgQAUDAQUEIKCgoEAFAwEFBOCgoKBABQQABQSAUFBQIAMCAQMEwEBAAgMBBQRAoAIEAAUEUKABBAAFBPACBAAFBJBgAQECBQSAAwMBBQRAoEABAQIABIACBAAFBFCgAQECAASAAgMBBQSgQAQEAAQEQGDAcAUDAQUEwEBgwEAFAwEFBOBgwCDABQMBBQSgQGBAwAUDAQUE4OBAgOAFAwEFBOAA4EDgBgECBQSAgACAgIAEBAAEBGDwUGAFAwEFBKDAQKBABQMBBQQgoEBAQAYDAQUEIECgoECABAMBBASA4MCABgMBBQSAgMCgwIABAwECBOADAwEDBKBAoAQDAQUEwEBA4AQDAQUEwCDA4AQDAQUEwOAgwAYEAAUE0GBwUGCwBgQABQTQYFAwcJAGBAAFBNDgUPBwkAUEAAUEcHBA4EAFAwEFBOBggKBgBgMBBQSgQGDgIMAFAwEFBEDgQEDgBQMBBARgwCDAQAQDAQMEYEDAQAUDAQUEIGCAgGAFAwEFBCBAYIBgBQMBBQTgYICAYAUDAQUEoEBggGAFAwEFBOAgYKBgAQMBAgTgAQQABQTwAQECAgSABQMBBQTgQKDgoAUDAQUE4ADAYOAFAwEFBOBAoOCgBQMBBQSgQMBg4AUDAQQEQKDgoCAEAwEDBMBg4CAFAwEFBOBggIBgBQMBBQRAoGCAYAUDAQUEQGCAgGAFAwEFBEAAYIBgBQMBBQTgwKCgwAUEAAUEsFAwUDAEBAAEBGDwUGAFAwEFBODg4IDgBQMBBQTgAGDAYAUDAQUE4ODggOAFAwEFBKBAYMBgBQMBBQRA4OCA4AUDAQUEQABgwGAFAwEEBODggOAgBAMBAwRgwGAgBQMBBQTg4OCA4AUDAQUEoEBgwGAFAwEFBOBggKBgBgMBBQRAoGDgIMAFAwEFBEBggKBgBgMBBQRAAGDgIMAFAwEEBGCAoGCABQMBBAQgYOAgwAUDAQUE4KDgoKAFAwEFBOCAwKCgBAQABARQ8HBQBQQABQTgQGBQUAUDAQUE4OBAQOAFAwEFBOAAwEBABQMBBQTg4EBA4AUDAQUE4ADAQEAFAwEFBODgQEDgBQMBBQSgQMBAQAUDAQQE4EBA4CAGAwEFBEAAwEBAIAQEAAQE8FBQ4AYEAAUEUADwUFAgBQMBBQRgYCAgwAYDAQUE4ADAQECABQMBBASgwKCgQAYDAQUEgICgwKBAAwMBAwSgwKAFAwEFBECAgIDgBQQABQTQYEBAQAUDAQQEgICA4EAGAgEFBMBAQEBAgAQDAQQEoKCA4AUEAAUE0FBAQEAFAwEFBICAoIDgBQQABQTAQFBAQAUDAQUEIKDg4KAFAwEFBCBAwKCgBQMBBASg4OCgQAQDAQMEwKCgIAUDAQUE4KDg4KAFAwEFBKBAwKCgBQQABQSAgGBQUAUDAQQEoODgoCAEAwEDBMCgoCAFAwEFBOBAoKBABQMBBQTgAECgQAUDAQUE4ECgoEAFAwEFBOAAQKBABQMBBQSgQKCgQAUDAQUEoABAoEAFAwEFBCDgwKCgBQMBBQQgQOCAgAUDAQQE4MCgoCAEAwEDBOCAgEAFAwEFBODgwKCgBQMBBQSgQOCAgAUDAQUEIGDAIMAFAwEFBCBAYEDABQMBBQRgYMAgwAUDAQUEQKBgQMAFAwEEBOBAQECABQMBBARA4EAgQAUDAQUE4OBAQEAFAwEFBCBA4EAgBAMBBATgQOBABAMBBATg4EAgBQMBBQTgoKCgQAUDAQUE4ACgoGAFAwEFBOCgoKBABQMBBQTgAKCgYAUDAQUE4KCgoEAFAwEFBOAAoKBgBQMBBQTgoKCgQAUDAQUEQKBAoEAFAwEFBKCgoKBABQMBBQSgAKCgYAUDAQQEoKCgQCAEAwEDBKCgYCAFBAAFBGCQkGBgBQQABQRgAJDwYAUDAQUE4KBAQEAGAwEFBOAAoKBAgAUDAQUEIOBAgOAFAwEFBCBA4EDgBQMBBQRA4ECA4AUDAQUEQADgQOAFAwEFBCBAwEBABQQABQRwoFBwUAUEAAUEULBgMHAFBAAFBBBwsOCwBQQABQQQIPBgsAUDAQUEIGCgoMAFAwEFBCBAYKDABQIBBARAAABAgAIBAgUEgIACAwEFBECgBQQABQSAoFBwUAEBAgMEgAQEAAQE8PBAcAQEAAQE0PBQUAQEAAQE8KAgcAQEAAQEoNBQIAQEAAQE0KAgIAQEAAQEoNAgcAUDAQUEQKBAQCAEAwEEBECg4KAEAwEEBODAoMAEAwEEBOCAgIAEAwEEBECgoOAEAwEEBODggOAEAwEEBOBAgOAEAwEEBKDgoKAEAwEEBEDgoEAEAwEEBOBAQOAEAwEEBKDAoKAEAwEEBEBAoKAEBAAEBJDw8JAEAwEEBKDg4KAEAwEEBOBAAOAEAwEEBECgoEAEAwEEBOCgoKAEAwEEBODAgIAEAwEEBOBAgOAEAwEEBOBAQEAEAwEEBKBAQEAGAwEFBEBAoKBAQAQDAQQEoECgoAUDAQUEQKDgQEAEAwEEBECgQOAFAwEFBKDgQEDgBQMBBQSgoEBAQAUDAQUEQABgoGAFAwEFBEAAYMBgBgMBBQRAAMCgoCAFAgIFBIAAgIBABQMBBQTgAKCgQAMDAQMEYKBgBgMBBQRAoMCgwIAEAwEDBKCgQEAFAwEFBECAQKBAAwMBAwRgwGAGAwEFBOBAgIBgIAQDAQMEwKCgIAUDAQUEQKDgoEADAgIDBICAQAMDAQMEoMCgBQMBBQSAQECgoAQDAQMEoKDAgAMDAQMEoKBABgMBBQTgQGCAYCADAwEDBECgQAQDAQMEQKDAgAQDAQMEYIBgIAMEAAMEcKBAAwMBAwTgQEADAwEDBKCgQAUDAQQEQECgQEAEAwEDBKBAoKAFBAAEBCCwsGAgAwQAAwSwsGAFAwEFBKAAQEAgBQMBBQSgAKCgQAUDAQUEQABAoEAFAwEFBEAAoKBABQQABQRAALCwYAUDAQUEoODggOAEBAAEBOBAcGAFAwEFBEDggICABAMBBARg4IBgBAMBBARgwCDABAMBBATgQEDgBQMBBQSg4EBA4AQCAQQEwEBAgAQEAAQE4KCwsAQEAAQEoOCwsAQEAAQE4EBgUAUDAQUEQKDAoKAFAwEFBOCgoECABQMBBASgoKDgQAQDAQQEQKDgoAQDAQQE4IDgwAQDAQQE4MCgwAQDAQQE4ICAgAUEAAQEcFCQ8JAEAwEEBODggOAEBAAEBLBgYLAEAwEEBMDAIMAEAwEEBKDg4KAFAwEFBECg4OCgBAMBBASgwKCgBAQABARwUFCQBAQABASQ8PCQBAMBBASg4KCgBAMBBARAoKBABAMBBATgoKCgBAMBBATgwICABAMBBARggIBgBAMBBATgQEBABAMBBASgoECABQQABAQgYLBgIAQDAQQEoECgoAUDAQQEoKCg4CAEAwEEBKCgYCAEBAAEBLCwsPAFBAAEBLCwsPAQBAQABATAQHBgBAQABASQkPDQBAMBBASAgODABAMBBATA4CDABAQABASg0NCgBAMBBATgYKCgAwMBAwTAYOAFAwEFBCBA4KBAAwMBAwTg4OADAwEDBOCAgAQEAAMEcFDwkAMDAQMEYMBgAwQAAwSwYLADAwEDBMBgwAMDAQMEoOCgAwMBAwSg4KADAwEDBKDAoAMEAAMEcFCQAwQAAwTw8JADAwEDBKDgoAMDAQMEQKBAAwMBAwTgoKAEAwEDBMCgwIADAwEDBGCAYAMDAQME4EBABAMBAwSgoECABgQABQQgIGCwYCADAwEDBKBAoAQDAQMEoKDgIAMDAQMEoGAgAwQAAwSwsPAEBAADBLCw8BADBAADBMBwYAMEAAMEkPDQAwMBAwSA4MADAwEDBMBgwAMEAAMEoNCgAwMBAwTgYKAFAwEFBKAAYMBgBgQABQRA4EBgUBAFAwEFBCBA4ICAAwMBAwRgwGADAwEDBGBAwAUCAQUEQADAQEAFAwEFBKAAwEBABgIBBQRAAMBAQIADBAADBOCwsAMEAAMEoPCwBQQABQRA4EBgUAUDAQUEQACgwKAGAwEFBOAAoKBAgAQDAQMEoKDgQAUDAQUEIOCAgIAEAwEEBCDggIAFBAAFBECQkPBgBQQABQSAQJDwYAUEAAUEIJCQ8GAFBAAFBBAgkPBgBQQABQRQkJDwYAUEAAUEkACQ8GAFAwEFBICgQEBABgMBBQSAQKCgQIABAwECBOACBAABBPDwBQMBBQSgoKAAoAEEAAUE8AQEAAQEECBAgAMDAQUEwKCgBQQABQQgQOBA8AUEAAUEwOCwoJAFBAAFBKDg4LCwBgQABQSQoFCgUCAGBAAFBNDgUKBQIAYEAAUE0KBQoFAgBgQABQTQYNCgUCADBAADBEDwQAYDAQUEQOBAQEBAAwQAAwQg8CAGAwEFBEBAQEDgQAMEAAMEYPBgBgMBBQRA4EBA4EAGAwEFBEDgQOBA4AMDAQMEgIDgAwQAAwRgkJAFAwEFBOAA4ADgBAMBBARAoKDgAgMBAwTggAYCAgUEQICAgICABgIBBQRAQEBAQIABBAADBPAGAQIFBICAgICAgAQCAgMEwICAgAQDAAME4CAgIAMCAgUEgIDAAwMABQQgIOAGAgIFBICAwICAgAYDAAUEICDgICAgBAQAAwTwICAgAwQABQQgIPAGBAAFBCAg8CAgIAMEAAQE8ADwBgIBBQTAwMDAwMAFAgIEBMCAwICABAMBAwTgwMDABQMBBATggODAwAUDAAQE4CDgICAEAwADBOBgYGAFAwAEBOAg4GBgBAICBQSAwIDAAwMBBQTAwOAEAwEFBMDggOAEAwAFBCDgIOADAwAFBGBg4AQDAAUEYOAg4AYCAgUEgMCAwICABgMBBQTAwODAwMAGAwEFBMDggODAwAYDAAUEIOAg4CAgBgMABQRgYOBgYGAGAwAFBGDgIOBgYAUEAAQE8ADwICAEBAADBPBgYGAFBAAEBPAA8GBgBAQABQQg8ADwAwQABQRgYPAEBAAFBGDwAPAGBAAFBCDwIPAgIAYEAAUEYGDwYGBgBgQABQRg8ADwYGADBAAFBPDw8AMEAAIE8PDwBgQABQTw8PDw8PAGAgAFBMDAwMDAwAYCAgUEwMDAwMDABQMABQSgAKAAoAYEAAUEoFCgUKBQBgQABQTwoPCg8KADAwEDBODg4AIDAQME4OAEAwEEBEBA4OADBAADBMDwwAQDAQQE4OBAQAMEAAMEMPAwBAQABARgkJBgBgQABQTw8JCQ8PAGBAAFBPCQYGCQ8AUEAAUEYPCQ8GAFBAAFBGCQ8JBgAwMBAwTgoOAFAwEEBECgQOBABAQABAQQYKBABQMBBQRA4OBA4AQDAQQEQOBA4AQDAQQEoODgQAQDAQQEQODgQAUEAAUEYFBAwMAGBAAFBDBQUHDwwAAAAAAEBgECBgSAgICAAIACAwEGBKCgBQQABQRQ8FDwoAcDAAYEQODAQGDgQAYEAAYEUKBAIFCgBgQABgRAoECwoHACAQIGBICABwMBBgQgQICAgEAgBwMBBgSAQCAgIECABAMBBgRAoECgAwMBAwRA4EADAgEBBEBAgAEDAQME4AEBAgEEgAcEAAYEECAgQECAgAYEAAYEYJCQkJBgBgMBBgRAwEBAQOAGAwEGBMAgIECA4AYDAQYEwCDAICDABgQABgQgYKDwICAGAwEGBOCAwCAgwAYDAQYEYIDAoKBABgMBBgTgICBAQEAGAwEGBECgQKCgQAYDAQYEQKCgYCDABAECBASAAACABgIBBARAAABAQIAFAwAFBCBAgEAgAwMBBATgAOAFAwEFBIBAIECABgMBBgTAICBAAEAHBAAGBCBQkLCwgHAFBAAFBGCQ8JCQBQMBBQTAoMCg4AUDAQUEYICAgGAFAwEFBMCgoKDABQMBBQTggOCA4AUDAQUE4IDggIAFAwEFBGCAoKBgBQMBBQSgoOCgoAUDAQUE4EBAQOAFAwAFBGAgICDABQMBBQSgoMCgoAUDAQUEgICAgOAFBAAFBJDw8JCQBQMBBQSg4OCgoAUEAAUEYJCQkGAFAwEFBMCgwICABgQABQRgkJCQYDAFAwEFBMCgwKCgBQMBBQRggEAgwAUDAQUE4EBAQEAFAwEFBKCgoKBABQMBBQSgoKBAQAUEAAUEkJDw8GAFAwEFBKCgQKCgBQMBBQSgoEBAQAUDAQUE4CBAgOAHAgEGBMCAgICAgMAHBAAGBIBAQCAgEBAHAgEGBMBAQEBAQMAFAwEGBEBAoKCgAQQAAATwAgIBBgSAQAQDAQQEwCDg4AYDAQYEgIDAoKDABAMBBARggIBgBgMBBgQgIGCgoGAEAwEEBEDggGAGAwEGBGBA4EBAQAUDAQQEYKDgIMAGAwEGBICAwKCgoAYCAQYEQADAQEBABwIBBgRAAMBAQECABgMBBgSAgKDAoKAGAgEGBMBAQEBAQAQEAAQEkPCQkAQDAQQEwKCgoAQDAQQEQKCgQAUDAQQEwKCgwIAFAwEEBGCgoGAgBAMBBASgwICABAMBBARgwCDABQMBBQRA4EBAIAQDAQQEoKCgYAQDAQQEoKBAQAQEAAQEkJDwYAQDAQQEoEBAoAUDAQQEoKBAQIAEAwEEBOBAgOAHAwEGBCBAQIBAQCAHAQIGBICAgICAgIAHAwEGBIBAQCBAQIACBAADBFCgBgQABgSQYJDwkJAGBAAGBGBgkPCQkAcDAQUEYICAgGBAgAYDAQYEIOCA4IDgBgMBBgTgoODgoKAGBAAGBJBgkJCQYAYDAQYEoKCgoKBABgMBBgQgQMAg4OAGBAAGBIBAYBBwcAYDAQYEQKDAIODgBgMBBgSgAMAg4OAGBAAGBFCgYBBwcAYDAQYEQKDAIODgBgMBBARggIBgQIAGAwEGBCBAQOCAYAYEAAYEgEAgcEAwBgMBBgRAoEDggGAGAwEGBKAAQOCAYAYDAQYEIEDAQEBABgMABgSAQGAgICAGAwEGBECgwEBAQAYDAQYEoADAQEBABgMBBgTgAMCgoKAGAwEGBCBAQKCgQAYDAQYEgEBAoKBABgMBBgRAoECgoEAGAwEGBKAAQKCgQAYEAAYEUKAgUFAgBgMBBgQgQKCgoGAGAwEGBIBAoKCgYAYDAQYEQKCgoKBgBgMBBgSgAKCgoGAGAwEFBEDgQEBAQAMDAQYEQKBABQMBBQRA4IDgQAUEAAUEIEBgwHAHAwEGBGCAQKBAIMACAgEDBMDABwQABgRw0NBQUFBQBgQABgRAoKCgkKAGBAAGBGDQ8NCQYAcEAAYEYJDw0PCQYAMEAAYE8FBQAgICBgRAgAEDAQYEoAUEAAQEIPBA8EAFBAAFBHCg8KCwBwQABgQQYLCQ0GCABAQABARgsLBgBAMBBARA4EDgBQMBBQRggGAA4AUDAQUEwCDAAOAFAwEFBKCgQOBABQMBBASgoKDAgAYDAQYEQCBgoKBABQQABQTwQCBA8AUEAAUE8FBQUFAEBAAEBPBQUFAHAwEFBCBAQEBAQIAEAwEGBMAg4OAEAwEGBECgoEAGBAAGBGCQkJBg8AQEAAQEoHDAsAYDAQUEIECgoECABgMBBQRAAEBAIMAFAQIEBIAAgICAAgMBAwTgIAcEAAYEEBAQIKCgQAcDAQYEIEBA4EBAgAUEAAUEUKAAUKAFBAAFBGBgkJDwAwQABARQoFADBAAEBKBQoAEDAQEEoAAAAAAEBgQABgSAYJDwkJAGBAAGBGBgkPCQkAYEAAYEYGCQkJBgBQQABQRwoLCgcAQEAAQEULCgUAEDAQME4AEEAAME8AMEAAYEoKBQAwQABgRQUKADAgEGBICAQAMCAQYEQECABQMBBQRAAOAAQAUDAQUEQKCgoEAHAwEGBKAAoKBAQIAGAwEGBKCgoEBAQAQEAAUEkGBgkAQCAQQEQICAQAQCAQQEgEBAgAYEAAYEMEDwUFBQBgQABgQwUPBQUFAGAwEFBEDgQEDgQAICAQMEwMADAgEBBEBAgAMEAAEEUFCgBgQABgRQoECgUKAGBAAGBGBgkPCQkAYDAQYE4OCA4IDgBgQABgQQYJDwkJAGAwEGBKDggOCA4AYEAAYEgHBAcEBwBgMBBgQg4EBAQOAGAwEGBODgQEBA4AYDAQYEoOBAQEDgBgQABgSAcCAgIHAGBAAGBBBgkJCQYAYEAAYEYGCQkJBgBgQABgSAYJCQkGAGBAAGBBCgoKCgQAYDAQYE4KCgoKBABgQABgSAUFBQUCAEAgEEBMBAQEACAwEGBECgAgQABgRQoAEEAAYE8AIEAAYEkGABAQIGBIADAwEGBECgQAICAQAEQIACBAAGBFCgAQECAASAAgMBBgSgQAUEAAUEQEBgwHAGAwEGBMBAYMBAQAYDAQYE4GCAQCDABgMBBgSgQGDAIMAGAwEGBODgIECA4AYDAQYEoEDgYIDgBwECBgSAgIAAgICABQQABQRgUPBQYAYDAQYEoMBgoKBABgMBBgQgoKBAQEAHAwEGBCBAoKBAQIAFAwEFBIDAoMCABwMBBgSAgMCgoMCAAQMBAwTgBAQABASQYGCQBAMBBgTAQEDgBAMBBgTAIMDgBAMBBgTA4CDABgQABgTQYHBQYLAGBAAGBNBgUDBwkAYEAAYE0OBQ8HCQBgQABgRwQHBA4EAGAwEGBGBggKCgYAcDAQYEoEBgoOAgwAYDAQYEQOBAQEDgBgMBBQRggEAgwEAFAwEEBGDAIMBABgMBBgQgYICAgGAGAwEGBCBAYICAYAYDAQYEYGCAgIBgBgMBBgSgQGCAgGAGAwEGBOAgYKCgYAEDAQME4AEEAAYE8AEBAgMEgAYEAAYE8GCQ8JCQBgMBBgTgAMAg4OAGBAAGBGBgkPCQkAYDAQYEoEDAIODgBgQABQRgkPCQkBAFAwEEBMAg4OAgBgMBBgRgYICAgGAGAwEGBECgYICAYAYDAQYEQGCAgIBgBgMBBgRAAGCAgGAGAwEGBODAoKCgwAYEAAYEsFAwUFAwBQQABQRgUNBQYAYDAQYE4OCA4IDgBgMBBgTgAEDggGAGAwEGBODggOCA4AYDAQYEoEBA4IBgBgMBBgRA4IDggOAGAwEGBEAAQOCAYAcDAQUE4IDggOBAIAYDAQQEQOCAYEAgBgMBBgRg4IDggOAGAwEGBKBAQOCAYAYDAQYEYGCAoKBgBwMBBgRAoGCg4CDABgMBBgQgYICgoGAHAwEGBEAAYKDgIMAGAwEFBGCAoKBgIAcDAQYEICBgoOAgwAYDAQYE4KCg4KCgBgMBBgTggOCgoKAFBAAFBFBQ8FBQBgQABgTgQGBQUFAGAwEGBODgQEBA4AYEAAYEUKBgICAgBgMBBgTg4EBAQOAGAwEGBOAAwEBAQAYDAQYE4OBAQEDgBgQABgSQYGAgICAGAwEFBOBAQEDgIAcDAQYEQADAQEBAIAUEAAUE8FBQUOAHBAAGBFAA8FBQUCAGAwEGBGDgICAgwAcEAAYEYJBgICAgQAYDAQUEoKDAoKAgBwMBBgSAgKDAoKAgBAMBBASgwKCgBgMBBgRAgICAgOAGBAAGBNBgQEBAQAYDAQUEgICAgOAgBwIBBgTAQEBAQECABQMBBQSgoICA4AYEAAYE0FBAQEBABQMBBQSAoICA4AYEAAYEwEBQQEBABgMBBgQgoODgoKAGAwEGBCBAwKCgoAYDAQUEoODgoKAgBQMBBATgoKCgIAYDAQYE4KDg4KCgBgMBBgSgQMCgoKAGBAAGBICAYFBQUAYDAQUEoODgoKAgBQMBBATAoKCgIAYEAAYE8GCQkJBgBgMBBgTgAECgoEAGBAAGBGBgkJCQYAYDAQYEoEBAoKBABgQABgRQYJCQkGAGBAAGBFCgIFBQIAYDAQYEIMCgwKCgBgMBBgQgQKDAgIAGAwEFBMCgwKCgIAUDAQQEoMCAgEAGAwEGBODAoMCgoAYDAQYEoECgwICABgMBBgQgYIBAIMAGAwEGBCBAYMAgwAYDAQYEYGCAQCDABgMBBgRAoGDAIMAGAwEFBOBAQEBAgAYDAQUEQOBAQCBABgMBBgTg4EBAQEAGAwEGBCBg4EBAIAUDAQUE4EDgQEAFAwEFBEDg4EAgBgMBBgTgoKCgoEAGBAAGBFCgUFBQMAYDAQYE4KCgoKBABgMBBgTgAKCgoGAGAwEGBOCgoKCgQAYDAQYEoECgoKBgBgMBBgRA4KCgoEAGAwEGBKBAoKCgQAYEAAYEoFBQUFAgBgQABgRQoFBQUDAGAwEFBKCgoKBAIAUDAQQEoKCgYCAGBAAGBPCQkPDwYAYEAAYEYACQkPBgBgMBBgTgoKBAQEAHAwEGBOCgoKBAQIAGAwEGBCDgIECA4AYDAQYEIEDgYIDgBgMBBgRA4CBAgOAGAwEGBEAA4GCA4AYDAQYEIEDAQEBABgQABgRQ4JDwkJAGBAAGBFCgcBBwcAYEAAYEEHCg8KCwBgQABgQQIKBwwLAHBAAGBFBgsJDQYIAHBAAGBECQIFBQIEAFAgEEBEAAAECAAgECBgSAgAIDAQYEQKAGBAAGBICgUJDwkAEBAgMEgAUEAAUE8MBwQHAFBAAFBNDQcFBQBQQABQTwoCAgcAUEAAUEoNBQUCAFBAAFBNDQICAgBQQABQSg0FAgcAYDAQYEQKBAQEAgBQQABQRgkPCQkAUDAQUEwKDAoOAFAwEFBOCAgICABQQABQRgYJCQ8AUDAQUE4IDggOAFAwEFBOAgQIDgBQMBBQSgoOCgoAUDAQUEQKDgoEAFAwEFBOBAQEDgBQMBBQSgoMCgoAUDAQUEQECgoKAFBAAFBJDw8JCQBQMBBQSg4OCgoAUDAQUE4ABAAOAFBAAFBGCQkJBgBQMBBQTgoKCgoAUDAQUEwKDAgIAFAwEFBOCAQIDgBQMBBQTgQEBAQAUDAQUEoKBAQEAGAwEFBEBAoKBAQAUDAQUEoKBAoKAFAwEFBOCg4EBABQQABQRgkJBgkAYDAQYEoOBAQEDgBgMBBgSgoKBAQEAGAwEGBEBAYKCgYAYDAQYEQEBA4IBgBwMBBgRAQMCgoKAgBgICBgSAAICAgEAGAwEGBOAAoKCgQAQDAQQEYKCgYAcDAQYEQKDAoKDAgAUDAQQEoKBAQEAGAwEGBECAQKCgQAQDAQQEQOCAYAcEAAYEEOAgQEAwEAUDAQQEwKCgoCAGAwEGBECg4KCgQAQCAgQEgICAQAQDAQQEoMCgoAYDAQYEgEBAoKCgBQMBBASgoKDAgAQDAQQEoKBgQAcDAQYE4EBggMAgQAQDAQQEQKCgQAUDAQQEQKCgwIAFAwEEBGCAgGAgBAQABARwoKBABAMBBATgQEBABAMBBASgoKBABwQABgQgIGCQkGAgBQMBBASgoECgoAcEAAYEICCwsLBgIAQEAAQEkLCwYAYDAQYEoABAQEAgBgMBBgSgAKCgoEAGAwEGBEBAQKCgQAYDAQYEQECgoKBABgQABgRAQJCwsGAGAwEGBKDggOCA4AUEAAUE4EBgUGAGAwEGBEDggICAgAUDAQUEYIDggGAFAwEFBGCAQCDABQMBBQTgQEBA4AYDAQYEoOBAQEDgBQIBBQTAQEBAgAUEAAUE4KCwsLAFBAAFBKCg8LCwBQQABQTgQGBQUAYDAQYEQKCgwKCgBgMBBgTgoKBAQIAGAwEFBKCgoKDgQAUEAAUEYJDwkJAFAwEFBOCAwKDABQMBBQTAoMCgwAUDAQUE4ICAgIAGBAAFBHBQUJDwkAUDAQUE4IDggOAFBAAFBLBgYGCwBQMBBQTAIMAgwAUDAQUEoODgoKAGAwEGBECg4OCgoAUDAQUEoKDAoKAFBAAFBHBQUFCQBQQABQSQ8PCQkAUDAQUEoKDgoKAFBAAFBGCQkJBgBQMBBQTgoKCgoAUDAQUEwKDAgIAFAwEFBGCAgIBgBQMBBQTgQEBAQAUDAQUEoKBAQIAGBAAFBCBgsLBgIAUDAQUEoKBAoKAGAwEFBKCgoKDgIAUDAQUEoKBgICAFBAAFBLCwsLDwBgQABQSwsLCw8BAFBAAFBMBAYFBgBQQABQSQkNCw0AUDAQUEgIDAoMAFAwEFBMAg4CDABQQABQSg0NDQoAUDAQUEYKBgoKAEAwEEBMAg4OAGAwEGBCBgwKCgQAQDAQQE4OCgwAQDAQQE4ICAgAUEAAQEcFCQ8JAEAwEEBEDggGAEBAAEBLBgsLAEAwEEBMDgIMAEAwEEBKDg4KAGAwEGBOAAoODgoAQDAQQEoMCgoAQEAAQEcFBQkAQEAAQEkPDwkAQDAQQEoOCgoAQDAQQEQKCgQAQDAQQE4KCgoAUDAQQEwKCgwIAEAwEEBGCAgGAEAwEEBOBAQEAFAwEEBKCgQECABwQABgQgIGCwsGAgBAMBBASgQECgBQMBBASgoKDgIAQDAQQEoKBgIAQEAAQEsLCw8AUEAAQEsLCw8BAEBAAEBMBgUGAEBAAEBJDQsNAEAwEEBIDAoMAEAwEEBMDgIMAEBAAEBKDQ0KAEAwEEBGCgYKAGAwEGBKAAQOCAYAcEAAYEQOBAYFBQEAYDAQYEIEDggICABAMBBARA4IBgBAMBBARgwCDABgIBBgRAAMBAQEAGAwAGBKAAYCAgIAcCAQYEQADAQEBAgAQEAAQE4KCwsAQEAAQEoOCwsAYEAAYEQOBAYFBQBgMBBgQgQKDAoKAHAwEGBGAAoKBAQIAFAwEEBKCgoOBABgMBBgQg4ICAgIAFAwEFBCDggICABgQABgRAkJCQ8GAGBAAGBIBAkJDwYAYEAAYEIJCQkPBgBgQABgQQIJCQ8GAGBAAGBFCQkJDwYAYEAAYEkACQkPBgBgMBBgSAoKBAQEAHAwEGBIBAoKBAQIABAwEDBOACBAABBPDwBQMBBQSgoKAAoAEEAAYE8AQEAAQEECBAgAMDAQYEwKCgBgQABgQgQEDgQPAGBAAGBMCg8KCgkAYEAAYEoODgsLCwBwQABgSAkKBQoFAgBwQABgSQUKBQoFAgBwQABgTQoGDQoFAgBwQABgTQUKDQIFAgAwQABARA8EAHAwEGBEDgQEBAQEADBAAEBCDwIAcDAQYEQEBAQEDgQAMEAAQEYPBgBwMBBgRA4EBAQOBABwMBBgRA4EDgQADgBAMBBASAgIDgBAQABARgkJCQBQMBBQTgAOAA4AUDAQUEQKCgoOACAwEDBOCABwICBgRAgICAgICABwIBBgRAQEBAQECAAQQAAwTwBwECBgSAgICAgICABAICAwTAgICABAMAAwTgICAgBAICBgSAgIDABAMABgQgICDgBwICBgSAgIDAgICABwMABgQgICDgICAgBAQAAwTwICAgBAQABgQgICDwBwQABgQgICDwICAgAwQABATwAPAHAgEGBMDAwMDAwMAFAgIEBMCAwICABAMBAwTgwMDABQMBBATggODAwAUDAAQE4CDgICAEAwADBOBgYGAFAwAEBOAg4GBgBQICBgSAgMCAwAQDAQYEwMDA4AUDAQYEwMDggOAFAwAGBCAg4CDgBAMABgRgYGDgBQMABgRgYOAg4AcCAgYEgIDAgMCAgAcDAQYEwMDA4MDAwAcDAQYEwMDggODAwAcDAAYEICDgIOAgIAcDAAYEYGBg4GBgYAcDAAYEYGDgIOBgYAUEAAQE8ADwICAEBAADBPBgYGAFBAAEBPAA8GBgBQQABgQgIPAA8AQEAAYEYGBg8AUEAAYEYGDwAPAHBAAGBCAg8CDwICAHBAAGBGBgYPBgYGAHBAAGBGBg8ADwYGAEBAAGBPDw8PADBAACBPDw8AcEAAYE8PDw8PDw8AcCAAYEwMDAwMDAwAcCAgYEwMDAwMDAwAcDAAYEoACgAKAAoAcEAAYEoFCgUKBQoAcEAAYE8KDwoPCg8AQDAQQE4ODg4AIDAQME4OAEBAAEBGBg8PAEBAAEBMDw8MAEBAAFBPDwYGAEBAAEBDDw8DAEBAAEBGCQkGAHBAAGBPDw8JCQ8PAHBAAGBPDwkGBgkPAGBAAGBGCQ8JDwYAYEAAYEYPCQ8JBgAwMBBATgoOAHBAAGBGCQkGAgcCAHBAAGBBAwEHCQkGAGBAAFBGDw8CAgcAcEAAYEIHCg8CAgcAUEAAYEkPDw8GAFAwEFBEDg4OBABgQABgRgUEBAwMAHBAAGBDBQUFBw8MAAAAAABQYBAgYFgICAgACAAgMBBgWgoAUFAAUFKPhQ+KAHAwEGBUDgwEBg4EAGBQAGBUiocHCokAYFAAYFIFBgqJBoAgECBgWAgAcEAQYFMECAgIBAMAcEAAYFwCAQEBAgwAQDAQYFQKBAoAMDAQMFQOBAAwIBAQVAQIABAwEDBeABAQIBBYAHBAEGBRAgIEBAgIAGBAEGBWCQkJCQYAYDAQYFQMBAQEDgBgMBBgXAICBAgOAGAwEGBcAgwCAgwAYEAQYFIGCg8CAgBgMBBgXggMAgIMAGBAEGBWCA4JCQYAYEAQYF8BAgQEBABgQBBgVgkGCQkGAGBAEGBWCQkHAQYAQBAgQFgAAAgAYCAQQFQAAAQECABQQBBQUQIMAgEAMEAQQF8ADwBQQBBQWAQDBAgAYEAQYF4BAgQABABwUABgUwSJiouIB4BQUABQUgUFD4iAUDAQUF4KDAoOAFBAEFBXCAgIBwBQQBBQXgkJCQ4AUDAQUF4IDggOAFAwEFBeCA4ICABQQBBQVwgLCQcAUEAQUFkJDwkJAFAwEFBeBAQEDgBQMBBQXgICAgwAUEAQUFkKDAoJAFBAEFBYCAgIDwBQUABQWI2KioiAUEAQUFkNCwkJAFBQAFBXCIiIhwBQQBBQXgkOCAgAcFAAUFcIiIiHAQCAUEAQUFwKDAoJAF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AAMCgQgIAQEAAwKBAAAACAADAAEAAAAEAAAABQAOABUAHgAoADEAOgBBAEsAVQBdAGUAbAByAHgAggCLAJQAnQCmAK8AuADBAMoA0wDcAOQA7QD1AP0BBQEOARgBIQEqATMBPAFFAU4BVwFgAWkBcgF7AYQBjQGWAZ8BqAGyAbsBxAHNAdYB3wHoAfEB+gIDAg0CFwIhAigCLgI1Aj0CRgJOAlcCXwJoAnECegKDAo0ClgKfAqcCrwK3AsACyQLRAtkC4gLqAvIC+gMCAwsDEwMdAycDMQM4A0EDSgNUA10DZgNvA3gDgQOKA5MDnAOlA64DtwPAA8kD0gPbA+QD7QP2A/8ECAQRBBoEIwQsBDUEPgRHBFAEWQRjBGsEdQR+BIgEjwSZBKIEqwS1BLwEwwTJBNME3ATlBO0E9gUABQoFEwUcBSUFLgU3BT8FSQVRBVkFYgVqBXIFewWFBYwFlgWgBakFsgW6BcIFyAXNBdYF3wXoBfEF+QX/BgUGDAYTBhoGIQYrBjQGPgZHBk8GWAZhBmoGcwZ9BoQGiwaSBpwGpQauBrcGwAbJBtIG2wbkBu0G9gb/BwgHEQcaByMHKwcyBzkHPwdGB0wHVAdaB2AHZgdtB3YHfweIB5EHmgejB60Htge/B8gH0gfbB+UH6wfzB/sIAwgLCBUIHwgpCDIIOwhFCE4IWAhhCGoIcwh8CIUIjgiUCJoIoAipCLIIuwjECM4I1wjgCOkI8gj7CQQJDQkWCR8JKAkxCToJQwlMCVYJXwloCXEJegmECY0JlwmhCasJtAm9CcYJzwnYCeEJ6gnzCfwKBQoPChkKIgosCjUKPwpJClMKWwpkCm0KdwqBCooKkwqcCqUKrgq3CsEKygrTCtwK5QrvCvgLAQsKCxMLHAslCy4LNwtAC0oLUwtcC2ULbgt3C4ALiQuTC50LpguvC7gLwQvKC9ML3AvlC+4L9wwADAkMEgwbDCUMLgw3DEAMSQxTDFwMZQxuDHcMgAyJDJIMmwykDK0Mtgy/DMYMzQzWDNwM5QzuDPcNAA0JDRINGw0kDS0NNg0/DUgNUQ1aDWMNbA11DX4Nhw2QDZkNog2rDbQNvQ3GDc8N2Q3iDesN9A39DgYODw4YDiIOKw40DjwORg5PDlgOYA5qDnMOfA6EDowOlQ6eDqYOsA64DsEOyg7SDtoO4g7sDvUO/w8H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AIsAnQCpAKQBAACKAQEAgwCTAPAA8QCNAJcAiAECANwA7wCeAKoA8wDyAPQAogCtAMgAxgCuAGIAYwCQAGQAygBlAMcAyQDOAMsAzADNAOcAZgDRAM8A0ACvAGcA7gCRANQA0gDTAGgA6QDrAIkAagBpAGsAbQBsAG4AoABvAHEAcAByAHMAdQB0AHYAdwDoAHgAegB5AHsAfQB8ALgAoQB/AH4AgACBAOoA7AC6AQMBBAEFAQYBBwEIAPsA/AEJAQoBCwEMAP0A/gENAQ4BDwD/ARABEQESARMBFAEVARYBFwEYARkBGgEbAPYA9wEcAR0BHgEfASABIQEiASMBJAElASYBJwEoASkBKgErAPgA1QEsAS0BLgEvATABMQEyATMBNAE1ATYBNwE4ATkBOgDgAOEBOwE8AT0BPgE/AUABQQFCAUMBRAFFAUYBRwFIAUkAsACxAUoBSwFMAU0BTgFPAVABUQFSAVMA+QD6AOIA4wFUAVUBVgFXAVgBWQFaAVsBXAFdAV4BXwFgAWEBYgFjAWQBZQFmAWcBaAFpALsBagFrAWwBbQDkAOUBbgDWAN8A2QDaANsA3gDXAN0BkgGTAZQBlQGWAZcBmAGZAZoBmwGcAZ0BngGfAaABoQGiAaMBpAGlAaYBpwGoAakBqgGrAawBrQGuAJsBrwGwAbEBsgGzAbQBtQG2AbcBuAG5AboBuwG8ALIAswIjAiQAtgC3AMMAtAC1AMQAggDBAIcA9QIpAJkA7QDCAKUAkgI3AI8COQC5AnQAAP/hAAD/5wAA/9sFAwUiBD4EVgXIBe0GKwZE/nX+XADFANIAlAC5BlAAr///////////BcgA3gZEAUL/////////////////////////////////////////////////////AIkAof///////wDKAPcFNACtAKwAuwCoALoEJQAZAaMA3gAyAPcCHwCWAXAAewBjAqYC5P7YAIgBKAFBAh8ApQA6AKYArQJpALQAKwCtAFz+uQB8AEwAbwB+ALkAhwDkAKsAfwKaBkQA9wEoBKACgQBKAtoDAwAZAUEBKAD3AIgAqAIG/lAGUADNAGkAlQB4sR8PLCMgiopFUFghIRtFRFktLEtSWEVEGyEhWS0AAAAAAgEAAAAD0gUAAAMABwAAIREhESUhESEBAALS/W4CUv2uBQD7AEAE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BNIAjQTSAI0E0gCNBNIAjQTSAK0E0gCtBNIArQTSAK0E0gC2BNIAaQTSAGkE0gBpBNIAaQTSAGkE0gCwBNIAsATSALAE0gCwBNIAxQTSAYgE0gDFBNIA+wTSANkE0gFBBNIAfQTSAL8E0gCtBNIAPgTSAGAE0gFyBNIBHATSAFYE0gAABNIAPgTSABkE0gBWBNIAVgTSAFYE0gAyBNIAtgTSAKwE0gAwBNIARATSADgE0gDtBNIA7QTSAN4E0gAxBNIAMQTSAGkE0gCUBNIB7QTSAFYE0gAABNIAJwTSAFYE0gAfBNIAdQTSAIwE0gBrBNIAAATSAAwE0gAMBNIAPgTSAEoE0gAxBNIAiATSAD4E0gD3BNIA9wTSAdUE0gHVBNIAVgTSABkE0gBVBNIAIATSAG8E0gFbBNIBWwTSAHsE0gB7BNIAxQTSAUEE0gHVBNIA9wTSAAAE0gAMBNIA2ATSAAwE0gDYBNIA2ATSAK0E0gCtBNIArQTSAK0E0gA+BNIAPgTSAD4E0gCZBNIAmQTSAJkE0gCtBNIBAwTSARwE0gEoBNIBHATSAfoE0gG0BNIB7wTSAUAE0gGmBNIBAwTSAAAE0gCtBNIApATSALsE0gBjBNIAiATSAh8E0gAGBNIAcATSACAE0gBVBNIA5ATSALME0gBWBNIATATSAVcE0gEuBNIBOQTSAAAE0gAABNIAKgTSABkE0gBNBNIAewTSAK0E0gCkBNIAuwTSAGYE0gCjBNIAZgTSAKME0gB/BNIA0gTSAAAE0gHtBNIADATSAIgE0gAMBNIAiATSAAwE0gCIBNIAZgTSAKME0gBmBNIAowTSAIIE0gBRBNIABgTSANgE0gCNBNIA2ATSAI0E0gDYBNIAjQTSANgE0gCNBNIA2ATSAI0E0gBNBNIAewTSAE0E0gB7BNIATQTSAHsE0gCUBNIAtgTSABkE0gAiBNIArQTSAK0E0gCtBNIArQTSAK0E0gCtBNIArQTSAK0E0gAxBNIAPgTSAMUE0gCUBNIAqgTSANUE0gD1BNIA3gTSAK0E0gDeBNIArQTSAN4E0gCUBNIA3gTSAK0E0gCUBNIAtgTSAJQE0gC2BNIAlATSALYE0gBTBNIAlATSALYE0gA+BNIAaQTSAD4E0gBpBNIAPgTSAGkE0gC4BNIBNATSALgE0gElBNIAuATSATQE0gCk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AVYBVwFYAVkBWgFbAVwBXQFeAV8BYAFhAWIBYwFkAWUBZgFnAWgBaQFqAWsBbAFtAW4BbwFwAXEBcgFzAXQBdQF2AXcBeAF5AXoBewF8AX0BfgF/AYABgQGCAYMBhAGFAYYBhwGIAYkBigGLAYwBjQGOAY8BkAGRAZIBkwGUAZUBlgGXAZgBmQGaAZsBnAGdAZ4BnwGgAaEBogGjAaQBpQGmAacBqAGpAaoBqwGsAa0BrgGvAbABsQGyAbMBtAG1AbYBtwG4AbkBugG7AbwBvQG+Ab8BwAHBAcIBwwHEAcUBxgHHAcgByQHKAcsBzAHNAc4BzwHQAdEB0gHTAdQB1QHWAdcB2AHZAdoB2wHcAd0B3gHfAeAB4QHiAeMB5AHlAeYB5wHoAekB6gHrAewB7QHuAe8B8AHxAfIB8wH0AfUB9gH3AfgB+QH6AfsB/AH9Af4B/wIAAgECAgIDAgQCBQIGAgcCCAIJAgoCCwIMAg0CDgIPAhACEQISAhMCFAIVAhYCFwIYAhkCGgIbAhwCHQIeAh8CIAIhAiICIwIkAiUCJgInAigCKQIqAisCLAItAi4CLwIwAjECMgIzAjQCNQI2AjcCOAI5AjoCOwI8Aj0CPgI/AkACQQJCAkMCRAJFAkYCRwJIAkkCSgJLAkwCTQJOAk8CUAJRAlICUwJUAlUCVgJXAlgCWQJaAlsCXAJdAl4CXwJgAmECYgJjAmQCZQJmAmcCaAJpAmoCawJsAm0CbgJvAnACcQJyAnMCdAJ1AnYCdwJ4AnkCegJ7AnwCfQJ+An8CgAKBAoICgwKEAoUChgKHAogCiQKKAosCjAKNAo4CjwKQApECkgKTApQClQKWApcCmAKZApoCmwKcAp0CngKfAqACoQKiAqMCpAKlAqYCpwKoAqkCqgKrAqwCrQKuAq8CsAKxArICswK0ArUCtgK3ArgCuQK6ArsCvAK9Ar4CvwLAAsECwgLDAsQCxQLGAscCyALJAsoCywLMAs0CzgLPAtAC0QLSAtMC1ALVAtYC1wLYAtkC2gLbAtwC3QLeAt8C4ALhAuIC4wLkAuUC5gLnAugC6QLqAusC7ALtAu4C7wLwAvEC8gLzAvQC9QL2AvcC+AL5AvoC+wL8Av0C/gL/AwADAQMCAwMDBAMFAwYDBwMIAwkDCgMLAwwDDQMOAw8DEAMRAxIDEwMUAxUDFgMXAxgDGQMaAxsDHAMdAx4DHwMgAyEDIgMjAyQDJQMmAycDKAMpAyoDKwMsAy0DLgMvAzADMQMyAzMDNAM1AzYDNwM4AzkDOgM7AzwDPQM+Az8DQANBA0IDQwNEA0UDRgNHA0gDSQNKA0sDTANNA04DTwNQA1EDUgNTA1QDVQNWA1cDWANZA1oDWwNcA10DXgNfA2ADYQNiA2MDZANlA2YDZwNoA2kDagNrA2wDbQNuA28DcANxA3IDcwN0A3UDdgN3A3gDeQN6A3sDfAN9A34DfwOAA4EDggODA4QDhQOGA4cDiAOJA4oDiwOMA40DjgOPA5ADkQOSA5MDlAOVA5YDlwVzcGFjZQZleGNsYW0IcXVvdGVkYmwKbnVtYmVyc2lnbgZkb2xsYXIHcGVyY2VudAlhbXBlcnNhbmQLcXVvdGVzaW5nbGUJcGFyZW5sZWZ0CnBhcmVucmlnaHQIYXN0ZXJpc2sEcGx1cwVjb21tYQZoeXBoZW4GcGVyaW9kBXNsYXNoBHplcm8Db25lA3R3bwV0aHJlZQRmb3VyBGZpdmUDc2l4BXNldmVuBWVpZ2h0BG5pbmUFY29sb24Jc2VtaWNvbG9uBGxlc3MFZXF1YWwHZ3JlYXRlcghxdWVzdGlvbgJhdAFBAUIBQwFEAUUBRgFHAUgBSQFKAUsBTAFNAU4BTwFQAVEBUgFTAVQBVQFWAVcBWAFZAVoLYnJhY2tldGxlZnQJYmFja3NsYXNoDGJyYWNrZXRyaWdodAthc2NpaWNpcmN1bQp1bmRlcnNjb3JlBWdyYXZlAWEBYgFjAWQBZQFmAWcBaAFpAWoBawFsAW0BbgFvAXABcQFyAXMBdAF1AXYBdwF4AXkBeglicmFjZWxlZnQDYmFyCmJyYWNlcmlnaHQKYXNjaWl0aWxkZQlBZGllcmVzaXMFQXJpbmcIQ2NlZGlsbGEGRWFjdXRlBk50aWxkZQlPZGllcmVzaXMJVWRpZXJlc2lzBmFhY3V0ZQZhZ3JhdmULYWNpcmN1bWZsZXgJYWRpZXJlc2lzBmF0aWxkZQVhcmluZwhjY2VkaWxsYQZlYWN1dGUGZWdyYXZlC2VjaXJjdW1mbGV4CWVkaWVyZXNpcwZpYWN1dGUGaWdyYXZlC2ljaXJjdW1mbGV4CWlkaWVyZXNpcwZudGlsZGUGb2FjdXRlBm9ncmF2ZQtvY2lyY3VtZmxleAlvZGllcmVzaXMGb3RpbGRlBnVhY3V0ZQZ1Z3JhdmULdWNpcmN1bWZsZXgJdWRpZXJlc2lzBmRhZ2dlcgZkZWdyZWUEY2VudAhzdGVybGluZwdzZWN0aW9uBmJ1bGxldAlwYXJhZ3JhcGgKZ2VybWFuZGJscwpyZWdpc3RlcmVkCWNvcHlyaWdodAl0cmFkZW1hcmsFYWN1dGUIZGllcmVzaXMIbm90ZXF1YWwCQUUGT3NsYXNoCGluZmluaXR5CXBsdXNtaW51cwlsZXNzZXF1YWwMZ3JlYXRlcmVxdWFsA3llbgVtaWNybwtwYXJ0aWFsZGlmZglzdW1tYXRpb24HcHJvZHVjdAJwaQhpbnRlZ3JhbAtvcmRmZW1pbmluZQxvcmRtYXNjdWxpbmUDb2htAmFlBm9zbGFzaAxxdWVzdGlvbmRvd24KZXhjbGFtZG93bgpsb2dpY2Fsbm90B3JhZGljYWwHZnNjcmlwdAthbG1vc3RlcXVhbAlpbmNyZW1lbnQNZ3VpbGxlbW90bGVmdA5ndWlsbGVtb3RyaWdodAhlbGxpcHNpcwduYnNwYWNlBkFncmF2ZQZBdGlsZGUGT3RpbGRlAk9FAm9lBmVuZGFzaAZlbWRhc2gMcXVvdGVkYmxsZWZ0DXF1b3RlZGJscmlnaHQJcXVvdGVsZWZ0CnF1b3RlcmlnaHQGZGl2aWRlB2xvemVuZ2UJeWRpZXJlc2lzCVlkaWVyZXNpcwhjdXJyZW5jeQ1ndWlsc2luZ2xsZWZ0Dmd1aWxzaW5nbHJpZ2h0AmZpAmZsCWRhZ2dlcmRibApidWxsZXRtYXRoDnF1b3Rlc2luZ2xiYXNlDHF1b3RlZGJsYmFzZQtwZXJ0aG91c2FuZAtBY2lyY3VtZmxleAtFY2lyY3VtZmxleAZBYWN1dGUJRWRpZXJlc2lzBkVncmF2ZQZJYWN1dGULSWNpcmN1bWZsZXgJSWRpZXJlc2lzBklncmF2ZQZPYWN1dGULT2NpcmN1bWZsZXgGT2dyYXZlBlVhY3V0ZQtVY2lyY3VtZmxleAZVZ3JhdmUIZG90bGVzc2kKY2lyY3VtZmxleAV0aWxkZQZtYWNyb24FYnJldmUJZG90YWNjZW50BHJpbmcHY2VkaWxsYQxodW5nYXJ1bWxhdXQGb2dvbmVrBWNhcm9uBkxzbGFzaAZsc2xhc2gGU2Nhcm9uBnNjYXJvbgZaY2Fyb24GemNhcm9uCWJyb2tlbmJhcgNFdGgDZXRoBllhY3V0ZQZ5YWN1dGUFVGhvcm4FdGhvcm4FbWludXMIbXVsdGlwbHkLb25lc3VwZXJpb3ILdHdvc3VwZXJpb3INdGhyZWVzdXBlcmlvcgdvbmVoYWxmCm9uZXF1YXJ0ZXINdGhyZWVxdWFydGVycwVmcmFuYwZHYnJldmUGZ2JyZXZlBElkb3QIU2NlZGlsbGEIc2NlZGlsbGEGQ2FjdXRlBmNhY3V0ZQZDY2Fyb24GY2Nhcm9uB2RtYWNyb24Jc2Z0aHlwaGVuCW92ZXJzY29yZQZtaWRkb3QHQW1hY3JvbgdhbWFjcm9uBkFicmV2ZQZhYnJldmUHQW9nb25lawdhb2dvbmVrC0NjaXJjdW1mbGV4C2NjaXJjdW1mbGV4BENkb3QEY2RvdAZEY2Fyb24GZGNhcm9uB0RtYWNyb24HRW1hY3JvbgdlbWFjcm9uBkVicmV2ZQZlYnJldmUERWRvdARlZG90B0VvZ29uZWsHZW9nb25lawZFY2Fyb24GZWNhcm9uC0djaXJjdW1mbGV4C2djaXJjdW1mbGV4BEdkb3QEZ2RvdAhHY2VkaWxsYQhnY2VkaWxsYQtIY2lyY3VtZmxleAtoY2lyY3VtZmxleARIYmFyBGhiYXIGSXRpbGRlBml0aWxkZQdJbWFjcm9uB2ltYWNyb24GSWJyZXZlBmlicmV2ZQdJb2dvbmVrB2lvZ29uZWsCSUoCaWoLSmNpcmN1bWZsZXgLamNpcmN1bWZsZXgIS2NlZGlsbGEIa2NlZGlsbGEDa3JhBkxhY3V0ZQZsYWN1dGUITGNlZGlsbGEIbGNlZGlsbGEGTGNhcm9uBmxjYXJvbgRMZG90BGxkb3QGTmFjdXRlBm5hY3V0ZQhOY2VkaWxsYQhuY2VkaWxsYQZOY2Fyb24GbmNhcm9uC25hcG9zdHJvcGhlA0VuZwNlbmcHT21hY3JvbgdvbWFjcm9uBk9icmV2ZQZvYnJldmUJT2RibGFjdXRlCW9kYmxhY3V0ZQZSYWN1dGUGcmFjdXRlCFJjZWRpbGxhCHJjZWRpbGxhBlJjYXJvbgZyY2Fyb24GU2FjdXRlBnNhY3V0ZQtTY2lyY3VtZmxleAtzY2lyY3VtZmxleAhUY2VkaWxsYQh0Y2VkaWxsYQZUY2Fyb24GdGNhcm9uBFRiYXIEdGJhcgZVdGlsZGUGdXRpbGRlB1VtYWNyb24HdW1hY3JvbgZVYnJldmUGdWJyZXZlBVVyaW5nBXVyaW5nCVVkYmxhY3V0ZQl1ZGJsYWN1dGUHVW9nb25lawd1b2dvbmVrC1djaXJjdW1mbGV4C3djaXJjdW1mbGV4C1ljaXJjdW1mbGV4C3ljaXJjdW1mbGV4BlphY3V0ZQZ6YWN1dGUEWmRvdAR6ZG90BXNsb25nCkFhY3V0ZXJpbmcKYWFjdXRlcmluZwdBRWFjdXRlB2FlYWN1dGULT3NsYXNoYWN1dGULb3NsYXNoYWN1dGUNcXVlc3Rpb25ncmVlawV0b25vcw5kaWFlcmVzaXN0b25vcwpBbHBoYXRvbm9zCWFub3RlbGVpYQxFcHNpbG9udG9ub3MIRXRhdG9ub3MJSW90YXRvbm9zDE9taWNyb250b25vcwxVcHNpbG9udG9ub3MKT21lZ2F0b25vcxJpb3RhZGlhZXJlc2lzdG9ub3MFQWxwaGEEQmV0YQVHYW1tYQVEZWx0YQdFcHNpbG9uBFpldGEDRXRhBVRoZXRhBElvdGEFS2FwcGEGTGFtYmRhAk11Ak51AlhpB09taWNyb24CUGkDUmhvBVNpZ21hA1RhdQdVcHNpbG9uA1BoaQNDaGkDUHNpBU9tZWdhDUlvdGFkaWFlcmVzaXMQVXBzaWxvbmRpYWVyZXNpcwphbHBoYXRvbm9zDGVwc2lsb250b25vcwhldGF0b25vcwlpb3RhdG9ub3MVdXBzaWxvbmRpYWVyZXNpc3Rvbm9zBWFscGhhBGJldGEFZ2FtbWEFZGVsdGEHZXBzaWxvbgR6ZXRhA2V0YQV0aGV0YQRpb3RhBWthcHBhBmxhbWJkYQJtdQJudQJ4aQdvbWljcm9uA3JobwpzaWdtYWZpbmFsBXNpZ21hA3RhdQd1cHNpbG9uA3BoaQNjaGkDcHNpBW9tZWdhDWlvdGFkaWFlcmVzaXMQdXBzaWxvbmRpYWVyZXNpcwxvbWljcm9udG9ub3MMdXBzaWxvbnRvbm9zCm9tZWdhdG9ub3MCSW8DRGplA0dqZQZFY3lyaWwDRHplBkljeXJpbAJZaQJKZQNMamUDTmplBFRzaGUDS2plC1VjeXJpbGJyZXZlBER6aGUGQWN5cmlsAkJlAlZlAkdlAkRlAkllA1poZQJaZQJJaQdJaWJyZXZlAkthAkVsAkVtAkVuBk9jeXJpbAdQZWN5cmlsAkVyAkVzAlRlBlVjeXJpbAJFZgNLaGEDVHNlA0NoZQNTaGEFU2hjaGEESGFyZARZZXJpBFNvZnQJRWN5cmlscmV2Akl1AklhBmFjeXJpbAJiZQJ2ZQJnZQJkZQJpZQN6aGUCemUCaWkHaWlicmV2ZQJrYQJlbAJlbQJlbgZvY3lyaWwHcGVjeXJpbAJlcgJlcwJ0ZQZ1Y3lyaWwCZWYDa2hhA3RzZQNjaGUDc2hhBXNoY2hhBGhhcmQEeWVyaQRzb2Z0CWVjeXJpbHJldgJpdQJpYQJpbwNkamUDZ2plBmVjeXJpbANkemUGaWN5cmlsAnlpAmplA2xqZQNuamUEdHNoZQNramULdWN5cmlsYnJldmUEZHpoZQhHZXVwdHVybghnZXVwdHVybgZXZ3JhdmUGd2dyYXZlBldhY3V0ZQZ3YWN1dGUJV2RpZXJlc2lzCXdkaWVyZXNpcwZZZ3JhdmUGeWdyYXZlCXF1b3RlZGFzaA11bmRlcnNjb3JlZGJsCWV4Y2xhbWRibApvdmVyc2NvcmUxCWZyYWN0aW9uMQluc3VwZXJpb3IEbGlyYQdwZXNldGFzBm51bWVybwlvbmVlaWdodGgMdGhyZWVlaWdodGhzC2ZpdmVlaWdodGhzDHNldmVuZWlnaHRocwlhcnJvd2xlZnQHYXJyb3d1cAphcnJvd3JpZ2h0CWFycm93ZG93bglhcnJvd2JvdGgJYXJyb3d1cGRuDGFycm93dXBkbmJzZQpyaWdodGFuZ2xlDGludGVyc2VjdGlvbgtlcXVpdmFsZW5jZQVob3VzZQ1yZXZsb2dpY2Fsbm90CmludGVncmFsdHAKaW50ZWdyYWxidAQyNTAwBDI1MDIEMjUwYwQyNTEwBDI1MTQEMjUxOAQyNTFjBDI1MjQEMjUyYwQyNTM0BDI1M2MEMjU1MAQyNTUxBDI1NTIEMjU1MwQyNTU0BDI1NTUEMjU1NgQyNTU3BDI1NTgEMjU1OQQyNTVhBDI1NWIEMjU1YwQyNTVkBDI1NWUEMjU1ZgQyNTYwBDI1NjEEMjU2MgQyNTYzBDI1NjQEMjU2NQQyNTY2BDI1NjcEMjU2OAQyNTY5BDI1NmEEMjU2YgQyNTZjB3VwYmxvY2sHZG5ibG9jawVibG9jawdsZmJsb2NrB3J0YmxvY2sHbHRzaGFkZQVzaGFkZQdka3NoYWRlCWZpbGxlZGJveApmaWxsZWRyZWN0B3RyaWFndXAHdHJpYWdydAd0cmlhZ2RuB3RyaWFnbGYGY2lyY2xlCWludmJ1bGxldAlpbnZjaXJjbGUJc21pbGVmYWNlDGludnNtaWxlZmFjZQNzdW4GZmVtYWxlBG1hbGUFc3BhZGUEY2x1YgVoZWFydAdkaWFtb25kC211c2ljYWxub3RlDm11c2ljYWxub3RlZGJsC2NpcmN1bWZsZXgxBnRpbGRlMQlkaWVyZXNpczEGYnJldmUxBXJpbmcxCGNlZGlsbGExDWh1bmdhcnVtbGF1dDEGY2Fyb24xBmFjdXRlMQZncmF2ZTEIY2VkaWxsYTIJS2NlZGlsbGExCWtjZWRpbGxhMQlMY2VkaWxsYTEJbGNlZGlsbGExCU5jZWRpbGxhMQluY2VkaWxsYTEJUmNlZGlsbGExCXJjZWRpbGxhMQlTY2VkaWxsYTEJc2NlZGlsbGExCVRjZWRpbGxhMQl0Y2VkaWxsYTFARhoKZB9aTCMfPwgjHw8OIx8NDCMfCwovHwoGDR8FBCUfAwIvHwkIPB8BAC8fBwYvH2NiWg9dW+APXnjgD3hbVA9NEqAPPRK4ASBAOw88EvAPOzrgD1MSEx9REBkfRBCgD3IV0g9iEGAPXxDgD1gQYA9WEOAPVBDgDz4Q4A86ELQPNxDgDzIzuAEgQA8PMxCCDxUQ4A8TEOAPERC4AUBAGw8SEJ4PEBISHw8ccBxwHYAdBB8GbwafBgMyAbkB/wAIS1NYsAGwAY5ZhY1LU1iwgB1Zc3MBKysrKysrKysrKysrKysrKysrKwArKysrKysrKysrKysrKysrKysrKwAA\"); \n", "}\n", - "]]>BillyNNPwentVBDtoTOtheDTmallNNnsubjnsubjmarknsubj" + "]]>BillyNNPwentVBDtoTOtheDTmallNNnsubjnsubjmarknsubj" ] }, "metadata": {} @@ -340,14 +302,54 @@ { "cell_type": "code", "metadata": { - "id": "0Sip0vRS19wi" + "id": "0Sip0vRS19wi", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 700 + }, + "outputId": "9c5ef714-d526-45c5-8fba-e8662c7ba517" }, "source": [ "#Bigger Example\n", - "nlu.load('dep.typed').viz(\"Donald Trump from America and Angela Merkel from Germany don't share many oppinions but they both love John Snow Labs software\")" + "nlp.load('dep.typed').viz(\"Donald Trump from America and Angela Merkel from Germany don't share many oppinions but they both love John Snow Labs software\")" ], "execution_count": null, - "outputs": [] + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Warning::Spark Session already created, some configs may not take.\n", + "Warning::Spark Session already created, some configs may not take.\n", + "dependency_typed_conllu download started this may take some time.\n", + "Approximate size to download 2.4 MB\n", + "[OK!]\n", + "pos_anc download started this may take some time.\n", + "Approximate size to download 3.9 MB\n", + "[OK!]\n", + "dependency_conllu download started this may take some time.\n", + "Approximate size to download 16.7 MB\n", + "[OK!]\n", + "Warning::Spark Session already created, some configs may not take.\n" + ] + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "DonaldNNPTrumpNNPfromINAmericaNNPandCCAngelaNNPMerkelNNPfromINGermanyNNPdon'tNNshareNNmanyJJoppinionsNNSbutCCtheyPRPbothDTloveNNJohnNNPSnowNNPLabsNNPsoftwareNNcccaseflatnsubjflatamodflatflatnsubjflatflatcompoundflatflatflatdetflatflatflatflat" + ] + }, + "metadata": {} + } + ] }, { "cell_type": "markdown", @@ -377,31 +379,38 @@ "metadata": { "colab": { "base_uri": "https://localhost:8080/", - "height": 349 + "height": 460 }, "id": "El2MNpo8_0H8", - "outputId": "d5858458-f8a2-4ff5-e798-dd198eca7eea" + "outputId": "69568e60-928a-4f3b-d68e-73acb1482fe3" }, "source": [ - "nlu.load('med_ner.jsl.wip.clinical en.resolve.rxnorm').viz(\"He took 2 pills of Aspirin daily\")" + "nlp.load('med_ner.jsl.wip.clinical en.resolve.rxnorm').viz(\"He took 2 pills of Aspirin daily\")" ], - "execution_count": 4, + "execution_count": null, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ + "Warning::Spark Session already created, some configs may not take.\n", + "Warning::Spark Session already created, some configs may not take.\n", "ner_wikiner_glove_840B_300 download started this may take some time.\n", "Approximate size to download 14.8 MB\n", "[OK!]\n", "sbiobertresolve_rxnorm download started this may take some time.\n", "[OK!]\n", + "setInputCols in ENTITY_e8e8480527b5 expecting 1 columns. Provided column amount: 2. Which should be columns from the following annotators: ['sentence_embeddings']\n", "glove_840B_300 download started this may take some time.\n", "Approximate size to download 2.3 GB\n", "[OK!]\n", "sbiobert_base_cased_mli download started this may take some time.\n", "Approximate size to download 384.3 MB\n", - "[OK!]\n" + "[OK!]\n", + "setInputCols in ENTITY_e8e8480527b5 expecting 1 columns. Provided column amount: 2. Which should be columns from the following annotators: ['sentence_embeddings']\n", + "setInputCols in ENTITY_e8e8480527b5 expecting 1 columns. Provided column amount: 2. Which should be columns from the following annotators: ['sentence_embeddings']\n", + "setInputCols in ENTITY_e8e8480527b5 expecting 1 columns. Provided column amount: 2. Which should be columns from the following annotators: ['sentence_embeddings']\n", + "Warning::Spark Session already created, some configs may not take.\n" ] }, { @@ -491,7 +500,7 @@ " }\n", "\n", "\n", - " He took 2 pills of Aspirin MISC1114513 vitamine e acetate daily" + " He took 2 pills of Aspirin MISC1191 aspirin daily" ] }, "metadata": {} @@ -503,33 +512,40 @@ "metadata": { "colab": { "base_uri": "https://localhost:8080/", - "height": 611 + "height": 853 }, "id": "1klMOFjZmyGF", - "outputId": "1d4db86a-551e-4201-d7a6-199705d0401f" + "outputId": "c396427f-9094-4370-a921-672eeb4bc2c9" }, "source": [ "# bigger example\n", "data = \"This is an 82 - year-old male with a history of prior tobacco use , hypertension , chronic renal insufficiency , COPD , gastritis , and TIA who initially presented to Braintree with a non-ST elevation MI and Guaiac positive stools , transferred to St . Margaret\\'s Center for Women & Infants for cardiac catheterization with PTCA to mid LAD lesion complicated by hypotension and bradycardia requiring Atropine , IV fluids and transient dopamine possibly secondary to vagal reaction , subsequently transferred to CCU for close monitoring , hemodynamically stable at the time of admission to the CCU .\"\n", - "nlu.load('med_ner.jsl.wip.clinical en.resolve.rxnorm').viz(data)\n" + "nlp.load('med_ner.jsl.wip.clinical en.resolve.rxnorm').viz(data)\n" ], - "execution_count": 5, + "execution_count": null, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ + "Warning::Spark Session already created, some configs may not take.\n", + "Warning::Spark Session already created, some configs may not take.\n", "ner_wikiner_glove_840B_300 download started this may take some time.\n", "Approximate size to download 14.8 MB\n", "[OK!]\n", "sbiobertresolve_rxnorm download started this may take some time.\n", "[OK!]\n", + "setInputCols in ENTITY_e8e8480527b5 expecting 1 columns. Provided column amount: 2. Which should be columns from the following annotators: ['sentence_embeddings']\n", "glove_840B_300 download started this may take some time.\n", "Approximate size to download 2.3 GB\n", "[OK!]\n", "sbiobert_base_cased_mli download started this may take some time.\n", "Approximate size to download 384.3 MB\n", - "[OK!]\n" + "[OK!]\n", + "setInputCols in ENTITY_e8e8480527b5 expecting 1 columns. Provided column amount: 2. Which should be columns from the following annotators: ['sentence_embeddings']\n", + "setInputCols in ENTITY_e8e8480527b5 expecting 1 columns. Provided column amount: 2. Which should be columns from the following annotators: ['sentence_embeddings']\n", + "setInputCols in ENTITY_e8e8480527b5 expecting 1 columns. Provided column amount: 2. Which should be columns from the following annotators: ['sentence_embeddings']\n", + "Warning::Spark Session already created, some configs may not take.\n" ] }, { @@ -619,7 +635,7 @@ " }\n", "\n", "\n", - " This is an 82 - year-old male with a history of prior tobacco use , hypertension , chronic renal insufficiency , COPD , gastritis , and TIA who initially presented to Braintree LOC1043301 prenexa with a non-ST MISC759577 nohist plus elevation MI and Guaiac MISC261530 gengraf positive stools , transferred to St LOC402085 factive . Margaret's Center for Women & Infants ORG1856515 levonorgestrel intrauterine system for cardiac catheterization with PTCA to mid LAD lesion complicated by hypotension and bradycardia requiring Atropine , IV fluids and transient dopamine possibly secondary to vagal reaction , subsequently transferred to CCU ORG1602024 natpara for close monitoring , hemodynamically stable at the time of admission to the CCU ORG1602024 natpara ." + " This is an 82 - year-old male with a history of prior tobacco use , hypertension , chronic renal insufficiency , COPD , gastritis , and TIA who initially presented to Braintree LOC607707 bionect with a non-ST MISC1314253 nonanal elevation MI and Guaiac MISC1373150 guaiac positive stools , transferred to St LOC583344 accu . Margaret's Center for Women & Infants ORG1856515 levonorgestrel intrauterine system for cardiac catheterization with PTCA to mid LAD lesion complicated by hypotension and bradycardia requiring Atropine , IV fluids and transient dopamine possibly secondary to vagal reaction , subsequently transferred to CCU ORG225636 clinicide for close monitoring , hemodynamically stable at the time of admission to the CCU ORG225636 clinicide ." ] }, "metadata": {} @@ -642,30 +658,37 @@ "id": "MFP2lPVlAQyf", "colab": { "base_uri": "https://localhost:8080/", - "height": 242 + "height": 373 }, - "outputId": "a2358953-f5b0-4971-a342-88d6dcdc3133" + "outputId": "655aad3a-7192-401d-999b-f048145313ce" }, "source": [ - "nlu.load('med_ner.jsl.wip.clinical resolve.icd10cm').viz('She was diagnosed with a respiratory congestion')" + "nlp.load('med_ner.jsl.wip.clinical resolve.icd10cm').viz('She was diagnosed with a respiratory congestion')" ], - "execution_count": 6, + "execution_count": 23, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ + "Warning::Spark Session already created, some configs may not take.\n", + "Warning::Spark Session already created, some configs may not take.\n", "ner_wikiner_glove_840B_300 download started this may take some time.\n", "Approximate size to download 14.8 MB\n", "[OK!]\n", "sbiobertresolve_icd10cm download started this may take some time.\n", "[OK!]\n", + "setInputCols in ENTITY_05f4bc95f0c5 expecting 1 columns. Provided column amount: 2. Which should be columns from the following annotators: ['sentence_embeddings']\n", "glove_840B_300 download started this may take some time.\n", "Approximate size to download 2.3 GB\n", "[OK!]\n", "sbiobert_base_cased_mli download started this may take some time.\n", "Approximate size to download 384.3 MB\n", - "[OK!]\n" + "[OK!]\n", + "setInputCols in ENTITY_05f4bc95f0c5 expecting 1 columns. Provided column amount: 2. Which should be columns from the following annotators: ['sentence_embeddings']\n", + "setInputCols in ENTITY_05f4bc95f0c5 expecting 1 columns. Provided column amount: 2. Which should be columns from the following annotators: ['sentence_embeddings']\n", + "setInputCols in ENTITY_05f4bc95f0c5 expecting 1 columns. Provided column amount: 2. Which should be columns from the following annotators: ['sentence_embeddings']\n", + "Warning::Spark Session already created, some configs may not take.\n" ] }, { @@ -768,32 +791,39 @@ "id": "lBQAsPSXm2_Y", "colab": { "base_uri": "https://localhost:8080/", - "height": 528 + "height": 663 }, - "outputId": "08374860-57bb-4e8d-8585-51f148791486" + "outputId": "1aefc1b6-23cc-4040-897b-8a070d82dbbc" }, "source": [ "# bigger example\n", "data = 'The patient is a 5-month-old infant who presented initially on Monday with a cold, cough, and runny nose for 2 days. Mom states she had no fever. Her appetite was good but she was spitting up a lot. She had no difficulty breathing and her cough was described as dry and hacky. At that time, physical exam showed a right TM, which was red. Left TM was okay. She was fairly congested but looked happy and playful. She was started on Amoxil and Aldex and we told to recheck in 2 weeks to recheck her ear. Mom returned to clinic again today because she got much worse overnight. She was having difficulty breathing. She was much more congested and her appetite had decreased significantly today. She also spiked a temperature yesterday of 102.6 and always having trouble sleeping secondary to congestion'\n", - "nlu.load('med_ner.jsl.wip.clinical resolve.icd10cm').viz(data)" + "nlp.load('med_ner.jsl.wip.clinical resolve.icd10cm').viz(data)" ], - "execution_count": 7, + "execution_count": null, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ + "Warning::Spark Session already created, some configs may not take.\n", + "Warning::Spark Session already created, some configs may not take.\n", "ner_wikiner_glove_840B_300 download started this may take some time.\n", "Approximate size to download 14.8 MB\n", "[OK!]\n", "sbiobertresolve_icd10cm download started this may take some time.\n", "[OK!]\n", + "setInputCols in ENTITY_05f4bc95f0c5 expecting 1 columns. Provided column amount: 2. Which should be columns from the following annotators: ['sentence_embeddings']\n", "glove_840B_300 download started this may take some time.\n", "Approximate size to download 2.3 GB\n", "[OK!]\n", "sbiobert_base_cased_mli download started this may take some time.\n", "Approximate size to download 384.3 MB\n", - "[OK!]\n" + "[OK!]\n", + "setInputCols in ENTITY_05f4bc95f0c5 expecting 1 columns. Provided column amount: 2. Which should be columns from the following annotators: ['sentence_embeddings']\n", + "setInputCols in ENTITY_05f4bc95f0c5 expecting 1 columns. Provided column amount: 2. Which should be columns from the following annotators: ['sentence_embeddings']\n", + "setInputCols in ENTITY_05f4bc95f0c5 expecting 1 columns. Provided column amount: 2. Which should be columns from the following annotators: ['sentence_embeddings']\n", + "Warning::Spark Session already created, some configs may not take.\n" ] }, { @@ -883,7 +913,7 @@ " }\n", "\n", "\n", - " The patient is a 5-month-old infant who presented initially on Monday with a cold, cough, and runny nose for 2 days. Mom states she had no fever. Her appetite was good but she was spitting up a lot. She had no difficulty breathing and her cough was described as dry and hacky. At that time, physical exam showed a right TM, which was red. Left TM MISCH93212 Auditory recruitment, left ear was okay. She was fairly congested but looked happy and playful. She was started on Amoxil and Aldex LOCF650 Fetishism and we told to recheck in 2 weeks to recheck her ear. Mom returned to clinic again today because she got much worse overnight. She was having difficulty breathing. She was much more congested and her appetite had decreased significantly today. She also spiked a temperature yesterday of 102.6 and always having trouble sleeping secondary to congestion" + " The patient is a 5-month-old infant who presented initially on Monday with a cold, cough, and runny nose for 2 days. Mom states she had no fever. Her appetite was good but she was spitting up a lot. She had no difficulty breathing and her cough was described as dry and hacky. At that time, physical exam showed a right TM, which was red. Left TM MISCL02522 Furuncle left hand was okay. She was fairly congested but looked happy and playful. She was started on Amoxil and Aldex LOCQ843 Anonychia and we told to recheck in 2 weeks to recheck her ear. Mom returned to clinic again today because she got much worse overnight. She was having difficulty breathing. She was much more congested and her appetite had decreased significantly today. She also spiked a temperature yesterday of 102.6 and always having trouble sleeping secondary to congestion" ] }, "metadata": {} @@ -906,19 +936,21 @@ "id": "d0a_GgOqnM7b", "colab": { "base_uri": "https://localhost:8080/", - "height": 242 + "height": 284 }, - "outputId": "62979688-1472-4a77-f7ba-50b2f2238ed9" + "outputId": "8d37fa99-ac18-45a4-b9ce-4c41c2131e1b" }, "source": [ - "nlu.load('med_ner.clinical assert').viz(\"The MRI scan showed no signs of cancer in the left lung\")" + "nlp.load('med_ner.clinical assert').viz(\"The MRI scan showed no signs of cancer in the left lung\")" ], - "execution_count": 8, + "execution_count": 26, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ + "Warning::Spark Session already created, some configs may not take.\n", + "Warning::Spark Session already created, some configs may not take.\n", "ner_wikiner_glove_840B_300 download started this may take some time.\n", "Approximate size to download 14.8 MB\n", "[OK!]\n", @@ -929,7 +961,8 @@ "[OK!]\n", "embeddings_clinical download started this may take some time.\n", "Approximate size to download 1.6 GB\n", - "[OK!]\n" + "[OK!]\n", + "Warning::Spark Session already created, some configs may not take.\n" ] }, { @@ -1032,21 +1065,23 @@ "id": "hQPS_-2y-Quu", "colab": { "base_uri": "https://localhost:8080/", - "height": 540 + "height": 606 }, - "outputId": "9d086a53-130e-4ff9-b9d9-73af5919e353" + "outputId": "c94d34d7-43ae-4d42-9b83-5f7525a61ae4" }, "source": [ "#bigger example\n", "data ='This is the case of a very pleasant 46-year-old Caucasian female, seen in clinic on 12/11/07 during which time MRI of the left shoulder showed no evidence of rotator cuff tear. She did have a previous MRI of the cervical spine that did show an osteophyte on the left C6-C7 level. Based on this, negative MRI of the shoulder, the patient was recommended to have anterior cervical discectomy with anterior interbody fusion at C6-C7 level. Operation, expected outcome, risks, and benefits were discussed with her. Risks include, but not exclusive of bleeding and infection, bleeding could be soft tissue bleeding, which may compromise airway and may result in return to the operating room emergently for evacuation of said hematoma. There is also the possibility of bleeding into the epidural space, which can compress the spinal cord and result in weakness and numbness of all four extremities as well as impairment of bowel and bladder function. However, the patient may develop deeper-seated infection, which may require return to the operating room. Should the infection be in the area of the spinal instrumentation, this will cause a dilemma since there might be a need to remove the spinal instrumentation and/or allograft. There is also the possibility of potential injury to the esophageus, the trachea, and the carotid artery. There is also the risks of stroke on the right cerebral circulation should an undiagnosed plaque be propelled from the right carotid. She understood all of these risks and agreed to have the procedure performed.'\n", - "nlu.load('med_ner.clinical assert').viz(data)" + "nlp.load('med_ner.clinical assert').viz(data)" ], - "execution_count": 9, + "execution_count": null, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ + "Warning::Spark Session already created, some configs may not take.\n", + "Warning::Spark Session already created, some configs may not take.\n", "ner_wikiner_glove_840B_300 download started this may take some time.\n", "Approximate size to download 14.8 MB\n", "[OK!]\n", @@ -1057,7 +1092,8 @@ "[OK!]\n", "embeddings_clinical download started this may take some time.\n", "Approximate size to download 1.6 GB\n", - "[OK!]\n" + "[OK!]\n", + "Warning::Spark Session already created, some configs may not take.\n" ] }, { @@ -1147,7 +1183,7 @@ " }\n", "\n", "\n", - " This is the case of a very pleasant 46-year-old Caucasian MISChypothetical female, seen in clinic on 12/11/07 during which time MRI of the left shoulder showed no evidence of rotator cuff tear. She did have a previous MRI of the cervical spine that did show an osteophyte on the left C6-C7 level. Based on this, negative MRI of the shoulder, the patient was recommended to have anterior cervical discectomy with anterior interbody fusion at C6-C7 level. Operation MISChypothetical , expected outcome, risks, and benefits were discussed with her. Risks include, but not exclusive of bleeding and infection, bleeding could be soft tissue bleeding, which may compromise airway and may result in return to the operating room emergently for evacuation of said hematoma. There is also the possibility of bleeding into the epidural space, which can compress the spinal cord and result in weakness and numbness of all four extremities as well as impairment of bowel and bladder function. However, the patient may develop deeper-seated infection, which may require return to the operating room. Should the infection be in the area of the spinal instrumentation, this will cause a dilemma since there might be a need to remove the spinal instrumentation and/or allograft. There is also the possibility of potential injury to the esophageus, the trachea, and the carotid artery. There is also the risks of stroke on the right cerebral circulation should an undiagnosed plaque be propelled from the right carotid. She understood all of these risks and agreed to have the procedure performed." + " This is the case of a very pleasant 46-year-old Caucasian MISCpresent female, seen in clinic on 12/11/07 during which time MRI of the left shoulder showed no evidence of rotator cuff tear. She did have a previous MRI of the cervical spine that did show an osteophyte on the left C6-C7 level. Based on this, negative MRI of the shoulder, the patient was recommended to have anterior cervical discectomy with anterior interbody fusion at C6-C7 level. Operation MISCpresent , expected outcome, risks, and benefits were discussed with her. Risks include, but not exclusive of bleeding and infection, bleeding could be soft tissue bleeding, which may compromise airway and may result in return to the operating room emergently for evacuation of said hematoma. There is also the possibility of bleeding into the epidural space, which can compress the spinal cord and result in weakness and numbness of all four extremities as well as impairment of bowel and bladder function. However, the patient may develop deeper-seated infection, which may require return to the operating room. Should the infection be in the area of the spinal instrumentation, this will cause a dilemma since there might be a need to remove the spinal instrumentation and/or allograft. There is also the possibility of potential injury to the esophageus, the trachea, and the carotid artery. There is also the risks of stroke on the right cerebral circulation should an undiagnosed plaque be propelled from the right carotid. She understood all of these risks and agreed to have the procedure performed." ] }, "metadata": {} @@ -1170,19 +1206,21 @@ "id": "2AXuhrytnS7N", "colab": { "base_uri": "https://localhost:8080/", - "height": 342 + "height": 387 }, - "outputId": "68051435-1056-4bfa-ea10-a10e6132ca4d" + "outputId": "612642c9-1cd3-49bf-b8b1-78a0a0e44d6a" }, "source": [ - "nlu.load('med_ner.jsl.wip.clinical relation.temporal_events').viz('He developed cancer after a mercury poisoning in 1999 ') " + "nlp.load('med_ner.jsl.wip.clinical relation.temporal_events').viz('He developed cancer after a mercury poisoning in 1999')" ], - "execution_count": 10, + "execution_count": 14, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ + "Warning::Spark Session already created, some configs may not take.\n", + "Warning::Spark Session already created, some configs may not take.\n", "ner_wikiner_glove_840B_300 download started this may take some time.\n", "Approximate size to download 14.8 MB\n", "[OK!]\n", @@ -1190,7 +1228,8 @@ "[OK!]\n", "glove_840B_300 download started this may take some time.\n", "Approximate size to download 2.3 GB\n", - "[OK!]\n" + "[OK!]\n", + "Warning::Spark Session already created, some configs may not take.\n" ] }, { @@ -1219,19 +1258,36 @@ "base_uri": "https://localhost:8080/", "height": 1000 }, - "outputId": "527dc314-5f7c-4961-a496-38cc11541379" + "outputId": "126624d5-7892-4367-f715-35340acddc0a" }, "source": [ "# bigger example\n", - "data = 'This is the case of a very pleasant 46-year-old Caucasian female, seen in clinic on 12/11/07 during which time MRI of the left shoulder showed no evidence of rotator cuff tear. She did have a previous MRI of the cervical spine that did show an osteophyte on the left C6-C7 level. Based on this, negative MRI of the shoulder, the patient was recommended to have anterior cervical discectomy with anterior interbody fusion at C6-C7 level. Operation, expected outcome, risks, and benefits were discussed with her. Risks include, but not exclusive of bleeding and infection, bleeding could be soft tissue bleeding, which may compromise airway and may result in return to the operating room emergently for evacuation of said hematoma. There is also the possibility of bleeding into the epidural space, which can compress the spinal cord and result in weakness and numbness of all four extremities as well as impairment of bowel and bladder function. However, the patient may develop deeper-seated infection, which may require return to the operating room. Should the infection be in the area of the spinal instrumentation, this will cause a dilemma since there might be a need to remove the spinal instrumentation and/or allograft. There is also the possibility of potential injury to the esophageus, the trachea, and the carotid artery. There is also the risks of stroke on the right cerebral circulation should an undiagnosed plaque be propelled from the right carotid. She understood all of these risks and agreed to have the procedure performed'\n", - "pipe = nlu.load('med_ner.jsl.wip.clinical relation.clinical').viz(data)" + "data =\"\"\"A 28-year-old female with a history of gestational diabetes mellitus diagnosed eight years prior to presentation and subsequent type two diabetes mellitus ( T2DM ),\n", + "one prior episode of HTG-induced pancreatitis three years prior to presentation, associated with an acute hepatitis , and obesity with a body mass index ( BMI ) of 33.5 kg/m2 ,\n", + "presented with a one-week history of polyuria , polydipsia , poor appetite , and vomiting . Two weeks prior to presentation , she was treated with a five-day course of amoxicillin for a respiratory tract infection .\n", + "She was on metformin , glipizide , and dapagliflozin for T2DM and atorvastatin and gemfibrozil for HTG . She had been on dapagliflozin for six months at the time of presentation.\n", + "Physical examination on presentation was significant for dry oral mucosa ; significantly , her abdominal examination was benign with no tenderness , guarding , or rigidity .\n", + "Pertinent laboratory findings on admission were : serum glucose 111 mg/dl , bicarbonate 18 mmol/l , anion gap 20 , creatinine 0.4 mg/dL , triglycerides 508 mg/dL , total cholesterol 122 mg/dL , glycated hemoglobin ( HbA1c ) 10% , and venous pH 7.27 .\n", + "Serum lipase was normal at 43 U/L . Serum acetone levels could not be assessed as blood samples kept hemolyzing due to significant lipemia .\n", + "The patient was initially admitted for starvation ketosis , as she reported poor oral intake for three days prior to admission .\n", + "However , serum chemistry obtained six hours after presentation revealed her glucose was 186 mg/dL , the anion gap was still elevated at 21 , serum bicarbonate was 16 mmol/L , triglyceride level peaked at 2050 mg/dL , and lipase was 52 U/L .\n", + "The β-hydroxybutyrate level was obtained and found to be elevated at 5.29 mmol/L - the original sample was centrifuged and the chylomicron layer removed prior to analysis due to interference from turbidity caused by lipemia again .\n", + "The patient was treated with an insulin drip for euDKA and HTG with a reduction in the anion gap to 13 and triglycerides to 1400 mg/dL , within 24 hours .\n", + "Her euDKA was thought to be precipitated by her respiratory tract infection in the setting of SGLT2 inhibitor use .\n", + "The patient was seen by the endocrinology service and she was discharged on 40 units of insulin glargine at night , 12 units of insulin lispro with meals , and metformin 1000 mg two times a day .\n", + "It was determined that all SGLT2 inhibitors should be discontinued indefinitely .\n", + "She had close follow-up with endocrinology post discharge .\n", + "\"\"\"\n", + "pipe = nlp.load('med_ner.jsl.wip.clinical relation.clinical').viz(data)" ], - "execution_count": 11, + "execution_count": 5, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ + "Warning::Spark Session already created, some configs may not take.\n", + "Warning::Spark Session already created, some configs may not take.\n", "ner_wikiner_glove_840B_300 download started this may take some time.\n", "Approximate size to download 14.8 MB\n", "[OK!]\n", @@ -1239,7 +1295,8 @@ "[OK!]\n", "glove_840B_300 download started this may take some time.\n", "Approximate size to download 2.3 GB\n", - "[OK!]\n" + "[OK!]\n", + "Warning::Spark Session already created, some configs may not take.\n" ] }, { @@ -1249,11 +1306,11 @@ "" ], "text/html": [ - "Thisisthecaseofaverypleasant46-year-oldCaucasianfemale,seeninclinicon12/11/07duringwhichtimeMRIoftheleftshouldershowednoevidenceofrotatorcufftear.ShedidhaveapreviousMRIofthecervicalspinethatdidshowanosteophyteontheleftC6-C7level.Basedonthis,negativeMRIoftheshoulder,thepatientwasrecommendedtohaveanteriorcervicaldiscectomywithanteriorinterbodyfusionatC6-C7level.Operation,expectedoutcome,risks,andbenefitswerediscussedwithher.Risksinclude,butnotexclusiveofbleedingandinfection,bleedingcouldbesofttissuebleeding,whichmaycompromiseairwayandmayresultinreturntotheoperatingroomemergentlyforevacuationofsaidhematoma.Thereisalsothepossibilityofbleedingintotheepiduralspace,whichcancompressthespinalcordandresultinweaknessandnumbnessofallfourextremitiesaswellasimpairmentofbowelandbladderfunction.However,thepatientmaydevelopdeeper-seatedinfection,whichmayrequirereturntotheoperatingroom.Shouldtheinfectionbeintheareaofthespinalinstrumentation,thiswillcauseadilemmasincetheremightbeaneedtoremovethespinalinstrumentationand/orallograft.Thereisalsothepossibilityofpotentialinjurytotheesophageus,thetrachea,andthecarotidartery.Thereisalsotherisksofstrokeontherightcerebralcirculationshouldanundiagnosedplaquebepropelledfromtherightcarotid.Sheunderstoodalloftheserisksandagreedtohavetheprocedureperformed" + "]]>A28-year-oldfemalewithahistoryofgestationaldiabetesmellitusdiagnosedeightyearspriortopresentationandsubsequenttypetwodiabetesmellitus(T2DMMISC),onepriorepisodeofHTG-inducedpancreatitisthreeyearspriortopresentation,associatedwithanacutehepatitis,andobesitywithabodymassindex(BMI)of33.5kg/m2,presentedwithaone-weekhistoryofpolyuria,polydipsia,poorappetite,andvomiting.Twoweekspriortopresentation,shewastreatedwithafive-daycourseofamoxicillinforarespiratorytractinfection.Shewasonmetformin,glipizide,anddapagliflozinforT2DMMISCandatorvastatinandgemfibrozilforHTG.Shehadbeenondapagliflozinforsixmonthsatthetimeofpresentation.PhysicalMISCexaminationonpresentationwassignificantfordryoralmucosa;significantly,herabdominalexaminationwasbenignwithnotenderness,guarding,orrigidity.Pertinentlaboratoryfindingsonadmissionwere:serumglucose111mg/dl,bicarbonate18mmol/l,aniongap20,creatinine0.4mg/dL,triglycerides508mg/dL,totalcholesterol122mg/dL,glycatedhemoglobin(HbA1cMISC)10%,andvenouspH7.27.Serumlipasewasnormalat43U/L.Serumacetonelevelscouldnotbeassessedasbloodsampleskepthemolyzingduetosignificantlipemia.Thepatientwasinitiallyadmittedforstarvationketosis,asshereportedpoororalintakeforthreedayspriortoadmission.However,serumchemistryobtainedsixhoursafterpresentationrevealedherglucosewas186mg/dL,theaniongapwasstillelevatedat21,serumbicarbonatewas16mmol/L,triglyceridelevelpeakedat2050mg/dL,andlipasewas52U/L.Theβ-hydroxybutyratelevelwasobtainedandfoundtobeelevatedat5.29mmol/L-theoriginalsamplewascentrifugedandthechylomicronlayerremovedpriortoanalysisduetointerferencefromturbiditycausedbylipemiaagain.ThepatientwastreatedwithaninsulindripforeuDKAORGandHTGwithareductionintheaniongapto13andtriglyceridesto1400mg/dL,within24hours.HereuDKAwasthoughttobeprecipitatedbyherrespiratorytractinfectioninthesettingofSGLT2inhibitoruse.Thepatientwasseenbytheendocrinologyserviceandshewasdischargedon40unitsofinsulinglargineatnight,12unitsofinsulinlisprowithmeals,andmetformin1000mgtwotimesaday.ItwasdeterminedthatallSGLT2MISCinhibitorsshouldbediscontinuedindefinitely.Shehadclosefollow-upwithendocrinologypostdischarge.TrAPTrAPTrAPTrAPTrAPTrAPTrAPTrAPTrAPTrAPTrAPTrAPTrAPTrAPTrAP" ] }, "metadata": {} @@ -1266,7 +1323,7 @@ "id": "nzLx9o7ks3lj" }, "source": [ - "# Configuring visualizations \n", + "# Configuring visualizations\n", "\n", "- `labels_to_viz` : Defines a subset of NER labels to viz i.e. ['PER'] , by default=[] which will display all labels. Applicable only for NER viz\n", "- `viz_colors` : Applicable for [ner, resolution, assert ] key = label, value=hex color, i.e. viz_colors={'TREATMENT':'#008080', 'problem':'#800080'}\n" @@ -1278,28 +1335,31 @@ "id": "HP2sq58_C6vW", "colab": { "base_uri": "https://localhost:8080/", - "height": 198 + "height": 244 }, - "outputId": "e4ebd6f3-f6a6-4e86-bd41-e77482ef683f" + "outputId": "8d2477a9-22f4-44fc-99e1-36193a7c2cf6" }, "source": [ "data = 'Dr. John Snow suggested that Fritz takes 5mg penicilin for his cough'\n", "# Define custom colors for labels\n", "viz_colors={'STRENGTH':'#800080', 'DRUG_BRANDNAME':'#77b5fe', 'GENDER':'#ebde34'}\n", - "nlu.load('med_ner.jsl.wip.clinical').viz(data,viz_colors =viz_colors)" + "nlp.load('med_ner.jsl.wip.clinical').viz(data,viz_colors =viz_colors)" ], - "execution_count": 12, + "execution_count": null, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ + "Warning::Spark Session already created, some configs may not take.\n", + "Warning::Spark Session already created, some configs may not take.\n", "ner_wikiner_glove_840B_300 download started this may take some time.\n", "Approximate size to download 14.8 MB\n", "[OK!]\n", "glove_840B_300 download started this may take some time.\n", "Approximate size to download 2.3 GB\n", - "[OK!]\n" + "[OK!]\n", + "Warning::Spark Session already created, some configs may not take.\n" ] }, { @@ -1389,7 +1449,7 @@ " }\n", "\n", "\n", - " Dr. John Snow PER suggested that Fritz PER takes 5mg penicilin for his cough" + " Dr. John Snow PER suggested that Fritz PER takes 5mg penicilin for his cough" ] }, "metadata": {} @@ -1402,28 +1462,31 @@ "id": "r6wMavwSnTDa", "colab": { "base_uri": "https://localhost:8080/", - "height": 151 + "height": 197 }, - "outputId": "45b8cf9f-a67a-4f2c-baf3-922beb640681" + "outputId": "24a0af92-6657-47fa-f910-750dff6424ff" }, "source": [ "data = 'Dr. John Snow suggested that Fritz takes 5mg penicilin for his cough'\n", "# Filter wich NER label to viz\n", "labels_to_viz=['SYMPTOM']\n", - "nlu.load('med_ner.jsl.wip.clinical').viz(data,viz_colors=viz_colors,labels_to_viz=labels_to_viz)" + "nlp.load('med_ner.jsl.wip.clinical').viz(data,viz_colors=viz_colors,labels_to_viz=labels_to_viz)" ], - "execution_count": 13, + "execution_count": null, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ + "Warning::Spark Session already created, some configs may not take.\n", + "Warning::Spark Session already created, some configs may not take.\n", "ner_wikiner_glove_840B_300 download started this may take some time.\n", "Approximate size to download 14.8 MB\n", "[OK!]\n", "glove_840B_300 download started this may take some time.\n", "Approximate size to download 2.3 GB\n", - "[OK!]\n" + "[OK!]\n", + "Warning::Spark Session already created, some configs may not take.\n" ] }, { @@ -1527,7 +1590,7 @@ }, "source": [ "# Specify visualization type manually\n", - "NLU tries to automatically infer a viz type if none is specified. \n", + "NLU tries to automatically infer a viz type if none is specified.\n", "You can manually specify which component to viz by setting `viz_type=type` for one type out of `ner,dep,resolution,relation`" ] }, @@ -1537,23 +1600,26 @@ "id": "Nw9OlQB26qd7", "colab": { "base_uri": "https://localhost:8080/", - "height": 143 + "height": 192 }, - "outputId": "5db17aaa-1f9c-4c62-d73c-c787c1efec9d" + "outputId": "db1a6576-6d6d-4861-8c95-e3de04d6ce4f" }, "source": [ "data = \"Donald Trump from America and Angela Merkel from Germany don't share many oppinions, but they both love John Snow Labs software!\"\n", - "nlu.load('ner').viz(data,viz_type='ner')" + "nlp.load('ner').viz(data,viz_type='ner')" ], - "execution_count": 14, + "execution_count": null, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ + "Warning::Spark Session already created, some configs may not take.\n", + "Warning::Spark Session already created, some configs may not take.\n", "onto_recognize_entities_sm download started this may take some time.\n", - "Approx size to download 160.1 MB\n", - "[OK!]\n" + "Approx size to download 159 MB\n", + "[OK!]\n", + "Warning::Spark Session already created, some configs may not take.\n" ] }, { @@ -1643,7 +1709,7 @@ " }\n", "\n", "\n", - " Donald Trump PERSON from America GPE and Angela Merkel PERSON from Germany GPE don't share many oppinions, but they both love John Snow Labs ORG software!" + " Donald Trump PERSON from America GPE and Angela Merkel PERSON from Germany GPE don't share many oppinions, but they both love John Snow Labs ORG software!" ] }, "metadata": {} @@ -1656,7 +1722,7 @@ "id": "t77NHAB6PegH" }, "source": [ - "# Viz Dependency " + "# Viz Dependency" ] }, { @@ -1665,21 +1731,22 @@ "id": "fmgUO8Eh9cks", "colab": { "base_uri": "https://localhost:8080/", - "height": 705 + "height": 750 }, - "outputId": "6acb7b66-76e3-408b-9775-d126f1dfcbc5" + "outputId": "a671e1ab-c89e-46fd-cb24-43a232bcaf1b" }, "source": [ - "import nlu\n", "data = \"Donald Trump from America and Angela Merkel from Germany don't share many oppinions, but they both love John Snow Labs software!\"\n", - "viz = nlu.load('dep.typed').viz(data,viz_type='dep')" + "viz = nlp.load('dep.typed').viz(data,viz_type='dep')" ], - "execution_count": 4, + "execution_count": null, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ + "Warning::Spark Session already created, some configs may not take.\n", + "Warning::Spark Session already created, some configs may not take.\n", "dependency_typed_conllu download started this may take some time.\n", "Approximate size to download 2.4 MB\n", "[OK!]\n", @@ -1688,7 +1755,8 @@ "[OK!]\n", "pos_anc download started this may take some time.\n", "Approximate size to download 3.9 MB\n", - "[OK!]\n" + "[OK!]\n", + "Warning::Spark Session already created, some configs may not take.\n" ] }, { @@ -1702,7 +1770,7 @@ " font-family: \"Lucida\"; \n", " src: url(\"data:application/x-font-ttf;charset=utf-8;base64,AAEAAAAPAIAAAwBwRUJEVFYYYjAAAAD8AABgtEVCTEM/0hIZAABhsAAAFQhPUy8yhDq8bwAAdrgAAABWY21hcAsuGiUAAHcQAAAGRGN2dCBD1E2KAAB9VAAAAPRmcGdtLlHKAwAAfkgAAAAdZ2x5ZjN05rEAAH5oAAD3pmhlYWS3KoptAAF2EAAAADZoaGVhCyQFvAABdkgAAAAkaG10eIWDdo8AAXZsAAAKZGxvY2FFpYI+AAGA0AAABTRtYXhwBDwB9wABhgQAAAAgbmFtZbG45HUAAYYkAAAGT3Bvc3QJ91RUAAGMdAAAF7hwcmVwFtVKZwABpCwAAAD+AAIAAAAAAAADBAEBBAOAgACAAgMABAOgoAQDAAQDoOCg4AUDAAQDQOBA4EAEAwAEA2DAYMAEAwAEA0DAoGACAQEEA4CABQIBBANAgICAQAUCAAQDgEBAQIADAwAEA0CgQAMDAAMDQOBAAgIBAQNAgAECAQIDwAEBAQEDgAUDAAQDICBAgIAEAwAEA0CgoEAEAwAEA0DAQOAEAwAEA8BggOAEAwAEA8DAIMAEAwAEAyBg4CAEAwAEA+DAIMAEAwAEA0CA4EAEAwAEA+AgQEAEAwAEA0DgoEAEAwAEA0DgIEADAQEDA4AAgAQCAAMDQABAgAMCAAMDQIBAAwMAAwPgAOADAgEDA4BAgAQCAQQDwEAAgAUDAAQDYKCggGAEAwAEA0Cg4KAEAwAEA+DAoMAEAwAEA2CAgGAEAwAEA8CgoMAEAwAEA+DggOAEAwAEA8DggIAEAwAEA2CAoGAEAwAEA6DgoKAEAwAEA+BAQOAEAwAEA2AgIMAEAwAEA6DAoKAEAwAEA4CAgOAEAwAEA6Dg4KAEAwAEA6Dg4KAEAwAEA0CgoEAEAwAEA+DAgIAFAwAEA0CgoEAgBAMABAPgwKCgBAMABANgwCDABAMABAPgQEBABAMABAOgoKBABAMABAOgoEBABAMABAOgoODgBAMABAOgQKCgBAMABAOgQEBABAMABAPgQIDgBQIBBAPAgICAwAUDAAQDgIBAICAFAgEEA8BAQEDAAgMABANAoAEDAAAD4AICAQQDgEADAwADA8BgoAQDAAQDgMCgwAMDAAMDYIBgBAMABAMgYKBgAwMAAwNgwGAEAwAEA2BA4EAEAwADA2DgIMAEAwAEA4DAoKAEAgAEA0AAwEAFAgAEA0AAwECABAMABAOAoMCgBAIABAPAQEBAAwMAAwPg4KADAwADA8CgoAMDAAMDQKBABAMAAwPAoMCABAMAAwNgoGAgAwMAAwPggIADAwADA2BAwAQDAAQDQOBAIAMDAAMDoKBgAwMAAwOgoEADAwADA6Dg4AMDAAMDoECgBAMAAwOgoECAAwMAAwPgQOAFAgAEA0BAgEBABQEBBAOAgICAgAUCAQQDgIBAgIACAwADA0CgBAMABAPgQOCgBAMABANAQOCgBQMABANggIBggAQDAAQDIOCA4AQDAAQD4KDgoAQDAAQDoECgQAQDAAQDoKCgQAQDAAQDIMBgoAQDAAQDgMBgoAQDAAQD4MBgoAQDAAQDoMBgoAQDAAQD4MBgoAQDAAQDQMBgoAQDAAMDYIBggAQDAAQDIGDAYAQDAAQDgGDAYAQDAAQD4GDAYAQDAAQDoGDAYAQDAAQDIMBAQAQCAAQDgMBAQAQDAAQD4MBAQAQDAAQDoMBAQAQDAAQD4MCgoAQDAAQDIECgQAQDAAQDgECgQAQDAAQD4ECgQAQDAAQDoECgQAQDAAQD4ECgQAQDAAQDIKCgYAQDAAQDgKCgYAQDAAQD4KCgYAQDAAQDoKCgYAUDAAQDQOBAQEADAwAEA0CgQAUDAAQDQOCA4EAEAwAEAyBAwGAFAwAEA0CAQCBAAgIBAwPAwAUDAAQDYOBgYGAEAwAEA0CgwKAEAwAEA0DgoEAFAwAEA0Cg4KBAAgMABAPg4AICAQQDQIABAwAEA6AFAwAEAyDgQOCABAMABANgoMCgBAMABANgoKDAAwMAAwPgQOAEAwAEA0DgQOAFAwAEA2CAYADgBQMABAPAIMAA4AQDAAQDoEDgQAQDAAMDoKDAgAQDAAQDgECgQAQDAAQD4EBA4AQDAAQD4KCgoAMDAAMD4KCgBQMABAMgQEBAgAMDAAQDwGCgAwMABANAoEAEAwAEA0CgQOADAwADA+BA4AMDAAMDYKDABAIABANAAEDABQEBBAOAAICAgAIDAAID4CAFAwAEAyAgoKBABQMABAMgQOBAgAQDAAQDQKBAoAQDAAQDQKCg4AMDAAMDYMBgAwMAAwPAYMABAwABA6AAAAAAAwQDAAQDgEDgoAQDAAQD4EDgoAQDAAQD4ECgQAQDAAQDYODAYAMDAAMDYOBgAQMAAgPgAQMAAgPgAgMABAOgoAIDAAQDoKACAgEEA4BAAgIBBANAgAUDAAQDQADgAEAEAwAEA0CgoEAFAwAEA6CgoECABAMABAOgoEBAAwMAAwOgQKAEAgEEA0CAgEAEAgEEA4BAQIAEAwAEA2CA4KAEAwAEA2Cg4KAFAwAEA0DgQOBAAgIBAwPAwAICAQEDQIACAwABA6CgBQMABANAoECgQAQDAAQD4EDgoAQDAAQD4OCA4AQDAAQDIEDgoAQDAAQDoOCA4AQDAAQDgOCA4AQDAAQDIOBA4AQDAAQD4OBA4AQDAAQDoOBA4AQDAAQDgOBA4AQDAAQDIECgQAQDAAQD4ECgQAQDAAQDgECgQAQDAAQDIKCgQAQDAAQD4KCgQAQDAAQDgKCgQAMCAAMDwEBAAgMABANAoAIDAAQDYMABAwAEA+ACAwAEA6BAAQEBBAOAAwMABANAoEABAQEAA4ABAwAEA6ABAQIAA4ACAwAEA6BABAMABAOAwIDgBAMABAPAYMBABAMABAPgwCDABAMABAOgYEDABAMABAPg4EDgBAMABAPg4EDgBQEBBAOAgACAgAQDAAQDwOCgwAQDAAQDwECgQAQDAAQDIKBAQAUDAAQDIKCgQIAEAwAEA4DgwIAFAwAEA4DAoMCAAQMAAgPgAwMAAwOgQKADAwAEA8BA4AMDAAQDwEDgAwMABAPAYMAFAwAEA4CAYCBgBQMABAOAgCBgIAUDAAQDwECgYCAEAwAEA2BA4EAEAwAEA+BgoGAFAwAEA6BgYCBABAMABANA4EDgBQMABANgwCDAQAQDAAMDYEDAQAQDAAQDIGCAYAQDAAQDIGCAYAQDAAQDoGCAYAQDAAQDoGCAYAQDAAQDYGCgYAECAQIDwAEDAAQD4AEBAQIDgAQDAAQD4EDgoAQDAAQD4MBgoAQDAAQD4EDgoAQDAAQD4MBgoAUDAAQDQKDgoCAEAwADA8BgoCAEAwAEA+BggGAEAwAEA+BggGAEAwAEA0BggGAEAwAEA0BggGAEAwAEA+DAoMAEAwAEA2BgoGAEAwAEA8DgoMAEAwAEA+DggOAEAwAEA+BgwGAEAwAEA+DggOAEAwAEA+BgwGAEAwAEA0DggOAEAwAEA0BgwGAFAwAEA+DggOAgBAMAAwNgwGAgBAMABAOg4IDgBAMABAOgYMBgBAMABAPgYKBgBQIBBAPAwMBAgAQDAAQDQGCgYAUCAQQDgMDAQIAFAwAEA2CAoGCABQMABAMgYOAgwAQDAAQD4KDgoAQDAAQD4IDgoAQDAAQDoODgoAQDAAQDwIDAoAQDAAQD4OBA4AQDAAQD4MBAQAQDAAQD4OBA4AQDAAQD4MBAQAQDAAQD4OBA4AQDAAQD4MBAQAUDAAQD4EBA4CAFAwAEA0AAwEAgBAMABAPgoKDABQMABAOgAOCgQAQDAAQD4OAgwAUDAAQD4ADAQIAFAwAEA6DAoKBABQMABAOAoMCgQAMDAAMDoMCgBAMABANAgIDgBAMABAPgQEBABQMABAOAgIDgQAUCAAQDwEBAQIAEAwAEA6CggOAEAwAEA+BgQEAEAwAEA4CggOAEAwAEA8BAYEAEAwAEAyDg4KAEAwAEAyDAoKAFAwAEA6Dg4KBABAMAAwPAoKBABAMABAPgoOCgBAMABAPgwKCgBAMABAOAwKCgBQMABAOg4OCgIAQDAAMDwKCgIAQDAAQD4ECgQAQDAAQD4ECgQAQDAAQD4ECgQAQDAAQD4ECgQAQDAAQDoECgQAQDAAQDoECgQAQDAAQDIODAoAQDAAQDIOCAgAUDAAQD4MCgoEAEAwADA+CAgEAEAwAEA+Dg4KAEAwAEA6DggIAEAwAEA+DAIMAEAwAEAyBgQMAEAwAEA+DAIMAEAwAEA+BgQMAFAwAEA+BAQECABQMABANA4EAgQAQDAAQD4OBAQAQDAAQDYOBAIAQDAAQD4EDgQAQDAAQD4OBAIAQDAAQD4KCgQAQDAAQD4KCgYAQDAAQD4KCgQAQDAAQD4KCgYAQDAAQD4KCgQAQDAAQD4KCgYAQDAAQD4KCgQAQDAAQDQKCgQAQDAAQDoKCgQAQDAAQDoKCgYAUDAAQDoKCgQCAEAwADA6CgYCAEAwAEA+Cg4OAEAwAEA+Cg4OAEAwAEA+CgQEAFAwAEA+CgoECABAMABAMg4EDgBAMABAMg4EDgBAMABANA4EDgBAMABANA4EDgBAMABAMgQMBABAMABAPA4KDgBAMABAOgwGCgBAMABAMgYMDgBAMABAMg4ECgBAMABANg4KDABAMABAMgYKDABAIAAwNAAECAAgEBBAOAgAIDAAQDQKAEAwAEA8Cg4KABAQEDA4AEAwAEA+DgQGAEAwAEA4Cg4KAEAwAEA+DAQOAEAwAEA8CgoEAEAwAEA6DAQEAEAwAEA8CgQOAEAwAEA+BAQCAEAwAEA0Cg4KAEAwAEA+DAoMAEAwAEA+CAgIAEAwAEA0CgoOAEAwAEA+DggOAEAwAEA+BAgOAEAwAEA6DgoKAEAwAEA0DgoEAEAwAEA+BAQOAEAwAEA6DAoKAEAwAEA0BAoKAEAwAEA+DgoKAEAwAEA6Dg4KAEAwAEA+BAAOAEAwAEA0CgoEAEAwAEA+CgoKAEAwAEA+DAgIAEAwAEA+BAgOAEAwAEA+BAQEAEAwAEA6BAQEAFAwAEA0CgoEBABAMABAOgQKCgBAMABAPgoOBABAMABANAoEDgBAMABAOg4EDgBAMABAOgoEBABAMABANAYKBgBAMABANAYMBgBQMABANAwKCgIAQCAQQDgACAQAQDAAQD4KCgQAMDAAMDYKBgBQMABAPgwKDAgAQDAAMDoKBAQAQDAAQDYECgQAMDAAMDYMBgBQMABAPgQIBgIAQDAAMDwKCgIAQDAAQDQOCgQAMCAQMDgIBAAwMAAwOgwKAEAwAEA4BAoKAEAwADA6CgwIADAwADA6CgQAUDAAQD4EDgQOADAwADA0CgQAQDAAMDQKDAgAQDAAMDYIBgIAMDAAMDYKBAAwMAAwPgQEADAwADA6CgQAUDAAQDQECgQEAEAwADA6BAoKAFAwAEA0DgoEBAAwMAAwOg4OAEAwAEA6BAQCAEAwAEA6CgoEAEAwAEA0BAoEAEAwAEA0CgoEAEAwAEA0CgoOAEAwAEA6DggOAEAwAEA+BAYGAEAwAEA0DggIAEAwAEA2DggGAEAwAEA2DAIMAEAwAEA+BAQOAEAwAEA6DgQOAEAgEEA8BAQIAEAwAEA8DA4OAEAwAEA8DAoOAEAwAEA+BAYGAEAwAEA0CgwKAEAwAEA+CgQIAFAwAEA6CgoOBABAMABANAoOCgBAMABAPggODABAMABAPgwKDABAMABAPggICABQMABANgYKDgoAQDAAQD4OCA4AQDAAQD4EDg4AQDAAQDwMAgwAQDAAQDoODgoAQDAAQD4KDgoAQDAAQDoMCgoAQDAAQDYGCgoAQDAAQDoODgoAQDAAQDoOCgoAQDAAQDQKCgQAQDAAQD4KCgoAQDAAQD4MCAgAQDAAQDYICAYAQDAAQD4EBAQAQDAAQDoKBAgAUDAAQDQECgQEAEAwAEA6BAoKAFAwAEA6CgoOAgBAMABAOgoGAgBAMABAOgoKDgBQMABAOgoKDgIAQDAAQDwEBgYAQDAAQDoKDg4AQCAQQDgIDAwAQDAAQDwOAgwAQDAAQDwKCgwAQDAAQD4GCgoAMDAAMDwGCgBAMABAMgQKBAAwMAAwPg4OADAwADA+CAgAQDAAMDYGDgoAMDAAMDYMBgAwMAAwPgQOADAwADA8BgwAMDAAMDoOCgAwMAAwOg4KADAwADA6DAoAMDAAMDYGCgAwMAAwPg4KADAwADA6DgoAMDAAMDQKBAAwMAAwPgoKAEAwADA8CgwIADAwADA2CAYAMDAAMD4EBABAMAAwOgoECABQMABANAQKBAQAMDAAMDoECgBAMAAwOgoOAgAwMAAwOgYCADAwADA6Cg4AQDAAMDoKDgIAMDAAMDwGBgAwMAAwOg4OADAgEDA4DAwAMDAAMDwGDAAwMAAwPAoMADAwADA+BgoAQDAAQDoGDAYAUDAAQDwIDAoCAEAwAEA0DggIADAwADA2DAYAMDAAMDYEDABAIABANAAMBABAMABAOgAMBABQIABANAAMBAgAMDAAMDwODgAwMAAwPAoOAEAwAEA8CAwKAEAwAEA0CgwKAFAwAEA+CgoECABAMAAwOgoOBABAMABAMg4ICABAMABAMg4ICABAMABAOAoODgBAMABAOAoODgBAMABAMgoODgBAMABAMgoODgBAMABAOgoODgBAMABAOgoODgBAMABAOAoEBABQMABAOAoKBAgAEDAAID4AIDAAED4OAEAwAEA6CgAKABAwAEA+ADAwADAyBAgAMDAAQDwKCgBAMABAMgwEDgBAMABAPA4KCgBAMABAPAwODgBQMABAOgwOBgYAUDAAQDwOBA4GAFAwAEA8DgQOBgBQMABAPA4EDgYAMDAAMDQOBABQMABANA4EBAQAMDAAMDQOBABQMABANAQEDgQAMDAAMDQOBABQMABANA4EDgQAUDAAQDQODgQOADAwADA4CA4AMDAAMDQKCgBQMABAPgAOAA4AQDAAQDQKCg4AIDAAID4IAFAgEEA0CAgICABQIABANAQEBAgAEDAAID4AUBAQQDgICAgIADAgECA8CAgAMCAAIDwEBAAwIBBAOAgMADAgAEA0BAwAUCAQQDgIDAgIAFAgAEA0BAwEBAAwMAAgPgQEADAwAEA0BA4AUDAAQDQEDgQEADAwADA+AA4AUBAQQDgICAgIAEAgEDA8CAwIADAgECA8CAgAQCAQMDwIDAgAQCAAMDwEDAQAMCAAIDwEBABAIAAwPAQMBABAIBBAOAwIDAAwIBBAOAgMAEAgEEA4DAgMAEAgAEA0DAQMADAgAEA0BAwAQCAAQDQMBAwAUCAQQDgMCAwIAFAgEEA4CAwICABQIBBAOAwIDAgAUCAAQDQMBAwEAFAgAEA0BAwEBABQIABANAwEDAQAQDAAMD4ADgQAMDAAID4EBABAMAAwPgAOBABAMABANA4ADgAwMABANAQOAEAwAEA0DgAOAFAwAEA0DgQOBABQMABANAQOBAQAUDAAQDQOAA4EADAwAEA+Dg4AMDAAID4ODgBQMABAPg4ODg4AUCAAQDwMDAwMAFAgEEA8DAwMDABQMABAOgAKAAoAUDAAQDoECgQKAFAwAEA+Cg4KDgAwMAAwPg4OACAwADA+DgBAMABANAQODgAwMAAwPA4MAEAwAEA+DgQEADAwADA2DgYAMDAAMD4KDgBQMABAPg4KDg4AUDAAQD4ICggOAEAwAEA0Cg4EAEAwAEA0DgoEADAwADA6BAoAUDAAQDQKBA4EAEAwAEAyBgoEAEAwAEA0DgQOAEAwAEA0DgQOAEAwAEA6Dg4EAEAwAEA0Dg4EAEAwAEA2BAwMAFAwAEA2BAQKCgAAAAAAQFAQIFBICAgACAAgMBBQSgoAQEAAQEUPBg8AYDAAUEQODAYOBABQQABQRQoGBQoAUEAAUEQKBQoHACAQIFBICABgMBBQQgQICAQCAGAwEFBIBAICBAgAQDAQUEQKBAoAMDAQMEQOBAAgIBAQRAgAEDAQIE4AEBAgEEgAYEAAUEECAgQICABQMBBQRAoKCgQAUDAQUEQMBAQOAFAwEFBMAgQIDgBQMBBQTAIMAgwAUEAAUEIGCg8CAFAwEFBOCAwCDABQMBBQRAgMCgQAUDAQUE4CBAQEAFAwEFBECgQKBABQMBBQRAoGAgQAQBAgQEgAAAgAUCAQQEQAAAQIADAgEDBECAQAMDAQME4ADgAwIBAwSAQIAFAwEFBMAgQABABgQABQRgkLCwgHAEAwEEBECg4KAEAwEEBMDAoMAEAwEEBGCAgGAEAwEEBMCgoMAEAwEEBODggOAEAwEEBODggIAEAwEEBGCAoGAEAwEEBKDgoKAEAwEEBOBAQOAEAwEEBGAgIMAEAwEEBKDAoKAEAwEEBICAgOAEBAAEBJDw8JAEAwEEBKDg4KAEAwEEBECgoEAEAwEEBODAgIAFAwEEBECgoEAgBAMBBATgwKCgBAMBBARgwCDABAMBBATgQEBABAMBBASgoKBABAMBBASgoEBABAMBBASgoODgBAMBBASgQKCgBAMBBASgQEBABAMBBATgQIDgBgIBBQTAgICAgMAGBAAFBIBAQCAQEAYCAQUEwEBAQEDABAMBBQRAQKCgAQQAAATwAgIBBQSAQAMDAQMEwGDgBQMBBQSAgMCgwAMDAQMEYIBgBQMBBQQgIGCgYAMDAQMEYMBgBQMBBQQgQOBAQAQDAQMEYOAgwAUDAQUEgIDAoKAFAgEFBEAAwEBABgIBBQRAAMBAQIAFAwEFBICAoMCgBQIBBQTAQEBAQAMDAQME4OCgAwMBAwTAoKADAwEDBECgQAQDAQMEwKDAgAQDAQMEYKBgIAMDAQME4ICAAwMBAwRgQMAEAwEEBEDgQCADAwEDBKCgYAMDAQMEoKBAAwQAAwSQ8GADAwEDBKBAoAQDAQMEoKBAgAMDAQME4EDgBgMBBQQgQIBAQCAGAQIFBICAgICAgAYDAQUEgEAgQECAAgQAAwRQoAUDAQUEoECg4KAFAwEFBEDgoOCgBQMBBARggIBggAUDAQUEIODggOAFAwEFBOCg4OCgBQMBBQSgQKCgQAUDAQUEoKCgoEAFAwEFBCBAwGDgBQMBBQSAQMBg4AUDAQUEQKDAYOAFAwEFBKAAwGDgBQQABQRQoGAwcAUDAQUEQKDAYOAEAwEDBGCAYIAFAwEFBCBAYMBgBQMBBQSAQGDAYAUDAQUEQKBgwGAFAwEFBKAAYMBgBQMBBQQgQMBAQAUCAQUEgEDAQEAFAwEFBECgwEBABQMBBQSgAMBAQAUEAAUEUKBgUFAFAwEFBCBAQKBABQMBBQSAQECgQAUDAQUEQKBAoEAFAwEFBKAAQKBABQQABQRQoCBQIAUDAQUEIECgoGAFAwEFBIBAoKBgBQMBBQRAoKCgYAUDAQUEoACgoGAFAwEFBEDgQEBAAwMBBQRAoEAFAwEFBEDggOBABQQABQQgQGDAcAYDAQUEYECgQCDAAgIBAwTAwAYEAAUEcNDQUFBQBQQABQRAoKCQoAUEAAUEYNDw0GAGBAAFBGCQ8JDwYAMEAAUE8FBQAgICBQRAgAEDAQUEoAUEAAQEIPBA8EAEBAAEBHCw4LAEAwEEBGCgoMADBAADBGCwYAQDAQQEQOBA4AUDAQUEYIBgAOAFAwEFBMAgwADgBQMBBQSgoEDgQAQDAQMEoKDAgAUDAQUEQCBgoEAEBAAEBPBAQPAEBAAEBPBQUFADBAADBPBQUAYDAQUEIEBAQECABAMBBQTAIODgBAMBBQRAoKBABQMBBQRAoKBA4AMEAAME8GCwAwMBAwRgoMAGAwEFBEAAQEAgwAUBAgQEgACAgIACAwECBOAgBgQABQQQEBCgoEAGAwEFBCBA4EBAgAUEAAUEUKAAUKAEAwEEBECgoOADBAADBFCgUAMEAAMEoFCgAQMBAQSgAAAAAAQFAwEFBIBAoOCgBQMBBQTgQKDgoAUDAQUE4ECgoEAEBAAEBHCwoHADBAADBHCgUAEDAQIE4AEEAAIE8AIEAAUEoFACBAAFBFCgAgIBBQSAQAICAQUEQIAFAwEEBEAA4ABABAMBBARAoKBABgMBBQSgAKCgQIAFAwEFBKCgQEBABAQABQSQYGCQBAIBBARAgIBABAIBBASAQECABQQABQQwQPBQUAUEAAUEMFDwUFAFAwEFBEDgQOBAAgIBAwTAwAICAQEEQIACBAABBFCgBQQABQSgUKBQoAUDAQUE4ECg4KAFAwEFBODg4IDgBQMBBQQgQKDgoAUDAQUEoODggOAFAwEFBIDg4IDgBQMBBQQg4EBA4AUDAQUE4OBAQOAFAwEFBKDgQEDgBQMBBQSA4EBA4AUDAQUEIECgoEAFAwEFBOBAoKBABQMBBQSAQKCgQAUDAQUEIKCgoEAFAwEFBOCgoKBABQQABQSAUFBQIAMCAQMEwEBAAgMBBQRAoAIEAAUEUKABBAAFBPACBAAFBJBgAQECBQSAAwMBBQRAoEABAQIABIACBAAFBFCgAQECAASAAgMBBQSgQAQEAAQEQGDAcAUDAQUEwEBgwEAFAwEFBOBgwCDABQMBBQSgQGBAwAUDAQUE4OBAgOAFAwEFBOAA4EDgBgECBQSAgACAgIAEBAAEBGDwUGAFAwEFBKDAQKBABQMBBQQgoEBAQAYDAQUEIECgoECABAMBBASA4MCABgMBBQSAgMCgwIABAwECBOADAwEDBKBAoAQDAQUEwEBA4AQDAQUEwCDA4AQDAQUEwOAgwAYEAAUE0GBwUGCwBgQABQTQYFAwcJAGBAAFBNDgUPBwkAUEAAUEcHBA4EAFAwEFBOBggKBgBgMBBQSgQGDgIMAFAwEFBEDgQEDgBQMBBARgwCDAQAQDAQMEYEDAQAUDAQUEIGCAgGAFAwEFBCBAYIBgBQMBBQTgYICAYAUDAQUEoEBggGAFAwEFBOAgYKBgAQMBAgTgAQQABQTwAQECAgSABQMBBQTgQKDgoAUDAQUE4ADAYOAFAwEFBOBAoOCgBQMBBQSgQMBg4AUDAQQEQKDgoCAEAwEDBMBg4CAFAwEFBOBggIBgBQMBBQRAoGCAYAUDAQUEQGCAgGAFAwEFBEAAYIBgBQMBBQTgwKCgwAUEAAUEsFAwUDAEBAAEBGDwUGAFAwEFBODg4IDgBQMBBQTgAGDAYAUDAQUE4ODggOAFAwEFBKBAYMBgBQMBBQRA4OCA4AUDAQUEQABgwGAFAwEEBODggOAgBAMBAwRgwGAgBQMBBQTg4OCA4AUDAQUEoEBgwGAFAwEFBOBggKBgBgMBBQRAoGDgIMAFAwEFBEBggKBgBgMBBQRAAGDgIMAFAwEEBGCAoGCABQMBBAQgYOAgwAUDAQUE4KDgoKAFAwEFBOCAwKCgBAQABARQ8HBQBQQABQTgQGBQUAUDAQUE4OBAQOAFAwEFBOAAwEBABQMBBQTg4EBA4AUDAQUE4ADAQEAFAwEFBODgQEDgBQMBBQSgQMBAQAUDAQQE4EBA4CAGAwEFBEAAwEBAIAQEAAQE8FBQ4AYEAAUEUADwUFAgBQMBBQRgYCAgwAYDAQUE4ADAQECABQMBBASgwKCgQAYDAQUEgICgwKBAAwMBAwSgwKAFAwEFBECAgIDgBQQABQTQYEBAQAUDAQQEgICA4EAGAgEFBMBAQEBAgAQDAQQEoKCA4AUEAAUE0FBAQEAFAwEFBICAoIDgBQQABQTAQFBAQAUDAQUEIKDg4KAFAwEFBCBAwKCgBQMBBASg4OCgQAQDAQMEwKCgIAUDAQUE4KDg4KAFAwEFBKBAwKCgBQQABQSAgGBQUAUDAQQEoODgoCAEAwEDBMCgoCAFAwEFBOBAoKBABQMBBQTgAECgQAUDAQUE4ECgoEAFAwEFBOAAQKBABQMBBQSgQKCgQAUDAQUEoABAoEAFAwEFBCDgwKCgBQMBBQQgQOCAgAUDAQQE4MCgoCAEAwEDBOCAgEAFAwEFBODgwKCgBQMBBQSgQOCAgAUDAQUEIGDAIMAFAwEFBCBAYEDABQMBBQRgYMAgwAUDAQUEQKBgQMAFAwEEBOBAQECABQMBBARA4EAgQAUDAQUE4OBAQEAFAwEFBCBA4EAgBAMBBATgQOBABAMBBATg4EAgBQMBBQTgoKCgQAUDAQUE4ACgoGAFAwEFBOCgoKBABQMBBQTgAKCgYAUDAQUE4KCgoEAFAwEFBOAAoKBgBQMBBQTgoKCgQAUDAQUEQKBAoEAFAwEFBKCgoKBABQMBBQSgAKCgYAUDAQQEoKCgQCAEAwEDBKCgYCAFBAAFBGCQkGBgBQQABQRgAJDwYAUDAQUE4KBAQEAGAwEFBOAAoKBAgAUDAQUEIOBAgOAFAwEFBCBA4EDgBQMBBQRA4ECA4AUDAQUEQADgQOAFAwEFBCBAwEBABQQABQRwoFBwUAUEAAUEULBgMHAFBAAFBBBwsOCwBQQABQQQIPBgsAUDAQUEIGCgoMAFAwEFBCBAYKDABQIBBARAAABAgAIBAgUEgIACAwEFBECgBQQABQSAoFBwUAEBAgMEgAQEAAQE8PBAcAQEAAQE0PBQUAQEAAQE8KAgcAQEAAQEoNBQIAQEAAQE0KAgIAQEAAQEoNAgcAUDAQUEQKBAQCAEAwEEBECg4KAEAwEEBODAoMAEAwEEBOCAgIAEAwEEBECgoOAEAwEEBODggOAEAwEEBOBAgOAEAwEEBKDgoKAEAwEEBEDgoEAEAwEEBOBAQOAEAwEEBKDAoKAEAwEEBEBAoKAEBAAEBJDw8JAEAwEEBKDg4KAEAwEEBOBAAOAEAwEEBECgoEAEAwEEBOCgoKAEAwEEBODAgIAEAwEEBOBAgOAEAwEEBOBAQEAEAwEEBKBAQEAGAwEFBEBAoKBAQAQDAQQEoECgoAUDAQUEQKDgQEAEAwEEBECgQOAFAwEFBKDgQEDgBQMBBQSgoEBAQAUDAQUEQABgoGAFAwEFBEAAYMBgBgMBBQRAAMCgoCAFAgIFBIAAgIBABQMBBQTgAKCgQAMDAQMEYKBgBgMBBQRAoMCgwIAEAwEDBKCgQEAFAwEFBECAQKBAAwMBAwRgwGAGAwEFBOBAgIBgIAQDAQMEwKCgIAUDAQUEQKDgoEADAgIDBICAQAMDAQMEoMCgBQMBBQSAQECgoAQDAQMEoKDAgAMDAQMEoKBABgMBBQTgQGCAYCADAwEDBECgQAQDAQMEQKDAgAQDAQMEYIBgIAMEAAMEcKBAAwMBAwTgQEADAwEDBKCgQAUDAQQEQECgQEAEAwEDBKBAoKAFBAAEBCCwsGAgAwQAAwSwsGAFAwEFBKAAQEAgBQMBBQSgAKCgQAUDAQUEQABAoEAFAwEFBEAAoKBABQQABQRAALCwYAUDAQUEoODggOAEBAAEBOBAcGAFAwEFBEDggICABAMBBARg4IBgBAMBBARgwCDABAMBBATgQEDgBQMBBQSg4EBA4AQCAQQEwEBAgAQEAAQE4KCwsAQEAAQEoOCwsAQEAAQE4EBgUAUDAQUEQKDAoKAFAwEFBOCgoECABQMBBASgoKDgQAQDAQQEQKDgoAQDAQQE4IDgwAQDAQQE4MCgwAQDAQQE4ICAgAUEAAQEcFCQ8JAEAwEEBODggOAEBAAEBLBgYLAEAwEEBMDAIMAEAwEEBKDg4KAFAwEFBECg4OCgBAMBBASgwKCgBAQABARwUFCQBAQABASQ8PCQBAMBBASg4KCgBAMBBARAoKBABAMBBATgoKCgBAMBBATgwICABAMBBARggIBgBAMBBATgQEBABAMBBASgoECABQQABAQgYLBgIAQDAQQEoECgoAUDAQQEoKCg4CAEAwEEBKCgYCAEBAAEBLCwsPAFBAAEBLCwsPAQBAQABATAQHBgBAQABASQkPDQBAMBBASAgODABAMBBATA4CDABAQABASg0NCgBAMBBATgYKCgAwMBAwTAYOAFAwEFBCBA4KBAAwMBAwTg4OADAwEDBOCAgAQEAAMEcFDwkAMDAQMEYMBgAwQAAwSwYLADAwEDBMBgwAMDAQMEoOCgAwMBAwSg4KADAwEDBKDAoAMEAAMEcFCQAwQAAwTw8JADAwEDBKDgoAMDAQMEQKBAAwMBAwTgoKAEAwEDBMCgwIADAwEDBGCAYAMDAQME4EBABAMBAwSgoECABgQABQQgIGCwYCADAwEDBKBAoAQDAQMEoKDgIAMDAQMEoGAgAwQAAwSwsPAEBAADBLCw8BADBAADBMBwYAMEAAMEkPDQAwMBAwSA4MADAwEDBMBgwAMEAAMEoNCgAwMBAwTgYKAFAwEFBKAAYMBgBgQABQRA4EBgUBAFAwEFBCBA4ICAAwMBAwRgwGADAwEDBGBAwAUCAQUEQADAQEAFAwEFBKAAwEBABgIBBQRAAMBAQIADBAADBOCwsAMEAAMEoPCwBQQABQRA4EBgUAUDAQUEQACgwKAGAwEFBOAAoKBAgAQDAQMEoKDgQAUDAQUEIOCAgIAEAwEEBCDggIAFBAAFBECQkPBgBQQABQSAQJDwYAUEAAUEIJCQ8GAFBAAFBBAgkPBgBQQABQRQkJDwYAUEAAUEkACQ8GAFAwEFBICgQEBABgMBBQSAQKCgQIABAwECBOACBAABBPDwBQMBBQSgoKAAoAEEAAUE8AQEAAQEECBAgAMDAQUEwKCgBQQABQQgQOBA8AUEAAUEwOCwoJAFBAAFBKDg4LCwBgQABQSQoFCgUCAGBAAFBNDgUKBQIAYEAAUE0KBQoFAgBgQABQTQYNCgUCADBAADBEDwQAYDAQUEQOBAQEBAAwQAAwQg8CAGAwEFBEBAQEDgQAMEAAMEYPBgBgMBBQRA4EBA4EAGAwEFBEDgQOBA4AMDAQMEgIDgAwQAAwRgkJAFAwEFBOAA4ADgBAMBBARAoKDgAgMBAwTggAYCAgUEQICAgICABgIBBQRAQEBAQIABBAADBPAGAQIFBICAgICAgAQCAgMEwICAgAQDAAME4CAgIAMCAgUEgIDAAwMABQQgIOAGAgIFBICAwICAgAYDAAUEICDgICAgBAQAAwTwICAgAwQABQQgIPAGBAAFBCAg8CAgIAMEAAQE8ADwBgIBBQTAwMDAwMAFAgIEBMCAwICABAMBAwTgwMDABQMBBATggODAwAUDAAQE4CDgICAEAwADBOBgYGAFAwAEBOAg4GBgBAICBQSAwIDAAwMBBQTAwOAEAwEFBMDggOAEAwAFBCDgIOADAwAFBGBg4AQDAAUEYOAg4AYCAgUEgMCAwICABgMBBQTAwODAwMAGAwEFBMDggODAwAYDAAUEIOAg4CAgBgMABQRgYOBgYGAGAwAFBGDgIOBgYAUEAAQE8ADwICAEBAADBPBgYGAFBAAEBPAA8GBgBAQABQQg8ADwAwQABQRgYPAEBAAFBGDwAPAGBAAFBCDwIPAgIAYEAAUEYGDwYGBgBgQABQRg8ADwYGADBAAFBPDw8AMEAAIE8PDwBgQABQTw8PDw8PAGAgAFBMDAwMDAwAYCAgUEwMDAwMDABQMABQSgAKAAoAYEAAUEoFCgUKBQBgQABQTwoPCg8KADAwEDBODg4AIDAQME4OAEAwEEBEBA4OADBAADBMDwwAQDAQQE4OBAQAMEAAMEMPAwBAQABARgkJBgBgQABQTw8JCQ8PAGBAAFBPCQYGCQ8AUEAAUEYPCQ8GAFBAAFBGCQ8JBgAwMBAwTgoOAFAwEEBECgQOBABAQABAQQYKBABQMBBQRA4OBA4AQDAQQEQOBA4AQDAQQEoODgQAQDAQQEQODgQAUEAAUEYFBAwMAGBAAFBDBQUHDwwAAAAAAEBgECBgSAgICAAIACAwEGBKCgBQQABQRQ8FDwoAcDAAYEQODAQGDgQAYEAAYEUKBAIFCgBgQABgRAoECwoHACAQIGBICABwMBBgQgQICAgEAgBwMBBgSAQCAgIECABAMBBgRAoECgAwMBAwRA4EADAgEBBEBAgAEDAQME4AEBAgEEgAcEAAYEECAgQECAgAYEAAYEYJCQkJBgBgMBBgRAwEBAQOAGAwEGBMAgIECA4AYDAQYEwCDAICDABgQABgQgYKDwICAGAwEGBOCAwCAgwAYDAQYEYIDAoKBABgMBBgTgICBAQEAGAwEGBECgQKCgQAYDAQYEQKCgYCDABAECBASAAACABgIBBARAAABAQIAFAwAFBCBAgEAgAwMBBATgAOAFAwEFBIBAIECABgMBBgTAICBAAEAHBAAGBCBQkLCwgHAFBAAFBGCQ8JCQBQMBBQTAoMCg4AUDAQUEYICAgGAFAwEFBMCgoKDABQMBBQTggOCA4AUDAQUE4IDggIAFAwEFBGCAoKBgBQMBBQSgoOCgoAUDAQUE4EBAQOAFAwAFBGAgICDABQMBBQSgoMCgoAUDAQUEgICAgOAFBAAFBJDw8JCQBQMBBQSg4OCgoAUEAAUEYJCQkGAFAwEFBMCgwICABgQABQRgkJCQYDAFAwEFBMCgwKCgBQMBBQRggEAgwAUDAQUE4EBAQEAFAwEFBKCgoKBABQMBBQSgoKBAQAUEAAUEkJDw8GAFAwEFBKCgQKCgBQMBBQSgoEBAQAUDAQUE4CBAgOAHAgEGBMCAgICAgMAHBAAGBIBAQCAgEBAHAgEGBMBAQEBAQMAFAwEGBEBAoKCgAQQAAATwAgIBBgSAQAQDAQQEwCDg4AYDAQYEgIDAoKDABAMBBARggIBgBgMBBgQgIGCgoGAEAwEEBEDggGAGAwEGBGBA4EBAQAUDAQQEYKDgIMAGAwEGBICAwKCgoAYCAQYEQADAQEBABwIBBgRAAMBAQECABgMBBgSAgKDAoKAGAgEGBMBAQEBAQAQEAAQEkPCQkAQDAQQEwKCgoAQDAQQEQKCgQAUDAQQEwKCgwIAFAwEEBGCgoGAgBAMBBASgwICABAMBBARgwCDABQMBBQRA4EBAIAQDAQQEoKCgYAQDAQQEoKBAQAQEAAQEkJDwYAQDAQQEoEBAoAUDAQQEoKBAQIAEAwEEBOBAgOAHAwEGBCBAQIBAQCAHAQIGBICAgICAgIAHAwEGBIBAQCBAQIACBAADBFCgBgQABgSQYJDwkJAGBAAGBGBgkPCQkAcDAQUEYICAgGBAgAYDAQYEIOCA4IDgBgMBBgTgoODgoKAGBAAGBJBgkJCQYAYDAQYEoKCgoKBABgMBBgQgQMAg4OAGBAAGBIBAYBBwcAYDAQYEQKDAIODgBgMBBgSgAMAg4OAGBAAGBFCgYBBwcAYDAQYEQKDAIODgBgMBBARggIBgQIAGAwEGBCBAQOCAYAYEAAYEgEAgcEAwBgMBBgRAoEDggGAGAwEGBKAAQOCAYAYDAQYEIEDAQEBABgMABgSAQGAgICAGAwEGBECgwEBAQAYDAQYEoADAQEBABgMBBgTgAMCgoKAGAwEGBCBAQKCgQAYDAQYEgEBAoKBABgMBBgRAoECgoEAGAwEGBKAAQKCgQAYEAAYEUKAgUFAgBgMBBgQgQKCgoGAGAwEGBIBAoKCgYAYDAQYEQKCgoKBgBgMBBgSgAKCgoGAGAwEFBEDgQEBAQAMDAQYEQKBABQMBBQRA4IDgQAUEAAUEIEBgwHAHAwEGBGCAQKBAIMACAgEDBMDABwQABgRw0NBQUFBQBgQABgRAoKCgkKAGBAAGBGDQ8NCQYAcEAAYEYJDw0PCQYAMEAAYE8FBQAgICBgRAgAEDAQYEoAUEAAQEIPBA8EAFBAAFBHCg8KCwBwQABgQQYLCQ0GCABAQABARgsLBgBAMBBARA4EDgBQMBBQRggGAA4AUDAQUEwCDAAOAFAwEFBKCgQOBABQMBBASgoKDAgAYDAQYEQCBgoKBABQQABQTwQCBA8AUEAAUE8FBQUFAEBAAEBPBQUFAHAwEFBCBAQEBAQIAEAwEGBMAg4OAEAwEGBECgoEAGBAAGBGCQkJBg8AQEAAQEoHDAsAYDAQUEIECgoECABgMBBQRAAEBAIMAFAQIEBIAAgICAAgMBAwTgIAcEAAYEEBAQIKCgQAcDAQYEIEBA4EBAgAUEAAUEUKAAUKAFBAAFBGBgkJDwAwQABARQoFADBAAEBKBQoAEDAQEEoAAAAAAEBgQABgSAYJDwkJAGBAAGBGBgkPCQkAYEAAYEYGCQkJBgBQQABQRwoLCgcAQEAAQEULCgUAEDAQME4AEEAAME8AMEAAYEoKBQAwQABgRQUKADAgEGBICAQAMCAQYEQECABQMBBQRAAOAAQAUDAQUEQKCgoEAHAwEGBKAAoKBAQIAGAwEGBKCgoEBAQAQEAAUEkGBgkAQCAQQEQICAQAQCAQQEgEBAgAYEAAYEMEDwUFBQBgQABgQwUPBQUFAGAwEFBEDgQEDgQAICAQMEwMADAgEBBEBAgAMEAAEEUFCgBgQABgRQoECgUKAGBAAGBGBgkPCQkAYDAQYE4OCA4IDgBgQABgQQYJDwkJAGAwEGBKDggOCA4AYEAAYEgHBAcEBwBgMBBgQg4EBAQOAGAwEGBODgQEBA4AYDAQYEoOBAQEDgBgQABgSAcCAgIHAGBAAGBBBgkJCQYAYEAAYEYGCQkJBgBgQABgSAYJCQkGAGBAAGBBCgoKCgQAYDAQYE4KCgoKBABgQABgSAUFBQUCAEAgEEBMBAQEACAwEGBECgAgQABgRQoAEEAAYE8AIEAAYEkGABAQIGBIADAwEGBECgQAICAQAEQIACBAAGBFCgAQECAASAAgMBBgSgQAUEAAUEQEBgwHAGAwEGBMBAYMBAQAYDAQYE4GCAQCDABgMBBgSgQGDAIMAGAwEGBODgIECA4AYDAQYEoEDgYIDgBwECBgSAgIAAgICABQQABQRgUPBQYAYDAQYEoMBgoKBABgMBBgQgoKBAQEAHAwEGBCBAoKBAQIAFAwEFBIDAoMCABwMBBgSAgMCgoMCAAQMBAwTgBAQABASQYGCQBAMBBgTAQEDgBAMBBgTAIMDgBAMBBgTA4CDABgQABgTQYHBQYLAGBAAGBNBgUDBwkAYEAAYE0OBQ8HCQBgQABgRwQHBA4EAGAwEGBGBggKCgYAcDAQYEoEBgoOAgwAYDAQYEQOBAQEDgBgMBBQRggEAgwEAFAwEEBGDAIMBABgMBBgQgYICAgGAGAwEGBCBAYICAYAYDAQYEYGCAgIBgBgMBBgSgQGCAgGAGAwEGBOAgYKCgYAEDAQME4AEEAAYE8AEBAgMEgAYEAAYE8GCQ8JCQBgMBBgTgAMAg4OAGBAAGBGBgkPCQkAYDAQYEoEDAIODgBgQABQRgkPCQkBAFAwEEBMAg4OAgBgMBBgRgYICAgGAGAwEGBECgYICAYAYDAQYEQGCAgIBgBgMBBgRAAGCAgGAGAwEGBODAoKCgwAYEAAYEsFAwUFAwBQQABQRgUNBQYAYDAQYE4OCA4IDgBgMBBgTgAEDggGAGAwEGBODggOCA4AYDAQYEoEBA4IBgBgMBBgRA4IDggOAGAwEGBEAAQOCAYAcDAQUE4IDggOBAIAYDAQQEQOCAYEAgBgMBBgRg4IDggOAGAwEGBKBAQOCAYAYDAQYEYGCAoKBgBwMBBgRAoGCg4CDABgMBBgQgYICgoGAHAwEGBEAAYKDgIMAGAwEFBGCAoKBgIAcDAQYEICBgoOAgwAYDAQYE4KCg4KCgBgMBBgTggOCgoKAFBAAFBFBQ8FBQBgQABgTgQGBQUFAGAwEGBODgQEBA4AYEAAYEUKBgICAgBgMBBgTg4EBAQOAGAwEGBOAAwEBAQAYDAQYE4OBAQEDgBgQABgSQYGAgICAGAwEFBOBAQEDgIAcDAQYEQADAQEBAIAUEAAUE8FBQUOAHBAAGBFAA8FBQUCAGAwEGBGDgICAgwAcEAAYEYJBgICAgQAYDAQUEoKDAoKAgBwMBBgSAgKDAoKAgBAMBBASgwKCgBgMBBgRAgICAgOAGBAAGBNBgQEBAQAYDAQUEgICAgOAgBwIBBgTAQEBAQECABQMBBQSgoICA4AYEAAYE0FBAQEBABQMBBQSAoICA4AYEAAYEwEBQQEBABgMBBgQgoODgoKAGAwEGBCBAwKCgoAYDAQUEoODgoKAgBQMBBATgoKCgIAYDAQYE4KDg4KCgBgMBBgSgQMCgoKAGBAAGBICAYFBQUAYDAQUEoODgoKAgBQMBBATAoKCgIAYEAAYE8GCQkJBgBgMBBgTgAECgoEAGBAAGBGBgkJCQYAYDAQYEoEBAoKBABgQABgRQYJCQkGAGBAAGBFCgIFBQIAYDAQYEIMCgwKCgBgMBBgQgQKDAgIAGAwEFBMCgwKCgIAUDAQQEoMCAgEAGAwEGBODAoMCgoAYDAQYEoECgwICABgMBBgQgYIBAIMAGAwEGBCBAYMAgwAYDAQYEYGCAQCDABgMBBgRAoGDAIMAGAwEFBOBAQEBAgAYDAQUEQOBAQCBABgMBBgTg4EBAQEAGAwEGBCBg4EBAIAUDAQUE4EDgQEAFAwEFBEDg4EAgBgMBBgTgoKCgoEAGBAAGBFCgUFBQMAYDAQYE4KCgoKBABgMBBgTgAKCgoGAGAwEGBOCgoKCgQAYDAQYEoECgoKBgBgMBBgRA4KCgoEAGAwEGBKBAoKCgQAYEAAYEoFBQUFAgBgQABgRQoFBQUDAGAwEFBKCgoKBAIAUDAQQEoKCgYCAGBAAGBPCQkPDwYAYEAAYEYACQkPBgBgMBBgTgoKBAQEAHAwEGBOCgoKBAQIAGAwEGBCDgIECA4AYDAQYEIEDgYIDgBgMBBgRA4CBAgOAGAwEGBEAA4GCA4AYDAQYEIEDAQEBABgQABgRQ4JDwkJAGBAAGBFCgcBBwcAYEAAYEEHCg8KCwBgQABgQQIKBwwLAHBAAGBFBgsJDQYIAHBAAGBECQIFBQIEAFAgEEBEAAAECAAgECBgSAgAIDAQYEQKAGBAAGBICgUJDwkAEBAgMEgAUEAAUE8MBwQHAFBAAFBNDQcFBQBQQABQTwoCAgcAUEAAUEoNBQUCAFBAAFBNDQICAgBQQABQSg0FAgcAYDAQYEQKBAQEAgBQQABQRgkPCQkAUDAQUEwKDAoOAFAwEFBOCAgICABQQABQRgYJCQ8AUDAQUE4IDggOAFAwEFBOAgQIDgBQMBBQSgoOCgoAUDAQUEQKDgoEAFAwEFBOBAQEDgBQMBBQSgoMCgoAUDAQUEQECgoKAFBAAFBJDw8JCQBQMBBQSg4OCgoAUDAQUE4ABAAOAFBAAFBGCQkJBgBQMBBQTgoKCgoAUDAQUEwKDAgIAFAwEFBOCAQIDgBQMBBQTgQEBAQAUDAQUEoKBAQEAGAwEFBEBAoKBAQAUDAQUEoKBAoKAFAwEFBOCg4EBABQQABQRgkJBgkAYDAQYEoOBAQEDgBgMBBgSgoKBAQEAGAwEGBEBAYKCgYAYDAQYEQEBA4IBgBwMBBgRAQMCgoKAgBgICBgSAAICAgEAGAwEGBOAAoKCgQAQDAQQEYKCgYAcDAQYEQKDAoKDAgAUDAQQEoKBAQEAGAwEGBECAQKCgQAQDAQQEQOCAYAcEAAYEEOAgQEAwEAUDAQQEwKCgoCAGAwEGBECg4KCgQAQCAgQEgICAQAQDAQQEoMCgoAYDAQYEgEBAoKCgBQMBBASgoKDAgAQDAQQEoKBgQAcDAQYE4EBggMAgQAQDAQQEQKCgQAUDAQQEQKCgwIAFAwEEBGCAgGAgBAQABARwoKBABAMBBATgQEBABAMBBASgoKBABwQABgQgIGCQkGAgBQMBBASgoECgoAcEAAYEICCwsLBgIAQEAAQEkLCwYAYDAQYEoABAQEAgBgMBBgSgAKCgoEAGAwEGBEBAQKCgQAYDAQYEQECgoKBABgQABgRAQJCwsGAGAwEGBKDggOCA4AUEAAUE4EBgUGAGAwEGBEDggICAgAUDAQUEYIDggGAFAwEFBGCAQCDABQMBBQTgQEBA4AYDAQYEoOBAQEDgBQIBBQTAQEBAgAUEAAUE4KCwsLAFBAAFBKCg8LCwBQQABQTgQGBQUAYDAQYEQKCgwKCgBgMBBgTgoKBAQIAGAwEFBKCgoKDgQAUEAAUEYJDwkJAFAwEFBOCAwKDABQMBBQTAoMCgwAUDAQUE4ICAgIAGBAAFBHBQUJDwkAUDAQUE4IDggOAFBAAFBLBgYGCwBQMBBQTAIMAgwAUDAQUEoODgoKAGAwEGBECg4OCgoAUDAQUEoKDAoKAFBAAFBHBQUFCQBQQABQSQ8PCQkAUDAQUEoKDgoKAFBAAFBGCQkJBgBQMBBQTgoKCgoAUDAQUEwKDAgIAFAwEFBGCAgIBgBQMBBQTgQEBAQAUDAQUEoKBAQIAGBAAFBCBgsLBgIAUDAQUEoKBAoKAGAwEFBKCgoKDgIAUDAQUEoKBgICAFBAAFBLCwsLDwBgQABQSwsLCw8BAFBAAFBMBAYFBgBQQABQSQkNCw0AUDAQUEgIDAoMAFAwEFBMAg4CDABQQABQSg0NDQoAUDAQUEYKBgoKAEAwEEBMAg4OAGAwEGBCBgwKCgQAQDAQQE4OCgwAQDAQQE4ICAgAUEAAQEcFCQ8JAEAwEEBEDggGAEBAAEBLBgsLAEAwEEBMDgIMAEAwEEBKDg4KAGAwEGBOAAoODgoAQDAQQEoMCgoAQEAAQEcFBQkAQEAAQEkPDwkAQDAQQEoOCgoAQDAQQEQKCgQAQDAQQE4KCgoAUDAQQEwKCgwIAEAwEEBGCAgGAEAwEEBOBAQEAFAwEEBKCgQECABwQABgQgIGCwsGAgBAMBBASgQECgBQMBBASgoKDgIAQDAQQEoKBgIAQEAAQEsLCw8AUEAAQEsLCw8BAEBAAEBMBgUGAEBAAEBJDQsNAEAwEEBIDAoMAEAwEEBMDgIMAEBAAEBKDQ0KAEAwEEBGCgYKAGAwEGBKAAQOCAYAcEAAYEQOBAYFBQEAYDAQYEIEDggICABAMBBARA4IBgBAMBBARgwCDABgIBBgRAAMBAQEAGAwAGBKAAYCAgIAcCAQYEQADAQEBAgAQEAAQE4KCwsAQEAAQEoOCwsAYEAAYEQOBAYFBQBgMBBgQgQKDAoKAHAwEGBGAAoKBAQIAFAwEEBKCgoOBABgMBBgQg4ICAgIAFAwEFBCDggICABgQABgRAkJCQ8GAGBAAGBIBAkJDwYAYEAAYEIJCQkPBgBgQABgQQIJCQ8GAGBAAGBFCQkJDwYAYEAAYEkACQkPBgBgMBBgSAoKBAQEAHAwEGBIBAoKBAQIABAwEDBOACBAABBPDwBQMBBQSgoKAAoAEEAAYE8AQEAAQEECBAgAMDAQYEwKCgBgQABgQgQEDgQPAGBAAGBMCg8KCgkAYEAAYEoODgsLCwBwQABgSAkKBQoFAgBwQABgSQUKBQoFAgBwQABgTQoGDQoFAgBwQABgTQUKDQIFAgAwQABARA8EAHAwEGBEDgQEBAQEADBAAEBCDwIAcDAQYEQEBAQEDgQAMEAAQEYPBgBwMBBgRA4EBAQOBABwMBBgRA4EDgQADgBAMBBASAgIDgBAQABARgkJCQBQMBBQTgAOAA4AUDAQUEQKCgoOACAwEDBOCABwICBgRAgICAgICABwIBBgRAQEBAQECAAQQAAwTwBwECBgSAgICAgICABAICAwTAgICABAMAAwTgICAgBAICBgSAgIDABAMABgQgICDgBwICBgSAgIDAgICABwMABgQgICDgICAgBAQAAwTwICAgBAQABgQgICDwBwQABgQgICDwICAgAwQABATwAPAHAgEGBMDAwMDAwMAFAgIEBMCAwICABAMBAwTgwMDABQMBBATggODAwAUDAAQE4CDgICAEAwADBOBgYGAFAwAEBOAg4GBgBQICBgSAgMCAwAQDAQYEwMDA4AUDAQYEwMDggOAFAwAGBCAg4CDgBAMABgRgYGDgBQMABgRgYOAg4AcCAgYEgIDAgMCAgAcDAQYEwMDA4MDAwAcDAQYEwMDggODAwAcDAAYEICDgIOAgIAcDAAYEYGBg4GBgYAcDAAYEYGDgIOBgYAUEAAQE8ADwICAEBAADBPBgYGAFBAAEBPAA8GBgBQQABgQgIPAA8AQEAAYEYGBg8AUEAAYEYGDwAPAHBAAGBCAg8CDwICAHBAAGBGBgYPBgYGAHBAAGBGBg8ADwYGAEBAAGBPDw8PADBAACBPDw8AcEAAYE8PDw8PDw8AcCAAYEwMDAwMDAwAcCAgYEwMDAwMDAwAcDAAYEoACgAKAAoAcEAAYEoFCgUKBQoAcEAAYE8KDwoPCg8AQDAQQE4ODg4AIDAQME4OAEBAAEBGBg8PAEBAAEBMDw8MAEBAAFBPDwYGAEBAAEBDDw8DAEBAAEBGCQkGAHBAAGBPDw8JCQ8PAHBAAGBPDwkGBgkPAGBAAGBGCQ8JDwYAYEAAYEYPCQ8JBgAwMBBATgoOAHBAAGBGCQkGAgcCAHBAAGBBAwEHCQkGAGBAAFBGDw8CAgcAcEAAYEIHCg8CAgcAUEAAYEkPDw8GAFAwEFBEDg4OBABgQABgRgUEBAwMAHBAAGBDBQUFBw8MAAAAAABQYBAgYFgICAgACAAgMBBgWgoAUFAAUFKPhQ+KAHAwEGBUDgwEBg4EAGBQAGBUiocHCokAYFAAYFIFBgqJBoAgECBgWAgAcEAQYFMECAgIBAMAcEAAYFwCAQEBAgwAQDAQYFQKBAoAMDAQMFQOBAAwIBAQVAQIABAwEDBeABAQIBBYAHBAEGBRAgIEBAgIAGBAEGBWCQkJCQYAYDAQYFQMBAQEDgBgMBBgXAICBAgOAGAwEGBcAgwCAgwAYEAQYFIGCg8CAgBgMBBgXggMAgIMAGBAEGBWCA4JCQYAYEAQYF8BAgQEBABgQBBgVgkGCQkGAGBAEGBWCQkHAQYAQBAgQFgAAAgAYCAQQFQAAAQECABQQBBQUQIMAgEAMEAQQF8ADwBQQBBQWAQDBAgAYEAQYF4BAgQABABwUABgUwSJiouIB4BQUABQUgUFD4iAUDAQUF4KDAoOAFBAEFBXCAgIBwBQQBBQXgkJCQ4AUDAQUF4IDggOAFAwEFBeCA4ICABQQBBQVwgLCQcAUEAQUFkJDwkJAFAwEFBeBAQEDgBQMBBQXgICAgwAUEAQUFkKDAoJAFBAEFBYCAgIDwBQUABQWI2KioiAUEAQUFkNCwkJAFBQAFBXCIiIhwBQQBBQXgkOCAgAcFAAUFcIiIiHAQCAUEAQUFwKDAoJAF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AAMCgQgIAQEAAwKBAAAACAADAAEAAAAEAAAABQAOABUAHgAoADEAOgBBAEsAVQBdAGUAbAByAHgAggCLAJQAnQCmAK8AuADBAMoA0wDcAOQA7QD1AP0BBQEOARgBIQEqATMBPAFFAU4BVwFgAWkBcgF7AYQBjQGWAZ8BqAGyAbsBxAHNAdYB3wHoAfEB+gIDAg0CFwIhAigCLgI1Aj0CRgJOAlcCXwJoAnECegKDAo0ClgKfAqcCrwK3AsACyQLRAtkC4gLqAvIC+gMCAwsDEwMdAycDMQM4A0EDSgNUA10DZgNvA3gDgQOKA5MDnAOlA64DtwPAA8kD0gPbA+QD7QP2A/8ECAQRBBoEIwQsBDUEPgRHBFAEWQRjBGsEdQR+BIgEjwSZBKIEqwS1BLwEwwTJBNME3ATlBO0E9gUABQoFEwUcBSUFLgU3BT8FSQVRBVkFYgVqBXIFewWFBYwFlgWgBakFsgW6BcIFyAXNBdYF3wXoBfEF+QX/BgUGDAYTBhoGIQYrBjQGPgZHBk8GWAZhBmoGcwZ9BoQGiwaSBpwGpQauBrcGwAbJBtIG2wbkBu0G9gb/BwgHEQcaByMHKwcyBzkHPwdGB0wHVAdaB2AHZgdtB3YHfweIB5EHmgejB60Htge/B8gH0gfbB+UH6wfzB/sIAwgLCBUIHwgpCDIIOwhFCE4IWAhhCGoIcwh8CIUIjgiUCJoIoAipCLIIuwjECM4I1wjgCOkI8gj7CQQJDQkWCR8JKAkxCToJQwlMCVYJXwloCXEJegmECY0JlwmhCasJtAm9CcYJzwnYCeEJ6gnzCfwKBQoPChkKIgosCjUKPwpJClMKWwpkCm0KdwqBCooKkwqcCqUKrgq3CsEKygrTCtwK5QrvCvgLAQsKCxMLHAslCy4LNwtAC0oLUwtcC2ULbgt3C4ALiQuTC50LpguvC7gLwQvKC9ML3AvlC+4L9wwADAkMEgwbDCUMLgw3DEAMSQxTDFwMZQxuDHcMgAyJDJIMmwykDK0Mtgy/DMYMzQzWDNwM5QzuDPcNAA0JDRINGw0kDS0NNg0/DUgNUQ1aDWMNbA11DX4Nhw2QDZkNog2rDbQNvQ3GDc8N2Q3iDesN9A39DgYODw4YDiIOKw40DjwORg5PDlgOYA5qDnMOfA6EDowOlQ6eDqYOsA64DsEOyg7SDtoO4g7sDvUO/w8H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AIsAnQCpAKQBAACKAQEAgwCTAPAA8QCNAJcAiAECANwA7wCeAKoA8wDyAPQAogCtAMgAxgCuAGIAYwCQAGQAygBlAMcAyQDOAMsAzADNAOcAZgDRAM8A0ACvAGcA7gCRANQA0gDTAGgA6QDrAIkAagBpAGsAbQBsAG4AoABvAHEAcAByAHMAdQB0AHYAdwDoAHgAegB5AHsAfQB8ALgAoQB/AH4AgACBAOoA7AC6AQMBBAEFAQYBBwEIAPsA/AEJAQoBCwEMAP0A/gENAQ4BDwD/ARABEQESARMBFAEVARYBFwEYARkBGgEbAPYA9wEcAR0BHgEfASABIQEiASMBJAElASYBJwEoASkBKgErAPgA1QEsAS0BLgEvATABMQEyATMBNAE1ATYBNwE4ATkBOgDgAOEBOwE8AT0BPgE/AUABQQFCAUMBRAFFAUYBRwFIAUkAsACxAUoBSwFMAU0BTgFPAVABUQFSAVMA+QD6AOIA4wFUAVUBVgFXAVgBWQFaAVsBXAFdAV4BXwFgAWEBYgFjAWQBZQFmAWcBaAFpALsBagFrAWwBbQDkAOUBbgDWAN8A2QDaANsA3gDXAN0BkgGTAZQBlQGWAZcBmAGZAZoBmwGcAZ0BngGfAaABoQGiAaMBpAGlAaYBpwGoAakBqgGrAawBrQGuAJsBrwGwAbEBsgGzAbQBtQG2AbcBuAG5AboBuwG8ALIAswIjAiQAtgC3AMMAtAC1AMQAggDBAIcA9QIpAJkA7QDCAKUAkgI3AI8COQC5AnQAAP/hAAD/5wAA/9sFAwUiBD4EVgXIBe0GKwZE/nX+XADFANIAlAC5BlAAr///////////BcgA3gZEAUL/////////////////////////////////////////////////////AIkAof///////wDKAPcFNACtAKwAuwCoALoEJQAZAaMA3gAyAPcCHwCWAXAAewBjAqYC5P7YAIgBKAFBAh8ApQA6AKYArQJpALQAKwCtAFz+uQB8AEwAbwB+ALkAhwDkAKsAfwKaBkQA9wEoBKACgQBKAtoDAwAZAUEBKAD3AIgAqAIG/lAGUADNAGkAlQB4sR8PLCMgiopFUFghIRtFRFktLEtSWEVEGyEhWS0AAAAAAgEAAAAD0gUAAAMABwAAIREhESUhESEBAALS/W4CUv2uBQD7AEAE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BNIAjQTSAI0E0gCNBNIAjQTSAK0E0gCtBNIArQTSAK0E0gC2BNIAaQTSAGkE0gBpBNIAaQTSAGkE0gCwBNIAsATSALAE0gCwBNIAxQTSAYgE0gDFBNIA+wTSANkE0gFBBNIAfQTSAL8E0gCtBNIAPgTSAGAE0gFyBNIBHATSAFYE0gAABNIAPgTSABkE0gBWBNIAVgTSAFYE0gAyBNIAtgTSAKwE0gAwBNIARATSADgE0gDtBNIA7QTSAN4E0gAxBNIAMQTSAGkE0gCUBNIB7QTSAFYE0gAABNIAJwTSAFYE0gAfBNIAdQTSAIwE0gBrBNIAAATSAAwE0gAMBNIAPgTSAEoE0gAxBNIAiATSAD4E0gD3BNIA9wTSAdUE0gHVBNIAVgTSABkE0gBVBNIAIATSAG8E0gFbBNIBWwTSAHsE0gB7BNIAxQTSAUEE0gHVBNIA9wTSAAAE0gAMBNIA2ATSAAwE0gDYBNIA2ATSAK0E0gCtBNIArQTSAK0E0gA+BNIAPgTSAD4E0gCZBNIAmQTSAJkE0gCtBNIBAwTSARwE0gEoBNIBHATSAfoE0gG0BNIB7wTSAUAE0gGmBNIBAwTSAAAE0gCtBNIApATSALsE0gBjBNIAiATSAh8E0gAGBNIAcATSACAE0gBVBNIA5ATSALME0gBWBNIATATSAVcE0gEuBNIBOQTSAAAE0gAABNIAKgTSABkE0gBNBNIAewTSAK0E0gCkBNIAuwTSAGYE0gCjBNIAZgTSAKME0gB/BNIA0gTSAAAE0gHtBNIADATSAIgE0gAMBNIAiATSAAwE0gCIBNIAZgTSAKME0gBmBNIAowTSAIIE0gBRBNIABgTSANgE0gCNBNIA2ATSAI0E0gDYBNIAjQTSANgE0gCNBNIA2ATSAI0E0gBNBNIAewTSAE0E0gB7BNIATQTSAHsE0gCUBNIAtgTSABkE0gAiBNIArQTSAK0E0gCtBNIArQTSAK0E0gCtBNIArQTSAK0E0gAxBNIAPgTSAMUE0gCUBNIAqgTSANUE0gD1BNIA3gTSAK0E0gDeBNIArQTSAN4E0gCUBNIA3gTSAK0E0gCUBNIAtgTSAJQE0gC2BNIAlATSALYE0gBTBNIAlATSALYE0gA+BNIAaQTSAD4E0gBpBNIAPgTSAGkE0gC4BNIBNATSALgE0gElBNIAuATSATQE0gCk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AVYBVwFYAVkBWgFbAVwBXQFeAV8BYAFhAWIBYwFkAWUBZgFnAWgBaQFqAWsBbAFtAW4BbwFwAXEBcgFzAXQBdQF2AXcBeAF5AXoBewF8AX0BfgF/AYABgQGCAYMBhAGFAYYBhwGIAYkBigGLAYwBjQGOAY8BkAGRAZIBkwGUAZUBlgGXAZgBmQGaAZsBnAGdAZ4BnwGgAaEBogGjAaQBpQGmAacBqAGpAaoBqwGsAa0BrgGvAbABsQGyAbMBtAG1AbYBtwG4AbkBugG7AbwBvQG+Ab8BwAHBAcIBwwHEAcUBxgHHAcgByQHKAcsBzAHNAc4BzwHQAdEB0gHTAdQB1QHWAdcB2AHZAdoB2wHcAd0B3gHfAeAB4QHiAeMB5AHlAeYB5wHoAekB6gHrAewB7QHuAe8B8AHxAfIB8wH0AfUB9gH3AfgB+QH6AfsB/AH9Af4B/wIAAgECAgIDAgQCBQIGAgcCCAIJAgoCCwIMAg0CDgIPAhACEQISAhMCFAIVAhYCFwIYAhkCGgIbAhwCHQIeAh8CIAIhAiICIwIkAiUCJgInAigCKQIqAisCLAItAi4CLwIwAjECMgIzAjQCNQI2AjcCOAI5AjoCOwI8Aj0CPgI/AkACQQJCAkMCRAJFAkYCRwJIAkkCSgJLAkwCTQJOAk8CUAJRAlICUwJUAlUCVgJXAlgCWQJaAlsCXAJdAl4CXwJgAmECYgJjAmQCZQJmAmcCaAJpAmoCawJsAm0CbgJvAnACcQJyAnMCdAJ1AnYCdwJ4AnkCegJ7AnwCfQJ+An8CgAKBAoICgwKEAoUChgKHAogCiQKKAosCjAKNAo4CjwKQApECkgKTApQClQKWApcCmAKZApoCmwKcAp0CngKfAqACoQKiAqMCpAKlAqYCpwKoAqkCqgKrAqwCrQKuAq8CsAKxArICswK0ArUCtgK3ArgCuQK6ArsCvAK9Ar4CvwLAAsECwgLDAsQCxQLGAscCyALJAsoCywLMAs0CzgLPAtAC0QLSAtMC1ALVAtYC1wLYAtkC2gLbAtwC3QLeAt8C4ALhAuIC4wLkAuUC5gLnAugC6QLqAusC7ALtAu4C7wLwAvEC8gLzAvQC9QL2AvcC+AL5AvoC+wL8Av0C/gL/AwADAQMCAwMDBAMFAwYDBwMIAwkDCgMLAwwDDQMOAw8DEAMRAxIDEwMUAxUDFgMXAxgDGQMaAxsDHAMdAx4DHwMgAyEDIgMjAyQDJQMmAycDKAMpAyoDKwMsAy0DLgMvAzADMQMyAzMDNAM1AzYDNwM4AzkDOgM7AzwDPQM+Az8DQANBA0IDQwNEA0UDRgNHA0gDSQNKA0sDTANNA04DTwNQA1EDUgNTA1QDVQNWA1cDWANZA1oDWwNcA10DXgNfA2ADYQNiA2MDZANlA2YDZwNoA2kDagNrA2wDbQNuA28DcANxA3IDcwN0A3UDdgN3A3gDeQN6A3sDfAN9A34DfwOAA4EDggODA4QDhQOGA4cDiAOJA4oDiwOMA40DjgOPA5ADkQOSA5MDlAOVA5YDlwVzcGFjZQZleGNsYW0IcXVvdGVkYmwKbnVtYmVyc2lnbgZkb2xsYXIHcGVyY2VudAlhbXBlcnNhbmQLcXVvdGVzaW5nbGUJcGFyZW5sZWZ0CnBhcmVucmlnaHQIYXN0ZXJpc2sEcGx1cwVjb21tYQZoeXBoZW4GcGVyaW9kBXNsYXNoBHplcm8Db25lA3R3bwV0aHJlZQRmb3VyBGZpdmUDc2l4BXNldmVuBWVpZ2h0BG5pbmUFY29sb24Jc2VtaWNvbG9uBGxlc3MFZXF1YWwHZ3JlYXRlcghxdWVzdGlvbgJhdAFBAUIBQwFEAUUBRgFHAUgBSQFKAUsBTAFNAU4BTwFQAVEBUgFTAVQBVQFWAVcBWAFZAVoLYnJhY2tldGxlZnQJYmFja3NsYXNoDGJyYWNrZXRyaWdodAthc2NpaWNpcmN1bQp1bmRlcnNjb3JlBWdyYXZlAWEBYgFjAWQBZQFmAWcBaAFpAWoBawFsAW0BbgFvAXABcQFyAXMBdAF1AXYBdwF4AXkBeglicmFjZWxlZnQDYmFyCmJyYWNlcmlnaHQKYXNjaWl0aWxkZQlBZGllcmVzaXMFQXJpbmcIQ2NlZGlsbGEGRWFjdXRlBk50aWxkZQlPZGllcmVzaXMJVWRpZXJlc2lzBmFhY3V0ZQZhZ3JhdmULYWNpcmN1bWZsZXgJYWRpZXJlc2lzBmF0aWxkZQVhcmluZwhjY2VkaWxsYQZlYWN1dGUGZWdyYXZlC2VjaXJjdW1mbGV4CWVkaWVyZXNpcwZpYWN1dGUGaWdyYXZlC2ljaXJjdW1mbGV4CWlkaWVyZXNpcwZudGlsZGUGb2FjdXRlBm9ncmF2ZQtvY2lyY3VtZmxleAlvZGllcmVzaXMGb3RpbGRlBnVhY3V0ZQZ1Z3JhdmULdWNpcmN1bWZsZXgJdWRpZXJlc2lzBmRhZ2dlcgZkZWdyZWUEY2VudAhzdGVybGluZwdzZWN0aW9uBmJ1bGxldAlwYXJhZ3JhcGgKZ2VybWFuZGJscwpyZWdpc3RlcmVkCWNvcHlyaWdodAl0cmFkZW1hcmsFYWN1dGUIZGllcmVzaXMIbm90ZXF1YWwCQUUGT3NsYXNoCGluZmluaXR5CXBsdXNtaW51cwlsZXNzZXF1YWwMZ3JlYXRlcmVxdWFsA3llbgVtaWNybwtwYXJ0aWFsZGlmZglzdW1tYXRpb24HcHJvZHVjdAJwaQhpbnRlZ3JhbAtvcmRmZW1pbmluZQxvcmRtYXNjdWxpbmUDb2htAmFlBm9zbGFzaAxxdWVzdGlvbmRvd24KZXhjbGFtZG93bgpsb2dpY2Fsbm90B3JhZGljYWwHZnNjcmlwdAthbG1vc3RlcXVhbAlpbmNyZW1lbnQNZ3VpbGxlbW90bGVmdA5ndWlsbGVtb3RyaWdodAhlbGxpcHNpcwduYnNwYWNlBkFncmF2ZQZBdGlsZGUGT3RpbGRlAk9FAm9lBmVuZGFzaAZlbWRhc2gMcXVvdGVkYmxsZWZ0DXF1b3RlZGJscmlnaHQJcXVvdGVsZWZ0CnF1b3RlcmlnaHQGZGl2aWRlB2xvemVuZ2UJeWRpZXJlc2lzCVlkaWVyZXNpcwhjdXJyZW5jeQ1ndWlsc2luZ2xsZWZ0Dmd1aWxzaW5nbHJpZ2h0AmZpAmZsCWRhZ2dlcmRibApidWxsZXRtYXRoDnF1b3Rlc2luZ2xiYXNlDHF1b3RlZGJsYmFzZQtwZXJ0aG91c2FuZAtBY2lyY3VtZmxleAtFY2lyY3VtZmxleAZBYWN1dGUJRWRpZXJlc2lzBkVncmF2ZQZJYWN1dGULSWNpcmN1bWZsZXgJSWRpZXJlc2lzBklncmF2ZQZPYWN1dGULT2NpcmN1bWZsZXgGT2dyYXZlBlVhY3V0ZQtVY2lyY3VtZmxleAZVZ3JhdmUIZG90bGVzc2kKY2lyY3VtZmxleAV0aWxkZQZtYWNyb24FYnJldmUJZG90YWNjZW50BHJpbmcHY2VkaWxsYQxodW5nYXJ1bWxhdXQGb2dvbmVrBWNhcm9uBkxzbGFzaAZsc2xhc2gGU2Nhcm9uBnNjYXJvbgZaY2Fyb24GemNhcm9uCWJyb2tlbmJhcgNFdGgDZXRoBllhY3V0ZQZ5YWN1dGUFVGhvcm4FdGhvcm4FbWludXMIbXVsdGlwbHkLb25lc3VwZXJpb3ILdHdvc3VwZXJpb3INdGhyZWVzdXBlcmlvcgdvbmVoYWxmCm9uZXF1YXJ0ZXINdGhyZWVxdWFydGVycwVmcmFuYwZHYnJldmUGZ2JyZXZlBElkb3QIU2NlZGlsbGEIc2NlZGlsbGEGQ2FjdXRlBmNhY3V0ZQZDY2Fyb24GY2Nhcm9uB2RtYWNyb24Jc2Z0aHlwaGVuCW92ZXJzY29yZQZtaWRkb3QHQW1hY3JvbgdhbWFjcm9uBkFicmV2ZQZhYnJldmUHQW9nb25lawdhb2dvbmVrC0NjaXJjdW1mbGV4C2NjaXJjdW1mbGV4BENkb3QEY2RvdAZEY2Fyb24GZGNhcm9uB0RtYWNyb24HRW1hY3JvbgdlbWFjcm9uBkVicmV2ZQZlYnJldmUERWRvdARlZG90B0VvZ29uZWsHZW9nb25lawZFY2Fyb24GZWNhcm9uC0djaXJjdW1mbGV4C2djaXJjdW1mbGV4BEdkb3QEZ2RvdAhHY2VkaWxsYQhnY2VkaWxsYQtIY2lyY3VtZmxleAtoY2lyY3VtZmxleARIYmFyBGhiYXIGSXRpbGRlBml0aWxkZQdJbWFjcm9uB2ltYWNyb24GSWJyZXZlBmlicmV2ZQdJb2dvbmVrB2lvZ29uZWsCSUoCaWoLSmNpcmN1bWZsZXgLamNpcmN1bWZsZXgIS2NlZGlsbGEIa2NlZGlsbGEDa3JhBkxhY3V0ZQZsYWN1dGUITGNlZGlsbGEIbGNlZGlsbGEGTGNhcm9uBmxjYXJvbgRMZG90BGxkb3QGTmFjdXRlBm5hY3V0ZQhOY2VkaWxsYQhuY2VkaWxsYQZOY2Fyb24GbmNhcm9uC25hcG9zdHJvcGhlA0VuZwNlbmcHT21hY3JvbgdvbWFjcm9uBk9icmV2ZQZvYnJldmUJT2RibGFjdXRlCW9kYmxhY3V0ZQZSYWN1dGUGcmFjdXRlCFJjZWRpbGxhCHJjZWRpbGxhBlJjYXJvbgZyY2Fyb24GU2FjdXRlBnNhY3V0ZQtTY2lyY3VtZmxleAtzY2lyY3VtZmxleAhUY2VkaWxsYQh0Y2VkaWxsYQZUY2Fyb24GdGNhcm9uBFRiYXIEdGJhcgZVdGlsZGUGdXRpbGRlB1VtYWNyb24HdW1hY3JvbgZVYnJldmUGdWJyZXZlBVVyaW5nBXVyaW5nCVVkYmxhY3V0ZQl1ZGJsYWN1dGUHVW9nb25lawd1b2dvbmVrC1djaXJjdW1mbGV4C3djaXJjdW1mbGV4C1ljaXJjdW1mbGV4C3ljaXJjdW1mbGV4BlphY3V0ZQZ6YWN1dGUEWmRvdAR6ZG90BXNsb25nCkFhY3V0ZXJpbmcKYWFjdXRlcmluZwdBRWFjdXRlB2FlYWN1dGULT3NsYXNoYWN1dGULb3NsYXNoYWN1dGUNcXVlc3Rpb25ncmVlawV0b25vcw5kaWFlcmVzaXN0b25vcwpBbHBoYXRvbm9zCWFub3RlbGVpYQxFcHNpbG9udG9ub3MIRXRhdG9ub3MJSW90YXRvbm9zDE9taWNyb250b25vcwxVcHNpbG9udG9ub3MKT21lZ2F0b25vcxJpb3RhZGlhZXJlc2lzdG9ub3MFQWxwaGEEQmV0YQVHYW1tYQVEZWx0YQdFcHNpbG9uBFpldGEDRXRhBVRoZXRhBElvdGEFS2FwcGEGTGFtYmRhAk11Ak51AlhpB09taWNyb24CUGkDUmhvBVNpZ21hA1RhdQdVcHNpbG9uA1BoaQNDaGkDUHNpBU9tZWdhDUlvdGFkaWFlcmVzaXMQVXBzaWxvbmRpYWVyZXNpcwphbHBoYXRvbm9zDGVwc2lsb250b25vcwhldGF0b25vcwlpb3RhdG9ub3MVdXBzaWxvbmRpYWVyZXNpc3Rvbm9zBWFscGhhBGJldGEFZ2FtbWEFZGVsdGEHZXBzaWxvbgR6ZXRhA2V0YQV0aGV0YQRpb3RhBWthcHBhBmxhbWJkYQJtdQJudQJ4aQdvbWljcm9uA3JobwpzaWdtYWZpbmFsBXNpZ21hA3RhdQd1cHNpbG9uA3BoaQNjaGkDcHNpBW9tZWdhDWlvdGFkaWFlcmVzaXMQdXBzaWxvbmRpYWVyZXNpcwxvbWljcm9udG9ub3MMdXBzaWxvbnRvbm9zCm9tZWdhdG9ub3MCSW8DRGplA0dqZQZFY3lyaWwDRHplBkljeXJpbAJZaQJKZQNMamUDTmplBFRzaGUDS2plC1VjeXJpbGJyZXZlBER6aGUGQWN5cmlsAkJlAlZlAkdlAkRlAkllA1poZQJaZQJJaQdJaWJyZXZlAkthAkVsAkVtAkVuBk9jeXJpbAdQZWN5cmlsAkVyAkVzAlRlBlVjeXJpbAJFZgNLaGEDVHNlA0NoZQNTaGEFU2hjaGEESGFyZARZZXJpBFNvZnQJRWN5cmlscmV2Akl1AklhBmFjeXJpbAJiZQJ2ZQJnZQJkZQJpZQN6aGUCemUCaWkHaWlicmV2ZQJrYQJlbAJlbQJlbgZvY3lyaWwHcGVjeXJpbAJlcgJlcwJ0ZQZ1Y3lyaWwCZWYDa2hhA3RzZQNjaGUDc2hhBXNoY2hhBGhhcmQEeWVyaQRzb2Z0CWVjeXJpbHJldgJpdQJpYQJpbwNkamUDZ2plBmVjeXJpbANkemUGaWN5cmlsAnlpAmplA2xqZQNuamUEdHNoZQNramULdWN5cmlsYnJldmUEZHpoZQhHZXVwdHVybghnZXVwdHVybgZXZ3JhdmUGd2dyYXZlBldhY3V0ZQZ3YWN1dGUJV2RpZXJlc2lzCXdkaWVyZXNpcwZZZ3JhdmUGeWdyYXZlCXF1b3RlZGFzaA11bmRlcnNjb3JlZGJsCWV4Y2xhbWRibApvdmVyc2NvcmUxCWZyYWN0aW9uMQluc3VwZXJpb3IEbGlyYQdwZXNldGFzBm51bWVybwlvbmVlaWdodGgMdGhyZWVlaWdodGhzC2ZpdmVlaWdodGhzDHNldmVuZWlnaHRocwlhcnJvd2xlZnQHYXJyb3d1cAphcnJvd3JpZ2h0CWFycm93ZG93bglhcnJvd2JvdGgJYXJyb3d1cGRuDGFycm93dXBkbmJzZQpyaWdodGFuZ2xlDGludGVyc2VjdGlvbgtlcXVpdmFsZW5jZQVob3VzZQ1yZXZsb2dpY2Fsbm90CmludGVncmFsdHAKaW50ZWdyYWxidAQyNTAwBDI1MDIEMjUwYwQyNTEwBDI1MTQEMjUxOAQyNTFjBDI1MjQEMjUyYwQyNTM0BDI1M2MEMjU1MAQyNTUxBDI1NTIEMjU1MwQyNTU0BDI1NTUEMjU1NgQyNTU3BDI1NTgEMjU1OQQyNTVhBDI1NWIEMjU1YwQyNTVkBDI1NWUEMjU1ZgQyNTYwBDI1NjEEMjU2MgQyNTYzBDI1NjQEMjU2NQQyNTY2BDI1NjcEMjU2OAQyNTY5BDI1NmEEMjU2YgQyNTZjB3VwYmxvY2sHZG5ibG9jawVibG9jawdsZmJsb2NrB3J0YmxvY2sHbHRzaGFkZQVzaGFkZQdka3NoYWRlCWZpbGxlZGJveApmaWxsZWRyZWN0B3RyaWFndXAHdHJpYWdydAd0cmlhZ2RuB3RyaWFnbGYGY2lyY2xlCWludmJ1bGxldAlpbnZjaXJjbGUJc21pbGVmYWNlDGludnNtaWxlZmFjZQNzdW4GZmVtYWxlBG1hbGUFc3BhZGUEY2x1YgVoZWFydAdkaWFtb25kC211c2ljYWxub3RlDm11c2ljYWxub3RlZGJsC2NpcmN1bWZsZXgxBnRpbGRlMQlkaWVyZXNpczEGYnJldmUxBXJpbmcxCGNlZGlsbGExDWh1bmdhcnVtbGF1dDEGY2Fyb24xBmFjdXRlMQZncmF2ZTEIY2VkaWxsYTIJS2NlZGlsbGExCWtjZWRpbGxhMQlMY2VkaWxsYTEJbGNlZGlsbGExCU5jZWRpbGxhMQluY2VkaWxsYTEJUmNlZGlsbGExCXJjZWRpbGxhMQlTY2VkaWxsYTEJc2NlZGlsbGExCVRjZWRpbGxhMQl0Y2VkaWxsYTFARhoKZB9aTCMfPwgjHw8OIx8NDCMfCwovHwoGDR8FBCUfAwIvHwkIPB8BAC8fBwYvH2NiWg9dW+APXnjgD3hbVA9NEqAPPRK4ASBAOw88EvAPOzrgD1MSEx9REBkfRBCgD3IV0g9iEGAPXxDgD1gQYA9WEOAPVBDgDz4Q4A86ELQPNxDgDzIzuAEgQA8PMxCCDxUQ4A8TEOAPERC4AUBAGw8SEJ4PEBISHw8ccBxwHYAdBB8GbwafBgMyAbkB/wAIS1NYsAGwAY5ZhY1LU1iwgB1Zc3MBKysrKysrKysrKysrKysrKysrKwArKysrKysrKysrKysrKysrKysrKwAA\"); \n", "}\n", - "]]>DonaldNNPTrumpNNPfromINAmericaNNPandCCAngelaNNPMerkelNNPfromINGermanyNNPdon'tNNshareNNmanyJJoppinionsNNS,,butCCtheyPRPbothDTloveNNJohnNNPSnowNNPLabsNNPsoftwareNN!.<no-type><no-type><no-type><no-type><no-type><no-type><no-type><no-type><no-type><no-type><no-type><no-type><no-type><no-type><no-type><no-type><no-type><no-type><no-type><no-type><no-type><no-type>" + "]]>DonaldNNPTrumpNNPfromINAmericaNNPandCCAngelaNNPMerkelNNPfromINGermanyNNPdon'tNNshareNNmanyJJoppinionsNNS,,butCCtheyPRPbothDTloveNNJohnNNPSnowNNPLabsNNPsoftwareNN!.ccflatflatnsubjamodcaseflatflatnsubjflatflatcompoundflatflat<no-type>detflatflatflatflatdiscoursepunct" ] }, "metadata": {} @@ -1724,27 +1792,29 @@ "id": "Gfmn4hXa_nNd", "colab": { "base_uri": "https://localhost:8080/", - "height": 198 + "height": 244 }, - "outputId": "f52945c6-f488-467a-f7b2-c7df25481621" + "outputId": "8082845c-87eb-4041-c2f9-bc993ab63653" }, "source": [ - "import nlu\n", "data = \"Donald Trump and Angela Merkel from Germany don't share many oppinions, but they both fear cancer!\"\n", - "nlu.load('med_ner.jsl.wip.clinical').viz(data,viz_type='ner')" + "nlp.load('med_ner.jsl.wip.clinical').viz(data,viz_type='ner')" ], - "execution_count": 5, + "execution_count": null, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ + "Warning::Spark Session already created, some configs may not take.\n", + "Warning::Spark Session already created, some configs may not take.\n", "ner_wikiner_glove_840B_300 download started this may take some time.\n", "Approximate size to download 14.8 MB\n", "[OK!]\n", "glove_840B_300 download started this may take some time.\n", "Approximate size to download 2.3 GB\n", - "[OK!]\n" + "[OK!]\n", + "Warning::Spark Session already created, some configs may not take.\n" ] }, { @@ -1834,7 +1904,7 @@ " }\n", "\n", "\n", - " Donald Trump PER and Angela Merkel PER from Germany LOC don't share many oppinions, but they both fear cancer!" + " Donald Trump PER and Angela Merkel PER from Germany LOC don't share many oppinions, but they both fear cancer!" ] }, "metadata": {} @@ -1856,34 +1926,40 @@ "id": "HuLmkCNcVV-R", "colab": { "base_uri": "https://localhost:8080/", - "height": 528 + "height": 663 }, - "outputId": "f17e6f48-33dc-4db1-a6db-291f897ee824" + "outputId": "c2325310-aed0-4920-857b-723d884ed295" }, "source": [ - "import nlu\n", "nlu_ref = 'med_ner.jsl.wip.clinical en.resolve.icd10cm'\n", "data = \"\"\"The patient is a 5-month-old infant who presented initially on Monday with a cold, cough, and runny nose for 2 days. Mom states she had no fever. Her appetite was good but she was spitting up a lot. She had no difficulty breathing and her cough was described as dry and hacky. At that time, physical exam showed a right TM, which was red. Left TM was okay. She was fairly congested but looked happy and playful. She was started on Amoxil and Aldex and we told to recheck in 2 weeks to recheck her ear. Mom returned to clinic again today because she got much worse overnight. She was having difficulty breathing. She was much more congested and her appetite had decreased significantly today. She also spiked a temperature yesterday of 102.6 and always having trouble sleeping secondary to congestion.\"\"\"\n", - "pipe = nlu.load(nlu_ref)\n", + "pipe = nlp.load(nlu_ref)\n", "viz = pipe.viz(data,viz_type='resolution')" ], - "execution_count": 8, + "execution_count": null, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ + "Warning::Spark Session already created, some configs may not take.\n", + "Warning::Spark Session already created, some configs may not take.\n", "ner_wikiner_glove_840B_300 download started this may take some time.\n", "Approximate size to download 14.8 MB\n", "[OK!]\n", "sbiobertresolve_icd10cm download started this may take some time.\n", "[OK!]\n", + "setInputCols in ENTITY_05f4bc95f0c5 expecting 1 columns. Provided column amount: 2. Which should be columns from the following annotators: ['sentence_embeddings']\n", + "sbiobert_base_cased_mli download started this may take some time.\n", + "Approximate size to download 384.3 MB\n", + "[OK!]\n", "glove_840B_300 download started this may take some time.\n", "Approximate size to download 2.3 GB\n", "[OK!]\n", - "sbiobert_base_cased_mli download started this may take some time.\n", - "Approximate size to download 384.3 MB\n", - "[OK!]\n" + "setInputCols in ENTITY_05f4bc95f0c5 expecting 1 columns. Provided column amount: 2. Which should be columns from the following annotators: ['sentence_embeddings']\n", + "setInputCols in ENTITY_05f4bc95f0c5 expecting 1 columns. Provided column amount: 2. Which should be columns from the following annotators: ['sentence_embeddings']\n", + "setInputCols in ENTITY_05f4bc95f0c5 expecting 1 columns. Provided column amount: 2. Which should be columns from the following annotators: ['sentence_embeddings']\n", + "Warning::Spark Session already created, some configs may not take.\n" ] }, { @@ -1973,7 +2049,7 @@ " }\n", "\n", "\n", - " The patient is a 5-month-old infant who presented initially on Monday with a cold, cough, and runny nose for 2 days. Mom states she had no fever. Her appetite was good but she was spitting up a lot. She had no difficulty breathing and her cough was described as dry and hacky. At that time, physical exam showed a right TM, which was red. Left TM MISCH93212 Auditory recruitment, left ear was okay. She was fairly congested but looked happy and playful. She was started on Amoxil and Aldex LOCF650 Fetishism and we told to recheck in 2 weeks to recheck her ear. Mom returned to clinic again today because she got much worse overnight. She was having difficulty breathing. She was much more congested and her appetite had decreased significantly today. She also spiked a temperature yesterday of 102.6 and always having trouble sleeping secondary to congestion." + " The patient is a 5-month-old infant who presented initially on Monday with a cold, cough, and runny nose for 2 days. Mom states she had no fever. Her appetite was good but she was spitting up a lot. She had no difficulty breathing and her cough was described as dry and hacky. At that time, physical exam showed a right TM, which was red. Left TM MISCL02522 Furuncle left hand was okay. She was fairly congested but looked happy and playful. She was started on Amoxil and Aldex LOCQ843 Anonychia and we told to recheck in 2 weeks to recheck her ear. Mom returned to clinic again today because she got much worse overnight. She was having difficulty breathing. She was much more congested and her appetite had decreased significantly today. She also spiked a temperature yesterday of 102.6 and always having trouble sleeping secondary to congestion." ] }, "metadata": {} @@ -1995,32 +2071,38 @@ "id": "PGHhDU6QlO7z", "colab": { "base_uri": "https://localhost:8080/", - "height": 242 + "height": 353 }, - "outputId": "d050a730-2c03-4611-dbc8-e4ef66d2d260" + "outputId": "929a101b-0acf-4734-9dfa-fd5a8d5f6b00" }, "source": [ - "import nlu \n", "data = [\"\"\"He has a starvation ketosis but nothing found for significant for dry oral mucosa\"\"\"]\n", - "nlu.load('med_ner.jsl.wip.clinical resolve.icd10pcs').viz(data,viz_type='resolution' )" + "nlp.load('med_ner.jsl.wip.clinical resolve.icd10pcs').viz(data,viz_type='resolution' )" ], - "execution_count": 9, + "execution_count": null, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ + "Warning::Spark Session already created, some configs may not take.\n", + "Warning::Spark Session already created, some configs may not take.\n", "ner_wikiner_glove_840B_300 download started this may take some time.\n", "Approximate size to download 14.8 MB\n", "[OK!]\n", "sbiobertresolve_icd10pcs download started this may take some time.\n", "[OK!]\n", + "setInputCols in ENTITY_7090bfd98dcf expecting 1 columns. Provided column amount: 2. Which should be columns from the following annotators: ['sentence_embeddings']\n", + "sbiobert_base_cased_mli download started this may take some time.\n", + "Approximate size to download 384.3 MB\n", + "[OK!]\n", "glove_840B_300 download started this may take some time.\n", "Approximate size to download 2.3 GB\n", "[OK!]\n", - "sbiobert_base_cased_mli download started this may take some time.\n", - "Approximate size to download 384.3 MB\n", - "[OK!]\n" + "setInputCols in ENTITY_7090bfd98dcf expecting 1 columns. Provided column amount: 2. Which should be columns from the following annotators: ['sentence_embeddings']\n", + "setInputCols in ENTITY_7090bfd98dcf expecting 1 columns. Provided column amount: 2. Which should be columns from the following annotators: ['sentence_embeddings']\n", + "setInputCols in ENTITY_7090bfd98dcf expecting 1 columns. Provided column amount: 2. Which should be columns from the following annotators: ['sentence_embeddings']\n", + "Warning::Spark Session already created, some configs may not take.\n" ] }, { @@ -2132,32 +2214,35 @@ "id": "e4B8OtuqlPhb", "colab": { "base_uri": "https://localhost:8080/", - "height": 319 + "height": 361 }, - "outputId": "1c5fca1a-ae90-43c7-9ccb-2fbbc5b3e94f" + "outputId": "f0ef792b-b76d-41df-d5c4-f2a82314d2a6" }, "source": [ "nlu_ref = 'med_ner.jsl.wip.clinical assert'\n", "data = \"The patient was tested for cancer, but none was detected, he is free of cancer.\"\n", - "nlu.load(nlu_ref).viz(data,viz_type='assert')" + "nlp.load(nlu_ref).viz(data,viz_type='assert')" ], - "execution_count": 10, + "execution_count": null, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ + "Warning::Spark Session already created, some configs may not take.\n", + "Warning::Spark Session already created, some configs may not take.\n", "ner_wikiner_glove_840B_300 download started this may take some time.\n", "Approximate size to download 14.8 MB\n", "[OK!]\n", "assertion_dl download started this may take some time.\n", "[OK!]\n", + "embeddings_clinical download started this may take some time.\n", + "Approximate size to download 1.6 GB\n", + "[OK!]\n", "glove_840B_300 download started this may take some time.\n", "Approximate size to download 2.3 GB\n", "[OK!]\n", - "embeddings_clinical download started this may take some time.\n", - "Approximate size to download 1.6 GB\n", - "[OK!]\n" + "Warning::Spark Session already created, some configs may not take.\n" ] }, { @@ -2247,7 +2332,7 @@ " }\n", "\n", "\n", - " The patient MISCpresent was tested for cancer, but none was detected, he is free of cancer." + " The patient MISCpresent was tested for cancer, but none was detected, he is free of cancer." ] }, "metadata": {} @@ -2269,21 +2354,23 @@ "id": "KKBr-S5tlWlX", "colab": { "base_uri": "https://localhost:8080/", - "height": 342 + "height": 387 }, - "outputId": "7f4c4afd-9921-43c0-dcf4-196dee452f90" + "outputId": "e0e78958-7c91-4274-dc49-ffb3c1a46428" }, "source": [ "nlu_ref = 'med_ner.jsl.wip.clinical relation.temporal_events'\n", "data = \"He was advised chest X-ray or CT scan after checking his SpO2 which was <= 93%\"\n", - "pipe = nlu.load(nlu_ref).viz(data,viz_type='relation')" + "pipe = nlp.load(nlu_ref).viz(data,viz_type='relation')" ], - "execution_count": 11, + "execution_count": null, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ + "Warning::Spark Session already created, some configs may not take.\n", + "Warning::Spark Session already created, some configs may not take.\n", "ner_wikiner_glove_840B_300 download started this may take some time.\n", "Approximate size to download 14.8 MB\n", "[OK!]\n", @@ -2291,7 +2378,8 @@ "[OK!]\n", "glove_840B_300 download started this may take some time.\n", "Approximate size to download 2.3 GB\n", - "[OK!]\n" + "[OK!]\n", + "Warning::Spark Session already created, some configs may not take.\n" ] }, { @@ -2305,12 +2393,21 @@ " font-family: \"Lucida\"; \n", " src: url(\"data:application/x-font-ttf;charset=utf-8;base64,AAEAAAAPAIAAAwBwRUJEVFYYYjAAAAD8AABgtEVCTEM/0hIZAABhsAAAFQhPUy8yhDq8bwAAdrgAAABWY21hcAsuGiUAAHcQAAAGRGN2dCBD1E2KAAB9VAAAAPRmcGdtLlHKAwAAfkgAAAAdZ2x5ZjN05rEAAH5oAAD3pmhlYWS3KoptAAF2EAAAADZoaGVhCyQFvAABdkgAAAAkaG10eIWDdo8AAXZsAAAKZGxvY2FFpYI+AAGA0AAABTRtYXhwBDwB9wABhgQAAAAgbmFtZbG45HUAAYYkAAAGT3Bvc3QJ91RUAAGMdAAAF7hwcmVwFtVKZwABpCwAAAD+AAIAAAAAAAADBAEBBAOAgACAAgMABAOgoAQDAAQDoOCg4AUDAAQDQOBA4EAEAwAEA2DAYMAEAwAEA0DAoGACAQEEA4CABQIBBANAgICAQAUCAAQDgEBAQIADAwAEA0CgQAMDAAMDQOBAAgIBAQNAgAECAQIDwAEBAQEDgAUDAAQDICBAgIAEAwAEA0CgoEAEAwAEA0DAQOAEAwAEA8BggOAEAwAEA8DAIMAEAwAEAyBg4CAEAwAEA+DAIMAEAwAEA0CA4EAEAwAEA+AgQEAEAwAEA0DgoEAEAwAEA0DgIEADAQEDA4AAgAQCAAMDQABAgAMCAAMDQIBAAwMAAwPgAOADAgEDA4BAgAQCAQQDwEAAgAUDAAQDYKCggGAEAwAEA0Cg4KAEAwAEA+DAoMAEAwAEA2CAgGAEAwAEA8CgoMAEAwAEA+DggOAEAwAEA8DggIAEAwAEA2CAoGAEAwAEA6DgoKAEAwAEA+BAQOAEAwAEA2AgIMAEAwAEA6DAoKAEAwAEA4CAgOAEAwAEA6Dg4KAEAwAEA6Dg4KAEAwAEA0CgoEAEAwAEA+DAgIAFAwAEA0CgoEAgBAMABAPgwKCgBAMABANgwCDABAMABAPgQEBABAMABAOgoKBABAMABAOgoEBABAMABAOgoODgBAMABAOgQKCgBAMABAOgQEBABAMABAPgQIDgBQIBBAPAgICAwAUDAAQDgIBAICAFAgEEA8BAQEDAAgMABANAoAEDAAAD4AICAQQDgEADAwADA8BgoAQDAAQDgMCgwAMDAAMDYIBgBAMABAMgYKBgAwMAAwNgwGAEAwAEA2BA4EAEAwADA2DgIMAEAwAEA4DAoKAEAgAEA0AAwEAFAgAEA0AAwECABAMABAOAoMCgBAIABAPAQEBAAwMAAwPg4KADAwADA8CgoAMDAAMDQKBABAMAAwPAoMCABAMAAwNgoGAgAwMAAwPggIADAwADA2BAwAQDAAQDQOBAIAMDAAMDoKBgAwMAAwOgoEADAwADA6Dg4AMDAAMDoECgBAMAAwOgoECAAwMAAwPgQOAFAgAEA0BAgEBABQEBBAOAgICAgAUCAQQDgIBAgIACAwADA0CgBAMABAPgQOCgBAMABANAQOCgBQMABANggIBggAQDAAQDIOCA4AQDAAQD4KDgoAQDAAQDoECgQAQDAAQDoKCgQAQDAAQDIMBgoAQDAAQDgMBgoAQDAAQD4MBgoAQDAAQDoMBgoAQDAAQD4MBgoAQDAAQDQMBgoAQDAAMDYIBggAQDAAQDIGDAYAQDAAQDgGDAYAQDAAQD4GDAYAQDAAQDoGDAYAQDAAQDIMBAQAQCAAQDgMBAQAQDAAQD4MBAQAQDAAQDoMBAQAQDAAQD4MCgoAQDAAQDIECgQAQDAAQDgECgQAQDAAQD4ECgQAQDAAQDoECgQAQDAAQD4ECgQAQDAAQDIKCgYAQDAAQDgKCgYAQDAAQD4KCgYAQDAAQDoKCgYAUDAAQDQOBAQEADAwAEA0CgQAUDAAQDQOCA4EAEAwAEAyBAwGAFAwAEA0CAQCBAAgIBAwPAwAUDAAQDYOBgYGAEAwAEA0CgwKAEAwAEA0DgoEAFAwAEA0Cg4KBAAgMABAPg4AICAQQDQIABAwAEA6AFAwAEAyDgQOCABAMABANgoMCgBAMABANgoKDAAwMAAwPgQOAEAwAEA0DgQOAFAwAEA2CAYADgBQMABAPAIMAA4AQDAAQDoEDgQAQDAAMDoKDAgAQDAAQDgECgQAQDAAQD4EBA4AQDAAQD4KCgoAMDAAMD4KCgBQMABAMgQEBAgAMDAAQDwGCgAwMABANAoEAEAwAEA0CgQOADAwADA+BA4AMDAAMDYKDABAIABANAAEDABQEBBAOAAICAgAIDAAID4CAFAwAEAyAgoKBABQMABAMgQOBAgAQDAAQDQKBAoAQDAAQDQKCg4AMDAAMDYMBgAwMAAwPAYMABAwABA6AAAAAAAwQDAAQDgEDgoAQDAAQD4EDgoAQDAAQD4ECgQAQDAAQDYODAYAMDAAMDYOBgAQMAAgPgAQMAAgPgAgMABAOgoAIDAAQDoKACAgEEA4BAAgIBBANAgAUDAAQDQADgAEAEAwAEA0CgoEAFAwAEA6CgoECABAMABAOgoEBAAwMAAwOgQKAEAgEEA0CAgEAEAgEEA4BAQIAEAwAEA2CA4KAEAwAEA2Cg4KAFAwAEA0DgQOBAAgIBAwPAwAICAQEDQIACAwABA6CgBQMABANAoECgQAQDAAQD4EDgoAQDAAQD4OCA4AQDAAQDIEDgoAQDAAQDoOCA4AQDAAQDgOCA4AQDAAQDIOBA4AQDAAQD4OBA4AQDAAQDoOBA4AQDAAQDgOBA4AQDAAQDIECgQAQDAAQD4ECgQAQDAAQDgECgQAQDAAQDIKCgQAQDAAQD4KCgQAQDAAQDgKCgQAMCAAMDwEBAAgMABANAoAIDAAQDYMABAwAEA+ACAwAEA6BAAQEBBAOAAwMABANAoEABAQEAA4ABAwAEA6ABAQIAA4ACAwAEA6BABAMABAOAwIDgBAMABAPAYMBABAMABAPgwCDABAMABAOgYEDABAMABAPg4EDgBAMABAPg4EDgBQEBBAOAgACAgAQDAAQDwOCgwAQDAAQDwECgQAQDAAQDIKBAQAUDAAQDIKCgQIAEAwAEA4DgwIAFAwAEA4DAoMCAAQMAAgPgAwMAAwOgQKADAwAEA8BA4AMDAAQDwEDgAwMABAPAYMAFAwAEA4CAYCBgBQMABAOAgCBgIAUDAAQDwECgYCAEAwAEA2BA4EAEAwAEA+BgoGAFAwAEA6BgYCBABAMABANA4EDgBQMABANgwCDAQAQDAAMDYEDAQAQDAAQDIGCAYAQDAAQDIGCAYAQDAAQDoGCAYAQDAAQDoGCAYAQDAAQDYGCgYAECAQIDwAEDAAQD4AEBAQIDgAQDAAQD4EDgoAQDAAQD4MBgoAQDAAQD4EDgoAQDAAQD4MBgoAUDAAQDQKDgoCAEAwADA8BgoCAEAwAEA+BggGAEAwAEA+BggGAEAwAEA0BggGAEAwAEA0BggGAEAwAEA+DAoMAEAwAEA2BgoGAEAwAEA8DgoMAEAwAEA+DggOAEAwAEA+BgwGAEAwAEA+DggOAEAwAEA+BgwGAEAwAEA0DggOAEAwAEA0BgwGAFAwAEA+DggOAgBAMAAwNgwGAgBAMABAOg4IDgBAMABAOgYMBgBAMABAPgYKBgBQIBBAPAwMBAgAQDAAQDQGCgYAUCAQQDgMDAQIAFAwAEA2CAoGCABQMABAMgYOAgwAQDAAQD4KDgoAQDAAQD4IDgoAQDAAQDoODgoAQDAAQDwIDAoAQDAAQD4OBA4AQDAAQD4MBAQAQDAAQD4OBA4AQDAAQD4MBAQAQDAAQD4OBA4AQDAAQD4MBAQAUDAAQD4EBA4CAFAwAEA0AAwEAgBAMABAPgoKDABQMABAOgAOCgQAQDAAQD4OAgwAUDAAQD4ADAQIAFAwAEA6DAoKBABQMABAOAoMCgQAMDAAMDoMCgBAMABANAgIDgBAMABAPgQEBABQMABAOAgIDgQAUCAAQDwEBAQIAEAwAEA6CggOAEAwAEA+BgQEAEAwAEA4CggOAEAwAEA8BAYEAEAwAEAyDg4KAEAwAEAyDAoKAFAwAEA6Dg4KBABAMAAwPAoKBABAMABAPgoOCgBAMABAPgwKCgBAMABAOAwKCgBQMABAOg4OCgIAQDAAMDwKCgIAQDAAQD4ECgQAQDAAQD4ECgQAQDAAQD4ECgQAQDAAQD4ECgQAQDAAQDoECgQAQDAAQDoECgQAQDAAQDIODAoAQDAAQDIOCAgAUDAAQD4MCgoEAEAwADA+CAgEAEAwAEA+Dg4KAEAwAEA6DggIAEAwAEA+DAIMAEAwAEAyBgQMAEAwAEA+DAIMAEAwAEA+BgQMAFAwAEA+BAQECABQMABANA4EAgQAQDAAQD4OBAQAQDAAQDYOBAIAQDAAQD4EDgQAQDAAQD4OBAIAQDAAQD4KCgQAQDAAQD4KCgYAQDAAQD4KCgQAQDAAQD4KCgYAQDAAQD4KCgQAQDAAQD4KCgYAQDAAQD4KCgQAQDAAQDQKCgQAQDAAQDoKCgQAQDAAQDoKCgYAUDAAQDoKCgQCAEAwADA6CgYCAEAwAEA+Cg4OAEAwAEA+Cg4OAEAwAEA+CgQEAFAwAEA+CgoECABAMABAMg4EDgBAMABAMg4EDgBAMABANA4EDgBAMABANA4EDgBAMABAMgQMBABAMABAPA4KDgBAMABAOgwGCgBAMABAMgYMDgBAMABAMg4ECgBAMABANg4KDABAMABAMgYKDABAIAAwNAAECAAgEBBAOAgAIDAAQDQKAEAwAEA8Cg4KABAQEDA4AEAwAEA+DgQGAEAwAEA4Cg4KAEAwAEA+DAQOAEAwAEA8CgoEAEAwAEA6DAQEAEAwAEA8CgQOAEAwAEA+BAQCAEAwAEA0Cg4KAEAwAEA+DAoMAEAwAEA+CAgIAEAwAEA0CgoOAEAwAEA+DggOAEAwAEA+BAgOAEAwAEA6DgoKAEAwAEA0DgoEAEAwAEA+BAQOAEAwAEA6DAoKAEAwAEA0BAoKAEAwAEA+DgoKAEAwAEA6Dg4KAEAwAEA+BAAOAEAwAEA0CgoEAEAwAEA+CgoKAEAwAEA+DAgIAEAwAEA+BAgOAEAwAEA+BAQEAEAwAEA6BAQEAFAwAEA0CgoEBABAMABAOgQKCgBAMABAPgoOBABAMABANAoEDgBAMABAOg4EDgBAMABAOgoEBABAMABANAYKBgBAMABANAYMBgBQMABANAwKCgIAQCAQQDgACAQAQDAAQD4KCgQAMDAAMDYKBgBQMABAPgwKDAgAQDAAMDoKBAQAQDAAQDYECgQAMDAAMDYMBgBQMABAPgQIBgIAQDAAMDwKCgIAQDAAQDQOCgQAMCAQMDgIBAAwMAAwOgwKAEAwAEA4BAoKAEAwADA6CgwIADAwADA6CgQAUDAAQD4EDgQOADAwADA0CgQAQDAAMDQKDAgAQDAAMDYIBgIAMDAAMDYKBAAwMAAwPgQEADAwADA6CgQAUDAAQDQECgQEAEAwADA6BAoKAFAwAEA0DgoEBAAwMAAwOg4OAEAwAEA6BAQCAEAwAEA6CgoEAEAwAEA0BAoEAEAwAEA0CgoEAEAwAEA0CgoOAEAwAEA6DggOAEAwAEA+BAYGAEAwAEA0DggIAEAwAEA2DggGAEAwAEA2DAIMAEAwAEA+BAQOAEAwAEA6DgQOAEAgEEA8BAQIAEAwAEA8DA4OAEAwAEA8DAoOAEAwAEA+BAYGAEAwAEA0CgwKAEAwAEA+CgQIAFAwAEA6CgoOBABAMABANAoOCgBAMABAPggODABAMABAPgwKDABAMABAPggICABQMABANgYKDgoAQDAAQD4OCA4AQDAAQD4EDg4AQDAAQDwMAgwAQDAAQDoODgoAQDAAQD4KDgoAQDAAQDoMCgoAQDAAQDYGCgoAQDAAQDoODgoAQDAAQDoOCgoAQDAAQDQKCgQAQDAAQD4KCgoAQDAAQD4MCAgAQDAAQDYICAYAQDAAQD4EBAQAQDAAQDoKBAgAUDAAQDQECgQEAEAwAEA6BAoKAFAwAEA6CgoOAgBAMABAOgoGAgBAMABAOgoKDgBQMABAOgoKDgIAQDAAQDwEBgYAQDAAQDoKDg4AQCAQQDgIDAwAQDAAQDwOAgwAQDAAQDwKCgwAQDAAQD4GCgoAMDAAMDwGCgBAMABAMgQKBAAwMAAwPg4OADAwADA+CAgAQDAAMDYGDgoAMDAAMDYMBgAwMAAwPgQOADAwADA8BgwAMDAAMDoOCgAwMAAwOg4KADAwADA6DAoAMDAAMDYGCgAwMAAwPg4KADAwADA6DgoAMDAAMDQKBAAwMAAwPgoKAEAwADA8CgwIADAwADA2CAYAMDAAMD4EBABAMAAwOgoECABQMABANAQKBAQAMDAAMDoECgBAMAAwOgoOAgAwMAAwOgYCADAwADA6Cg4AQDAAMDoKDgIAMDAAMDwGBgAwMAAwOg4OADAgEDA4DAwAMDAAMDwGDAAwMAAwPAoMADAwADA+BgoAQDAAQDoGDAYAUDAAQDwIDAoCAEAwAEA0DggIADAwADA2DAYAMDAAMDYEDABAIABANAAMBABAMABAOgAMBABQIABANAAMBAgAMDAAMDwODgAwMAAwPAoOAEAwAEA8CAwKAEAwAEA0CgwKAFAwAEA+CgoECABAMAAwOgoOBABAMABAMg4ICABAMABAMg4ICABAMABAOAoODgBAMABAOAoODgBAMABAMgoODgBAMABAMgoODgBAMABAOgoODgBAMABAOgoODgBAMABAOAoEBABQMABAOAoKBAgAEDAAID4AIDAAED4OAEAwAEA6CgAKABAwAEA+ADAwADAyBAgAMDAAQDwKCgBAMABAMgwEDgBAMABAPA4KCgBAMABAPAwODgBQMABAOgwOBgYAUDAAQDwOBA4GAFAwAEA8DgQOBgBQMABAPA4EDgYAMDAAMDQOBABQMABANA4EBAQAMDAAMDQOBABQMABANAQEDgQAMDAAMDQOBABQMABANA4EDgQAUDAAQDQODgQOADAwADA4CA4AMDAAMDQKCgBQMABAPgAOAA4AQDAAQDQKCg4AIDAAID4IAFAgEEA0CAgICABQIABANAQEBAgAEDAAID4AUBAQQDgICAgIADAgECA8CAgAMCAAIDwEBAAwIBBAOAgMADAgAEA0BAwAUCAQQDgIDAgIAFAgAEA0BAwEBAAwMAAgPgQEADAwAEA0BA4AUDAAQDQEDgQEADAwADA+AA4AUBAQQDgICAgIAEAgEDA8CAwIADAgECA8CAgAQCAQMDwIDAgAQCAAMDwEDAQAMCAAIDwEBABAIAAwPAQMBABAIBBAOAwIDAAwIBBAOAgMAEAgEEA4DAgMAEAgAEA0DAQMADAgAEA0BAwAQCAAQDQMBAwAUCAQQDgMCAwIAFAgEEA4CAwICABQIBBAOAwIDAgAUCAAQDQMBAwEAFAgAEA0BAwEBABQIABANAwEDAQAQDAAMD4ADgQAMDAAID4EBABAMAAwPgAOBABAMABANA4ADgAwMABANAQOAEAwAEA0DgAOAFAwAEA0DgQOBABQMABANAQOBAQAUDAAQDQOAA4EADAwAEA+Dg4AMDAAID4ODgBQMABAPg4ODg4AUCAAQDwMDAwMAFAgEEA8DAwMDABQMABAOgAKAAoAUDAAQDoECgQKAFAwAEA+Cg4KDgAwMAAwPg4OACAwADA+DgBAMABANAQODgAwMAAwPA4MAEAwAEA+DgQEADAwADA2DgYAMDAAMD4KDgBQMABAPg4KDg4AUDAAQD4ICggOAEAwAEA0Cg4EAEAwAEA0DgoEADAwADA6BAoAUDAAQDQKBA4EAEAwAEAyBgoEAEAwAEA0DgQOAEAwAEA0DgQOAEAwAEA6Dg4EAEAwAEA0Dg4EAEAwAEA2BAwMAFAwAEA2BAQKCgAAAAAAQFAQIFBICAgACAAgMBBQSgoAQEAAQEUPBg8AYDAAUEQODAYOBABQQABQRQoGBQoAUEAAUEQKBQoHACAQIFBICABgMBBQQgQICAQCAGAwEFBIBAICBAgAQDAQUEQKBAoAMDAQMEQOBAAgIBAQRAgAEDAQIE4AEBAgEEgAYEAAUEECAgQICABQMBBQRAoKCgQAUDAQUEQMBAQOAFAwEFBMAgQIDgBQMBBQTAIMAgwAUEAAUEIGCg8CAFAwEFBOCAwCDABQMBBQRAgMCgQAUDAQUE4CBAQEAFAwEFBECgQKBABQMBBQRAoGAgQAQBAgQEgAAAgAUCAQQEQAAAQIADAgEDBECAQAMDAQME4ADgAwIBAwSAQIAFAwEFBMAgQABABgQABQRgkLCwgHAEAwEEBECg4KAEAwEEBMDAoMAEAwEEBGCAgGAEAwEEBMCgoMAEAwEEBODggOAEAwEEBODggIAEAwEEBGCAoGAEAwEEBKDgoKAEAwEEBOBAQOAEAwEEBGAgIMAEAwEEBKDAoKAEAwEEBICAgOAEBAAEBJDw8JAEAwEEBKDg4KAEAwEEBECgoEAEAwEEBODAgIAFAwEEBECgoEAgBAMBBATgwKCgBAMBBARgwCDABAMBBATgQEBABAMBBASgoKBABAMBBASgoEBABAMBBASgoODgBAMBBASgQKCgBAMBBASgQEBABAMBBATgQIDgBgIBBQTAgICAgMAGBAAFBIBAQCAQEAYCAQUEwEBAQEDABAMBBQRAQKCgAQQAAATwAgIBBQSAQAMDAQMEwGDgBQMBBQSAgMCgwAMDAQMEYIBgBQMBBQQgIGCgYAMDAQMEYMBgBQMBBQQgQOBAQAQDAQMEYOAgwAUDAQUEgIDAoKAFAgEFBEAAwEBABgIBBQRAAMBAQIAFAwEFBICAoMCgBQIBBQTAQEBAQAMDAQME4OCgAwMBAwTAoKADAwEDBECgQAQDAQMEwKDAgAQDAQMEYKBgIAMDAQME4ICAAwMBAwRgQMAEAwEEBEDgQCADAwEDBKCgYAMDAQMEoKBAAwQAAwSQ8GADAwEDBKBAoAQDAQMEoKBAgAMDAQME4EDgBgMBBQQgQIBAQCAGAQIFBICAgICAgAYDAQUEgEAgQECAAgQAAwRQoAUDAQUEoECg4KAFAwEFBEDgoOCgBQMBBARggIBggAUDAQUEIODggOAFAwEFBOCg4OCgBQMBBQSgQKCgQAUDAQUEoKCgoEAFAwEFBCBAwGDgBQMBBQSAQMBg4AUDAQUEQKDAYOAFAwEFBKAAwGDgBQQABQRQoGAwcAUDAQUEQKDAYOAEAwEDBGCAYIAFAwEFBCBAYMBgBQMBBQSAQGDAYAUDAQUEQKBgwGAFAwEFBKAAYMBgBQMBBQQgQMBAQAUCAQUEgEDAQEAFAwEFBECgwEBABQMBBQSgAMBAQAUEAAUEUKBgUFAFAwEFBCBAQKBABQMBBQSAQECgQAUDAQUEQKBAoEAFAwEFBKAAQKBABQQABQRQoCBQIAUDAQUEIECgoGAFAwEFBIBAoKBgBQMBBQRAoKCgYAUDAQUEoACgoGAFAwEFBEDgQEBAAwMBBQRAoEAFAwEFBEDggOBABQQABQQgQGDAcAYDAQUEYECgQCDAAgIBAwTAwAYEAAUEcNDQUFBQBQQABQRAoKCQoAUEAAUEYNDw0GAGBAAFBGCQ8JDwYAMEAAUE8FBQAgICBQRAgAEDAQUEoAUEAAQEIPBA8EAEBAAEBHCw4LAEAwEEBGCgoMADBAADBGCwYAQDAQQEQOBA4AUDAQUEYIBgAOAFAwEFBMAgwADgBQMBBQSgoEDgQAQDAQMEoKDAgAUDAQUEQCBgoEAEBAAEBPBAQPAEBAAEBPBQUFADBAADBPBQUAYDAQUEIEBAQECABAMBBQTAIODgBAMBBQRAoKBABQMBBQRAoKBA4AMEAAME8GCwAwMBAwRgoMAGAwEFBEAAQEAgwAUBAgQEgACAgIACAwECBOAgBgQABQQQEBCgoEAGAwEFBCBA4EBAgAUEAAUEUKAAUKAEAwEEBECgoOADBAADBFCgUAMEAAMEoFCgAQMBAQSgAAAAAAQFAwEFBIBAoOCgBQMBBQTgQKDgoAUDAQUE4ECgoEAEBAAEBHCwoHADBAADBHCgUAEDAQIE4AEEAAIE8AIEAAUEoFACBAAFBFCgAgIBBQSAQAICAQUEQIAFAwEEBEAA4ABABAMBBARAoKBABgMBBQSgAKCgQIAFAwEFBKCgQEBABAQABQSQYGCQBAIBBARAgIBABAIBBASAQECABQQABQQwQPBQUAUEAAUEMFDwUFAFAwEFBEDgQOBAAgIBAwTAwAICAQEEQIACBAABBFCgBQQABQSgUKBQoAUDAQUE4ECg4KAFAwEFBODg4IDgBQMBBQQgQKDgoAUDAQUEoODggOAFAwEFBIDg4IDgBQMBBQQg4EBA4AUDAQUE4OBAQOAFAwEFBKDgQEDgBQMBBQSA4EBA4AUDAQUEIECgoEAFAwEFBOBAoKBABQMBBQSAQKCgQAUDAQUEIKCgoEAFAwEFBOCgoKBABQQABQSAUFBQIAMCAQMEwEBAAgMBBQRAoAIEAAUEUKABBAAFBPACBAAFBJBgAQECBQSAAwMBBQRAoEABAQIABIACBAAFBFCgAQECAASAAgMBBQSgQAQEAAQEQGDAcAUDAQUEwEBgwEAFAwEFBOBgwCDABQMBBQSgQGBAwAUDAQUE4OBAgOAFAwEFBOAA4EDgBgECBQSAgACAgIAEBAAEBGDwUGAFAwEFBKDAQKBABQMBBQQgoEBAQAYDAQUEIECgoECABAMBBASA4MCABgMBBQSAgMCgwIABAwECBOADAwEDBKBAoAQDAQUEwEBA4AQDAQUEwCDA4AQDAQUEwOAgwAYEAAUE0GBwUGCwBgQABQTQYFAwcJAGBAAFBNDgUPBwkAUEAAUEcHBA4EAFAwEFBOBggKBgBgMBBQSgQGDgIMAFAwEFBEDgQEDgBQMBBARgwCDAQAQDAQMEYEDAQAUDAQUEIGCAgGAFAwEFBCBAYIBgBQMBBQTgYICAYAUDAQUEoEBggGAFAwEFBOAgYKBgAQMBAgTgAQQABQTwAQECAgSABQMBBQTgQKDgoAUDAQUE4ADAYOAFAwEFBOBAoOCgBQMBBQSgQMBg4AUDAQQEQKDgoCAEAwEDBMBg4CAFAwEFBOBggIBgBQMBBQRAoGCAYAUDAQUEQGCAgGAFAwEFBEAAYIBgBQMBBQTgwKCgwAUEAAUEsFAwUDAEBAAEBGDwUGAFAwEFBODg4IDgBQMBBQTgAGDAYAUDAQUE4ODggOAFAwEFBKBAYMBgBQMBBQRA4OCA4AUDAQUEQABgwGAFAwEEBODggOAgBAMBAwRgwGAgBQMBBQTg4OCA4AUDAQUEoEBgwGAFAwEFBOBggKBgBgMBBQRAoGDgIMAFAwEFBEBggKBgBgMBBQRAAGDgIMAFAwEEBGCAoGCABQMBBAQgYOAgwAUDAQUE4KDgoKAFAwEFBOCAwKCgBAQABARQ8HBQBQQABQTgQGBQUAUDAQUE4OBAQOAFAwEFBOAAwEBABQMBBQTg4EBA4AUDAQUE4ADAQEAFAwEFBODgQEDgBQMBBQSgQMBAQAUDAQQE4EBA4CAGAwEFBEAAwEBAIAQEAAQE8FBQ4AYEAAUEUADwUFAgBQMBBQRgYCAgwAYDAQUE4ADAQECABQMBBASgwKCgQAYDAQUEgICgwKBAAwMBAwSgwKAFAwEFBECAgIDgBQQABQTQYEBAQAUDAQQEgICA4EAGAgEFBMBAQEBAgAQDAQQEoKCA4AUEAAUE0FBAQEAFAwEFBICAoIDgBQQABQTAQFBAQAUDAQUEIKDg4KAFAwEFBCBAwKCgBQMBBASg4OCgQAQDAQMEwKCgIAUDAQUE4KDg4KAFAwEFBKBAwKCgBQQABQSAgGBQUAUDAQQEoODgoCAEAwEDBMCgoCAFAwEFBOBAoKBABQMBBQTgAECgQAUDAQUE4ECgoEAFAwEFBOAAQKBABQMBBQSgQKCgQAUDAQUEoABAoEAFAwEFBCDgwKCgBQMBBQQgQOCAgAUDAQQE4MCgoCAEAwEDBOCAgEAFAwEFBODgwKCgBQMBBQSgQOCAgAUDAQUEIGDAIMAFAwEFBCBAYEDABQMBBQRgYMAgwAUDAQUEQKBgQMAFAwEEBOBAQECABQMBBARA4EAgQAUDAQUE4OBAQEAFAwEFBCBA4EAgBAMBBATgQOBABAMBBATg4EAgBQMBBQTgoKCgQAUDAQUE4ACgoGAFAwEFBOCgoKBABQMBBQTgAKCgYAUDAQUE4KCgoEAFAwEFBOAAoKBgBQMBBQTgoKCgQAUDAQUEQKBAoEAFAwEFBKCgoKBABQMBBQSgAKCgYAUDAQQEoKCgQCAEAwEDBKCgYCAFBAAFBGCQkGBgBQQABQRgAJDwYAUDAQUE4KBAQEAGAwEFBOAAoKBAgAUDAQUEIOBAgOAFAwEFBCBA4EDgBQMBBQRA4ECA4AUDAQUEQADgQOAFAwEFBCBAwEBABQQABQRwoFBwUAUEAAUEULBgMHAFBAAFBBBwsOCwBQQABQQQIPBgsAUDAQUEIGCgoMAFAwEFBCBAYKDABQIBBARAAABAgAIBAgUEgIACAwEFBECgBQQABQSAoFBwUAEBAgMEgAQEAAQE8PBAcAQEAAQE0PBQUAQEAAQE8KAgcAQEAAQEoNBQIAQEAAQE0KAgIAQEAAQEoNAgcAUDAQUEQKBAQCAEAwEEBECg4KAEAwEEBODAoMAEAwEEBOCAgIAEAwEEBECgoOAEAwEEBODggOAEAwEEBOBAgOAEAwEEBKDgoKAEAwEEBEDgoEAEAwEEBOBAQOAEAwEEBKDAoKAEAwEEBEBAoKAEBAAEBJDw8JAEAwEEBKDg4KAEAwEEBOBAAOAEAwEEBECgoEAEAwEEBOCgoKAEAwEEBODAgIAEAwEEBOBAgOAEAwEEBOBAQEAEAwEEBKBAQEAGAwEFBEBAoKBAQAQDAQQEoECgoAUDAQUEQKDgQEAEAwEEBECgQOAFAwEFBKDgQEDgBQMBBQSgoEBAQAUDAQUEQABgoGAFAwEFBEAAYMBgBgMBBQRAAMCgoCAFAgIFBIAAgIBABQMBBQTgAKCgQAMDAQMEYKBgBgMBBQRAoMCgwIAEAwEDBKCgQEAFAwEFBECAQKBAAwMBAwRgwGAGAwEFBOBAgIBgIAQDAQMEwKCgIAUDAQUEQKDgoEADAgIDBICAQAMDAQMEoMCgBQMBBQSAQECgoAQDAQMEoKDAgAMDAQMEoKBABgMBBQTgQGCAYCADAwEDBECgQAQDAQMEQKDAgAQDAQMEYIBgIAMEAAMEcKBAAwMBAwTgQEADAwEDBKCgQAUDAQQEQECgQEAEAwEDBKBAoKAFBAAEBCCwsGAgAwQAAwSwsGAFAwEFBKAAQEAgBQMBBQSgAKCgQAUDAQUEQABAoEAFAwEFBEAAoKBABQQABQRAALCwYAUDAQUEoODggOAEBAAEBOBAcGAFAwEFBEDggICABAMBBARg4IBgBAMBBARgwCDABAMBBATgQEDgBQMBBQSg4EBA4AQCAQQEwEBAgAQEAAQE4KCwsAQEAAQEoOCwsAQEAAQE4EBgUAUDAQUEQKDAoKAFAwEFBOCgoECABQMBBASgoKDgQAQDAQQEQKDgoAQDAQQE4IDgwAQDAQQE4MCgwAQDAQQE4ICAgAUEAAQEcFCQ8JAEAwEEBODggOAEBAAEBLBgYLAEAwEEBMDAIMAEAwEEBKDg4KAFAwEFBECg4OCgBAMBBASgwKCgBAQABARwUFCQBAQABASQ8PCQBAMBBASg4KCgBAMBBARAoKBABAMBBATgoKCgBAMBBATgwICABAMBBARggIBgBAMBBATgQEBABAMBBASgoECABQQABAQgYLBgIAQDAQQEoECgoAUDAQQEoKCg4CAEAwEEBKCgYCAEBAAEBLCwsPAFBAAEBLCwsPAQBAQABATAQHBgBAQABASQkPDQBAMBBASAgODABAMBBATA4CDABAQABASg0NCgBAMBBATgYKCgAwMBAwTAYOAFAwEFBCBA4KBAAwMBAwTg4OADAwEDBOCAgAQEAAMEcFDwkAMDAQMEYMBgAwQAAwSwYLADAwEDBMBgwAMDAQMEoOCgAwMBAwSg4KADAwEDBKDAoAMEAAMEcFCQAwQAAwTw8JADAwEDBKDgoAMDAQMEQKBAAwMBAwTgoKAEAwEDBMCgwIADAwEDBGCAYAMDAQME4EBABAMBAwSgoECABgQABQQgIGCwYCADAwEDBKBAoAQDAQMEoKDgIAMDAQMEoGAgAwQAAwSwsPAEBAADBLCw8BADBAADBMBwYAMEAAMEkPDQAwMBAwSA4MADAwEDBMBgwAMEAAMEoNCgAwMBAwTgYKAFAwEFBKAAYMBgBgQABQRA4EBgUBAFAwEFBCBA4ICAAwMBAwRgwGADAwEDBGBAwAUCAQUEQADAQEAFAwEFBKAAwEBABgIBBQRAAMBAQIADBAADBOCwsAMEAAMEoPCwBQQABQRA4EBgUAUDAQUEQACgwKAGAwEFBOAAoKBAgAQDAQMEoKDgQAUDAQUEIOCAgIAEAwEEBCDggIAFBAAFBECQkPBgBQQABQSAQJDwYAUEAAUEIJCQ8GAFBAAFBBAgkPBgBQQABQRQkJDwYAUEAAUEkACQ8GAFAwEFBICgQEBABgMBBQSAQKCgQIABAwECBOACBAABBPDwBQMBBQSgoKAAoAEEAAUE8AQEAAQEECBAgAMDAQUEwKCgBQQABQQgQOBA8AUEAAUEwOCwoJAFBAAFBKDg4LCwBgQABQSQoFCgUCAGBAAFBNDgUKBQIAYEAAUE0KBQoFAgBgQABQTQYNCgUCADBAADBEDwQAYDAQUEQOBAQEBAAwQAAwQg8CAGAwEFBEBAQEDgQAMEAAMEYPBgBgMBBQRA4EBA4EAGAwEFBEDgQOBA4AMDAQMEgIDgAwQAAwRgkJAFAwEFBOAA4ADgBAMBBARAoKDgAgMBAwTggAYCAgUEQICAgICABgIBBQRAQEBAQIABBAADBPAGAQIFBICAgICAgAQCAgMEwICAgAQDAAME4CAgIAMCAgUEgIDAAwMABQQgIOAGAgIFBICAwICAgAYDAAUEICDgICAgBAQAAwTwICAgAwQABQQgIPAGBAAFBCAg8CAgIAMEAAQE8ADwBgIBBQTAwMDAwMAFAgIEBMCAwICABAMBAwTgwMDABQMBBATggODAwAUDAAQE4CDgICAEAwADBOBgYGAFAwAEBOAg4GBgBAICBQSAwIDAAwMBBQTAwOAEAwEFBMDggOAEAwAFBCDgIOADAwAFBGBg4AQDAAUEYOAg4AYCAgUEgMCAwICABgMBBQTAwODAwMAGAwEFBMDggODAwAYDAAUEIOAg4CAgBgMABQRgYOBgYGAGAwAFBGDgIOBgYAUEAAQE8ADwICAEBAADBPBgYGAFBAAEBPAA8GBgBAQABQQg8ADwAwQABQRgYPAEBAAFBGDwAPAGBAAFBCDwIPAgIAYEAAUEYGDwYGBgBgQABQRg8ADwYGADBAAFBPDw8AMEAAIE8PDwBgQABQTw8PDw8PAGAgAFBMDAwMDAwAYCAgUEwMDAwMDABQMABQSgAKAAoAYEAAUEoFCgUKBQBgQABQTwoPCg8KADAwEDBODg4AIDAQME4OAEAwEEBEBA4OADBAADBMDwwAQDAQQE4OBAQAMEAAMEMPAwBAQABARgkJBgBgQABQTw8JCQ8PAGBAAFBPCQYGCQ8AUEAAUEYPCQ8GAFBAAFBGCQ8JBgAwMBAwTgoOAFAwEEBECgQOBABAQABAQQYKBABQMBBQRA4OBA4AQDAQQEQOBA4AQDAQQEoODgQAQDAQQEQODgQAUEAAUEYFBAwMAGBAAFBDBQUHDwwAAAAAAEBgECBgSAgICAAIACAwEGBKCgBQQABQRQ8FDwoAcDAAYEQODAQGDgQAYEAAYEUKBAIFCgBgQABgRAoECwoHACAQIGBICABwMBBgQgQICAgEAgBwMBBgSAQCAgIECABAMBBgRAoECgAwMBAwRA4EADAgEBBEBAgAEDAQME4AEBAgEEgAcEAAYEECAgQECAgAYEAAYEYJCQkJBgBgMBBgRAwEBAQOAGAwEGBMAgIECA4AYDAQYEwCDAICDABgQABgQgYKDwICAGAwEGBOCAwCAgwAYDAQYEYIDAoKBABgMBBgTgICBAQEAGAwEGBECgQKCgQAYDAQYEQKCgYCDABAECBASAAACABgIBBARAAABAQIAFAwAFBCBAgEAgAwMBBATgAOAFAwEFBIBAIECABgMBBgTAICBAAEAHBAAGBCBQkLCwgHAFBAAFBGCQ8JCQBQMBBQTAoMCg4AUDAQUEYICAgGAFAwEFBMCgoKDABQMBBQTggOCA4AUDAQUE4IDggIAFAwEFBGCAoKBgBQMBBQSgoOCgoAUDAQUE4EBAQOAFAwAFBGAgICDABQMBBQSgoMCgoAUDAQUEgICAgOAFBAAFBJDw8JCQBQMBBQSg4OCgoAUEAAUEYJCQkGAFAwEFBMCgwICABgQABQRgkJCQYDAFAwEFBMCgwKCgBQMBBQRggEAgwAUDAQUE4EBAQEAFAwEFBKCgoKBABQMBBQSgoKBAQAUEAAUEkJDw8GAFAwEFBKCgQKCgBQMBBQSgoEBAQAUDAQUE4CBAgOAHAgEGBMCAgICAgMAHBAAGBIBAQCAgEBAHAgEGBMBAQEBAQMAFAwEGBEBAoKCgAQQAAATwAgIBBgSAQAQDAQQEwCDg4AYDAQYEgIDAoKDABAMBBARggIBgBgMBBgQgIGCgoGAEAwEEBEDggGAGAwEGBGBA4EBAQAUDAQQEYKDgIMAGAwEGBICAwKCgoAYCAQYEQADAQEBABwIBBgRAAMBAQECABgMBBgSAgKDAoKAGAgEGBMBAQEBAQAQEAAQEkPCQkAQDAQQEwKCgoAQDAQQEQKCgQAUDAQQEwKCgwIAFAwEEBGCgoGAgBAMBBASgwICABAMBBARgwCDABQMBBQRA4EBAIAQDAQQEoKCgYAQDAQQEoKBAQAQEAAQEkJDwYAQDAQQEoEBAoAUDAQQEoKBAQIAEAwEEBOBAgOAHAwEGBCBAQIBAQCAHAQIGBICAgICAgIAHAwEGBIBAQCBAQIACBAADBFCgBgQABgSQYJDwkJAGBAAGBGBgkPCQkAcDAQUEYICAgGBAgAYDAQYEIOCA4IDgBgMBBgTgoODgoKAGBAAGBJBgkJCQYAYDAQYEoKCgoKBABgMBBgQgQMAg4OAGBAAGBIBAYBBwcAYDAQYEQKDAIODgBgMBBgSgAMAg4OAGBAAGBFCgYBBwcAYDAQYEQKDAIODgBgMBBARggIBgQIAGAwEGBCBAQOCAYAYEAAYEgEAgcEAwBgMBBgRAoEDggGAGAwEGBKAAQOCAYAYDAQYEIEDAQEBABgMABgSAQGAgICAGAwEGBECgwEBAQAYDAQYEoADAQEBABgMBBgTgAMCgoKAGAwEGBCBAQKCgQAYDAQYEgEBAoKBABgMBBgRAoECgoEAGAwEGBKAAQKCgQAYEAAYEUKAgUFAgBgMBBgQgQKCgoGAGAwEGBIBAoKCgYAYDAQYEQKCgoKBgBgMBBgSgAKCgoGAGAwEFBEDgQEBAQAMDAQYEQKBABQMBBQRA4IDgQAUEAAUEIEBgwHAHAwEGBGCAQKBAIMACAgEDBMDABwQABgRw0NBQUFBQBgQABgRAoKCgkKAGBAAGBGDQ8NCQYAcEAAYEYJDw0PCQYAMEAAYE8FBQAgICBgRAgAEDAQYEoAUEAAQEIPBA8EAFBAAFBHCg8KCwBwQABgQQYLCQ0GCABAQABARgsLBgBAMBBARA4EDgBQMBBQRggGAA4AUDAQUEwCDAAOAFAwEFBKCgQOBABQMBBASgoKDAgAYDAQYEQCBgoKBABQQABQTwQCBA8AUEAAUE8FBQUFAEBAAEBPBQUFAHAwEFBCBAQEBAQIAEAwEGBMAg4OAEAwEGBECgoEAGBAAGBGCQkJBg8AQEAAQEoHDAsAYDAQUEIECgoECABgMBBQRAAEBAIMAFAQIEBIAAgICAAgMBAwTgIAcEAAYEEBAQIKCgQAcDAQYEIEBA4EBAgAUEAAUEUKAAUKAFBAAFBGBgkJDwAwQABARQoFADBAAEBKBQoAEDAQEEoAAAAAAEBgQABgSAYJDwkJAGBAAGBGBgkPCQkAYEAAYEYGCQkJBgBQQABQRwoLCgcAQEAAQEULCgUAEDAQME4AEEAAME8AMEAAYEoKBQAwQABgRQUKADAgEGBICAQAMCAQYEQECABQMBBQRAAOAAQAUDAQUEQKCgoEAHAwEGBKAAoKBAQIAGAwEGBKCgoEBAQAQEAAUEkGBgkAQCAQQEQICAQAQCAQQEgEBAgAYEAAYEMEDwUFBQBgQABgQwUPBQUFAGAwEFBEDgQEDgQAICAQMEwMADAgEBBEBAgAMEAAEEUFCgBgQABgRQoECgUKAGBAAGBGBgkPCQkAYDAQYE4OCA4IDgBgQABgQQYJDwkJAGAwEGBKDggOCA4AYEAAYEgHBAcEBwBgMBBgQg4EBAQOAGAwEGBODgQEBA4AYDAQYEoOBAQEDgBgQABgSAcCAgIHAGBAAGBBBgkJCQYAYEAAYEYGCQkJBgBgQABgSAYJCQkGAGBAAGBBCgoKCgQAYDAQYE4KCgoKBABgQABgSAUFBQUCAEAgEEBMBAQEACAwEGBECgAgQABgRQoAEEAAYE8AIEAAYEkGABAQIGBIADAwEGBECgQAICAQAEQIACBAAGBFCgAQECAASAAgMBBgSgQAUEAAUEQEBgwHAGAwEGBMBAYMBAQAYDAQYE4GCAQCDABgMBBgSgQGDAIMAGAwEGBODgIECA4AYDAQYEoEDgYIDgBwECBgSAgIAAgICABQQABQRgUPBQYAYDAQYEoMBgoKBABgMBBgQgoKBAQEAHAwEGBCBAoKBAQIAFAwEFBIDAoMCABwMBBgSAgMCgoMCAAQMBAwTgBAQABASQYGCQBAMBBgTAQEDgBAMBBgTAIMDgBAMBBgTA4CDABgQABgTQYHBQYLAGBAAGBNBgUDBwkAYEAAYE0OBQ8HCQBgQABgRwQHBA4EAGAwEGBGBggKCgYAcDAQYEoEBgoOAgwAYDAQYEQOBAQEDgBgMBBQRggEAgwEAFAwEEBGDAIMBABgMBBgQgYICAgGAGAwEGBCBAYICAYAYDAQYEYGCAgIBgBgMBBgSgQGCAgGAGAwEGBOAgYKCgYAEDAQME4AEEAAYE8AEBAgMEgAYEAAYE8GCQ8JCQBgMBBgTgAMAg4OAGBAAGBGBgkPCQkAYDAQYEoEDAIODgBgQABQRgkPCQkBAFAwEEBMAg4OAgBgMBBgRgYICAgGAGAwEGBECgYICAYAYDAQYEQGCAgIBgBgMBBgRAAGCAgGAGAwEGBODAoKCgwAYEAAYEsFAwUFAwBQQABQRgUNBQYAYDAQYE4OCA4IDgBgMBBgTgAEDggGAGAwEGBODggOCA4AYDAQYEoEBA4IBgBgMBBgRA4IDggOAGAwEGBEAAQOCAYAcDAQUE4IDggOBAIAYDAQQEQOCAYEAgBgMBBgRg4IDggOAGAwEGBKBAQOCAYAYDAQYEYGCAoKBgBwMBBgRAoGCg4CDABgMBBgQgYICgoGAHAwEGBEAAYKDgIMAGAwEFBGCAoKBgIAcDAQYEICBgoOAgwAYDAQYE4KCg4KCgBgMBBgTggOCgoKAFBAAFBFBQ8FBQBgQABgTgQGBQUFAGAwEGBODgQEBA4AYEAAYEUKBgICAgBgMBBgTg4EBAQOAGAwEGBOAAwEBAQAYDAQYE4OBAQEDgBgQABgSQYGAgICAGAwEFBOBAQEDgIAcDAQYEQADAQEBAIAUEAAUE8FBQUOAHBAAGBFAA8FBQUCAGAwEGBGDgICAgwAcEAAYEYJBgICAgQAYDAQUEoKDAoKAgBwMBBgSAgKDAoKAgBAMBBASgwKCgBgMBBgRAgICAgOAGBAAGBNBgQEBAQAYDAQUEgICAgOAgBwIBBgTAQEBAQECABQMBBQSgoICA4AYEAAYE0FBAQEBABQMBBQSAoICA4AYEAAYEwEBQQEBABgMBBgQgoODgoKAGAwEGBCBAwKCgoAYDAQUEoODgoKAgBQMBBATgoKCgIAYDAQYE4KDg4KCgBgMBBgSgQMCgoKAGBAAGBICAYFBQUAYDAQUEoODgoKAgBQMBBATAoKCgIAYEAAYE8GCQkJBgBgMBBgTgAECgoEAGBAAGBGBgkJCQYAYDAQYEoEBAoKBABgQABgRQYJCQkGAGBAAGBFCgIFBQIAYDAQYEIMCgwKCgBgMBBgQgQKDAgIAGAwEFBMCgwKCgIAUDAQQEoMCAgEAGAwEGBODAoMCgoAYDAQYEoECgwICABgMBBgQgYIBAIMAGAwEGBCBAYMAgwAYDAQYEYGCAQCDABgMBBgRAoGDAIMAGAwEFBOBAQEBAgAYDAQUEQOBAQCBABgMBBgTg4EBAQEAGAwEGBCBg4EBAIAUDAQUE4EDgQEAFAwEFBEDg4EAgBgMBBgTgoKCgoEAGBAAGBFCgUFBQMAYDAQYE4KCgoKBABgMBBgTgAKCgoGAGAwEGBOCgoKCgQAYDAQYEoECgoKBgBgMBBgRA4KCgoEAGAwEGBKBAoKCgQAYEAAYEoFBQUFAgBgQABgRQoFBQUDAGAwEFBKCgoKBAIAUDAQQEoKCgYCAGBAAGBPCQkPDwYAYEAAYEYACQkPBgBgMBBgTgoKBAQEAHAwEGBOCgoKBAQIAGAwEGBCDgIECA4AYDAQYEIEDgYIDgBgMBBgRA4CBAgOAGAwEGBEAA4GCA4AYDAQYEIEDAQEBABgQABgRQ4JDwkJAGBAAGBFCgcBBwcAYEAAYEEHCg8KCwBgQABgQQIKBwwLAHBAAGBFBgsJDQYIAHBAAGBECQIFBQIEAFAgEEBEAAAECAAgECBgSAgAIDAQYEQKAGBAAGBICgUJDwkAEBAgMEgAUEAAUE8MBwQHAFBAAFBNDQcFBQBQQABQTwoCAgcAUEAAUEoNBQUCAFBAAFBNDQICAgBQQABQSg0FAgcAYDAQYEQKBAQEAgBQQABQRgkPCQkAUDAQUEwKDAoOAFAwEFBOCAgICABQQABQRgYJCQ8AUDAQUE4IDggOAFAwEFBOAgQIDgBQMBBQSgoOCgoAUDAQUEQKDgoEAFAwEFBOBAQEDgBQMBBQSgoMCgoAUDAQUEQECgoKAFBAAFBJDw8JCQBQMBBQSg4OCgoAUDAQUE4ABAAOAFBAAFBGCQkJBgBQMBBQTgoKCgoAUDAQUEwKDAgIAFAwEFBOCAQIDgBQMBBQTgQEBAQAUDAQUEoKBAQEAGAwEFBEBAoKBAQAUDAQUEoKBAoKAFAwEFBOCg4EBABQQABQRgkJBgkAYDAQYEoOBAQEDgBgMBBgSgoKBAQEAGAwEGBEBAYKCgYAYDAQYEQEBA4IBgBwMBBgRAQMCgoKAgBgICBgSAAICAgEAGAwEGBOAAoKCgQAQDAQQEYKCgYAcDAQYEQKDAoKDAgAUDAQQEoKBAQEAGAwEGBECAQKCgQAQDAQQEQOCAYAcEAAYEEOAgQEAwEAUDAQQEwKCgoCAGAwEGBECg4KCgQAQCAgQEgICAQAQDAQQEoMCgoAYDAQYEgEBAoKCgBQMBBASgoKDAgAQDAQQEoKBgQAcDAQYE4EBggMAgQAQDAQQEQKCgQAUDAQQEQKCgwIAFAwEEBGCAgGAgBAQABARwoKBABAMBBATgQEBABAMBBASgoKBABwQABgQgIGCQkGAgBQMBBASgoECgoAcEAAYEICCwsLBgIAQEAAQEkLCwYAYDAQYEoABAQEAgBgMBBgSgAKCgoEAGAwEGBEBAQKCgQAYDAQYEQECgoKBABgQABgRAQJCwsGAGAwEGBKDggOCA4AUEAAUE4EBgUGAGAwEGBEDggICAgAUDAQUEYIDggGAFAwEFBGCAQCDABQMBBQTgQEBA4AYDAQYEoOBAQEDgBQIBBQTAQEBAgAUEAAUE4KCwsLAFBAAFBKCg8LCwBQQABQTgQGBQUAYDAQYEQKCgwKCgBgMBBgTgoKBAQIAGAwEFBKCgoKDgQAUEAAUEYJDwkJAFAwEFBOCAwKDABQMBBQTAoMCgwAUDAQUE4ICAgIAGBAAFBHBQUJDwkAUDAQUE4IDggOAFBAAFBLBgYGCwBQMBBQTAIMAgwAUDAQUEoODgoKAGAwEGBECg4OCgoAUDAQUEoKDAoKAFBAAFBHBQUFCQBQQABQSQ8PCQkAUDAQUEoKDgoKAFBAAFBGCQkJBgBQMBBQTgoKCgoAUDAQUEwKDAgIAFAwEFBGCAgIBgBQMBBQTgQEBAQAUDAQUEoKBAQIAGBAAFBCBgsLBgIAUDAQUEoKBAoKAGAwEFBKCgoKDgIAUDAQUEoKBgICAFBAAFBLCwsLDwBgQABQSwsLCw8BAFBAAFBMBAYFBgBQQABQSQkNCw0AUDAQUEgIDAoMAFAwEFBMAg4CDABQQABQSg0NDQoAUDAQUEYKBgoKAEAwEEBMAg4OAGAwEGBCBgwKCgQAQDAQQE4OCgwAQDAQQE4ICAgAUEAAQEcFCQ8JAEAwEEBEDggGAEBAAEBLBgsLAEAwEEBMDgIMAEAwEEBKDg4KAGAwEGBOAAoODgoAQDAQQEoMCgoAQEAAQEcFBQkAQEAAQEkPDwkAQDAQQEoOCgoAQDAQQEQKCgQAQDAQQE4KCgoAUDAQQEwKCgwIAEAwEEBGCAgGAEAwEEBOBAQEAFAwEEBKCgQECABwQABgQgIGCwsGAgBAMBBASgQECgBQMBBASgoKDgIAQDAQQEoKBgIAQEAAQEsLCw8AUEAAQEsLCw8BAEBAAEBMBgUGAEBAAEBJDQsNAEAwEEBIDAoMAEAwEEBMDgIMAEBAAEBKDQ0KAEAwEEBGCgYKAGAwEGBKAAQOCAYAcEAAYEQOBAYFBQEAYDAQYEIEDggICABAMBBARA4IBgBAMBBARgwCDABgIBBgRAAMBAQEAGAwAGBKAAYCAgIAcCAQYEQADAQEBAgAQEAAQE4KCwsAQEAAQEoOCwsAYEAAYEQOBAYFBQBgMBBgQgQKDAoKAHAwEGBGAAoKBAQIAFAwEEBKCgoOBABgMBBgQg4ICAgIAFAwEFBCDggICABgQABgRAkJCQ8GAGBAAGBIBAkJDwYAYEAAYEIJCQkPBgBgQABgQQIJCQ8GAGBAAGBFCQkJDwYAYEAAYEkACQkPBgBgMBBgSAoKBAQEAHAwEGBIBAoKBAQIABAwEDBOACBAABBPDwBQMBBQSgoKAAoAEEAAYE8AQEAAQEECBAgAMDAQYEwKCgBgQABgQgQEDgQPAGBAAGBMCg8KCgkAYEAAYEoODgsLCwBwQABgSAkKBQoFAgBwQABgSQUKBQoFAgBwQABgTQoGDQoFAgBwQABgTQUKDQIFAgAwQABARA8EAHAwEGBEDgQEBAQEADBAAEBCDwIAcDAQYEQEBAQEDgQAMEAAQEYPBgBwMBBgRA4EBAQOBABwMBBgRA4EDgQADgBAMBBASAgIDgBAQABARgkJCQBQMBBQTgAOAA4AUDAQUEQKCgoOACAwEDBOCABwICBgRAgICAgICABwIBBgRAQEBAQECAAQQAAwTwBwECBgSAgICAgICABAICAwTAgICABAMAAwTgICAgBAICBgSAgIDABAMABgQgICDgBwICBgSAgIDAgICABwMABgQgICDgICAgBAQAAwTwICAgBAQABgQgICDwBwQABgQgICDwICAgAwQABATwAPAHAgEGBMDAwMDAwMAFAgIEBMCAwICABAMBAwTgwMDABQMBBATggODAwAUDAAQE4CDgICAEAwADBOBgYGAFAwAEBOAg4GBgBQICBgSAgMCAwAQDAQYEwMDA4AUDAQYEwMDggOAFAwAGBCAg4CDgBAMABgRgYGDgBQMABgRgYOAg4AcCAgYEgIDAgMCAgAcDAQYEwMDA4MDAwAcDAQYEwMDggODAwAcDAAYEICDgIOAgIAcDAAYEYGBg4GBgYAcDAAYEYGDgIOBgYAUEAAQE8ADwICAEBAADBPBgYGAFBAAEBPAA8GBgBQQABgQgIPAA8AQEAAYEYGBg8AUEAAYEYGDwAPAHBAAGBCAg8CDwICAHBAAGBGBgYPBgYGAHBAAGBGBg8ADwYGAEBAAGBPDw8PADBAACBPDw8AcEAAYE8PDw8PDw8AcCAAYEwMDAwMDAwAcCAgYEwMDAwMDAwAcDAAYEoACgAKAAoAcEAAYEoFCgUKBQoAcEAAYE8KDwoPCg8AQDAQQE4ODg4AIDAQME4OAEBAAEBGBg8PAEBAAEBMDw8MAEBAAFBPDwYGAEBAAEBDDw8DAEBAAEBGCQkGAHBAAGBPDw8JCQ8PAHBAAGBPDwkGBgkPAGBAAGBGCQ8JDwYAYEAAYEYPCQ8JBgAwMBBATgoOAHBAAGBGCQkGAgcCAHBAAGBBAwEHCQkGAGBAAFBGDw8CAgcAcEAAYEIHCg8CAgcAUEAAYEkPDw8GAFAwEFBEDg4OBABgQABgRgUEBAwMAHBAAGBDBQUFBw8MAAAAAABQYBAgYFgICAgACAAgMBBgWgoAUFAAUFKPhQ+KAHAwEGBUDgwEBg4EAGBQAGBUiocHCokAYFAAYFIFBgqJBoAgECBgWAgAcEAQYFMECAgIBAMAcEAAYFwCAQEBAgwAQDAQYFQKBAoAMDAQMFQOBAAwIBAQVAQIABAwEDBeABAQIBBYAHBAEGBRAgIEBAgIAGBAEGBWCQkJCQYAYDAQYFQMBAQEDgBgMBBgXAICBAgOAGAwEGBcAgwCAgwAYEAQYFIGCg8CAgBgMBBgXggMAgIMAGBAEGBWCA4JCQYAYEAQYF8BAgQEBABgQBBgVgkGCQkGAGBAEGBWCQkHAQYAQBAgQFgAAAgAYCAQQFQAAAQECABQQBBQUQIMAgEAMEAQQF8ADwBQQBBQWAQDBAgAYEAQYF4BAgQABABwUABgUwSJiouIB4BQUABQUgUFD4iAUDAQUF4KDAoOAFBAEFBXCAgIBwBQQBBQXgkJCQ4AUDAQUF4IDggOAFAwEFBeCA4ICABQQBBQVwgLCQcAUEAQUFkJDwkJAFAwEFBeBAQEDgBQMBBQXgICAgwAUEAQUFkKDAoJAFBAEFBYCAgIDwBQUABQWI2KioiAUEAQUFkNCwkJAFBQAFBXCIiIhwBQQBBQXgkOCAgAcFAAUFcIiIiHAQCAUEAQUFwKDAoJAF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AAMCgQgIAQEAAwKBAAAACAADAAEAAAAEAAAABQAOABUAHgAoADEAOgBBAEsAVQBdAGUAbAByAHgAggCLAJQAnQCmAK8AuADBAMoA0wDcAOQA7QD1AP0BBQEOARgBIQEqATMBPAFFAU4BVwFgAWkBcgF7AYQBjQGWAZ8BqAGyAbsBxAHNAdYB3wHoAfEB+gIDAg0CFwIhAigCLgI1Aj0CRgJOAlcCXwJoAnECegKDAo0ClgKfAqcCrwK3AsACyQLRAtkC4gLqAvIC+gMCAwsDEwMdAycDMQM4A0EDSgNUA10DZgNvA3gDgQOKA5MDnAOlA64DtwPAA8kD0gPbA+QD7QP2A/8ECAQRBBoEIwQsBDUEPgRHBFAEWQRjBGsEdQR+BIgEjwSZBKIEqwS1BLwEwwTJBNME3ATlBO0E9gUABQoFEwUcBSUFLgU3BT8FSQVRBVkFYgVqBXIFewWFBYwFlgWgBakFsgW6BcIFyAXNBdYF3wXoBfEF+QX/BgUGDAYTBhoGIQYrBjQGPgZHBk8GWAZhBmoGcwZ9BoQGiwaSBpwGpQauBrcGwAbJBtIG2wbkBu0G9gb/BwgHEQcaByMHKwcyBzkHPwdGB0wHVAdaB2AHZgdtB3YHfweIB5EHmgejB60Htge/B8gH0gfbB+UH6wfzB/sIAwgLCBUIHwgpCDIIOwhFCE4IWAhhCGoIcwh8CIUIjgiUCJoIoAipCLIIuwjECM4I1wjgCOkI8gj7CQQJDQkWCR8JKAkxCToJQwlMCVYJXwloCXEJegmECY0JlwmhCasJtAm9CcYJzwnYCeEJ6gnzCfwKBQoPChkKIgosCjUKPwpJClMKWwpkCm0KdwqBCooKkwqcCqUKrgq3CsEKygrTCtwK5QrvCvgLAQsKCxMLHAslCy4LNwtAC0oLUwtcC2ULbgt3C4ALiQuTC50LpguvC7gLwQvKC9ML3AvlC+4L9wwADAkMEgwbDCUMLgw3DEAMSQxTDFwMZQxuDHcMgAyJDJIMmwykDK0Mtgy/DMYMzQzWDNwM5QzuDPcNAA0JDRINGw0kDS0NNg0/DUgNUQ1aDWMNbA11DX4Nhw2QDZkNog2rDbQNvQ3GDc8N2Q3iDesN9A39DgYODw4YDiIOKw40DjwORg5PDlgOYA5qDnMOfA6EDowOlQ6eDqYOsA64DsEOyg7SDtoO4g7sDvUO/w8H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AIsAnQCpAKQBAACKAQEAgwCTAPAA8QCNAJcAiAECANwA7wCeAKoA8wDyAPQAogCtAMgAxgCuAGIAYwCQAGQAygBlAMcAyQDOAMsAzADNAOcAZgDRAM8A0ACvAGcA7gCRANQA0gDTAGgA6QDrAIkAagBpAGsAbQBsAG4AoABvAHEAcAByAHMAdQB0AHYAdwDoAHgAegB5AHsAfQB8ALgAoQB/AH4AgACBAOoA7AC6AQMBBAEFAQYBBwEIAPsA/AEJAQoBCwEMAP0A/gENAQ4BDwD/ARABEQESARMBFAEVARYBFwEYARkBGgEbAPYA9wEcAR0BHgEfASABIQEiASMBJAElASYBJwEoASkBKgErAPgA1QEsAS0BLgEvATABMQEyATMBNAE1ATYBNwE4ATkBOgDgAOEBOwE8AT0BPgE/AUABQQFCAUMBRAFFAUYBRwFIAUkAsACxAUoBSwFMAU0BTgFPAVABUQFSAVMA+QD6AOIA4wFUAVUBVgFXAVgBWQFaAVsBXAFdAV4BXwFgAWEBYgFjAWQBZQFmAWcBaAFpALsBagFrAWwBbQDkAOUBbgDWAN8A2QDaANsA3gDXAN0BkgGTAZQBlQGWAZcBmAGZAZoBmwGcAZ0BngGfAaABoQGiAaMBpAGlAaYBpwGoAakBqgGrAawBrQGuAJsBrwGwAbEBsgGzAbQBtQG2AbcBuAG5AboBuwG8ALIAswIjAiQAtgC3AMMAtAC1AMQAggDBAIcA9QIpAJkA7QDCAKUAkgI3AI8COQC5AnQAAP/hAAD/5wAA/9sFAwUiBD4EVgXIBe0GKwZE/nX+XADFANIAlAC5BlAAr///////////BcgA3gZEAUL/////////////////////////////////////////////////////AIkAof///////wDKAPcFNACtAKwAuwCoALoEJQAZAaMA3gAyAPcCHwCWAXAAewBjAqYC5P7YAIgBKAFBAh8ApQA6AKYArQJpALQAKwCtAFz+uQB8AEwAbwB+ALkAhwDkAKsAfwKaBkQA9wEoBKACgQBKAtoDAwAZAUEBKAD3AIgAqAIG/lAGUADNAGkAlQB4sR8PLCMgiopFUFghIRtFRFktLEtSWEVEGyEhWS0AAAAAAgEAAAAD0gUAAAMABwAAIREhESUhESEBAALS/W4CUv2uBQD7AEAE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BNIAjQTSAI0E0gCNBNIAjQTSAK0E0gCtBNIArQTSAK0E0gC2BNIAaQTSAGkE0gBpBNIAaQTSAGkE0gCwBNIAsATSALAE0gCwBNIAxQTSAYgE0gDFBNIA+wTSANkE0gFBBNIAfQTSAL8E0gCtBNIAPgTSAGAE0gFyBNIBHATSAFYE0gAABNIAPgTSABkE0gBWBNIAVgTSAFYE0gAyBNIAtgTSAKwE0gAwBNIARATSADgE0gDtBNIA7QTSAN4E0gAxBNIAMQTSAGkE0gCUBNIB7QTSAFYE0gAABNIAJwTSAFYE0gAfBNIAdQTSAIwE0gBrBNIAAATSAAwE0gAMBNIAPgTSAEoE0gAxBNIAiATSAD4E0gD3BNIA9wTSAdUE0gHVBNIAVgTSABkE0gBVBNIAIATSAG8E0gFbBNIBWwTSAHsE0gB7BNIAxQTSAUEE0gHVBNIA9wTSAAAE0gAMBNIA2ATSAAwE0gDYBNIA2ATSAK0E0gCtBNIArQTSAK0E0gA+BNIAPgTSAD4E0gCZBNIAmQTSAJkE0gCtBNIBAwTSARwE0gEoBNIBHATSAfoE0gG0BNIB7wTSAUAE0gGmBNIBAwTSAAAE0gCtBNIApATSALsE0gBjBNIAiATSAh8E0gAGBNIAcATSACAE0gBVBNIA5ATSALME0gBWBNIATATSAVcE0gEuBNIBOQTSAAAE0gAABNIAKgTSABkE0gBNBNIAewTSAK0E0gCkBNIAuwTSAGYE0gCjBNIAZgTSAKME0gB/BNIA0gTSAAAE0gHtBNIADATSAIgE0gAMBNIAiATSAAwE0gCIBNIAZgTSAKME0gBmBNIAowTSAIIE0gBRBNIABgTSANgE0gCNBNIA2ATSAI0E0gDYBNIAjQTSANgE0gCNBNIA2ATSAI0E0gBNBNIAewTSAE0E0gB7BNIATQTSAHsE0gCUBNIAtgTSABkE0gAiBNIArQTSAK0E0gCtBNIArQTSAK0E0gCtBNIArQTSAK0E0gAxBNIAPgTSAMUE0gCUBNIAqgTSANUE0gD1BNIA3gTSAK0E0gDeBNIArQTSAN4E0gCUBNIA3gTSAK0E0gCUBNIAtgTSAJQE0gC2BNIAlATSALYE0gBTBNIAlATSALYE0gA+BNIAaQTSAD4E0gBpBNIAPgTSAGkE0gC4BNIBNATSALgE0gElBNIAuATSATQE0gCk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AVYBVwFYAVkBWgFbAVwBXQFeAV8BYAFhAWIBYwFkAWUBZgFnAWgBaQFqAWsBbAFtAW4BbwFwAXEBcgFzAXQBdQF2AXcBeAF5AXoBewF8AX0BfgF/AYABgQGCAYMBhAGFAYYBhwGIAYkBigGLAYwBjQGOAY8BkAGRAZIBkwGUAZUBlgGXAZgBmQGaAZsBnAGdAZ4BnwGgAaEBogGjAaQBpQGmAacBqAGpAaoBqwGsAa0BrgGvAbABsQGyAbMBtAG1AbYBtwG4AbkBugG7AbwBvQG+Ab8BwAHBAcIBwwHEAcUBxgHHAcgByQHKAcsBzAHNAc4BzwHQAdEB0gHTAdQB1QHWAdcB2AHZAdoB2wHcAd0B3gHfAeAB4QHiAeMB5AHlAeYB5wHoAekB6gHrAewB7QHuAe8B8AHxAfIB8wH0AfUB9gH3AfgB+QH6AfsB/AH9Af4B/wIAAgECAgIDAgQCBQIGAgcCCAIJAgoCCwIMAg0CDgIPAhACEQISAhMCFAIVAhYCFwIYAhkCGgIbAhwCHQIeAh8CIAIhAiICIwIkAiUCJgInAigCKQIqAisCLAItAi4CLwIwAjECMgIzAjQCNQI2AjcCOAI5AjoCOwI8Aj0CPgI/AkACQQJCAkMCRAJFAkYCRwJIAkkCSgJLAkwCTQJOAk8CUAJRAlICUwJUAlUCVgJXAlgCWQJaAlsCXAJdAl4CXwJgAmECYgJjAmQCZQJmAmcCaAJpAmoCawJsAm0CbgJvAnACcQJyAnMCdAJ1AnYCdwJ4AnkCegJ7AnwCfQJ+An8CgAKBAoICgwKEAoUChgKHAogCiQKKAosCjAKNAo4CjwKQApECkgKTApQClQKWApcCmAKZApoCmwKcAp0CngKfAqACoQKiAqMCpAKlAqYCpwKoAqkCqgKrAqwCrQKuAq8CsAKxArICswK0ArUCtgK3ArgCuQK6ArsCvAK9Ar4CvwLAAsECwgLDAsQCxQLGAscCyALJAsoCywLMAs0CzgLPAtAC0QLSAtMC1ALVAtYC1wLYAtkC2gLbAtwC3QLeAt8C4ALhAuIC4wLkAuUC5gLnAugC6QLqAusC7ALtAu4C7wLwAvEC8gLzAvQC9QL2AvcC+AL5AvoC+wL8Av0C/gL/AwADAQMCAwMDBAMFAwYDBwMIAwkDCgMLAwwDDQMOAw8DEAMRAxIDEwMUAxUDFgMXAxgDGQMaAxsDHAMdAx4DHwMgAyEDIgMjAyQDJQMmAycDKAMpAyoDKwMsAy0DLgMvAzADMQMyAzMDNAM1AzYDNwM4AzkDOgM7AzwDPQM+Az8DQANBA0IDQwNEA0UDRgNHA0gDSQNKA0sDTANNA04DTwNQA1EDUgNTA1QDVQNWA1cDWANZA1oDWwNcA10DXgNfA2ADYQNiA2MDZANlA2YDZwNoA2kDagNrA2wDbQNuA28DcANxA3IDcwN0A3UDdgN3A3gDeQN6A3sDfAN9A34DfwOAA4EDggODA4QDhQOGA4cDiAOJA4oDiwOMA40DjgOPA5ADkQOSA5MDlAOVA5YDlwVzcGFjZQZleGNsYW0IcXVvdGVkYmwKbnVtYmVyc2lnbgZkb2xsYXIHcGVyY2VudAlhbXBlcnNhbmQLcXVvdGVzaW5nbGUJcGFyZW5sZWZ0CnBhcmVucmlnaHQIYXN0ZXJpc2sEcGx1cwVjb21tYQZoeXBoZW4GcGVyaW9kBXNsYXNoBHplcm8Db25lA3R3bwV0aHJlZQRmb3VyBGZpdmUDc2l4BXNldmVuBWVpZ2h0BG5pbmUFY29sb24Jc2VtaWNvbG9uBGxlc3MFZXF1YWwHZ3JlYXRlcghxdWVzdGlvbgJhdAFBAUIBQwFEAUUBRgFHAUgBSQFKAUsBTAFNAU4BTwFQAVEBUgFTAVQBVQFWAVcBWAFZAVoLYnJhY2tldGxlZnQJYmFja3NsYXNoDGJyYWNrZXRyaWdodAthc2NpaWNpcmN1bQp1bmRlcnNjb3JlBWdyYXZlAWEBYgFjAWQBZQFmAWcBaAFpAWoBawFsAW0BbgFvAXABcQFyAXMBdAF1AXYBdwF4AXkBeglicmFjZWxlZnQDYmFyCmJyYWNlcmlnaHQKYXNjaWl0aWxkZQlBZGllcmVzaXMFQXJpbmcIQ2NlZGlsbGEGRWFjdXRlBk50aWxkZQlPZGllcmVzaXMJVWRpZXJlc2lzBmFhY3V0ZQZhZ3JhdmULYWNpcmN1bWZsZXgJYWRpZXJlc2lzBmF0aWxkZQVhcmluZwhjY2VkaWxsYQZlYWN1dGUGZWdyYXZlC2VjaXJjdW1mbGV4CWVkaWVyZXNpcwZpYWN1dGUGaWdyYXZlC2ljaXJjdW1mbGV4CWlkaWVyZXNpcwZudGlsZGUGb2FjdXRlBm9ncmF2ZQtvY2lyY3VtZmxleAlvZGllcmVzaXMGb3RpbGRlBnVhY3V0ZQZ1Z3JhdmULdWNpcmN1bWZsZXgJdWRpZXJlc2lzBmRhZ2dlcgZkZWdyZWUEY2VudAhzdGVybGluZwdzZWN0aW9uBmJ1bGxldAlwYXJhZ3JhcGgKZ2VybWFuZGJscwpyZWdpc3RlcmVkCWNvcHlyaWdodAl0cmFkZW1hcmsFYWN1dGUIZGllcmVzaXMIbm90ZXF1YWwCQUUGT3NsYXNoCGluZmluaXR5CXBsdXNtaW51cwlsZXNzZXF1YWwMZ3JlYXRlcmVxdWFsA3llbgVtaWNybwtwYXJ0aWFsZGlmZglzdW1tYXRpb24HcHJvZHVjdAJwaQhpbnRlZ3JhbAtvcmRmZW1pbmluZQxvcmRtYXNjdWxpbmUDb2htAmFlBm9zbGFzaAxxdWVzdGlvbmRvd24KZXhjbGFtZG93bgpsb2dpY2Fsbm90B3JhZGljYWwHZnNjcmlwdAthbG1vc3RlcXVhbAlpbmNyZW1lbnQNZ3VpbGxlbW90bGVmdA5ndWlsbGVtb3RyaWdodAhlbGxpcHNpcwduYnNwYWNlBkFncmF2ZQZBdGlsZGUGT3RpbGRlAk9FAm9lBmVuZGFzaAZlbWRhc2gMcXVvdGVkYmxsZWZ0DXF1b3RlZGJscmlnaHQJcXVvdGVsZWZ0CnF1b3RlcmlnaHQGZGl2aWRlB2xvemVuZ2UJeWRpZXJlc2lzCVlkaWVyZXNpcwhjdXJyZW5jeQ1ndWlsc2luZ2xsZWZ0Dmd1aWxzaW5nbHJpZ2h0AmZpAmZsCWRhZ2dlcmRibApidWxsZXRtYXRoDnF1b3Rlc2luZ2xiYXNlDHF1b3RlZGJsYmFzZQtwZXJ0aG91c2FuZAtBY2lyY3VtZmxleAtFY2lyY3VtZmxleAZBYWN1dGUJRWRpZXJlc2lzBkVncmF2ZQZJYWN1dGULSWNpcmN1bWZsZXgJSWRpZXJlc2lzBklncmF2ZQZPYWN1dGULT2NpcmN1bWZsZXgGT2dyYXZlBlVhY3V0ZQtVY2lyY3VtZmxleAZVZ3JhdmUIZG90bGVzc2kKY2lyY3VtZmxleAV0aWxkZQZtYWNyb24FYnJldmUJZG90YWNjZW50BHJpbmcHY2VkaWxsYQxodW5nYXJ1bWxhdXQGb2dvbmVrBWNhcm9uBkxzbGFzaAZsc2xhc2gGU2Nhcm9uBnNjYXJvbgZaY2Fyb24GemNhcm9uCWJyb2tlbmJhcgNFdGgDZXRoBllhY3V0ZQZ5YWN1dGUFVGhvcm4FdGhvcm4FbWludXMIbXVsdGlwbHkLb25lc3VwZXJpb3ILdHdvc3VwZXJpb3INdGhyZWVzdXBlcmlvcgdvbmVoYWxmCm9uZXF1YXJ0ZXINdGhyZWVxdWFydGVycwVmcmFuYwZHYnJldmUGZ2JyZXZlBElkb3QIU2NlZGlsbGEIc2NlZGlsbGEGQ2FjdXRlBmNhY3V0ZQZDY2Fyb24GY2Nhcm9uB2RtYWNyb24Jc2Z0aHlwaGVuCW92ZXJzY29yZQZtaWRkb3QHQW1hY3JvbgdhbWFjcm9uBkFicmV2ZQZhYnJldmUHQW9nb25lawdhb2dvbmVrC0NjaXJjdW1mbGV4C2NjaXJjdW1mbGV4BENkb3QEY2RvdAZEY2Fyb24GZGNhcm9uB0RtYWNyb24HRW1hY3JvbgdlbWFjcm9uBkVicmV2ZQZlYnJldmUERWRvdARlZG90B0VvZ29uZWsHZW9nb25lawZFY2Fyb24GZWNhcm9uC0djaXJjdW1mbGV4C2djaXJjdW1mbGV4BEdkb3QEZ2RvdAhHY2VkaWxsYQhnY2VkaWxsYQtIY2lyY3VtZmxleAtoY2lyY3VtZmxleARIYmFyBGhiYXIGSXRpbGRlBml0aWxkZQdJbWFjcm9uB2ltYWNyb24GSWJyZXZlBmlicmV2ZQdJb2dvbmVrB2lvZ29uZWsCSUoCaWoLSmNpcmN1bWZsZXgLamNpcmN1bWZsZXgIS2NlZGlsbGEIa2NlZGlsbGEDa3JhBkxhY3V0ZQZsYWN1dGUITGNlZGlsbGEIbGNlZGlsbGEGTGNhcm9uBmxjYXJvbgRMZG90BGxkb3QGTmFjdXRlBm5hY3V0ZQhOY2VkaWxsYQhuY2VkaWxsYQZOY2Fyb24GbmNhcm9uC25hcG9zdHJvcGhlA0VuZwNlbmcHT21hY3JvbgdvbWFjcm9uBk9icmV2ZQZvYnJldmUJT2RibGFjdXRlCW9kYmxhY3V0ZQZSYWN1dGUGcmFjdXRlCFJjZWRpbGxhCHJjZWRpbGxhBlJjYXJvbgZyY2Fyb24GU2FjdXRlBnNhY3V0ZQtTY2lyY3VtZmxleAtzY2lyY3VtZmxleAhUY2VkaWxsYQh0Y2VkaWxsYQZUY2Fyb24GdGNhcm9uBFRiYXIEdGJhcgZVdGlsZGUGdXRpbGRlB1VtYWNyb24HdW1hY3JvbgZVYnJldmUGdWJyZXZlBVVyaW5nBXVyaW5nCVVkYmxhY3V0ZQl1ZGJsYWN1dGUHVW9nb25lawd1b2dvbmVrC1djaXJjdW1mbGV4C3djaXJjdW1mbGV4C1ljaXJjdW1mbGV4C3ljaXJjdW1mbGV4BlphY3V0ZQZ6YWN1dGUEWmRvdAR6ZG90BXNsb25nCkFhY3V0ZXJpbmcKYWFjdXRlcmluZwdBRWFjdXRlB2FlYWN1dGULT3NsYXNoYWN1dGULb3NsYXNoYWN1dGUNcXVlc3Rpb25ncmVlawV0b25vcw5kaWFlcmVzaXN0b25vcwpBbHBoYXRvbm9zCWFub3RlbGVpYQxFcHNpbG9udG9ub3MIRXRhdG9ub3MJSW90YXRvbm9zDE9taWNyb250b25vcwxVcHNpbG9udG9ub3MKT21lZ2F0b25vcxJpb3RhZGlhZXJlc2lzdG9ub3MFQWxwaGEEQmV0YQVHYW1tYQVEZWx0YQdFcHNpbG9uBFpldGEDRXRhBVRoZXRhBElvdGEFS2FwcGEGTGFtYmRhAk11Ak51AlhpB09taWNyb24CUGkDUmhvBVNpZ21hA1RhdQdVcHNpbG9uA1BoaQNDaGkDUHNpBU9tZWdhDUlvdGFkaWFlcmVzaXMQVXBzaWxvbmRpYWVyZXNpcwphbHBoYXRvbm9zDGVwc2lsb250b25vcwhldGF0b25vcwlpb3RhdG9ub3MVdXBzaWxvbmRpYWVyZXNpc3Rvbm9zBWFscGhhBGJldGEFZ2FtbWEFZGVsdGEHZXBzaWxvbgR6ZXRhA2V0YQV0aGV0YQRpb3RhBWthcHBhBmxhbWJkYQJtdQJudQJ4aQdvbWljcm9uA3JobwpzaWdtYWZpbmFsBXNpZ21hA3RhdQd1cHNpbG9uA3BoaQNjaGkDcHNpBW9tZWdhDWlvdGFkaWFlcmVzaXMQdXBzaWxvbmRpYWVyZXNpcwxvbWljcm9udG9ub3MMdXBzaWxvbnRvbm9zCm9tZWdhdG9ub3MCSW8DRGplA0dqZQZFY3lyaWwDRHplBkljeXJpbAJZaQJKZQNMamUDTmplBFRzaGUDS2plC1VjeXJpbGJyZXZlBER6aGUGQWN5cmlsAkJlAlZlAkdlAkRlAkllA1poZQJaZQJJaQdJaWJyZXZlAkthAkVsAkVtAkVuBk9jeXJpbAdQZWN5cmlsAkVyAkVzAlRlBlVjeXJpbAJFZgNLaGEDVHNlA0NoZQNTaGEFU2hjaGEESGFyZARZZXJpBFNvZnQJRWN5cmlscmV2Akl1AklhBmFjeXJpbAJiZQJ2ZQJnZQJkZQJpZQN6aGUCemUCaWkHaWlicmV2ZQJrYQJlbAJlbQJlbgZvY3lyaWwHcGVjeXJpbAJlcgJlcwJ0ZQZ1Y3lyaWwCZWYDa2hhA3RzZQNjaGUDc2hhBXNoY2hhBGhhcmQEeWVyaQRzb2Z0CWVjeXJpbHJldgJpdQJpYQJpbwNkamUDZ2plBmVjeXJpbANkemUGaWN5cmlsAnlpAmplA2xqZQNuamUEdHNoZQNramULdWN5cmlsYnJldmUEZHpoZQhHZXVwdHVybghnZXVwdHVybgZXZ3JhdmUGd2dyYXZlBldhY3V0ZQZ3YWN1dGUJV2RpZXJlc2lzCXdkaWVyZXNpcwZZZ3JhdmUGeWdyYXZlCXF1b3RlZGFzaA11bmRlcnNjb3JlZGJsCWV4Y2xhbWRibApvdmVyc2NvcmUxCWZyYWN0aW9uMQluc3VwZXJpb3IEbGlyYQdwZXNldGFzBm51bWVybwlvbmVlaWdodGgMdGhyZWVlaWdodGhzC2ZpdmVlaWdodGhzDHNldmVuZWlnaHRocwlhcnJvd2xlZnQHYXJyb3d1cAphcnJvd3JpZ2h0CWFycm93ZG93bglhcnJvd2JvdGgJYXJyb3d1cGRuDGFycm93dXBkbmJzZQpyaWdodGFuZ2xlDGludGVyc2VjdGlvbgtlcXVpdmFsZW5jZQVob3VzZQ1yZXZsb2dpY2Fsbm90CmludGVncmFsdHAKaW50ZWdyYWxidAQyNTAwBDI1MDIEMjUwYwQyNTEwBDI1MTQEMjUxOAQyNTFjBDI1MjQEMjUyYwQyNTM0BDI1M2MEMjU1MAQyNTUxBDI1NTIEMjU1MwQyNTU0BDI1NTUEMjU1NgQyNTU3BDI1NTgEMjU1OQQyNTVhBDI1NWIEMjU1YwQyNTVkBDI1NWUEMjU1ZgQyNTYwBDI1NjEEMjU2MgQyNTYzBDI1NjQEMjU2NQQyNTY2BDI1NjcEMjU2OAQyNTY5BDI1NmEEMjU2YgQyNTZjB3VwYmxvY2sHZG5ibG9jawVibG9jawdsZmJsb2NrB3J0YmxvY2sHbHRzaGFkZQVzaGFkZQdka3NoYWRlCWZpbGxlZGJveApmaWxsZWRyZWN0B3RyaWFndXAHdHJpYWdydAd0cmlhZ2RuB3RyaWFnbGYGY2lyY2xlCWludmJ1bGxldAlpbnZjaXJjbGUJc21pbGVmYWNlDGludnNtaWxlZmFjZQNzdW4GZmVtYWxlBG1hbGUFc3BhZGUEY2x1YgVoZWFydAdkaWFtb25kC211c2ljYWxub3RlDm11c2ljYWxub3RlZGJsC2NpcmN1bWZsZXgxBnRpbGRlMQlkaWVyZXNpczEGYnJldmUxBXJpbmcxCGNlZGlsbGExDWh1bmdhcnVtbGF1dDEGY2Fyb24xBmFjdXRlMQZncmF2ZTEIY2VkaWxsYTIJS2NlZGlsbGExCWtjZWRpbGxhMQlMY2VkaWxsYTEJbGNlZGlsbGExCU5jZWRpbGxhMQluY2VkaWxsYTEJUmNlZGlsbGExCXJjZWRpbGxhMQlTY2VkaWxsYTEJc2NlZGlsbGExCVRjZWRpbGxhMQl0Y2VkaWxsYTFARhoKZB9aTCMfPwgjHw8OIx8NDCMfCwovHwoGDR8FBCUfAwIvHwkIPB8BAC8fBwYvH2NiWg9dW+APXnjgD3hbVA9NEqAPPRK4ASBAOw88EvAPOzrgD1MSEx9REBkfRBCgD3IV0g9iEGAPXxDgD1gQYA9WEOAPVBDgDz4Q4A86ELQPNxDgDzIzuAEgQA8PMxCCDxUQ4A8TEOAPERC4AUBAGw8SEJ4PEBISHw8ccBxwHYAdBB8GbwafBgMyAbkB/wAIS1NYsAGwAY5ZhY1LU1iwgB1Zc3MBKysrKysrKysrKysrKysrKysrKwArKysrKysrKysrKysrKysrKysrKwAA\"); \n", "}\n", - "]]>HewasadvisedchestX-rayMISCorCTscanaftercheckinghisSpO2MISCwhichwas<=93%OVERLAP" + "]]>HewasadvisedchestX-rayMISCorCTscanaftercheckinghisSpO2MISCwhichwas<=93%OVERLAP" ] }, "metadata": {} } ] + }, + { + "cell_type": "code", + "source": [], + "metadata": { + "id": "3JdCqYL8ToXp" + }, + "execution_count": null, + "outputs": [] } ] } \ No newline at end of file