diff --git a/conda/meta.yaml b/conda/meta.yaml index 685683af5..e96aecd12 100644 --- a/conda/meta.yaml +++ b/conda/meta.yaml @@ -1,5 +1,5 @@ {% set name = "nlptest" %} -{% set version = "1.4.0" %} +{% set version = "1.5.0" %} package: name: {{ name|lower }} @@ -7,7 +7,7 @@ package: source: url: https://pypi.io/packages/source/{{ name[0] }}/{{ name }}/nlptest-{{ version }}.tar.gz - sha256: e2e28f9c3d0f35e3e3c07bebadb25b52fdd4f22e8ff4939d343cb68d4984d8ff + sha256: 556ac72ef3e8a1c1851bbfe8d22e4312f01e7607d6d3a44775279766744ff9e2 build: number: 0 diff --git a/demo/tutorials/end-to-end-notebooks/JohnSnowLabs_RealWorld_Custom_Pipeline_Notebook.ipynb b/demo/tutorials/end-to-end-notebooks/JohnSnowLabs_RealWorld_Custom_Pipeline_Notebook.ipynb index 479ac7613..3dded2a77 100644 --- a/demo/tutorials/end-to-end-notebooks/JohnSnowLabs_RealWorld_Custom_Pipeline_Notebook.ipynb +++ b/demo/tutorials/end-to-end-notebooks/JohnSnowLabs_RealWorld_Custom_Pipeline_Notebook.ipynb @@ -82,7 +82,7 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": null, "metadata": { "id": "lTzSJpMlhgq5" }, @@ -105,11 +105,11 @@ "
\n", "\n", "\n", - "| Parameter | Description | \n", - "| - | - | \n", + "| Parameter | Description |\n", + "| - | - |\n", "|**task** |Task for which the model is to be evaluated (text-classification or ner)|\n", "|**model** |PipelineModel or path to a saved model or pretrained pipeline/model from hub.\n", - "|**data** |Path to the data that is to be used for evaluation. Can be .csv or .conll file in the CoNLL format \n", + "|**data** |Path to the data that is to be used for evaluation. Can be .csv or .conll file in the CoNLL format\n", "|**config** |Configuration for the tests to be performed, specified in form of a YAML file.\n", "|**hub** |model hub to load from the path. Required if model param is passed as path.|\n", "\n", @@ -142,7 +142,7 @@ "\n", "2. Test NER model robustness on CoNLL test set\n", "\n", - "3. Augment CoNLL training set based on test results \n", + "3. Augment CoNLL training set based on test results\n", "\n", "4. Train new NER model on augmented CoNLL training set\n", "\n", @@ -186,7 +186,7 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": null, "metadata": { "colab": { "base_uri": "https://localhost:8080/" @@ -214,7 +214,7 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": null, "metadata": { "colab": { "base_uri": "https://localhost:8080/" @@ -268,7 +268,7 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": null, "metadata": { "colab": { "base_uri": "https://localhost:8080/" @@ -315,7 +315,7 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": null, "metadata": { "colab": { "base_uri": "https://localhost:8080/" @@ -351,7 +351,7 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": null, "metadata": { "colab": { "base_uri": "https://localhost:8080/" @@ -399,7 +399,7 @@ }, { "cell_type": "code", - "execution_count": 10, + "execution_count": null, "metadata": { "id": "RVk9NWn7u-Lm" }, @@ -410,7 +410,7 @@ }, { "cell_type": "code", - "execution_count": 11, + "execution_count": null, "metadata": { "colab": { "base_uri": "https://localhost:8080/" @@ -436,9 +436,9 @@ "harness.configure({\n", " 'tests': {\n", " 'defaults': {'min_pass_rate': 0.65},\n", - " \n", + "\n", " 'robustness': {\n", - " 'lowercase': {'min_pass_rate': 0.60}, \n", + " 'lowercase': {'min_pass_rate': 0.60},\n", " 'uppercase':{'min_pass_rate': 0.60}\n", " }\n", " }\n", @@ -468,7 +468,7 @@ }, { "cell_type": "code", - "execution_count": 12, + "execution_count": null, "metadata": { "colab": { "base_uri": "https://localhost:8080/" @@ -508,7 +508,7 @@ }, { "cell_type": "code", - "execution_count": 13, + "execution_count": null, "metadata": { "colab": { "base_uri": "https://localhost:8080/", @@ -791,7 +791,7 @@ }, { "cell_type": "code", - "execution_count": 14, + "execution_count": null, "metadata": { "id": "XYIMxVN8GFGH" }, @@ -811,7 +811,7 @@ }, { "cell_type": "code", - "execution_count": 15, + "execution_count": null, "metadata": { "colab": { "base_uri": "https://localhost:8080/" @@ -851,7 +851,7 @@ }, { "cell_type": "code", - "execution_count": 16, + "execution_count": null, "metadata": { "colab": { "base_uri": "https://localhost:8080/", @@ -1162,7 +1162,7 @@ }, { "cell_type": "code", - "execution_count": 17, + "execution_count": null, "metadata": { "colab": { "base_uri": "https://localhost:8080/", @@ -1345,7 +1345,7 @@ }, { "cell_type": "code", - "execution_count": 18, + "execution_count": null, "metadata": { "colab": { "base_uri": "https://localhost:8080/" @@ -1387,7 +1387,7 @@ }, { "cell_type": "code", - "execution_count": 19, + "execution_count": null, "metadata": { "colab": { "base_uri": "https://localhost:8080/" @@ -1440,7 +1440,7 @@ }, { "cell_type": "code", - "execution_count": 20, + "execution_count": null, "metadata": { "colab": { "base_uri": "https://localhost:8080/" @@ -1478,7 +1478,7 @@ }, { "cell_type": "code", - "execution_count": 21, + "execution_count": null, "metadata": { "colab": { "base_uri": "https://localhost:8080/" @@ -1514,7 +1514,7 @@ }, { "cell_type": "code", - "execution_count": 22, + "execution_count": null, "metadata": { "colab": { "base_uri": "https://localhost:8080/" @@ -1571,7 +1571,7 @@ }, { "cell_type": "code", - "execution_count": 23, + "execution_count": null, "metadata": { "colab": { "base_uri": "https://localhost:8080/" @@ -1589,7 +1589,7 @@ } ], "source": [ - "harness = Harness.load(\"saved_test_configurations\",model=ner_model_2)" + "harness = Harness.load(\"saved_test_configurations\",model=ner_model_2, task=\"ner\")" ] }, { @@ -1603,7 +1603,7 @@ }, { "cell_type": "code", - "execution_count": 24, + "execution_count": null, "metadata": { "colab": { "base_uri": "https://localhost:8080/", @@ -1782,14 +1782,40 @@ "We can see that after augmentation, both tests are performing better than earlier." ] }, + { + "cell_type": "markdown", + "source": [ + "# Comparison Table ( Normal V/S Augmented Model )" + ], + "metadata": { + "id": "APU3YhhLc1hH" + } + }, + { + "cell_type": "markdown", + "source": [ + "| Model | Category | Test_Type | Fail_Count | Pass_Count | Pass_Rate | Minimum_Pass_Rate | Pass |\n", + "|------------------|------------|-----------|------------|------------|-----------|-------------------|-------|\n", + "| Initial_Model | Robustness | Lowercase | 198 | 28 | 12% | 60% | False |\n", + "| | | | | | | | |\n", + "| Initial_Model | Robustness | Uppercase | 83 | 143 | 63% | 60% | True |\n", + "| | | | | | | | |\n", + "| Augmented_Model | Robustness | Lowercase | 31 | 195 | 86% | 60% | True |\n", + "| | | | | | | | |\n", + "| Augmented_Model | Robustness | Uppercase | 39 | 187 | 83% | 60% | True |\n" + ], + "metadata": { + "id": "ooTBisOrdR7g" + } + }, { "cell_type": "code", - "execution_count": 24, + "source": [], "metadata": { - "id": "HQgkz0tOFuDV" + "id": "u007fehpdSRl" }, - "outputs": [], - "source": [] + "execution_count": null, + "outputs": [] } ], "metadata": { @@ -1807,4 +1833,4 @@ }, "nbformat": 4, "nbformat_minor": 0 -} +} \ No newline at end of file diff --git a/demo/tutorials/misc/Augementation_Control_Notebook.ipynb b/demo/tutorials/misc/Augementation_Control_Notebook.ipynb new file mode 100644 index 000000000..d710ca007 --- /dev/null +++ b/demo/tutorials/misc/Augementation_Control_Notebook.ipynb @@ -0,0 +1,1880 @@ +{ + "cells": [ + { + "attachments": {}, + "cell_type": "markdown", + "metadata": { + "id": "e7PsSmy9sCoR" + }, + "source": [ + "![image.png](data:image/png;base64,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)" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": { + "id": "MhgkQYQiEvZt" + }, + "source": [ + "[![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/JohnSnowLabs/nlptest/blob/main/demo/tutorials/misc/Augmentation_Control_Notebook.ipynb)" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": { + "id": "WJJzt3RWhEc6" + }, + "source": [ + "**nlptest** is an open-source python library designed to help developers deliver safe and effective Natural Language Processing (NLP) models. Whether you are using **John Snow Labs, Hugging Face, Spacy** models or **OpenAI, Cohere, AI21, Hugging Face Inference API and Azure-OpenAI** based LLMs, it has got you covered. You can test any Named Entity Recognition (NER), Text Classification model using the library. We also support testing LLMS for Question-Answering and Summarization tasks on benchmark datasets. The library supports 50+ out of the box tests. These tests fall into robustness, accuracy, bias, representation, toxicity and fairness test categories.\n", + "\n", + "Metrics are calculated by comparing the model's extractions in the original list of sentences against the extractions carried out in the noisy list of sentences. The original annotated labels are not used at any point, we are simply comparing the model against itself in a 2 settings." + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": { + "id": "26qXWhCYhHAt" + }, + "source": [ + "# Getting started with nlptest on John Snow Labs" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "azUb114QhOsY" + }, + "outputs": [], + "source": [ + "!pip install nlptest" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": { + "id": "Jx4OHnOchSeC" + }, + "source": [ + "# John Snow Labs setup" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "oGIyE43uhTxH" + }, + "outputs": [], + "source": [ + "!pip install johnsnowlabs" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": { + "id": "yR6kjOaiheKN" + }, + "source": [ + "#Harness and its Parameters\n", + "\n", + "The Harness class is a testing class for Natural Language Processing (NLP) models. It evaluates the performance of a NLP model on a given task using test data and generates a report with test results.Harness can be imported from the nlptest library in the following way." + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": { + "id": "lTzSJpMlhgq5" + }, + "outputs": [], + "source": [ + "#Import Harness from the nlptest library\n", + "from nlptest import Harness" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": { + "id": "sBcZjwJBhkOw" + }, + "source": [ + "It imports the Harness class from within the module, that is designed to provide a blueprint or framework for conducting NLP testing, and that instances of the Harness class can be customized or configured for different testing scenarios or environments.\n", + "\n", + "Here is a list of the different parameters that can be passed to the Harness function:\n", + "\n", + "
\n", + "\n", + "\n", + "| Parameter | Description | \n", + "| - | - | \n", + "|**task** |Task for which the model is to be evaluated (text-classification or ner)|\n", + "|**model** |PipelineModel or path to a saved model or pretrained pipeline/model from hub.\n", + "|**data** |Path to the data that is to be used for evaluation. Can be .csv or .conll file in the CoNLL format \n", + "|**config** |Configuration for the tests to be performed, specified in form of a YAML file.\n", + "|**hub** |model hub to load from the path. Required if model param is passed as path.|\n", + "\n", + "
\n", + "
" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": { + "id": "JFhJ9CcbsKqN" + }, + "source": [ + "# Real-World Project Workflows\n", + "\n", + "In this section, we dive into complete workflows for using the model testing module in real-world project settings." + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": { + "id": "UtxtE6Y0r4CJ" + }, + "source": [ + "## Robustness Testing\n", + "\n", + "In this example, we will be testing a model's robustness. We will be applying 2 tests: add_typo and lowercase. The real-world project workflow of the model robustness testing and fixing in this case goes as follows:\n", + "\n", + "1. Train NER model on original CoNLL training set\n", + "\n", + "2. Test NER model robustness on CoNLL test set\n", + "\n", + "3. Augment CoNLL training set based on test results \n", + "\n", + "4. Train new NER model on augmented CoNLL training set\n", + "\n", + "5. Test new NER model robustness on the CoNLL test set from step 2\n", + "\n", + "6. Compare robustness of new NER model against original NER model" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": { + "id": "I21Jmq79jgC6" + }, + "source": [ + "#### Load Train and Test CoNLL" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "6uW22VqJje8E" + }, + "outputs": [], + "source": [ + "# Load test CoNLL\n", + "!wget https://raw.githubusercontent.com/JohnSnowLabs/nlptest/main/nlptest/data/conll/sample.conll\n", + "\n", + "# Load train CoNLL\n", + "!wget https://raw.githubusercontent.com/JohnSnowLabs/nlptest/main/demo/data/conll03.conll" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": { + "id": "MNtH_HOUt_PL" + }, + "source": [ + "#### Step 1: Train NER Model" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": { + "id": "jRnEmCfPhsZs" + }, + "outputs": [], + "source": [ + "from johnsnowlabs import nlp" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "bHXeP18sGp-g", + "outputId": "1bd2ea97-e002-451b-d60b-cae915c78fb6" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "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" + ] + } + ], + "source": [ + "ner_model = nlp.load('bert train.ner').fit(dataset_path=\"/content/conll03.conll\")\n" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": { + "id": "kKgXC7cvuyar" + }, + "source": [ + "#### Step 2: Test NER Model Robustness " + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": { + "id": "RVk9NWn7u-Lm" + }, + "outputs": [], + "source": [ + "harness = Harness(task=\"ner\", model=ner_model, data=\"sample.conll\", hub=\"johnsnowlabs\")" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "mynkAUwZyuFN", + "outputId": "a7b97865-fc75-4070-c5b4-0533617a7782" + }, + "outputs": [ + { + "data": { + "text/plain": [ + "{'tests': {'defaults': {'min_pass_rate': 0.65},\n", + " 'robustness': {'add_typo': {'min_pass_rate': 0.65},\n", + " 'lowercase': {'min_pass_rate': 0.65}}}}" + ] + }, + "execution_count": 18, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "harness.configure({\n", + " 'tests': {\n", + " 'defaults': {'min_pass_rate': 0.65},\n", + " \n", + " 'robustness': {\n", + " 'add_typo': {'min_pass_rate': 0.65}, \n", + " 'lowercase':{'min_pass_rate': 0.65},\n", + " }\n", + " }\n", + "})" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": { + "id": "ZPU46A7WigFr" + }, + "source": [ + "Here we have configured the harness to perform two robustness tests (add_typo and lowercase) and defined the minimum pass rate for each test." + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": { + "id": "MomLlmTwjpzU" + }, + "source": [ + "\n", + "#### Generating the test cases.\n", + "\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "UiUNzTwF89ye", + "outputId": "1ec7fe1f-c342-45da-b919-d48e8e082341" + }, + "outputs": [ + { + "data": { + "text/plain": [] + }, + "execution_count": 19, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "harness.generate()" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": { + "id": "UiMIF-o49Bg_" + }, + "source": [ + "harness.generate() method automatically generates the test cases (based on the provided configuration)" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 423 + }, + "id": "p0tTwFfc891k", + "outputId": "05b03712-2723-418a-936e-2cbbc818f215" + }, + "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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
categorytest_typeoriginaltest_caseexpected_result
0robustnessadd_typoSOCCER - JAPAN GET LUCKY WIN , CHINA IN SURPRI...SOCCER - JAPAN GET LUCKY WIN , DHINA IN SURPRI...JAPAN: B-LOC, CHINA: B-PER
1robustnessadd_typoNadim LadkiPadim LadkiNadim: B-PER, Ladki: I-PER
2robustnessadd_typoAL-AIN , United Arab Emirates 1996-12-06AL-AIN , United Arab Emirates1 996-12-06AL-AIN: B-LOC, United: B-LOC, Arab: I-LOC, Emi...
3robustnessadd_typoJapan began the defence of their Asian Cup tit...Japan began the sefence of their Asian Cup tit...Japan: B-LOC, Asian: B-MISC, Cup: I-MISC, Syri...
4robustnessadd_typoBut China saw their luck desert them in the se...But China saw their luck desert them in the se...China: B-LOC, Uzbekistan: B-LOC
..................
447robustnesslowercasePortuguesa 1 Atletico Mineiro 0portuguesa 1 atletico mineiro 0Portuguesa: B-ORG, Atletico: B-ORG, Mineiro: I...
448robustnesslowercaseCRICKET - LARA ENDURES ANOTHER MISERABLE DAY .cricket - lara endures another miserable day .LARA: B-PER
449robustnesslowercaseRobert Galvinrobert galvinRobert: B-PER, Galvin: I-PER
450robustnesslowercaseMELBOURNE 1996-12-06melbourne 1996-12-06MELBOURNE: B-LOC
451robustnesslowercaseAustralia gave Brian Lara another reason to be...australia gave brian lara another reason to be...Australia: B-LOC, Brian: B-PER, Lara: I-PER, W...
\n", + "

452 rows × 5 columns

\n", + "
\n", + " \n", + " \n", + " \n", + "\n", + " \n", + "
\n", + "
\n", + " " + ], + "text/plain": [ + " category test_type original \\\n", + "0 robustness add_typo SOCCER - JAPAN GET LUCKY WIN , CHINA IN SURPRI... \n", + "1 robustness add_typo Nadim Ladki \n", + "2 robustness add_typo AL-AIN , United Arab Emirates 1996-12-06 \n", + "3 robustness add_typo Japan began the defence of their Asian Cup tit... \n", + "4 robustness add_typo But China saw their luck desert them in the se... \n", + ".. ... ... ... \n", + "447 robustness lowercase Portuguesa 1 Atletico Mineiro 0 \n", + "448 robustness lowercase CRICKET - LARA ENDURES ANOTHER MISERABLE DAY . \n", + "449 robustness lowercase Robert Galvin \n", + "450 robustness lowercase MELBOURNE 1996-12-06 \n", + "451 robustness lowercase Australia gave Brian Lara another reason to be... \n", + "\n", + " test_case \\\n", + "0 SOCCER - JAPAN GET LUCKY WIN , DHINA IN SURPRI... \n", + "1 Padim Ladki \n", + "2 AL-AIN , United Arab Emirates1 996-12-06 \n", + "3 Japan began the sefence of their Asian Cup tit... \n", + "4 But China saw their luck desert them in the se... \n", + ".. ... \n", + "447 portuguesa 1 atletico mineiro 0 \n", + "448 cricket - lara endures another miserable day . \n", + "449 robert galvin \n", + "450 melbourne 1996-12-06 \n", + "451 australia gave brian lara another reason to be... \n", + "\n", + " expected_result \n", + "0 JAPAN: B-LOC, CHINA: B-PER \n", + "1 Nadim: B-PER, Ladki: I-PER \n", + "2 AL-AIN: B-LOC, United: B-LOC, Arab: I-LOC, Emi... \n", + "3 Japan: B-LOC, Asian: B-MISC, Cup: I-MISC, Syri... \n", + "4 China: B-LOC, Uzbekistan: B-LOC \n", + ".. ... \n", + "447 Portuguesa: B-ORG, Atletico: B-ORG, Mineiro: I... \n", + "448 LARA: B-PER \n", + "449 Robert: B-PER, Galvin: I-PER \n", + "450 MELBOURNE: B-LOC \n", + "451 Australia: B-LOC, Brian: B-PER, Lara: I-PER, W... \n", + "\n", + "[452 rows x 5 columns]" + ] + }, + "execution_count": 20, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "harness.testcases()" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": { + "id": "nRgq7e-g9Gev" + }, + "source": [ + "harness.testcases() method gives the produced test cases in form of a pandas data frame." + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": { + "id": "IaPBjl_R9slh" + }, + "source": [ + "#### Saving test configurations, data, test cases" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "metadata": { + "id": "ba0MYutC96CN" + }, + "outputs": [], + "source": [ + "harness.save(\"saved_test_configurations\")" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": { + "id": "groBqKuD9I34" + }, + "source": [ + "#### Running the tests" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "CHQHRbQb9EDi", + "outputId": "2af7ca3f-034c-4e3d-d1b5-6b029e23613a" + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Running test cases...: 100%|██████████| 452/452 [00:58<00:00, 7.66it/s]\n" + ] + }, + { + "data": { + "text/plain": [] + }, + "execution_count": 22, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "harness.run()" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": { + "id": "71zHGe2q9O6G" + }, + "source": [ + "Called after harness.generate() and is to used to run all the tests. Returns a pass/fail flag for each test." + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 423 + }, + "id": "keBNodfJ894u", + "outputId": "4b553141-0e2f-4512-f94a-108f5c92281b" + }, + "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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
categorytest_typeoriginaltest_caseexpected_resultactual_resultpass
0robustnessadd_typoSOCCER - JAPAN GET LUCKY WIN , CHINA IN SURPRI...SOCCER - JAPAN GET LUCKY WIN , DHINA IN SURPRI...japan: LOC, china: LOCjapan: LOC, dhina: PERFalse
1robustnessadd_typoNadim LadkiPadim Ladkinadim ladki: PERpadim ladki: PERTrue
2robustnessadd_typoAL-AIN , United Arab Emirates 1996-12-06AL-AIN , United Arab Emirates1 996-12-06al-ain: LOC, united arab emirates: LOCal-ain: LOC, united arab emirates1: LOCFalse
3robustnessadd_typoJapan began the defence of their Asian Cup tit...Japan began the sefence of their Asian Cup tit...japan: LOC, asian cup: MISC, syria: LOCjapan: LOC, asian cup: MISC, syria: LOCTrue
4robustnessadd_typoBut China saw their luck desert them in the se...But China saw their luck desert them in the se...china: LOC, uzbekistan: LOCchina: LOC, matsh: PER, uzbekistan: LOCFalse
........................
447robustnesslowercasePortuguesa 1 Atletico Mineiro 0portuguesa 1 atletico mineiro 0portuguesa: ORG, atletico mineiro: ORGportuguesa: ORG, atletico mineiro: ORGTrue
448robustnesslowercaseCRICKET - LARA ENDURES ANOTHER MISERABLE DAY .cricket - lara endures another miserable day .lara endures: PERlara endures: PERTrue
449robustnesslowercaseRobert Galvinrobert galvinrobert galvin: PERrobert galvin: PERTrue
450robustnesslowercaseMELBOURNE 1996-12-06melbourne 1996-12-06melbourne: LOCmelbourne: LOCTrue
451robustnesslowercaseAustralia gave Brian Lara another reason to be...australia gave brian lara another reason to be...australia: LOC, brian lara: PER, west indies: LOCaustralia: LOC, brian lara: PER, west indies: LOCTrue
\n", + "

452 rows × 7 columns

\n", + "
\n", + " \n", + " \n", + " \n", + "\n", + " \n", + "
\n", + "
\n", + " " + ], + "text/plain": [ + " category test_type original \\\n", + "0 robustness add_typo SOCCER - JAPAN GET LUCKY WIN , CHINA IN SURPRI... \n", + "1 robustness add_typo Nadim Ladki \n", + "2 robustness add_typo AL-AIN , United Arab Emirates 1996-12-06 \n", + "3 robustness add_typo Japan began the defence of their Asian Cup tit... \n", + "4 robustness add_typo But China saw their luck desert them in the se... \n", + ".. ... ... ... \n", + "447 robustness lowercase Portuguesa 1 Atletico Mineiro 0 \n", + "448 robustness lowercase CRICKET - LARA ENDURES ANOTHER MISERABLE DAY . \n", + "449 robustness lowercase Robert Galvin \n", + "450 robustness lowercase MELBOURNE 1996-12-06 \n", + "451 robustness lowercase Australia gave Brian Lara another reason to be... \n", + "\n", + " test_case \\\n", + "0 SOCCER - JAPAN GET LUCKY WIN , DHINA IN SURPRI... \n", + "1 Padim Ladki \n", + "2 AL-AIN , United Arab Emirates1 996-12-06 \n", + "3 Japan began the sefence of their Asian Cup tit... \n", + "4 But China saw their luck desert them in the se... \n", + ".. ... \n", + "447 portuguesa 1 atletico mineiro 0 \n", + "448 cricket - lara endures another miserable day . \n", + "449 robert galvin \n", + "450 melbourne 1996-12-06 \n", + "451 australia gave brian lara another reason to be... \n", + "\n", + " expected_result \\\n", + "0 japan: LOC, china: LOC \n", + "1 nadim ladki: PER \n", + "2 al-ain: LOC, united arab emirates: LOC \n", + "3 japan: LOC, asian cup: MISC, syria: LOC \n", + "4 china: LOC, uzbekistan: LOC \n", + ".. ... \n", + "447 portuguesa: ORG, atletico mineiro: ORG \n", + "448 lara endures: PER \n", + "449 robert galvin: PER \n", + "450 melbourne: LOC \n", + "451 australia: LOC, brian lara: PER, west indies: LOC \n", + "\n", + " actual_result pass \n", + "0 japan: LOC, dhina: PER False \n", + "1 padim ladki: PER True \n", + "2 al-ain: LOC, united arab emirates1: LOC False \n", + "3 japan: LOC, asian cup: MISC, syria: LOC True \n", + "4 china: LOC, matsh: PER, uzbekistan: LOC False \n", + ".. ... ... \n", + "447 portuguesa: ORG, atletico mineiro: ORG True \n", + "448 lara endures: PER True \n", + "449 robert galvin: PER True \n", + "450 melbourne: LOC True \n", + "451 australia: LOC, brian lara: PER, west indies: LOC True \n", + "\n", + "[452 rows x 7 columns]" + ] + }, + "execution_count": 23, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "harness.generated_results()" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": { + "id": "57lqGecA9UXG" + }, + "source": [ + "This method returns the generated results in the form of a pandas dataframe, which provides a convenient and easy-to-use format for working with the test results. You can use this method to quickly identify the test cases that failed and to determine where fixes are needed." + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": { + "id": "jPvPCr_S9Zb8" + }, + "source": [ + "#### Report of the tests" + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 112 + }, + "id": "gp57HcF9yxi7", + "outputId": "a980bcff-4eba-4930-bfa7-0a1f7e67bd8e" + }, + "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", + "
categorytest_typefail_countpass_countpass_rateminimum_pass_ratepass
0robustnessadd_typo9812857%65%False
1robustnesslowercase0226100%65%True
\n", + "
\n", + " \n", + " \n", + " \n", + "\n", + " \n", + "
\n", + "
\n", + " " + ], + "text/plain": [ + " category test_type fail_count pass_count pass_rate minimum_pass_rate \\\n", + "0 robustness add_typo 98 128 57% 65% \n", + "1 robustness lowercase 0 226 100% 65% \n", + "\n", + " pass \n", + "0 False \n", + "1 True " + ] + }, + "execution_count": 24, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "harness.report()" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": { + "id": "7rpJ3QbPinkT" + }, + "source": [ + "It summarizes the results giving information about pass and fail counts and overall test pass/fail flag." + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": { + "id": "3g-s1Gikv65h" + }, + "source": [ + "#### Step 3: Augment CoNLL Training Set Based on Robustness Test Results" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "custom_proportions is a dictionary with augmentation on test type as key and proportion as value. The proportion is the percentage of the test cases that will be augmented with the given augmentation type.\n", + "\n", + "**Augumentation with custom proportions in Dict format**\n", + "\n", + "custom_proportions is a dictionary with augmentation on test type as key and proportion as value. The proportion is the percentage of the test cases that will be augmented with the given augmentation type.\n", + "\n", + "```\n", + "custom_proportions = {'uppercase': 0.5, 'lowercase': 0.5}\n", + "```\n", + "\n", + "**Augumentation with custom proportions in List format**\n", + "\n", + "custom_proportions is a list of test types. \n", + "```\n", + "custom_proportions = ['uppercase', 'lowercase']\n", + "```" + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "EBTz4Fqev7xX", + "outputId": "10c6b4a0-e51b-43c8-8b1a-ab3de87bbd39" + }, + "outputs": [ + { + "data": { + "text/plain": [] + }, + "execution_count": 25, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "custom_proportations = {\n", + " 'uppercase':0.3,\n", + " 'lowercase':0.3\n", + "}\n", + "harness.augment(\"conll03.conll\",'augmented_conll03.conll', custom_proportations, inplace=False)" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": { + "id": "O2HL6Gip0ST0" + }, + "source": [ + "Essentially it applies perturbations to the input data based on the recommendations from the harness reports. Then this augmented_dataset is used to retrain the original model so as to make the model more robust and improve its performance." + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": { + "id": "z4aCF0kYwL4w" + }, + "source": [ + "#### Step 4: Train New NER Model on Augmented CoNLL" + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "WvRFmf3PGz3k", + "outputId": "ec91e2ab-af1a-4ade-fd3a-2035162d4cf5" + }, + "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", + "small_bert_L2_128 download started this may take some time.\n", + "Approximate size to download 16.1 MB\n", + "[OK!]\n" + ] + } + ], + "source": [ + "augmented_ner_model = nlp.load('bert train.ner').fit(dataset_path= \"augmented.conll\")" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": { + "id": "QK8o7XaI_ZAf" + }, + "source": [ + "#### Load saved test configurations, data" + ] + }, + { + "cell_type": "code", + "execution_count": 27, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "UpaSjj05_fPd", + "outputId": "16f2d397-9fa4-420a-81c5-37bec5bb6904" + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Generating testcases... (robustness): 100%|██████████| 1/1 [00:30<00:00, 30.37s/it]\n" + ] + } + ], + "source": [ + "harness = Harness.load(\"saved_test_configurations\",model=augmented_ner_model)" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": { + "id": "9aif5bl_G0GZ" + }, + "source": [ + "#### Step 5: Test New NER Model Robustness" + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "StrOVtMoAQpf", + "outputId": "616b624e-c5bd-4b19-c044-f82ee97729bb" + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Running test cases...: 100%|██████████| 452/452 [00:59<00:00, 7.55it/s]\n" + ] + }, + { + "data": { + "text/plain": [] + }, + "execution_count": 28, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "harness.run()" + ] + }, + { + "cell_type": "code", + "execution_count": 29, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 423 + }, + "id": "znh2xqQmAWHf", + "outputId": "c0b55b2c-efa0-4ac1-a290-3eaa6b34b0f4" + }, + "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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
categorytest_typeoriginaltest_caseexpected_resultactual_resultpass
0robustnessadd_typoSOCCER - JAPAN GET LUCKY WIN , CHINA IN SURPRI...SOCCER - JAPAN GET LUCKY WIN , CHINA IN SYRPRI...japan: LOC, china: LOCjapan: LOC, china: LOCTrue
1robustnessadd_typoNadim LadkiNasim Ladkinadim ladki: PERnasim ladki: PERTrue
2robustnessadd_typoAL-AIN , United Arab Emirates 1996-12-06AL-AIN , United Arsb Emirates 1996-12-06al-ain: LOC, united: LOC, arab emirates: LOCal-ain: LOC, united arsb emirates: LOCFalse
3robustnessadd_typoJapan began the defence of their Asian Cup tit...Japan began the defence of their Asian Cup tit...japan: LOC, asian cup: MISC, syria: LOCjapan: LOC, asian cup: MISC, syria: LOCTrue
4robustnessadd_typoBut China saw their luck desert them in the se...But China saw their luck dseert them in the se...china: LOC, uzbekistan: LOCchina: LOC, uzbekistan: LOCTrue
........................
447robustnesslowercasePortuguesa 1 Atletico Mineiro 0portuguesa 1 atletico mineiro 0portuguesa: ORG, atletico mineiro: ORGportuguesa: ORG, atletico mineiro: ORGTrue
448robustnesslowercaseCRICKET - LARA ENDURES ANOTHER MISERABLE DAY .cricket - lara endures another miserable day .lara: PERlara: PERTrue
449robustnesslowercaseRobert Galvinrobert galvinrobert galvin: PERrobert galvin: PERTrue
450robustnesslowercaseMELBOURNE 1996-12-06melbourne 1996-12-06melbourne: LOCmelbourne: LOCTrue
451robustnesslowercaseAustralia gave Brian Lara another reason to be...australia gave brian lara another reason to be...australia: LOC, brian lara: PER, west: LOC, wo...australia: LOC, brian lara: PER, west: LOC, wo...True
\n", + "

452 rows × 7 columns

\n", + "
\n", + " \n", + " \n", + " \n", + "\n", + " \n", + "
\n", + "
\n", + " " + ], + "text/plain": [ + " category test_type original \\\n", + "0 robustness add_typo SOCCER - JAPAN GET LUCKY WIN , CHINA IN SURPRI... \n", + "1 robustness add_typo Nadim Ladki \n", + "2 robustness add_typo AL-AIN , United Arab Emirates 1996-12-06 \n", + "3 robustness add_typo Japan began the defence of their Asian Cup tit... \n", + "4 robustness add_typo But China saw their luck desert them in the se... \n", + ".. ... ... ... \n", + "447 robustness lowercase Portuguesa 1 Atletico Mineiro 0 \n", + "448 robustness lowercase CRICKET - LARA ENDURES ANOTHER MISERABLE DAY . \n", + "449 robustness lowercase Robert Galvin \n", + "450 robustness lowercase MELBOURNE 1996-12-06 \n", + "451 robustness lowercase Australia gave Brian Lara another reason to be... \n", + "\n", + " test_case \\\n", + "0 SOCCER - JAPAN GET LUCKY WIN , CHINA IN SYRPRI... \n", + "1 Nasim Ladki \n", + "2 AL-AIN , United Arsb Emirates 1996-12-06 \n", + "3 Japan began the defence of their Asian Cup tit... \n", + "4 But China saw their luck dseert them in the se... \n", + ".. ... \n", + "447 portuguesa 1 atletico mineiro 0 \n", + "448 cricket - lara endures another miserable day . \n", + "449 robert galvin \n", + "450 melbourne 1996-12-06 \n", + "451 australia gave brian lara another reason to be... \n", + "\n", + " expected_result \\\n", + "0 japan: LOC, china: LOC \n", + "1 nadim ladki: PER \n", + "2 al-ain: LOC, united: LOC, arab emirates: LOC \n", + "3 japan: LOC, asian cup: MISC, syria: LOC \n", + "4 china: LOC, uzbekistan: LOC \n", + ".. ... \n", + "447 portuguesa: ORG, atletico mineiro: ORG \n", + "448 lara: PER \n", + "449 robert galvin: PER \n", + "450 melbourne: LOC \n", + "451 australia: LOC, brian lara: PER, west: LOC, wo... \n", + "\n", + " actual_result pass \n", + "0 japan: LOC, china: LOC True \n", + "1 nasim ladki: PER True \n", + "2 al-ain: LOC, united arsb emirates: LOC False \n", + "3 japan: LOC, asian cup: MISC, syria: LOC True \n", + "4 china: LOC, uzbekistan: LOC True \n", + ".. ... ... \n", + "447 portuguesa: ORG, atletico mineiro: ORG True \n", + "448 lara: PER True \n", + "449 robert galvin: PER True \n", + "450 melbourne: LOC True \n", + "451 australia: LOC, brian lara: PER, west: LOC, wo... True \n", + "\n", + "[452 rows x 7 columns]" + ] + }, + "execution_count": 29, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "harness.generated_results()" + ] + }, + { + "cell_type": "code", + "execution_count": 30, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 112 + }, + "id": "JSqkrBOZ-TeG", + "outputId": "34060368-241c-48dc-818e-bd84f7e85a1a" + }, + "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", + "
categorytest_typefail_countpass_countpass_rateminimum_pass_ratepass
0robustnessadd_typo6216473%65%True
1robustnesslowercase0226100%65%True
\n", + "
\n", + " \n", + " \n", + " \n", + "\n", + " \n", + "
\n", + "
\n", + " " + ], + "text/plain": [ + " category test_type fail_count pass_count pass_rate minimum_pass_rate \\\n", + "0 robustness add_typo 62 164 73% 65% \n", + "1 robustness lowercase 0 226 100% 65% \n", + "\n", + " pass \n", + "0 True \n", + "1 True " + ] + }, + "execution_count": 30, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "harness.report()" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": { + "id": "J0J5n2b1Ak-U" + }, + "source": [ + "\n", + "We can see that after performing augmentation, even the **add_typo** test is passing which failed earlier." + ] + }, + { + "cell_type": "code", + "execution_count": 30, + "metadata": { + "id": "U1Pe4zM-F1cZ" + }, + "outputs": [], + "source": [] + } + ], + "metadata": { + "colab": { + "machine_shape": "hm", + "provenance": [] + }, + "gpuClass": "standard", + "kernelspec": { + "display_name": "Python 3", + "name": "python3" + }, + "language_info": { + "name": "python" + } + }, + "nbformat": 4, + "nbformat_minor": 0 +} diff --git a/demo/tutorials/misc/Comparing_Models_Notebook.ipynb b/demo/tutorials/misc/Comparing_Models_Notebook.ipynb new file mode 100644 index 000000000..bf08fdf8b --- /dev/null +++ b/demo/tutorials/misc/Comparing_Models_Notebook.ipynb @@ -0,0 +1,2904 @@ +{ + "cells": [ + { + "attachments": {}, + "cell_type": "markdown", + "metadata": { + "id": "-euMnuisAIDX" + }, + "source": [ + "![image.png](data:image/png;base64,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)" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "[![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/JohnSnowLabs/nlptest/blob/main/demo/tutorials/misc/Comparing_Models_Notebook.ipynb)" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": { + "id": "wCxsD2KDAWU2" + }, + "source": [ + "**nlptest** is an open-source python library designed to help developers deliver safe and effective Natural Language Processing (NLP) models. Whether you are using **John Snow Labs, Hugging Face, Spacy** models or **OpenAI, Cohere, AI21, Hugging Face Inference API and Azure-OpenAI** based LLMs, it has got you covered. You can test any Named Entity Recognition (NER), Text Classification model using the library. We also support testing LLMS for Question-Answering and Summarization tasks on benchmark datasets. The library supports 50+ out of the box tests. These tests fall into robustness, accuracy, bias, representation, toxicity and fairness test categories.\n", + "\n", + "Metrics are calculated by comparing the model's extractions in the original list of sentences against the extractions carried out in the noisy list of sentences. The original annotated labels are not used at any point, we are simply comparing the model against itself in a 2 settings." + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": { + "id": "jNG1OYuQAgtW" + }, + "source": [ + "# Getting started with nlptest on John Snow Labs" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "Yfgpybg1xNrr" + }, + "outputs": [], + "source": [ + "!pip install nlptest" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": { + "id": "EsEtlSiNAnSO" + }, + "source": [ + "# Harness and Its Parameters\n", + "\n", + "The Harness class is a testing class for Natural Language Processing (NLP) models. It evaluates the performance of a NLP model on a given task using test data and generates a report with test results.Harness can be imported from the nlptest library in the following way." + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": { + "id": "w2GPpdowS1C9" + }, + "outputs": [], + "source": [ + "#Import Harness from the nlptest library\n", + "from nlptest import Harness" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": { + "id": "7_6PF_HGA4EO" + }, + "source": [ + "It imports the Harness class from within the module, that is designed to provide a blueprint or framework for conducting NLP testing, and that instances of the Harness class can be customized or configured for different testing scenarios or environments.\n", + "\n", + "Here is a list of the different parameters that can be passed to the Harness function:\n", + "\n", + "
\n", + "\n", + "\n", + "| Parameter | Description |\n", + "| - | - |\n", + "|**task** |Task for which the model is to be evaluated|\n", + "|**model** |Model name or models dictionary|\n", + "|**data** |Data path|\n", + "|**config** |Configuration for the tests to be performed, specified in form of a YAML file.|\n", + "|**hub** | Name of the hub (ex: johnsnowlabs, spacy, openai etc.) for model|\n", + "\n", + "
\n", + "
" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": { + "id": "pHJQHDcSA_CV" + }, + "source": [ + "# Comparing Models Using NLP Test\n", + "\n", + "With the NLPTest 1.5.0, testing multiple models and comparing them are now possible. You can easily pass a dictionary instead of model name in `model` parameter of Harness to run multiple models. Running more than one model is supported for NER and text-classification tasks for now.\n", + "\n" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": { + "id": "uYN21MRSLOVP" + }, + "source": [ + "### New \"model\" Parameter\n", + "\n", + "Instead of giving a model name or instance in the parameter, now you can give dictionaries in the format `:`:\n", + "\n", + "\n", + "\n", + "```python\n", + "models = {\n", + " \"ner.dl\": \"johnsnowlabs\",\n", + " \"en_core_web_sm\": \"spacy\"\n", + "}\n", + "Harness(..., model=models, ...)\n", + "\n", + "```\n", + "\n" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": { + "id": "2Q1uClT2kgLB" + }, + "source": [ + "## Comparing Text Classification Models\n" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": { + "id": "1WO54aEnBKK8" + }, + "source": [ + "### Setup and Configure Harness" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": { + "id": "a9VZCJ1CpIN8" + }, + "source": [ + "We will compare `en.sentiment.imdb.glove` from JSL and `lvwerra/distilbert-imdb` from huggingface in this notebook. We will use imdb sentiments sample csv dataset. We are using some of the accuracy, robustness and bias tests in tis notebook." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "Lj9U6OjspIN8" + }, + "outputs": [], + "source": [ + "!pip install johnsnowlabs transformers" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "zznm7JhCpIN8", + "outputId": "a97a8e68-8c7b-4377-9986-3021d9efb84c" + }, + "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", + "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": [ + "models = {\n", + " \"en.sentiment.imdb.glove\": \"johnsnowlabs\",\n", + " \"lvwerra/distilbert-imdb\": \"huggingface\"\n", + "}\n", + "\n", + "harness = Harness(task=\"text-classification\", model=models, data='sample.csv')" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "gZ0P8MsJpIN9", + "outputId": "ad20f006-5af6-43f6-90b8-edf7c9e37ec5" + }, + "outputs": [ + { + "data": { + "text/plain": [ + "{'tests': {'defaults': {'min_pass_rate': 0.5},\n", + " 'accuracy': {'min_macro_f1_score': {'min_score': 0.7}},\n", + " 'robustness': {'add_typo': {'min_pass_rate': 0.7},\n", + " 'lowercase': {'min_pass_rate': 0.7}},\n", + " 'bias': {'replace_to_female_pronouns': {'min_pass_rate': 0.7}}}}" + ] + }, + "execution_count": 21, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "harness.configure({\n", + " \"tests\":{\n", + " \"defaults\":{\"min_pass_rate\":0.5},\n", + " \"accuracy\":{\n", + " \"min_macro_f1_score\":{\"min_score\":0.7},\n", + " },\n", + " \"robustness\":{\n", + " \"add_typo\":{\"min_pass_rate\":0.7},\n", + " \"lowercase\":{\"min_pass_rate\":0.7},\n", + " },\n", + " \"bias\":{\n", + " \"replace_to_female_pronouns\":{\"min_pass_rate\":0.7},\n", + " }\n", + " }\n", + "})" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": { + "id": "1Ho_94hopIN9" + }, + "source": [ + "### Generate the testcases\n", + "The result of the generate function now has an extra column called model_name which specifies which model is the testcase is for." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "eTzrBQQmpIN9", + "outputId": "5e2a16ca-cad0-45ae-8708-ad8a8eadece5" + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Generating testcases...: 100%|██████████| 3/3 [00:00\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
model_namecategorytest_typeoriginaltest_caseexpected_result
0en.sentiment.imdb.gloveaccuracymin_macro_f1_score-macro0.7
1en.sentiment.imdb.gloverobustnessadd_typoJust as a reminder to anyone just now reading ...Just as a reminder to anyone just now reading ...pos
2en.sentiment.imdb.gloverobustnessadd_typoLike CURSE OF THE KOMODO was for the creature ...Like CURSE OF THE KOMODO was for the creature ...neg
3en.sentiment.imdb.gloverobustnessadd_typoI think that the costumes were excellent, and ...I think that the costumes were excellent, and ...pos
4en.sentiment.imdb.gloverobustnessadd_typoThis is one of my most favorite movies of all ...This is one of my most favorite movies of all ...pos
.....................
1197lvwerra/distilbert-imdbbiasreplace_to_female_pronounsThe opening was a steal from \"Eight-legged Fre...The opening was a steal from \"Eight-legged Fre...NEGATIVE
1198lvwerra/distilbert-imdbbiasreplace_to_female_pronounsNow don't get me wrong, I love seeing half nak...Now don't get me wrong, I love seeing half nak...NEGATIVE
1199lvwerra/distilbert-imdbbiasreplace_to_female_pronounsThough I saw this movie dubbed in French, so I...Though I saw this movie dubbed in French, so I...POSITIVE
1200lvwerra/distilbert-imdbbiasreplace_to_female_pronounsThis is one of the best presentations of the 6...This is one of the best presentations of the 6...POSITIVE
1201lvwerra/distilbert-imdbbiasreplace_to_female_pronounsI saw this movie previewed before something el...I saw this movie previewed before something el...NEGATIVE
\n", + "

1202 rows × 6 columns

\n", + "" + ], + "text/plain": [ + " model_name category test_type \\\n", + "0 en.sentiment.imdb.glove accuracy min_macro_f1_score \n", + "1 en.sentiment.imdb.glove robustness add_typo \n", + "2 en.sentiment.imdb.glove robustness add_typo \n", + "3 en.sentiment.imdb.glove robustness add_typo \n", + "4 en.sentiment.imdb.glove robustness add_typo \n", + "... ... ... ... \n", + "1197 lvwerra/distilbert-imdb bias replace_to_female_pronouns \n", + "1198 lvwerra/distilbert-imdb bias replace_to_female_pronouns \n", + "1199 lvwerra/distilbert-imdb bias replace_to_female_pronouns \n", + "1200 lvwerra/distilbert-imdb bias replace_to_female_pronouns \n", + "1201 lvwerra/distilbert-imdb bias replace_to_female_pronouns \n", + "\n", + " original \\\n", + "0 - \n", + "1 Just as a reminder to anyone just now reading ... \n", + "2 Like CURSE OF THE KOMODO was for the creature ... \n", + "3 I think that the costumes were excellent, and ... \n", + "4 This is one of my most favorite movies of all ... \n", + "... ... \n", + "1197 The opening was a steal from \"Eight-legged Fre... \n", + "1198 Now don't get me wrong, I love seeing half nak... \n", + "1199 Though I saw this movie dubbed in French, so I... \n", + "1200 This is one of the best presentations of the 6... \n", + "1201 I saw this movie previewed before something el... \n", + "\n", + " test_case expected_result \n", + "0 macro 0.7 \n", + "1 Just as a reminder to anyone just now reading ... pos \n", + "2 Like CURSE OF THE KOMODO was for the creature ... neg \n", + "3 I think that the costumes were excellent, and ... pos \n", + "4 This is one of my most favorite movies of all ... pos \n", + "... ... ... \n", + "1197 The opening was a steal from \"Eight-legged Fre... NEGATIVE \n", + "1198 Now don't get me wrong, I love seeing half nak... NEGATIVE \n", + "1199 Though I saw this movie dubbed in French, so I... POSITIVE \n", + "1200 This is one of the best presentations of the 6... POSITIVE \n", + "1201 I saw this movie previewed before something el... NEGATIVE \n", + "\n", + "[1202 rows x 6 columns]" + ] + }, + "execution_count": 23, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "harness.testcases()" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": { + "id": "HZXPtmWSpIN-" + }, + "source": [ + "harness.generate() method automatically generates the test cases (based on the provided configuration)" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": { + "id": "7dmw0z_lpIN-" + }, + "source": [ + "### Running the tests" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "nwTweFmlpIN-", + "outputId": "943888ea-7ca7-450e-e4fa-565b02d9728e" + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Running testcases... : 100%|██████████| 601/601 [08:13<00:00, 1.22it/s] \n", + "Running testcases... : 100%|██████████| 601/601 [04:49<00:00, 2.08it/s]\n" + ] + }, + { + "data": { + "text/plain": [] + }, + "execution_count": 24, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "harness.run()" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": { + "id": "ejUJlMXwpIN-" + }, + "source": [ + "### Generated Results" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 1000 + }, + "id": "ZjYBONiuYJdK", + "outputId": "644a991a-cc6f-4955-c8fe-55a46e23241f" + }, + "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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
model_namecategorytest_typeoriginaltest_caseexpected_resultactual_resultpass
0en.sentiment.imdb.gloveaccuracymin_macro_f1_score-macro0.70.0False
1en.sentiment.imdb.gloverobustnessadd_typoJust as a reminder to anyone just now reading ...Just as a reminder to anyone just now reading ...posposTrue
2en.sentiment.imdb.gloverobustnessadd_typoLike CURSE OF THE KOMODO was for the creature ...Like CURSE OF THE KOMODO was for the creature ...negnegTrue
3en.sentiment.imdb.gloverobustnessadd_typoI think that the costumes were excellent, and ...I think that the costumes were excellent, and ...posposTrue
4en.sentiment.imdb.gloverobustnessadd_typoThis is one of my most favorite movies of all ...This is one of my most favorite movies of all ...posposTrue
...........................
1197lvwerra/distilbert-imdbbiasreplace_to_female_pronounsThe opening was a steal from \"Eight-legged Fre...The opening was a steal from \"Eight-legged Fre...NEGATIVENEGATIVETrue
1198lvwerra/distilbert-imdbbiasreplace_to_female_pronounsNow don't get me wrong, I love seeing half nak...Now don't get me wrong, I love seeing half nak...NEGATIVENEGATIVETrue
1199lvwerra/distilbert-imdbbiasreplace_to_female_pronounsThough I saw this movie dubbed in French, so I...Though I saw this movie dubbed in French, so I...POSITIVEPOSITIVETrue
1200lvwerra/distilbert-imdbbiasreplace_to_female_pronounsThis is one of the best presentations of the 6...This is one of the best presentations of the 6...POSITIVEPOSITIVETrue
1201lvwerra/distilbert-imdbbiasreplace_to_female_pronounsI saw this movie previewed before something el...I saw this movie previewed before something el...NEGATIVENEGATIVETrue
\n", + "

1202 rows × 8 columns

\n", + "
" + ], + "text/plain": [ + " model_name category test_type \\\n", + "0 en.sentiment.imdb.glove accuracy min_macro_f1_score \n", + "1 en.sentiment.imdb.glove robustness add_typo \n", + "2 en.sentiment.imdb.glove robustness add_typo \n", + "3 en.sentiment.imdb.glove robustness add_typo \n", + "4 en.sentiment.imdb.glove robustness add_typo \n", + "... ... ... ... \n", + "1197 lvwerra/distilbert-imdb bias replace_to_female_pronouns \n", + "1198 lvwerra/distilbert-imdb bias replace_to_female_pronouns \n", + "1199 lvwerra/distilbert-imdb bias replace_to_female_pronouns \n", + "1200 lvwerra/distilbert-imdb bias replace_to_female_pronouns \n", + "1201 lvwerra/distilbert-imdb bias replace_to_female_pronouns \n", + "\n", + " original \\\n", + "0 - \n", + "1 Just as a reminder to anyone just now reading ... \n", + "2 Like CURSE OF THE KOMODO was for the creature ... \n", + "3 I think that the costumes were excellent, and ... \n", + "4 This is one of my most favorite movies of all ... \n", + "... ... \n", + "1197 The opening was a steal from \"Eight-legged Fre... \n", + "1198 Now don't get me wrong, I love seeing half nak... \n", + "1199 Though I saw this movie dubbed in French, so I... \n", + "1200 This is one of the best presentations of the 6... \n", + "1201 I saw this movie previewed before something el... \n", + "\n", + " test_case expected_result \\\n", + "0 macro 0.7 \n", + "1 Just as a reminder to anyone just now reading ... pos \n", + "2 Like CURSE OF THE KOMODO was for the creature ... neg \n", + "3 I think that the costumes were excellent, and ... pos \n", + "4 This is one of my most favorite movies of all ... pos \n", + "... ... ... \n", + "1197 The opening was a steal from \"Eight-legged Fre... NEGATIVE \n", + "1198 Now don't get me wrong, I love seeing half nak... NEGATIVE \n", + "1199 Though I saw this movie dubbed in French, so I... POSITIVE \n", + "1200 This is one of the best presentations of the 6... POSITIVE \n", + "1201 I saw this movie previewed before something el... NEGATIVE \n", + "\n", + " actual_result pass \n", + "0 0.0 False \n", + "1 pos True \n", + "2 neg True \n", + "3 pos True \n", + "4 pos True \n", + "... ... ... \n", + "1197 NEGATIVE True \n", + "1198 NEGATIVE True \n", + "1199 POSITIVE True \n", + "1200 POSITIVE True \n", + "1201 NEGATIVE True \n", + "\n", + "[1202 rows x 8 columns]" + ] + }, + "execution_count": 25, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "harness.generated_results()" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": { + "id": "Z-bVJvXvpIN-" + }, + "source": [ + "### Final Results\n", + "\n", + "We can call `.report()` which summarizes the results giving information about pass and fail counts and overall test pass/fail status of models and tests." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "BDrZp10ipIN-", + "outputId": "cd37d4c3-fd7c-4fc8-db6e-e566187e8c60" + }, + "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", + "
test_typeadd_typolowercasemin_macro_f1_scorereplace_to_female_pronouns
model_name    
en.sentiment.imdb.glove0.9700001.0000000.5000000.950000
lvwerra/distilbert-imdb0.9800001.0000000.6200000.980000
\n" + ], + "text/plain": [ + "" + ] + }, + "execution_count": 26, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "harness.report()" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": { + "id": "3-spt-NhpIN-" + }, + "source": [ + "## Comparing NER Models\n" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": { + "id": "un91PqMHpIN_" + }, + "source": [ + "### Setup and Configure Harness" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": { + "id": "Cw65EMwnM0vr" + }, + "source": [ + "We will compare `ner.dl` from JSL and `en_core_web_sm` from spacy in this notebook. We will use CoNLL 2003 sample conll dataset. We are not providing a config so default config will be used." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "MDUSLjXZMtGu" + }, + "outputs": [], + "source": [ + "!pip install johnsnowlabs spacy" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "f13UydObTDRG", + "outputId": "0f78106d-3914-4eba-ce29-a56ebc38d890" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Warning::Spark Session already created, some configs may not take.\n", + "recognize_entities_dl download started this may take some time.\n", + "Approx size to download 160.1 MB\n", + "[OK!]\n" + ] + } + ], + "source": [ + "models = {\n", + " \"ner.dl\": \"johnsnowlabs\",\n", + " \"en_core_web_sm\": \"spacy\"\n", + "}\n", + "\n", + "harness = Harness(task=\"ner\", model=models, data='sample.conll')" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": { + "id": "5Jow9lV8pIN_" + }, + "source": [ + "### Generate the testcases\n", + "The result of the generate function now has an extra column called model_name which specifies which model is the testcase is for." + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "CCJxFd4nUkMN", + "outputId": "17487fc7-c6ce-4ce0-998d-6284370bdcfd" + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Generating testcases...: 100%|██████████| 5/5 [00:00<00:00, 10968.37it/s]\n", + "Generating testcases...: 100%|██████████| 5/5 [00:00<00:00, 18825.42it/s]\n" + ] + }, + { + "data": { + "text/plain": [] + }, + "execution_count": 8, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "harness.generate()" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 537 + }, + "id": "8i5BSxxlpIN_", + "outputId": "85a87bbf-223a-46f8-cebd-ec566593fcfb" + }, + "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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
model_namecategorytest_typeoriginaltest_caseexpected_result
0ner.dlrobustnessadd_typoSOCCER - JAPAN GET LUCKY WIN , CHINA IN SURPRI...SOCCER - JAPAN GET LUCKY WIY , CHINA IN SURPRI...JAPAN: LOC, CHINA: LOC
1ner.dlrobustnessadd_typoNadim LadkiNadim LadkkNadim Ladki: ORG
2ner.dlrobustnessadd_typoAL-AIN , United Arab Emirates 1996-12-06AL-AIN , United Arab Emiratss 1996-12-06AL-AIN: LOC, United Arab Emirates: LOC
3ner.dlrobustnessadd_typoJapan began the defence of their Asian Cup tit...Japan began the defence of their Asian Cup tit...Japan: LOC, Asian Cup: MISC, Syria: LOC
4ner.dlrobustnessadd_typoBut China saw their luck desert them in the se...But China saw thei rluck desert them in the se...China: LOC, Uzbekistan: LOC
.....................
1821en_core_web_smrepresentationmin_label_representation_count-PER50.0
1822en_core_web_smrepresentationmin_label_representation_count-O50.0
1823en_core_web_smrepresentationmin_label_representation_count-ORG50.0
1824en_core_web_smrepresentationmin_label_representation_count-MISC50.0
1825en_core_web_smrepresentationmin_label_representation_count-LOC50.0
\n", + "

1826 rows × 6 columns

\n", + "
\n", + " \n", + " \n", + " \n", + "\n", + " \n", + "
\n", + "
\n", + " " + ], + "text/plain": [ + " model_name category test_type \\\n", + "0 ner.dl robustness add_typo \n", + "1 ner.dl robustness add_typo \n", + "2 ner.dl robustness add_typo \n", + "3 ner.dl robustness add_typo \n", + "4 ner.dl robustness add_typo \n", + "... ... ... ... \n", + "1821 en_core_web_sm representation min_label_representation_count \n", + "1822 en_core_web_sm representation min_label_representation_count \n", + "1823 en_core_web_sm representation min_label_representation_count \n", + "1824 en_core_web_sm representation min_label_representation_count \n", + "1825 en_core_web_sm representation min_label_representation_count \n", + "\n", + " original \\\n", + "0 SOCCER - JAPAN GET LUCKY WIN , CHINA IN SURPRI... \n", + "1 Nadim Ladki \n", + "2 AL-AIN , United Arab Emirates 1996-12-06 \n", + "3 Japan began the defence of their Asian Cup tit... \n", + "4 But China saw their luck desert them in the se... \n", + "... ... \n", + "1821 - \n", + "1822 - \n", + "1823 - \n", + "1824 - \n", + "1825 - \n", + "\n", + " test_case \\\n", + "0 SOCCER - JAPAN GET LUCKY WIY , CHINA IN SURPRI... \n", + "1 Nadim Ladkk \n", + "2 AL-AIN , United Arab Emiratss 1996-12-06 \n", + "3 Japan began the defence of their Asian Cup tit... \n", + "4 But China saw thei rluck desert them in the se... \n", + "... ... \n", + "1821 PER \n", + "1822 O \n", + "1823 ORG \n", + "1824 MISC \n", + "1825 LOC \n", + "\n", + " expected_result \n", + "0 JAPAN: LOC, CHINA: LOC \n", + "1 Nadim Ladki: ORG \n", + "2 AL-AIN: LOC, United Arab Emirates: LOC \n", + "3 Japan: LOC, Asian Cup: MISC, Syria: LOC \n", + "4 China: LOC, Uzbekistan: LOC \n", + "... ... \n", + "1821 50.0 \n", + "1822 50.0 \n", + "1823 50.0 \n", + "1824 50.0 \n", + "1825 50.0 \n", + "\n", + "[1826 rows x 6 columns]" + ] + }, + "execution_count": 10, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "harness.testcases()" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": { + "id": "ZEWchFb8CDrk" + }, + "source": [ + "harness.generate() method automatically generates the test cases (based on the provided configuration)" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": { + "id": "MEnLcl-OCG1O" + }, + "source": [ + "### Running the tests" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 165, + "referenced_widgets": [ + "4a65de2dfced489c94fae6284ee1b577", + "5012149c584d4c5083627021806ca380", + "3c7aa113c8e04151b2177fa34c57fbe8", + "7254ed6ef04449cd9a67edad1901def6", + "2b63baf9151f481684f38f1eb84398d4", + "7e9741e78b0243849a20c773567ef6c3", + "525e8f6fd6f444fdadd1d1f7874c5c32", + "d384dd5f513449ab8aeb966c908ce2ee", + "42bcaf7a61204f0a864c5b1fd93c223d", + "b256e53bdd8b4cbd9fdd50ec81cdff33", + "c2fa7a21baf04638b3270a6b5791138b", + "705921ad45b746f9b8621543dea8af9c", + "51490b2ce26f414a85a5d18195aba822", + "2cf15b023fbc4002999efd00231e42da", + "92739fd945d643fe902882f55e593512", + "643da25f730e40c7b6d4f6c9a8ab0fe7", + "4127fa30c93047f781379935b0790947", + "a4371c69b07943a3917e2884cc32fb62", + "e6ff24741e4b466e944594c245909170", + "de9b735afb4f4dbbbe8929b9ac4eb479", + "c9c3151640d94f1d99dd5f028e0affb9", + "361272eb8add42a3ac01c48a12847a6f", + "33d4e098aa5949a48c5f7ee2b847f7c2", + "6ea91b324f0d449ca5c8e034075ef2d0", + "deeee534bd4a4ca79c9ad5e11b43bd08", + "866eb63a9497466c974983114049c0e2", + "04350ece82e947c58ebd84cfcd2b8ea3", + "66e01fe831f0434a98a7f4b7a73a159b", + "86e2b7f8debf422c9c17d4d4c26181ab", + "29250f79cd7f46f98e0b81ed06c0765f", + "146b7fc3aa7748fbbb2cb0ecec946479", + "89838f675867405baa9037c17f290295", + "2ac0ce693a3e49338058a8c8978d8a96" + ] + }, + "id": "gFEez-T0UlcC", + "outputId": "9c2afbb8-68e1-4844-aae9-723f617da5d3" + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\rRunning testcases... : 0%| | 0/913 [00:00\n", + "
\n", + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
model_namecategorytest_typeoriginaltest_caseexpected_resultactual_resultpass
0ner.dlrobustnessadd_typoSOCCER - JAPAN GET LUCKY WIN , CHINA IN SURPRI...SOCCER - JAPAN GET LUCKY WIY , CHINA IN SURPRI...JAPAN: LOC, CHINA: LOCJAPAN: LOC, LUCKY WIY: PER, CHINA: LOCTrue
1ner.dlrobustnessadd_typoNadim LadkiNadim LadkkNadim Ladki: ORGNadim Ladkk: PERFalse
2ner.dlrobustnessadd_typoAL-AIN , United Arab Emirates 1996-12-06AL-AIN , United Arab Emiratss 1996-12-06AL-AIN: LOC, United Arab Emirates: LOCAL-AIN: LOC, United Arab Emiratss: ORGFalse
3ner.dlrobustnessadd_typoJapan began the defence of their Asian Cup tit...Japan began the defence of their Asian Cup tit...Japan: LOC, Asian Cup: MISC, Syria: LOCJapan: LOC, Asian Cup: MISC, Syria: LOCTrue
4ner.dlrobustnessadd_typoBut China saw their luck desert them in the se...But China saw thei rluck desert them in the se...China: LOC, Uzbekistan: LOCChina: LOC, Uzbekistan: LOCTrue
...........................
1821en_core_web_smrepresentationmin_label_representation_count-PER50.0507.0True
1822en_core_web_smrepresentationmin_label_representation_count-O50.02291.0True
1823en_core_web_smrepresentationmin_label_representation_count-ORG50.088.0True
1824en_core_web_smrepresentationmin_label_representation_count-MISC50.071.0True
1825en_core_web_smrepresentationmin_label_representation_count-LOC50.0183.0True
\n", + "

1826 rows × 8 columns

\n", + "
\n", + " \n", + " \n", + " \n", + "\n", + " \n", + "
\n", + " \n", + " " + ], + "text/plain": [ + " model_name category test_type \\\n", + "0 ner.dl robustness add_typo \n", + "1 ner.dl robustness add_typo \n", + "2 ner.dl robustness add_typo \n", + "3 ner.dl robustness add_typo \n", + "4 ner.dl robustness add_typo \n", + "... ... ... ... \n", + "1821 en_core_web_sm representation min_label_representation_count \n", + "1822 en_core_web_sm representation min_label_representation_count \n", + "1823 en_core_web_sm representation min_label_representation_count \n", + "1824 en_core_web_sm representation min_label_representation_count \n", + "1825 en_core_web_sm representation min_label_representation_count \n", + "\n", + " original \\\n", + "0 SOCCER - JAPAN GET LUCKY WIN , CHINA IN SURPRI... \n", + "1 Nadim Ladki \n", + "2 AL-AIN , United Arab Emirates 1996-12-06 \n", + "3 Japan began the defence of their Asian Cup tit... \n", + "4 But China saw their luck desert them in the se... \n", + "... ... \n", + "1821 - \n", + "1822 - \n", + "1823 - \n", + "1824 - \n", + "1825 - \n", + "\n", + " test_case \\\n", + "0 SOCCER - JAPAN GET LUCKY WIY , CHINA IN SURPRI... \n", + "1 Nadim Ladkk \n", + "2 AL-AIN , United Arab Emiratss 1996-12-06 \n", + "3 Japan began the defence of their Asian Cup tit... \n", + "4 But China saw thei rluck desert them in the se... \n", + "... ... \n", + "1821 PER \n", + "1822 O \n", + "1823 ORG \n", + "1824 MISC \n", + "1825 LOC \n", + "\n", + " expected_result \\\n", + "0 JAPAN: LOC, CHINA: LOC \n", + "1 Nadim Ladki: ORG \n", + "2 AL-AIN: LOC, United Arab Emirates: LOC \n", + "3 Japan: LOC, Asian Cup: MISC, Syria: LOC \n", + "4 China: LOC, Uzbekistan: LOC \n", + "... ... \n", + "1821 50.0 \n", + "1822 50.0 \n", + "1823 50.0 \n", + "1824 50.0 \n", + "1825 50.0 \n", + "\n", + " actual_result pass \n", + "0 JAPAN: LOC, LUCKY WIY: PER, CHINA: LOC True \n", + "1 Nadim Ladkk: PER False \n", + "2 AL-AIN: LOC, United Arab Emiratss: ORG False \n", + "3 Japan: LOC, Asian Cup: MISC, Syria: LOC True \n", + "4 China: LOC, Uzbekistan: LOC True \n", + "... ... ... \n", + "1821 507.0 True \n", + "1822 2291.0 True \n", + "1823 88.0 True \n", + "1824 71.0 True \n", + "1825 183.0 True \n", + "\n", + "[1826 rows x 8 columns]" + ] + }, + "execution_count": 12, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "harness.generated_results()" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": { + "id": "9fBgU33hCb2K" + }, + "source": [ + "### Final Results\n", + "\n", + "We can call `.report()` which summarizes the results giving information about pass and fail counts and overall test pass/fail status of models and tests." + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 163 + }, + "id": "nDmRw1AeUqIl", + "outputId": "2179fb71-633c-479b-c0fd-8629efca1712" + }, + "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", + "
test_typeadd_typoamerican_to_britishmin_gender_f1_scoremin_label_representation_countmin_micro_f1_scorereplace_to_female_pronounsreplace_to_low_income_country
model_name       
en_core_web_sm0.7500001.0000000.3300001.0000000.5000001.0000000.870000
ner.dl0.8200001.0000000.3300001.0000001.0000000.9900000.940000
\n" + ], + "text/plain": [ + "" + ] + }, + "execution_count": 13, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "harness.report()" + ] + } + ], + "metadata": { + "colab": { + "provenance": [] + }, + "kernelspec": { + "display_name": "Python 3", + "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.10.11" + }, + "widgets": { + "application/vnd.jupyter.widget-state+json": { + "04350ece82e947c58ebd84cfcd2b8ea3": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "146b7fc3aa7748fbbb2cb0ecec946479": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "ProgressStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "29250f79cd7f46f98e0b81ed06c0765f": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "2ac0ce693a3e49338058a8c8978d8a96": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "2b63baf9151f481684f38f1eb84398d4": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "2cf15b023fbc4002999efd00231e42da": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "FloatProgressModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_e6ff24741e4b466e944594c245909170", + "max": 231508, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_de9b735afb4f4dbbbe8929b9ac4eb479", + "value": 231508 + } + }, + "33d4e098aa5949a48c5f7ee2b847f7c2": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HBoxModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_6ea91b324f0d449ca5c8e034075ef2d0", + "IPY_MODEL_deeee534bd4a4ca79c9ad5e11b43bd08", + "IPY_MODEL_866eb63a9497466c974983114049c0e2" + ], + "layout": "IPY_MODEL_04350ece82e947c58ebd84cfcd2b8ea3" + } + }, + "361272eb8add42a3ac01c48a12847a6f": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "3c7aa113c8e04151b2177fa34c57fbe8": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "FloatProgressModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_d384dd5f513449ab8aeb966c908ce2ee", + "max": 525, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_42bcaf7a61204f0a864c5b1fd93c223d", + "value": 525 + } + }, + "4127fa30c93047f781379935b0790947": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "42bcaf7a61204f0a864c5b1fd93c223d": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "ProgressStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "4a65de2dfced489c94fae6284ee1b577": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HBoxModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_5012149c584d4c5083627021806ca380", + "IPY_MODEL_3c7aa113c8e04151b2177fa34c57fbe8", + "IPY_MODEL_7254ed6ef04449cd9a67edad1901def6" + ], + "layout": "IPY_MODEL_2b63baf9151f481684f38f1eb84398d4" + } + }, + "5012149c584d4c5083627021806ca380": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_7e9741e78b0243849a20c773567ef6c3", + "placeholder": "​", + "style": "IPY_MODEL_525e8f6fd6f444fdadd1d1f7874c5c32", + "value": "Downloading (…)lve/main/config.json: 100%" + } + }, + "51490b2ce26f414a85a5d18195aba822": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_4127fa30c93047f781379935b0790947", + "placeholder": "​", + "style": "IPY_MODEL_a4371c69b07943a3917e2884cc32fb62", + "value": "Downloading (…)solve/main/vocab.txt: 100%" + } + }, + "525e8f6fd6f444fdadd1d1f7874c5c32": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "643da25f730e40c7b6d4f6c9a8ab0fe7": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "66e01fe831f0434a98a7f4b7a73a159b": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "6ea91b324f0d449ca5c8e034075ef2d0": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_66e01fe831f0434a98a7f4b7a73a159b", + "placeholder": "​", + "style": "IPY_MODEL_86e2b7f8debf422c9c17d4d4c26181ab", + "value": "Downloading pytorch_model.bin: 100%" + } + }, + "705921ad45b746f9b8621543dea8af9c": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HBoxModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_51490b2ce26f414a85a5d18195aba822", + "IPY_MODEL_2cf15b023fbc4002999efd00231e42da", + "IPY_MODEL_92739fd945d643fe902882f55e593512" + ], + "layout": "IPY_MODEL_643da25f730e40c7b6d4f6c9a8ab0fe7" + } + }, + "7254ed6ef04449cd9a67edad1901def6": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_b256e53bdd8b4cbd9fdd50ec81cdff33", + "placeholder": "​", + "style": "IPY_MODEL_c2fa7a21baf04638b3270a6b5791138b", + "value": " 525/525 [00:00<00:00, 23.4kB/s]" + } + }, + "7e9741e78b0243849a20c773567ef6c3": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "866eb63a9497466c974983114049c0e2": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_89838f675867405baa9037c17f290295", + "placeholder": "​", + "style": "IPY_MODEL_2ac0ce693a3e49338058a8c8978d8a96", + "value": " 51.0M/51.0M [00:00<00:00, 121MB/s]" + } + }, + "86e2b7f8debf422c9c17d4d4c26181ab": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "89838f675867405baa9037c17f290295": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "92739fd945d643fe902882f55e593512": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_c9c3151640d94f1d99dd5f028e0affb9", + "placeholder": "​", + "style": "IPY_MODEL_361272eb8add42a3ac01c48a12847a6f", + "value": " 232k/232k [00:00<00:00, 3.42MB/s]" + } + }, + "a4371c69b07943a3917e2884cc32fb62": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "b256e53bdd8b4cbd9fdd50ec81cdff33": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "c2fa7a21baf04638b3270a6b5791138b": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "c9c3151640d94f1d99dd5f028e0affb9": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "d384dd5f513449ab8aeb966c908ce2ee": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "de9b735afb4f4dbbbe8929b9ac4eb479": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "ProgressStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "deeee534bd4a4ca79c9ad5e11b43bd08": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "FloatProgressModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_29250f79cd7f46f98e0b81ed06c0765f", + "max": 51044621, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_146b7fc3aa7748fbbb2cb0ecec946479", + "value": 51044621 + } + }, + "e6ff24741e4b466e944594c245909170": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + } + } + } + }, + "nbformat": 4, + "nbformat_minor": 0 +} diff --git a/demo/tutorials/misc/HuggingFace_Dataset_Notebook.ipynb b/demo/tutorials/misc/HuggingFace_Dataset_Notebook.ipynb new file mode 100644 index 000000000..7c4939c66 --- /dev/null +++ b/demo/tutorials/misc/HuggingFace_Dataset_Notebook.ipynb @@ -0,0 +1,1693 @@ +{ + "cells": [ + { + "attachments": {}, + "cell_type": "markdown", + "metadata": { + "id": "e7PsSmy9sCoR" + }, + "source": [ + "![image.png](data:image/png;base64,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)" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": { + "id": "3o5sAOfwL5qd" + }, + "source": [ + "[![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/JohnSnowLabs/nlptest/blob/main/demo/tutorials/misc/HuggingFace_Dataset_Notebook.ipynb)" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": { + "id": "WJJzt3RWhEc6" + }, + "source": [ + "**nlptest** is an open-source python library designed to help developers deliver safe and effective Natural Language Processing (NLP) models. Whether you are using **John Snow Labs, Hugging Face, Spacy** models or **OpenAI, Cohere, AI21, Hugging Face Inference API and Azure-OpenAI** based LLMs, it has got you covered. You can test any Named Entity Recognition (NER), Text Classification model using the library. We also support testing LLMS for Question-Answering and Summarization tasks on benchmark datasets. The library supports 50+ out of the box tests. These tests fall into robustness, accuracy, bias, representation and fairness test categories.\n", + "\n", + "Metrics are calculated by comparing the model's extractions in the original list of sentences against the extractions carried out in the noisy list of sentences. The original annotated labels are not used at any point, we are simply comparing the model against itself in a 2 settings." + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": { + "id": "26qXWhCYhHAt" + }, + "source": [ + "# Getting started with nlptest on John Snow Labs" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "azUb114QhOsY" + }, + "outputs": [], + "source": [ + "!pip install nlptest" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": { + "id": "yR6kjOaiheKN" + }, + "source": [ + "# Harness and Its Parameters\n", + "\n", + "The Harness class is a testing class for Natural Language Processing (NLP) models. It evaluates the performance of a NLP model on a given task using test data and generates a report with test results.Harness can be imported from the nlptest library in the following way." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "lTzSJpMlhgq5" + }, + "outputs": [], + "source": [ + "#Import Harness from the nlptest library\n", + "from nlptest import Harness" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": { + "id": "JFhJ9CcbsKqN" + }, + "source": [ + "# HuggingFace Datasets Testing For `text-classification`\n", + "\n", + "In this section, we dive into testing of HuggingFace Models for different HuggingFace Datasets." + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": { + "id": "iO7jyI9F8DQ8" + }, + "source": [ + "## Glue - `sst2` Dataset Testing\n", + "-------------------" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": { + "id": "ZtqqWrqO8DQ8" + }, + "source": [ + "The provided code initializes an instance of the Harness class, which is designed to handle text classification tasks using Hugging Face. The Harness class accepts a data parameter, which can also be specified as a `dictionary` with several attributes.\n", + "\n", + "The `data` prameter also takes a dictionary which contains the following attributes:\n", + "\n", + "```python\n", + "{\n", + " \"name\": \"\",\n", + " \"subset\": \"\",\n", + " \"feature_column\": \"\",\n", + " \"target_column\": \"\",\n", + " \"split\": \"\"\n", + "}\n", + "```\n", + "
\n", + "\n", + "\n", + "| Key | Description |\n", + "| - | - |\n", + "|**name** |Represents the name of the dataset being used.|\n", + "|**subset** |Indicates the subset of the dataset being considered.\n", + "|**feature_column** |Specifies the column that contains the input features.\n", + "|**target_column** |Represents the column that contains the target labels or categories.\n", + "|**split** |Denotes which split of the dataset should be used.|\n", + "\n", + "
\n", + "
\n", + "\n", + "`It's important to note that the default values for the split, feature_column, and target_column attributes are \"test\", \"text\", and \"label\", respectively.`" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": { + "id": "swaYPW-wPlku" + }, + "source": [ + "### Setup and Configure Harness" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "JaarBdfe8DQ8" + }, + "outputs": [], + "source": [ + "harness = Harness(task=\"text-classification\", hub=\"huggingface\",\n", + " model=\"distilbert-base-uncased-finetuned-sst-2-english\",\n", + " data={\"name\":'glue',\n", + " \"subset\":\"sst2\",\n", + " \"feature_column\":\"sentence\",\n", + " \"target_column\":'label',\n", + " \"split\":\"train\"\n", + " })" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": { + "id": "jWPAw9q0PwD1" + }, + "source": [ + "We have specified task as `text-classification` , hub as `huggingface` and model as `distilbert-base-uncased-finetuned-sst-2-english`\n", + "\n", + "For dataset we used `sst2` which is a subset of glue dataset.\n", + "\n", + "You can find more HuggingFace Benchmark Datasets [here](https://huggingface.co/datasets?task_categories=task_categories:text-classification&sort=downloads)\n" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": { + "id": "MSktjylZ8DQ9" + }, + "source": [ + "For tests we used lowercase and uppercase. Other available robustness tests are:\n", + "* `add_context`\n", + "* `add_contraction`\n", + "* `add_punctuation`\n", + "* `add_typo`\n", + "* `add_ocr_typo`\n", + "* `american_to_british`\n", + "* `british_to_american`\n", + "* `lowercase`\n", + "* `strip_punctuation`\n", + "* `titlecase`\n", + "* `uppercase`\n", + "* `number_to_word`\n", + "* `add_abbreviation`\n", + "* `add_speech_to_text_typo`\n", + "* `add_slangs`\n", + "* `dyslexia_word_swap`" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": { + "id": "zCP1nGeZ8DQ9" + }, + "source": [ + "Bias tests:\n", + "\n", + "* `replace_to_male_pronouns`\n", + "* `replace_to_female_pronouns`\n", + "* `replace_to_neutral_pronouns`\n", + "* `replace_to_high_income_country`\n", + "* `replace_to_low_income_country`\n", + "* `replace_to_upper_middle_income_country`\n", + "* `replace_to_lower_middle_income_country`\n", + "* `replace_to_white_firstnames`\n", + "* `replace_to_black_firstnames`\n", + "* `replace_to_hispanic_firstnames`\n", + "* `replace_to_asian_firstnames`\n", + "* `replace_to_white_lastnames`\n", + "* `replace_to_sikh_names`\n", + "* `replace_to_christian_names`\n", + "* `replace_to_hindu_names`\n", + "* `replace_to_muslim_names`\n", + "* `replace_to_inter_racial_lastnames`\n", + "* `replace_to_native_american_lastnames`\n", + "* `replace_to_asian_lastnames`\n", + "* `replace_to_hispanic_lastnames`\n", + "* `replace_to_black_lastnames`\n", + "* `replace_to_parsi_names`\n", + "* `replace_to_jain_names`\n", + "* `replace_to_buddhist_names`\n", + "\n", + "Representation tests:\n", + "\n", + "* `min_gender_representation_count`\n", + "* `min_ethnicity_name_representation_count`\n", + "* `min_religion_name_representation_count`\n", + "* `min_country_economic_representation_count`\n", + "* `min_gender_representation_proportion`\n", + "* `min_ethnicity_name_representation_proportion`\n", + "* `min_religion_name_representation_proportion`\n", + "* `min_country_economic_representation_proportion`\n", + "\n", + "\n", + "Accuracy tests:\n", + "\n", + "* `min_exact_match_score`\n", + "* `min_bleu_score`\n", + "* `min_rouge1_score`\n", + "* `min_rouge2_score`\n", + "* `min_rougeL_score`\n", + "* `min_rougeLsum_score`\n", + "\n", + "\n", + "Fairness tests:\n", + "\n", + "* `max_gender_rouge1_score`\n", + "* `max_gender_rouge2_score`\n", + "* `max_gender_rougeL_score`\n", + "* `max_gender_rougeLsum_score`\n", + "* `min_gender_rouge1_score`\n", + "* `min_gender_rouge2_score`\n", + "* `min_gender_rougeL_score`\n", + "* `min_gender_rougeLsum_score`" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "5DNBjDLp8DQ9", + "outputId": "b184a72c-447f-45a0-f77f-19782fb4a15f" + }, + "outputs": [ + { + "data": { + "text/plain": [ + "{'tests': {'defaults': {'min_pass_rate': 0.65},\n", + " 'robustness': {'lowercase': {'min_pass_rate': 0.66},\n", + " 'uppercase': {'min_pass_rate': 0.66}}}}" + ] + }, + "execution_count": 8, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "harness.configure(\n", + "{\n", + " 'tests': {'defaults': {'min_pass_rate': 0.65},\n", + " 'robustness': {'lowercase': {'min_pass_rate': 0.66},\n", + " 'uppercase': {'min_pass_rate': 0.66},\n", + " }\n", + " }\n", + " }\n", + " )" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": { + "id": "ZPU46A7WigFr" + }, + "source": [ + "Here we have configured the harness to perform two robustness tests (uppercase and lowercase) and defined the minimum pass rate for each test." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "kvHcQi3M8DQ-" + }, + "outputs": [], + "source": [ + "# Limit the data to the first 2000 samples\n", + "harness.data = harness.data[:2000]" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": { + "id": "i6kPvA13F7cr" + }, + "source": [ + "### Generating the test cases." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "mdNH3wCKF9fn", + "outputId": "cd348490-7ade-40fa-d870-dc059f5aa647" + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Generating testcases...: 100%|██████████| 1/1 [00:00\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
categorytest_typeoriginaltest_caseexpected_result
0robustnesslowercasehide new secretions from the parental unitshide new secretions from the parental unitsNEGATIVE
1robustnesslowercasecontains no wit , only labored gagscontains no wit , only labored gagsNEGATIVE
2robustnesslowercasethat loves its characters and communicates som...that loves its characters and communicates som...POSITIVE
3robustnesslowercaseremains utterly satisfied to remain the same t...remains utterly satisfied to remain the same t...NEGATIVE
4robustnesslowercaseon the worst revenge-of-the-nerds clichés the ...on the worst revenge-of-the-nerds clichés the ...NEGATIVE
..................
3995robustnessuppercasewhen there 's nothing else happeningWHEN THERE 'S NOTHING ELSE HAPPENINGNEGATIVE
3996robustnessuppercaseon cableON CABLENEGATIVE
3997robustnessuppercaseit with ring ,IT WITH RING ,POSITIVE
3998robustnessuppercasefar from a groundbreaking endeavorFAR FROM A GROUNDBREAKING ENDEAVORNEGATIVE
3999robustnessuppercasethat these women are spectacularTHAT THESE WOMEN ARE SPECTACULARPOSITIVE
\n", + "

4000 rows × 5 columns

\n", + "" + ], + "text/plain": [ + " category test_type \\\n", + "0 robustness lowercase \n", + "1 robustness lowercase \n", + "2 robustness lowercase \n", + "3 robustness lowercase \n", + "4 robustness lowercase \n", + "... ... ... \n", + "3995 robustness uppercase \n", + "3996 robustness uppercase \n", + "3997 robustness uppercase \n", + "3998 robustness uppercase \n", + "3999 robustness uppercase \n", + "\n", + " original \\\n", + "0 hide new secretions from the parental units \n", + "1 contains no wit , only labored gags \n", + "2 that loves its characters and communicates som... \n", + "3 remains utterly satisfied to remain the same t... \n", + "4 on the worst revenge-of-the-nerds clichés the ... \n", + "... ... \n", + "3995 when there 's nothing else happening \n", + "3996 on cable \n", + "3997 it with ring , \n", + "3998 far from a groundbreaking endeavor \n", + "3999 that these women are spectacular \n", + "\n", + " test_case expected_result \n", + "0 hide new secretions from the parental units NEGATIVE \n", + "1 contains no wit , only labored gags NEGATIVE \n", + "2 that loves its characters and communicates som... POSITIVE \n", + "3 remains utterly satisfied to remain the same t... NEGATIVE \n", + "4 on the worst revenge-of-the-nerds clichés the ... NEGATIVE \n", + "... ... ... \n", + "3995 WHEN THERE 'S NOTHING ELSE HAPPENING NEGATIVE \n", + "3996 ON CABLE NEGATIVE \n", + "3997 IT WITH RING , POSITIVE \n", + "3998 FAR FROM A GROUNDBREAKING ENDEAVOR NEGATIVE \n", + "3999 THAT THESE WOMEN ARE SPECTACULAR POSITIVE \n", + "\n", + "[4000 rows x 5 columns]" + ] + }, + "execution_count": 12, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "harness.testcases()" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": { + "id": "NOJ8BAU2GGzd" + }, + "source": [ + "harness.testcases() method displays the produced test cases in form of a pandas data frame." + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": { + "id": "3CwhQw6hGR9S" + }, + "source": [ + "### Running the tests" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "aguX6-aFGOnP", + "outputId": "bb014811-522b-4f07-fa8a-bf3d1c906d7f" + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Running testcases... : 100%|██████████| 4000/4000 [05:29<00:00, 12.14it/s]\n" + ] + }, + { + "data": { + "text/plain": [] + }, + "execution_count": 14, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "harness.run()" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": { + "id": "191O2oaUGWrH" + }, + "source": [ + "Called after harness.generate() and is to used to run all the tests. Returns a pass/fail flag for each test." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "XDbd1mpREWR5", + "outputId": "872d7612-e0dc-435f-932c-3e74406f38e3" + }, + "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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
categorytest_typeoriginaltest_caseexpected_resultactual_resultpass
0robustnesslowercasehide new secretions from the parental unitshide new secretions from the parental unitsNEGATIVENEGATIVETrue
1robustnesslowercasecontains no wit , only labored gagscontains no wit , only labored gagsNEGATIVENEGATIVETrue
2robustnesslowercasethat loves its characters and communicates som...that loves its characters and communicates som...POSITIVEPOSITIVETrue
3robustnesslowercaseremains utterly satisfied to remain the same t...remains utterly satisfied to remain the same t...NEGATIVENEGATIVETrue
4robustnesslowercaseon the worst revenge-of-the-nerds clichés the ...on the worst revenge-of-the-nerds clichés the ...NEGATIVENEGATIVETrue
........................
3995robustnessuppercasewhen there 's nothing else happeningWHEN THERE 'S NOTHING ELSE HAPPENINGNEGATIVENEGATIVETrue
3996robustnessuppercaseon cableON CABLENEGATIVENEGATIVETrue
3997robustnessuppercaseit with ring ,IT WITH RING ,POSITIVEPOSITIVETrue
3998robustnessuppercasefar from a groundbreaking endeavorFAR FROM A GROUNDBREAKING ENDEAVORNEGATIVENEGATIVETrue
3999robustnessuppercasethat these women are spectacularTHAT THESE WOMEN ARE SPECTACULARPOSITIVEPOSITIVETrue
\n", + "

4000 rows × 7 columns

\n", + "
" + ], + "text/plain": [ + " category test_type \\\n", + "0 robustness lowercase \n", + "1 robustness lowercase \n", + "2 robustness lowercase \n", + "3 robustness lowercase \n", + "4 robustness lowercase \n", + "... ... ... \n", + "3995 robustness uppercase \n", + "3996 robustness uppercase \n", + "3997 robustness uppercase \n", + "3998 robustness uppercase \n", + "3999 robustness uppercase \n", + "\n", + " original \\\n", + "0 hide new secretions from the parental units \n", + "1 contains no wit , only labored gags \n", + "2 that loves its characters and communicates som... \n", + "3 remains utterly satisfied to remain the same t... \n", + "4 on the worst revenge-of-the-nerds clichés the ... \n", + "... ... \n", + "3995 when there 's nothing else happening \n", + "3996 on cable \n", + "3997 it with ring , \n", + "3998 far from a groundbreaking endeavor \n", + "3999 that these women are spectacular \n", + "\n", + " test_case expected_result \\\n", + "0 hide new secretions from the parental units NEGATIVE \n", + "1 contains no wit , only labored gags NEGATIVE \n", + "2 that loves its characters and communicates som... POSITIVE \n", + "3 remains utterly satisfied to remain the same t... NEGATIVE \n", + "4 on the worst revenge-of-the-nerds clichés the ... NEGATIVE \n", + "... ... ... \n", + "3995 WHEN THERE 'S NOTHING ELSE HAPPENING NEGATIVE \n", + "3996 ON CABLE NEGATIVE \n", + "3997 IT WITH RING , POSITIVE \n", + "3998 FAR FROM A GROUNDBREAKING ENDEAVOR NEGATIVE \n", + "3999 THAT THESE WOMEN ARE SPECTACULAR POSITIVE \n", + "\n", + " actual_result pass \n", + "0 NEGATIVE True \n", + "1 NEGATIVE True \n", + "2 POSITIVE True \n", + "3 NEGATIVE True \n", + "4 NEGATIVE True \n", + "... ... ... \n", + "3995 NEGATIVE True \n", + "3996 NEGATIVE True \n", + "3997 POSITIVE True \n", + "3998 NEGATIVE True \n", + "3999 POSITIVE True \n", + "\n", + "[4000 rows x 7 columns]" + ] + }, + "execution_count": 15, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "harness.generated_results()" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": { + "id": "TKB8Rsr2GZME" + }, + "source": [ + "This method returns the generated results in the form of a pandas dataframe, which provides a convenient and easy-to-use format for working with the test results. You can use this method to quickly identify the test cases that failed and to determine where fixes are needed." + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": { + "id": "PBSlpWnUU55G" + }, + "source": [ + "### Final Results" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": { + "id": "umnEgUHM8DRA" + }, + "source": [ + "We can call `.report()` which summarizes the results giving information about pass and fail counts and overall test pass/fail flag." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 112 + }, + "id": "gp57HcF9yxi7", + "outputId": "b893072f-102a-45a6-be03-d737996e659c" + }, + "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", + "
categorytest_typefail_countpass_countpass_rateminimum_pass_ratepass
0robustnesslowercase02000100%66%True
1robustnessuppercase02000100%66%True
\n", + "
" + ], + "text/plain": [ + " category test_type fail_count pass_count pass_rate minimum_pass_rate \\\n", + "0 robustness lowercase 0 2000 100% 66% \n", + "1 robustness uppercase 0 2000 100% 66% \n", + "\n", + " pass \n", + "0 True \n", + "1 True " + ] + }, + "execution_count": 16, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "harness.report()" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": { + "id": "5N0cKfKiLsiQ" + }, + "source": [ + "## `Imdb` Dataset Testing\n", + "-------------------\n" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": { + "id": "l5H75bwe8DRA" + }, + "source": [ + "We can also use another dataset to test" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": { + "id": "Ny0585_H8DRA" + }, + "source": [ + "### Harness and Its Parameters" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "oDh3Zaa9EDfZ" + }, + "outputs": [], + "source": [ + "harness = Harness(task=\"text-classification\", hub=\"huggingface\",\n", + " model=\"lvwerra/distilbert-imdb\",\n", + " data={\"name\":'imdb'})" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": { + "id": "LIK5jh0x8DRB" + }, + "source": [ + "We have specified task as `text-classification` , hub as `huggingface` and model as `lvwerra/distilbert-imdb`\n", + "\n", + "For dataset we used `imdb`. With default parameters for feature_column, target_column and split\n", + "\n", + "You can find more HuggingFace Benchmark Datasets [here](https://huggingface.co/datasets?task_categories=task_categories:text-classification&sort=downloads)" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": { + "id": "uTbZ_qJV8DRB" + }, + "source": [ + "### Setup and Configure Harness" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "ZnLWJkPVEDmg", + "outputId": "92ca0633-a1c6-4de3-f9fd-c77e6bcb5374" + }, + "outputs": [ + { + "data": { + "text/plain": [ + "{'tests': {'defaults': {'min_pass_rate': 0.65},\n", + " 'robustness': {'lowercase': {'min_pass_rate': 0.66},\n", + " 'uppercase': {'min_pass_rate': 0.66}}}}" + ] + }, + "execution_count": 28, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "harness.configure(\n", + "{\n", + " 'tests': {'defaults': {'min_pass_rate': 0.65},\n", + " 'robustness': {'lowercase': {'min_pass_rate': 0.66},\n", + " 'uppercase': {'min_pass_rate': 0.66},\n", + " }\n", + " }\n", + " }\n", + " )" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "VdLgXi968DRB" + }, + "outputs": [], + "source": [ + "# Limit the data to the first 2000 samples\n", + "harness.data = harness.data[:2000]" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "A3U0kM62EG6B", + "outputId": "1ad54c30-3371-41b6-e85c-4dc69ffcd8aa" + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Generating testcases...: 100%|██████████| 1/1 [00:00\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
categorytest_typeoriginaltest_caseexpected_result
0robustnesslowercaseI love sci-fi and am willing to put up with a ...i love sci-fi and am willing to put up with a ...NEGATIVE
1robustnesslowercaseWorth the entertainment value of a rental, esp...worth the entertainment value of a rental, esp...NEGATIVE
2robustnesslowercaseits a totally average film with a few semi-alr...its a totally average film with a few semi-alr...NEGATIVE
3robustnesslowercaseSTAR RATING: ***** Saturday Night **** Friday ...star rating: ***** saturday night **** friday ...NEGATIVE
4robustnesslowercaseFirst off let me say, If you haven't enjoyed a...first off let me say, if you haven't enjoyed a...POSITIVE
..................
3995robustnessuppercaseA rather disappointing film. The club scenes w...A RATHER DISAPPOINTING FILM. THE CLUB SCENES W...NEGATIVE
3996robustnessuppercaseThere were so many reasons why this movie coul...THERE WERE SO MANY REASONS WHY THIS MOVIE COUL...NEGATIVE
3997robustnessuppercaseAfter Kenneth Opel's rousing story of the invi...AFTER KENNETH OPEL'S ROUSING STORY OF THE INVI...NEGATIVE
3998robustnessuppercaseHaving already seen the original \"Jack Frost\",...HAVING ALREADY SEEN THE ORIGINAL \"JACK FROST\",...NEGATIVE
3999robustnessuppercaseIll-conceived sequel(..the absurd idea of havi...ILL-CONCEIVED SEQUEL(..THE ABSURD IDEA OF HAVI...NEGATIVE
\n", + "

4000 rows × 5 columns

\n", + "" + ], + "text/plain": [ + " category test_type \\\n", + "0 robustness lowercase \n", + "1 robustness lowercase \n", + "2 robustness lowercase \n", + "3 robustness lowercase \n", + "4 robustness lowercase \n", + "... ... ... \n", + "3995 robustness uppercase \n", + "3996 robustness uppercase \n", + "3997 robustness uppercase \n", + "3998 robustness uppercase \n", + "3999 robustness uppercase \n", + "\n", + " original \\\n", + "0 I love sci-fi and am willing to put up with a ... \n", + "1 Worth the entertainment value of a rental, esp... \n", + "2 its a totally average film with a few semi-alr... \n", + "3 STAR RATING: ***** Saturday Night **** Friday ... \n", + "4 First off let me say, If you haven't enjoyed a... \n", + "... ... \n", + "3995 A rather disappointing film. The club scenes w... \n", + "3996 There were so many reasons why this movie coul... \n", + "3997 After Kenneth Opel's rousing story of the invi... \n", + "3998 Having already seen the original \"Jack Frost\",... \n", + "3999 Ill-conceived sequel(..the absurd idea of havi... \n", + "\n", + " test_case expected_result \n", + "0 i love sci-fi and am willing to put up with a ... NEGATIVE \n", + "1 worth the entertainment value of a rental, esp... NEGATIVE \n", + "2 its a totally average film with a few semi-alr... NEGATIVE \n", + "3 star rating: ***** saturday night **** friday ... NEGATIVE \n", + "4 first off let me say, if you haven't enjoyed a... POSITIVE \n", + "... ... ... \n", + "3995 A RATHER DISAPPOINTING FILM. THE CLUB SCENES W... NEGATIVE \n", + "3996 THERE WERE SO MANY REASONS WHY THIS MOVIE COUL... NEGATIVE \n", + "3997 AFTER KENNETH OPEL'S ROUSING STORY OF THE INVI... NEGATIVE \n", + "3998 HAVING ALREADY SEEN THE ORIGINAL \"JACK FROST\",... NEGATIVE \n", + "3999 ILL-CONCEIVED SEQUEL(..THE ABSURD IDEA OF HAVI... NEGATIVE \n", + "\n", + "[4000 rows x 5 columns]" + ] + }, + "execution_count": 32, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "harness.testcases()" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": { + "id": "1WtdwEZL8DRJ" + }, + "source": [ + "### Running the tests" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "0Nic5HRZEJu5", + "outputId": "dbbf911a-413e-479c-996b-98430920f0b5" + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Running testcases... : 100%|██████████| 4000/4000 [43:06<00:00, 1.55it/s]\n" + ] + }, + { + "data": { + "text/plain": [] + }, + "execution_count": 33, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "harness.run()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "BjZc-ZcCELbU", + "outputId": "5913de81-5f5d-4978-a1dc-f6cc1f0f2e7d" + }, + "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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
categorytest_typeoriginaltest_caseexpected_resultactual_resultpass
0robustnesslowercaseI love sci-fi and am willing to put up with a ...i love sci-fi and am willing to put up with a ...NEGATIVENEGATIVETrue
1robustnesslowercaseWorth the entertainment value of a rental, esp...worth the entertainment value of a rental, esp...NEGATIVENEGATIVETrue
2robustnesslowercaseits a totally average film with a few semi-alr...its a totally average film with a few semi-alr...NEGATIVENEGATIVETrue
3robustnesslowercaseSTAR RATING: ***** Saturday Night **** Friday ...star rating: ***** saturday night **** friday ...NEGATIVENEGATIVETrue
4robustnesslowercaseFirst off let me say, If you haven't enjoyed a...first off let me say, if you haven't enjoyed a...POSITIVEPOSITIVETrue
........................
3995robustnessuppercaseA rather disappointing film. The club scenes w...A RATHER DISAPPOINTING FILM. THE CLUB SCENES W...NEGATIVENEGATIVETrue
3996robustnessuppercaseThere were so many reasons why this movie coul...THERE WERE SO MANY REASONS WHY THIS MOVIE COUL...NEGATIVENEGATIVETrue
3997robustnessuppercaseAfter Kenneth Opel's rousing story of the invi...AFTER KENNETH OPEL'S ROUSING STORY OF THE INVI...NEGATIVENEGATIVETrue
3998robustnessuppercaseHaving already seen the original \"Jack Frost\",...HAVING ALREADY SEEN THE ORIGINAL \"JACK FROST\",...NEGATIVENEGATIVETrue
3999robustnessuppercaseIll-conceived sequel(..the absurd idea of havi...ILL-CONCEIVED SEQUEL(..THE ABSURD IDEA OF HAVI...NEGATIVENEGATIVETrue
\n", + "

4000 rows × 7 columns

\n", + "
" + ], + "text/plain": [ + " category test_type \\\n", + "0 robustness lowercase \n", + "1 robustness lowercase \n", + "2 robustness lowercase \n", + "3 robustness lowercase \n", + "4 robustness lowercase \n", + "... ... ... \n", + "3995 robustness uppercase \n", + "3996 robustness uppercase \n", + "3997 robustness uppercase \n", + "3998 robustness uppercase \n", + "3999 robustness uppercase \n", + "\n", + " original \\\n", + "0 I love sci-fi and am willing to put up with a ... \n", + "1 Worth the entertainment value of a rental, esp... \n", + "2 its a totally average film with a few semi-alr... \n", + "3 STAR RATING: ***** Saturday Night **** Friday ... \n", + "4 First off let me say, If you haven't enjoyed a... \n", + "... ... \n", + "3995 A rather disappointing film. The club scenes w... \n", + "3996 There were so many reasons why this movie coul... \n", + "3997 After Kenneth Opel's rousing story of the invi... \n", + "3998 Having already seen the original \"Jack Frost\",... \n", + "3999 Ill-conceived sequel(..the absurd idea of havi... \n", + "\n", + " test_case expected_result \\\n", + "0 i love sci-fi and am willing to put up with a ... NEGATIVE \n", + "1 worth the entertainment value of a rental, esp... NEGATIVE \n", + "2 its a totally average film with a few semi-alr... NEGATIVE \n", + "3 star rating: ***** saturday night **** friday ... NEGATIVE \n", + "4 first off let me say, if you haven't enjoyed a... POSITIVE \n", + "... ... ... \n", + "3995 A RATHER DISAPPOINTING FILM. THE CLUB SCENES W... NEGATIVE \n", + "3996 THERE WERE SO MANY REASONS WHY THIS MOVIE COUL... NEGATIVE \n", + "3997 AFTER KENNETH OPEL'S ROUSING STORY OF THE INVI... NEGATIVE \n", + "3998 HAVING ALREADY SEEN THE ORIGINAL \"JACK FROST\",... NEGATIVE \n", + "3999 ILL-CONCEIVED SEQUEL(..THE ABSURD IDEA OF HAVI... NEGATIVE \n", + "\n", + " actual_result pass \n", + "0 NEGATIVE True \n", + "1 NEGATIVE True \n", + "2 NEGATIVE True \n", + "3 NEGATIVE True \n", + "4 POSITIVE True \n", + "... ... ... \n", + "3995 NEGATIVE True \n", + "3996 NEGATIVE True \n", + "3997 NEGATIVE True \n", + "3998 NEGATIVE True \n", + "3999 NEGATIVE True \n", + "\n", + "[4000 rows x 7 columns]" + ] + }, + "execution_count": 34, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "harness.generated_results()" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": { + "id": "aQw2X-IG8DRK" + }, + "source": [ + "### Final Report\n", + "\n", + "We can call `.report()` which summarizes the results giving information about pass and fail counts and overall test pass/fail flag." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 112 + }, + "id": "PlrAxK1eENmh", + "outputId": "7fd59473-20ac-402b-a39b-e5e3e29cf1f4" + }, + "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", + "
categorytest_typefail_countpass_countpass_rateminimum_pass_ratepass
0robustnesslowercase02000100%66%True
1robustnessuppercase02000100%66%True
\n", + "
" + ], + "text/plain": [ + " category test_type fail_count pass_count pass_rate minimum_pass_rate \\\n", + "0 robustness lowercase 0 2000 100% 66% \n", + "1 robustness uppercase 0 2000 100% 66% \n", + "\n", + " pass \n", + "0 True \n", + "1 True " + ] + }, + "execution_count": 35, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "harness.report()" + ] + } + ], + "metadata": { + "accelerator": "TPU", + "colab": { + "machine_shape": "hm", + "provenance": [], + "toc_visible": true + }, + "gpuClass": "standard", + "kernelspec": { + "display_name": "Python 3", + "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.9.13" + } + }, + "nbformat": 4, + "nbformat_minor": 0 +} diff --git a/demo/tutorials/misc/RuntimeTest_Notebook.ipynb b/demo/tutorials/misc/RuntimeTest_Notebook.ipynb new file mode 100644 index 000000000..e4f6746f7 --- /dev/null +++ b/demo/tutorials/misc/RuntimeTest_Notebook.ipynb @@ -0,0 +1,1506 @@ +{ + "cells": [ + { + "attachments": {}, + "cell_type": "markdown", + "metadata": { + "id": "e7PsSmy9sCoR" + }, + "source": [ + "![image.png](data:image/png;base64,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)" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": { + "id": "3o5sAOfwL5qd" + }, + "source": [ + "[![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/JohnSnowLabs/nlptest/blob/main/demo/tutorials/misc/RuntimeTest_Notebook.ipynb)" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": { + "id": "WJJzt3RWhEc6" + }, + "source": [ + "**nlptest** is an open-source python library designed to help developers deliver safe and effective Natural Language Processing (NLP) models. Whether you are using **John Snow Labs, Hugging Face, Spacy** models or **OpenAI, Cohere, AI21, Hugging Face Inference API and Azure-OpenAI** based LLMs, it has got you covered. You can test any Named Entity Recognition (NER), Text Classification model using the library. We also support testing LLMS for Question-Answering and Summarization tasks on benchmark datasets. The library supports 50+ out of the box tests. These tests fall into robustness, accuracy, bias, representation, toxicity and fairness test categories.\n", + "\n", + "Metrics are calculated by comparing the model's extractions in the original list of sentences against the extractions carried out in the noisy list of sentences. The original annotated labels are not used at any point, we are simply comparing the model against itself in a 2 settings." + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": { + "id": "26qXWhCYhHAt" + }, + "source": [ + "# Getting started with nlptest on John Snow Labs" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "azUb114QhOsY" + }, + "outputs": [], + "source": [ + "!pip install nlptest" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": { + "id": "yR6kjOaiheKN" + }, + "source": [ + "# Harness and Its Parameters\n", + "\n", + "The Harness class is a testing class for Natural Language Processing (NLP) models. It evaluates the performance of a NLP model on a given task using test data and generates a report with test results.Harness can be imported from the nlptest library in the following way." + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "id": "lTzSJpMlhgq5" + }, + "outputs": [], + "source": [ + "#Import Harness from the nlptest library\n", + "from nlptest import Harness" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": { + "id": "JFhJ9CcbsKqN" + }, + "source": [ + "# Runtime Testing\n", + "\n", + "In this section, we dive into testing of time taken to complete the tests in nlptest on the datasets with Models." + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": { + "id": "swaYPW-wPlku" + }, + "source": [ + "### Setup and Configure Harness" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "JaarBdfe8DQ8" + }, + "outputs": [], + "source": [ + "harness = Harness(task=\"ner\", hub=\"huggingface\",\n", + " model=\"dslim/bert-base-NER\"\n", + " )" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": { + "id": "jWPAw9q0PwD1" + }, + "source": [ + "We have specified task as `ner` , hub as `huggingface` and model as `dslim/bert-base-NER`\n", + "\n" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": { + "id": "MSktjylZ8DQ9" + }, + "source": [ + "For tests we used lowercase and uppercase. Other available robustness tests are:\n", + "* `add_context`\n", + "* `add_contraction`\n", + "* `add_punctuation`\n", + "* `add_typo`\n", + "* `add_ocr_typo`\n", + "* `american_to_british`\n", + "* `british_to_american`\n", + "* `lowercase`\n", + "* `strip_punctuation`\n", + "* `titlecase`\n", + "* `uppercase`\n", + "* `number_to_word`\n", + "* `add_abbreviation`\n", + "* `add_speech_to_text_typo`\n", + "* `add_slangs`\n", + "* `dyslexia_word_swap`" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": { + "id": "zCP1nGeZ8DQ9" + }, + "source": [ + "Bias tests:\n", + "\n", + "* `replace_to_male_pronouns`\n", + "* `replace_to_female_pronouns`\n", + "* `replace_to_neutral_pronouns`\n", + "* `replace_to_high_income_country`\n", + "* `replace_to_low_income_country`\n", + "* `replace_to_upper_middle_income_country`\n", + "* `replace_to_lower_middle_income_country`\n", + "* `replace_to_white_firstnames`\n", + "* `replace_to_black_firstnames`\n", + "* `replace_to_hispanic_firstnames`\n", + "* `replace_to_asian_firstnames`\n", + "* `replace_to_white_lastnames`\n", + "* `replace_to_sikh_names`\n", + "* `replace_to_christian_names`\n", + "* `replace_to_hindu_names`\n", + "* `replace_to_muslim_names`\n", + "* `replace_to_inter_racial_lastnames`\n", + "* `replace_to_native_american_lastnames`\n", + "* `replace_to_asian_lastnames`\n", + "* `replace_to_hispanic_lastnames`\n", + "* `replace_to_black_lastnames`\n", + "* `replace_to_parsi_names`\n", + "* `replace_to_jain_names`\n", + "* `replace_to_buddhist_names`\n", + "\n", + "\n", + "Representation tests:\n", + "\n", + "* `min_gender_representation_count`\n", + "* `min_ethnicity_name_representation_count`\n", + "* `min_religion_name_representation_count`\n", + "* `min_country_economic_representation_count`\n", + "* `min_gender_representation_proportion`\n", + "* `min_ethnicity_name_representation_proportion`\n", + "* `min_religion_name_representation_proportion`\n", + "* `min_country_economic_representation_proportion`\n", + "\n", + "\n", + "Accuracy tests:\n", + "\n", + "* `min_exact_match_score`\n", + "* `min_bleu_score`\n", + "* `min_rouge1_score`\n", + "* `min_rouge2_score`\n", + "* `min_rougeL_score`\n", + "* `min_rougeLsum_score`\n", + "\n", + "\n", + "Fairness tests:\n", + "\n", + "* `max_gender_rouge1_score`\n", + "* `max_gender_rouge2_score`\n", + "* `max_gender_rougeL_score`\n", + "* `max_gender_rougeLsum_score`\n", + "* `min_gender_rouge1_score`\n", + "* `min_gender_rouge2_score`\n", + "* `min_gender_rougeL_score`\n", + "* `min_gender_rougeLsum_score`\n" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "5DNBjDLp8DQ9", + "outputId": "535ec1e2-bd54-440e-b762-318568bfcfa0" + }, + "outputs": [ + { + "data": { + "text/plain": [ + "{'tests': {'defaults': {'min_pass_rate': 0.65},\n", + " 'robustness': {'lowercase': {'min_pass_rate': 0.66},\n", + " 'uppercase': {'min_pass_rate': 0.66}}}}" + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "harness.configure(\n", + "{\n", + " 'tests': {'defaults': {'min_pass_rate': 0.65},\n", + " 'robustness': {'lowercase': {'min_pass_rate': 0.66},\n", + " 'uppercase': {'min_pass_rate': 0.66},\n", + " }\n", + " }\n", + " }\n", + " )" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": { + "id": "ZPU46A7WigFr" + }, + "source": [ + "Here we have configured the harness to perform two robustness tests (uppercase and lowercase) and defined the minimum pass rate for each test." + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": { + "id": "i6kPvA13F7cr" + }, + "source": [ + "### Generating the test cases." + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "mdNH3wCKF9fn", + "outputId": "79926e93-34e4-4c5e-eff3-83a24aeff09d" + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Generating testcases...: 100%|██████████| 1/1 [00:00<00:00, 6605.20it/s]\n" + ] + }, + { + "data": { + "text/plain": [] + }, + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "harness.generate()" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": { + "id": "nyjDdYLeGCmM" + }, + "source": [ + "harness.generate() method automatically generates the test cases (based on the provided configuration)" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 424 + }, + "id": "c0jL1_G7F_p6", + "outputId": "661a28cd-afb0-4c89-a986-e225ae389e39" + }, + "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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
categorytest_typeoriginaltest_caseexpected_result
0robustnesslowercaseSOCCER - JAPAN GET LUCKY WIN , CHINA IN SURPRI...soccer - japan get lucky win , china in surpri...JAPAN: MISC, LUCKY: PER, CHINA: ORG
1robustnesslowercaseNadim Ladkinadim ladkiNadim Ladki: PER
2robustnesslowercaseAL-AIN , United Arab Emirates 1996-12-06al-ain , united arab emirates 1996-12-06AL-AIN: LOC, United Arab Emirates: LOC
3robustnesslowercaseJapan began the defence of their Asian Cup tit...japan began the defence of their asian cup tit...Japan: LOC, Asian Cup: MISC, Syria: LOC, Group...
4robustnesslowercaseBut China saw their luck desert them in the se...but china saw their luck desert them in the se...China: LOC, Uzbekistan: LOC
..................
447robustnessuppercasePortuguesa 1 Atletico Mineiro 0PORTUGUESA 1 ATLETICO MINEIRO 0Portuguesa: ORG, Atletico Mineiro: ORG
448robustnessuppercaseCRICKET - LARA ENDURES ANOTHER MISERABLE DAY .CRICKET - LARA ENDURES ANOTHER MISERABLE DAY .LARA: LOC, MISERABLE: PER
449robustnessuppercaseRobert GalvinROBERT GALVINRobert Galvin: PER
450robustnessuppercaseMELBOURNE 1996-12-06MELBOURNE 1996-12-06MELBOURNE: LOC
451robustnessuppercaseAustralia gave Brian Lara another reason to be...AUSTRALIA GAVE BRIAN LARA ANOTHER REASON TO BE...Australia: LOC, Brian Lara: PER, West Indies: ...
\n", + "

452 rows × 5 columns

\n", + "
\n", + " \n", + " \n", + " \n", + "\n", + " \n", + "
\n", + "
\n", + " " + ], + "text/plain": [ + " category test_type original \\\n", + "0 robustness lowercase SOCCER - JAPAN GET LUCKY WIN , CHINA IN SURPRI... \n", + "1 robustness lowercase Nadim Ladki \n", + "2 robustness lowercase AL-AIN , United Arab Emirates 1996-12-06 \n", + "3 robustness lowercase Japan began the defence of their Asian Cup tit... \n", + "4 robustness lowercase But China saw their luck desert them in the se... \n", + ".. ... ... ... \n", + "447 robustness uppercase Portuguesa 1 Atletico Mineiro 0 \n", + "448 robustness uppercase CRICKET - LARA ENDURES ANOTHER MISERABLE DAY . \n", + "449 robustness uppercase Robert Galvin \n", + "450 robustness uppercase MELBOURNE 1996-12-06 \n", + "451 robustness uppercase Australia gave Brian Lara another reason to be... \n", + "\n", + " test_case \\\n", + "0 soccer - japan get lucky win , china in surpri... \n", + "1 nadim ladki \n", + "2 al-ain , united arab emirates 1996-12-06 \n", + "3 japan began the defence of their asian cup tit... \n", + "4 but china saw their luck desert them in the se... \n", + ".. ... \n", + "447 PORTUGUESA 1 ATLETICO MINEIRO 0 \n", + "448 CRICKET - LARA ENDURES ANOTHER MISERABLE DAY . \n", + "449 ROBERT GALVIN \n", + "450 MELBOURNE 1996-12-06 \n", + "451 AUSTRALIA GAVE BRIAN LARA ANOTHER REASON TO BE... \n", + "\n", + " expected_result \n", + "0 JAPAN: MISC, LUCKY: PER, CHINA: ORG \n", + "1 Nadim Ladki: PER \n", + "2 AL-AIN: LOC, United Arab Emirates: LOC \n", + "3 Japan: LOC, Asian Cup: MISC, Syria: LOC, Group... \n", + "4 China: LOC, Uzbekistan: LOC \n", + ".. ... \n", + "447 Portuguesa: ORG, Atletico Mineiro: ORG \n", + "448 LARA: LOC, MISERABLE: PER \n", + "449 Robert Galvin: PER \n", + "450 MELBOURNE: LOC \n", + "451 Australia: LOC, Brian Lara: PER, West Indies: ... \n", + "\n", + "[452 rows x 5 columns]" + ] + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "harness.testcases()" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "NOJ8BAU2GGzd" + }, + "source": [ + "harness.testcases() method displays the produced test cases in form of a pandas data frame." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "3CwhQw6hGR9S" + }, + "source": [ + "### Running the tests" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "aguX6-aFGOnP", + "outputId": "89063ec5-eb7c-40c5-8aaa-8f53b4125873" + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Running testcases... : 100%|██████████| 452/452 [00:29<00:00, 15.24it/s]\n" + ] + }, + { + "data": { + "text/plain": [] + }, + "execution_count": 7, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "harness.run()" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "191O2oaUGWrH" + }, + "source": [ + "Called after harness.generate() and is to used to run all the tests. Returns a pass/fail flag for each test." + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 554 + }, + "id": "XDbd1mpREWR5", + "outputId": "6e6fe30a-5ade-4a81-b910-f04c60829404" + }, + "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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
categorytest_typeoriginaltest_caseexpected_resultactual_resultpass
0robustnesslowercaseSOCCER - JAPAN GET LUCKY WIN , CHINA IN SURPRI...soccer - japan get lucky win , china in surpri...JAPAN: MISC, LUCKY: PER, CHINA: ORGFalse
1robustnesslowercaseNadim Ladkinadim ladkiNadim Ladki: PERFalse
2robustnesslowercaseAL-AIN , United Arab Emirates 1996-12-06al-ain , united arab emirates 1996-12-06AL-AIN: LOC, United Arab Emirates: LOCal-ain: LOCFalse
3robustnesslowercaseJapan began the defence of their Asian Cup tit...japan began the defence of their asian cup tit...Japan: LOC, Asian Cup: MISC, Syria: LOC, Group...japan: ORG, syria: ORGFalse
4robustnesslowercaseBut China saw their luck desert them in the se...but china saw their luck desert them in the se...China: LOC, Uzbekistan: LOCuzbekistan: LOCFalse
........................
447robustnessuppercasePortuguesa 1 Atletico Mineiro 0PORTUGUESA 1 ATLETICO MINEIRO 0Portuguesa: ORG, Atletico Mineiro: ORGPORTUGUESA: ORG, ATLETICO MINEIRO: ORGTrue
448robustnessuppercaseCRICKET - LARA ENDURES ANOTHER MISERABLE DAY .CRICKET - LARA ENDURES ANOTHER MISERABLE DAY .LARA: LOC, MISERABLE: PERLARA: LOC, MISERABLE: PERTrue
449robustnessuppercaseRobert GalvinROBERT GALVINRobert Galvin: PERROBERT: ORG, GALVIN: PERFalse
450robustnessuppercaseMELBOURNE 1996-12-06MELBOURNE 1996-12-06MELBOURNE: LOCMELBOURNE: LOCTrue
451robustnessuppercaseAustralia gave Brian Lara another reason to be...AUSTRALIA GAVE BRIAN LARA ANOTHER REASON TO BE...Australia: LOC, Brian Lara: PER, West Indies: ...AUSTRALIA: LOC, BRIAN LARA: LOC, REASON: PER, ...False
\n", + "

452 rows × 7 columns

\n", + "
\n", + " \n", + " \n", + " \n", + "\n", + " \n", + "
\n", + "
\n", + " " + ], + "text/plain": [ + " category test_type original \\\n", + "0 robustness lowercase SOCCER - JAPAN GET LUCKY WIN , CHINA IN SURPRI... \n", + "1 robustness lowercase Nadim Ladki \n", + "2 robustness lowercase AL-AIN , United Arab Emirates 1996-12-06 \n", + "3 robustness lowercase Japan began the defence of their Asian Cup tit... \n", + "4 robustness lowercase But China saw their luck desert them in the se... \n", + ".. ... ... ... \n", + "447 robustness uppercase Portuguesa 1 Atletico Mineiro 0 \n", + "448 robustness uppercase CRICKET - LARA ENDURES ANOTHER MISERABLE DAY . \n", + "449 robustness uppercase Robert Galvin \n", + "450 robustness uppercase MELBOURNE 1996-12-06 \n", + "451 robustness uppercase Australia gave Brian Lara another reason to be... \n", + "\n", + " test_case \\\n", + "0 soccer - japan get lucky win , china in surpri... \n", + "1 nadim ladki \n", + "2 al-ain , united arab emirates 1996-12-06 \n", + "3 japan began the defence of their asian cup tit... \n", + "4 but china saw their luck desert them in the se... \n", + ".. ... \n", + "447 PORTUGUESA 1 ATLETICO MINEIRO 0 \n", + "448 CRICKET - LARA ENDURES ANOTHER MISERABLE DAY . \n", + "449 ROBERT GALVIN \n", + "450 MELBOURNE 1996-12-06 \n", + "451 AUSTRALIA GAVE BRIAN LARA ANOTHER REASON TO BE... \n", + "\n", + " expected_result \\\n", + "0 JAPAN: MISC, LUCKY: PER, CHINA: ORG \n", + "1 Nadim Ladki: PER \n", + "2 AL-AIN: LOC, United Arab Emirates: LOC \n", + "3 Japan: LOC, Asian Cup: MISC, Syria: LOC, Group... \n", + "4 China: LOC, Uzbekistan: LOC \n", + ".. ... \n", + "447 Portuguesa: ORG, Atletico Mineiro: ORG \n", + "448 LARA: LOC, MISERABLE: PER \n", + "449 Robert Galvin: PER \n", + "450 MELBOURNE: LOC \n", + "451 Australia: LOC, Brian Lara: PER, West Indies: ... \n", + "\n", + " actual_result pass \n", + "0 False \n", + "1 False \n", + "2 al-ain: LOC False \n", + "3 japan: ORG, syria: ORG False \n", + "4 uzbekistan: LOC False \n", + ".. ... ... \n", + "447 PORTUGUESA: ORG, ATLETICO MINEIRO: ORG True \n", + "448 LARA: LOC, MISERABLE: PER True \n", + "449 ROBERT: ORG, GALVIN: PER False \n", + "450 MELBOURNE: LOC True \n", + "451 AUSTRALIA: LOC, BRIAN LARA: LOC, REASON: PER, ... False \n", + "\n", + "[452 rows x 7 columns]" + ] + }, + "execution_count": 8, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "harness.generated_results()" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": { + "id": "TKB8Rsr2GZME" + }, + "source": [ + "This method returns the generated results in the form of a pandas dataframe, which provides a convenient and easy-to-use format for working with the test results. You can use this method to quickly identify the test cases that failed and to determine where fixes are needed." + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": { + "id": "PBSlpWnUU55G" + }, + "source": [ + "### Final Results" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": { + "id": "umnEgUHM8DRA" + }, + "source": [ + "We can call `.report()` which summarizes the results giving information about pass and fail counts and overall test pass/fail flag.\n", + "\n", + "To get time_elapsed for each test we pass parameter `return_runtime=True` in `.report()` method. We can also select the unit for time_elapsed i.e, seconds(s), miliseconds(ms) or microseconds(us) etc." + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 112 + }, + "id": "gp57HcF9yxi7", + "outputId": "8b27acd2-732e-4cf4-b473-2279177984a1" + }, + "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", + "
categorytest_typefail_countpass_countpass_rateminimum_pass_ratepasstime_elapsed (ms)
0robustnesslowercase1824419%66%False0.560462
1robustnessuppercase1527433%66%False0.778355
\n", + "
\n", + " \n", + " \n", + " \n", + "\n", + " \n", + "
\n", + "
\n", + " " + ], + "text/plain": [ + " category test_type fail_count pass_count pass_rate minimum_pass_rate \\\n", + "0 robustness lowercase 182 44 19% 66% \n", + "1 robustness uppercase 152 74 33% 66% \n", + "\n", + " pass time_elapsed (ms) \n", + "0 False 0.560462 \n", + "1 False 0.778355 " + ] + }, + "execution_count": 9, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "harness.report(return_runtime=True, unit='ms')" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": { + "id": "zg-knds3tq-w" + }, + "source": [ + "# Multiple Models Runtime Testing" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": { + "id": "TnUBvYXptq-w" + }, + "outputs": [], + "source": [ + "model_dict = {\n", + " 'ner.dl':'johnsnowlabs',\n", + " 'en_core_web_sm':'spacy'\n", + "}" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "ElMInPJMu3QK" + }, + "outputs": [], + "source": [ + "!pip install spacy johnsnowlabs" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "PmMwW5IIvGav" + }, + "outputs": [], + "source": [ + "# Load CoNLL\n", + "!wget https://github.com/JohnSnowLabs/nlptest/raw/main/nlptest/data/conll/sample.conll" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "yey-zVICtq-w", + "outputId": "9a933734-2a4c-4a9d-bbaf-9ef4cf562ea5" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Warning::Spark Session already created, some configs may not take.\n", + "recognize_entities_dl download started this may take some time.\n", + "Approx size to download 160.1 MB\n", + "[OK!]\n" + ] + } + ], + "source": [ + "harness = Harness(task='ner', model=model_dict, data='sample.conll')" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "JwK7oi7Etq-w", + "outputId": "41e7eafd-ab75-4fab-b401-ba45450dd1e0" + }, + "outputs": [ + { + "data": { + "text/plain": [ + "{'tests': {'defaults': {'min_pass_rate': 0.65},\n", + " 'robustness': {'uppercase': {'min_pass_rate': 0.66},\n", + " 'lowercase': {'min_pass_rate': 0.6}}}}" + ] + }, + "execution_count": 16, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "harness.configure(\n", + "{\n", + " 'tests': {'defaults': {'min_pass_rate': 0.65},'robustness': {'uppercase': {'min_pass_rate': 0.66},\n", + " 'lowercase':{'min_pass_rate': 0.60},\n", + " }\n", + " }\n", + " }\n", + " )" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "vTbPwStvtq-x", + "outputId": "4df4bccd-0046-4198-e71c-fcd32a9488c3" + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Generating testcases...: 100%|██████████| 1/1 [00:00<00:00, 7626.01it/s]\n", + "Generating testcases...: 100%|██████████| 1/1 [00:00<00:00, 8473.34it/s]\n", + "Running testcases... : 100%|██████████| 452/452 [00:50<00:00, 9.03it/s]\n", + "Running testcases... : 100%|██████████| 452/452 [00:07<00:00, 60.20it/s]\n" + ] + }, + { + "data": { + "text/plain": [] + }, + "execution_count": 17, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "harness.generate().run()" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 270 + }, + "id": "AUZUeCpLtq-x", + "outputId": "c5d4327b-7ab7-4501-e4eb-1064e84ceb60" + }, + "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", + "
time_elapsed (ms)
model_name
ner.dl0.868378
en_core_web_sm0.810365
\n", + "
\n", + " \n", + " \n", + " \n", + "\n", + " \n", + "
\n", + "
\n", + " " + ], + "text/plain": [ + " time_elapsed (ms)\n", + "model_name \n", + "ner.dl 0.868378\n", + "en_core_web_sm 0.810365" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "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", + "
test_typelowercaseuppercase
model_name  
en_core_web_sm0.2900000.580000
ner.dl0.1100000.850000
\n" + ], + "text/plain": [ + "" + ] + }, + "execution_count": 18, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "harness.report(return_runtime=True, unit='ms')" + ] + } + ], + "metadata": { + "accelerator": "TPU", + "colab": { + "machine_shape": "hm", + "provenance": [], + "toc_visible": true + }, + "gpuClass": "standard", + "kernelspec": { + "display_name": "Python 3", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.8.9" + } + }, + "nbformat": 4, + "nbformat_minor": 0 +} diff --git a/demo/tutorials/test-specific-notebooks/Custom_Bias_Demo.ipynb b/demo/tutorials/test-specific-notebooks/Custom_Bias_Demo.ipynb new file mode 100644 index 000000000..8f7b5158f --- /dev/null +++ b/demo/tutorials/test-specific-notebooks/Custom_Bias_Demo.ipynb @@ -0,0 +1 @@ +{"cells":[{"attachments":{},"cell_type":"markdown","metadata":{"id":"IMccuY4eWWjg"},"source":["![image.png](data:image/png;base64,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)"]},{"attachments":{},"cell_type":"markdown","metadata":{"id":"0BsQx7uEWWjl"},"source":["[![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/JohnSnowLabs/nlptest/blob/main/demo/tutorials/test-specific-notebooks/Custom_Bias_Demo.ipynb)"]},{"attachments":{},"cell_type":"markdown","metadata":{"id":"l0gB5BSHWWjl"},"source":["**nlptest** is an open-source python library designed to help developers deliver safe and effective Natural Language Processing (NLP) models. Whether you are using **John Snow Labs, Hugging Face, or Spacy** models, it has got you covered. You can test any Named Entity Recognition (NER) and Text Classification model using the libraray. The library supports 50+ out of the box tests. These tests fall into robustness, accuracy, bias, representation and fairness test categories.\n","\n","Metrics are calculated by comparing the model's extractions in the original list of sentences against the extractions carried out in the noisy list of sentences. The original annotated labels are not used at any point, we are simply comparing the model against itself in a 2 settings."]},{"attachments":{},"cell_type":"markdown","metadata":{"id":"w-F61EAuWWjm"},"source":["# Getting started with nlptest on John Snow Labs"]},{"cell_type":"code","execution_count":null,"metadata":{"id":"k9gjSI83WWjm"},"outputs":[],"source":["!pip install nlptest"]},{"attachments":{},"cell_type":"markdown","metadata":{"id":"54GD8BlAWWjn"},"source":["# Harness and its Parameters\n","\n","The Harness class is a testing class for Natural Language Processing (NLP) models. It evaluates the performance of a NLP model on a given task using test data and generates a report with test results.Harness can be imported from the nlptest library in the following way."]},{"cell_type":"code","execution_count":31,"metadata":{"id":"vt2AAR0oWWjn"},"outputs":[],"source":["#Import Harness from the nlptest library\n","from nlptest import Harness"]},{"attachments":{},"cell_type":"markdown","metadata":{"id":"jxdhqzHOWWjo"},"source":["It imports the Harness class from within the module, that is designed to provide a blueprint or framework for conducting NLP testing, and that instances of the Harness class can be customized or configured for different testing scenarios or environments.\n","\n","Here is a list of the different parameters that can be passed to the Harness function:\n","\n","
\n","\n","\n","| Parameter | Description |\n","| - | - |\n","|**task** |Task for which the model is to be evaluated (text-classification or ner)|\n","|**model** |PipelineModel or path to a saved model or pretrained pipeline/model from hub.\n","|**data** |Path to the data that is to be used for evaluation. Can be .csv or .conll file in the CoNLL format\n","|**config** |Configuration for the tests to be performed, specified in form of a YAML file.\n","|**hub** |model hub to load from the path. Required if model param is passed as path.|\n","\n","
\n","
"]},{"attachments":{},"cell_type":"markdown","metadata":{"id":"UAQTI32zWWjo"},"source":["# Bias Testing\n","\n","Model bias refers to the phenomenon where the model produces results that are systematically skewed in a particular direction. This bias can have significant negative consequences, such as perpetuating stereotypes or discriminating against certain genders, ethnicities, religions or countries.In this case, the goal is to understand how replacing documents with other genders, ethnicity names, religion names or countries belonging to different economic stratas affect the model's prediction performance compared to documents similar to those in the original training set.\n","\n","\n","\n","\n","\n","**`Supported Bias tests :`**
\n","\n","\n","- **`replace_to_male_pronouns`**: female/neutral pronouns of the test set are turned into male pronouns.\n","\n","- **`replace_to_female_pronouns`**: male/neutral pronouns of the test set are turned into female pronouns.\n","\n","- **`replace_to_neutral_pronouns`**: female/male pronouns of the test set are turned into neutral pronouns.\n","\n","- **`replace_to_high_income_country`**: replace countries in test set to high income countries.\n","\n","- **`replace_to_low_income_country`**: replace countries in test set to low income countries.\n","- **`replace_to_upper_middle_income_country`**: replace countries in test set to upper middle income countries.\n","\n","- **`replace_to_lower_middle_income_country`**: replace countries in test set to lower middle income countries.\n","\n","- **`replace_to_white_firstnames`**: replace other ethnicity first names to white firstnames.\n","\n","- **`replace_to_black_firstnames`**: replace other ethnicity first names to black firstnames.\n","\n","- **`replace_to_hispanic_firstnames`**: replace other ethnicity first names to hispanic firstnames.\n","\n","- **`replace_to_asian_firstnames`**: replace other ethnicity first names to asian firstnames.\n","\n","- **`replace_to_white_lastnames`**: replace other ethnicity last names to white lastnames.\n","\n","- **`replace_to_black_lastnames`**: replace other ethnicity last names to black lastnames.\n","\n","- **`replace_to_hispanic_lastnames`**: replace other ethnicity last names to hispanic lastnames.\n","\n","- **`replace_to_asian_lastnames`**: replace other ethnicity last names to asian lastnames.\n","\n","- **`replace_to_native_american_lastnames`**: replace other ethnicity last names to native-american lastnames.\n","\n","- **`replace_to_inter_racial_lastnames`**: replace other ethnicity last names to inter-racial lastnames.\n","\n","- **`replace_to_muslim_names`**: replace other religion people names to muslim names.\n","\n","- **`replace_to_hindu_names`**: replace other religion people names to hindu names.\n","\n","- **`replace_to_christian_names`**: replace other religion people names to christian names.\n","\n","- **`replace_to_sikh_names`**: replace other religion people names to sikh names.\n","\n","- **`replace_to_jain_names`**: replace other religion people names to jain names.\n","\n","- **`replace_to_parsi_names`**: replace other religion people names to parsi names.\n","\n","- **`replace_to_buddhist_names`**: replace other religion people names to buddhist names.\n","\n","\n","
\n","
\n","\n","\n"]},{"attachments":{},"cell_type":"markdown","metadata":{"id":"MuYA62h9WWjp"},"source":["\n","## Supported Custom Bias Data Category:\n","\n","- \"Country-Economic-Bias\"\n","- \"Religion-Bias\"\n","- \"Ethnicity-Name-Bias\"\n","- \"Gender-Pronoun-Bias\"\n","\n","### Country-Economic-Bias affects the following bias tests:\n","\n","- \"replace_to_high_income_country\"\n","- \"replace_to_low_income_country\"\n","- \"replace_to_upper_middle_income_country\"\n","- \"replace_to_lower_middle_income_country\"\n","\n","### Religion-Bias affects the following bias tests:\n","\n","- \"replace_to_muslim_names\"\n","- \"replace_to_hindu_names\"\n","- \"replace_to_christian_names\"\n","- \"replace_to_sikh_names\"\n","- \"replace_to_jain_names\"\n","- \"replace_to_parsi_names\"\n","- \"replace_to_buddhist_names\"\n","\n","### Ethnicity-Name-Bias affects the following bias tests:\n","\n","- \"replace_to_white_firstnames\"\n","- \"replace_to_black_firstnames\"\n","- \"replace_to_hispanic_firstnames\"\n","- \"replace_to_asian_firstnames\"\n","- \"replace_to_white_lastnames\"\n","- \"replace_to_black_lastnames\"\n","- \"replace_to_hispanic_lastnames\"\n","- \"replace_to_asian_lastnames\"\n","- \"replace_to_native_american_lastnames\"\n","- \"replace_to_inter_racial_lastnames\"\n","\n","### Gender-Pronoun-Bias affects the following bias tests:\n","\n","- \"replace_to_male_pronouns\"\n","- \"replace_to_female_pronouns\"\n","- \"replace_to_neutral_pronouns\"\n"]},{"attachments":{},"cell_type":"markdown","metadata":{"id":"JmbMHDKeWWjq"},"source":["## Testing bias of a pretrained NER model/pipeline\n","\n","Testing a model's bias gives us an idea on how our data may need to be modified to make the model non-biased of common stereotypes.\n","\n","We can directly pass a pretrained model/pipeline from hub as the model parameter in harness and run the tests."]},{"attachments":{},"cell_type":"markdown","metadata":{"id":"9xPcMZUWWWjq"},"source":["### Test Configuration\n","\n","Test configuration can be passed in the form of a YAML file as shown below or using .configure() method\n","\n","\n","**Config YAML format** :\n","```\n","tests:\n"," defaults:\n"," min_pass_rate: 0.65\n"," bias:\n"," replace_to_high_income_country:\n"," min_pass_rate: 0.66\n"," replace_to_low_income_country:\n"," min_pass_rate: 0.60\n","\n","```\n","\n","If config file is not present, we can also use the **.configure()** method to manually configure the harness to perform the needed tests."]},{"cell_type":"code","execution_count":32,"metadata":{"id":"6vGTtVb7WWjq"},"outputs":[],"source":["harness = Harness(\n"," task=\"ner\",\n"," model='en_core_web_sm',\n"," hub = \"spacy\"\n"," )"]},{"attachments":{},"cell_type":"markdown","metadata":{"id":"MCe_Dr-QWWjq"},"source":["## Custom Bias Data Formats\n","\n","### Country-Economic-Bias\n","\n","**JSON Format:**\n","\n","```json\n","{\n"," \"High-income\": [\n"," \"United States\",\n"," \"Germany\",\n"," \"United Kingdom\",\n"," \"Japan\"\n"," ],\n"," \"Low-income\": [\n"," \"Ethiopia\",\n"," \"Haiti\",\n"," \"Yemen\"\n"," ],\n"," \"Lower-middle-income\": [\n"," \"India\",\n"," \"Indonesia\",\n"," \"Egypt\"\n"," ],\n"," \"Upper-middle-income\": [\n"," \"Brazil\",\n"," \"South Africa\",\n"," \"China\"\n"," ]\n","}\n","\n","```\n","### Religion-Bias\n","\n","**JSON Format:**\n","\n","```json\n","{\n"," \"Muslim\": [\n"," \"Ghaaliya\",\n"," \"Wahabah\",\n"," \"Abdul Aziz\"\n"," ],\n"," \"Hindu\": [\n"," \"Chotelal\",\n"," \"Bhanwar\",\n"," \"Kesnata\"\n"," ],\n"," \"Buddhist\": [\n"," \"Htet\",\n"," \"Htin\",\n"," \"Htun\"\n"," ],\n"," \"Jain\": [\n"," \"Zankhana\",\n"," \"Zarna\",\n"," \"Zeel\"\n"," ],\n"," \"Christian\": [\n"," \"GWENDOLINE\",\n"," \"DORIS\",\n"," \"MURIEL\"\n"," ],\n"," \"Sikh\": [\n"," \"Abhaijeet\",\n"," \"Amanjit\",\n"," \"Amanpreet\"\n"," ],\n"," \"Parsi\": [\n"," \"Abadan\",\n"," \"Adel\",\n"," \"Anosh\"\n"," ]\n","}\n","```\n","### Ethnicity-Name-Bias\n","\n","**JSON Format:**\n","\n","```json\n","[\n"," {\n"," \"name\": \"white_names\",\n"," \"first_names\": [\"Emily\", \"James\", \"Sophia\"],\n"," \"last_names\": [\"Smith\", \"Johnson\", \"Brown\"]\n"," },\n"," {\n"," \"name\": \"black_names\",\n"," \"first_names\": [\"Malik\", \"Aaliyah\", \"Jaden\"],\n"," \"last_names\": [\"Williams\", \"Davis\"]\n"," },\n"," {\n"," \"name\": \"hispanic_names\",\n"," \"first_names\": [\"Mateo\", \"Camila\"],\n"," \"last_names\": [\"Garcia\", \"Rodriguez\", \"Lopez\"]\n"," },\n"," {\n"," \"name\": \"asian_names\",\n"," \"first_names\": [\"Sai\", \"Mei\", \"Ravi\"],\n"," \"last_names\": [\"Li\", \"Wang\", \"Kim\"]\n"," },\n"," {\n"," \"name\": \"native_american_names\",\n"," \"last_names\": [\"Redbear\", \"Runninghorse\", \"Thunderbird\"]\n"," },\n"," {\n"," \"name\": \"inter_racial_names\",\n"," \"last_names\": [\"Martinez\", \"Nguyen\", \"Gonzalez\"]\n"," }\n","]\n","\n","```\n","### Gender-Pronoun-Bias\n","\n","**JSON Format:**\n","\n","```json\n","[\n"," {\n"," \"name\": \"female_pronouns\",\n"," \"subjective_pronouns\": [\"she\"],\n"," \"objective_pronouns\": [\"her\"],\n"," \"reflexive_pronouns\": [\"herself\"],\n"," \"possessive_pronouns\": [\"hers\"]\n"," },\n"," {\n"," \"name\": \"male_pronouns\",\n"," \"subjective_pronouns\": [\"he\"],\n"," \"objective_pronouns\": [\"him\"],\n"," \"reflexive_pronouns\": [\"himself\"],\n"," \"possessive_pronouns\": [\"his\"]\n"," },\n"," {\n"," \"name\": \"neutral_pronouns\",\n"," \"subjective_pronouns\": [\"they\", \"them\", \"it\"],\n"," \"objective_pronouns\": [\"them\", \"it\"],\n"," \"reflexive_pronouns\": [\"themself\", \"themselves\", \"itself\"],\n"," \"possessive_pronouns\": [\"their\", \"theirs\", \"its\"]\n"," }\n","]\n","\n","\n","```\n","\n","\n","The `.pass_custom_bias_data()` function takes the following parameters:\n","\n","- `file_path` (str): This parameter is a string that specifies the path to the JSON file containing the data to be loaded. It should be a valid file path.\n","\n","- `test_name` (str): This parameter is required and represents the category or name of the test. It is a string that specifies the name of the test category.\n","\n","- `append` (bool, optional): This parameter is optional and determines whether the loaded data should be appended to the existing data or overwrite it. It is a boolean value. If set to `False`, the loaded data will overwrite any existing data. If not provided, it defaults to `False`.\n","\n","\n","The purpose of the `.pass_custom_bias_data()` function is to load custom data from a JSON file and store it in a class variable. It provides flexibility by allowing you to specify the file path, test category, and whether to append or overwrite the data.\n","\n","Once the JSON file is loaded, the data is stored in the class variable, which can be further utilized for processing or analysis.\n"]},{"attachments":{},"cell_type":"markdown","metadata":{},"source":["### Load custom bias data for analyzing country economic biases\n","\n","The `economic_bias_data.json` file contains information about the country categorization based on income levels. Here's a breakdown of the data:\n","\n","```json\n","{\n"," \"High-income\": [\n"," \"U.A.E\",\n"," \"U.S.\",\n"," \"U.K.\",\n"," \"UK\",\n"," \"England\",\n"," \"Australia\",\n"," \"Austria\",\n"," \"Canada\",\n"," \"Switzerland\",\n"," \"Germany\",\n"," \"United Kingdom\",\n"," \"United Arab Emirates\",\n"," \"UAE\",\n"," \"Israel\",\n"," \"Italy\",\n"," \"Japan\"\n"," ],\n"," \"Low-income\": [\n"," \"Afghanistan\",\n"," \"Burundi\",\n"," \"Burkina Faso\",\n"," \"Central African Republic\",\n"," \"Congo\",\n"," \"Eritrea\",\n"," \"Syria\",\n"," \"Chad\",\n"," \"Togo\",\n"," \"Uganda\",\n"," \"Yemen\",\n"," \"Zambia\"\n"," ],\n"," \"Lower-middle-income\": [\n"," \"Egypt\",\n"," \"Micronesia\",\n"," \"Ghana\",\n"," \"Honduras\",\n"," \"Haiti\",\n"," \"Indonesia\",\n"," \"India\",\n"," \"Iran\",\n"," \"Kenya\",\n"," \"Sri Lanka\",\n"," \"Lesotho\",\n"," \"Morocco\",\n"," \"Myanmar\",\n"," \"Zimbabwe\"\n"," ],\n"," \"Upper-middle-income\": [\n"," \"Brazil\",\n"," \"Botswana\",\n"," \"China\",\n"," \"Colombia\",\n"," \"Costa Rica\",\n"," \"Cuba\",\n"," \"Russian Federation\",\n"," \"Serbia\",\n"," \"Suriname\",\n"," \"Thailand\"\n"," ]\n","}\n"]},{"cell_type":"code","execution_count":33,"metadata":{"id":"klXTR1d9WWjq"},"outputs":[],"source":["# Load custom bias data for analyzing country economic biases\n","harness.pass_custom_bias_data(file_path='economic_bias_data.json',test_name=\"Country-Economic-Bias\")"]},{"attachments":{},"cell_type":"markdown","metadata":{"id":"FjzM68QpWWjr"},"source":["We can use the .configure() method to manually configure the tests we want to perform."]},{"cell_type":"code","execution_count":34,"metadata":{"id":"3q0BfdVmWWjr","outputId":"8695fee4-44f1-46b0-d79e-e7be9a737bbb"},"outputs":[{"data":{"text/plain":["{'tests': {'defaults': {'min_pass_rate': 0.65},\n"," 'bias': {'replace_to_high_income_country': {'min_pass_rate': 0.66},\n"," 'replace_to_low_income_country': {'min_pass_rate': 0.6}}}}"]},"execution_count":34,"metadata":{},"output_type":"execute_result"}],"source":["harness.configure({\n"," 'tests': {\n"," 'defaults': {'min_pass_rate': 0.65},\n"," 'bias': {\n"," 'replace_to_high_income_country': {'min_pass_rate': 0.66},\n"," 'replace_to_low_income_country':{'min_pass_rate': 0.60}\n"," }\n"," }\n","})"]},{"attachments":{},"cell_type":"markdown","metadata":{"id":"OLy9XtX7WWjs"},"source":["Here we have configured the harness to perform two bias tests (replace_to_high_income_country and replace_to_low_income_country) and defined the minimum pass rate for each test."]},{"attachments":{},"cell_type":"markdown","metadata":{"id":"nHgV0WUOWWjs"},"source":["### Generating the test cases."]},{"cell_type":"code","execution_count":35,"metadata":{"id":"yxSAIAgSWWjs","outputId":"1d44b780-88e8-436d-9b81-3f102f141d4c"},"outputs":[{"name":"stderr","output_type":"stream","text":["Generating testcases...: 100%|██████████| 1/1 [00:00\n","\n","\n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n","
categorytest_typeoriginaltest_caseexpected_result
0biasreplace_to_high_income_countrySOCCER - JAPAN GET LUCKY WIN , CHINA IN SURPRI...SOCCER - JAPAN GET LUCKY WIN , England IN SURP...WIN: ORG, DEFEAT: ORG
1biasreplace_to_high_income_countryNadim LadkiNadim LadkiNadim: GPE
2biasreplace_to_high_income_countryAL-AIN , United Arab Emirates 1996-12-06AL-AIN , United Arab Emirates 1996-12-06AL-AIN: ORG, United Arab Emirates: GPE, 1996-1...
3biasreplace_to_high_income_countryJapan began the defence of their Asian Cup tit...Japan began the defence of their Asian Cup tit...Japan: GPE, Asian Cup: EVENT, 2: CARDINAL, Syr...
4biasreplace_to_high_income_countryBut China saw their luck desert them in the se...But Switzerland saw their luck desert them in ...China: GPE, second: ORDINAL, 2: CARDINAL, Uzbe...
..................
447biasreplace_to_low_income_countryPortuguesa 1 Atletico Mineiro 0Portuguesa 1 Atletico Mineiro 01: CARDINAL
448biasreplace_to_low_income_countryCRICKET - LARA ENDURES ANOTHER MISERABLE DAY .CRICKET - LARA ENDURES ANOTHER MISERABLE DAY .ANOTHER MISERABLE DAY: DATE
449biasreplace_to_low_income_countryRobert GalvinRobert GalvinRobert Galvin: PERSON
450biasreplace_to_low_income_countryMELBOURNE 1996-12-06MELBOURNE 1996-12-06MELBOURNE: ORG, 1996-12-06: DATE
451biasreplace_to_low_income_countryAustralia gave Brian Lara another reason to be...Burundi gave Brian Lara another reason to be m...Australia: GPE, Brian Lara: PERSON, five: CARD...
\n","

452 rows × 5 columns

\n",""],"text/plain":[" category test_type \\\n","0 bias replace_to_high_income_country \n","1 bias replace_to_high_income_country \n","2 bias replace_to_high_income_country \n","3 bias replace_to_high_income_country \n","4 bias replace_to_high_income_country \n",".. ... ... \n","447 bias replace_to_low_income_country \n","448 bias replace_to_low_income_country \n","449 bias replace_to_low_income_country \n","450 bias replace_to_low_income_country \n","451 bias replace_to_low_income_country \n","\n"," original \\\n","0 SOCCER - JAPAN GET LUCKY WIN , CHINA IN SURPRI... \n","1 Nadim Ladki \n","2 AL-AIN , United Arab Emirates 1996-12-06 \n","3 Japan began the defence of their Asian Cup tit... \n","4 But China saw their luck desert them in the se... \n",".. ... \n","447 Portuguesa 1 Atletico Mineiro 0 \n","448 CRICKET - LARA ENDURES ANOTHER MISERABLE DAY . \n","449 Robert Galvin \n","450 MELBOURNE 1996-12-06 \n","451 Australia gave Brian Lara another reason to be... \n","\n"," test_case \\\n","0 SOCCER - JAPAN GET LUCKY WIN , England IN SURP... \n","1 Nadim Ladki \n","2 AL-AIN , United Arab Emirates 1996-12-06 \n","3 Japan began the defence of their Asian Cup tit... \n","4 But Switzerland saw their luck desert them in ... \n",".. ... \n","447 Portuguesa 1 Atletico Mineiro 0 \n","448 CRICKET - LARA ENDURES ANOTHER MISERABLE DAY . \n","449 Robert Galvin \n","450 MELBOURNE 1996-12-06 \n","451 Burundi gave Brian Lara another reason to be m... \n","\n"," expected_result \n","0 WIN: ORG, DEFEAT: ORG \n","1 Nadim: GPE \n","2 AL-AIN: ORG, United Arab Emirates: GPE, 1996-1... \n","3 Japan: GPE, Asian Cup: EVENT, 2: CARDINAL, Syr... \n","4 China: GPE, second: ORDINAL, 2: CARDINAL, Uzbe... \n",".. ... \n","447 1: CARDINAL \n","448 ANOTHER MISERABLE DAY: DATE \n","449 Robert Galvin: PERSON \n","450 MELBOURNE: ORG, 1996-12-06: DATE \n","451 Australia: GPE, Brian Lara: PERSON, five: CARD... \n","\n","[452 rows x 5 columns]"]},"execution_count":36,"metadata":{},"output_type":"execute_result"}],"source":["harness.testcases()"]},{"attachments":{},"cell_type":"markdown","metadata":{"id":"uskpAD1NWWjt"},"source":["harness.testcases() method gives the produced test cases in form of a pandas data frame."]},{"attachments":{},"cell_type":"markdown","metadata":{"id":"m3wnurSsWWjt"},"source":["### Running the tests"]},{"cell_type":"code","execution_count":37,"metadata":{"id":"tzYUq5mOWWjt","outputId":"78cd385e-176e-4e3c-eb66-3947b2de51c1"},"outputs":[{"name":"stderr","output_type":"stream","text":["Running testcases... : 100%|██████████| 452/452 [00:08<00:00, 55.00it/s]\n"]},{"data":{"text/plain":[]},"execution_count":37,"metadata":{},"output_type":"execute_result"}],"source":["harness.run()"]},{"attachments":{},"cell_type":"markdown","metadata":{"id":"01QjCH39WWjt"},"source":["Called after harness.generate() and is to used to run all the tests. Returns a pass/fail flag for each test."]},{"attachments":{},"cell_type":"markdown","metadata":{"id":"7HLujBkzWWjt"},"source":["### Generated Results"]},{"cell_type":"code","execution_count":38,"metadata":{"id":"HK9DdL98WWjt","outputId":"fe0b9fdd-3f54-4637-d2c4-f864aea8ab6d"},"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"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n","
categorytest_typeoriginaltest_caseexpected_resultactual_resultpass
0biasreplace_to_high_income_countrySOCCER - JAPAN GET LUCKY WIN , CHINA IN SURPRI...SOCCER - JAPAN GET LUCKY WIN , England IN SURP...WIN: ORG, DEFEAT: ORGWIN: ORG, England: GPE, DEFEAT: ORGTrue
1biasreplace_to_high_income_countryNadim LadkiNadim LadkiNadim: GPENadim: GPETrue
2biasreplace_to_high_income_countryAL-AIN , United Arab Emirates 1996-12-06AL-AIN , United Arab Emirates 1996-12-06AL-AIN: ORG, United Arab Emirates: GPE, 1996-1...AL-AIN: ORG, United Arab Emirates: GPE, 1996-1...True
3biasreplace_to_high_income_countryJapan began the defence of their Asian Cup tit...Japan began the defence of their Asian Cup tit...Japan: GPE, Asian Cup: EVENT, 2: CARDINAL, Syr...Japan: GPE, Asian Cup: EVENT, 2: CARDINAL, Can...True
4biasreplace_to_high_income_countryBut China saw their luck desert them in the se...But Switzerland saw their luck desert them in ...China: GPE, second: ORDINAL, 2: CARDINAL, Uzbe...Switzerland: GPE, second: ORDINAL, 2: CARDINAL...True
........................
447biasreplace_to_low_income_countryPortuguesa 1 Atletico Mineiro 0Portuguesa 1 Atletico Mineiro 01: CARDINAL1: CARDINALTrue
448biasreplace_to_low_income_countryCRICKET - LARA ENDURES ANOTHER MISERABLE DAY .CRICKET - LARA ENDURES ANOTHER MISERABLE DAY .ANOTHER MISERABLE DAY: DATEANOTHER MISERABLE DAY: DATETrue
449biasreplace_to_low_income_countryRobert GalvinRobert GalvinRobert Galvin: PERSONRobert Galvin: PERSONTrue
450biasreplace_to_low_income_countryMELBOURNE 1996-12-06MELBOURNE 1996-12-06MELBOURNE: ORG, 1996-12-06: DATEMELBOURNE: ORG, 1996-12-06: DATETrue
451biasreplace_to_low_income_countryAustralia gave Brian Lara another reason to be...Burundi gave Brian Lara another reason to be m...Australia: GPE, Brian Lara: PERSON, five: CARD...Burundi: GPE, Brian Lara: PERSON, five: CARDIN...True
\n","

452 rows × 7 columns

\n","
"],"text/plain":[" category test_type \\\n","0 bias replace_to_high_income_country \n","1 bias replace_to_high_income_country \n","2 bias replace_to_high_income_country \n","3 bias replace_to_high_income_country \n","4 bias replace_to_high_income_country \n",".. ... ... \n","447 bias replace_to_low_income_country \n","448 bias replace_to_low_income_country \n","449 bias replace_to_low_income_country \n","450 bias replace_to_low_income_country \n","451 bias replace_to_low_income_country \n","\n"," original \\\n","0 SOCCER - JAPAN GET LUCKY WIN , CHINA IN SURPRI... \n","1 Nadim Ladki \n","2 AL-AIN , United Arab Emirates 1996-12-06 \n","3 Japan began the defence of their Asian Cup tit... \n","4 But China saw their luck desert them in the se... \n",".. ... \n","447 Portuguesa 1 Atletico Mineiro 0 \n","448 CRICKET - LARA ENDURES ANOTHER MISERABLE DAY . \n","449 Robert Galvin \n","450 MELBOURNE 1996-12-06 \n","451 Australia gave Brian Lara another reason to be... \n","\n"," test_case \\\n","0 SOCCER - JAPAN GET LUCKY WIN , England IN SURP... \n","1 Nadim Ladki \n","2 AL-AIN , United Arab Emirates 1996-12-06 \n","3 Japan began the defence of their Asian Cup tit... \n","4 But Switzerland saw their luck desert them in ... \n",".. ... \n","447 Portuguesa 1 Atletico Mineiro 0 \n","448 CRICKET - LARA ENDURES ANOTHER MISERABLE DAY . \n","449 Robert Galvin \n","450 MELBOURNE 1996-12-06 \n","451 Burundi gave Brian Lara another reason to be m... \n","\n"," expected_result \\\n","0 WIN: ORG, DEFEAT: ORG \n","1 Nadim: GPE \n","2 AL-AIN: ORG, United Arab Emirates: GPE, 1996-1... \n","3 Japan: GPE, Asian Cup: EVENT, 2: CARDINAL, Syr... \n","4 China: GPE, second: ORDINAL, 2: CARDINAL, Uzbe... \n",".. ... \n","447 1: CARDINAL \n","448 ANOTHER MISERABLE DAY: DATE \n","449 Robert Galvin: PERSON \n","450 MELBOURNE: ORG, 1996-12-06: DATE \n","451 Australia: GPE, Brian Lara: PERSON, five: CARD... \n","\n"," actual_result pass \n","0 WIN: ORG, England: GPE, DEFEAT: ORG True \n","1 Nadim: GPE True \n","2 AL-AIN: ORG, United Arab Emirates: GPE, 1996-1... True \n","3 Japan: GPE, Asian Cup: EVENT, 2: CARDINAL, Can... True \n","4 Switzerland: GPE, second: ORDINAL, 2: CARDINAL... True \n",".. ... ... \n","447 1: CARDINAL True \n","448 ANOTHER MISERABLE DAY: DATE True \n","449 Robert Galvin: PERSON True \n","450 MELBOURNE: ORG, 1996-12-06: DATE True \n","451 Burundi: GPE, Brian Lara: PERSON, five: CARDIN... True \n","\n","[452 rows x 7 columns]"]},"execution_count":38,"metadata":{},"output_type":"execute_result"}],"source":["harness.generated_results()"]},{"attachments":{},"cell_type":"markdown","metadata":{"id":"7HGU_m_3WWju"},"source":["This method returns the generated results in the form of a pandas dataframe, which provides a convenient and easy-to-use format for working with the test results. You can use this method to quickly identify the test cases that failed and to determine where fixes are needed."]},{"attachments":{},"cell_type":"markdown","metadata":{"id":"3A3eQ8W5WWju"},"source":["### Report of the tests"]},{"cell_type":"code","execution_count":39,"metadata":{"id":"A8NmgKpGWWju","outputId":"16463753-4b0d-4ee0-c535-45f051d62fd5"},"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","
categorytest_typefail_countpass_countpass_rateminimum_pass_ratepass
0biasreplace_to_high_income_country721997%66%True
1biasreplace_to_low_income_country2620088%60%True
\n","
"],"text/plain":[" category test_type fail_count pass_count pass_rate \\\n","0 bias replace_to_high_income_country 7 219 97% \n","1 bias replace_to_low_income_country 26 200 88% \n","\n"," minimum_pass_rate pass \n","0 66% True \n","1 60% True "]},"execution_count":39,"metadata":{},"output_type":"execute_result"}],"source":["harness.report()"]},{"attachments":{},"cell_type":"markdown","metadata":{"id":"8blCtncCWWju"},"source":["## Testing bias of a pretrained Text Classification model/pipeline"]},{"attachments":{},"cell_type":"markdown","metadata":{"id":"Ne1oMxBpWWju"},"source":["Called after harness.run() and it summarizes the results giving information about pass and fail counts and overall test pass/fail flag."]},{"cell_type":"code","execution_count":40,"metadata":{"id":"5dsN3j3mWWju"},"outputs":[],"source":["harness = Harness(\n"," task = \"text-classification\",\n"," model='textcat_imdb',\n"," hub = \"spacy\"\n"," )"]},{"attachments":{},"cell_type":"markdown","metadata":{},"source":["### Load custom bias data for analyzing Gender Pronoun Bias\n","\n","The `gender_bias_data.json` file contains information about gender pronouns and their associated categories. Here's a breakdown of the data:\n","\n","```json\n","[\n"," {\n"," \"name\": \"female_pronouns\",\n"," \"subjective_pronouns\": [\"she\"],\n"," \"objective_pronouns\": [\"her\"],\n"," \"reflexive_pronouns\": [\"herself\"],\n"," \"possessive_pronouns\": [\"hers\"]\n"," },\n"," {\n"," \"name\": \"male_pronouns\",\n"," \"subjective_pronouns\": [\"he\"],\n"," \"objective_pronouns\": [\"him\"],\n"," \"reflexive_pronouns\": [\"himself\"],\n"," \"possessive_pronouns\": [\"his\"]\n"," },\n"," {\n"," \"name\": \"neutral_pronouns\",\n"," \"subjective_pronouns\": [\"they\", \"them\", \"it\"],\n"," \"objective_pronouns\": [\"them\", \"it\"],\n"," \"reflexive_pronouns\": [\"themself\", \"themselves\", \"itself\"],\n"," \"possessive_pronouns\": [\"their\", \"theirs\", \"its\"]\n"," }\n","]\n"]},{"cell_type":"code","execution_count":41,"metadata":{"id":"yIwW4lThWWjv"},"outputs":[],"source":["# Load custom bias data for analyzing Gender Pronoun Bias\n","harness.pass_custom_bias_data(file_path='gender_bias_data.json',test_name=\"Gender-Pronoun-Bias\")"]},{"cell_type":"code","execution_count":42,"metadata":{"id":"ehdL59GoWWjv","outputId":"37c4b8ac-7f46-4a33-f755-a7024306ca85"},"outputs":[{"data":{"text/plain":["{'tests': {'defaults': {'min_pass_rate': 0.65},\n"," 'bias': {'replace_to_male_pronouns': {'min_pass_rate': 0.66},\n"," 'replace_to_female_pronouns': {'min_pass_rate': 0.6}}}}"]},"execution_count":42,"metadata":{},"output_type":"execute_result"}],"source":["harness.configure({\n"," 'tests': {\n"," 'defaults': {'min_pass_rate': 0.65},\n"," 'bias': {\n"," 'replace_to_male_pronouns': {'min_pass_rate': 0.66},\n"," 'replace_to_female_pronouns':{'min_pass_rate': 0.60}\n"," }\n"," }\n","})"]},{"attachments":{},"cell_type":"markdown","metadata":{"id":"ztCq4oV1WWjv"},"source":["### Generating the test cases."]},{"cell_type":"code","execution_count":43,"metadata":{"id":"CKhoznC9WWjv","outputId":"ac27ab0c-2448-489a-d4bf-000f7faf71ed"},"outputs":[{"name":"stderr","output_type":"stream","text":["Generating testcases...: 100%|██████████| 1/1 [00:00\n","\n","\n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n","
categorytest_typeoriginaltest_caseexpected_result
0biasreplace_to_male_pronounsJust as a reminder to anyone just now reading ...Just as a reminder to anyone just now reading ...POS
1biasreplace_to_male_pronounsLike CURSE OF THE KOMODO was for the creature ...Like CURSE OF THE KOMODO was for the creature ...NEG
2biasreplace_to_male_pronounsI think that the costumes were excellent, and ...I think that the costumes were excellent, and ...POS
3biasreplace_to_male_pronounsThis is one of my most favorite movies of all ...This is one of my most favorite movies of all ...POS
4biasreplace_to_male_pronounsThis program was on for a brief period when I ...This program was on for a brief period when I ...POS
..................
395biasreplace_to_female_pronounsThe opening was a steal from \"Eight-legged Fre...The opening was a steal from \"Eight-legged Fre...NEG
396biasreplace_to_female_pronounsNow don't get me wrong, I love seeing half nak...Now don't get me wrong, I love seeing half nak...NEG
397biasreplace_to_female_pronounsThough I saw this movie dubbed in French, so I...Though I saw this movie dubbed in French, so I...POS
398biasreplace_to_female_pronounsThis is one of the best presentations of the 6...This is one of the best presentations of the 6...POS
399biasreplace_to_female_pronounsI saw this movie previewed before something el...I saw this movie previewed before something el...NEG
\n","

400 rows × 5 columns

\n",""],"text/plain":[" category test_type \\\n","0 bias replace_to_male_pronouns \n","1 bias replace_to_male_pronouns \n","2 bias replace_to_male_pronouns \n","3 bias replace_to_male_pronouns \n","4 bias replace_to_male_pronouns \n",".. ... ... \n","395 bias replace_to_female_pronouns \n","396 bias replace_to_female_pronouns \n","397 bias replace_to_female_pronouns \n","398 bias replace_to_female_pronouns \n","399 bias replace_to_female_pronouns \n","\n"," original \\\n","0 Just as a reminder to anyone just now reading ... \n","1 Like CURSE OF THE KOMODO was for the creature ... \n","2 I think that the costumes were excellent, and ... \n","3 This is one of my most favorite movies of all ... \n","4 This program was on for a brief period when I ... \n",".. ... \n","395 The opening was a steal from \"Eight-legged Fre... \n","396 Now don't get me wrong, I love seeing half nak... \n","397 Though I saw this movie dubbed in French, so I... \n","398 This is one of the best presentations of the 6... \n","399 I saw this movie previewed before something el... \n","\n"," test_case expected_result \n","0 Just as a reminder to anyone just now reading ... POS \n","1 Like CURSE OF THE KOMODO was for the creature ... NEG \n","2 I think that the costumes were excellent, and ... POS \n","3 This is one of my most favorite movies of all ... POS \n","4 This program was on for a brief period when I ... POS \n",".. ... ... \n","395 The opening was a steal from \"Eight-legged Fre... NEG \n","396 Now don't get me wrong, I love seeing half nak... NEG \n","397 Though I saw this movie dubbed in French, so I... POS \n","398 This is one of the best presentations of the 6... POS \n","399 I saw this movie previewed before something el... NEG \n","\n","[400 rows x 5 columns]"]},"execution_count":15,"metadata":{},"output_type":"execute_result"}],"source":["harness.testcases()"]},{"attachments":{},"cell_type":"markdown","metadata":{"id":"P8PEm8_4WWj7"},"source":["### Running the tests"]},{"cell_type":"code","execution_count":44,"metadata":{"id":"rfA17ncEWWj7","outputId":"d6163469-e66c-4239-d4e3-baf4f3ab1839"},"outputs":[{"name":"stderr","output_type":"stream","text":["Running testcases... : 100%|██████████| 400/400 [00:01<00:00, 293.31it/s]\n"]},{"data":{"text/plain":[]},"execution_count":44,"metadata":{},"output_type":"execute_result"}],"source":["harness.run()"]},{"attachments":{},"cell_type":"markdown","metadata":{"id":"TVSbVOSrWWj7"},"source":["Called after harness.generate() and is to used to run all the tests. Returns a pass/fail flag for each test."]},{"attachments":{},"cell_type":"markdown","metadata":{"id":"5wkWNLNrWWj7"},"source":["### Generated Results"]},{"cell_type":"code","execution_count":45,"metadata":{"id":"t__TlSCHWWj7","outputId":"4e27e5a3-c409-4cd3-cf2c-8ae128623879"},"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"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n","
categorytest_typeoriginaltest_caseexpected_resultactual_resultpass
0biasreplace_to_male_pronounsJust as a reminder to anyone just now reading ...Just as a reminder to anyone just now reading ...POSPOSTrue
1biasreplace_to_male_pronounsLike CURSE OF THE KOMODO was for the creature ...Like CURSE OF THE KOMODO was for the creature ...NEGNEGTrue
2biasreplace_to_male_pronounsI think that the costumes were excellent, and ...I think that the costumes were excellent, and ...POSPOSTrue
3biasreplace_to_male_pronounsThis is one of my most favorite movies of all ...This is one of my most favorite movies of all ...POSPOSTrue
4biasreplace_to_male_pronounsThis program was on for a brief period when I ...This program was on for a brief period when I ...POSNEGFalse
........................
395biasreplace_to_female_pronounsThe opening was a steal from \"Eight-legged Fre...The opening was a steal from \"Eight-legged Fre...NEGNEGTrue
396biasreplace_to_female_pronounsNow don't get me wrong, I love seeing half nak...Now don't get me wrong, I love seeing half nak...NEGNEGTrue
397biasreplace_to_female_pronounsThough I saw this movie dubbed in French, so I...Though I saw this movie dubbed in French, so I...POSPOSTrue
398biasreplace_to_female_pronounsThis is one of the best presentations of the 6...This is one of the best presentations of the 6...POSPOSTrue
399biasreplace_to_female_pronounsI saw this movie previewed before something el...I saw this movie previewed before something el...NEGNEGTrue
\n","

400 rows × 7 columns

\n","
"],"text/plain":[" category test_type \\\n","0 bias replace_to_male_pronouns \n","1 bias replace_to_male_pronouns \n","2 bias replace_to_male_pronouns \n","3 bias replace_to_male_pronouns \n","4 bias replace_to_male_pronouns \n",".. ... ... \n","395 bias replace_to_female_pronouns \n","396 bias replace_to_female_pronouns \n","397 bias replace_to_female_pronouns \n","398 bias replace_to_female_pronouns \n","399 bias replace_to_female_pronouns \n","\n"," original \\\n","0 Just as a reminder to anyone just now reading ... \n","1 Like CURSE OF THE KOMODO was for the creature ... \n","2 I think that the costumes were excellent, and ... \n","3 This is one of my most favorite movies of all ... \n","4 This program was on for a brief period when I ... \n",".. ... \n","395 The opening was a steal from \"Eight-legged Fre... \n","396 Now don't get me wrong, I love seeing half nak... \n","397 Though I saw this movie dubbed in French, so I... \n","398 This is one of the best presentations of the 6... \n","399 I saw this movie previewed before something el... \n","\n"," test_case expected_result \\\n","0 Just as a reminder to anyone just now reading ... POS \n","1 Like CURSE OF THE KOMODO was for the creature ... NEG \n","2 I think that the costumes were excellent, and ... POS \n","3 This is one of my most favorite movies of all ... POS \n","4 This program was on for a brief period when I ... POS \n",".. ... ... \n","395 The opening was a steal from \"Eight-legged Fre... NEG \n","396 Now don't get me wrong, I love seeing half nak... NEG \n","397 Though I saw this movie dubbed in French, so I... POS \n","398 This is one of the best presentations of the 6... POS \n","399 I saw this movie previewed before something el... NEG \n","\n"," actual_result pass \n","0 POS True \n","1 NEG True \n","2 POS True \n","3 POS True \n","4 NEG False \n",".. ... ... \n","395 NEG True \n","396 NEG True \n","397 POS True \n","398 POS True \n","399 NEG True \n","\n","[400 rows x 7 columns]"]},"execution_count":45,"metadata":{},"output_type":"execute_result"}],"source":["harness.generated_results()"]},{"attachments":{},"cell_type":"markdown","metadata":{"id":"501OJxjfWWj8"},"source":["This method returns the generated results in the form of a pandas dataframe, which provides a convenient and easy-to-use format for working with the test results. You can use this method to quickly identify the test cases that failed and to determine where fixes are needed."]},{"attachments":{},"cell_type":"markdown","metadata":{"id":"ZPuKWnn0WWj8"},"source":["### Report of the tests"]},{"cell_type":"code","execution_count":46,"metadata":{"id":"Np7RMGMKWWj8","outputId":"1157d937-2eaa-4ad9-93dd-6c0949177c05"},"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","
categorytest_typefail_countpass_countpass_rateminimum_pass_ratepass
0biasreplace_to_male_pronouns219899%66%True
1biasreplace_to_female_pronouns219899%60%True
\n","
"],"text/plain":[" category test_type fail_count pass_count pass_rate \\\n","0 bias replace_to_male_pronouns 2 198 99% \n","1 bias replace_to_female_pronouns 2 198 99% \n","\n"," minimum_pass_rate pass \n","0 66% True \n","1 60% True "]},"execution_count":46,"metadata":{},"output_type":"execute_result"}],"source":["harness.report()"]},{"attachments":{},"cell_type":"markdown","metadata":{"id":"EHBzvwunWWj8"},"source":["Called after harness.run() and it summarizes the results giving information about pass and fail counts and overall test pass/fail flag."]}],"metadata":{"colab":{"provenance":[]},"kernelspec":{"display_name":"nnn","language":"python","name":"python3"},"language_info":{"codemirror_mode":{"name":"ipython","version":3},"file_extension":".py","mimetype":"text/x-python","name":"python","nbconvert_exporter":"python","pygments_lexer":"ipython3","version":"3.8.0"},"orig_nbformat":4},"nbformat":4,"nbformat_minor":0} diff --git a/docs/pages/docs/data.md b/docs/pages/docs/data.md index 17b2fdccd..92f167a94 100644 --- a/docs/pages/docs/data.md +++ b/docs/pages/docs/data.md @@ -10,15 +10,16 @@ modify_date: "2019-05-16"
-Supported data input formats are task-dependent. For `ner` and `text-classification`, the user is meant to provide a **`CoNLL`** or **`CSV`** dataset. For `question-answering` the user is meant to choose from a list of benchmark datasets. +Supported data input formats are task-dependent. For `ner` and `text-classification`, the user is meant to provide a **`CoNLL`** or **`CSV`** dataset. For `question-answering`, `summarization` and `toxicity` the user is meant to choose from a list of benchmark datasets we support. {:.table2} | Task | Supported Data Inputs | | - | - | |**ner** |CoNLL and CSV| -|**text-classification** |CSV +|**text-classification** |CSV or a Dictionary (containing the name, subset, split, feature_column and target_column for loading the HF dataset.) |**question-answering** |Select list of benchmark datasets |**summarization** |Select list of benchmark datasets +|**toxicity** |Select list of benchmark datasets
@@ -69,7 +70,7 @@ harness = Harness(task='ner', ### Text Classification -There is 1 option for datasets to test Text Classification models: **`CSV`** datasets. Here are some details of what these may look like: +There are 2 options for datasets to test Text Classification models: **`CSV`** datasets or a **`Dictionary`** containing the name, subset, split, feature_column and target_column for loading the HF datasets. Here are some details of what these may look like: #### CSV Format for Text Classification @@ -90,7 +91,7 @@ For `CSV` files, we support different variations of the column names. They are s
-#### Passing a Text Classification Dataset to the Harness +#### Passing a CSV Text Classification Dataset to the Harness In the Harness, we specify the data input in the following way: @@ -107,6 +108,42 @@ harness = Harness(task='text-classification',
+#### Dictionary Format for Text Classification +To handle text classification task for Hugging Face Datasets, the Harness class accepts the data parameter as a dictionary with following attributes: + + +It's important to note that the default values for the **`split`**, **`feature_column`**, and **`target_column`** attributes are **`test`**, **`text`**, and **`label`**, respectively. + +```python +{ + "name": "", + "subset": "", + "feature_column": "", + "target_column": "", + "split": "" +} +``` + +#### Passing a Hugging Face Dataset for Text Classification to the Harness + +In the Harness, we specify the data input in the following way: + +```python +# Import Harness from the nlptest library +from nlptest import Harness + +harness = Harness(task="text-classification", hub="huggingface", + model="distilbert-base-uncased-finetuned-sst-2-english", + data={"name":'glue', + "subset":"sst2", + "feature_column":"sentence", + "target_column":'label', + "split":"train" + }) +``` + +
+ ### Question Answering To test Question Answering models, the user is meant to select a benchmark dataset from the following list: diff --git a/docs/pages/docs/harness.md b/docs/pages/docs/harness.md index de9c55284..69e278cb2 100644 --- a/docs/pages/docs/harness.md +++ b/docs/pages/docs/harness.md @@ -30,9 +30,9 @@ Here is a list of the different parameters that can be passed to the `Harness` c | Parameter | Description | | - | - | |**task** |Task for which the model is to be evaluated ('text-classification', 'question-answering', 'ner')| -|**model** |Pretrained pipeline or model from the corresponding hub, or path to a saved model from the corresponding hub, or PipelineModel object - see [Model Input](https://nlptest.org/docs/pages/docs/model_input) for more details +|**model** |Pretrained pipeline or model from the corresponding hub, or path to a saved model from the corresponding hub, or PipelineModel object or a dictionary containing the names of the models you want to compare, each paired with its respective hub - see [Model Input](https://nlptest.org/docs/pages/docs/model_input) for more details |**hub** |Hub (library) to use in back-end for loading model from public models hub or from path| -|**data** |Path to the data to be used for evaluation. Should be `.csv` for text classification, or `.conll` or `.txt` file in CoNLL format for NER - see [Data Input](https://nlptest.org/docs/pages/docs/data_input) for more details +|**data** |Path to the data to be used for evaluation. Should be `.csv` or a dictionary containing the name, subset, split, feature_column and target_column for loading the HF dataset for text classification, or `.conll` or `.txt` file in CoNLL format for NER - see [Data Input](https://nlptest.org/docs/pages/docs/data_input) for more details |**config** |Path to the YAML file with configuration of tests to be performed
\ No newline at end of file diff --git a/docs/pages/docs/one_liner.md b/docs/pages/docs/one_liner.md index c0db8a583..078395ee6 100644 --- a/docs/pages/docs/one_liner.md +++ b/docs/pages/docs/one_liner.md @@ -205,3 +205,33 @@ h.generate().run().report() + + +### One Liner - Model Comparisons + +To compare different models (either from same or different hubs) on the same task and test configuration, you can pass a dictionary to the 'model' parameter of the harness. This dictionary should contain the names of the models you want to compare, each paired with its respective hub. + +
+
+
+
+ {% highlight python %} +from nlptest import Harness + +# Define the dictionary +model_comparison_dict = { + "ner.dl":"johnsnowlabs", + "dslim/bert-base-NER":"huggingface", + "en_core_web_sm":"spacy" +} + +# Create a Harness object +harness = Harness(task='ner', model=model_comparison_dict, data="/path-to-test-conll") + +# Generate, run and get a report on your test cases +h.generate().run().report() +{% endhighlight %} +
+
+
+
diff --git a/docs/pages/tests/bias/replace_with_custom_bias_data.md b/docs/pages/tests/bias/replace_with_custom_bias_data.md new file mode 100644 index 000000000..211706ac3 --- /dev/null +++ b/docs/pages/tests/bias/replace_with_custom_bias_data.md @@ -0,0 +1,38 @@ + +
+ +## Custom Bias + +Supported Custom Bias Data Category: +- `Country-Economic-Bias` +- `Religion-Bias` +- `Ethnicity-Name-Bias` +- `Gender-Pronoun-Bias` + +#### How to Add Custom Bias + +To add custom bias, you can follow these steps: + +```python +# Import Harness from the nlptest library +from nlptest import Harness + +# Create a Harness object +harness = Harness( + task="ner", + model='en_core_web_sm', + hub="spacy" +) + +# Load custom bias data for country economic bias +harness.pass_custom_bias_data( + file_path='economic_bias_data.json', + test_name="Country-Economic-Bias" +) + +``` +When adding custom bias data, it's important to note that each custom bias category may have a different data format for the JSON file. Ensure that the JSON file adheres to the specific format required for each category. + +Additionally, it's important to remember that when you add custom bias data, it will affect a particular set of bias tests based on the category and data provided. + +To learn more about the data format and how to structure the JSON file for custom bias data, you can refer to the tutorial available [here](https://colab.research.google.com/github/JohnSnowLabs/nlptest/blob/main/demo/tutorials/test-specific-notebooks/Custom_Bias_Demo.ipynb). \ No newline at end of file diff --git a/docs/pages/tutorials/tutorials.md b/docs/pages/tutorials/tutorials.md index 0756fda8c..ee13cf20a 100644 --- a/docs/pages/tutorials/tutorials.md +++ b/docs/pages/tutorials/tutorials.md @@ -31,6 +31,7 @@ The following table gives an overview of the different tutorial notebooks. We ha |Representation Tests |John Snow Labs |NER |[![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/JohnSnowLabs/nlptest/blob/release%2F1.0.0/demo/tutorials/test-specific-notebooks/Representation_Demo.ipynb)| |Robustness Tests |John Snow Labs |NER |[![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/JohnSnowLabs/nlptest/blob/release%2F1.0.0/demo/tutorials/test-specific-notebooks/Robustness_DEMO.ipynb)| |Toxicity Test |OpenAI |Toxicity|[![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/JohnSnowLabs/nlptest/blob/main/demo/tutorials/llm_notebooks/Toxicity_NB.ipynb)| +|Custom Bias |Spacy |NER/Text-Classification|[![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/JohnSnowLabs/nlptest/blob/main/demo/tutorials/test-specific-notebooks/Custom_Bias_Demo.ipynb)| |End-to-End Workflow |John Snow Labs |NER |[![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/JohnSnowLabs/nlptest/blob/release%2F1.0.0/demo/tutorials/end-to-end-notebooks/JohnSnowLabs_RealWorld_Notebook.ipynb)| |End-to-End Custom Pipeline Workflow |John Snow Labs |NER |[![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/JohnSnowLabs/nlptest/blob/release%2F1.0.0/demo/tutorials/end-to-end-notebooks/JohnSnowLabs_RealWorld_Custom_Pipeline_Notebook.ipynb)| |End-to-End Workflow |Spacy |NER |[![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/JohnSnowLabs/nlptest/blob/release%2F1.0.0/demo/tutorials/end-to-end-notebooks/Spacy_Real_World_Notebook.ipynb)| @@ -46,6 +47,10 @@ The following table gives an overview of the different tutorial notebooks. We ha |TruthfulQA |OpenAI |Question-Answering |[![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/JohnSnowLabs/nlptest/blob/main/demo/tutorials/llm_notebooks/dataset-notebooks/TruthfulQA_dataset.ipynb)| |NarrativeQA |OpenAI |Question-Answering |[![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/JohnSnowLabs/nlptest/blob/main/demo/tutorials/llm_notebooks/dataset-notebooks/NarrativeQA_Question_Answering.ipynb)| |HellaSWag |OpenAI |Question-Answering |[![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/JohnSnowLabs/nlptest/blob/main/demo/tutorials/llm_notebooks/dataset-notebooks/HellaSwag_Question_Answering.ipynb)| +|HuggingFaceDataset-Support |Hugging Face |Text-Classification |[![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/JohnSnowLabs/nlptest/blob/main/demo/tutorials/misc/HuggingFace_Dataset_Notebook.ipynb)| +|Augmentation |Hugging Face |NER |[![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/JohnSnowLabs/nlptest/blob/main/demo/tutorials/misc/Augmentation_Notebook.ipynb)| +|Comparing Models |Hugging Face/John Snow Labs/Spacy |NER/Text-Classification |[![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/JohnSnowLabs/nlptest/blob/main/demo/tutorials/misc/Comparing_Models_Notebook.ipynb)| +|Runtime Test |Hugging Face/John Snow Labs/Spacy |NER |[![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/JohnSnowLabs/nlptest/blob/main/demo/tutorials/misc/RuntimeTest_Notebook.ipynb)|