{ "cells": [ { "cell_type": "markdown", "id": "96ec678e-b20c-4213-8616-542010f46342", "metadata": {}, "source": [ "\n", "# Clean-Clean ER\n", "\n", "In this notebook we present the pyJedAI approach in the well-known ABT-BUY dataset. Clean-Clean ER in the link discovery/deduplication between two sets of entities.\n" ] }, { "cell_type": "markdown", "id": "9c49d2b7-11b5-40b3-9341-de98608dde13", "metadata": {}, "source": [ "Dataset: __Abt-Buy dataset__ (D1)\n", "\n", "The Abt-Buy dataset for entity resolution derives from the online retailers Abt.com and Buy.com. The dataset contains 1076 entities from abt.com and 1076 entities from buy.com as well as a gold standard (perfect mapping) with 1076 matching record pairs between the two data sources. The common attributes between the two data sources are: product name, product description and product price." ] }, { "cell_type": "markdown", "id": "744b3017-9a5c-4d3c-8e0a-fe39b069b647", "metadata": {}, "source": [ "## How to install?\n", "\n", "pyJedAI is an open-source library that can be installed from PyPI.\n", "\n", "For more: [pypi.org/project/pyjedai/](https://pypi.org/project/pyjedai/)" ] }, { "cell_type": "code", "execution_count": null, "id": "029a5825-799d-4c3f-a6cd-a75e257cadcc", "metadata": {}, "outputs": [], "source": [ "!pip install pyjedai -U" ] }, { "cell_type": "code", "execution_count": 2, "id": "462695ec-3af1-4048-9971-9ed0bce0f07b", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Name: pyjedai\n", "Version: 0.1.0\n", "Summary: An open-source library that builds powerful end-to-end Entity Resolution workflows.\n", "Home-page: \n", "Author: \n", "Author-email: Konstantinos Nikoletos , George Papadakis , Jakub Maciejewski , Manolis Koubarakis \n", "License: Apache Software License 2.0\n", "Location: /home/jm/anaconda3/envs/pyjedai-new/lib/python3.8/site-packages\n", "Requires: faiss-cpu, gensim, matplotlib, matplotlib-inline, networkx, nltk, numpy, optuna, ordered-set, pandas, pandas-profiling, pandocfilters, plotly, py-stringmatching, PyYAML, rdflib, rdfpandas, regex, scipy, seaborn, sentence-transformers, strsim, strsimpy, tomli, tqdm, transformers, valentine\n", "Required-by: \n" ] } ], "source": [ "!pip show pyjedai" ] }, { "cell_type": "markdown", "id": "7b4c62c5-6581-4d2e-9d44-c7c02f43d441", "metadata": {}, "source": [ "Imports" ] }, { "cell_type": "code", "execution_count": 1, "id": "6db50d83-51d8-4c95-9f27-30ef867338f2", "metadata": {}, "outputs": [], "source": [ "import os\n", "import sys\n", "import pandas as pd\n", "import networkx\n", "from networkx import draw, Graph" ] }, { "cell_type": "code", "execution_count": 2, "id": "4d4e6a90-9fd8-4f7a-bf4f-a5b994e0adfb", "metadata": {}, "outputs": [], "source": [ "import pyjedai\n", "from pyjedai.utils import (\n", " text_cleaning_method,\n", " print_clusters,\n", " print_blocks,\n", " print_candidate_pairs\n", ")\n", "from pyjedai.evaluation import Evaluation" ] }, { "cell_type": "markdown", "id": "451bf970-4425-487b-8756-776abb9536ea", "metadata": {}, "source": [ "# Workflow Architecture\n", "\n", "![workflow-example.png](https://github.com/AI-team-UoA/pyJedAI/blob/main/docs/img/workflow-example.png?raw=true)" ] }, { "cell_type": "markdown", "id": "af77914f-5e76-4da8-a0ad-1c53e0111a0f", "metadata": {}, "source": [ "# Data Reading\n", "\n", "pyJedAI in order to perfrom needs only the tranformation of the initial data into a pandas DataFrame. Hence, pyJedAI can function in every structured or semi-structured data. In this case Abt-Buy dataset is provided as .csv files. \n" ] }, { "cell_type": "code", "execution_count": 3, "id": "e6aabec4-ef4f-4267-8c1e-377054e669d2", "metadata": {}, "outputs": [], "source": [ "from pyjedai.datamodel import Data\n", "from pyjedai.evaluation import Evaluation" ] }, { "cell_type": "code", "execution_count": 4, "id": "3d3feb89-1406-4c90-a1aa-dc2cf4707739", "metadata": {}, "outputs": [], "source": [ "d1 = pd.read_csv(\"./../data/ccer/D2/abt.csv\", sep='|', engine='python', na_filter=False)\n", "d2 = pd.read_csv(\"./../data/ccer/D2/buy.csv\", sep='|', engine='python', na_filter=False)\n", "gt = pd.read_csv(\"./../data/ccer/D2/gt.csv\", sep='|', engine='python')\n", "\n", "data = Data(dataset_1=d1,\n", " id_column_name_1='id',\n", " dataset_2=d2,\n", " id_column_name_2='id',\n", " ground_truth=gt)" ] }, { "cell_type": "markdown", "id": "5d8a8a78-858e-4c79-90fe-197a68e95e11", "metadata": {}, "source": [ "pyJedAI offers also dataset analysis methods (more will be developed)" ] }, { "cell_type": "code", "execution_count": 5, "id": "7cb87af2-adda-49e0-82cc-b1a5f7a595ef", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "***************************************************************************************************************************\n", " Data Report\n", "***************************************************************************************************************************\n", "Type of Entity Resolution: Clean-Clean\n", "Dataset 1 (D1):\n", "\tNumber of entities: 1076\n", "\tNumber of NaN values: 0\n", "\tMemory usage [KB]: 563.56\n", "\tAttributes:\n", "\t\t name\n", "\t\t description\n", "\t\t price\n", "Dataset 2 (D2):\n", "\tNumber of entities: 1076\n", "\tNumber of NaN values: 0\n", "\tMemory usage [KB]: 336.63\n", "\tAttributes:\n", "\t\t name\n", "\t\t description\n", "\t\t price\n", "\n", "Total number of entities: 2152\n", "Number of matching pairs in ground-truth: 1076\n", "───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────\n" ] } ], "source": [ "data.print_specs()" ] }, { "cell_type": "code", "execution_count": 6, "id": "b822d7c0-19a2-4050-9554-c35a208bb848", "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
idnamedescriptionprice
00Sony Turntable - PSLX350HSony Turntable - PSLX350H/ Belt Drive System/ ...
11Bose Acoustimass 5 Series III Speaker System -...Bose Acoustimass 5 Series III Speaker System -...399
22Sony Switcher - SBV40SSony Switcher - SBV40S/ Eliminates Disconnecti...49
33Sony 5 Disc CD Player - CDPCE375Sony 5 Disc CD Player- CDPCE375/ 5 Disc Change...
44Bose 27028 161 Bookshelf Pair Speakers In Whit...Bose 161 Bookshelf Speakers In White - 161WH/ ...158
\n", "
" ], "text/plain": [ " id name \\\n", "0 0 Sony Turntable - PSLX350H \n", "1 1 Bose Acoustimass 5 Series III Speaker System -... \n", "2 2 Sony Switcher - SBV40S \n", "3 3 Sony 5 Disc CD Player - CDPCE375 \n", "4 4 Bose 27028 161 Bookshelf Pair Speakers In Whit... \n", "\n", " description price \n", "0 Sony Turntable - PSLX350H/ Belt Drive System/ ... \n", "1 Bose Acoustimass 5 Series III Speaker System -... 399 \n", "2 Sony Switcher - SBV40S/ Eliminates Disconnecti... 49 \n", "3 Sony 5 Disc CD Player- CDPCE375/ 5 Disc Change... \n", "4 Bose 161 Bookshelf Speakers In White - 161WH/ ... 158 " ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "data.dataset_1.head(5)" ] }, { "cell_type": "code", "execution_count": 7, "id": "5c26b595-5e02-4bfc-8e79-e476ab2830ef", "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
idnamedescriptionprice
00Linksys EtherFast EZXS88W Ethernet Switch - EZ...Linksys EtherFast 8-Port 10/100 Switch (New/Wo...
11Linksys EtherFast EZXS55W Ethernet Switch5 x 10/100Base-TX LAN
22Netgear ProSafe FS105 Ethernet Switch - FS105NANETGEAR FS105 Prosafe 5 Port 10/100 Desktop Sw...
33Belkin Pro Series High Integrity VGA/SVGA Moni...1 x HD-15 - 1 x HD-15 - 10ft - Beige
44Netgear ProSafe JFS516 Ethernet SwitchNetgear ProSafe 16 Port 10/100 Rackmount Switc...
\n", "
" ], "text/plain": [ " id name \\\n", "0 0 Linksys EtherFast EZXS88W Ethernet Switch - EZ... \n", "1 1 Linksys EtherFast EZXS55W Ethernet Switch \n", "2 2 Netgear ProSafe FS105 Ethernet Switch - FS105NA \n", "3 3 Belkin Pro Series High Integrity VGA/SVGA Moni... \n", "4 4 Netgear ProSafe JFS516 Ethernet Switch \n", "\n", " description price \n", "0 Linksys EtherFast 8-Port 10/100 Switch (New/Wo... \n", "1 5 x 10/100Base-TX LAN \n", "2 NETGEAR FS105 Prosafe 5 Port 10/100 Desktop Sw... \n", "3 1 x HD-15 - 1 x HD-15 - 10ft - Beige \n", "4 Netgear ProSafe 16 Port 10/100 Rackmount Switc... " ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "data.dataset_2.head(5)" ] }, { "cell_type": "code", "execution_count": 8, "id": "b3c9827e-a08a-47b2-a7f2-6f3f72184a17", "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
D1D2
0206216
16046
2182160
\n", "
" ], "text/plain": [ " D1 D2\n", "0 206 216\n", "1 60 46\n", "2 182 160" ] }, "execution_count": 8, "metadata": {}, "output_type": "execute_result" } ], "source": [ "data.ground_truth.head(3)" ] }, { "cell_type": "markdown", "id": "19891fc5-960e-4df1-a72a-e4533a74a761", "metadata": {}, "source": [ "### Data cleaning step (optional)\n", "\n", "pyJedAI offers 4 types of text cleaning/processing. \n", "\n", "- Stopwords removal\n", "- Punctuation removal\n", "- Numbers removal\n", "- Unicodes removal" ] }, { "cell_type": "code", "execution_count": 9, "id": "e471e48c-c882-4c74-b94f-4c1dff9fa36c", "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "[nltk_data] Downloading package stopwords to\n", "[nltk_data] /home/konstantinos/nltk_data...\n", "[nltk_data] Package stopwords is already up-to-date!\n" ] } ], "source": [ "data.clean_dataset(remove_stopwords = False, \n", " remove_punctuation = False, \n", " remove_numbers = False,\n", " remove_unicodes = False)" ] }, { "cell_type": "markdown", "id": "9c068252-4a69-405a-a320-c2875ec08ea5", "metadata": {}, "source": [ "## Block Building\n", "\n", "It clusters entities into overlapping blocks in a lazy manner that relies on unsupervised blocking keys: every token in an attribute value forms a key. Blocks are then extracted, possibly using a transformation, based on its equality or on its similarity with other keys.\n", "\n", "The following methods are currently supported:\n", "\n", "- Standard/Token Blocking\n", "- Sorted Neighborhood\n", "- Extended Sorted Neighborhood\n", "- Q-Grams Blocking\n", "- Extended Q-Grams Blocking\n", "- Suffix Arrays Blocking\n", "- Extended Suffix Arrays Blocking" ] }, { "cell_type": "code", "execution_count": 10, "id": "9c1b6213-a218-40cf-bc72-801b77d28da9", "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "/home/conda/miniconda3/envs/pyjedai/lib/python3.9/site-packages/tqdm/auto.py:21: TqdmWarning: IProgress not found. Please update jupyter and ipywidgets. See https://ipywidgets.readthedocs.io/en/stable/user_install.html\n", " from .autonotebook import tqdm as notebook_tqdm\n" ] } ], "source": [ "from pyjedai.block_building import (\n", " StandardBlocking,\n", " QGramsBlocking,\n", " ExtendedQGramsBlocking,\n", " SuffixArraysBlocking,\n", " ExtendedSuffixArraysBlocking,\n", ")" ] }, { "cell_type": "code", "execution_count": 11, "id": "9741f0c4-6250-455f-9c88-b8dc61ab7d4d", "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "Standard Blocking: 100%|██████████| 2152/2152 [00:00<00:00, 18652.37it/s]\n" ] } ], "source": [ "bb = StandardBlocking()\n", "blocks = bb.build_blocks(data, attributes_1=['name'], attributes_2=['name'])" ] }, { "cell_type": "code", "execution_count": 12, "id": "d2d9ae46-28fa-4438-87b7-ba901c75bd99", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Method name: Standard Blocking\n", "Method info: Creates one block for every token in the attribute values of at least two entities.\n", "Parameters: Parameter-Free method\n", "Attributes from D1:\n", "\tname\n", "Attributes from D2:\n", "\tname\n", "Runtime: 0.1172 seconds\n" ] } ], "source": [ "bb.report()" ] }, { "cell_type": "code", "execution_count": 13, "id": "b0ac846d-0f13-4b90-b4c8-688054ed7ffe", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "***************************************************************************************************************************\n", " Method: Standard Blocking\n", "***************************************************************************************************************************\n", "Method name: Standard Blocking\n", "Parameters: \n", "Runtime: 0.1172 seconds\n", "───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────\n", "Performance:\n", "\tPrecision: 0.45% \n", "\tRecall: 99.54%\n", "\tF1-score: 0.90%\n", "───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────\n", "Classification report:\n", "\tTrue positives: 1071\n", "\tFalse positives: 236447\n", "\tTrue negatives: 1156695\n", "\tFalse negatives: 5\n", "\tTotal comparisons: 237518\n", "───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────\n" ] } ], "source": [ "_ = bb.evaluate(blocks, with_classification_report=True)" ] }, { "cell_type": "markdown", "id": "eeb516cf-43cd-4f02-88f8-6dfef7c5e20e", "metadata": {}, "source": [ "## Block Purging\n", "\n", "__Optional step__\n", "\n", "Discards the blocks exceeding a certain number of comparisons. \n" ] }, { "cell_type": "code", "execution_count": 14, "id": "725426e2-0af8-4295-baff-92653c841fdd", "metadata": {}, "outputs": [], "source": [ "from pyjedai.block_cleaning import BlockPurging" ] }, { "cell_type": "code", "execution_count": 15, "id": "7997b2b6-9629-44f0-a66d-5bc4fea28fb6", "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "Block Purging: 100%|██████████| 2934/2934 [00:00<00:00, 373522.98it/s]\n" ] } ], "source": [ "bp = BlockPurging()\n", "cleaned_blocks = bp.process(blocks, data, tqdm_disable=False)" ] }, { "cell_type": "code", "execution_count": 16, "id": "d8842b00-8765-449f-bdb7-f9b2206e91c7", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Method name: Block Purging\n", "Method info: Discards the blocks exceeding a certain number of comparisons.\n", "Parameters: \n", "\tSmoothing factor: 1.025\n", "\tMax Comparisons per Block: 3224.0\n", "Runtime: 0.0116 seconds\n" ] } ], "source": [ "bp.report()" ] }, { "cell_type": "code", "execution_count": 17, "id": "bfbef308-2ae0-4a2b-aec4-1bac09e426a1", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "***************************************************************************************************************************\n", " Method: Block Purging\n", "***************************************************************************************************************************\n", "Method name: Block Purging\n", "Parameters: \n", "\tSmoothing factor: 1.025\n", "\tMax Comparisons per Block: 3224.0\n", "Runtime: 0.0116 seconds\n", "───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────\n", "Performance:\n", "\tPrecision: 1.12% \n", "\tRecall: 98.61%\n", "\tF1-score: 2.21%\n", "───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────\n" ] } ], "source": [ "_ = bp.evaluate(cleaned_blocks)" ] }, { "cell_type": "markdown", "id": "9f9e77d5-c906-431a-bdc7-68dc9c00cc31", "metadata": { "tags": [] }, "source": [ "## Block Cleaning\n", "\n", "___Optional step___\n", "\n", "Its goal is to clean a set of overlapping blocks from unnecessary comparisons, which can be either redundant (i.e., repeated comparisons that have already been executed in a previously examined block) or superfluous (i.e., comparisons that involve non-matching entities). Its methods operate on the coarse level of individual blocks or entities." ] }, { "cell_type": "code", "execution_count": 18, "id": "9c2c0e42-485a-444e-9161-975f30d21a02", "metadata": {}, "outputs": [], "source": [ "from pyjedai.block_cleaning import BlockFiltering" ] }, { "cell_type": "code", "execution_count": 19, "id": "bf5c20ac-b16a-484d-82b0-61ecb9e7f3ea", "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "Block Filtering: 100%|██████████| 3/3 [00:00<00:00, 112.49it/s]\n" ] } ], "source": [ "bf = BlockFiltering(ratio=0.8)\n", "filtered_blocks = bf.process(cleaned_blocks, data, tqdm_disable=False)" ] }, { "cell_type": "code", "execution_count": 20, "id": "25fd0be0-91c3-4d0b-b596-c66dccba3c79", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "***************************************************************************************************************************\n", " Method: Block Filtering\n", "***************************************************************************************************************************\n", "Method name: Block Filtering\n", "Parameters: \n", "\tRatio: 0.8\n", "Runtime: 0.0297 seconds\n", "───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────\n", "Performance:\n", "\tPrecision: 2.56% \n", "\tRecall: 96.10%\n", "\tF1-score: 4.99%\n", "───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────\n" ] }, { "data": { "text/plain": [ "{'Precision %': 2.562450436161776,\n", " 'Recall %': 96.09665427509294,\n", " 'F1 %': 4.991792990248141,\n", " 'True Positives': 1034,\n", " 'False Positives': 39318,\n", " 'True Negatives': 1156658,\n", " 'False Negatives': 42}" ] }, "execution_count": 20, "metadata": {}, "output_type": "execute_result" } ], "source": [ "bf.evaluate(filtered_blocks)" ] }, { "cell_type": "markdown", "id": "9cd12048-bd0c-4571-ba70-488d46afcdd6", "metadata": {}, "source": [ "## Comparison Cleaning - Meta Blocking\n", "\n", "___Optional step___\n", "\n", "Similar to Block Cleaning, this step aims to clean a set of blocks from both redundant and superfluous comparisons. Unlike Block Cleaning, its methods operate on the finer granularity of individual comparisons.\n", "\n", "The following methods are currently supported:\n", "\n", "- Comparison Propagation\n", "- Cardinality Edge Pruning (CEP)\n", "- Cardinality Node Pruning (CNP)\n", "- Weighed Edge Pruning (WEP)\n", "- Weighed Node Pruning (WNP)\n", "- Reciprocal Cardinality Node Pruning (ReCNP)\n", "- Reciprocal Weighed Node Pruning (ReWNP)\n", "- BLAST\n", "\n", "Most of these methods are Meta-blocking techniques. All methods are optional, but competive, in the sense that only one of them can part of an ER workflow. For more details on the functionality of these methods, see here. They can be combined with one of the following weighting schemes:\n", "\n", "- Aggregate Reciprocal Comparisons Scheme (ARCS)\n", "- Common Blocks Scheme (CBS)\n", "- Enhanced Common Blocks Scheme (ECBS)\n", "- Jaccard Scheme (JS)\n", "- Enhanced Jaccard Scheme (EJS)" ] }, { "cell_type": "code", "execution_count": 21, "id": "1f7d75f3-6bed-482d-a572-c3b4927236a5", "metadata": {}, "outputs": [], "source": [ "from pyjedai.comparison_cleaning import (\n", " WeightedEdgePruning,\n", " WeightedNodePruning,\n", " CardinalityEdgePruning,\n", " CardinalityNodePruning,\n", " BLAST,\n", " ReciprocalCardinalityNodePruning,\n", " ReciprocalWeightedNodePruning,\n", " ComparisonPropagation\n", ")" ] }, { "cell_type": "code", "execution_count": 22, "id": "c92e0ca3-5591-4620-b3f4-012a23637416", "metadata": {}, "outputs": [], "source": [ "mb = WeightedEdgePruning(weighting_scheme='EJS')\n", "candidate_pairs_blocks = mb.process(filtered_blocks, data, tqdm_disable=True)" ] }, { "cell_type": "code", "execution_count": 23, "id": "f469e387-e135-4945-b97f-da14d391c6b1", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "***************************************************************************************************************************\n", " Method: Weighted Edge Pruning\n", "***************************************************************************************************************************\n", "Method name: Weighted Edge Pruning\n", "Parameters: \n", "\tNode centric: False\n", "\tWeighting scheme: EJS\n", "Runtime: 0.1928 seconds\n", "───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────\n", "Performance:\n", "\tPrecision: 10.86% \n", "\tRecall: 91.45%\n", "\tF1-score: 19.41%\n", "───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────\n" ] } ], "source": [ "_ = mb.evaluate(candidate_pairs_blocks)" ] }, { "cell_type": "markdown", "id": "5ea46276-a97c-4767-a3ef-0fe705186cfa", "metadata": {}, "source": [ "### Want to export pairs in this step?\n", "\n", "Every step provides a method named `export_to_df` that exports all pairs in dataframe. If you wish to export them in a file use `.to_csv` from pandas." ] }, { "cell_type": "code", "execution_count": 24, "id": "0e842336-5e82-4221-ad7f-aac80471f04b", "metadata": {}, "outputs": [], "source": [ "pairs_df=mb.export_to_df(candidate_pairs_blocks)" ] }, { "cell_type": "code", "execution_count": 25, "id": "1143b23a-60db-4de7-b0bd-dd86ae3e4f34", "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
id1id2
00205
10193
2053
3055
40697
\n", "
" ], "text/plain": [ " id1 id2\n", "0 0 205\n", "1 0 193\n", "2 0 53\n", "3 0 55\n", "4 0 697" ] }, "execution_count": 25, "metadata": {}, "output_type": "execute_result" } ], "source": [ "pairs_df.head(5)" ] }, { "cell_type": "markdown", "id": "6aeff39a-b51b-4166-a55b-f8452ec258a7", "metadata": {}, "source": [ "## Entity Matching\n", "\n", "It compares pairs of entity profiles, associating every pair with a similarity in [0,1]. Its output comprises the similarity graph, i.e., an undirected, weighted graph where the nodes correspond to entities and the edges connect pairs of compared entities." ] }, { "cell_type": "code", "execution_count": 26, "id": "f479d967-8bac-4870-99bd-68c01e75747b", "metadata": {}, "outputs": [], "source": [ "from pyjedai.matching import EntityMatching" ] }, { "cell_type": "code", "execution_count": 27, "id": "ae7b1e6a-e937-44fe-bfe5-34696ea1156c", "metadata": {}, "outputs": [], "source": [ "em = EntityMatching(\n", " metric='cosine',\n", " tokenizer='char_tokenizer',\n", " vectorizer='tfidf',\n", " qgram=3,\n", " similarity_threshold=0.0\n", ")\n", "\n", "pairs_graph = em.predict(candidate_pairs_blocks, data, tqdm_disable=True)" ] }, { "cell_type": "code", "execution_count": 28, "id": "4d606bfc-3265-4042-93f3-22a1117c4886", "metadata": {}, "outputs": [ { "data": { "image/png": "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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "draw(pairs_graph)" ] }, { "cell_type": "code", "execution_count": 29, "id": "4a2a5f4a-6ffa-4c16-ae49-ff4fec4c467d", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "***************************************************************************************************************************\n", " Method: Entity Matching\n", "***************************************************************************************************************************\n", "Method name: Entity Matching\n", "Parameters: \n", "\tMetric: cosine\n", "\tAttributes: None\n", "\tSimilarity threshold: 0.0\n", "\tTokenizer: char_tokenizer\n", "\tVectorizer: tfidf\n", "\tQgrams: 3\n", "Runtime: 0.4898 seconds\n", "───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────\n", "Performance:\n", "\tPrecision: 10.86% \n", "\tRecall: 91.45%\n", "\tF1-score: 19.41%\n", "───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────\n" ] } ], "source": [ "_ = em.evaluate(pairs_graph)" ] }, { "cell_type": "markdown", "id": "07ecd3d3-aa47-447c-af4d-cdd4744ca7c1", "metadata": {}, "source": [ "### How to set a valid similarity threshold?\n", "\n", "Configure similariy threshold with a Grid-Search or with an Optuna search. Also pyJedAI provides some visualizations on the distributions of the scores.\n", "\n", "For example with a classic histogram:\n" ] }, { "cell_type": "code", "execution_count": 30, "id": "c04c0482-a0d2-4ebf-b9c8-f6cff1863e5d", "metadata": {}, "outputs": [ { "data": { "image/png": "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SopsNptsNpuqVasmX19fderUSY8//riysrIqtNZBgwbpq6++KvPjhoaGauHChWV+3F+CIAUAAIAKlZCQoEceeUTbtm3T8ePHy7Uvy7JUVFRUrn2YOHbsmGw22zW3P3jwoGJiYtS1a1dt27ZN+/fv16JFi+Th4aHi4mKnthkZGTp+/Lh2796tJ554QsnJybr55pu1f//+sj6NK/Ly8lL9+vUrrD9XIkgBAACgwtjtdq1evVoPPfSQYmNjtWzZMse2+++/X4MGDXJqX1hYqLp162r58uWSpJKSEsXHx6tx48by8vJShw4d9M477zjaXxyd2bhxo7p06SJPT09t375dR44c0d13362AgADVrl1bt9xyi5KTk536ysrKUmxsrLy8vNS4cWOtXLnykpGQ06dPa8yYMapXr558fHx055136vPPPy/7N+q/PvzwQwUGBmrevHm6+eab1bRpU8XExOi1116Tl5eXU9v69esrMDBQLVq00ODBg7Vjxw7Vq1dPDz300BWP37VrV82fP9+x3L9/f1WvXl12u12S9P3338tms+nw4cOSpAsXLiguLk4NGjRQrVq11K1bN6WkpDj2v9ytfc8++6zq168vb29vjRkzRlOnTlXHjh0vqWX+/PkKCgrSTTfdpAkTJqiwsFCSFBkZqW+//VaTJ092jLxVBgQpAACAKs6yLOUX5LvkZVmWUa1vv/22WrVqpZYtW2rYsGF6/fXXHccYOnSo/vWvfzn+iJekDz74QGfPntWAAQMkSfHx8Vq+fLmWLFmiAwcOaPLkyRo2bJhSU1Od+pk6darmzp2rQ4cOqX379rLb7erbt682b96svXv3KiYmRv369VNmZqZjnxEjRuj48eNKSUnRu+++q6VLlyonJ8fpuPfee69ycnK0ceNG7dmzR507d1avXr108uRJo/fhWgUGBiorK0vbtm0z3tfLy0vjx4/Xjh07LjmPiyIiIhxByLIsffTRR/Lz89P27dslld5W2KBBAzVr1kySNHHiRKWlpWnVqlXat2+f7r33XsXExOjrr7++7PFXrFih2bNn669//av27Nmjhg0b6pVXXrmk3datW3XkyBFt3bpVb775ppYtW+YI2WvWrNFvfvMbzZw5U1lZWRV+u+KVuLu6AAAAAPwyZwvPqnZ8bZf0bZ9mVy2PWtfcPiEhQcOGDZMkxcTEKDc3V6mpqYqMjFR0dLRq1aqltWvXavjw4ZKklStX6ne/+528vb114cIFzZkzR8nJyQoLC5MkNWnSRNu3b9err76qiIgIRz8zZ85U7969Hcv+/v7q0KGDY3nWrFlau3at3n//fU2cOFFffvmlkpOTtXv3bnXt2lWS9Pe//13Nmzd37LN9+3bt2rVLOTk58vT0lFQ6irJu3Tq98847GjdunOnb97PuvfdeffDBB4qIiFBgYKBuu+029erVSyNGjJCPj8/P7t+qVStJpbcUXu6Wu8jISCUkJKi4uFhffPGFPDw8NGjQIKWkpCgmJkYpKSmO9zUzM1NvvPGGMjMzFRwcLEmKi4vTpk2b9MYbb2jOnDmXHH/RokUaPXq0HnjgAUnS008/rQ8//NApLEtSnTp19PLLL8vNzU2tWrVSbGysNm/erLFjx8rf319ubm7y9vZWYGCg2RtYjhiRAgAAQIXIyMjQrl27NGTIEEmSu7u7Bg0apISEBMfyfffdpxUrVkiS8vPz9d5772no0KGSpMOHD+vs2bPq3bu3ateu7XgtX75cR44ccerrYhi6yG63Ky4uTq1bt5afn59q166tQ4cOOUakMjIy5O7urs6dOzv2adasmerUqeNY/vzzz2W323XTTTc59X/06NFL+v+xtm3bOtq2bdtWkpz2v+uuu664r5ubm9544w19//33mjdvnho0aKA5c+aobdu21zQyc3G070q3w/Xo0UNnzpzR3r17lZqaqoiICEVGRjpGqS6GXEnav3+/iouL1aJFC6f6U1NTr3j+GRkZuvXWW53W/XRZKn2P3NzcHMtBQUFXHEWrLBiRAgAAqOJqVq8p+zT7zzcsp76vVUJCgoqKihyjGVLpH/qenp56+eWX5evrq6FDhyoiIkI5OTlKSkqSl5eXYmJiJMkxipGYmKgGDRo4HfviCNFFtWo5j5LFxcUpKSlJ8+fPV7NmzeTl5aV77rnHMfPdtbDb7QoKCnJ6Juiiq035vWHDBsfzPv/+978VGRmp9PR0x/afPut0OQ0aNNDw4cM1fPhwzZo1Sy1atNCSJUv0zDPPXHW/Q4cOSSqd9e5y/Pz81KFDB6WkpCgtLU29e/dWz549HbPvff31144RKbvdLjc3N+3Zs8cp9EilwfCXqF69utOyzWZTSUnJLzpmeSNIAQAAVHE2m83o9jpXKCoq0vLly/X888+rT58+Ttv69++vt956S+PHj1d4eLhCQkK0evVqbdy4Uffee6/jj+w2bdrI09NTmZmZTrfxXYsdO3Zo1KhRjmet7Ha7jh075tjesmVLFRUVae/everSpYuk0hGwU6dOOdp07txZ2dnZcnd3v2IwuZxGjRo5vnZ3L/3z++IzR9ejTp06CgoKUn5+/lXbnTt3TkuXLlXPnj1Vr169K7aLiIjQ1q1btWvXLs2ePVv+/v5q3bq1Zs+eraCgILVo0UKS1KlTJxUXFysnJ0c9evS4plpbtmyp3bt3a8SIEY51u3fvvqZ9f+xysxS6GkEKAAAA5W79+vU6deqURo8eLV9fX6dtAwcOVEJCgsaPHy+pdPa+JUuW6KuvvtLWrVsd7by9vRUXF6fJkyerpKRE3bt3V25urnbs2CEfHx+NHDnyiv03b95ca9asUb9+/WSz2fTUU085jXi0atVKUVFRGjdunF555RVVr15djz76qLy8vBy3xUVFRSksLEz9+/fXvHnz1KJFCx0/flyJiYkaMGDAJbcTloVXX31V6enpGjBggJo2barz589r+fLlOnDggBYtWuTUNicnR+fPn9eZM2e0Z88ezZs3Tz/88IPWrFlz1T4iIyO1aNEi1atXz/FMVWRkpF5++WXde++9jnYtWrTQ0KFDNWLECD3//PPq1KmT/u///k+bN29W+/btL/u5YI888ojGjh2rrl27Kjw8XKtXr9a+ffvUpEkTo/chNDRU27Zt0+DBg+Xp6am6desa7V8eeEYKAAAA5S4hIUFRUVGXhCipNEh9+umn2rdvn6TS2fsOHjyoBg0a6Pbbb3dqO2vWLD311FOKj49X69atFRMTo8TERDVu3Piq/S9YsEB16tRReHi4+vXrp+joaKfnoSRp+fLlCggIUM+ePTVgwACNHTtW3t7eqlGjhqTSkb8NGzaoZ8+eeuCBBxzTjH/77bcKCAj4JW/PFd16662y2+0aP3682rZtq4iICO3cuVPr1q27ZFSuZcuWCg4OVpcuXTR37lxFRUXpiy++UJs2ba7aR48ePVRSUuJ0vMjISBUXFzuej7rojTfe0IgRI/Too4+qZcuW6t+/v3bv3q2GDRte9thDhw7VtGnTFBcXp86dO+vo0aMaNWqU4z29VjNnztSxY8fUtGnTq46uVSSbZTpnZRWRl5cnX19f5ebmXtOMJr8GoVMTXV0CKlBJgZu+e6H0nvKQyZtUzePS4fBjc/lE+cokvyDfMeuW6SxYxn3l5zvuZ7fb7Zc8SwCgcjt//ryOHj2qxo0bG/9Bimv3/fffKyQkRMnJyerVq5ery7lh9O7dW4GBgfrHP/5Rpse92s9FeWQDbu0DAAAAJG3ZskV2u13t2rVTVlaWHn/8cYWGhqpnz56uLq3KOnv2rJYsWaLo6Gi5ubnprbfeUnJyspKSklxd2i9GkAIAAAAkFRYW6s9//rO++eYbeXt7Kzw8XCtWrLhkRjlcu4u3Q86ePVvnz59Xy5Yt9e677yoqKsrVpf1iBCkAAABAUnR0tKKjo11dxg3Fy8tLycnJri6jXBhNNhEfH69bbrlF3t7eql+/vvr376+MjAynNufPn9eECRMcH1Q2cOBAnThxwqlNZmamYmNjVbNmTdWvX1+PPfaYioqKnNqkpKSoc+fO8vT0VLNmzbRs2bLrO0MAAAAAKGNGQSo1NVUTJkzQzp07lZSUpMLCQvXp08dpDvvJkyfrX//6l/75z38qNTVVx48f1+9//3vH9uLiYsXGxqqgoEAff/yx3nzzTS1btkxPP/20o83Ro0cVGxurO+64Q+np6Zo0aZLGjBmjDz74oAxOGQAA4MZwg84ZBlyXiv55MLq1b9OmTU7Ly5YtU/369bVnzx717NlTubm5SkhI0MqVK3XnnXdKKp0isXXr1tq5c6duu+02ffjhhzp48KCSk5MVEBCgjh07atasWXriiSc0Y8YMeXh4aMmSJWrcuLGef/55SVLr1q21fft2vfDCCwy3AgCAXz03NzdJUkFBgby8vFxcDVA5nD17VpIq7Jm2X/SMVG5uriTJ399fkrRnzx4VFhY6PTzWqlUrNWzYUGlpabrtttuUlpamdu3aOc21Hx0drYceekgHDhxQp06dlJaWdskDaNHR0Zo0adIVa7lw4YIuXLjgWM7Ly/slpwYAAFBpubu7q2bNmvq///s/Va9eXdWq8dGg+PWyLEtnz55VTk6O/Pz8HP/RUN6uO0iVlJRo0qRJuv3223XzzTdLkrKzs+Xh4SE/Pz+ntgEBAcrOzna0+ekHll1c/rk2eXl5Onfu3GX/5yU+Pl7PPPPM9Z4OAABAlWGz2RQUFKSjR4/q22+/dXU5QKXg5+enwMDACuvvuoPUhAkT9MUXX2j79u1lWc91mzZtmqZMmeJYzsvLU0hIiAsrAgAAKD8eHh5q3ry5CgoKXF0K4HLVq1evsJGoi64rSE2cOFHr16/Xtm3b9Jvf/MaxPjAwUAUFBTp9+rTTqNSJEycc6TAwMFC7du1yOt7FWf1+3OanM/2dOHFCPj4+V7wP2NPTU56entdzOgAAAFVStWrVVKNGDVeXAfwqGd1Qa1mWJk6cqLVr12rLli1q3Lix0/YuXbqoevXq2rx5s2NdRkaGMjMzFRYWJkkKCwvT/v37lZOT42iTlJQkHx8ftWnTxtHmx8e42ObiMQAAAADAlYxGpCZMmKCVK1fqvffek7e3t+OZJl9fX3l5ecnX11ejR4/WlClT5O/vLx8fHz3yyCMKCwvTbbfdJknq06eP2rRpo+HDh2vevHnKzs7WX/7yF02YMMExojR+/Hi9/PLLevzxx/Xggw9qy5Ytevvtt5WYmFjGpw8AAAAA5oxGpF555RXl5uYqMjJSQUFBjtfq1asdbV544QX99re/1cCBA9WzZ08FBgZqzZo1ju1ubm5av3693NzcFBYWpmHDhmnEiBGaOXOmo03jxo2VmJiopKQkdejQQc8//7z+/ve/M/U5AAAAgErBaETqWj7kqkaNGlq8eLEWL158xTaNGjXShg0brnqcyMhI7d2716Q8AAAAAKgQfOgAAAAAABgiSAEAAACAIYIUAAAAABgiSAEAAACAIYIUAAAAABgiSAEAAACAIYIUAAAAABgiSAEAAACAIYIUAAAAABgiSAEAAACAIYIUAAAAABgiSAEAAACAIYIUAAAAABgiSAEAAACAIYIUAAAAABgiSAEAAACAIYIUAAAAABgiSAEAAACAIYIUAAAAABgiSAEAAACAIYIUAAAAABgiSAEAAACAIYIUAAAAABgiSAEAAACAIYIUAAAAABgiSAEAAACAIYIUAAAAABgiSAEAAACAIYIUAAAAABgiSAEAAACAIYIUAAAAABgiSAEAAACAIYIUAAAAABgiSAEAAACAIYIUAAAAABgiSAEAAACAIYIUAAAAABgiSAEAAACAIYIUAAAAABgiSAEAAACAIYIUAAAAABgiSAEAAACAIYIUAAAAABgiSAEAAACAIYIUAAAAABgiSAEAAACAIYIUAAAAABgiSAEAAACAIYIUAAAAABgiSAEAAACAIYIUAAAAABgiSAEAAACAIYIUAAAAABgiSAEAAACAIYIUAAAAABgiSAEAAACAIYIUAAAAABgiSAEAAACAIYIUAAAAABgiSAEAAACAIYIUAAAAABgiSAEAAACAIXdXFwDAdUKnJrq6hErj2NxYV5cAAACqEEakAAAAAMAQQQoAAAAADBGkAAAAAMAQQQoAAAAADBGkAAAAAMAQQQoAAAAADBGkAAAAAMAQQQoAAAAADBGkAAAAAMAQQQoAAAAADBGkAAAAAMAQQQoAAAAADBGkAAAAAMAQQQoAAAAADBGkAAAAAMAQQQoAAAAADBGkAAAAAMAQQQoAAAAADBGkAAAAAMAQQQoAAAAADBGkAAAAAMAQQQoAAAAADBGkAAAAAMCQcZDatm2b+vXrp+DgYNlsNq1bt85p+6hRo2Sz2ZxeMTExTm1OnjypoUOHysfHR35+fho9erTsdrtTm3379qlHjx6qUaOGQkJCNG/ePPOzAwAAAIByYByk8vPz1aFDBy1evPiKbWJiYpSVleV4vfXWW07bhw4dqgMHDigpKUnr16/Xtm3bNG7cOMf2vLw89enTR40aNdKePXv03HPPacaMGVq6dKlpuQAAAABQ5txNd7jrrrt01113XbWNp6enAgMDL7vt0KFD2rRpk3bv3q2uXbtKkhYtWqS+fftq/vz5Cg4O1ooVK1RQUKDXX39dHh4eatu2rdLT07VgwQKnwAUAAAAArlAuz0ilpKSofv36atmypR566CH95z//cWxLS0uTn5+fI0RJUlRUlKpVq6ZPPvnE0aZnz57y8PBwtImOjlZGRoZOnTp12T4vXLigvLw8pxcAAAAAlIcyD1IxMTFavny5Nm/erL/+9a9KTU3VXXfdpeLiYklSdna26tev77SPu7u7/P39lZ2d7WgTEBDg1Obi8sU2PxUfHy9fX1/HKyQkpKxPDQAAAAAkXcetfT9n8ODBjq/btWun9u3bq2nTpkpJSVGvXr3KujuHadOmacqUKY7lvLw8whQAAACAclHu0583adJEdevW1eHDhyVJgYGBysnJcWpTVFSkkydPOp6rCgwM1IkTJ5zaXFy+0rNXnp6e8vHxcXoBAAAAQHko9yD1/fff6z//+Y+CgoIkSWFhYTp9+rT27NnjaLNlyxaVlJSoW7dujjbbtm1TYWGho01SUpJatmypOnXqlHfJAAAAAHBVxkHKbrcrPT1d6enpkqSjR48qPT1dmZmZstvteuyxx7Rz504dO3ZMmzdv1t13361mzZopOjpaktS6dWvFxMRo7Nix2rVrl3bs2KGJEydq8ODBCg4OliTdf//98vDw0OjRo3XgwAGtXr1aL774otOtewAAAADgKsZB6tNPP1WnTp3UqVMnSdKUKVPUqVMnPf3003Jzc9O+ffv0u9/9Ti1atNDo0aPVpUsXffTRR/L09HQcY8WKFWrVqpV69eqlvn37qnv37k6fEeXr66sPP/xQR48eVZcuXfToo4/q6aefZupzAAAAAJWC8WQTkZGRsizrits/+OCDnz2Gv7+/Vq5cedU27du310cffWRaHgAAAACUu3J/RgoAAAAAbjQEKQAAAAAwRJACAAAAAEMEKQAAAAAwRJACAAAAAEMEKQAAAAAwRJACAAAAAEMEKQAAAAAwRJACAAAAAEMEKQAAAAAwRJACAAAAAEMEKQAAAAAwRJACAAAAAEMEKQAAAAAwRJACAAAAAEMEKQAAAAAwRJACAAAAAEMEKQAAAAAwRJACAAAAAEMEKQAAAAAwRJACAAAAAEMEKQAAAAAwRJACAAAAAEMEKQAAAAAwRJACAAAAAEMEKQAAAAAwRJACAAAAAEMEKQAAAAAwRJACAAAAAEMEKQAAAAAwRJACAAAAAEMEKQAAAAAwRJACAAAAAEMEKQAAAAAwRJACAAAAAEMEKQAAAAAwRJACAAAAAEMEKQAAAAAwRJACAAAAAEMEKQAAAAAwRJACAAAAAEMEKQAAAAAwRJACAAAAAEMEKQAAAAAwRJACAAAAAEMEKQAAAAAwRJACAAAAAEMEKQAAAAAwRJACAAAAAEMEKQAAAAAwRJACAAAAAEMEKQAAAAAwRJACAAAAAEMEKQAAAAAwRJACAAAAAEMEKQAAAAAwRJACAAAAAEMEKQAAAAAwRJACAAAAAEMEKQAAAAAwRJACAAAAAEMEKQAAAAAwRJACAAAAAEMEKQAAAAAwRJACAAAAAEMEKQAAAAAwRJACAAAAAEMEKQAAAAAwRJACAAAAAEMEKQAAAAAwRJACAAAAAEMEKQAAAAAwRJACAAAAAEMEKQAAAAAwRJACAAAAAEMEKQAAAAAwRJACAAAAAEMEKQAAAAAwRJACAAAAAEPuri4AACqD0KmJri5BJToveZV+3frpTaqmGuXXV8F5x9etn9qkah7/6+vY3Nhy6xcAgBsFI1IAAAAAYIggBQAAAACGCFIAAAAAYIggBQAAAACGCFIAAAAAYIggBQAAAACGjIPUtm3b1K9fPwUHB8tms2ndunVO2y3L0tNPP62goCB5eXkpKipKX3/9tVObkydPaujQofLx8ZGfn59Gjx4tu93u1Gbfvn3q0aOHatSooZCQEM2bN8/87AAAAACgHBgHqfz8fHXo0EGLFy++7PZ58+bppZde0pIlS/TJJ5+oVq1aio6O1vnz//vMkqFDh+rAgQNKSkrS+vXrtW3bNo0bN86xPS8vT3369FGjRo20Z88ePffcc5oxY4aWLl16HacIAAAAAGXL+AN577rrLt11112X3WZZlhYuXKi//OUvuvvuuyVJy5cvV0BAgNatW6fBgwfr0KFD2rRpk3bv3q2uXbtKkhYtWqS+fftq/vz5Cg4O1ooVK1RQUKDXX39dHh4eatu2rdLT07VgwQKnwAUAAAAArlCmz0gdPXpU2dnZioqKcqzz9fVVt27dlJaWJklKS0uTn5+fI0RJUlRUlKpVq6ZPPvnE0aZnz57y8PBwtImOjlZGRoZOnTp12b4vXLigvLw8pxcAAAAAlIcyDVLZ2dmSpICAAKf1AQEBjm3Z2dmqX7++03Z3d3f5+/s7tbncMX7cx0/Fx8fL19fX8QoJCfnlJwQAAAAAl3HDzNo3bdo05ebmOl7fffedq0sCAAAAcIMq0yAVGBgoSTpx4oTT+hMnTji2BQYGKicnx2l7UVGRTp486dTmcsf4cR8/5enpKR8fH6cXAAAAAJSHMg1SjRs3VmBgoDZv3uxYl5eXp08++URhYWGSpLCwMJ0+fVp79uxxtNmyZYtKSkrUrVs3R5tt27apsLDQ0SYpKUktW7ZUnTp1yrJkAAAAADBmHKTsdrvS09OVnp4uqXSCifT0dGVmZspms2nSpEl69tln9f7772v//v0aMWKEgoOD1b9/f0lS69atFRMTo7Fjx2rXrl3asWOHJk6cqMGDBys4OFiSdP/998vDw0OjR4/WgQMHtHr1ar344ouaMmVKmZ04AAAAAFwv4+nPP/30U91xxx2O5YvhZuTIkVq2bJkef/xx5efna9y4cTp9+rS6d++uTZs2qUaNGo59VqxYoYkTJ6pXr16qVq2aBg4cqJdeesmx3dfXVx9++KEmTJigLl26qG7dunr66aeZ+hwAAABApWAcpCIjI2VZ1hW322w2zZw5UzNnzrxiG39/f61cufKq/bRv314fffSRaXkAAAAAUO5umFn7AAAAAKCiEKQAAAAAwBBBCgAAAAAMEaQAAAAAwBBBCgAAAAAMEaQAAAAAwBBBCgAAAAAMEaQAAAAAwBBBCgAAAAAMEaQAAAAAwBBBCgAAAAAMEaQAAAAAwBBBCgAAAAAMEaQAAAAAwBBBCgAAAAAMEaQAAAAAwBBBCgAAAAAMEaQAAAAAwBBBCgAAAAAMEaQAAAAAwBBBCgAAAAAMEaQAAAAAwBBBCgAAAAAMEaQAAAAAwJC7qwsobzdP/0DVPGu6ugwAAAAANxBGpAAAAADAEEEKAAAAAAwRpAAAAADAEEEKAAAAAAwRpAAAAADAEEEKAAAAAAwRpAAAAADAEEEKAAAAAAwRpAAAAADAEEEKAAAAAAwRpAAAAADAEEEKAAAAAAwRpAAAAADAEEEKAAAAAAwRpAAAAADAEEEKAAAAAAwRpAAAAADAEEEKAAAAAAwRpAAAAADAEEEKAAAAAAwRpAAAAADAEEEKAAAAAAwRpAAAAADAEEEKAAAAAAwRpAAAAADAEEEKAAAAAAwRpAAAAADAEEEKAAAAAAwRpAAAAADAEEEKAAAAAAwRpAAAAADAEEEKAAAAAAwRpAAAAADAEEEKAAAAAAwRpAAAAADAEEEKAAAAAAwRpAAAAADAEEEKAAAAAAwRpAAAAADAEEEKAAAAAAwRpAAAAADAEEEKAAAAAAwRpAAAAADAEEEKAAAAAAwRpAAAAADAEEEKAAAAAAwRpAAAAADAEEEKAAAAAAwRpAAAAADAEEEKAAAAAAy5u7oAAEDlEjo10dUlVArH5sa6ugQAQCXGiBQAAAAAGCJIAQAAAIAhghQAAAAAGCJIAQAAAIAhghQAAAAAGCJIAQAAAIAhghQAAAAAGCJIAQAAAIAhghQAAAAAGCJIAQAAAIChMg9SM2bMkM1mc3q1atXKsf38+fOaMGGCbrrpJtWuXVsDBw7UiRMnnI6RmZmp2NhY1axZU/Xr19djjz2moqKisi4VAAAAAK6Le3kctG3btkpOTv5fJ+7/62by5MlKTEzUP//5T/n6+mrixIn6/e9/rx07dkiSiouLFRsbq8DAQH388cfKysrSiBEjVL16dc2ZM6c8ygUAAAAAI+USpNzd3RUYGHjJ+tzcXCUkJGjlypW68847JUlvvPGGWrdurZ07d+q2227Thx9+qIMHDyo5OVkBAQHq2LGjZs2apSeeeEIzZsyQh4dHeZQMAAAAANesXJ6R+vrrrxUcHKwmTZpo6NChyszMlCTt2bNHhYWFioqKcrRt1aqVGjZsqLS0NElSWlqa2rVrp4CAAEeb6Oho5eXl6cCBA1fs88KFC8rLy3N6AQAAAEB5KPMg1a1bNy1btkybNm3SK6+8oqNHj6pHjx46c+aMsrOz5eHhIT8/P6d9AgIClJ2dLUnKzs52ClEXt1/cdiXx8fHy9fV1vEJCQsr2xAAAAADgv8r81r677rrL8XX79u3VrVs3NWrUSG+//ba8vLzKujuHadOmacqUKY7lvLw8whQAAACAclHu05/7+fmpRYsWOnz4sAIDA1VQUKDTp087tTlx4oTjmarAwMBLZvG7uHy5564u8vT0lI+Pj9MLAAAAAMpDuQcpu92uI0eOKCgoSF26dFH16tW1efNmx/aMjAxlZmYqLCxMkhQWFqb9+/crJyfH0SYpKUk+Pj5q06ZNeZcLAAAAAD+rzG/ti4uLU79+/dSoUSMdP35c06dPl5ubm4YMGSJfX1+NHj1aU6ZMkb+/v3x8fPTII48oLCxMt912mySpT58+atOmjYYPH6558+YpOztbf/nLXzRhwgR5enqWdbkAAAAAYKzMg9T333+vIUOG6D//+Y/q1aun7t27a+fOnapXr54k6YUXXlC1atU0cOBAXbhwQdHR0frb3/7m2N/NzU3r16/XQw89pLCwMNWqVUsjR47UzJkzy7pUAAAAALguZR6kVq1addXtNWrU0OLFi7V48eIrtmnUqJE2bNhQ1qUBAAAAQJko92ekAAAAAOBGQ5ACAAAAAEMEKQAAAAAwRJACAAAAAEMEKQAAAAAwRJACAAAAAEMEKQAAAAAwRJACAAAAAEMEKQAAAAAwRJACAAAAAEMEKQAAAAAwRJACAAAAAEMEKQAAAAAwRJACAAAAAEMEKQAAAAAwRJACAAAAAEMEKQAAAAAwRJACAAAAAEMEKQAAAAAwRJACAAAAAEMEKQAAAAAwRJACAAAAAEMEKQAAAAAwRJACAAAAAEMEKQAAAAAwRJACAAAAAEMEKQAAAAAwRJACAAAAAEMEKQAAAAAwRJACAAAAAEMEKQAAAAAwRJACAAAAAEMEKQAAAAAwRJACAAAAAEPuri4AAIDKKHRqoqtLqDSOzY11dQkAUOkwIgUAAAAAhghSAAAAAGCIIAUAAAAAhghSAAAAAGCIIAUAAAAAhghSAAAAAGCIIAUAAAAAhghSAAAAAGCIIAUAAAAAhghSAAAAAGCIIAUAAAAAhghSAAAAAGCIIAUAAAAAhghSAAAAAGCIIAUAAAAAhghSAAAAAGCIIAUAAAAAhghSAAAAAGCIIAUAAAAAhghSAAAAAGCIIAUAAAAAhghSAAAAAGCIIAUAAAAAhghSAAAAAGCIIAUAAAAAhghSAAAAAGCIIAUAAAAAhghSAAAAAGCIIAUAAAAAhghSAAAAAGCIIAUAAAAAhghSAAAAAGCIIAUAAAAAhghSAAAAAGDI3dUFAACAyi10aqKrS6g0js2NdXUJACoJRqQAAAAAwBBBCgAAAAAMEaQAAAAAwBBBCgAAAAAMEaQAAAAAwBBBCgAAAAAMEaQAAAAAwBBBCgAAAAAMEaQAAAAAwBBBCgAAAAAMEaQAAAAAwBBBCgAAAAAMubu6AAAAgKoidGqiq0uoFI7NjXV1CYDLMSIFAAAAAIYIUgAAAABgiCAFAAAAAIYIUgAAAABgqFIHqcWLFys0NFQ1atRQt27dtGvXLleXBAAAAACVN0itXr1aU6ZM0fTp0/XZZ5+pQ4cOio6OVk5OjqtLAwAAAPArV2mnP1+wYIHGjh2rBx54QJK0ZMkSJSYm6vXXX9fUqVMvaX/hwgVduHDBsZybmytJKrlwtmIKBiqZkoJqkvJKv76QL1klri0IP6tE5yXbf7++cFZS+X3PSgrO/+/rC2e5PgAYaTj5n64uodL44ploV5eAa5CXV/o3kWVZZXZMm1WWRysjBQUFqlmzpt555x3179/fsX7kyJE6ffq03nvvvUv2mTFjhp555pkKrBIAAABAVXLkyBE1adKkTI5VKUekfvjhBxUXFysgIMBpfUBAgL788svL7jNt2jRNmTLFsXz69Gk1atRImZmZ8vX1Ldd68euWl5enkJAQfffdd/Lx8XF1ObiBca2honCtoaJwraGi5ObmqmHDhvL39y+zY1bKIHU9PD095enpecl6X19ffjBRIXx8fLjWUCG41lBRuNZQUbjWUFGqVSu7KSIq5WQTdevWlZubm06cOOG0/sSJEwoMDHRRVQAAAABQqlIGKQ8PD3Xp0kWbN292rCspKdHmzZsVFhbmwsoAAAAAoBLf2jdlyhSNHDlSXbt21a233qqFCxcqPz/fMYvfz/H09NT06dMve7sfUJa41lBRuNZQUbjWUFG41lBRyuNaq5Sz9l308ssv67nnnlN2drY6duyol156Sd26dXN1WQAAAAB+5Sp1kAIAAACAyqhSPiMFAAAAAJUZQQoAAAAADBGkAAAAAMAQQQoAAAAADFXpILV48WKFhoaqRo0a6tatm3bt2nXV9v/85z/VqlUr1ahRQ+3atdOGDRsqqFJUdSbX2muvvaYePXqoTp06qlOnjqKion722gQuMv29dtGqVatks9nUv3//8i0QNwzTa+306dOaMGGCgoKC5OnpqRYtWvDvKK6J6bW2cOFCtWzZUl5eXgoJCdHkyZN1/vz5CqoWVdG2bdvUr18/BQcHy2azad26dT+7T0pKijp37ixPT081a9ZMy5YtM+63ygap1atXa8qUKZo+fbo+++wzdejQQdHR0crJybls+48//lhDhgzR6NGjtXfvXvXv31/9+/fXF198UcGVo6oxvdZSUlI0ZMgQbd26VWlpaQoJCVGfPn3073//u4IrR1Vjeq1ddOzYMcXFxalHjx4VVCmqOtNrraCgQL1799axY8f0zjvvKCMjQ6+99poaNGhQwZWjqjG91lauXKmpU6dq+vTpOnTokBISErR69Wr9+c9/ruDKUZXk5+erQ4cOWrx48TW1P3r0qGJjY3XHHXcoPT1dkyZN0pgxY/TBBx+YdWxVUbfeeqs1YcIEx3JxcbEVHBxsxcfHX7b9fffdZ8XGxjqt69atm/WHP/yhXOtE1Wd6rf1UUVGR5e3tbb355pvlVSJuENdzrRUVFVnh4eHW3//+d2vkyJHW3XffXQGVoqozvdZeeeUVq0mTJlZBQUFFlYgbhOm1NmHCBOvOO+90WjdlyhTr9ttvL9c6ceOQZK1du/aqbR5//HGrbdu2TusGDRpkRUdHG/VVJUekCgoKtGfPHkVFRTnWVatWTVFRUUpLS7vsPmlpaU7tJSk6OvqK7QHp+q61nzp79qwKCwvl7+9fXmXiBnC919rMmTNVv359jR49uiLKxA3geq61999/X2FhYZowYYICAgJ08803a86cOSouLq6oslEFXc+1Fh4erj179jhu//vmm2+0YcMG9e3bt0Jqxq9DWeUC97IsqqL88MMPKi4uVkBAgNP6gIAAffnll5fdJzs7+7Lts7Ozy61OVH3Xc6391BNPPKHg4OBLfmCBH7uea2379u1KSEhQenp6BVSIG8X1XGvffPONtmzZoqFDh2rDhg06fPiwHn74YRUWFmr69OkVUTaqoOu51u6//3798MMP6t69uyzLUlFRkcaPH8+tfShTV8oFeXl5OnfunLy8vK7pOFVyRAqoKubOnatVq1Zp7dq1qlGjhqvLwQ3kzJkzGj58uF577TXVrVvX1eXgBldSUqL69etr6dKl6tKliwYNGqQnn3xSS5YscXVpuMGkpKRozpw5+tvf/qbPPvtMa9asUWJiombNmuXq0oBLVMkRqbp168rNzU0nTpxwWn/ixAkFBgZedp/AwECj9oB0fdfaRfPnz9fcuXOVnJys9u3bl2eZuAGYXmtHjhzRsWPH1K9fP8e6kpISSZK7u7syMjLUtGnT8i0aVdL1/F4LCgpS9erV5ebm5ljXunVrZWdnq6CgQB4eHuVaM6qm67nWnnrqKQ0fPlxjxoyRJLVr1075+fkaN26cnnzySVWrxhgAfrkr5QIfH59rHo2SquiIlIeHh7p06aLNmzc71pWUlGjz5s0KCwu77D5hYWFO7SUpKSnpiu0B6fquNUmaN2+eZs2apU2bNqlr164VUSqqONNrrVWrVtq/f7/S09Mdr9/97neOGYhCQkIqsnxUIdfze+3222/X4cOHHWFdkr766isFBQURonBF13OtnT179pKwdDHAl84jAPxyZZYLzObBqDxWrVpleXp6WsuWLbMOHjxojRs3zvLz87Oys7Mty7Ks4cOHW1OnTnW037Fjh+Xu7m7Nnz/fOnTokDV9+nSrevXq1v79+111CqgiTK+1uXPnWh4eHtY777xjZWVlOV5nzpxx1SmgijC91n6KWftwrUyvtczMTMvb29uaOHGilZGRYa1fv96qX7++9eyzz7rqFFBFmF5r06dPt7y9va233nrL+uabb6wPP/zQatq0qXXfffe56hRQBZw5c8bau3evtXfvXkuStWDBAmvv3r3Wt99+a1mWZU2dOtUaPny4o/0333xj1axZ03rsscesQ4cOWYsXL7bc3NysTZs2GfVbZYOUZVnWokWLrIYNG1oeHh7Wrbfeau3cudOxLSIiwho5cqRT+7fffttq0aKF5eHhYbVt29ZKTEys4IpRVZlca40aNbIkXfKaPn16xReOKsf099qPEaRgwvRa+/jjj61u3bpZnp6eVpMmTazZs2dbRUVFFVw1qiKTa62wsNCaMWOG1bRpU6tGjRpWSEiI9fDDD1unTp2q+MJRZWzduvWyf3tdvLZGjhxpRUREXLJPx44dLQ8PD6tJkybWG2+8YdyvzbIYJwUAAAAAE1XyGSkAAAAAcCWCFAAAAAAYIkgBAAAAgCGCFAAAAAAYIkgBAAAAgCGCFAAAAAAYIkgBAAAAgCGCFAAAAAAYIkgBAAAAgCGCFAAAAAAYIkgBAAAAgKH/BzUKzv1Ot5mjAAAAAElFTkSuQmCC", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "em.plot_distribution_of_all_weights()" ] }, { "cell_type": "markdown", "id": "800c9f29-1260-40fb-bdf0-34cc9ada4aa3", "metadata": {}, "source": [ "Or with a range 0.1 from 0.0 to 1.0 grouping:" ] }, { "cell_type": "code", "execution_count": 31, "id": "3e624fb5-cb48-4081-b90f-0e59adf88d26", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Distribution-% of predicted scores: [13.551092474067536, 28.8126241447804, 25.5131317589936, 17.325093798278527, 9.00463473846833, 3.8402118737585518, 1.4566320900463474, 0.4634738468329287, 0.03310527477378062, 0.0]\n" ] }, { "data": { "image/png": "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I0aMsPsHzNy5c9WrVy81bdpUEydO1Pnz5zV9+nTVr19fW7ZsUfHixfXII4/o+PHjWr58uebOnZtlhlmzZunixYsaMGCAvL29VbBgQaWnp2eabvv27WrQoIE8PT01YMAAFS9eXIcOHdI333yjcePG3XBdr5aWlqamTZuqdu3aev3117VixQq98cYbKlmypB599NHrvnfkyJGaNGmSWrVqpaZNm2rbtm1q2rTpNYupxx57TKGhoXrxxReVlJQkSdq0aZN++uknde3aVXfccYeOHDmi6dOnKzY2Vrt375afn5/dPAYPHqyQkBCNHj1a+/bt0/Tp0/XHH3/YiuIMBw8eVMeOHdW3b1/16tVLH330kXr37q0aNWqoQoUKWea73n4r458AL7/8sry8vDRixAglJyfLy8tLs2fPVp8+fVSrVi1NmDBBJ0+e1JtvvqkNGzZoy5YtCgkJsevv5s2bKyYmRpMmTdK8efM0ePBg+fv76/nnn1f37t3Vvn17zZgxQz179lSdOnUUHR193c/hkUcesWUYOnSoDh8+rLfffltbtmzRhg0b7M4kuVG/xMTEaOjQoXrrrbf03HPPqVy5cra+yaq/rvU7qn79+ho7dqzmz5+vwYMH296TkpKiBQsWqEOHDjc88nszffXf//5XixcvVqdOnRQdHa2TJ0/qvffeU8OGDbV7925FRkbe8HesI/vBjJzZ/Q5Jju2ne/furc8//1wPPfSQ7rnnHq1du9b2uwLIE3Ly3Hbg3y7jmu5NmzZdc5rg4GBTrVo123DGtawZpkyZcsNrW693TVfDhg2NJDNjxowsxzVs2NA2nHFNd9GiRc3Zs2dt7Z9//rmRZN58801bW7FixbK8FvfqeV4vW69evUyxYsVsw4sXLzaSzCuvvGI3XceOHY3FYjEHDx60tUkyXl5edm3btm0zksy0adMyLetKU6dONZLMf/7zH1tbSkqKqVOnjgkICLBbd0evrXTkc/roo4+MJDN58uRM49LT040xzvdBvnz5zK5du+ym7du3r4mIiDB///23XXvXrl1NcHCwOX/+vDHGmDZt2pgKFSrccN2u9tprrxkPDw9bP7311lumWLFi5u677zbPPPOMMcaYtLQ0ExISYoYNG2Z739XbtjE3vqb74Ycftmtv166dKVSo0HXzpaammujoaFOsWDHzzz//2I3L6GdjjKlataoJ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VB4eHuratavTy3zrrbdUv359Va9eXQMGDFB0dLSOHDmiJUuWaOvWra5cvesqUqSIHn/8cb3xxhtq3bq1mjVrpm3btmnp0qUqXLiww0dLH3jgAc2dO1fBwcEqX768Nm7cqBUrVlzzsYUpKSlq1KiROnfurH379undd99V/fr11bp1a1eunsM8PT01ceJE9enTRw0bNlS3bt1sjwwrXry4hg0b5tblN2zYUI888ogmTJigrVu36v7775enp6cOHDigL774Qm+++aY6duzo1DyrVq0qDw8PTZw4UYmJifL29tZ9992nsLCwTNPe6HeUp6enunbtqrffflseHh52N+B0pwceeEBjx45Vnz59VLduXe3YsUPz5s2zO5PsRvkd2Q/eCjVq1FCHDh00depUnTp1yvbIsP3790tyzxlPwC13K2+VDsBexiNiMl5eXl4mPDzcNGnSxLz55pt2j6bKcPVjlVauXGnatGljIiMjjZeXl4mMjDTdunUz+/fvt3vfV199ZcqXL2/y589v9/iQhg0bXvOxUNd6ZNinn35qRo4cacLCwoyvr69p2bJlpsf7GGPMG2+8YYoWLWq8vb1NvXr1zG+//ZZpntfLdvVjloy5/AijYcOGmcjISOPp6WlKly5tXnvttUyPE5KU5WOcrvUos6udPHnS9OnTxxQuXNh4eXmZSpUqZfnIGEcfGebo53T+/Hnz/PPPm+joaOPp6WnCw8NNx44dzaFDh1zWBxnrN2jQIBMVFWVbTqNGjcz7779vm+a9994zMTExplChQsbb29uULFnSPPXUUyYxMfGG62uMMbVq1TKSzC+//GJrO3bsmJFkoqKiMk2f1SPD9u7da2JiYoyvr6/dY5oypr36EWwZ36nDhw/fMN/69etNkyZNTGBgoPH39zeVK1fO9Di5FStWmHr16hlfX18TFBRkWrVqZXbv3m0bn5ycbJ566ilTpUoV23yqVKli3n33Xbv5XOuRYa+99lqmXMriETmHDh0yPXv2NOHh4cbT09MULVrUPPDAA2bBggXXXcdrLSfju/zFF1/YtV/rMYarV682TZs2NcHBwcbHx8eULFnS9O7d2/z222+2aVJTU82QIUNMaGiosVgsts/yeuua1WO+jDFm586dpl27diYkJMT4+PiYMmXKmFGjRjm0rlc/Mszf3z/TtFlta1lJTU01o0aNMuHh4cbX19fcd999Zs+ePaZQoUJm4MCBtumu9/jHf/75x7YvCQgIME2bNjV79+7NtC/KmMfatWvNgAEDTIECBUxAQIDp3r273WPrjLn2fier/WtWrvfIsKu3iQzz58831apVM97e3qZgwYKme/fu5tixY3bTXKu/r/V7xtH9pzHGvP/++6ZGjRrG19fXBAYGmkqVKpmnn37aHD9+/Ibzy6pfPvjgA1OiRAnj4eFh94gvZ35HZfj111+NJHP//fc7tC7G3HxfXbx40Tz55JMmIiLC+Pr6mnr16pmNGzc6nf9G+0FnvkNX77uc2U8nJSWZQYMGmYIFC5qAgADTtm1bs2/fPiPJvPrqq5mWD+Q2FmO4iwEAAIAjzpw5owIFCuiVV17R888/77L5zp49W3369NGmTZtUs2ZNl80X7rdt2zZVrVpVc+bM0UMPPZTTcfKMrVu3qlq1avrPf/5z3cvsgNyAa7oBAACycOHChUxtU6dOlSTFxsbe2jC4bX3wwQcKCAhQ+/btczpKrnWt71q+fPkUExOTA4kA1+KabgAAgCzMnz9fs2fPVosWLRQQEKD169fr008/1f3336969erldDzksG+++Ua7d+/W+++/r8GDB9s90QDOmTRpkjZv3qx7771X+fPn19KlS7V06VINGDBAUVFROR0PuGkU3QAAAFmoXLmy8ufPr0mTJuns2bO2m6u98sorOR0Nt4EhQ4bo5MmTatGihcaMGZPTcXK1unXravny5Xr55ZdltVp15513avTo0S69hAPISVzTDQAAAACAm3BNNwAAAAAAbkLRDQAAAACAm+T5a7rT09N1/PhxBQYGymKx5HQcAAAAAEAeYIzRuXPnFBkZqXz5rnM8OycfEv7uu++aSpUqmcDAQBMYGGjuuece891339nGX7hwwTz22GOmYMGCxt/f37Rv396cOHHCqWUcPXrUSOLFixcvXrx48eLFixcvXrxc/jp69Oh1a9IcvZHaN998Iw8PD5UuXVrGGH388cd67bXXtGXLFlWoUEGPPvqolixZotmzZys4OFiDBw9Wvnz5tGHDBoeXkZiYqJCQEB09elRBQUFuXBsA/3ZJSVJk5OWfjx+XeHpM3paUkqTINy5/4MefPC5/r1v3gSclJSnyfxvb8ePHeVQRAAA54OzZs4qKitKZM2cUHBx8zeluu7uXFyxYUK+99po6duyo0NBQffLJJ+rYsaMkae/evSpXrpw2btyoe+65x6H5nT17VsHBwUpMTKToBuBWSUlSQMDln61Wiu68LiklSQETLn/g1pHWW150B/xvY7NarRTdAADkAEdrzdvmRmppaWn67LPPlJSUpDp16mjz5s26dOmSGjdubJumbNmyuvPOO7Vx48YcTAoAAAAAgGNy/EZqO3bsUJ06dXTx4kUFBAToyy+/VPny5bV161Z5eXkpJCTEbvoiRYroxIkT15xfcnKykpOTbcNnz551V3QAAAAAAK4rx490lylTRlu3btUvv/yiRx99VL169dLu3buzPb8JEyYoODjY9oqKinJhWgAAAAAAHJfjR7q9vLxUqlQpSVKNGjW0adMmvfnmm+rSpYtSUlJ05swZu6PdJ0+eVHh4+DXnN3LkSA0fPtw2nHFxOwAAAIAbS09PV0pKSk7HAHKcp6enPDw8bno+OV50Xy09PV3JycmqUaOGPD09tXLlSnXo0EGStG/fPsXFxalOnTrXfL+3t7e8vb1vVVwAAAAgz0hJSdHhw4eVnp6e01GA20JISIjCw8NlsViyPY8cLbpHjhyp5s2b684779S5c+f0ySefaM2aNfr+++8VHBysvn37avjw4SpYsKCCgoI0ZMgQ1alTx+E7lwMAAABwjDFG8fHx8vDwUFRUlPLly/ErUYEcY4zR+fPnlZCQIEmKiIjI9rxytOhOSEhQz549FR8fr+DgYFWuXFnff/+9mjRpIkmaMmWK8uXLpw4dOig5OVlNmzbVu+++m5ORAQAAgDwpNTVV58+fV2RkpPz8/HI6DpDjfH19JV2uW8PCwrJ9qnmOFt0zZ8687ngfHx+98847euedd25RIgAAAODfKS0tTdLley4BuCzjH1CXLl3KdtHNOSMAAAAAbG7m2lUgr3HF94GiGwAAAAAAN6HoBgAAAIB/sTVr1shisejMmTMOv2f06NGqWrWq2zLlJRTdAAAAAHK9jRs3ysPDQy1btszpKLlO3bp1bTe3dqXY2Fg98cQTLp1nbkTRDQAAACDXmzlzpoYMGaJ169bp+PHjbl2WMUapqaluXcat5OXlddPPosa1UXQDAAAAyNWsVqvmz5+vRx99VC1bttTs2bNt4x588EF16dLFbvpLly6pcOHCmjNnjiQpPT1dEyZMUHR0tHx9fVWlShUtWLDANn3G6ddLly5VjRo15O3trfXr1+vQoUNq06aNihQpooCAANWqVUsrVqywW1Z8fLxatmwpX19fRUdH65NPPlHx4sU1depU2zRnzpxRv379FBoaqqCgIN13333atm3bNde3Y8eOGjx4sG34iSeekMVi0d69eyVJKSkp8vf3t2VxdP2uPL38gw8+UFRUlPz8/NSuXTtNnjxZISEhmbLMnTtXxYsXV3BwsLp27apz585Jknr37q21a9fqzTfflMVikcVi0ZEjR665TnkZRTcAAACATIyRkpJy5mWMc1k///xzlS1bVmXKlFGPHj300UcfyfxvJt27d9c333wjq9Vqm/7777/X+fPn1a5dO0nShAkTNGfOHM2YMUO7du3SsGHD1KNHD61du9ZuOc8++6xeffVV7dmzR5UrV5bValWLFi20cuVKbdmyRc2aNVOrVq0UFxdne0/Pnj11/PhxrVmzRgsXLtT777+vhIQEu/l26tRJCQkJWrp0qTZv3qzq1aurUaNGOn36dJbr27BhQ61Zs8Y2vHbtWhUuXNjWtmnTJl26dEl169Z1av0ybNiwQQMHDtTjjz+urVu3qkmTJho3blym6Q4dOqTFixfr22+/1bfffqu1a9fq1VdflSS9+eabqlOnjvr376/4+HjFx8crKioqy+XleSaPS0xMNJJMYmJiTkcBkMdZrcZc/jPh8s/I26zJVqPRMhotY02+tR+41Wo1kowkY2VjA+AiFy5cMLt37zYXLlwwxtj/XrvVL2d3bXXr1jVTp041xhhz6dIlU7hwYbN69Wq74Tlz5tim79atm+nSpYsxxpiLFy8aPz8/89NPP9nNs2/fvqZbt27GGGNWr15tJJnFixffMEuFChXMtGnTjDHG7Nmzx0gymzZtso0/cOCAkWSmTJlijDHmxx9/NEFBQebixYt28ylZsqR57733slzG9u3bjcViMQkJCeb06dPGy8vLvPzyy7Z1euWVV0zdunWdXr9//vnHGGNMly5dTMuWLe2m7969uwkODrYNv/TSS8bPz8+cPXvW1vbUU0+Z2rVr24YbNmxoHn/88et1123v6u/FlRytNfPnXLkPAAAAADdn3759+vXXX/Xll19KkvLnz68uXbpo5syZio2NVf78+dW5c2fNmzdPDz30kJKSkvTVV1/ps88+kyQdPHhQ58+fV5MmTezmm5KSomrVqtm11axZ027YarVq9OjRWrJkieLj45WamqoLFy7YjnTv27dP+fPnV/Xq1W3vKVWqlAoUKGAb3rZtm6xWqwoVKmQ37wsXLujQoUNZrnPFihVVsGBBrV27Vl5eXqpWrZoeeOABvfPOO5IuH/mOjY11ev2u7NOMswAy3H333fr222/t2ooXL67AwEDbcERERKaj+JAougEAAABk4ucnXXFG9i1ftqNmzpyp1NRURUZG2tqMMfL29tbbb7+t4OBgde/eXQ0bNlRCQoKWL18uX19fNWvWTJJsp50vWbJERYsWtZu3t7e33bC/v7/d8IgRI7R8+XK9/vrrKlWqlHx9fdWxY0elpKQ4nN9qtSoiIsLudPEMWV1DLUkWi0UxMTFas2aNvL29FRsbq8qVKys5OVk7d+7UTz/9pBEjRji9fs7y9PTMlCs9Pf2m5pkXUXQDAAAAyMRika6qMW87qampmjNnjt544w3df//9duPatm2rTz/9VAMHDlTdunUVFRWl+fPna+nSperUqZOtYCxfvry8vb0VFxenhg0bOrX8DRs2qHfv3rajwlar1e5mYWXKlFFqaqq2bNmiGjVqSLp85Pmff/6xTVO9enWdOHFC+fPnV/HixR1edsOGDfXBBx/I29tb48aNU758+RQTE6PXXntNycnJqlevXrbXr0yZMtq0aZNd29XDjvDy8lJaWprT78trKLoBAAAA5Erffvut/vnnH/Xt2zfTM6Y7dOigmTNnauDAgZIu38V8xowZ2r9/v1avXm2bLjAwUCNGjNCwYcOUnp6u+vXrKzExURs2bFBQUJB69ep1zeWXLl1aixYtUqtWrWSxWDRq1Ci7I71ly5ZV48aNNWDAAE2fPl2enp568skn5evra3s8V+PGjVWnTh21bdtWkyZN0l133aXjx49ryZIlateuXaZT2jPExsZq2LBh8vLyUv369W1tI0aMUK1atWxH5bOzfkOGDFFMTIwmT56sVq1aadWqVVq6dKnTjxQrXry4fvnlFx05ckQBAQEqWLCg8uX7993L+9+3xgAAAADyhJkzZ6px48aZCm7pctH922+/afv27ZIu38V89+7dKlq0qO0ocIaXX35Zo0aN0oQJE1SuXDk1a9ZMS5YsUXR09HWXP3nyZBUoUEB169ZVq1at1LRpU7vrtyVpzpw5KlKkiGJiYtSuXTv1799fgYGB8vHxkXT5lOzvvvtOMTEx6tOnj+666y517dpVf/zxh4oUKXLNZVeqVEkhISGqWrWqAgICJF0uutPS0mzXc2d3/erVq6cZM2Zo8uTJqlKlipYtW6Zhw4bZMjtqxIgR8vDwUPny5RUaGmp3V/d/E4sxzt6QP3c5e/asgoODlZiYqKCgoJyOg5zk5H/mclze/mrmSUlJ0v9+58lqvf1PycPNSUpJUsCEyx+4daRV/l637gNPSkqy/YFltVozXWMIANlx8eJFHT58WNHR0U4XV3DcsWPHFBUVpRUrVqhRo0Y5Hcdh/fv31969e/Xjjz/mdJRb6nrfC0drTU4vBwAAAAA3WbVqlaxWqypVqqT4+Hg9/fTTKl68uGJiYnI62nW9/vrratKkifz9/bV06VJ9/PHHevfdd3M6Vq5E0Q0AAAAAbnLp0iU999xz+u9//6vAwEDVrVtX8+bNy3Tn79vNr7/+qkmTJuncuXMqUaKE3nrrLfXr1y+nY+VKFN0AAAAA4CZNmzZV06ZNczqG0z7//POcjpBncCM1AAAAAADchKIbAAAAAAA3oegGAAAAAMBNKLoBAAAAAHATim4AAAAAANyEohsAAAAAADeh6AYAAACA61izZo0sFovOnDkjSZo9e7ZCQkJyNFN2FC9eXFOnTnV4+iNHjshisWjr1q1uy/RvQNENAAAAINfq3bu3LBaLBg4cmGncoEGDZLFY1Lt3b5cus0uXLtq/f79L53krbNq0SQMGDHDpPHPrPyBuJYpuAAAAALlaVFSUPvvsM124cMHWdvHiRX3yySe68847Xb48X19fhYWFuXy+7hYaGio/P7+cjvGvQ9ENAAAAIFerXr26oqKitGjRIlvbokWLdOedd6patWp206anp2vChAmKjo6Wr6+vqlSpogULFthN89133+muu+6Sr6+v7r33Xh05csRu/NVHdw8dOqQ2bdqoSJEiCggIUK1atbRixQq79xQvXlzjx4/Xww8/rMDAQN155516//33r7lO3377rUJCQpSWliZJ2rp1qywWi5599lnbNP369VOPHj1sw+vXr1eDBg3k6+urqKgoDR06VElJSXYZrjy9fO/evapfv758fHxUvnx5rVixQhaLRYsXL7bL8t///lf33nuv/Pz8VKVKFW3cuFHS5dPu+/Tpo8TERFksFlksFo0ePfqa6/RvRdENAAAAIBNjjJKSknLkZYxxOu/DDz+sWbNm2YY/+ugj9enTJ9N0EyZM0Jw5czRjxgzt2rVLw4YNU48ePbR27VpJ0tGjR9W+fXu1atVKW7duVb9+/ewK3axYrVa1aNFCK1eu1JYtW9SsWTO1atVKcXFxdtO98cYbqlmzprZs2aLHHntMjz76qPbt25flPBs0aKBz585py5YtkqS1a9eqcOHCWrNmjW2atWvXKjY2VtLlwr9Zs2bq0KGDtm/frvnz52v9+vUaPHhwlvNPS0tT27Zt5efnp19++UXvv/++nn/++Synff755zVixAht3bpVd911l7p166bU1FTVrVtXU6dOVVBQkOLj4xUfH68RI0Zct6/+lUwel5iYaCSZxMTEnI6CnCblrhdyHav1/z8+qzWn08DdrMlWo9EyGi1jTb61H7jVajWSjCRjZWMD4CIXLlwwu3fvNhcuXDDG2O9rbvXLmX1br169TJs2bUxCQoLx9vY2R44cMUeOHDE+Pj7mr7/+Mm3atDG9evUyxhhz8eJF4+fnZ3766Se7efTt29d069bNGGPMyJEjTfny5e3GP/PMM0aS+eeff4wxxsyaNcsEBwdfN1eFChXMtGnTbMPFihUzPXr0sA2np6ebsLAwM3369GvOo3r16ua1114zxhjTtm1bM27cOOPl5WXOnTtnjh07ZiSZ/fv329ZhwIABdu//8ccfTb58+WyfabFixcyUKVOMMcYsXbrU5M+f38THx9umX758uZFkvvzyS2OMMYcPHzaSzIcffmibZteuXUaS2bNnj8N9kZtd/b24kqO1Zn431vMAAAAAcEuEhoaqZcuWmj17towxatmypQoXLmw3zcGDB3X+/Hk1adLErj0lJcV2GvqePXtUu3Ztu/F16tS57rKtVqtGjx6tJUuWKD4+Xqmpqbpw4UKmI92VK1e2/WyxWBQeHq6EhIRrzrdhw4Zas2aNnnzySf3444+aMGGCPv/8c61fv16nT59WZGSkSpcuLUnatm2btm/frnnz5tneb4xRenq6Dh8+rHLlytnNe9++fYqKilJ4eLit7e67784yx5W5IyIiJEkJCQkqW7bsdfsFl1F0AwAAAMjEz89PVqs1x5adHQ8//LDtdOp33nkn0/iM9VmyZImKFi1qN87b2ztby5SkESNGaPny5Xr99ddVqlQp+fr6qmPHjkpJSbGbztPT027YYrEoPT39mvONjY3VRx99pG3btsnT01Nl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x7v1lPn8bpszAAAAgFzr/KXzCpgQkCPLto60yt/L3+HpZ86cqR49ekiSmjVrpsTERK1du1axsbFq2rSp/P399eWXX+qhhx6SJH3yySdq3bq1AgMDlZycrPHjx2vFihWqU6eOJKlEiRJav3693nvvPTVs2NC2nLFjx6pJkya24YIFC6pKlSq24Zdffllffvmlvv76aw0ePFh79+7VihUrtGnTJtWsWVOS9OGHH6p06dK296xfv16//vqrEhIS5O3tLeny0dnFixdrwYIFGjBggLPdd0OdOnXS999/r4YNGyo8PFz33HOPGjVqpJ49eyooKOiG7y9btqyky6e1Z3Xad2xsrGbOnKm0tDTt3LlTXl5e6tKli9asWaNmzZppzZo1tn6Ni4vTrFmzFBcXp8jISEnSiBEjtGzZMs2aNUvjx4/PNP9p06apb9++6tOnjyTpxRdf1A8//GD3jxVJKlCggN5++215eHiobNmyatmypVauXKn+/furYMGC8vDwUGBgoMLDw53rQCdxpBsAAABArrVv3z79+uuv6tatmyQpf/786tKli2bOnGkb7ty5s+bNmydJSkpK0ldffaXu3btLkg4ePKjz58+rSZMmCggIsL3mzJmjQ4cO2S0ro3DOYLVaNWLECJUrV04hISEKCAjQnj17bEe69+3bp/z586t69eq295QqVUoFChSwDW/btk1Wq1WFChWyW/7hw4czLf9KFSpUsE1boUIFSbJ7f/Pmza/5Xg8PD82aNUvHjh3TpEmTVLRoUY0fP14VKlRw6IhvxlkE1zolu0GDBjp37py2bNmitWvXqmHDhoqNjbUd/c74h4gk7dixQ2lpabrrrrvs8q9du/aa679v3z7dfffddm1XD0uX+8jDw8M2HBERcc2j8+7EkW4AAAAAmfh5+sk60nrjCd20bEfNnDlTqamptqOk0uWi0NvbW2+//baCg4PVvXt3NWzYUAkJCVq+fLl8fX3VrFkzSbIdHV2yZImKFi1qN++MI88Z/P3tj76PGDFCy5cv1+uvv65SpUrJ19dXHTt2tN0B3BFWq1URERF21zBnuN5jsr777jvb9cl//vmnYmNjtXXrVtv4q6/NzkrRokX10EMP6aGHHtLLL7+su+66SzNmzNCYMWOu+749e/ZIunz376yEhISoSpUqWrNmjTZu3KgmTZooJibGdhfyAwcO2I50W61WeXh4aPPmzXYFsnT5nwg3w9PT027YYrEoPT39puaZHRTdAAAAADKxWCxOneKdE1JTUzVnzhy98cYbuv/+++3GtW3bVp9++qkGDhyounXrKioqSvPnz9fSpUvVqVMnW0FWvnx5eXt7Ky4uzu5Uckds2LBBvXv3tl0bbrVadeTIEdv4MmXKKDU1VVu2bFGNGjUkXT6y/s8//9imqV69uk6cOKH8+fNfs4jNSrFixWw/589/uazLuEY6OwoUKKCIiAglJSVdd7oLFy7o/fffV0xMjEJDQ685XcOGDbV69Wr9+uuvGjdunAoWLKhy5cpp3LhxioiI0F133SVJqlatmtLS0pSQkKAGDRo4lLVMmTLatGmTevbsaWvbtGmTQ++9UlZ3a3cHim4AAAAAudK3336rf/75R3379lVwcLDduA4dOmjmzJkaOHCgpMt3MZ8xY4b279+v1atX26YLDAzUiBEjNGzYMKWnp6t+/fpKTEzUhg0bFBQUpF69el1z+aVLl9aiRYvUqlUrWSwWjRo1yu5IatmyZdW4cWMNGDBA06dPl6enp5588kn5+vraTs1u3Lix6tSpo7Zt22rSpEm66667dPz4cS1ZskTt2rXLdEq7K7z33nvaunWr2rVrp5IlS+rixYuaM2eOdu3apWnTptlNm5CQoIsXL+rcuXPavHmzJk2apL///luLFi267jJiY2M1bdo0hYaG2q4Bj42N1dtvv61OnTrZprvrrrvUvXt39ezZU2+88YaqVaumv/76SytXrlTlypWzfO76kCFD1L9/f9WsWVN169bV/PnztX37dpUoUcKpfihevLjWrVunrl27ytvbW4ULF3bq/Y7imm4AAAAAudLMmTPVuHHjTAW3dLno/u2337R9+3ZJl+9ivnv3bhUtWlT16tWzm/bll1/WqFGjNGHCBJUrV07NmjXTkiVLFB0dfd3lT548WQUKFFDdunXVqlUrNW3a1O76bUmaM2eOihQpopiYGLVr1079+/dXYGCgfHx8JF0+o+C7775TTEyM+vTpY3s01x9//KEiRYrcTPdc09133y2r1aqBAweqQoUKatiwoX7++WctXrw409H+MmXKKDIyUjVq1NCrr76qxo0ba+fOnSpfvvx1l9GgQQOlp6fbzS82NlZpaWm267kzzJo1Sz179tSTTz6pMmXKqG3bttq0aZPuvPPOLOfdvXt3jRw5UiNGjFD16tV1+PBh9e7d29anjho7dqyOHDmikiVLXveo/c2yGGfvx5/LnD17VsHBwUpMTHToTnzIw9z47D23yNtfzTwpKUnKuPTIapX8b+8z8nCTklKSbHf1dfYuuze97KQk23VuVqs10zWGAJAdFy9e1OHDhxUdHe108QLHHTt2TFFRUVqxYoUaNWqU03HyjCZNmig8PFxz58516Xyv971wtNbk9HIAAAAAcJNVq1bJarWqUqVKio+P19NPP63ixYsrJiYmp6PlWufPn9eMGTPUtGlTeXh46NNPP9WKFSu0fPnynI6WJYpuAAAAAHCTS5cu6bnnntN///tfBQYGqm7dupo3b16mO2vDcRmn5I8bN04XL15UmTJltHDhQjVu3Dino2WJohsAAAAA3KRp06Zq2rRpTsfIU3x9fbVixYqcjuEwbqQGAAAAAICbUHQDAAAAsMnj91kGnOKK7wNFNwAAAAB5eHhIklJSUnI4CXD7OH/+vCTd1DX4XNMNAAAAQPnz55efn5/++usveXp6Kl8+js/h38sYo/PnzyshIUEhISG2f0plB0U3AAAAAFksFkVEROjw4cP6448/cjoOcFsICQlReHj4Tc2DohsAAACAJMnLy0ulS5fmFHNAl08pv5kj3BkougEAAADY5MuXTz4+PjkdA8gzuFADAAAAAAA3oegGAAAAAMBNOL0cgOtYLDmdwDk8hxQAAABuxpFuAAAAAADchKIbAAAAAAA3oegGAAAAAMBNcrTonjBhgmrVqqXAwECFhYWpbdu22rdvn900sbGxslgsdq+BAwfmUGIAAAAAAByXo0X32rVrNWjQIP38889avny5Ll26pPvvv19JSUl20/Xv31/x8fG216RJk3IoMQAAAAAAjsvRu5cvW7bMbnj27NkKCwvT5s2bFRMTY2v38/NTeHj4rY4HAAAAAMBNua2u6U5MTJQkFSxY0K593rx5Kly4sCpWrKiRI0fq/PnzOREPAAAAAACn3DbP6U5PT9cTTzyhevXqqWLFirb2Bx98UMWKFVNkZKS2b9+uZ555Rvv27dOiRYuynE9ycrKSk5Ntw2fPnnV7dgAAAAAAsnLbFN2DBg3Szp07tX79erv2AQMG2H6uVKmSIiIi1KhRIx06dEglS5bMNJ8JEyZozJgxbs8LAAAAAMCN3Banlw8ePFjffvutVq9erTvuuOO609auXVuSdPDgwSzHjxw5UomJibbX0aNHXZ4XAAAAAABH5OiRbmOMhgwZoi+//FJr1qxRdHT0Dd+zdetWSVJERESW4729veXt7e3KmAAAAAAAZEuOFt2DBg3SJ598oq+++kqBgYE6ceKEJCk4OFi+vr46dOiQPvnkE7Vo0UKFChXS9u3bNWzYMMXExKhy5co5GR0AAAAAgBvK0aJ7+vTpkqTY2Fi79lmzZql3797y8vLSihUrNHXqVCUlJSkqKkodOnTQCy+8kANpAQAAAABwTo6fXn49UVFRWrt27S1KAwAAAACAa90WN1IDAAAAACAvougGAAAAAMBNKLoBAAAAAHATim4AAAAAANyEohsAAAAAADeh6AYAAAAAwE0ougEAAAAAcBOKbgAAAAAA3ISiGwAAAAAAN6HoBgAAAADATfI7M/GZM2f05Zdf6scff9Qff/yh8+fPKzQ0VNWqVVPTpk1Vt25dd+UEAAAAACDXcehI9/Hjx9WvXz9FRETolVde0YULF1S1alU1atRId9xxh1avXq0mTZqofPnymj9/vrszAwAAAACQKzh0pLtatWrq1auXNm/erPLly2c5zYULF7R48WJNnTpVR48e1YgRI1waFAAAAACA3Mahonv37t0qVKjQdafx9fVVt27d1K1bN506dcol4QAAAAAAyM0cOr38RgX3zU4PAAAAAEBelO27l587d05PPfWUatWqperVq2vIkCH6+++/XZkNAAAAAIBcLdtFd//+/fX3339rzJgxeumll/Tf//5X3bt3d2U2AAAAAAByNYcfGTZlyhQ98cQTslgskqRNmzZp//798vDwkCSVKVNG99xzj3tSAgAAAACQCzlcdB86dEi1a9fWe++9p2rVqqlJkyZq2bKl2rZtq0uXLmnu3Llq2rSpO7MCAAAAAJCrOFx0v/322/r555/18MMP695779WECRP0n//8R8uXL1daWpo6deqkwYMHuzMrAAAAAAC5isNFtyTdc8892rRpkyZOnKg6derotdde08KFC92VDQAAAACAXM3pG6nlz59fzz//vL755htNnTpVHTt21IkTJ9yRDQAAAACAXM3honvbtm2qVauWAgMDVa9ePaWnp2vlypVq2bKl6tatq+nTp7szJwAAAAAAuY7DRffDDz+sBg0aaNOmTerUqZMGDhwoSerTp49++eUX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X357enq6evbsyTXdAAAAAABcwami2xijEydOaPbs2XrllVe0detW+fr6qlKlSipWrJi7MgIAAAAAkCs5XXSXKlVKu3btUunSpVW6dGl35QIAAAAAINdz6prufPnyqXTp0jp16pS78gAAAAAAkGc4fSO1V199VU899ZR27tzpjjwAAAAAAOQZTt9IrWfPnjp//ryqVKkiLy8v+fr62o0/ffq0y8IBAAAAAJCbOV10T5061Q0xAAAAAADIe5wuunv16uWOHAAAAAAA5DlOX9MtSYcOHdILL7ygbt26KSEhQZK0dOlS7dq1y6XhAAAAAADIzZwuuteuXatKlSrpl19+0aJFi2S1WiVJ27Zt00svveTygAAAAAAA5FZOF93PPvusXnnlFS1fvlxeXl629vvuu08///yzS8MBAAAAAJCbOV1079ixQ+3atcvUHhYWpr///tsloQAAAAAAyAucLrpDQkIUHx+fqX3Lli0qWrSoS0IBAAAAAJAXOF10d+3aVc8884xOnDghi8Wi9PR0bdiwQSNGjFDPnj3dkREAAAAAgFzJ6aJ7/PjxKlu2rKKiomS1WlW+fHnFxMSobt26euGFF9yREQAAAACAXMnp53R7eXnpgw8+0IsvvqgdO3bIarWqWrVqKl26tDvyAQAAAACQazlcdKenp+u1117T119/rZSUFDVq1EgvvfSSfH193ZkPAAAAAIBcy+HTy8eNG6fnnntOAQEBKlq0qN58800NGjTIndkAAAAAAMjVHC6658yZo3fffVfff/+9Fi9erG+++Ubz5s1Tenq6O/MBAAAAAJBrOVx0x8XFqUWLFrbhxo0by2Kx6Pjx424JBgAAAABAbudw0Z2amiofHx+7Nk9PT126dMnloQAAAAAAyAscvpGaMUa9e/eWt7e3re3ixYsaOHCg/P39bW2LFi1ybUIAAAAAAHIph4vuXr16ZWrr0aOHS8MAAAAAAJCXOFx0z5o1y505AAAAAADIcxy+phsAAAAAADiHohsAAAAAADeh6AYAAAAAwE0ougEAAAAAcBOKbgAAAAAA3ISiGwAAAAAAN6HoBgAAAADATSi6AQAAAABwE4puAAAAAADchKIbAAAAAAA3oegGAAAAAMBNKLoBAAAAAHCT27roHj16tCwWi92rbNmyOR0LAAAAAACH5M/pADdSoUIFrVixwjacP/9tHxkAAAAA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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "em.plot_distribution_of_scores()" ] }, { "cell_type": "markdown", "id": "93b72120-4578-4d5c-a408-a24ee78bf6cb", "metadata": {}, "source": [ "## Entity Clustering\n", "\n", "It takes as input the similarity graph produced by Entity Matching and partitions it into a set of equivalence clusters, with every cluster corresponding to a distinct real-world object." ] }, { "cell_type": "code", "execution_count": 32, "id": "500d2ef7-7017-4dba-bbea-acdba8abf5b7", "metadata": {}, "outputs": [], "source": [ "from pyjedai.clustering import ConnectedComponentsClustering, UniqueMappingClustering" ] }, { "cell_type": "code", "execution_count": 33, "id": "aebd9329-3a4b-48c9-bd05-c7bd4aed3ca9", "metadata": {}, "outputs": [], "source": [ "ccc = UniqueMappingClustering()\n", "clusters = ccc.process(pairs_graph, data, similarity_threshold=0.17)" ] }, { "cell_type": "code", "execution_count": 34, "id": "5b52a534-691a-48be-b5e9-c073dc04b154", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Method name: Unique Mapping Clustering\n", "Method info: Prunes all edges with a weight lower than t, sorts the remaining ones indecreasing weight/similarity and iteratively forms a partition forthe top-weighted pair as long as none of its entities has alreadybeen matched to some other.\n", "Parameters: \n", "\tSimilarity Threshold: 0.17\n", "\n", "Runtime: 0.0320 seconds\n" ] } ], "source": [ "ccc.report()" ] }, { "cell_type": "code", "execution_count": 35, "id": "00bc2e82-9bc1-4119-b8cb-4a1c18afee19", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "***************************************************************************************************************************\n", " Method: Unique Mapping Clustering\n", "***************************************************************************************************************************\n", "Method name: Unique Mapping Clustering\n", "Parameters: \n", "\tSimilarity Threshold: 0.17\n", "Runtime: 0.0320 seconds\n", "───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────\n", "Performance:\n", "\tPrecision: 92.69% \n", "\tRecall: 86.06%\n", "\tF1-score: 89.25%\n", "───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────\n" ] } ], "source": [ "_ = ccc.evaluate(clusters)" ] }, { "cell_type": "markdown", "id": "315369d8-6564-44d4-aea0-14034b54cf16", "metadata": {}, "source": [ "
\n", "
\n", "K. Nikoletos, J. Maciejewski, G. Papadakis & M. Koubarakis\n", "
\n", "
\n", "Apache License 2.0\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.9.18" }, "vscode": { "interpreter": { "hash": "824e5f4123a1a5b690f910010b2896a5dc6379151ca1c56e0c0465c15ebbd094" } } }, "nbformat": 4, "nbformat_minor": 5 }