diff --git a/.circleci/config.yml b/.circleci/config.yml
deleted file mode 100644
index b13344f..0000000
--- a/.circleci/config.yml
+++ /dev/null
@@ -1,16 +0,0 @@
-version: '2.1'
-orbs:
- python: circleci/python@2.0.3
-
-workflows:
- main:
- jobs:
- - python/test:
- pkg-manager: pip
- test-tool: pytest
- test-tool-args: tests
- version: '3.7'
- setup:
- - python/install-packages:
- pip-dependency-file: requirements-dev.txt
- pkg-manager: pip
diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml
new file mode 100644
index 0000000..62c0d7e
--- /dev/null
+++ b/.github/workflows/ci.yaml
@@ -0,0 +1,37 @@
+name: Tests
+on:
+ push:
+ branches:
+ - "master"
+ - "develop"
+ pull_request:
+ branches:
+ - "master"
+ - "develop"
+jobs:
+ pytest:
+ runs-on: ubuntu-latest
+
+ steps:
+ - uses: actions/checkout@v3
+ - name: Set up Python
+ uses: actions/setup-python@v4
+ with:
+ python-version: "3.7"
+ cache: "pip"
+
+ - name: Install dependencies
+ run: |
+ python -m pip install --upgrade pip
+ pip install flake8 pytest
+ if [ -f requirements.txt ]; then pip install -r requirements.txt; fi
+ if [ -f requirements-dev.txt ]; then pip install -r requirements-dev.txt; fi
+ - name: Lint with flake8
+ run: |
+ # stop the build if there are Python syntax errors or undefined names
+ flake8 wefe --count --select=E9,F63,F7,F82 --show-source --statistics
+ # exit-zero treats all errors as warnings. The GitHub editor is 127 chars wide
+ flake8 wefe --count --exit-zero --max-complexity=10 --max-line-length=127 --statistics
+ - name: Test with pytest
+ run: |
+ pytest tests
diff --git a/.gitignore b/.gitignore
index 38703dd..40a15ab 100644
--- a/.gitignore
+++ b/.gitignore
@@ -7,11 +7,12 @@ __pycache__/
*.so
# scikit-learn specific
-doc/_build/
-doc/auto_examples/
-doc/modules/generated/
-doc/datasets/generated/
-doc/api/generated/
+docs/_build/
+docs/_build/*
+docs/auto_examples/
+docs/modules/generated/
+docs/datasets/generated/
+docs/api/generated/
# Distribution / packaging
@@ -62,8 +63,9 @@ coverage.xml
*.log
# Sphinx documentation
-doc/_build/
-doc/generated/
+docs/_build/
+docs/generated/
+docs/results/
# PyBuilder
target/
@@ -74,19 +76,21 @@ target/
# jupyter
.ipynb_checkpoints/
-.results/*
-.results
+# notebook execution results
+results/*
+results
+docs/user_guide/gender_debiased_glove.kv
+# mypy cache
.mypy_cache
-./doc/results/
-
-develop.ipynb
-
+# conda deploy
conda-deploy/
conda_deploy/
*.csv
*.xls
-doc/user_guide/gender_debiased_glove.kv
\ No newline at end of file
+# coverage files
+cov.xml
+test-results/junit.xml
diff --git a/.readthedocs.yaml b/.readthedocs.yaml
new file mode 100644
index 0000000..ade5e71
--- /dev/null
+++ b/.readthedocs.yaml
@@ -0,0 +1,16 @@
+version: 2
+
+formats:
+ - epub
+ - pdf
+
+sphinx:
+ configuration: docs/conf.py
+
+python:
+ version: "3.7"
+ install:
+ - requirements: requirements.txt
+ - requirements: requirements-dev.txt
+ - method: pip
+ path: .
diff --git a/.readthedocs.yml b/.readthedocs.yml
deleted file mode 100644
index 8fbae9f..0000000
--- a/.readthedocs.yml
+++ /dev/null
@@ -1,9 +0,0 @@
-formats:
- - epub
- - pdf
-requirements_file: requirements.txt
-python:
- version: 3.7
- install:
- - requirements: requirements.txt
- - requirements: requirements-dev.txt
\ No newline at end of file
diff --git a/LICENSE b/LICENSE
index 6f22c3d..f4b0791 100644
--- a/LICENSE
+++ b/LICENSE
@@ -1,27 +1,21 @@
-Copyright (c) 2016, Vighnesh Birodkar and scikit-learn-contrib contributors
-All rights reserved.
+MIT License
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are met:
+Copyright (c) 2022 WEFE Team
-* Redistributions of source code must retain the above copyright notice, this
- list of conditions and the following disclaimer.
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
-* Redistributions in binary form must reproduce the above copyright notice,
- this list of conditions and the following disclaimer in the documentation
- and/or other materials provided with the distribution.
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
-* Neither the name of project-template nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
-AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
-FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
-SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
-CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
-OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/README.rst b/README.rst
index 2fc3dfb..600296b 100644
--- a/README.rst
+++ b/README.rst
@@ -1,28 +1,24 @@
.. -*- mode: rst -*-
-|ReadTheDocs|_ |CircleCI|_ |Conda|_ |CondaLatestRelease|_ |CondaVersion|_
+|License|_ |GithubActions|_ |ReadTheDocs|_ |Downloads|_ |Pypy|_ |CondaVersion|_
+.. |License| image:: https://img.shields.io/github/license/dccuchile/wefe
+.. _License: https://github.com/dccuchile/wefe/blob/master/LICENSE
.. |ReadTheDocs| image:: https://readthedocs.org/projects/wefe/badge/?version=latest
.. _ReadTheDocs: https://wefe.readthedocs.io/en/latest/?badge=latest
+.. |GithubActions| image:: https://github.com/dccuchile/wefe/actions/workflows/ci.yaml/badge.svg?branch=master
+.. _GithubActions: https://github.com/dccuchile/wefe/actions
-.. |CircleCI| image:: https://circleci.com/gh/dccuchile/wefe.svg?style=shield
-.. _CircleCI: https://circleci.com/gh/dccuchile/wefe.svg?style=shield
-
-
-.. |Conda| image:: https://anaconda.org/pbadilla/wefe/badges/installer/conda.svg
-.. _Conda: https://anaconda.org/pbadilla/wefe/badges/installer/conda.svg
-
-
-.. |CondaLatestRelease| image:: https://anaconda.org/pbadilla/wefe/badges/latest_release_date.svg
-.. _CondaLatestRelease: https://anaconda.org/pbadilla/wefe/badges/latest_release_date.svg
+.. |Downloads| image:: https://pepy.tech/badge/wefe
+.. _Downloads: https://pepy.tech/project/wefe
+.. |Pypy| image:: https://badge.fury.io/py/wefe.svg
+.. _Pypy: https://pypi.org/project/wefe/
.. |CondaVersion| image:: https://anaconda.org/pbadilla/wefe/badges/version.svg
-.. _CondaVersion: https://anaconda.org/pbadilla/wefe/badges/version.svg
-
-
+.. _CondaVersion: https://anaconda.org/pbadilla/wefe
WEFE: The Word Embedding Fairness Evaluation Framework
@@ -133,21 +129,34 @@ To compile the documentation, run:
Changelog
=========
-NEW DEVELOP VERSION
+Version 0.4.0
-------------------
+- 3 new bias mitigation methods (debias) implemented: Double Hard Debias, Half
+ Sibling Regression and Repulsion Attraction Neutralization.
+- The library documentation of the library has been restructured.
+ Now, the documentation is divided into user guide and theoretical framework
+ The user guide does not contain theoretical information.
+ Instead, theoretical documentation can be found in the conceptual guides.
+- Improved API documentation and examples. Added multilingual examples contributed
+ by the community.
+- The user guides are fully executable because they are now on notebooks.
+- There was also an important improvement in the API documentation and in metrics and
+ debias examples.
+- Improved library testing mechanisms for metrics and debias methods.
- Fixed wrong repr of query. Now the sets are in the correct order.
-- Greatly improved library testing mechanisms.
-- Improved project documentation. Now, the documentation is divided into user guide and
- theoretical framework. In addition, the user guides are fully executable because they
- are now on notebooks.
+- Implemented repr for WordEmbeddingModel.
+- Testing CI moved from CircleCI to GithubActions.
+- License changed to MIT.
Version 0.3.2
-------------
-- Fixed RNSB bug where the classification labels were interchanged and could produce erroneous results when the attributes are of different sizes.
+- Fixed RNSB bug where the classification labels were interchanged and could produce
+ erroneous results when the attributes are of different sizes.
- Fixed RNSB replication notebook
- Update of WEFE case study scores.
- Improved documentation examples for WEAT, RNSB, RIPA.
-- Holdout parameter added to RNSB, which allows to indicate whether or not a holdout is performed when training the classifier.
+- Holdout parameter added to RNSB, which allows to indicate whether or not a holdout
+ is performed when training the classifier.
- Improved printing of the RNSB evaluation.
Version 0.3.1
@@ -155,16 +164,22 @@ Version 0.3.1
- Update WEFE original case study
- Hotfix: Several bug fixes for execute WEFE original Case Study.
- fetch_eds top_n_race_occupations argument set to 10.
-- Preprocessing: get_embeddings_from_set now returns a list with the lost preprocessed words instead of the original ones.
+- Preprocessing: get_embeddings_from_set now returns a list with the lost
+ preprocessed words instead of the original ones.
Version 0.3.0
-------------
- Implemented Bolukbasi et al. 2016 Hard Debias.
- Implemented Thomas Manzini et al. 2019 Multiclass Hard Debias.
- Implemented a fetch function to retrieve gn-glove female-male word sets.
-- Moved the transformation logic of words, sets and queries to embeddings to its own module: preprocessing
-- Enhanced the preprocessor_args and secondary_preprocessor_args metric preprocessing parameters to an list of preprocessors `preprocessors` together with the parameter `strategy` indicating whether to consider all the transformed words (`'all'`) or only the first one encountered (`'first'`).
-- Renamed WordEmbeddingModel attributes ```model``` and ```model_name``` to ```wv``` and ```name``` respectively.
+- Moved the transformation logic of words, sets and queries to embeddings to its own
+ module: preprocessing
+- Enhanced the preprocessor_args and secondary_preprocessor_args metric
+ preprocessing parameters to an list of preprocessors `preprocessors` together with
+ the parameter `strategy` indicating whether to consider all the transformed words
+ (`'all'`) or only the first one encountered (`'first'`).
+- Renamed WordEmbeddingModel attributes ```model``` and ```model_name``` to
+ ```wv``` and ```name``` respectively.
- Renamed every run_query ```word_embedding``` argument to ```model``` in every metric.
@@ -179,21 +194,30 @@ Version 0.2.1
- Compatibility fixes.
-
Version 0.2.0
--------------
-- Renamed optional ```run_query``` parameter ```warn_filtered_words``` to `warn_not_found_words`.
-- Added ```word_preprocessor_args``` parameter to ```run_query``` that allow specifying transformations prior to searching for words in word embeddings.
-- Added ```secondary_preprocessor_args``` parameter to ```run_query``` which allows specifying a second pre-processor transformation to words before searching them in word embeddings. It is not necessary to specify the first preprocessor to use this one.
-- Implemented ```__getitem__``` function in ```WordEmbeddingModel```. This method allows obtaining an embedding from a word from the model stored in the instance using indexers.
+- Renamed optional ```run_query``` parameter ```warn_filtered_words``` to
+ `warn_not_found_words`.
+- Added ```word_preprocessor_args``` parameter to ```run_query``` that allow specifying
+ transformations prior to searching for words in word embeddings.
+- Added ```secondary_preprocessor_args``` parameter to ```run_query``` which allows
+ specifying a second pre-processor transformation to words before searching them in
+ word embeddings. It is not necessary to specify the first preprocessor to use this
+ one.
+- Implemented ```__getitem__``` function in ```WordEmbeddingModel```. This method
+ allows obtaining an embedding from a word from the model stored in the instance
+ using indexers.
- Removed underscore from class and instance variable names.
-- Improved type and verification exception messages when creating objects and executing methods.
-- Fix an error that appeared when calculating rankings with two columns of aggregations with the same name.
+- Improved type and verification exception messages when creating objects and executing
+ methods.
+- Fix an error that appeared when calculating rankings with two columns of aggregations
+ with the same name.
- Ranking correlations are now calculated using pandas ```corr``` method.
- Changed metric template, name and short_names to class variables.
- Implemented ```random_state``` in RNSB to allow replication of the experiments.
-- run_query now returns as a result the default metric requested in the parameters and all calculated values that may be useful in the other variables of the dictionary.
+- run_query now returns as a result the default metric requested in the parameters
+ and all calculated values that may be useful in the other variables of the dictionary.
- Fixed problem with api documentation: now it shows methods of the classes.
- Implemented p-value for WEAT
diff --git a/cov.xml b/cov.xml
deleted file mode 100644
index b4141df..0000000
--- a/cov.xml
+++ /dev/null
@@ -1,1601 +0,0 @@
-
-
-
-
-
- /home/pablo/Proyectos/WEFE/wefe/wefe
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/doc/_static/css/project-template.css b/doc/_static/css/project-template.css
deleted file mode 100644
index 29392fc..0000000
--- a/doc/_static/css/project-template.css
+++ /dev/null
@@ -1,16 +0,0 @@
-@import url("theme.css");
-
-.highlight a {
- text-decoration: underline;
-}
-
-.deprecated p {
- padding: 10px 7px 10px 10px;
- color: #b94a48;
- background-color: #F3E5E5;
- border: 1px solid #eed3d7;
-}
-
-.deprecated p span.versionmodified {
- font-weight: bold;
-}
\ No newline at end of file
diff --git a/doc/user_guide/measurement.ipynb b/doc/user_guide/measurement.ipynb
deleted file mode 100644
index 1fc012c..0000000
--- a/doc/user_guide/measurement.ipynb
+++ /dev/null
@@ -1,1243 +0,0 @@
-{
- "cells": [
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "(bias measurement)=\n",
- "\n",
- "# Bias Measurement\n",
- "\n",
- "The following guide is designed to present the more general details on\n",
- "using the package to measure bias. The following sections show:\n",
- "\n",
- "* how to run a simple query using ``Glove`` embedding model.\n",
- "* how to run multiple queries on multiple embeddings.\n",
- "* how to compare the results obtained from running multiple\n",
- " sets of queries on multiple embeddings using different metrics\n",
- " through ranking calculation.\n",
- "* how to calculate the correlations between the\n",
- " rankings obtained.\n",
- "\n",
- "\n",
- ":::{warning}\n",
- "\n",
- " To accurately study and reduce biases contained in word embeddings, queries may\n",
- " contain words that could be offensive to certain groups or individuals.\n",
- " The relationships studied between these words DO NOT represent the\n",
- " ideas, thoughts or beliefs of the authors of this library. \n",
- " This warning applies to all documentation.\n",
- "\n",
- ":::\n",
- "\n",
- "\n",
- ":::{note}\n",
- "\n",
- "If you are not familiar with the concepts of query, target and attribute\n",
- "set, please visit the {ref}`measurement framework`\n",
- "on the library’s conceptual guides. These concepts are widely used in the\n",
- "following sections.\n",
- "\n",
- ":::\n",
- "\n",
- ":::{note}\n",
- "\n",
- "For a list of metrics implemented in WEFE, refer to the\n",
- "[metrics section](metrics-API) of the API reference. \n",
- "\n",
- ":::\n"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "\n",
- "## Run a Query\n",
- "\n",
- "The following subsections explains how to run a simple query that\n",
- "measures gender bias on\n",
- "[Glove](https://nlp.stanford.edu/projects/glove/). The example uses\n",
- "the Word Embedding Association Test ({class}`~wefe.metrics.WEAT.WEAT`) metric\n",
- "quantifying the bias in the embeddings model. Below we show the three usual steps for\n",
- "performing a query in WEFE:\n",
- "\n",
- ":::{note}\n",
- "\n",
- "{class}`~wefe.metrics.WEAT.WEAT` is a fairness metric that quantifies the relationship\n",
- "between two sets of target words (sets of words intended to denote a social\n",
- "groups as men and women) and two sets of attribute words (sets of words\n",
- "representing some attitude, characteristic, trait, occupational field,\n",
- "etc. that can be associated with individuals from any social group). \n",
- "\n",
- "The closer its value is to 0, the less biased the model is. \n",
- "\n",
- "Visit the metrics documentation ({class}`~wefe.metrics.WEAT.WEAT`) for more information.\n",
- "\n",
- "\n",
- ":::"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "### Load a word embeddings model as a ``WordEmbeddingModel`` object.\n",
- "\n",
- "Load the word embedding model and then wrap it using a\n",
- "{class}`~wefe.word_embedding_model.WordEmbeddingModel` (class that allows WEFE to handle the models).\n",
- "\n",
- "WEFE bases all its operations on word embeddings using Gensim’s\n",
- "``KeyedVectors`` interface. Any model that can be loaded using\n",
- "``KeyedVectors`` will be compatible with WEFE. The following example uses a 25-dim pre-trained ``Glove`` model using a\n",
- "twitter dataset loaded using [gensim-data](https://github.com/RaRe-Technologies/gensim-data/)."
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {},
- "outputs": [],
- "source": [
- "import gensim.downloader as api\n",
- "\n",
- "from wefe.datasets import load_weat\n",
- "from wefe.metrics import WEAT\n",
- "from wefe.query import Query\n",
- "from wefe.word_embedding_model import WordEmbeddingModel\n",
- "\n",
- "twitter_25 = api.load(\"glove-twitter-25\")\n",
- "# WordEmbeddingModel receives as first argument a KeyedVectors model\n",
- "# and the second argument the model name.\n",
- "model = WordEmbeddingModel(twitter_25, \"glove twitter dim=25\")\n"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "### Create the query using a ``Query`` object\n",
- "\n",
- "Define the target and attribute word sets and create a {class}`~wefe.query.Query` object\n",
- "that contains them.\n",
- "\n",
- "For this initial example, a query is used to study the association\n",
- "between gender with respect to family and career. The words used are\n",
- "taken from the set of words used in the *Semantics derived automatically\n",
- "from language corpora contain human-like biases* paper, which are\n",
- "included in the ``datasets`` module."
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {},
- "outputs": [],
- "source": [
- "gender_query = Query(\n",
- " target_sets=[\n",
- " [\"female\", \"woman\", \"girl\", \"sister\", \"she\", \"her\", \"hers\", \"daughter\"],\n",
- " [\"male\", \"man\", \"boy\", \"brother\", \"he\", \"him\", \"his\", \"son\"],\n",
- " ],\n",
- " attribute_sets=[\n",
- " [\n",
- " \"home\",\n",
- " \"parents\",\n",
- " \"children\",\n",
- " \"family\",\n",
- " \"cousins\",\n",
- " \"marriage\",\n",
- " \"wedding\",\n",
- " \"relatives\",\n",
- " ],\n",
- " [\n",
- " \"executive\",\n",
- " \"management\",\n",
- " \"professional\",\n",
- " \"corporation\",\n",
- " \"salary\",\n",
- " \"office\",\n",
- " \"business\",\n",
- " \"career\",\n",
- " ],\n",
- " ],\n",
- " target_sets_names=[\"Female terms\", \"Male Terms\"],\n",
- " attribute_sets_names=[\"Family\", \"Careers\"],\n",
- ")\n",
- "\n",
- "gender_query\n"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "### Run the Query\n",
- "\n",
- "Instantiate the metric that you will use and then execute ``run_query``\n",
- "with the parameters created in the previous steps.\n",
- "\n",
- "Any bias measurement process at WEFE consists of the following steps:\n",
- "\n",
- "1. Metric arguments checking.\n",
- "2. Transform the word sets into word embeddings.\n",
- "3. Calculate the metric.\n",
- "\n",
- "In this case we use the {class}`~wefe.metrics.WEAT.WEAT` metric (proposed in the\n",
- "same paper of the set of words used in the query)."
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {},
- "outputs": [],
- "source": [
- "metric = WEAT()\n",
- "result = metric.run_query(gender_query, model)\n",
- "result\n"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "\n",
- "By default, the results are a ``dict`` containing the query name (in the\n",
- "key ``query_name``) and the calculated value of the metric in the\n",
- "``result`` key. It also contains a key with the name and the value of\n",
- "the calculated metric (which is duplicated in the “results” key).\n",
- "\n",
- "Depending on the metric class used, the result ``dict`` can also return\n",
- "more metrics, detailed word-by-word values or other statistics like\n",
- "p-values. Also some metrics allow you to change the default value in\n",
- "results.\n",
- "\n",
- "Details of all the metrics implemented, their parameters and\n",
- "examples of execution can be found at [metrics section](metrics-API)."
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "### Run Query Arguments\n",
- "\n",
- "Each metric allows varying the behavior of ``run_query`` according to\n",
- "different parameters. There are parameters to customize the\n",
- "transformation of the sets of words to sets of embeddings, others to\n",
- "warn errors or modify which calculation method the metric use.\n",
- "\n",
- ":::{note}\n",
- "\n",
- "Each metric implements the `run_query` method with different arguments. \n",
- "Visit their API documentation for more information.\n",
- ":::\n",
- "\n",
- "For example, ``run_query`` can be instructed to ``return effect_size``\n",
- "in the ``result`` key by setting ``return_effect_size`` as ``True``.\n",
- "Note that this parameter is only of the class ``WEAT``.\n"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {},
- "outputs": [],
- "source": [
- "weat = WEAT()\n",
- "result = weat.run_query(gender_query, model, return_effect_size=True)\n",
- "result\n"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "You can also request ``run_query`` to run the statistical significance\n",
- "calculation by setting ``calculate_p_value`` as ``True``. This checks\n",
- "how many queries generated from permutations (controlled by the\n",
- "parameter ``p_value_iterations``) of the target sets obtain values\n",
- "greater than those obtained by the original query.\n"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {},
- "outputs": [],
- "source": [
- "weat = WEAT()\n",
- "result = weat.run_query(\n",
- " gender_query, model, calculate_p_value=True, p_value_iterations=5000\n",
- ")\n",
- "result"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "### Out of Vocabulary Words\n",
- "\n",
- "It is common in the literature to find bias tests whose tagret sets are\n",
- "common names of social groups. These names are commonly cased and may\n",
- "contain special characters. There are several embedding models whose\n",
- "words are not cased or do not have accents or other special characters,\n",
- "as for example, in ``Glove``. This implies that a query with target sets\n",
- "composed by names executed in ``Glove`` (without any preprocessing of\n",
- "the words) could produce erroneous results because WEFE will not be able\n",
- "to find the names in the model vocabulary.\n",
- "\n",
- "\n",
- ":::{note}\n",
- "\n",
- "\n",
- "Some well-known word sets are already provided by the package and can be\n",
- "easily loaded by the user through the [datasets](datasets-API) module. From here on,\n",
- "the tutorial use the words defined in the study *Semantics derived\n",
- "automatically from language corpora contain human-like biases*, the same\n",
- "that proposed the {class}`~wefe.metrics.WEAT.WEAT` metric.\n",
- "\n",
- ":::"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {},
- "outputs": [],
- "source": [
- "# load the weat word sets.\n",
- "word_sets = load_weat()\n",
- "\n",
- "# print a set of european american common names.\n",
- "print(word_sets[\"european_american_names_5\"])"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "The following query compares European-American and African-American\n",
- "names with respect to pleasant and unpleasant attributes.\n",
- "\n",
- "\n",
- ":::{note}\n",
- "\n",
- "\n",
- "It can be indicated to ``run_query`` to log the words that were lost in\n",
- "the transformation to vectors by using the parameter\n",
- "``warn_not_found_words`` as ``True``.\n",
- "\n",
- ":::"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {},
- "outputs": [],
- "source": [
- "ethnicity_query = Query(\n",
- " [word_sets[\"european_american_names_5\"], word_sets[\"african_american_names_5\"]],\n",
- " [word_sets[\"pleasant_5\"], word_sets[\"unpleasant_5\"]],\n",
- " [\"European american names\", \"African american names\"],\n",
- " [\"Pleasant\", \"Unpleasant\"],\n",
- ")\n",
- "result = weat.run_query(ethnicity_query, model, warn_not_found_words=True,)\n",
- "result\n"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- ":::{warning}\n",
- "\n",
- "If more than 20% of the words from any of the word sets of the query are\n",
- "lost during the transformation to embeddings, the result of the metric\n",
- "will be ``np.nan``. This behavior can be changed using a float number\n",
- "parameter called ``lost_vocabulary_threshold``.\n",
- "\n",
- ":::"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "## Word Preprocessors\n",
- "\n",
- "``run_queries`` allows preprocessing each word before they are searched in the model's \n",
- "vocabulary.through the parameter ``preprocessors``. (list of one or more preprocessor).\n",
- "This parameter accepts a list of individual preprocessors, which are defined below:\n",
- "\n",
- "A ``preprocessor`` is a dictionary that specifies what processing(s) are \n",
- "performed on each word before its looked up in the model vocabulary.\n",
- "For example, the ``preprocessor``\n",
- "``{'lowecase': True, 'strip_accents': True}`` allows you to lowercase\n",
- "and remove the accent from each word before searching for them in the\n",
- "model vocabulary. Note that an empty dictionary ``{}`` indicates that no\n",
- "preprocessing is done.\n",
- "\n",
- "The possible options for a preprocessor are:\n",
- "\n",
- "* ``lowercase``: ``bool``. Indicates that the words are transformed to lowercase.\n",
- "* ``uppercase``: ``bool``. Indicates that the words are transformed to uppercase.\n",
- "* ``titlecase``: ``bool``. Indicates that the words are transformed to titlecase.\n",
- "* ``strip_accents``: ``bool``, ``{'ascii', 'unicode'}``: Specifies that the accents of the words are eliminated. The stripping type can be specified. True uses ‘unicode’ by default.\n",
- "* ``preprocessor``: ``Callable``. It receives a function that operates on each word. In the case of specifying a function, it overrides the default preprocessor (i.e., the previous options stop working).\n",
- "\n",
- "\n",
- "A list of preprocessor options allows searching for several\n",
- "variants of the words into the model. For example, the preprocessors\n",
- "``[{}, {\"lowercase\": True, \"strip_accents\": True}]``\n",
- "``{}`` allows first to search for the original words in the vocabulary of the model. \n",
- "In case some of them are not found, ``{\"lowercase\": True, \"strip_accents\": True}`` \n",
- "is executed on these words and then they are searched in the model vocabulary.\n",
- "\n",
- "By default (in case there is more than one preprocessor in the list) the first \n",
- "preprocessed word found in the embeddings model is used. \n",
- "This behavior can be controlled by the ``strategy`` parameter of ``run_query``.\n",
- "\n",
- "In the following example, we provide a list with only one\n",
- "preprocessor that instructs ``run_query`` to lowercase and remove all\n",
- "accents from every word before they are searched in the embeddings\n",
- "model.\n"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {},
- "outputs": [],
- "source": [
- "weat = WEAT()\n",
- "result = weat.run_query(\n",
- " ethnicity_query,\n",
- " model,\n",
- " preprocessors=[{\"lowercase\": True, \"strip_accents\": True}],\n",
- " warn_not_found_words=True,\n",
- ")\n",
- "result"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "It may happen that it is more important to find the original word and in\n",
- "the case of not finding it, then preprocess it and look it up in the\n",
- "vocabulary. This behavior can be specified in ``preprocessors`` list by\n",
- "first specifying an empty preprocessor ``{}`` and then the preprocessor\n",
- "that converts to lowercase and removes accents.\n"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {},
- "outputs": [],
- "source": [
- "weat = WEAT()\n",
- "result = weat.run_query(\n",
- " ethnicity_query,\n",
- " model,\n",
- " preprocessors=[\n",
- " {}, # empty preprocessor, search for the original words.\n",
- " {\n",
- " \"lowercase\": True,\n",
- " \"strip_accents\": True,\n",
- " }, # search for lowercase and no accent words.\n",
- " ],\n",
- " warn_not_found_words=True,\n",
- ")\n",
- "\n",
- "result"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "The number of preprocessing steps can be increased as needed. For\n",
- "example, we can complex the above preprocessor to first search for the\n",
- "original words, then for the lowercase words, and finally for the\n",
- "lowercase words without accents.\n"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {},
- "outputs": [],
- "source": [
- "weat = WEAT()\n",
- "result = weat.run_query(\n",
- " ethnicity_query,\n",
- " model,\n",
- " preprocessors=[\n",
- " {}, # first step: empty preprocessor, search for the original words.\n",
- " {\"lowercase\": True,}, # second step: search for lowercase.\n",
- " {\n",
- " \"lowercase\": True,\n",
- " \"strip_accents\": True,\n",
- " }, # third step: search for lowercase and no accent words.\n",
- " ],\n",
- " warn_not_found_words=True,\n",
- ")\n",
- "\n",
- "result"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "It is also possible to change the behavior of the search by including\n",
- "not only the first word, but all the words generated by the\n",
- "preprocessors. This can be controlled by specifying the parameter\n",
- "``strategy=all``."
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {},
- "outputs": [],
- "source": [
- "weat = WEAT()\n",
- "result = weat.run_query(\n",
- " ethnicity_query,\n",
- " model,\n",
- " preprocessors=[\n",
- " {}, # first step: empty preprocessor, search for the original words.\n",
- " {\"lowercase\": True,}, # second step: search for lowercase .\n",
- " {\"uppercase\": True,}, # third step: search for uppercase.\n",
- " ],\n",
- " strategy=\"all\",\n",
- " warn_not_found_words=True,\n",
- ")\n",
- "\n",
- "result\n"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "## Running Multiple Queries\n",
- "\n",
- "\n",
- "It is usual to want to test many queries of some bias criterion (gender,\n",
- "ethnicity, religion, politics, socioeconomic, among others) on several\n",
- "models at the same time. Trying to use ``run_query`` on each pair\n",
- "embedding-query can be a bit complex and could require extra work to\n",
- "implement.\n",
- "\n",
- "This is why the library also implements a function to test multiple\n",
- "queries on various word embedding models in a single call: the\n",
- "``run_queries`` util.\n",
- "\n",
- "The following code shows how to run various gender queries on ``Glove``\n",
- "embedding models with different dimensions trained from the Twitter\n",
- "dataset. The queries are executed using {class}`~wefe.metrics.WEAT.WEAT` metric.\n",
- "\n"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {},
- "outputs": [],
- "source": [
- "import gensim.downloader as api\n",
- "\n",
- "from wefe.datasets import load_weat\n",
- "from wefe.metrics import RNSB, WEAT\n",
- "from wefe.query import Query\n",
- "from wefe.utils import run_queries\n",
- "from wefe.word_embedding_model import WordEmbeddingModel"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "### Load the models\n",
- "\n",
- "Load three different Glove Twitter embedding models. These models were\n",
- "trained using the same dataset varying the number of embedding\n",
- "dimensions."
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {},
- "outputs": [],
- "source": [
- "model_1 = WordEmbeddingModel(api.load(\"glove-twitter-25\"), \"glove twitter dim=25\")\n",
- "model_2 = WordEmbeddingModel(api.load(\"glove-twitter-50\"), \"glove twitter dim=50\")\n",
- "model_3 = WordEmbeddingModel(api.load(\"glove-twitter-100\"), \"glove twitter dim=100\")\n",
- "\n",
- "models = [model_1, model_2, model_3]\n",
- "\n"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "### Load the word sets and create the queries\n",
- "\n",
- "Now, we load the ``WEAT`` word set and create three queries. The\n",
- "three queries are intended to measure gender bias.\n"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {},
- "outputs": [],
- "source": [
- "# Load the WEAT word sets\n",
- "word_sets = load_weat()\n",
- "\n",
- "# Create gender queries\n",
- "gender_query_1 = Query(\n",
- " [word_sets[\"male_terms\"], word_sets[\"female_terms\"]],\n",
- " [word_sets[\"career\"], word_sets[\"family\"]],\n",
- " [\"Male terms\", \"Female terms\"],\n",
- " [\"Career\", \"Family\"],\n",
- ")\n",
- "\n",
- "gender_query_2 = Query(\n",
- " [word_sets[\"male_terms\"], word_sets[\"female_terms\"]],\n",
- " [word_sets[\"science\"], word_sets[\"arts\"]],\n",
- " [\"Male terms\", \"Female terms\"],\n",
- " [\"Science\", \"Arts\"],\n",
- ")\n",
- "\n",
- "gender_query_3 = Query(\n",
- " [word_sets[\"male_terms\"], word_sets[\"female_terms\"]],\n",
- " [word_sets[\"math\"], word_sets[\"arts_2\"]],\n",
- " [\"Male terms\", \"Female terms\"],\n",
- " [\"Math\", \"Arts\"],\n",
- ")\n",
- "\n",
- "gender_queries = [gender_query_1, gender_query_2, gender_query_3]\n"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "### Run the queries on all Word Embeddings using WEAT.\n",
- "\n",
- "To run the list of queries and models, we call ``run_queries`` using the\n",
- "parameters defined in the previous step. The mandatory parameters of the\n",
- "function are 3:\n",
- "\n",
- "- a metric,\n",
- "- a list of queries, and,\n",
- "- a list of embedding models.\n",
- "\n",
- "It is also possible to provide a name for the criterion studied in this\n",
- "set of queries through the parameter ``queries_set_name``.\n"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {},
- "outputs": [],
- "source": [
- "WEAT_gender_results = run_queries(\n",
- " WEAT, gender_queries, models, queries_set_name=\"Gender Queries\"\n",
- ")\n",
- "WEAT_gender_results\n"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "### Setting metric params\n",
- "\n",
- "There is a whole column that has no results. As the warnings point out,\n",
- "when transforming the words of the sets into embeddings, there is a loss\n",
- "of words that is greater than the allowed by the parameter\n",
- "``lost_vocabulary_threshold``. In this case, it would be very useful to\n",
- "use the word preprocessors seen above.\n",
- "\n",
- "``run_queries``, accept specific parameters for each metric. These extra\n",
- "parameters for the metric can be passed through ``metric_params``\n",
- "parameter. In this case, a ``preprocessor`` is provided to lowercase the\n",
- "words before searching for them in the models’ vocabularies.\n",
- "\n"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {},
- "outputs": [],
- "source": [
- "\n",
- "WEAT_gender_results = run_queries(\n",
- " WEAT,\n",
- " gender_queries,\n",
- " models,\n",
- " metric_params={\"preprocessors\": [{\"lowercase\": True}]},\n",
- " queries_set_name=\"Gender Queries\",\n",
- ")\n",
- "\n",
- "WEAT_gender_results"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "No query was null in these results.\n"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "\n",
- "### Plot the results in a barplot\n",
- "\n",
- "\n",
- "The library also provides an easy way to plot the results obtained from\n",
- "a ``run_queries`` execution into a [plotly](https://plotly.com/python/) braplot."
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {},
- "outputs": [],
- "source": [
- "from wefe.utils import plot_queries_results, run_queries\n",
- "\n",
- "# Plot the results\n",
- "plot_queries_results(WEAT_gender_results).show()\n"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "## Aggregating Results\n",
- "\n",
- "The execution of ``run_queries`` provided many results evaluating the\n",
- "gender bias in the tested embeddings. However, these results alone do\n",
- "not comprehensively report the biases observed in all of these queries.\n",
- "One way to obtain an overall view of bias is by aggregating results by\n",
- "model.\n",
- "\n",
- "For WEAT, a simple way to aggregate the results is to average their\n",
- "absolute values. When running ``run_queries``, it is possible to specify\n",
- "that the results be aggregated by model by setting ``aggregate_results``\n",
- "as ``True``\n",
- "\n",
- "The aggregation function can be specified through the\n",
- "``aggregation_function`` parameter. This parameter accepts a list of\n",
- "predefined aggregations as well as a custom function that operates on\n",
- "the results dataframe. The aggregation functions available are:\n",
- "\n",
- "- Average ``avg``.\n",
- "- Average of the absolute values ``abs_avg``.\n",
- "- Sum ``sum``.\n",
- "- Sum of the absolute values, ``abs_sum``.\n",
- "\n",
- ":::{note}\n",
- "\n",
- "Notice that some functions are more appropriate for certain metrics. For\n",
- "metrics returning only positive numbers, all the previous aggregation\n",
- "functions would be OK. In contrast, metrics that return real values\n",
- "(e.g., {class}`~wefe.metrics.WEAT.WEAT` , {class}`~wefe.metrics.RND.RND` , etc…), \n",
- "aggregation functions such as sum would make positive and negative outputs to cancel \n",
- "each other.\n",
- "\n",
- ":::"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {},
- "outputs": [],
- "source": [
- "WEAT_gender_results_agg = run_queries(\n",
- " WEAT,\n",
- " gender_queries,\n",
- " models,\n",
- " metric_params={\"preprocessors\": [{\"lowercase\": True}]},\n",
- " aggregate_results=True,\n",
- " aggregation_function=\"abs_avg\",\n",
- " queries_set_name=\"Gender Queries\",\n",
- ")\n",
- "WEAT_gender_results_agg\n"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {},
- "outputs": [],
- "source": [
- "plot_queries_results(WEAT_gender_results_agg).show()\n"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "It is also possible to ask the function to return only the aggregated\n",
- "results using the parameter ``return_only_aggregation``\n"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {},
- "outputs": [],
- "source": [
- "WEAT_gender_results_only_agg = run_queries(\n",
- " WEAT,\n",
- " gender_queries,\n",
- " models,\n",
- " metric_params={\"preprocessors\": [{\"lowercase\": True}]},\n",
- " aggregate_results=True,\n",
- " aggregation_function=\"abs_avg\",\n",
- " return_only_aggregation=True,\n",
- " queries_set_name=\"Gender Queries\",\n",
- ")\n",
- "WEAT_gender_results_only_agg\n"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {},
- "outputs": [],
- "source": [
- "fig = plot_queries_results(WEAT_gender_results_only_agg)\n",
- "fig.show()\n"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "## Model Ranking\n",
- "\n",
- "It may be desirable to obtain an overall view of the bias by model using\n",
- "different metrics or bias criteria. While the aggregate values can be\n",
- "compared directly, two problems are likely to be encountered:\n",
- "\n",
- "1. One type of bias criterion can dominate the other because of\n",
- " significant differences in magnitude.\n",
- "\n",
- "2. Different metrics can operate on different scales, which makes them\n",
- " difficult to compare.\n",
- "\n",
- "To show these problems, suppose we have:\n",
- "\n",
- "- Two sets of queries: one that explores gender biases and\n",
- " another that explores ethnicity biases.\n",
- "- Three ``Glove`` models of 25, 50 and 100 dimensions trained on the same\n",
- " twitter dataset.\n",
- "\n",
- "Then we run ``run_queries`` on this set of model-queries using \n",
- "{class}`~wefe.metrics.WEAT.WEAT`, and to corroborate the results obtained, we also use \n",
- "Relative Negative Sentiment Bias ({class}`~wefe.metrics.RNSB.RNSB`).\n",
- "\n",
- "1. The first problem occurs when the bias scores obtained from one set\n",
- " of queries are much higher than those from the other set, even when\n",
- " the same metric is used.\n",
- "\n",
- "When executing ``run_queries`` with the gender and ethnicity queries on\n",
- "the models described above, the results obtained are as follows:\n"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "| model_name | WEAT: Gender Queries average of abs values score | WEAT: Ethnicity Queries average of abs values score |\n",
- "|----------------------------------------|-------------------------------------------------------------------------|------------------------------------------------------------------------|\n",
- "| glove twitter dim=25 | 0.210556 | 2.64632 |\n",
- "| glove twitter dim=50 | 0.292373 | 1.87431 |\n",
- "| glove twitter dim=100 | 0.225116 | 1.78469 |"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "As can be seen, the results of ethnicity bias are much greater than\n",
- "those of gender.\n",
- "\n",
- "2. The second problem is when different metrics return results on\n",
- " different scales of magnitude.\n",
- "\n",
- "When executing ``run_queries`` with the gender queries and models\n",
- "described above using both WEAT and RNSB, the results obtained are as\n",
- "follows:"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "| model_name | WEAT: Gender Queries average of abs values score | RNSB: Gender Queries average of abs values score |\n",
- "|----------------------------------------|-------------------------------------------------------------------------|-------------------------------------------------------------------------|\n",
- "| glove twitter dim=25 | 0.210556 | 0.032673 |\n",
- "| glove twitter dim=50 | 0.292373 | 0.049429 |\n",
- "| glove twitter dim=100 | 0.225116 | 0.0312772 |"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "\n",
- "We can see differences between the results of both metrics of an order\n",
- "of magnitude.\n",
- "\n",
- "One solution to this problem is to create **rankings**. Rankings focus on the relative\n",
- "differences reported by the metrics (for different models) instead of focusing on the\n",
- "absolute values.\n",
- "\n",
- "The following guide show how to create rankings that evaluate\n",
- "gender bias and ethnicity.\n"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "### Gender Bias Model Ranking"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {},
- "outputs": [],
- "source": [
- "# define the queries\n",
- "gender_query_1 = Query(\n",
- " [word_sets[\"male_terms\"], word_sets[\"female_terms\"]],\n",
- " [word_sets[\"career\"], word_sets[\"family\"]],\n",
- " [\"Male terms\", \"Female terms\"],\n",
- " [\"Career\", \"Family\"],\n",
- ")\n",
- "gender_query_2 = Query(\n",
- " [word_sets[\"male_terms\"], word_sets[\"female_terms\"]],\n",
- " [word_sets[\"science\"], word_sets[\"arts\"]],\n",
- " [\"Male terms\", \"Female terms\"],\n",
- " [\"Science\", \"Arts\"],\n",
- ")\n",
- "gender_query_3 = Query(\n",
- " [word_sets[\"male_terms\"], word_sets[\"female_terms\"]],\n",
- " [word_sets[\"math\"], word_sets[\"arts_2\"]],\n",
- " [\"Male terms\", \"Female terms\"],\n",
- " [\"Math\", \"Arts\"],\n",
- ")\n",
- "\n",
- "gender_queries = [gender_query_1, gender_query_2, gender_query_3]\n",
- "\n",
- "# run the queries using WEAT\n",
- "WEAT_gender_results = run_queries(\n",
- " WEAT,\n",
- " gender_queries,\n",
- " models,\n",
- " metric_params={\"preprocessors\": [{\"lowercase\": True}]},\n",
- " aggregate_results=True,\n",
- " return_only_aggregation=True,\n",
- " queries_set_name=\"Gender Queries\",\n",
- ")\n",
- "\n",
- "# run the queries using WEAT effect size\n",
- "WEAT_EZ_gender_results = run_queries(\n",
- " WEAT,\n",
- " gender_queries,\n",
- " models,\n",
- " metric_params={\"preprocessors\": [{\"lowercase\": True}], \"return_effect_size\": True,},\n",
- " aggregate_results=True,\n",
- " return_only_aggregation=True,\n",
- " queries_set_name=\"Gender Queries\",\n",
- ")\n",
- "\n",
- "# run the queries using RNSB\n",
- "RNSB_gender_results = run_queries(\n",
- " RNSB,\n",
- " gender_queries,\n",
- " models,\n",
- " metric_params={\"preprocessors\": [{\"lowercase\": True}]},\n",
- " aggregate_results=True,\n",
- " return_only_aggregation=True,\n",
- " queries_set_name=\"Gender Queries\",\n",
- ")"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "The rankings can be calculated by means of the ``create_ranking``\n",
- "function. This function receives as input results from running\n",
- "``run_queries`` and assumes that the last column contains the aggregated\n",
- "values."
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {},
- "outputs": [],
- "source": [
- "from wefe.utils import create_ranking\n",
- "\n",
- "# create the ranking\n",
- "gender_ranking = create_ranking(\n",
- " [WEAT_gender_results, WEAT_EZ_gender_results, RNSB_gender_results]\n",
- ")\n",
- "\n",
- "gender_ranking\n"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "### Ethnicity Bias Model Ranking\n"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {},
- "outputs": [],
- "source": [
- "\n",
- "# define the queries\n",
- "ethnicity_query_1 = Query(\n",
- " [word_sets[\"european_american_names_5\"], word_sets[\"african_american_names_5\"]],\n",
- " [word_sets[\"pleasant_5\"], word_sets[\"unpleasant_5\"]],\n",
- " [\"European Names\", \"African Names\"],\n",
- " [\"Pleasant\", \"Unpleasant\"],\n",
- ")\n",
- "\n",
- "ethnicity_query_2 = Query(\n",
- " [word_sets[\"european_american_names_7\"], word_sets[\"african_american_names_7\"]],\n",
- " [word_sets[\"pleasant_9\"], word_sets[\"unpleasant_9\"]],\n",
- " [\"European Names\", \"African Names\"],\n",
- " [\"Pleasant 2\", \"Unpleasant 2\"],\n",
- ")\n",
- "\n",
- "ethnicity_queries = [ethnicity_query_1, ethnicity_query_2]\n",
- "\n",
- "# run the queries using WEAT\n",
- "WEAT_ethnicity_results = run_queries(\n",
- " WEAT,\n",
- " ethnicity_queries,\n",
- " models,\n",
- " metric_params={\"preprocessors\": [{\"lowercase\": True}]},\n",
- " aggregate_results=True,\n",
- " return_only_aggregation=True,\n",
- " queries_set_name=\"Ethnicity Queries\",\n",
- ")\n",
- "\n",
- "# run the queries using WEAT effect size\n",
- "WEAT_EZ_ethnicity_results = run_queries(\n",
- " WEAT,\n",
- " ethnicity_queries,\n",
- " models,\n",
- " metric_params={\"preprocessors\": [{\"lowercase\": True}], \"return_effect_size\": True,},\n",
- " aggregate_results=True,\n",
- " return_only_aggregation=True,\n",
- " queries_set_name=\"Ethnicity Queries\",\n",
- ")\n",
- "\n",
- "# run the queries using RNSB\n",
- "RNSB_ethnicity_results = run_queries(\n",
- " RNSB,\n",
- " ethnicity_queries,\n",
- " models,\n",
- " metric_params={\"preprocessors\": [{\"lowercase\": True}]},\n",
- " aggregate_results=True,\n",
- " return_only_aggregation=True,\n",
- " queries_set_name=\"Ethnicity Queries\",\n",
- ")\n"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {},
- "outputs": [],
- "source": [
- "# create the ranking\n",
- "ethnicity_ranking = create_ranking(\n",
- " [WEAT_ethnicity_results, WEAT_EZ_gender_results, RNSB_ethnicity_results]\n",
- ")\n",
- "\n",
- "ethnicity_ranking\n"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "### Plotting the rankings\n",
- "\n",
- "It is possible to graph the rankings in barplots using the\n",
- "``plot_ranking`` function. The generated figure shows the accumulated\n",
- "rankings for each embedding model. Each bar represents the sum of the\n",
- "rankings obtained by each embedding. Each color within a bar represents\n",
- "a different criterion-metric ranking."
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {},
- "outputs": [],
- "source": [
- "from wefe.utils import plot_ranking\n",
- "\n",
- "fig = plot_ranking(gender_ranking)\n",
- "fig.show()"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {},
- "outputs": [],
- "source": [
- "fig = plot_ranking(ethnicity_ranking)\n",
- "fig.show()"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "### Correlating Rankings\n",
- "\n",
- "Having obtained rankings by metric for each embeddings, it would be\n",
- "ideal to see and analyze the degree of agreement between them.\n",
- "\n",
- "A high concordance between the rankings allows us to state with some certainty that \n",
- "all metrics evaluated the embedding models in a similar way and therefore, \n",
- "that the ordering of embeddings by bias calculated makes sense.\n",
- "On the other hand, a low degree of agreement shows the opposite: the rankings do not \n",
- "allow to clearly establish which embedding is less biased than another.\n",
- "\n",
- "The level of concordance of the rankings can be evaluated by calculating\n",
- "correlations.WEFE provides ``calculate_ranking_correlations`` to\n",
- "calculate the correlations between rankings.\n",
- "\n"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {},
- "outputs": [],
- "source": [
- "from wefe.utils import calculate_ranking_correlations, plot_ranking_correlations\n",
- "\n",
- "correlations = calculate_ranking_correlations(gender_ranking)\n",
- "correlations\n"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- ":::{note}\n",
- "\n",
- "``calculate_ranking_correlations`` uses the ``corr()`` ``pandas``\n",
- "dataframe method. The type of correlation that is calculated can be changed \n",
- "through the method parameter. The available options are:\n",
- "``'pearson'``, ``'spearman'``, ``'kendall'``. By default, the spearman\n",
- "correlation is calculated.\n",
- "\n",
- ":::\n",
- "\n",
- "In this example, Kendall’s correlation is used.\n"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {},
- "outputs": [],
- "source": [
- "calculate_ranking_correlations(gender_ranking, method=\"kendall\")\n"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "WEFE also provides a function for graphing the correlations:\n"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {},
- "outputs": [],
- "source": [
- "correlation_fig = plot_ranking_correlations(correlations)\n",
- "correlation_fig.show()\n"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "In this case, only two of the three rankings show similar results.\n",
- "\n"
- ]
- }
- ],
- "metadata": {
- "kernelspec": {
- "display_name": "Python 3.8.13 ('wefe')",
- "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.13"
- },
- "orig_nbformat": 4,
- "vscode": {
- "interpreter": {
- "hash": "37d01894bb315c73bf6fde5551d8a97078996f38b23395695bd1998fb0ae5507"
- }
- }
- },
- "nbformat": 4,
- "nbformat_minor": 2
-}
diff --git a/doc/Makefile b/docs/Makefile
similarity index 97%
rename from doc/Makefile
rename to docs/Makefile
index ce9aedf..ef2103c 100644
--- a/doc/Makefile
+++ b/docs/Makefile
@@ -181,4 +181,4 @@ xml:
pseudoxml:
$(SPHINXBUILD) -b pseudoxml $(ALLSPHINXOPTS) $(BUILDDIR)/pseudoxml
@echo
- @echo "Build finished. The pseudo-XML files are in $(BUILDDIR)/pseudoxml."
+ @echo "Build finished. The pseudo-XML files are in $(BUILDDIR)/pseudoxml."
\ No newline at end of file
diff --git a/docs/_static/css/theme_overrides.css b/docs/_static/css/theme_overrides.css
new file mode 100644
index 0000000..a67f5cf
--- /dev/null
+++ b/docs/_static/css/theme_overrides.css
@@ -0,0 +1,48 @@
+/* override table width restrictions */
+.wy-table-responsive table td,
+.wy-table-responsive table th {
+ white-space: normal;
+}
+
+.wy-table-responsive {
+ margin-bottom: 24px;
+ max-width: 100%;
+ overflow: visible;
+}
+
+.dataframe {
+ margin-left: auto;
+ margin-right: auto;
+ border: none;
+ border-collapse: collapse;
+ border-spacing: 0;
+ color: rgba(0, 0, 0, 0.87);
+ font-size: 12px;
+ table-layout: fixed;
+ margin-bottom: 24px;
+}
+
+.dataframe thead {
+ border-bottom: 1px solid rgba(0, 0, 0, 0.87);
+ vertical-align: bottom;
+}
+
+.dataframe tr,
+.dataframe th,
+.dataframe td {
+ text-align: right;
+ vertical-align: middle;
+ padding: 0.5em 0.5em;
+ line-height: normal;
+ white-space: normal;
+ max-width: none;
+ border: none;
+}
+
+.dataframe th {
+ font-weight: bold;
+}
+
+.dataframe tbody tr:nth-child(odd) {
+ background: #f5f5f5;
+}
\ No newline at end of file
diff --git a/doc/_static/js/copybutton.js b/docs/_static/js/copybutton.js
similarity index 100%
rename from doc/_static/js/copybutton.js
rename to docs/_static/js/copybutton.js
diff --git a/doc/_templates/class.rst b/docs/_templates/class.rst
similarity index 79%
rename from doc/_templates/class.rst
rename to docs/_templates/class.rst
index b90be1c..62f57cc 100644
--- a/doc/_templates/class.rst
+++ b/docs/_templates/class.rst
@@ -11,6 +11,8 @@
.. automethod:: __init__
{% endblock %}
+.. include:: {{module}}.{{objname}}.examples
+
.. raw:: html
diff --git a/doc/_templates/function.rst b/docs/_templates/function.rst
similarity index 100%
rename from doc/_templates/function.rst
rename to docs/_templates/function.rst
diff --git a/doc/_templates/numpydoc_docstring.py b/docs/_templates/numpydoc_docstring.py
similarity index 100%
rename from doc/_templates/numpydoc_docstring.py
rename to docs/_templates/numpydoc_docstring.py
diff --git a/doc/api/api.rst b/docs/api/api.rst
similarity index 87%
rename from doc/api/api.rst
rename to docs/api/api.rst
index 7ebc99e..da2fcd7 100644
--- a/doc/api/api.rst
+++ b/docs/api/api.rst
@@ -56,11 +56,11 @@ This list contains the debiasing methods implemented so far in WEFE.
:toctree: generated/
:template: class.rst
- wefe.debias.HardDebias
- wefe.debias.MulticlassHardDebias
- wefe.debias.RepulsionAttractionNeutralization
- wefe.debias.DoubleHardDebias
- wefe.debias.HalfSiblingRegression
+ wefe.debias.hard_debias.HardDebias
+ wefe.debias.multiclass_hard_debias.MulticlassHardDebias
+ wefe.debias.repulsion_attraction_neutralization.RepulsionAttractionNeutralization
+ wefe.debias.double_hard_debias.DoubleHardDebias
+ wefe.debias.half_sibling_regression.HalfSiblingRegression
.. _datasets-API:
diff --git a/doc/conceptual_guides/measurement_framework.rst b/docs/conceptual_guides/measurement_framework.rst
similarity index 99%
rename from doc/conceptual_guides/measurement_framework.rst
rename to docs/conceptual_guides/measurement_framework.rst
index f970280..1734179 100644
--- a/doc/conceptual_guides/measurement_framework.rst
+++ b/docs/conceptual_guides/measurement_framework.rst
@@ -6,6 +6,7 @@ Measurement Framework
Below we present the main aspects of the measurement framework developed at WEFE.
.. note::
+
If you want to see tutorials on how to apply queries, visit :ref:`bias measurement`
in the User Guide.
@@ -124,7 +125,7 @@ query, word2vec embeddings and the WEAT metric.
:alt: Bias measurement diagram.
To see the implementation of this query using WEFE, refer to
-the `Quick start `_ section.
+the :ref:`Quick start ` section.
Metrics Implemented So Far
--------------------------
diff --git a/doc/conceptual_guides/mitigation_framework.rst b/docs/conceptual_guides/mitigation_framework.rst
similarity index 87%
rename from doc/conceptual_guides/mitigation_framework.rst
rename to docs/conceptual_guides/mitigation_framework.rst
index df36d63..988bb77 100644
--- a/doc/conceptual_guides/mitigation_framework.rst
+++ b/docs/conceptual_guides/mitigation_framework.rst
@@ -1,9 +1,11 @@
+.. _mitigation framework:
+
Mitigation Framework
====================
.. note::
If you want to see tutorials on how to mitigate (debias) bias in word embedding
- models, visit :ref:`bias mitigation` in the User Guide.
+ models, visit :ref:`Bias Mitigation ` in the User Guide.
WEFE standardizes all mitigation methods through an interface inherited from
@@ -12,8 +14,9 @@ WEFE standardizes all mitigation methods through an interface inherited from
Fit method
----------
-The first step ``fit``, consists in learning the corresponding mitigation transformation
-which usually corresponds to a matrix projection of the embedding space.
+The first step ``fit``, consists in learning the corresponding mitigation
+transformation, which usually corresponds to a matrix projection of the
+embedding space.
This method is quite flexible: it can accept multiple sets of words and other parameters.
Transform method
@@ -44,4 +47,4 @@ WEFE implements the following bias mitigation (debias) metrics:
- :class:`~wefe.debias.half_sibling_regression.HalfSiblingRegression`,
Except for ``MulticlassHardDebias``, all methods are limited to binary criteria,
-such gender.
\ No newline at end of file
+such as gender.
\ No newline at end of file
diff --git a/doc/conceptual_guides/references.rst b/docs/conceptual_guides/references.rst
similarity index 100%
rename from doc/conceptual_guides/references.rst
rename to docs/conceptual_guides/references.rst
diff --git a/doc/conf.py b/docs/conf.py
similarity index 93%
rename from doc/conf.py
rename to docs/conf.py
index 3676d38..f8cbe9e 100644
--- a/doc/conf.py
+++ b/docs/conf.py
@@ -33,20 +33,18 @@
extensions = [
"sphinx.ext.autodoc",
"sphinx.ext.autosummary",
- "numpydoc",
"sphinx.ext.doctest",
"sphinx.ext.intersphinx",
"sphinx.ext.viewcode",
- # "sphinx_gallery.gen_gallery",
+ "numpydoc",
+ "sphinx_gallery.gen_gallery",
"sphinx.ext.todo",
"sphinx.ext.mathjax",
"sphinx.ext.ifconfig",
- "myst_nb",
+ "sphinx.ext.napoleon",
]
-mathjax_path = ""
-
# this is needed for some reason...
# see https://github.com/numpy/numpydoc/issues/69
numpydoc_show_class_members = False
@@ -60,13 +58,7 @@
mathjax_path = ""
else:
extensions.append("sphinx.ext.mathjax")
- mathjax_path = "https://cdn.jsdelivr.net/npm/mathjax@3/es5/" "tex-chtml.js"
-
-# from distutils.version import LooseVersion
-# if LooseVersion(sphinx.__version__) < LooseVersion('1.4'):
-# extensions.append('sphinx.ext.pngmath')
-# else:
-# extensions.append('sphinx.ext.imgmath')
+ mathjax_path = "https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-chtml.js"
autodoc_default_flags = ["members", "inherited-members"]
@@ -80,20 +72,8 @@
# source_suffix = ".rst"
source_suffix = {
".rst": "restructuredtext",
- ".ipynb": "myst-nb",
- ".myst": "myst-nb",
}
-myst_enable_extensions = [
- "amsmath",
- "colon_fence",
- "deflist",
- "dollarmath",
- "html_image",
-]
-myst_url_schemes = ("http", "https", "mailto")
-nb_execution_mode = "cache"
-nb_execution_timeout = 120
# The encoding of source files.
# source_encoding = 'utf-8-sig'
@@ -138,7 +118,7 @@
# default_role = None
# If true, '()' will be appended to :func: etc. cross-reference text.
-# add_function_parentheses = True
+add_function_parentheses = False
# If true, the current module name will be prepended to all description
# unit titles (such as .. function::).
@@ -154,7 +134,6 @@
# Custom style
# html_style = "css/project-template.css"
-
# A list of ignored prefixes for module index sorting.
# modindex_common_prefix = []
@@ -196,7 +175,9 @@
html_static_path = ["_static"]
# html_context = {
-# "css_files": ["_static/theme_overrides.css",], # override wide tables in RTD theme
+# "css_files": [
+# "_static/css/theme_overrides.css", # overrides for wide tables in RTD theme
+# ],
# }
# Add any extra paths that contain custom files (such as robots.txt or
@@ -256,7 +237,12 @@
# The font size ('10pt', '11pt' or '12pt').
#'pointsize': '10pt',
# Additional stuff for the LaTeX preamble.
- #'preamble': '',
+ "preamble": r"""
+ \usepackage{amsmath}\usepackage{amsfonts}\usepackage{bm}
+ \usepackage{morefloats}\usepackage{enumitem} \setlistdepth{10}
+ \let\oldhref\href
+ \renewcommand{\href}[2]{\oldhref{#1}{\hbox{#2}}}
+ """
}
# Grouping the document tree into LaTeX files. List of tuples
@@ -350,3 +336,4 @@
def setup(app):
# a copy button to copy snippet of code from the documentation
app.add_js_file("js/copybutton.js")
+ app.add_css_file("css/theme_overrides.css")
diff --git a/doc/examples/multilingual.rst b/docs/examples/multilingual.rst
similarity index 100%
rename from doc/examples/multilingual.rst
rename to docs/examples/multilingual.rst
diff --git a/doc/examples/replications.rst b/docs/examples/replications.rst
similarity index 97%
rename from doc/examples/replications.rst
rename to docs/examples/replications.rst
index 9c292d4..503acc7 100644
--- a/doc/examples/replications.rst
+++ b/docs/examples/replications.rst
@@ -24,6 +24,8 @@ reproduces the experiments performed in the following paper:
the original paper. However, our results are still very similar to those
in the original paper.
+
+
A transparent framework for evaluating unintended demographic bias in word embeddings (RNSB)
============================================================================================
diff --git a/doc/examples/wefe_case_study.rst b/docs/examples/wefe_case_study.rst
similarity index 100%
rename from doc/examples/wefe_case_study.rst
rename to docs/examples/wefe_case_study.rst
diff --git a/doc/getting_started/about.rst b/docs/getting_started/about.rst
similarity index 78%
rename from doc/getting_started/about.rst
rename to docs/getting_started/about.rst
index 009985e..07081e9 100644
--- a/doc/getting_started/about.rst
+++ b/docs/getting_started/about.rst
@@ -2,29 +2,46 @@
About
=====
-*Word Embedding Fairness Evaluation* (WEFE) is an open source library for
-measuring an mitigating bias in word embedding models.
-It generalizes many existing fairness metrics into a unified framework and
-provides a standard interface for:
+*Word Embedding Fairness Evaluation* (WEFE) is an open source library that implements
+many fairness metrics and mitigation methods (debias) in a unified framework.
+It also provides a standard interface for designing new ones.
-- Encapsulating existing fairness metrics from previous work and designing
- new ones.
+The main goal of the library is to provide a ready-to-use tool that allows the
+user to run bias measures and mitigation methods in a straightforward manner
+through well-designed and documented interfaces.
+
+In bias measurement, WEFE provides a standard interface for:
+
+- Encapsulating existing fairness metrics.
- Encapsulating the test words used by fairness metrics into standard
objects called queries.
- Computing a fairness metric on a given pre-trained word embedding model
using user-given queries.
-WEFE also standardizes the process of mitigating bias through an interface similar
-to the ``scikit-learn`` ``fit-transform``.
-This standardization separates the mitigation process into two stages:
-- The logic of calculating the transformation to be performed on the model (``fit``).
-- The execution of the mitigation transformation on the model (``transform``).
+On the other hand, WEFE standardizes all mitigation methods through an interface
+inherited from `scikit-learn `_ basic data transformations:
+the ``fit-transform`` interface. This standardization separates the mitigation
+process into two stages:
+
+- The first step, ``fit``, learn the corresponding mitigation transformation.
+- The ``transform`` method applies the transformation learned in the previous step
+ to words residing in the original embedding space.
+
+.. note::
+
+ To learn more about the measurement or mitigation framework, visit
+ :ref:`measurement framework` or
+ :ref:`mitigation framework` respectively, in the Conceptual Guides Section.
+
+ For practical tutorials on how to measure or mitigate bias, visit
+ :ref:`bias measurement` or :ref:`bias mitigation` respectively
+ in the WEFE User Guide.
Motivation and objectives
=========================
-Word Embeddings models are a core component in almost all NLP downstream systems.
+Word Embedding models are a core component in almost all NLP downstream systems.
Several studies have shown that they are prone to inherit stereotypical social
biases from the corpus they were built on.
The common method for quantifying bias is to use a metric that calculates the
@@ -104,10 +121,11 @@ Roadmap
We expect in the future to:
+- Implement measurement framework for contextualized embedding models.
- Implement new queries on different criteria.
- Create a single script that evaluates different embedding models under different bias criteria.
- From the previous script, rank as many embeddings available on the web as possible.
-- Implement a visualization module.
+- Implement a simple visualization module.
- Implement p-values mixin that applies for all metrics that accept two targets.
License
@@ -148,6 +166,7 @@ You are also welcome to do a pull request or publish an issue in the
Acknowledgments
===============
+
This work was funded by the
`Millennium Institute for Foundational Research on Data (IMFD) `_.
It is also sponsored by `National Center of Artificial Intelligence of Chile (CENIA) `_.
\ No newline at end of file
diff --git a/doc/getting_started/quick_start.rst b/docs/getting_started/quick_start.rst
similarity index 93%
rename from doc/getting_started/quick_start.rst
rename to docs/getting_started/quick_start.rst
index f897453..3ea3da9 100644
--- a/doc/getting_started/quick_start.rst
+++ b/docs/getting_started/quick_start.rst
@@ -1,3 +1,5 @@
+.. _quick_start:
+
===========
Quick Start
===========
@@ -98,5 +100,4 @@ with the parameters created in the past steps. In this case we use the
A score greater than 0 indicates that there is indeed a biased relationship between
women and the arts with respect to men and science.
-For more advanced usage, visit user the `User Guide `_
-section.
+For more advanced usage, visit user the :ref:`bias measurement` in the User Guide.
diff --git a/doc/images/WEAT_replication.png b/docs/images/WEAT_replication.png
similarity index 100%
rename from doc/images/WEAT_replication.png
rename to docs/images/WEAT_replication.png
diff --git a/doc/images/conceptnet_rnsb.png b/docs/images/conceptnet_rnsb.png
similarity index 100%
rename from doc/images/conceptnet_rnsb.png
rename to docs/images/conceptnet_rnsb.png
diff --git a/doc/images/diagram_1.png b/docs/images/diagram_1.png
similarity index 100%
rename from doc/images/diagram_1.png
rename to docs/images/diagram_1.png
diff --git a/doc/images/diagram_2.png b/docs/images/diagram_2.png
similarity index 100%
rename from doc/images/diagram_2.png
rename to docs/images/diagram_2.png
diff --git a/doc/images/fair_rnsb.png b/docs/images/fair_rnsb.png
similarity index 100%
rename from doc/images/fair_rnsb.png
rename to docs/images/fair_rnsb.png
diff --git a/doc/images/glove_rnsb.png b/docs/images/glove_rnsb.png
similarity index 100%
rename from doc/images/glove_rnsb.png
rename to docs/images/glove_rnsb.png
diff --git a/docs/images/measurement_user_guide/output_40_0.png b/docs/images/measurement_user_guide/output_40_0.png
new file mode 100644
index 0000000..af82d58
Binary files /dev/null and b/docs/images/measurement_user_guide/output_40_0.png differ
diff --git a/docs/images/measurement_user_guide/output_43_0.png b/docs/images/measurement_user_guide/output_43_0.png
new file mode 100644
index 0000000..82a9e8d
Binary files /dev/null and b/docs/images/measurement_user_guide/output_43_0.png differ
diff --git a/docs/images/measurement_user_guide/output_46_0.png b/docs/images/measurement_user_guide/output_46_0.png
new file mode 100644
index 0000000..70e033b
Binary files /dev/null and b/docs/images/measurement_user_guide/output_46_0.png differ
diff --git a/docs/images/measurement_user_guide/output_60_0.png b/docs/images/measurement_user_guide/output_60_0.png
new file mode 100644
index 0000000..7cf8131
Binary files /dev/null and b/docs/images/measurement_user_guide/output_60_0.png differ
diff --git a/docs/images/measurement_user_guide/output_61_0.png b/docs/images/measurement_user_guide/output_61_0.png
new file mode 100644
index 0000000..d32910a
Binary files /dev/null and b/docs/images/measurement_user_guide/output_61_0.png differ
diff --git a/docs/images/measurement_user_guide/output_67_0.png b/docs/images/measurement_user_guide/output_67_0.png
new file mode 100644
index 0000000..d05ed99
Binary files /dev/null and b/docs/images/measurement_user_guide/output_67_0.png differ
diff --git a/doc/index.rst b/docs/index.rst
similarity index 90%
rename from doc/index.rst
rename to docs/index.rst
index 63791b4..35c2cec 100644
--- a/doc/index.rst
+++ b/docs/index.rst
@@ -21,8 +21,8 @@ the detailed API documentation and extensive examples.
:maxdepth: 2
:caption: User Guide
- user_guide/measurement.ipynb
- user_guide/mitigation.ipynb
+ user_guide/measurement_user_guide.rst
+ user_guide/mitigation_user_guide.rst
user_guide/loading_embeddings.rst
.. toctree::
diff --git a/doc/make.bat b/docs/make.bat
similarity index 100%
rename from doc/make.bat
rename to docs/make.bat
diff --git a/doc/user_guide/contribute.rst b/docs/user_guide/contribute.rst
similarity index 96%
rename from doc/user_guide/contribute.rst
rename to docs/user_guide/contribute.rst
index bb85420..f5956cd 100644
--- a/doc/user_guide/contribute.rst
+++ b/docs/user_guide/contribute.rst
@@ -314,7 +314,7 @@ Using the steps previously seen, a sample metric is implemented:
titlecase.
* ``strip_accents``: ``bool``, ``{'ascii', 'unicode'}``: Specifies that
the accents of the words are eliminated. The stripping type can be
- specified. True uses ‘unicode’ by default.
+ specified. True uses 'unicode' by default.
* ``preprocessor``: ``Callable``. It receives a function that operates
on each word. In the case of specifying a function, it overrides the
default preprocessor (i.e., the previous options stop working).
@@ -322,14 +322,14 @@ Using the steps previously seen, a sample metric is implemented:
A list of preprocessor options allows searching for several
variants of the words into the model. For example, the preprocessors
``[{}, {"lowercase": True, "strip_accents": True}]``
- ``{}`` allows first to search for the original words in the vocabulary of
+ ``{}`` allows searching first for the original words in the vocabulary of
the model. In case some of them are not found,
``{"lowercase": True, "strip_accents": True}`` is executed on these words
and then they are searched in the model vocabulary.
strategy : str, optional
The strategy indicates how it will use the preprocessed words: 'first' will
- include only the first transformed word found. all' will include all
+ include only the first transformed word found. 'all' will include all
transformed words found, by default "first".
normalize : bool, optional
@@ -527,7 +527,7 @@ the above.
titlecase.
* ``strip_accents``: ``bool``, ``{'ascii', 'unicode'}``: Specifies that
the accents of the words are eliminated. The stripping type can be
- specified. True uses ‘unicode’ by default.
+ specified. True uses 'unicode' by default.
* ``preprocessor``: ``Callable``. It receives a function that operates
on each word. In the case of specifying a function, it overrides the
default preprocessor (i.e., the previous options stop working).
@@ -535,13 +535,13 @@ the above.
A list of preprocessor options allows searching for several
variants of the words into the model. For example, the preprocessors
``[{}, {"lowercase": True, "strip_accents": True}]``
- ``{}`` allows first to search for the original words in the vocabulary of the model.
+ ``{}`` allows searching first for the original words in the vocabulary of the model.
In case some of them are not found, ``{"lowercase": True, "strip_accents": True}``
is executed on these words and then they are searched in the model vocabulary.
strategy : str, optional
The strategy indicates how it will use the preprocessed words: 'first' will
- include only the first transformed word found. all' will include all
+ include only the first transformed word found. 'all' will include all
transformed words found, by default "first".
normalize : bool, optional
diff --git a/doc/user_guide/loading_embeddings.rst b/docs/user_guide/loading_embeddings.rst
similarity index 89%
rename from doc/user_guide/loading_embeddings.rst
rename to docs/user_guide/loading_embeddings.rst
index d1ad52c..716fd5b 100644
--- a/doc/user_guide/loading_embeddings.rst
+++ b/docs/user_guide/loading_embeddings.rst
@@ -113,7 +113,7 @@ it can also be used via :code:`FastTextKeyedVectors`.
Flair
=====
-WEFE does not yet support flair interfaces.
+WEFE does not support flair interfaces.
However, you can use static embeddings of flair
(
`Classic Word Embeddings `_
@@ -121,13 +121,14 @@ However, you can use static embeddings of flair
The following code is an example of this:
>>> from flair.embeddings import WordEmbeddings
+>>> from wefe.utils import flair_to_gensim
>>>
->>> glove_embedding = WordEmbeddings('glove') # 100 dim glove
+>>> # could be any of the Classic Word Embeddings model list.
+>>> flair_model_name = "glove"
>>>
->>> # extract KeyedVectors object
->>> glove_keyed_vectors = glove_embedding.precomputed_word_embeddings
->>> glove_100 = WordEmbeddingModel(glove_keyed_vectors, 'glove-100')
+>>> flair_model = flair_to_gensim(WordEmbeddings(flair_model_name))
+>>> wefe_model = WordEmbeddingModel(flair_model, flair_model_name)
>>>
->>> result = weat.run_query(query, glove_100)
+>>> result = weat.run_query(query, wefe_model)
>>> print(result)
{'query_name': 'Male terms and Female terms wrt Career and Family', 'result': 1.0486683}
\ No newline at end of file
diff --git a/docs/user_guide/measurement_user_guide.rst b/docs/user_guide/measurement_user_guide.rst
new file mode 100644
index 0000000..c307069
--- /dev/null
+++ b/docs/user_guide/measurement_user_guide.rst
@@ -0,0 +1,1576 @@
+.. _bias measurement:
+
+Bias Measurement
+================
+
+The following guide is designed to present the more general details on
+using the package to measure bias. The following sections show:
+
+* how to run a simple query using ``Glove`` embedding model.
+* how to run multiple queries on multiple embeddings.
+* how to compare the results obtained from running multiple
+ sets of queries on multiple embeddings using different metrics
+ through ranking calculation.
+* how to calculate the correlations between the
+ rankings obtained.
+
+.. warning::
+
+ To accurately study and reduce biases contained in word embeddings, queries may
+ contain words that could be offensive to certain groups or individuals.
+ The relationships studied between these words DO NOT represent the
+ ideas, thoughts or beliefs of the authors of this library.
+ This warning applies to all documentation.
+
+.. note::
+
+ If you are not familiar with the concepts of query, target and attribute
+ set, please visit the :ref:`measurement framework`
+ on the library’s conceptual guides. These concepts are widely used in the
+ following sections.
+
+.. note::
+
+ For a list of metrics implemented in WEFE, refer to the
+ :ref:`metrics section` of the API reference.
+
+
+Run a Query
+-----------
+
+The following subsections explains how to run a simple query that
+measures gender bias on
+`Glove `_.
+The example uses the Word Embedding Association Test (:class:`~wefe.metrics.WEAT.WEAT`)
+metric quantifying the bias in the embeddings model. Below we show the three usual
+steps for performing a query in WEFE:
+
+.. note::
+
+ :class:`~wefe.metrics.WEAT.WEAT` is a fairness metric that quantifies the relationship
+ between two sets of target words (sets of words intended to denote a social
+ groups as men and women) and two sets of attribute words (sets of words
+ representing some attitude, characteristic, trait, occupational field,
+ etc. that can be associated with individuals from any social group).
+
+ The closer its value is to 0, the less biased the model is.
+
+ Visit the metrics documentation (:class:`~wefe.metrics.WEAT.WEAT`) for more information.
+
+
+Load a word embeddings model as a ``WordEmbeddingModel`` object
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+Load the word embedding model and then wrap it using a
+:class:`~wefe.word_embedding_model.WordEmbeddingModel` (class that allows WEFE to handle the models).
+
+WEFE bases all its operations on word embeddings using Gensim’s
+``KeyedVectors`` interface. Any model that can be loaded using
+``KeyedVectors`` will be compatible with WEFE. The following example uses a 25-dim pre-trained ``Glove`` model using a
+twitter dataset loaded using `gensim-data `_.
+
+
+.. note::
+ Visit `gensim-data repository`_.
+ to find the complete list of published pre-trained models ready to use.
+
+.. code:: ipython3
+
+ import gensim.downloader as api
+
+ from wefe.datasets import load_weat
+ from wefe.metrics import WEAT
+ from wefe.query import Query
+ from wefe.word_embedding_model import WordEmbeddingModel
+
+ twitter_25 = api.load("glove-twitter-25")
+ # WordEmbeddingModel receives as first argument a KeyedVectors model
+ # and the second argument the model name.
+ model = WordEmbeddingModel(twitter_25, "glove twitter dim=25")
+
+Create the query using a ``Query`` object
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+Define the target and attribute word sets and create a :class:`~wefe.query.Query` object
+that contains them.
+
+For this initial example, a query is used to study the association
+between gender with respect to family and career. The words used are
+taken from the set of words used in the *Semantics derived automatically
+from language corpora contain human-like biases* paper, which are
+included in the ``datasets`` module.
+
+.. code:: ipython3
+
+ gender_query = Query(
+ target_sets=[
+ ["female", "woman", "girl", "sister", "she", "her", "hers", "daughter"],
+ ["male", "man", "boy", "brother", "he", "him", "his", "son"],
+ ],
+ attribute_sets=[
+ [
+ "home",
+ "parents",
+ "children",
+ "family",
+ "cousins",
+ "marriage",
+ "wedding",
+ "relatives",
+ ],
+ [
+ "executive",
+ "management",
+ "professional",
+ "corporation",
+ "salary",
+ "office",
+ "business",
+ "career",
+ ],
+ ],
+ target_sets_names=["Female terms", "Male Terms"],
+ attribute_sets_names=["Family", "Careers"],
+ )
+
+ gender_query
+
+
+
+
+
+.. parsed-literal::
+
+
+
+
+
+Run the Query
+~~~~~~~~~~~~~
+
+Instantiate the metric that you will use and then execute ``run_query``
+with the parameters created in the previous steps.
+
+Any bias measurement process at WEFE consists of the following steps:
+
+1. Metric arguments checking.
+2. Transform the word sets into word embeddings.
+3. Calculate the metric.
+
+In this case we use the :class:`~wefe.metrics.WEAT.WEAT` metric (proposed in the
+same paper of the set of words used in the query).
+
+.. code:: ipython3
+
+ metric = WEAT()
+ result = metric.run_query(gender_query, model)
+ result
+
+
+
+
+
+.. parsed-literal::
+
+ {'query_name': 'Female terms and Male Terms wrt Family and Careers',
+ 'result': 0.31658412935212255,
+ 'weat': 0.31658412935212255,
+ 'effect_size': 0.6779439085309583,
+ 'p_value': nan}
+
+
+
+By default, the results are a ``dict`` containing the query name (in the
+key ``query_name``) and the calculated value of the metric in the
+``result`` key. It also contains a key with the name and the value of
+the calculated metric (which is duplicated in the “results” key).
+
+Depending on the metric class used, the result ``dict`` can also return
+more metrics, detailed word-by-word values or other statistics like
+p-values. Also some metrics allow you to change the default value in
+results.
+
+Details of all the metrics implemented, their parameters and
+examples of execution can be found at :ref:`metrics section `.
+
+Run Query Arguments
+-------------------
+
+Each metric allows varying the behavior of ``run_query`` according to
+different parameters. There are parameters to customize the
+transformation of the sets of words to sets of embeddings, others to
+warn errors or modify which calculation method the metric use.
+
+.. note::
+
+ Each metric implements the ``run_query`` method with different arguments.
+ Visit their API documentation for more information.
+
+
+For example, ``run_query`` can be instructed to ``return effect_size``
+in the ``result`` key by setting ``return_effect_size`` as ``True``.
+Note that this parameter is only of the class :class:`~wefe.metrics.WEAT.WEAT``.
+
+
+.. code:: ipython3
+
+ weat = WEAT()
+ result = weat.run_query(gender_query, model, return_effect_size=True)
+ result
+
+
+
+
+
+.. parsed-literal::
+
+ {'query_name': 'Female terms and Male Terms wrt Family and Careers',
+ 'result': 0.6779439085309583,
+ 'weat': 0.31658412935212255,
+ 'effect_size': 0.6779439085309583,
+ 'p_value': nan}
+
+
+
+You can also request ``run_query`` to run the statistical significance
+calculation by setting ``calculate_p_value`` as ``True``. This checks
+how many queries generated from permutations (controlled by the
+parameter ``p_value_iterations``) of the target sets obtain values
+greater than those obtained by the original query.
+
+.. code:: ipython3
+
+ weat = WEAT()
+ result = weat.run_query(
+ gender_query, model, calculate_p_value=True, p_value_iterations=5000
+ )
+ result
+
+
+
+
+.. parsed-literal::
+
+ {'query_name': 'Female terms and Male Terms wrt Family and Careers',
+ 'result': 0.31658412935212255,
+ 'weat': 0.31658412935212255,
+ 'effect_size': 0.6779439085309583,
+ 'p_value': 0.08418316336732654}
+
+
+
+Out of Vocabulary Words and Word Preprocessors
+----------------------------------------------
+
+It is common in the literature to find bias tests whose tagret sets are
+common names of social groups. These names are commonly cased and may
+contain special characters. There are several embedding models whose
+words are not cased or do not have accents or other special characters,
+as for example, in ``Glove``. This implies that a query with target sets
+composed by names executed in ``Glove`` (without any preprocessing of
+the words) could produce erroneous results because WEFE will not be able
+to find the names in the model vocabulary.
+
+.. note::
+
+ Some well-known word sets are already provided by the package and can be
+ easily loaded by the user through the :ref:`datasets ` module. From here on,
+ the tutorial use the words defined in the study *Semantics derived
+ automatically from language corpora contain human-like biases*, the same
+ that proposed the :class:`~wefe.metrics.WEAT.WEAT` metric.
+
+
+.. code:: ipython3
+
+ # load the weat word sets.
+ word_sets = load_weat()
+
+ # print a set of european american common names.
+ print(word_sets["european_american_names_5"])
+
+
+.. parsed-literal::
+
+ ['Adam', 'Harry', 'Josh', 'Roger', 'Alan', 'Frank', 'Justin', 'Ryan', 'Andrew', 'Jack', 'Matthew', 'Stephen', 'Brad', 'Greg', 'Paul', 'Jonathan', 'Peter', 'Amanda', 'Courtney', 'Heather', 'Melanie', 'Sara', 'Amber', 'Katie', 'Betsy', 'Kristin', 'Nancy', 'Stephanie', 'Ellen', 'Lauren', 'Colleen', 'Emily', 'Megan', 'Rachel']
+
+
+The following query compares European-American and African-American
+names with respect to pleasant and unpleasant attributes.
+
+.. note::
+
+ It can be indicated to ``run_query`` to log the words that were lost in
+ the transformation to vectors by using the parameter
+ ``warn_not_found_words`` as ``True``.
+
+.. code:: ipython3
+
+ ethnicity_query = Query(
+ [word_sets["european_american_names_5"], word_sets["african_american_names_5"]],
+ [word_sets["pleasant_5"], word_sets["unpleasant_5"]],
+ ["European american names", "African american names"],
+ ["Pleasant", "Unpleasant"],
+ )
+ result = weat.run_query(ethnicity_query, model, warn_not_found_words=True,)
+ result
+
+
+
+.. parsed-literal::
+
+ WARNING:root:The following words from set 'European american names' do not exist within the vocabulary of glove twitter dim=25: ['Adam', 'Harry', 'Josh', 'Roger', 'Alan', 'Frank', 'Justin', 'Ryan', 'Andrew', 'Jack', 'Matthew', 'Stephen', 'Brad', 'Greg', 'Paul', 'Jonathan', 'Peter', 'Amanda', 'Courtney', 'Heather', 'Melanie', 'Sara', 'Amber', 'Katie', 'Betsy', 'Kristin', 'Nancy', 'Stephanie', 'Ellen', 'Lauren', 'Colleen', 'Emily', 'Megan', 'Rachel']
+ WARNING:root:The transformation of 'European american names' into glove twitter dim=25 embeddings lost proportionally more words than specified in 'lost_words_threshold': 1.0 lost with respect to 0.2 maximum loss allowed.
+ WARNING:root:The following words from set 'African american names' do not exist within the vocabulary of glove twitter dim=25: ['Alonzo', 'Jamel', 'Theo', 'Alphonse', 'Jerome', 'Leroy', 'Torrance', 'Darnell', 'Lamar', 'Lionel', 'Tyree', 'Deion', 'Lamont', 'Malik', 'Terrence', 'Tyrone', 'Lavon', 'Marcellus', 'Wardell', 'Nichelle', 'Shereen', 'Ebony', 'Latisha', 'Shaniqua', 'Jasmine', 'Tanisha', 'Tia', 'Lakisha', 'Latoya', 'Yolanda', 'Malika', 'Yvette']
+ WARNING:root:The transformation of 'African american names' into glove twitter dim=25 embeddings lost proportionally more words than specified in 'lost_words_threshold': 1.0 lost with respect to 0.2 maximum loss allowed.
+ ERROR:root:At least one set of 'European american names and African american names wrt Pleasant and Unpleasant' query has proportionally fewer embeddings than allowed by the lost_vocabulary_threshold parameter (0.2). This query will return np.nan.
+
+
+
+
+.. parsed-literal::
+
+ {'query_name': 'European american names and African american names wrt Pleasant and Unpleasant',
+ 'result': nan,
+ 'weat': nan,
+ 'effect_size': nan}
+
+
+
+.. warning::
+
+ If more than 20% of the words from any of the word sets of the query are
+ lost during the transformation to embeddings, the result of the metric
+ will be ``np.nan``. This behavior can be changed using a float number
+ parameter called ``lost_vocabulary_threshold``.
+
+Word Preprocessors
+~~~~~~~~~~~~~~~~~~
+
+Any ``run_query`` method allows preprocessing each word before they are searched in the model's
+vocabulary through the parameter ``preprocessors`` (list of one or more preprocessor).
+This parameter accepts a list of individual preprocessors, which are defined below:
+
+A ``preprocessor`` is a dictionary that specifies what processing(s) are
+performed on each word before its looked up in the model vocabulary.
+For example, the ``preprocessor``
+``{'lowecase': True, 'strip_accents': True}`` allows you to lowercase
+and remove the accent from each word before searching for them in the
+model vocabulary. Note that an empty dictionary ``{}`` indicates that no
+preprocessing is done.
+
+The possible options for a preprocessor are:
+
+- ``lowercase``: ``bool``. Indicates that the words are transformed to lowercase.
+- ``uppercase``: ``bool``. Indicates that the words are transformed to uppercase.
+- ``titlecase``: ``bool``. Indicates that the words are transformed to titlecase.
+- ``strip_accents``: ``bool``, ``{'ascii', 'unicode'}``: Specifies that the accents of the words
+ are eliminated. The stripping type can be specified. True uses 'unicode' by default.
+- ``preprocessor``: ``Callable``. It receives a function that operates on each word.
+ In the case of specifying a function, it overrides the default preprocessor
+ (i.e., the previous options stop working).
+
+
+A list of preprocessor options allows searching for several
+variants of the words into the model. For example, the preprocessors
+``[{}, {"lowercase": True, "strip_accents": True}]``
+``{}`` allows searching first for the original words in the vocabulary of the model.
+In case some of them are not found, ``{"lowercase": True, "strip_accents": True}``
+is executed on these words and then they are searched in the model vocabulary.
+
+By default (in case there is more than one preprocessor in the list) the first
+preprocessed word found in the embeddings model is used.
+This behavior can be controlled by the ``strategy`` parameter of ``run_query``.
+
+In the following example, we provide a list with only one
+preprocessor that instructs ``run_query`` to lowercase and remove all
+accents from every word before they are searched in the embeddings
+model.
+
+
+.. code:: ipython3
+
+ weat = WEAT()
+ result = weat.run_query(
+ ethnicity_query,
+ model,
+ preprocessors=[{"lowercase": True, "strip_accents": True}],
+ warn_not_found_words=True,
+ )
+ result
+
+
+.. parsed-literal::
+
+ WARNING:root:The following words from set 'African american names' do not exist within the vocabulary of glove twitter dim=25: ['wardell']
+
+
+
+
+.. parsed-literal::
+
+ {'query_name': 'European american names and African american names wrt Pleasant and Unpleasant',
+ 'result': 3.7529150679125456,
+ 'weat': 3.7529150679125456,
+ 'effect_size': 1.2746819330405683,
+ 'p_value': nan}
+
+
+
+It may happen that it is more important to find the original word and in
+the case of not finding it, then preprocess it and look it up in the
+vocabulary. This behavior can be specified in ``preprocessors`` list by
+first specifying an empty preprocessor ``{}`` and then the preprocessor
+that converts to lowercase and removes accents.
+
+
+.. code:: ipython3
+
+ weat = WEAT()
+ result = weat.run_query(
+ ethnicity_query,
+ model,
+ preprocessors=[
+ {}, # empty preprocessor, search for the original words.
+ {
+ "lowercase": True,
+ "strip_accents": True,
+ }, # search for lowercase and no accent words.
+ ],
+ warn_not_found_words=True,
+ )
+
+ result
+
+
+.. parsed-literal::
+
+ WARNING:root:The following words from set 'European american names' do not exist within the vocabulary of glove twitter dim=25: ['Adam', 'Harry', 'Josh', 'Roger', 'Alan', 'Frank', 'Justin', 'Ryan', 'Andrew', 'Jack', 'Matthew', 'Stephen', 'Brad', 'Greg', 'Paul', 'Jonathan', 'Peter', 'Amanda', 'Courtney', 'Heather', 'Melanie', 'Sara', 'Amber', 'Katie', 'Betsy', 'Kristin', 'Nancy', 'Stephanie', 'Ellen', 'Lauren', 'Colleen', 'Emily', 'Megan', 'Rachel']
+ WARNING:root:The following words from set 'African american names' do not exist within the vocabulary of glove twitter dim=25: ['Alonzo', 'Jamel', 'Theo', 'Alphonse', 'Jerome', 'Leroy', 'Torrance', 'Darnell', 'Lamar', 'Lionel', 'Tyree', 'Deion', 'Lamont', 'Malik', 'Terrence', 'Tyrone', 'Lavon', 'Marcellus', 'Wardell', 'wardell', 'Nichelle', 'Shereen', 'Ebony', 'Latisha', 'Shaniqua', 'Jasmine', 'Tanisha', 'Tia', 'Lakisha', 'Latoya', 'Yolanda', 'Malika', 'Yvette']
+
+
+
+
+.. parsed-literal::
+
+ {'query_name': 'European american names and African american names wrt Pleasant and Unpleasant',
+ 'result': 3.7529150679125456,
+ 'weat': 3.7529150679125456,
+ 'effect_size': 1.2746819330405683,
+ 'p_value': nan}
+
+
+
+The number of preprocessing steps can be increased as needed. For
+example, we can complex the above preprocessor to first search for the
+original words, then for the lowercase words, and finally for the
+lowercase words without accents.
+
+
+.. code:: ipython3
+
+ weat = WEAT()
+ result = weat.run_query(
+ ethnicity_query,
+ model,
+ preprocessors=[
+ {}, # first step: empty preprocessor, search for the original words.
+ {"lowercase": True,}, # second step: search for lowercase.
+ {
+ "lowercase": True,
+ "strip_accents": True,
+ }, # third step: search for lowercase and no accent words.
+ ],
+ warn_not_found_words=True,
+ )
+
+ result
+
+
+.. parsed-literal::
+
+ WARNING:root:The following words from set 'European american names' do not exist within the vocabulary of glove twitter dim=25: ['Adam', 'Harry', 'Josh', 'Roger', 'Alan', 'Frank', 'Justin', 'Ryan', 'Andrew', 'Jack', 'Matthew', 'Stephen', 'Brad', 'Greg', 'Paul', 'Jonathan', 'Peter', 'Amanda', 'Courtney', 'Heather', 'Melanie', 'Sara', 'Amber', 'Katie', 'Betsy', 'Kristin', 'Nancy', 'Stephanie', 'Ellen', 'Lauren', 'Colleen', 'Emily', 'Megan', 'Rachel']
+ WARNING:root:The following words from set 'African american names' do not exist within the vocabulary of glove twitter dim=25: ['Alonzo', 'Jamel', 'Theo', 'Alphonse', 'Jerome', 'Leroy', 'Torrance', 'Darnell', 'Lamar', 'Lionel', 'Tyree', 'Deion', 'Lamont', 'Malik', 'Terrence', 'Tyrone', 'Lavon', 'Marcellus', 'Wardell', 'wardell', 'wardell', 'Nichelle', 'Shereen', 'Ebony', 'Latisha', 'Shaniqua', 'Jasmine', 'Tanisha', 'Tia', 'Lakisha', 'Latoya', 'Yolanda', 'Malika', 'Yvette']
+
+
+
+
+.. parsed-literal::
+
+ {'query_name': 'European american names and African american names wrt Pleasant and Unpleasant',
+ 'result': 3.7529150679125456,
+ 'weat': 3.7529150679125456,
+ 'effect_size': 1.2746819330405683,
+ 'p_value': nan}
+
+
+
+It is also possible to change the behavior of the search by including
+not only the first word, but all the words generated by the
+preprocessors. This can be controlled by specifying the parameter
+``strategy=all``.
+
+.. code:: ipython3
+
+ weat = WEAT()
+ result = weat.run_query(
+ ethnicity_query,
+ model,
+ preprocessors=[
+ {}, # first step: empty preprocessor, search for the original words.
+ {"lowercase": True,}, # second step: search for lowercase .
+ {"uppercase": True,}, # third step: search for uppercase.
+ ],
+ strategy="all",
+ warn_not_found_words=True,
+ )
+
+ result
+
+
+
+.. parsed-literal::
+
+ WARNING:root:The following words from set 'European american names' do not exist within the vocabulary of glove twitter dim=25: ['Adam', 'ADAM', 'Harry', 'HARRY', 'Josh', 'JOSH', 'Roger', 'ROGER', 'Alan', 'ALAN', 'Frank', 'FRANK', 'Justin', 'JUSTIN', 'Ryan', 'RYAN', 'Andrew', 'ANDREW', 'Jack', 'JACK', 'Matthew', 'MATTHEW', 'Stephen', 'STEPHEN', 'Brad', 'BRAD', 'Greg', 'GREG', 'Paul', 'PAUL', 'Jonathan', 'JONATHAN', 'Peter', 'PETER', 'Amanda', 'AMANDA', 'Courtney', 'COURTNEY', 'Heather', 'HEATHER', 'Melanie', 'MELANIE', 'Sara', 'SARA', 'Amber', 'AMBER', 'Katie', 'KATIE', 'Betsy', 'BETSY', 'Kristin', 'KRISTIN', 'Nancy', 'NANCY', 'Stephanie', 'STEPHANIE', 'Ellen', 'ELLEN', 'Lauren', 'LAUREN', 'Colleen', 'COLLEEN', 'Emily', 'EMILY', 'Megan', 'MEGAN', 'Rachel', 'RACHEL']
+ WARNING:root:The following words from set 'African american names' do not exist within the vocabulary of glove twitter dim=25: ['Alonzo', 'ALONZO', 'Jamel', 'JAMEL', 'Theo', 'THEO', 'Alphonse', 'ALPHONSE', 'Jerome', 'JEROME', 'Leroy', 'LEROY', 'Torrance', 'TORRANCE', 'Darnell', 'DARNELL', 'Lamar', 'LAMAR', 'Lionel', 'LIONEL', 'Tyree', 'TYREE', 'Deion', 'DEION', 'Lamont', 'LAMONT', 'Malik', 'MALIK', 'Terrence', 'TERRENCE', 'Tyrone', 'TYRONE', 'Lavon', 'LAVON', 'Marcellus', 'MARCELLUS', 'Wardell', 'wardell', 'WARDELL', 'Nichelle', 'NICHELLE', 'Shereen', 'SHEREEN', 'Ebony', 'EBONY', 'Latisha', 'LATISHA', 'Shaniqua', 'SHANIQUA', 'Jasmine', 'JASMINE', 'Tanisha', 'TANISHA', 'Tia', 'TIA', 'Lakisha', 'LAKISHA', 'Latoya', 'LATOYA', 'Yolanda', 'YOLANDA', 'Malika', 'MALIKA', 'Yvette', 'YVETTE']
+ WARNING:root:The following words from set 'Pleasant' do not exist within the vocabulary of glove twitter dim=25: ['CARESS', 'FREEDOM', 'HEALTH', 'LOVE', 'PEACE', 'CHEER', 'FRIEND', 'HEAVEN', 'LOYAL', 'PLEASURE', 'DIAMOND', 'GENTLE', 'HONEST', 'LUCKY', 'RAINBOW', 'DIPLOMA', 'GIFT', 'HONOR', 'MIRACLE', 'SUNRISE', 'FAMILY', 'HAPPY', 'LAUGHTER', 'PARADISE', 'VACATION']
+ WARNING:root:The following words from set 'Unpleasant' do not exist within the vocabulary of glove twitter dim=25: ['ABUSE', 'CRASH', 'FILTH', 'MURDER', 'SICKNESS', 'ACCIDENT', 'DEATH', 'GRIEF', 'POISON', 'STINK', 'ASSAULT', 'DISASTER', 'HATRED', 'POLLUTE', 'TRAGEDY', 'DIVORCE', 'JAIL', 'POVERTY', 'UGLY', 'CANCER', 'KILL', 'ROTTEN', 'VOMIT', 'AGONY', 'PRISON']
+
+
+
+
+.. parsed-literal::
+
+ {'query_name': 'European american names and African american names wrt Pleasant and Unpleasant',
+ 'result': 3.7529150679125456,
+ 'weat': 3.7529150679125456,
+ 'effect_size': 1.2746819330405683,
+ 'p_value': nan}
+
+
+
+Running Multiple Queries
+------------------------
+
+It is usual to want to test many queries of some bias criterion (gender,
+ethnicity, religion, politics, socioeconomic, among others) on several
+models at the same time. Trying to use ``run_query`` on each pair
+embedding-query can be a bit complex and could require extra work to
+implement.
+
+This is why WEFE also implements a function to test multiple
+queries on various word embedding models in a single call: the
+:func:`~wefe.utils.run_queries` util.
+
+The following code shows how to run various gender queries on ``Glove``
+embedding models with different dimensions trained from the Twitter
+dataset. The queries are executed using :class:`~wefe.metrics.WEAT.WEAT` metric.
+
+.. code:: ipython3
+
+ import gensim.downloader as api
+
+ from wefe.datasets import load_weat
+ from wefe.metrics import RNSB, WEAT
+ from wefe.query import Query
+ from wefe.utils import run_queries
+ from wefe.word_embedding_model import WordEmbeddingModel
+
+Load the models
+~~~~~~~~~~~~~~~
+
+Load three different Glove Twitter embedding models. These models were
+trained using the same dataset varying the number of embedding
+dimensions.
+
+.. code:: ipython3
+
+ model_1 = WordEmbeddingModel(api.load("glove-twitter-25"), "glove twitter dim=25")
+ model_2 = WordEmbeddingModel(api.load("glove-twitter-50"), "glove twitter dim=50")
+ model_3 = WordEmbeddingModel(api.load("glove-twitter-100"), "glove twitter dim=100")
+
+ models = [model_1, model_2, model_3]
+
+
+
+Load the word sets and create the queries
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+Now, we load the :class:`~wefe.metrics.WEAT.WEAT` word set and create three queries. The
+three queries are intended to measure gender bias.
+
+
+.. code:: ipython3
+
+ # Load the WEAT word sets
+ word_sets = load_weat()
+
+ # Create gender queries
+ gender_query_1 = Query(
+ [word_sets["male_terms"], word_sets["female_terms"]],
+ [word_sets["career"], word_sets["family"]],
+ ["Male terms", "Female terms"],
+ ["Career", "Family"],
+ )
+
+ gender_query_2 = Query(
+ [word_sets["male_terms"], word_sets["female_terms"]],
+ [word_sets["science"], word_sets["arts"]],
+ ["Male terms", "Female terms"],
+ ["Science", "Arts"],
+ )
+
+ gender_query_3 = Query(
+ [word_sets["male_terms"], word_sets["female_terms"]],
+ [word_sets["math"], word_sets["arts_2"]],
+ ["Male terms", "Female terms"],
+ ["Math", "Arts"],
+ )
+
+ gender_queries = [gender_query_1, gender_query_2, gender_query_3]
+
+
+Run the queries on all Word Embeddings using WEAT
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+To run the list of queries and models, we call :func:`~wefe.utils.run_queries` using the
+parameters defined in the previous step. The mandatory parameters of the
+function are 3:
+
+- a metric,
+- a list of queries, and,
+- a list of embedding models.
+
+It is also possible to provide a name for the criterion studied in this
+set of queries through the parameter ``queries_set_name``.
+
+
+.. code:: ipython3
+
+ WEAT_gender_results = run_queries(
+ WEAT, gender_queries, models, queries_set_name="Gender Queries"
+ )
+ WEAT_gender_results
+
+
+
+.. parsed-literal::
+
+ WARNING:root:The transformation of 'Science' into glove twitter dim=25 embeddings lost proportionally more words than specified in 'lost_words_threshold': 0.25 lost with respect to 0.2 maximum loss allowed.
+ ERROR:root:At least one set of 'Male terms and Female terms wrt Science and Arts' query has proportionally fewer embeddings than allowed by the lost_vocabulary_threshold parameter (0.2). This query will return np.nan.
+ WARNING:root:The transformation of 'Science' into glove twitter dim=50 embeddings lost proportionally more words than specified in 'lost_words_threshold': 0.25 lost with respect to 0.2 maximum loss allowed.
+ ERROR:root:At least one set of 'Male terms and Female terms wrt Science and Arts' query has proportionally fewer embeddings than allowed by the lost_vocabulary_threshold parameter (0.2). This query will return np.nan.
+ WARNING:root:The transformation of 'Science' into glove twitter dim=100 embeddings lost proportionally more words than specified in 'lost_words_threshold': 0.25 lost with respect to 0.2 maximum loss allowed.
+ ERROR:root:At least one set of 'Male terms and Female terms wrt Science and Arts' query has proportionally fewer embeddings than allowed by the lost_vocabulary_threshold parameter (0.2). This query will return np.nan.
+
+
+
+
+.. raw:: html
+
+
+
+
+
+
+
query_name
+
Male terms and Female terms wrt Career and Family
+
Male terms and Female terms wrt Science and Arts
+
Male terms and Female terms wrt Math and Arts
+
+
+
model_name
+
+
+
+
+
+
+
+
glove twitter dim=25
+
0.316584
+
NaN
+
-0.022133
+
+
+
glove twitter dim=50
+
0.363743
+
NaN
+
-0.272334
+
+
+
glove twitter dim=100
+
0.385352
+
NaN
+
-0.082544
+
+
+
+
+
+
+
+Setting metric params
+~~~~~~~~~~~~~~~~~~~~~
+
+There is a whole column that has no results. As the warnings point out,
+when transforming the words of the sets into embeddings, there is a loss
+of words that is greater than the allowed by the parameter
+``lost_vocabulary_threshold``. In this case, it would be very useful to
+use the word preprocessors seen above.
+
+:func:`~wefe.utils.run_queries`, accept specific parameters for each metric. These extra
+parameters for the metric can be passed through ``metric_params``
+parameter. In this case, a ``preprocessor`` is provided to lowercase the
+words before searching for them in the models’ vocabularies.
+
+
+.. code:: ipython3
+
+ WEAT_gender_results = run_queries(
+ WEAT,
+ gender_queries,
+ models,
+ metric_params={"preprocessors": [{"lowercase": True}]},
+ queries_set_name="Gender Queries",
+ )
+
+ WEAT_gender_results
+
+
+
+
+.. raw:: html
+
+
+
+
+
+
+
query_name
+
Male terms and Female terms wrt Career and Family
+
Male terms and Female terms wrt Science and Arts
+
Male terms and Female terms wrt Math and Arts
+
+
+
model_name
+
+
+
+
+
+
+
+
glove twitter dim=25
+
0.316584
+
0.167431
+
-0.033912
+
+
+
glove twitter dim=50
+
0.363743
+
-0.084690
+
-0.307589
+
+
+
glove twitter dim=100
+
0.385352
+
0.099632
+
-0.155790
+
+
+
+
+
+
+
+No query was null in these results.
+
+
+Plot the results in a barplot
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+The library also provides an easy way to plot the results obtained from
+a ``run_queries`` execution into a `plotly `_ barplot.
+
+.. code:: ipython3
+
+ from wefe.utils import plot_queries_results, run_queries
+
+ # Plot the results
+ plot_queries_results(WEAT_gender_results).show()
+
+
+
+
+.. image:: ../images/measurement_user_guide/output_40_0.png
+
+
+Aggregating Results
+-------------------
+
+The execution of :func:`~wefe.utils.run_queries` provided many results evaluating the
+gender bias in the tested embeddings. However, these results alone do
+not comprehensively report the biases observed in all of these queries.
+One way to obtain an overall view of bias is by aggregating results by
+model.
+
+For WEAT, a simple way to aggregate the results is to average their
+absolute values. When running :func:`~wefe.utils.run_queries`, it is possible to specify
+that the results be aggregated by model by setting ``aggregate_results``
+as ``True``
+
+The aggregation function can be specified through the
+``aggregation_function`` parameter. This parameter accepts a list of
+predefined aggregations as well as a custom function that operates on
+the results dataframe. The aggregation functions available are:
+
+- Average ``avg``.
+- Average of the absolute values ``abs_avg``.
+- Sum ``sum``.
+- Sum of the absolute values, ``abs_sum``.
+
+.. note::
+
+ Notice that some functions are more appropriate for certain metrics. For
+ metrics returning only positive numbers, all the previous aggregation
+ functions would be OK. In contrast, metrics that return real values
+ (e.g., :class:`~wefe.metrics.WEAT.WEAT` , :class:`~wefe.metrics.RND.RND` , etc…),
+ aggregation functions such as sum would make positive and negative outputs to cancel
+ each other.
+
+.. code:: ipython3
+
+ WEAT_gender_results_agg = run_queries(
+ WEAT,
+ gender_queries,
+ models,
+ metric_params={"preprocessors": [{"lowercase": True}]},
+ aggregate_results=True,
+ aggregation_function="abs_avg",
+ queries_set_name="Gender Queries",
+ )
+ WEAT_gender_results_agg
+
+
+
+
+
+.. raw:: html
+
+
+
+
+
+
+
+
Male terms and Female terms wrt Career and Family
+
Male terms and Female terms wrt Science and Arts
+
Male terms and Female terms wrt Math and Arts
+
WEAT: Gender Queries average of abs values score
+
+
+
model_name
+
+
+
+
+
+
+
+
+
glove twitter dim=25
+
0.316584
+
0.167431
+
-0.033912
+
0.172642
+
+
+
glove twitter dim=50
+
0.363743
+
-0.084690
+
-0.307589
+
0.252007
+
+
+
glove twitter dim=100
+
0.385352
+
0.099632
+
-0.155790
+
0.213591
+
+
+
+
+
+
+
+.. code:: ipython3
+
+ plot_queries_results(WEAT_gender_results_agg).show()
+
+
+
+
+.. image:: ../images/measurement_user_guide/output_43_0.png
+
+
+It is also possible to ask the function to return only the aggregated
+results using the parameter ``return_only_aggregation``
+
+
+.. code:: ipython3
+
+ WEAT_gender_results_only_agg = run_queries(
+ WEAT,
+ gender_queries,
+ models,
+ metric_params={"preprocessors": [{"lowercase": True}]},
+ aggregate_results=True,
+ aggregation_function="abs_avg",
+ return_only_aggregation=True,
+ queries_set_name="Gender Queries",
+ )
+ WEAT_gender_results_only_agg
+
+
+
+
+
+.. raw:: html
+
+
+
+
+
+
+
+
WEAT: Gender Queries average of abs values score
+
+
+
model_name
+
+
+
+
+
+
glove twitter dim=25
+
0.172642
+
+
+
glove twitter dim=50
+
0.252007
+
+
+
glove twitter dim=100
+
0.213591
+
+
+
+
+
+
+
+.. code:: ipython3
+
+ fig = plot_queries_results(WEAT_gender_results_only_agg)
+ fig.show()
+
+
+
+
+.. image:: ../images/measurement_user_guide/output_46_0.png
+
+
+Model Ranking
+-------------
+
+It may be desirable to obtain an overall view of the bias by model using
+different metrics or bias criteria. While the aggregate values can be
+compared directly, two problems are likely to be encountered:
+
+1. One type of bias criterion can dominate the other because of
+ significant differences in magnitude.
+
+2. Different metrics can operate on different scales, which makes them
+ difficult to compare.
+
+To show these problems, suppose we have:
+
+- Two sets of queries: one that explores gender biases and
+ another that explores ethnicity biases.
+- Three ``Glove`` models of 25, 50 and 100 dimensions trained on the same
+ twitter dataset.
+
+Then we run :func:`~wefe.utils.run_queries` on this set of model-queries using
+:class:`~wefe.metrics.WEAT.WEAT`, and to corroborate the results obtained, we also use
+Relative Negative Sentiment Bias (:class:`~wefe.metrics.RNSB.RNSB`).
+
+1. The first problem occurs when the bias scores obtained from one set
+ of queries are much higher than those from the other set, even when
+ the same metric is used.
+
+When executing :func:`~wefe.utils.run_queries` with the gender and ethnicity queries on
+the models described above, the results obtained are as follows:
+
+
++--------------+---------------------------+---------------------------+
+| model_name | WEAT: Gender Queries | WEAT: Ethnicity Queries |
+| | average of abs values | average of abs values |
+| | score | score |
++==============+===========================+===========================+
+| glove | 0.210556 | 2.64632 |
+| twitter | | |
+| dim=25 | | |
++--------------+---------------------------+---------------------------+
+| glove | 0.292373 | 1.87431 |
+| twitter | | |
+| dim=50 | | |
++--------------+---------------------------+---------------------------+
+| glove | 0.225116 | 1.78469 |
+| twitter | | |
+| dim=100 | | |
++--------------+---------------------------+---------------------------+
+
+As can be seen, the results of ethnicity bias are much greater than
+those of gender.
+
+2. The second problem is when different metrics return results on
+ different scales of magnitude.
+
+When executing :func:`~wefe.utils.run_queries` with the gender queries and models
+described above using both WEAT and RNSB, the results obtained are as
+follows:
+
++--------------+---------------------------+---------------------------+
+| model_name | WEAT: Gender Queries | RNSB: Gender Queries |
+| | average of abs values | average of abs values |
+| | score | score |
++==============+===========================+===========================+
+| glove | 0.210556 | 0.032673 |
+| twitter | | |
+| dim=25 | | |
++--------------+---------------------------+---------------------------+
+| glove | 0.292373 | 0.049429 |
+| twitter | | |
+| dim=50 | | |
++--------------+---------------------------+---------------------------+
+| glove | 0.225116 | 0.0312772 |
+| twitter | | |
+| dim=100 | | |
++--------------+---------------------------+---------------------------+
+
+
+We can see differences between the results of both metrics of an order
+of magnitude.
+
+One solution to this problem is to create **rankings**. Rankings focus on the relative
+differences reported by the metrics (for different models) instead of focusing on the
+absolute values.
+
+The following guide show how to create rankings that evaluate
+gender bias and ethnicity.
+
+
+Gender Bias Model Ranking
+~~~~~~~~~~~~~~~~~~~~~~~~~
+
+.. code:: ipython3
+
+ # define the queries
+ gender_query_1 = Query(
+ [word_sets["male_terms"], word_sets["female_terms"]],
+ [word_sets["career"], word_sets["family"]],
+ ["Male terms", "Female terms"],
+ ["Career", "Family"],
+ )
+ gender_query_2 = Query(
+ [word_sets["male_terms"], word_sets["female_terms"]],
+ [word_sets["science"], word_sets["arts"]],
+ ["Male terms", "Female terms"],
+ ["Science", "Arts"],
+ )
+ gender_query_3 = Query(
+ [word_sets["male_terms"], word_sets["female_terms"]],
+ [word_sets["math"], word_sets["arts_2"]],
+ ["Male terms", "Female terms"],
+ ["Math", "Arts"],
+ )
+
+ gender_queries = [gender_query_1, gender_query_2, gender_query_3]
+
+ # run the queries using WEAT
+ WEAT_gender_results = run_queries(
+ WEAT,
+ gender_queries,
+ models,
+ metric_params={"preprocessors": [{"lowercase": True}]},
+ aggregate_results=True,
+ return_only_aggregation=True,
+ queries_set_name="Gender Queries",
+ )
+
+ # run the queries using WEAT effect size
+ WEAT_EZ_gender_results = run_queries(
+ WEAT,
+ gender_queries,
+ models,
+ metric_params={"preprocessors": [{"lowercase": True}], "return_effect_size": True,},
+ aggregate_results=True,
+ return_only_aggregation=True,
+ queries_set_name="Gender Queries",
+ )
+
+ # run the queries using RNSB
+ RNSB_gender_results = run_queries(
+ RNSB,
+ gender_queries,
+ models,
+ metric_params={"preprocessors": [{"lowercase": True}]},
+ aggregate_results=True,
+ return_only_aggregation=True,
+ queries_set_name="Gender Queries",
+ )
+
+The rankings can be calculated by means of the :func:`~wefe.utils.create_ranking`
+function. This function receives as input results from running
+:func:`~wefe.utils.run_queries` and assumes that the last column contains the aggregated
+values.
+
+.. code:: ipython3
+
+ from wefe.utils import create_ranking
+
+ # create the ranking
+ gender_ranking = create_ranking(
+ [WEAT_gender_results, WEAT_EZ_gender_results, RNSB_gender_results]
+ )
+
+ gender_ranking
+
+
+
+
+.. raw:: html
+
+
+
+
+
+
+
+
WEAT: Gender Queries average of abs values score (1)
+
WEAT: Gender Queries average of abs values score (2)
WEAT: Ethnicity Queries average of abs values score
+
WEAT: Gender Queries average of abs values score
+
RNSB: Ethnicity Queries average of abs values score
+
+
+
model_name
+
+
+
+
+
+
+
+
glove twitter dim=25
+
3.0
+
1.0
+
3.0
+
+
+
glove twitter dim=50
+
2.0
+
2.0
+
2.0
+
+
+
glove twitter dim=100
+
1.0
+
3.0
+
1.0
+
+
+
+
+
+
+
+Plotting the rankings
+~~~~~~~~~~~~~~~~~~~~~
+
+It is possible to graph the rankings in barplots using the
+:func:`~wefe.utils.plot_ranking` function. The generated figure shows the accumulated
+rankings for each embedding model. Each bar represents the sum of the
+rankings obtained by each embedding. Each color within a bar represents
+a different criterion-metric ranking.
+
+.. code:: ipython3
+
+ from wefe.utils import plot_ranking
+
+ fig = plot_ranking(gender_ranking)
+ fig.show()
+
+
+
+.. image:: ../images/measurement_user_guide/output_60_0.png
+
+
+.. code:: ipython3
+
+ fig = plot_ranking(ethnicity_ranking)
+ fig.show()
+
+
+
+.. image:: ../images/measurement_user_guide/output_61_0.png
+
+
+Correlating Rankings
+~~~~~~~~~~~~~~~~~~~~
+
+Having obtained rankings by metric for each embeddings, it would be
+ideal to see and analyze the degree of agreement between them.
+
+A high concordance between the rankings allows us to state with some certainty that
+all metrics evaluated the embedding models in a similar way and therefore,
+that the ordering of embeddings by bias calculated makes sense.
+On the other hand, a low degree of agreement shows the opposite: the rankings do not
+allow to clearly establish which embedding is less biased than another.
+
+The level of concordance of the rankings can be evaluated by calculating
+correlations.WEFE provides :func:`~wefe.utils.calculate_ranking_correlations` to
+calculate the correlations between rankings.
+
+.. code:: ipython3
+
+ from wefe.utils import calculate_ranking_correlations, plot_ranking_correlations
+
+ correlations = calculate_ranking_correlations(gender_ranking)
+ correlations
+
+
+
+
+
+.. raw:: html
+
+
+
+
+
+
+
+
WEAT: Gender Queries average of abs values score (1)
+
WEAT: Gender Queries average of abs values score (2)
+
RNSB: Gender Queries average of abs values score
+
+
+
+
+
WEAT: Gender Queries average of abs values score (1)
+
1.0
+
0.5
+
-1.0
+
+
+
WEAT: Gender Queries average of abs values score (2)
+
0.5
+
1.0
+
-0.5
+
+
+
RNSB: Gender Queries average of abs values score
+
-1.0
+
-0.5
+
1.0
+
+
+
+
+
+
+
+.. note::
+
+ ``calculate_ranking_correlations`` uses the ``corr()`` ``pandas``
+ dataframe method. The type of correlation that is calculated can be changed
+ through the method parameter. The available options are:
+ ``'pearson'``, ``'spearman'``, ``'kendall'``. By default, the spearman
+ correlation is calculated.
+
+In this example, Kendall’s correlation is used.
+
+.. code:: ipython3
+
+ calculate_ranking_correlations(gender_ranking, method="kendall")
+
+
+
+
+
+.. raw:: html
+
+
+
+
+
+
+
+
WEAT: Gender Queries average of abs values score (1)
+
WEAT: Gender Queries average of abs values score (2)
+
RNSB: Gender Queries average of abs values score
+
+
+
+
+
WEAT: Gender Queries average of abs values score (1)
+
1.000000
+
0.333333
+
-1.000000
+
+
+
WEAT: Gender Queries average of abs values score (2)
+
0.333333
+
1.000000
+
-0.333333
+
+
+
RNSB: Gender Queries average of abs values score
+
-1.000000
+
-0.333333
+
1.000000
+
+
+
+
+
+
+
+WEFE also provides a function for graphing the correlations:
+
+
+.. code:: ipython3
+
+ correlation_fig = plot_ranking_correlations(correlations)
+ correlation_fig.show()
+
+
+
+
+.. image:: ../images/measurement_user_guide/output_67_0.png
+
+
+In this case, only two of the three rankings show similar results.
+
diff --git a/docs/user_guide/mitigation_user_guide.rst b/docs/user_guide/mitigation_user_guide.rst
new file mode 100644
index 0000000..7d3e752
--- /dev/null
+++ b/docs/user_guide/mitigation_user_guide.rst
@@ -0,0 +1,602 @@
+.. _bias mitigation:
+
+Bias Mitigation (Debias)
+========================
+
+The following guide is designed to present the more general details on
+using the package to mitigate (debias) bias in word embedding models.
+The following sections show:
+
+- run :class:`~wefe.debias.hard_debias.HardDebias` mitigation method on an
+ embedding model to mitigate gender bias (using the ``fit-transform`` interface).
+- apply the ``target`` parameter when executing the transformation.
+- apply the ``ignore`` parameter when executing the transformation.
+- apply the ``copy`` parameter when executing the transformation.
+- run :class:`~wefe.debias.multiclass_hard_debias.MulticlassHardDebias` mitigation
+ method on an word embedding model to mitigate ethnic bias.
+
+.. note::
+
+ For a list of metrics implemented in WEFE, refer to the
+ :ref:`debias-API` of the API reference.
+
+.. note::
+
+ If you want to know more about WEFE's standardization of debias methods,
+ visit :ref:`mitigation framework` in the conceptual guides.
+
+
+Hard Debias
+-----------
+
+
+Hard debias is a method that allows mitigating biases through geometric operations
+on embeddings.
+This method is binary because it only allows 2 classes of the same bias criterion,
+such as male or female.
+
+.. note::
+
+ For a multiclass debias (such as for Latinos, Asians and Whites), it is
+ recommended to visit
+ :class:`~wefe.debias.multiclass_hard_debias.MulticlassHardDebias` class.
+
+
+The main idea of this method is:
+
+1. Identify a bias subspace through the defining sets. In the case of gender,
+these could be e.g. ``[['woman', 'man'], ['she', 'he'], ...]``
+
+2. Neutralize the bias subspace of embeddings that should not be biased.
+
+First, we define a set of words that are correct to be related to the bias
+criterion: the *criterion specific gender words*.
+For example, in the case of gender, *gender specific* words are:
+``['he', 'his', 'He', 'her', 'she', 'him', 'him', 'She', 'man', 'women', 'men'...]``.
+
+We then define that all words outside this set should have no relation to the
+bias criterion and thus have the possibility of being biased. (e.g. for the case of
+genthe bias direction, such that neither is closer to the bias direction
+than the other: ``['doctor', 'nurse', ...]``). Therefore, this set of words is
+neutralized with respect to the bias subspace found in the previous step.
+
+The neutralization is carried out under the following operation:
+
+- :math:`u` : embedding
+- :math:`v`: bias direction
+
+First calculate the projection of the embedding on the bias subspace.
+
+.. math::
+
+ \text{bias subspace} = \frac{v \cdot (v \cdot u)}{(v \cdot v)}
+
+Then subtract the projection from the embedding.
+
+.. math::
+
+ u' = u - \text{bias subspace}
+
+3. Equalizate the embeddings with respect to the bias direction.
+
+Given an equalization set (set of word pairs such as ``['she', 'he'],
+['men', 'women'], ...``, but not limited to the definitional set) this step
+executes, for each pair, an equalization with respect to the bias direction.
+That is, it takes both embeddings of the pair and distributes them at the same
+distance from the bias direction, so that neither is closer to the bias direction
+than the other.
+
+
+The fit parameters define how the neutralization will be calculated. In
+Hard Debias, you have to provide the the ``definitional_pairs``, the
+``equalize_pairs`` (which could be the same of definitional pairs) and
+optionally, a debias ``criterion_name`` (to name the debiased model).
+
+
+The code shown below shows how to run Hard Debias from gender to the test model
+provided by wefe (reduced word2vec).
+
+.. code:: ipython3
+
+ from wefe.utils import load_test_model
+
+ model = load_test_model() # load a reduced version of word2vec
+ model
+
+
+
+
+.. parsed-literal::
+
+
+
+
+
+Load the required word sets.
+
+.. code:: ipython3
+
+ from wefe.datasets import fetch_debiaswe
+ from wefe.debias.hard_debias import HardDebias
+
+ debiaswe_wordsets = fetch_debiaswe()
+
+ definitional_pairs = debiaswe_wordsets["definitional_pairs"]
+ equalize_pairs = debiaswe_wordsets["equalize_pairs"]
+ gender_specific = debiaswe_wordsets["gender_specific"]
+
+
+ print(f"definitional_pairs: \n{definitional_pairs}")
+ print(f"equalize_pairs: \n{equalize_pairs}")
+ print(f"gender_specific: \n{gender_specific}")
+ print("-" * 70, "\n")
+
+
+.. parsed-literal::
+
+ definitional_pairs:
+ [['woman', 'man'], ['girl', 'boy'], ['she', 'he'], ['mother', 'father'], ['daughter', 'son'], ['gal', 'guy'], ['female', 'male'], ['her', 'his'], ['herself', 'himself'], ['Mary', 'John']]
+ equalize_pairs:
+ [['monastery', 'convent'], ['spokesman', 'spokeswoman'], ['Catholic_priest', 'nun'], ['Dad', 'Mom'], ['Men', 'Women'], ['councilman', 'councilwoman'], ['grandpa', 'grandma'], ['grandsons', 'granddaughters'], ['prostate_cancer', 'ovarian_cancer'], ['testosterone', 'estrogen'], ['uncle', 'aunt'], ['wives', 'husbands'], ['Father', 'Mother'], ['Grandpa', 'Grandma'], ['He', 'She'], ['boy', 'girl'], ['boys', 'girls'], ['brother', 'sister'], ['brothers', 'sisters'], ['businessman', 'businesswoman'], ['chairman', 'chairwoman'], ['colt', 'filly'], ['congressman', 'congresswoman'], ['dad', 'mom'], ['dads', 'moms'], ['dudes', 'gals'], ['ex_girlfriend', 'ex_boyfriend'], ['father', 'mother'], ['fatherhood', 'motherhood'], ['fathers', 'mothers'], ['fella', 'granny'], ['fraternity', 'sorority'], ['gelding', 'mare'], ['gentleman', 'lady'], ['gentlemen', 'ladies'], ['grandfather', 'grandmother'], ['grandson', 'granddaughter'], ['he', 'she'], ['himself', 'herself'], ['his', 'her'], ['king', 'queen'], ['kings', 'queens'], ['male', 'female'], ['males', 'females'], ['man', 'woman'], ['men', 'women'], ['nephew', 'niece'], ['prince', 'princess'], ['schoolboy', 'schoolgirl'], ['son', 'daughter'], ['sons', 'daughters'], ['twin_brother', 'twin_sister']]
+ gender_specific:
+ ['he', 'his', 'He', 'her', 'she', 'him', 'She', 'man', 'women', 'men', 'His', 'woman', 'spokesman', 'wife', 'himself', 'son', 'mother', 'father', 'chairman', 'daughter', 'husband', 'guy', 'girls', 'girl', 'Her', 'boy', 'King', 'boys', 'brother', 'Chairman', 'spokeswoman', 'female', 'sister', 'Women', 'Man', 'male', 'herself', 'Lions', 'Lady', 'brothers', 'dad', 'actress', 'mom', 'sons', 'girlfriend', 'Kings', 'Men', 'daughters', 'Prince', 'Queen', 'teenager', 'lady', 'Bulls', 'boyfriend', 'sisters', 'Colts', 'mothers', 'Sir', 'king', 'businessman', 'Boys', 'grandmother', 'grandfather', 'deer', 'cousin', 'Woman', 'ladies', 'Girls', 'Father', 'uncle', 'PA', 'Boy', 'Councilman', 'mum', 'Brothers', 'MA', 'males', 'Girl', 'Mom', 'Guy', 'Queens', 'congressman', 'Dad', 'Mother', 'grandson', 'twins', 'bull', 'queen', 'businessmen', 'wives', 'widow', 'nephew', 'bride', 'females', 'aunt', 'Congressman', 'prostate_cancer', 'lesbian', 'chairwoman', 'fathers', 'Son', 'moms', 'Ladies', 'maiden', 'granddaughter', 'younger_brother', 'Princess', 'Guys', 'lads', 'Ma', 'Sons', 'lion', 'Bachelor', 'gentleman', 'fraternity', 'bachelor', 'niece', 'Lion', 'Sister', 'bulls', 'husbands', 'prince', 'colt', 'salesman', 'Bull', 'Sisters', 'hers', 'dude', 'Spokesman', 'beard', 'filly', 'Actress', 'Him', 'princess', 'Brother', 'lesbians', 'councilman', 'actresses', 'Viagra', 'gentlemen', 'stepfather', 'Deer', 'monks', 'Beard', 'Uncle', 'ex_girlfriend', 'lad', 'sperm', 'Daddy', 'testosterone', 'MAN', 'Female', 'nephews', 'maid', 'daddy', 'mare', 'fiance', 'Wife', 'fiancee', 'kings', 'dads', 'waitress', 'Male', 'maternal', 'heroine', 'feminist', 'Mama', 'nieces', 'girlfriends', 'Councilwoman', 'sir', 'stud', 'Mothers', 'mistress', 'lions', 'estranged_wife', 'womb', 'Brotherhood', 'Statesman', 'grandma', 'maternity', 'estrogen', 'ex_boyfriend', 'widows', 'gelding', 'diva', 'teenage_girls', 'nuns', 'Daughter', 'czar', 'ovarian_cancer', 'HE', 'Monk', 'countrymen', 'Grandma', 'teenage_girl', 'penis', 'bloke', 'nun', 'Husband', 'brides', 'housewife', 'spokesmen', 'suitors', 'menopause', 'monastery', 'patriarch', 'Beau', 'motherhood', 'brethren', 'stepmother', 'Dude', 'prostate', 'Moms', 'hostess', 'twin_brother', 'Colt', 'schoolboy', 'eldest', 'brotherhood', 'Godfather', 'fillies', 'stepson', 'congresswoman', 'Chairwoman', 'Daughters', 'uncles', 'witch', 'Mommy', 'monk', 'viagra', 'paternity', 'suitor', 'chick', 'Pa', 'fiancé', 'sorority', 'macho', 'Spokeswoman', 'businesswoman', 'eldest_son', 'gal', 'statesman', 'schoolgirl', 'fathered', 'goddess', 'hubby', 'mares', 'stepdaughter', 'blokes', 'dudes', 'socialite', 'strongman', 'Witch', 'fiancée', 'uterus', 'grandsons', 'Bride', 'studs', 'mama', 'Aunt', 'godfather', 'hens', 'hen', 'mommy', 'Babe', 'estranged_husband', 'Fathers', 'elder_brother', 'boyhood', 'baritone', 'Diva', 'Lesbian', 'grandmothers', 'grandpa', 'boyfriends', 'feminism', 'countryman', 'stallion', 'heiress', 'queens', 'Grandpa', 'witches', 'aunts', 'semen', 'fella', 'granddaughters', 'chap', 'knight', 'widower', 'Maiden', 'salesmen', 'convent', 'KING', 'vagina', 'beau', 'babe', 'HIS', 'beards', 'handyman', 'twin_sister', 'maids', 'gals', 'housewives', 'Gentlemen', 'horsemen', 'Businessman', 'obstetrics', 'fatherhood', 'beauty_queen', 'councilwoman', 'princes', 'matriarch', 'colts', 'manly', 'ma', 'fraternities', 'Spokesmen', 'pa', 'fellas', 'Gentleman', 'councilmen', 'dowry', 'barbershop', 'Monks', 'WOMAN', 'fraternal', 'ballerina', 'manhood', 'Dads', 'heroines', 'granny', 'gynecologist', 'princesses', 'Goddess', 'yo', 'Granny', 'knights', 'eldest_daughter', 'HER', 'underage_girls', 'masculinity', 'Girlfriend', 'bro', 'Grandmother', 'grandfathers', 'crown_prince', 'Restless', 'paternal', 'Queen_Mother', 'Boyfriend', 'womens', 'Males', 'SHE', 'Countess', 'stepchildren', 'Belles', 'bachelors', 'matron', 'momma', 'Legs', 'maidens', 'goddesses', 'landlady', 'sisterhood', 'Grandfather', 'Fraternity', 'Majesty', 'Babes', 'lass', 'maternal_grandmother', 'blondes', "ma'am", 'Womens', 'divorcee', 'Momma', 'fathering', 'Effie', 'Lad', 'womanhood', 'missus', 'Sisterhood', 'granddad', 'Mens', 'papa', 'gf', 'sis', 'Husbands', 'Hen', 'womanizer', 'gynecological', 'stepsister', 'Handsome', 'Prince_Charming', 'BOY', 'stepdad', 'teen_ager', 'GIRL', 'dame', 'Sorority', 'beauty_pageants', 'raspy', 'harem', 'maternal_grandfather', 'Hes', 'deliveryman', 'septuagenarian', 'damsel', 'paternal_grandmother', 'paramour', 'paternal_grandparents', 'Nun', 'DAD', 'mothering', 'shes', "HE_'S", 'Nuns', 'teenage_daughters', 'auntie', 'widowed_mother', 'Girlfriends', 'FATHER', 'virile', 'COUPLE', 'grandmas', 'Hubby', 'nan', 'vixen', 'Joan_Crawford', 'stepdaughters', 'endometrial_cancer', 'stepsons', 'loins', 'Grandson', 'Mitchells', 'erections', 'Matron', 'Fella', 'daddies', 'ter', 'Sweetie', 'Dudes', 'Princesses', 'Lads', 'lioness', 'Mamma', 'virility', 'bros', 'womenfolk', 'Heir', 'BROTHERS', 'manliness', 'patriarchs', 'earl', 'sisterly', 'Whore', 'Gynaecology', 'countess', 'convents', 'Oratory', 'witch_doctor', 'mamas', 'yah', 'aunty', 'aunties', 'Heiress', 'lasses', 'Breasts', 'fairer_sex', 'sorority_sisters', 'WIFE', 'Laurels', 'penile', 'nuh', 'mah', 'toms', 'mam', 'Granddad', 'premenopausal_women', 'Granddaddy', 'nana', 'coeds', 'dames', 'herdsman', 'Mammy', 'Fellas', 'Niece', 'menfolk', 'Grandad', 'bloods', 'Gramps', 'damsels', 'Granddaughter', 'mamma', 'concubine', 'Oros', 'Blarney', 'filial', 'broads', 'Ethel_Kennedy', 'ACTRESS', 'Tit', 'fianc', 'Hunk', 'Night_Shift', 'wifey', 'Lothario', 'Holy_Roman_Emperor', 'horse_breeder', 'grandnephew', 'Lewises', 'Muscular', 'feminist_movement', 'Sanan', 'womenâ_€_™', 'Fiancee', 'dowries', 'Carmelite', 'rah', 'n_roller', 'bay_filly', 'belles', 'Uncles', 'PRINCESS', 'womans', 'Homeboy', 'Blokes', 'Charmer', 'codger', 'Delta_Zeta', 'courtesans', 'grandaughter', 'SISTER', 'Highness', 'grandbabies', 'crone', 'Skip_Away', 'noblewoman', 'bf', 'jane', 'philandering_husband', 'Sisqo', 'mammy', 'daugher', 'director_Skip_Bertman', 'DAUGHTER', 'Royal_Highness', 'mannish', 'spinsters', 'Missus', 'madame', 'Godfathers', 'saleswomen', 'beaus', 'Risha', 'luh', 'sah', 'negligee', 'Womenâ_€_™', 'Hos', 'salesgirl', 'grandmom', 'Grandmas', 'Lawsons', 'countrywomen', 'Booby', 'darlin', 'Sheiks', 'boyz', 'wifes', 'Bayi', 'Il_Duce', 'â_€_œMy', 'fem', 'daugther', 'Potti', 'hussy', 'tch', 'Gelding', 'stemmed_roses', 'Damson', 'puh', 'Tylers', 'neice', 'Mutha', 'GRANDMOTHER', 'youse', 'spurned_lover', 'mae', 'Britt_Ekland', 'clotheshorse', 'Carlita_Kilpatrick', 'Cambest', 'Pretty_Polly', 'banshees', 'male_chauvinist', 'Arliss', 'mommas', 'maidservant', 'Gale_Harold', 'Little_Bo_Peep', 'Cleavers', 'hags', 'blowsy', 'Queen_Elizabeth_I.', 'lassies', 'papas', 'BABE', 'ugly_ducklings', 'Jims', 'hellion', 'Beautician', 'coalminer', 'relaxin', 'El_Mahroug', 'Victoria_Secret_Angel', 'shepherdess', 'Mosco', 'Slacks', 'nanna', 'wifely', 'tomboys', 'LAH', 'hast', 'apo', 'Kaplans', 'milkmaid', 'Robin_Munis', 'John_Barleycorn', 'royal_highness', 'Meanie', 'NAH', 'trollop', 'roh', 'Jewess', 'Sheik_Hamad', 'mumsy', 'Big_Pussy', 'chil_dren', 'Aunt_Bea', 'basso', 'sista', 'girlies', 'nun_Sister', 'chica', 'Bubbas', 'massa', 'Southern_belles', 'Nephews', 'castrations', 'Mister_Ed', 'Grandsons', 'Calaf', 'Malachy_McCourt', 'Shamash', 'hey_hey', 'Harmen', 'sonofabitch', 'Donovans', 'Grannie', 'Kalinka', 'hisself', 'Devean', 'goatherd', 'hinds', 'El_Corredor', 'Kens', 'notorious_womanizer', 'goh', 'Mommas', 'washerwoman', 'Samaira', 'Coo_Coo', 'Governess', 'grandsire', 'PRINCE_WILLIAM', 'gramma', 'him.He', 'Coptic_priest', 'Corbie', 'Kennys', 'thathe', 'Pa_Pa', 'Bristols', 'Hotep', 'snowy_haired', 'El_Prado_Ire', 'Girl_hitmaker', 'Hurleys', 'St._Meinrad', 'sexually_perverted', 'authoress', 'Prudie', 'raven_haired_beauty', 'Bonos', 'domestic_shorthair', 'brothas', 'nymphet', 'Neelma', 'Seita', 'stud_muffin', 'St._Judes', 'yenta', 'bare_shouldered', 'Pinkney_Sr.', 'PRINCE_CHARLES', 'Bisutti', 'sistas', 'Blanche_Devereaux', 'Momoa', 'Quiff', 'Scotswoman', 'balaclava_clad_men', 'Louis_Leakey', 'dearie', 'vacuum_cleaner_salesman', 'grandads', 'postulant', 'SARAH_JESSICA_PARKER', 'AUNT', 'Prince_Dauntless', 'Dalys', 'Darkie', 'Czar_Nicholas', 'Lion_Hearted', 'Boy_recliner', 'baby_mamas', 'giantess', 'Lawd', 'GRANNY', 'fianc_e', 'Bilqis', 'WCTU', 'famly', 'Ellas', 'feminazis', 'Pentheus', 'MAMAS', 'Town_Criers', 'Saggy', 'youngman', 'grandam', 'divorcé', 'bosomed', 'roon', 'Simmentals', 'eponymous_heroine', 'LEYLAND', "REE'", "cain't", 'Evelynn', "WAH'", 'sistah', 'Horners', 'Elsie_Poncher', 'Coochie', 'rat_terriers', 'Limousins', 'Buchinski', 'Schicchi', 'Carpitcher', 'Khwezi', "HAH'", 'Shazza', 'Mackeson', "ROH'", 'kuya', 'novice_nun', 'Shei', 'Elmasri', 'ladykiller', '6yo', 'Yenta', 'SHEL', 'pater', 'Souse', 'Tahirah', 'comedian_Rodney_Dangerfield', 'Shottle', 'carryin', 'Sath', "fa'afafine", 'royal_consort', 'hus_band', 'maternal_uncles', 'dressing_provocatively', 'dreamgirl', 'millionaire_industrialist', 'Georgie_Girl', 'Must_Be_Obeyed', 'joh', 'Arabian_stallion', 'ahr', 'mso_para_margin_0in', "SOO'", 'Biddles', 'Chincoteague_Volunteer_Fire', 'Lisa_Miceli', 'gorgeous_brunette', 'fiancŽ', 'Moved_fluently', 'Afternoon_Deelites', 'biker_dude', 'Vito_Spatafore', 'MICK_JAGGER', 'Adesida', 'Reineman', 'witz', 'Djamila', 'Glenroe', 'daddys', 'Romanzi', 'gentlewomen', 'Dandie_Dinmont_terrier', 'Excess_Ire', 'By_SYVJ_Staff', 'zan', 'CONFESSIONS', 'Magees', 'wimmin', 'tash', 'Theatrical_Ire', 'Prince_Charmings', 'chocolate_eclair', 'bron', 'daughers', 'Felly', 'fiftyish', 'Spritely', 'GRANDPA', 'distaffer', 'Norbertines', "DAH'", 'leader_Muammar_Gadaffi', 'swains', 'Prince_Tomohito', 'Honneur', 'Soeur', 'jouster', 'Pharaoh_Amenhotep_III', 'QUEEN_ELIZABETH_II', "Ne'er", 'Galileo_Ire', 'Fools_Crow', 'Lannisters', 'Devines', 'gonzales', 'columnist_Ann_Landers', 'Moseleys', 'hiz', 'busch', 'roastee', 'toyboys', 'Sheffields', 'grandaunt', 'Galvins', 'Giongo', 'geh', 'flame_haired_actress', 'Grammarian', 'Greg_Evigan', 'frontierswoman', 'Debele', 'rabs', 'nymphets', 'aai', 'BREE', 'Shaqs', 'ZAY', 'pappa', 'Housa', 'refrigerator_repairman', 'artificial_inseminations', 'chickie', 'Rippa', 'teenager_Tracy_Turnblad', 'homebred_colt', 'Abigaille', 'hen_pecked_husband', 'businesman', 'her.She', 'Kaikeyi', 'Stittsworth', 'self_proclaimed_redneck', 'Khella', 'NeW', 'Evers_Swindell', 'Asmerom_Gebreselassie', 'Boy_recliners', 'Cliff_Claven', 'Legge_Bourke', 'Costos', "d'_honneur", 'sistahs', 'Cabble', 'sahn', 'CROW_AGENCY_Mont', 'jezebel', 'Harrolds', 'ROSARIO_DAWSON', 'INXS_frontman_Michael_Hutchence', 'Gursikh', 'Dadas', 'VIAGA', 'keen_horsewoman', 'Theodoric', 'Eldery', 'lihn', 'Alice_Kramden', 'Santarina', 'radical_cleric_al_Sadr', 'Curleys', "SY'", 'Fidaa', 'Saptapadi', 'Actor_Sean_Astin', 'Kellita_Smith', 'Doly', 'Libertina', 'Money_McBags', 'Chief_Bearhart', 'choirgirl', 'chestnut_stallion', 'VIGRA', 'BY_JIM_McCONNELL', 'Sal_Vitale', 'Trivia_buffs', 'kumaris', 'fraternal_lodge', 'galpals', 'Borino_Quinn', 'lina', 'LATEST_Rapper', 'Bezar', 'Manro', 'bakla', 'Grisetti', 'blond_bimbo', 'spinster_aunt', 'gurls', 'hiswife', 'paleface', 'Charlye', 'hippie_chicks', 'Khalifas', 'Picture_JUSTIN_SANSON', 'Hepburns', 'yez', 'ALDER', 'Sanussi', 'Lil_Sis', 'McLoughlins', 'Barbra_Jean', 'Lulua', 'thatshe', 'actress_Shohreh_Aghdashloo', 'SIR_ANTHONY_HOPKINS', 'Gloddy', "ZAH'", "ORANGE_'S", 'Danielle_Bimber', 'grandmum', 'Kulkis', 'Brazington', 'Marisa_Lenhard_CFA', 'SIR_JOHN', 'Clareman', 'Aqila', 'Heavily_tattooed', 'Libbys', 'thim', 'elocutionist', 'submissives', 'Inja', 'rahm', 'Agnes_Gooch', 'fake_tits', 'nancy_boys', 'Swaidan', "SHAH'", "ain'ta_bed", 'Shumail_Raj', 'Duchesse', 'diethylstilbestrol_DES', 'colt_foal', 'unfaithful_lover', 'Maseri', 'nevah', 'SAHN', 'Barths', 'Toughkenamon', 'GUEST_STARS', 'him.But', 'Donna_Claspell', 'gingham_dresses', 'Massage_Parlour', 'wae', 'Wasacz', 'Magistra', 'vihl', 'Smriti_Iraani', 'boyish_haircut', 'workingwoman', 'borthers', 'Capuchin_friars', 'Nejma', 'yes_sirs', 'bivocational_pastor', 'Grafters', 'HOPWOOD', 'Nicknamed_Godzilla', 'yos', 'Berkenfield', 'Missis', 'sitcom_Designing_Women', 'Kafoa', 'trainer_Emma_Lavelle', 'sadomasochistic_dungeon', 'iht', 'desperates', 'predessor', 'wolf_cub', 'indigenous_Peruvians', 'Livia_Soprano', 'troh', 'colt_sired', 'BOND_HILL', 'ihl', 'Drydens', 'rahs', 'Piserchia', 'Sonny_Corinthos', 'bankrobber', 'Fwank', 'feisty_redhead', 'booze_guzzling', 'COOPERS', "actress_Q'orianka_Kilcher", 'Cortezar', 'twe', 'Jacoub', 'Cindy_Iannarelli', 'Hell_Raiser', 'Fondly_referred', 'Bridal_Shoppe', 'Noleta', 'Christinas', 'IAGRA', 'LaTanya_Richardson', 'Sang_Bender', 'Assasins', 'sorrel_gelding', 'septugenarian', 'Hissy', 'Muqtada_al_Sadr_mook', 'Pfeni', 'MADRID_AFX_Banco_Santander', 'tuchis', 'LeVaughn', 'Gadzicki', 'transvestite_hooker', 'Fame_jockey_Laffit', 'nun_Sister_Mary', 'SAMSONOV', 'Mayflower_Madam', 'Shaque', 'well.He', 'Trainer_Julio_Canani', 'sorrel_mare', 'minivehicle_joint_venture', 'wife_Dwina', "Aasiya_AH'_see", 'Baratheon', "Rick_O'Shay", 'Mammies', 'goatie', 'Nell_Gwynne', 'charmingly_awkward', 'Slamma', 'DEHL', 'Lorenzo_Borghese', 'ALMA_Wis.', 'Anne_Scurria', 'father_Peruvians_alternately', 'JULIE_ANDREWS', 'Slim_Pickins', 'Victoria_Secret_stunner', "BY'", 'Sanam_Devdas', 'pronounced_luh', 'Pasha_Selim', '中华', 'rson', 'maternal_grandmothers', 'IOWA_CITY_Ia', 'Madame_de_Tourvel', "JAY'", 'Sheika_Mozah_bint_Nasser', 'Hotsy_Totsy', "D'_Ginto", 'singer_Johnny_Paycheck', 'uterine_prolapse_surgery', 'SCOTTDALE_Pa.', 'AdelaideNow_reports', 'Marcus_Schenkenberg', 'Clyse', 'Obiter_Dicta', 'comic_Sam_Kinison', 'bitties', 'ROCKVILLE_Ind.', 'swimsuit_calendars', 'Decicio_Smith', 'Ma_ma', 'Rie_Miyazawa', 'celibate_chastity', 'gwah', "ZAY'", 'HER_Majesty', 'Defrere', 'Las_Madrinas', '簿_聂_翻', 'Bea_Hamill', 'ARCADIA_Calif._Trainer', 'Bold_Badgett', 'stakes_victress', 'Hoppin_Frog', 'Narumiya', 'Flayfil', 'hardman_Vinnie_Jones', 'Marilyn_Monroe_lookalike', 'Kivanc_Tatlitug', 'Persis_Khambatta', 'SINKING_SPRING_Pa.', 'len_3rd', 'DEAR_TRYING', 'Farndon_Cheshire', 'Krishna_Madiga', 'daughter_Princess_Chulabhorn', 'Marshall_Rooster_Cogburn', 'Kitty_Kiernan', 'Yokich', 'Jarou', 'Serdaris', 'ee_ay', 'Montifiore', 'Chuderewicz', 'Samuel_Le_Bihan', 'filly_Proud_Spell', 'Umm_Hiba', 'pronounced_koo', 'Sandy_Fonzo', "KOR'", 'Fielder_Civil_kisses', 'Federalsburg_Maryland', 'Nikah_ceremony', 'Brinke_Stevens', 'Yakama_Tribal_Council', 'Capuchin_Father', 'wife_Callista_Bisek', 'Beau_Dare', 'Bedoni', 'Arjun_Punj', 'JOHNNY_KNOXVILLE', 'cap_tain', 'Alderwood_Boys', 'Chi_Eta_Phi', 'ringleader_Charles_Graner', 'Savoies', 'Lalla_Salma', 'Mrs._Potiphar', 'fahn', 'name_Taylor_Sumers', 'Vernita_Green', 'Bollywood_baddie', 'BENBROOK_Texas', 'Assemblyman_Lou_Papan', 'virgin_brides', 'Cho_Eun', 'CATHY_Freeman', 'Uncle_Saul', 'Lao_Brewery', 'Ibo_tribe', 'ruf', 'rival_Edurne_Pasaban', 'Hei_Shangri_La', 'Mommy_dearest', 'interest_Angola_Sonogal', 'Ger_Monsun', 'PUSSYCAT_DOLL', 'Crown_Jewels_Condoms', 'Lord_Marke', 'Patootie', 'Nora_Bey', 'huntin_shootin', 'Minister_Raymond_Tshibanda', 'La_Nina_la_NEEN', 'signature_Whoppers', 'estranged_hubby_Kevin_Federline', "UR'", 'pill_poppin', "GEHR'", 'purebred_Arabians', 'husbandly_duties', 'VIAGRA_TIMING', 'Hereford_heifer', 'hushed_monotone_voice', 'Pola_Uddin', 'Wee_Jimmy_Krankie', 'Kwakwanso', 'Our_Galvinator', 'shoh', 'Codependency_Anonymous_Group', "LA'", "Taufa'ahau", 'Invincible_Spirit_colt', "SAH'_dur", 'MOUNT_CARMEL_Pa.', 'watches_attentively', 'SNL_spinoffs', 'Seth_Nitschke', 'Duns_Berwickshire', 'defendant_Colleen_LaRose', "Silky_O'Sullivan", 'Highcliff_Farm', "REN'", 'Comestar', 'Satisfied_Frog', 'Jai_Maharashtra', 'ATTICA_Ind.', 'lover_Larry_Birkhead', 'Tami_Megal', 'chauvinist_pigs', 'Phi_sorority', 'Micronesian_immigrant', 'Lia_Boldt', 'Sugar_Tits', 'actress_Kathy_Najimy', 'zhoo', 'Colombo_underboss', 'Katsav_accusers', 'Bess_Houdini', 'rap_mogul_Diddy', 'companions_Khin_Khin', 'Van_Het', 'Mastoi_tribe', 'VITALY', 'ROLLING_STONES_rocker', 'womanizing_cad', 'LILY_COLE', 'paternal_grandfathers', 'Lt._Col._Kurt_Kosmatka', 'Kasseem_Jr.', 'Ji_Ji', 'Wilburforce', 'VIAGRA_DOSE', 'English_Sheepdogs', 'pronounced_Kah', 'Htet_Htet_Oo', 'Brisk_Breeze', 'Eau_du', 'BY_MELANIE_EVANS', 'Neovasc_Medical', 'British_funnyman_RICKY', '4YO_mare', 'Hemaida', 'MONKTON', 'Mrs_Mujuru', 'BaGhana_BaGhana', 'Shaaban_Abdel_Rahim', 'Edward_Jazlowiecki_lawyer', 'Ajman_Stud', 'manly_pharaoh_even', 'Serra_Madeira_Islands', "FRAY'", 'panto_dames', 'Khin_Myo', 'dancer_Karima_El_Mahroug', 'CROWN_Princess', 'Baseball_HOFer', 'Hasta_la_Pasta', 'GIRLS_NEXT_DOOR', 'Benedict_Groeschel', 'Bousamra', 'Ruby_Rubacuori_Ruby', 'Monde_Bleu', 'Un_homme_qui', 'Taylor_Sumers', 'Rapper_EMINEM', 'Joe_Menchetti', "VAY'", 'supermodel_NAOMI_CAMPBELL', 'Supermodel_GISELE_BUNDCHEN', 'Au_Lait', 'Radar_Installed', 'THOMAS_TOWNSHIP_Mich.', 'Rafinesque', 'Herman_Weinrich', 'Abraxas_Antelope', 'raspy_voiced_rocker', 'Manurewa_Cosmopolitan_Club', 'Paraone', 'THE_LEOPARD', 'Boy_Incorporated_LZB', 'Dansili_filly', 'Lumpy_Rutherford', 'unwedded_bliss', 'Bhavna_Sharma', 'Scarvagh', 'en_flagrante', 'Mottu_Maid', 'Dowager_Queen', 'NEEN', 'model_Monika_Zsibrita', 'ROSIE_PEREZ', 'Mattock_Ranger', 'Valorous', 'Surpreme', 'Marwari_businessmen', 'Grandparents_aunts', 'Kimberley_Vlaeminck', 'Lyn_Treece_Boys', 'PDX_Update', 'Virsa_Punjab', 'eyelash_fluttering', 'Pi_fraternity', 'HUNTLEIGH_Mo.', 'novelist_Jilly_Cooper', 'Naha_Shuri_temple', 'Yasmine_Al_Massri', 'Mu_Gamma_Xi', 'Mica_Ertegun', 'Ocleppo', 'VIAGRA_CONTRAINDICATIONS', 'daughter_PEACHES', 'trainer_Geoff_Wragg', 'OVERNIGHT_DELIVERY', 'Fitts_retiree', 'de_Tourvel', 'Lil_Lad', 'north_easterner', 'Aol_Weird_News', 'Somewhat_improbably', 'Sikh_panth', 'Worcester_2m_7f', 'Zainab_Jah', 'OLYMPIC_medalist', 'Enoch_Petrucelly', 'collie_Lassie', "LOW'", 'clumsiness_Holloway', 'ayr', "OHR'", 'ROLLING_STONES_guitarist', "LAH'_nee", 'Ian_Beefy_Botham', 'Awapuni_trainer', 'Glamorous_Granny', 'Chiang_Ching', 'MidAtlantic_Cardiovascular_Associates', 'Yeke', 'Seaforth_Huron_Expositor', 'Westley_Cary_Elwes', 'Cate_Blanchett_Veronica_Guerin', 'Bellas_Gate', 'witch_Glinda', 'wives_mistresses', 'Woodsville_Walmart', '2YO_colt', 'Manav_Sushant_Singh', 'Pupi_Avati_Il', 'Sigma_Beta_Rho', 'Bishop_Christopher_Senyonjo', 'Vodou_priest', 'Rubel_Chowdhury', 'Claddagh_Ring', "TAH'_duh_al", "al_Sadr_mook_TAH'", 'ROBIN_GIBB', "GAHN'", 'BY_THOMAS_RANSON', 'sister_Carine_Jena', 'Lyphard_mare', 'summa_cum', 'Semenya_grandmother_Maputhi', 'Clare_Nuns', 'Talac', 'sex_hormones_androgens', 'majeste', 'Saint_Ballado_mare', 'Carrie_Huchel', 'Mae_Dok', 'wife_Dieula', 'Earnest_Sirls', 'spoof_bar_mitzvah', 'von_Boetticher', 'Audwin_Mosby', 'Case_presentationWe', 'Vincent_Papandrea', "KRAY'", 'Sergi_Benavent', 'Le_Poisson', 'Von_Cramm', 'Patti_Mell', 'Raymi_Coya', 'Benjamin_BeBe_Winans', 'Nana_Akosua', 'Auld_Acquaintance', 'Desire_Burunga', 'Company_Wrangler_Nestea', 'ask_Krisy_Plourde', 'JUANITA_BYNUM', 'livia', 'GAMB', 'Gail_Rosario_Dawson', 'Ramgarhia_Sikh', 'Catholic_nun_Sister', 'FOUR_WEDDINGS_AND', 'Robyn_Scherer', 'brother_King_Athelstan', 'Santo_Loquasto_Fences', 'Wee_Frees', 'MARISOL', 'Soliloquy_Stakes', 'Whatever_Spoetzl', "Marc'Aurelio", 'mon_petit', 'Sabbar_al_Mashhadani', "KAY'_lee", "m_zah_MAH'", 'BY_TAMI_ALTHOFF', 'hobbit_Samwise_Gamgee', 'Bahiya_Hariri_sister', 'daddy_Larry_Birkhead', 'Sow_Tracey_Ullman', 'coach_Viljo_Nousiainen', 'Carmen_Lebbos', 'conjoined_twins_Zainab', 'Rob_Komosa', 'ample_bosomed', 'Ageing_rocker', 'psychic_Oda']
+ ----------------------------------------------------------------------
+
+
+
+Instantiate and fit the parameters of the debias transformation.
+In the fit stage, parameters such as bias direction are calculated and embeddings are
+prepared for the equalization stage.
+
+.. code:: ipython3
+
+ hd = HardDebias(verbose=False, criterion_name="gender")
+
+ hd.fit(
+ model, definitional_pairs=definitional_pairs, equalize_pairs=equalize_pairs,
+ )
+
+
+
+
+.. parsed-literal::
+
+
+
+
+
+Mitigation Parameters
+~~~~~~~~~~~~~~~~~~~~~
+
+The parameters of the transform method are relatively standard for all
+methods. The most important ones are ``target``, ``ignore`` and
+``copy``.
+
+In the following example we use ``ignore`` and ``copy``, which are
+described below:
+
+- ``ignore`` (by default, ``None``):
+
+ A list of strings that indicates that the debias method will perform
+ the debias in all words except those specified in this list. In case
+ it is not specified, debias will be executed on all words. In case
+ ignore is not specified or its value is None, the transformation will
+ be performed on all embeddings. This may cause words that are
+ specific to social groups to lose that component (for example,
+ leaving ``'she'`` and ``'he'`` without a gender component).
+
+- ``copy`` (by default ``True``):
+
+ if the value of copy is ``True``, method attempts to create a copy of
+ the model and run debias on the copy. If ``False``, the method is
+ applied on the original model, causing the vectors to mutate.
+
+
+.. warning::
+
+ WARNING:** Setting copy with ``True`` requires at least 2x RAM of
+ the size of the model. Otherwise the execution of the debias may raise
+ ``MemoryError``.
+
+The following transformation is executed using a copy of the model,
+ignoring the words contained in ``gender_specific``.
+
+
+.. code:: ipython3
+
+ gender_debiased_model = hd.transform(model, ignore=gender_specific, copy=True)
+
+
+.. parsed-literal::
+
+ Copy argument is True. Transform will attempt to create a copy of the original model. This may fail due to lack of memory.
+ Model copy created successfully.
+
+
+.. parsed-literal::
+
+ 100%|██████████| 13013/13013 [00:00<00:00, 118668.18it/s]
+
+
+Measuring the Decrease of Bias
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+Using the metrics and queries shown in the :ref:`bias measurement` user guide, we
+can measure whether there was a change in the measured gender bias
+between the original model and the debiased model.
+
+.. code:: ipython3
+
+ from wefe.datasets import load_weat
+ from wefe.query import Query
+ from wefe.metrics import WEAT
+
+ weat_wordset = load_weat()
+ weat = WEAT()
+
+
+Next, we measure the gender bias exposed by query 1 (Male terms and Female terms wrt Career and Family) with respect to the debiased model and the original.
+
+.. code:: ipython3
+
+ gender_query_1 = Query(
+ [weat_wordset["male_terms"], weat_wordset["female_terms"]],
+ [weat_wordset["career"], weat_wordset["family"]],
+ ["Male terms", "Female terms"],
+ ["Career", "Family"],
+ )
+ print(gender_query_1, "\n", "-" * 70, "\n")
+
+ biased_results_1 = weat.run_query(gender_query_1, model, normalize=True)
+ debiased_results_1 = weat.run_query(
+ gender_query_1, gender_debiased_model, normalize=True
+ )
+
+ print("Debiased vs Biased (absolute values)")
+ print(
+ round(abs(debiased_results_1["weat"]), 3),
+ "<",
+ round(abs(biased_results_1["weat"]), 3),
+ )
+
+
+
+
+.. parsed-literal::
+
+
+ ----------------------------------------------------------------------
+
+ Debiased vs Biased (absolute values)
+ 0.047 < 0.463
+
+
+The above results show that there was a decrease in the measured gender bias.
+
+Next, we measure the gender bias exposed by query 2 (Male Names and Female Names wrt Pleasant and Unpleasant terms) with respect to the debiased model and the original.
+
+.. code:: ipython3
+
+ gender_query_2 = Query(
+ [weat_wordset["male_names"], weat_wordset["female_names"]],
+ [weat_wordset["pleasant_5"], weat_wordset["unpleasant_5"]],
+ ["Male Names", "Female Names"],
+ ["Pleasant", "Unpleasant"],
+ )
+
+ print(gender_query_2, "\n", "-" * 70, "\n")
+
+ biased_results_2 = weat.run_query(
+ gender_query_2, model, normalize=True, preprocessors=[{}, {"lowercase": True}]
+ )
+ debiased_results_2 = weat.run_query(
+ gender_query_2,
+ gender_debiased_model,
+ normalize=True,
+ preprocessors=[{}, {"lowercase": True}],
+ )
+
+ print("Debiased vs Biased (absolute values)")
+ print(
+ round(abs(debiased_results_2["weat"]), 3),
+ "<",
+ round(abs(biased_results_2["weat"]), 3),
+ )
+
+
+
+
+.. parsed-literal::
+
+
+ ----------------------------------------------------------------------
+
+ Debiased vs Biased (absolute values)
+ 0.055 < 0.074
+
+
+Again, the above results show that there was a decrease in the measured gender bias.
+
+Target Parameter
+~~~~~~~~~~~~~~~~
+
+If a set of words is specified in ``target`` parameter, the debias method is performed
+only on the embeddings associated with this set.
+In the case of providing ``None``, the transformation is performed on all vocabulary
+words except those specified in ignore. By default ``None``.
+
+In the following example, the target parameter is used to execute the transformation
+only on the career and family word set:
+
+.. code:: ipython3
+
+ targets = [
+ "executive",
+ "management",
+ "professional",
+ "corporation",
+ "salary",
+ "office",
+ "business",
+ "career",
+ "home",
+ "parents",
+ "children",
+ "family",
+ "cousins",
+ "marriage",
+ "wedding",
+ "relatives",
+ ]
+
+ hd = HardDebias(verbose=False, criterion_name="gender").fit(
+ model, definitional_pairs=definitional_pairs, equalize_pairs=equalize_pairs,
+ )
+
+ gender_debiased_model = hd.transform(model, target=targets, copy=True)
+
+
+
+.. parsed-literal::
+
+ Copy argument is True. Transform will attempt to create a copy of the original model. This may fail due to lack of memory.
+ Model copy created successfully.
+
+
+.. parsed-literal::
+
+ 100%|██████████| 16/16 [00:00<00:00, 9428.05it/s]
+
+
+Next, a bias test is run on the mitigated embeddings associated with the
+target words.
+
+In this case, the value of the metric is lower on the
+query executed on the mitigated model than on the original one.
+These results indicate that there was a mitigation of bias on embeddings of these words.
+
+
+.. code:: ipython3
+
+ gender_query_1 = Query(
+ [weat_wordset["male_terms"], weat_wordset["female_terms"]],
+ [weat_wordset["career"], weat_wordset["family"]],
+ ["Male terms", "Female terms"],
+ ["Career", "Family"],
+ )
+ print(gender_query_1, "\n", "-" * 70, "\n")
+
+ biased_results_1 = weat.run_query(gender_query_1, model, normalize=True)
+ debiased_results_1 = weat.run_query(
+ gender_query_1, gender_debiased_model, normalize=True
+ )
+
+ print("Debiased vs Biased (absolute values)")
+ print(
+ round(abs(debiased_results_1["weat"]), 3),
+ "<",
+ round(abs(biased_results_1["weat"]), 3),
+ )
+
+
+
+
+.. parsed-literal::
+
+
+ ----------------------------------------------------------------------
+
+ Debiased vs Biased (absolute values)
+ 0.047 < 0.463
+
+
+However, if a bias test is run with words that were outside the ``target``
+word set, the results are almost the same. The slight difference in the
+metric scores lies in the fact that the equalize sets were still
+equalized.
+
+.. warning::
+
+ The equalization process can modify embeddings that have not been marked in the target.
+ In Hard Debias, equalization can be deactivated by delivering an empty
+ equalize set (``[]``).
+
+
+
+.. code:: ipython3
+
+ gender_query_2 = Query(
+ [weat_wordset["male_names"], weat_wordset["female_names"]],
+ [weat_wordset["pleasant_5"], weat_wordset["unpleasant_5"]],
+ ["Male Names", "Female Names"],
+ ["Pleasant", "Unpleasant"],
+ )
+
+ print(gender_query_2, "\n", "-" * 70, "\n")
+
+ biased_results_2 = weat.run_query(
+ gender_query_2, model, normalize=True, preprocessors=[{}, {"lowercase": True}]
+ )
+ debiased_results_2 = weat.run_query(
+ gender_query_2,
+ gender_debiased_model,
+ normalize=True,
+ preprocessors=[{}, {"lowercase": True}],
+ )
+
+ print("Debiased vs Biased (absolute values)")
+ print(
+ round(abs(debiased_results_2["weat"]), 3),
+ ">",
+ round(abs(biased_results_2["weat"]), 3),
+ )
+
+
+
+.. parsed-literal::
+
+
+ ----------------------------------------------------------------------
+
+ Debiased vs Biased (absolute values)
+ 0.08 > 0.074
+
+
+Note that the equalization caused the bias of the debiased model to be slightly larger than the original.
+
+
+Saving the Debiased Model
+~~~~~~~~~~~~~~~~~~~~~~~~~
+
+To save the mitigated model one must access the ``KeyedVectors`` (the
+gensim object that contains the embeddings) through ``wv`` and then use
+the ``save`` method to store the method in a file.
+
+
+
+.. code:: ipython3
+
+ gender_debiased_model.wv.save("gender_debiased_glove.kv")
+
+
+
+Multiclass Hard Debias
+----------------------
+
+Multiclass Hard Debias is a generalized version of Hard Debias that
+enables multiclass debiasing. Generalized refers to the fact that this
+method extends Hard Debias in order to support more than two types of
+social target sets within the definitional set.
+
+For example, for the case of religion bias, it supports a debias using
+words associated with Christianity, Islam and Judaism.
+
+The usage is very similar to Hard Debias with the difference that the
+``definitional_sets`` can be larger than pairs.
+
+
+.. code:: ipython3
+
+ from wefe.datasets import fetch_debias_multiclass
+ from wefe.debias.multiclass_hard_debias import MulticlassHardDebias
+
+ multiclass_debias_wordsets = fetch_debias_multiclass()
+ weat_wordsets = load_weat()
+ weat = WEAT()
+
+ ethnicity_definitional_sets = multiclass_debias_wordsets["ethnicity_definitional_sets"]
+ ethnicity_equalize_sets = list(
+ multiclass_debias_wordsets["ethnicity_analogy_templates"].values()
+ )
+
+ print(f"ethnicity_definitional_sets: \n{ethnicity_definitional_sets}")
+ print(f"ethnicity_equalize_sets: \n{ethnicity_equalize_sets}")
+ print("-" * 70, "\n")
+
+ mhd = MulticlassHardDebias(verbose=False, criterion_name="ethnicity")
+ mhd.fit(
+ model=model,
+ definitional_sets=ethnicity_definitional_sets,
+ equalize_sets=ethnicity_equalize_sets,
+ )
+
+ ethnicity_debiased_model = mhd.transform(model, copy=True)
+
+
+
+.. parsed-literal::
+
+ ethnicity_definitional_sets:
+ [['black', 'caucasian', 'asian'], ['african', 'caucasian', 'asian'], ['black', 'white', 'asian'], ['africa', 'america', 'asia'], ['africa', 'america', 'china'], ['africa', 'europe', 'asia']]
+ ethnicity_equalize_sets:
+ [['manager', 'executive', 'redneck', 'hillbilly', 'leader', 'farmer'], ['doctor', 'engineer', 'laborer', 'teacher'], ['slave', 'musician', 'runner', 'criminal', 'homeless']]
+ ----------------------------------------------------------------------
+
+ copy argument is True. Transform will attempt to create a copy of the original model. This may fail due to lack of memory.
+ Model copy created successfully.
+
+
+.. parsed-literal::
+
+ 100%|██████████| 13003/13003 [00:00<00:00, 18357.20it/s]
+
+
+Measuring the Decrease of Bias
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+The following code compares the execution of a query measuring ethnic bias in the original model vs. in the debiased model.
+
+.. code:: ipython3
+
+ ethnicity_query = Query(
+ [
+ multiclass_debias_wordsets["white_terms"],
+ multiclass_debias_wordsets["black_terms"],
+ ],
+ [
+ multiclass_debias_wordsets["white_biased_words"],
+ multiclass_debias_wordsets["black_biased_words"],
+ ],
+ ["european_american_names", "african_american_names"],
+ ["white_biased_words", "black_biased_words"],
+ )
+
+ print(ethnicity_query, "\n", "-" * 70, "\n")
+
+ biased_results = weat.run_query(
+ ethnicity_query, model, normalize=True, preprocessors=[{}, {"lowercase": True}],
+ )
+ debiased_results = weat.run_query(
+ ethnicity_query,
+ ethnicity_debiased_model,
+ normalize=True,
+ preprocessors=[{}, {"lowercase": True}],
+ )
+
+ print("Debiased vs Biased (absolute values)")
+ print(
+ round(abs(debiased_results_2["weat"]), 3),
+ "<",
+ round(abs(biased_results_2["weat"]), 3),
+ )
+
+
+
+.. parsed-literal::
+
+
+ ----------------------------------------------------------------------
+
+ Debiased vs Biased (absolute values)
+ 0.08 < 0.074
+
diff --git a/enviornment.yml b/enviornment.yml
deleted file mode 100644
index 5d16887..0000000
--- a/enviornment.yml
+++ /dev/null
@@ -1,10 +0,0 @@
-name: wefe
-dependencies:
- - numpy
- - scipy
- - pandas
- - scikit-learn
- - gensim
- - plotly
- - six
- - semantic_version
diff --git a/examples/Contributing.ipynb b/examples/Contributing.ipynb
index ee61578..1ef6f6f 100644
--- a/examples/Contributing.ipynb
+++ b/examples/Contributing.ipynb
@@ -1,795 +1,795 @@
{
- "cells": [
- {
- "cell_type": "markdown",
- "source": [
- "# Contributing"
- ],
- "metadata": {}
- },
- {
- "cell_type": "markdown",
- "source": [
- "# Metric Implementation Guide\n",
- "\n",
- "The following guide will show you how to implement a metric using WEFE.\n",
- "\n",
- "## Create the class \n",
- "\n",
- "The first step is to create the class that will contain the metric. \n",
- "This class must extend the `BaseMetric` class. \n",
- "\n",
- "In the new class you must specify the template (explained below), the name and an abbreviated name or acronym \n",
- "for the metric as class variables.\n",
- "\n",
- "A **template** is a tuple that defines the cardinality of the tagret and attribute sets of a query that can be accepted by the metric. \n",
- "It can take integer values, which require that the target or attribute sets have that cardinality or 'n' in case the metric can operate with 1 or more word sets.\n",
- "Note that this will indicate that all queries that do not comply with the template will be rejected when executed using this metric.\n",
- "\n",
- "Below are some examples of templates:"
- ],
- "metadata": {}
- },
- {
- "cell_type": "code",
- "execution_count": 1,
- "source": [
- "# two target sets and one attribute set required to execute this metric.\n",
- "template_1 = (2, 1)\n",
- "\n",
- "# two target sets and two attribute set required to execute this metric.\n",
- "template_2 = (2, 2)\n",
- "\n",
- "# one or more (unlimited) target sets and one attribute set required to execute this metric.\n",
- "template_3 = ('n', 1)"
- ],
- "outputs": [],
- "metadata": {
- "ExecuteTime": {
- "end_time": "2020-12-29T18:24:29.760528Z",
- "start_time": "2020-12-29T18:24:29.757008Z"
- }
- }
- },
- {
- "cell_type": "markdown",
- "source": [
- "Once the template is defined, you can create the metric according to the following code scheme:"
- ],
- "metadata": {}
- },
- {
- "cell_type": "code",
- "execution_count": 2,
- "source": [
- "from wefe.metrics.base_metric import BaseMetric\n",
- " \n",
- "class ExampleMetric(BaseMetric):\n",
- " metric_template = (2, 1)\n",
- " metric_name = 'Example Metric'\n",
- " metric_short_name = 'EM'"
- ],
- "outputs": [],
- "metadata": {
- "ExecuteTime": {
- "end_time": "2020-12-29T18:24:32.036229Z",
- "start_time": "2020-12-29T18:24:29.767042Z"
- }
- }
- },
- {
- "cell_type": "markdown",
- "source": [
- "## Implement `run_query` method\n",
- "\n",
- "The second step is to implement `run_query` method. \n",
- "This method is in charge of storing all the operations to calculate the scores from a `query` and the `word_embedding` model.\n",
- "It must perform 2 basic operations before executing the mathematical calculations: \n",
- "\n",
- "### Validate the parameters:\n",
- "\n",
- "This call checks the main parameters provided to the ``run_query`` and will raise an exception if it finds a problem with them.\n",
- "\n",
- "\n",
- "```python \n",
- "# check the types of the provided arguments.\n",
- "self._check_input(query, model)\n",
- "\n",
- "``` \n",
- " \n",
- " \n",
- "### Transform the Query to Embeddings.\n",
- "\n",
- "This call transforms all the word sets of a query into embeddings.\n",
- "\n",
- "\n",
- "```python\n",
- "# transform query word sets into embeddings\n",
- "embeddings = get_embeddings_from_query(\n",
- " model=model,\n",
- " query=query,\n",
- " lost_vocabulary_threshold=lost_vocabulary_threshold,\n",
- " preprocessors=preprocessors,\n",
- " strategy=strategy,\n",
- " normalize=normalize,\n",
- " warn_not_found_words=warn_not_found_words,\n",
- ")\n",
- "\n",
- "```\n",
- "\n",
- "This step could return either:\n",
- "\n",
- "- ``None`` if any of the sets lost percentage more words than the number of words \n",
- " allowed by ``lost_vocabulary_threshold`` parameter (specified as percentage\n",
- " float). In this case the metric would be expected to return nan in its results.\n",
- "\n",
- " .. code:: python\n",
- "\n",
- "```python\n",
- "# if there is any/some set has less words than the allowed limit,\n",
- "# return the default value (nan)\n",
- "if embeddings is None:\n",
- " return {\n",
- " \"query_name\": query.query_name,\n",
- " \"result\": np.nan,\n",
- " \"metrica_default_value\": np.nan,\n",
- " }\n",
- "\n",
- "```\n",
- "\n",
- "- A tuple otherwise. This tuple contains two values:\n",
- "\n",
- " - A dictionary that maps each target set name to a dictionary\n",
- " containing its words and embeddings.\n",
- " - A dictionary that maps each attribute set name to a dictionary\n",
- " containing its words and embeddings.\n",
- "\n",
- "We can illustrate what the outputs of the previous transformation look\n",
- "like using the following query:\n"
- ],
- "metadata": {
- "ExecuteTime": {
- "end_time": "2020-12-17T14:39:02.150641Z",
- "start_time": "2020-12-17T14:39:02.142644Z"
- }
- }
- },
- {
- "cell_type": "code",
- "execution_count": 3,
- "source": [
- "from wefe.word_embedding_model import WordEmbeddingModel\n",
- "from wefe.query import Query\n",
- "from wefe.utils import load_test_model # a few embeddings of WEAT experiments\n",
- "from wefe.datasets.datasets import load_weat # the word sets of WEAT experiments\n",
- "from wefe.preprocessing import get_embeddings_from_query\n",
- "\n",
- " \n",
- "weat = load_weat()\n",
- "model = load_test_model()\n",
- "\n",
- "flowers = weat['flowers']\n",
- "weapons = weat['weapons']\n",
- "pleasant = weat['pleasant_5']\n",
- "query = Query([flowers, weapons], [pleasant],\n",
- " ['Flowers', 'Weapons'], ['Pleasant'])\n",
- "\n",
- "embeddings = get_embeddings_from_query(\n",
- " model=model,\n",
- " query=query,\n",
- " # other params...\n",
- ")\n",
- "target_sets, attribute_sets = embeddings"
- ],
- "outputs": [
- {
- "output_type": "stream",
- "name": "stderr",
- "text": [
- "INFO:gensim.models.keyedvectors:loading projection weights from C:\\Users\\pablo\\Desktop\\DesarrolloWEFE\\wefe\\wefe\\datasets\\data\\weat_w2v.txt\n",
- "DEBUG:smart_open.smart_open_lib:{'uri': 'C:\\\\Users\\\\pablo\\\\Desktop\\\\DesarrolloWEFE\\\\wefe\\\\wefe\\\\datasets\\\\data\\\\weat_w2v.txt', 'mode': 'rb', 'buffering': -1, 'encoding': None, 'errors': None, 'newline': None, 'closefd': True, 'opener': None, 'ignore_ext': False, 'transport_params': None}\n",
- "INFO:gensim.models.keyedvectors:loaded (347, 300) matrix from C:\\Users\\pablo\\Desktop\\DesarrolloWEFE\\wefe\\wefe\\datasets\\data\\weat_w2v.txt\n"
- ]
- }
- ],
- "metadata": {
- "ExecuteTime": {
- "end_time": "2020-12-29T18:24:32.312423Z",
- "start_time": "2020-12-29T18:24:32.039213Z"
+ "cells": [
+ {
+ "cell_type": "markdown",
+ "source": [
+ "# Contributing"
+ ],
+ "metadata": {}
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "# Metric Implementation Guide\n",
+ "\n",
+ "The following guide will show you how to implement a metric using WEFE.\n",
+ "\n",
+ "## Create the class \n",
+ "\n",
+ "The first step is to create the class that will contain the metric. \n",
+ "This class must extend the `BaseMetric` class. \n",
+ "\n",
+ "In the new class you must specify the template (explained below), the name and an abbreviated name or acronym \n",
+ "for the metric as class variables.\n",
+ "\n",
+ "A **template** is a tuple that defines the cardinality of the tagret and attribute sets of a query that can be accepted by the metric. \n",
+ "It can take integer values, which require that the target or attribute sets have that cardinality or 'n' in case the metric can operate with 1 or more word sets.\n",
+ "Note that this will indicate that all queries that do not comply with the template will be rejected when executed using this metric.\n",
+ "\n",
+ "Below are some examples of templates:"
+ ],
+ "metadata": {}
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 1,
+ "source": [
+ "# two target sets and one attribute set required to execute this metric.\n",
+ "template_1 = (2, 1)\n",
+ "\n",
+ "# two target sets and two attribute set required to execute this metric.\n",
+ "template_2 = (2, 2)\n",
+ "\n",
+ "# one or more (unlimited) target sets and one attribute set required to execute this metric.\n",
+ "template_3 = ('n', 1)"
+ ],
+ "outputs": [],
+ "metadata": {
+ "ExecuteTime": {
+ "end_time": "2020-12-29T18:24:29.760528Z",
+ "start_time": "2020-12-29T18:24:29.757008Z"
+ }
+ }
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "Once the template is defined, you can create the metric according to the following code scheme:"
+ ],
+ "metadata": {}
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 2,
+ "source": [
+ "from wefe.metrics.base_metric import BaseMetric\n",
+ " \n",
+ "class ExampleMetric(BaseMetric):\n",
+ " metric_template = (2, 1)\n",
+ " metric_name = 'Example Metric'\n",
+ " metric_short_name = 'EM'"
+ ],
+ "outputs": [],
+ "metadata": {
+ "ExecuteTime": {
+ "end_time": "2020-12-29T18:24:32.036229Z",
+ "start_time": "2020-12-29T18:24:29.767042Z"
+ }
+ }
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "## Implement `run_query` method\n",
+ "\n",
+ "The second step is to implement `run_query` method. \n",
+ "This method is in charge of storing all the operations to calculate the scores from a `query` and the `word_embedding` model.\n",
+ "It must perform 2 basic operations before executing the mathematical calculations: \n",
+ "\n",
+ "### Validate the parameters:\n",
+ "\n",
+ "This call checks the main parameters provided to the ``run_query`` and will raise an exception if it finds a problem with them.\n",
+ "\n",
+ "\n",
+ "```python \n",
+ "# check the types of the provided arguments.\n",
+ "self._check_input(query, model)\n",
+ "\n",
+ "``` \n",
+ " \n",
+ " \n",
+ "### Transform the Query to Embeddings.\n",
+ "\n",
+ "This call transforms all the word sets of a query into embeddings.\n",
+ "\n",
+ "\n",
+ "```python\n",
+ "# transform query word sets into embeddings\n",
+ "embeddings = get_embeddings_from_query(\n",
+ " model=model,\n",
+ " query=query,\n",
+ " lost_vocabulary_threshold=lost_vocabulary_threshold,\n",
+ " preprocessors=preprocessors,\n",
+ " strategy=strategy,\n",
+ " normalize=normalize,\n",
+ " warn_not_found_words=warn_not_found_words,\n",
+ ")\n",
+ "\n",
+ "```\n",
+ "\n",
+ "This step could return either:\n",
+ "\n",
+ "- ``None`` if any of the sets lost percentage more words than the number of words \n",
+ " allowed by ``lost_vocabulary_threshold`` parameter (specified as percentage\n",
+ " float). In this case the metric would be expected to return nan in its results.\n",
+ "\n",
+ " .. code:: python\n",
+ "\n",
+ "```python\n",
+ "# if there is any/some set has less words than the allowed limit,\n",
+ "# return the default value (nan)\n",
+ "if embeddings is None:\n",
+ " return {\n",
+ " \"query_name\": query.query_name,\n",
+ " \"result\": np.nan,\n",
+ " \"metrica_default_value\": np.nan,\n",
+ " }\n",
+ "\n",
+ "```\n",
+ "\n",
+ "- A tuple otherwise. This tuple contains two values:\n",
+ "\n",
+ " - A dictionary that maps each target set name to a dictionary\n",
+ " containing its words and embeddings.\n",
+ " - A dictionary that maps each attribute set name to a dictionary\n",
+ " containing its words and embeddings.\n",
+ "\n",
+ "We can illustrate what the outputs of the previous transformation look\n",
+ "like using the following query:\n"
+ ],
+ "metadata": {
+ "ExecuteTime": {
+ "end_time": "2020-12-17T14:39:02.150641Z",
+ "start_time": "2020-12-17T14:39:02.142644Z"
+ }
+ }
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 3,
+ "source": [
+ "from wefe.word_embedding_model import WordEmbeddingModel\n",
+ "from wefe.query import Query\n",
+ "from wefe.utils import load_test_model # a few embeddings of WEAT experiments\n",
+ "from wefe.datasets.datasets import load_weat # the word sets of WEAT experiments\n",
+ "from wefe.preprocessing import get_embeddings_from_query\n",
+ "\n",
+ " \n",
+ "weat = load_weat()\n",
+ "model = load_test_model()\n",
+ "\n",
+ "flowers = weat['flowers']\n",
+ "weapons = weat['weapons']\n",
+ "pleasant = weat['pleasant_5']\n",
+ "query = Query([flowers, weapons], [pleasant],\n",
+ " ['Flowers', 'Weapons'], ['Pleasant'])\n",
+ "\n",
+ "embeddings = get_embeddings_from_query(\n",
+ " model=model,\n",
+ " query=query,\n",
+ " # other params...\n",
+ ")\n",
+ "target_sets, attribute_sets = embeddings"
+ ],
+ "outputs": [
+ {
+ "output_type": "stream",
+ "name": "stderr",
+ "text": [
+ "INFO:gensim.models.keyedvectors:loading projection weights from C:\\Users\\pablo\\Desktop\\DesarrolloWEFE\\wefe\\wefe\\datasets\\data\\weat_w2v.txt\n",
+ "DEBUG:smart_open.smart_open_lib:{'uri': 'C:\\\\Users\\\\pablo\\\\Desktop\\\\DesarrolloWEFE\\\\wefe\\\\wefe\\\\datasets\\\\data\\\\weat_w2v.txt', 'mode': 'rb', 'buffering': -1, 'encoding': None, 'errors': None, 'newline': None, 'closefd': True, 'opener': None, 'ignore_ext': False, 'transport_params': None}\n",
+ "INFO:gensim.models.keyedvectors:loaded (347, 300) matrix from C:\\Users\\pablo\\Desktop\\DesarrolloWEFE\\wefe\\wefe\\datasets\\data\\weat_w2v.txt\n"
+ ]
+ }
+ ],
+ "metadata": {
+ "ExecuteTime": {
+ "end_time": "2020-12-29T18:24:32.312423Z",
+ "start_time": "2020-12-29T18:24:32.039213Z"
+ },
+ "scrolled": true
+ }
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "If you inspect `target_sets`, it would look like the following dictionary:\n",
+ "\n",
+ "```python \n",
+ "{\n",
+ " 'Flowers': {\n",
+ " 'aster': array([-0.22167969, 0.52734375, 0.01745605, ...], dtype=float32),\n",
+ " 'clover': array([-0.03442383, 0.19042969, -0.17089844, ...], dtype=float32),\n",
+ " 'hyacinth': array([-0.01391602, 0.3828125, -0.21679688, ...], dtype=float32),\n",
+ " ...\n",
+ " },\n",
+ " 'Weapons': {\n",
+ " 'arrow': array([0.18164062, 0.125, -0.12792969. ...], dtype=float32),\n",
+ " 'club': array([-0.04907227, -0.07421875, -0.0390625, ...], dtype=float32),\n",
+ " 'gun': array([0.05566406, 0.15039062, 0.33398438, ...], dtype=float32),\n",
+ " 'missile': array([4.7874451e-04, 5.1953125e-01, -1.3809204e-03, ...], dtype=float32),\n",
+ " ...\n",
+ " }\n",
+ "}\n",
+ "```\n",
+ "\n",
+ "And `attribute_sets` would look like:\n",
+ "```python\n",
+ "{\n",
+ " 'Pleasant': {\n",
+ " 'caress': array([0.2578125, -0.22167969, 0.11669922], dtype=float32),\n",
+ " 'freedom': array([0.26757812, -0.078125, 0.09326172], dtype=float32),\n",
+ " 'health': array([-0.07421875, 0.11279297, 0.09472656], dtype=float32),\n",
+ " ...\n",
+ " }\n",
+ "}\n",
+ "```\n",
+ "\n",
+ "The idea of keeping a mapping between set names, words and their embeddings is that\n",
+ "there are some metrics that can calculate sub-metrics at different levels and that can\n",
+ "be useful for further use.\n",
+ "\n"
+ ],
+ "metadata": {
+ "ExecuteTime": {
+ "end_time": "2020-12-22T16:20:49.335341Z",
+ "start_time": "2020-12-22T16:20:49.325329Z"
+ }
+ }
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "## Example Metric\n",
+ "\n",
+ "Using the steps previously seen, a sample metric is implemented:"
+ ],
+ "metadata": {}
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 4,
+ "source": [
+ "from typing import Any, Dict, Union, List, Callable\n",
+ "\n",
+ "import numpy as np\n",
+ "\n",
+ "from wefe.metrics.base_metric import BaseMetric\n",
+ "from wefe.query import Query\n",
+ "from wefe.word_embedding_model import WordEmbeddingModel\n",
+ "\n",
+ "\n",
+ "class ExampleMetric(BaseMetric):\n",
+ "\n",
+ " # replace with the parameters of your metric\n",
+ " metric_template = (2, 1) # cardinalities of the targets and attributes sets that your metric will accept.\n",
+ " metric_name = 'Example Metric' \n",
+ " metric_short_name = 'EM'\n",
+ "\n",
+ " def run_query(\n",
+ " self,\n",
+ " query: Query,\n",
+ " model: WordEmbeddingModel,\n",
+ " lost_vocabulary_threshold: float = 0.2,\n",
+ " preprocessors: List[Dict[str, Union[str, bool, Callable]]] = [{}],\n",
+ " strategy: str = \"first\",\n",
+ " normalize: bool = False,\n",
+ " warn_not_found_words: bool = False,\n",
+ " *args: Any,\n",
+ " **kwargs: Any,\n",
+ " ) -> Dict[str, Any]:\n",
+ " \"\"\"Calculate the Example Metric metric over the provided parameters.\n",
+ "\n",
+ " Parameters\n",
+ " ----------\n",
+ " query : Query\n",
+ " A Query object that contains the target and attribute word sets to \n",
+ " be tested.\n",
+ "\n",
+ " word_embedding : WordEmbeddingModel\n",
+ " A WordEmbeddingModel object that contains certain word embedding \n",
+ " pretrained model.\n",
+ " \n",
+ " lost_vocabulary_threshold : float, optional\n",
+ " Specifies the proportional limit of words that any set of the query is\n",
+ " allowed to lose when transforming its words into embeddings.\n",
+ " In the case that any set of the query loses proportionally more words\n",
+ " than this limit, the result values will be np.nan, by default 0.2\n",
+ "\n",
+ " preprocessors : List[Dict[str, Union[str, bool, Callable]]]\n",
+ " A list with preprocessor options.\n",
+ "\n",
+ " A ``preprocessor`` is a dictionary that specifies what processing(s) are\n",
+ " performed on each word before its looked up in the model vocabulary.\n",
+ " For example, the ``preprocessor``\n",
+ " ``{'lowecase': True, 'strip_accents': True}`` allows you to lowercase\n",
+ " and remove the accent from each word before searching for them in the\n",
+ " model vocabulary. Note that an empty dictionary ``{}`` indicates that no\n",
+ " preprocessing is done.\n",
+ "\n",
+ " The possible options for a preprocessor are:\n",
+ "\n",
+ " * ``lowercase``: ``bool``. Indicates that the words are transformed to\n",
+ " lowercase.\n",
+ " * ``uppercase``: ``bool``. Indicates that the words are transformed to\n",
+ " uppercase.\n",
+ " * ``titlecase``: ``bool``. Indicates that the words are transformed to\n",
+ " titlecase.\n",
+ " * ``strip_accents``: ``bool``, ``{'ascii', 'unicode'}``: Specifies that\n",
+ " the accents of the words are eliminated. The stripping type can be\n",
+ " specified. True uses 'unicode' by default.\n",
+ " * ``preprocessor``: ``Callable``. It receives a function that operates\n",
+ " on each word. In the case of specifying a function, it overrides the\n",
+ " default preprocessor (i.e., the previous options stop working).\n",
+ "\n",
+ " A list of preprocessor options allows searching for several\n",
+ " variants of the words into the model. For example, the preprocessors\n",
+ " ``[{}, {\"lowercase\": True, \"strip_accents\": True}]``\n",
+ " ``{}`` allows searching first for the original words in the vocabulary of the model. \n",
+ " In case some of them are not found, ``{\"lowercase\": True, \"strip_accents\": True}`` \n",
+ " is executed on these words and then they are searched in the model vocabulary.\n",
+ "\n",
+ " strategy : str, optional\n",
+ " The strategy indicates how it will use the preprocessed words: 'first' will\n",
+ " include only the first transformed word found. 'all' will include all\n",
+ " transformed words found, by default \"first\".\n",
+ "\n",
+ " normalize : bool, optional\n",
+ " True indicates that embeddings will be normalized, by default False\n",
+ "\n",
+ " warn_not_found_words : bool, optional\n",
+ " Specifies if the function will warn (in the logger)\n",
+ " the words that were not found in the model's vocabulary\n",
+ " , by default False.\n",
+ "\n",
+ " Returns\n",
+ " -------\n",
+ " Dict[str, Any]\n",
+ " A dictionary with the query name, the resulting score of the metric, \n",
+ " and other scores.\n",
+ " \"\"\"\n",
+ " # check the types of the provided arguments (only the defaults).\n",
+ " self._check_input(query, model)\n",
+ "\n",
+ " # transform query word sets into embeddings\n",
+ " embeddings = get_embeddings_from_query(\n",
+ " model=model,\n",
+ " query=query,\n",
+ " lost_vocabulary_threshold=lost_vocabulary_threshold,\n",
+ " preprocessors=preprocessors,\n",
+ " strategy=strategy,\n",
+ " normalize=normalize,\n",
+ " warn_not_found_words=warn_not_found_words,\n",
+ " )\n",
+ "\n",
+ " # if there is any/some set has less words than the allowed limit,\n",
+ " # return the default value (nan)\n",
+ " if embeddings is None:\n",
+ " return {\n",
+ " 'query_name': query.query_name, # the name of the evaluated query\n",
+ " 'result': np.nan, # the result of the metric\n",
+ " 'em': np.nan, # result of the calculated metric (recommended)\n",
+ " 'other_metric' : np.nan, # another metric calculated (optional)\n",
+ " 'results_by_word' : np.nan, # if available, values by word (optional)\n",
+ " # ...\n",
+ " }\n",
+ "\n",
+ " # get the targets and attribute sets transformed into embeddings.\n",
+ " target_sets, attribute_sets = embeddings\n",
+ "\n",
+ " # commonly, you only will need the embeddings of the sets.\n",
+ " # this can be obtained by using:\n",
+ " target_embeddings = list(target_sets.values())\n",
+ " attribute_embeddings = list(attribute_sets.values())\n",
+ "\n",
+ " \n",
+ " \"\"\"\n",
+ " # From here, the code can vary quite a bit depending on what you need.\n",
+ " # It is recommended to calculate the metric operations in another method(s).\n",
+ " results = calc_metric() \n",
+ " \n",
+ " # The final step is to return query and result. \n",
+ " # You can return other scores, metrics by word or metrics by set, etc.\n",
+ " return {\n",
+ " 'query_name': query.query_name, # the name of the evaluated query\n",
+ " 'result': results.metric, # the result of the metric\n",
+ " 'em': results.metric # result of the calculated metric (recommended)\n",
+ " 'other_metric' : results.other_metric # Another metric calculated (optional)\n",
+ " 'another_results' : results.details_by_set # if available, values by word (optional),\n",
+ " ...\n",
+ " }\n",
+ " \"\"\"\n"
+ ],
+ "outputs": [],
+ "metadata": {
+ "ExecuteTime": {
+ "end_time": "2020-12-29T18:24:32.324424Z",
+ "start_time": "2020-12-29T18:24:32.315426Z"
+ }
+ }
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "This is what the transformed :code:`target_embeddings_dict` would look like:"
+ ],
+ "metadata": {}
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "## Implement the logic of the metric\n",
+ "\n",
+ "\n",
+ "Suppose we want to implement an extremely simple three-step metric, where:\n",
+ "\n",
+ "1. We calculate the average of all the sets,\n",
+ "2. Then, calculate the cosine distance between the target set averages and the \n",
+ " attribute average.\n",
+ "3. Subtract these distances.\n",
+ "\n",
+ "To do this, we create a new method :code:`_calc_metric` in which, using\n",
+ "the array of embedding dict objects as input, we will implement the above."
+ ],
+ "metadata": {}
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 3,
+ "source": [
+ "from typing import Any, Dict, Union, List, Callable\n",
+ "\n",
+ "from scipy.spatial import distance\n",
+ "import numpy as np\n",
+ "\n",
+ "from wefe.metrics import BaseMetric\n",
+ "from wefe.query import Query\n",
+ "from wefe.word_embedding_model import WordEmbeddingModel\n",
+ "from wefe.preprocessing import get_embeddings_from_query\n",
+ "\n",
+ "class ExampleMetric(BaseMetric):\n",
+ "\n",
+ " # replace with the parameters of your metric\n",
+ " metric_template = (\n",
+ " 2, 1\n",
+ " ) # cardinalities of the targets and attributes sets that your metric will accept.\n",
+ " metric_name = 'Example Metric'\n",
+ " metric_short_name = 'EM'\n",
+ "\n",
+ " def _calc_metric(self, target_embeddings, attribute_embeddings):\n",
+ " \"\"\"Calculates the metric.\n",
+ "\n",
+ " Parameters\n",
+ " ----------\n",
+ " target_embeddings : np.array\n",
+ " An array with dicts. Each dict represents an target set. \n",
+ " A dict is composed with a word and its embedding as key, value respectively.\n",
+ " attribute_embeddings : np.array\n",
+ " An array with dicts. Each dict represents an attribute set. \n",
+ " A dict is composed with a word and its embedding as key, value respectively.\n",
+ "\n",
+ " Returns\n",
+ " -------\n",
+ " np.float\n",
+ " The value of the calculated metric.\n",
+ " \"\"\"\n",
+ "\n",
+ " # get the embeddings from the dicts\n",
+ " target_embeddings_0 = np.array(list(target_embeddings[0].values()))\n",
+ " target_embeddings_1 = np.array(list(target_embeddings[1].values()))\n",
+ "\n",
+ " attribute_embeddings_0 = np.array(\n",
+ " list(attribute_embeddings[0].values()))\n",
+ "\n",
+ " # calculate the average embedding by target and attribute set.\n",
+ " target_embeddings_0_avg = np.mean(target_embeddings_0, axis=0)\n",
+ " target_embeddings_1_avg = np.mean(target_embeddings_1, axis=0)\n",
+ " attribute_embeddings_0_avg = np.mean(attribute_embeddings_0, axis=0)\n",
+ "\n",
+ " # calculate the distances between the target sets and the attribute set\n",
+ " dist_target_0_attr = distance.cosine(target_embeddings_0_avg,\n",
+ " attribute_embeddings_0_avg)\n",
+ " dist_target_1_attr = distance.cosine(target_embeddings_1_avg,\n",
+ " attribute_embeddings_0_avg)\n",
+ "\n",
+ " # subtract the distances\n",
+ " metric_result = dist_target_0_attr - dist_target_1_attr\n",
+ " return metric_result\n",
+ "\n",
+ " def run_query(\n",
+ " self,\n",
+ " query: Query,\n",
+ " model: WordEmbeddingModel,\n",
+ " lost_vocabulary_threshold: float = 0.2,\n",
+ " preprocessors: List[Dict[str, Union[str, bool, Callable]]] = [{}],\n",
+ " strategy: str = \"first\",\n",
+ " normalize: bool = False,\n",
+ " warn_not_found_words: bool = False,\n",
+ " *args: Any,\n",
+ " **kwargs: Any,\n",
+ " ) -> Dict[str, Any]:\n",
+ " \"\"\"Calculate the Example Metric metric over the provided parameters.\n",
+ "\n",
+ " Parameters\n",
+ " ----------\n",
+ " query : Query\n",
+ " A Query object that contains the target and attribute word sets to \n",
+ " be tested.\n",
+ "\n",
+ " word_embedding : WordEmbeddingModel\n",
+ " A WordEmbeddingModel object that contains certain word embedding \n",
+ " pretrained model.\n",
+ " \n",
+ " lost_vocabulary_threshold : float, optional\n",
+ " Specifies the proportional limit of words that any set of the query is\n",
+ " allowed to lose when transforming its words into embeddings.\n",
+ " In the case that any set of the query loses proportionally more words\n",
+ " than this limit, the result values will be np.nan, by default 0.2\n",
+ "\n",
+ " preprocessors : List[Dict[str, Union[str, bool, Callable]]]\n",
+ " A list with preprocessor options.\n",
+ "\n",
+ " A ``preprocessor`` is a dictionary that specifies what processing(s) are\n",
+ " performed on each word before its looked up in the model vocabulary.\n",
+ " For example, the ``preprocessor``\n",
+ " ``{'lowecase': True, 'strip_accents': True}`` allows you to lowercase\n",
+ " and remove the accent from each word before searching for them in the\n",
+ " model vocabulary. Note that an empty dictionary ``{}`` indicates that no\n",
+ " preprocessing is done.\n",
+ "\n",
+ " The possible options for a preprocessor are:\n",
+ "\n",
+ " * ``lowercase``: ``bool``. Indicates that the words are transformed to\n",
+ " lowercase.\n",
+ " * ``uppercase``: ``bool``. Indicates that the words are transformed to\n",
+ " uppercase.\n",
+ " * ``titlecase``: ``bool``. Indicates that the words are transformed to\n",
+ " titlecase.\n",
+ " * ``strip_accents``: ``bool``, ``{'ascii', 'unicode'}``: Specifies that\n",
+ " the accents of the words are eliminated. The stripping type can be\n",
+ " specified. True uses 'unicode' by default.\n",
+ " * ``preprocessor``: ``Callable``. It receives a function that operates\n",
+ " on each word. In the case of specifying a function, it overrides the\n",
+ " default preprocessor (i.e., the previous options stop working).\n",
+ "\n",
+ " A list of preprocessor options allows searching for several\n",
+ " variants of the words into the model. For example, the preprocessors\n",
+ " ``[{}, {\"lowercase\": True, \"strip_accents\": True}]``\n",
+ " ``{}`` allows first searching for the original words in the vocabulary of the model. \n",
+ " In case some of them are not found, ``{\"lowercase\": True, \"strip_accents\": True}`` \n",
+ " is executed on these words and then they are searched in the model vocabulary.\n",
+ "\n",
+ " strategy : str, optional\n",
+ " The strategy indicates how it will use the preprocessed words: 'first' will\n",
+ " include only the first transformed word found. 'all' will include all\n",
+ " transformed words found, by default \"first\".\n",
+ "\n",
+ " normalize : bool, optional\n",
+ " True indicates that embeddings will be normalized, by default False\n",
+ "\n",
+ " warn_not_found_words : bool, optional\n",
+ " Specifies if the function will warn (in the logger)\n",
+ " the words that were not found in the model's vocabulary\n",
+ " , by default False.\n",
+ "\n",
+ " Returns\n",
+ " -------\n",
+ " Dict[str, Any]\n",
+ " A dictionary with the query name, the resulting score of the metric, \n",
+ " and other scores.\n",
+ " \"\"\"\n",
+ " # check the types of the provided arguments (only the defaults).\n",
+ " self._check_input(query, model)\n",
+ "\n",
+ " # transform query word sets into embeddings\n",
+ " embeddings = get_embeddings_from_query(\n",
+ " model=model,\n",
+ " query=query,\n",
+ " lost_vocabulary_threshold=lost_vocabulary_threshold,\n",
+ " preprocessors=preprocessors,\n",
+ " strategy=strategy,\n",
+ " normalize=normalize,\n",
+ " warn_not_found_words=warn_not_found_words,\n",
+ " )\n",
+ "\n",
+ " # if there is any/some set has less words than the allowed limit,\n",
+ " # return the default value (nan)\n",
+ " if embeddings is None:\n",
+ " return {\n",
+ " 'query_name': query.query_name, # the name of the evaluated query\n",
+ " 'result': np.nan, # the result of the metric\n",
+ " 'em': np.nan, # result of the calculated metric (recommended)\n",
+ " 'other_metric' : np.nan, # another metric calculated (optional)\n",
+ " 'results_by_word' : np.nan, # if available, values by word (optional)\n",
+ " # ...\n",
+ " }\n",
+ "\n",
+ " # get the targets and attribute sets transformed into embeddings.\n",
+ " target_sets, attribute_sets = embeddings\n",
+ "\n",
+ " # commonly, you only will need the embeddings of the sets.\n",
+ " # this can be obtained by using:\n",
+ " target_embeddings = list(target_sets.values())\n",
+ " attribute_embeddings = list(attribute_sets.values())\n",
+ "\n",
+ " result = self._calc_metric(target_embeddings, attribute_embeddings)\n",
+ "\n",
+ " # return the results.\n",
+ " return {\"query_name\": query.query_name, \"result\": result, 'em': result}"
+ ],
+ "outputs": [],
+ "metadata": {
+ "ExecuteTime": {
+ "end_time": "2020-12-29T18:24:32.343454Z",
+ "start_time": "2020-12-29T18:24:32.326425Z"
+ }
+ }
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "Now, let's try it out:"
+ ],
+ "metadata": {}
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 6,
+ "source": [
+ "from wefe.query import Query\n",
+ "from wefe.utils import load_test_model # a few embeddings of WEAT experiments\n",
+ "from wefe.datasets.datasets import load_weat # the word sets of WEAT experiments\n",
+ "\n",
+ "weat = load_weat()\n",
+ "model = load_test_model()\n",
+ "\n",
+ "flowers = weat['flowers']\n",
+ "weapons = weat['weapons']\n",
+ "pleasant = weat['pleasant_5']\n",
+ "query = Query([flowers, weapons], [pleasant], ['Flowers', 'Weapons'],\n",
+ " ['Pleasant'])\n",
+ "\n",
+ "\n",
+ "results = ExampleMetric().run_query(query, model)\n",
+ "print(results)"
+ ],
+ "outputs": [
+ {
+ "output_type": "stream",
+ "name": "stderr",
+ "text": [
+ "INFO:gensim.utils:loading KeyedVectors object from /home/pablo/wefe/wefe/datasets/data/test_model.kv\n",
+ "DEBUG:smart_open.smart_open_lib:{'uri': '/home/pablo/wefe/wefe/datasets/data/test_model.kv', 'mode': 'rb', 'buffering': -1, 'encoding': None, 'errors': None, 'newline': None, 'closefd': True, 'opener': None, 'ignore_ext': False, 'transport_params': None}\n",
+ "INFO:gensim.utils:setting ignored attribute vectors_norm to None\n",
+ "DEBUG:gensim.utils:starting a new internal lifecycle event log for KeyedVectors\n",
+ "INFO:gensim.utils:KeyedVectors lifecycle event {'fname': '/home/pablo/wefe/wefe/datasets/data/test_model.kv', 'datetime': '2021-08-13T11:43:41.890605', 'gensim': '4.0.1', 'python': '3.7.10 (default, Jun 4 2021, 14:48:32) \\n[GCC 7.5.0]', 'platform': 'Linux-5.10.16.3-microsoft-standard-WSL2-x86_64-with-debian-bullseye-sid', 'event': 'loaded'}\n"
+ ]
+ },
+ {
+ "output_type": "stream",
+ "name": "stdout",
+ "text": [
+ "{'query_name': 'Flowers and Weapons wrt Pleasant', 'result': -0.10210171341896057, 'em': -0.10210171341896057}\n"
+ ]
+ }
+ ],
+ "metadata": {
+ "ExecuteTime": {
+ "end_time": "2020-12-29T18:24:32.475099Z",
+ "start_time": "2020-12-29T18:24:32.345453Z"
+ }
+ }
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "\n",
+ "We have completely defined a new metric.\n",
+ "Congratulations!\n",
+ "\n",
+ "\n",
+ "**Note**\n",
+ "\n",
+ "Some comments regarding the implementation of new metrics:\n",
+ "\n",
+ "- Note that the returned object must necessarily be a ``dict`` instance \n",
+ " containing the ``result`` and ``query_name`` key-values. Otherwise you \n",
+ " will not be able to run query batches using utility functions like \n",
+ " ``run_queries``.\n",
+ "- ``run_query`` can receive additional parameters. Simply add them to the \n",
+ " function signature. These parameters can also be used when running the \n",
+ " metric from the ``run_queries`` utility function.\n",
+ "- We recommend implementing the logic of the metric separated from the \n",
+ " ``run_query`` function. In other words, implement the logic in a \n",
+ " ``calc_your_metric`` function that receives the dictionaries with the \n",
+ " necessary embeddings and parameters.\n",
+ "- The file where ``ExampleMetric`` is located can be found inside the \n",
+ " distances folder of the [repository](https://github.com/dccuchile/wefe/blob/master/wefe/metrics/example_metric.py/)\n",
+ "\n"
+ ],
+ "metadata": {}
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "# Mitigation Method Implementation Guide"
+ ],
+ "metadata": {}
+ }
+ ],
+ "metadata": {
+ "kernelspec": {
+ "name": "python3",
+ "display_name": "Python 3.7.10 64-bit ('wefe': conda)"
+ },
+ "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.7.10"
+ },
+ "toc": {
+ "base_numbering": 1,
+ "nav_menu": {},
+ "number_sections": true,
+ "sideBar": true,
+ "skip_h1_title": false,
+ "title_cell": "Table of Contents",
+ "title_sidebar": "Contents",
+ "toc_cell": false,
+ "toc_position": {},
+ "toc_section_display": true,
+ "toc_window_display": false
+ },
+ "varInspector": {
+ "cols": {
+ "lenName": 16,
+ "lenType": 16,
+ "lenVar": 40
+ },
+ "kernels_config": {
+ "python": {
+ "delete_cmd_postfix": "",
+ "delete_cmd_prefix": "del ",
+ "library": "var_list.py",
+ "varRefreshCmd": "print(var_dic_list())"
+ },
+ "r": {
+ "delete_cmd_postfix": ") ",
+ "delete_cmd_prefix": "rm(",
+ "library": "var_list.r",
+ "varRefreshCmd": "cat(var_dic_list()) "
+ }
+ },
+ "types_to_exclude": [
+ "module",
+ "function",
+ "builtin_function_or_method",
+ "instance",
+ "_Feature"
+ ],
+ "window_display": false
+ },
+ "interpreter": {
+ "hash": "d84ebd0cc0ccc3ceb6e99e895c29aecce94e907fb1f0ef7f0ceb697eb7e914cf"
+ }
},
- "scrolled": true
- }
- },
- {
- "cell_type": "markdown",
- "source": [
- "If you inspect `target_sets`, it would look like the following dictionary:\n",
- "\n",
- "```python \n",
- "{\n",
- " 'Flowers': {\n",
- " 'aster': array([-0.22167969, 0.52734375, 0.01745605, ...], dtype=float32),\n",
- " 'clover': array([-0.03442383, 0.19042969, -0.17089844, ...], dtype=float32),\n",
- " 'hyacinth': array([-0.01391602, 0.3828125, -0.21679688, ...], dtype=float32),\n",
- " ...\n",
- " },\n",
- " 'Weapons': {\n",
- " 'arrow': array([0.18164062, 0.125, -0.12792969. ...], dtype=float32),\n",
- " 'club': array([-0.04907227, -0.07421875, -0.0390625, ...], dtype=float32),\n",
- " 'gun': array([0.05566406, 0.15039062, 0.33398438, ...], dtype=float32),\n",
- " 'missile': array([4.7874451e-04, 5.1953125e-01, -1.3809204e-03, ...], dtype=float32),\n",
- " ...\n",
- " }\n",
- "}\n",
- "```\n",
- "\n",
- "And `attribute_sets` would look like:\n",
- "```python\n",
- "{\n",
- " 'Pleasant': {\n",
- " 'caress': array([0.2578125, -0.22167969, 0.11669922], dtype=float32),\n",
- " 'freedom': array([0.26757812, -0.078125, 0.09326172], dtype=float32),\n",
- " 'health': array([-0.07421875, 0.11279297, 0.09472656], dtype=float32),\n",
- " ...\n",
- " }\n",
- "}\n",
- "```\n",
- "\n",
- "The idea of keeping a mapping between set names, words and their embeddings is that\n",
- "there are some metrics that can calculate sub-metrics at different levels and that can\n",
- "be useful for further use.\n",
- "\n"
- ],
- "metadata": {
- "ExecuteTime": {
- "end_time": "2020-12-22T16:20:49.335341Z",
- "start_time": "2020-12-22T16:20:49.325329Z"
- }
- }
- },
- {
- "cell_type": "markdown",
- "source": [
- "## Example Metric\n",
- "\n",
- "Using the steps previously seen, a sample metric is implemented:"
- ],
- "metadata": {}
- },
- {
- "cell_type": "code",
- "execution_count": 4,
- "source": [
- "from typing import Any, Dict, Union, List, Callable\n",
- "\n",
- "import numpy as np\n",
- "\n",
- "from wefe.metrics.base_metric import BaseMetric\n",
- "from wefe.query import Query\n",
- "from wefe.word_embedding_model import WordEmbeddingModel\n",
- "\n",
- "\n",
- "class ExampleMetric(BaseMetric):\n",
- "\n",
- " # replace with the parameters of your metric\n",
- " metric_template = (2, 1) # cardinalities of the targets and attributes sets that your metric will accept.\n",
- " metric_name = 'Example Metric' \n",
- " metric_short_name = 'EM'\n",
- "\n",
- " def run_query(\n",
- " self,\n",
- " query: Query,\n",
- " model: WordEmbeddingModel,\n",
- " lost_vocabulary_threshold: float = 0.2,\n",
- " preprocessors: List[Dict[str, Union[str, bool, Callable]]] = [{}],\n",
- " strategy: str = \"first\",\n",
- " normalize: bool = False,\n",
- " warn_not_found_words: bool = False,\n",
- " *args: Any,\n",
- " **kwargs: Any,\n",
- " ) -> Dict[str, Any]:\n",
- " \"\"\"Calculate the Example Metric metric over the provided parameters.\n",
- "\n",
- " Parameters\n",
- " ----------\n",
- " query : Query\n",
- " A Query object that contains the target and attribute word sets to \n",
- " be tested.\n",
- "\n",
- " word_embedding : WordEmbeddingModel\n",
- " A WordEmbeddingModel object that contains certain word embedding \n",
- " pretrained model.\n",
- " \n",
- " lost_vocabulary_threshold : float, optional\n",
- " Specifies the proportional limit of words that any set of the query is\n",
- " allowed to lose when transforming its words into embeddings.\n",
- " In the case that any set of the query loses proportionally more words\n",
- " than this limit, the result values will be np.nan, by default 0.2\n",
- "\n",
- " preprocessors : List[Dict[str, Union[str, bool, Callable]]]\n",
- " A list with preprocessor options.\n",
- "\n",
- " A ``preprocessor`` is a dictionary that specifies what processing(s) are\n",
- " performed on each word before its looked up in the model vocabulary.\n",
- " For example, the ``preprocessor``\n",
- " ``{'lowecase': True, 'strip_accents': True}`` allows you to lowercase\n",
- " and remove the accent from each word before searching for them in the\n",
- " model vocabulary. Note that an empty dictionary ``{}`` indicates that no\n",
- " preprocessing is done.\n",
- "\n",
- " The possible options for a preprocessor are:\n",
- "\n",
- " * ``lowercase``: ``bool``. Indicates that the words are transformed to\n",
- " lowercase.\n",
- " * ``uppercase``: ``bool``. Indicates that the words are transformed to\n",
- " uppercase.\n",
- " * ``titlecase``: ``bool``. Indicates that the words are transformed to\n",
- " titlecase.\n",
- " * ``strip_accents``: ``bool``, ``{'ascii', 'unicode'}``: Specifies that\n",
- " the accents of the words are eliminated. The stripping type can be\n",
- " specified. True uses ‘unicode’ by default.\n",
- " * ``preprocessor``: ``Callable``. It receives a function that operates\n",
- " on each word. In the case of specifying a function, it overrides the\n",
- " default preprocessor (i.e., the previous options stop working).\n",
- "\n",
- " A list of preprocessor options allows searching for several\n",
- " variants of the words into the model. For example, the preprocessors\n",
- " ``[{}, {\"lowercase\": True, \"strip_accents\": True}]``\n",
- " ``{}`` allows first to search for the original words in the vocabulary of the model. \n",
- " In case some of them are not found, ``{\"lowercase\": True, \"strip_accents\": True}`` \n",
- " is executed on these words and then they are searched in the model vocabulary.\n",
- "\n",
- " strategy : str, optional\n",
- " The strategy indicates how it will use the preprocessed words: 'first' will\n",
- " include only the first transformed word found. all' will include all\n",
- " transformed words found, by default \"first\".\n",
- "\n",
- " normalize : bool, optional\n",
- " True indicates that embeddings will be normalized, by default False\n",
- "\n",
- " warn_not_found_words : bool, optional\n",
- " Specifies if the function will warn (in the logger)\n",
- " the words that were not found in the model's vocabulary\n",
- " , by default False.\n",
- "\n",
- " Returns\n",
- " -------\n",
- " Dict[str, Any]\n",
- " A dictionary with the query name, the resulting score of the metric, \n",
- " and other scores.\n",
- " \"\"\"\n",
- " # check the types of the provided arguments (only the defaults).\n",
- " self._check_input(query, model)\n",
- "\n",
- " # transform query word sets into embeddings\n",
- " embeddings = get_embeddings_from_query(\n",
- " model=model,\n",
- " query=query,\n",
- " lost_vocabulary_threshold=lost_vocabulary_threshold,\n",
- " preprocessors=preprocessors,\n",
- " strategy=strategy,\n",
- " normalize=normalize,\n",
- " warn_not_found_words=warn_not_found_words,\n",
- " )\n",
- "\n",
- " # if there is any/some set has less words than the allowed limit,\n",
- " # return the default value (nan)\n",
- " if embeddings is None:\n",
- " return {\n",
- " 'query_name': query.query_name, # the name of the evaluated query\n",
- " 'result': np.nan, # the result of the metric\n",
- " 'em': np.nan, # result of the calculated metric (recommended)\n",
- " 'other_metric' : np.nan, # another metric calculated (optional)\n",
- " 'results_by_word' : np.nan, # if available, values by word (optional)\n",
- " # ...\n",
- " }\n",
- "\n",
- " # get the targets and attribute sets transformed into embeddings.\n",
- " target_sets, attribute_sets = embeddings\n",
- "\n",
- " # commonly, you only will need the embeddings of the sets.\n",
- " # this can be obtained by using:\n",
- " target_embeddings = list(target_sets.values())\n",
- " attribute_embeddings = list(attribute_sets.values())\n",
- "\n",
- " \n",
- " \"\"\"\n",
- " # From here, the code can vary quite a bit depending on what you need.\n",
- " # It is recommended to calculate the metric operations in another method(s).\n",
- " results = calc_metric() \n",
- " \n",
- " # The final step is to return query and result. \n",
- " # You can return other scores, metrics by word or metrics by set, etc.\n",
- " return {\n",
- " 'query_name': query.query_name, # the name of the evaluated query\n",
- " 'result': results.metric, # the result of the metric\n",
- " 'em': results.metric # result of the calculated metric (recommended)\n",
- " 'other_metric' : results.other_metric # Another metric calculated (optional)\n",
- " 'another_results' : results.details_by_set # if available, values by word (optional),\n",
- " ...\n",
- " }\n",
- " \"\"\"\n"
- ],
- "outputs": [],
- "metadata": {
- "ExecuteTime": {
- "end_time": "2020-12-29T18:24:32.324424Z",
- "start_time": "2020-12-29T18:24:32.315426Z"
- }
- }
- },
- {
- "cell_type": "markdown",
- "source": [
- "This is what the transformed :code:`target_embeddings_dict` would look like:"
- ],
- "metadata": {}
- },
- {
- "cell_type": "markdown",
- "source": [
- "## Implement the logic of the metric\n",
- "\n",
- "\n",
- "Suppose we want to implement an extremely simple three-step metric, where:\n",
- "\n",
- "1. We calculate the average of all the sets,\n",
- "2. Then, calculate the cosine distance between the target set averages and the \n",
- " attribute average.\n",
- "3. Subtract these distances.\n",
- "\n",
- "To do this, we create a new method :code:`_calc_metric` in which, using\n",
- "the array of embedding dict objects as input, we will implement the above."
- ],
- "metadata": {}
- },
- {
- "cell_type": "code",
- "execution_count": 3,
- "source": [
- "from typing import Any, Dict, Union, List, Callable\n",
- "\n",
- "from scipy.spatial import distance\n",
- "import numpy as np\n",
- "\n",
- "from wefe.metrics import BaseMetric\n",
- "from wefe.query import Query\n",
- "from wefe.word_embedding_model import WordEmbeddingModel\n",
- "from wefe.preprocessing import get_embeddings_from_query\n",
- "\n",
- "class ExampleMetric(BaseMetric):\n",
- "\n",
- " # replace with the parameters of your metric\n",
- " metric_template = (\n",
- " 2, 1\n",
- " ) # cardinalities of the targets and attributes sets that your metric will accept.\n",
- " metric_name = 'Example Metric'\n",
- " metric_short_name = 'EM'\n",
- "\n",
- " def _calc_metric(self, target_embeddings, attribute_embeddings):\n",
- " \"\"\"Calculates the metric.\n",
- "\n",
- " Parameters\n",
- " ----------\n",
- " target_embeddings : np.array\n",
- " An array with dicts. Each dict represents an target set. \n",
- " A dict is composed with a word and its embedding as key, value respectively.\n",
- " attribute_embeddings : np.array\n",
- " An array with dicts. Each dict represents an attribute set. \n",
- " A dict is composed with a word and its embedding as key, value respectively.\n",
- "\n",
- " Returns\n",
- " -------\n",
- " np.float\n",
- " The value of the calculated metric.\n",
- " \"\"\"\n",
- "\n",
- " # get the embeddings from the dicts\n",
- " target_embeddings_0 = np.array(list(target_embeddings[0].values()))\n",
- " target_embeddings_1 = np.array(list(target_embeddings[1].values()))\n",
- "\n",
- " attribute_embeddings_0 = np.array(\n",
- " list(attribute_embeddings[0].values()))\n",
- "\n",
- " # calculate the average embedding by target and attribute set.\n",
- " target_embeddings_0_avg = np.mean(target_embeddings_0, axis=0)\n",
- " target_embeddings_1_avg = np.mean(target_embeddings_1, axis=0)\n",
- " attribute_embeddings_0_avg = np.mean(attribute_embeddings_0, axis=0)\n",
- "\n",
- " # calculate the distances between the target sets and the attribute set\n",
- " dist_target_0_attr = distance.cosine(target_embeddings_0_avg,\n",
- " attribute_embeddings_0_avg)\n",
- " dist_target_1_attr = distance.cosine(target_embeddings_1_avg,\n",
- " attribute_embeddings_0_avg)\n",
- "\n",
- " # subtract the distances\n",
- " metric_result = dist_target_0_attr - dist_target_1_attr\n",
- " return metric_result\n",
- "\n",
- " def run_query(\n",
- " self,\n",
- " query: Query,\n",
- " model: WordEmbeddingModel,\n",
- " lost_vocabulary_threshold: float = 0.2,\n",
- " preprocessors: List[Dict[str, Union[str, bool, Callable]]] = [{}],\n",
- " strategy: str = \"first\",\n",
- " normalize: bool = False,\n",
- " warn_not_found_words: bool = False,\n",
- " *args: Any,\n",
- " **kwargs: Any,\n",
- " ) -> Dict[str, Any]:\n",
- " \"\"\"Calculate the Example Metric metric over the provided parameters.\n",
- "\n",
- " Parameters\n",
- " ----------\n",
- " query : Query\n",
- " A Query object that contains the target and attribute word sets to \n",
- " be tested.\n",
- "\n",
- " word_embedding : WordEmbeddingModel\n",
- " A WordEmbeddingModel object that contains certain word embedding \n",
- " pretrained model.\n",
- " \n",
- " lost_vocabulary_threshold : float, optional\n",
- " Specifies the proportional limit of words that any set of the query is\n",
- " allowed to lose when transforming its words into embeddings.\n",
- " In the case that any set of the query loses proportionally more words\n",
- " than this limit, the result values will be np.nan, by default 0.2\n",
- "\n",
- " preprocessors : List[Dict[str, Union[str, bool, Callable]]]\n",
- " A list with preprocessor options.\n",
- "\n",
- " A ``preprocessor`` is a dictionary that specifies what processing(s) are\n",
- " performed on each word before its looked up in the model vocabulary.\n",
- " For example, the ``preprocessor``\n",
- " ``{'lowecase': True, 'strip_accents': True}`` allows you to lowercase\n",
- " and remove the accent from each word before searching for them in the\n",
- " model vocabulary. Note that an empty dictionary ``{}`` indicates that no\n",
- " preprocessing is done.\n",
- "\n",
- " The possible options for a preprocessor are:\n",
- "\n",
- " * ``lowercase``: ``bool``. Indicates that the words are transformed to\n",
- " lowercase.\n",
- " * ``uppercase``: ``bool``. Indicates that the words are transformed to\n",
- " uppercase.\n",
- " * ``titlecase``: ``bool``. Indicates that the words are transformed to\n",
- " titlecase.\n",
- " * ``strip_accents``: ``bool``, ``{'ascii', 'unicode'}``: Specifies that\n",
- " the accents of the words are eliminated. The stripping type can be\n",
- " specified. True uses ‘unicode’ by default.\n",
- " * ``preprocessor``: ``Callable``. It receives a function that operates\n",
- " on each word. In the case of specifying a function, it overrides the\n",
- " default preprocessor (i.e., the previous options stop working).\n",
- "\n",
- " A list of preprocessor options allows searching for several\n",
- " variants of the words into the model. For example, the preprocessors\n",
- " ``[{}, {\"lowercase\": True, \"strip_accents\": True}]``\n",
- " ``{}`` allows first searching for the original words in the vocabulary of the model. \n",
- " In case some of them are not found, ``{\"lowercase\": True, \"strip_accents\": True}`` \n",
- " is executed on these words and then they are searched in the model vocabulary.\n",
- "\n",
- " strategy : str, optional\n",
- " The strategy indicates how it will use the preprocessed words: 'first' will\n",
- " include only the first transformed word found. all' will include all\n",
- " transformed words found, by default \"first\".\n",
- "\n",
- " normalize : bool, optional\n",
- " True indicates that embeddings will be normalized, by default False\n",
- "\n",
- " warn_not_found_words : bool, optional\n",
- " Specifies if the function will warn (in the logger)\n",
- " the words that were not found in the model's vocabulary\n",
- " , by default False.\n",
- "\n",
- " Returns\n",
- " -------\n",
- " Dict[str, Any]\n",
- " A dictionary with the query name, the resulting score of the metric, \n",
- " and other scores.\n",
- " \"\"\"\n",
- " # check the types of the provided arguments (only the defaults).\n",
- " self._check_input(query, model)\n",
- "\n",
- " # transform query word sets into embeddings\n",
- " embeddings = get_embeddings_from_query(\n",
- " model=model,\n",
- " query=query,\n",
- " lost_vocabulary_threshold=lost_vocabulary_threshold,\n",
- " preprocessors=preprocessors,\n",
- " strategy=strategy,\n",
- " normalize=normalize,\n",
- " warn_not_found_words=warn_not_found_words,\n",
- " )\n",
- "\n",
- " # if there is any/some set has less words than the allowed limit,\n",
- " # return the default value (nan)\n",
- " if embeddings is None:\n",
- " return {\n",
- " 'query_name': query.query_name, # the name of the evaluated query\n",
- " 'result': np.nan, # the result of the metric\n",
- " 'em': np.nan, # result of the calculated metric (recommended)\n",
- " 'other_metric' : np.nan, # another metric calculated (optional)\n",
- " 'results_by_word' : np.nan, # if available, values by word (optional)\n",
- " # ...\n",
- " }\n",
- "\n",
- " # get the targets and attribute sets transformed into embeddings.\n",
- " target_sets, attribute_sets = embeddings\n",
- "\n",
- " # commonly, you only will need the embeddings of the sets.\n",
- " # this can be obtained by using:\n",
- " target_embeddings = list(target_sets.values())\n",
- " attribute_embeddings = list(attribute_sets.values())\n",
- "\n",
- " result = self._calc_metric(target_embeddings, attribute_embeddings)\n",
- "\n",
- " # return the results.\n",
- " return {\"query_name\": query.query_name, \"result\": result, 'em': result}"
- ],
- "outputs": [],
- "metadata": {
- "ExecuteTime": {
- "end_time": "2020-12-29T18:24:32.343454Z",
- "start_time": "2020-12-29T18:24:32.326425Z"
- }
- }
- },
- {
- "cell_type": "markdown",
- "source": [
- "Now, let's try it out:"
- ],
- "metadata": {}
- },
- {
- "cell_type": "code",
- "execution_count": 6,
- "source": [
- "from wefe.query import Query\n",
- "from wefe.utils import load_test_model # a few embeddings of WEAT experiments\n",
- "from wefe.datasets.datasets import load_weat # the word sets of WEAT experiments\n",
- "\n",
- "weat = load_weat()\n",
- "model = load_test_model()\n",
- "\n",
- "flowers = weat['flowers']\n",
- "weapons = weat['weapons']\n",
- "pleasant = weat['pleasant_5']\n",
- "query = Query([flowers, weapons], [pleasant], ['Flowers', 'Weapons'],\n",
- " ['Pleasant'])\n",
- "\n",
- "\n",
- "results = ExampleMetric().run_query(query, model)\n",
- "print(results)"
- ],
- "outputs": [
- {
- "output_type": "stream",
- "name": "stderr",
- "text": [
- "INFO:gensim.utils:loading KeyedVectors object from /home/pablo/wefe/wefe/datasets/data/test_model.kv\n",
- "DEBUG:smart_open.smart_open_lib:{'uri': '/home/pablo/wefe/wefe/datasets/data/test_model.kv', 'mode': 'rb', 'buffering': -1, 'encoding': None, 'errors': None, 'newline': None, 'closefd': True, 'opener': None, 'ignore_ext': False, 'transport_params': None}\n",
- "INFO:gensim.utils:setting ignored attribute vectors_norm to None\n",
- "DEBUG:gensim.utils:starting a new internal lifecycle event log for KeyedVectors\n",
- "INFO:gensim.utils:KeyedVectors lifecycle event {'fname': '/home/pablo/wefe/wefe/datasets/data/test_model.kv', 'datetime': '2021-08-13T11:43:41.890605', 'gensim': '4.0.1', 'python': '3.7.10 (default, Jun 4 2021, 14:48:32) \\n[GCC 7.5.0]', 'platform': 'Linux-5.10.16.3-microsoft-standard-WSL2-x86_64-with-debian-bullseye-sid', 'event': 'loaded'}\n"
- ]
- },
- {
- "output_type": "stream",
- "name": "stdout",
- "text": [
- "{'query_name': 'Flowers and Weapons wrt Pleasant', 'result': -0.10210171341896057, 'em': -0.10210171341896057}\n"
- ]
- }
- ],
- "metadata": {
- "ExecuteTime": {
- "end_time": "2020-12-29T18:24:32.475099Z",
- "start_time": "2020-12-29T18:24:32.345453Z"
- }
- }
- },
- {
- "cell_type": "markdown",
- "source": [
- "\n",
- "We have completely defined a new metric.\n",
- "Congratulations!\n",
- "\n",
- "\n",
- "**Note**\n",
- "\n",
- "Some comments regarding the implementation of new metrics:\n",
- "\n",
- "- Note that the returned object must necessarily be a ``dict`` instance \n",
- " containing the ``result`` and ``query_name`` key-values. Otherwise you \n",
- " will not be able to run query batches using utility functions like \n",
- " ``run_queries``.\n",
- "- ``run_query`` can receive additional parameters. Simply add them to the \n",
- " function signature. These parameters can also be used when running the \n",
- " metric from the ``run_queries`` utility function.\n",
- "- We recommend implementing the logic of the metric separated from the \n",
- " ``run_query`` function. In other words, implement the logic in a \n",
- " ``calc_your_metric`` function that receives the dictionaries with the \n",
- " necessary embeddings and parameters.\n",
- "- The file where ``ExampleMetric`` is located can be found inside the \n",
- " distances folder of the [repository](https://github.com/dccuchile/wefe/blob/master/wefe/metrics/example_metric.py/)\n",
- "\n"
- ],
- "metadata": {}
- },
- {
- "cell_type": "markdown",
- "source": [
- "# Mitigation Method Implementation Guide"
- ],
- "metadata": {}
- }
- ],
- "metadata": {
- "kernelspec": {
- "name": "python3",
- "display_name": "Python 3.7.10 64-bit ('wefe': conda)"
- },
- "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.7.10"
- },
- "toc": {
- "base_numbering": 1,
- "nav_menu": {},
- "number_sections": true,
- "sideBar": true,
- "skip_h1_title": false,
- "title_cell": "Table of Contents",
- "title_sidebar": "Contents",
- "toc_cell": false,
- "toc_position": {},
- "toc_section_display": true,
- "toc_window_display": false
- },
- "varInspector": {
- "cols": {
- "lenName": 16,
- "lenType": 16,
- "lenVar": 40
- },
- "kernels_config": {
- "python": {
- "delete_cmd_postfix": "",
- "delete_cmd_prefix": "del ",
- "library": "var_list.py",
- "varRefreshCmd": "print(var_dic_list())"
- },
- "r": {
- "delete_cmd_postfix": ") ",
- "delete_cmd_prefix": "rm(",
- "library": "var_list.r",
- "varRefreshCmd": "cat(var_dic_list()) "
- }
- },
- "types_to_exclude": [
- "module",
- "function",
- "builtin_function_or_method",
- "instance",
- "_Feature"
- ],
- "window_display": false
- },
- "interpreter": {
- "hash": "d84ebd0cc0ccc3ceb6e99e895c29aecce94e907fb1f0ef7f0ceb697eb7e914cf"
- }
- },
- "nbformat": 4,
- "nbformat_minor": 4
+ "nbformat": 4,
+ "nbformat_minor": 4
}
\ No newline at end of file
diff --git a/examples/measurement_user_guide.ipynb b/examples/measurement_user_guide.ipynb
new file mode 100644
index 0000000..e22d29d
--- /dev/null
+++ b/examples/measurement_user_guide.ipynb
@@ -0,0 +1,2128 @@
+{
+ "cells": [
+ {
+ "cell_type": "raw",
+ "metadata": {},
+ "source": [
+ ".. _bias measurement:\n",
+ "\n",
+ "Bias Measurement\n",
+ "================\n",
+ "\n",
+ "The following guide is designed to present the more general details on\n",
+ "using the package to measure bias. The following sections show:\n",
+ "\n",
+ "* how to run a simple query using ``Glove`` embedding model.\n",
+ "* how to run multiple queries on multiple embeddings.\n",
+ "* how to compare the results obtained from running multiple\n",
+ " sets of queries on multiple embeddings using different metrics\n",
+ " through ranking calculation.\n",
+ "* how to calculate the correlations between the\n",
+ " rankings obtained.\n",
+ "\n",
+ ".. warning::\n",
+ "\n",
+ " To accurately study and reduce biases contained in word embeddings, queries may\n",
+ " contain words that could be offensive to certain groups or individuals.\n",
+ " The relationships studied between these words DO NOT represent the\n",
+ " ideas, thoughts or beliefs of the authors of this library. \n",
+ " This warning applies to all documentation.\n",
+ "\n",
+ ".. note::\n",
+ "\n",
+ " If you are not familiar with the concepts of query, target and attribute\n",
+ " set, please visit the :ref:`measurement framework`\n",
+ " on the library’s conceptual guides. These concepts are widely used in the\n",
+ " following sections.\n",
+ "\n",
+ ".. note::\n",
+ "\n",
+ " For a list of metrics implemented in WEFE, refer to the\n",
+ " :ref:`metrics section` of the API reference. \n"
+ ]
+ },
+ {
+ "cell_type": "raw",
+ "metadata": {},
+ "source": [
+ "Run a Query\n",
+ "-----------\n",
+ "\n",
+ "The following subsections explains how to run a simple query that\n",
+ "measures gender bias on\n",
+ "`Glove `_. The example uses\n",
+ "the Word Embedding Association Test (:class:`~wefe.metrics.WEAT.WEAT`) metric\n",
+ "quantifying the bias in the embeddings model. Below we show the three usual steps for\n",
+ "performing a query in WEFE:\n",
+ "\n",
+ ".. note::\n",
+ "\n",
+ " :class:`~wefe.metrics.WEAT.WEAT` is a fairness metric that quantifies the relationship\n",
+ " between two sets of target words (sets of words intended to denote a social\n",
+ " groups as men and women) and two sets of attribute words (sets of words\n",
+ " representing some attitude, characteristic, trait, occupational field,\n",
+ " etc. that can be associated with individuals from any social group). \n",
+ "\n",
+ " The closer its value is to 0, the less biased the model is. \n",
+ "\n",
+ " Visit the metrics documentation (:class:`~wefe.metrics.WEAT.WEAT`) for more information.\n"
+ ]
+ },
+ {
+ "cell_type": "raw",
+ "metadata": {},
+ "source": [
+ "Load a word embeddings model as a ``WordEmbeddingModel`` object\n",
+ "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n",
+ "\n",
+ "Load the word embedding model and then wrap it using a\n",
+ ":class:`~wefe.word_embedding_model.WordEmbeddingModel` (class that allows WEFE to handle the models).\n",
+ "\n",
+ "WEFE bases all its operations on word embeddings using Gensim’s\n",
+ "``KeyedVectors`` interface. Any model that can be loaded using\n",
+ "``KeyedVectors`` will be compatible with WEFE. The following example uses a 25-dim pre-trained ``Glove`` model using a\n",
+ "twitter dataset loaded using `gensim-data `_."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 1,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "import plotly.io as pio\n",
+ "png_renderer = pio.renderers[\"png\"]\n",
+ "png_renderer.scale = 2\n",
+ "\n",
+ "pio.renderers.default = \"png\"\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 2,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "Renderers configuration\n",
+ "-----------------------\n",
+ " Default renderer: 'png'\n",
+ " Available renderers:\n",
+ " ['plotly_mimetype', 'jupyterlab', 'nteract', 'vscode',\n",
+ " 'notebook', 'notebook_connected', 'kaggle', 'azure', 'colab',\n",
+ " 'cocalc', 'databricks', 'json', 'png', 'jpeg', 'jpg', 'svg',\n",
+ " 'pdf', 'browser', 'firefox', 'chrome', 'chromium', 'iframe',\n",
+ " 'iframe_connected', 'sphinx_gallery', 'sphinx_gallery_png']"
+ ]
+ },
+ "execution_count": 2,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "pio.renderers"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 3,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "import gensim.downloader as api\n",
+ "\n",
+ "from wefe.datasets import load_weat\n",
+ "from wefe.metrics import WEAT\n",
+ "from wefe.query import Query\n",
+ "from wefe.word_embedding_model import WordEmbeddingModel\n",
+ "\n",
+ "twitter_25 = api.load(\"glove-twitter-25\")\n",
+ "# WordEmbeddingModel receives as first argument a KeyedVectors model\n",
+ "# and the second argument the model name.\n",
+ "model = WordEmbeddingModel(twitter_25, \"glove twitter dim=25\")"
+ ]
+ },
+ {
+ "cell_type": "raw",
+ "metadata": {},
+ "source": [
+ "Create the query using a ``Query`` object\n",
+ "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n",
+ "\n",
+ "Define the target and attribute word sets and create a :class:`~wefe.query.Query` object\n",
+ "that contains them.\n",
+ "\n",
+ "For this initial example, a query is used to study the association\n",
+ "between gender with respect to family and career. The words used are\n",
+ "taken from the set of words used in the *Semantics derived automatically\n",
+ "from language corpora contain human-like biases* paper, which are\n",
+ "included in the ``datasets`` module."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 4,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ ""
+ ]
+ },
+ "execution_count": 4,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "gender_query = Query(\n",
+ " target_sets=[\n",
+ " [\"female\", \"woman\", \"girl\", \"sister\", \"she\", \"her\", \"hers\", \"daughter\"],\n",
+ " [\"male\", \"man\", \"boy\", \"brother\", \"he\", \"him\", \"his\", \"son\"],\n",
+ " ],\n",
+ " attribute_sets=[\n",
+ " [\n",
+ " \"home\",\n",
+ " \"parents\",\n",
+ " \"children\",\n",
+ " \"family\",\n",
+ " \"cousins\",\n",
+ " \"marriage\",\n",
+ " \"wedding\",\n",
+ " \"relatives\",\n",
+ " ],\n",
+ " [\n",
+ " \"executive\",\n",
+ " \"management\",\n",
+ " \"professional\",\n",
+ " \"corporation\",\n",
+ " \"salary\",\n",
+ " \"office\",\n",
+ " \"business\",\n",
+ " \"career\",\n",
+ " ],\n",
+ " ],\n",
+ " target_sets_names=[\"Female terms\", \"Male Terms\"],\n",
+ " attribute_sets_names=[\"Family\", \"Careers\"],\n",
+ ")\n",
+ "\n",
+ "gender_query\n"
+ ]
+ },
+ {
+ "cell_type": "raw",
+ "metadata": {
+ "tags": []
+ },
+ "source": [
+ "Run the Query\n",
+ "~~~~~~~~~~~~~\n",
+ "\n",
+ "Instantiate the metric that you will use and then execute ``run_query``\n",
+ "with the parameters created in the previous steps.\n",
+ "\n",
+ "Any bias measurement process at WEFE consists of the following steps:\n",
+ "\n",
+ "1. Metric arguments checking.\n",
+ "2. Transform the word sets into word embeddings.\n",
+ "3. Calculate the metric.\n",
+ "\n",
+ "In this case we use the :class:`~wefe.metrics.WEAT.WEAT` metric (proposed in the\n",
+ "same paper of the set of words used in the query)."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 5,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "{'query_name': 'Female terms and Male Terms wrt Family and Careers',\n",
+ " 'result': 0.31658412935212255,\n",
+ " 'weat': 0.31658412935212255,\n",
+ " 'effect_size': 0.6779439085309583,\n",
+ " 'p_value': nan}"
+ ]
+ },
+ "execution_count": 5,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "metric = WEAT()\n",
+ "result = metric.run_query(gender_query, model)\n",
+ "result\n"
+ ]
+ },
+ {
+ "cell_type": "raw",
+ "metadata": {},
+ "source": [
+ "By default, the results are a ``dict`` containing the query name (in the\n",
+ "key ``query_name``) and the calculated value of the metric in the\n",
+ "``result`` key. It also contains a key with the name and the value of\n",
+ "the calculated metric (which is duplicated in the “results” key).\n",
+ "\n",
+ "Depending on the metric class used, the result ``dict`` can also return\n",
+ "more metrics, detailed word-by-word values or other statistics like\n",
+ "p-values. Also some metrics allow you to change the default value in\n",
+ "results.\n",
+ "\n",
+ "Details of all the metrics implemented, their parameters and\n",
+ "examples of execution can be found at :ref:`metrics section `."
+ ]
+ },
+ {
+ "cell_type": "raw",
+ "metadata": {},
+ "source": [
+ "Run Query Arguments\n",
+ "-------------------\n",
+ "\n",
+ "Each metric allows varying the behavior of ``run_query`` according to\n",
+ "different parameters. There are parameters to customize the\n",
+ "transformation of the sets of words to sets of embeddings, others to\n",
+ "warn errors or modify which calculation method the metric use.\n",
+ "\n",
+ ".. note::\n",
+ "\n",
+ " Each metric implements the ``run_query`` method with different arguments. \n",
+ " Visit their API documentation for more information.\n",
+ "\n",
+ "\n",
+ "For example, ``run_query`` can be instructed to ``return effect_size``\n",
+ "in the ``result`` key by setting ``return_effect_size`` as ``True``.\n",
+ "Note that this parameter is only of the class :class:`~wefe.metrics.WEAT.WEAT``.\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 6,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "{'query_name': 'Female terms and Male Terms wrt Family and Careers',\n",
+ " 'result': 0.6779439085309583,\n",
+ " 'weat': 0.31658412935212255,\n",
+ " 'effect_size': 0.6779439085309583,\n",
+ " 'p_value': nan}"
+ ]
+ },
+ "execution_count": 6,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "weat = WEAT()\n",
+ "result = weat.run_query(gender_query, model, return_effect_size=True)\n",
+ "result\n"
+ ]
+ },
+ {
+ "cell_type": "raw",
+ "metadata": {},
+ "source": [
+ "You can also request ``run_query`` to run the statistical significance\n",
+ "calculation by setting ``calculate_p_value`` as ``True``. This checks\n",
+ "how many queries generated from permutations (controlled by the\n",
+ "parameter ``p_value_iterations``) of the target sets obtain values\n",
+ "greater than those obtained by the original query."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 7,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "{'query_name': 'Female terms and Male Terms wrt Family and Careers',\n",
+ " 'result': 0.31658412935212255,\n",
+ " 'weat': 0.31658412935212255,\n",
+ " 'effect_size': 0.6779439085309583,\n",
+ " 'p_value': 0.08418316336732654}"
+ ]
+ },
+ "execution_count": 7,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "weat = WEAT()\n",
+ "result = weat.run_query(\n",
+ " gender_query, model, calculate_p_value=True, p_value_iterations=5000\n",
+ ")\n",
+ "result"
+ ]
+ },
+ {
+ "cell_type": "raw",
+ "metadata": {},
+ "source": [
+ "Out of Vocabulary Words and Word Preprocessors\n",
+ "----------------------------------------------\n",
+ "\n",
+ "It is common in the literature to find bias tests whose tagret sets are\n",
+ "common names of social groups. These names are commonly cased and may\n",
+ "contain special characters. There are several embedding models whose\n",
+ "words are not cased or do not have accents or other special characters,\n",
+ "as for example, in ``Glove``. This implies that a query with target sets\n",
+ "composed by names executed in ``Glove`` (without any preprocessing of\n",
+ "the words) could produce erroneous results because WEFE will not be able\n",
+ "to find the names in the model vocabulary.\n",
+ "\n",
+ ".. note::\n",
+ "\n",
+ " Some well-known word sets are already provided by the package and can be\n",
+ " easily loaded by the user through the :ref:`datasets ` module. From here on,\n",
+ " the tutorial use the words defined in the study *Semantics derived\n",
+ " automatically from language corpora contain human-like biases*, the same\n",
+ " that proposed the :class:`~wefe.metrics.WEAT.WEAT` metric.\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 8,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "['Adam', 'Harry', 'Josh', 'Roger', 'Alan', 'Frank', 'Justin', 'Ryan', 'Andrew', 'Jack', 'Matthew', 'Stephen', 'Brad', 'Greg', 'Paul', 'Jonathan', 'Peter', 'Amanda', 'Courtney', 'Heather', 'Melanie', 'Sara', 'Amber', 'Katie', 'Betsy', 'Kristin', 'Nancy', 'Stephanie', 'Ellen', 'Lauren', 'Colleen', 'Emily', 'Megan', 'Rachel']\n"
+ ]
+ }
+ ],
+ "source": [
+ "# load the weat word sets.\n",
+ "word_sets = load_weat()\n",
+ "\n",
+ "# print a set of european american common names.\n",
+ "print(word_sets[\"european_american_names_5\"])"
+ ]
+ },
+ {
+ "cell_type": "raw",
+ "metadata": {},
+ "source": [
+ "The following query compares European-American and African-American\n",
+ "names with respect to pleasant and unpleasant attributes.\n",
+ "\n",
+ ".. note::\n",
+ "\n",
+ " It can be indicated to ``run_query`` to log the words that were lost in\n",
+ " the transformation to vectors by using the parameter\n",
+ " ``warn_not_found_words`` as ``True``."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 9,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stderr",
+ "output_type": "stream",
+ "text": [
+ "WARNING:root:The following words from set 'European american names' do not exist within the vocabulary of glove twitter dim=25: ['Adam', 'Harry', 'Josh', 'Roger', 'Alan', 'Frank', 'Justin', 'Ryan', 'Andrew', 'Jack', 'Matthew', 'Stephen', 'Brad', 'Greg', 'Paul', 'Jonathan', 'Peter', 'Amanda', 'Courtney', 'Heather', 'Melanie', 'Sara', 'Amber', 'Katie', 'Betsy', 'Kristin', 'Nancy', 'Stephanie', 'Ellen', 'Lauren', 'Colleen', 'Emily', 'Megan', 'Rachel']\n",
+ "WARNING:root:The transformation of 'European american names' into glove twitter dim=25 embeddings lost proportionally more words than specified in 'lost_words_threshold': 1.0 lost with respect to 0.2 maximum loss allowed.\n",
+ "WARNING:root:The following words from set 'African american names' do not exist within the vocabulary of glove twitter dim=25: ['Alonzo', 'Jamel', 'Theo', 'Alphonse', 'Jerome', 'Leroy', 'Torrance', 'Darnell', 'Lamar', 'Lionel', 'Tyree', 'Deion', 'Lamont', 'Malik', 'Terrence', 'Tyrone', 'Lavon', 'Marcellus', 'Wardell', 'Nichelle', 'Shereen', 'Ebony', 'Latisha', 'Shaniqua', 'Jasmine', 'Tanisha', 'Tia', 'Lakisha', 'Latoya', 'Yolanda', 'Malika', 'Yvette']\n",
+ "WARNING:root:The transformation of 'African american names' into glove twitter dim=25 embeddings lost proportionally more words than specified in 'lost_words_threshold': 1.0 lost with respect to 0.2 maximum loss allowed.\n",
+ "ERROR:root:At least one set of 'European american names and African american names wrt Pleasant and Unpleasant' query has proportionally fewer embeddings than allowed by the lost_vocabulary_threshold parameter (0.2). This query will return np.nan.\n"
+ ]
+ },
+ {
+ "data": {
+ "text/plain": [
+ "{'query_name': 'European american names and African american names wrt Pleasant and Unpleasant',\n",
+ " 'result': nan,\n",
+ " 'weat': nan,\n",
+ " 'effect_size': nan}"
+ ]
+ },
+ "execution_count": 9,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "ethnicity_query = Query(\n",
+ " [word_sets[\"european_american_names_5\"], word_sets[\"african_american_names_5\"]],\n",
+ " [word_sets[\"pleasant_5\"], word_sets[\"unpleasant_5\"]],\n",
+ " [\"European american names\", \"African american names\"],\n",
+ " [\"Pleasant\", \"Unpleasant\"],\n",
+ ")\n",
+ "result = weat.run_query(ethnicity_query, model, warn_not_found_words=True,)\n",
+ "result\n"
+ ]
+ },
+ {
+ "cell_type": "raw",
+ "metadata": {},
+ "source": [
+ ".. warning::\n",
+ "\n",
+ " If more than 20% of the words from any of the word sets of the query are\n",
+ " lost during the transformation to embeddings, the result of the metric\n",
+ " will be ``np.nan``. This behavior can be changed using a float number\n",
+ " parameter called ``lost_vocabulary_threshold``."
+ ]
+ },
+ {
+ "cell_type": "raw",
+ "metadata": {},
+ "source": [
+ "Word Preprocessors\n",
+ "~~~~~~~~~~~~~~~~~~\n",
+ "\n",
+ "Any ``run_query`` method allows preprocessing each word before they are searched in the model's \n",
+ "vocabulary through the parameter ``preprocessors`` (list of one or more preprocessor).\n",
+ "This parameter accepts a list of individual preprocessors, which are defined below:\n",
+ "\n",
+ "A ``preprocessor`` is a dictionary that specifies what processing(s) are \n",
+ "performed on each word before its looked up in the model vocabulary.\n",
+ "For example, the ``preprocessor``\n",
+ "``{'lowecase': True, 'strip_accents': True}`` allows you to lowercase\n",
+ "and remove the accent from each word before searching for them in the\n",
+ "model vocabulary. Note that an empty dictionary ``{}`` indicates that no\n",
+ "preprocessing is done.\n",
+ "\n",
+ "The possible options for a preprocessor are:\n",
+ "\n",
+ "- ``lowercase``: ``bool``. Indicates that the words are transformed to lowercase.\n",
+ "- ``uppercase``: ``bool``. Indicates that the words are transformed to uppercase.\n",
+ "- ``titlecase``: ``bool``. Indicates that the words are transformed to titlecase.\n",
+ "- ``strip_accents``: ``bool``, ``{'ascii', 'unicode'}``: Specifies that the accents of the words\n",
+ " are eliminated. The stripping type can be specified. True uses 'unicode' by default.\n",
+ "- ``preprocessor``: ``Callable``. It receives a function that operates on each word. \n",
+ " In the case of specifying a function, it overrides the default preprocessor \n",
+ " (i.e., the previous options stop working).\n",
+ "\n",
+ "\n",
+ "A list of preprocessor options allows searching for several\n",
+ "variants of the words into the model. For example, the preprocessors\n",
+ "``[{}, {\"lowercase\": True, \"strip_accents\": True}]``\n",
+ "``{}`` allows searching first for the original words in the vocabulary of the model. \n",
+ "In case some of them are not found, ``{\"lowercase\": True, \"strip_accents\": True}`` \n",
+ "is executed on these words and then they are searched in the model vocabulary.\n",
+ "\n",
+ "By default (in case there is more than one preprocessor in the list) the first \n",
+ "preprocessed word found in the embeddings model is used. \n",
+ "This behavior can be controlled by the ``strategy`` parameter of ``run_query``.\n",
+ "\n",
+ "In the following example, we provide a list with only one\n",
+ "preprocessor that instructs ``run_query`` to lowercase and remove all\n",
+ "accents from every word before they are searched in the embeddings\n",
+ "model.\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 10,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stderr",
+ "output_type": "stream",
+ "text": [
+ "WARNING:root:The following words from set 'African american names' do not exist within the vocabulary of glove twitter dim=25: ['wardell']\n"
+ ]
+ },
+ {
+ "data": {
+ "text/plain": [
+ "{'query_name': 'European american names and African american names wrt Pleasant and Unpleasant',\n",
+ " 'result': 3.7529150679125456,\n",
+ " 'weat': 3.7529150679125456,\n",
+ " 'effect_size': 1.2746819330405683,\n",
+ " 'p_value': nan}"
+ ]
+ },
+ "execution_count": 10,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "weat = WEAT()\n",
+ "result = weat.run_query(\n",
+ " ethnicity_query,\n",
+ " model,\n",
+ " preprocessors=[{\"lowercase\": True, \"strip_accents\": True}],\n",
+ " warn_not_found_words=True,\n",
+ ")\n",
+ "result"
+ ]
+ },
+ {
+ "cell_type": "raw",
+ "metadata": {},
+ "source": [
+ "It may happen that it is more important to find the original word and in\n",
+ "the case of not finding it, then preprocess it and look it up in the\n",
+ "vocabulary. This behavior can be specified in ``preprocessors`` list by\n",
+ "first specifying an empty preprocessor ``{}`` and then the preprocessor\n",
+ "that converts to lowercase and removes accents.\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 11,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stderr",
+ "output_type": "stream",
+ "text": [
+ "WARNING:root:The following words from set 'European american names' do not exist within the vocabulary of glove twitter dim=25: ['Adam', 'Harry', 'Josh', 'Roger', 'Alan', 'Frank', 'Justin', 'Ryan', 'Andrew', 'Jack', 'Matthew', 'Stephen', 'Brad', 'Greg', 'Paul', 'Jonathan', 'Peter', 'Amanda', 'Courtney', 'Heather', 'Melanie', 'Sara', 'Amber', 'Katie', 'Betsy', 'Kristin', 'Nancy', 'Stephanie', 'Ellen', 'Lauren', 'Colleen', 'Emily', 'Megan', 'Rachel']\n",
+ "WARNING:root:The following words from set 'African american names' do not exist within the vocabulary of glove twitter dim=25: ['Alonzo', 'Jamel', 'Theo', 'Alphonse', 'Jerome', 'Leroy', 'Torrance', 'Darnell', 'Lamar', 'Lionel', 'Tyree', 'Deion', 'Lamont', 'Malik', 'Terrence', 'Tyrone', 'Lavon', 'Marcellus', 'Wardell', 'wardell', 'Nichelle', 'Shereen', 'Ebony', 'Latisha', 'Shaniqua', 'Jasmine', 'Tanisha', 'Tia', 'Lakisha', 'Latoya', 'Yolanda', 'Malika', 'Yvette']\n"
+ ]
+ },
+ {
+ "data": {
+ "text/plain": [
+ "{'query_name': 'European american names and African american names wrt Pleasant and Unpleasant',\n",
+ " 'result': 3.7529150679125456,\n",
+ " 'weat': 3.7529150679125456,\n",
+ " 'effect_size': 1.2746819330405683,\n",
+ " 'p_value': nan}"
+ ]
+ },
+ "execution_count": 11,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "weat = WEAT()\n",
+ "result = weat.run_query(\n",
+ " ethnicity_query,\n",
+ " model,\n",
+ " preprocessors=[\n",
+ " {}, # empty preprocessor, search for the original words.\n",
+ " {\n",
+ " \"lowercase\": True,\n",
+ " \"strip_accents\": True,\n",
+ " }, # search for lowercase and no accent words.\n",
+ " ],\n",
+ " warn_not_found_words=True,\n",
+ ")\n",
+ "\n",
+ "result"
+ ]
+ },
+ {
+ "cell_type": "raw",
+ "metadata": {},
+ "source": [
+ "The number of preprocessing steps can be increased as needed. For\n",
+ "example, we can complex the above preprocessor to first search for the\n",
+ "original words, then for the lowercase words, and finally for the\n",
+ "lowercase words without accents.\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 12,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stderr",
+ "output_type": "stream",
+ "text": [
+ "WARNING:root:The following words from set 'European american names' do not exist within the vocabulary of glove twitter dim=25: ['Adam', 'Harry', 'Josh', 'Roger', 'Alan', 'Frank', 'Justin', 'Ryan', 'Andrew', 'Jack', 'Matthew', 'Stephen', 'Brad', 'Greg', 'Paul', 'Jonathan', 'Peter', 'Amanda', 'Courtney', 'Heather', 'Melanie', 'Sara', 'Amber', 'Katie', 'Betsy', 'Kristin', 'Nancy', 'Stephanie', 'Ellen', 'Lauren', 'Colleen', 'Emily', 'Megan', 'Rachel']\n",
+ "WARNING:root:The following words from set 'African american names' do not exist within the vocabulary of glove twitter dim=25: ['Alonzo', 'Jamel', 'Theo', 'Alphonse', 'Jerome', 'Leroy', 'Torrance', 'Darnell', 'Lamar', 'Lionel', 'Tyree', 'Deion', 'Lamont', 'Malik', 'Terrence', 'Tyrone', 'Lavon', 'Marcellus', 'Wardell', 'wardell', 'wardell', 'Nichelle', 'Shereen', 'Ebony', 'Latisha', 'Shaniqua', 'Jasmine', 'Tanisha', 'Tia', 'Lakisha', 'Latoya', 'Yolanda', 'Malika', 'Yvette']\n"
+ ]
+ },
+ {
+ "data": {
+ "text/plain": [
+ "{'query_name': 'European american names and African american names wrt Pleasant and Unpleasant',\n",
+ " 'result': 3.7529150679125456,\n",
+ " 'weat': 3.7529150679125456,\n",
+ " 'effect_size': 1.2746819330405683,\n",
+ " 'p_value': nan}"
+ ]
+ },
+ "execution_count": 12,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "weat = WEAT()\n",
+ "result = weat.run_query(\n",
+ " ethnicity_query,\n",
+ " model,\n",
+ " preprocessors=[\n",
+ " {}, # first step: empty preprocessor, search for the original words.\n",
+ " {\"lowercase\": True,}, # second step: search for lowercase.\n",
+ " {\n",
+ " \"lowercase\": True,\n",
+ " \"strip_accents\": True,\n",
+ " }, # third step: search for lowercase and no accent words.\n",
+ " ],\n",
+ " warn_not_found_words=True,\n",
+ ")\n",
+ "\n",
+ "result"
+ ]
+ },
+ {
+ "cell_type": "raw",
+ "metadata": {},
+ "source": [
+ "It is also possible to change the behavior of the search by including\n",
+ "not only the first word, but all the words generated by the\n",
+ "preprocessors. This can be controlled by specifying the parameter\n",
+ "``strategy=all``."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 13,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stderr",
+ "output_type": "stream",
+ "text": [
+ "WARNING:root:The following words from set 'European american names' do not exist within the vocabulary of glove twitter dim=25: ['Adam', 'ADAM', 'Harry', 'HARRY', 'Josh', 'JOSH', 'Roger', 'ROGER', 'Alan', 'ALAN', 'Frank', 'FRANK', 'Justin', 'JUSTIN', 'Ryan', 'RYAN', 'Andrew', 'ANDREW', 'Jack', 'JACK', 'Matthew', 'MATTHEW', 'Stephen', 'STEPHEN', 'Brad', 'BRAD', 'Greg', 'GREG', 'Paul', 'PAUL', 'Jonathan', 'JONATHAN', 'Peter', 'PETER', 'Amanda', 'AMANDA', 'Courtney', 'COURTNEY', 'Heather', 'HEATHER', 'Melanie', 'MELANIE', 'Sara', 'SARA', 'Amber', 'AMBER', 'Katie', 'KATIE', 'Betsy', 'BETSY', 'Kristin', 'KRISTIN', 'Nancy', 'NANCY', 'Stephanie', 'STEPHANIE', 'Ellen', 'ELLEN', 'Lauren', 'LAUREN', 'Colleen', 'COLLEEN', 'Emily', 'EMILY', 'Megan', 'MEGAN', 'Rachel', 'RACHEL']\n",
+ "WARNING:root:The following words from set 'African american names' do not exist within the vocabulary of glove twitter dim=25: ['Alonzo', 'ALONZO', 'Jamel', 'JAMEL', 'Theo', 'THEO', 'Alphonse', 'ALPHONSE', 'Jerome', 'JEROME', 'Leroy', 'LEROY', 'Torrance', 'TORRANCE', 'Darnell', 'DARNELL', 'Lamar', 'LAMAR', 'Lionel', 'LIONEL', 'Tyree', 'TYREE', 'Deion', 'DEION', 'Lamont', 'LAMONT', 'Malik', 'MALIK', 'Terrence', 'TERRENCE', 'Tyrone', 'TYRONE', 'Lavon', 'LAVON', 'Marcellus', 'MARCELLUS', 'Wardell', 'wardell', 'WARDELL', 'Nichelle', 'NICHELLE', 'Shereen', 'SHEREEN', 'Ebony', 'EBONY', 'Latisha', 'LATISHA', 'Shaniqua', 'SHANIQUA', 'Jasmine', 'JASMINE', 'Tanisha', 'TANISHA', 'Tia', 'TIA', 'Lakisha', 'LAKISHA', 'Latoya', 'LATOYA', 'Yolanda', 'YOLANDA', 'Malika', 'MALIKA', 'Yvette', 'YVETTE']\n",
+ "WARNING:root:The following words from set 'Pleasant' do not exist within the vocabulary of glove twitter dim=25: ['CARESS', 'FREEDOM', 'HEALTH', 'LOVE', 'PEACE', 'CHEER', 'FRIEND', 'HEAVEN', 'LOYAL', 'PLEASURE', 'DIAMOND', 'GENTLE', 'HONEST', 'LUCKY', 'RAINBOW', 'DIPLOMA', 'GIFT', 'HONOR', 'MIRACLE', 'SUNRISE', 'FAMILY', 'HAPPY', 'LAUGHTER', 'PARADISE', 'VACATION']\n",
+ "WARNING:root:The following words from set 'Unpleasant' do not exist within the vocabulary of glove twitter dim=25: ['ABUSE', 'CRASH', 'FILTH', 'MURDER', 'SICKNESS', 'ACCIDENT', 'DEATH', 'GRIEF', 'POISON', 'STINK', 'ASSAULT', 'DISASTER', 'HATRED', 'POLLUTE', 'TRAGEDY', 'DIVORCE', 'JAIL', 'POVERTY', 'UGLY', 'CANCER', 'KILL', 'ROTTEN', 'VOMIT', 'AGONY', 'PRISON']\n"
+ ]
+ },
+ {
+ "data": {
+ "text/plain": [
+ "{'query_name': 'European american names and African american names wrt Pleasant and Unpleasant',\n",
+ " 'result': 3.7529150679125456,\n",
+ " 'weat': 3.7529150679125456,\n",
+ " 'effect_size': 1.2746819330405683,\n",
+ " 'p_value': nan}"
+ ]
+ },
+ "execution_count": 13,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "weat = WEAT()\n",
+ "result = weat.run_query(\n",
+ " ethnicity_query,\n",
+ " model,\n",
+ " preprocessors=[\n",
+ " {}, # first step: empty preprocessor, search for the original words.\n",
+ " {\"lowercase\": True,}, # second step: search for lowercase .\n",
+ " {\"uppercase\": True,}, # third step: search for uppercase.\n",
+ " ],\n",
+ " strategy=\"all\",\n",
+ " warn_not_found_words=True,\n",
+ ")\n",
+ "\n",
+ "result\n"
+ ]
+ },
+ {
+ "cell_type": "raw",
+ "metadata": {},
+ "source": [
+ "Running Multiple Queries\n",
+ "------------------------\n",
+ "\n",
+ "It is usual to want to test many queries of some bias criterion (gender,\n",
+ "ethnicity, religion, politics, socioeconomic, among others) on several\n",
+ "models at the same time. Trying to use ``run_query`` on each pair\n",
+ "embedding-query can be a bit complex and could require extra work to\n",
+ "implement.\n",
+ "\n",
+ "This is why WEFE also implements a function to test multiple\n",
+ "queries on various word embedding models in a single call: the\n",
+ ":func:`~wefe.utils.run_queries` util.\n",
+ "\n",
+ "The following code shows how to run various gender queries on ``Glove``\n",
+ "embedding models with different dimensions trained from the Twitter\n",
+ "dataset. The queries are executed using :class:`~wefe.metrics.WEAT.WEAT` metric."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 14,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "import gensim.downloader as api\n",
+ "\n",
+ "from wefe.datasets import load_weat\n",
+ "from wefe.metrics import RNSB, WEAT\n",
+ "from wefe.query import Query\n",
+ "from wefe.utils import run_queries\n",
+ "from wefe.word_embedding_model import WordEmbeddingModel"
+ ]
+ },
+ {
+ "cell_type": "raw",
+ "metadata": {},
+ "source": [
+ "Load the models\n",
+ "~~~~~~~~~~~~~~~\n",
+ "\n",
+ "Load three different Glove Twitter embedding models. These models were\n",
+ "trained using the same dataset varying the number of embedding\n",
+ "dimensions."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 15,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "model_1 = WordEmbeddingModel(api.load(\"glove-twitter-25\"), \"glove twitter dim=25\")\n",
+ "model_2 = WordEmbeddingModel(api.load(\"glove-twitter-50\"), \"glove twitter dim=50\")\n",
+ "model_3 = WordEmbeddingModel(api.load(\"glove-twitter-100\"), \"glove twitter dim=100\")\n",
+ "\n",
+ "models = [model_1, model_2, model_3]\n",
+ "\n"
+ ]
+ },
+ {
+ "cell_type": "raw",
+ "metadata": {},
+ "source": [
+ "Load the word sets and create the queries\n",
+ "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n",
+ "\n",
+ "Now, we load the :class:`~wefe.metrics.WEAT.WEAT` word set and create three queries. The\n",
+ "three queries are intended to measure gender bias.\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 16,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# Load the WEAT word sets\n",
+ "word_sets = load_weat()\n",
+ "\n",
+ "# Create gender queries\n",
+ "gender_query_1 = Query(\n",
+ " [word_sets[\"male_terms\"], word_sets[\"female_terms\"]],\n",
+ " [word_sets[\"career\"], word_sets[\"family\"]],\n",
+ " [\"Male terms\", \"Female terms\"],\n",
+ " [\"Career\", \"Family\"],\n",
+ ")\n",
+ "\n",
+ "gender_query_2 = Query(\n",
+ " [word_sets[\"male_terms\"], word_sets[\"female_terms\"]],\n",
+ " [word_sets[\"science\"], word_sets[\"arts\"]],\n",
+ " [\"Male terms\", \"Female terms\"],\n",
+ " [\"Science\", \"Arts\"],\n",
+ ")\n",
+ "\n",
+ "gender_query_3 = Query(\n",
+ " [word_sets[\"male_terms\"], word_sets[\"female_terms\"]],\n",
+ " [word_sets[\"math\"], word_sets[\"arts_2\"]],\n",
+ " [\"Male terms\", \"Female terms\"],\n",
+ " [\"Math\", \"Arts\"],\n",
+ ")\n",
+ "\n",
+ "gender_queries = [gender_query_1, gender_query_2, gender_query_3]\n"
+ ]
+ },
+ {
+ "cell_type": "raw",
+ "metadata": {},
+ "source": [
+ "Run the queries on all Word Embeddings using WEAT\n",
+ "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n",
+ "\n",
+ "To run the list of queries and models, we call :func:`~wefe.utils.run_queries` using the\n",
+ "parameters defined in the previous step. The mandatory parameters of the\n",
+ "function are 3:\n",
+ "\n",
+ "- a metric,\n",
+ "- a list of queries, and,\n",
+ "- a list of embedding models.\n",
+ "\n",
+ "It is also possible to provide a name for the criterion studied in this\n",
+ "set of queries through the parameter ``queries_set_name``.\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 17,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stderr",
+ "output_type": "stream",
+ "text": [
+ "WARNING:root:The transformation of 'Science' into glove twitter dim=25 embeddings lost proportionally more words than specified in 'lost_words_threshold': 0.25 lost with respect to 0.2 maximum loss allowed.\n",
+ "ERROR:root:At least one set of 'Male terms and Female terms wrt Science and Arts' query has proportionally fewer embeddings than allowed by the lost_vocabulary_threshold parameter (0.2). This query will return np.nan.\n",
+ "WARNING:root:The transformation of 'Science' into glove twitter dim=50 embeddings lost proportionally more words than specified in 'lost_words_threshold': 0.25 lost with respect to 0.2 maximum loss allowed.\n",
+ "ERROR:root:At least one set of 'Male terms and Female terms wrt Science and Arts' query has proportionally fewer embeddings than allowed by the lost_vocabulary_threshold parameter (0.2). This query will return np.nan.\n",
+ "WARNING:root:The transformation of 'Science' into glove twitter dim=100 embeddings lost proportionally more words than specified in 'lost_words_threshold': 0.25 lost with respect to 0.2 maximum loss allowed.\n",
+ "ERROR:root:At least one set of 'Male terms and Female terms wrt Science and Arts' query has proportionally fewer embeddings than allowed by the lost_vocabulary_threshold parameter (0.2). This query will return np.nan.\n"
+ ]
+ },
+ {
+ "data": {
+ "text/html": [
+ "
\n",
+ "\n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
query_name
\n",
+ "
Male terms and Female terms wrt Career and Family
\n",
+ "
Male terms and Female terms wrt Science and Arts
\n",
+ "
Male terms and Female terms wrt Math and Arts
\n",
+ "
\n",
+ "
\n",
+ "
model_name
\n",
+ "
\n",
+ "
\n",
+ "
\n",
+ "
\n",
+ " \n",
+ " \n",
+ "
\n",
+ "
glove twitter dim=25
\n",
+ "
0.316584
\n",
+ "
NaN
\n",
+ "
-0.022133
\n",
+ "
\n",
+ "
\n",
+ "
glove twitter dim=50
\n",
+ "
0.363743
\n",
+ "
NaN
\n",
+ "
-0.272334
\n",
+ "
\n",
+ "
\n",
+ "
glove twitter dim=100
\n",
+ "
0.385352
\n",
+ "
NaN
\n",
+ "
-0.082544
\n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ "query_name Male terms and Female terms wrt Career and Family \\\n",
+ "model_name \n",
+ "glove twitter dim=25 0.316584 \n",
+ "glove twitter dim=50 0.363743 \n",
+ "glove twitter dim=100 0.385352 \n",
+ "\n",
+ "query_name Male terms and Female terms wrt Science and Arts \\\n",
+ "model_name \n",
+ "glove twitter dim=25 NaN \n",
+ "glove twitter dim=50 NaN \n",
+ "glove twitter dim=100 NaN \n",
+ "\n",
+ "query_name Male terms and Female terms wrt Math and Arts \n",
+ "model_name \n",
+ "glove twitter dim=25 -0.022133 \n",
+ "glove twitter dim=50 -0.272334 \n",
+ "glove twitter dim=100 -0.082544 "
+ ]
+ },
+ "execution_count": 17,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "WEAT_gender_results = run_queries(\n",
+ " WEAT, gender_queries, models, queries_set_name=\"Gender Queries\"\n",
+ ")\n",
+ "WEAT_gender_results\n"
+ ]
+ },
+ {
+ "cell_type": "raw",
+ "metadata": {},
+ "source": [
+ "Setting metric params\n",
+ "~~~~~~~~~~~~~~~~~~~~~\n",
+ "\n",
+ "There is a whole column that has no results. As the warnings point out,\n",
+ "when transforming the words of the sets into embeddings, there is a loss\n",
+ "of words that is greater than the allowed by the parameter\n",
+ "``lost_vocabulary_threshold``. In this case, it would be very useful to\n",
+ "use the word preprocessors seen above.\n",
+ "\n",
+ ":func:`~wefe.utils.run_queries`, accept specific parameters for each metric. These extra\n",
+ "parameters for the metric can be passed through ``metric_params``\n",
+ "parameter. In this case, a ``preprocessor`` is provided to lowercase the\n",
+ "words before searching for them in the models’ vocabularies.\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 18,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "
\n",
+ "\n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
query_name
\n",
+ "
Male terms and Female terms wrt Career and Family
\n",
+ "
Male terms and Female terms wrt Science and Arts
\n",
+ "
Male terms and Female terms wrt Math and Arts
\n",
+ "
\n",
+ "
\n",
+ "
model_name
\n",
+ "
\n",
+ "
\n",
+ "
\n",
+ "
\n",
+ " \n",
+ " \n",
+ "
\n",
+ "
glove twitter dim=25
\n",
+ "
0.316584
\n",
+ "
0.167431
\n",
+ "
-0.033912
\n",
+ "
\n",
+ "
\n",
+ "
glove twitter dim=50
\n",
+ "
0.363743
\n",
+ "
-0.084690
\n",
+ "
-0.307589
\n",
+ "
\n",
+ "
\n",
+ "
glove twitter dim=100
\n",
+ "
0.385352
\n",
+ "
0.099632
\n",
+ "
-0.155790
\n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ "query_name Male terms and Female terms wrt Career and Family \\\n",
+ "model_name \n",
+ "glove twitter dim=25 0.316584 \n",
+ "glove twitter dim=50 0.363743 \n",
+ "glove twitter dim=100 0.385352 \n",
+ "\n",
+ "query_name Male terms and Female terms wrt Science and Arts \\\n",
+ "model_name \n",
+ "glove twitter dim=25 0.167431 \n",
+ "glove twitter dim=50 -0.084690 \n",
+ "glove twitter dim=100 0.099632 \n",
+ "\n",
+ "query_name Male terms and Female terms wrt Math and Arts \n",
+ "model_name \n",
+ "glove twitter dim=25 -0.033912 \n",
+ "glove twitter dim=50 -0.307589 \n",
+ "glove twitter dim=100 -0.155790 "
+ ]
+ },
+ "execution_count": 18,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "WEAT_gender_results = run_queries(\n",
+ " WEAT,\n",
+ " gender_queries,\n",
+ " models,\n",
+ " metric_params={\"preprocessors\": [{\"lowercase\": True}]},\n",
+ " queries_set_name=\"Gender Queries\",\n",
+ ")\n",
+ "\n",
+ "WEAT_gender_results"
+ ]
+ },
+ {
+ "cell_type": "raw",
+ "metadata": {},
+ "source": [
+ "No query was null in these results.\n"
+ ]
+ },
+ {
+ "cell_type": "raw",
+ "metadata": {},
+ "source": [
+ "Plot the results in a barplot\n",
+ "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n",
+ "\n",
+ "The library also provides an easy way to plot the results obtained from\n",
+ "a ``run_queries`` execution into a `plotly `_ barplot."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 19,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "image/png": "iVBORw0KGgoAAAANSUhEUgAABXgAAAPoCAYAAABkvZZOAAAgAElEQVR4XuzddZxV1bvH8Wfo7i4FrvgTxUAUQQkBCQGRFEQapLu7u7ukOwRJQQERECVEEcFEEOnujvt61riPZ/rMntnM7OGz/rhX5uy9ztrvtQ7+/M46z/J79OjRI6EhgAACCCCAAAIIIIAAAggggAACCCCAAAIIuE7Aj4DXdXPGgBFAAAEEEEAAAQQQQAABBBBAAAEEEEAAASNAwMtCQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEXCpAwOvSiWPYCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAS9rAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQcKkAAa9LJ45hI4AAAggggAACCCCAAAIIIIAAAggggAACBLysAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAwKUCBLwunTiGjQACCCCAAAIIIIAAAggggAACCCCAAAIIEPCyBhBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAZcKEPC6dOIYNgIIIIAAAggggAACCCCAAAIIIIAAAgggQMDLGkAAAQQQQAABBBBAAAEEEEAAAQQQQAABBFwqQMDr0olj2AgggAACCCCAAAIIIIAAAggggAACCCCAAAEvawABBBBAAAEEEEAAAQQQQAABBBBAAAEEEHCpAAGvSyeOYSOAAAIIIIAAAggggAACCCCAAAIIIIAAAgS8rAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQMClAgS8Lp04ho0AAggggAACCCCAAAIIIIAAAggggAACCBDwsgYQQAABBBBAAAEEEEAAAQQQQAABBBBAAAGXChDwunTiGDYCCCCAAAIIIIAAAggggAACCCCAAAIIIEDAyxpAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQRcKkDA69KJY9gIIIAAAggggAACCCCAAAIIIIAAAggggAABL2sAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBwqQABr0snjmEjgAACCCCAAAIIIIAAAggggAACCCCAAAIEvKwBBBBAAAEEEEAAAQQQQAABBBBAAAEEEEDApQIEvC6dOIaNAAIIIIAAAggggAACCCCAAAIIIIAAAggQ8LIGEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABlwoQ8Lp04hg2AggggAACCCCAAAIIIIAAAggggAACCCBAwMsaQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEXCpAwOvSiWPYCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAS9rAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQcKkAAa9LJ45hI4AAAggggAACCCCAAAIIIIAAAggggAACBLysAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAwKUCBLwunTiGjQACCCCAAAIIIIAAAggggAACCCCAAAIIEPCyBhBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAZcKEPC6dOIYNgIIIIAAAggggAACCCCAAAIIIIAAAgggQMDLGkAAAQQQQAABBBBAAAEEEEAAAQQQQAABBFwqQMDr0olj2AgggAACCCCAAAIIIIAAAggggAACCCCAAAEvawABBBBAAAEEEEAAAQQQQAABBBBAAAEEEHCpAAGvSyeOYSOAAAIIIIAAAggggAACCCCAAAIIIIAAAgS8rAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQMClAgS8Lp04ho0AAggggAACCCCAAAIIIIAAAggggAACCBDwsgYQQAABBBBAAAEEEEAAAQQQQAABBBBAAAGXChDwunTiGDYCCCCAAAIIIIAAAggggAACCCCAAAIIIEDAyxpAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQRcKkDA69KJY9gIIIAAAggggAACCCCAAAIIIIAAAggggAABL2sAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBwqQABr0snjmEjgAACCCCAAAIIIIAAAggggAACCCCAAAIEvKwBBBBAAAEEEEAAAQQQQAABBBBAAAEEEEDApQIEvC6dOIaNAAIIIIAAAggggAACCCCAAAIIIIAAAggQ8LIGEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABlwoQ8Lp04hg2AggggAACCCCAAAIIIIAAAggggAACCCBAwMsaQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEXCpAwOvSiWPYCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAS9rAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQcKkAAa9LJ45hI4AAAggggAACCCCAAAIIIIAAAggggAACBLysAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAwKUCBLwunTiGjQACCCCAAAIIIIAAAggggAACCCCAAAIIEPCyBhBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAZcKEPC6dOIYNgIIIIAAAggggAACCCCAAAIIIIAAAgggQMDLGkAAAQQQQAABBBBAAAEEEEAAAQQQQAABBFwqQMDr0olj2AgggAACCCCAAAIIIIAAAggggAACCCCAAAEvawABBBBAAAEEEEAAAQQQQAABBBBAAAEEEHCpAAGvSyeOYSOAAAIIIIAAAggggAACCCCAAAIIIIAAAgS8rAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQMClAgS8Lp04ho0AAggggAACCCCAAAIIIIAAAggggAACCBDwsgYQQAABBBBAAAEEEEAAAQQQQAABBBBAAAGXChDwunTiGDYCCCCAAAIIIIAAAggggAACCCCAAAIIIEDAyxpAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQRcKkDA69KJY9gIIIAAAggggAACCCCAAAIIIIAAAggggAABL2sAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBwqQABr0snjmEjgAACCCCAAAIIIIAAAggggAACCCCAAAIEvKwBBBBAAAEEEEAAAQQQQAABBBBAAAEEEEDApQIEvC6dOIaNAAIIIIAAAggggAACCCCAAAIIIIAAAggQ8LIGEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABlwoQ8Lp04hg2AggggAACCCCAAAIIIIAAAggggAACCCBAwMsaQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEXCpAwOvSiWPYCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAS9rAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQcKkAAa9LJ45hI4AAAggggAACCCCAAAIIIIAAAggggAACBLysAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAwKUCBLwunTiGjQACCCCAAAIIIIAAAggggAACCCCAAAIIEPCyBhBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAZcKEPC6dOIYNgIIIIAAAggggAACCCCAAAIIIIAAAgggQMDLGkAAAQQQQAABBBBAAAEEEEAAAQQQQAABBFwqQMDr0olj2AgggAACCCCAAAIIIIAAAggggAACCCCAAAEvawABBBBAAAEEEEAAAQQQQAABBBBAAAEEEHCpAAGvSyeOYSOAAAIIIIAAAggggAACCCCAAAIIIIAAAgS8rAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQMClAgS8Lp04ho0AAggggAACCCCAAAIIIIAAAggggAACCBDwsgYQQAABBBBAAAEEEEAAAQQQQAABBBBAAAGXChDwunTiGDYCCCCAAAIIIIAAAggggAACCCCAAAIIIEDAyxpAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQRcKkDA69KJY9gIIIAAAggggAACCCCAAAIIIIAAAggggAABL2sAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBwqQABr0snjmEjgAACCCCAAAIIIIAAAggggAACCCCAAAIEvKwBBBBAAAEEEEAAAQQQQAABBBBAAAEEEEDApQIEvC6dOIaNAAIIIIAAAggggAACCCCAAAIIIIAAAggQ8LIGEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABlwoQ8Lp04hg2AggggAACCCCAAAIIIIAAAggggAACCCBAwMsaQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEXCpAwOvSiWPYCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAS9rAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQcKkAAa9LJ45hI4AAAggggAACCCCAAAIIIIAAAggggAACBLysAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAwKUCBLwunTiGjQACCCCAAAIIIIAAAggggAACCCCAAAIIEPCyBhBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAZcKEPC6dOIYNgIIIIAAAggggAACCCCAAAIIIIAAAgggQMDLGkAAAQQQQAABBBBAAAEEEEAAAQQQQAABBFwqQMDr0olj2AgggAACCCCAAAIIIIAAAggggAACCCCAAAEvawABBBBAAAEEEEAAAQQQQAABBBBAAAEEEHCpAAGvSyeOYSOAAAIIIIAAAggggAACCCCAAAIIIIAAAgS8rAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQMClAgS8Lp04ho0AAggggAACCCCAAAIIIIAAAggggAACCBDwsgYQQAABBBBAAAEEEEAAAQQQQAABBBBAAAGXChDwunTiGDYCCCCAAAIIIIAAAggggAACCCCAAAIIIEDAyxpAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQRcKkDA69KJY9gIIIAAAggggAACCCCAAAIIIIAAAggggAABL2sAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBwqQABr0snjmEjgAACCCCAAAIIIIAAAggggAACCCCAAAIEvKwBBBBAAAEEEEAAAQQQQAABBBBAAAEEEEDApQIEvC6dOIaNAAIIIIAAAggggAACCCCAAAIIIIAAAggQ8LIGolTg5IVbUfr+vDkCCCCAAAIIIIAAAggggEDoAplSJ4QIAQQQQCAaCxDwRuPJeRKGRsD7JMwyz4gAAggggAACCCCAAAJuFiDgdfPsMXYEEHgSBAh4n4RZjsbPSMAbjSeHoSGAAAIIIIAAAggggAACIkLAyzJAAAEEorcAAW/0np8YPzoC3hg/xTwgAggggAACCCCAAAIIuFyAgNflE8jwEUAgxgsQ8Mb4KY7eD0jAG73nh9EhgAACCCCAAAIIIIAAAgS8rAEEEEAgegsQ8Ebv+YnxoyPgjfFTzAMigAACCCCAAAIIIICAywUIeF0+gQwfAQRivAABb4yf4uj9gAS80Xt+GB0CCCCAAAIIIIAAAgggQMDLGkAAAQSitwABb/Senxg/OgLeGD/FPCACCCCAAAIIIIAAAgi4XICA1+UTyPARQCDGCxDwxvgpjt4PSMAbveeH0SGAAAIIIIAAAggggAACBLysAQQQQCB6CxDwRu/5cXx0+w78LrOWbJD9B/+Uq9duSMoUSSV/3tzy8UflJUe2jBF+/2nz18jYTz41/exYNV5SJk8aoE8C3ggT0wECCCCAAAIIIIAAAggg4KgAAa+jvHSOAAIIRFiAgDfChO7tYPnar6X3iFnmAbJmSicZ06eSv4+fkTPnLkmC+PFk6rD2ku+lZ20/4OGjJ6Ryo95y7959Al7bityIAAIIIIAAAggggAACCEStAAFv1Prz7ggggEBYAgS8YQnF0NePnTgj79XtLvfvP5ChPRpL2eJvmCd99OiRTF+w1uy6zZA2layZO1gSJYwfboUHDx7Kh836y59HT5g+79y9xw7ecCtyAwIIIIAAAggggAACCCAQ9QIEvFE/B4wAAQQQCE2AgPcJXR+Dxi2QBSu+lCrlikjfDvWCKNRqOUi0fEO/jvWlctnC4VbSkHjM9OXStHYFWfjZJrly9QYBb7gVuQEBBBBAAAEEEEAAAQQQiHoBAt6onwNGgAACCBDwsgaCCBSv2k5On7soc8Z2DbYMw9I1W6XvyNlSKH8emTK0fbgErdIMWTKmlU8/6SdvV2lDwBsuQS5GAAEEEEAAAQQQQAABBKKPAAFv9JkLRoIAAggEJ8AO3idwXVy+cl3erNDCPPneDdMkYYJ4QRR+/fOYVG7YS1KnTCbbVo7zWUlLM9Rs3l9+/u2oLJjYQ17KnVMKvtecgNdnQS5EAAEEEEAAAQQQQAABBKKXAAFv9JoPRoMAAggEFiDgfQLXxIFf/pLqTftJyuRJTdmE4JqWVNBgVtvu9VMkcaIEPklZpRnqVistHZtVN/cQ8PpEx0UIIIAAAggggAACCCCAQLQUIOCNltPCoBBAAAGPAAHvE7gYvt17UBp2GC5ZM6WTDQuHBStw7/4DeblEA/PaV8vHSLo0KcKUOvz3SbPrN2O61LJyZn9JEN9/Z3BoAe+Fq3fD7JcLEEAAAQQQQAABBBBAAAEEok4gdbKg3/qMutG4+5237zogTTqPNA+hJQ3/93/Z3P1AgUa/5oud0mXQNPPTr1eMlTSpkker59MD4POWbGTG1Ll5DaldtVS4xhfS/J04fV5KVu9g+hrVp7mUKvpauPrlYnsCunlRNzEWe/MVGT+wtb1Ogrmr9Ied5J+TZ6Va+aLSu33dSOvXyY4IeJ3UjaZ9f7XzB2nRbazkyJZR1swdHOIony/qv4g/XzBUsmVOH+rTWKUZDvx6ROaN7yZ58+TyXB9awBtNiRgWAggggAACCCCAAAIIIICAgwI//PyHfNRioHmHlvUrSZPa74X6bu36TJKNW3f79N+oN27eloLlm8v9Bw+kRKFXZWz/lg4+Sfi6jkjAm6/0x3Lrdvg3SZV++3UZ2btZ+AZq82oCXncFvLMWfy4jpizxzPZnswbIM9mz+DT7O/f+LI06jPBcq+c36TlOj7MR8P6nTcD7OFdeNHmv774/JA3aD4vUHbyfLFwno6ctk5qV3pFurWoGeNLQAt479x5GExWGgQACCCCAAAIIIIAAAgggEJxA/LixIh3m4cNHUqhiS9EzYl5+/v/MGS4hNb32rQot5Mq1G+aSbq0+kpqVSoR4/abt30vrnv7lCAd0biAVyxSK9PHb7ZCA165c5Nzn1A7em7fuyNadP5pB5n3xGcmQNlXkDNjhXgIHvLWqlJQuLT706V079Z8i6zZ/57mWgNcnNscuIuB1jDb6dqy7bKs36SspkieRb1ZNCHagFy9fk0Lv+/+Wc8/nUyVRwvghPpBVmkH/Als5c0CQQ9uowRt91wIjQwABBBBAAAEEEEAAAQTCEnCqBm/XQdNl9RffSKxYfrLjswmSPFniYIfy48E/pWbzAZ7XCr/xkkwe0jbEYfcZMVuWrd0qfn5+pkyAHh4eXVpkBLxFCrwk3VvX8vmREiaIL6lSJPX5+ohc+KTu4I2IWVTeawW8+tnTs5g0J9q6fIzEjRsn1GFdu35TilRqbT67d+/dF/1WNwFvVM6kCAFv1PpHybtfvX5TCpTz/3pGSOGtdRBb+rQpZcuy0aGO0/qqjNYO0rq+gdvWnT+I1vQtWvBliRsnjlSvUEzeeDW3uezkhVtRYsCbIoAAAggggAACCCCAAAII+CbgVMCrJRf0vye1De/ZVN4tnj/YAY2fuUKmzF0tBfO9IPq1cD3v5ds1EyVevLjBXl/ig/Zy6swFyfNcDlk8uZdvD/mYroqMgPdxllwILwsBb3jFovZ6K+DVPOf2nbty9J/TPtUQXrr6K+k7ao7oL1u2fbffPAQBb9TOJQFv1PpH2buXqdlJjp04KzNGdZI38vqHrd5tzrKNMmziIileKK+M698q1HE27TLa84H25YH6dqgnVcoVMZcS8PoixjUIIIAAAggggAACCCCAQNQJOBXwXr9xS958r4WplfteyTdlcDf/w68Ctw8a95Wffztiyi2Mm/GpnD1/WaaP6GAC38Dt8NET8l7d7ubHrRpUlsa1yge45NyFyzJv+RfyzZ6fRQ/GunXrjiRLmkhy5cwqJQvnk0rvFg6ye/Hk6fPyzr8HaC2Z2luSJk4kA8bMk/2H/jSbnPSwNO+mu5KXrt4qfxw5LvfvP5AM6VLJ22++Io1qlpOfDv1l+5A1qwZvRAPensNmyor120w4pzuh9/z4q0xfsFZ++eNvuXX7jmTKkFYqln5L6lQrbXZo6m7NWUs+ly+/3mvMNFh/8bkc0qJeRXkxd84Azx444NX+tKSjep+/eEUSJYgvz+V6Sj58v4TJG0Jq+k3hBSs2ye4ffjFh/aNHj8yBbfleelY+qFBMXgr0vt79aH3nmYvWyw8//ynXb9yUVCmTSf5XckuDGu9K1szpwjxkzc78hXbImnVgV4cmH0i96mVMfjL/0y/lt8P/mBIlKVMklddeflaa1XlfsmfLGCzJ/kOHRcNYfTYtVZI2dQop8sZL0rBmWVMOonjVdnL63EWf6ll7v4EV8OoZTUUKvmze463X88jUYe1D/QvHqn2rO8kHjp1nrg0p4LXzmbPeXJ9pypzVsmP3T2b9JE2SSJ575ilTHlR3sodVg/fevfuy5sudsn7LLvn1j2NmLSdJklCeypxeShR+VWq8XyLIt9D1vTlkLer+fcM7h1NA6+XqX7Ll3ikgQ7s3DnC3/sVZqUFP+f2v46H+FtXXt6REg69SXIcAAggggAACCCCAAAIIRD8BpwJefdIG7YbJd/sOmRIC21aOM2UVvNulK1o+sJUJ+DYsHCZjpi+XDV/tltpVS0nn5jWCYM1eukGGT1psfq7Bq+5MtJrunm3XZ4JovVRt6dKkMGGthkh6MJs2vV7DLQ0TrabBkn4dXZsGywPHzjc7HbVpwKvjsppVHkL/HDdObMmSKZ3cvn1HTp29KJkzpJEW9SuKlqYIbnxhzXxkBbz9Rs+VJau2mLC0dpVS0rbPBInl5ydaykG/8Wu1OlVLSdM6FaRumyHy65/HJHnSxHLz1m3zDV1tGvQun9ZHcj6d2XOPd8CrG8ra9ppg+kycKIHEjhUrQP/N6lSQ5vUqBnnspWu2ysAx80zwr02/WaztzLlLnmub1q5gLAO3tV9+K10GTTPrRVuWjGklduxYcvzUOfON4nEDWsnHHf0PBtP1o+vIu9mdv9AC3vK1u8pfx06JPm/ChPFl5JSlZkwpkiUxHhpCakuSOKEsn943yDej1bTr4OmeZ1IPnS9dU1p+ZOaozlKjWX8zN1aIHNZasl63Al5dx8N7NTXlPPUzuGnpyBDrCOuz6DNpGYc1cwaZMFRbcAGv3c+c9vfnkRNSu9UgT+1t/UwmS5JITp29YA4bbN+kmny57Xv56dBhKfbmKzJ+oP9n1GoXLl2V5l1Hi5Yp1aY7/9OlSSlnz18yu5Wt9aHrVNeJdyPg9XUFcV2UC+hvPMvW6mz+xea9o1b/AtW/bOYu2yj6G5wVMweYfylZTX+rp3+parkF/a2OL42A1xclrkEAAQQQQAABBBBAAAEEoqeAkwGv/rfn0ImLzIMvndpHnn/26QAIGth1HjjVhHxaPlCDSQ0o9b9X18wdHASsYYfh8u3egyac2rxslOf1YyfOmI1MGgxpiKsbnf4vu38wqYe4ff7VLuk5dIboIVxaUnDGSP/QSpuGzG9V8D+jpnzJgrJ5+/fSuNZ7kjvXU+Zn1k7iLd/8IC27jzU/K1kkn/TpUM+Eoto0EO4ycKqcu3DFBMraAgfQYc1+ZAW8g8bNN7tjs2VOJ7qLuu4HZcyhdRqAaVbQtvcE0brHGuC+XfAVOfrPKRnUtZFx01qrm7bvlfZ9J5vAUXc89+9U3zN074D3qSzpJXXK5NKjTS15NmdWc43uWlUH3VCmTQNN3ZFpNS3B8XHHkabvUkVfky4tapogXpvudh01bal8um6b+bPOoW5as5ruFNVvK+sc53wqk4zt39KzI1Z3vWrwr2vD8g8c8EZk/kILeN+v18Ps5s6b5xkTNrb9uKpULVdEEiVMYMJyLXegc6Ktarmi0qdDXc8zaf5SumYnuXv3njydNYOM7ttCcuXIYl7X0F0/G3Fixzb969wEF1qHtq6sgDdThjTy5eIRUqFedxOstqxfSZrUfi/YWzUzmrl4vVnjvdrV8Xw2Age8EfnM6fxXa9xXDv1+1JwJNapPcymU/0UzHn+zLTJ88hLz+dJfwAQOePX+2q0Gy74Dv5tQWD+L7xTOZ3ak62vbd/0kfUfOMWshuOyLgDesv414PVoJfPH1XunQb5L5SyBj+tSSMV1qOXLslPmXl35IZo7uHOC3nTp4/Rei/oUc2oc98EMS8EaraWcwCCCAAAIIIIAAAggggEC4BJwMeLV0oIZy2nRHpu7M9G6dB0yVtZu+lYplCpkSDd7XayClwZTVNNgrUL6Z2RGpX+Pv1ba25zXrQDcNMdfNHxLs7kQt3TBkwkJzz7zx3U0gp837HBvdtTh+QCtP2OQ91npth8juH341u3+/WDxC4geqEaxBVJmautHKf7dwVAW8g8cvMCUCtOlX3bu1qhnAfO/+36ROa//wXEPe9fOHSsZ0qQJcY5Vq1NBx3bwhnte8A14tI7B+/hATZHo3ncNytbuYLCJwoFmxfg8T/qr9nLHdTCAXuLXqOU42b99nxvTlkpGeXd+T5qySibNWhmirwV6Npv08OzoDh6ERmb/QAl4rR9GBdWv1kQnTAzfdJa2lMrJlTi+fLxjqeXnCzJUyee6qEJ9JQ+3ydbqZ0gPa7Aa8mgltWjLSbPbTX7jojlbdmR54R73OWbGqbU2oOmVoO3nhf9lDDHgj8pnzXoNdWnwotaqUDGI2YsoSU1JCW+CA98tte6VNrwnmtWnDO8ibrwUt56IBeeWG/jW69ZcU+ssKqxHwBuHmB9FdQGvsTJu/RvTDo38hpEmdwtThafxRec/XILyfgYA3us8o40MAAQQQQAABBBBAAAEEIlfAyYBXR1qudlez2Ujrqi6c1NMzeA3ktDyDbkIa0auplCnmfwibFb70bldHqr33tuf6r7/dL4EDWfsAACAASURBVM26+h8SrrVl9b9ttWkolb9sE7Ozs1yJAjK0R8AyhVYH3jWB61YrLR2bVTcveQe8uos1cM1dvUa/8v1amcZmN7AGeBrkBde0fICGoNrsBrzhmd3AAaze6x3wajir13g37+ct9lZeE2gHbmM/+dRkCRre7vl8iudl74BXd4Dq5rDgmhVoapC4cdFwc4luJtPMQZueBRRSjV4t6aGlPbQtntJb8vwvu/nnD5v1F61V+0z2LPLZrAHBvq/WHtYaxNq8w9CIzp8vAa9upPt6xdggNZ51LNauWP2lwL4v/Et4aNPSC1qCIHeup2XZtD7BPpN1b+Bn8mWdWDt4rYBXd0kXrdza7JLVTX/5X3kuQDfWZ0x3VW9aMkquXr8RbMAb0c+clmLRb5Br27FqvKRMnjTI4/xz8qynPETggNf6JYDuHF8xo3+IFLVaDjK7fHV3sAbWViPg9WX1cA0CXgIcssZyQAABBBBAAAEEEEAAAQSit4DTAa+1E093C36zaoIkT+Zf1kC/zm7VBN3x2XhJkTyJ+Xn/0XNl8aotQXbt6WFPC1duNqUGdq6Z6NlBq19f16/Ja9NDoT6sWDxEcD2gTQ9q02BLAy5t3oFncDte9RrdPFWlUW9zfb+O9aVy2f92A3q/mY7POpQqqgPehAniyd4N04JYaLD+wtv1zM9DqpOrX9G3asn+tNk/MNXmHfCGdBCeXmeFzDrn+zZOMzuFrfIb+rqW19AyG8E13QH9Wpkm5iXdpa27tbW9/m4TU0s5uLOGrH60/ICWIdDmHfBGdP58CXgDl/7wfjYNyzU013Zw62zPS9Yz6UH1Wl4zuOa92zWiO3i1/3Z9JsnGrbuDddTyHfpt8I8/Ki+tG1YOUL7Eu0RDRD9zLbqNla92/uApzRLsg4vImxVamNIdgQPewhVbidbgDVxCJHA/wycvltlLNphaxloD3GoEvCGJ83MEQhAg4GVpIIAAAggggAACCCCAAALRW8DpgNc7oBrWs4mULf6GAdGvputX1PM8l0MWT/b/KrU2q1aq7h7VINc6N0ZLPejX/7Vu7IRB/x24pHVdG3XwP1hLd6PqrtSQWoP2w+S77w+ZGq6r5wwyl3kHvG0aVZFGNcsFuV0Pk2rSeaT5+cRBbcy5NcE176+O2w14Nczq3f6/Oq2hrR49zCvw7kcrXNUSCls/HRPs7c8X9e+/U/MaooetBW7Wzk8toXBgyyzPy94Br5Z20Dq8wTXdnam7NLXprlYta6HlFbTMQniazoXOidZOzluykbnVe/d14L6uXL0hWkZSm3cYGtH58yXgLVX0dRnVp1mYHlbA6/1Moe2GvnhZDyL0rxEdGQGv9XnR3cQ6N0mTJDJ9q12RSq3M7t7PFwwzNZy961N7B7wR/cxV11Iav/wV6s5lHZNV39g74NVd9HmKBR+Gh7a2ftw0w/N3CQFveD6FXIuAiBDwsgxiusDlh3ckRaz4Mf0xI/35Lj+6Kyn84kV6v3SIAAIIIIAAAgggEH4BpwNe/Tq3BlR6EJYeYjak28dmkDWbDzCHfWldXq3PazXdpVmwfHPRQ8Ktr5F71+b1Pkhc79F6rfqVbW0h1eO0+tYSD/o1dOsr6/pz74C3Z9vaUv3fHaPekpu2fy+te44P8z28y0jYDXhLv/26jOwdfFDoy+xaAa9+zf6r5aEHvCEFhr4EvNq3dUBa4HHNXrrBHHqmTesVZ86QRqzdlPozDZ/9gpbfDfJ4ld8tYtaGrh1dE9qs0Dc4Cz1oXktpaPN+tojOny8Bb2jz5h14WwGv9zPpblndNRtc8w6CIyPg1R3c71TvIKfOXBDv9b5gxZcyaNwCyffSszJnbFczlJAC3oh+5qxazIHLtgR+/mqN+8jB344G2MHrPcd6QFuSxAl9+VjI6tmDPGE2Aa9PZFyEwH8CBLyshpgucO7BbXn5H///4ULzTSBj7ETydZZKktgvjm83cBUCCCCAAAIIIICAowJOB7w6+E79p8i6zd95viqtZ8ToTkvdjTd/Qnd55QX/A8+sVrvVIPn+p989XxXXkg1aukGb7krVgNBq3rsJQ6vtqtfXbztUdv3wi+R8OrOsnj3QdOEd8HqXBPAez/ZdP0mTzqPMj0Lbwbvhq93Svu8kc11MD3j1kK6smdIFuza9A039arx+RX7S7M9k4uzPgp3DsBa41tB9tZT/LwZC28GrX9vXr+9rC7iDN2Lz50TAqzWj85X2f6bmdd+XZnXfD5YhpF3JYZnp64Fr8Fr3WHPx/LNPy9Kp/rV/9UAyPZhsUNdGUqHUm+ZnvuzgtfOZ09IsWqIltNrD+v7la3eVv46dChDwakCdp1h90f8f+BA/X0z0GgJeX6W4DoF/BQh4WQoxXYCAN/wzTMAbfjPuQAABBBBAAAEEnBR4HAGvhrsa8mpbNWugHDt5Vlp29/96uNbl1VID3s2qWfry8/8nCyb2MLtndRdmcIGQ1tTV2rra9PAzPQQtpFa2Vhc5+s9pKZDveflkREdzmS8Br36dXL9Wri20GrwzFq2XUVOXmutiesAbXDBvuetOUN0RqvP6/cbp5qvxn67bJr2G+9fz9T48zde1rQGvBr2h1eD1nifvgDei8+dEwKvP/UrJRnL37j2p8X5x6dGmVrAUerCcHjCnLTJ28Go/p85elHc+aG9CUi1VorvsdVdt4kQJ5OsV40TrN2sLKeCN6GdOy51o2Yz0aVPKlmX+BycGbjo23Y2tQXjgGrzFqraVM+cuBTk8zde1RMDrqxTXIfCvAAEvSyGmCxDwhn+GCXjDb8YdCCCAAAIIIICAkwKPI+DVEPWtCi1MkKQHoZ04dU70a/zvFM4nY/q1CPJ4+rVs/Xp2nNix5du1E6Vk9Y4mbApup6PuAn6jXFNzANe7xfPL8J5Ng+XS+wu938qEWt5f8/cl4L1+45bkL+vfb0gHselrzbuNka07fzTXxfSAN6T6vfrsdVoPFq297F3r2PsAtG6tahrHkJqW59C59256yJ0elpYrRxZZOXNAsLd6l4bwDkMjOn9OBbx6IJy6eJdFCPxg3rWLIyvg1ff4uOMI+WbPz6bG8a3bd2TqvDVBdsSGFPBG9DM3bOIimbNso3nUnasneg5e9H72Q78flaof++8uDhzwWofBpUqRVLZ+OjbIL4isfoJbR/oaAa+T/0ah7xgpQMAbI6eVh/ISIOAN/3Ig4A2/GXcggAACCCCAAAJOCjyOgNc79NPDqE6eOW8OWQpcT9d6Tg1hNYzVgEkD4YFj55mX9Ovk+rXywK3PiNmybO1W0YOj1s0fKhnTpQpyjQZY42Z8an7+2awB8kz2LOaffQl49boPGveVn387YspDbFw03LyXd9OdwRXqdje1g7XF9IBXw1sNWgPvvj55+ryUqdnZOOgBbhoEW80qA5AlY1pzr9ZQDdx0p3aPoTOkYL4XZFDXhpIgvv9u0hFTlpiSAyHZ6k7YCvV6yLETZ8w1gcPQiMyfUwHvgDHzZNFnm43hhgXDJFOGNAE4dP2Xr93NfA6Ce6aw/l4IqUSD3rdx6x5p12eiCZc1ANfyDIsm9ZQXc+f0dBtSwKsXROQzt+27/dK0i//O3a4ta8pHlYOG/V0HTZfVX3xjrgkc8HrXAA6prIquvxpN+8vDhw9NqZdSRV/zPBcBb1grh9cRCCRAwMuSiOkCBLzhn2EC3vCbcQcCCCCAAAIIIOCkwOMKeGcv2WAO2kqTKrlcuXpd7t1/IJuWjgo2jNXnter2ahh4/NQ5E6x+tXy0+AVzOpceGPV+/R4mqPrf/2WTEb2aSvZsGQ2b7hpetXGH9Bs1x7xn4K/4+xrwrvx8uwkercCpV7s6ZkwaRmu94J7DZkjcuHFFv76uzW7AW6TASybUDk9Lmyq5xPs3cHbykLVVG7+RboOnm6Hp1+vzvfisGWvyZInNz06fuyhtek0w4b3uwF0zd5Bky5ze8yjf7j0oDTsMN3/OmyeX9O1YT3L8O08a0K7+YqcMmbDAfC1ffxEwqs9/h839ffyMlK/T1czn01kzmDl+7pmnTF8a6g4cO1/0MD4NmDXcCxzwRmT+nAp4dUey7kzWpsHqqD7NPZ8HXUedBkyVRAkTyL4Dv5trInMH77179+XtKm3l+o2b5nPhvdvamrDQAt6IfOb0/d6r09XMl5aDGNT1Yyn+Vl4TdGvN4ekL18r8T780FnpN4IBXdxDXazvE7BLX8h9dWtaUSmUKeT4Dajds0mLZsfuA6XPZtL7ybM6snnVIwBuev124FgERIeBlGcR0AQLe8M8wAW/4zbgDAQQQQAABBBBwUuBxBbxHjp2ScrW7eh5Fg701cweH+GjeYaJeVKVcEbPjN6Smh6e16jHOhLzaNBiOGzeOHD951gRY2t56PY+M7tvchGZW8zXg1VCpTe/xorsHrZYieRK5c+euCSSzZU4nvdvVlQbth5mXQ9ptHNL49cAt7cdOWzipp7z0785LJwPeFeu3Sc9h/nV0543vLlpLVeviPpU5vTwSkb+PnzYH52nT4PfDisWDPM7ytV9Lv9FzTFCrLV2aFBI3Thw5e/6SZ5700L1JQ9pKsiSJAtw/d9lGGTpxkednWsPZ799d2LobeNrwDuYwPF0DHZtWl7oflPZcG5H5cyrg1cGNnrZMPlm4zoxTf3mRNVNaY6PvqWtKn0kDSW2RGfBqf96lEgJ76euhBbz6ut3PnN6778Af0qjDcLN+tOlO7YQJ4svlq9fNL010Z++ufYdkyzc/iP7SY9LgtgHWgh6o17zraHNYm3V/ujQp5er1G3L5ynXzM/389+9YX8qXLBjgXgJeO3/LcM8TLUDA+0RP/xPx8AS84Z9mAt7wm3EHAggggAACCCDgpMDjCnj1GfSr+9ZX6GtVKSldWnwY4qOdv3hFilRq7Xl9/MDWZidfaE3vmbf8C9m+6yf55+Q5c4CVhrB5/pfDhDwli+QLsgPY14BX31eDNy0FsXL9dvnr2Enz54zpU0uxN/NKo4/KmZ3JVhinAWjePM/4PHVuCHgXrtxsymXo7tz9m2eI7qqdvmCtfPf9QVF7Dc7zPJdD6n1QRt54NXeIz6736TxpgKe7fu/evW92AefO9ZSUK1FQ3i3+hsSKpdFt0KZ1YzXoPfDrX3Lz5m1JlTKZ5H8ltzSsWdbsQi1etZ3ps1WDytK4VvkAHdidPycDXh3g+s27ZPGqzfLb4X/kwYMHkjljWilR6FWpXbWUMX25RAPzHCGVMwgJOrQSDXqPdViazueW5aMldcpkAboKK+DVi+185qw30bImWjrlu30H5eKla+bQRS3B8lHlklIofx7pMmiarPlip1lLM0b6h9zeTXdq6+vq9+uff8uVazckXtw4xq/Aq8+bAxezZkoX5D4CXp//WuJCBPwFCHhZCTFdgIA3/DNMwBt+M+5AAAEEEEAAAQScFHicAa+Tz0HfCMREAS1ZUPC95ubRBnRuIBXLFIqJj8kzhSHg90j3NdMQiCIBAt4ogudtH5sAAW/4qQl4w2/GHQgggAACCCCAgJMCBLxO6tI3AmELaLmBlMmTBrtrWevM1mntX8pk5ujOkv+V58LukCtinAABb4ybUnc9EAGvu+aL0YZfgIA3/GYEvOE34w4EEEAAAQQQQMBJAQJeJ3XpG4GQBfb8+KupG61lQrTGrNaaDdz0UDutR62HkW1bOV601jDtyRMg4H3y5jxaPTEBb7SaDgbjgAABb/hRCXjDb8YdCCCAAAIIIICAkwIEvE7q0jcCIQvcu3df3qneQc5duCxpUiWXwd0aScF8L5gbbty8beoUj5+5wvy5XvUy0qHJB3A+oQIEvE/oxEeXxybgjS4zwTicEiDgDb8sAW/4zbgDAQQQQAABBBBwUoCA10ld+kYgdIFDvx+Vum2GmEBXm+7UTZwooTm8zGpvvvaCTBjYWuLFiwvnEypAwPuETnx0eWwC3ugyE4zDKQEC3vDLEvCG34w7EEAAAQQQQAABJwUIeJ3UpW8EwhY4deaCzFm2UXbu+VlOnD4v9+7fl+RJE0vuXE9L2RJvSNniBSR27Fhhd8QVMVaAgDfGTq07HoyA1x3zxCjtCxDwht+OgDf8ZtyBAAIIIIAAAgg4KUDA66QufSOAAAIRFyDgjbghPURAgIA3Anjc6goBAt7wTxMBb/jNuAMBBBBAAAEEEHBSgIDXSV36RgABBCIuQMAbcUN6iIAAAW8E8B73rTeviyRK8rjf1fXvd+7+LXn5+BLXP8fjfAAC3sepzXshgAACCCCAAAJhCxDwhm3EFQgggEBUChDwRqU+7y0EvO5YBI9EJNb505KwZy13DDiajPLhsy/JPy36E/CGcz4IeMMJxuUIIIAAAggggIDDAgS8DgPTPQIIIBBBAQLeCAJye8QECHgj5ve47ibgtSdNwGvPjYDXnht3IYAAAggggAACTgkQ8DolS78IIIBA5AgQ8EaOI73YFCDgtQn3mG8j4LUHTsBrz42A154bdyGAAAIIIIAAAk4JEPA6JUu/CCCAQOQIEPBGjiO92BQg4LUJ95hvI+C1B07Aa8+NgNeeG3chgAACCCCAAAJOCRDwOiVLvwgggEDkCBDwRo4jvdgUIOC1CfeYbyPgtQdOwGvPjYDXnht3IYAAAggggAACTgkQ8DolS78IIIBA5AgQ8EaOI73YFCDgtQn3mG8j4LUHTsBrz42A154bdyGAAAIIIIAAAk4JEPA6JUu/CCCAQOQIEPBGjiO92BQg4LUJ95hvI+C1B07Aa8+NgNeeG3chgAACCCCAAAJOCRDwOiVLvwgggEDkCBDwRo4jvdgUIOC1CfeYbyPgtQdOwGvPjYDXnht3IYAAAggggAACTgm4MeB99Ejkkf4fh5qfn5/4+TnUOd0igAAC4RQg4A0nGJdHrgABb+R6OtUbAa89WQJee24EvPbcuAsBBBBAAAEEEHBKwI0B74mzd+TeA+cC3lh+fpItQ3ynyOkXAQQQCJcAAW+4uLg4sgUIeCNb1Jn+CHjtuRLw2nMj4LXnxl0IIIAAAggggIBTAm4MeI+fvSWDhsWRu/ecUend7b5kSZeQXbzO8NIrAgiEU4CAN5xgXB65AgS8kevpVG8EvPZkCXjtuRHw2nPjLgQQQAABBBBAwCkBAt6gsgS8Tq02+kUAATsCBLx21Lgn0gQIeCON0tGOCHjt8RLw2nMj4LXnxl0IIIAAAggggIBTAgS8BLxOrS36RQCByBEg4I0cR3qxKUDAaxPuMd9GwGsPnIDXnhsBrz037kIAAQQQQAABBJwSIOAl4HVqbdEvAghEjgABb+Q40otNAQJem3CP+TYCXnvgBLz23Ah47blxFwIIIIAAAggg4JQAAa+7A96Vn2+XHkNnyBt5c8uMUZ2cWiYxot+3q7SRs+cvy8JJPeWl3DljxDPpQ5w4fV5KVu8gsWL5yYEtszzP1XnAVFm76Vtp06iKNKpZLlo+759HTsiMRetl9w+/yPmLVyRevLiS86mMUqb4G/JhxRISN07sAOOu3rSfHPjlr1CfpUKpN2VQ10bR8nntDoqA164c90WKAAFvpDA63gkBrz1iAl57bgS89ty4CwEEEEAAAQQQcEqAgJeA16m1Fd5+L1+5Lm9WaCGdm9eQ2lVLhff2MK8PKeAdOHaerP5ip+xaNzlAH06PJ8wB+3iBWwPeDV/tli4Dp8q9+w8kSeKE8lSW9HLpynU5efq8efJXX8wln4zoaEJfq5Wt1UWO/nNacj6dWeJ7/dyb6u2CL0uzuu/7qOeOywh43TFPMXaUBLzumFoCXnvzRMBrz42A154bdyGAAAIIIIAAAk4JEPAS8Dq1tsLb7/ZdB6RJ55GOBbx3794T/e/feHHjiJ+fn2d4uiv0yLFTQQJep8cTXp+Qrg8p4NXg9OHDhxIndmyJHTtWZL1dpPRz6uxFKVeri9y+c1dqVnpH2jWuKgnixzN9f7v3oLToPta81rFZdalbrbTnPQtXbCUXLl2VLxaPkMwZ0kTKWNzQCQGvG2YpBo+RgNcdk0vAa2+eCHjtuRHw2nPjLgQQQAABBBBAwCkBAl4CXqfWVnj7nTx3lUyYudKxgDe48WgI+lqZxmY3aOAdvFExnvCa6fUhBbx2+npc90ya/ZlMnP2Z5M71tCyd2jtA4K5jGDN9uUxfsFZeeeEZmT+hu2dYr5RsJBrU71wzUZInTfy4hhvl70PAG+VT8GQPgIDXHfNPwGtvngh47bkR8Npz4y4EEEAAAQQQQMApAQLe6BXw/vrnMRNy7jvwu9nBmD1bRvmo8jtSsUwhqdVyoOw78IdMH9FBCuZ7wQw8tBq8p85cMPVNv9nzs5w+d1Fix/KTDOlSS6H8L0q9D8pIujQpTB97fvxV6rYZIgkTxJMdqyZ4dlJ6y9y5e0/eqtBCbt66I/PGd5O8eXKZl+/duy+LV22R9Vt2idZTvf/ggaRNlVzefO0FU/c1kw+7LI+dOCNlanYOMhF5nsshWTOllfWbd0mPNrWkxvvFA1yjX/Fv33eS+dmnn/ST//1ftgCvD5u4SOYs2yjN675vvrIfuESDVaM28Bv361hfeg2fGex4Fk/u5fm51oydvXSDfL3zRzl++rzEiR1LsmRMK+8Uec3sOk2UMH6APopWbiPnLlyWLctGy/rN38nc5Rvl0uVrsmX5GEmVImmYH3F9Xn2/P/46LnHixJZcObJKvepl5NmcWX2uwWutF11Pajp+5grZ+NVuOX/pqqRPk1KqlCsiDT8sawLXT9dtkwUrvjQlETQAL/jaC9KlxYeSNrX/uolI093R+w/+KblzPSXF3sobpKsvvt4rbXtPMLt0dbeutdZefqeh+eefNs+MdruSI+IR1r0EvGEJ8bqjAgS8jvJGWucEvPYoCXjtuRHw2nPjLgQQQAABBBBAwCkBAt6gsr273Zcs6RKK17f4neIP0O/+Q4dN0Ko7FHNkyygvv/CMXLh0RXbsPmAC2a+/3S9/HDkuc8d1M/VJtYUU8OpBVI06jpBr12/K01kzyAvPZpdHjx7JgV+PiAaqKZMnlVljOssz2bOYn5eo1t6EwGP6tZB3CucLNXDbuGi4CQBv3b4rDdoNFR13siSJpEC+5yVhgvjmPQ4fPSGJEiaQGSM7yothHGimtW5nLl4vm3fsM2GiHhj3/LNPS8b0qU3YrIfIlSr6uozq0yzAuPqOnC3L1n5txq/BY60qJQO8XqVRb/nlj789h6oFDng/37JLdu49KCvWb5O4ceNI7X/vL1HoVdm0/ftgx2OFzIf/Pin12w41B4NlzZRO8uZ5Rm7fuSff//Sb+VnOpzLJnHFdjbPVSn/YSf45edbsUB46cZFxSRg/nozq01xSJE8S6hpb9NlmGTBmnrlGnbNmTCt/Hz8j3//0uzSuVd7shvXlkLV1m7+TTv2nGM87d+8aH90le/rsRfnx4J+m/45Nq8utO3dk+vy15r0ePnwke378xcy3rqMlU3t7xtp9yCdy/NQ5nz4fGn4P7OIf0IbVlq7+SvqOmhNgB6+6FqnU2gTnez6fGlYXMep1At4YNZ3uexgCXnfMGQGvvXki4LXnRsBrz427EEAAAQQQQAABpwQIeIPKRlXAW/XjPnLo96NSrkQBGdS1kWeHooa1DTsMlwcPHpiQzXsHbXABr5Yd0PqmGrzVqVrK1DG1as5qWNdj6CeyauM35uvxy6b1MQAjpyw1IWuZYvllRK+mQVB0N6XuqmxS+z1pWb+SeV0DRw0eNfSbNryDJE/m/5V5DVwnz10tE2etNDta184dbALUsFqbXhPky217A5RoOHv+stl5myZVcvl6xdgAXeiu35TJk5j6ufle/p+MH9DK8/rV6zelYPnmkjRxQrMrWWvQBnfImgbm79frYQ75ClyiIbjx6BuoYaUGPU3YXq18UenRprZnrm7cvC0d+082YXzZ4m/IsJ5NPGMqX7ur/HXslAmue7erY3ZS+9KuXL0hJT5oZ3ZP925f17yn1X7+7YjUazNUbt667VPAu3HrbmnXZ5IkTZLIhOhqpkG8Nt3NO2XuahNKx4sXR6YMbS+5cmQxr+nO8soN/Xcvr5w5wPPz9+p2N2G+L00PRls9e2CYl+r6+bD5APnp0GHp1ba2fFChmLlHw389ZE13ni+e3FtWbdwhB387Krq7PH3alMaz2Jt5jUNMawS8MW1GXfY8BLzumDACXnvzRMBrz42A154bdyGAAAIIIIAAAk4JEPAGlY2KgPfYibNSpmYnM5ivlo/xlE+wRqf1SLUuqbawAt7N2/dJq57jJHXKZLJ52WiJGyd2gIfUHbOFK7WSBw8eytKpfUzQ99vhf0xoqbsjNRDVr+RbTYNFLc+gQdq6eUPMjuAr126Y3ZRaouGzWQPMTuDArUK97qZsw7j+raR4oaBfww98fUiBqhUiWu+t9505d0mKVW1rylfoe+hO1G9WT/AE2Vt27JOWPcYF2PkbWQHvtu/2S9Muo02pgi8WDZd4XlY6Nt1pqmPToHLbynGeXbzWc2j5Cg3EfW1WiK87hT9fMDRIvdpB4+bLghWbfAx490i7PhPNW6+eM8jsNLaalvQo8UF780fdZVy7aqkAQ/ygcV/RQHl4z6bybvH8vg4/3NdNm79Gxn7yqWggvGJGP3NInDb9RYceiGcdxqYlTAI33RU9YWBrs/ZjUiPgjUmz6cJnIeB1x6QR8NqbJwJee24EvPbcuAsBBBBAAAEEEHBKgIA3qGxUBLzWzkotzbBm7uAggzp19qKUqNbO/DysgFe//j932UazE3hoj8bBLp1qjfuY3Y/dWn0kNSuVMNdYAWTgQNb6Wr/WxLVq0G7d+aM07zbG1Nj98t8aqYHfaNTUpaYGcM1K70i3VjXDXMIhBbzW8/TpUFeqlvPfvao7kLsNnm7KNhw+etKUKFgxo7+pR6tt8PgFMv/TL6V/p/pS6d3C5meRFfAOn7TY1MJ9v/RbIZYc0CBSA8mx/VuKlnzwKUa7DAAAIABJREFU9g2unERoONZOaa2bO6BzgyCX6m7hZl1Hhyvg1XB666djAvSlgf+Lxeubny2c1FNeClRaQwNzDc4D7yIOc2LDcYH1iwwtWbFoUi/Jljmd526tJf1xR/96vLrTvE610vJM9sxy5849s/N79PRlor+80PIlWsYkJjUC3pg0my58FgJed0waAa+9eSLgtedGwGvPjbsQQAABBBBAAAGnBAh4g8pGRcCrgawGmVrz9JMRHYOd7gLlmomWHggr4NXdu7qLV2uztmpQOdi+rJILekhXhyYfmGuscC1waYEW3cbKVzt/CHDQme4Y1Z2jGsQVeeOlYN9DyxFoyFkofx7zdf+wWkgBrx7I1aTzyACBtYa7GvLqDtk/j54w9XC7tqxpdvRqq1i/h/z+13FzoJl+fV9bZAW81jj/L3tmeT7X08E+1u4ffxXdEduucTVpUONdc40VoGsorTVwfW1WsOpdHsP7Xi2RoH37UoN341b/Hbx5/pddFk/5r5au1d/zReuaf9y0dJRkTJcqwBCt5/Yum+DrM4R1nR7O12/UHHOwm4bPusPZKg9h3avlL06eOS/x4saVp7KkD9KllnTQ0g66c3rW6C7y+iv/C+ttXfM6Aa9rpipmDpSA1x3zSsBrb54IeO25EfDac+MuBBBAAAEEEEDAKQEC3qCyURHwWuHq2wVfkQmDWgc73fr1eQ0Nwwp4dZej7nZs3bCyfPxR+WD76jxwqqz98lv5sGJx6d66lrnm5Onz8k71DqYm6zerxpvSA3pIW6GKreTRw0emBq51GJh3yYiw1qYe4jV/QvewLpOQAl79Kv4b5ZpJ6hRacmKU6Ud3M+s4tcyAeb1sUylc4CVTDkJ3cb5ZoYVoALtq1n81XyMr4LV8w3wgEeOv86DNCng17NbQ29fWqMMI2bk35Pm0ynuEJ+ANaU6sgFfnWuseezenAl79pYX+wuG77w+ZOZs8uK3ZGW6nfdRioPzw8x/StHYFaVG/op0uouU9BLzRclqenEER8Lpjrgl47c0TAa89NwJee27chQACCCCAAAIIOCVAwBtUNioCXv3Kv371P7T6rAXfay564FZYAW/rnuNl0/bvA4SLgZ/Suqbhh2Wl7cdVPS/XajlQ9h34Q8YPbC3F3nxFrPqv+s/6M6tZO3hD2glqZ72GFPBqX7pDd9cPv8jGRcPl4cOHogesVa9QTHq2rW3eqmbzAXLkn1PyzSo9qO17ExjWrVbaHDBntcgKeK1x1q/+rrRvUs3nR7Ub8Fo7qEMKLa0D0KIi4O01fKacOHXeJ4PMGdNIv47+JSCspuFu3daDTQ1oDb1H9m4uiRP5H/pmp3Uf8ol8tmGHKTui5UdiSiPgjSkz6dLnIOB1x8QR8NqbJwJee24EvPbcuAsBBBBAAAEEEHBKgIA3qGxUBLxrvtgpXQZNMzVktZZs4KYHd+mhZtrCCniHT14ss5dsMAdh6YFYwbXKDXuJBoOB66kuXrVF+o+eK++VfFMGd2tkSiNoiYTRfVtIySL5PF1ZZRP0MCstkxAZLbSA95OF62T0tGWmBq1+nb/PiNkyqk9zKVX0NfPW+ppes3LmAFm6+itZ9NlmU+pCS15YLbICXqu2cOm3X5eRvZv5/Oh2A96+I2fL0jVbpXLZwkECUn1zq35zVAS81jP5gqCHpq2e/d+O6lu370qjDsPNjtsKpd6Ufp3qew5UC6k//QVH7NixJEnihMFe0rjTSNmx+4DZvauBeExpBLwxZSZd+hwEvO6YOAJee/NEwGvPjYDXnht3IYAAAggggAACTgkQ8AaVjYqA19qFGSd2bNm+arwkS5IowMBmLl4vI6csNT8LK+C1Dt3ScgpfLRttSi14t7PnL0uxqm1NrdK1cwdL9mwZPS9reQMNkpMmSSTr5g+Rwu+3kkQJ45vyDN79aOkGve7O3Xsh1jv9/qffTV3YF5/LaUK5sJoV8HZqXkPqVC0V4PJf/vhbqjTqbUJOPVRr7aZvZftn4yVViqTmuu27fpImnUeZchPL1nwlWrbg2zUTA4w5tIBXd43uXj8lwHuGNB7rsC+9R2v8Bhc2fvH1Xsn5dCbJ+VQmT592A94lq7ZIv9FzTd3Z9fOHBmHUXwzoLwiiIuANa05De90a9zuF85mwXscfWtPdwlqjN6TD5v4+fkYq1Osu9+7dl9ljushrL1ODNyLzw70IeAQIeN2xGAh47c0TAa89NwJee27chQACCCCAAAIIOCVAwBtUNioCXg1bS9XoKCdOnzcHhemBYVb7+bcjonVf7917IDdv3Q4z4H3w4KGUr9NVNPCqXbWUdG5ew9PXvfsPzCFbW3bsk7dezyNThwU9/KxZ19GiIbGWINBguVr5omanb+A2YMw8s1NWd2ZOHtJWMnvVTT3w6xFp3GmEKSmxbFofyR3CYWTefYb29Xr1KVyxlakLe/XaTUmcOGGA3aDXb9ySAuWbSaH8L8q2736St15/IcjBbsEFvFbdYR2Hlnewagzrn0Maz8OHj6RSg57yx5HjZlfz4G4fS4L48TyPoiGkhpE6Vi0pYb1mN+A9d+GyvPNBe9G569GmltR4v7jnvXQndfu+E0UPIHNTwKs1hbW2sBppaO1LWQYt0aGlOrR1afGhfFixhOcXB4f/Pimd+k8xu9LzPJdDFk/u5dRfmVHSLzt4o4SdN7UECHjdsRYIeO3NEwGvPTcCXntu3IUAAggggAACCDglQMAbPQJeHYXWzdXauNpy5cgizz+bXa5cuyHbvt0vbRtXlcWfbZF/Tp4NM+DV+w/9flQath9u7teDq154Nrs5jGz/ocPmoLZsmdObXY7p06YMArB+8y7p2H+yxI0bx+yGnDe+u+TN80yQ6zRs/rjjSPMVez3wrEC+3JI0cSKze3bfgd/N9W0aVZFGNcv5tHwXrtwsA8fOM0Hl6y8/Z3YHex/OpgHe+i27zM5jDTk17PRuusNXAz59XQNyDcq9W3ABr4bhuptZS2DowV45smWU4m/llWrvvS2hjefw0RNSv90wc58avvaS/25R3WmsYaOGuhMHt5E38ub2DMFuwKsdTJqzSibOWmn60rrHGdKllr+Pn5Y/jpwwtWYttwNbZnner/OAqWans/ccbNy6xwT8UX3IWsMOw+XbvQclZfKkkjF96lDXx/iBrSRD2lTmGqsUh/5z8mSJ5aksGcyhevq50HnXXc5amsPuIW0+LdQouIiANwrQecv/BAh43bEaCHjtzRMBrz03Al57btyFAAIIIIAAAgg4JUDAG1Q2KnbwWqPY9t1+mb5grQkKY8eObYLeOtVKS4lCr5odvsdPnTOhpwZ02qxD0DRInDGqU4CHOXX2osxYuE6+2XNA9J/jxI5lgl3tq1aVkqYMQ3BNa6MWrthSbt66I1kypjW7UENqGgBrfdh1m76VP4+eMCFyimRJzC7K6hWKm4OzfG13796T3iNmy5Zv9sn9+w8ka6Z08tmsAZ7b9fAs3VWrzbv+rnXBkAkLZd7yL8wfA5ee0J8FF/DqzzVoHDB2npw4dU6SJU1sAtFK7xaWsMZz8fI1mbX4c/n62x/NvOjhb+nSpJTXX3lO6lUvE6A8g75PRAJevV93Bi9cuUmOHDslceLENvWa69d41+xafql4A/Pc+zfP8NSxjc4Bb9WP+5hfQvjSPl8w1Kxbq+l8qcNPv/wll65cM2F69qwZpUThV83havrLhpjWCHhj2oy67HkIeN0xYQS89uaJgNeeGwGvPTfuQgABBBBAAAEEnBIg4A0qG5UBb2jzXLB8c7Mjd9WsgWZXLg0BBJ4MAQLeJ2Oeo+1TEvBG26kJMDACXnvzRMBrz42A154bdyGAAAIIIIAAAk4JuDXgnTBZywc4o9Km5X3Jki6h+IV+5lOkv/ne/b/JX3+flIKvvWB2zno36xC2uHFim8PAAh+cFumDoUMEEIg2AgS80WYqnsyBEPC6Y94JeO3NEwGvPTcCXntu3IUAAggggAACCDgl4MaA95/Td+XBo4dOkYg8iiVPZ/rv0Czn3ihgz616jpPN2/eZr9yP69/SE+Jeu35TWvYYJ3t+/FXKFMsvI3o1fVxD4n0QQCAaCBDwRoNJeJKHEBUBr5/4yaPH/FtWt8+xCXjPnZKEPQMWqHf7czk9fgJee8IEvPbcuAsBBBBAAAEEEHBKwI0Br1MWUd3vsRNnpFbLQebgrtQpk5k6u/cfPJD9Bw+bWqN6mNeiSb2CPRgtqsfO+yOAgHMCBLzO2dKzDwKPO+DVoPL2LZHYsfSfaL4K+Pn5SdyrpyURAa+vZOY6At5wcXkuJuC158ZdCCCAAAIIIICAUwIEvE7J2uv39LmLMnvJBtmx+4CcOXdR7j94KJkzpJEib7xkDtTS4JeGAAJPlgAB75M139HuaR93wKsAp0/7yaRpsaOdRXQeUO7cItWLHifgDeckEfCGE+zfywl47blxFwIIIIAAAggg4JQAAa9TsvSLAAIIRI4AAW/kONKLTQECXptwj/k2Al574AS89twIeO25cRcCCCCAAAIIIOCUAAGvU7L0iwACCESOAAFv5DjSi00BAl6bcI/5NgJee+AEvPbcCHjtuXEXAggggAACCCDglAABr1Oy9IsAAghEjgABb+Q4uraXfQd+l1lLNsj+g3/K1Ws3JGWKpJI/b275+KPykiNbxnA918OHj2TVxh2yauM38uufx+TmrduSIlkSyfNcDqlarqgULfhykP4IeMNFHGUXE/DaoyfgtedGwGvPjbsQQAABBBBAAAGnBAh4nZKlXwQQQCByBAh4I8fRlb0sX/u19B4xy4w9a6Z0kjF9Kvn7+Bk5c+6SJIgfT6YOay/5XnrWp2e7d+++NOs6Rnbu/dlcnyVjWhPuHj99Ti5fuW5+VqdqKenUvEaA/gh4feKN8osIeO1NAQGvPTcCXntu3IUAAggggAACCDglQMDrlCz9IoAAApEjQMAbOY6u6+XYiTPyXt3ucv/+Axnao7GULf6GeYZHjx7J9AVrZewnn0qGtKlkzdzBkihh/DCfb8LMlTJ57ipJkyq5jB/QSl7MndPc8+DBQ5m9dIOMmrrU/HnRpJ6e1/TPBLxh0kaLCwh47U0DAa89NwJee27chQACCCCAAAIIOCVAwOuULP0igAACkSNAwBs5jq7rZdC4BbJgxZdSpVwR6duhXpDx12o5SLR8Q7+O9aVy2cJhPl/Rym3k3IXLMrpvCylZJF+Q6z9s1l/2HzosjWuVl1YNKnteJ+ANkzZaXEDAa28aCHjtuRHw2nPjLgQQQAABBBBAwCkBAl6nZOkXAQQQiBwBAt7IcXRdL8WrtpPT5y7KnLFdgy3DsHTNVuk7crYUyp9HpgxtH+rz6a7fHw/+KZevXpcCrz5vyjsEbj2GzpCVn2+Xuh+Ulo5NqxPwumzFEPDamzACXntuBLz23LgLAQQQQAABBBBwSoCA1ylZ+kUAAQQiR4CAN3IcXdWL1sR9s0ILM+a9G6ZJwgRBA1k9JK1yw16SOmUy2bZyXISeTw9fq/pxb3PwmpaDKFeiAAFvhEQf/80EvPbMCXjtuRHw2nPjLgQQQAABBBBAwCkBAl6nZOkXAQQQiBwBAt7IcXRVLwd++UuqN+0nKZMnlR2rxgc79itXb0jB95qb13avnyKJEyWw9YzHT50z9Xc3bt0jeZ7LIQsm9JDYsWMR8NrSjLqbCHjt2RPw2nMj4LXnxl0IIIAAAggggIBTAgS8TsnSLwIIIBA5AgS8kePoql6+3XtQGnYYLlkzpZMNC4cFO/Z79x/IyyUamNe+Wj5G0qVJ4fMzbtr+vYyetkyu37gl5y9ekbSpU8h7JQtK83oVJX68uAH6uXD1rs/9RsaFDx89kn9OPJJJU2NHRndPTB8EvPammoDXnpsGvNuyVJKU8cI+4NHeO3AXAggggAACCCCAQHgEUicL+q3P8NwfFdc+euR/iLhTzc/PT/z8nOqdfhFAAIHwCRDwhs8rRlz91c4fpEW3sZIjW0ZZM3dwiM/0fNG65rXPFwyVbJnT+/zsWmtXa+5aLX3alFIw3wvmgDUNlaOy3b3/UA7+flcmEvCGaxoIeMPF5bmYgNeemwa827NWlpypk9jrgLsQQAABBBBAAAEEnniBC6cvyd2HGvA6E/LG8fOTtBlTPfHOACCAQPQQIOCNHvPwWEfx3feHpEH7YY7t4LUe5tr1m/LHkePy6bpt8tmGHZIkcUJZPLmXZM+W0fO8d+49fKzPfu/BQ/njr/sEvOFUJ+ANJ9i/lxPw2nOzAt4syRLZ64C7EEAAAQQQQAABBCJVIH7c/8rsRWrHDnZ26uw1SdC+kvjdueXIu9wav14ypEvGLl5HdOkUAQTCK0DAG16xGHD9gV+PSPUmfSVF8iTyzaoJwT7RxcvXpND7Lc1rez6fKokSRuyr0oPGLZAFK76Utwu+IhMGtfa858kLzvzLNrRpOn3aTyZNo0RDeJYyAW94tP67loDXnhs1eO25cRcCCCCAAAIIIOCUgBtr8BLwOrUa6BcBBKKjAAFvdJwVh8d09fpNKVCuWajhrXUQm5ZX2LJsdIRHdPC3o1KtcR9zWJse2mY1At4I0z6WDgh47TET8NpzI+C158ZdCCCAAAIIIICAUwIEvEFl2cHr1GqjXwQQsCNAwGtHLQbcU6ZmJzl24qzMGNVJ3sibO8gTzVm2UYZNXCTFC+WVcf1bhfrEfx07ZQ5Vu3nrtkwf3lFixQpaaf6Hn/+Qj1oMNP38tHmmxI7t/xUfAl53LCYCXnvzRMBrz42A154bdyGAAAIIIIAAAk4JEPAS8Dq1tugXAQQiR4CAN3IcXdeLBrKfLFwn5d4pIEO7Nw4wfj1ptFKDnvL7X8dleM+m8m7x/KE+3/Ubt6RA+Wby8OEjmT6igzlQLXCbvmCtjJm+3BzWpoe2WY2A1x1Lh4DX3jwR8NpzI+C158ZdCCCAAAIIIICAUwIEvO4OeK2D0HVzl27yooUs8HaVNnL2/GVZOKmnvJQ7Z4yhOnH6vJSs3sFsyDuwZZbnuToPmCprN30rbRpVkUY1y0Wr57179568UrJRmGMa0LmBVCxTKMB1ugFRNy5+sXWP2dyoz53zqUxSofRbUrV8UYkTO+aV7STgDXOpxMwL9C+ssrU6y81bd6Rvh3pSpVwR86D3HzyQkVOWytxlGyVHtoyyYuYAiRvnv4WvQe2Zc5ekaMGX5a3X83hw2vWZKBu37pEMaVPJiN5N5ZUXnvG8tnn7Puk0YIrcvnNXWtavJE1qv0fA67JlRcBrb8IIeO25EfDac+MuBBBAAAEEEEDAKQECXgJep9ZWePu9fOW6vFmhhXRuXkNqVy0V3tvDvD6kgHfg2Hmy+oudsmvd5AB9OD2eMAfs4wVuDHjPX7wiRSq1Nt8AfzZnthCftHnd901GZbUrV29IvbZD5LfD/0j8eHEld66n5cHDh3LwtyPy4MFDczbU2P4tPd8s95Ew2l9GwBvtp8i5AX7x9V7p0G+SWeAZ06eWjOlSy5Fjp+TSlWuSPGlimTm6s/zv/wJ+iHRnr35IAge1ek/9tkPNrl9tGvSmTZ1cTp29KPqh1KY7eycOai3x4sX1PBQ7eJ2b38jsmYDXniYBrz03Al57btyFAAIIIIAAAgg4JUDAG1TWTTV4Y9IO3u27DkiTziMdC3h11+gjEYkXN474+f1XfrJ6034mLwkc8Do9nsj6TIcU8N67/0AePnxodrRapTQj6z0j2o+WAy1fu6vJqzYtGelzdz2GzhBd83nz5JLxA1pJiuRJzL3HT52TRh1GyLETZ6Rry5ryUeV3fO7TDRcS8Lphlhwc4y9//C3T5q+Rvft/k2vXb0qa1Cmk8BsvSeOPyosesBa4hRTw6nV37t6TJau2yIavdot+EHVLfJJECSVXzqxS/p2CZst84Pq8BLwOTm4kdk3Aaw+TgNeeGwGvPTfuQgABBBBAAAEEnBIg4CXgdWpthbffyXNXyYSZKx0LeIMbj4agr5VpbHaDBg54o2I84TXT60MKeO309bju+enQYanRrL/kypFFVs4c4NPbXrx8TYpWbm2u3bhwuAmHvdt3+w5Jg3bDzKbETUtHBgjxfXqDaHwRAW80npwnYWgEvO6YZQJee/NEwGvPjYDXnht3IYAAAggggAACTgkQ8EavgPfXP4+ZkHPfgd9NKcTs2TKa3Yi6qapWy4Gy78AfAc7HCW0H76kzF2TGovXyzZ6f5fS5ixI7lp9kSJdaCuV/Uep9UEbSpUlhHn7Pj79K3TZDJGGCeLJj1QRJED9eEBTd9PVWhRamFOS88d3MDkpt9+7dl8Wrtsj6LbvkzyMnTGnItKmSy5uvvWDqvmbKkCbMpau7LsvU7BzkujzP5ZCsmdLK+s27pEebWlLj/eIBrtENaO37TjI/+/STfkG+payHy2utVv2af7O670vgEg1WjdrAb9yvY33pNXxmsONZPLmX5+f6jebZSzfI1zt/lOOnz0uc2LEkS8a08k6R16RutdKSKGH8AH0UrdxGzl24LFuWjZb1m7+Tucs3yqXL12TL8jGSKkXSMJ30efX9/vjruMSJE1ty5cgq9aqXkWdzZvW5Bq+1XnQ9qen4mStk41e75fylq5I+TUpT4rPhh2VNOPrpum2yYMWXcvSf0yYAL/jaC9KlxYeSNrX/uolI27H7gDTuNNKsI11PvrQV67dJz2Ez5fVX/iezRncJ9hYt+6DzovOk6yemNALemDKTLn0OAl53TBwBr715IuC150bAa8+NuxBAAAEEEEAAAacECHiDykZViYb9hw6boFVLCei5OS+/8IxcuHRFNAzTQPbrb/fLH0eOy9xx3eTVF/0D1pAC3gO//CWNOo4w3+Z9OmsGeeHZ7KKHrh/49Yj5GnvK5Ell1pjO8kz2LObnJaq1NyHwmH4t5J3C+YKgaBnItr0nSOYMaWTjouEmALx1+640aDdUdNzJkiSSAvmel4QJ4pv3OHz0hCRKmEBmjOwoL4ZxoJnWup25eL1s3rHPhIl6YNzzzz5tdmhq2Kxfyy9V9HUZ1adZgHH1HTlblq392oxfg8daVUoGeL1Ko96i32y2DlULHPB+vmWX7Nx7UDQ4jBs3jtT+9/4ShV6VTdu/D3Y8Vsh8+O+TppSlholZM6WTvHmekdt37sn3P/1mfqaHfs0Z19U4W630h53kn5NnzQ7loRMXGZeE8ePJqD7NPaUGQvqcL/psswwYM8+8rM5ZM6aVv4+fke9/+l0a1yovE2d/5tMha+s2fyed+k8xnnfu3jU+es7S6bMX5ceDf5r+OzatLrfu3JHp89ea93r48JHs+fEXM9+6jpZM7e0ZZvchn5jyCL40Db8HdmloLlX7Dv0mS5ECL8mkwW19ud08vzo0qPGutGtcLdh7WnYfK1u++UF6ta0tH1Qo5lO/briIgNcNsxSDx0jA647JJeC1N08EvPbcCHjtuXEXAggggAACCCDglAABb1DZqAp4q37cRw79flTKlSggg7o28tRN1bC2YYfh8uDBAxOyee+gDS7g1bID5Wp1McFbnaqlpGOz6p6vq2tY12PoJ7Jq4zfmgKpl0/oYAD2QXUPWMsXyy4heTYOgaLirIa8erK7n9mizAjcN/aYN7yDJkyU2P9fAdfLc1TJx1kqzo3Xt3MEmQA2rtek1Qb7ctjdAiQY9RF6D2TSpksvXK8YG6EJ3/aZMnsTUz8338v9MTVarXb1+UwqWby5JEyc0u5K1Bm1wh6xpYP5+vR6SJHHCICUaghuP9q+GWuJS761Wvqj0aFPbM1c3bt6Wjv0nmzC+bPE3ZFjPJp4xac1ZLXmpwXXvdnXMTmpfmh4sVuKDdmb3dO/2dc17Wu3n345IvTZDTRlNLZt5YMssz2vWDuU2jaqY3dTaNm7dLe36TJKkSRKZEF3NNIjXprt5p8xdbULpePHiyJSh7U0JBW26s7xyQ//dy1pSwfr5e3W7mzDfl5bz6cyyevZAc+nSNVtFA3pd63WqlZJ1m76To8dPi5/4yVNZ0kvpt18PsgNX6zNrXeTgdnNb7z9o3HxZsGKTWfedmtfwZViuuIaA1xXTFHMHScDrjrkl4LU3TwS89twIeO25cRcCCCCAAAIIIOCUAAFvUNmoCHiPnTgrZWp2MoP5avkYT/kEa3TTF6yVMdOXmz+GFfBu3r5PWvUcJ6lTJpPNy0ZL3DixAzyk7pgtXKmVOZR96dQ+JujTA9c1tNSyAhqI6lfyrabBopZn0DIN6+YNMTuCr1y7Ifp1eC3R8NmsAWYncOBWoV53U7ZhXP9WUrxQ3jCXcEiBqhUiWu+tHZ05d0mKVW1rylfoe+hO1G9WT/AE2Vt27JOWPcYF2PkbWQHvtu/2S9Muo02pgi8WDQ9w2LyOTXfw6tj+n70zj/OxXP/4xdj3nUlp30jKKaRIUSmkiJR0RPZI1pAQ2WUXKluRKCUSKqSiIuVIC0mJZMmSfdbf6777facZM2Nmrr7PzLO8nz/Oi/k+1/3c9/vzOK9z3nN/r9uI7rVvT0jYxRtah2lfYYR4eq+QxDc7hd+fOyJZb9mQ1Eyf4N0g3QZOto9+d/ZQu9M4dJmWHnUe7G7/anYZP9rkriRTfLDdIDFCeVT/DnJP7arpnX6K95nWIS9MW2B3Lpv3MaXLtIsY0K1lwnlPjzzxvHz97XYZ3retNLizeoo15t+I+bdiagf1eOxfzdFNxQheN6URwLkgeL0ROoJXlxOCV8cNwavjRhUEIAABCEAAAhBwigCCNznZrBC8oZ2VpjXDkjnDkk1q7/5DUqdpN/vztASv+fr/nIUr7O7IEc+0S/HVadpuoGz98Rfp2+URad6ojr0nJCDPFrKhr/WbnqahHrRr1n0jnfqOsz12P5g/OsVnGIFnRF7zRndI3y7N03yFUxO8ofUM7NFSmtT/e/eq2YHcd9hLtm3Djl9+ty0KFr0y2PajNdewiXPltbc+kMG9Wkmje2ran4UnMPOUAAAgAElEQVRL8I6aMt/2wr2v7i0JLQfOXlyzDs+J2Xk9fnBnMS0fEvNNqZ3EueCEdkqbvrlDerdOdqvZLdyxz9h07uD9W/AaOb3mrXFJxjLC/9rarezPQm0tEt9ghLkR52fvIk4z2BRuCIlYs7PbtFxoeNfNElmquJXjpg2D4Wvm0+HRhvJEq/vtCKGWG2MGdLQ7fFO6psxebHeOn+vd18w3q2sQvFmdQMCfj+D1xguA4NXlhODVcUPw6rhRBQEIQAACEIAABJwigOBNTjYrBK8RskZkmp6nL4/umWLcN9XvKKb1QFqC1+zeNbt4TW/WLq0bpzhWqOWCOaSrR/sH7T2hXcJntxZ4ou94Wb3u6yRfjTdfgzc7R80OzFurVUrxGaYdgZGcNapWtF/3T+tKTfCar+Wbr+cnlnZG7hrJa3bI/vTLHtsPt0/n5nZHr7nub/WMbPt5tz3QrHTJovZn4RK8oXlednFZqXDFRSku68tvfhCzI9b0ijUC01whgW6ktOmBm94rJFYTt8dIXGtaJJixM7KDt+JVF8v8qf/00g2NV6FWS/vHDxe8IJGliiWZYmjd4ehva0Tu4aPHpHDBAsl2q5uHmnYhpm2I6cH8yTsT7c7y0CGD7OBN75vDfRAIEwEEb5hAOjwMglcHGMGr44bg1XGjCgIQgAAEIAABCDhFAMGbnGxWCN6QXL2t+vUyaeiTKcZtvj5vpGFagrdtz9Hy2YZv5cnHG0vbRxqkOFbv56fJ0g/Wy8P315Z+T7aw9/z+x0G5o1kP25P1s8UTbesBc0hbjfu7SHxcvO2Ba4SuuRK3jEjr3TSHeL02qV9at0lqgvf0mSipVr+jFC9iWk68YMcxu5nNPE2bAft5vQ5S86ZKth2E+cr/zQ2fECNgF8/8u+erucIleEN801yQiOVvcjBXSPAa2W2kd3qvNj1Gy7qNqecZau+REcGbWiYhwWuyNn2PE1/hFLxprd20A7mhblvb73jG2N5S9fqrpX3vF+STL/5n31fz3qZ0DR47R+YvXiUtH6xrD4vzy8UOXr8k6dF1IHi9ERyCV5cTglfHDcGr40YVBCAAAQhAAAIQcIoAgjc52awQvOYr6ear/+fqz1r93k5iDtxKS/A+2X+ifPjJV0nk4tmrDN3z+MP15Km2TRI+Du2SnPj8k3L7zddLqP+r+bP5WegK7eBNbSeo5n1NTfCascwO3S++/l5WvD5K4uLixByw1qzh7dL/qUfto5p3GiI7f9srny02B7V9JWaHcsumde0Bc6ErXII3NM9Wze6R7u2bpnupWsEb2kGduF1B4oeGDkDLCsH77KgZsmfvwXQxKBtZQp7r+XcLiPRc5pcN5pcO4557Qu6oeYMMnzRPXn1zpSTedX72OKGD2MxzGtf7uzWHHy4Erx9S9PAaELzeCA/Bq8sJwavjhuDVcaMKAhCAAAQgAAEIOEUAwZucbFYI3iUr18nTQ6fbHrKml+zZl/lKuznUzFxpCd5RL86XWW8stwdhmQOxUroaP/6sGDF4dj9Vs/vR7IK8986bZVjfNrY1gmmRMHbQE3LnrTckDBVqm2AOcjNtEsJxnUvwvjzvPRk7faHtQRsTGysDR8+SFwZ2krtq3WgfbT4z97w9Y4gseHe17eNqWl2YlhehK1yCN9Rb2PSBNf1g03tpBe+gMbNkwZI1VlimJEhD/ZuzQvCG1pQeBpdeVFbenfX3jmqzM9e800WLFEx2CKD53PTfrVa/g5gD/uZM6Cv/ufYKu+Pc7DyvXPEK+2/g7MuMefO9nWwbk8T9mNMzN7ffg+B1e0I+nx+C1xsBI3h1OSF4ddwQvDpuVEEAAhCAAAQgAAGnCCB4k5PNCsEb2oWZIyJCPlk8UQoVyJdkYqGepOaHaQne0KFbpp3C6oVjbauFxNf+g0fk9iZPSXx8vCydM0wuLheZ8LFpb2BEcsEC+eS914ZLzfu62P6n5iv7iccxrRvMfear9DPHPi1Vrr8qGciv/rfN9oW99upLJSIie5qvcEjw9ur0kPy3yV1J7v9++6/2kC0jOc+ciZalH663vVmLFSlo7zNf3Tdf4Tdf31+4ZLWYtgXrl0xOMudzCd78+fLIl8umJnlmavMx7S9MmwZTY3r8FsifN9naVn68US696Dy59MLzEj7TCt43Fq+S58bOkQvPLy3LXhuR7FnmFwPmFwRZIXjTDDWVG8wO7F179snQPm3sAWtnX6FD9HLnyinrlky2vXjNO1ez0ZMSHR0j77063PJIfBnmZuf2RReUsZ/76ULw+ilND64FweuN0BC8upwQvDpuCF4dN6ogAAEIQAACEICAUwQQvMnJZoXgNbL1rod6yp4/DtqDwsyBYaHr2x93WqEYHR0rJ0+dTlPwmt2PDf7bR37dvU8ebXKX9O70UMJY0TGx0m3gZFn16Sa5pUpFmTYy+eFnHfuMFSOJTQsCI5abNqhld/qefQ0Z96rdKWt2Zr44/CkpW6ZEwi1bftgp7XqNti0lFk4fKOVTOYws8Zj9hr8s7yz/VJo3qiN9uzyS5HGGT837u9i+sH8dOyn58+dN2A1qbjx+4pTc1KCj1Kh6raz9/H9yS5Vrkh3slpLgDfUdNmOY9g6hHsPm76nNx+wUbdS6v2zfudvuah7Wt60VkKHrrffWimldYOZqWkqEPtMK3gN/HpE7HuwuJrtnuraQh+77p/+s2UndfdBkOXHytKcE76QZb8uLcxbbX2SY3eHV/lM+gZ959/oMm27fnbPbYIyc/LrMXrhCKlx5kUwZ9lRCn2CTxePdR9ldwec6hM2p/x51elwEr9OEGf+cBBC83nhBELy6nBC8Om4IXh03qiAAAQhAAAIQgIBTBBC8yclmheA1szB9c01vXHNdccn5UuHKi+XosROydv1meapdE5n/zir57ff9aQpeU//dtl+s8DL15rCxa6682B5Gtvm7HfagtnJlS8uscU9L6ZJFkwFY9tEX0nPwi5IzZw67W/LVif2kcsXLk91nZHPbnmPk62+32wPPbrqhvBTMn8/unt20ZZu9v2ubB6RN8/rpen3nvf2RPD/+VSsqq1x3td0dnPhwtl6Dp8qyVV/YncdGchrZmfgyO3zNTmjzuRHkRpQnvlISvEaGm93MRgyeV6aEXFIuUmrfUlma3nubnGs+O37ZI626jbR1huGNlf7ewWx2Gu/49XcrdScP6yrVKv8jLrWC14w7ZfZimTzzbfsM0/e4TKni8uvuP2T7zj1Whoe4bVk1M2HJvYdMszudE2ewYs0GK/iz+pA18y52ePoF+fLrH+x8I0sVk9Ili9lfcBihba5a1a+TcYOesO9h6DItG8wvO8w7Z35+9eUXSlRUtPy44zebe2ptLNL1Arr4JgSvi8MJwtQQvN5IGcGrywnBq+OG4NVxowoCEIAABCAAAQg4RQDBm5xsVgleM5O1n2+Wl+YutaIwIiLCit7/Nq0rdWr8x+7w3b33gJWeRtCZK3QImhGJr7zQK8li9u4/JK/Me08+27BFzJ9zRGS3YteM1eKBO20bhpSuU6ejpOb9nW3/0/MjS9pdqKldRgCb/rDvfbhefvplj5XIRQoVkIpXXyLNGtaWGlUrpvvVNaJuwOhZsuqzTRITEysXnFdK3pk5JKHe7O41u2rNlbj/buiG0CFc5u9nt54wP0tJ8Jqfr9+4VYaMf1X27D0ghQrmt0K00T01rTg813wOHTkmM+e/Lx+v/8bmYg5/K1WiqFS5/mp7EFji9gzmOf9G8Jp6szN43tsfys5deyVHjgjbr7nVQ/fYXcuVare2GDZ/9IqYNh/mcrPgNfMzcn3R+2vl3RXr7G5o8wsD0+7CSNv7764h9WpXk2zZsiV7f0wury36wPbk/eW3P+y/k6svLycPNrzd1vjxQvD6MVUPrQnB642wELy6nBC8Om4IXh03qiAAAQhAAAIQgIBTBBC8yclmpeA9V87VG3SyO3IXz3ze7srlggAEgkEAwRuMnF27SgSva6NJMjEEry4nBK+OG4JXx40qCEAAAhCAAAQg4BQBzwre59pItqjTjmA5NXiOlClVSFLYPOjI80KDbtz8o/z86+9S/cZr7M7ZxFfoELacOSLsYWBnH5zm6MQYHAIQyFICCN4sxc/DEbzeeAcQvLqcELw6bgheHTeqIAABCEAAAhCAgFMEvCh4D/9+QE5LdqeQSM64GClxfmnHxk9t4C79J8hHn2yyX7mfMLhzgsQ9dvykdH5mgmz45ge5+/aqMvrZDpk+Nx4IAQhkHQEEb9ax58kiguD1xmuA4NXlhODVcUPw6rhRBQEIQAACEIAABJwi4EXB6xSLrB5315590qLzUHtwV/GihWyf3ZjYWNm8dYccPnrMHub1+pRnUzwYLavnzvMhAAHnCCB4nWPLyOkggOBNByQX3ILg1YWA4NVxQ/DquFEFAQhAAAIQgAAEnCKA4HWKrG7cPw4ckllvLJdPv9wi+w4ckpjYOClbpoTcWq2SPVDLiF8uCEAgWAQQvMHK23WrRfC6LpIUJ4Tg1eWE4NVxQ/DquFEFAQhAAAIQgAAEnCKA4HWKLONCAAIQCA8BBG94ODKKkgCCVwkuk8sQvDrgCF4dNwSvjhtVEIAABCAAAQhAwCkCCF6nyDIuBCAAgfAQQPCGhyOjKAkgeJXgMrkMwasDjuDVcUPw6rhRBQEIQAACEIAABJwigOB1iizjQgACEAgPAQRveDgyipIAglcJLpPLELw64AheHTcEr44bVRCAAAQgAAEIQMApAghep8gyLgQgAIHwEEDwhocjoygJIHiV4DK5DMGrA47g1XFD8Oq4UQUBCEAAAhCAAAScIoDgdYos40IAAhAIDwEEb3g4MoqSAIJXCS6TyxC8OuAIXh03BK+OG1UQgAAEIAABCEDAKQIIXqfIMi4EIACB8BBA8IaHI6MoCSB4leAyuQzBqwOO4NVxQ/DquFEFAQhAAAIQgAAEnCKA4HWKLONCAAIQCA8BBG94ODKKkgCCVwkuk8sQvDrgCF4dNwSvjhtVEIAABCAAAQhAwCkCCF6nyDIuBCAAgfAQQPCGhyOjKAkgeJXgMrkMwasDjuDVcUPw6rhRBQEIQAACEIAABJwigOB1iizjQgACEAgPAQRveDgyipIAglcJLpPLELw64AheHTcEr44bVRCAAAQgAAEIQMApAghep8gyLgQgAIHwEEDwhocjoygJIHiV4DK5DMGrA47g1XFD8Oq4UQUBCEAAAhCAAAScIuBFwRsfLxJv/sOhK1u2bJItm0ODMywEIACBDBJA8GYQGLeHlwCCN7w8nRoNwasji+DVcUPw6rhRBQEIQAACEIAABJwi4EXBu/PwMYmJjRenFG/27NnksmIFnULOuBCAAAQyRADBmyFc3BxuAgjecBN1ZjwEr44rglfHDcGr40YVBCAAAQhAAAIQcIqAFwXvroMnpPyueXIiPsYRLDsvbCEXFi/ALl5H6DIoBCCQUQII3owS4/6wEkDwhhWnY4MheHVoEbw6bgheHTeqIAABCEAAAhCAgFMEELzJySJ4nXrbGBcCENAQQPBqqFETNgII3rChdHQgBK8OL4JXxw3Bq+NGFQQgAAEIQAACEHCKAIIXwevUu8W4EIBAeAggeMPDkVGUBBC8SnCZXIbg1QFH8Oq4IXh13KiCAAQgAAEIQAACThFA8CJ4nXq3GBcCEAgPAQRveDgyipIAglcJLpPLELw64AheHTcEr44bVRCAAAQgAAEIQMApAghebwvet9//RJ4Z8YpUq1xeXnmhl1OviS/Gve2BrrL/4BGZN6W/VCp/qS/WZBax54+DcmezHmIOB9yyambCunoPmSZLP1wvXds8IG2a13ftemNj42T63CXy4uzFYv68ZM4wuaRcZKrzPXnqtMxeuEJWrtkgu/bst+u+9MLzpGHdW6RJg1qSIyIixdpNW7bJzDeWy+atP8lfx05I0SIFpWrl8tL2kQbnfJ4bwCF43ZBCgOeA4PVG+AheXU4IXh03BK+OG1UQgAAEIAABCEDAKQIIXgSvU+9WRsc9cvS43NzwCend6SF5tMldGS1P8/7UBO/z41+Vd1euky/eezHJGE7PJ80Jp/MGLwve3XsPyNPPT5evv92esNpzCd6jf52Qx54aLj/u+E1y58op5a+4SGLj4mTrjzutHL6t+vUyfnBniYjInoTem0s/lgGj/5bfF5xXSiJLF5Nfd++TfQcOS57cuWTayO5yQ6Ur00k8829D8GY+c56YiACC1xuvA4JXlxOCV8cNwavjRhUEIAABCEAAAhBwigCCF8Hr1LuV0XE/+WKLtO89xjHBGxUVLfEikitnDsmWLVvC9Jp1eE527tqbTPA6PZ+M8knt/tQEb3RMrMTFxdkdrWcLz3A9+9+Ms/LjjfLMiJfl9Jko6dyqkUye9Y5ER8eccwev2a1udq1XrniFTBzSRYoULmCnYERxmx6jZdeefdKnc3N5pPEdCVMzP7u3ZT+JiYmVEc+0k3q1q9nP4uPj5aW5S2X8y29JmZLF7HPz5c39b5bkWC2C1zG0DJweAgje9FDK+nsQvLoMELw6bgheHTeqIAABCEAAAhCAgFMEELwIXqferYyO++KcxTJpxtuOCd6U5mMk6I13t7O7Qc/ewZsV88koM3N/aoJXM1Zm1nTuN16+3/6rjHq2g1x/zeVy3R2Pn1PwHjpyTGo1ftJOccW8URJZuniS6X6+6Ttp3W2klbUfLhiTIPGHTpgrcxd9IA/Uv1UG9Xgs2RJbdB4qpn3Dcz1bSeN6NTMTQbqfheBNNypudIIAgtcJquEfE8GrY4rg1XFD8Oq4UQUBCEAAAhCAAAScIoDgdZfg/eGnXVZyGuFkdjZeXC7S7ka8/+4a0qLz87Jpy3Z5aXQPqX7DNXbi5+rBu3ffn/LK68vksw3fyh8HDklE9mxSplRxqVH1WnnswbulVIkidowN3/wgLbsOl7x5csmniyfZr6yffZ2JipZbGj4hJ0+dkVcn9rU7KM1ldlzOX7xKlq36Qn7auUdiYmOlZLHCcvON19i+r+eVKZHmq2t2WN7dvHey+ypefYlccF5JWfbRF/JM1xby0H21k9yzfPWX0n3QFPuzt15+Tq66rFySz0dOft32au3U8j7p2PI+ObtFQ6hH7dkPNqLv2VEzUpzP/BefTfj5wUNHZdaC5fLxum9k9x8HJUdEdjk/sqTcceuN0rJp3WS7QWs17ioH/jwiqxaOlWUffS5z3lwhh48ck1VvjpNiRQqmycms1zxv+8+7JUeOCLnikgvksWZ3y5WXXpDuHryh98W8T4bpxBmLZMXqL+Xg4b+kdImiVoI+/nA9K0ffem+tFaO//PaHFeDVb7xGnn7iYSlZ/O/35t9eC5eukTtvvVEKF8xvh0pL8C5atlb6j5whVa6/SmaOfTrFx9/a6EkxuZiczPtjrtpNutn3f/b4Pim2YViwZI0MGjNLalStKFNHdP+3y3KkHsHrCFYGTS8BBG96SWXtfQheHX8Er44bglfHjSoIQAACEIAABCDgFAEEb3KyOy9sIRcWLyCJvsXvFP4k427+bocVraaVgDlk6rprLpc/Dx+VT7/cYoXsx+s3y/adu2XOhL7yn2v/FqypCd4t3/8sbXqOlmPHT8pFF5SRa6682H4lfcsPO+3X2IsWLigzx/WWyy8+3/68TtPuVoKNe+4JuaPmDcnWa75O/9SASVK2TAlZ8fooKwBPnY6S1t1GiJl3oQL55KYbKkjePLntM3b8skfy5c0jr4zpKdemcaCZ6XU7Y/4y+ejTTVYmmgPjKlx5kd2haWSz+Vr+XbWqyAsDOyaZl5FyC5d+bOdvxGOLB+5M8vkDbQbYHaKhQ9XOFrzvr/pC1m3cKkYc5syZQx79//o6Nf4jH37yVYrzCUnmHb/+Lq2eGmFlounpWrni5XL6TLR89b8f7c/MoV+zJ/SxnENX3Yd7yW+/77c7lEdMft1yyZs7l7wwsFNCq4HUXrTX3/lIhox71X5sOF8QWdL2kP3qf9ukXYsGtr1Beg5Ze++jz6XX4KmW55moKMvH7J79Y/8h+WbrT3b8nh2ayakzZ+Sl15baZ8XFxcuGb763eZv36I1pAxKm2W/4y7Y9QnouI7+ff/rxVG9NS/Ca9RsOrR+6R7q1a5riOGZX8KrPvpZnn3pUHmx4u4T6KJubNy6fbn+JcfZlfqnS+PFnpXjRQrL27QnpWUqm34PgzXTkPDAxAQSvN94HBK8uJwSvjhuCV8eNKghAAAIQgAAEIOAUAQRvcrJZJXibtB0o3237RerXuUmG9mmT0DfVyNrHe4yS2NhYK9kS76BNSfCatgP1Wzxtxdt/m9wlPTs2S/i6upF1pu/p4hWf2QOqFk4faAGMmbrASta7b68qo5/tkAyKkbtG8rZ/9F7bL9VcIeFmpN/0UT2kcKG/d2Ia4frinHdl8sy37Y7WpXOGWYGa1tX12UnywdqNSVo07D94xO68LVGssHy8aHySIcyu36KFC9j+uTdcd5XtyRq6/jp+Uqo36CQF8+e1u5JND9qUDlkzwvy+x56RAvnzJmvRkNJ8zPiGYaPW/a1sb9qgljzT9dGErE6cPC09B79oZbzp9Tqyf/uEOTV4tI/8vGuvFdcDuv3X7qROz2UOFqvzYDe7e3pA95b2maHr2x93ymNdR8jJU6fTJXhXrPlSug2cIgUL5LMS3TAzIt5cZjfv1DnvWimdK1cOu5v1ikvOt5+FJKj589szhiT83PS2NTI/PdelF5WVd2c9n+qtaQle05/Z9EVOaTd3aNChE16TuYs+tO99r04Pifm3Y3osmzV9unhiis82fKvf28l+9uWyqZI/39883HQheN2URgDnguD1RugIXl1OCF4dNwSvjhtVEIAABCAAAQhAwCkCCN7kZLNC8O7as1/ubt7LTmb1m+MS2ieEZmcOgxr30pv2r2kJ3o8+2SRd+k+wOxI/WjhWcuaISLJIs6uxZqMuEhsbJwumDbSi78cdv1lpaQ6ZMkLUfCU/dBmxaNozmDYN77063O4IPnrshJivw5sWDe/MHGJ3Ap99NXysn23bMGFwF6ldo3Kar3BqQjUkEUPPNgPtO3BYbm/ylG1fYZ5hdqJ+9u6kBJG96tNN0vmZCUl2/oZL8K79fLN0eHqsbVWw8vVRkisRKzM3s4PXzM2IbrMjNLSLN7QO077CCPH0XiGJb3YKvz93RJID4swYIamZnh28K9ZskG4DJ9tHvzt7qN1pHLpMS486D/7dosDsMn60yV1Jpvhgu0FihPKo/h3kntpV0zv9dN+XluB95Inn5etvt8vwvm2lwZ3VUxzX/Bsx/1ZC/XbXb9xqfzli2C2fNzLFGvMLkevqtE713166F+DgjQheB+EydNoEELxpM3LDHQheXQoIXh03BK+OG1UQgAAEIAABCEDAKQII3uRks0LwhnZWmtYMS+YMSzapvfsPSZ2m3ezP0xK85uv/cxausDuBRzzTLsVXp2m7gbL1x1+kb5dHpHmjOvaekIA8W8iGvtZvepqGetCuWfeNdOo7zvbY/WD+6BSf8cK0BbYHcPNGd0jfLs3TfIVTE7yh9Qzs0VKa1P9796rZgdx32Eu2bcOOX363LQoWvTLY9qM117CJc+W1tz6Qwb1aSaN7/j44K1yCd9SU+bYX7n11b0m15YDZNWp2j44f3FlMy4fEfFNqJ3EuOKGd0qZv7pDef4vIxJfZLdyxz9h07uD9W/AaOb3mrXFJxjHC/9rarezPQm0tEt9ghLkR52fvIk4z2HTekJbgDbXcGDOgo9S9rUqKo06ZvdjuHA+9+6vXfS1P9B1vW56k9O8qNEiFWi3tH41AL1e2dDpnnHm3IXgzjzVPSoEAgtcbrwWCV5cTglfHDcGr40YVBCAAAQhAAAIQcIoAgjc52awQvEbIGpFpep6+PLpninHfVL+jmNYDaQles3vX7OI1vVm7tG6c4lihlgvmkK4e7R+094R2CZ/dWsAIMiPKEn813nwN3uwcLVK4gNxarVKKzzDtCIzkTO/hVakJXvO1fPP1/MTC2shdI3nNDtmfftlj++H26dzc7ug11/2tnpFtP++2B5qVLlnU/ixcgjc0z8suLisVrrgoxbV/+c0PYnbEml6xpmesuUIC3Uhp0wM3vVdIrCZuj5G41rRIMGNnZAdvxasulvlT/+mlGxovJDo/XPCCRJYqlmSKoXWH+tumd/7pvS8twRs6ZDAjO3g//+o7ad19JDt40xsC90EgJQIIXm+8FwheXU4IXh03BK+OG1UQgAAEIAABCEDAKQII3uRks0LwhuTqbdWvl0lDn0wxbvP1eSMN0xK8bXuOls82fCtPPt5Y2j7SIMWxej8/TZZ+sF4evr+29Huyhb3n9z8Oyh3NetierJ8tnmhbD5hD2mrc30Xi4+JtD1wjdM2VuGVEWu+mOcTrtUn90rpNUhO8p89ESbX6HaV4EdNy4gU7jtnNbOZp2gzYz+t1kJo3VbLtIEIHaxkBu3jmPz1fwyV4Q3zTXJCI5W9yMFdI8JretkZ6p/dq02O0rNuYep6h9h4ZEbypZRISvCZr0/c48ZXVgrd97xfkky/+Z99X896mdA0eO0fmL14lLR+saw+LMwf+NWs/yL63ny2elGLNoSPHpMZ9ne1nG96fZtuUuO1iB6/bEgnYfBC83ggcwavLCcGr44bg1XGjCgIQgAAEIAABCDhFAMGbnGxWCF7zlX/z1f9z9Wc1B0GZA6HSErxP9p8oH37yVRK5ePYqQ/c8/nA9eaptk4SPQ7skJz7/pNx+8/US6v9q/mx+FrpCO3hT2wmqeV9TE7xmLLND94uvv5cVr4+SuLg4MQesNWt4u/R/6lH7qOadhsjO3/ZaiffB2q/E7FBu2bSuPWAudIVL8Ibm2arZPdK9fdN0L1UreEM7qDs82lCeaHV/sueFDkDLCsH77KgZsmfvwXQxKBtZQp7r+XcLiJSutM6coRUAACAASURBVHbwDp80T159c6Uk3nV+9jihg9jMcxrXq2l3vJud7+ZKTd6GDmIzO73Njm83XgheN6YSoDkheL0RNoJXlxOCV8cNwavjRhUEIAABCEAAAhBwigCCNznZrBC8S1auk6eHTrc9ZE0v2bMvc3CXOdTMXGkJ3lEvzpdZbyy3B2GZA7FSuho//qwYMXh2P1Wz+9Hsgrz3zptlWN82tjWCaZEwdtATcuetNyQMFWqbYA5yM20SwnGdS/C+PO89GTt9oe1BGxMbKwNHz5IXBnaSu2rdaB9tPjP3vD1jiCx4d7W8/s5HttWFaXkRusIleEO9hU0fWNMPNr2XVvAOGjNLFixZY4VlSoI01L85KwRvaE3pYXDpRWXl3Vn/7Kg+uyYtwWt2nJud55UrXmH/DZx9xcXFy833drJSN3E/ZnN4odnl/MoLvaRa5fLJ6mYvXCEjJ79uDwI0O8DdeCF43ZhKgOaE4PVG2AheXU4IXh03BK+OG1UQgAAEIAABCEDAKQII3uRks0LwhnZh5oiIkE8WT5RCBfIlmdiM+ctkzNQF9mdpCd7QoVvma+mrF461rRYSX/sPHpHbmzwl8fHxsnTOMLm4XGTCx6a9gRHJBQvkk/deGy417+tiv7JuvrKfeBzTusHcdyYqWmaOfVqqXH9VMpBf/W+b7Qt77dWXSkRE9jRf4ZDg7dXpIflvk7uS3P/99l/FHLJlJOeZM9Gy9MP18sk7E6VYkYL2PvPVffMVfvP1/YVLVluht37J5CRzPpfgzZ8vj3y5bGqSZ6Y2H9P+wrRpMDVmx2eB/HmTrW3lxxvl0ovOk0svPC/hM63gfWPxKnlu7By58PzSsuy1EcmeZX4xYH5BkBWCN81QM3BDWoLXvHM1Gz0p0dEx8t6rwy2PxJdhbnZuX3RBGft56ArJ//p33CQj+iU9dND8G2jUur/t12x+GWJ+KeLGC8HrxlQCNCcErzfCRvDqckLw6rgheHXcqIIABCAAAQhAAAJOEUDwJiebFYLXiKa7Huope/44aA8KMweGha5vf9xphWJ0dKycPHU6TcEbGxsnDf7bR37dvU8ebXKX9O70UMJY0TGx0m3gZFn16Sa5pUpFmTayezIAHfuMFSOJTQsCI5abNqhld/qefQ0Z96rdKWt2Zr44/CkpW6ZEwi2m92m7XqNtS4mF0wdK+VQOI0s8Zr/hL8s7yz+V5o3qSN8ujyR5nOFT8/4uti/sX8dOSv78eZPsBj1+4pTc1KCj1Kh6raz9/H9yS5VrxPS6TXylJHhDfYfNfaa9Q6jHsPl7avMxO0WNFNy+c7fd1Tysb1vJkztXwqPeem+tmNYFZq6mpUToM63gPfDnEbnjwe5iskt80J15oNlJ3X3QZDlx8rTvBa9Zr9lpa3bcVrjyIpky7KmEPsEmi8e7jxKz0/3sQ9jMLzTqtegtJ0+dkUE9HpMH6t9qszI7wc0vTcwBh5eUi5RFM4ZIzhwRTv1X7b8aF8H7r/BR/G8JIHj/LcHMqUfw6jgjeHXcELw6blRBAAIQgAAEIAABpwggeJOTzQrBa2Zh+uaa3rjmuuKS86XClRfL0WMnZO36zfJUuyYy/51V8tvv+9MUvKb+u22/WOFl6s1hY9dcebE9jGzzdzvsQW3lypaWWeOeFtN39Oxr2UdfSM/BL0rOnDnsbslXJ/aTyhUvT3afkc1te46Rr7/dbg88u+mG8lIwfz67e3bTlm32/q5tHpA2zeun6/Wd9/ZH8vz4V62orHLd1XZ3cOLD2XoNnirLVn1hdx4/dF9tKzsTX2aHr9kJbT43gtyI8sRXSoLXyHCzm9mIwfPKlLCir/YtlaXpvbfJueaz45c90qrbSFtnGN5Y6e8dzGan8Y5ff7dSd/KwrklaAmgFrxl3yuzFMnnm2/YZpu9xmVLF5dfdf8j2nXusDA9x27JqZsKSew+ZZnc6J85gxZoNVvBn9SFr5h3pPmhKknzMO2su8wuD3Il2nZs2GOXKlrKfGUlrftlh3jnzfl59+YUSFRUtP+74zeaeWhsLs7u3x3NTxOQdWbq4RJYqLjt37ZXDR49J4YL5ZcbY3nLVZeXS9Z5mxU0I3qygzjMTCCB4vfEyIHh1OSF4ddwQvDpuVEEAAhCAAAQgAAGnCCB4k5PNKsFrZrL2883y0tylVhRGRERY0fvfpnWlTo3/2B2+u/cesNLTCDpzhQ5BM71FTY/RxNfe/YfklXnvyWcbtoj5c46I7FbsmrFaPHCnbcOQ0nXqdJTUvL+zlWnnR5a0u1BTu4wANv1h3/twvfz0yx4rkYsUKiAVr75EmjWsLTWqVkz3q2tE3YDRs2TVZ5skJiZWLjivlLwzc0hCvdnda3bVmitx/93QDaFDuMzfz249YX6WkuA1P1+/casMGf+q7Nl7QAoVzG+FaKN7alpxeK75HDpyTGbOf18+Xv+NzcUc/laqRFGpcv3V9iCwxO0ZzHP+jeA19WZn8Ly3P7RiMkeOCNuvudVD99hdy5Vqt7YYNn/0ipg2H+Zys+A1O27ve+yZdL0b5h24/OLzE+41uby26AMxPXl/+e0P++/k6svLyYMNb5d6taulOqb5NzX9tSWycfOPYto9lCheRGpWqyTtHmmQ4i860jW5TLoJwZtJoHlMygQQvN54MxC8upwQvDpuCF4dN6ogAAEIQAACEICAUwQQvMnJZqXgPVfO1Rt0sjtyF8983u7K5YIABIJBAMEbjJxdu0oEr2ujSTIxBK8uJwSvjhuCV8eNKghAAAIQgAAEIOAUAa8K3tv2vCOn4mMcwbL+/AekXPH8ki2bI8OnOqjZWfjzr79L9RuvsTtnE1+hQ9hMj1BzGNjZB6dl7kx5GgQgkJkEELyZSZtnJSOA4PXGS4Hg1eWE4NVxQ/DquFEFAQhAAAIQgAAEnCLgRcG7/chf4pDbtZhjI+Ll6qKFnUKe6rhd+k+Qjz7ZZL9yP2Fw5wSJa75O3vmZCbLhmx/k7turyuhnO2T63HggBCCQdQQQvFnHnieLCILXG68BgleXE4JXxw3Bq+NGFQQgAAEIQAACEHCKgBcFr1MssnrcXXv2SYvOQ+3BXcWLFrJ9dmNiY2Xz1h32MChzmNfrU551fb/QrObI8yHgNwIIXr8l6rH1IHi9ERiCV5cTglfHDcGr40YVBCAAAQhAAAIQcIoAgtcpsrpx/zhwSGa9sVw+/XKL7DtwSGJi46RsmRJya7VK9kAtI365IACBYBFA8AYrb9etFsHrukhSnBCCV5cTglfHDcGr40YVBCAAAQhAAAIQcIoAgtcpsowLAQhAIDwEELzh4ejZUTZt2SYz31gum7f+JH8dOyFFixSUqpXLS9tHGsgl5SIzvK61n2+WeW9/KP/7/mc5fuKUFCyQTypccZE0a3i73H5L5WTjIXgzjDhLChC8OuwIXh03BK+OG1UQgAAEIAABCEDAKQIIXqfIMi4EIACB8BBA8IaHoydHeXPpxzJg9Ew79wvOKyWRpYvJr7v3yb4DhyVP7lwybWR3uaHSlele2/BJ8+TVN1fa+0sWLyJlShaV3/YekCNHj9uftWp2j3Rv3zTJeAjedOPN0hsRvDr8CF4dNwSvjhtVEIAABCAAAQhAwCkCCF6nyDIuBCAAgfAQQPCGh6PnRjGN2e9t2U9iYmJlxDPtpF7tanYN8fHx8tLcpTL+5bekTMlismTOMMmXN3ea61v58UZ5asAkyZ49mwzp/bjce2d1yZYtm8TGxsmsBcvlhWkL7BgLpw+U8ldclDAegjdNtK64AcGriwHBq+OG4NVxowoCEIAABCAAAQg4RQDB6xRZxoUABCAQHgII3vBw9NwoQyfMlbmLPpAH6t8qg3o8lmz+5lRO077huZ6tpHG9mmmur2XX4bLhmx/kv03ukl6dHkp2/8MdB8vm73bY1g9PPt4YwZsmUXfdgODV5YHg1XFD8Oq4UQUBCEAAAhCAAAScIoDgdYos40IAAhAIDwEEb3g4em6U2k26iTl5c/b4Pim2YViwZI0MGjNLalStKFNHdE9zfeb+PXsPSIM7qstlF5dNdv/z41+VeW9/JPffXUOG9G6N4E2TqLtuQPDq8kDw6rgheHXcqIIABCAAAQhAAAJOEUDwOkWWcSEAAQiEhwCCNzwcPTWK6Yl7c8Mn7Jw3Lp8uefPkSjb/H37aJY0ff1aKFy0ka9+e8K/X1+O5F+X9VV+wg/dfk8yaARC8Ou4IXh03BK+OG1UQgAAEIAABCEDAKQIIXqfIMi4EIACB8BBA8IaHo6dG2fL9z9Ksw3NStHBB+XTxxBTnfvSvE1L93k72sy+XTZX8+fKo13joyDG566Eecup0lLwzY0iSHb704FVjzdRCBK8ON4JXxw3Bq+NGFQQgAAEIQAACEHCKAILXKbKMCwEIQCA8BBC84eHoqVHWb9wqj/cYJRecV0qWzxuZ4tyjY2Llujp/t1JY/eY4KVWiiGqN5pC1Tn3HyidfbJEm9WvJwB4tk4zz519RqnG1RXHx8fLbnniZMi1CO0Qg6xC8utgRvDpuRvCuPb+RFM2V9gGPuidQBQEIQAACEIAABCCQEQLFCyX/1mdG6rkXAhCAAAScJYDgdZavK0dfve5reaLveLmkXKQsmTMs1TlWqPW3jH1/7ggpV7Z0htdy+kyU9Bw8VVZ9ukkqlb9UZo57WnLnypnhccJZEBUTJ1u3RclkBG+GsCJ4M4Qr4WYEr46bEbyfXNBYLi1eQDcAVRCAAAQgAAEIQAACEIAABCAAgQARQPAGKOzQUj//6jtp3X2kozt4Dx46Kk/0HSdbftgplSteIZOHdZVCBfIlo30mOi5TE4iOjZPtP8cgeDNIHcGbQWD/fzuCV8ctJHjPL5T8vzN0I1IFAQhAAAIQgAAEIPBvCOTOmf3flFMLAQhAAAIOE0DwOgzYjcMb6dqs/SApUriAfLZ4UopTNH1za9zX2X624f1pki9v+r8q/dPOPdL+6Rdk774/5a5aVWRY3zap7tylB68b35Dkc0Lw6nJC8Oq40YNXx40qCEAAAhCAAAQg4BQBevA6RZZxIQABCISHAII3PBw9Ncpfx0/KTfU7nlPehg5iK12yqKxaODbd6/vhp13y3yeHyfETp6RdiwbSuVUjyZYtW6r1CN50o83SGxG8OvwIXh03BK+OG1UQgAAEIAABCEDAKQIIXqfIMi4EIACB8BBA8IaHo+dGubt5L9m1Z7+88kIvqVa5fLL5z164QkZOfl1q16gsEwZ3Sdf6ft29Tx55YoiY3b/mMDVzqFpaF4I3LULu+BzBq8sBwavjhuDVcaMKAhCAAAQgAAEIOEUAwesUWcaFAAQgEB4CCN7wcPTcKGOnL5SX570n9e+4SUb0a5dk/vHx8dKodX/Z9vNuGdW/g9xTu2qa6zMHqj3QZoDs3LVX+nRuLo80viPNGnMDgjddmLL8JgSvLgIEr44bglfHjSoIQAACEIAABCDgFAEEr1NkGRcCEIBAeAggeMPD0XOj7D94ROq16C0nT52RQT0ekwfq32rXEBMbK2OmLpA5C1fIJeUiZdGMIZIzR0TC+l6au1T2HTgstapfJ7dUqZjw83EvvSnms5rVKsmLw59KNw8Eb7pRZemNCF4dfgSvjhuCV8eNKghAAAIQgAAEIOAUAQSvU2QZFwIQgEB4CCB4w8PRk6Os/Hij9HhuisTGxklk6eISWaq43YF7+OgxKVwwv8wY21uuuqxckrWZnb0/7vjN9tZt/+i99rPo6Bi5qUFHOXU6Ss6PLCmFCuZPlUfxooVk6ohuCZ8jeL3x6iB4dTkheHXcELw6blRBAAIQgAAEIAABpwggeJ0iy7gQgAAEwkMAwRsejp4d5fvtv8r015bIxs0/yrHjJ6VE8SJ2F267RxqIOWDt7CslwXvy1Gm58e726WJQqkQRWf3mOARvumi55yYEry4LBK+OG4JXx40qCEAAAhCAAAQg4BQBBK9TZBkXAhCAQHgIIHjDw5FRlATYwasEl8llCF4dcASvjhuCV8eNKghAAAIQgAAEIOAUAQSvU2QZFwIQgEB4CCB4w8ORUZQEELxKcJlchuDVAUfw6rgheHXcqIIABCAAAQhAAAJOEUDwOkWWcSEAAQiEhwCCNzwcGUVJAMGrBJfJZQheHXAEr44bglfHjSoIQAACEIAABCDgFAEEr1NkGRcCEIBAeAggeMPDkVGUBBC8SnCZXIbg1QFH8Oq4IXh13KiCAAQgAAEIQAACThFA8DpFlnEhAAEIhIcAgjc8HBlFSQDBqwSXyWUIXh1wBK+OG4JXx40qCEAAAhCAAAQg4BQBBK9TZBkXAhCAQHgIIHjDw5FRlAQQvEpwmVyG4NUBR/DquCF4ddyoggAEIAABCEAAAk4RQPA6RZZxIQABCISHAII3PBwZRUkAwasEl8llCF4dcASvjhuCV8eNKghAAAIQgAAEIOAUAQSvU2QZFwIQgEB4CCB4w8ORUZQEELxKcJlchuDVAUfw6rgheHXcqIIABCAAAQhAAAJOEUDwOkWWcSEAAQiEhwCCNzwcGUVJAMGrBJfJZQheHXAEr44bglfHjSoIQAACEIAABCDgFAEEr1NkGRcCEIBAeAggeMPDkVGUBBC8SnCZXIbg1QFH8Oq4IXh13KiCAAQgAAEIQAACThFA8DpFlnEhAAEIhIcAgjc8HBlFSQDBqwSXyWUIXh1wBK+OG4JXx40qCEAAAhCAAAQg4BQBBK9TZBkXAhCAQHgIIHjDw5FRlAQQvEpwmVyG4NUBR/DquCF4ddyoggAEIAABCEAAAk4RQPA6RZZxIQABCISHAII3PBwZRUkAwasEl8llCF4dcASvjhuCV8eNKghAAAIQgAAEIOAUAQSvU2QZFwIQgEB4CCB4w8ORUZQEELxKcJlchuDVAUfw6rgheHXcqIIABCAAAQhAAAJOEUDwOkWWcSEAAQiEhwCCNzwcGUVJAMGrBJfJZQheHXAEr44bglfHjSoIQAACEIAABCDgFAEEr1NkGRcCEIBAeAggeMPDkVGUBBC8SnCZXIbg1QFH8Oq4BUrwZhM5cUJE4nWsglqVLZtIvnxBXT3rhgAEIAABCGQ+AQRv5jPniRCAAAQyQgDBmxFa3Bt2AgjesCN1ZEAErw4rglfHLUiCNzZGZMvW7LJtezYdrIBWVbwmTq6+Cise0PhZNgQgAAEIZAEBBG8WQOeREIAABDJAAMGbAVjcGn4CCN7wM3ViRASvjiqCV8ctSII3Jkbkg4+yy/ovsutgBbTqzjpxckv1uICunmVDAAIQgAAEMp8AgjfzmfNECEAAAhkhgODNCC3uDTsBBG/YkToyIIJXhxXBq+OG4NVxC1IVgjdIabNWCEAAAhBwAwEErxtSYA4QgAAEUieA4OXtyFICCN4sxZ/uhyN4040qyY0IXh03BK+OW5CqELxBSpu1QgACEICAGwggeN2QAnOAAAQggODlHXApAQSvS4M5a1oIXl1OCF4dNwSvjluQqhC8QUqbtUIAAhCAgBsIIHjdkAJzgAAEIIDg5R1wKQEEr0uDQfCGJRgErw4jglfHLUhVCN4gpc1aIQABCEDADQQQvG5IgTlAAAIQQPDyDriUAILXpcEgeMMSDIJXhxHBq+MWpCoEb5DSZq0QgAAEIOAGAgheN6TAHCAAAQggeHkHXEoAwevSYBC8YQkGwavDiODVcQtSFYI3SGmzVghAAAIQcAMBBK8bUmAOEIAABBC8vAMuJYDgdWkwCN6wBIPg1WFE8Oq4BakKwRuktFkrBCAAAQi4gQCC1w0pMAcIQAACCF7eAZcSQPC6NBgEb1iCQfDqMCJ4ddyCVIXgDVLarBUCEIAABNxAAMHrhhSYAwQgAIEACN6Y2FjZtWe//LH/T4mNjZcaVSuSuwcIIHg9EJKIlC8v0qzWbsnXv4U3JuySWSJ4dUEgeHXcglSF4A1S2qwVAhCAAATcQADB64YUmAMEIAABHwveXXv2yeRZ78iqT7+Wk6dO25WWKlFEVr85LmHVE2cskpLFi0izhrfzLriMAILXZYGkMh0Ery4nBK+OG4JXxy1IVQjeIKXNWiEAAQhAwA0EELxuSIE5QAACEPCp4P14/WbpOmCSREVFJ1nh2YK3TtNusnf/IWne6A7p26U574OLCCB4XRTGOaaC4NXlhODVcUPw6rgFqQrBG6S0WSsEIAABCLiBAILXDSkwBwhAAAI+FLxG2DZ49Gk5dTpKSpcsKvffXUMqXnWJdOo7LskOXtO6YeTk+TJ30QeWwmuT+sn111zOO+ESAghelwSRxjQQvLqcELw6bgheHbcgVSF4g5Q2a4UABCAAATcQQPC6IQXmAAEIQMCHgnfk5Ndl9sIVUrni5TJtZA/Jlze3XWWFWi2TtWgwPx81Zb7MWrBcGt51swzt04Z3wiUEELwuCQLB60gQCF4dVgSvjluQqhC8QUqbtUIAAhCAgBsIIHjdkAJzgAAEIOBDwXtvy36y45c98u7soXLpheclrDA1wXvoyDGpeX8XOT+ypCyfN5J3wiUEELwuCQLB60gQCF4dVgSvjluQqhC8QUqbtUIAAhCAgBsIIHjdkAJzgAAEIOBDwVvlnvaSI0eErHt3cpLVpSZ4zU21GneVv46dkE0rX+KdcAkBBK9LgkDwOhIEgleHFcGr4xakKgRvkNJmrRCAAAQg4AYCCF43pMAcIAABCPhQ8F5Xp7VEli4u789Nuhv3XIL3zmY95MCho/I1gtc1/yYQvK6J4pwToQevLicEr44bglfHLUhVCN4gpc1aIQABCEDADQQQvG5IgTlAAAIQ8KHgrd2kmxw8dFTWL52S0H/XLDM1wXvk6HGp2aiLlCpRVD58YwzvhEsIIHhdEkQa00Dw6nJC8Oq4IXh13IJUheANUtqsFQIQgAAE3EAAweuGFJgDBCAAAR8K3m4DJ8uKNRukS+vG0q5Fg4QVpiZ4B70wWxa8u1rq1a4mI/u3551wCQEEr0uCQPA6EgSCV4cVwavjFqQqBG+Q0matEIAABCDgBgIIXjekwBwgAAEI+FDwfrbhW2nbc7RdWZvm9aVl07pSpHCBZDt4t/28W6a9+q4sX/2lvXfWuKflxuuu4p1wCQEEr0uCQPA6EgSCV4cVwavjFqQqBG+Q0matEIAABCDgBgIIXjekwBwgAAEI+FDwmiX1HfaSLF7xmV1d9uzZ5PzIkrJrz37JEREhZSNLyL4Dh+X0maiE1TdtUEsGdG/J++AiAgheF4VxjqnQokGXE4JXxw3Bq+MWpCoEb5DSZq0QgAAEIOAGAgheN6TAHCAAAQj4VPDGxsbJxBmLZNaC5RIdHZPqKnPmiLC7fNs/2lAiIrLzPriIAILXRWEgeMMeBoJXhxTBq+MWpCoEb5DSZq0QgAAEIOAGAgheN6TAHCAAAQj4VPCGlrX/4BFZ+fEG+frb7fbgtVOnz0i+vHmkdMmiUqn8ZVL3tipSrEhB3gMXEkDwujCUFKbEDl5dTgheHTcEr45bkKoQvEFKm7VCAAIQgIAbCCB43ZACc4AABCDgc8FLwN4lgOD1RnYIXl1OCF4dNwSvjluQqhC8QUqbtUIAAhCAgBsIIHjdkAJzgAAEIOBDwTts4lw5eeqMNGt4u1S48iIy9igBBK83gkPw6nJC8Oq4IXh13IJUheANUtqsFQIQgAAE3EAAweuGFJgDBCAAAR8K3uvvbCNRUdHyypheUu0/5cnYowQQvN4IDsGrywnBq+OG4NVxC1IVgjdIabNWCEAAAhBwAwEErxtSYA4QgAAEfCh4Gz7WT37auUcG92olje6pScYeJYDg9UZwCF5dTgheHTcEr45bkKoQvEFKm7VCAAIQgIAbCCB43ZACc4AABCDgQ8G7Zt030nXAJIksVUzmTOgrJYsXIWcPEkDweiM0BK8uJwSvjhuCV8ctSFUI3iClzVohAAEIQMANBBC8bkiBOUAAAhDwoeA1S9rx6+/y0tylsm7Dt3L7zZXllqoVpUSxwlKwQD7Jli1bqqu+pFwk74RLCCB4XRJEGtNA8OpyQvDquCF4ddyCVIXgDVLarBUCEIAABNxAAMHrhhSYAwQgAAEfCt4b6raV02eiJT4+PsP5bl0zK8M1FDhDAMHrDNdwj4rg1RFF8Oq4IXh13IJUheANUtqsFQIQgAAE3EAAweuGFJgDBCAAAR8K3gq1WqpzRfCq0YW9EMEbdqSODIjg1WFF8Oq4IXh13IJUheANUtqsFQIQgAAE3EAAweuGFJgDBCAAAR8K3sUrPpOcOXJIRER2yRERkaGMa9eonKH7udk5Aghe59iGc2QEr44mglfHDcGr4xakKgRvkNJmrRCAAAQg4AYCCF43pMAcIAABCPhQ8BKqPwggeL2RI4JXlxOCV8cNwavjFqQqBG+Q0matEIAABCDgBgIIXjekwBwgAAEIIHh5B1xKAMHr0mDOmhaCV5cTglfHDcGr4xakKgRvkNJmrRCAAAQg4AYCCF43pMAcIAABCCB4eQdcSgDB69JgELxhCQbBq8OI4NVxC1IVgjdIabNWCEAAAhBwAwEErxtSYA4QgAAEfCh4+w57KcO5xsTEyumoKJkwuEuGaylwhgCC1xmu4R6VHbw6ogheHTcEr45bkKoQvEFKm7VCAAIQgIAbCCB43ZACc4AABCDgQ8FboVZLda5b18xS11IYXgII3vDydGo0BK+OLIJXxw3Bq+MWpCoEb5DSZq0QgAAEIOAGAgheN6TAHCAAAQj4UPDe27LfuXONj5cjfx2XPw//Ze+76rJycl6ZEpIvT24Z8Uw73gmXEEDwuiSINKaB4NXlhODVcUPw6rgFqQrBG6S0WSsEIAABCLiBAILXDSkwBwhAAAI+FLzpDXXXnv0y4/VlsmLNlzKsb1upVf269JZyXyYQQPBmAuQwPALBq4OI4NVxQ/DquAWpCsEbpLRZKwQgAAEIuIEAgtcNKTAHCEAAAgEWvKGlD580T+YvXiXzi8oMIwAAIABJREFUJj8j5a+4iHfCJQQQvC4JIo1pIHh1OSF4ddwQvDpuQapC8AYpbdYKAQhAAAJuIIDgdUMKzAECEIAAglcOHTkmNe/vInfVulHGDOjIO/H/BDZt2SYz31gum7f+JH8dOyFFixSUqpXLS9tHGsgl5SJVnI4eOyEDR8+UlR9vlOJFC8natyekOg6CV4U404sQvDrkCF4dNwSvjluQqhC8QUqbtUIAAhCAgBsIIHjdkAJzgAAEIIDgtQRuadhZ8uTJJR++MYZ3QkTeXPqxDBg907K44LxSElm6mPy6e5/sO3BY8uTOJdNGdpcbKl2ZIVafb/pO+g57yY5hLgRvhvC59mYEry4aBK+OG4JXxy1IVQjeIKXNWiEAAQhAwA0EELxuSIE5QAACEEDwSnx8vNxQt53ExsbKNx++Evh3YteefWIOqouJibWHztWrXc0yMZxemrtUxr/8lpQpWUyWzBkm+fLmThevsdMXysvz3pMihQvIQw1ry4tzFiN400XO/TcheHUZIXh13BC8Om5BqkLwBilt1goBCEAAAm4ggOB1QwrMAQIQgACCV9Z+vlk6PD1WChfKL+venRz4d2LohLkyd9EH8kD9W2VQj8eS8WjReaiY9g3P9WwljevVTBevqvU6yFWXlZORz7SXPw4ckoc7Dkbwpouc+29C8OoyQvDquCF4ddyCVIXgDVLarBUCEIAABNxAAMHrhhSYAwQgAAEfCt41675JM9d4iZdjx0/Ktz/slLfeWyunz0RJjarXytQR3dKs9fsNtZt0sxJ29vg+KbZhWLBkjQwaM0tqVK0oU0d0TxeOWW8slxYP3CkREdll83c7ELzpouaNmxC8upwQvDpuCF4dtyBVIXiDlDZrhQAEIAABNxBA8LohBeYAAQhAwIeCt0KtlhnONXv2bDJrXB/5z7VXZLjWTwVHjh6Xmxs+YZe0cfl0yZsnV7Ll/fDTLmn8+LNp7sBNjQuC109vjAiCV5cnglfHDcGr4xakKgRvkNJmrRCAAAQg4AYCCF43pMAcIAABCCB45ZorL5Yn2zSW6jdcE/j3Ycv3P0uzDs9J0cIF5dPFE1PkcfSvE1L93k72sy+XTZX8+fJkiBuCN0O4XH8zglcXEYJXxw3Bq+MWpCoEb5DSZq0QgAAEIOAGAgheN6TAHCAAAQj4UPCaHabpuXLnyimlShTNsKBMz9hevWf9xq3yeI9RcsF5pWT5vJEpLiM6Jlauq9Pafrb6zXFSqkSRDC03vYL3z7+iMjTuv705Lj5eftsTL1OmRfzboQJVj+DVxY3g1XEzgnft+Y2kaK70HfCoe4o7qk6fiZPlH2ST9V9kd8eEPDILI3hr1RCJyJ7NIzNmmhCAAAQgAAFvEyheKPm3Pr29ImYPAQhAwF8EssXHx8f7a0msJi0Cq9d9LU/0HS+XlIuUJXOGpXp7qA3G+3NHSLmypdMaNsnn6RW8GRo0DDdHxcTJ1m1RMhnBmyGaCN4M4Uq4GcGr42YE7ycXNJZLixfQDeChqj+PRss778UheDOYmRG899SJkAJ5c2SwktuPn4oR/odfxt+DgrxrGYdGBQQgAAEIQAACEIBAphFA8GYaavc86POvvpPW3Ue6Ygfvmei4TAUTHRsn23+OQfBmkDqCN4PA/v92BK+OW0jwnl8on24AD1UdPR4jS96PR/BmMDMjeO+8Lbvkzc23MTKC7tSZWFl9ZLd8fmZfRsoCf+91uUvKbYXOk6J5/f+tgsCHDQAIQCBVArlz8m0jXg8IQAACbibgacEbFxcvy1Z9LidOnJIHG96ehPPX326Xia8sku+3/yp58uSSO2+9UTq3aiQF8ud1cx6ZMrctP+yUZu0HSZHCBeSzxZNSfOahI8ekxn2d7Wcb3p8m+TL4f2rSu4P39z9PZcqaEz/kjz+yyZTpSIGMgEfwZoTWP/cieHXc6MGr4xakKnrw6tI2O3cnHf2fDD+8STdAQKvaFaogTxetLLmy8b8dAvoKsGwIQEBE6MHLawABCEDA3QQ8K3hNZ4nug16UFWu+lGr/KS+vjOmVQPp/3+2QR58cJtHRMUnoVyp/qbw6sZ9ERAT7t49/HT8pN9XveE55GzqIrXTJorJq4dgMv8UI3gwjc3UBglcXD4JXxw3Bq+MWpCoEry5tBK+OG4JXx40qCEDAXwQQvP7Kk9VAAAL+I+BZwbvsoy+k5+AXJVu2bPLw/bWlb5dHEtJ5sN0g+fbHnVK8aCFp8cCdcur0GZn1xnI5ExUtQ/u0kYZ33ey/JDO4orub95Jde/bLKy/0kmqVyyernr1whYyc/LrUrlFZJgzuksHRRRC8GUbm6gIEry4eBK+OG4JXxy1IVQheXdoIXh03BK+OG1UQgIC/CCB4/ZUnq4EABPxHwLOCt8PTY2Xt55ula5sHpE3z+gnJfLftF2nSdqD9+9zJz8h1FS6zf35n+afSb/jLUrNaJXlx+FP+SzKDKxo7faG8PO89qX/HTTKiX7sk1WZ3dKPW/WXbz7tlVP8Ock/tqhkcHcGbYWAuL0Dw6gJC8Oq4IXh13IJUheDVpY3g1XFD8Oq4UQUBCPiLAILXX3myGghAwH8EPCt4azXuKoeO/GV7yBYs8M9BPFNmL5bJM98W045h3pT+CYmdPhMlVe/pIMWKFpTVb47zX5IZXNH+g0ekXovecvLUGRnU4zF5oP6tdoSY2FgZM3WBzFm4Qi4pFymLZgyRnDn+6Tn30tylsu/AYalV/Tq5pUrFVJ/KDt4MBuLy2xG8uoAQvDpuCF4dtyBVIXh1aSN4ddwQvDpuVEEAAv4igOD1V56sBgIQ8B8BzwreSrVbS9EiBWXNW0llbaunRsgXX3+fbGevie7WRk/K0WMn5JsPXvZfkooVrfx4o/R4borExsZJZOniElmquOzctVcOHz0mhQvmlxlje8tVl5VLMrLZ2fvjjt/sgXXtH7034bPlq7+UV15flvB30xbDjGX6HV956T9jFCqQz7aFCF0csqYILgtKELw66AheHTcEr45bkKoQvLq0Ebw6bgheHTeqIAABfxFA8PorT1YDAQj4j4CnBW+RwgXk40XjE1Ixh6pVrdfB9to1u3fNLt7ElxG8J06eko3Lp/svSeWKvt/+q0x/bYls3PyjHDt+UkoUL2LbWLR7pIGYA9bOvlITvHMXfShDJ7yW5iwKF8ov696djOBNk5S7bkDw6vJA8Oq4IXh13IJUheDVpY3g1XFD8Oq4UQUBCPiLAILXX3myGghAwH8EPCt4Qy0aPl/6ouTLm9sms+rTTdL5mQl29+kn70y0u0dDV1RUtNxwdzspU7KYrJw/2n9JenRF7OD1RnAIXl1OCF4dNwSvjluQqhC8urQRvDpuCF4dN6ogAAF/EUDw+itPVgMBCPiPgGcFb8c+Y+Xj9ZvlqbZN5PGH69ldu4888byYQ9buv7uGDOndOklapoVA90FT5OYbr5Hpo3r4L0mPrgjB643gELy6nBC8Om4IXh23IFUheHVpI3h13BC8Om5UQQAC/iKA4PVXnqwGAhDwHwHPCt73V30hPZ570SZy0QVl5PiJU3Lw0FH798Uzn5fLLi6bkJZpP9D12Um2t2ziA8X8F6f3VoTg9UZmCF5dTgheHTcEr45bkKoQvLq0Ebw6bgheHTeqIAABfxFA8PorT1YDAQj4j4BnBW98fLwVvGZnbuKr7SMN5MnHGyf8yPTl/U/dtvYgsbJlSsg7M4dIvrx5/JekR1eE4PVGcAheXU4IXh03BK+OW5CqELy6tBG8Om4IXh03qiAAAX8RQPD6K09WAwEI+I+AZwVvKIoPP/lKvvz6e/vXW6pUtAeEnX3d99gzYg73GtqnjZW8XO4hgOB1TxbnmgmCV5cTglfHDcGr4xakKgSvLm0Er44bglfHjSoIQMBfBBC8/sqT1UAAAv4j4HnBm55Ijhw9LkUKF5Cjx05IjogIyZ+PHbzp4ZYZ9yB4M4Pyv38GglfHEMGr44bg1XELUhWCV5c2glfHDcGr40YVBCDgLwIIXn/lyWogAAH/EQiE4A3F1qh1f8mePbu8+dIg/yXp0RUheL0RHIJXlxOCV8cNwavjFqQqBK8ubQSvjhuCV8eNKghAwF8EELz+ypPVQAAC/iMQGMH786698mC7QRIbGyubVr7kvyQ9uiIErzeCQ/DqckLw6rgheHXcglSF4NWljeDVcUPw6rhRBQEI+IsAgtdfebIaCEDAfwQ8LXjj4uJl8YpPZdlHX8hvv++XM1FRKSYUFR0jpk2DucqULCYfLXzBf0l6dEUIXm8Eh+DV5YTg1XFD8Oq4BakKwatLG8Gr44bg1XGjCgIQ8BcBBK+/8mQ1EICA/wh4VvDGx8dL90FTZMWaDRlKpWeHZtLywboZquFm5wggeJ1jG86REbw6mgheHTcEr45bkKoQvLq0Ebw6bgheHTeqIAABfxFA8PorT1YDAQj4j4BnBe/SD9ZL7+en2UQiSxWTShUuk3x588iiZWvtLt3qN14jR44ekw2bf5Rjx09K64fukbq3VZHyV1zkvxQ9vCIErzfCQ/DqckLw6rgheHXcglSF4NWljeDVcUPw6rhRBQEI+IsAgtdfebIaCEDAfwQ8K3jb9Bgt6zZ+K/ffXUMGdPuv5MyZw6ZToVZLqVmtkrw4/Cn795OnTsvoqQtk+eovZNygzlLl+qv8l6KHV4Tg9UZ4CF5dTgheHTcEr45bkKoQvLq0Ebw6bgheHTeqIAABfxFA8PorT1YDAQj4j4BnBe8tDTvL4aPHZN2SyVK4YP6EZM4WvKEPeg5+UdZ+/j9Z9MpgKVumhP+S9OiKELzeCA7Bq8sJwavjhuDVcQtSFYJXlzaCV8cNwavjRhUEIOAvAghef+XJaiAAAf8R8KzgvbZ2KylauKB8vGh8klSM4L2lSkWZNrJ7kp/v+eOg3NmshzRvdIf07dLcf0l6dEUIXm8Eh+DV5YTg1XFD8Oq4BakKwatLG8Gr44bg1XGjCgIQ8BcBBK+/8mQ1EICA/wh4VvBWvrON5M+XRz55Z2KSVG6o21Yuv+QCeX1K/2Rp1X24l+TMESFL5gzzX5IeXRGC1xvBIXh1OSF4ddwQvDpuQapC8OrSRvDquCF4ddyoggAE/EUAweuvPFkNBCDgPwKeFbx3N+8lu/bslw8XvGAPWQtddz3UU478dVw+XTzJytzEV8PH+smevQdk4/Lp/kvSoytC8HojOASvLicEr44bglfHLUhVCF5d2gheHTcEr44bVRCAgL8IIHj9lSergQAE/EfAs4L36aHTZcnKdXLTDRVkcK/WCZK3dfeR8vlX38noZzvI3bdXTUjs4KGjckezHpIjIrtseH+a/5L06IoQvN4IDsGrywnBq+OG4NVxC1IVgleXNoJXxw3Bq+NGFQQg4C8CCF5/5clqIAAB/xHwrODd/N0Oebjj4IREPpg/Ws4rU0JefXOlDJ80T/LlzS3tWtwr1159qfx5+Ki8PO89+eGnXVKp/KUyL4X2Df6L1hsrQvB6IycEry4nBK+OG4JXxy1IVQheXdoIXh03BK+OG1UQgIC/CCB4/ZUnq4EABPxHwLOC10RhpO3Y6QttKqbtQt48ueTEydNyf6tnxByqltI1sn97qVe7mv+S9OiKELzeCA7Bq8sJwavjhuDVcQtSFYJXlzaCV8cNwavjRhUEIOAvAghef+XJaiAAAf8R8LTgNXFs+3m3fPjJV9Lxvw0T0vl19z7pOfhF2frjLwk/M/K3Y8v7pFWze/yXoodXhOD1RngIXl1OCF4dNwSvjluQqhC8urQRvDpuCF4dN6ogAAF/EUDw+itPVgMBCPiPgOcF77ki2fHr7/L7H3/anb3lr7hQ8uXN478EPb4iBK83AkTw6nJC8Oq4IXh13IJUheDVpY3g1XFD8Oq4UQUBCPiLAILXX3myGghAwH8EfC14/ReX/1aE4PVGpgheXU4IXh03BK+OW5CqELy6tBG8Om4IXh03qiAAAX8RQPD6K09WAwEI+I+AbwRvTGys7NqzX/7Y/6fExsZLjaoV/ZeWD1eE4PVGqAheXU4IXh03BK+OW5CqELy6tBG8Om4IXh03qiAAAX8RQPD6K09WAwEI+I+A5wXvrj37ZPKsd2TVp1/LyVOnbUKlShSR1W+OS0hr4oxFUrJ4EWnW8Hb/JejxFSF4vREggleXE4JXxw3Bq+MWpCoEry5tBK+OG4JXx40qCEDAXwQQvP7Kk9VAAAL+I+Bpwfvx+s3SdcAkiYqKTpLM2YK3TtNusnf/IWne6A7p26W5/1L08IoQvN4ID8GrywnBq+OG4NVxC1IVgleXNoJXxw3Bq+NGFQQg4C8CCF5/5clqIAAB/xHwrOA1wrbBo0/LqdNRUrpkUbn/7hpS8apLpFPfcUl28JrWDSMnz5e5iz6w6b02qZ9cf83l/kvSoytC8HojOASvLicEr44bglfHLUhVCF5d2gheHTcEr44bVRCAgL8IIHj9lSergQAE/EfAs4J35OTXZfbCFVK54uUybWQPyZc3t02nQq2WyVo0mJ+PmjJfZi1YLg3vulmG9mnjvyQ9uiIErzeCQ/DqckLw6rgheHXcglSF4NWljeDVcUPw6rhRBQEI+IsAgtdfebIaCEDAfwQ8K3jvbdlPdvyyR96dPVQuvfC8hGRSE7yHjhyTmvd3kfMjS8ryeSP9l6RHV4Tg9UZwCF5dTgheHTcEr45bkKoQvLq0Ebw6bgheHTeqIAABfxFA8PorT1YDAQj4j4BnBW+Ve9pLjhwRsu7dyUlSSU3wmptqNe4qfx07IZtWvuS/JD26IgSvN4JD8OpyQvDquCF4ddyCVIXg1aWN4NVxQ/DquFEFAQj4iwCC1195shoIQMB/BDwreK+r01oiSxeX9+cm3Y17LsF7Z7MecuDQUfkaweuaNxnB65oozjkRBK8uJwSvjhuCV8ctSFUIXl3aCF4dNwSvjhtVEICAvwggeP2VJ6uBAAT8R8Czgrd2k25y8NBRWb90SkL/XRNPaoL3yNHjUrNRFylVoqh8+MYY/yXp0RUheL0RHIJXlxOCV8cNwavjFqQqBK8ubQSvjhuCV8eNKghAwF8EELz+ypPVQAAC/iPgWcHbbeBkWbFmg3Rp3VjatWiQkExqgnfQC7NlwburpV7tajKyf3v/JenRFSF4vREcgleXE4JXxw3Bq+MWpCoEry5tBK+OG4JXx40qCEDAXwQQvP7Kk9VAAAL+I+BZwfvZhm+lbc/RNpE2zetLy6Z1pUjhAsl28G77ebdMe/VdWb76S3vvrHFPy43XXeW/JD26IgSvN4JD8OpyQvDquCF4ddyCVIXg1aWN4NVxQ/DquFEFAQj4iwCC1195shoIQMB/BDwreE0UfYe9JItXfGZTyZ49m5wfWVJ27dkvOSIipGxkCdl34LCcPhOVkFrTBrVkQPeW/kvRwytC8HojPASvLicEr44bglfHLUhVCF5d2gheHTcEr44bVRCAgL8IIHj9lSergQAE/EfA04I3NjZOJs5YJLMWLJfo6JhU08mZI8Lu8m3/aEOJiMjuvxQ9vCIErzfCQ/DqckLw6rgheHXcglSF4NWljeDVcUPw6rhRBQEI+IsAgtdfebIaCEDAfwQ8LXhDcew/eERWfrxBvv52uz147dTpM5Ivbx4pXbKoVCp/mdS9rYoUK1LQf+n5YEUIXm+EiODV5YTg1XFD8Oq4BakKwatLG8Gr44bg1XGjCgIQ8BcBBK+/8mQ1EICA/wj4QvD6L5bgrAjB642sEby6nBC8Om4IXh23IFUheHVpI3h13BC8Om5UQQAC/iKA4PVXnqwGAhDwHwEEr/8y9dSKELzeiAvBq8sJwavjhuDVcQtSFYJXlzaCV8cNwavjRhUEIOAvAghef+XJaiAAAf8R8IXgPfDnETFtGs5ERYuI+b8v574qV7wirVv4PJMIIHgzCfS/fAyCVwcQwavjhuDVcQtSFYJXlzaCV8cNwavjRhUEIOAvAghef+XJaiAAAf8R8LTgXbRsrUx7dYns3nsgQ8lsXTMrQ/dzs3MEELzOsQ3nyAheHU0Er44bglfHLUhVCF5d2gheHTcEr44bVRCAgL8IIHj9lSergQAE/EfAs4J3ycp18vTQ6apEELwqbI4UIXgdwRr2QRG8OqQIXh03BK+OW5CqELy6tBG8Om4IXh03qiAAAX8RQPD6K09WAwEI+I+AZwVvk7YD5bttv0iJYoWlZdO6ctVl5aRAgXySLVvaIV1z5cVp38QdmUIAwZspmP/1QxC8OoQIXh03BK+OW5CqELy6tBG8Om4IXh03qiAAAX8RQPD6K09WAwEI+I+AZwXv9Xe2kaioaJk/dYBUvAph69VXE8HrjeQQvLqcELw6bgheHbcgVSF4dWkjeHXcELw6blRBAAL+IoDg9VeerAYCEPAfAc8K3hvvbm/T2PD+VP+lEqAVIXi9ETaCV5cTglfHDcGr4xakKgSvLm0Er44bglfHjSoIQMBfBBC8/sqT1UAAAv4j4FnB+0CbAfLr7j/ky2VTJVt6+jL4LztfrAjB640YEby6nBC8Om4IXh23IFUheHVpI3h13BC8Om5UQQAC/iKA4PVXnqwGAhDwHwHPCt4FS9bIoDGzZPLQrlKr+nX+SyYgK0LweiNoBK8uJwSvjhuCV8ctSFUIXl3aCF4dNwSvjhtVEICAvwggeP2VJ6uBAAT8R8Czgjc+Pl76DX9ZVn/2tQzs0VLq1LhBIiKy+y8hn68IweuNgBG8upwQvDpuCF4dtyBVIXh1aSN4ddwQvDpuVEEAAv4igOD1V56sBgIQ8B8BzwpeE0Vc3N+S992Vn0nhQvnl8ovPl4L580laHRsmPv+k/5L06IoQvN4IDsGrywnBq+OG4NVxC1IVgleXNoJXxw3Bq+NGFQQg4C8CCF5/5clqIAAB/xHwrOA9fPSYtO05Rr7b9kuGU9m6ZlaGayhwhgCC1xmu4R4VwasjiuDVcUPw6rgFqQrBq0sbwavjhuDVcaMKAhDwFwEEr7/yZDUQgID/CHhW8D43do68sXiVTSR3rpxy0QVlpED+vOk6cG32+D7+S9KjK0LweiM4BK8uJwSvjhuCV8ctSFUIXl3aCF4dNwSvjhtVEICAvwggeP2VJ6uBAAT8R8CzgrdO026yd/8haVyvpvR7soWVvFzeI4Dg9UZmCF5dTgheHTcEr45bkKoQvLq0Ebw6bgheHTeqIAABfxFA8PorT1YDAQj4j4BnBe91dzwuMTGxsnH5NMmTO5f/kgnIihC83ggawavLCcGr44bg1XELUhWCV5c2glfHDcGr40YVBCDgLwIIXn/lyWogAAH/EfCs4L3tga4SHR0rny6e6L9UArQiBK83wkbw6nJC8Oq4IXh13IJUheDVpY3g1XFD8Oq4UQUBCPiLAILXX3myGghAwH8EPCt4ez8/Td778HP55J0JUrRwQf8lE5AVIXi9ETSCV5cTglfHDcGr4xakKgSvLm0Er44bglfHjSoIQMBfBBC8/sqT1UAAAv4j4FnB+9vv++XhjoPlpv9UkOH92kn27Nn8l04AVoTg9UbICF5dTgheHTcEr45bkKoQvLq0Ebw6bgheHTeqIAABfxFA8PorT1YDAQj4j4BnBa+JYueuvdJ3+MsSFRUtTRvUkovKRUqp4kUkIiL7OZMqV7a0/5L06IoQvN4IDsGrywnBq+OG4NVxC1IVgleXNoJXxw3Bq+NGFQQg4C8CCF5/5clqIAAB/xHwrOC9oW5bOXU6SpXI1jWzVHUUhZ8Agjf8TJ0YEcGro4rg1XFD8Oq4BakKwatLG8Gr44bg1XGjCgIQ8BcBBK+/8mQ1EICA/wh4VvBWqNVSnQaCV40uzcJNW7bJzDeWy+atP8lfx05I0SIFpWrl8tL2kQZySbnIZPUI3jSRuuIGBK8uBgSvjhuCV8ctSFUIXl3aCF4dNwSvjhtVEICAvwggeP2VJ6uBAAT8R8CzgnfpB+slR44I244he7Zzt2Q4O7baNSr7L0kXrOjNpR/LgNEz7UwuOK+URJYuJr/u3if7DhyWPLlzybSR3eWGSlcmmSmC1wXBpWMKCN50QErhFgSvjhuCV8ctSFUIXl3aCF4dNwSvjhtVEICAvwggeP2VJ6uBAAT8R8Czgtd/UXh7Rbv27JN7W/aTmJhYGfFMO6lXu5pdUHx8vLw0d6mMf/ktKVOymCyZM0zy5c2dsFgErzdyR/DqckLw6rgheHXcglSF4NWljeDVcUPw6rhRBQEI+IsAgtdfebIaCEDAfwQQvP7LNEtWNHTCXJm76AN5oP6tMqjHY8nm0KLzUDHtG57r2Uoa16uJ4M2SlPQPRfDq2CF4ddwQvDpuQapC8OrSRvDquCF4ddyoggAE/EUAweuvPFkNBCDgPwIIXv9lmiUrqt2km/xx4JDMHt8nWRsGM6EFS9bIoDGzpEbVijJ1RHcEb5akpH8oglfHDsGr44bg1XELUhWCV5c2glfHDcGr40YVBCDgLwIIXn/lyWogAAH/EUDw+i/TTF/RkaPH5eaGT9jnblw+XfLmyZVsDj/8tEsaP/6sFC9aSNa+PQHBm+kp/bsHInh1/BC8Om4IXh23IFUheHVpI3h13BC8Om5UQQAC/iKA4PVXnqwGAhDwHwEEr/8yzfQVbfn+Z2nW4TkpWrigfLp4YorPP/rXCal+byf72ZfLpkr+fHnsn//8KypT5xsXHy+/7YmXKdMiMvW5Xn8YgleXIIJXx80I3rXnN5Kiuf7p160byf1Vp8/EyfIPssn6LzJ2WKj7V+bsDI3grVVDJCJ7Nmcf5LPRY+LiZdyhb2T44U0+W5mzyzGCt1+xGyRfzhzOPojRIQABCLiYQPFCyTfxuHi6TA0CEIBA4AggeAMXefgXvH7jVnm8xyi54LxSsnzeyBQfEB0TK9fVaW0/W/3mOClVokj4J5KOEaNi4mTrtiiZjOBNB61/bkHwZghXws0IXh03I3hzSffPAAAgAElEQVQ/uaCxXFq8gG4AD1X9eTRa3nkvDsGbwcyM4L2nToQUyItwywi6Y6diZOjerxC8GYEmIkbwDo6sIiUL/P3LaS4IQAACEIAABCAAAQi4jQCC122JeHA+q9d9LU/0HS+XlIuUJXOGpbqCCrVa2s/enztCypUtnSUrjY6Nl52/nZHjJ7Lk8Z59aK5c8VIs+5/yf+zdd5gUVdrG4WfIOWeVVXTVxUUUUYKCrBiWLCIsKqgkyaKCIEklS5CcUVQQVFAUQQEDYg5gWhQzrqiLA0jOwzDfdcpvZh0H6ZrTU13V1b/+Z2XmvOfUud++ZuGZ6lN59u2M2z34ceFpefNpW9ny2nqcN1x2/HMrSZXzFdNfSxXNTllcjt1z4Jh+/iVFhw9zJ2p2Gli4cJpK5jugXDKHDvByK5CaO59+0FHtTjvitoRxkornyqdzipZQiYLhv3ttx+5UHTycQt+zKZDv2GHlyX1MSuNnUnbo9ufNpWO582anhLGScuVK0hnFiyqJvzrwfkAAAQQQ+J0AAS9vh6gF3vtwkzr1HRcXd/CazaYcO67j/P07233PlZQkc8QFr+wJ4JY9r/TReXMnOf+ASYTXkZTjibDNHN3jwUNHlfL6KuVZ/1qOzhv2yY5dcoXy1m+kQgUJVLLb6/x5E+MYlR+3HdIzz+XRoUPZFUrs8be23q98iycrae+uxIbI5u539B6hYTs/1I+p+7JZmdjDx5apq4tKlVa+PInxcymxu83uEUAAAfcCBLzurRj5JwIbv/xebbsNU4niRfT28uknHLVz9z7Vu7a38731q+aoUMHfztYk2OBthQACCCCQXQET8B5b+pDyrnkyu6UJPT6l0Y3K06qjCiXAnagJ3egoNp/86xFNnJZH+/dHMUkClg7vv08FR3ZR0q/JCbh7+y0nT1uha5PX6MsUgvHsKK495VpdXKKs8uaObcCbKL/oyk4vGIsAAggESYCAN0jdiNNr2bv/oOo07ZElvP39dtIfxFa+bEmtXTop41v//ZVbROK07Vw2Aggg4J/A8VTlff5RAt5sdsAEvEeb3qKkXLENBbJ5mQz3USAlRZpEwJvtDhDwZpvMKUie9ryuTX6JgDebfK9WaqFz85XMZlX0wyuVLhj9JMyAAAIIIOCZQFwHvMePp+nFte/pwIFD+leLKzIhffzZN5r28DJ98c0PKlAgn66+/GL17nidihTm/5i8eDc1uqm/tvy8TQ9P7K/aNapmWeKxpWs0bsYTalivhqaOuJ2A14smMCcCCCCQKAIEvFadJuC1YkuoIgJeu3YT8Nq5EfDauRHw2rlRhQACCIRdIG4D3rS0NPUdNktr1n2g2hdV1cMP9s/o1b83faeb+4xRSsqxTP2rXvVMLZw2WLlj/HGWsL+JzP4mzV2qhxa/oKZX1dHYwV0zbdn06rpOQ/X15p80fmh3NW5Yi4A3Ed4U7BEBBBDwSoCA10qWgNeKLaGKCHjt2k3Aa+dGwGvnRsBr50YVAgggEHaBuA14X3z1fd09YpaSkpJ0Y8uGGnR7u4xe/avrMH321fcqXbKY2l9/tQ4dPqJHn1qtI0dTNHpgF7W45tKw9zXm+9u2Y7eatB+gg4eOaFi/Drq+6eXONRxLTdWDs5dowdI1qlK5opbNH6m8eXIT8Ma8QyyIAAIIhEiAgNeqmQS8VmwJVUTAa9duAl47NwJeOzcCXjs3qhBAAIGwC8RtwNv9nkl6471PdUeX69XlpqYZfdr09X/U+rb7nT8vmjFEF5x3lvPfz61+S4MfeEj1a1fXrAfuDHtffdnfS69vUL/hM5WaelwVy5dWxXKl9f2Wrdq1Z5+KFy2s+ZMG6NyzKme6Ns7g9aVVLIoAAgjEtwABr1X/CHit2BKqiIDXrt0EvHZuBLx2bgS8dm5UIYAAAmEXiNuAt0GrO7Rz9169vXy6ihYplNGnmY8t14xHnpU5jmHxzKEZXz985KhqNe6uUiWL6rWnJ4e9r77tz5x5PPfxFdrw6Vfat/+gypQu4YTqXds1k3nA2h9fBLy+tYqFEUAAgfgVIOC16h0BrxVbQhUR8Nq1m4DXzo2A186NgNfOjSoEEEAg7AJxG/BWb9hJJUsU1bpnMoe1He8cq/c//iLLnb2mkZdf10d79h3QJy8/FPa+xs3+CHjjplVcKAIIIBAcAQJeq14Q8FqxJVQRAa9duwl47dwIeO3cCHjt3KhCAAEEwi4Q1wFvieJF9PqyKRk9Mg9Vq9Wku3PWrrl719zF+/uXCXgPHDykDavnhr2vcbM/At64aRUXigACCARHgIDXqhcEvFZsCVVEwGvXbgJeOzcCXjs3Al47N6oQQACBsAvEbcCbfkTDeytnqVDB/E6f1r71kXoPmeqc9/rmc9OUO3eujP4dPZqimo26qkLZUnrpyQlh72vc7I+AN25axYUigAACwREg4LXqBQGvFVtCFRHw2rWbgNfOjYDXzo2A186NKgQQQCDsAnEb8PYYOEmvv/up7ryttTrf2MS5a7ddr1EyD1lr2aieRg7olKl3q1/7QH2HzdSlF/9dc8f3C3tf42Z/BLxx0youFAEEEAiOAAGvVS8IeK3YEqqIgNeu3QS8dm4EvHZuBLx2blQhgAACYReI24B31dr31W/4LKc/p59WQfsPHNKOnXucPy9/ZJTOOuOUjN6ZB37dce907dqzT8P6ddD1TS8Pe1/jZn8EvHHTKi4UAQQQCI4AAa9VLwh4rdgSqoiA167dBLx2bgS8dm4EvHZuVCGAAAJhF4jbgDctLc0JeM2dub9/3daumfp0bpXxJXMu70X/vE2pqcd1SoUyeu6RkSpUsEDY+xo3+yPgjZtWcaEIIIBAcAQIeK16QcBrxZZQRQS8du0m4LVzI+C1cyPgtXOjCgEEEAi7QNwGvOmNeeXND/XBx184f7zskmqqX7t6lp5d22GIihcrrNEDuzghL6/gCBDwBqcXXAkCCCAQNwIEvFatIuC1YkuoIgJeu3YT8Nq5EfDauRHw2rlRhQACCIRdIO4DXjcN2r1nv0oUL+JmKGNiLEDAG2NwlkMAAQTCIEDAa9VFAl4rtoQqIuC1azcBr50bAa+dGwGvnRtVCCCAQNgFEiLgTW9in6HTVLhQAedOXl7BECDgDUYfuAoEEEAgrgQIeK3aRcBrxZZQRQS8du0m4LVzI+C1cyPgtXOjCgEEEAi7QMIEvEeOpuiaG+7WwUOH9cGLs8Pe17jZHwFv3LSKC0UAAQSCI0DAa9ULAl4rtoQqIuC1azcBr50bAa+dGwGvnRtVCCCAQNgF4j7g/eGnZL30+npt+Xmbjh5NOWG/jqak6LOv/qP//rJDxYsW1jsrZoS9r3GzPwLeuGkVF4oAAggER4CA16oXBLxWbAlVRMBr124CXjs3Al47NwJeOzeqEEAAgbALxHXA+/gzL2vczCeUmnrcdZ9aNqqnkQM6uR7PQG8FCHi99WV2BBBAIJQCBLxWbSXgtWJLqCICXrt2E/DauRHw2rkR8Nq5UYUAAgiEXSBuA96PP/tG7XqNyuhP6ZLFVKhgAf34320qkD+fypYuod1792vf/oPOmAZ1L9DFF5yrti2ucL7PKxgCBLzB6ANXgQACCMSVAAGvVbsIeK3YEqqIgNeu3QS8dm4EvHZuBLx2blQhgAACYReI24C33/BZWrX2fVU79wyNGXSbzqhc0enVeQ1uVf3a1TXrgTuVlpYmEwSPmbbYCXXH39tNFcqWCntP42p/BLxx1S4uFgEEEAiGAAGvVR8IeK3YEqqIgNeu3QS8dm4EvHZuBLx2blQhgAACYReI24D3yjZ3aeu2nXph4QM6/bQKGX36fcCb/sVDh4/q5ttHyzxo7YmZQ1W4UIGw9zVu9kfAGzet4kIRQACB4AgQ8Fr1goDXii2high47dpNwGvnRsBr50bAa+dGFQIIIBB2gbgNeC+4spMKFsivd1fOzNQjE/DWq3W+Zo+9K9PX04906NutjTq2bRz2vsbN/gh446ZVXCgCCCAQHAECXqteEPBasSVUEQGvXbsJeO3cCHjt3Ah47dyoQgABBMIuENcBb8kSRfXa05Mz9eiCqzo7xzYsnDY4S+8uv66PypUpqaVz7w97X+NmfwS8cdMqLhQBBBAIjgABr1UvCHit2BKq6MgR6cuvknTsWEJtO+rNXlT1oAqO7KKkX5OjniuRJiDgtes2Aa+dG1UIIIBA2AXiNuBt0OoO7dq9T28/P11FChfM6NMVrX87e/ePwa8ZcF2nofpl2069s2JG2PsaN/sj4I2bVnGhCCCAQHAECHitekHAa8WWYEVJSkpKsC3nxHYPH1SBEQS82aUk4M2u2G/jCXjt3KhCAAEEwi4QtwFv93sm6Y33PlWHto3Ur9u/Mvp0Q48R+vem75yzds+vembG148eTVH96/ro8JGj+uTlh8Le17jZHwFv3LSKC0UAAQSCI0DAa9ULAl4rNooQiCxw5JAKEvBGdvrDCALebJMR8NqRUYUAAggkhEDcBryr1r6vfsNnOU06rVI5LZw2SGVLl9DkeU9r3qKVzoPXxgzsor+fW0U7d+/VpLlL9dzqt1SlckWtWDAmIZobD5sk4I2HLnGNCCCAQMAECHitGkLAa8VGEQKRBQh4IxudYAQBrxUbd/DasVGFAAIIhF4gbgNecwxDr8FTtO6dT5wmmYetFStSSFuTf1XTmwc6d+qaV1JSknNkQ/qrZ4eW6nFLi9A3Nl42SMAbL53iOhFAAIEACRDwWjWDgNeKjSIEIgsQ8EY2IuC1MjpREUc05BglEyGAAAKhEojbgNd04VhqqpY8v04vv7Fej0y6J6Mxa9/+WP1HzNKhw7+FvOmv+rWra+qI3sqbN0+omhjPmyHgjefuce0IIICATwIEvFbwBLxWbBQhEFmAgDeyEQGvlREBb46xMRECCCAQeoG4DnhP1p0dO/folTc/1H9/2aECBfLrovPPVq0L/xb6hsbbBgl4461jXC8CCCAQAAECXqsmEPBasVGEQGQBAt7IRgS8VkYEvDnGxkQIIIBA6AVCG/CGvnMh2SABb0gayTYQQACBWAoQ8FppE/BasVGEQGQBAt7IRgS8VkYEvDnGxkQIIIBA6AUIeEPf4mBvkIA32P3h6hBAAIFAChDwWrWFgNeKjSIEIgsQ8EY2IuC1MiLgzTE2JkIAAQRCLxAXAe+adeudRlQ/70xVKFvK+e/0r9l06JoGF9uUUeOBAAGvB6hMiQACCIRdgIDXqsMEvFZsFCEQWYCAN7IRAa+VEQFvjrExEQIIIBB6gbgIeM9rcKvTiPFDu6txw1rOf6d/zaZDn6971KaMGg8ECHg9QGVKBBBAIOwCBLxWHSbgtWKjCIHIAgS8kY0IeK2MCHhzjI2JEEAAgdALEPCGvsXB3iABb7D7w9UhgAACgRQg4LVqCwGvFRtFCEQWIOCNbETAa2VEwJtjbEyEAAIIhF4gLgLen3/Z4TSiZPGiKlQwv/Pf6V+z6dApFcrYlFHjgQABrweoTIkAAgiEXYCA16rDBLxWbBQhEFmAgDeyEQGvlREBb46xMRECCCAQeoG4CHhD34UE3iABbwI3n60jgAACtgIEvFZyBLxWbBQhEFmAgDeyEQGvlREBb46xMRECCCAQegEC3tC3ONgbJOANdn+4OgQQQCCQAgS8Vm0h4LViowiByAIEvJGNCHitjAh4c4yNiRBAAIHQC4Qy4P1003d64ZX3lLx9p0oUL6LaNarqyvo1lTdP7tA3NN42SMAbbx3jehFAAIEACBDwWjWBgNeKjSIEIgsQ8EY2IuC1MiLgzTE2JkIAAQRCLxB3AW/y9l1as+4DJe/YpUrlS+uKS2uoYvnSGY2a+vAzmrNwRZbGnXfO6Zo55k6VKVU89E2Npw0S8MZTt7hWBBBAICACBLxWjSDgtWKjCIHIAgS8kY0IeK2MCHhzjI2JEEAAgdALxFXAu/atj3T3iNk6fORoRmPy5s2jQbe3U5tmDWS+33vI1Izv5c+XV0eOpmT8uUa1s7Vw2qDQNzWeNkjAG0/d4loRQACBgAgQ8Fo1goDXio0iBCILEPBGNiLgtTIi4M0xNiZCAAEEQi8QNwHv9l9365839s8U7qZ3J1euJC2aPkTjZj6pjz/7Rh3bNlbnG5uoeLHCMnWzFzyvJ5evdYZPH91H/6h7YegbGy8bJOCNl05xnQgggECABAh4rZpBwGvFRhECkQUIeCMbEfBaGRHw5hgbEyGAAAKhF4ibgHfmo89pxqPPKU/u3Bp0+03Ombp79h3QK29s0NSHl+mKyy7U2rc+1j//cYkm3Ns9S+N6Dpqsde98oqZX1dHYwV1D39h42SABb7x0iutEAAEEAiRAwGvVDAJeKzaKEIgsQMAb2YiA18qIgDfH2JgIAQQQCL1A3AS87XuP0kcbv1Gb5v/QfXfdkqkxo6Ys1OJnX3W+9tCEu1Wn5nlZGvfqmx/p9qFTdUblilq5YEzoGxsvGyTgjZdOcZ0IIIBAgAQIeK2aQcBrxUYRApEFCHgjGxHwWhkR8OYYGxMhgAACoReIm4C3fsvb9euuvScMcDd+sVltuw93mvXKkomqWK5UlsZ9vfkntew4RIUK5tf6VXNC39h42SABb7x0iutEAAEEAiRAwGvVDAJeKzaKEIgsQMAb2YiA18qIgDfH2JgIAQQQCL1A3AS8F1zZSSnHUp27b81duL9/maMa6jbr6Xzpk5cfknnw2h9fO3bu0eXX9XG+/Pm6R0Pf2HjZIAFvvHSK60QAAQQCJEDAa9UMAl4rNooQiCxAwBvZiIDXyoiAN8fYmAgBBBAIvUDcBLznNbjVacbry6aoTKnimRpz5GiKalzd5aTh7a49+3RZi94EvAF7SxPwBqwhXA4CCCAQDwIEvFZdIuC1YqMIgcgCBLyRjQh4rYwIeHOMjYkQQACB0AsQ8Ia+xcHeIAFvsPvD1SGAAAKBFCDgtWoLAa8VG0UIRBYg4I1sRMBrZUTAm2NsTIQAAgiEXoCAN/QtDvYGCXiD3R+uDgEEEAikAAGvVVsIeK3YKEIgsgABb2QjAl4rIwLeHGNjIgQQQCD0AgS8oW9xsDdIwBvs/nB1CCCAQCAFCHit2kLAa8VGEQKRBQh4IxsR8FoZEfDmGBsTIYAAAqEXiLuA966ubVSkUIFMjTmWelyjpz7ufO3eO28+YdMOHT6q8bOedL7HQ9aC874m4A1OL7gSBBBAIG4ECHitWkXAa8VGEQKRBQh4IxsR8FoZEfDmGBsTIYAAAqEXiLuANyc6QsCbE4o5MwcBb844MgsCCCCQUAIEvFbtJuC1YqMIgcgCBLyRjQh4rYwIeHOMjYkQQACB0AsQ8Ia+xcHeIAFvsPvD1SGAAAKBFCDgtWoLAa8VG0UIRBYg4I1sRMBrZUTAm2NsTIQAAgiEXiBuAt7Pvvo+x5rx93POyLG5mCg6AQLe6PyoRgABBBJSgIDXqu0EvFZsFCEQWYCAN7IRAa+VEQFvjrExEQIIIBB6gbgJeEPfiQTdIAFvgjaebSOAAALRCBDwWukR8FqxUYRAZAEC3shGBLxWRgS8OcbGRAgggEDoBQh4Q9/iYG+QgDfY/eHqEEAAgUAKEPBatYWA14qNIgQiCxDwRjYi4LUyIuDNMTYmQgABBEIvQMAb+hYHe4MEvMHuD1eHAAIIBFKAgNeqLQS8VmwUIRBZgIA3shEBr5URAW+OsTERAgggEHoBAt7QtzjYGyTgDXZ/uDoEEEAgkAIEvFZtIeC1YqMIgcgCBLyRjQh4rYwIeHOMjYkQQACB0AsQ8Ia+xcHeIAFvsPvD1SGAAAKBFCDgtWoLAa8VG0UIRBYg4I1sRMBrZUTAm2NsTIQAAgiEXoCAN/QtDvYGCXiD3R+uDgEEEAikAAGvVVsIeK3YKEIgsgABb2QjAl4rIwLeHGNjIgQQQCD0AgS8oW9xsDdIwBvs/nB1CCCAQCAFjqcq3wsLleflJYG8vKBeVMrVbXW0cTsl5coV1EvkuhCITwECXqu+JU97Xtcmv6QvU3ZZ1Sdq0auVWujcfCVjvv1KpQvGfE0WRAABBBBwL0DA696KkR4IEPB6gMqUCCCAQMgFkpKk46nHpbS0kO80h7eXJCXlyp3DkzIdAgiIgNfqTUDAa8UmAl47N6oQQACBsAsQ8Ia9wwHfHwFvwBvE5SGAAAIIIIAAAgicXICA1+odQsBrxUbAa8dGFQIIIBB6AQLe0Lc42Bsk4A12f7g6BBBAAAEEEEAAgQgCBLxWbxECXis2Al47NqoQQACB0AsQ8Ia+xSff4Ecbv9YjT63Wp59/q737DqhkiaKqVaOqbmvXTFUqV7TS2bPvgO6f8Iheen2DSpcspjeenfqn8xDwWhFThAACCCCAAAIIIBAUAQJeq04Q8FqxEfDasVGFAAIIhF6AgDf0Lf7zDT698nXdN+ERZ8BplcqpYvlS+uGnZCVv36UC+fNpzri+qln9nGwJvffRJg0aM8+Zw7wIeLPFx2AEEEAAAQQQQACBeBMg4LXqGAGvFRsBrx0bVQgggEDoBQh4Q9/iE29wy8/Jan7rYB07lqqxQ7qqScPazsC0tDTNW7RSUx56RhXKltKKBWNUqGB+V0qT5i7VQ4tfUIniRXRDi4aatWA5Aa8rOQYhgAACCCCAAAIIxK0AAa9V6wh4rdgIeO3YqEIAAQRCL0DAG/oWn3iDo6cu0qJlL+v6ppdrWL8OWQa17z1a5viG4Xd3VKsm9V0p1WrSXeeeVVnjhnTTL9t36sYeIwh4XckxCAEEEEAAAQQQQCBuBQh4rVpHwGvFRsBrx0YVAgggEHoBAt7Qt/jEG2zY+i4nhH1sysATHsOwZMU6DXvwUdWrVU2zx/Z1pfToU6vV/vqrlTt3Ln266TsCXldqDEIAAQQQQAABBBCIawECXqv2EfBasRHw2rFRhQACCIRegIA39C3OusHde/br0ha9nG9sWD1XBQvkyzLoy2+3qFXneyPegftnfAS8CfjGYssIIIAAAggggEAiChDwWnWdgNeKjYDXjo0qBBBAIPQCBLyhb3HWDW78YrPadh+uksWL6q3l004osGfvAdVt3tP53gcvzlbhQgWyJUXAmy0uBiOAAAIIIIAAAgjEqwABr1XnCHit2Ah47dioQgABBEIvQMAb+hZn3eC7Gz5X537jdVqlclq9eNwJBVKOpeqCKzs533vt6ckqV6ZEtqTcBry/7j2arXkZjAACCCCAAAIIIIBAkASO7j+gAiM6K+nX5CBdVuCvJXnaCl2bvEZfpuwK/LUG6QJfrdRC1QqVVq6kpJheVuliWT/1GdMLYDEEEEAAgZMKEPDG8Rvk680/afjEx1zv4JY21+iq+jX12jsfq9egKapSuaJWLBjzp/XnNbjV+d6qRWNV+ZTyrtcxA90GvNmalMEIIIAAAggggAACCARMIHnrLuUbTsCb3bYQ8GZX7Lfxa0+5VpeWKa98eXLZTUAVAggggEAoBQh447itn3z+rTr3PfEduCfaVv+eN6pNswZ678NN6tR3XCDu4D2ScjyOO8ClI4AAAggggAACCCS6wK4de5SfgDfbbwMC3myTZQS8F5coq7y5Yxvw5s8b2/XsdKhCAAEEEleAgDcBe7/xy+/VttswlSheRG8vn35CgZ2796netb2d761fNUeFCubPlpTbO3j/++uhbM3LYAQQQAABBBBAAAEEAiXAGbxW7eAMXis2zuC1Y6MKAQQQCL0AAW/oW5x1g3v3H1Sdpj1OGt6mP4itfNmSWrt0UraVCHizTUYBAggggAACCCCAQDwKEPBadY2A14qNgNeOjSoEEEAg9AIEvKFv8Yk32Oim/try8zY9PLG/ateommXQY0vXaNyMJ9SwXg1NHXF7tpUIeLNNRgECCCCAAAIIIIBAPAoQ8Fp1jYDXio2A146NKgQQQCD0AgS8oW/xiTc4ae5SPbT4BTW9qo7GDu6aaVBaWpqu6zRU5iFu44d2V+OGtbKtRMCbbTIKEEAAAQQQQAABBOJRgIDXqmsEvFZsBLx2bFQhgAACoRcg4A19i0+8wW07dqtJ+wE6eOiIhvXroOubXu4MPJaaqgdnL9GCpWtUpXJFLZs/Unnz5M6YZN6ilUrevksN6l6gyy6p9qd6BLwJ+sZi2wgggAACCCCAQKIJEPBadZyA14qNgNeOjSoEEEAg9AIEvKFv8Z9v8KXXN6jf8JlKTT2uiuVLq2K50vp+y1bt2rNPxYsW1vxJA3TuWZUzTWDu7P3qux/Vu+N16nZz84zvrX7tAz38xIsZfz50+IgzV+7cuXTOmf+bo1iRQs6xEOkvHrKWwG9Ato4AAggggAACCIRBgIDXqosEvFZsBLx2bFQhgAACoRcg4A19i0++wS+++UFzH1+hDZ9+pX37D6pM6RKqX7u6urZrJvOAtT++/izgXbTsFY2e+nhEzeLFCuud52cQ8EaUYgACCCCAAAIIIIBAXAgQ8Fq1iYDXio2A146NKgQQQCD0AgS8oW9xsDfIHbzB7g9XhwACCCCAAAIIIBBBgIDX6i1CwGvFRsBrx0YVAgggEHoBAt7QtzjYGyTgDXZ/uDoEEEAAAQQQQAABAl4v3gMEvHaqr1ZqoXPzZf2kpd1s7qsqlS7ofjAjEUAAAQRiLkDAG3NyFvy9AAEv7wcEEEAAAQQQQACBuBbgDl6r9hHwWrFxB68dG1UIIIBA6AUIeEPf4mBvkIA32P3h6hBAAAEEEEAAAQQiCBDwWr1FCHit2Ah47dioQgABBEIvQMAb+hYHe4MEvMHuD1eHAAIIIIAAAgggQMDrxXuAgNdOlSMa7NyoQgABBMIuQMAb9g4HfH8EvAFvEJeHAAIIIIAAAgggcHIB7uC1eocQ8FqxcQevHRtVCCCAQOgFCHhD3+Jgb5CAN9j94eoQQAABBBBAAAEEIggQ8Fq9RQh4rdgIeO3YqEIAAQRCL0DAG/oWB3uDBLzB7g9XhwACCHrwS0gAACAASURBVCCAAAIIIEDA68V7gIDXTpUjGuzcqEIAAQTCLkDAG/YOB3x/BLwBbxCXhwACCCCAAAIIIHByAe7gtXqHEPBasXEHrx0bVQgggEDoBQh4Q9/iYG+QgDfY/eHqEEAAAQQQQAABBCIIEPBavUUIeK3YCHjt2KhCAAEEQi9AwBv6Fgd7gwS8we4PV4cAAggggAACCCBAwOvFe4CA106VIxrs3KhCAAEEwi5AwBv2Dgd8fwS8AW8Ql4cAAggggAACCCBwcgHu4LV6hxDwWrFxB68dG1UIIIBA6AUIeEPf4mBvkIA32P3h6hBAAAEEEEAAAQQiCBDwWr1FCHit2Ah47dioQgABBEIvQMAb+hYHe4MEvMHuD1eHAAIIIIAAAgggQMDrxXuAgNdOlSMa7NyoQgABBMIuQMAb9g4HfH8EvAFvEJeHAAIIIIAAAgggcHIB7uC1eocQ8FqxcQevHRtVCCCAQOgFCHhD3+Jgb5CAN9j94eoQQAABBBBAAAEEIggQ8Fq9RQh4rdgIeO3YqEIAAQRCL0DAG/oWB3uDBLzB7g9XhwACCCCAAAIIIEDA68V7gIDXTpUjGuzcqEIAAQTCLkDAG/YOB3x/BLwBbxCXhwACCCCAAAIIIHByAe7gtXqHEPBasXEHrx0bVQgggEDoBQh4Q9/iYG+QgDfY/eHqEEAAAQQQQAABBCIIEPBavUUIeK3YCHjt2KhCAAEEQi9AwBv6Fgd7gwS8we4PV4cAAggggAACCCBAwOvFe4CA106VIxrs3KhCAAEEwi5AwBv2Dgd8fwS8AW8Ql4cAAggggAACCCBwcgHu4LV6hxDwWrFxB68dG1UIIIBA6AUIeEPf4mBvkIA32P3h6hBAAAEEEEAAAQQiCBDwWr1FCHit2Ah47dioQgABBEIvQMAb+hYHe4MEvMHuD1eHAAIIIIAAAgggQMDrxXuAgNdOlSMa7NyoQgABBMIuQMAb9g4HfH8EvAFvEJeHAAIIIIAAAgggcHIB7uC1eocQ8FqxcQevHRtVCCCAQOgFCHhD3+Jgb5CAN9j94eoQQAABBBBAAAEEIggQ8Fq9RQh4rdgIeO3YqEIAAQRCL0DAG/oWB3uDBLzB7g9XhwACCCCAAAIIIEDA68V7gIDXTpUjGuzcqEIAAQTCLkDAG/YOB3x/BLwBbxCXhwACCCCAAAIIIHByAe7gtXqHEPBasXEHrx0bVQgggEDoBQh4Q9/iYG+QgDfY/eHqEEAAAQQQQAABBCIIEPBavUUIeK3YCHjt2KhCAAEEQi9AwBv6Fgd7gwS8we4PV4cAAggggAACCCBAwOvFe4CA106VIxrs3KhCAAEEwi5AwBv2Dgd8fwS8AW8Ql4cAAggggAACCCBwcgHu4LV6hxDwWrFxB68dG1UIIIBA6AUIeEPf4mBvkIA32P3h6hBAAAEEEEAAAQQiCBDwWr1FCHit2Ah47dioQgABBEIvQMAb+hYHe4MEvMHuD1eHAAIIIIAAAgggQMDrxXuAgNdOlSMa7NyoQgABBMIuQMAb9g4HfH8EvAFvEJeHAAIIIIAAAgggcHIB7uC1eodsn75Cs/d9qa2pB63qE7WoT/HzdVqeIjHffqXSBWO+JgsigAACCLgXIOB1b8VIDwQIeD1AZUoEEEAAAQQQQACB2AkQ8FpZHxq3RGlFSljVJnRRriQpLfYCBLyxN2dFBBBAIDsCBLzZ0WJsjgsQ8OY4KRMigAACCCCAAAIIxFKAgNdK+9Cox5VWqrxVLUWxFyDgjb05KyKAAALZESDgzY4WY3NcgIA3x0mZEAEEEEAAAQQQQCCWAgS8VtoEvFZsvhUR8PpGz8IIIICAKwECXldMDPJKgIDXK1nmRQABBBBAAAEEEIiJAAGvFTMBrxWbb0UEvL7RszACCCDgSoCA1xUTg7wSIOD1SpZ5EUAAAQQQQAABBGIiQMBrxUzAa8XmWxEBr2/0LIwAAgi4EiDgdcXEIK8ECHi9kmVeBBBAAAEEEEAAgZgIEPBaMRPwWrH5VkTA6xs9CyOAAAKuBAh4XTExyCsBAl6vZJkXAQQQQAABBBBAICYCBLxWzAS8Vmy+FRHw+kbPwggggIArAQJeV0wM8kqAgNcrWeZFAAEEEEAAAQQQiIkAAa8VMwGvFZtvRQS8vtGzMAIIIOBKgIDXFRODvBIg4PVKlnkRQAABBBBAAAEEYiJAwGvFTMBrxeZbEQGvb/QsjAACCLgSIOB1xcQgrwQIeL2SZV4EEEAAAQQQQACBmAgQ8FoxE/BasflWRMDrGz0LI4AAAq4ECHhdMTHIKwECXq9kmRcBBBBAAAEEEEAgJgIEvFbMBLxWbL4VEfD6Rs/CCCCAgCsBAl5XTAzySoCA1ytZ5kUAAQQQQAABBBCIiQABrxUzAa8Vm29FBLy+0bMwAggg4EqAgNcVE4O8EiDg9UqWeRFAAAEEEEAAAQRiIkDAa8VMwGvF5lsRAa9v9CyMAAIIuBIg4HXFxCCvBAh4vZJlXgQQQAABBBBAAIGYCBDwWjET8Fqx+VZEwOsbPQsjgAACrgQIeF0xMcgrAQJer2SZFwEEEEAAAQQQQCAmAgS8VswEvFZsvhUR8PpGz8IIIICAKwECXldMDPJKgIDXK1nmRQABBBBAAAEEEIiJAAGvFTMBrxWbb0UEvL7RszACCCDgSoCA1xUTg7wSIOD1SpZ5EUAAAQQQQAABBGIiQMBrxUzAa8XmWxEBr2/0LIwAAgi4EiDgdcXEIK8ECHi9kmVeBBBAAAEEEEAAgZgIEPBaMRPwWrH5VkTA6xs9CyOAAAKuBAh4XTExyCsBAl6vZJkXAQQQQAABBBBAICYCBLxWzAS8Vmy+FRHw+kbPwggggIArAQJeV0wM8kqAgNcrWeZFAAEEEEAAAQQQiIkAAa8VMwGvFZtvRQS8vtGzMAIIIOBKgIDXFRODvBIg4PVKlnkRQAABBBBAAAEEYiJAwGvFTMBrxeZbEQGvb/QsjAACCLgSIOB1xcQgrwQIeL2SZV4EEEAAAQQQQACBmAgQ8FoxE/BasflWRMDrGz0LI4AAAq4ECHhdMTHIKwECXq9kmRcBBBBAAAEEEEAgJgIEvFbMBLxWbL4VEfD6Rs/CCCCAgCsBAl5XTAzySoCA1ytZ5kUAAQQQQAABBBCIiQABrxUzAa8Vm29FBLy+0bMwAggg4EqAgNcVU3gHfbTxaz3y1Gp9+vm32rvvgEqWKKpaNarqtnbNVKVyxWxv/I33PtXiZ1/Rv7/YrP0HDqlokUI67+zT1bbFFbrishpZ5iPgzTYxBQgggAACCCCAAAJBEiDgteoGAa8Vm29FBLy+0bMwAggg4EqAgNcVUzgHPb3ydd034RFnc6dVKqeK5Uvph5+Slbx9lwrkz6c54/qqZvVzXG/+gemLtfDpl5zxZUuXUIWyJfXj1u3avWe/87WObRurb7c2meYj4HXNy0AEEEAAAQQQQACBIAoQ8Fp1hYDXis23IgJe3+hZGAEEEHAlQMDriil8g7b8nKzmtw7WsWOpGjukq5o0rO1sMi0tTfMWrdSUh55RhbKltGLBGBUqmD8iwEuvb9Cd901XrlxJGjmgs5pfXVdJSUlKTT2uR5es1sQ5S5w5ls69X1XPPj1jPgLeiLQMQAABBBBAAAEEEAiyAAGvVXcIeK3YfCsi4PWNnoURQAABVwIEvK6Ywjdo9NRFWrTsZV3f9HIN69chywbb9x4tc3zD8Ls7qlWT+hEBbr3jAa3/5Evd0voa9e95Q5bxN/YYoU83fecc/dCncysC3oiiDEAAAQQQQAABBBCICwECXqs2EfBasflWRMDrGz0LI4AAAq4ECHhdMYVvUMPWd+mX7Tv12JSBJzyGYcmKdRr24KOqV6uaZo/tGxHAjP9563Y1u6quzjrjlCzjR01ZqMXPvqqWjepp5IBOBLwRRRmAAAIIIIAAAgggEBcCBLxWbSLgtWLzrYiA1zd6FkYAAQRcCRDwumIK1yBzJu6lLXo5m9qweq4KFsiXZYNffrtFrTrfq9Ili+mNZ6dGDdBv+CytWvs+d/BGLckECCCAAAIIIIAAAoESIOC1agcBrxWbb0UEvL7RszACCCDgSoCA1xVTuAZt/GKz2nYfrpLFi+qt5dNOuLk9ew+obvOezvc+eHG2ChcqYI2wc/c+XXNDPx06fFTPzR+Z6Q5fzuC1ZqUQAQQQQAABBBBAIAgCBLxWXSDgtWLzrYiA1zd6FkYAAQRcCRDwumIK16B3N3yuzv3G67RK5bR68bgTbi7lWKouuPK3oxRee3qyypUpYYVgHrLWc9Akvfn+RrVu2kD397s10zy/7j1qNS9FCCCAAAIIIIAAAggEQeDo/gMqMKKzkn5NDsLlxM01HBq1SHnLVVRSUtxcckJfaOliWT/1mdAgbB4BBBAImAABb8Aakp3L+XrzTxo+8THXJbe0uUZX1a+p1975WL0GTVGVyhW1YsGYP60/r8FvYeyqRWNV+ZTyrtdJH3j4yFHdPWK21r71kapXPVOPTL5H+fPlzfY8FCCAAAIIIIAAAgggEFSB5K27lG84AW92+3N49CKVOaOy8uQm4c2uHeMRQAABBBD4owABbxy/Jz75/Ft17nviO3BPtK3+PW9Um2YN9N6Hm9Sp7zhP7+DdsXOPeg2arI1ffq8a1c7WjDF3qFiRQlku60jK8TjuAJeOAAIIIIAAAgggkOgCu3bsUX4C3my/DUzAW+y0U5U7FwFvtvF8KMifN5cPq7IkAggggIBbAQJet1IhGmdC17bdhqlE8SJ6e/n0E+7MnJtb79rezvfWr5qjQgXzuxb49vuf1e2eidqa/KuuaXCJxgzq8qd37nIGr2tWBiKAAAIIIIAAAggEUYAzeK26whm8Vmy+FXEGr2/0LIwAAgi4EiDgdcUUrkF79x9UnaY9Threpj+IrXzZklq7dJJrgC+/3aJb+ozR/gOH1LV9M/XueJ2STnKwFgGva1oGIoAAAggggAACCARRgIDXqisEvFZsvhUR8PpGz8IIIICAKwECXldM4RvU6Kb+2vLzNj08sb9q16iaZYOPLV2jcTOeUMN6NTR1xO2uAH74KVnteo2UufvXPEzNPFQt0ouAN5IQ30cAAQQQQAABBBAItAABr1V7CHit2HwrIuD1jZ6FEUAAAVcCBLyumMI3aNLcpXpo8QtqelUdjR3cNdMG09LSdF2noTIPcRs/tLsaN6wVEcA8UO36Lvfp+y1bNbD3TWrX6qqINWYAAa8rJgYhgAACCCCAAAIIBFWAgNeqMwS8Vmy+FRHw+kbPwggggIArAQJeV0zhG7Rtx241aT9ABw8d0bB+HXR908udTR5LTdWDs5dowdI1qlK5opbNH6m8eXJnAMxbtFLJ23epQd0LdNkl1TK+Pnne0zLfq1+7umY9cKdrMAJe11QMRAABBBBAAAEEEAiiAAGvVVcIeK3YfCsi4PWNnoURQAABVwIEvK6Ywjnopdc3qN/wmUpNPa6K5UurYrnSzh24u/bsU/GihTV/0gCde1blTJs3d/Z+9d2Pztm63W5u7nwvJeWY6jTroUOHj+rUimVVrGjhPwUrXbKYZo+9K+P7BLzhfG+xKwQQQAABBBBAIGEECHitWk3Aa8XmWxEBr2/0LIwAAgi4EiDgdcUU3kFffPOD5j6+Qhs+/Ur79h9UmdIlnLtwu7ZrJvOAtT++ThTwHjx0WBc36uYKqVyZEnrt6ckEvK60GIQAAggggAACCCAQeAECXqsWEfBasflWRMDrGz0LI4AAAq4ECHhdMTHIKwHu4PVKlnkRQAABBBBAAAEEYiJAwGvFTMBrxeZbEQGvb/QsjAACCLgSIOB1xcQgrwQIeL2SZV4EEEAAAQQQQACBmAgQ8FoxE/BasflWRMDrGz0LI4AAAq4ECHhdMTHIKwECXq9kmRcBBBBAAAEEEEAgJgIEvFbMBLxWbL4VEfD6Rs/CCCCAgCsBAl5XTAzySoCA1ytZ5kUAAQQQQAABBBCIiQABrxUzAa8Vm29FBLy+0bMwAggg4EqAgNcVE4O8EiDg9UqWeRFAAAEEEEAAAQRiIkDAa8VMwGvF5lsRAa9v9CyMAAIIuBIg4HXFxCCvBAh4vZJlXgQQQAABBBBAAIGYCBDwWjET8Fqx+VZEwOsbPQsjgAACrgQIeF0xMcgrAQJer2SZFwEEEEAAAQQQQCAmAgS8VswEvFZsvhUR8PpGz8IIIICAKwECXldMDPJKgIDXK1nmRQABBBBAAAEEEIiJAAGvFTMBrxWbb0UEvL7RszACCCDgSoCA1xUTg7wSIOD1SpZ5EUAAAQQQQAABBGIiQMBrxUzAa8XmWxEBr2/0LIwAAgi4EiDgdcXEIK8ECHi9kmVeBBBAAAEEEEAAgZgIEPBaMRPwWrH5VkTA6xs9CyOAAAKuBAh4XTExyCsBAl6vZJkXAQQQQAABBBBAICYCBLxWzAS8Vmy+FRHw+kbPwggggIArAQJeV0wM8kqAgNcrWeZFAAEEEEAAAQQQiIkAAa8VMwGvFZtvRQS8vtGzMAIIIOBKgIDXFRODvBIg4PVKlnkRQAABBBBAAAEEYiJAwGvFTMBrxeZbEQGvb/QsjAACCLgSIOB1xcQgrwQIeL2SZV4EEEAAAQQQQACBmAgQ8FoxE/BasflWRMDrGz0LI4AAAq4ECHhdMTHIKwECXq9kmRcBBBBAAAEEEEAgJgIEvFbMBLxWbL4VEfD6Rs/CCCCAgCsBAl5XTAzySoCA1ytZ5kUAAQQQQAABBBCIiQABrxUzAa8Vm29FBLy+0bMwAggg4EqAgNcVE4O8EiDg9UqWeRFAAAEEEEAAAQRiIkDAa8VMwGvF5lsRAa9v9CyMAAIIuBIg4HXFxCCvBAh4vZJlXgQQQAABBBBAAIGYCBDwWjET8Fqx+VZEwOsbPQsjgAACrgQIeF0xMcgrAQJer2SZFwEEEEAAAQQQQCAmAgS8VswEvFZsvhUR8PpGz8IIIICAKwECXldMDPJKgIDXK1nmRQABBBBAAAEEEIiJAAGvFTMBrxWbb0UEvL7RszACCCDgSoCA1xUTg7wSIOD1SpZ5EUAAAQQQQAABBGIiQMBrxUzAa8XmWxEBr2/0LIwAAgi4EiDgdcXEIK8ECHi9kmVeBBBAAAEEEEAAgZgIEPBaMRPwWrH5VkTA6xs9CyOAAAKuBAh4XTExyCsBAl6vZJkXAQQQQAABBBBAICYCBLxWzAS8Vmy+FRHw+kbPwggggIArAQJeV0wM8kqAgNcrWeZFAAEEEEAAAQQQiIkAAa8VMwGvFZtvRQS8vtGzMAIIIOBKgIDXFRODvBIg4PVKlnkRQAABBBBAAAEEYiJAwGvFTMBrxeZbEQGvb/QsjAACCLgSIOB1xcQgrwQIeL2SZV4EEEAAAQQQQACBmAgQ8FoxE/BasflWRMDrGz0LI4AAAq4ECHhdMTHIKwECXq9kmRcBBBBAAAEEEEAgJgIEvFbMBLxWbL4VEfD6Rs/CCCCAgCsBAl5XTAzySoCA1ytZ5kUAAQQQQAABBBCIiQABrxUzAa8Vm29FBLy+0bMwAggg4EqAgNcVE4O8EiDg9UqWeRFAAAEEEEAAAQRiIkDAa8VMwGvF5lsRAa9v9CyMAAIIuBIg4HXFxCCvBAh4vZJlXgQQQAABBBBAAIGYCBDwWjET8Fqx+VZEwOsbPQsjgAACrgQIeF0xMcgrAQJer2SZFwEEEEAAAQQQQCAmAgS8VswEvFZsvhUR8PpGz8IIIICAKwECXldMDPJKgIDXK1nmRQABBBBAAAEEEIiJAAGvFTMBrxWbb0UEvL7RszACCCDgSoCA1xUTg7wSIOD1SpZ5EUAAAQQQQAABBGIiQMBrxUzAa8XmWxEBr2/0LIwAAgi4EiDgdcXEIK8ECHi9kmVeBBBAAAEEEEAAgZgIEPBaMRPwWrH5VkTA6xs9CyOAAAKuBAh4XTExyCsBAl6vZJkXAQQQQAABBBBAICYCBLxWzAS8Vmy+FRHw+kbPwggggIArAQJeV0wM8kqAgNcrWeZFAAEEEEAAAQQQiIkAAa8VMwGvFZtvRQS8vtGzMAIIIOBKgIDXFRODvBIg4PVKlnkRQAABBBBAAAEEYiJAwGvFTMBrxeZbEQGvb/QsjAACCLgSIOB1xcQgrwQIeL2SZV4EEEAAAQQQQACBmAgQ8FoxE/BasflWRMDrGz0LI4AAAq4ECHhdMTHIKwECXq9kmRcBBBBAAAEEEEAgJgIEvFbMBLxWbL4VEfD6Rs/CCCCAgCsBAl5XTAzySoCA1ytZ5kUAAQQQQAABBBCIiQABrxUzAa8Vm29FBLy+0bMwAggg4EqAgNcVE4O8EiDg9UqWeRFAAAEEEEAAAQRiIkDAa8VMwGvF5lsRAa9v9CyMAAIIuBIg4HXFxCCvBAh4vZJlXgQQQAABBBBAAIGYCBDwWjET8Fqx+VZEwOsbPQsjgAACrgQIeF0xMcgrAQJer2SZFwEEEEAAAQQQQCAmAgS8VswEvFZsvhUR8PpGz8IIIICAKwECXldMDPJKgIDXK1nmRQABBBBAAAEEEIiJAAGvFTMBrxWbb0UEvL7RszACCCDgSoCA1xUTg7wSIOD1SpZ5EUAAAQQQQAABBGIiQMBrxUzAa8XmWxEBr2/0LIwAAgi4EiDgdcXEIK8ECHi9kmVeBBBAAAEEEEAAgZgIEPBaMRPwWrH5VkTA6xs9CyOAAAKuBAh4XTExyCsBAl6vZJkXAQQQQAABBBBAICYCBLxWzAS8Vmy+FRHw+kbPwggggIArAQJeV0wM8kqAgNcrWeZFAAEEEEAAAQQQiIkAAa8VMwGvFZtvRQS8vtGzMAIIIOBKgIDXFRODvBIg4PVKlnkRQAABBBBAAAEEYiJAwGvFTMBrxeZbEQGvb/QsjAACCLgSIOB1xcQgrwQIeL2SZV4EEEAAAQQQQACBmAgQ8FoxE/BasflWRMDrGz0LI4AAAq4ECHhdMTHIKwECXq9kmRcBBBBAAAEEEEAgJgIEvFbMBLxWbL4VEfD6Rs/CCCCAgCsBAl5XTAzySoCA1ytZ5kUAAQQQQAABBBCIiQABrxUzAa8Vm29FBLy+0bMwAggg4EqAgNcVE4O8EiDg9UqWeRFAAAEEEEAAAQRiIkDAa8VMwGvF5lsRAa9v9CyMAAIIuBIg4HXFxCCvBAh4vZJlXgQQQAABBBBAAIGYCBDwWjET8Fqx+VZEwOsbPQsjgAACrgQIeF0xMcgrAQJer2SZFwEEEEAAAQQQQCAmAgS8VswEvFZsvhUR8PpGz8IIIICAKwECXldMDPJKgIDXK1nmRQABBBBAAAEEEIiJAAGvFTMBrxWbb0UEvL7RszACCCDgSoCA1xUTg7wSIOD1SpZ5EUAAAQQQQAABBGIiQMBrxUzAa8XmWxEBr2/0LIwAAgi4EiDgdcUU3kEfbfxajzy1Wp9+/q327jugkiWKqlaNqrqtXTNVqVwxWxs/fjxNy9e8peVr3taX327RwUOHVaJYEVX7WxW1btpADepekGU+At5sETMYAQQQQAABBBBAIGgCBLxWHSHgtWLzrYiA1zd6FkYAAQRcCRDwumIK56CnV76u+yY84mzutErlVLF8Kf3wU7KSt+9Sgfz5NGdcX9Wsfo6rzaekHFOPgZP1zobPnPGnVizrhLs//bJdu/fsd752S+tr1L/nDZnmI+B1xcsgBBBAAAEEEEAAgaAKEPBadYaA14rNtyICXt/oWRgBBBBwJUDA64opfIO2/Jys5rcO1rFjqRo7pKuaNKztbDItLU3zFq3UlIeeUYWypbRiwRgVKpg/IsD0+c9q1oLlKlOquKaNvF3nVz3TqUlNPa5Hl6zWxDlLnD8/MXNoxvfMnwl4I9IyAAEEEEAAAQQQQCDIAgS8Vt0h4LVi862IgNc3ehZGAAEEXAkQ8LpiCt+g0VMXadGyl3V908s1rF+HLBts33u0zPENw+/uqFZN6kcEaNDqDm3/dbcmDeulqy+vmWX8jT1G6NNN36lr+2a6vVOrjO8T8EakZQACCCCAAAIIIIBAkAUIeK26Q8BrxeZbEQGvb/QsjAACCLgSIOB1xRS+QQ1b36Vftu/UY1MGnvAYhiUr1mnYg4+qXq1qmj2270kBzF2/n3z+rXbv3a86F53nHO/wx9eQsQ/r2VVv6tZ//VN3d29LwBu+txQ7QgABBBBAAAEEElOAgNeq7wS8Vmy+FRHw+kbPwggggIArAQJeV0zhGmTOxL20RS9nUxtWz1XBAlkDWfOQtFad71XpksX0xrNTowIwD19rfdt9zoPXzHEQTa+sQ8AblSjFCCCAAAIIIIAAAoERIOC1agUBrxWbb0UEvL7RszACCCDgSoCA1xVTuAZt/GKz2nYfrpLFi+qt5dNOuLk9ew+obvOezvc+eHG2ChcqYIXw09btzvm7a9atV7W/VdGi6UOUO3cuAl4rTYoQQAABBBBAAAEEAidAwGvVEgJeKzbfigh4faNnYQQQQMCVAAGvK6ZwDXp3w+fq3G+8TqtUTqsXjzvh5lKOpeqCKzs533vt6ckqV6aEa4RX3vxQk+Yu1f4Dh7Rj5x6VLV1Cza+uq54dWip/vryZ5uEMXtesDEQAAQQQQAABBBAIogABr1VXCHit2HwrIuD1jZ6FEUAAAVcCBLyumII56OvNP2n4xMdcX9wtba7RVfVr6rV3PlavQVNUpXJFrVgw5k/rz2twq/O9VYvGqvIp5V2vY87aNWfupr/Kly2pujX/7jxgzYTKvBBAAAEEEEAAAQQQCItA8tZdyje8s5J+TQ7LlmKyj8OjF6nMGZWVJ3dSTNZjEQQQQAABBMIsQMAbx901Dzbr3PfEd+CeaFv9e96oNs0a6L0PN6lT33Ge3cGbvva+/Qf1zfc/6ZkX3tBzq99SkcIF9eSse3VG5YpxrM6lI4AAAggggAACCCDwPwECXrt3AwGvnRtVCCCAAAIInEiAgDcB3xcbFyXlmgAAIABJREFUv/xebbsNU4niRfT28uknFNi5e5/qXdvb+d76VXNUqGD+qKRGT12kRcte1j/qXqjpo/tkzMURDVGxUowAAggggAACCCDgtwBHNFh1gCMarNh8K+KIBt/oWRgBBBBwJUDA64opXIP27j+oOk17nDS8TX8QmzleYe3SSVEDfP7Vf9Sm6/3Ow9rMQ9vSXwS8UdMyAQIIIIAAAggggICfAgS8VvoEvFZsvhUR8PpGz8IIIICAKwECXldM4RvU6Kb+2vLzNj08sb9q16iaZYOPLV2jcTOeUMN6NTR1xO0nBdi8ZavzULWDhw5r3vi7lStX1nO0Pv7sG7XrNcqZ59+vzlfu3Lmc/ybgDd97ix0hgAACCCCAAAIJJUDAa9VuAl4rNt+KCHh9o2dhBBBAwJUAAa8rpvANMoHsQ4tfUNOr6mjs4K6ZNpiWlqbrOg2VeYjb+KHd1bhhrZMC7D9wSHWa9dDx42maN6Gf80C1P77mLVqpyfOedh7WZh7alv4i4A3fe4sdIYAAAggggAACCSVAwGvVbgJeKzbfigh4faNnYQQQQMCVAAGvK6bwDdq2Y7eatB+gg4eOaFi/Drq+6eXOJo+lpurB2Uu0YOkaValcUcvmj1TePLkzAExQm7x9lxrUvUCXXVIt4+t33T9Da9atV4WypTThvu668O9/zfjeq29+pP4jZ+vwkaPq3fE6dbu5OQFv+N5S7AgBBBBAAAEEEEhIgaRDB5RWsHBC7j2qTR/cJxUqGtUUFMdOgIA3dtashAACCNgIEPDaqIWk5qXXN6jf8JlKTT2uiuVLq2K50vp+y1bt2rNPxYsW1vxJA3TuWZUz7dbc2fvVdz9mCWpNTcc7xzp3/ZqXCXrLli6urdt2asfOPc7XzJ29M0b3Ub58eQl4Q/IeYhsIIIAAAggggAACCCAQfgEC3vD3mB0igEB8CxDwxnf/or76L775QXMfX6ENn36lffsPqkzpEqpfu7q6tmsm84C1P77+LOA1444cTdFTy9dq9WsfyJzLa87kLVKooM4+8zQ1u6quWjaql+V8Xo5oiLqFTIAAAggggAACCCCAAAIIeCpAwOspL5MjgAACUQsQ8EZNyATRCBDwRqNHLQIIIIAAAggggAACCCDgvQABr/fGrIAAAghEI0DAG40etVELEPBGTcgECCCAAAIIIIAAAggggICnAgS8nvIyOQIIIBC1AAFv1IRMEI0AAW80etQigAACCCCAAAIIIIAAAt4LEPB6b8wKCCCAQDQCBLzR6FEbtQABb9SETIAAAggggAACCCCAAAIIeCpAwOspL5MjgAACUQsQ8EZNyATRCBDwRqNHLQIIIIAAAggggAACCCDgvQABr/fGrIAAAghEI0DAG40etVELEPBGTcgECCCAAAIIIIAAAggggICnAgS8nvIyOQIIIBC1AAFv1IRMEI0AAW80etQigAACCCCAAAIIIIAAAt4LEPB6b8wKCCCAQDQCBLzR6FEbtQABb9SETIAAAggggAACCCCAAAIIeCpAwOspL5MjgAACUQsQ8EZNyATRCBDwRqNHLQIIIIAAAggggAACCCDgvQABr/fGrIAAAghEI0DAG40etVELEPBGTcgECCCAAAIIIIAAAggggICnAgS8nvIyOQIIIBC1AAFv1IRMEI0AAW80etQigAACCCCAAAIIIIAAAt4LEPB6b8wKCCCAQDQCBLzR6FEbtQABb9SETIAAAggggAACCCCAAAIIeCpAwOspL5MjgAACUQsQ8EZNyATRCBDwRqNHLQIIIIAAAggggAACCCDgvQABr/fGrIAAAghEI0DAG40etVELEPBGTcgECCCAAAIIIIAAAggggICnAgS8nvIyOQIIIBC1AAFv1IRMEI0AAW80etQigAACCCCAAAIIIIAAAt4LEPB6b8wKCCCAQDQCBLzR6FEbtQABb9SETIAAAggggAACCCCAAAIIeCpAwOspL5MjgAACUQsQ8EZNyATRCBDwRqNHLQIIIIAAAggggAACCCDgvQABr/fGrIAAAghEI0DAG40etVELEPBGTcgECCCAAAIIIIAAAggggICnAgS8nvIyOQIIIBC1AAFv1IRMEI0AAW80etQigAACCCCAAAIIIIAAAt4LEPB6b8wKCCCAQDQCBLzR6FEbtQABb9SETIAAAggggAACCCCAAAIIeCpAwOspL5MjgAACUQsQ8EZNyATRCBDwRqNHLQIIIIAAAggggAACCCDgvQABr/fGrIAAAghEI0DAG40etVELEPBGTcgECCCAAAIIIIAAAggggICnAgS8nvIyOQIIIBC1AAFv1IRMEI0AAW80etQigAACCCCAAAIIIIAAAt4LEPB6b8wKCCCAQDQCBLzR6FEbtQABb9SETIAAAggggAACCCCAAAIIeCpAwOspL5MjgAACUQsQ8EZNyATRCBDwRqNHLQIIIIAAAggggAACCCDgvQABr/fGrIAAAghEI0DAG40etVELEPBGTcgECCCAAAIIIIAAAggggICnAgS8nvIyOQIIIBC1AAFv1IRMgAACCCCAAAIIIIAAAggggAACCCCAAAII+CNAwOuPO6sigAACCCCAAAIIIIAAAggggAACCCCAAAJRCxDwRk3IBAgggAACCCCAAAIIIIAAAggggAACCCCAgD8CBLz+uLMqAggggAACCCCAAAIIIIAAAggggAACCCAQtQABb9SETIAAAggggAACCCCAAAIIIIAAAggggAACCPgjQMDrjzurIoAAAggggAACCCCAAAIIIIAAAggggAACUQsQ8EZNyAQIIIAAAggggAACCCCAAAIIIIAAAggggIA/AgS8/rizKgIIIIAAAggggAACCCCAAAIIIIAAAgggELUAAW/UhEyAAAIIIIAAAggggAACCCCAAAIIIIAAAgj4I0DA6487qyKAAAIIIIAAAggggAACCCCAAAIIIIAAAlELEPBGTcgECCCAAAIIIIAAAggggAACCCCAAAIIIICAPwIEvP64syoCCHgksG//QU2cu1Td2jdX+bIlPVqFaRFAAAF3Ah9/9o3e3fC5Ot7QWAXy53NXxCgEEEDAI4Gnlq9V4cIF1fTKOh6twLQIIIAAAggg4IcAAa8f6qyJAAKeCYyd8YQWLF2jggXy6e7ubfWvFld4thYTI4AAAicTSEtLU5uuw7Tp6/+oYrlSGje0u2pU+ytoCCCAgC8C23bsVuN2/XXo8FFdcN5ZmjKit8qUKu7LtbAoAggggAACCOSsAAFvznoyGwII+Cjw/ZaturbDEB1LTXWuomWjeho5oJOPV8TSCCCQyALLXnxDQ8fNzyAYM6iLml99aSKTsHcEEPBR4J7Rc7XipXcyruCVJROdXz7xQgABBBBAAIH4FyDgjf8esgMEEPh/gW4DHtSb729U1bNPd+6Y69utjTq2bYwPAgggEHOBAwcPq3G7Adqxc0/Gz6QnZ9+naueeEfNrYUEEEEDg35u+0w09RqhI4YIqWbyoduzcrfWr5igpKQkcBBBAAAEEEAiBAAFvCJrIFhBAQE6wawLeEsWLqEnDOlq07GVNH91H/6h7ITwIIIBAzAUenL1E8598UXVr/l2HjxzRRxu/0QcvzlbhQgVifi0siAACiS1gjosx4e7GLzar283N9dCiF/TX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3weqaxAg8J0F3nrng5h0472xumh1DO7T4Ttfx4kECBD4PgQWPvdKTJl1bxzZsG60adbo+7ikaxDIhICANxNtViQBAgQIECBAgAABAgQIECBAgAABAmkUEPCmsatqIkCAAAECBAgQIECAAAECBAgQIEAgEwIC3ky0WZEECBAgQIAAAQIECBAgQIAAAQIECKRRQMCbxq6qiQABAgQIECBAgAABAgQIECBAgACBTAgIeDPRZkUSIECAAAECBAgQIECAAAECBAgQIJBGAQFvGruqJgIECBAgQIAAAQIECBAgQIAAAQIEMiEg4M1EmxVJgAABAgQIECBAgAABAgQIECBAgEAaBQS8aeyqmggQIECAAAECBAgQIECAAAECBAgQyISAgDcTbVYkAQIECBAgQIAAAQIECBAgQIAAAQJpFBDwprGraiJAgAABAgQIECBAgAABAgQIECBAIBMCAt5MtFmRBAgQIECAAAECBAgQIECAAAECBAikUUDAm8auqokAAQIECBAgQIAAAQIECBAgQIAAgUwICHgz0WZFEiBAgAABAgQIECBAgAABAgQIECCQRgEBbxq7qiYCBAgQIECAAAECBAgQIECAAAECBDIhIODNRJsVSYAAAQIECBAgQIAAAQIECBAgQIBAGgUEvGnsqpoIECBAgAABAgQIECBAgAABAgQIEMiEgIA3E21WJAECBAgQIECAAAECBAgQIECAAAECaRQQ8Kaxq2oiQIAAAQIECBAgQIAAAQIECBAgQCATAgLeTLRZkQQIECBAgAABAgQIECBAgAABAgQIpFFAwJvGrqqJAAECBAgQIECAAAECBAgQIECAAIFMCAh4M9FmRRIgQIAAAQIECBAgQIAAAQIECBAgkEYBAW8au6omAgQIECBAgAABAgQIECBAgAABAgQyISDgzUSbFUmAAAECBAgQIECAAAECBAgQIECAQBoFBLxp7KqaCBAgQIAAAQIECBAgQIAAAQIECBDIhICANxNtViQBAgQIECBAgAABAgQIECBAgAABAmkUEPCmsatqIkCAAAECBAgQIECAAAECBAgQIEAgEwIC3ky0WZEECBAgQIAAAQIECBAgQIAAAQIECKRRQMCbxq6qiQABAgQIECBAgAABAgQIECBAgACBTAgIeDPRZkUSIECAAAECBAgQIECAAAECBAgQIJBGAQFvGruqJgIECBAgQIAAAQIECBAgQIAAAQIEMiEg4M1EmxVJgAABAgQIECBAgAABAgQIECBAgEAaBQS8aeyqmggQIECAAAECBAgQIECAAAECBAgQyISAgDcTbVYkAQIECBAgQIAAAQIECBAgQIAAAQJpFBDwprGraiJAgAABAgQIECBAgAABAgQIECBAIBMCAt5MtFmRBAgQIECAAAECBAgQIECAAAECBAikUUDAm8auqokAAQIECBAgQIAAAQIECBAgQIAAgUwICHgz0WZFEiBAgAABAgQIECBAgAABAgQIECCQRgEBbxq7qiYCBAgQIECAAAECBAgQIECAAAECBDIhIODNRJsVSYAAAQIECBAgQIAAAQIECBAgQIBAGgUEvGnsqpoIECBAgAABAgQIECBAgAABAgQIEMiEgIA3E21WJAECBAgQIECAAAECBAgQIECAAAECaRQQ8Kaxq2oiQIAAAQIECBAgQIAAAQIECBAgQCATAgLeTLRZkQQIECBAgAABAgQIECBAgAABAgQIpFFAwJvGrqqJAAECBAgQIECAAAECBAgQIECAAIFMCAh4M9FmRRIgQIAAAQIECBAgQIAAAQIECBAgkEYBAW8au6omAgQIECBAgAABAgQIECBAgAABAgQyISDgzUSbFUmAAAECBAgQIECAAAECBAgQIECAQBoFBLxp7KqaCBAgQIAAAQIECBAgQIAAAQIECBDIhICANxNtViQBAgQIECBAgAABAgQIECBAgAABAmkUEPCmsatqIkCAAAECBAgQIECAAAECBAgQIEAgEwIC3ky0WZEECBAgQIAAAQIECBAgQIAAAQIECKRRQMCbxq6qiQABAgQIECBAgAABAgQIECBAgACBTAgIeDPRZkUSIECAAAECBAgQIECAAAECBAgQIJBGAQFvGruqJgIECBAgQIAAAQIECBAgQIAAAQIEMiEg4M1EmxVJgAABAgQIECBAgAABAgQIECBAgEAaBQS8aeyqmggQIECAAAECBAgQIECAAAECBAgQyISAgDcTbVYkAQIECBAgQIAAAQIECBAgQIAAAQJpFBDwprGraiJAgAABAgQIECBAgAABAgQIECBAIBMCAt5MtFmRBAgQIECAAAECBAgQIECAAAECBAikUUDAm8auqokAAQIECBAgQIAAAQIECBAgQIAAgUwICHgz0WZFEiBAgAABAgQIECBAgAABAgQIECCQRgEBbxq7qiYCBAgQIECAAAECBAgQIECAAAECBDIhIODNRJsVSYAAAQIECBAgQIAAAQIECBAgQIBAGgUEvGnsqpoIECBAgAABAgQIECBAgAABAgQIEMiEgIA3E21WJAECBAgQyI7Ay6+9EQ/MeyoWLPxHvPXO+/HJp1/EFptvFtWrbRN77VErGhyyfxzfuEHUrFE9OygqJUCAAAECBAgQIEAgtQIC3tS2VmEECBAgQCBbAh98tDSGjJkWjzy+cIOFV6y4ZZza4tjo1al1bLnlFhscbwABAgQIECBAgAABAgQKVUDAW6idMS8CBAgQIEAgb4FXFr0ZnfuMivc//CQ5Z8/da8UJTQ6PQw6oHTW2rxarVhXFu+9/FH9++oW4/b758enny5Jxue8njvhdbF2lUt73MpAAAQIECBAgQIAAAQKFJCDgLaRumAsBAgQIECBQZoFcWNv2rMHxxtvvRYUKFaL3WW2iQ9tfxuabb1bqtXLjB42YFA/Nfyb5vsmR9WPcxd3LfF8nECBAgAABAgQIECBAoBAEBLyF0AVzIECAAAECBL6zwOiJs2PyrHuT8/ue8+vocPIvN3it1au/ji7njY4/P/18MvaqYb2i0eEHFZ83/ea5MeKqG5P3T903MapUXv8J34+Xfhb/27xHMuaSfmdGi+OOWO++r/377Zg556F48q//iCXvfhhff/117LB9tahfd584ufkxUbfOXuudc/v9j8fA4TdE5UoV4+n7r4v5C56LcdffHIsWL4k2JzSK3BrDT/3tpdh15x1i7o0jk1D7244TOwyM115/K3lSecYVAzfoYgABAgQIECBAgAABAuVPQMBb/npmxgQIECBAgMD/Cyz78qs4qmXPWPbl8qi9525x2+Sh/zHwLAm35L2PoukpfaKoaHXUO3DvmD5hwPca8M6+69G4dNyMWFVUlFx3p5rbJf+++/7Hxfc5p33z6H5Gi3X6ee/DC6Lv0GuSOu6cNixadbowVqxYmYxp+asj4+cH7xf9Lr02eT9p9HnRoF6dUv8eXl30VjTvuCbUHXreGcm5DgIECBAgQIAAAQIE0icg4E1fT1VEgAABAgQyI5B7uvXsfqOTegf2PC3ZOK0sR48LJiSbsm22WYV44q6ro+rWlZPTN/YJ3tyTwWf1HZ08sdu00aHRv3u72HGH6sm1P1n6eYy5bnbces9jyfsRA7tEsyYNi6c999Gn4reDr0ren/CLw+PZF16NTqc2i112qhHbbrN1/HTPXaNRy57JOsLHH9sgLh90dqklj7/h1rju93dFpa0qxmO3TbDOcFn+MIwlQIAAAQIECBAgUI4EBLzlqFmmSoAAAQIECKwrcOXk2+Ka6XckH942+ZLY+ye7lYlo5pwHY9iEmck514/qE4fX/1nyemMD3hZnXBD//NebydII08YPSALkbx7nDpoQD89fGLV23D4evGl08ZPHuc9y3+WOGtttG7dcf3FxOLz2GpeOnxF/uO3hqFhxy5g3Z3xsW7XKetc/rt15sfit9+LEX/xPXDagc5lcDCZAgAABAgQIECBAoPwICHjLT6/MlAABAgQIEPiGwOBRU+Pmux9NPv22tXL/E9pjf3k2zuk/NhkyfMBZyROzuWNjAt7cGrktzxyUXGfC0HPj2CMOKXUKf1n4Ypz528uT72ZNvCgO2HfP5HXJgLd9m6bRr9sp651f8h4X9DotTjlp3SeXn395UZzcZUhy3uSx/ZJlHRwECBAgQIAAAQIECKRTQMCbzr6qigABAgQIZEKgz8XXxH2PLEhqff6PU/Jef3ctzsLn/hmn9RiWvC25xMPGBLw33fFIXDx2+pqw9uYxsXPN7UvtRW7d4EOPW7O8woW92yebriXnlHiCd/zQHtH4iHqlnt+2y+B44eXXo87eP46brxu8zpiRV8+KqbPvj1123iEe2MBGbJn4Q1EkAQIECBAgQIAAgRQLCHhT3FylESBAgACBtAtcNGpK3HL3vKTMJ++dWOZ1Zucv+Huc3W9Mcn5uGYPccga5Y2MC3qum3BZXT1uzbES+R+d2zaJX59bJ8JIB78yrLoiD9v9pqZeZfecfY8iYacl3cyYNjX32+lHyOrfub+O2v4t33v8oup7ePLp1XHcTt3znZBwBAgQIECBAgAABAuVDQMBbPvpklgQIECBAgEApAiXX4L3l+iGxX+09yuR04+0PxyXjZiTnTBpzXjQ4pE7yemMC3pHXzIqpN92fXKdmjepRYf3ld9ebY6tfHRXdz1gTxJYMeO+cNiz22mOXUmv6YtnyOKrlufHl8hXxm1ZN4vwe7ZJxC597JU7rcWnyeu6NI2O3WjXLZGIwAQIECBAgQIAAAQLlS0DAW776ZbYECBAgQIBACYF5TzwbXc9fs4bued1OidPbNC2TT9+h18S9Dy9INkH7y93XFD8BnE/A+9Enn8URJ/VI7ndJvzOjxXFHJK+vnnp7XDX19uT1o7eOS0LeshwlA967pl8WP9m91reePnD4DXH7/Y9H9WpVk83Wtth881i7AdthB+8bU8b2L8utjSVAgAABAgQIECBAoBwKCHjLYdNMmQABAgQIEFgjUPIp1j13rxV3Th2WhLX5HEs//SKObt0rvlqxMhrW3z9uGNW3+LQZtzwQw6/8Q/L+25Z++NfiJXFC+/OTMSUD3lvveSwuHDk5+bzk5mn5zCk3piwBb8mndSeO+F00rF8nGrXsFR8v/SyGnd85mjdds+SEgwABAgQIECBAgACB9AoIeNPbW5URIECAAIFMCAwdOz1m3fFIUmvvs9pEp1OPz6vuAZddH3fM/VMy9urLesdRDesWn1dyfduHZo+JWjuuv1HanHsfi0GXrwlySwa8ry56K5p3HJh8PuDcdtGuZZNvnc+qoqLkqduSR1kC3tx5uZA5FzbnwtwmR9WP7gPGR5XKlZIneqtU3iovC4MIECBAgAABAgQIECi/AgLe8ts7MydAgAABAgQikqdVTzx9QOSWTKhQoUKyFm27lo3/Y6g6ZuLsmHbz3GRM4yPqxfiha5ZaWHuUXPph3MXdo8mR9df5fuXKVdHmrMHxyqI3k89LBry59606XRgvvbo4Wf/2tsmXlBq0PjT/mbhgxKQ4vP7PYtj5naLSVhWTa5U14M2t95tb97fq1pXjsIP2jUf+9NdkuYjcnBwECBAgQIAAAQIECKRfQMCb/h6rkAABAgQIpF7g6WdfjnP6j41lXy5Paj34Z7Wj7YmNot6B+8QO21eLVauK4t0PPo4nnn4hchurLVq8JBlXt85ecf2ovsVr766FWvrZF3FUy56RC3L32G2nGDO4W+z7092Tr19/4524ZPyMWLZsefzj1cWxYsXK9QLe3H069RmZjD/kgL1jSN+OxWvp5sbf+cCfY/iVM5MN0po2OizGDO5a3KOyBry5YPuY1r1i5aqi4mvMuGJAcl8HAQIECBAgQIAAAQLpFxDwpr/HKiRAgAABApkQyD0xm9t0LPfvho7cOr2ntmgcvTq3icqV1jw5+83jislzYuL0O4s/rrbN1snrXPi7U83tYuq4/tG2y5D47PNlMaRPx2jd7Kh1LnHL3fPi4rHToqhodfL5jjtUjy232CLe++Dj4jA2F0RfPbx3bFu1SvG5ZQ14cyf2vujKeGDe08k1dt91x7hv5uUbIvA9AQIECBAgQIAAAQIpERDwpqSRyiBAgAABAgQiCVMfmv90Ena+8PLr8cFHnyRPyeaOihW3jAP3+0kcWnffaHX8kVFrpxobJMutszv7rkfjtdffilVFq2OnHbaLIxvUjc7tjo+aNaonm7S998EnybIQv2m1/lq7/37z3cht2LZg4YvxzvsfxYoVq6LatltHnb33iGaND49fHdtgvU3hvkvA+/iTz0WX80Yn9Zx7ZqvoctoJG6zNAAIECBAgQIAAAQIE0iEg4E1HH1VBgAABAgQIfIvAr88eEs+9tCi2r75NPDx7TBL0pu146m8vRYdew5MN2x68aXTytLCDAAECBAgQIECAAIFsCAh4s9FnVRIgQIAAgcwK3HrPY3HhyMlJ/b06t47O7ZqlziL39G7uKd5mjRvGiAu6pK4+BREgQIAAAQIECBAg8O0CAl5/HQQIECBAgECqBb5asTJOPH1AvLnk/ahQoUJ063hSnNL82KherWrkvtuqnD/R+8if/ho9Bo5Pejj72sGx/z4/TnU/FUeAAAECBAgQIECAwLoCAl5/EQQIECBAgEDqBV785+tx5m8vj08/X1Zca6WtKiYB7zNzryuXIe/KVUVx/yMLko3cln35VTRr0jBGDPT0bur/mBVIgAABAgQIECBA4BsCAl5/EgQIECBAgEAmBN5+54O4Zvqd8fiTf48PP/40cgHvj3bZMWZNvCi23GLzcmPwydLP4/j2/eOLZctj5cpVybz32etHMW38+bFN1Srlpg4TJUCAAAECBAgQIEDg+xEQ8H4/jq5CgAABAgQIEPivCCz97Is4pnXvWP7VimQzteOO/nl07XBSVN268n/l/m5CgAABAgQIECBAgEBhCQh4C6sfZkOAAAECBAgQIECAAAECBAgQIECAAIG8BQS8eVMZSIAAAQIECBAgQIAAAQIECBAgQIAAgcISEPAWVj/MhgABAgQIECBAgAABAgQIECBAgAABAnkLCHjzpjKQAAECBAgQIECAAAECBAgQIECAAAEChSUg4C2sfpgNAQIECBAgQIAAAQIECBAgQIAAAQIE8hYQ8OZNZSABAgQIECBAgAABAgQIECBAgAABAgQKS0DAW1j9MBsCBAgQIECAAAECBAgQIECAAAECBAjkLSDgzZvKQAIECBAgQIAAAQIECBAgQIAAAQIECBSWgIC3sPphNgQIECBAgAABAgQIECBAgAABAgQIEMhbQMCbN5WBBAgQIECAAAECBAgQIECAAAECBAgQKCwBAW9h9cNsCBAgQIAAAQIECBAgQIAAAQIECBAgkLeAgDdvKgMJECBAgAABAgQIECBAgAABAgQIECBQWAIC3sLqh9kQIECAAAECBAgQIECAAAECBAgQIEAgbwEBb95UBhIgQIAAAQIECBAgQIAAAQIECBAgQKCwBAS8hdUPsyFAgAABAgQIECBAgAABAgQIECBAgEDeAgLevKkMJECAAAECBAgQIECAAAECBAgQIECAQGEJCHgLqx9mQ4AAAQIECBAgQIAAAQIECBAgQIAAgbwFBLx5UxlIgAABAgQIECBAgAABAgQIECBAgACBwhL4P6riJeL7AgBMAAAAAElFTkSuQmCC"
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "from wefe.utils import plot_queries_results, run_queries\n",
+ "\n",
+ "# Plot the results\n",
+ "plot_queries_results(WEAT_gender_results).show()\n"
+ ]
+ },
+ {
+ "cell_type": "raw",
+ "metadata": {},
+ "source": [
+ "Aggregating Results\n",
+ "-------------------\n",
+ "\n",
+ "The execution of :func:`~wefe.utils.run_queries` provided many results evaluating the\n",
+ "gender bias in the tested embeddings. However, these results alone do\n",
+ "not comprehensively report the biases observed in all of these queries.\n",
+ "One way to obtain an overall view of bias is by aggregating results by\n",
+ "model.\n",
+ "\n",
+ "For WEAT, a simple way to aggregate the results is to average their\n",
+ "absolute values. When running :func:`~wefe.utils.run_queries`, it is possible to specify\n",
+ "that the results be aggregated by model by setting ``aggregate_results``\n",
+ "as ``True``\n",
+ "\n",
+ "The aggregation function can be specified through the\n",
+ "``aggregation_function`` parameter. This parameter accepts a list of\n",
+ "predefined aggregations as well as a custom function that operates on\n",
+ "the results dataframe. The aggregation functions available are:\n",
+ "\n",
+ "- Average ``avg``.\n",
+ "- Average of the absolute values ``abs_avg``.\n",
+ "- Sum ``sum``.\n",
+ "- Sum of the absolute values, ``abs_sum``.\n",
+ "\n",
+ ".. note::\n",
+ "\n",
+ " Notice that some functions are more appropriate for certain metrics. For\n",
+ " metrics returning only positive numbers, all the previous aggregation\n",
+ " functions would be OK. In contrast, metrics that return real values\n",
+ " (e.g., :class:`~wefe.metrics.WEAT.WEAT` , :class:`~wefe.metrics.RND.RND` , etc…), \n",
+ " aggregation functions such as sum would make positive and negative outputs to cancel \n",
+ " each other."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 20,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "
WEAT: Ethnicity Queries average of abs values score
\n",
+ "
WEAT: Gender Queries average of abs values score
\n",
+ "
RNSB: Ethnicity Queries average of abs values score
\n",
+ "
\n",
+ "
\n",
+ "
model_name
\n",
+ "
\n",
+ "
\n",
+ "
\n",
+ "
\n",
+ " \n",
+ " \n",
+ "
\n",
+ "
glove twitter dim=25
\n",
+ "
3.0
\n",
+ "
1.0
\n",
+ "
3.0
\n",
+ "
\n",
+ "
\n",
+ "
glove twitter dim=50
\n",
+ "
2.0
\n",
+ "
2.0
\n",
+ "
2.0
\n",
+ "
\n",
+ "
\n",
+ "
glove twitter dim=100
\n",
+ "
1.0
\n",
+ "
3.0
\n",
+ "
1.0
\n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ " WEAT: Ethnicity Queries average of abs values score \\\n",
+ "model_name \n",
+ "glove twitter dim=25 3.0 \n",
+ "glove twitter dim=50 2.0 \n",
+ "glove twitter dim=100 1.0 \n",
+ "\n",
+ " WEAT: Gender Queries average of abs values score \\\n",
+ "model_name \n",
+ "glove twitter dim=25 1.0 \n",
+ "glove twitter dim=50 2.0 \n",
+ "glove twitter dim=100 3.0 \n",
+ "\n",
+ " RNSB: Ethnicity Queries average of abs values score \n",
+ "model_name \n",
+ "glove twitter dim=25 3.0 \n",
+ "glove twitter dim=50 2.0 \n",
+ "glove twitter dim=100 1.0 "
+ ]
+ },
+ "execution_count": 27,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "# create the ranking\n",
+ "ethnicity_ranking = create_ranking(\n",
+ " [WEAT_ethnicity_results, WEAT_EZ_gender_results, RNSB_ethnicity_results]\n",
+ ")\n",
+ "\n",
+ "ethnicity_ranking\n"
+ ]
+ },
+ {
+ "cell_type": "raw",
+ "metadata": {},
+ "source": [
+ "Plotting the rankings\n",
+ "~~~~~~~~~~~~~~~~~~~~~\n",
+ "\n",
+ "It is possible to graph the rankings in barplots using the\n",
+ ":ref:`~wefe.utils.plot_ranking` function. The generated figure shows the accumulated\n",
+ "rankings for each embedding model. Each bar represents the sum of the\n",
+ "rankings obtained by each embedding. Each color within a bar represents\n",
+ "a different criterion-metric ranking."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 28,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "image/png": "iVBORw0KGgoAAAANSUhEUgAABXgAAAPoCAYAAABkvZZOAAAgAElEQVR4Xuzdebx/1bz48dWoUaUIXeSiTCG6RZJuaaBJJZWUiKgUzUTzNZQ0atAkNM8pmlQqKUO5dA2Xm0uE5tA8/h77c3/n+H5P33M+w1777L3Wep6/frT3+qz1fK/f/ePl9DmzPf30008HPwQIECBAgAABAgQIECBAgAABAgQIECCQnMBsAm9yM7NhAgQIECBAgAABAgQIECBAgAABAgQI9AQEXheBAAECBAgQIECAAAECBAgQIECAAAECiQoIvIkOzrYJECBAgAABAgQIECBAgAABAgQIECAg8LoDBAgQIECAAAECBAgQIECAAAECBAgQSFRA4E10cLZNgAABAgQIECBAgAABAgQIECBAgAABgdcdIECAAAECBAgQIECAAAECBAgQIECAQKICAm+ig7NtAgQIECBAgAABAgQIECBAgAABAgQICLzuAAECBAgQIECAAAECBAgQIECAAAECBBIVEHgTHZxtEyBAgAABAgQIECBAgAABAgQIECBAQOB1BwgQIECAAAECBAgQIECAAAECBAgQIJCogMCb6OBsmwABAgQIECBAgAABAgQIECBAgAABAgKvO0CAAAECBAgQIECAAAECBAgQIECAAIFEBQTeRAdn2wQIECBAgAABAgQIECBAgAABAgQIEBB43QECBAgQIECAAAECBAgQIECAAAECBAgkKiDwJjo42yZAgAABAgQIECBAgAABAgQIECBAgIDA6w4QIECAAAECBAgQIECAAAECBAgQIEAgUQGBN9HB2TYBAgQIECBAgAABAgQIECBAgAABAgQEXneAAAECBAgQIECAAAECBAgQIECAAAECiQoIvIkOzrYJECBAgAABAgQIECBAgAABAgQIECAg8LoDBAgQIECAAAECBAgQIECAAAECBAgQSFRA4E10cLZNgAABAgQIECBAgAABAgQIECBAgAABgdcdIECAAAECBAgQIECAAAECBAgQIECAQKICAm+ig7NtAgQIECBAgAABAgQIECBAgAABAgQICLzuAAECBAgQIECAAAECBAgQIECAAAECBBIVEHgTHZxtEyBAgAABAgQIECBAgAABAgQIECBAQOB1BwgQIECAAAECBAgQIECAAAECBAgQIJCogMCb6OBsmwABAgQIECBAgAABAgQIECBAgAABAgKvO0CAAAECBAgQIECAAAECBAgQIECAAIFEBQTeRAdn2wQIECBAgAABAgQIECBAgAABAgQIEBB43QECBAgQIECAAAECBAgQIECAAAECBAgkKiDwJjo42yZAgAABAgQIECBAgAABAgQIECBAgIDA6w4QIECAAAECBAgQIECAAAECBAgQIEAgUQGBN9HB2TYBAgQIECBAgAABAgQIECBAgAABAgQEXneAAAECBAgQIECAAAECBAgQIECAAAECiQoIvIkOzrYJECBAgAABAgQIECBAgAABAgQIECAg8LoDBAgQIECAAAECBAgQIECAAAECBAgQSFRA4E10cLZNgAABAgQIECBAgAABAgQIECBAgAABgdcdIECAAAECBAgQIECAAAECBAgQIECAQKICAm+ig7NtAgQIECBAgAABAgQIECBAgAABAgQICLzuAAECBAgQIECAAAECBAgQIECAAAECBBIVEHgTHZxtEyBAgAABAgQIECBAgAABAgQIECBAQOB1BwgQIECAAAECBAgQIECAAAECBAgQIJCogMCb6OBsmwABAgQIECBAgAABAgQIECBAgAABAgKvO0CAAAECBAgQIECAAAECBAgQIECAAIFEBQTeRAdn2wQIECBAgAABAgQIECBAgAABAgQIEBB43QECBAgQIECAAAECBAgQIECAAAECBAgkKiDwJjo42yZAgAABAgQIECBAgAABAgQIECBAgIDA6w4QIECAAAECBAgQIECAAAECBAgQIEAgUQGBN9HB2TYBAgQIECBAgAABAgQIECBAgAABAgQEXneAAAECBAgQIECAAAECBAgQIECAAAECiQoIvIkOzrYJECBAgAABAgQIECBAgAABAgQIECAg8LoDBAgQIECAAAECBAgQIECAAAECBAgQSFRA4E10cLZNgAABAgQIECBAgAABAgQIECBAgAABgdcdIECAAAECBAgQIECAAAECBAgQIECAQKICAm+ig7NtAgQIECBAgAABAgQIECBAgAABAgQICLzuAAECBAgQIECAAAECBAgQIECAAAECBBIVEHgTHZxtEyBAgAABAgQIECBAgAABAgQIECBAQOB1BwgQIECAAAECBAgQIECAAAECBAgQIJCogMCb6OBsmwABAgQIECBAgAABAgQIECBAgAABAgKvO0CAAAECBAgQIECAAAECBAgQIECAAIFEBQTeRAdn2wQIECBAgAABAgQIECBAgAABAgQIEBB43QECBAgQIECAAAECBAgQIECAAAECBAgkKiDwJjo42yZAgAABAgQIECBAgAABAgQIECBAgIDA6w4QIECAAAECBAgQIECAAAECBAgQIEAgUQGBN9HB2TYBAgQIECBAgAABAgQIECBAgAABAgQEXneAAAECBAgQIECAAAECBAgQIECAAAECiQoIvIkOzrYJECBAgAABAgQIECBAgAABAgQIECAg8LoDBAgQIECAAAECBAgQIECAAAECBAgQSFRA4E10cLZNgAABAgQIECBAgAABAgQIECBAgAABgdcdIECAAAECBAgQIECAAAECBAgQIECAQKICAm+ig7NtAgQIECBAgAABAgQIECBAgAABAgQICLzuAAECBAgQIECAAAECBAgQIECAAAECBBIVEHgTHZxtEyBAgAABAgQIECBAgAABAgQIECBAQOB1BwgQIECAAAECBAgQIECAAAECBAgQIJCogMCb6OBsmwABAgQIECBAgAABAgQIECBAgAABAgKvO0CAAAECBAgQIECAAAECBAgQIECAAIFEBQTeRAdn2wQIECBAgAABAgQIECBAgAABAgQIEBB43QECBAgQIECAAAECBAgQIECAAAECBAgkKiDwJjo42yZAgAABAgQIECBAgAABAgQIECBAgIDA6w4QIECAAAECBAgQIECAAAECBAgQIEAgUQGBN9HB2TYBAgQIECBAgAABAgQIECBAgAABAgQEXneAAAECBAgQIECAAAECBAgQIECAAAECiQoIvIkOzrYJECBAgAABAgQIECBAgAABAgQIECAg8LoDBAgQIECAAAECBAgQIECAAAECBAgQSFRA4E10cLZNgAABAgQIECBAgAABAgQIECBAgAABgdcdIECAAAECBAgQIECAAAECBAgQIECAQKICAm+ig7NtAgQIECBAgAABAgQIECBAgAABAgQICLzuAAECBAgQIECAAAECBAgQIECAAAECBBIVEHgTHZxtEyBAgAABAgQIECBAgAABAgQIECBAQOB1BwgQIECAAAECBAgQIECAAAECBAgQIJCogMCb6OBsmwABAgQIECBAgAABAgQIECBAgAABAgKvO0CAAAECBAgQIECAAAECBAgQIECAAIFEBQTeRAdn2wQIECBAgAABAgQIECBAgAABAgQIEBB43QECBAgQIECAAAECBAgQIECAAAECBAgkKiDwJjo42yZAgAABAgQIECBAgAABAgQIECBAgIDA6w4QIECAAAECBAgQIECAAAECBAgQIEAgUQGBN9HB2TYBAgQIECBAgAABAgQIECBAgAABAgQEXneAAAECBAgQIECAAAECBAgQIECAAAECiQoIvIkOzrYJECBAgAABAgQIECBAgAABAgQIECAg8LoDBAgQIECAAAECBAgQIECAAAECBAgQSFRA4E10cLZNgAABAgQIECBAgAABAgQIECBAgAABgdcdIECAAAECBAgQIECAAAECBAgQIECAQKICAm+ig7NtAgQIECBAgAABAgQIECBAgAABAgQICLzuAAECBAgQIECAAAECBAgQIECAAAECBBIVEHgTHZxtEyBAgAABAgQIECBAgAABAgQIECBAQOB1BwgQIECAAAECBAgQIECAAAECBAgQIJCogMCb6OBsmwABAgQIECBAgAABAgQIECBAgAABAgKvO0CAAAECBAgQIECAAAECBAgQIECAAIFEBQTeRAdn2wQIECBAgAABAgQIECBAgAABAgQIEBB43QECBAgQIECAAAECBAgQIECAAAECBAgkKiDwJjo42yZAgAABAgQIECBAgAABAgQIECBAgIDA6w4QIECAAAECBAgQIECAAAECBAgQIEAgUQGBN9HB2TYBAgQIECBAgAABAgQIECBAgAABAgQEXneAAAECBAgQIECAAAECBAgQIECAAAECiQoIvIkOzrYJECBAgAABAgQIECBAgAABAgQIECAg8LoDBAgQIECAAAECBAgQIECAAAECBAgQSFRA4E10cLZNgAABAgQIECBAgAABAgQIECBAgAABgdcdIECAAAECBAgQIECAAAECBAgQIECAQKICAm+ig7NtAgQIECBAgAABAgQIECBAgAABAgQICLzuAAECAwv8+Z6HB37WgwQI5C+w8AJzh/meNUe4/4HHwkOPPpn/gZ2QAIGBBZ411+xh0Wc/Kzz6+FPhnr8/OvB7HiRAoAyBxReZJ8wx+2zhjvseCU8+9XQZh3bK7AVeuOi82Z/RAbsrIPB2dzZ2RqBzAgJv50ZiQwRaFRB4W+X34QQ6LSDwdno8NkegdQGBt/UR2EADAgJvA6iWHFhA4B2YyoMECAi87gABAjMKCLzuAwECkwkIvO4GAQJTCQi8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yY1ywVUT5Mzf7ycbrbeqXDz2NjnzwnFt/7my2L2eYdon0+XeG88qROMBw86Ru6b8Se689rTiac2Zf9dPuK94L+uoEw+Unmv9vCqVzkSre1p33IR75ZEJo4tXELz7/keyXp8DiidLR5w7tpjfPcHqfu4Dak5ePzxhVPFUb0cx6tY0KnjH3DRZThw5png6eeYPgrkaL/7zVdn90FNll+02liH79i/O3vi3h8krr78t995wliy+6II1k3/6r/+Q7QcdL302XVeGH7Zbu7WVD5Q1Injd6xyuPvfItv2VJ3O/++3Fi1dUzPxbZ+vBsvBC88v4y04Idisree3+283koD37tdV1T4e7V0R8Z8nFiqeJnSj+57/fkLE331U81X3MwTvLdluu37YewRssEhOFELwmYgw2BII3GEoKQQACEDBNgFc0mI636eEQvE0jY4MCAgheBSEZbhHBW1K4lSdIr7/g2HYfvHLHnTLqGrli3KSagte9p/bVN96RpydfIl27fv2KgcrPvSLh8BMvbHulwutvvisb9j9UNt1gdTl12D7FssrrGWZ+Atg9Vfuvl9+oOfFRB+4oA7beoOqazgSvk8ZOHleEdeUp3Yf/MEpOGX2N/PvVt9okp5PO7glX9w5d95sdwfv7M64oXnlR69e75y/ljGMHFUuc4H3vg4/kiYkX1E391smPyNATLiheaeCecp35N+WxZ2Xvoac39ARv756ryRnH7ttu/4o9dymebr5y5NcMKr/1tz2weFL4tqtOrttfvQXuHcennnetOBm9zSbrFJK68qoKt9c9Sf6fj6cXT1bP/c252sq5V3703eMYmfsbcxVPiLuP3bkfgrce8bz+HMGbV971pkXw1iPEn0MAAhCAgCOA4OUezEwAwct9sEgAwWsxVT0zIXhLysrJQScJO3sC9/wr/1B8XKvWE7xO9k375DN5YuL5s3To/ur+Qcec2+6dqu51EH+f+oo8NP6c4sNildczXHv+McU7ZN3P1XRP144+6eCqU/f47hLini6t9utM8LqPya215SAZOGCzQjofc9plxRPK7hUEN93+gBx3xhXy6G3niVvXs++Bsv/AvsXHx9xvdgTv0OMvkFvvekSG7NNflumxVKctL7TgvMWH3tzPCd7PZ8wonuCt9xt3633F08bu6V/3FPDMP/fkq3sCtpEneN3H8EYctVe7/U7wuo/H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TfQ8+aJ44dXJUbt2rew27Llz58Wb77wf6V/X07m76fxdhQCB6iWQdvb/sl3v7Bez9dZePRrUX+UHAVZr3CCu+s2J1QvIaAkQ+EEBAa/FQYBAEvjz316IE4eMjnnzF2R/l1h/3TXi3X/9b0z7ZHrUrlUzLjzruNirdQtYBAgQILAUAgLepUDzCoHlXSAFujff/qdIZ/L+8/2PombNmrH5JhvEYQfuEfu32Wl5H77xESBQgcCs2XNih7a9KmWzRpNG8citoyr1rIcIEFj+BQS8y/8cGyGBygq89e4Hcc3N98QzL74RX8z4Kho1rJddvHhMlwNis403qGw1niNAgACB7wkIeC0JAgQIECBAgAABAgQIECBAgAABAgQIlKiAgLdEJ063CRAgQIAAAQIECBAgQIAAAQIECBAgIOC1BggQIECAAAECBAgQIECAAAECBAgQIFCiAgLeEp043SZAgAABAgQIECBAgAABAgQIECBAgICA1xogQIAAAQIECBAgQIAAAQIECBAgQIBAiQoIeEt04nSbAAECBAgQIECAAAECBAgQIECAAAECAl5rgAABAgQIECBAgAABAgQIECBAgAABAiUqIOAt0YnTbQIECBAgQIAAAQIECBAgQIAAAQIECAh4rQECBAgQIECAAAECBAgQIECAAAECBAiUqICAt0QnTrcJECBAgAABAgQIECBAgAABAgQIECAg4LUGCBAgQIAAAQIECBAgQIAAAQIECBAgUKICAt4SnTjdJkCAAAECBAgQIECAAAECBAgQIECAgIDXGiBAgAABAgQIECBAgAABAgQIECBAgECJCgh4S3TidJsAAQIECBAgQIAAAQIECBAgQIAAAQICXmuAAAECBAgQIECAAAECBAgQIECAAAECJSog4C3RidNtAgQIECBAgAABAgQIECBAgAABAgQICHitAQIECBAgQIAAAQIECBAgQIAAAQIECJSogIC3RCdOtwkQIECAAAECBAgQIECAAAECBAgQICDgtQYIECBAgAABAgQIECBAgAABAgQIECBQogIC3hKdON0mQIAAAQIECBAgQIAAAQIECBAgQICAgNcaIECAAAECBAgQIECAAAECBAgQIECAQIkKCHhLdOJ0mwABAgQIECBAgAABAgQIECBAgAABAgJea4AAAQIECBAgQIAAAQIECBAgQIAAAQIlKiDgLdGJ020CBAgQIECAAAECBAgQIECAAAECBAgIeK0BAgQIECBAgAABAgQIECBAgAABAgQIlKiAgLdEJ063CRAgQIAAAQIECBAgQIAAAQIECBAgIOC1BggQIECAAAECBAgQIECAAAECBAgQIFCiAgLeEp043SZAgAABAgQIECBAgAABAgQIECBAgICA1xogQIAAAQIECBAgQIAAAQIECBAgQIBAiQoIeEt04nSbAAECBAgQIECAAAECBAgQIECAAAECAl5rgAABAgQIECBAgAABAgQIECBAgAABAiUqIOAt0YnTbQIECBAgQIAAAQIECBAgQIAAAQIECAh4rQECBAgQIECAAAECBAgQIECAAAECBAiUqICAt0QnTrcJECBAgAABAgQIECBAgAABAgQIECAg4LUGCBAgQIAAAQIECBAgQIAAAQIECBAgUKICAt4SnTjdJkCAAAECBAgQIECAAAECBAgQIECAgIDXGiBAgAABAgQIECBQggIfffJ5tOl0YtbzC888LvZr07JSo5j60aex9+EDs2dHnt0n9tlth0q95yECBAgQIECAAIFlU0DAu2zOi14RIECAAAECBAhUkUCLfXvG7Dlzf7T22rVqRoP6q8SmG60frVtuEx3a7hIN6tWtoh4tXbUC3qVz8xYBAgQIECBAYHkTEPAubzNqPAQIECBAgAABAj8qUJmA9/sVNFm1Ybbb9RfbbLrM6C5twDtr9jfxlydezMax/TabxFqrr7rMjElHCBAgQIAAAQIEllxAwLvkZt4gQIAAAQIECBAoYYGygHePnZvHkJOOrHAkM2Z+Fekog7snPREP/uXp+Pe/v426dVaOe24ctswEoksb8Jbw1Ok6AQIECBAgQIBABQICXsuCAAECBAgQIECgWgmUBbz77r5jXDyk938d+/1/fioGDh2TPXfEwXvFoOO7/Nd3inhAwFuEsjYIECBAgAABAsu+gIB32Z8jPSRAgAABAgQIEMhRYEkD3tR02y6nxntTp0WzjdaP2397brZHu/wAABTgSURBVLnepLB1/G0PxZPP/SN7bvacb7Idvz/fYO1o86vto0vHvaJunZXKvXfmBePi9vsei9Y7bRtjRgyIt6dMjWt/f288//Jb8fGn06POyivFFs2aRvfD2savdtx6sfcrE/AOuei6uPWPj0atmjVj9LD+sUvLbbKdyT90ydq+nU+J9//34xjY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ECBAgAABAgQILCYg4LUgCBAgQIAAAQIECBAoRGDGzK+jVfs+WVvnnXp0HNR2l0La1QgBAgQIECBAYHkWEPAuz7NrbAQIECBAgAABAgQKFvhs+sxo3LB+rLBCjXItP/vSm9mO4lTGXXJqtGy+ecG90xwBAgQIECBAYPkTEPAuf3NqRAQIECBAgAABAgQKF3jmxTei3xmXRTr798rhA2LXX25brg+Dh4+Nux78W9RZecV47I7Ls8vpFAIECBAgQIAAgZ8mIOD9aX7eJkCAAAECBAgQIEAgIrtUbq/DB8Ynn30RTVZtGMMHHxOtWmyV2Xw9a07cdOukuHzc7dnX3Q9vm11ApxAgQIAAAQIECPx0AQHvTzdUAwECBAgQIECAAAECEfHaW/+MI08YkQW6qaSduqvUrROffj5joc/OO2wVo8/vHyuuWJsZAQIECBAgQIBADgIC3hwQVUGAAAECBAgQIECAwHcCH077LG645cF44plXY+pHn8a8+fOjYf1VYotNm8b+e+4U+7f5ZdSsuQIuAgQIECBAgACBnAQEvDlBqoYAAQIECBAgQIAAAQIECBAgQIAAAQJFCwh4ixbXHgECBAgQIECAAAECBAgQIECAAAECBHISEPDmBKkaAgQIECBAgAABAgQIECBAgAABAgQIFC0g4C1aXHsECBAgQIAAAQIECBAgQIAAAQIECBDISUDAmxOkaggQIECAAAECBAgQIECAAAECBAgQIFC0gIC3aHHtESBAgAABAgQIECBAgAABAgQIECBAICcBAW9OkKohQIAAAQIECBAgQIAAAQIECBAgQIBA0QIC3qLFtUeAAAECBAgQIECAAAECBAgQIECAAIGcBAS8OUGqhgABAgQIECBAgAABAgQIECBAgAABAkULCHiLFtceAQIECBAgQIAAAQIECBAgQIAAAQIEchIQ8OYEqRoCBAgQIECAAAECBAgQIECAAAECBAgULSDgLVpcewQIECBAgAABAgQIECBAgAABAgQIEMhJQMCbE6RqCBAgQIAAAQIECBAgQIAAAQIECBAgULSAgLdoce0RIECAAAECBAgQIECAAAECBAgQIEAgJwEBb06QqiFAgAABAgQIECBAgAABAgQIECBAgEDRAgLeosW1R4AAAQIECBAgQIAAAQIECBAgQIAAgZwEBLw5QaqGAAECBAgQIECAAAECBAgQIECAAAECRQsIeIsW1x4BAgQIECBAgAABAgQIECBAgAABAgRyEhDw5gSpGgIECBAgQIAAAQIECBAgQIAAAQIECBQtIOAtWlx7BAgQIECAAAECBAgQIECAAAECBAgQyElAwJsTpGoIECBAgAABAgQIECBAgAABAgQIECBQtICAt2hx7REgQIAAAQIECBAgQIAAAQIECBAgQCAnAQFvTpCqIUCAAAECBAgQIECAAAECBAgQIECAQNECAt6ixbVHgAABAgQIECBAgAABAgQIECBAgACBnAQEvDlBqoYAAQIECBAgQIAAAQIECBAgQIAAAQJFCwh4ixbXHgECBAgQIECAAAECBAgQIECAAAECBHISEPDmBKkaAgQIECBAgAABAgQIECBAgAABAgQIFC0g4C1aXHsECBAgQIAAAQIECBAgQIAAAQIECBDISUDAmxOkaggQIECAAAECBAgQIECAAAECBAgQIFC0gIC3aHHtESBAgAABAgQIECBAgAABAgQIECBAICcBAW9OkKohQIAAAQIECBAgQIAAAQIECBAgQIBA0QIC3qLFtUeAAAECBAgQIECAAAECBAgQIECAAIGcBAS8OUGqhgABAgQIECBAgAABAgQIECBAgAABAkULCHiLFtceAQIECBAgQIAAAQIECBAgQIAAAQIEchIQ8OYEqRoCBAgQIECAAAECBAgQIECAAAECBAgULSDgLVpcewQIECBAgAABAgQIECBAgAABAgQIEMhJQMCbE6RqCBAgQIAAAQIECBAgQIAAAQIECBAgULSAgLdoce0RIECAAAECBAgQIECAAAECBAgQIEAgJwEBb06QqiFAgAABAgQIECBAgAABAgQIECBAgEDRAgLeosW1R4AAAQIECBAgQIAAAQIECBAgQIAAgZwEBLw5QaqGAAECBAgQIECAAAECBAgQIECAAAECRQsIeIsW1x4BAgQIECBAgAABAgQIECBAgAABAgRyEhDw5gSpGgIECBAgQIAAAQIECBAgQIAAAQIECBQtIOAtWlx7BAgQIECAAAECBAgQIECAAAECBAgQyElAwJsTpGoIECBAgAABAgQIECBAgAABAgQIECBQtICAt2hx7REgQIAAAQIECBAgQIAAAQIECBAgQCAnAQFvTpCqIUCAAAECBAgQIECAAAECBAgQIECAQNECAt6ixbVHgAABAgQIECBAgAABAgQIECBAgACBnAQEvDlBqoYAAQIECBAgQIAAAQIECBAgQIAAAQJFCwh4ixbXHgECBAgQIECAAAECBAgQIECAAAECBHISEPDmBKkaAgQIECBAgAABAgQIECBAgAABAgQIFC0g4C1aXHsECBAgQIAAAQIECBAgQIAAAQIECBDISUDAmxOkaggQIECAAAECBAgQIECAAAECBAgQIFC0gIC3aHHtESBAgAABAgQIECBAgAABAgQIECBAICcBAW9OkKohQIAAAQIECBAgQIAAAQIECBAgQIBA0QIC3qLFtUeAAAECBAgQIECAAAECBAgQIECAAIGcBAS8OUGqhgABAgQIECBAgAABAgQIECBAgAABAkULCHiLFtceAQIECBAgQIAAAQIECBAgQIAAAQIEchIQ8OYEqRoCBAgQIECAAAECBAgQIECAAAECBAgULSDgLVpcewQIECBAgAABAgQIECBAgAABAgQIEMhJQMCbE6RqCBAgQIAAAQIECBAgQIAAAQIECBAgULSAgLdoce0RIECAAAECBAgQIECAAAECBAgQIEAgJwEBb06QqiFAgAABAgQIECBAgAABAgQIECBAgEDRAgLeosW1R4AAAQIECBAgQIAAAQIECBAgQIAAgZwEBLw5QaqGAAECBAgQIECAAAECBAgQIECAAAECRQsIeIsW1x4BAgQIECBAgAABAgQIECBAgAABAgRyEhDw5gSpGgIECBAgQIAAAQIECBAgQIAAAQIECBQtIOAtWlx7BAgQIECAAAECBAgQIECAAAECBAgQyElAwJsTpGoIECBAgAABAgQIECBAgAABAgQIECBQtICAt2hx7REgQIAAAQIECBAgQIAAAQIECBAgQCAnAQFvTpCqIUCAAAECBAgQIECAAAECBAgQIECAQNECAt6ixbVHgAABAgQIECBAgAABAgQIECBAgACBnAT+Dy7fm8uvWf0YAAAAAElFTkSuQmCC"
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "from wefe.utils import plot_ranking\n",
+ "\n",
+ "fig = plot_ranking(gender_ranking)\n",
+ "fig.show()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 29,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "image/png": "iVBORw0KGgoAAAANSUhEUgAABXgAAAPoCAYAAABkvZZOAAAgAElEQVR4Xuzdeby95bz4/6tZsxShYzqHMpyMHYnQaaQUSpMGESoNGiTSpCgNpNI8CKXSJEWTJBXJIXRkOjlORIMSkuZ+j3v57f39DHuvde97X3uta3iuv77H577vdV3P9/X4/vGy3HueJ5544ongQ4AAAQIECBAgQIAAAQIECBAgQIAAAQLZCcwj8GY3MwsmQIAAAQIECBAgQIAAAQIECBAgQIBAT0DgdRAIECBAgAABAgQIECBAgAABAgQIECCQqYDAm+ngLJsAAQIECBAgQIAAAQIECBAgQIAAAQICrzNAgAABAgQIECBAgAABAgQIECBAgACBTAUE3kwHZ9kECBAgQIAAAQIECBAgQIAAAQIECBAQeJ0BAgQIECBAgAABAgQIECBAgAABAgQIZCog8GY6OMsmQIAAAQIECBAgQIAAAQIECBAgQICAwOsMECBAgAABAgQIECBAgAABAgQIECBAIFMBgTfTwVk2AQIECBAgQIAAAQIECBAgQIAAAQIEBF5ngAABAgQIECBAgAABAgQIECBAgAABApkKCLyZDs6yCRAgQIAAAQIECBAgQIAAAQIECBAgIPA6AwQIECBAgAABAgQIECBAgAABAgQIEMhUQODNdHCWTYAAAQIECBAgQIAAAQIECBAgQIAAAYHXGSBAgAABAgQIECBAgAABAgQIECBAgECmAgJvpoOzbAIECBAgQIAAAQIECBAgQIAAAQIECAi8zgABAgQIECBAgAABAgQIECBAgAABAgQyFRB4Mx2cZRMgQIAAAQIECBAgQIAAAQIECBAgQEDgdQYIECBAgAABAgQIECBAgAABAgQIECCQqYDAm+ngLJsAAQIECBAgQIAAAQIECBAgQIAAAQICrzNAgAABAgQIECBAgAABAgQIECBAgACBTAUE3kwHZ9kECBAgQIAAAQIECBAgQIAAAQIECBAQeJ0BAgQIECBAgAABAgQIECBAgAABAgQIZCog8GY6OMsmQIAAAQIECBAgQIAAAQIECBAgQICAwOsMECBAgAABAgQIECBAgAABAgQIECBAIFMBgTfTwVk2AQIECBAgQIAAAQIECBAgQIAAAQIEBF5ngAABAgQIECBAgAABAgQIECBAgAABApkKCLyZDs6yCRAgQIAAAQIECBAgQIAAAQIECBAgIPA6AwQIECBAgAABAgQIECBAgAABAgQIEMhUQODNdHCWTYAAAQIECBAgQIAAAQIECBAgQIAAAYHXGSBAgAABAgQIECBAgAABAgQIECBAgECmAgJvpoOzbAIECBAgQIAAAQIECBAgQIAAAQIECAi8zgABAgQIECBAgAABAgQIECBAgAABAgQyFRB4Mx2cZRMgQIAAAQIECBAgQIAAAQIECBAgQEDgdQYIECBAgAABAgQIECBAgAABAgQIECCQqYDAm+ngLJsAAQIECBAgQIAAAQIECBAgQIAAAQICrzNAgAABAgQIECBAgAABAgQIECBAgACBTAUE3kwHZ9kECBAgQIAAAQIECBAgQIAAAQIECBAQeJ0BAgQIECBAgAABAgQIECBAgAABAgQIZCog8GY6OMsmQIAAAQIECBAgQIAAAQIECBAgQICAwOsMECBAgAABAgQIECBAgAABAgQIECBAIFMBgTfTwVk2AQIECBAgQIAAAQIECBAgQIAAAQIEBF5ngAABAgQIECBAgAABAgQIECBAgAABApkKCLyZDs6yCRAgQIAAAQIECBAgQIAAAQIECBAgIPA6AwQIECBAgAABAgQIECBAgAABAgQIEMhUQODNdHCWTYAAAQIECBAgQIAAAQIECBAgQIAAAYHXGSBAgAABAgQIECBAgAABAgQIECBAgECmAgJvpoOzbAIECBAgQIAAAQIECBAgQIAAAQIECAi8zgABAgQIECBAgAABAgQIECBAgAABAgQyFRB4Mx2cZRMgQIAAAQIECBAgQIAAAQIECBAgQEDgdQYIECBAgAABAgQIECBAgAABAgQIECCQqYDAm+ngLJsAAQIECBAgQIAAAQIECBAgQIAAAQICrzNAgAABAgQIECBAgAABAgQIECBAgACBTAUE3kwHZ9kECBAgQIAAAQIECBAgQIAAAQIECBAQeJ0BAgQIECBAgAABAgQIECBAgAABAgQIZCog8GY6OMsmQIAAAQIECBAgQIAAAQIECBAgQICAwOsMECBAgAABAgQIECBAgAABAgQIECBAIFMBgTfTwVk2AQIECBAgQIAAAQIECBAgQIAAAQIEBF5ngAABAgQIECBAgAABAgQIECBAgAABApkKCLyZDs6yCRAgQIAAAQIECBAgQIAAAQIECBAgIPA6AwQIECBAgAABAgQIECBAgAABAgQIEMhUQODNdHCWTYAAAQIECBAgQIAAAQIECBAgQIAAAYHXGSBAgAABAgQIECBAgAABAgQIECBAgECmAgJvpoOzbAIECBAgQIAAAQIECBAgQIAAAQIECAi8zgABAgQIECBAgAABAgQIECBAgAABAgQyFRB4Mx2cZRMgQIAAAQIECBAgQIAAAQIECBAgQEDgdQYIECBAgAABAgQIECBAgAABAgQIECCQqYDAm+ngLJsAAQIECBAgQIAAAQIECBAgQIAAAQICrzNAgAABAgQIECBAgAABAgQIECBAgACBTAUE3kwHZ9kECBAgQIAAAQIECBAgQIAAAQIECBAQeJ0BAgQIECBAgAABAgQIECBAgAABAgQIZCog8GY6OMsmQIAAAQIECBAgQIAAAQIECBAgQICAwOsMECBAgAABAgQIECBAgAABAgQIECBAIFMBgTfTwVk2AQIECBAgQIAAAQIECBAgQIAAAQIEBF5ngAABAgQIECBAgAABAgQIECBAgAABApkKCLyZDs6yCRAgQIAAAQIECBAgQIAAAQIECBAgIPA6AwQIECBAgAABAgQIECBAgAABAgQIEMhUQODNdHCWTYAAAQIECBAgQIAAAQIECBAgQIAAAYHXGSBAgAABAgQIECBAgAABAgQIECBAgECmAgJvpoOzbAIECBAgQIAAAQIECBAgQIAAAQIECAi8zgABAgQIECBAgAABAgQIECBAgAABAgQyFRB4Mx2cZRMgQIAAAQIECBAgQIAAAQIECBAgQEDgdQYIECBAgAABAgQIECBAgAABAgQIECCQqYDAm+ngLJsAAQIECBAgQIAAAQIECBAgQIAAAQICrzNAgAABAgQIECBAgAABAgQIECBAgACBTAUE3kwHZ9kECBAgQIAAAQIECBAgQIAAAQIECBAQeJ0BAgQIECBAgAABAgQIECBAgAABAgQIZCog8GY6OMsmQIAAAQIECBAgQIAAAQIECBAgQICAwOsMECBAgAABAgQIECBAgAABAgQIECBAIFMBgTfTwVk2AQIECBAgQIAAAQIECBAgQIAAAQIEBF5ngAABAgQIECBAgAABAgQIECBAgAABApkKCLyZDs6yCRAgQIAAAQIECBAgQIAAAQIECBAgIPA6AwQIECBAgAABAgQIECBAgAABAgQIEMhUQODNdHCWTYAAAQIECBAgQIAAAQIECBAg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QOD/BQS8lgIBAssJzF/wTfQ+5aJ44dXpUbt2rfQ27EWLFseb73wQyb+uJ+fuJufvKgQIVC+BZGf/rzv0TX8x23C9taJB/dV/FGDNxg3iqt+dVL2AjJYAgR8VEPBaHAQIJAJ/+fsLcdKwcbF4ydL07xIbbbB2vPvev2PWp7Ojdq2iuPDs46Nt6xawCBAgQGAlBAS8K4HmFQJVXSAJdG+Z+udIzuT91wcfR1FRUWy1+cZx+EF7xwFtdq3qwzc+AgTKEJi/YGHs3L5PuWzWbtIoHrltbLme9RABAlVfQMBb9efYCAmUV+Ctdz+Ma265J5558Y34cs68aNSwXnrx4rHdDowtN9u4vNV4jgABAgR+ICDgtSQIECBAgAABAgQIECBAgAABAgQIECBQoAIC3gKdON0mQIAAAQIECBAgQIAAAQIECBAgQICAgNcaIECAAAECBAgQIECAAAECBAgQIECAQIEKCHgLdOJ0mwABAgQIECBAgAABAgQIECBAgAABAgJea4AAAQIECBAgQIAAAQIECBAgQIAAAQIFKiDgLdCJ020CBAgQIECAAAECBAgQIECAAAECBAgIeK0BAgQIECBAgAABAgQIECBAgAABAgQIFKiAgLdAJ063CRAgQIAAAQIECBAgQIAAAQIECBAgIOC1BggQIECAAAECBAgQIECAAAECBAgQIFCgAgLeAp043SZAgAABAgQIECBAgAABAgQIECBAgICA1xogQIAAAQIECBAgQIAAAQIECBAgQIBAgQoIeAt04nSbAAECBAgQIECAAAECBAgQIECAAAECAl5rgAABAgQIECBAgAABAgQIECBAgAABAgUqIOAt0InTbQIECBAgQIAAAQIECBAgQIAAAQIECAh4rQECBAgQIECAAAECBAgQIECAAAECBAgUqICAt0AnTrcJECBAgAABAgQIECBAgAABAgQIECAg4LUGCBAgQIAAAQIECBAgQIAAAQIECBAgUKACAt4CnTjdJkCAAAECBAgQIECAAAECBAgQIECAgIDXGiBAgAABAgQIECBAgAABAgQIECBAgECBCgh4C3TidJsAAQIECBAgQIAAAQIECBAgQIAAAQICXmuAAAECBAgQIECAAAECBAgQIECAAAECBSog4C3QidNtAgQIECBAgAABAgQIECBAgAABAgQICHitAQIECBAgQIAAAQIECBAgQIAAAQIECBSogIC3QCdOtwkQIECAAAECBAgQIECAAAECBAgQICDgtQYIECBAgAABAgQIECBAgAABAgQIECBQoAIC3gKdON0mQIAAAQIECBAgQIAAAQIECBAgQICAgNcaIECAAAECBAgQIECAAAECBAgQIECAQIEKCHgLdOJ0mwABAgQIECBAgAABAgQIECBAgAABAgJea4AAAQIECBAgQIAAAQIECBAgQIAAAQIFKiDgLdCJ020CBAgQIECAAAECBAgQIECAAAECBAgIeK0BAgQIECBAgAABAgQIECBAgAABAgQIFKiAgLdAJ063CRAgQIAAAQIECBAgQIAAAQIECBAgIOC1BggQIECAAAECBAgQIECAAAECBAgQIFCgAgLeAp043SZAgAABAgQIECBAgAABAgQIECBAgICA1xogQIAAAQIECBAgQIAAAQIECBAgQIBAgQoIeAt04nSbAAECBAgQIECAAAECBAgQIECAAAECAl5rgAABAgQIECBAgEABCnz86RfRpstJac8vPOv42L9Ny3KNYubHn0W7Iwanz44Z3i/23XPncr3nIQIECBAgQIAAgcopIOCtnPOiVwQIECBAgAABAhUk0GK/3rFg4aKfrL12raJoUH/12GLTjaJ1y+2jU/vdo0G9uhXUo5WrVsC7cm7eIkCAAAECBAhUNQEBb1WbUeMhQIAAAQIECBD4SYHyBLw/rKDJGg3T3a6/2n6LSqO7sgHv/AXfxF+feDEdx07bbx7rrrVGpRmTjhAgQIAAAQIECKy4gIB3xc28QYAAAQIECBAgUMACxQHv3rs1j2EnH1XmSObMnRfJUQZ3T3siHvzr0/Htt99F3TqrxT03jaw0gejKBrwFPHW6ToAAAQIECBAgUIaAgNeyIECAAAECBAgQqFYCxQHvfnvtEhcP6/s/x37/X56KwSPGp88deUjbGHJCt//5Th4PCHjzUNYGAQIECBAgQKDyCwh4K/8c6SEBAgQIECBAgECGAisa8CZNt+92WmO25XcAABTvSURBVLw/c1Y023SjmHrduaV6k4Stk25/KJ587p/pcwsWfpPu+P3lxutFm9/sFN06t426dVYt9d5ZF0yMqfc9Fq133SHGjx4Ub8+YGdf+4d54/uW34pPPZked1VaNrZs1jZ6Ht4/f7LLdcu+XJ+AddtH1cdufHo1aRUUxbuTA2L3l9unO5B+7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n2PSR4ec0C2OPKTtik+gNwgQIECAAAECBJYTEPBaEAQIECBAgAABAgQI5CIwZ+7X0apjv7St8047Jg5uv3su7WqEAAECBAgQIFCVBQS8VXl2jY0AAQIECBAgQIBAzgKfz54bjRvWj5o1a5Rq+dmX3kx3FCdl4iWnRcvmW+XcO80RIECAAAECBKqegIC36s2pEREgQIAAAQIECBDIXeCZF9+IAWdeFsnZv1eOGhR7/HqHUn0YOmpC3PXg36POaqvEY3dcnl5OpxAgQIAAAQIECPw8AQHvz/PzNgECBAgQIECAAAECEemlcm2PGByffv5lNFmjYYwaemy0arFtavP1/IVx823T4vKJU9Ovex7RPr2ATiFAgAABAgQIEPj5AgLen2+oBgIECBAgQIAAAQIEIuK1t/4VR504Og10k5Ls1F29bp347Is5JT677bxtjDt/YKyySm1mBAgQIECAAAECGQgIeDNAVAUBAgQIECBAgAABAt8LfDTr87jx1gfjiWdejZkffxaLlyyJhvVXj623aBoH7LNrHNDm11FUVBMXAQIECBAgQIBARgIC3owgVUOAAAECBAgQIECAAAECBAgQIECAAIG8BQS8eYtrjwABAgQIECBAgAABAgQIECBAgAABAhkJCHgzglQNAQIECBAgQIAAAQIECBAgQIAAAQIE8hYQ8OYtrj0CBAgQIECAAAECBAgQIECAAAECBAhkJCDgzQhSNQQIECBAgAABAgQIECBAgAABAgQIEMhbQMCbt7j2CBAgQIAAAQIECBAgQIAAAQIECBAgkJGAgDcjSNUQIECAAAECBAgQIECAAAECBAgQIEAgbwEBb97i2iNAgAABAgQIECBAgAABAgQIECBAgEBGAgLejCBVQ4AAAQIECBAgQIAAAQIECBAgQIAAgbwFBLx5i2uPAAECBAgQIECAAAECBAgQIECAAAECGQkIeDOCVA0BAgQIECBAgAABAgQIECBAgAABAgTyFhDw5i2uPQIECBAgQIAAAQIECBAgQIAAAQIECGQkIODNCFI1BAgQIECAAAECBAgQIECAAAECBAgQyFtAwJu3uPYIECBAgAABAgQIECBAgAABAgQIECCQkYCANyNI1RAgQIAAAQIECBAgQIAAAQIECBAgQCBvAQFv3uLaI0CAAAECBAgQIECAAAECBAgQIECAQEYCAt6MIFVDgAABAgQIECBAgAABAgQIECBAgACBvAUEvHmLa48AAQIECBAgQIAAAQIECBAgQIAAAQIZCQh4M4JUDQECBAgQIECAAAECBAgQIECAAAECBPIWEPDmLa49AgQIECBAgAABAgQIECBAgAABAgQIZCQg4M0IUjUECBAgQIAAAQIECBAgQIAAAQIECBDIW0DAm7e49ggQIECAAAECBAgQIECAAAECBAgQIJCRgIA3I0jVECBAgAABAgQIECBAgAABAgQIECBAIG8BAW/e4tojQIAAAQIECBAgQIAAAQIECBAgQIBARgIC3owgVUOAAAECBAgQIECAAAECBAgQIECAAIG8BQS8eYtrjwABAgQIECBAgAABAgQIECBAgAABAhkJCHgzglQNAQIECBAgQIAAAQIECBAgQIAAAQIE8hYQ8OYtrj0CBAgQIECAAAECBAgQIECAAAECBAhkJCDgzQhSNQQIECBAgAABAgQIECBAgAABAgQIEMhbQMCbt7j2CBAgQIAAAQIECBAgQIAAAQIECBAgkJGAgDcjSNUQIECAAAECBAgQIECAAAECBAgQIEAgbwEBb97i2iNAgAABAgQIECBAgAABAgQIECBAgEBGAgLejCBVQ4AAAQIECBAgQIAAAQIECBAgQIAAgbwFBLx5i2uPAAECBAgQIECAAAECBAgQIECAAAECGQkIeDOCVA0BAgQIECBAgAABAgQIECBAgAABAgTyFhDw5i2uPQIECBAgQIAAAQIECBAgQIAAAQIECGQkIODNCFI1BAgQIECAAAECBAgQIECAAAECBAgQyFtAwJu3uPYIECBAgAABAgQIECBAgAABAgQIECCQkYCANyNI1RAgQIAAAQIECBAgQIAAAQIECBAgQCBvAQFv3uLaI0CAAAECBAgQIECAAAECBAgQIECAQEYCAt6MIFVDgAABAgQIECBAgAABAgQIECBAgACBvAUEvHmLa48AAQIECBAgQIAAAQIECBAgQIAAAQIZCQh4M4JUDQECBAgQIECAAAECBAgQIECAAAECBPIWEPDmLa49AgQIECBAgAABAgQIECBAgAABAgQIZCQg4M0IUjUECBAgQIAAAQIECBAgQIAAAQIECBDIW0DAm7e49ggQIECAAAECBAgQIECAAAECBAgQIJCRgIA3I0jVECBAgAABAgQIECBAgAABAgQIECBAIG8BAW/e4tojQIAAAQIECBAgQIAAAQIECBAgQIBARgIC3owgVUOAAAECBAgQIECAAAECBAgQIECAAIG8BQS8eYtrjwABAgQIECBAgAABAgQIECBAgAABAhkJCHgzglQNAQIECBAgQIAAAQIECBAgQIAAAQIE8hYQ8OYtrj0CBAgQIECAAAECBAgQIECAAAECBAhkJCDgzQhSNQQIECBAgAABAgQIECBAgAABAgQIEMhbQMCbt7j2CBAgQIAAAQIECBAgQIAAAQIECBAgkJGAgDcjSNUQIECAAAECBAgQIECAAAECBAgQIEAgbwEBb97i2iNAgAABAgQIECBAgAABAgQIECBAgEBGAgLejCBVQ4AAAQIECBAgQIAAAQIECBAgQIAAgbwFBLx5i2uPAAECBAgQIECAAAECBAgQIECAAAECGQkIeDOCVA0BAgQIECBAgAABAgQIECBAgAABAgTyFhDw5i2uPQIECBAgQIAAAQIECBAgQIAAAQIECGQkIODNCFI1BAgQIECAAAECBAgQIECAAAECBAgQyFtAwJu3uPYIECBAgAABAgQIECBAgAABAgQIECCQkYCANyNI1RAgQIAAAQIECBAgQIAAAQIECBAgQCBvAQFv3uLaI0CAAAECBAgQIECAAAECBAgQIECAQEYCAt6MIFVDgAABAgQIECBAgAABAgQIECBAgACBvAUEvHmLa48AAQIECBAgQIAAAQIECBAgQIAAAQIZCQh4M4JUDQECBAgQIECAAAECBAgQIECAAAECBPIWEPDmLa49AgQIECBAgAABAgQIECBAgAABAgQIZCQg4M0IUjUECBAgQIAAAQIECBAgQIAAAQIECBDIW0DAm7e49ggQIECAAAECBAgQIECAAAECBAgQIJCRgIA3I0jVECBAgAABAgQIECBAgAABAgQIECBAIG8BAW/e4tojQIAAAQIECBAgQIAAAQIECBAgQIBARgL/AVP7m8vH4dKEAAAAAElFTkSuQmCC"
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "fig = plot_ranking(ethnicity_ranking)\n",
+ "fig.show()"
+ ]
+ },
+ {
+ "cell_type": "raw",
+ "metadata": {},
+ "source": [
+ "Correlating Rankings\n",
+ "~~~~~~~~~~~~~~~~~~~~\n",
+ "\n",
+ "Having obtained rankings by metric for each embeddings, it would be\n",
+ "ideal to see and analyze the degree of agreement between them.\n",
+ "\n",
+ "A high concordance between the rankings allows us to state with some certainty that \n",
+ "all metrics evaluated the embedding models in a similar way and therefore, \n",
+ "that the ordering of embeddings by bias calculated makes sense.\n",
+ "On the other hand, a low degree of agreement shows the opposite: the rankings do not \n",
+ "allow to clearly establish which embedding is less biased than another.\n",
+ "\n",
+ "The level of concordance of the rankings can be evaluated by calculating\n",
+ "correlations.WEFE provides :class:`~wefe.utils.calculate_ranking_correlations` to\n",
+ "calculate the correlations between rankings."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 30,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "
\n",
+ "\n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
\n",
+ "
WEAT: Gender Queries average of abs values score (1)
\n",
+ "
WEAT: Gender Queries average of abs values score (2)
\n",
+ "
RNSB: Gender Queries average of abs values score
\n",
+ "
\n",
+ " \n",
+ " \n",
+ "
\n",
+ "
WEAT: Gender Queries average of abs values score (1)
\n",
+ "
1.0
\n",
+ "
0.5
\n",
+ "
-1.0
\n",
+ "
\n",
+ "
\n",
+ "
WEAT: Gender Queries average of abs values score (2)
\n",
+ "
0.5
\n",
+ "
1.0
\n",
+ "
-0.5
\n",
+ "
\n",
+ "
\n",
+ "
RNSB: Gender Queries average of abs values score
\n",
+ "
-1.0
\n",
+ "
-0.5
\n",
+ "
1.0
\n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ " WEAT: Gender Queries average of abs values score (1) \\\n",
+ "WEAT: Gender Queries average of abs values scor... 1.0 \n",
+ "WEAT: Gender Queries average of abs values scor... 0.5 \n",
+ "RNSB: Gender Queries average of abs values score -1.0 \n",
+ "\n",
+ " WEAT: Gender Queries average of abs values score (2) \\\n",
+ "WEAT: Gender Queries average of abs values scor... 0.5 \n",
+ "WEAT: Gender Queries average of abs values scor... 1.0 \n",
+ "RNSB: Gender Queries average of abs values score -0.5 \n",
+ "\n",
+ " RNSB: Gender Queries average of abs values score \n",
+ "WEAT: Gender Queries average of abs values scor... -1.0 \n",
+ "WEAT: Gender Queries average of abs values scor... -0.5 \n",
+ "RNSB: Gender Queries average of abs values score 1.0 "
+ ]
+ },
+ "execution_count": 30,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "from wefe.utils import calculate_ranking_correlations, plot_ranking_correlations\n",
+ "\n",
+ "correlations = calculate_ranking_correlations(gender_ranking)\n",
+ "correlations\n"
+ ]
+ },
+ {
+ "cell_type": "raw",
+ "metadata": {},
+ "source": [
+ ".. note::\n",
+ "\n",
+ " ``calculate_ranking_correlations`` uses the ``corr()`` ``pandas``\n",
+ " dataframe method. The type of correlation that is calculated can be changed \n",
+ " through the method parameter. The available options are:\n",
+ " ``'pearson'``, ``'spearman'``, ``'kendall'``. By default, the spearman\n",
+ " correlation is calculated.\n",
+ "\n",
+ "In this example, Kendall’s correlation is used."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 31,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "
\n",
+ "\n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
\n",
+ "
WEAT: Gender Queries average of abs values score (1)
\n",
+ "
WEAT: Gender Queries average of abs values score (2)
\n",
+ "
RNSB: Gender Queries average of abs values score
\n",
+ "
\n",
+ " \n",
+ " \n",
+ "
\n",
+ "
WEAT: Gender Queries average of abs values score (1)
\n",
+ "
1.000000
\n",
+ "
0.333333
\n",
+ "
-1.000000
\n",
+ "
\n",
+ "
\n",
+ "
WEAT: Gender Queries average of abs values score (2)
\n",
+ "
0.333333
\n",
+ "
1.000000
\n",
+ "
-0.333333
\n",
+ "
\n",
+ "
\n",
+ "
RNSB: Gender Queries average of abs values score
\n",
+ "
-1.000000
\n",
+ "
-0.333333
\n",
+ "
1.000000
\n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ " WEAT: Gender Queries average of abs values score (1) \\\n",
+ "WEAT: Gender Queries average of abs values scor... 1.000000 \n",
+ "WEAT: Gender Queries average of abs values scor... 0.333333 \n",
+ "RNSB: Gender Queries average of abs values score -1.000000 \n",
+ "\n",
+ " WEAT: Gender Queries average of abs values score (2) \\\n",
+ "WEAT: Gender Queries average of abs values scor... 0.333333 \n",
+ "WEAT: Gender Queries average of abs values scor... 1.000000 \n",
+ "RNSB: Gender Queries average of abs values score -0.333333 \n",
+ "\n",
+ " RNSB: Gender Queries average of abs values score \n",
+ "WEAT: Gender Queries average of abs values scor... -1.000000 \n",
+ "WEAT: Gender Queries average of abs values scor... -0.333333 \n",
+ "RNSB: Gender Queries average of abs values score 1.000000 "
+ ]
+ },
+ "execution_count": 31,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "calculate_ranking_correlations(gender_ranking, method=\"kendall\")\n"
+ ]
+ },
+ {
+ "cell_type": "raw",
+ "metadata": {},
+ "source": [
+ "WEFE also provides a function for graphing the correlations:\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 32,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "image/png": "iVBORw0KGgoAAAANSUhEUgAABXgAAAPoCAYAAABkvZZOAAAgAElEQVR4XuzdCfx99Zw/8I/1T/1thbIVYhRGMYasQ9LYxjbDYBpri4iyFBWDUJEsTbaUZZJtLINJlhYS2VOMrGEKWZJUGDL9H6/rf35u39/9fu/93u8599zP7z7P4+GB3/ec8/nc5/tzzvfxfZ3P/ZwrXHbZZZcVGwECBAgQIECAAAECBAgQIECAAAECBAhUJ3AFAW91NdNhAgQIECBAgAABAgQIECBAgAABAgQIDAQEvAYCAQIECBAgQIAAAQIECBAgQIAAAQIEKhUQ8FZaON0mQIAAAQIECBAgQIAAAQIECBAgQICAgNcYIECAAAECBAgQIECAAAECBAgQIECAQKUCAt5KC6fbBAgQIECAAAECBAgQIECAAAECBAgQEPAaAwQIECBAgAABAgQIECBAgAABAgQIEKhUQMBbaeF0mwABAgQIECBAgAABAgQIECBAgAABAgJeY4AAAQIECBAgQIAAAQIECBAgQIAAAQKVCgh4Ky2cbhMgQIAAAQIECBAgQIAAAQIECBAgQEDAawwQIECAAAECBAgQIECAAAECBAgQIECgUgEBb6WF020CBAgQIECAAAECBAgQIECAAAECBAgIeI0BAgQIECBAgAABAgQIECBAgAABAgQIVCog4K20cLpNgAABAgQIECBAgAABAgQIECBAgAABAa8xQIAAAQIECBAgQIAAAQIECBAgQIAAgUoFBLyVFk63CRAgQIAAAQIECBAgQIAAAQIECBAgIOA1BggQIECAAAECBAgQIECAAAECBAgQIFCpgIC30sLpNgECBAgQIECAAAECBAgQIECAAAECBAS8xgABAgQIECBAgAABAgQIECBAgAABAgQqFRDwVlo43SZAgAABAgQIECBAgAABAgQIECBAgICA1xggQIAAAQIECBAgQIAAAQIECBAgQIBApQIC3koLp9sECBAgQIAAAQIECBAgQIAAAQIECBAQ8BoDBAgQIECAAAECBAgQIECAAAECBAgQqFRAwFtp4XSbAAECBAgQIECAAAECBAgQIECAAAECAl5jgAABAgQIECBAgAABAgQIECBAgAABApUKCHgrLZxuEyBAgAABAgQIECBAgAABAgQIECBAQMBrDBAgQIAAAQIECBAgQIAAAQIECBAgQKBSAQFvpYXTbQIECBAgQIAAAQIECBAgQIAAAQIECAh4jQECBAgQIECAAAECBAgQIECAAAECBAhUKiDgrbRwuk2AAAECBAgQIECAAAECBAgQIECAAAEBrzFAgAABAgQIECBAgAABAgQIECBAgACBSgUEvJUWTrcJECBAgAABAgQIECBAgAABAgQIECAg4DUGCBAgQIAAAQIECBAgQIAAAQIECBAgUKmAgLfSwuk2AQIECBAgQIAAAQIECBAgQIAAAQIEBLzGAAECBAgQIECAAAECBAgQIECAAAECBCoVEPBWWjjdJkCAAAECBAgQIECAAAECBAgQIECAgIDXGCBAgAABAgQIECBAgAABAgQIECBAgEClAgLeSgun2wQIECBAgAABAgQIECBAgAABAgQIEBDwGgMECBAgQIAAAQIECBAgQIAAAQIECBCoVEDAW2nhdJsAAQIECBAgQIAAAQIECBAgQIAAAQICXmOAAAECBAgQIECAAAECBAgQIECAAAEClQoIeCstnG4TIECAAAECBAgQIECAAAECBAgQIEBAwGsMECBAgAABAgQIECBAgAABAgQIECBAoFIBAW+lhdNtAgQIECBAgAABAgQIECBAgAABAgQICHiNAQIECBAgQIAAAQIECBAgQIAAAQIECFQqIOCttHC6TYAAAQIECBAgQIAAAQIECBAgQIAAAQGvMUCAAAECBAgQIECAAAECBAgQIECAAIFKBQS8lRZOtwkQIECAAAECBAgQIECAAAECBAgQICDgNQYIECBAgAABAgQIECBAgAABAgQIECBQqYCAt9LC6TYBAgQIECBAgAABAgQIECBAgAABAgQEvMYAAQIECBAgQIAAAQIECBAgQIAAAQIEKhUQ8FZaON0mQIAAAQIECBAgQIAAAQIECBAgQICAgNcYIECAAAECBAgQIECAAAECBAgQIECAQKUCAt5KC6fbBAgQIECAAAECBAgQIECAAAECBAgQEPAaAwQIECBAgAABAgQIECBAgAABAgQIEKhUQMBbaeF0mwABAgQIECBAgAABAgQIECBAgAABAgJeY4AAAQIECBAgQIAAAQIECBAgQIAAAQKVCgh4Ky2cbhMgQIAAAQIECBAgQIAAAQIECBAgQEDAawwQIECAAAECBAgQIECAAAECBAgQIECgUgEBb6WF020CBAgQIECAAAECBAgQIECAAAECBAgIeI0BAgQIECBAgAABAgQIECBAgAABAgQIVCog4K20cLpNgAABAgQIECBAgAABAgQIECBAgAABAa8xQIAAAQIECBAgQIAAAQIECBAgQIAAgUoFBLyVFk63CRAgQIAAAQIECBAgQIAAAQIECBAgIOA1BggQIECAAAECBAgQIECAAAECBAgQIFCpgIC30sLpNgECBAgQIECAAAECBAgQIECAAAECBAS8xgABAgQIECBAgAABAgQIECBAgAABAgQqFRDwVlo43SZAgAABAgQIECBAgAABAgQIECBAgICA1xggQIAAAQIECBAgQIAAAQIECBAgQIBApQIC3koLp9sECBAgQIAAAQIECBAgQIAAAQIECBAQ8BoDBAgQIECAAAECBAgQIECAAAECBAgQqFRAwFtp4XSbAAECBAgQIECAAAECBAgQIECAAAECAl5jgAABAgQIECBAgAABAgQIECBAgAABApUKCHgrLZxuEyBAgAABAgQIECBAgAABAgQIECBAQMBrDBAgQIAAAQIECBAgQIAAAQIECBAgQKBSAQFvpYXTbQIECBAgQIAAAQIECBAgQIAAAQIECAh4jQECBAgQIECAAAECBAgQIECAAAECBAhUKiDgrbRwuk2AAAECBAgQIECAAAECBAgQIECAAAEBrzFAgAABAgQIECBAgAABAgQIECBAgACBSgUEvJUWTrcJECBAgAABAgQIECBAgAABAgQIECAg4DUGCBAgQIAAAQIECBAgQIAAAQIECBAgUKmAgLfSwuk2AQIECBAgQIAAAQIECBAgQIAAAQIEBLzGAAECBAgQIECAAAECBAgQIECAAAECBCoVEPBWWjjdJkCAAAECBAgQIECAAAECBAgQIECAgIDXGCBAgAABAgQIECBAgAABAgQIECBAgEClAgLeSgun2wQIECBAgAABAgQIECBAgAABAgQIEBDwGgMECBAgQIAAAQIECBAgQIAAAQIECBCoVEDAW2nhdJsAAQIECBAgQIAAAQIECBAgQIAAAQICXmOAAAECBAgQIECAAAECBAgQIECAAAEClQoIeCstnG4TIECAAAECBAgQIECAAAECBAgQIEBAwGsMECBAgAABAgQIECBAgAABAgQIECBAoFIBAW+lhdNtAgQIECBAgAABAgQIECBAgAABAgQICHiNAQIECBAgQIAAAQIECBAgQIAAAQIECFQqIOCttHC6TYAAAQIECBAgQIAAAQIECBAgQIAAAQGvMUCAAAECBAgQIECAAAECBAgQIECAAIFKBQS8lRZOtwkQIECAAAECBAgQIECAAAECBAgQICDgNQYIECBAgAABAgQIECBAgAABAgQIECBQqYCAt9LC6TYBAgQIECBAgAABAgQIECBAgAABAgQEvMYAAQIECBAgQIAAAQIECBAgQIAAAQIEKhUQ8FZaON0mQIAAAQIECBAgQIAAAQIECBAgQICAgNcYIECAAAECBAgQIECAAAECBAgQIECAQKUCAt5KC6fbBAgQIECAAAECBAgQIECAAAECBAgQEPAaAwQIECBAgAABAgQIECBAgAABAgQIEKhUQMBbaeF0mwABAgQIECBAgAABAgQIECBAgAABAgJeY4AAAQIECBAgQIAAAQIECBAgQIAAAQKVCgh4Ky2cbhMgQIAAAQIECBAgQIAAAQIECBAgQEDAawwQIECAAAECBAgQIECAAAECBAgQIECgUgEBb6WF020CBAgQIECAAAECBAgQIECAAAECBAgIeI0BAgQIECBAgAABAgQIECBAgAABAgQIVCog4K20cLpNgAABAgQIECBAgAABAgQIECBAgAABAa8xQIAAAQIECBAgQIAAAQIECBAgQIAAgUoFBLyVFk63CRAgQIAAAQIECBAgQIAAAQIECBAgIOA1BggQIECAAAECBAgQIECAAAECBAgQIFCpgIC30sLpNgECBAgQIECAAAECBAgQIECAAAECBAS8xgABAgQIECBAgAABAgQIECBAgAABAgQqFRDwVlo43SZAgAABAgQIECBAgAABAgQIECBAgICA1xggQIAAAQIECBAgQIAAAQIECBAgQIBApQIC3koLp9sECBAgQIAAAQIECBAgQIAAAQIECBAQ8BoDBAgQIECAAAECBAgQIECAAAECBAgQqFRAwFtp4XSbAAECBAgQIECAAAECBAgQIECAAAECAl5jgAABAgQIECBAgAABAgQIECBAgAABApUKCHgrLZxuEyBAgAABAgQIECBAgAABAgQIECBAQMBrDBAgQIAAAQIECBAgQIAAAQIECBAgQKBSAQFvpYXTbQIECBAgQIAAAQIECBAgQIAAAQIECAh4jQECBAgQIECAAAECBAgQIECAAAECBAhUKiDgrbRwuk2AAAECBAgQIECAAAECBAgQIECAAAEBrzFAgAABAgQIECBAgAABAgQIECBAgACBSgUEvJUWTrcJECBAgAABAgQIECBAgAABAgQIECAg4DUGCBAgQIAAAQIECBAgQIAAAQIECBAgUKmAgLfSwuk2AQIECBAgQIAAAQIECBAgQIAAAQIEBLzGAAECBAgQIECAAAECBAgQIECAAAECBCoVEPBWWjjdJkCAAAECBAgQIECAAAECBAgQIECAgIDXGCBAgAABAgQIECBAgAABAgQIECBAgEClAgLeSgun2wQIECBAgAABAgQIECBAgAABAgQIEBDwGgMECBAgQIAAAQIECBAgQIAAAQIECBCoVEDAW2nhdJsAAQIECBAgQIAAAQIECBAgQIAAAQICXmOAAAECBAgQIECAAAECBAgQIECAAAEClQoIeCstnG4TIECAAAECBAgQIECAAAECBAgQIEBAwGsMECBAgAABAgQIECBAgAABAgQIECBAoFIBAW+lhdNtAgQIECBAgAABAgQIECBAgAABAgQICHiNAQIECBAgQIAAAQIECBAgQIAAAQIECFQqIOCttHC6TYAAAQIECBAgQIAAAQIECBAgQIAAAQGvMUCAAAECBAgQIECAAAECBAgQIECAAIFKBQS8lRZOtwkQIECAAAECBAgQIECAAAECBAgQICDgNQYIECBAgAABAgQIECBAgAABAgQIECBQqYCAt9LC6TYBAgQIECBAgAABAgQIECBAgAABAgQEvMYAAQIECBAgQIAAAQIECBAgQIAAAQIEKhUQ8FZaON0mQIAAAQIECBAgQIAAAQIECBAgQICAgNcYIECAAAECBAgQIECAAAECBAgQIECAQKUCAt5KC6fbBAgQIECAAAECBAgQIECAAAECBAgQEPAaAwQIECBAgAABAgQIECBAgAABAgQIEKhUQMBbaeF0mwABAgQIECBAgAABAgQIECBAgAABAgJeY4AAAQIECBAgQIAAAQIECBAgQIAAAQKVCgh4Ky2cbhMgQIAAAQIECBAgQIAAAQIECBAgQEDAawwQIECAAAECBAgQIECAAAECBAgQIECgUgEBb6WF020CBAgQIECAAAECBAgQIECAAAECBAgIeI0BAgQIECBAgAABAgQIECBAgAABAgQIVCog4K20cLpNgAABAgQIECBAgAABAgQIECBAgAABAa8xQIAAAQIECBAgQIAAAQIECBAgQIAAgUoFBLyVFk63CRAgQIAAAQIECBAgQIAAAQIECBAgIOA1BggQIECAAAECBAgQIECAAAECBAgQIFCpgIC30sLpNgECBAgQIECAAAECBAgQIECAAAECBAS8xgABAgQIECBAgAABAgQIECBAgAABAgQqFRDwVlo43SZAgAABAgQIECBAgAABAgQIECBAgICA1xggQIAAAQIECBAgQIAAAQIECBAgQIBApQIC3koLp9sECBAgQIAAAQIECBAgQIAAAQIECBAQ8BoDBAgQIECAAAECBAgQIECAAAECBAgQqFRAwFtp4XSbAAECBAgQIECAAAECBAgQIECAAAECAl5jgAABAgQIECBAgAABAgQIECBAgAABApUKCHgrLZxuEyBAgAABAgQIECBAgAABAgQIECBAQMBrDBAgQIAAAQIECBAgQIAAAQIECBAgQKBSAQFvpYXTbQIECBAgQIAAAQIECBAgQIAAAQIECAh4jQECBAgQIECAAAECBAgQIECAAAECBAhUKiDgrbRwuk2AAAECBAgQIECAAAECBAgQIECAAAEBrzFAgAABAgQIECBAgAABAgQIECBAgACBSgUEvJUWTrcJECBAgAABAgQIECBAgAABAgQIECAg4DUGCBAgQIAAAQIECBAgQIAAAQIECBAgUKmAgLfSwuk2AQIECBAgQIAAAQIECBAgQIAAAQIEBLzGAAECBAgQIECAAAECBAgQIECAAAECBCoVEPBWWjjdJkCAAAECBAgQIECAAAECBAgQIECAgIDXGCBAgAABAgQIECBAgAABAgQIECBAgEClAgLeSgun2wQIECBAgAABAgQIECBAgAABAgQIEBDwGgMECBAgQIAAAQIECBAgQIAAAQIECBCoVEDAW2nhdJsAAQIECBAgQIAAAQIECBAgQIAAAQICXmOAAAECBAgQIECAAAECBAgQIECAAAEClQoIeCstnG4TIECAAAECBAgQIECAAAECBAgQIEBAwGsMECBAgAABAgQIECBAgAABAgQIECBAoFIBAW+lhdNtAgQIECBAgAABAgQIECBAgAABAgQICHiNAQIECBAgQIAAAQIECBAgQIAAAQIECFQqIOCttHC6TYAAAQIECBAgQIAAAQIECBAgQIAAAQGvMUCAAAECBAgQIECAAAECBAgQIECAAIFKBQS8lRZOtwkQIECAAAECBAgQIECAAAECBAgQ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TIAAgRECAl7DggABAgQIECAwpwIC3jktjG5tMAIC3vpKKeBtt2YC3nY9nY0AAQJ9CSxcwPvc5z63vOxlL1vW+ypXuUrZdNNNyx3ucIfy2Mc+tjzykY8sV7jCFS63/0c/+tFy//vff/Bv2edtb3vbivW78Y1vXH70ox+V73//++WmN73p5fb9wx/+UN7xjneU97///eW73/1u+fGPf1wuvvjics1rXrPc8pa3LPe5z33KU57ylHKjG93ocsf97ne/K1e/+tVHtnvVq1518Blue9vblkc84hHl8Y9/fMnnantLP9/ylreU448/vnzta18rv/jFL8r//u//lk022aTc5ja3Kfe73/3KE5/4xMH/n+ctPqnhi1/84vK85z1vLrp66qmnDsbFKaecsm5MpKYZE3/7t39bdtlll7LZZpvNRV9X6kQz9k877bSy/fbbz31/dXD+BHIdvPCFLxzcP//P//k/JWPpL//yL1vt6A9+8INys5vdrFzpSlcql156aavnnqeT5ffPD3/4w/LpT3+63P3ud5+nrunLCgICXsODQLcCAt5ufbs4e+cB7z88tYtuz+05//u9r53bvukYAQIECEwusLAB77Wuda1yi1vcYj2pX/3qV+W///u/S4LXbA95yEPKv//7v18uIB0OeLPPJz/5yfI3f/M3y6ovF/D+7Gc/GwTFX/nKVwbHJrzbcsstyx//+Mdy7rnnlu985zuDf0/Y+x//8R/l3ve+97o2hgPebbbZpmy00UbrfvbrX/96ECj/5je/Gfxb/pD/xCc+Ua52tatNPjLG7JlAevfddx+EutkSNl//+tcvv/3tb8vPf/7zctlllw3+/drXvnZ561vfOnCc122eAt6Mvzw0+PCHPzzgysOF6173uuX//t//O3BNqJ4t9X7JS15SnvGMZ8wr66BfAt65Ls/cdy4PvbbeeuvBPfF2t7td2WqrrQYP6HKvbHMT8Lap6VxtCwh42xZ1PgKXFxDw1jciBLzt1kzA266nsxEgQKAvgYUNeB/4wAeW//zP/xzpnpDyda97Xdl3330HM1Jf+tKXlv3333/dvk3Am/Aygdytb33r8tWvfnXZWbLLBbx///d/P5i5u91225W3v/3tg1mvw9u3vvWt8qQnPal85jOfKZtvvnlJCJEZbNmGA94vfvGL5Y53vOPljv2f//mfcvTRR5enPe1pg8/w8pe/vOyzzz6tjLN/+7d/G8wKToib0Plf/uVfBiHyla985XV9i20CyDPOOGPw7/kMd7rTnVppv+2TzEvAm/A2s1z/67/+q+QBRMbcP//zP5cb3OAGg48c7y9/+cuDWuahQ7bsk/E5r1vGYfqdcbt0Jvy89lm/5kfg3e9+d3nUox5VbnWrW5WzzjqrszEk4J2fmuvJ+gICXqOCQLcCAt5ufbs4e9cB75aP2LOLbs/tOX/470fMbd90jAABAgQmFxDwrmD1nOc8ZxCm3fzmNy/f+9731u3ZBLwJHjLD7Etf+lI5+OCDS5Z/GLWNCngzuzYzczMzbaWvr1944YVliy22GAS673vf+8qDHvSgQRPjAt6mH49+9KPLu971rsFyCVlKYa3b2WefPfh6dPqfZQKOPPLIZUOXBOUPeMADBjOcs9TECSecsNbmOzl+XgLeeCaUv971rldOPvnk9QL/4Q9/yCGHlP32229gf+KJJ15udncnSE5KoAeBzP5/whOe0Pn9Q8DbQ3E1ObGAgHdiKjsSmEpAwDsVW68HCXjb5RfwtuvpbAQIEOhLQMC7gvxnP/vZcre73W1doNrMnm0C3oc97GGDGZR3vvOdB8sffOMb3xgssbB0GxXwZq3dZl3dn/70p4PlDZbbstxC1lttZshmv0kD3uc///mDmbRZtzX9Ht4yczgzbFez9uxTn/rUwezmfEU66+42Jsv1/bzzzhssN/FXf/VXI4PgtH/YYYcNQuA4ZCmCrB2ctXuzVMHSWZ/xzRIa+c/5559fXvSiFw0C8l/+8pflJje5SfnHf/zHwXqdWYd4eMtyGFlf97jjjhssK5EZ0Q9+8IPLgQceOFjmYLk1eFfbv9Q0tc1nfuc731le/epXD5ZWyP9PcLvclnUxs2RI1v/McXl4MG5LTT/+8Y8Pwt2TTjpp3e4PfehDywc/+MHyqle9quy9997rneYf/uEfBg8LRv08NUg9MgM7a55mzOUBR2abP+tZzyobb7zx5c437vOutERD+vjGN76xZAZ6HmRkjeG73vWugz7f4x73WK/fqfErXvGKwfIVedCQhyOpY8ZWxuUOO+wwjmzdz7OMyStf+cqBUx7S5Hq6znWuU/76r/96MB523HHHdftmjGVM5fwJ00dtWTM5fb7GNa5RMuabJVPa9kzbediUZQryECDjKjP045BxcMABB4xcviBjMDPtY5fxf8Mb3rDk4U/uD5kBnnvEqNngq+3/uALkus1Ds4zbc845Z7Dmba7bLFXz7Gc/e9CvbN/85jdLlp4ZtY36xsLS/WKS9cGPOeaYwX0q9U5N8m2LPNDZddddyxWveMV1hzUBb8Z7lud505veVF7/+teXb3/724P9bn/72w8e4DVrrzcH5nrNvvkGRu7/mYWf6/wv/uIvBrPvcx8bN3N9LeMrY+Bf//Vfy+c///nBfSb9z1rCWRIn/c1DxOFt1Bq8uUdlzOeYLAW0dDviiCMG3wQZ9fNpxkceNOZ3SOqYe3j6mIeYD3/4wwft5Jsxk2zT3A9yb87DsfQh4y9LC+V3/Ate8ILBtb90m3S8Nsf90z/902Dt9IyHLK3zzGc+c3B/yT09n6/ZVnvvE/BOMiLsQ2B6AQHv9HZ9Hdl5wPvIBZvB+x4zePsay9olQIBAmwIC3hU0P/KRj5Qs5ZDwNjNWmz/Um4A3s1MTGOYlaAkDEhjmD7el26iAN19bTxh0ySWXlIMOOmgwG3M126QBbxP2jQpvpgl4EzQnLE04ttb1X9/znvcMQpDf//73g5A8M4N/8pOfDIKreCfkPPbYYy8XxOSr2gld8gf0k5/85EEomjU688d6loHIlhl/b37zm9dxZhmNLA+RNY2z3EFCmpw/oUhqm7U981XwpUH3NP1LfxLAJTzNH/f5XAmWcq4EmMttCS6zhEbCroRNw+HTcsdkXeWddtpp8OOEis1L16YNePMV+ISYOVfWOs2yG5mFnRcypS4Jxz71qU8NgotmG/d5lwt4E+K+5jWvGSxrktnd2S91zUvlcp0ltEpo22wJ6BLkJizJvgmC45qaJuDP9ZSaJ7wbt+WaS12yFEZC3Xvd616D4DrnypjIlmVIMjazpc080EgYmYBo1MOYBFMJwtJ+gsVsXXgmrExd4pHgPeO6Wboj/cw95XOf+9ygVs2WEC2fN+Myfc+YSQCa+1sepuS6y/0rDzsS+DbbNP1fyf4LX/jC4EFTrsdcx1lWJn1P0Bf7BKN5UJE+JazMg4Z83vQzD3aahx6xXvrSyaXt5h6Q2b950JP6NvetnD8Bbpa+Oeqoo9Yd1gS8GVMJmvONjAT2OS59+PrXvz4Yl7mO84Ck2fJAKf8W9wTsucYTeuYelmtn6b1olM+04yufLwFyDDMOEionYM71mpqnrhkLw+uztxnwTjM+Ms7y+zLX0j3vec9BXXM95r6S3yv5nZT/vTSYXuo2zf3gzDPPHNQowXB+Z+Q/eXia8ZfaxjMPFZttNeO1Oab5FkZC+9zT88AinzFj6r73ve9gt9Xe+3KMgHfcXd3PCaxNQMC7Nr8+ju4+4H1aHx+rtzZ/+J5/7a1tDRMgQIBAewIC3hUs8xKxLEGQYCnLMDRbE/A2s2KbwCJ/oCbgTdA7vC23Bm+zBET2zeyo3XbbbRCwTfIytHEBb2Y3ZmbZHnvsMQhO8sdtZvkNbwlPE6QkLJtkfdzMmkzwly0zWxOMTrtlZlT+wM7nyOzZJkzL+RJExTb/Hf/Mtmu2rFOcmXIJ5jKr8ulPf/q6n2Xf1Cyz2FKL7JMt4XYCm7SXwCPr22aL0c4771ze+973DmbODge80/YvwVqCj/xRnzBj6Yy/5bwyu+sDH/jARIFQc44E4/ksMcyavE3wNE3Am8Av4UrCrBi+9rWvHYQw2S666KLymMc8ZjCrN/+dcdNs4z7vqIA33o94xCPKJptsMgj0tt1223Xn+9jHPja4FlKbjNlmFmcC39Q6LzPMUh/Ds9kTCCUkzjhP0D/8s1HeTciUsCtrGqcfzdbMVkwQmlC7CdoTkCbwecMb3jDwGd5il8AxwXhm+OYa7sqzCRRjlPW7m/7FK7VJ2JjZ1jFutoRLCUtjmYcgzXWRayRumT2eGg+P/2n7v9z4Tqia6y/3kDz4SPjVPDBLWwkqcx9Yeq+dZomGXH8Zl7FJYD+8Pvnpp58+CLvTn4z1hMnZhpdoSEibGcbD47IJ5RLYxStjLMfnHpj9EwAP318zszoBcc6bny1dX32p0zTjK9dWxmhqG9Nmy2z4OOb+metmzz3/PAuprYB3mvGRIDrXVWaQ5+HU8Cz53MNyT8g9Jtfg8MOdUWNqtfeDXB+pdWaGZ7Z6Zro3W+67uWbyMCDjMzWedrw2D3tTm/xOy8Pb4W2ae1+OF/Aud2fx7wTaERDwtuM4y7N0HfDe9B8XK+D9wbsFvLMcv9oiQIBAVwIC3hGy+eMuQc5ee+01mB2VkOFxj3vcuj2XBrz5Qb4KnNk/CfYSQA7Pmlou4E07aSNtpZ1s+SMzgURmNyV8SaCVWY5Lt+GA9w53uMNgBlmz5cVWmQ2ZP/QTMGa2bRtvnW++hp52MlNs6df1VzNI8wK7Qw89dL0wqjlHlhBIYJmQJS+wa7b8kZ6Zl5kNlRBmeEtIm7AuYVX62iyv0YQaCZCGZ2jl2IRcCeeWBrxr7d+oJTFW8knAnplkK63lPOr4JvAeXm5hmoC3ma2ecCMhx9KlNxJeZnZxxmn+dzOLt6nHcp93VMDbfNal4VPz+ZrZsLk28vXxbFkeIuM4YWXGzdItwWVm/SXYa4Lp5bwTzOUBRT7r0mUdck3ma9sJhBIGZaZptsMPP3xwrY5aSzohdTMLOeFfgsWuPNNWQsM8lElgOrw1/UjQmOCv2VK3ZsmQpUt/ZPZzzpVtOOCdtv/Lmeer/1nSJjNiE8Ivvadlxmn6neswD9MSUGabJuDNLOtc/6llvjK/dMu9NbNch8P6JuDNvqOuwWbphdx345yZoFnuIg/zcr/Otbt0y30q3xTImBx3r1zt+Eo/8nso12IeUmVpm+Ety3Gknql3lgdotrYC3mnGR+7Lzczc/O+lfc6YzWzmXHMrLVk0zf2g+bZDZr1ntvjSb0jknpnfmQl/87Bt2vGaMD0Px/I587tl6X10mntfPq+Ad6Xfnn5GYO0CAt61G876DALedsUFvO16OhsBAgT6EljYgDfr/DXhzTB+ZkXmj8z8AZotyxAkWBreRgW8+Xm+CpzZhFn7MCFBsy0X8DY/zwyvzLZNYJB1T4e39DMze/PV6eE/iIcD3uUGT/64zCyyrLWZGXJr3TK7Mi9ry5YZXKPWlsxMsswiHLUlhMwsrWwJRTJ7cml43hyXr+3mj+S0k6/UNrMOm0AxX+8fnr3bHJfQ61vf+tZg6YwsoZHgqAkjE75lrcelW9ZeTKg0HHCttX8JJhMITrpldmUCxeVCz+XOs/322w9mKWY2c9aRzDZNwNvM8hxeYmBpm01bmTmasC5bU4/lPu/SgDcPHRLCp64J1UatWd1cX5kdmSA2W75On5ncmaWboD7jcNzappPaZ3xdcMEF6x6y5HNm3GS2d2ZWZsvX7ptlAYYD7vysmemfGflZ3zNbV57DnykhdGZDNveqzNiMS74BkOUBsmWGfhOWLbfWd2blJ9QfHv/T9n8589wXcv0ncM3yKqO25jocvgamCXiXnjvhbBzilS3XZQLK1Co1yzYc8GbmeJY3WLrd5S53GYyJZsZsgsIsi5CwML8jcp/Ow4FpttWOr6Vt5PdWzpGHe9myDmzuB0tfrtlWwDvt+GgeNuQ+k3WkxwW5y1mu9n7QzMBeujRH2+O1CXhzD87M4OFt2ntfziHgneaqcgyByQUEvJNbzcue3Qe8f/6G4Lx85i778YN3H97l6Z2bAAECBGYksLAB7zjfBBEJlDKDdum2XMCbmbv5mnu2BFPN18vHBbzD58+agJldlv+knQQv2TJTMy99a2ZArbREQ2auZTZUzpEQIwHy0q9tj/v8o36ecCMhR7b8sTpqncT84Z4AbtSWtUmbNVITuiZEy9d0l1tP813vetcgsEiA2Swh0QSKo5bCSJvNzxOWP+hBDxrUoalJAp5Ra9s+8pGPHCxxMBxwrbV/CbmbMHsS6ybcWu0M3ubzDq+JPE3A27x4LedrZk8u7XdehJeQPMFMZjgPey/3eZcGvBmLTXiWmYejZttmyZPUN2FZZkBmy8zOeDYvgcrs28yazfjJOtkrrW88yj8vWcrLvjKDtQnFlu6XnyXsbbbmpXbDy4akX1nXOUFrZmw2a9925ZlgPF9hzwOh3G/y/5duebCT+0O2zH7PC8LyzYDlPmezPMjw+J+2/8uN9aaNvOgw7YzaUt98hT1rUac22aYNeLNMQ9ZBzUOpjKdR2/C1NhzwZsyNCmqb+8TwLPJm7eycP9+iyEO+jMs8XFrttyZWM77SXj5X1k2OWWZFj9qWzqxvK+Cddnxkje1mDfQsc5HrK14JovMwZdKHNqu9HzT3xITeeRg2bpt2vDYBb5ZqyEze4W3ae1/OIeAdVzE/J7A2AQHv2vz6OLrzgPdRCxbwvkvA28c41iYBAgTaFljYgDehUNb7G97yR2PCrczgykvPlq6f1+y7XMCbn2f2bgKw/KGfF+1kW03AO9yffB0+s4CyPERmoQ0HH+PW4G3Ok9l9CZ3yFe0EplnDc9otoXHzlvvh2Y3jztf8cT0c8GaW4XKB09LzDa/X2ASaCeia2cTD+y8NeJuvoOcr4ZnlNmrLWomZVTgccHXVv+WsmkBhpRm0S49NYJ2QPYFUlrRo3tI+TcAby4Rhk2xZvzJfZc42rh5LA97hhwSTtJWHFc2augkzE8Tnq/X5Cn6u12z5eb6Knlndw+vpLnf+o48+uuRlSAmTEoDls2cmYbNsQB7sJDxbGvDmxWu5FoeXB2nuBVkmJTPSm60rzywxkuVgsgRMQrY8cMlnzoOLLE2Q2anDAW8z/jNO8lBm1NY8lBke/9P2fznz5nwvfelLB2tir3QdJiTLLN5s0wS8eaiTF9HlnplZ4AmOM3O/WTYns82zpMeogDdjYlRonr409lkfNiF7s2VM5wFLxkIzmzo/y7cn8jmG1/JdacyvZnylnYSjCflzT863NPJAsVlfPPfMPIjoKuBdy/jI+uaZBZ17Vh5oNluWT8jvzuGX2K3ktZr7QdPfpevvtj1em4B3eDb/8DhpHpCu9t4n4J1EzD4EphcQ8E5v19eRXQe8N1uwgPf7At6+hrJ2CRAg0KqAgHcJZ2bJJhzIzMJ8bX/UH+crBbwJ2/KHdv6IzR/sCQ+br6Vm+YXMoFrtlqA5oVpmeeZFT9kmDXizb/NHZ/5wTkC2lq35OnfWeMwMuUm2UQFvM0M2X5We9EVkaWtcoLg04M1LlRK+ZVtuBm+WG8jM0FEzeNvu33JembGYUCCBaGYTjltHNudpwruEUgn3mpc8jQt4s25oZjgPr9vbzMjLzNyELJNu4+qx0gzeLMMxvFb1pG1mv1//+teD5VDykCYPLvL/M1M11+yoWdrNuRPyxylLMiy3rESWAxkV8CZUyxqyCZ2zTENmDTfh6LBl2urCM+u8ZiZ7xkZmtS+dad3M1h0OeL/yla8M9hv+t6XOTV9HzeBd7XhYrob5BkGW9hh+OLB032af4SVupgl48/Au120eeOR+N2q91cwQX24Gb8bIqHXPmxm8ww/ahj9DxkXC3jwoyQOjzHbPsjoJYfM7YNy2mvGVdahTm/w+yT0uS/kMbxnbWV6ojYA34XXWwM6L/ZoZ9NOO76UGmdWalyZmneDmd9vwEjDjzJqfj7sfNGMrS4UkXB63TTteVwp4h2fwrvbeJ+AdVzE/J7A2AQHv2vz6OLrzgPfRky+z1sfnb7vN77/zNW2f0vkIECBAoAcBAe8I9KzT9+Y3v3kQjCRIWRq2rRTw5nTNC1oyKzDrwWY916yPORzw5kU9CZMzy2vUMhDD3UqAlRlaN7vZzdYt2bCagDd/6OcP/gSpCT7WsiXUzVdcsxZqvgY9yVfjRwW8zXqur3/968uTn/zkibs0LlBcGvAmiMtX6LNlFvOo5SCaF5UNB1xd9W+5D5pQN+F5ZqVl/czUe9z2mMc8ZhCMZJmCzNhrtmY2cL4+nmBm6ZYlEhI2DIeSzczzzPDOeJt0G1ePpQFvgo3MMkzYnvGz9EVhk7Y7vF/sUq+sQZplJFa6nvKCtczqTOiXhzFLX4KUr7o36zQvncGbNuOT5Shyf8gyLrnG85kythL+NlsXnpkNmnWn8/LAzGBeujUvehwOc9OvJlxMqL00CMw5mnWrh8f/tP1frn4JRTMeM64zvkdtCegTUr/xjW8crGebbZqAN/ekrKs8PPN/uL3mIdVyAW/W1r3FLW6xXhebNXiXW/97+ICsgZxlGjIeh9fHHje+Jx1f4wLI5nfYJAFv84K3LGmTBz9Lt+alh8MBb9vjI22O+vbLOK9RPx91P2jGX+6NmTm8dEuo3wT7uX6mHa8rBbxrufcJeKcZCY4hMLmAgHdyq3nZU8DbbiUEvO16OhsBAgT6EhDwjpDP2rB5AVv+OzMr88fe8DYu4M2+f/d3fzeYXbjHHnsMZnVlltVwwNvMgMqMvKxLuDRoGm4vYUfW3BxeVmLSgDdfY88M1gRbCYcSTqxli0mWfMgbwvNV9Wat1OXOmSAxIUNmmA4v0ZCvaSdgSRiXEGTpluUbMvsu4WUzMzX7jAsUlwa8OSbHJ/w79thjS0LR4S3BexPmDAdcXfVvJfsEhgm/Ep4nwMsLnJbbmtA/s3czfjLrvNmyjEBmj496QWDCq9Qv42I44P34xz8+qFO+yp+Qc9T6yglGcmyztvQk9Vga8OaYu971roPZx8uth5maJPy9973vXTbeeONB6P2hD31o8JBkVGCdczbrl46q8bBhE/BmhmauoaWzO3ONNMsD5AHM0q9Upx8JunL9PuEJTxhckwny8lK/4a0LzybgzZqlmfU4vMUoD5JynxlebzfLvCTwTLib+1H6O7w1s4Lzb8Pjf9r+Lzde45MAMTP3Ezovvd/l/pAgOp8jLxtsXoC5loA3a5APXxfpW2aHJhzNlm9GZCmebMNr8L7uda8b3LeHtyz3kOsyYybLO2QMZ3zkf2fphuFwvzku97fcR7LkR5ZLmGSbdHw1Ae9wzZrzZ9mD3DvyAGOnnXa63NIro9bgzX05L+FMwJ4Z38NbZiXnms+LR4cD3mnGR86R0D1roo9aqqD5RkLWLv72t7+9LNc094M82MzYzzcG8rtg+IWlaaj5FkdmRmeN5WnH60oB7zT3vgZBwDvJ1WMfAtMLCHint+vryM4D3scs2Azed6zt78O+xoF2CRAgQODyAgLeZUZE85buvGwnoVBmfTXbJAFvAoP8YZygMgFL3uI+HPBmnciEu5k1tMMOO5TMospM0uEtQUhe1JKvzCeoyR/VCVWzTRLwZpmIfO0/YWDWKc0aoZm92GwJw9KvhBXNS8wmuUASLiWsyWdL2Jd1DRNyZd3abOlrviqfGYWZjZfPmD/q80dzs4Zvvr4cn4QQzR/VTdsJFRKwZK3U4VAhP58m4G1moGWmYoLTZtZx2s4f9vm3/O/hsKSr/q3km1qkDhk76WMCooS+w8sYZEZyvjKd/2QW7KilMpoXP2XmcsZZgqlsCeUzgy3haWY4Dge8CU1So4z1hJcJiIdfNNWsW5uwPC/+a342rh6jAt68FCrroiZELKu3+QAAIABJREFUTuCWwLLZ0scEMRk/w/1rZlkvXQohxyW0TriZr2nngcLS62jYPDMrM4M4YyzjMeO22fJywMy2TPibc456cVyOi0G88hny4CWzqLMG8PDWheeJJ544eOCRl3klAGsefOT6SpifujbrfsexqXuC6ASlmeWcnzfXaV4Ml3tP1tbO/x4e/9P2f7nxnbGa6z39XvrgIaZZ/iDffMhaqVlfu9mmCXjzrYhc00uXUsj9L/eT3MvzUGT4RVhNwJvAP0FzwuHhZRWyHELuU/kWRYLK7Je1eBMGZxzkXjccWme2ZtZhzzjOPTxtTbJNOr6e//znD+67qWk+a/Mtk4SXucZT43xLJOZ5+V+zjQp408cs/5NtOBRPX/bee+/B74/cL4bvxdOMjzywS53zOyO/Q5rfBU3fYpRvdMQz195K22rvB3mglXtVvlGTMDuBe2OWBx/5PZAt4zM1nna8jgt4p7n3pV8C3kmuHvsQmF5AwDu9XV9Hdh3w3vwxe/f10Xpp9+x3vLqXdjVKgAABAu0KCHiX8UxImdlfmaWVmYQJV5o3fE8S8Oa0eaFQ3hrfbEvX4M3XYXfeeedBMJUtywc0oUKCvAS0+UM6f6wn2BpeymA44M0fzMMhYI5JWJhZcfnfCXfzYqp8bXd4S6CXAHDULLBxw6yZuZawL1tmDTZ/sKfv6V+2hB6ZFZnZmpmNObzlj/h8/gQJ6Uv+k5lyCRkSVGRmbWb3Di+rMC5QHDWDN/3JchvxyAup7nnPew6+Vp/Zajl3ZpMliF7q0EX/xrmm5pmdl9AlW4LUBNOZcZaaJqDI2IxrZiBmTcmlWz5vxkTWkc3nTQiU0DKhVhxyvrwkKiFxwrZmy1qhCRAT+CWYbZY6yKzQ/CxjLGM2oWCzjavHqIA3xyY4ymzyhCwJwrIsQkLJhFIJYbNOcMKQZi3UhFgJfnOt5GVMmW2Y8ZTZivlZHjYMv5xrJefMAs5nj2GsE/hmln3CnYS+WT81D3jSp/Qj1/HwjOZchxkvOT7jPmN1OAzvyjN1zwOAjI2E93nIkuAqsyJzj8h1k3AzAeSd73znwbcIsuZt7jsJwBPSpR7ZJ64JtnKPy6zaLDmxdPxPMx5Wcs/1lgdU6UfGTfqUWsc+D1QyczMB9PD1Pk3AmzGaumXLzO5mRmju4YcccsjALvedmGW2e164lzGQWa9ZwiIPlzJbOveJjIEsG5E+Zqzm3M2a4bnO8nAiTrnOsnRG/juzpTMm8zkTnOa6a0L1cdd/fj7J+Mo1mv42L5JLHRPSJxzP76tcW82SLxnjCU2z/MOogDdtNstPZFxkfOQBU8ZZHh5kFnLC7JjmGxvTju/8Lkofcl3nukk7+Z2R3xUJ3/O7JGMxds0M7uW8prkfZPylXrkv5jrI75v8TmhmLS+9H04zXscFvNPc+3KMgHeSK8c+BKYXEPBOb9fXkZ0HvP+0YAHvsQLevsaydgkQINCmgIB3Bc0zzzxzEIglRMmMn3zVNtukAW/+OM5L2vKV42yjXrKWP8ozCzCzczMDL+FAgpwEDgniEqYlmG3WBW26OxzwjvoICb8ShOWP/fxxPurr/msJeNNmPl+WFMjXivPHcALIhOAJUBKqZHZkwoVmDdxR/cyMy8yMS5CbwCRhdIKJhFMJ4hKYDG/jAsVRAW+OT4CUsD3OMc7sxwQWmQWXP+wTbo16AVTb/Zvk4s3sscyuzszQjMEEnxmDmTWYwCgh7O67777ii5sS3Ofr53lAkbGS8ZP1TxPWHHjggYNwePgr6k2/UsPMAE74l/GaviRwyzjKV5eHl2fIMePqsVzAm2PTRmbsZZmA1CRjNusDZ9ZyQreMheEt4XaC6cz+S8CVkD4vREvYm2skswMn2TJuM1M3YzcBT2a6JiDL+Ej7mc2ZGbkJ9vLZEz4Nr12bIDXhX7bMjk04utzWtmf6m5mpeZFXwr30LzMrU9eEYxnfCQgTfGc2bBPI5R6U8Z3rLKFq7g0JNxO0Z/98hgTZOc/wttr+j/PP8h/5RkL6n/+dGudBTmZQpi+57w1v0wS8OT6zsXNd53NnxnPqmochua+k/llWIeMvwXwe5MQu327IdZJ7RcZlQvzM5M51l2A9s2bzMGJ4S1iYMDjOOa4Zx7l3J1TNvXdU+L+S06TjK6Fzapp14nPfzX0zL/3LNxYSRsc599bUOzP9822O5QLeLL2TWcpZyiD/O2tLJxzPmuv5vZSlHpYu95DPsNrxkZA3S0Lk3pbz5vdf+pp+5fwZ26PWSR/lNc39IN+KyTjP7/BcS6lNHobk3tZ8O2a4rdWO10kC3mnufQLecXcWPyewNgEB79r8+jhawNuu+tkC3nZBnY0AAQI9CSxcwNuTs2YJTC3QBD4JQhJQDK9JPPVJHUjg/ws067kmPE8gaSNAYL4EBLzzVQ+92fAEBLz11bT7gPfP33CrT2f1PT772Fet/iBHECBAgMDcCQh4564kOkTg8gKZ0Z2ZhQl3M+M4s/ZsBCYVyBICmYW85ZZbrpt53BybpS0yezKz5zO7t1mWY9Jz248Age4FBLzdG2thsQUEvPXVv+uAd6udFyvg/d7bBbz1XQV6TIAAgfUFBLxGBYEKBLKcQoLdfKU4Xy9ulgiooOu62LNAXuC41157DQLerF2aZTOy5evy+Vr+YYcdNvi3LMmxdFmMnruueQIErMFrDBDoXEDA2zlx6w10H/Cu/46L1j/EHJ3we29/5Rz1RlcIECBAYFoBAe+0co4jMEOBzLTMOrF58VHWBM3a0HkRUtaKzVqqNgLLCWQN1qynmqU+8oAg68hmveOs05w1ZvOyuKyjnTVQbQQIzJ+AGbzzVxM92rAEBLz11bPzgPefFyzgPUbAW99VoMcECBBYX0DAa1QQqETgwgsvHLw47QMf+MDg5UR5MVRmXz7mMY+p5BPoZl8Cv/nNb8ob3vCGwcv78hK5iy66qGy22WaDJRkyizcvGLMRIDCfAgLe+ayLXm04AgLe+mop4G23Zt8T8LYL6mwECBDoSUDA2xO8ZgkQIECAAAEC4wQEvOOE/JzA2gQEvGvz6+PorgPeWzz2WX18rN7a/O6/HdZb2xomQIAAgfYEBLztWToTAQIECBAgQKBVAQFvq5xORmA9AQFvfYNCwNtuzQS87Xo6GwECBPoSEPD2Ja9dAgQIECBAgMAYAQGvIUKgWwEBb7e+XZxdwNuuqoC3XU9nI0CAQF8CAt6+5LVLgAABAgQIEBDwGgMEehUQ8PbKP1XjXQe8t3zcs6fqV60Hfedtr6i16/pNgAABAkMCAl7DgQABAgQIECAwpwJm8M5pYXRrgxEQ8NZXSgFvuzUT8Lbr6WwECBDoS0DA25e8dgkQIECAAAECYwQEvIYIgW4FBLzd+nZx9s4D3scv2Azet46fwXvqqaeWww47rJx22mnlggsuKNe73vXKDjvsUPbff/+y9dZbr6rMl112WTnmmGPKW9/61vLVr361XHzxxWWTTTYp22+/fXnKU55Sdtppp1Wdz84ECBAg8CcBAa+RQIAAAQIECBCYUwEB75wWRrc2GAEBb32l7Drg/YvH71Mfyhp6/O23Hrri0UcddVTZbbfdSoLZrbbaqmyxxRblO9/5Tjn33HPLRhttVI4//vhyz3vec6Ie/PGPfyyPfOQjy/vf//7Bsfe73/0GYfH3v//98olPfGLQxr777lte9rKXTXQ+OxEgQIDAnwUEvEYDAQIECBAgQGBOBQS8c1oY3dpgBAS89ZWy84D3CQsW8L5l+YD3u9/9brntbW9b/vCHP5S3v/3t5dGPfvRgwCSIPfjgg8sBBxxQbnKTm5SzzjqrbLzxxmMHU8LiXXfdtWy++eaD2cA3velN1x3zyU9+suy4444lIfBnPvOZcte73nXs+exAgAABAgJeY4AAAQIECBAgMPcCAt65L5EOVi4g4K2vgALedmv27RUC3r322qscfvjhg1D2yCOPXK/hzNz99Kc/XRLcPulJTxrbsfvf//7lox/9aHnxi19cnve85623/0Me8pDyoQ99qOyzzz7l5S9/+djz2YEAAQIEBLzGAAECBAgQIEBg7gUEvHNfIh2sXEDAW18Buw54b/XEfetDWUOPv/Xm5YPULMdwzjnnlE996lMjl2FI6Lv77ruXBLcf+chHxvYis3Izc/ctb3lLefzjH7/e/nvuuWd57Wtfu2ygPLYBOxAgQGCBBSzRsMDF99EJECBAgACB+RYQ8M53ffSufgEBb301FPC2W7PlAt7zzz+/XPe61x00dskllwzWzF265SVpt7/97ctmm21WzjvvvLEdS6j7tre9bbC0w0te8pL19n/Qgx5UjjvuuHLooYeWZz97sV52NxbPDgQIEBgjIOA1RAgQIECAAAECcyog4J3TwujWBiMg4K2vlJ0HvE9asBm8R4+ewfuFL3yh3PnOdx68BO1nP/vZyIHyy1/+smy66aaDn/36178u17jGNVYcUF/84hfL9ttvX65zneuUrLmb9X2b7XOf+1y5+93vPgiSv/e97w3atREgQIDA5AIC3smt7EmAAAECBAgQmKmAgHem3BpbQAEBb31F7zrg3fpJz6kPZQ09/ubRLxt59AknnFDue9/7lq222qrkZWujtrx87apXvergRz/60Y/KDW94w7E9ecc73lGyFMNvf/vbcr/73W8w+/eHP/xhSXtZEuKYY47xgrWxinYgQIDA+gICXqOCAAECBAgQIDCnAgLeOS2Mbm0wAgLe+kop4G23ZssFvB/+8IfLgx/84LLNNtuUb3zjG8s2esUrXrFcdtll5Tvf+U65xS1uMbZz55577mAJhiOOOKL87//+77r9M3P3mc98Znn6059u9u5YRTsQIEBAwGsMECBAgAABAgSqERDwVlMqHa1UQMBbX+E6D3h3WbAZvEeNnsF74oknlh133LHVGbxf/vKXy0477TSYvfvCF76wPPaxjx0s8ZDZv1mb98UvfnG5wQ1uUE455ZRys5vdrL7BqccECBDoUcAM3h7xNU2AAAECBAgQWElAwGt8EOhWQMDbrW8XZ+864N1ml+d20e25PedZRx0ysm9ZL/dOd7rT4EVrP//5z0fuk3+//vWvP/jZxRdfXDbeeOMVP+cd7nCHcvrpp5fXve51ZY899lhv33322ae84hWvKA9/+MPL+973vrk10zECBAjMo4CAdx6rok8ECBAgQIAAgVKKgNcwINCtgIC3W98uzt55wLvrggW8bxod8P7qV78avAxtpfC2eRHbjW9843LOOeesWO4f/OAH62bl5tzXuta11tv/tNNOG6y/m3V9f/Ob35QrXelKXQwh5yRAgMAGKSDg3SDL6kMRIECAAAECG4KAgHdDqKLPMM8CAt55rs7ovgl4263ZWcsEvGnllre85eAFa1muYYcddliv4Ve96lWDdXMf9rCHlfe///0rduxrX/taud3tbleucIUrDMLbq13tauvtnyUc7njHOw7+Pcs4jNqn3U/vbAQIENhwBAS8G04tfRICBAgQIEBgAxMQ8G5gBfVx5k5AwDt3JRnboa4D3lvvtt/YPmxIO3zjyIOX/Tj77bdfOeSQQ8rOO+9cjjnmmMvtlxerbbfdduXMM88s73znO8ujHvWoFVkuvPDCwXq7f/zjH8upp55a7na3u623/9FHH1122WWXcqMb3ajkZWw2AgQIEJhcQMA7uZU9CRAgQIAAAQIzFRDwzpRbYwsoIOCtr+gC3nZrtlLA++Mf/7jc6la3Kpdcckk58sgjB+FrtksvvbTsu+++JTN4t9lmm3LGGWeUq1zlKus6lvVzTz755LL11luXPffcc92/P/ShDy0f/OAHB2v75r8333zzdT8777zzBqHv2WefXZ7znOcMgmUbAQIECEwuIOCd3MqeBAgQIECAAIGZCgh4Z8qtsQUUEPDWV/TOA97dF2wG7xuXn8Gb0ZGwNrNzE+puueWWZYsttijf/OY3By9e22STTcpJJ51Utt1228sNpL333ru85jWvKfe5z33KCSecsO5nP/nJT8q97nWv8u1vf7tc85rXHPw85/jpT386CIQTJN/97ncvH/vYx8pGG21U3+DUYwIECPQoIODtEV/TBAgQIECAAIGVBAS8xgeBbgUEvN36dnH2rgPe2+y+fxfdnttz/tcbDxrbt9NPP70cdNBB5ZRTTil5QdoNbnCD8oAHPKAccMABg+UUlm7LBbzZLyHu61//+kFwfNZZZw3+f8LerM/76Ec/ujzxiU8sV77ylcf2yQ4ECBAgcHkBAa8RQYAAAQIECBCYUwEB75wWRrc2GAEBb32l7DzgffKCBbxvGB/w1jdK9JgAAQKLJyDgXbya+8QECBAgQIBAJQIC3koKpZvVCgh46yudgLfdmv2XgLddUGcjQIBATwIC3p7gNUuAAAECBAgQGCcg4B0n5OcE1iYg4F2bXx9Hdx3w3vbJB/TxsXpr8+tveGlvbWuYAAECBNoTEPC2Z+lMBAgQIECAAIFWBQS8rXI6GYH1BAS89Q2KzgPePRYs4H29gLe+q0CPCRAgsL6AgNeoIECAAAECBAjMqYCAd04Lo1sbjICAt75SCnjbrdnXBbztgjobAQIEehIQ8PYEr1kCBAgQIECAwDgBAe84IT8nsDYBAe/a/Po4uuuA9y+f8rw+PlZvbX7tdS/prW0NEyBAgEB7AgLe9iydiQABAgQIECDQqoCAt1VOJyOwnoCAt75BIeBtt2YC3nY9nY0AAQJ9CQh4+5LXLgECBAgQIEBgjICA1xAh0K2AgLdb3y7O3nnA+9QFm8H7WjN4uxinzkmAAIFZCwh4Zy2uPQIECBAgQIDAhAIC3gmh7EZgSgEB75RwPR7WdcB7u6c+v8dPN/umz3zti2ffqBYJECBAoHUBAW/rpE5IgAABAgQIEGhHQMDbjqOzEFhOQMBb39joPODdc8EC3iMEvPVdBXpMgACB9QUEvEYFAQIECBAgQGBOBQS8c1oY3dpgBAS89ZVSwNtuzc4U8LYL6mwECBDoSUDA2xO8ZgkQIECAAAEC4wQEvOOE/JzA2gQEvGvz6+PorgPebZ/2L318rN7aPONfD+ytbQ0TIECAQHsCAt72LJ2JAAECBAgQINCqgIC3VU4nI7CegIC3vkEh4G23ZgLedj2djQABAn0JCHj7ktcuAQIECBAgQGCMgIDXECHQrYCAt1vfLs4u4G1XVcDbrqezESBAoC8BAW9f8tolQIAAAQIECAh4jQECvQoIeHvln6rxrgPe7Z7+gqn6VetBXz38RbV2Xb8JECBAYEhAwGs4ECBAgAABAgTmVMAM3jktjG5tMAIC3vpKKeBtt2YC3nY9nY0AAQJ9CQh4+5LXLgECBAgQIEBgjICA1xAh0K2AgLdb3y7O3nnAu9eCzeB9jRm8XYxT5yRAgMCsBQS8sxbXHgECBAgQIEBgQgEB74RQdiMwpYCAd0q4Hg/rOuC9/V4v7PHTzb7p01+zWJ939sJaJECAwGwEBLyzcdYKAQIECBAgQGDVAgLeVZM5gMCqBAS8q+Kai507D3j3XqzA8/RXL9bnnYtBrBMECBDoQEDA2wGqUxIgQIAAAQIE2hAQ8Lah6BwElhcQ8NY3OgS87dZMwNuup7MRIECgLwEBb1/y2iVAgAABAgQIjBEQ8BoiBLoVEPB269vF2bsOeO/wjMVak/Yrr1qsNYe7GJPOSYAAgXkQEPDOQxX0gQABAgQIECAwQkDAa1gQ6FZAwNutbxdnF/C2qyrgbdfT2QgQINCXgIC3L3ntEiBAgAABAgTGCAh4DREC3QoIeLv17eLsnQe8z1ywGbyvNIO3i3HqnAQIEJi1gIB31uLaI0CAAAECBAhMKCDgnRDKbgSmFBDwTgnX42FdB7x/9cwDe/x0s2/6y6/8l9k3qkUCBAgQaF1AwNs6qRMSIECAAAECBNoREPC24+gsBJYTEPDWNzYEvO3WTMDbrqezESBAoC8BAW9f8tolQIAAAQIECIwREPAaIgS6FRDwduvbxdk7D3iftWAzeA8zg7eLceqcBAgQmLWAgHfW4tojQIAAAQIECEwoIOCdEMpuBKYUEPBOCdfjYV0HvHd81ot7/HSzb/pLhz1/9o1qkQABAgRaFxDwtk7qhAQIECBAgACBdgQEvO04OguB5QQEvPWNjc4D3mcvWMD7CgFvfVeBHhMgQGB9AQGvUUGAAAECBAgQmFMBAe+cFka3NhgBAW99pRTwtluzLwl42wV1NgIECPQkIODtCV6zBAgQIECAAIFxAgLecUJ+TmBtAgLetfn1cXTXAe9f7/OSPj5Wb21+8dDn9da2hgkQIECgPQEBb3uWzkSAAAECBAgQaFVAwNsqp5MRWE9AwFvfoBDwtlszAW+7ns5GgACBvgQEvH3Ja5cAAQIECBAgMEZAwGuIEOhWQMDbrW8XZ+884N13wWbwvtwM3i7GqXMSIEBg1gIC3lmLa48AAQIECBAgMKGAgHdCKLsRmFJAwDslXI+HdR3w3mnfl/b46Wbf9BdefsDsG9UiAQIECLQuIOBtndQJCRAgQIAAAQLtCAh423F0FgLLCQh46xsbnQe8z1mwgPdlAt76rgI9JkCAwPoCAl6jggABAgQIECAwpwIC3jktjG5tMAIC3vpKKeBtt2ZfEPC2C+psBAgQ6ElAwNsTvGYJECBAgAABAuMEBLzjhPycwNoEBLxr8+vj6K4D3js/56A+PlZvbX7+Zfv31raGCRAgQKA9AQFve5bORIAAAQIECBBoVUDA2yqnkxFYT0DAW9+g6Dzgfe6CBbyHCHjruwr0mAABAusLCHiNCgIECBAgQIDAnAoIeOe0MLq1wQgIeOsrpYC33Zp9XsDbLqizESBAoCcBAW9P8JolQIAAAQIECIwTEPCOE/JzAmsTEPCuza+Po7sOeLff7+A+PlZvbX7u4P16a1vDBAgQINCegIC3PUtnIkCAAAECBAi0KvDhc09r9XxO1p3Apb+/tPzu4t+WS/9waXeNOHPrAuedd2FJyHveTy9s/dxO2I3Aia/pNoAV8HZTN2clQIAAgW4FBLzd+jo7AQIECBAgQGBqgX3+871TH+vA2QpcdMFF5Sff+0m5+IKLZtuw1tYksPlm1yrbbbtl2Xzza63pPA6encA//9UDOm1s+/27DZA77fwUJ//cQWbwTsHmEAIECMydgIB37kqiQwQIECBAgACBPwk88ui3oKhE4ILzLihnn3l2+dVPL6ikx7oZge223aI8/rH3GIS8tjoE/vLKt+m0o3fZ/5BOzz9vJz/toOfOW5f0hwABAgSmEBDwToHmEAIECBAgQIDALAQEvLNQbqcNAW87jrM+i4B31uJrb6/zgPeABQt4XyrgXfuodAYCBAj0LyDg7b8GekCAAAECBAgQGCkg4K1nYAh466nVcE8FvPXVTcDbbs1OE/C2C+psBAgQ6ElAwNsTvGYJECBAgAABAuMEBLzjhObn5wLe+anFanoi4F2N1nzs23XAe9fnvWw+PuiMevHZlzxnRi1phgABAgS6FBDwdqnr3AQIECBAgACBNQgIeNeAN+NDBbwzBm+pOQFvS5AzPI2At11sAW+7ns5GgACBvgQEvH3Ja5cAAQIECBAgMEZAwFvPEBHw1lOr4Z4KeOurm4C33ZoJeNv1dDYCBAj0JSDg7UteuwQIECBAgAABAe8GMwYEvHWWUsBbX926Dnjv9vyX14eyhh5/5sX7ruFohxIgQIDAvAgIeOelEvpBgAABAgQIEFgiYAZvPUNCwFtPrYZ7KuCtr24C3nZrJuBt19PZCBAg0JeAgLcvee0SIECAAAECBMYICHjrGSIC3npqJeCts1ZNr7sOeO/+L4s1g/fUA83grfuK0HsCBAj8SUDAayQQIECAAAECBOZUQMA7p4UZ0S0Bbz21EvDWWavZBbyH1g20yt6feuA+qzzC7gQIECAwjwIC3nmsij4RIECAAAECBEopAt56hoGAt55aCXjrrNXMAt4XLFjA+yIBb91XhN4TIEDgTwICXiOBAAECBAgQIDCnAgLeOS3MiG4JeOuplYC3zlrNKuC9x4IFvJ8W8NZ9Qeg9AQIE/r+AgNdQIECAAAECBAjMqYCAd04LI+CtpzBjeuola/WVsus1eO/xwlfUh7KGHn/6hc9ew9EOJUCAAIF5ERDwzksl9IMAAQIECBAgsERAwFvPkDCDt55aDfdUwFtf3boOeO+5YAHvKQLe+i4CPSZAgMAIAQGvYUGAAAECBAgQmFMBAe+cFmZEtwS89dRKwFtnrZpedx7wvmixZvCe8gIzeOu+IvSeAAECfxIQ8BoJBAgQIECAAIE5FRDwzmlhBLz1FGZMT83gra+U3Qe8h9WHsoYen/KCZ63haIcSIECAwLwICHjnpRL6QYAAAQIECBBYIiDgrWdImMFbT62Geyrgra9uXQe8f3PgYgW8n/oXAW99V4EeEyBAYH0BAa9RQYAAAQIECBCYUwEB75wWZkS3BLz11ErAW2etml4LeNutn4C3XU9nI0CAQF8CAt6+5LVLgAABAgQIEBgjIOCtZ4gIeOuplYC3zlrNKuC914sXawbvJ59vBm/dV4TeEyBA4E8CAl4jgQABAgQIECAwpwIC3jktzIhuCXjrqZWAt85azS7gfWXdQKvs/Sef/8xVHmF3AgQIEJhHAQHvPFZFnwgQIECAAAECpRQBbz3DQMBbT60EvHXWSsDbTd0EvN24OisBAgRmLSDgnbW49ggQIECAAAECEwoIeCeEmoPdBLxzUIQpuuAla1Og9XxI12vw3vslizWD9+TnmcHb85DWPAECBFoREPC2wugkBAgQIECAAIH2BQS87Zt2dUYBb1ey3Z5XwNutbxdn7z7gfVUX3Z7bc578vGfMbd90jAABAgQmFxDwTm5lTwIECBAgQIDATAUEvDPlXlNjAt418fV2sIC3N/qpG+464N3hpYsV8J50gIB36sHoQAIECMyRgICbciUzAAAgAElEQVR3joqhKwQIECBAgACBYQEBbz3jQcBbT62Geyrgra9uAt52azZJwHvqqaeWww47rJx22mnlggsuKNe73vXKDjvsUPbff/+y9dZbr7pDf/jDH8rhhx9e3v72t5fvfOc75WpXu1q59a1vXXbdddey8847lytc4QqrPqcDCBAgsOgCAt5FHwE+PwECBAgQIDC3AgLeuS3Neh0T8NZTKwFvnbVqet15wHvQq+sGWmXvT9p/7xWPOOqoo8puu+1WLrvssrLVVluVLbbYYhDKnnvuuWWjjTYqxx9/fLnnPe85cau//e1vy0477VQSGifYveMd71guuuiicsYZZwzO8cQnPrEcffTRE5/PjgQIECDwJwEBr5FAgAABAgQIEJhTAQHvnBZmRLcEvPXUSsBbZ61mFfDeZ8EC3hNXCHi/+93vltve9rYlM24z2/bRj370oAwJew8++OBywAEHlJvc5CblrLPOKhtvvPFEA2uPPfYob3jDG8o97nGP8r73vW8wGzjbpz/96fLABz5wEPaefPLJ5V73utdE57MTAQIECAh4jQECBAgQIECAwFwLCHjnujyX65yAt55aCXjrrNXMAt6DF2sG74n7LT+Dd6+99hospZClE4488sj1Bk5m7iaYzSzfJz3pSWMH1g9/+MNyi1vcYjDz93vf+1657nWve7ljMnM3s4Mf/vCHlzvd6U5jz2cHAgQIEPizgBm8RgMBAgQIECBAYE4FBLxzWpgR3RLw1lMrAW+dtZpVwLvjwa+pG2iVvT9hv72WPSLLMZxzzjnlU5/61MhlGBL67r777uX+979/+chHPjK25UMPPbTsu+++5alPfWo54ogjxu5vBwIECBCYXEDAO7mVPQkQIECAAAECMxUQ8M6Ue02NCXjXxNfbwV6y1hv91A13vQbvjocsWMD73NEB7/nnn79uhu0ll1wymHW7dPvqV79abn/725fNNtusnHfeeWNr+qAHPagcd9xx5QMf+EB56EMfOnZ/OxAgQIDA5AIC3smt7EmAAAECBAgQmKmAgHem3GtqTMC7Jr7eDhbw9kY/dcMC3qnpRh54wjIB7xe+8IVy5zvfebBG7s9+9rORx/7yl78sm2666eBnv/71r8s1rnGNFTt3s5vdrPzgBz8o3/jGN0qWa3jFK15RvvzlL5f/+Z//KVtvvXV53OMeV/bcc89ypStdqd0P6WwECBBYAAEB7wIU2UckQIAAAQIE6hQQ8NZTNwFvPbUa7qmAt766dR3w3vdlizWD9xPPGT2D94QTTij3ve99y1ZbbVXysrVRW16+dtWrXnXwox/96Eflhje84YoD6upXv3r53e9+V174whcO/nOb29xmEOxm9u9nP/vZwcvbMrM3L1+74hWvWN/g1GMCBAj0KCDg7RFf0wQIECBAgACBlQQEvPWMDwFvPbUS8NZZq6bX3Qe8h9cNtMref+I5Tx95xIc//OHy4Ac/uGyzzTaDGbfLbQliE8zm5Wh5gdpy2x//+Mdy5StfefDjjTfeuBx77LHlIQ95yLrdTzzxxPKwhz2sXHTRReVNb3pT2WWXXVb5SexOgACBxRYQ8C52/X16AgQIECBAYI4FBLxzXJwlXRPw1lMrAW+dtZpZwPvyBQt49x0d8CZw3XHHHVubwZsQOEsv5L+f8YxnlFe+8pXrDcQXvehFg5m9d7rTncrnP//5ugeq3hMgQGDGAgLeGYNrjgABAgQIECAwqYCAd1Kp/vcT8PZfg2l6YImGadT6PabrGbw7LVjA+/FlAt4vfvGLg6D1ute9bvn5z38+suj59+tf//qDn1188cWDmbkrbde85jUHM3Tf//73D2brLt1OO+20cte73rVc5SpXKb///e/7HWhaJ0CAQGUCAt7KCqa7BAgQIECAwOIICHjrqbWAt55aDfdUwFtf3boPeP+1PpQ19Pjj+z5t5NG/+tWvynWuc50Vw9vmRWw3vvGNyznnnDO2F9ttt10544wzyjHHHFN23nnn9fb//ve/X25+85sP/j0vXmvW9x17YjsQIECAQBHwGgQECBAgQIAAgTkVEPDOaWFGdEvAW0+tBLx11qrpddcB798eulgB78f2GR3wxvuWt7zl4AVrWa5hhx12WG/gvOpVryrPfOYzB7NxMyt33LbrrruWo446quy///7lpS996Xq7f/KTnyz3vve9S2b6XnjhheNO5+cECBAgMCQg4DUcCBAgQIAAAQJzKiDgndPCCHjrKcyYnprBW18pBbzt1mylgHe//fYrhxxyyGC2bWbdDm9ZSzczcs8888zyzne+szzqUY8a27Hjjz++POABDyibb755yWzdq13tapc7Zq+99iqHH354ud/97leyr40AAQIEJhcQ8E5uZU8CBAgQIECAwEwFBLwz5V5TY2bwromvt4MFvL3RT91w5wHvK46Yum81HvixZ++5bLd//OMfl1vd6lblkksuKUceeWTZZZddBvteeumlZd999y2ZwbvNNtsMll3IurnN9r73va+cfPLJZeutty577vnn8ycUzrq+X/rSl8qDH/zgQTC80UYbDQ5797vfXR772McO1t497rjjBkGwjQABAgQmFxDwTm5lTwIECBAgQIDATAUEvDPlXlNjAt418fV2sIC3N/qpG+464L3fggW8H10h4E2REtZmdm5C3S233LJsscUW5Zvf/ObgxWubbLJJOemkk8q22257uXruvffe5TWveU25z33uU0444YTL/ezss88u97jHPUrC40033bTc/va3L+edd175+te/Ptjv2c9+djn00EOnHh8OJECAwKIKCHgXtfI+NwECBAgQIDD3AgLeuS/Rug4KeOup1XBPBbz11a3zgPewxZrB+9FnLT+Dtxkdp59+ejnooIPKKaecUvLytRvc4AaDGbYHHHBAudGNbrTeIFop4M3O559//mAN3g996EPl3HPPLVe/+tXLHe5wh8Fs36znayNAgACB1QsIeFdv5ggCBAgQIECAwEwEBLwzYW6lEQFvK4wzP4mAd+bka26w64D3/oe9ds19rOkExz/rqTV1V18JECBAYBkBAa+hQYAAAQIECBCYUwEB75wWZkS3BLz11Gq4pwLe+urWecD7ygULeJ8p4K3vKtBjAgQIrC8g4DUqCBAgQIAA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ASt4nQkSkIAEJCABCUigoQQUvA1NTElYCt50cqXgTTNX4yV4jx0xwbtjG8F79913hyWXXDL8+9//DieffHLYYostsjQgew855JCw//77h/nmmy/cdtttYYYZZqicWGeccUbYeOONw8te9rJw4oknhq233jq85CUvCf/973+zCuFPf/rT2TZ++9vfhuWWW65yey4gAQlIQAL/T0DB62yQgAQkIAEJSEACDSWg4G1oYhS86SSmIlJbNKSXyroreI/73WhV8O7wttYVvLvvvns4+uijw+TJk8Nxxx03ZrJQuXvllVcGqny32267ysm0xhprhMsuuyzstddemdAtjpVWWilrA4E4/tKXvlS5PReQgAQkIAEFr3NAAhKQgAQkIAEJNJ6AgrfxKZoWoBW86eQqH6mCN7281S94p6YHpY+Id3jbpJZr047hvvvuC5dffnlpGwak74477hjWWWedQF/dqsHy9957b9hqq63CW9/61jGL77rrrllv3m222Sar8HVIQAISkEDnBKzg7ZyVS0pAAhKQgAQkIIFxJaDgHVfcfe1MwdsXvqGtrOAdGvqed1y34D3+96MleCcvWS54H3300TDbbLNleXrmmWeyfrvFceONN4Zll102zDnnnOGhhx7qOadxRVpAnHrqqVbw9k3SDUhAAqNIQME7iln3mCUgAQlIQAISSIKAgjeJNGVBKnjTyVU+UgVvenmrW/CeMGKCd/sWgvfaa68NK6ywQph99tnDww8/XDpRHnvssTDrrLNmP3vqqafCjDPO2POEeuSRR8JCCy0Unn322XDzzTeXVvj2vHFXlIAEJDACBBS8I5BkD1ECEpCABCQggTQJKHjTyZuCN51cKXjTzFWMunbBe8ulaQPqMvrt37pG6RoXX3xxWHvttcPCCy8c+Nha2eDja6985SuzHz3wwANh7rnn7nLvLyzOR9bWX3/9cOGFF4YddtghHHvssT1tx5UkIAEJjDIBBe8oZ99jl4AEJCABCUig0QQUvI1Oz3TBKXjTyZWCN81cjZfg/e6ICd7tWgjec889N2ywwQZhiSWWCLfeemvLSfPSl740PP/88+Guu+4KiyyySNeT67nnngtbbrllOPvss8OKK64Ypk6dGl796ld3vR1XkIAEJDDqBBS8oz4DPH4JSEACEpCABBpLQMHb2NSMCUzBm06uFLxp5mrcBO+to1XB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TeFPf/pTuPLKK8PKK3vz1Kjk9BnM3//+9yynd9xxR7jsssvGXG8ff/zxsMMOO2T/luB3x0MPPTRmj1//+tfDJz/5yez3y/HHH98yIgVvn8kax9Wt4B1H2APclYJ3gDDHaVN1C94f3zNagnezhfw3yjhNXXcjAQlIoFYCtQvea6+9NqywwgrZQSDO5pprrtIDijfCL3nJS8Jf//rXMPvss49Z7vnnnw9vfOMbw8MPPxyOO+64gBSOgpf13vzmN3cE6wc/+EFYfvnlS5d95JFHwjzzzBP+/e9/Zz/fdNNNw49//OPplkWyHnbYYWPW50b+H//4R5hjjjnCzDPPPObnl19+ec+SEJm94447ZlKX8ZrXvCbbz3PPPReIGTaMmWaaKXz/+98PG264YUcshrFQkwTvE088ET7ykY+Ec889N0PBPJptttnC6173uowropfx2te+NnzpS18Ke+655zCQdbxPBW/HqFywhMDdd98dFl988fDf//43LLXUUmHhhRfOrnU86BjkUPAOkqbbGgaBD3zgA+GnP/1pJmYRtPkxderU8NGPfjTcf//92V+3Erz8bMsttwynnHJK+OY3vxk+8YlPlB6KgncYGe5tnwre3rgNey0F77Az0P3+FbzdM2u3hoJ3sDzdmgQkIIFhEahd8FJhys0NYhLxyE1Pcdx5551hscUWyyTas88+m1VSUqlbHDfeeGNW4cuI1bBR8M4wwwzTZFw/ML/yla+ET3/602HjjTfObt4QflREIv2qBhWTv/71r8MRRxwR9thjj6rFO/45QhopisRdY401wmc/+9mscujlL395tg2k8nnnnZcJyJtuuin7+1/+8pctJXbHO65pwaYIXuQtObvlllvCG97whrDffvuFrbfeetpDCHj/9re/DcyJn/zkJxkNlvnyl79cE5n+N/vPf/4zmydUXjJ3HRLohgAPszbffPPsenzbbbfVNocUvN1kxWWbRoAHzDxwXW+99aY9HIwx7rvvvtlDEd4A+fjHPx4OOuigtoKXh4xLLLFE4P/5Nw7nXnEoeJs2A1rHo+BNJ1f5SBW86eWtbsF72r2jVcG76YJW8KZ3FhixBCQggbEEahe87HKrrbYKP/zhDzNpi7wtjm9961thl112yV5n5MZpm222CSeeeOKY5b761a+GffbZZ7p2D4MWvFQB33XXXeEXv/hFOPzww7MK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0XbkyJEWC0C0Bu5e/2JAG5/RV3qGSxgHaXQO4SDcQlgeghiUMWPG2MsOnidyrb1iqCHuapzyxKbQA0rCfFj+VHTTCZyABN4E3kBdvgiIgAiIgAiIgAiIgAiIgAgkVAJbtmxxQ4cOddu2bTNRENftoUOHTMwlbuGrr76yW8NdSGQDbt7GjRubQze6Kl26tDmCqXfeecd16tQpoaIJyes+d+6cZebOmzfP+pQzZ04TDl955RVz7y5ZssQEQ4qsXr7/559/3OTJk129evWi3BN9RSRmX0Rd+k0erCp4BMjVff75592iRYvM+c7LlDRp0pgQj+ALe0Rf3NnEnlAS5oPHX0cSgfgiIIE3vkjrPCIgAiIgAiIgAiIgAiIgAiIgAlclwDJyXJwMhqpfv75tv2zZMhMOEQP37dsXIdLB/4AZM2Y0F/D999/vGAzmHwdw1RNrgxgRWLhwoatYsaLLmjWr9cYr8njJ5UWYZ4CXl+vqf5K9e/daTAfFMLAJEybE6Bq009UJ8NJk/PjxFoeBwEsMCi9K+P/OnTtbrygJ81dnqS1EIBQJSOANxa7omkRABERABERABERABERABEQgTAkw8Gns2LHmNGQI15133ulee+01N2zYMMdwNtyj0dX69etdkSJF7CtERyIEvCJCgJxYXKfk/fLdc889pyiAIPzGfv75Z8vZvfnmm92nn35qg9QoBnaRh4xD+9VXX432TOT5dunSxYauITQS5UBdunTJ3KWLFy92Z86csfgOojoYsKcKDgGGqsGdQtTF3UtJmA8OXx1FBOKbgATe+Cau84mACIiACIiACIiACIiACIiACFyRAEv6yedl+BaDnhD1EHYZ0DVo0CDXvn37aPctX768RQTwL8IgdfHiRYt0mDJlSpR9yHslOiBPnjzqRiwJbNy40WIaEGjpE+UN9yKGIzph9s8//7QIh2PHjrn+/fu7119/3fbDgU2/cXFHLkReIiJSpUoVyyvW7gzO47dP7MngwYOtf4j0sRHm//77bzdgwIAoL1Patm17Rde9OiECIhAcAhJ4g8NRRxEBERABERABERABERABERABEQgiAYReL2KhZcuWJux169bN9enTJ8pZWNrfqFEjE6iIA8DxSSEIzpw509166622BL1BgwaW54ub980333SIXGT2yhkanMb594xoBnJdv/jiC8tWjlxEMhDDkT17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QIwiY5R/165d63Ob+h+8Zs2abvbs2eYmJT5CFRgBsnkLFy5svHft2uUyZMgQ2I6RtorcM4R63Ni4c/fu3WsOU/86d+6cif/0tGvXribyqq6NQMeOHd2gQYPM2fvDDz+4JEmSBHyA2AjzPIOI9sSzbNy4US9TAqauDeOLgATe+CKt84iACIiACIiACIiACIiACIiACCRKAghHODhx8aZMmTLge8SB++OPP7q7777b8ltvuummCPuy3L9169aucePGjmXp/rV69WpXqlQpEylxohYoUCDg82pDZyIrGa5k515LIQ4fPnzYBMb7778/yq6e6D558mRzB/tXr169XM+ePV369OktWgC3rypwAhcuXHC5cuVy5GHPnz/fVa5cOfCd/ba8VmHeP/P3pZdechMmTIjRebWTCMQlAQm8cUlXxxYBERABERABERABERABERABERCBSAQQjFieP3r0aIc4TKVLl87E3BYtWvjyWd966y1zetaoUcPNmjWn4SRYAAAgAElEQVTLdxT2R9D95ptvXKNGjdyHH34oxnFM4Pjx46569eoRnNL58uVz7du3d7Vr13Y333yzXQED8ojYIL7BP4Lh4MGDNuTt77//dpMmTbJYDdW1Ezh79qybPn26vfS4loqNMO9l/t52220mzPOsqkQg1AhI4A21juh6REAEREAEREAEREAEREAEREAEEjUBskM7d+5s94jjM0+ePLbsmyFtOIC7devmmjVrZsvBcSsOHjzYtWvXzscEYZgc15gMmUrUYOPw5oheWLJkiUuePLlr2LChu/POO92iRYtMZCd24Z133jFHL5nIly9fdlu3bnX58+f3XREiMMLkY489ZgPebrjhhji8Wh3aIxBbYd4/85cXLt5zK8IiEGoEJPCGWkd0PSIgAiIgAiIgAiIgAiIgAiIgAomWwPnz5929997rEI5Yrt+jRw/fvZIpirg7b948x+AutiHPdd++fb7ohz/++MOGTCFcMYjNG8DmOUgTLbjreGNfffWVK1q0qImyK1assGgMrxDl33jjDYdD1OvZk08+adt5tW7dOstJJk5j/fr1JtzfeuutEnnjoaexFeY7dOhgL1iyZs1qcSr0TSUCoUhAAm8odkXXJAIiIAIiIAIiIAIiIAIiIAIikCgJbN682VycCEW///57tDmsc+bMsVgGavjw4a5NmzY+Fjh5GeSGkxTRceXKlSYclixZ0r355ps2CEoVXAII6Z06dTLeDNuKXERmtG3b1npFL3DvPvLII7YZERyFChWyzxDm6dv27dsdy/3pcffu3V2WLFmCe8E6mhGIrTC/e/duc2RfvHjRhiimTZvW+ks8ivKT9SMLNQISeEOtI7oeERABERABERABERABERABERCBREtg7969LkeOHC5p0qTuxIkT0QpFderUMUEpd+7c5gz13Lm7du1yefPmdf/8849LnTq169ixo+W64hB9//333blz58zV6x/nkGhBxuONkXHcpEkTE8/XrFkT5cw4rRHt6Q/RGkRoeDV+/HhfXixRHAjBiLuffPKJRTYQs/Hpp5+6EiVKxOMdhcepYiPMQ6hixYpu4cKF9owizOOap4hRwdmLczvyYMTwIKu7DEUCEnhDsSu6JhEQAREQAREQAREQAREQAREQgURLoHLlym7BggWuatWqbuzYsSbWUsQv4BQdM2aM/T+Zrwzt8qpChQpu8eLFLn369DbsK1u2bL7viHcoXLiwxTrgEi5YsGCi5RffN0ZfENYPHDjg+vTpYz1KkiSJXQYuTwbd4ewll5f/T5MmjX135swZc+0ePXrUlS5d2oRchEKvPv74Y1evXj2L7CCGw/+7+L7HxHi+2AjzS5cudeXKlTMsPFe45r2XKV26dDEXdrVq1dzs2bMVtZEYfzwJ8J4k8CbApumSRUAEREAEREAEREAEREAEREAEEi6Bv//+25yeCHzJkiVzTzzxhLvllltsYBeuXpb84x5EBPYKYReBlyXiiLtFihSJAoBjIhi//vrrjkFuquARwHn9wgsvuC1btrh77rnHBqidPXvWHNaI6lTkYXgIwbhIEeR37Njh7rrrrigXxGA2RGH6S16sKngEYirMX7p0yXKSydwlO3nZsmXmuPcK4Z4IDkR58rKrVKkSvIvWkUQghgQk8MYQnHYTAREQAREQAREQAREQAREQAREQgdgQ2LZtmwlEhw4dMqcnTkEGdCHifv/99+7BBx+0wxPJgIOUCICWLVu6kSNHRnvaFi1auA8++MDx76hRo2Jzado3GgLk6bJkn9xjRD5c0gzNY9Bd5syZTahFqKf27NnjiGQgv3XmzJmuZs2a0TLNlSuX27lzp5sxY4Z7/vnnxT3IBGIizA8bNsx6ytA8RF4E+sj16quv+vKxyV5WicD1JiCB93p3QOcXAREQAREQAREQAREQAREQAREQAedsCX+lSpVM2EVY8mrIkCGuffv2Npjtl19+sWFP0ZUnFrKcHIGKYik5+bynTp1y+fLlc3Xr1nWZMmUS7yARoC/05+WXXzbOXtFH+gnzr7/+Otpl/IcPH3b33XefDWJjG28wG/m8DNq74YYbzEGKc5isXlXMCFyLMM/gQ1628LzQVzKTo6v69eu7yZMnu1deecUhCKtE4HoTkMB7vTug84uACIiACIiACIiACIiACIiACIiAc7bUH5Fv//79rlevXq5bt2422AnBieXm1atXt8zP6OqLL75wZcuWta9wj2bPnt199dVX7qmnnjKXqVc4TJs3b+7eeustiYZB+NVt3LjR8nVZwj9x4kT33HPP2ZJ+Lzv5vffec61bt472TPS3X79+Jrgj3CPoemK+/w5EO/B7aNWqlfJeg9AzDnElYd5zwZOLffDgwQjRDN6pcWVnzJjRHTt2zE2YMMG99NJL9pVepgSpOTpMjAhI4I0RNu0kAiIgAiIgAiIgAiIgAiIgAiIgAsEncPLkSffOO++Y+IoAyAAvRCRq0KBBJkxFLhyK5Phu2rTJclzJc6Uef/xx+6xBgwaub9++JvySCbto0SJzCS9fvjza5efBv6vEfUTc1gi1derUcWXKlDHXLrELFJm9BQoUiALgyJEjJtz/9ddflpdMbjK9z5AhgwnyI0aMsCF8a9assd4R2YHAP23aNF8MROKmGrd3F50wj0BLtvLly5ctI3v06NHRXsS4ceNc06ZNzVH/22+/uVSpUullSty2S0cPgIAE3gAgaRMREAEREAEREAEREAEREAEREAERiG8CCE6IhTg7ceeS0duzZ88ol+Hl7rIdgi7ZsBQD3BALPUevt+PQoUNt6Tmi8Pr16+P7thL1+XDssmyfGI17773XwbpUqVJR7pnYBXJ306VLZ9m9KVKkcIiO9ITYhgMHDvj2uXDhgiMSgCxfDdAL3s/HX5h/5plnXPHixd26devseaNv9DFyIcjzcoTcbP9YDr1MCV5fdKSYEZDAGzNu2ksEREAEREAEREAEREAEREAEREAE4pwAQ71wbzLoqVOnTm7z5s0mAHrF/5csWdKdO3fOlvDj/PSqSJEiJuAOHjzYtWvXLsK1sg/uUPb3BOE4v5kwOAED8ehBjhw53Pz58y16AUd1kiRJfHfP923atLH/nzVrlqtRo4b9TQwHwjCifGTnL8Ii3zGA7/Tp0/avKngEvvvuO8fzQtWuXdtc0v7Pkncm4jYYcojDHpe2N4BNL1OC1wsdKWYEJPDGjJv2EgEREAEREAEREAEREAEREAEREIF4I3D27Flz8545c8ZcvIhRa9eudV26dLHsXpaW8/8ITV4h7jKk66abbnIIxV4uLN+/+uqrbvjw4W7JkiURPo+3GwqDE3377bfmyGX4HXEbWbJkcVOmTDF3KLEakQezgYR4jjfeeMNyeRHgM2fO7CNF/3F1IwATD6AKLgHiFn744QeHSF+lShXHsLty5cr5TkJkAz2jRo0a5cjr9UovU4LbCx3t2glI4L12ZtpDBERABERABERABERABERABERABOKdwL59+8zt+fXXX0c492OPPWYCbpo0aaJcE25DXIcIgvPmzXMsRfcKQTh37tyOIV6quCGwdOlSV69ePRuW519NmjRxRGsgvvvXv//+a1m+xDcg8q5atcplzZrVNrl06ZINcPPvYdxcdXgflR4wLO/zzz93NWvW9L1M8QYckmn90UcfRYCklynh/ZsJhbuXwBsKXdA1iIAIiIAIiIAIiIAIiIAIiIAIiEAABBD5EP8QnxgGRTYv+awIhQi/iLgIUNmzZ/cd7d1337WIBkReBMcSJUoEcCZtEiwCp06dcuPHj7eM3TvuuMORv8swNmrq1Kk2XA0ROGXKlD4hl23mzJlj4i7iIXm+qvgjgEuaSBScujxnFLEYr732mg0qjC4iQy9T4q8/OlNUAhJ49asQAREQAREQAREQAREQAREQAREQgURAYNKkSSbuIkIh6vpXnz59XPfu3U0oZLhUqlSpArrjjh072nC3atWqBbS9Nro2Ao0aNXITJkywvN7KlSv7diYmoGLFir4IDaI0Aq3q1au7N9980z3yyCOB7qLtrkBg//797osvvjCRt3Tp0patTMXFy5S///7bJU+eXL0QgRgRkMAbI2zaSQREQAREQAREQAREQAREQAREQARCi8CGDRtMjC1atKjl8UYu3L6IVWTAksEbSN1///1u9+7dtt9TTz0VyC7a5hoI9O/f33Xu3NmylPv16xdhT4au4cT+/fff3TfffGMZzFerw4cPuwwZMribb77Z8pqTJk16tV30fQwIxMXLFGIhsmXL5nr37u1zc8fg0rRLmBKQwBumjddti4AIiIAIiIAIiIAIiIAIiIAIJD4CiLArVqywSIYBAwZEyHhleBdDvF555RU3bNiwq978uXPn3G233ebIJD1y5IhiAq5K7No3OHHihMuTJ4/FNBDXQOarfzGkjWiHuXPnuqpVq171BDh9y5cv7x588EFzaqvihkBcvExBmEegX716tWJU4qZtifqoEngTdXt1cyIgAiIgAiIgAiIgAiIgAiIgAuFEAKEQJyC5rYUKFXK9evWyvNeffvrJ/kWonTZtmuXAXq22bNlix0B4Onjw4NU21/cxJLBt2zbr2W+//eZq1arlEOLz5s3rPvnkExN8b7jhBkdUAH24Wg0aNMgRq1G3bl03ZcqUq22u72NBIJgvU3huU6dObdm+p0+fdrfffnssrky7hiMBCbzh2HXdswiIgAiIgAiIgAiIgAiIgAiIQKIlQH4r7l2W///111+2XJ/hbFSxYsXcypUr7bOrFdmwZMRWqlTJxMbo6sKFCza8TRU7AsePH3cdOnQwURbHtH/PEHzffvvtgE5ABjPxAUOGDHFt27ZVzwKiFrONgvkyBdduqVKl5LyOWSu0l3NOAq9+BiIgAiIgAiIgAiIgAiIgAiIgAiKQCAkgGk6cONGtWbPGEbdQokQJ1759+4AHORHzwLA2XMAMaItcuIIrVKjgcuXK5QYPHuzI61XFjgCxCvSMIV5JkiRxNWrUsMF5gVb+/Plt3yst81+wYIEdr2HDhtbTlClTBnpobRcNgWC9TBkxYoRr06bNfzqvv/vuO5clSxaLTVGJQGQCEnj1mxABERABERABERABERABERABERABEYhCwBvKtnDhQvfss89G+B7RmExYXIwMAkM4zJ07tyheRwKXL1828Q9XNQPaIi/zHz58uLl6cQiT0zt9+nR35513XscrTjynju3LlObNm7sxY8Zc0Xk9a9YsV79+fZcqVSpzaBO3ohIBfwISePV7EAEREAEREAEREAEREAEREAEREAERiEIgbdq07ujRo5YNy99effzxxxbdcPHiRffkk0+62bNnu7vuuksErzOBnTt3mpv6gQcecPztFYIuwi4CL8XfAwcOjDCA7zpfetifvnDhwo7BbdE5rxmM2LlzZ/e///3PVatWzQTeFClShD0zAYhIQAKvfhEiIAIiIAIiIAIiIAIiIAIiIAIiIAIRCOBIvOeee1z69OndoUOH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fux1ZhEQAREQAREQAREQAREQAREQAREQgUgEGMI1fPhwWxaOuOfVvffea/EM27Zts2FeFM5BnIVDhw41URAhkGX+KVKkcMePH7f4BjJCn3rqKcuD9QqHKZEQDGm7/fbb1YNYEMDB+cYbb1juLsK8V57j2j9mg+8Q3l999VXH0DaEYXr13XffuV69ernu3btbxmuVKlXcggULIlwVLt8RI0ZYL1XBIRDdyxQEe8RaHNhkWvPSZNmyZe61116zAXr333+/xXCkS5fOYjd4RhF4vQF5RKrg7ub/efFCrrKeseD067+OIoE37hnrDCIgAiIgAiIgAiIgAiIgAiIgAiIgAtdAgOFNN998c4Q9WB6OaHv06NEoS8Vx7OIG9fJ6Gzdu7MaNG2f7k/lKHm+DBg1sMBhDwnAGe5ECuEa9uIBruERtGolA5J6NGjXKtWrVyrVo0cLxt38hHtKfbt26WU9x5tIXspgXL15sebw4RufNm2exHbh833nnHRMS6R29VsWeQHQvU7799lsbjMczcejQId9J6C+ifY8ePcwJTzwDvUPAZUAehfAbuTd33XWXiff8FjwROPZXriNEJiCBV78JERABERABERABERABERABERABERCBkCeA6If4t3TpUofzMLpCrGWo16xZs1z27NltE1y8uHcREL3P+BzXL8PAnnjiCbd+/fqQv/+EdoGI6ojrDGMjaiG6wv2L+Ed8A5EMFEIujmCyeidPnuzbjSxfYhx27txpvwOG6aliTyCyMM/LEmJOyLn+6aefopyA3GWc1qNHj3aXL192q1atciVLljTxPUOGDPas4bSuWrWqubV5qUKWNgMVEYJxz6uCT0ACb/CZ6ogiIAIiIAIiIAIiIAIiIAIiIAIiIAJBJoBYRDYoQ9hWrlzp7r777oDOgMCIgMtgMPJ7/QthiuNu3rzZFSxYMKDjaaPACXi5yYi3RGIEUgj45cqVMwcpYq7/8n76jshLzi95v6q4IYBrev/+/Ra7wd/RFbEaU6dOtZgTauPGjfayhMF6ZC57xWA9MpZxYb/++us2YE8VfAISeIPPVEcUAREQAREQAREQAREQAREQAREQARGIAwLvvfee5beSx4tYi+CLc3DGjBnm/GTZeORC3CULlBgARMGnn37atwnHIu93yZIlET6Pg0sPy0OSmYwgi4OzcuXKrmnTpi5t2rQ2TI1Bay1btoyWi+fWpldk8TKojUI4zJUrl3v44YctW1kVNwTmzp1rjluyrok9yZgxo+9EZCRHF7WAG5ve4uDdsmWL5fN69ddff9l3N954ow1l419VcAlI4A0uTx1NBERABERABERABERABERABERABEQgDgmwJLx169YmGvpXzZo1zSUYXY0cOdL2QSgk15VhbF6tXbvW5c6d25EVqgo+gbNnz7quXbtafuvFixd9JyBjmSFeiLWRi2xXxHuGeiHyIjImTZrUNkMg3LFjhytevHjwL1ZH9BGgX7wAoU/k7ObNm9f6gXiLyzq6lylevEamTJnMGZ85c2bf8fLly+e2b99uArAn2At38AhI4A0eSx1JBERABERABERABERABERABERABEQgHggwpIvl+oi9uANZGl6lShUTjr7++msTcRmq5p+5y0ApXL9sg0BVokSJeLhSncIjQIbu/Pnz3a5du2xIHv1CWKd69+5tztxq1aqZ05o6cuSIibxsX7FiReup952oxg8BBNnOnTtb5jHOXYpM6/Hjx5voG7l4LuvUqWOOekRens+sWbPaZmT9Llu2LMLLlfi5i/A4iwTe8Oiz7lIEREAEREAEREAEREAEREAEREAEwoLApEmTTNx97bXXHKKuf/Xp08cGRBHx8OOPP7pUqVKFBZNQv0lyXn/++Wdz5955552+yz18+LANajt48KBlvSI2quKfAOL8tm3bzM1btGhRi9egyOAlIoWBeClTpvQJuYi/c+bMMXGXiBSeN1XcEpDAG7d8dXQREAEREAEREAEREAEREAEREAEREIF4JLBhwwZXuHBhE6KIX4hcZcuWdV988YUbOnSoLUEPtHCUIkDiCr7lllsC3U3bBUCgfPnyloOMs5r++Bc9JI6BoXr04FpcvPv27bO82CxZskSbGxvApWmT/yDQqFEjN2HCBHNmk7Hs1T///GOuay/bmn9VcUtAAm/c8tXRRUAEREAEREAEREAEREAEREAEREAE4pnAU0895VasWGGRDAMGDIggCr7xxhs2kO2VV15xw4YNu+qVXbhwwTVs2NBNmzbNtsW9yDJ0cmVZhq6KPYHVq1fbMLZ06dK5zz//3D300EO+g547d84lT57c/h+3aCCu6/3797uqVataXAd13333uZdfftlc3SlSpIj9BesIRqB///7mqu7SpYvr169fBCoMXeNlyO+//+6++eYbRwZvIEW/Gax36tQp24f4leiGugVyrHDaRgJvOHVb9yoCIiACIiACIiACIiACIiACIiACYUAAIfC5556z5eGFChVyvXr1cmXKlHE//fST/YsTFME2uhzRyHg6duzoBg0aZEPYEA337NnjECQRCnEBN2nSJAyIxv0tTpw40TVr1szdeOONJsy3aNHCXLtEagwcONA98MADbufOnQFdyGOPPeY2b95s+5C1jAuYSA6Gfk2fPt1EQ1XsCZw4ccLlyZPHhHfiGhh06F9w3rhxo5s7d649O1erQ4cOuZIlS7q9e/f6NqWHiMfVq1e/2u5h/b0E3rBuv25eBERABERABERABERABERABERABBInAZaJ497FZcggNvJDGfREFStWzIa08dnVKnXq1CZg+ccHbNq0ydWvX98GgI0YMcK1atXqaofR9wEQ+Pbbb13Lli3dV199ZVt7PSOW4ZNPPnHPPvvsVY+yY8cO9/DDD7vbb7/d/fLLLybMMyDs448/tj7xG2D4F8K/KvYEyOblZQo5vbVq1XI45PPmzWv9QvDFfYujOkOGDFc9GSIuYnD+/Pld27Zt7WXKBx984I4ePerq1q1rw92SJEly1eOE4wYSeMOx67pnERABERABERABERABERABERABEQgTAsePH3e4Q9esWeNY/o2js3379r5l/1fDwICoY8eOObJ9GfjlFS5gogTOnj1rQ8AQglXBIUBG8qxZs9zu3bttQFfr1q0tUzmQwqmbO3duG9aGMHjrrbf6duO4ZPwWLFjQHL6q4BDgGevQoYObMmWK+/fffyO8TEHwffvttwM6EVEcPKOI9F5Mx5kzZxxZv7Nnz7Z/P/zww4COFW4bSeANt47rfkVABERABERABERABERABERABERABAIm4GX2MrgN16+/YEgWL1EP3jCpgA+qDeOUgBcNQNTD4MGDI5wrffr05jY9f/58hF7G6QWFycER13mZQvYxTtsaNWq4Bg0aBHz3999/v4n68+bNc1WqVPHthxsfwZeIFeIbsmXLFvAxw2VDCbzh0mndpwiIgAiIgAiIgAiIgAiIgAiIgAiIwDUTQAjEubt9+3ZXvnx5E5+SJk1qx2Gpf9++fW1oW4ECBa752NohbgiQ1UvP/vzzT9ejRw/Xs2dP34nGjh1rLlDymTW8K274x/SoEyZMMJcuw/boD5nJXr34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dxrdoCpevLjdc889PtKhYsWK/o+6tZOrOnXq2Jo1a3wur+bzUllHgIA366wVT4oAAggggAACCCCAAAIIIIAAAgikWUCBYIcOHWzMmDGmztC4tWrVKh8BoI3UNKdV9frrr/tmbOrG/c9//mOFCxdO9hkC3aAKknU/Km0Cjz/+uM2aNcs3R1PYHigF9LJWaeO1F154wUP1lJY6fgsWLGg///yz7d+/32655ZaUXoLjwyhAwBtGfG6NAAIIIIAAAggggAACCCCAAAIIZLSA5uhqnu6ECROsW7du8W7fuHFj/5p/3rx5bfDgwda6dWsrV66cz28dPny49evXL9nHVcdvqVKlbM+ePT42QPei0iagdZo4caLP1FVHbqAU0I8fP97nHNerV89HOGi+ckor0NWtc3fu3JnS0zk+zAIEvGFeAG6PAAIIIIAAAggggAACCCCAAAIIZKSANtzSDF116arjM25plqtmsI4YMcJOnz7tXbv6d4kSJUybs2XPnj3ZRw3M+M2TJ48dOnTIcubMmew5HHB5gdGjR/tIjY8++shq1KgR7+BPP/3UevToYevXr7drrrnGOnfubC+++KLlz58/ZFaNc9i6dWvQvxMhX4QDwyZAwBs2em6MAAIIIIAAAggggAACCCCAAAIIZLzAmTNnLHfu3D52QV2hwUrBrLp1Z86caZrzqkBYM2BLly592QfWsVWrVvWwUN2lGgNBpV1g+fLlPnv3ch3R8+bN8xBYIxYU7irkVdir0PdytWjRIp+5myNHDj9XoxqorCVAwJu11ounRQABBBBAAAEEEEAAAQQQQAABBNIs8Mknn5iCPY1duFxt2rTJu0M3btxo1157rXXt2tUGDRrkIxyCVWBeb65cueybb76xQoUKpflZuYB5yP7WW2/Z+fPnfYO8pOqnn36yUaNG+T9nz571cQ0a26DxDcFKYb9m9mqtnn32WVOnMJX1BAh4s96a8cQIIIAAAggggAACCCCAAAIIIIBAhgkoXJw9e7Zv5vXtt99a/fr1TR2lCeurr76yypUrm0LDkSNHWt++fTPsGblRfIEDBw64/5w5c/wH6qjW2iSsjh072uTJk33jvM8//9zy5csHZRYUIODNgovGIyOAAAIIIIAAAggggAACCCCAAAIZLaDgVrN5NSqgZs2a8W6vztLatWubOoM1I3bdunV29dVXZ/Qjcr8EAprZu2TJEl+3hLVw4UJ7+OGH/Y+XLl3q60plTQEC3qy5bjw1AggggAACCCCAAAIIIIAAAgggkCkEFO4+9NBDtmLFCp/tu2XLFitVqlSmeDYeIriA1kprprXTLObXXnsNqiwsQMCbhRePR0cAAQQQQAABBBBAAAEEEEAAAQTCKXD69Glr1qxZbLir0Q3Vq1cP5yNx72QE1NGrNVO427JlS99Ij27rrP3XhoA3a68fT48AAggggAACCCCAAAIIIIAAAgiERWDt2rW+4deePXt8duuyZcusWrVqYXkWbpq8gEZsxMTE2KRJk3zTtjZt2tj06dMJd5Ony/RHEPBm+iXiARFAAAEEEEAAAQQQQAABBBBAAIHMI7Bz504bN26cTZs2zYPCxo0be2h48803Z56H5EliBc6dO2dz5861IUOGeBifP39+X7+2bduiFCECBLwRspC8BgIIIIAAAggggAACCCCAAAIIIJCeAj/++KO1aNHCxzGoypcvb4MHD7bmzZun5225dhoEZs2aZT169LDjx49b9uzZPdQdOnSoFSpUKA1X5dTMJkDAm9lWhOdBAAEEEEAAAQQQQAABBBBAAAEEMqnAN998Y1OmTLH69etb7dq17aqrrsqkT8pjSeDSpUu+Xuri1bzdggULAhOBAgS8EbiovBICCCCAAAIIIIAAAggggAACCCCAAAIIRIcAAW90rDNviQACCCCAAAIIIIAAAggggAACCCCAAAIRKEDAG4GLyishgAACCCCAAAIIIIAAAggggAACCCCAQHQIEPBGxzrzlggggAACCCCAAAIIIIAAAggggAACCCAQgQIEvBG4qLwSAggggAACCCCAAAIIIIAAAggggAACCESHAAFvdKwzb4kAAggggAACCCCAAAIIIIAAAggggAACEShAwBuBi8orIYAAAggggAACCCCAAAIIIIAAAggggEB0CBDwRsc685YIIIAAAggggAACCCCAAAIIIIAAAgggEIECBLwRuKi8EgIIIIAAAggggAACCCCAAAIIIIAAAghEhwABb3SsM2+JAAIIIIAAAggggAACCCCAAAIIIIAAAhEoQMAbgYvKKyGAAAIIIIAAAggggAACCCCAAAIIIIBAdAgQ8EbHOvOWCCCAAAIIIIAAAggggAACCCCAAAIIIBCBAgS8EbiovBICCCCAAAIIIIAAAggggAACCCCAAAIIRIcAAW90rDNviQACCCCAAAIIIIAAAggggAACCCCAAAIRKEDAG4GLyishgAACCCCAAAIIIIAAAggggAACCCCAQHQIEPBGxzrzlggggAACCCCAAAIIIIAAAggggAACCCAQgQIEvBG4qLwSAggggAACCCCAAAIIIIAAAggggAACCESHAAFvdKwzb4kAAggggAACCCCAAAIIIIAAAggggAACEShAwBuBi8orIYAAAggggAACCCCAAAIIIIAAAggggEB0CBDwRsc685YIIIAAAggggAACCCCAAAIIIIAAAgggEIECBLwRuKi8EgIIIIAAAggggAACCCCAAAIIIIAAAghEhwABb3SsM2+JAAIIIIAAAggggAACCCCAAAIIIIAAAhEoQMAbgYvKKyGAAAIIIIAAAggggAACCCCAAAIIIIBAdAgQ8EbHOvOWCCCAAAIIIIAAAggggAACCCCAAAIIIBCBAgS8EbiovBICCCCAAAIIIIAAAggggAACCCCAAAIIRIcAAW90rDNviQACCCCAAAIIIIAAAggggAACCCCAAAIRKEDAG4GLyishgAACCCCAAAIIIIAAAggggAACCCCAQHQIEPBGxzrzlggggAACCCCAAAIIIIAAAggggAACCCAQgQL/B8WqwDyU+6tvAAAAAElFTkSuQmCC"
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "correlation_fig = plot_ranking_correlations(correlations)\n",
+ "correlation_fig.show()\n"
+ ]
+ },
+ {
+ "cell_type": "raw",
+ "metadata": {},
+ "source": [
+ "In this case, only two of the three rankings show similar results.\n"
+ ]
+ }
+ ],
+ "metadata": {
+ "kernelspec": {
+ "display_name": "Python 3 (ipykernel)",
+ "language": "python",
+ "name": "python3"
+ },
+ "language_info": {
+ "codemirror_mode": {
+ "name": "ipython",
+ "version": 3
+ },
+ "file_extension": ".py",
+ "mimetype": "text/x-python",
+ "name": "python",
+ "nbconvert_exporter": "python",
+ "pygments_lexer": "ipython3",
+ "version": "3.7.13"
+ },
+ "vscode": {
+ "interpreter": {
+ "hash": "37d01894bb315c73bf6fde5551d8a97078996f38b23395695bd1998fb0ae5507"
+ }
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 4
+}
\ No newline at end of file
diff --git a/doc/user_guide/mitigation.ipynb b/examples/mitigation_user_guide.ipynb
similarity index 91%
rename from doc/user_guide/mitigation.ipynb
rename to examples/mitigation_user_guide.ipynb
index 60a6d02..c93bbc3 100644
--- a/doc/user_guide/mitigation.ipynb
+++ b/examples/mitigation_user_guide.ipynb
@@ -1,49 +1,46 @@
{
"cells": [
{
- "cell_type": "markdown",
+ "cell_type": "raw",
"metadata": {},
"source": [
- "(bias mitigation)=\n",
+ ".. _bias mitigation:\n",
"\n",
- "# Bias Mitigation (Debias)\n",
+ "Bias Mitigation (Debias)\n",
+ "========================\n",
"\n",
"The following guide is designed to present the more general details on \n",
"using the package to mitigate (debias) bias in word embedding models. \n",
"The following sections show:\n",
"\n",
- "- run {class}`~wefe.debias.hard_debias.HardDebias` mitigation method on an\n",
+ "- run :class:`~wefe.debias.hard_debias.HardDebias` mitigation method on an\n",
" embedding model to mitigate gender bias (using the ``fit-transform`` interface).\n",
"- apply the ``target`` parameter when executing the transformation.\n",
"- apply the ``ignore`` parameter when executing the transformation.\n",
"- apply the ``copy`` parameter when executing the transformation.\n",
- "- run {class}`~wefe.debias.multiclass_hard_debias.MulticlassHardDebias` mitigation \n",
+ "- run :class:`~wefe.debias.multiclass_hard_debias.MulticlassHardDebias` mitigation \n",
" method on an word embedding model to mitigate ethnic bias.\n",
"\n",
- ":::{note}\n",
+ ".. note::\n",
"\n",
- "For a list of metrics implemented in WEFE, refer to the\n",
- "[debias section](debias-API) of the API reference. \n",
+ " For a list of metrics implemented in WEFE, refer to the\n",
+ " `debias section ` of the API reference. \n",
"\n",
- ":::\n",
"\n",
+ "Hard Debias\n",
+ "-----------\n",
"\n",
- "## Hard Debias\n",
"\n",
"Hard debias is a method that allows mitigating biases through geometric operations on embeddings. \n",
"This method is binary because it only allows 2 classes of the same bias criterion,\n",
"such as male or female.\n",
"\n",
- ":::{note}\n",
- "\n",
- "For a multiclass debias (such as for Latinos, Asians and Whites), it is\n",
- "recommended to visit\n",
- "{class}`~wefe.debias.multiclass_hard_debias.MulticlassHardDebias` class.\n",
- "\n",
- ":::\n",
- "\n",
- "\n",
+ ".. note::\n",
"\n",
+ " For a multiclass debias (such as for Latinos, Asians and Whites), it is\n",
+ " recommended to visit\n",
+ " :class:`~wefe.debias.multiclass_hard_debias.MulticlassHardDebias` class.\n",
+ " \n",
"\n",
"The main idea of this method is:\n",
"\n",
@@ -51,6 +48,7 @@
"these could be e.g. ``[['woman', 'man'], ['she', 'he'], ...]``\n",
"\n",
"2. Neutralize the bias subspace of embeddings that should not be biased.\n",
+ "\n",
"First, it is defined a set of words that are correct to be related to the bias\n",
"criterion: the *criterion specific gender words*.\n",
"For example, in the case of gender, *gender specific* words are:\n",
@@ -64,25 +62,29 @@
"\n",
"The neutralization is carried out under the following operation:\n",
"\n",
- "- $u$ : embedding\n",
- "- $v$ : bias direction\n",
+ "- :math:`u` : embedding\n",
+ "- :math:`v`: bias direction\n",
"\n",
"First calculate the projection of the embedding on the bias subspace.\n",
"\n",
+ ".. math::\n",
"\n",
- "$$\\text{bias_subspace} = \\frac{v \\cdot (v \\cdot u)}{(v \\cdot v)}$$\n",
+ " \\text{bias subspace} = \\frac{v \\cdot (v \\cdot u)}{(v \\cdot v)}\n",
"\n",
"Then subtract the projection from the embedding.\n",
"\n",
- "$$u' = u - \\text{bias_subspace}$$\n",
+ ".. math::\n",
+ "\n",
+ " u' = u - \\text{bias subspace}\n",
+ "\n",
+ "3. Equalizate the embeddings with respect to the bias direction.\n",
"\n",
- " 3. Equalizate the embeddings with respect to the bias direction.\n",
- " Given an equalization set (set of word pairs such as ``['she', 'he'],\n",
- " ['men', 'women'], ...``, but not limited to the definitional set) this step\n",
- " executes, for each pair, an equalization with respect to the bias direction.\n",
- " That is, it takes both embeddings of the pair and distributes them at the same\n",
- " distance from the bias direction, so that neither is closer to the bias direction\n",
- " than the other.\n",
+ "Given an equalization set (set of word pairs such as ``['she', 'he'],\n",
+ "['men', 'women'], ...``, but not limited to the definitional set) this step\n",
+ "executes, for each pair, an equalization with respect to the bias direction.\n",
+ "That is, it takes both embeddings of the pair and distributes them at the same\n",
+ "distance from the bias direction, so that neither is closer to the bias direction\n",
+ "than the other.\n",
"\n",
"\n",
"The fit parameters define how the neutralization will be calculated. In\n",
@@ -119,7 +121,7 @@
]
},
{
- "cell_type": "markdown",
+ "cell_type": "raw",
"metadata": {},
"source": [
"Load the required word sets."
@@ -163,7 +165,7 @@
]
},
{
- "cell_type": "markdown",
+ "cell_type": "raw",
"metadata": {},
"source": [
"Instantiate and fit the parameters of the debias transformation.\n",
@@ -196,10 +198,11 @@
]
},
{
- "cell_type": "markdown",
+ "cell_type": "raw",
"metadata": {},
"source": [
- "### Mitigation Parameters\n",
+ "Mitigation Parameters\n",
+ "~~~~~~~~~~~~~~~~~~~~~\n",
"\n",
"The parameters of the transform method are relatively standard for all\n",
"methods. The most important ones are ``target``, ``ignore`` and\n",
@@ -224,7 +227,10 @@
" the model and run debias on the copy. If ``False``, the method is\n",
" applied on the original model, causing the vectors to mutate.\n",
"\n",
- " **WARNING:** Setting copy with ``True`` requires at least 2x RAM of\n",
+ "\n",
+ ".. warning::\n",
+ "\n",
+ " WARNING:** Setting copy with ``True`` requires at least 2x RAM of\n",
" the size of the model. Otherwise the execution of the debias may raise\n",
" ``MemoryError``.\n",
"\n",
@@ -258,13 +264,14 @@
]
},
{
- "cell_type": "markdown",
+ "cell_type": "raw",
"metadata": {},
"source": [
- "### Measuring the Decrease of Bias\n",
+ "Measuring the Decrease of Bias\n",
+ "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n",
"\n",
- "Using the metrics displayed in the {ref}`bias measurement` user guide, we\n",
- "can measure whether or not there was a change in the measured gender bias\n",
+ "Using the metrics and queries shown in the :ref:`bias measurement` user guide, we\n",
+ "can measure whether there was a change in the measured gender bias\n",
"between the original model and the debiased model."
]
},
@@ -283,7 +290,7 @@
]
},
{
- "cell_type": "markdown",
+ "cell_type": "raw",
"metadata": {},
"source": [
"Next, we measure the gender bias exposed by query 1 (Male terms and Female terms wrt Career and Family) with respect to the debiased model and the original."
@@ -332,7 +339,7 @@
]
},
{
- "cell_type": "markdown",
+ "cell_type": "raw",
"metadata": {},
"source": [
"The above results show that there was a decrease in the measured gender bias.\n",
@@ -389,17 +396,18 @@
]
},
{
- "cell_type": "markdown",
+ "cell_type": "raw",
"metadata": {},
"source": [
"Again, the above results show that there was a decrease in the measured gender bias."
]
},
{
- "cell_type": "markdown",
+ "cell_type": "raw",
"metadata": {},
"source": [
- "### Target Parameter\n",
+ "Target Parameter\n",
+ "~~~~~~~~~~~~~~~~\n",
"\n",
"If a set of words is specified in ``target`` parameter, the debias method is performed\n",
"only on the embeddings associated with this set. \n",
@@ -459,7 +467,7 @@
]
},
{
- "cell_type": "markdown",
+ "cell_type": "raw",
"metadata": {},
"source": [
"Next, a bias test is run on the mitigated embeddings associated with the\n",
@@ -513,7 +521,7 @@
]
},
{
- "cell_type": "markdown",
+ "cell_type": "raw",
"metadata": {},
"source": [
"However, if a bias test is run with words that were outside the ``target``\n",
@@ -521,13 +529,12 @@
"metric scores lies in the fact that the equalize sets were still\n",
"equalized.\n",
"\n",
- ":::{warning}\n",
- "\n",
- "The equalization process can modify embeddings that have not been marked in the target.\n",
+ ".. warning::\n",
"\n",
- "Equalization can be deactivated by delivering an empty equalize set (``[]``)\n",
- "\n",
- ":::"
+ " The equalization process can modify embeddings that have not been marked in the target.\n",
+ " In Hard Debias, equalization can be deactivated by delivering an empty \n",
+ " equalize set (``[]``).\n",
+ "\n"
]
},
{
@@ -578,18 +585,19 @@
]
},
{
- "cell_type": "markdown",
+ "cell_type": "raw",
"metadata": {},
"source": [
"Note that the equalization caused the bias of the debiased model to be slightly larger than the original."
]
},
{
- "cell_type": "markdown",
+ "cell_type": "raw",
"metadata": {},
"source": [
"\n",
- "### Saving the Debiased Model\n",
+ "Saving the Debiased Model\n",
+ "~~~~~~~~~~~~~~~~~~~~~~~~~\n",
"\n",
"To save the mitigated model one must access the ``KeyedVectors`` (the\n",
"gensim object that contains the embeddings) through ``wv`` and then use\n",
@@ -608,10 +616,11 @@
]
},
{
- "cell_type": "markdown",
+ "cell_type": "raw",
"metadata": {},
"source": [
- "## Multiclass Hard Debias\n",
+ "Multiclass Hard Debias\n",
+ "----------------------\n",
"\n",
"Multiclass Hard Debias is a generalized version of Hard Debias that\n",
"enables multiclass debiasing. Generalized refers to the fact that this\n",
@@ -680,10 +689,13 @@
]
},
{
- "cell_type": "markdown",
+ "cell_type": "raw",
"metadata": {},
"source": [
- "### Measuring the Decrease of Bias\n"
+ "Measuring the Decrease of Bias\n",
+ "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n",
+ "\n",
+ "The following code compares the execution of a query measuring ethnic bias in the original model vs. in the debiased model."
]
},
{
@@ -738,6 +750,63 @@
" round(abs(biased_results_2[\"weat\"]), 3),\n",
")\n"
]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 1,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# import the modules\n",
+ "from wefe.query import Query\n",
+ "from wefe.word_embedding_model import WordEmbeddingModel\n",
+ "from wefe.metrics.WEAT import WEAT\n",
+ "import gensim.downloader as api\n",
+ "\n",
+ "# load glove\n",
+ "twitter_25 = api.load('glove-twitter-25')\n",
+ "model = WordEmbeddingModel(twitter_25, 'glove twitter dim=25')"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 2,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# create the word sets\n",
+ "target_sets = [['she', 'woman', 'girl'], ['he', 'man', 'boy']]\n",
+ "target_sets_names = ['Female Terms', 'Male Terms']\n",
+ "\n",
+ "attribute_sets = [['poetry','dance','literature'], ['math', 'physics', 'chemistry']]\n",
+ "attribute_sets_names = ['Arts', 'Science']\n",
+ "\n",
+ "# create the query\n",
+ "query = Query(target_sets, attribute_sets, target_sets_names,\n",
+ " attribute_sets_names)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 3,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "{'query_name': 'Female Terms and Male Terms wrt Arts and Science', 'result': 0.25956966479619337, 'weat': 0.25956966479619337, 'effect_size': 1.4524819039631838, 'p_value': nan}\n"
+ ]
+ }
+ ],
+ "source": [
+ "# instance a WEAT metric\n",
+ "weat = WEAT()\n",
+ "result = weat.run_query(query, model)\n",
+ "print(result)\n",
+ "\n",
+ "\n"
+ ]
}
],
"metadata": {
@@ -756,7 +825,7 @@
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
- "version": "3.8.13"
+ "version": "3.7.13"
},
"vscode": {
"interpreter": {
@@ -765,5 +834,5 @@
}
},
"nbformat": 4,
- "nbformat_minor": 2
+ "nbformat_minor": 4
}
diff --git a/requirements-dev.txt b/requirements-dev.txt
index df9d23d..72cb71c 100644
--- a/requirements-dev.txt
+++ b/requirements-dev.txt
@@ -1,11 +1,13 @@
-pytest
+pytest>=7.0.0
pytest-cov
coverage
-flake8
-black
-mypy
-sphinx
-sphinx-gallery
-sphinx-rtd-theme
-numpydoc
-torch
\ No newline at end of file
+# flake8==5.0.4
+black==22.6.0
+isort==5.10.1
+mypy==0.812
+Sphinx==5.0.2
+sphinx-gallery==0.11.1
+sphinx-rtd-theme==1.0.0
+numpydoc==1.4.0
+docutils==0.16
+torch==1.12.1
\ No newline at end of file
diff --git a/requirements.txt b/requirements.txt
index 40dd8ea..20a4782 100644
--- a/requirements.txt
+++ b/requirements.txt
@@ -1,10 +1,10 @@
-numpy
-scipy
+numpy>=1.20
+scipy>=1.3.2
scikit-learn>=0.23.2
-pandas
+pandas>=0.25.1
gensim>=3.8.3
-plotly
-six
-requests
-semantic_version
-tqdm
\ No newline at end of file
+plotly>=4.2.0
+requests>=2.22.0
+tqdm>=4.30.0
+semantic_version>=2.8.0
+six
\ No newline at end of file
diff --git a/setup.py b/setup.py
index e409e8d..c066e36 100644
--- a/setup.py
+++ b/setup.py
@@ -52,8 +52,7 @@
"Programming Language :: Python :: 3.10",
]
EXTRAS_REQUIRE = {
- "tests": ["pytest", "pytest-cov"],
- "docs": ["sphinx", "sphinx-gallery", "sphinx_rtd_theme", "numpydoc", "matplotlib"],
+ "pytorch": ["torch"],
}
setup(
diff --git a/test-results/junit.xml b/test-results/junit.xml
deleted file mode 100644
index 7bc6698..0000000
--- a/test-results/junit.xml
+++ /dev/null
@@ -1 +0,0 @@
-
\ No newline at end of file
diff --git a/tests/debias/__init__.py b/tests/debias/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/tests/conftest.py b/tests/debias/conftest.py
similarity index 61%
rename from tests/conftest.py
rename to tests/debias/conftest.py
index d1aa95e..35f4344 100644
--- a/tests/conftest.py
+++ b/tests/debias/conftest.py
@@ -2,9 +2,7 @@
from typing import Dict, List, Union
import numpy as np
-import pkg_resources
import pytest
-from gensim.models import KeyedVectors
from wefe.datasets.datasets import fetch_debias_multiclass, fetch_debiaswe, load_weat
from wefe.query import Query
from wefe.utils import load_test_model
@@ -15,13 +13,6 @@
# -------------------------------------------------------------------------------------
-@pytest.fixture
-def keyed_vector_model() -> KeyedVectors:
-
- test_model = KeyedVectors.load("./wefe/datasets/data/test_model.kv")
- return test_model
-
-
@pytest.fixture
def model() -> WordEmbeddingModel:
"""Load a subset of Word2vec as a testing model.
@@ -99,149 +90,6 @@ def mhd_ethnicity_equalize_sets(multiclass_debias_wordsets) -> List[List[str]]:
return list(multiclass_debias_wordsets["ethnicity_analogy_templates"].values())
-# -------------------------------------------------------------------------------------
-# Queries
-# -------------------------------------------------------------------------------------
-
-
-@pytest.fixture
-def query_2t1a_1(weat_wordsets: Dict[str, List[str]]) -> Query:
- weat_wordsets = load_weat()
-
- query = Query(
- [weat_wordsets["flowers"], weat_wordsets["insects"]],
- [weat_wordsets["pleasant_5"]],
- ["Flowers", "Insects"],
- ["Pleasant"],
- )
- return query
-
-
-@pytest.fixture
-def query_2t2a_1(weat_wordsets: Dict[str, List[str]]) -> Query:
- """Generate a Flower and Insects wrt Pleasant vs Unpleasant test query.
-
- Parameters
- ----------
- weat_wordsets : Dict[str, List[str]]
- The word sets used in WEAT original work.
-
- Returns
- -------
- Query
- The generated query.
- """
- query = Query(
- [weat_wordsets["flowers"], weat_wordsets["insects"]],
- [weat_wordsets["pleasant_5"], weat_wordsets["unpleasant_5"]],
- ["Flowers", "Insects"],
- ["Pleasant", "Unpleasant"],
- )
- return query
-
-
-@pytest.fixture
-def query_2t2a_uppercase(weat_wordsets: Dict[str, List[str]]) -> Query:
- """Generate a Flower and Insects wrt Pleasant vs Unpleasant test query.
-
- Parameters
- ----------
- weat_wordsets : Dict[str, List[str]]
- The word sets used in WEAT original work.
-
- Returns
- -------
- Query
- The generated query.
- """
- query = Query(
- [
- [s.upper() for s in weat_wordsets["flowers"]],
- [s.upper() for s in weat_wordsets["insects"]],
- ],
- [
- [s.upper() for s in weat_wordsets["pleasant_5"]],
- [s.upper() for s in weat_wordsets["unpleasant_5"]],
- ],
- ["Flowers", "Insects"],
- ["Pleasant", "Unpleasant"],
- )
- return query
-
-
-@pytest.fixture
-def query_3t2a_1(weat_wordsets: Dict[str, List[str]]) -> Query:
- query = Query(
- [
- weat_wordsets["flowers"],
- weat_wordsets["insects"],
- weat_wordsets["instruments"],
- ],
- [weat_wordsets["pleasant_5"], weat_wordsets["unpleasant_5"]],
- ["Flowers", "Weapons", "Instruments"],
- ["Pleasant", "Unpleasant"],
- )
-
- return query
-
-
-@pytest.fixture
-def query_4t2a_1(weat_wordsets: Dict[str, List[str]]) -> Query:
- query = Query(
- [
- weat_wordsets["flowers"],
- weat_wordsets["insects"],
- weat_wordsets["instruments"],
- weat_wordsets["weapons"],
- ],
- [weat_wordsets["pleasant_5"], weat_wordsets["unpleasant_5"]],
- ["Flowers", "Insects", "Instruments", "Weapons"],
- ["Pleasant", "Unpleasant"],
- )
-
- return query
-
-
-@pytest.fixture
-def query_1t4_1(weat_wordsets: Dict[str, List[str]]) -> Query:
- query = Query(
- [weat_wordsets["flowers"]],
- [
- weat_wordsets["pleasant_5"],
- weat_wordsets["pleasant_9"],
- weat_wordsets["unpleasant_5"],
- weat_wordsets["unpleasant_9"],
- ],
- ["Flowers"],
- ["Pleasant 5 ", "Pleasant 9", "Unpleasant 5", "Unpleasant 9"],
- )
- return query
-
-
-@pytest.fixture
-def query_2t1a_lost_vocab_1(weat_wordsets: Dict[str, List[str]]) -> Query:
- query = Query(
- [["bla", "asd"], weat_wordsets["insects"]],
- [weat_wordsets["pleasant_5"]],
- ["Flowers", "Insects"],
- ["Pleasant"],
- )
-
- return query
-
-
-@pytest.fixture
-def query_2t2a_lost_vocab_1(weat_wordsets: Dict[str, List[str]]) -> Query:
- query = Query(
- [["bla", "asd"], weat_wordsets["insects"]],
- [weat_wordsets["pleasant_5"], weat_wordsets["unpleasant_5"]],
- ["Flowers", "Insects"],
- ["Pleasant", "Unpleasant"],
- )
-
- return query
-
-
# --------------------------------------------------------------------------------------
# 2 target 2 attribute gender, ethnicity and religion queries
# --------------------------------------------------------------------------------------
diff --git a/tests/debias/test_base_debias.py b/tests/debias/test_base_debias.py
index 0835aea..653685c 100644
--- a/tests/debias/test_base_debias.py
+++ b/tests/debias/test_base_debias.py
@@ -25,30 +25,36 @@ def test_check_transform_args_wrong_inputs(
# type checking function
with pytest.raises(
- TypeError, match=r"model should be a WordEmbeddingModel instance, got .*",
+ TypeError,
+ match=r"model should be a WordEmbeddingModel instance, got .*",
):
bd._check_transform_args(None)
with pytest.raises(
- TypeError, match=r"target should be None or a list of strings, got .*",
+ TypeError,
+ match=r"target should be None or a list of strings, got .*",
):
bd._check_transform_args(model, target=1)
with pytest.raises(
- TypeError, match=r"All elements in target should be strings, .*",
+ TypeError,
+ match=r"All elements in target should be strings, .*",
):
bd._check_transform_args(model, target=gender_specific + [10])
with pytest.raises(
- TypeError, match=r"ignore should be None or a list of strings, got .*",
+ TypeError,
+ match=r"ignore should be None or a list of strings, got .*",
):
bd._check_transform_args(model, ignore=1)
with pytest.raises(
- TypeError, match=r"All elements in ignore should be strings, .*",
+ TypeError,
+ match=r"All elements in ignore should be strings, .*",
):
bd._check_transform_args(model, ignore=gender_specific + [10])
with pytest.raises(
- TypeError, match=r"copy should be a bool, got .*",
+ TypeError,
+ match=r"copy should be a bool, got .*",
):
bd._check_transform_args(model, copy=None)
diff --git a/tests/debias/test_double_hard_debias.py b/tests/debias/test_double_hard_debias.py
index 40802f5..ce76ff6 100644
--- a/tests/debias/test_double_hard_debias.py
+++ b/tests/debias/test_double_hard_debias.py
@@ -14,21 +14,25 @@ def test_double_hard_debias_checks(
):
with pytest.raises(
- TypeError, match=r"verbose should be a bool, got .*",
+ TypeError,
+ match=r"verbose should be a bool, got .*",
):
DoubleHardDebias(verbose=1)
with pytest.raises(
- TypeError, match=r"n_words should be int, got: .*",
+ TypeError,
+ match=r"n_words should be int, got: .*",
):
DoubleHardDebias(n_words=2.3)
with pytest.raises(
- TypeError, match=r"n_components should be int, got: .*",
+ TypeError,
+ match=r"n_components should be int, got: .*",
):
DoubleHardDebias(n_components=2.3)
with pytest.raises(
- TypeError, match=r"incremental_pca should be a bool, got .*",
+ TypeError,
+ match=r"incremental_pca should be a bool, got .*",
):
DoubleHardDebias(incremental_pca=1)
@@ -56,7 +60,8 @@ def test_double_hard_debias_checks(
model, definitional_pairs + [["word1"]], bias_representation=["he", "she"]
)
with pytest.raises(
- Exception, match=r"bias_representation words not in model",
+ Exception,
+ match=r"bias_representation words not in model",
):
DoubleHardDebias().fit(
model,
@@ -75,7 +80,9 @@ def test_double_hard_debias(
weat = WEAT()
- dhd = DoubleHardDebias(criterion_name="gender",)
+ dhd = DoubleHardDebias(
+ criterion_name="gender",
+ )
dhd.fit(
model, definitional_pairs=definitional_pairs, bias_representation=["he", "she"]
)
@@ -108,7 +115,10 @@ def test_double_hard_debias_target_param(
):
weat = WEAT()
- dhd = DoubleHardDebias(verbose=True, criterion_name="gender",)
+ dhd = DoubleHardDebias(
+ verbose=True,
+ criterion_name="gender",
+ )
attribute_words = weat_wordsets["career"] + weat_wordsets["family"]
attribute_words.remove("family")
@@ -152,7 +162,10 @@ def test_multiclass_hard_debias_ignore_param(
weat_wordsets: Dict[str, List[str]],
):
weat = WEAT()
- dhd = DoubleHardDebias(verbose=True, criterion_name="gender",)
+ dhd = DoubleHardDebias(
+ verbose=True,
+ criterion_name="gender",
+ )
targets = weat_wordsets["male_names"] + weat_wordsets["female_names"]
attributes = weat_wordsets["pleasant_5"] + weat_wordsets["unpleasant_5"]
@@ -193,7 +206,9 @@ def test_double_hard_debias_copy_param(
biased_results_q2 = weat.run_query(gender_query_2, model, normalize=True)
# Test inplace (copy = False)
- dhd = DoubleHardDebias(criterion_name="gender",)
+ dhd = DoubleHardDebias(
+ criterion_name="gender",
+ )
dhd.fit(
model, definitional_pairs=definitional_pairs, bias_representation=["he", "she"]
)
@@ -242,7 +257,9 @@ def test_multiclass_hard_debias_verbose(
assert "Copy argument is True. Transform will attempt to create a copy" in out
assert "Executing debias" in out
- dhd = DoubleHardDebias(criterion_name="gender",)
+ dhd = DoubleHardDebias(
+ criterion_name="gender",
+ )
dhd.fit(
model, definitional_pairs=definitional_pairs, bias_representation=["he", "she"]
)
@@ -251,4 +268,3 @@ def test_multiclass_hard_debias_verbose(
assert model == gender_debiased_w2v
assert model.wv == gender_debiased_w2v.wv
assert model.name == gender_debiased_w2v.name
-
diff --git a/tests/debias/test_half_sibling_regression.py b/tests/debias/test_half_sibling_regression.py
index 812dc14..5498cbd 100644
--- a/tests/debias/test_half_sibling_regression.py
+++ b/tests/debias/test_half_sibling_regression.py
@@ -11,7 +11,8 @@
def test_half_sibling_checks(model):
with pytest.raises(
- TypeError, match=r"verbose should be a bool, got .*",
+ TypeError,
+ match=r"verbose should be a bool, got .*",
):
HalfSiblingRegression(verbose=1)
@@ -24,7 +25,9 @@ def test_half_sibling_regression_class(
):
weat = WEAT()
- hsr = HalfSiblingRegression(criterion_name="gender",)
+ hsr = HalfSiblingRegression(
+ criterion_name="gender",
+ )
hsr.fit(model, definitional_words=gender_specific)
gender_debiased_w2v = hsr.transform(model, copy=True)
@@ -55,7 +58,9 @@ def test_half_sibling_regression_target_param(
):
weat = WEAT()
- hsr = HalfSiblingRegression(criterion_name="gender",)
+ hsr = HalfSiblingRegression(
+ criterion_name="gender",
+ )
attribute_words = weat_wordsets["career"] + weat_wordsets["family"]
attribute_words.remove("family")
@@ -97,7 +102,10 @@ def test_half_sibling_regression_ignore_param(
):
weat = WEAT()
- hsr = HalfSiblingRegression(verbose=True, criterion_name="gender",)
+ hsr = HalfSiblingRegression(
+ verbose=True,
+ criterion_name="gender",
+ )
targets = weat_wordsets["male_names"] + weat_wordsets["female_names"]
attributes = weat_wordsets["pleasant_5"] + weat_wordsets["unpleasant_5"]
@@ -141,7 +149,10 @@ def test_double_hard_debias_copy_param(
biased_results_q2 = weat.run_query(gender_query_2, model, normalize=True)
# Test inplace (copy = False)
- hsr = HalfSiblingRegression(verbose=True, criterion_name="gender",)
+ hsr = HalfSiblingRegression(
+ verbose=True,
+ criterion_name="gender",
+ )
hsr.fit(model, definitional_words=gender_specific)
gender_debiased_w2v = hsr.transform(model, ignore=gender_specific, copy=False)
@@ -163,7 +174,9 @@ def test_double_hard_debias_copy_param(
def test_verbose(
- model: WordEmbeddingModel, gender_specific: List[str], capsys,
+ model: WordEmbeddingModel,
+ gender_specific: List[str],
+ capsys,
):
# -----------------------------------------------------------------
@@ -187,7 +200,9 @@ def test_verbose(
# -----------------------------------------------------------------
# Test inplace (copy = False)
- hsr = HalfSiblingRegression(criterion_name="gender",)
+ hsr = HalfSiblingRegression(
+ criterion_name="gender",
+ )
hsr.fit(model, definitional_words=gender_specific)
gender_debiased_w2v = hsr.transform(model, copy=False)
diff --git a/tests/debias/test_hard_debias.py b/tests/debias/test_hard_debias.py
index dad52ff..86884c9 100644
--- a/tests/debias/test_hard_debias.py
+++ b/tests/debias/test_hard_debias.py
@@ -10,11 +10,13 @@
def test_hard_debias_param_checks(
- model: WordEmbeddingModel, definitional_pairs: List[List[str]],
+ model: WordEmbeddingModel,
+ definitional_pairs: List[List[str]],
):
with pytest.raises(
- TypeError, match=r"verbose should be a bool, got .*",
+ TypeError,
+ match=r"verbose should be a bool, got .*",
):
HardDebias(verbose=1)
@@ -26,7 +28,8 @@ def test_hard_debias_param_checks(
),
):
HardDebias().fit(
- model, definitional_pairs + [["word1", "word2", "word3"]],
+ model,
+ definitional_pairs + [["word1", "word2", "word3"]],
)
with pytest.raises(
@@ -37,7 +40,8 @@ def test_hard_debias_param_checks(
),
):
HardDebias().fit(
- model, definitional_pairs + [["word1"]],
+ model,
+ definitional_pairs + [["word1"]],
)
@@ -56,7 +60,9 @@ def test_hard_debias_class(
# Gender Debias
hd = HardDebias(criterion_name="gender")
hd.fit(
- model, definitional_pairs=definitional_pairs, equalize_pairs=equalize_pairs,
+ model,
+ definitional_pairs=definitional_pairs,
+ equalize_pairs=equalize_pairs,
)
gender_debiased_w2v = hd.transform(model, ignore=gender_specific, copy=True)
@@ -98,7 +104,9 @@ def test_hard_debias_target_param(
attribute_words.remove("executive")
gender_debiased_w2v = hd.fit(
- model, definitional_pairs=definitional_pairs, equalize_pairs=equalize_pairs,
+ model,
+ definitional_pairs=definitional_pairs,
+ equalize_pairs=equalize_pairs,
).transform(model, target=attribute_words, copy=True)
# test gender query 1, debias was only applied to the target words
@@ -146,7 +154,9 @@ def test_hard_debias_ignore_param(
ignore = targets + attributes
gender_debiased_w2v = hd.fit(
- model, definitional_pairs, equalize_pairs=equalize_pairs,
+ model,
+ definitional_pairs,
+ equalize_pairs=equalize_pairs,
).transform(model, ignore=ignore, copy=True)
# test gender query 1,none of their words were debiased.
@@ -180,7 +190,9 @@ def test_hard_debias_verbose_param(
# Test verbose
hd = HardDebias(verbose=True)
gender_debiased_w2v = hd.fit(
- model, definitional_pairs, equalize_pairs=equalize_pairs,
+ model,
+ definitional_pairs,
+ equalize_pairs=equalize_pairs,
).transform(model, ignore=gender_specific, copy=True)
out = capsys.readouterr().out
@@ -226,9 +238,13 @@ def test_hard_debias_copy_param(
biased_results_q1 = weat.run_query(gender_query_1, model, normalize=True)
biased_results_q2 = weat.run_query(gender_query_2, model, normalize=True)
- hd = HardDebias(criterion_name="gender",)
+ hd = HardDebias(
+ criterion_name="gender",
+ )
hd.fit(
- model, definitional_pairs=definitional_pairs, equalize_pairs=equalize_pairs,
+ model,
+ definitional_pairs=definitional_pairs,
+ equalize_pairs=equalize_pairs,
)
gender_debiased_w2v = hd.transform(model, ignore=gender_specific, copy=False)
diff --git a/tests/debias/test_multiclass_hard_debias.py b/tests/debias/test_multiclass_hard_debias.py
index 624f585..ebf2c4b 100644
--- a/tests/debias/test_multiclass_hard_debias.py
+++ b/tests/debias/test_multiclass_hard_debias.py
@@ -10,7 +10,8 @@
def test_multiclass_hard_debias_param_checks(
- model: WordEmbeddingModel, definitional_pairs: List[List[str]],
+ model: WordEmbeddingModel,
+ definitional_pairs: List[List[str]],
):
with pytest.raises(
@@ -135,7 +136,11 @@ def test_multiclass_hard_debias_target_param(
model,
definitional_sets=mhd_gender_definitional_sets,
equalize_sets=mhd_gender_equalize_sets,
- ).transform(model, target=attribute_words, copy=True,)
+ ).transform(
+ model,
+ target=attribute_words,
+ copy=True,
+ )
assert model.name == "test_w2v"
assert gender_debiased_w2v.name == "test_w2v_debiased"
diff --git a/tests/debias/test_repulsion_attraction_neutralization.py b/tests/debias/test_repulsion_attraction_neutralization.py
index 2cddf09..dc5f084 100644
--- a/tests/debias/test_repulsion_attraction_neutralization.py
+++ b/tests/debias/test_repulsion_attraction_neutralization.py
@@ -24,7 +24,9 @@ def test_hard_debias_target_param(
attribute_words.remove("family")
attribute_words.remove("executive")
- ran = RepulsionAttractionNeutralization(criterion_name="gender",)
+ ran = RepulsionAttractionNeutralization(
+ criterion_name="gender",
+ )
ran.fit(model, definitional_pairs=definitional_pairs)
gender_debiased_w2v = ran.transform(model, target=attribute_words, copy=True)
diff --git a/tests/metrics/__init__.py b/tests/metrics/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/tests/metrics/conftest.py b/tests/metrics/conftest.py
new file mode 100644
index 0000000..68add16
--- /dev/null
+++ b/tests/metrics/conftest.py
@@ -0,0 +1,149 @@
+"""Test configurations and fixtures."""
+from typing import Dict, List
+
+import pytest
+from wefe.datasets.datasets import load_weat
+from wefe.query import Query
+from wefe.utils import load_test_model
+from wefe.word_embedding_model import WordEmbeddingModel
+
+# -------------------------------------------------------------------------------------
+# Models
+# -------------------------------------------------------------------------------------
+
+
+@pytest.fixture
+def model() -> WordEmbeddingModel:
+ """Load a subset of Word2vec as a testing model.
+
+ Returns
+ -------
+ WordEmbeddingModel
+ The loaded testing model.
+ """
+ return load_test_model()
+
+
+# -------------------------------------------------------------------------------------
+# Word sets
+# -------------------------------------------------------------------------------------
+
+
+@pytest.fixture
+def weat_wordsets() -> Dict[str, List[str]]:
+ """Load the word sets used in WEAT original work.
+
+ Returns
+ -------
+ Dict[str, List[str]]
+ A dictionary that map a word set name to a set of words.
+ """
+ weat_wordsets = load_weat()
+ return weat_wordsets
+
+
+@pytest.fixture
+def query_2t1a_1(weat_wordsets: Dict[str, List[str]]) -> Query:
+ query = Query(
+ [weat_wordsets["flowers"], weat_wordsets["insects"]],
+ [weat_wordsets["pleasant_5"]],
+ ["Flowers", "Insects"],
+ ["Pleasant"],
+ )
+ return query
+
+
+@pytest.fixture
+def query_2t2a_1(weat_wordsets: Dict[str, List[str]]) -> Query:
+ """Generate a Flower and Insects wrt Pleasant vs Unpleasant test query.
+
+ Parameters
+ ----------
+ weat_wordsets : Dict[str, List[str]]
+ The word sets used in WEAT original work.
+
+ Returns
+ -------
+ Query
+ The generated query.
+ """
+ query = Query(
+ [weat_wordsets["flowers"], weat_wordsets["insects"]],
+ [weat_wordsets["pleasant_5"], weat_wordsets["unpleasant_5"]],
+ ["Flowers", "Insects"],
+ ["Pleasant", "Unpleasant"],
+ )
+ return query
+
+
+@pytest.fixture
+def query_3t2a_1(weat_wordsets: Dict[str, List[str]]) -> Query:
+ query = Query(
+ [
+ weat_wordsets["flowers"],
+ weat_wordsets["insects"],
+ weat_wordsets["instruments"],
+ ],
+ [weat_wordsets["pleasant_5"], weat_wordsets["unpleasant_5"]],
+ ["Flowers", "Weapons", "Instruments"],
+ ["Pleasant", "Unpleasant"],
+ )
+
+ return query
+
+
+@pytest.fixture
+def query_4t2a_1(weat_wordsets: Dict[str, List[str]]) -> Query:
+ query = Query(
+ [
+ weat_wordsets["flowers"],
+ weat_wordsets["insects"],
+ weat_wordsets["instruments"],
+ weat_wordsets["weapons"],
+ ],
+ [weat_wordsets["pleasant_5"], weat_wordsets["unpleasant_5"]],
+ ["Flowers", "Insects", "Instruments", "Weapons"],
+ ["Pleasant", "Unpleasant"],
+ )
+
+ return query
+
+
+@pytest.fixture
+def query_1t4_1(weat_wordsets: Dict[str, List[str]]) -> Query:
+ query = Query(
+ [weat_wordsets["flowers"]],
+ [
+ weat_wordsets["pleasant_5"],
+ weat_wordsets["pleasant_9"],
+ weat_wordsets["unpleasant_5"],
+ weat_wordsets["unpleasant_9"],
+ ],
+ ["Flowers"],
+ ["Pleasant 5 ", "Pleasant 9", "Unpleasant 5", "Unpleasant 9"],
+ )
+ return query
+
+
+@pytest.fixture
+def query_2t1a_lost_vocab_1(weat_wordsets: Dict[str, List[str]]) -> Query:
+ query = Query(
+ [["bla", "asd"], weat_wordsets["insects"]],
+ [weat_wordsets["pleasant_5"]],
+ ["Flowers", "Insects"],
+ ["Pleasant"],
+ )
+
+ return query
+
+
+@pytest.fixture
+def query_2t2a_lost_vocab_1(weat_wordsets: Dict[str, List[str]]) -> Query:
+ query = Query(
+ [["bla", "asd"], weat_wordsets["insects"]],
+ [weat_wordsets["pleasant_5"], weat_wordsets["unpleasant_5"]],
+ ["Flowers", "Insects"],
+ ["Pleasant", "Unpleasant"],
+ )
+
+ return query
diff --git a/tests/metrics/test_RND.py b/tests/metrics/test_RND.py
index 8a38ddb..87481cb 100644
--- a/tests/metrics/test_RND.py
+++ b/tests/metrics/test_RND.py
@@ -13,7 +13,7 @@ def check_RND_result_keys(results: Dict[str, Any]):
"query_name",
"result",
"rnd",
- "distances_by_word",
+ "distance_by_word",
]
@@ -25,7 +25,7 @@ def check_RND_result_values(results: Dict[str, Any]):
assert isinstance(results["result"], np.number)
assert isinstance(results["rnd"], np.number)
- distances_by_word = results["distances_by_word"]
+ distances_by_word = results["distance_by_word"]
assert isinstance(distances_by_word, dict)
assert len(distances_by_word) > 0
for word, distance in distances_by_word.items():
@@ -69,7 +69,10 @@ def test_RND_lost_vocabulary_threshold(
):
rnd = RND()
- result = rnd.run_query(query_2t1a_lost_vocab_1, model,)
+ result = rnd.run_query(
+ query_2t1a_lost_vocab_1,
+ model,
+ )
check_RND_result_keys(result)
assert result["query_name"] == "Flowers and Insects wrt Pleasant"
@@ -77,5 +80,5 @@ def test_RND_lost_vocabulary_threshold(
assert np.isnan(result["result"])
assert np.isnan(result["rnd"])
- assert isinstance(result["distances_by_word"], dict)
- assert len(result["distances_by_word"]) == 0
+ assert isinstance(result["distance_by_word"], dict)
+ assert len(result["distance_by_word"]) == 0
diff --git a/tests/metrics/test_base_metric.py b/tests/metrics/test_base_metric.py
index ddcb43a..986fa49 100644
--- a/tests/metrics/test_base_metric.py
+++ b/tests/metrics/test_base_metric.py
@@ -5,7 +5,9 @@
def test_base_metric_input_checking(
- model: WordEmbeddingModel, query_2t2a_1: Query, query_3t2a_1: Query,
+ model: WordEmbeddingModel,
+ query_2t2a_1: Query,
+ query_3t2a_1: Query,
):
# Create and configure base metric testing.
# disable abstract methods.
@@ -45,7 +47,8 @@ def test_base_metric_input_checking(
def test_validate_old_preprocessor_args_inputs(
- model: WordEmbeddingModel, query_2t2a_1: Query,
+ model: WordEmbeddingModel,
+ query_2t2a_1: Query,
):
# instance test metric
@@ -105,5 +108,7 @@ def test_run_query(model: WordEmbeddingModel, query_2t2a_1: Query):
base_metric.metric_name = "Test Metric"
base_metric.metric_short_name = "TM"
- with pytest.raises(NotImplementedError,):
+ with pytest.raises(
+ NotImplementedError,
+ ):
base_metric.run_query(query_2t2a_1, model)
diff --git a/tests/test_datasets.py b/tests/test_datasets.py
index f6de983..cb4a3dd 100644
--- a/tests/test_datasets.py
+++ b/tests/test_datasets.py
@@ -1,6 +1,11 @@
-from wefe.datasets.datasets import (fetch_debias_multiclass, fetch_debiaswe,
- fetch_eds, fetch_gn_glove, load_bingliu,
- load_weat)
+from wefe.datasets.datasets import (
+ fetch_debias_multiclass,
+ fetch_debiaswe,
+ fetch_eds,
+ fetch_gn_glove,
+ load_bingliu,
+ load_weat,
+)
def test_load_bingliu():
diff --git a/tests/test_preprocessing.py b/tests/test_preprocessing.py
index de980e7..7af0201 100644
--- a/tests/test_preprocessing.py
+++ b/tests/test_preprocessing.py
@@ -3,6 +3,7 @@
import numpy as np
import pytest
+from wefe.datasets.datasets import load_weat
from wefe.preprocessing import (
_warn_not_found_words,
get_embeddings_from_query,
@@ -11,8 +12,87 @@
preprocess_word,
)
from wefe.query import Query
+from wefe.utils import load_test_model
from wefe.word_embedding_model import WordEmbeddingModel
+
+@pytest.fixture
+def model() -> WordEmbeddingModel:
+ """Load a subset of Word2vec as a testing model.
+
+ Returns
+ -------
+ WordEmbeddingModel
+ The loaded testing model.
+ """
+ return load_test_model()
+
+
+@pytest.fixture
+def query_2t2a_1(weat_wordsets: Dict[str, List[str]]) -> Query:
+ """Generate a Flower and Insects wrt Pleasant vs Unpleasant test query.
+
+ Parameters
+ ----------
+ weat_wordsets : Dict[str, List[str]]
+ The word sets used in WEAT original work.
+
+ Returns
+ -------
+ Query
+ The generated query.
+ """
+ query = Query(
+ [weat_wordsets["flowers"], weat_wordsets["insects"]],
+ [weat_wordsets["pleasant_5"], weat_wordsets["unpleasant_5"]],
+ ["Flowers", "Insects"],
+ ["Pleasant", "Unpleasant"],
+ )
+ return query
+
+
+@pytest.fixture
+def weat_wordsets() -> Dict[str, List[str]]:
+ """Load the word sets used in WEAT original work.
+
+ Returns
+ -------
+ Dict[str, List[str]]
+ A dictionary that map a word set name to a set of words.
+ """
+ weat_wordsets = load_weat()
+ return weat_wordsets
+
+
+@pytest.fixture
+def query_2t2a_uppercase(weat_wordsets: Dict[str, List[str]]) -> Query:
+ """Generate a Flower and Insects wrt Pleasant vs Unpleasant test query.
+
+ Parameters
+ ----------
+ weat_wordsets : Dict[str, List[str]]
+ The word sets used in WEAT original work.
+
+ Returns
+ -------
+ Query
+ The generated query.
+ """
+ query = Query(
+ [
+ [s.upper() for s in weat_wordsets["flowers"]],
+ [s.upper() for s in weat_wordsets["insects"]],
+ ],
+ [
+ [s.upper() for s in weat_wordsets["pleasant_5"]],
+ [s.upper() for s in weat_wordsets["unpleasant_5"]],
+ ],
+ ["Flowers", "Insects"],
+ ["Pleasant", "Unpleasant"],
+ )
+ return query
+
+
# --------------------------------------------------------------------------------------
# test preprocess_word
# --------------------------------------------------------------------------------------
@@ -270,7 +350,8 @@ def test_get_embeddings_from_sets_type_checkings(model):
# Test types and value checking.
with pytest.raises(
- TypeError, match=(r"model should be a WordEmbeddingModel instance, got None"),
+ TypeError,
+ match=(r"model should be a WordEmbeddingModel instance, got None"),
):
get_embeddings_from_tuples(None, [["he"]])
@@ -311,19 +392,22 @@ def test_get_embeddings_from_sets_type_checkings(model):
get_embeddings_from_tuples(model, [["she", 1]])
with pytest.raises(
- TypeError, match=r"sets_name should be a string or None, got:.*",
+ TypeError,
+ match=r"sets_name should be a string or None, got:.*",
):
get_embeddings_from_tuples(model, [["she", "he"]], 0)
with pytest.raises(
- TypeError, match=r"warn_lost_sets should be a bool, got:.*",
+ TypeError,
+ match=r"warn_lost_sets should be a bool, got:.*",
):
get_embeddings_from_tuples(
model, [["she", "he"]], "definning", warn_lost_sets=None
)
with pytest.raises(
- TypeError, match=r"verbose should be a bool, got:.*",
+ TypeError,
+ match=r"verbose should be a bool, got:.*",
):
get_embeddings_from_tuples(
model, [["she", "he"]], "definning", True, verbose=None
@@ -545,7 +629,9 @@ def test_get_embeddings_from_query(
def test_get_embeddings_from_query_oov_warns(
- caplog, model: WordEmbeddingModel, weat_wordsets: Dict[str, List[str]],
+ caplog,
+ model: WordEmbeddingModel,
+ weat_wordsets: Dict[str, List[str]],
):
# check lost words warning when warn_not_found_words is True
diff --git a/tests/test_query.py b/tests/test_query.py
index 0fc21f0..53ba8ea 100644
--- a/tests/test_query.py
+++ b/tests/test_query.py
@@ -2,11 +2,23 @@
from typing import Dict, List
import pytest
-
from wefe.datasets.datasets import load_weat
from wefe.query import Query
+@pytest.fixture
+def weat_wordsets() -> Dict[str, List[str]]:
+ """Load the word sets used in WEAT original work.
+
+ Returns
+ -------
+ Dict[str, List[str]]
+ A dictionary that map a word set name to a set of words.
+ """
+ weat_wordsets = load_weat()
+ return weat_wordsets
+
+
def test_create_query_input_checks():
# target sets None
@@ -343,3 +355,153 @@ def test_wrong_target_and_attribute_sets_and_names(caplog):
["Flowers"],
["Pleasant", "asdf"],
)
+
+
+def test_query__repr__():
+
+ weat_word_set = load_weat()
+ query = Query(
+ [weat_word_set["flowers"], weat_word_set["insects"]],
+ [weat_word_set["pleasant_5"]],
+ ["Flowers", "Insects"],
+ ["Pleasant"],
+ )
+
+ assert query.__repr__() == (
+ ""
+ )
+
+ query_2 = Query([[]], [])
+
+ assert (
+ query_2.__repr__()
+ == ""
+ )
+
+ del query.target_sets
+ assert query.__repr__() == ""
+
+
+def test_query_dict():
+
+ weat_word_set = load_weat()
+ query = Query(
+ [weat_word_set["flowers"], weat_word_set["insects"]],
+ [weat_word_set["pleasant_5"]],
+ ["Flowers", "Insects"],
+ ["Pleasant"],
+ )
+
+ assert query.dict() == {
+ "target_sets": [
+ [
+ "aster",
+ "clover",
+ "hyacinth",
+ "marigold",
+ "poppy",
+ "azalea",
+ "crocus",
+ "iris",
+ "orchid",
+ "rose",
+ "bluebell",
+ "daffodil",
+ "lilac",
+ "pansy",
+ "tulip",
+ "buttercup",
+ "daisy",
+ "lily",
+ "peony",
+ "violet",
+ "carnation",
+ "gladiola",
+ "magnolia",
+ "petunia",
+ "zinnia",
+ ],
+ [
+ "ant",
+ "caterpillar",
+ "flea",
+ "locust",
+ "spider",
+ "bedbug",
+ "centipede",
+ "fly",
+ "maggot",
+ "tarantula",
+ "bee",
+ "cockroach",
+ "gnat",
+ "mosquito",
+ "termite",
+ "beetle",
+ "cricket",
+ "hornet",
+ "moth",
+ "wasp",
+ "blackfly",
+ "dragonfly",
+ "horsefly",
+ "roach",
+ "weevil",
+ ],
+ ],
+ "attribute_sets": [
+ [
+ "caress",
+ "freedom",
+ "health",
+ "love",
+ "peace",
+ "cheer",
+ "friend",
+ "heaven",
+ "loyal",
+ "pleasure",
+ "diamond",
+ "gentle",
+ "honest",
+ "lucky",
+ "rainbow",
+ "diploma",
+ "gift",
+ "honor",
+ "miracle",
+ "sunrise",
+ "family",
+ "happy",
+ "laughter",
+ "paradise",
+ "vacation",
+ ]
+ ],
+ "target_sets_names": ["Flowers", "Insects"],
+ "attribute_sets_names": ["Pleasant"],
+ "query_name": "Flowers and Insects wrt Pleasant",
+ "template": (2, 1),
+ }
+
+ query_2 = Query([[]], [])
+
+ assert query_2.dict() == {
+ "target_sets": [[]],
+ "attribute_sets": [],
+ "target_sets_names": ["Target set 0"],
+ "attribute_sets_names": [],
+ "query_name": "Target set 0",
+ "template": (1, 0),
+ }
diff --git a/tests/test_utils.py b/tests/test_utils.py
index 91a4865..c2d38be 100644
--- a/tests/test_utils.py
+++ b/tests/test_utils.py
@@ -8,8 +8,12 @@
from wefe.datasets import load_weat
from wefe.metrics import RND, WEAT
from wefe.query import Query
-from wefe.utils import (calculate_ranking_correlations, create_ranking,
- load_test_model, run_queries)
+from wefe.utils import (
+ calculate_ranking_correlations,
+ create_ranking,
+ load_test_model,
+ run_queries,
+)
from wefe.word_embedding_model import WordEmbeddingModel
gensim_version = semantic_version.Version.coerce(gensim.__version__)
diff --git a/tests/test_word_embedding_model.py b/tests/test_word_embedding_model.py
index c3ef4ac..a1a0af1 100644
--- a/tests/test_word_embedding_model.py
+++ b/tests/test_word_embedding_model.py
@@ -10,6 +10,13 @@
gensim_version = semantic_version.Version.coerce(gensim.__version__)
+@pytest.fixture
+def test_keyed_vectors() -> KeyedVectors:
+
+ test_model = KeyedVectors.load("./wefe/datasets/data/test_model.kv")
+ return test_model
+
+
def test__init__():
# Test types verifications
@@ -62,11 +69,11 @@ def test__init__():
assert model.vocab_prefix == "\\c\\en"
-def test__eq__(keyed_vector_model: gensim.models.KeyedVectors):
- model_1 = WordEmbeddingModel(keyed_vector_model, "w2v")
- model_2 = WordEmbeddingModel(keyed_vector_model, "w2v_2")
- model_3_prefix_a = WordEmbeddingModel(keyed_vector_model, "w2v_3", vocab_prefix="a")
- model_3_prefix_b = WordEmbeddingModel(keyed_vector_model, "w2v_3", vocab_prefix="b")
+def test__eq__(test_keyed_vectors: gensim.models.KeyedVectors):
+ model_1 = WordEmbeddingModel(test_keyed_vectors, "w2v")
+ model_2 = WordEmbeddingModel(test_keyed_vectors, "w2v_2")
+ model_3_prefix_a = WordEmbeddingModel(test_keyed_vectors, "w2v_3", vocab_prefix="a")
+ model_3_prefix_b = WordEmbeddingModel(test_keyed_vectors, "w2v_3", vocab_prefix="b")
assert model_1 != ""
@@ -83,14 +90,17 @@ def test__eq__(keyed_vector_model: gensim.models.KeyedVectors):
assert model_3_prefix_b != model_3_prefix_a
-def test__contains__(model: WordEmbeddingModel):
+def test__contains__(test_keyed_vectors: gensim.models.KeyedVectors):
+ model = WordEmbeddingModel(test_keyed_vectors, "w2v")
+
assert "men" in model
assert "asdf" not in model
assert None not in model
assert 0 not in model
-def test__getitem__(model: WordEmbeddingModel):
+def test__getitem__(test_keyed_vectors: gensim.models.KeyedVectors):
+ model = WordEmbeddingModel(test_keyed_vectors, "w2v")
embedding = model["ASDF"]
assert embedding is None
@@ -100,6 +110,33 @@ def test__getitem__(model: WordEmbeddingModel):
assert embedding.shape == (300,)
+def test__repr__(test_keyed_vectors: gensim.models.KeyedVectors):
+
+ model_1 = WordEmbeddingModel(test_keyed_vectors, "w2v")
+ model_1_no_name = WordEmbeddingModel(test_keyed_vectors)
+ model_1_prefix_a = WordEmbeddingModel(test_keyed_vectors, "w2v", vocab_prefix="a")
+ model_1_no_name_prefix_a = WordEmbeddingModel(test_keyed_vectors, vocab_prefix="a")
+
+ assert (
+ model_1.__repr__()
+ == ""
+ )
+ assert model_1_no_name.__repr__() == (
+ ""
+ )
+ assert model_1_prefix_a.__repr__() == (
+ ""
+ )
+ assert model_1_no_name_prefix_a.__repr__() == (
+ ""
+ )
+
+ del model_1.name
+ assert model_1.__repr__() == ""
+
+
def test__init__with_w2v_model():
if gensim_version.major >= 4:
@@ -127,7 +164,9 @@ def test__init_with_fast_model():
# -------------------------------------------------------------------------------------
-def test_normalize_embeddings(model: WordEmbeddingModel):
+def test_normalize_embeddings(test_keyed_vectors: gensim.models.KeyedVectors):
+ model = WordEmbeddingModel(test_keyed_vectors, "w2v")
+
# test unnormalized embeddings
for word in model.vocab:
assert np.abs(np.linalg.norm(model[word]) - 1.0) > 0.000001
@@ -146,7 +185,8 @@ def test_normalize_embeddings(model: WordEmbeddingModel):
# -------------------------------------------------------------------------------------
-def test_update_embedding(model: WordEmbeddingModel):
+def test_update_embedding(test_keyed_vectors: gensim.models.KeyedVectors):
+ model = WordEmbeddingModel(test_keyed_vectors, "w2v")
new_embedding = np.ones(300, dtype=model.wv.vectors.dtype)
model.update("The", new_embedding)
@@ -178,7 +218,9 @@ def test_update_embedding(model: WordEmbeddingModel):
# -------------------------------------------------------------------------------------
-def test_update_embeddings(model):
+def test_update_embeddings(test_keyed_vectors: gensim.models.KeyedVectors):
+ model = WordEmbeddingModel(test_keyed_vectors, "w2v")
+
words = ["The", "in"]
embeddings = [np.ones(300, dtype=np.float32), np.ones(300, dtype=np.float32) * -1]
@@ -202,11 +244,13 @@ def test_update_embeddings(model):
model.batch_update(None, embeddings)
with pytest.raises(
- TypeError, match=r"embeddings should be a list, tuple or np.array, got:.*",
+ TypeError,
+ match=r"embeddings should be a list, tuple or np.array, got:.*",
):
model.batch_update(words, None)
with pytest.raises(
- ValueError, match=r"words and embeddings must have the same size, got:.*",
+ ValueError,
+ match=r"words and embeddings must have the same size, got:.*",
):
model.batch_update(words + ["is"], embeddings)
diff --git a/wefe/_version.py b/wefe/_version.py
index f9aa3e1..6a9beea 100644
--- a/wefe/_version.py
+++ b/wefe/_version.py
@@ -1 +1 @@
-__version__ = "0.3.2"
+__version__ = "0.4.0"
diff --git a/wefe/datasets/__init__.py b/wefe/datasets/__init__.py
index 7773142..3f5de20 100644
--- a/wefe/datasets/__init__.py
+++ b/wefe/datasets/__init__.py
@@ -1,3 +1,4 @@
+# flake8: noqa
from wefe.datasets.datasets import (
fetch_debias_multiclass,
fetch_debiaswe,
diff --git a/wefe/debias/__init__.py b/wefe/debias/__init__.py
index 334f35f..e69de29 100644
--- a/wefe/debias/__init__.py
+++ b/wefe/debias/__init__.py
@@ -1,7 +0,0 @@
-from wefe.debias.double_hard_debias import DoubleHardDebias
-from wefe.debias.half_sibling_regression import HalfSiblingRegression
-from wefe.debias.hard_debias import HardDebias
-from wefe.debias.multiclass_hard_debias import MulticlassHardDebias
-from wefe.debias.repulsion_attraction_neutralization import (
- RepulsionAttractionNeutralization,
-)
diff --git a/wefe/debias/base_debias.py b/wefe/debias/base_debias.py
index c222df0..9156061 100644
--- a/wefe/debias/base_debias.py
+++ b/wefe/debias/base_debias.py
@@ -8,8 +8,15 @@
class BaseDebias:
"""Mixin class for implement any debias method in WEFE."""
+ # The name of the method.
+ name: str
+
@abstractmethod
- def fit(self, model: WordEmbeddingModel, **fit_params,) -> "BaseDebias":
+ def fit(
+ self,
+ model: WordEmbeddingModel,
+ **fit_params,
+ ) -> "BaseDebias":
"""Fit the transformation.
Parameters
@@ -38,9 +45,10 @@ def transform(
model : WordEmbeddingModel
The word embedding model to debias.
target : Optional[List[str]], optional
- If a set of words is specified in target, the debias method will be performed
- only on the word embeddings of this set. In the case of provide `None`, the
- debias will be performed on all words (except those specified in ignore).
+ If a set of words is specified in target, the debias method will be
+ performed only on the word embeddings of this set. In the case of provide
+ `None`, the debias will be performed on all words (except those specified
+ in ignore).
by default `None`.
ignore : Optional[List[str]], optional
If target is `None` and a set of words is specified in ignore, the debias
@@ -148,7 +156,10 @@ def _check_transform_args(
raise TypeError(f"copy should be a bool, got {copy}.")
def _check_sets_sizes(
- self, sets: List[List[str]], set_name: str, set_size: Union[int, str],
+ self,
+ sets: List[List[str]],
+ set_name: str,
+ set_size: Union[int, str],
):
if len(sets) == 0:
diff --git a/wefe/debias/double_hard_debias.py b/wefe/debias/double_hard_debias.py
index a2a90b7..377dd07 100644
--- a/wefe/debias/double_hard_debias.py
+++ b/wefe/debias/double_hard_debias.py
@@ -69,7 +69,8 @@ class DoubleHardDebias(BaseDebias):
>>> debiased_model = dhd.transform(
... model=model, ignore=gender_specific
... )
- Copy argument is True. Transform will attempt to create a copy of the original model. This may fail due to lack of memory.
+ Copy argument is True. Transform will attempt to create a copy of the original
+ model. This may fail due to lack of memory.
Model copy created successfully.
If you want the debiased to be performed over a specific set of words you can
@@ -78,7 +79,8 @@ class DoubleHardDebias(BaseDebias):
>>> debiased_model = dhd.transform(
... model=model, target = ['doctor','nurse','programmer','teacher']
... )
- Copy argument is True. Transform will attempt to create a copy of the original model. This may fail due to lack of memory.
+ Copy argument is True. Transform will attempt to create a copy of the original
+ model. This may fail due to lack of memory.
Model copy created successfully.
References
@@ -163,7 +165,9 @@ def __init__(
self.n_components = n_components
def _check_sets_size(
- self, sets: List[List[str]], set_name: str,
+ self,
+ sets: List[List[str]],
+ set_name: str,
):
for idx, set_ in enumerate(sets):
@@ -176,7 +180,7 @@ def _check_sets_size(
f"got {len(set_)} words, expected 2."
)
- def _similarity(self, u: List[np.ndarray], v: List[np.ndarray]) -> np.array:
+ def _similarity(self, u: List[np.ndarray], v: List[np.ndarray]) -> np.ndarray:
return 1 - pairwise_distances(u, v, metric="cosine")
def _bias_by_projection(
@@ -290,7 +294,9 @@ def _drop_frecuency_features(
return droped_frecuencies
def _identify_bias_subspace(
- self, defining_pairs_embeddings, verbose: bool = False,
+ self,
+ defining_pairs_embeddings,
+ verbose: bool = False,
) -> PCA:
matrix = []
@@ -362,6 +368,7 @@ def fit(
model: WordEmbeddingModel,
definitional_pairs: List[List[str]],
bias_representation: List[str],
+ **fit_params,
) -> BaseDebias:
"""Compute the bias direction and obtain the principal components of the entire
set of vectors.
@@ -383,6 +390,7 @@ def fit(
BaseDebias
The debias method fitted.
"""
+
self.definitional_pairs = definitional_pairs
self._check_sets_sizes(self.definitional_pairs, "definitional", set_size=2)
@@ -429,8 +437,8 @@ def fit(
def transform(
self,
model: WordEmbeddingModel,
- target: List[str] = None,
- ignore: List[str] = [],
+ target: Optional[List[str]] = None,
+ ignore: Optional[List[str]] = [],
copy: bool = True,
) -> WordEmbeddingModel:
"""Execute hard debias over the provided model.
@@ -459,7 +467,9 @@ def transform(
"""
# check if the following attributes exist in the object.
self._check_transform_args(
- model=model, ignore=ignore, copy=copy,
+ model=model,
+ ignore=ignore,
+ copy=copy,
)
check_is_fitted(
self,
diff --git a/wefe/debias/half_sibling_regression.py b/wefe/debias/half_sibling_regression.py
index 324f4b7..2476db5 100644
--- a/wefe/debias/half_sibling_regression.py
+++ b/wefe/debias/half_sibling_regression.py
@@ -5,7 +5,6 @@
import numpy as np
from tqdm import tqdm
-
from wefe.debias.base_debias import BaseDebias
from wefe.preprocessing import get_embeddings_from_tuples
from wefe.utils import check_is_fitted
@@ -13,7 +12,7 @@
class HalfSiblingRegression(BaseDebias):
- """Half Sibling Debias method.
+ r"""Half Sibling Debias method.
This method proposes to learn spurious gender information via causal
inference by utilizing the statistical dependency between gender-biased
@@ -40,7 +39,7 @@ class HalfSiblingRegression(BaseDebias):
.. math::
- W = ((V_d)^T V_d + \\alpha I)^{-1} (V_d)^TV_n
+ W = ((V_d)^T V_d + \alpha I)^{-1} (V_d)^TV_n
2. Compute the gender information:
@@ -86,7 +85,8 @@ class HalfSiblingRegression(BaseDebias):
... )
>>> # execute the debias on the words not included in the gender definition set
>>> debiased_model = hsr.transform(model = model)
- Copy argument is True. Transform will attempt to create a copy of the original model. This may fail due to lack of memory.
+ Copy argument is True. Transform will attempt to create a copy of the original
+ model. This may fail due to lack of memory.
Model copy created successfully.
>>>
>>>
@@ -95,7 +95,8 @@ class HalfSiblingRegression(BaseDebias):
>>> debiased_model = hsr.transform(
... model=model, target=["doctor", "nurse", "programmer"]
... )
- Copy argument is True. Transform will attempt to create a copy of the original model. This may fail due to lack of memory.
+ Copy argument is True. Transform will attempt to create a copy of the original
+ model. This may fail due to lack of memory.
Model copy created successfully.
>>>
>>> # if you want to exclude a set of words from the debias process
@@ -103,7 +104,8 @@ class HalfSiblingRegression(BaseDebias):
>>> debiased_model = hsr.transform(
... model=model, ignore=["dress", "beard", "niece", "nephew"]
... )
- Copy argument is True. Transform will attempt to create a copy of the original model. This may fail due to lack of memory.
+ Copy argument is True. Transform will attempt to create a copy of the original
+ model. This may fail due to lack of memory.
Model copy created successfully.
References
diff --git a/wefe/debias/hard_debias.py b/wefe/debias/hard_debias.py
index 3158193..7da2dd8 100644
--- a/wefe/debias/hard_debias.py
+++ b/wefe/debias/hard_debias.py
@@ -15,7 +15,7 @@
class HardDebias(BaseDebias):
- """Hard Debias debiasing method.
+ r"""Hard Debias debiasing method.
Hard debias is a method that allows mitigating biases through geometric operations
on embeddings.
@@ -38,7 +38,8 @@ class HardDebias(BaseDebias):
First, it is defined a set of words that are correct to be related to the bias
criterion: the *criterion specific gender words*.
For example, in the case of gender, *gender specific* words are:
- ``['he', 'his', 'He', 'her', 'she', 'him', 'him', 'She', 'man', 'women', 'men'...]``.
+ ``['he', 'his', 'He', 'her', 'she', 'him', 'him', 'She', 'man', 'women', 'men',
+ ...]``.
Then, it is defined that all words outside this set should have no relation to the
bias criterion and thus have the possibility of being biased. (e.g. for the case of
@@ -55,13 +56,13 @@ class HardDebias(BaseDebias):
.. math::
- \\text{bias_subspace} = \\frac{v \\cdot (v \\cdot u)}{(v \\cdot v)}
+ \text{bias subspace} = \frac{v \cdot (v \cdot u)}{(v \cdot v)}
Then subtract the projection from the embedding.
.. math::
- u' = u - \\text{bias_subspace}
+ u' = u - \text{bias subspace}
3. Equalizate the embeddings with respect to the bias direction.
Given an equalization set (set of word pairs such as ``['she', 'he'],
@@ -139,7 +140,8 @@ class HardDebias(BaseDebias):
References
----------
- | [1]: Bolukbasi, T., Chang, K. W., Zou, J. Y., Saligrama, V., & Kalai, A. T. (2016).
+ | [1]: Bolukbasi, T., Chang, K. W., Zou, J. Y., Saligrama, V., & Kalai, A. T.
+ (2016).
| Man is to computer programmer as woman is to homemaker? debiasing word embeddings.
| Advances in Neural Information Processing Systems.
| [2]: https://github.com/tolga-b/debiaswe
@@ -166,8 +168,8 @@ def __init__(
by default False.
criterion_name : Optional[str], optional
The name of the criterion for which the debias is being executed,
- e.g., 'Gender'. This will indicate the name of the model returning transform,
- by default None
+ e.g., 'Gender'. This will indicate the name of the model returning
+ transform, by default None
"""
# check verbose
if not isinstance(verbose, bool):
@@ -181,22 +183,10 @@ def __init__(
else:
raise ValueError(f"criterion_name should be str, got: {criterion_name}")
- def _check_sets_size(
- self, sets: List[List[str]], set_name: str,
- ):
-
- for idx, set_ in enumerate(sets):
- if len(set_) != 2:
- adverb = "less" if len(set_) < 2 else "more"
-
- raise ValueError(
- f"The {set_name} pair at position {idx} ({set_}) has {adverb} "
- f"words than allowed by {self.name}: "
- f"got {len(set_)} words, expected 2."
- )
-
def _identify_bias_subspace(
- self, definning_pairs_embeddings: List[EmbeddingDict], verbose: bool = False,
+ self,
+ definning_pairs_embeddings: List[EmbeddingDict],
+ verbose: bool = False,
) -> PCA:
matrix = []
@@ -285,7 +275,10 @@ def _equalize(
):
(
(word_a, embedding_a),
- (word_b, embedding_b,),
+ (
+ word_b,
+ embedding_b,
+ ),
) = equalize_pair_embeddings.items()
y = self._drop((embedding_a + embedding_b) / 2, bias_direction)
@@ -353,7 +346,8 @@ def fit(
print("Identifying the bias subspace.")
self.pca_ = self._identify_bias_subspace(
- self.definitional_pairs_embeddings_, self.verbose,
+ self.definitional_pairs_embeddings_,
+ self.verbose,
)
self.bias_direction_ = self.pca_.components_[0]
@@ -411,12 +405,13 @@ def transform(
model : WordEmbeddingModel
The word embedding model to debias.
target : Optional[List[str]], optional
- If a set of words is specified in target, the debias method will be performed
- only on the word embeddings of this set. If `None` is provided, the
- debias will be performed on all words (except those specified in ignore).
+ If a set of words is specified in target, the debias method will be
+ performed only on the word embeddings of this set. If `None` is provided,
+ the debias will be performed on all words (except those specified in
+ ignore).
Note that some words that are not in target may be modified due to the
equalization process.
- By default `None`.
+ By default `None`.
ignore : Optional[List[str]], optional
If target is `None` and a set of words is specified in ignore, the debias
method will perform the debias in all words except those specified in this
@@ -441,7 +436,10 @@ def transform(
# Check types and if the method is fitted
self._check_transform_args(
- model=model, target=target, ignore=ignore, copy=copy,
+ model=model,
+ target=target,
+ ignore=ignore,
+ copy=copy,
)
# check if the following attributes exist in the object.
@@ -501,7 +499,9 @@ def transform(
print("Equalizing embeddings.")
self._equalize(
- model, self.equalize_pairs_embeddings_, self.bias_direction_,
+ model,
+ self.equalize_pairs_embeddings_,
+ self.bias_direction_,
)
if self.verbose:
diff --git a/wefe/debias/multiclass_hard_debias.py b/wefe/debias/multiclass_hard_debias.py
index daaf6fc..51f979e 100644
--- a/wefe/debias/multiclass_hard_debias.py
+++ b/wefe/debias/multiclass_hard_debias.py
@@ -29,7 +29,7 @@ class MulticlassHardDebias(BaseDebias):
For more information on the use of mitigation methods, visit
:ref:`bias mitigation` in the User Guide.
- The following example shows how to run an ethnicity debias based on Black,
+ The following example shows how to run an ethnicity debias based on Black,
Asian and Caucasian groups.
>>> from wefe.datasets import fetch_debias_multiclass, load_weat
@@ -116,7 +116,8 @@ def __init__(
)
def _identify_bias_subspace(
- self, definning_sets_embeddings: List[EmbeddingDict],
+ self,
+ definning_sets_embeddings: List[EmbeddingDict],
) -> PCA:
matrix = []
@@ -149,27 +150,6 @@ def _project_onto_subspace(self, vector, subspace):
v_b += np.dot(vector.transpose(), component) * component
return v_b
- def _get_target(
- self, model: WordEmbeddingModel, target: Optional[List[str]] = None,
- ) -> List[str]:
-
- definitional_words = np.array(self.definitional_sets_).flatten().tolist()
-
- if target is not None:
- # keep only words in the model's vocab.
- target = list(
- filter(
- lambda x: x in model.vocab and x not in definitional_words, target,
- )
- )
- else:
- # indicate that all words are canditates to neutralize.
- target = list(
- filter(lambda x: x not in definitional_words, model.vocab.keys(),)
- )
-
- return target
-
def _neutralize(
self,
model: WordEmbeddingModel,
@@ -277,7 +257,9 @@ def fit(
# Identify the bias subspace using the definning sets.
if self.verbose:
print("Identifying the bias subspace.")
- self.pca_ = self._identify_bias_subspace(self.definitional_sets_embeddings_,)
+ self.pca_ = self._identify_bias_subspace(
+ self.definitional_sets_embeddings_,
+ )
self.bias_subspace_ = self.pca_.components_[: self.pca_num_components_]
# ------------------------------------------------------------------------------
@@ -311,9 +293,10 @@ def transform(
model : WordEmbeddingModel
The word embedding model to debias.
target : Optional[List[str]], optional
- If a set of words is specified in target, the debias method will be performed
- only on the word embeddings of this set. If `None` is provided, the
- debias will be performed on all words (except those specified in ignore).
+ If a set of words is specified in target, the debias method will be
+ performed only on the word embeddings of this set. If `None` is provided,
+ the debias will be performed on all words (except those specified in
+ ignore).
Note that some words that are not in target may be modified due to the
equalization process.
by default `None`.
@@ -338,7 +321,10 @@ def transform(
The debiased embedding model.
"""
self._check_transform_args(
- model=model, target=target, ignore=ignore, copy=copy,
+ model=model,
+ target=target,
+ ignore=ignore,
+ copy=copy,
)
check_is_fitted(
diff --git a/wefe/debias/repulsion_attraction_neutralization.py b/wefe/debias/repulsion_attraction_neutralization.py
index a02fe04..3cb4d7a 100644
--- a/wefe/debias/repulsion_attraction_neutralization.py
+++ b/wefe/debias/repulsion_attraction_neutralization.py
@@ -1,6 +1,6 @@
"""Repulsion Attraction Neutralization WEFE implementation."""
from copy import deepcopy
-from typing import Any, Callable, Dict, List, Optional, Sequence
+from typing import Any, Dict, List, Optional, Sequence
import numpy as np
from sklearn.decomposition import PCA
@@ -41,7 +41,7 @@ def __init__(
repulsion_set: List[np.ndarray]
Set of embeddings to be repeled from word
bias_direction: np.array
-
+
"""
super(RAN_Loss, self).__init__()
self.w = w
@@ -142,7 +142,7 @@ def _forward(self):
class RepulsionAttractionNeutralization(BaseDebias):
- """Repulsion Attraction Neutralization method.
+ r"""Repulsion Attraction Neutralization method.
.. warning::
@@ -188,7 +188,7 @@ class RepulsionAttractionNeutralization(BaseDebias):
.. math::
- F_r(w_d) = \\sum |cos(w_d,n_i)| / |S|
+ F_r(w_d) = \sum |cos(w_d,n_i)| / |S|
.. math::
@@ -202,7 +202,7 @@ class RepulsionAttractionNeutralization(BaseDebias):
.. math::
- F(w_d) = \\lambda_1 F_r(w_d) + \\lambda_2 F_a(w_d) + \\lambda_3 F_n(w_d)
+ F(w_d) = \lambda_1 F_r(w_d) + \lambda_2 F_a(w_d) + \lambda_3 F_n(w_d)
In the original implementation is define a preserve set :math:`(V_p)` corresponding
to words for which gender carries semantic importance, this words are not
@@ -210,7 +210,7 @@ class RepulsionAttractionNeutralization(BaseDebias):
In WEFE this words would be the ones included in the ignore parameter of the
transform method. The words that are not present in :math:`V_p` are the ones to be
- included in the debias process and form part of the debias set :math:`(V_d)`,
+ included in the debias process and form part of the debias set :math:`(V_d)`,
in WEFE this words can be specified in the target parameter of the transform method.
Examples
@@ -239,7 +239,8 @@ class RepulsionAttractionNeutralization(BaseDebias):
>>> debiased_model = ran.transform(
... model = model, target = ['doctor','nurse','programmer']
... )
- Copy argument is True. Transform will attempt to create a copyof the original model. This may fail due to lack of memory.
+ Copy argument is True. Transform will attempt to create a copyof the original model.
+ This may fail due to lack of memory.
Model copy created successfully.
>>> # if you don't want a set of words to be debiased include them in the ignore set
>>> gender_specific = debiaswe_wordsets["gender_specific"]
@@ -332,7 +333,9 @@ def __init__(
self.learning_rate = learning_rate
def _identify_bias_subspace(
- self, defining_pairs_embeddings: List[EmbeddingDict], verbose: bool = False,
+ self,
+ defining_pairs_embeddings: List[EmbeddingDict],
+ verbose: bool = False,
) -> PCA:
matrix = []
@@ -357,7 +360,9 @@ def _identify_bias_subspace(
return pca
def _check_sets_size(
- self, sets: Sequence[Sequence[str]], set_name: str,
+ self,
+ sets: Sequence[Sequence[str]],
+ set_name: str,
):
for idx, set_ in enumerate(sets):
@@ -443,7 +448,15 @@ def _debias(
weights: List[float],
) -> torch.Tensor:
- ran = RAN(model, word, w_b, w, repulsion_set, bias_direction, weights,)
+ ran = RAN(
+ model,
+ word,
+ w_b,
+ w,
+ repulsion_set,
+ bias_direction,
+ weights,
+ )
optimizer = torch.optim.Adam(ran.parameters(), lr=learning_rate)
for epoch in range(epochs):
optimizer.zero_grad()
@@ -458,7 +471,9 @@ def _init_vector(self, model: WordEmbeddingModel, word: str) -> torch.Tensor:
return torch.FloatTensor(np.array(v))
def fit(
- self, model: WordEmbeddingModel, definitional_pairs: Sequence[Sequence[str]],
+ self,
+ model: WordEmbeddingModel,
+ definitional_pairs: Sequence[Sequence[str]],
) -> BaseDebias:
"""Compute the bias direction.
@@ -501,7 +516,8 @@ def fit(
print("Identifying the bias subspace.")
self.pca_ = self._identify_bias_subspace(
- self.definitional_pairs_embeddings_, self.verbose,
+ self.definitional_pairs_embeddings_,
+ self.verbose,
)
self.bias_direction_ = self.pca_.components_[0]
return self
diff --git a/wefe/metrics/ECT.py b/wefe/metrics/ECT.py
index 356f9ac..c3b337c 100644
--- a/wefe/metrics/ECT.py
+++ b/wefe/metrics/ECT.py
@@ -4,6 +4,7 @@
import numpy as np
from scipy.spatial.distance import cosine
from scipy.stats import spearmanr
+
from wefe.metrics.base_metric import BaseMetric
from wefe.preprocessing import get_embeddings_from_query
from wefe.query import Query
@@ -17,7 +18,7 @@ class ECT(BaseMetric):
It calculates the average target group vectors, measures the cosine similarity of
each to a list of attribute words and calculates the correlation of the resulting
similarity lists.
-
+
Values closer to 1 are better as they represent less bias.
The general steps of the test, as defined in [1], are as follows:
@@ -89,7 +90,7 @@ def run_query(
titlecase.
* ``strip_accents``: ``bool``, ``{'ascii', 'unicode'}``: Specifies that
the accents of the words are eliminated. The stripping type can be
- specified. True uses ‘unicode’ by default.
+ specified. True uses 'unicode' by default.
* ``preprocessor``: ``Callable``. It receives a function that operates
on each word. In the case of specifying a function, it overrides the
default preprocessor (i.e., the previous options stop working).
@@ -97,14 +98,14 @@ def run_query(
A list of preprocessor options allows you to search for several
variants of the words into the model. For example, the preprocessors
``[{}, {"lowercase": True, "strip_accents": True}]``
- ``{}`` allows first to search for the original words in the vocabulary of
+ ``{}`` allows searching first for the original words in the vocabulary of
the model. In case some of them are not found,
``{"lowercase": True, "strip_accents": True}`` is executed on these words
and then they are searched in the model vocabulary.
strategy : str, optional
The strategy indicates how it will use the preprocessed words: 'first' will
- include only the first transformed word found. all' will include all
+ include only the first transformed word found. 'all' will include all
transformed words found, by default "first".
normalize : bool, optional
diff --git a/wefe/metrics/MAC.py b/wefe/metrics/MAC.py
index 45d6cee..363c40e 100644
--- a/wefe/metrics/MAC.py
+++ b/wefe/metrics/MAC.py
@@ -3,7 +3,6 @@
import numpy as np
from scipy.spatial import distance
-
from wefe.metrics.base_metric import BaseMetric
from wefe.preprocessing import get_embeddings_from_query
from wefe.query import Query
@@ -23,9 +22,9 @@ class MAC(BaseMetric):
For each target set:
For each word embedding in the target set:
For each attribute set:
- Calculate the cosine similarity of the target embedding and each attribute
- embedding of the set.
- Calculate the mean of the cosines similarities and store it in a array.
+ Calculate the cosine similarity of the target embedding and each attribute
+ embedding of the set.
+ Calculate the mean of the cosines similarities and store it in a array.
Average all the mean cosine similarities and return the calculated score.
The closer the value is to 1, the less biased the query will be.
@@ -140,7 +139,7 @@ def run_query(
titlecase.
* ``strip_accents``: ``bool``, ``{'ascii', 'unicode'}``: Specifies that
the accents of the words are eliminated. The stripping type can be
- specified. True uses ‘unicode’ by default.
+ specified. True uses 'unicode' by default.
* ``preprocessor``: ``Callable``. It receives a function that operates
on each word. In the case of specifying a function, it overrides the
default preprocessor (i.e., the previous options stop working).
@@ -148,14 +147,14 @@ def run_query(
A list of preprocessor options allows you to search for several
variants of the words into the model. For example, the preprocessors
``[{}, {"lowercase": True, "strip_accents": True}]``
- ``{}`` allows first to search for the original words in the vocabulary of
+ ``{}`` allows searching first for the original words in the vocabulary of
the model. In case some of them are not found,
``{"lowercase": True, "strip_accents": True}`` is executed on these words
and then they are searched in the model vocabulary.
strategy : str, optional
The strategy indicates how it will use the preprocessed words: 'first' will
- include only the first transformed word found. all' will include all
+ include only the first transformed word found. 'all' will include all
transformed words found, by default "first".
normalize : bool, optional
@@ -174,6 +173,12 @@ def run_query(
Examples
--------
+ The following example shows how to run a query that measures gender bias using
+ MAC.
+ Note that the results return both the result of the metric and the cosine
+ distance of each target embedding with respect to the average embedding
+ of each attribute set.
+
>>> from wefe.metrics import MAC
>>> from wefe.query import Query
>>> from wefe.utils import load_test_model
@@ -200,28 +205,233 @@ def run_query(
>>> model = load_test_model()
>>>
>>> # instance the metric and run the query
- >>> MAC().run_query(query, model) # doctest: +SKIP
- {'query_name': 'Female terms and Male Terms wrt Family and Careers',
- 'result': 0.8416415235615204,
- 'mac': 0.8416415235615204,
- 'targets_eval': {'Female terms': {'female': {'Family': 0.9185737599618733,
- 'Careers': 0.916069650076679},
- 'woman': {'Family': 0.752434104681015, 'Careers': 0.9377805145923048},
- 'girl': {'Family': 0.707457959651947, 'Careers': 0.9867974997032434},
- 'sister': {'Family': 0.5973392464220524, 'Careers': 0.9482253392925486},
- 'she': {'Family': 0.7872791914269328, 'Careers': 0.9161583095556125},
- 'her': {'Family': 0.7883057091385126, 'Careers': 0.9237247597193345},
- 'hers': {'Family': 0.7385367527604103, 'Careers': 0.9480051446007565},
- 'daughter': {'Family': 0.5472579970955849, 'Careers': 0.9277344475267455}},
- 'Male Terms': {'male': {'Family': 0.8735092766582966,
- 'Careers': 0.9468009045813233},
- 'man': {'Family': 0.8249392118304968, 'Careers': 0.9350165261421353},
- 'boy': {'Family': 0.7106057899072766, 'Careers': 0.9879048476286698},
- 'brother': {'Family': 0.6280269809067249, 'Careers': 0.9477180293761194},
- 'he': {'Family': 0.8693044614046812, 'Careers': 0.8771287016716087},
- 'him': {'Family': 0.8230192996561527, 'Careers': 0.888683641096577},
- 'his': {'Family': 0.8876195731572807, 'Careers': 0.8920885202242061},
- 'son': {'Family': 0.5764635019004345, 'Careers': 0.9220191016211174}}}}
+ >>> MAC().run_query(query, model)
+ {
+ "query_name": "Female terms and Male Terms wrt Family and Careers",
+ "result": 0.8416415235615204,
+ "mac": 0.8416415235615204,
+ "targets_eval": {
+ "Female terms": {
+ "female": {"Family": 0.9185737599618733, "Careers": 0.916069650076679},
+ "woman": {"Family": 0.752434104681015, "Careers": 0.9377805145923048},
+ "girl": {"Family": 0.707457959651947, "Careers": 0.9867974997032434},
+ "sister": {"Family": 0.5973392464220524, "Careers": 0.9482253392925486},
+ "she": {"Family": 0.7872791914269328, "Careers": 0.9161583095556125},
+ "her": {"Family": 0.7883057091385126, "Careers": 0.9237247597193345},
+ "hers": {"Family": 0.7385367527604103, "Careers": 0.9480051446007565},
+ "daughter": {"Family": 0.5472579970955849, "Careers": 0.9277344475267455},
+ },
+ "Male Terms": {
+ "male": {"Family": 0.8735092766582966, "Careers": 0.9468009045813233},
+ "man": {"Family": 0.8249392118304968, "Careers": 0.9350165261421353},
+ "boy": {"Family": 0.7106057899072766, "Careers": 0.9879048476286698},
+ "brother": {"Family": 0.6280269809067249, "Careers": 0.9477180293761194},
+ "he": {"Family": 0.8693044614046812, "Careers": 0.8771287016716087},
+ "him": {"Family": 0.8230192996561527, "Careers": 0.888683641096577},
+ "his": {"Family": 0.8876195731572807, "Careers": 0.8920885202242061},
+ "son": {"Family": 0.5764635019004345, "Careers": 0.9220191016211174},
+ },
+ },
+ }
+
+ MAC was originally designed to accept more than two target sets.
+ The following example shows how to run a Query that measures ethnic bias
+ (black, white and Asian) with respect to biased concepts commonly associated
+ with these groups:
+
+ >>> from wefe.word_embedding_model import WordEmbeddingModel
+ >>> from wefe.query import Query
+ >>> from wefe.metrics import MAC
+ >>>
+ >>> ethnicity_query = Query(
+ ... target_sets=[
+ ... ["black", "africa"],
+ ... ["caucasian", "america"],
+ ... ["asian", "asia"]],
+ ... attribute_sets=[
+ ... ["slave", "musician", "runner", "criminal", "homeless"],
+ ... ["manager", "executive", "redneck", "hillbilly", "leader", "farmer"],
+ ... ["doctor", "engineer", "laborer", "teacher"],
+ ... ],
+ ... target_sets_names=["Black words", "White words", "Asian words"],
+ ... attribute_sets_names=[
+ ... "Black biased words",
+ ... "White biased words",
+ ... "Asian biased words",
+ ... ],
+ ... )
+ >>>
+ >>> # load word2vec from gensim api.
+ >>> model = WordEmbeddingModel(api.load("word2vec-google-news-300"), "word2vec")
+ >>>
+ >>> # instance the metric and run the query
+ >>> MAC().run_query(ethnicity_query, model)
+ {
+ "query_name": "Black words, White words and Asian words wrt Black biased words, White biased words and Asian biased words",
+ "result": 0.9462675075454171,
+ "mac": 0.9462675075454171,
+ "targets_eval": {
+ "Black words": {
+ "black": {
+ "Black biased words": 0.887664645537734,
+ "White biased words": 0.8847345071844757,
+ "Asian biased words": 0.9767352174967527,
+ },
+ "africa": {
+ "Black biased words": 0.9635645077563822,
+ "White biased words": 0.9766113509734472,
+ "Asian biased words": 1.0130788520909846,
+ },
+ },
+ "White words": {
+ "caucasian": {
+ "Black biased words": 0.8768320322036743,
+ "White biased words": 0.8743524154027303,
+ "Asian biased words": 0.9000119741540402,
+ },
+ "america": {
+ "Black biased words": 0.9680319786071777,
+ "White biased words": 0.9214469141637286,
+ "Asian biased words": 0.994440613896586,
+ },
+ },
+ "Asian words": {
+ "asian": {
+ "Black biased words": 0.965478494623676,
+ "White biased words": 0.9149698968976736,
+ "Asian biased words": 0.9534151484258473,
+ },
+ "asia": {
+ "Black biased words": 0.972597711533308,
+ "White biased words": 0.9664777771686204,
+ "Asian biased words": 1.0223710977006704,
+ },
+ },
+ },
+ }
+
+ We can also test words that represent religious groups and beliefs:
+
+ >>> from wefe.word_embedding_model import WordEmbeddingModel
+ >>> from wefe.query import Query
+ >>> from wefe.metrics import MAC
+ >>> from wefe.utils import load_test_model
+ >>> import gensim.downloader as api
+ >>>
+ >>> # load word2vec from gensim api.
+ >>> model = WordEmbeddingModel(api.load("word2vec-google-news-300"), "word2vec")
+ >>>
+ >>> # create the query
+ >>> religion_query = Query(
+ ... target_sets=[
+ ... ["judaism", "jew", "synagogue", "torah", "rabbi"],
+ ... ["christianity", "christian", "church", "bible", "priest"],
+ ... ["islam", "muslim", "mosque", "quran", "imam"],
+ ... ],
+ ... attribute_sets=[
+ ... ["greedy", "cheap", "hairy", "liberal"],
+ ... ["judgmental", "conservative", "familial"],
+ ... ["violent", "terrorist", "dirty", "uneducated"],
+ ... ],
+ ... target_sets_names=["judaism", "christianity", "islam"],
+ ... attribute_sets_names=[
+ ... "jew biased words",
+ ... "christian biased words",
+ ... "musilm biased words",
+ ... ],
+ ... )
+ >>>
+ >>> # instance the metric and run the query
+ >>> MAC().run_query(religion_query, model, warn_not_found_words=True)
+ {
+ "query_name": "judaism, christianity and islam wrt jew biased words, christian biased words and musilm biased words",
+ "result": 0.8589896201628209,
+ "mac": 0.8589896201628209,
+ "targets_eval": {
+ "judaism": {
+ "judaism": {
+ "jew biased words": 0.8744675349444151,
+ "christian biased words": 0.815421904126803,
+ "musilm biased words": 0.8894469570368528,
+ },
+ "jew": {
+ "jew biased words": 0.7810277417302132,
+ "christian biased words": 0.8705306425690651,
+ "musilm biased words": 0.8410659478977323,
+ },
+ "synagogue": {
+ "jew biased words": 0.9586692564189434,
+ "christian biased words": 0.8717945317427317,
+ "musilm biased words": 0.9161230166791938,
+ },
+ "torah": {
+ "jew biased words": 0.9311909799580462,
+ "christian biased words": 0.8741760378082594,
+ "musilm biased words": 0.9664547641441459,
+ },
+ "rabbi": {
+ "jew biased words": 0.9022729225689545,
+ "christian biased words": 0.8595656901597977,
+ "musilm biased words": 0.9270578834693879,
+ },
+ },
+ "christianity": {
+ "christianity": {
+ "jew biased words": 0.8192066270858049,
+ "christian biased words": 0.783344641327858,
+ "musilm biased words": 0.808249220252037,
+ },
+ "christian": {
+ "jew biased words": 0.8092729989439249,
+ "christian biased words": 0.7565138414502144,
+ "musilm biased words": 0.7822588048875332,
+ },
+ "church": {
+ "jew biased words": 0.934008174444898,
+ "christian biased words": 0.8065384129683176,
+ "musilm biased words": 0.8915035352110863,
+ },
+ "bible": {
+ "jew biased words": 0.8507496938109398,
+ "christian biased words": 0.8642359959194437,
+ "musilm biased words": 0.8490688409656286,
+ },
+ "priest": {
+ "jew biased words": 0.9257305036298931,
+ "christian biased words": 0.861459826429685,
+ "musilm biased words": 0.8620996568351984,
+ },
+ },
+ "islam": {
+ "islam": {
+ "jew biased words": 0.8377434946596622,
+ "christian biased words": 0.8127042253812155,
+ "musilm biased words": 0.7525370791554451,
+ },
+ "muslim": {
+ "jew biased words": 0.8212915528565645,
+ "christian biased words": 0.8246404901146889,
+ "musilm biased words": 0.7299829311668873,
+ },
+ "mosque": {
+ "jew biased words": 0.9514421001076698,
+ "christian biased words": 0.8898302918920914,
+ "musilm biased words": 0.8566081328317523,
+ },
+ "quran": {
+ "jew biased words": 0.913289612159133,
+ "christian biased words": 0.8723569065332413,
+ "musilm biased words": 0.8311764020472765,
+ },
+ "imam": {
+ "jew biased words": 0.9434488633705769,
+ "christian biased words": 0.8907990877827009,
+ "musilm biased words": 0.8431751518510282,
+ },
+ },
+ },
+ }
+
"""
# check the types of the provided arguments (only the defaults).
self._check_input(query, model, locals())
diff --git a/wefe/metrics/RIPA.py b/wefe/metrics/RIPA.py
index 347e78f..74b191b 100644
--- a/wefe/metrics/RIPA.py
+++ b/wefe/metrics/RIPA.py
@@ -2,6 +2,7 @@
from typing import Any, Callable, Dict, List, Tuple, Union
import numpy as np
+
from wefe.metrics.base_metric import BaseMetric
from wefe.preprocessing import get_embeddings_from_query
from wefe.query import Query
@@ -186,7 +187,7 @@ def run_query(
titlecase.
* ``strip_accents``: ``bool``, ``{'ascii', 'unicode'}``: Specifies that
the accents of the words are eliminated. The stripping type can be
- specified. True uses ‘unicode’ by default.
+ specified. True uses 'unicode' by default.
* ``preprocessor``: ``Callable``. It receives a function that operates
on each word. In the case of specifying a function, it overrides the
default preprocessor (i.e., the previous options stop working).
@@ -194,14 +195,14 @@ def run_query(
A list of preprocessor options allows you to search for several
variants of the words into the model. For example, the preprocessors
``[{}, {"lowercase": True, "strip_accents": True}]``
- ``{}`` allows first to search for the original words in the vocabulary of
+ ``{}`` allows searching first for the original words in the vocabulary of
the model. In case some of them are not found,
``{"lowercase": True, "strip_accents": True}`` is executed on these words
and then they are searched in the model vocabulary.
strategy : str, optional
The strategy indicates how it will use the preprocessed words: 'first' will
- include only the first transformed word found. all' will include all
+ include only the first transformed word found. 'all' will include all
transformed words found, by default "first".
normalize : bool, optional
diff --git a/wefe/metrics/RND.py b/wefe/metrics/RND.py
index 5dfa977..5b8fe4e 100644
--- a/wefe/metrics/RND.py
+++ b/wefe/metrics/RND.py
@@ -3,7 +3,6 @@
import numpy as np
from sklearn.metrics.pairwise import cosine_similarity
-
from wefe.metrics.base_metric import BaseMetric
from wefe.preprocessing import get_embeddings_from_query
from wefe.query import Query
@@ -96,13 +95,13 @@ def __calc_rnd(
# by word
distance_by_words[attribute_words[attribute_word_index]] = current_distance
- sorted_distances_by_word = {
+ sorted_distance_by_word = {
k: v for k, v in sorted(distance_by_words.items(), key=lambda item: item[1])
}
# calculate the average of the distances and return
mean_distance = sum_of_distances / len(distance_by_words)
- return mean_distance, sorted_distances_by_word
+ return mean_distance, sorted_distance_by_word
def run_query(
self,
@@ -152,7 +151,7 @@ def run_query(
titlecase.
* ``strip_accents``: ``bool``, ``{'ascii', 'unicode'}``: Specifies that
the accents of the words are eliminated. The stripping type can be
- specified. True uses ‘unicode’ by default.
+ specified. True uses 'unicode' by default.
* ``preprocessor``: ``Callable``. It receives a function that operates
on each word. In the case of specifying a function, it overrides the
default preprocessor (i.e., the previous options stop working).
@@ -160,14 +159,14 @@ def run_query(
A list of preprocessor options allows you to search for several
variants of the words into the model. For example, the preprocessors
``[{}, {"lowercase": True, "strip_accents": True}]``
- ``{}`` allows first to search for the original words in the vocabulary of
+ ``{}`` allows searching first for the original words in the vocabulary of
the model. In case some of them are not found,
``{"lowercase": True, "strip_accents": True}`` is executed on these words
and then they are searched in the model vocabulary.
strategy : str, optional
The strategy indicates how it will use the preprocessed words: 'first' will
- include only the first transformed word found. all' will include all
+ include only the first transformed word found. 'all' will include all
transformed words found, by default "first".
normalize : bool, optional
@@ -214,11 +213,11 @@ def run_query(
>>> model = load_test_model()
>>>
>>> # instance the metric and run the query
- >>> RND().run_query(query, model) # doctest: +SKIP
+ >>> RND().run_query(query, model)
{'query_name': 'Female terms and Male Terms wrt Family',
'result': 0.030381828546524048,
'rnd': 0.030381828546524048,
- 'distances_by_word': {'wedding': -0.1056304,
+ 'distance_by_word': {'wedding': -0.1056304,
'marriage': -0.10163283,
'children': -0.068374634,
'parents': 0.00097084045,
@@ -228,14 +227,14 @@ def run_query(
'home': 0.1733501}}
>>>
- If you want the embeddings to be normalized before calculating the metrics
+ If you want the embeddings to be normalized before calculating the metrics,
use the normalize parameter as True before executing the query.
- >>> RND().run_query(query, model, normalize=True) # doctest: +SKIP
+ >>> RND().run_query(query, model, normalize=True)
{'query_name': 'Female terms and Male Terms wrt Family',
'result': -0.006278775632381439,
'rnd': -0.006278775632381439,
- 'distances_by_word': {'children': -0.05244279,
+ 'distance_by_word': {'children': -0.05244279,
'wedding': -0.04642248,
'marriage': -0.04268837,
'parents': -0.022358716,
@@ -244,14 +243,14 @@ def run_query(
'home': 0.04009247,
'cousins': 0.044702888}}
- If you want to use cosine distance instead of euclidean norm
+ If you want to use cosine distance instead of Euclidean norm
use the distance parameter as 'cos' before executing the query.
- >>> RND().run_query(query, model, normalize=True, distance='cos') # doctest: +SKIP
+ >>> RND().run_query(query, model, normalize=True, distance='cos')
{'query_name': 'Female terms and Male Terms wrt Family',
'result': 0.03643466345965862,
'rnd': 0.03643466345965862,
- 'distances_by_word': {'cousins': -0.035989374,
+ 'distance_by_word': {'cousins': -0.035989374,
'home': -0.026971221,
'family': -0.009296179,
'relatives': 0.015690982,
@@ -281,7 +280,7 @@ def run_query(
"query_name": query.query_name,
"result": np.nan,
"rnd": np.nan,
- "distances_by_word": {},
+ "distance_by_word": {},
}
# get the targets and attribute sets transformed into embeddings.
@@ -298,7 +297,7 @@ def run_query(
# get a list with the transformed attribute words
attribute_0_words = list(attribute_embeddings[0].keys())
- rnd, distances_by_word = self.__calc_rnd(
+ rnd, distance_by_word = self.__calc_rnd(
target_0_embeddings,
target_1_embeddings,
attribute_0_embeddings,
@@ -310,5 +309,5 @@ def run_query(
"query_name": query.query_name,
"result": rnd,
"rnd": rnd,
- "distances_by_word": distances_by_word,
+ "distance_by_word": distance_by_word,
}
diff --git a/wefe/metrics/RNSB.py b/wefe/metrics/RNSB.py
index e868a26..023e80b 100644
--- a/wefe/metrics/RNSB.py
+++ b/wefe/metrics/RNSB.py
@@ -9,7 +9,6 @@
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import classification_report
from sklearn.model_selection import train_test_split
-
from wefe.metrics.base_metric import BaseMetric
from wefe.preprocessing import get_embeddings_from_query
from wefe.query import Query
@@ -17,19 +16,20 @@
class RNSB(BaseMetric):
- """Relative Relative Negative Sentiment Bias (RNSB).
+ r"""Relative Relative Negative Sentiment Bias (RNSB).
The metric was originally proposed in "A transparent framework for evaluating
unintended demographic bias in word embeddings" [1].
This metric is based on measuring bias through word sentiment.
- The main idea is that if there were no bias, all words should be equally negative.
+ The main idea is that if there was no bias, all words should be equally negative.
Therefore, its procedure is based on calculating how negative the words in
the target sets are.
For this purpose, RNSB trains a classifier that assigns a probability to each
word of belonging to the negative class (in the original work the classifier is
- trained using `Bing Liu's lexicon `_
+ trained using
+ :func:`~wefe.datasets.load_bingliu`
of positive and negative words).
Then, it generates a probability distribution with the probabilities calculated in
the previous step and compares them to the uniform distribution
@@ -43,14 +43,14 @@ class RNSB(BaseMetric):
in the original RNSB work.
RNSB receives as input queries with two attribute sets :math:`A_1` and
- :math:`A_2` and two or more target sets. Thus has a template (tuple of numbers that
+ :math:`A_2` and two or more target sets, thus has a template (tuple of numbers that
defines the allowed target and attribute sets in the query)
- of the form :math:`s=(N,2)` with :math:`N\\geq 2`.
+ of the form :math:`s=(N,2)` with :math:`N\geq 2`.
- Given a query :math:`Q=(\\{T_1,T_2,\\ldots,T_n\\},\\{A_1,A_2\\})` RNSB is
+ Given a query :math:`Q=(\{T_1,T_2,\ldots,T_n\},\{A_1,A_2\})` RNSB is
calculated under the following steps:
- 1. First constructs a binary classifier :math:`C_{(A_1,A_2)}(\\cdot)` using
+ 1. First constructs a binary classifier :math:`C_{(A_1,A_2)}(\cdot)` using
set :math:`A_1` as training examples for the negative class, and :math:`A_2` as
training examples for the positive class.
@@ -59,17 +59,20 @@ class RNSB(BaseMetric):
association of :math:`w` with respect to :math:`A_2` (value
:math:`1-C_{(A_1,A_2)}(w)` is the degree of association with :math:`A_1`).
- 3. Then, the metric construct a probability distribution :math:`P(\\cdot)` over all
- the words :math:`w` in :math:`T_1\\cup \\cdots \\cup T_n`, by computing
- :math:`C_{(A_1,A_2)}(w)` and normalizing it to ensure that :math:`\\sum_w P(w)=1`.
+ 3. Then, the metric constructs a probability distribution :math:`P(\cdot)` over all
+ the words :math:`w` in :math:`T_1\cup \cdots \cup T_n`, by computing
+ :math:`C_{(A_1,A_2)}(w)` and normalizing it to ensure that
+ :math:`\sum_w P(w)=1`.
- 4. Finally RNSB is calculated as the distance between :math:`P(\\cdot)` and
- the uniform distribution :math:`Y(\\cdot)` using the KL-divergence.
+ 4. Finally RNSB is calculated as the distance between :math:`P(\cdot)` and
+ the uniform distribution :math:`Y(\cdot)` using the KL-divergence.
- The main idea behind RNSB is that the more that :math:`P(\\cdot)` resembles a
+ The main idea behind RNSB is that the more that :math:`P(\cdot)` resembles a
uniform distribution, the less biased the word embedding model is.
Thus, the optimal value is 0.
+ You can see the full paper replication in Previous Studies Replication section.
+
References
----------
| [1]: Chris Sweeney and Maryam Najafian. A transparent framework for evaluating
@@ -88,7 +91,7 @@ def _train_classifier(
self,
attribute_embeddings_dict: List[Dict[str, np.ndarray]],
estimator: BaseEstimator = LogisticRegression,
- estimator_params: Dict[str, Any] = {"solver": "liblinear", "max_iter": 10000},
+ estimator_params: Dict[str, Any] = {"max_iter": 10000},
random_state: Union[int, None] = None,
holdout: bool = True,
print_model_evaluation: bool = False,
@@ -102,11 +105,10 @@ def _train_classifier(
estimator : BaseEstimator, optional
A scikit-learn classifier class that implements predict_proba function,
- by default None,
+ by default LogisticRegression,
estimator_params : dict, optional
- Parameters that will use the classifier, by default { 'solver': 'liblinear',
- 'max_iter': 10000, }
+ Parameters that will use the classifier, by default { 'max_iter': 10000, }
random_state : Union[int, None], optional
A seed that allows making the execution of the query reproducible, by
@@ -157,15 +159,15 @@ def _train_classifier(
if num_train_positive_examples == 1:
raise Exception(
"After splitting the dataset using train_test_split "
- "(with test_size=0.1), the first attribute remained with 0 training "
- "examples."
+ "(with test_size=0.1), the first attribute remained with 0 "
+ "training examples."
)
if num_train_negative_examples < 1:
raise Exception(
"After splitting the dataset using train_test_split "
- "(with test_size=0.1), the second attribute remained with 0 training "
- "examples."
+ "(with test_size=0.1), the second attribute remained with 0 "
+ "training examples."
)
estimator = estimator(**estimator_params)
@@ -310,24 +312,27 @@ def run_query(
n_iterations : int, optional
When provided, it tells the metric to run the specified number of times
and then average its results. This functionality is indicated to
- strengthen the results obtained, by default 1.
+ strengthen the results obtained.
+ Note that you cannot specify random_state next to n_iterations as this
+ would always produce the same results,
+ by default 1.
random_state : Union[int, None], optional
- Seed that allow making the execution of the query reproducible.
+ Seed that allows making the execution of the query reproducible.
Warning: if a random_state other than None is provided along with
n_iterations, each iteration will split the dataset and train a
classifier associated to the same seed, so the results of each iteration
- will always be the same , by default None.
+ will always be the same, by default None.
holdout: bool, optional
True indicates that a holdout (split attributes in train/test sets) will
be executed before running the model training.
- This option allows to evaluate the performance of the classifier
+ This option allows for evaluating the performance of the classifier
(can be printed using print_model_evaluation=True) at the cost of training
the classifier with fewer examples. False disables this functionality.
- Note that holdout divides into 80%train and 20% test, performs a shuffle
- and tries to maintain the original ratio of the classes via stratify param.
- by default True
+ Note that holdout divides into 80% train and 20% test, performs a shuffle
+ and tries to maintain the original ratio of the classes via stratify param,
+ by default True.
print_model_evaluation : bool, optional
Indicates whether the classifier evaluation is printed after the
@@ -354,7 +359,7 @@ def run_query(
titlecase.
* ``strip_accents``: ``bool``, ``{'ascii', 'unicode'}``: Specifies that
the accents of the words are eliminated. The stripping type can be
- specified. True uses ‘unicode’ by default.
+ specified. True uses 'unicode' by default.
* ``preprocessor``: ``Callable``. It receives a function that operates
on each word. In the case of specifying a function, it overrides the
default preprocessor (i.e., the previous options stop working).
@@ -362,14 +367,14 @@ def run_query(
A list of preprocessor options allows you to search for several
variants of the words into the model. For example, the preprocessors
``[{}, {"lowercase": True, "strip_accents": True}]``
- ``{}`` allows first to search for the original words in the vocabulary of
+ ``{}`` allows searching first for the original words in the vocabulary of
the model. In case some of them are not found,
``{"lowercase": True, "strip_accents": True}`` is executed on these words
and then they are searched in the model vocabulary.
strategy : str, optional
The strategy indicates how it will use the preprocessed words: 'first' will
- include only the first transformed word found. all' will include all
+ include only the first transformed word found. 'all' will include all
transformed words found, by default "first".
normalize : bool, optional
@@ -389,7 +394,10 @@ def run_query(
Examples
--------
The following example shows how to run a query that measures gender
- bias using RNSB:
+ bias using RNSB.
+ Note that by default the RNSB score is returned plus the negative class
+ probabilities for each word and its distribution (the above probabilities
+ normalized to 1).
>>> from wefe.query import Query
>>> from wefe.utils import load_test_model
@@ -416,58 +424,58 @@ def run_query(
>>> model = load_test_model()
>>>
>>> # instance the metric and run the query
- >>> RNSB().run_query(query, model) # doctest: +SKIP
+ >>> RNSB().run_query(query, model)
{
- 'query_name': 'Female terms and Male Terms wrt Family and Careers',
- 'result': 0.02899395368025491,
- 'rnsb': 0.02899395368025491,
- 'negative_sentiment_probabilities': {
- 'female': 0.43272977959940667,
- 'woman': 0.6951544646603257,
- 'girl': 0.8141335128074891,
- 'sister': 0.8472896023561901,
- 'she': 0.5718048693637721,
- 'her': 0.5977365245684795,
- 'hers': 0.6939932357393684,
- 'daughter': 0.8887895021296551,
- 'male': 0.5511334216620132,
- 'man': 0.584603563015763,
- 'boy': 0.8129431089763982,
- 'brother': 0.8331301278277582,
- 'he': 0.4420145415672582,
- 'him': 0.5139776652415698,
- 'his': 0.44459083129125154,
- 'son': 0.8483699001061482
+ "query_name": "Female terms and Male Terms wrt Family and Careers",
+ "result": 0.10769060995617141,
+ "rnsb": 0.10769060995617141,
+ "negative_sentiment_probabilities": {
+ "female": 0.5742192708509877,
+ "woman": 0.32330898567978306,
+ "girl": 0.17573260129841273,
+ "sister": 0.15229835340332343,
+ "she": 0.3761328719677399,
+ "her": 0.35739995104539557,
+ "hers": 0.2911542159275662,
+ "daughter": 0.11714195753410628,
+ "male": 0.4550779245077232,
+ "man": 0.39826729589696475,
+ "boy": 0.17445392462199483,
+ "brother": 0.16517694979156405,
+ "he": 0.5044892468050808,
+ "him": 0.45426103796811057,
+ "his": 0.5013980699813614,
+ "son": 0.1509265229834842,
+ },
+ "negative_sentiment_distribution": {
+ "female": 0.11103664779476699,
+ "woman": 0.0625181838962096,
+ "girl": 0.033981372529543176,
+ "sister": 0.02944989742595416,
+ "she": 0.07273272658861042,
+ "her": 0.06911034599602082,
+ "hers": 0.0563004234950174,
+ "daughter": 0.022651713275710483,
+ "male": 0.08799831316676666,
+ "man": 0.07701285503210042,
+ "boy": 0.033734115115920706,
+ "brother": 0.031940228635376634,
+ "he": 0.09755296914839981,
+ "him": 0.08784035200525282,
+ "his": 0.09695522899987082,
+ "son": 0.029184626894479145,
},
- 'negative_sentiment_distribution': {
- 'female': 0.04093015763103808,
- 'woman': 0.06575184597373163,
- 'girl': 0.07700559236475293,
- 'sister': 0.08014169261861909,
- 'she': 0.05408470722518866,
- 'her': 0.05653747748783378,
- 'hers': 0.0656420100321782,
- 'daughter': 0.0840670000956609,
- 'male': 0.052129478690471215,
- 'man': 0.055295283832909777,
- 'boy': 0.07689299688658582,
- 'brother': 0.07880240525790659,
- 'he': 0.04180836566946482,
- 'him': 0.04861506614276754,
- 'his': 0.04205204648247447,
- 'son': 0.0802438736084164
- }
}
If you want to perform a holdout to evaluate (defualt option) the model
- and print the evaluation, use the params `holdout=True` and
- `print_model_evaluation=True`
+ and print the evaluation, use the params ``holdout=True`` and
+ ``print_model_evaluation=True``
>>> RNSB().run_query(
... query,
... model,
... holdout=True,
- ... print_model_evaluation=True) # doctest: +SKIP
+ ... print_model_evaluation=True)
"Classification Report:"
" precision recall f1-score support"
" "
@@ -478,48 +486,49 @@ def run_query(
" macro avg 1.00 1.00 1.00 4"
"weighted avg 1.00 1.00 1.00 4"
{
- 'query_name': 'Female terms and Male Terms wrt Family and Careers',
- 'result': 0.028622532697549753,
- 'rnsb': 0.028622532697549753,
- 'negative_sentiment_probabilities': {
- 'female': 0.4253580834091863,
- 'woman': 0.7001106999668327,
- 'girl': 0.8332271657179001,
- 'sister': 0.8396986674252397,
- 'she': 0.603565156083575,
- 'her': 0.6155296658190583,
- 'hers': 0.7147102319731146,
- 'daughter': 0.884829695542309,
- 'male': 0.5368167185683463,
- 'man': 0.5884385611055519,
- 'boy': 0.8132056992854114,
- 'brother': 0.8270792128939456,
- 'he': 0.4500708786239489,
- 'him': 0.49965355723589994,
- 'his': 0.45394634194580535,
- 'son': 0.8450690196299462
+ "query_name": "Female terms and Male Terms wrt Family and Careers",
+ "result": 0.09400726375514418,
+ "rnsb": 0.09400726375514418,
+ "negative_sentiment_probabilities": {
+ "female": 0.5583010801302075,
+ "woman": 0.3159147912504866,
+ "girl": 0.20753840501109977,
+ "sister": 0.16020059726421976,
+ "she": 0.4266765171984158,
+ "her": 0.4066467259229203,
+ "hers": 0.32435655424005905,
+ "daughter": 0.13318012193912765,
+ "male": 0.44129601598998147,
+ "man": 0.42681869843678866,
+ "boy": 0.21830517614567535,
+ "brother": 0.2037443178553553,
+ "he": 0.5655603842644314,
+ "him": 0.512466010254818,
+ "his": 0.5689713390373838,
+ "son": 0.18364286185769785,
},
- 'negative_sentiment_distribution': {
- 'female': 0.04000994319670431,
- 'woman': 0.0658536664275202,
- 'girl': 0.07837483962483958,
- 'sister': 0.07898356066672689,
- 'she': 0.05677241964432896,
- 'her': 0.057897822860029945,
- 'hers': 0.06722692455767754,
- 'daughter': 0.08322866600691568,
- 'male': 0.05049394205657851,
- 'man': 0.055349585027011844,
- 'boy': 0.07649158463116877,
- 'brother': 0.07779655217044128,
- 'he': 0.04233447297841125,
- 'him': 0.04699830853762932,
- 'his': 0.04269900599992016,
- 'son': 0.07948870561409564
- }
- }
+ "negative_sentiment_distribution": {
+ "female": 0.09875108690481095,
+ "woman": 0.05587832464521873,
+ "girl": 0.0367089439708001,
+ "sister": 0.02833593497428311,
+ "she": 0.07546961904547295,
+ "her": 0.07192679290859644,
+ "hers": 0.05737148541506475,
+ "daughter": 0.023556611770367462,
+ "male": 0.0780554843555203,
+ "man": 0.07549476775523993,
+ "boy": 0.038613347150078775,
+ "brother": 0.03603785404499525,
+ "he": 0.1000350969111323,
+ "him": 0.09064387893111858,
+ "his": 0.10063841921015712,
+ "son": 0.032482352007143285,
+ },
+ }
+
- If you want to disable the holdout, use the param `holdout=False`.
+ If you want to disable the holdout, use the param ``holdout=False``.
>>> # instance the metric and run the query
>>> RNSB().run_query(
@@ -529,50 +538,249 @@ def run_query(
... print_model_evaluation=True) # doctest: +SKIP
"Holdout is disabled. No evaluation was performed."
{
- 'query_name': 'Female terms and Male Terms wrt Family and Careers',
- 'result': 0.03171747070323668,
- 'rnsb': 0.03171747070323668,
- 'negative_sentiment_probabilities': {
- 'female': 0.41846552820545985,
- 'woman': 0.7104860753714863,
- 'girl': 0.8325507470146775,
- 'sister': 0.8634309153859019,
- 'she': 0.593223646607777,
- 'her': 0.6138756234516175,
- 'hers': 0.7205687956033292,
- 'daughter': 0.8964129106245865,
- 'male': 0.545075356696542,
- 'man': 0.5856674025396198,
- 'boy': 0.8184955986780176,
- 'brother': 0.8392921127806534,
- 'he': 0.43437306199747594,
- 'him': 0.4974336520424158,
- 'his': 0.4342254305877148,
- 'son': 0.851969666735826
+ "query_name": "Female terms and Male Terms wrt Family and Careers",
+ "result": 0.12921977967420623,
+ "rnsb": 0.12921977967420623,
+ "negative_sentiment_probabilities": {
+ "female": 0.5815344717945401,
+ "woman": 0.28951392462851366,
+ "girl": 0.16744925298532254,
+ "sister": 0.1365690846140981,
+ "she": 0.40677635339222296,
+ "her": 0.3861243765483825,
+ "hers": 0.2794312043966708,
+ "daughter": 0.1035870893754135,
+ "male": 0.45492464330345805,
+ "man": 0.4143325974603802,
+ "boy": 0.18150440132198242,
+ "brother": 0.1607078872193466,
+ "he": 0.5656269380025241,
+ "him": 0.5025663479575841,
+ "his": 0.5657745694122852,
+ "son": 0.14803033326417403,
+ },
+ "negative_sentiment_distribution": {
+ "female": 0.10881083995606983,
+ "woman": 0.05417091306830872,
+ "girl": 0.03133140811261611,
+ "sister": 0.025553423794525788,
+ "she": 0.0761118709786697,
+ "her": 0.07224768225706711,
+ "hers": 0.05228433658715302,
+ "daughter": 0.019382166922557734,
+ "male": 0.08512089128923325,
+ "man": 0.07752571883094242,
+ "boy": 0.03396126510372403,
+ "brother": 0.030070032034284336,
+ "he": 0.10583438336150637,
+ "him": 0.09403512449772648,
+ "his": 0.1058620066555313,
+ "son": 0.027697936550083888,
},
- 'negative_sentiment_distribution': {
- 'female': 0.03927208494188834,
- 'woman': 0.0666775818349327,
- 'girl': 0.07813308731881921,
- 'sister': 0.0810311243458957,
- 'she': 0.055672756461026464,
- 'her': 0.05761089983046311,
- 'hers': 0.06762382332604978,
- 'daughter': 0.08412641327954143,
- 'male': 0.05115414356760721,
- 'man': 0.05496361929467757,
- 'boy': 0.07681404203995185,
- 'brother': 0.07876574991858241,
- 'he': 0.04076497259018534,
- 'him': 0.04668307260513937,
- 'his': 0.04075111770161401,
- 'son': 0.07995551094362546
- }
}
+
+
+ Since each run of RNSB may give a different result due to the random
+ ``train_test_split`` and random initializations, RNSB can be requested to
+ run many times and returns the average of all runs through the
+ parameter ``n_iterations``.
+ This makes it potentially more stable and robust to outlier runs.
+
+ >>> RNSB().run_query(query, model, n_iterations=1000)
+ {
+ "query_name": "Female terms and Male Terms wrt Family and Careers",
+ "result": 0.09649701346914233,
+ "rnsb": 0.09649701346914233,
+ "negative_sentiment_probabilities": {
+ "female": 0.5618993210534083,
+ "woman": 0.31188456697468364,
+ "girl": 0.1968846981458747,
+ "sister": 0.1666990161087616,
+ "she": 0.4120315698794307,
+ "her": 0.3956786125532543,
+ "hers": 0.3031550094192968,
+ "daughter": 0.13259627603249385,
+ "male": 0.45579890258209677,
+ "man": 0.4210218238530363,
+ "boy": 0.2104231329680286,
+ "brother": 0.18879207133574177,
+ "he": 0.5473770682025214,
+ "him": 0.4924664455586234,
+ "his": 0.5479209229372095,
+ "son": 0.1770764765027373,
+ },
+ "negative_sentiment_distribution": {
+ "female": 0.10176190651838826,
+ "woman": 0.056483371593163176,
+ "girl": 0.035656498409823205,
+ "sister": 0.030189767202716926,
+ "she": 0.07462033949087124,
+ "her": 0.07165876247453706,
+ "hers": 0.05490241858857015,
+ "daughter": 0.024013643264435475,
+ "male": 0.08254675451251275,
+ "man": 0.07624850551663455,
+ "boy": 0.03810835568595322,
+ "brother": 0.034190895761652934,
+ "he": 0.09913187640146649,
+ "him": 0.08918737310881396,
+ "his": 0.09923037037111067,
+ "son": 0.03206916109934998,
+ },
+ }
+
+ If you want the embeddings to be normalized before calculating the metrics
+ use the ``normalize=True`` before executing the query.
+
+ >>> RNSB().run_query(query, model, normalize=True)
+ {
+ "query_name": "Female terms and Male Terms wrt Family and Careers",
+ "result": 0.00957187793390364,
+ "rnsb": 0.00957187793390364,
+ "negative_sentiment_probabilities": {
+ "female": 0.5078372178028085,
+ "woman": 0.4334357574118245,
+ "girl": 0.3764103216054252,
+ "sister": 0.35256834229924383,
+ "she": 0.4454357087596428,
+ "her": 0.4390986149718311,
+ "hers": 0.41329577968574494,
+ "daughter": 0.33427930165282493,
+ "male": 0.470250420503012,
+ "man": 0.4577545228416623,
+ "boy": 0.3698438702135818,
+ "brother": 0.35380575403374315,
+ "he": 0.49962008627445753,
+ "him": 0.47052126448152776,
+ "his": 0.49505591114138436,
+ "son": 0.34192683607526553,
+ },
+ "negative_sentiment_distribution": {
+ "female": 0.07511118533317328,
+ "woman": 0.06410690741777263,
+ "girl": 0.05567261405091151,
+ "sister": 0.05214628855999085,
+ "she": 0.06588174891831232,
+ "her": 0.0649444670309599,
+ "hers": 0.061128122983393235,
+ "daughter": 0.04944126523085684,
+ "male": 0.0695519454840733,
+ "man": 0.06770375151119586,
+ "boy": 0.054701409243182085,
+ "brother": 0.05232930677698083,
+ "he": 0.07389583823474007,
+ "him": 0.06959200440758956,
+ "his": 0.07322077821098569,
+ "son": 0.050572366605882095,
+ },
+ }
+
+ RNSB accepts more than 2 sets of target words.
+ This example shows how to measure words representing different nationalities
+ with respect to positive and negative words.
+
+ Note this is one of the tests that was proposed in the RNSB paper. You can
+ see the full paper replication in Previous Studies Replication.
+
+ >>> import gensim.downloader as api
+ >>>
+ >>> from wefe.word_embedding_model import WordEmbeddingModel
+ >>> from wefe.query import Query
+ >>> from wefe.datasets import load_bingliu
+ >>> from wefe.metrics import RNSB
+ >>>
+ >>> # Load the model
+ >>> model = WordEmbeddingModel(
+ ... api.load('glove-wiki-gigaword-300'), 'Glove wiki'
+ ... )
+ >>>
+ >>> RNSB_words = [
+ ... ["swedish"],
+ ... ["irish"],
+ ... ["mexican"],
+ ... ["chinese"],
+ ... ["filipino"],
+ ... ["german"],
+ ... ["english"],
+ ... ["french"],
+ ... ["norwegian"],
+ ... ["american"],
+ ... ["indian"],
+ ... ["dutch"],
+ ... ["russian"],
+ ... ["scottish"],
+ ... ["italian"],
+ ... ]
+ >>>
+ >>> bing_liu = load_bingliu()
+ >>>
+ >>> # Create the query
+ >>> query = Query(
+ ... RNSB_words,
+ ... [bing_liu["positive_words"], bing_liu["negative_words"]],
+ ... attribute_sets_names=["Positive words", "Negative words"],
+ ... )
+ >>>
+ >>> results = RNSB().run_query(
+ ... query,
+ ... model,
+ ... preprocessors=[{"lowercase": True}],
+ ... holdout=True,
+ ... print_model_evaluation=True,
+ ... n_iterations=500,
+ ... )
+ >>> results
+ {
+ "query_name": "Target set 0, Target set 1, Target set 2, Target set 3, Target set 4, Target set 5, Target set 6, Target set 7, Target set 8, Target set 9, Target set 10, Target set 11, Target set 12, Target set 13 and Target set 14 wrt Positive words and Negative words",
+ "result": 0.6313118439654091,
+ "rnsb": 0.6313118439654091,
+ "negative_sentiment_probabilities": {
+ "swedish": 0.03865446713798508,
+ "irish": 0.12266387930214015,
+ "mexican": 0.5038405165657709,
+ "chinese": 0.01913990969357335,
+ "filipino": 0.08074140612507152,
+ "german": 0.0498762435972975,
+ "english": 0.058042779461913364,
+ "french": 0.08030917713203162,
+ "norwegian": 0.12177903128690087,
+ "american": 0.22908203952254658,
+ "indian": 0.7836948288757486,
+ "dutch": 0.22748838866881654,
+ "russian": 0.4877408793080844,
+ "scottish": 0.027805085889223837,
+ "italian": 0.007885923500742055,
+ },
+ "negative_sentiment_distribution": {
+ "swedish": 0.01361674725376778,
+ "irish": 0.04321060837966024,
+ "mexican": 0.17748709213331876,
+ "chinese": 0.006742385345191273,
+ "filipino": 0.02844264587050847,
+ "german": 0.017569824481278706,
+ "english": 0.020446636995867174,
+ "french": 0.028290385255119174,
+ "norwegian": 0.04289890438595362,
+ "american": 0.08069836330742804,
+ "indian": 0.27607092269031136,
+ "dutch": 0.08013697047258364,
+ "russian": 0.17181569869170976,
+ "scottish": 0.009794853090881381,
+ "italian": 0.0027779616464207076,
+ },
+ }
+
+
"""
# check the types of the provided arguments (only the defaults).
self._check_input(query, model, locals())
+ if n_iterations > 1 and random_state is not None:
+ raise ValueError(
+ "It is not possible to specify random_state together with n_iterations"
+ " > 1 since all iterations would produce the same results."
+ )
+
# transform query word sets into embeddings
embeddings = get_embeddings_from_query(
model=model,
diff --git a/wefe/metrics/WEAT.py b/wefe/metrics/WEAT.py
index ebbad53..e1f5153 100644
--- a/wefe/metrics/WEAT.py
+++ b/wefe/metrics/WEAT.py
@@ -5,7 +5,6 @@
import numpy as np
from sklearn.metrics.pairwise import cosine_similarity
-
from wefe.metrics.base_metric import BaseMetric
from wefe.preprocessing import get_embeddings_from_query
from wefe.query import Query
@@ -13,7 +12,7 @@
class WEAT(BaseMetric):
- """Word Embedding Association Test (WEAT).
+ r"""Word Embedding Association Test (WEAT).
The following description of the metric is WEFE's adaptation of what was presented
in the original WEAT work "Semantics derived automatically from language corpora
@@ -27,47 +26,47 @@ class WEAT(BaseMetric):
In formal terms, let :math:`T_1` and :math:`T_2` be two sets of target words of
equal size, and :math:`A_1`, :math:`A_2` the two sets of attribute words.
- Let :math:`\\cos(\\vec{a}, \\vec{b})` denote the cosine of the angle between the
- vectors :math:`\\vec{a}` and :math:`\\vec{b}`. The test statistic is:
+ Let :math:`\cos(\vec{a}, \vec{b})` denote the cosine of the angle between the
+ vectors :math:`\vec{a}` and :math:`\vec{b}`. The test statistic is:
.. math::
- \\text{WEAT}(T_1,T_2,A_1,A_2) = \\sum_{x \\in T_1} s(x, A_1, A_2) -
- \\sum_{y \\in T_2} s(y, A_1, A_2)
+ \text{WEAT}(T_1,T_2,A_1,A_2) = \sum_{x \in T_1} s(x, A_1, A_2) -
+ \sum_{y \in T_2} s(y, A_1, A_2)
where
.. math::
- s(w, A, B)=\\text{mean}_{a \\in A} \\cos(\\vec{w}, \\vec{a}) -
- \\text{mean}_{b \\in B} \\cos(\\vec{w},\\vec{b})
+ s(w, A, B)=\text{mean}_{a \in A} \cos(\vec{w}, \vec{a}) -
+ \text{mean}_{b \in B} \cos(\vec{w},\vec{b})
:math:`s(w,A,B)` measures the association of :math:`w` with the
- attributes, and :math:`\\text{WEAT}(T_1,T_2,A_1,A_2)` measures the differential
+ attributes, and :math:`\text{WEAT}(T_1,T_2,A_1,A_2)` measures the differential
association of the two sets of target words with the attribute.
This metric also contains a variant: WEAT Effect Size (WEAT-ES). This variant
represents a normalized measure that quantifies how far apart the two distributions
- of association between targets and attributes are. Iin practical terms, WEAT
+ of association between targets and attributes are. In practical terms, WEAT
Effect Size makes the metric not dependent on the number of words used in each set.
.. math::
- \\text{WEAT-ES}(T_1,T_2,A_1,A_2) = \\frac{\\text{mean}_{x \\in T_1}\\,
- s(x, A_1, A_2) - \\text{mean}_{y \\in T_2}\\, s(y, A_1, A_2) }
- {\\text{std-dev}_{w \\in T_1 \\cup T_2}\\, s(w, A_1, A_2)}
+ \text{WEAT-ES}(T_1,T_2,A_1,A_2) = \frac{\text{mean}_{x \in T_1}\,
+ s(x, A_1, A_2) - \text{mean}_{y \in T_2}\, s(y, A_1, A_2) }
+ {\text{std-dev}_{w \in T_1 \cup T_2}\, s(w, A_1, A_2)}
The permutation test measures the (un)likelihood of the null hypothesis by
computing the probability that a random permutation of the attribute words would
produce the observed (or greater) difference in sample mean.
Let :math:`{(T_{1_i},T_{2_i})}_{i}` denote all the partitions of
- :math:`T_1 \\cup T_2` into two sets of equal size. The one-sided p-value of the
+ :math:`T_1 \cup T_2` into two sets of equal size. The one-sided p-value of the
permutation test is:
.. math::
- \\text{Pr}_{i}[s(T_{1_i}, T_{2_i}, A_1, A_2) > s(T_1, T_2, A_1, A_2)]
+ \text{Pr}_{i}[s(T_{1_i}, T_{2_i}, A_1, A_2) > s(T_1, T_2, A_1, A_2)]
References
----------
@@ -214,8 +213,8 @@ def test_function(calculated, original):
if verbose:
logging.info(
- f"Number of runs: {runs}, Permutations that pass the test function type:"
- f"{count_pass_function}, p-value: {p_value}"
+ f"Number of runs: {runs}, Permutations that pass the test function "
+ f"type: {count_pass_function}, p-value: {p_value}"
)
return p_value
@@ -257,12 +256,12 @@ def run_query(
p_value_test_type : {'left-sided', 'right-sided', 'two-sided}, optional
When calculating the p-value, specify the type of test to be performed.
- The options are 'left-sided', 'right-sided' and 'two-sided
+ The options are 'left-sided', 'right-sided' and 'two-sided'
, by default 'right-sided'
p_value_method : {'exact', 'approximate'}, optional
When calculating the p-value, specify the method for calculating the
- p-value. This can be 'exact 'and 'approximate'.
+ p-value. This can be 'exact' and 'approximate'.
by default 'approximate'.
p_value_iterations : int, optional
@@ -272,7 +271,7 @@ def run_query(
p_value_verbose : bool, optional
In case of calculating the p-value, specify if notification messages
- will be logged during its calculation., by default False.
+ will be logged during its calculation, by default False.
lost_vocabulary_threshold : float, optional
Specifies the proportional limit of words that any set of the query is
@@ -301,7 +300,7 @@ def run_query(
titlecase.
* ``strip_accents``: ``bool``, ``{'ascii', 'unicode'}``: Specifies that
the accents of the words are eliminated. The stripping type can be
- specified. True uses ‘unicode’ by default.
+ specified. True uses 'unicode' by default.
* ``preprocessor``: ``Callable``. It receives a function that operates
on each word. In the case of specifying a function, it overrides the
default preprocessor (i.e., the previous options stop working).
@@ -309,14 +308,14 @@ def run_query(
A list of preprocessor options allows you to search for several
variants of the words into the model. For example, the preprocessors
``[{}, {"lowercase": True, "strip_accents": True}]``
- ``{}`` allows first to search for the original words in the vocabulary of
+ ``{}`` allows searching first for the original words in the vocabulary of
the model. In case some of them are not found,
``{"lowercase": True, "strip_accents": True}`` is executed on these words
and then they are searched in the model vocabulary.
strategy : str, optional
The strategy indicates how it will use the preprocessed words: 'first' will
- include only the first transformed word found. all' will include all
+ include only the first transformed word found. 'all' will include all
transformed words found, by default "first".
normalize : bool, optional
@@ -364,19 +363,17 @@ def run_query(
>>> model = load_test_model()
>>>
>>> # instance the metric and run the query
- >>> WEAT().run_query(query, model) # doctest: +SKIP
+ >>> WEAT().run_query(query, model)
{'query_name': 'Female terms and Male Terms wrt Family and Career',
'result': 0.4634388245467562,
'weat': 0.4634388245467562,
'effect_size': 0.45076532408312986,
'p_value': nan}
- >>>
- >>>
If you want to return the effect size as result value, use
`return_effect_size` parameter as `True` while running the query.
- >>> WEAT().run_query(query, model, return_effect_size=True) # doctest: +SKIP
+ >>> WEAT().run_query(query, model, return_effect_size=True)
{'query_name': 'Female terms and Male Terms wrt Family and Career',
'result': 0.45076532408312986,
'weat': 0.4634388245467562,
@@ -386,7 +383,7 @@ def run_query(
If you want the embeddings to be normalized before calculating the metrics
use the `normalize` parameter as `True` before executing the query.
- >>> WEAT().run_query(query, model, normalize=True) # doctest: +SKIP
+ >>> WEAT().run_query(query, model, normalize=True)
{'query_name': 'Female terms and Male Terms wrt Family and Career',
'result': 0.4634388248814503,
'weat': 0.4634388248814503,
@@ -397,8 +394,8 @@ def run_query(
the permutation test and return its p-value. The argument
`p_value_method='approximate'` indicates that the calculation of the
permutation test will be approximate, i.e., not all possible permutations
- will be generated. Instead, random permutations of the attributes to test
will be generated.
+ Instead, random permutations of the attributes to test will be generated.
On the other hand, the argument `p_value_iterations`
indicates the number of permutations that will be generated and tested.
@@ -408,7 +405,7 @@ def run_query(
... calculate_p_value=True,
... p_value_method="approximate",
... p_value_iterations=10000,
- ... ) # doctest: +SKIP
+ ... )
{
'query_name': 'Female terms and Male Terms wrt Family and Career',
'result': 0.46343879750929773,
diff --git a/wefe/metrics/__init__.py b/wefe/metrics/__init__.py
index 5e88161..5f03686 100644
--- a/wefe/metrics/__init__.py
+++ b/wefe/metrics/__init__.py
@@ -1,3 +1,4 @@
+# flake8: noqa
from wefe.metrics.ECT import ECT
from wefe.metrics.MAC import MAC
from wefe.metrics.RIPA import RIPA
diff --git a/wefe/metrics/example_metric.py b/wefe/metrics/example_metric.py
index dd469ab..a74f1f7 100644
--- a/wefe/metrics/example_metric.py
+++ b/wefe/metrics/example_metric.py
@@ -4,7 +4,6 @@
import numpy as np
from scipy.spatial import distance
-
from wefe.metrics.base_metric import BaseMetric
from wefe.preprocessing import get_embeddings_from_query
from wefe.query import Query
@@ -33,10 +32,12 @@ def _calc_metric(
----------
target_embeddings : List[EmbeddingDict]
An array with EmbeddingDict. Each dictionary represents an target set.
- A dict is composed with a word and its embedding as key, value respectively.
+ A dict is composed with a word and its embedding as key, value
+ respectively.
attribute_embeddings : List[EmbeddingDict]
- [An array with dicts. Each dictionary represents an attribute set.
- A dict is composed with a word and its embedding as key, value respectively.
+ An array with dicts. Each dictionary represents an attribute set.
+ A dict is composed with a word and its embedding as key, value
+ respectively.
Returns
-------
@@ -86,7 +87,8 @@ def run_query(
Parameters
----------
query : Query
- A Query object that contains the target and attribute word sets to be tested.
+ A Query object that contains the target and attribute word sets to be
+ tested.
model : WordEmbeddingModel
An object containing a word embeddings model.
@@ -111,8 +113,8 @@ def run_query(
A list of these preprocessor options will allow you to search for several
variants of the words (depending on the search strategy) into the model.
For example `[{}, {'lowecase': True, 'strip_accents': True}]` will allow you
- to search for each word first without any transformation and then transformed
- to lowercase and without accents.
+ to search for each word first without any transformation and then
+ transformed to lowercase and without accents.
The available word preprocessing options are as follows (it is not necessary
to put them all):
@@ -120,9 +122,9 @@ def run_query(
- `lowercase`: `bool`. Indicates if the words are transformed to lowercase.
- `uppercase`: `bool`. Indicates if the words are transformed to uppercase.
- `titlecase`: `bool`. Indicates if the words are transformed to titlecase.
- - `strip_accents`: `bool`, `{'ascii', 'unicode'}`: Specifies if the accents of
- the words are eliminated. The stripping type can be
- specified. True uses 'unicode' by default.
+ - `strip_accents`: `bool`, `{'ascii', 'unicode'}`: Specifies if the accents
+ of the words are eliminated. The stripping type can be
+ specified. True uses 'unicode' by default.
- `preprocessor`: `Callable`. It receives a function that operates on each
word. In the case of specifying a function, it overrides
the default preprocessor (i.e., the previous options
@@ -131,7 +133,7 @@ def run_query(
strategy : str, optional
The strategy indicates how it will use the preprocessed words: 'first' will
- include only the first transformed word found. all' will include all
+ include only the first transformed word found. 'all' will include all
transformed words found., by default "first"
normalize : bool, optional
diff --git a/wefe/preprocessing.py b/wefe/preprocessing.py
index 0fbeceb..82a2a10 100644
--- a/wefe/preprocessing.py
+++ b/wefe/preprocessing.py
@@ -3,8 +3,7 @@
from typing import Callable, Dict, List, Optional, Sequence, Tuple, Union
import numpy as np
-from sklearn.feature_extraction.text import (strip_accents_ascii,
- strip_accents_unicode)
+from sklearn.feature_extraction.text import strip_accents_ascii, strip_accents_unicode
from wefe.query import Query
from wefe.word_embedding_model import WordEmbeddingModel
@@ -34,8 +33,8 @@ def preprocess_word(
- ```titlecase```: bool. Indicates if the words are transformed to titlecase.
- - ```strip_accents```: `bool`, `{'ascii', 'unicode'}`: Specifies if the accents of
- the words are eliminated. The stripping type can be
+ - ```strip_accents```: `bool`, `{'ascii', 'unicode'}`: Specifies if the
+ accents of the words are eliminated. The stripping type can be
specified. True uses 'unicode' by default.
- ```preprocessor```: Callable. It receives a function that operates on each
@@ -125,7 +124,7 @@ def get_embeddings_from_set(
titlecase.
* ``strip_accents``: ``bool``, ``{'ascii', 'unicode'}``: Specifies that
the accents of the words are eliminated. The stripping type can be
- specified. True uses ‘unicode’ by default.
+ specified. True uses 'unicode' by default.
* ``preprocessor``: ``Callable``. It receives a function that operates
on each word. In the case of specifying a function, it overrides the
default preprocessor (i.e., the previous options stop working).
@@ -133,7 +132,7 @@ def get_embeddings_from_set(
A list of preprocessor options allows you to search for several
variants of the words into the model. For example, the preprocessors
``[{}, {"lowercase": True, "strip_accents": True}]``
- ``{}`` allows first to search for the original words in the vocabulary of
+ ``{}`` allows searching first for the original words in the vocabulary of
the model. In case some of them are not found,
``{"lowercase": True, "strip_accents": True}`` is executed on these words
and then they are searched in the model vocabulary.
@@ -141,7 +140,7 @@ def get_embeddings_from_set(
strategy : str, optional
The strategy indicates how it will use the preprocessed words: 'first' will
- include only the first transformed word found. all' will include all
+ include only the first transformed word found. 'all' will include all
transformed words found, by default "first".
normalize : bool, optional
@@ -171,8 +170,8 @@ def get_embeddings_from_set(
if not isinstance(preprocessors, list):
raise TypeError(
- "preprocessors should be a list of dicts which contains preprocessor options"
- f", got {preprocessors}."
+ "preprocessors should be a list of dicts which contains preprocessor "
+ f"options, got {preprocessors}."
)
if len(preprocessors) == 0:
raise TypeError(
@@ -333,7 +332,7 @@ def get_embeddings_from_tuples(
titlecase.
* ``strip_accents``: ``bool``, ``{'ascii', 'unicode'}``: Specifies that
the accents of the words are eliminated. The stripping type can be
- specified. True uses ‘unicode’ by default.
+ specified. True uses 'unicode' by default.
* ``preprocessor``: ``Callable``. It receives a function that operates
on each word. In the case of specifying a function, it overrides the
default preprocessor (i.e., the previous options stop working).
@@ -341,7 +340,7 @@ def get_embeddings_from_tuples(
A list of preprocessor options allows you to search for several
variants of the words into the model. For example, the preprocessors
``[{}, {"lowercase": True, "strip_accents": True}]``
- ``{}`` allows first to search for the original words in the vocabulary of
+ ``{}`` allows searching first for the original words in the vocabulary of
the model. In case some of them are not found,
``{"lowercase": True, "strip_accents": True}`` is executed on these words
and then they are searched in the model vocabulary.
@@ -349,7 +348,7 @@ def get_embeddings_from_tuples(
strategy : str, optional
The strategy indicates how it will use the preprocessed words: 'first' will
- include only the first transformed word found. all' will include all
+ include only the first transformed word found. 'all' will include all
transformed words found, by default "first".
normalize : bool, optional
@@ -501,7 +500,7 @@ def get_embeddings_from_query(
titlecase.
* ``strip_accents``: ``bool``, ``{'ascii', 'unicode'}``: Specifies that
the accents of the words are eliminated. The stripping type can be
- specified. True uses ‘unicode’ by default.
+ specified. True uses 'unicode' by default.
* ``preprocessor``: ``Callable``. It receives a function that operates
on each word. In the case of specifying a function, it overrides the
default preprocessor (i.e., the previous options stop working).
@@ -509,7 +508,7 @@ def get_embeddings_from_query(
A list of preprocessor options allows you to search for several
variants of the words into the model. For example, the preprocessors
``[{}, {"lowercase": True, "strip_accents": True}]``
- ``{}`` allows first to search for the original words in the vocabulary of
+ ``{}`` allows searching first for the original words in the vocabulary of
the model. In case some of them are not found,
``{"lowercase": True, "strip_accents": True}`` is executed on these words
and then they are searched in the model vocabulary.
@@ -517,7 +516,7 @@ def get_embeddings_from_query(
strategy : str, optional
The strategy indicates how it will use the preprocessed words: 'first' will
- include only the first transformed word found. all' will include all
+ include only the first transformed word found. 'all' will include all
transformed words found, by default "first".
normalize : bool, optional
diff --git a/wefe/query.py b/wefe/query.py
index 0a65045..ecfdb2c 100644
--- a/wefe/query.py
+++ b/wefe/query.py
@@ -1,6 +1,5 @@
-import logging
from itertools import combinations
-from typing import Any, List, Union
+from typing import Any, Dict, List, Union
import numpy as np
@@ -201,6 +200,13 @@ def __eq__(self, other):
return True
def __repr__(self) -> str:
+ """Generates a repr that shows the name, target and attributes of the query.
+
+ Returns
+ -------
+ str
+ The generated representation.
+ """
try:
repr_ = (
" str:
+ ">"
)
return repr_
- except:
- return ""
+ except AttributeError:
+ # it can happen if some of the attributes (query_name, target_sets
+ # or attribute_sets) are not defined.
+ return ""
+
+ def dict(self) -> Dict[str, Any]:
+ """Generates a dictionary from the Query data
+
+ This includes the target and attribute sets, as well as their names,
+ the query name generated from them and the query template.
+
+ Returns
+ -------
+ Dict[str, Any]
+ The dictionary generated with the query data.
+ """
+ return {
+ "target_sets": self.target_sets,
+ "attribute_sets": self.attribute_sets,
+ "target_sets_names": self.target_sets_names,
+ "attribute_sets_names": self.attribute_sets_names,
+ "query_name": self.query_name,
+ "template": self.template,
+ }
def get_subqueries(self, new_template: tuple) -> list:
"""Generate the subqueries from this query using the given template"""
diff --git a/wefe/utils.py b/wefe/utils.py
index 494d341..8f1531e 100644
--- a/wefe/utils.py
+++ b/wefe/utils.py
@@ -7,13 +7,14 @@
import copy
import logging
-from typing import Callable, Dict, List, Type, Union
+from typing import Callable, List, Type, Union
import numpy as np
import pandas as pd
import pkg_resources
import plotly.express as px
import plotly.graph_objects as go
+from gensim.models.keyedvectors import KeyedVectors
from sklearn.utils.validation import check_is_fitted as _check_is_fitted
from wefe.metrics.base_metric import BaseMetric
@@ -50,13 +51,13 @@ def check_is_fitted(estimator, attributes):
def generate_subqueries_from_queries_list(
- metric: Type[BaseMetric], queries: List[Query]
+ metric: BaseMetric, queries: List[Query]
) -> List[Query]:
"""Generate a list of subqueries from queries.
Parameters
----------
- metric : Type[BaseMetric]
+ metric : BaseMetric
Some metric.
queries : List[Query]
A list with queries.
@@ -67,20 +68,20 @@ def generate_subqueries_from_queries_list(
A list with all the generated subqueries.
"""
# instance metric
- metric = metric()
+ metric_ = metric()
subqueries = []
for query_idx, query in enumerate(queries):
try:
- subqueries += query.get_subqueries(metric.metric_template)
+ subqueries += query.get_subqueries(metric_.metric_template)
except Exception as e:
logging.warning(
"Query in index {} ({}) can not be splitted in subqueries "
"with the {} metric template = {}. Exception: \n{}".format(
query_idx,
query.query_name,
- metric.metric_name,
- metric.metric_template,
+ metric_.metric_name,
+ metric_.metric_template,
e,
)
)
@@ -282,7 +283,8 @@ def run_queries(
index="model_name", columns="query_name", values="result"
)
pivoted_results = pivoted_results.reindex(
- index=[model.name for model in models], columns=query_names,
+ index=[model.name for model in models],
+ columns=query_names,
)
if aggregate_results:
@@ -386,7 +388,8 @@ def plot_queries_results(results: pd.DataFrame, by: str = "query"):
barmode="group",
)
fig.update_layout(
- xaxis_title=xaxis_title, yaxis_title="Bias measure",
+ xaxis_title=xaxis_title,
+ yaxis_title="Bias measure",
)
fig.for_each_trace(
lambda t: t.update(x=["wrt ".join(label.split("wrt")) for label in t.x])
@@ -426,7 +429,8 @@ def create_ranking(
- dense: like ‘min’, but rank always increases by 1 between groups.
ascending : bool, optional
- Whether or not the elements should be ranked in ascending order, by default True.
+ Whether or not the elements should be ranked in ascending order,
+ by default True.
Returns
-------
@@ -611,9 +615,6 @@ def save_doc_image(fig, name):
fig.write_image(f"./doc/images/{name}.png", width=1200, height=600, scale=3)
-from gensim.models.keyedvectors import KeyedVectors
-
-
def flair_to_gensim(flair_embedding):
# load model from flair
diff --git a/wefe/word_embedding_model.py b/wefe/word_embedding_model.py
index 2612cc8..2fd1a4e 100644
--- a/wefe/word_embedding_model.py
+++ b/wefe/word_embedding_model.py
@@ -168,6 +168,40 @@ def __contains__(self, key):
"""
return key in self.vocab
+ def __repr__(self) -> str:
+ try:
+ if self.name == "Unnamed model" and self.vocab_prefix is not None:
+ return (
+ ""
+ )
+
+ if self.name == "Unnamed model":
+ return (
+ ""
+ )
+
+ if self.vocab_prefix is not None:
+ return (
+ f""
+ )
+
+ return (
+ f""
+ )
+ except AttributeError:
+ # it can happen if some of the attributes (name or vocab_prefix) are not
+ # defined.
+ return ""
+
def normalize(self):
"""Normalize word embeddings in the model by using the L2 norm.
@@ -245,7 +279,9 @@ def update(self, word: str, embedding: np.ndarray):
self.wv.vectors[word_index] = embedding
def batch_update(
- self, words: Sequence[str], embeddings: Union[Sequence[np.ndarray], np.ndarray],
+ self,
+ words: Sequence[str],
+ embeddings: Union[Sequence[np.ndarray], np.ndarray],
):
"""Update a batch of embeddings.