243 lines
68 KiB
Text
243 lines
68 KiB
Text
{
|
|
"cells": [
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {},
|
|
"source": [
|
|
"# Train a domain classifier on the [semantic scholar dataset](https://api.semanticscholar.org/corpus)\n",
|
|
"\n",
|
|
"> Part 3: Create production inference function\n",
|
|
"\n",
|
|
"\n",
|
|
"> The blue boxes show the steps implemented in this notebook.\n",
|
|
"\n",
|
|
"In [Part 2](train.ipynb), we trained our AI model. Now, it's time to create **G**eneral **R**obust **E**nd-to-end **A**utomated **T**rustworthy deployment from it using the `GreatAI` Python package."
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 1,
|
|
"metadata": {},
|
|
"outputs": [
|
|
{
|
|
"name": "stderr",
|
|
"output_type": "stream",
|
|
"text": [
|
|
"\u001b[38;5;226m2022-06-19 15:16:23,856 | WARNING | Environment variable ENVIRONMENT is not set, defaulting to development mode ‼️\u001b[0m\n",
|
|
"\u001b[38;5;226m2022-06-19 15:16:23,857 | WARNING | The selected tracing database (ParallelTinyDbDriver) is not recommended for production\u001b[0m\n",
|
|
"\u001b[38;5;39m2022-06-19 15:16:23,858 | INFO | Options: configured ✅\u001b[0m\n",
|
|
"\u001b[38;5;39m2022-06-19 15:16:23,858 | INFO | Fetching cached versions of small-domain-prediction\u001b[0m\n",
|
|
"\u001b[38;5;39m2022-06-19 15:16:23,859 | INFO | Latest version of small-domain-prediction is 12 (from versions: 9, 10, 11, 12)\u001b[0m\n",
|
|
"\u001b[38;5;39m2022-06-19 15:16:23,860 | INFO | File small-domain-prediction-12 found in cache\u001b[0m\n"
|
|
]
|
|
}
|
|
],
|
|
"source": [
|
|
"import re\n",
|
|
"from sklearn.pipeline import Pipeline\n",
|
|
"from great_ai.utilities import clean\n",
|
|
"from great_ai import (\n",
|
|
" MultiLabelClassificationOutput,\n",
|
|
" ClassificationOutput,\n",
|
|
" GreatAI,\n",
|
|
" use_model,\n",
|
|
" parameter,\n",
|
|
")\n",
|
|
"\n",
|
|
"\n",
|
|
"@GreatAI.deploy\n",
|
|
"@use_model(\"small-domain-prediction\", version=\"latest\")\n",
|
|
"@parameter(\"explanation_length\", disable_logging=True)\n",
|
|
"def predict_domain(\n",
|
|
" text: str, model: Pipeline, target_confidence: int = 50, explanation_length: int = 5\n",
|
|
") -> MultiLabelClassificationOutput:\n",
|
|
" \"\"\"\n",
|
|
" Predict the scientific domain of the input text.\n",
|
|
" Return labels until their sum likelihood is larger than `target_confidence`.\n",
|
|
" \"\"\"\n",
|
|
" assert 0 <= target_confidence <= 100, \"invalid argument\"\n",
|
|
"\n",
|
|
" preprocessed = re.sub(r\"[^a-zA-Z\\s]\", \"\", clean(text, convert_to_ascii=True))\n",
|
|
" features = model.named_steps[\"vectorizer\"].transform([preprocessed])\n",
|
|
" prediction = model.named_steps[\"classifier\"].predict_proba(features)[0]\n",
|
|
"\n",
|
|
" best_classes = sorted(enumerate(prediction), key=lambda v: v[1], reverse=True)\n",
|
|
"\n",
|
|
" results = MultiLabelClassificationOutput()\n",
|
|
" for class_index, probability in best_classes:\n",
|
|
" results.labels.append(\n",
|
|
" ClassificationOutput(\n",
|
|
" label=model.named_steps[\"classifier\"].classes_[class_index],\n",
|
|
" confidence=round(probability * 100),\n",
|
|
" explanation=[\n",
|
|
" word\n",
|
|
" for _, word in sorted(\n",
|
|
" (\n",
|
|
" (weight, word)\n",
|
|
" for weight, word, count in zip(\n",
|
|
" model.named_steps[\"classifier\"].feature_log_prob_[\n",
|
|
" class_index\n",
|
|
" ],\n",
|
|
" model.named_steps[\"vectorizer\"].get_feature_names_out(),\n",
|
|
" features.A[0],\n",
|
|
" )\n",
|
|
" if count > 0\n",
|
|
" ),\n",
|
|
" reverse=True,\n",
|
|
" )\n",
|
|
" ][:explanation_length],\n",
|
|
" )\n",
|
|
" )\n",
|
|
"\n",
|
|
" if sum(r.confidence for r in results.labels) >= target_confidence:\n",
|
|
" break\n",
|
|
"\n",
|
|
" return results"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {},
|
|
"source": [
|
|
"## Check accuracy on the test split"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 3,
|
|
"metadata": {},
|
|
"outputs": [
|
|
{
|
|
"name": "stderr",
|
|
"output_type": "stream",
|
|
"text": [
|
|
"\u001b[38;5;226m2022-06-19 15:16:29,300 | WARNING | Limiting concurrency to 10 because there are only 10 chunks\u001b[0m\n",
|
|
"\u001b[38;5;39m2022-06-19 15:16:29,301 | INFO | Starting parallel map (concurrency: 10, chunk size: 1)\u001b[0m\n"
|
|
]
|
|
},
|
|
{
|
|
"data": {
|
|
"application/vnd.jupyter.widget-view+json": {
|
|
"model_id": "34e54eabd5f945b8aa2809907964eec8",
|
|
"version_major": 2,
|
|
"version_minor": 0
|
|
},
|
|
"text/plain": [
|
|
" 0%| | 0/10 [00:00<?, ?it/s]"
|
|
]
|
|
},
|
|
"metadata": {},
|
|
"output_type": "display_data"
|
|
},
|
|
{
|
|
"name": "stderr",
|
|
"output_type": "stream",
|
|
"text": [
|
|
"/data/projects/great-ai/.env/lib/python3.10/site-packages/sklearn/metrics/_classification.py:1327: UndefinedMetricWarning: Precision and F-score are ill-defined and being set to 0.0 in labels with no predicted samples. Use `zero_division` parameter to control this behavior.\n",
|
|
" _warn_prf(average, modifier, msg_start, len(result))\n",
|
|
"/data/projects/great-ai/.env/lib/python3.10/site-packages/sklearn/metrics/_classification.py:1327: UndefinedMetricWarning: Recall and F-score are ill-defined and being set to 0.0 in labels with no true samples. Use `zero_division` parameter to control this behavior.\n",
|
|
" _warn_prf(average, modifier, msg_start, len(result))\n",
|
|
"/data/projects/great-ai/.env/lib/python3.10/site-packages/sklearn/metrics/_classification.py:1327: UndefinedMetricWarning: Precision and F-score are ill-defined and being set to 0.0 in labels with no predicted samples. Use `zero_division` parameter to control this behavior.\n",
|
|
" _warn_prf(average, modifier, msg_start, len(result))\n",
|
|
"/data/projects/great-ai/.env/lib/python3.10/site-packages/sklearn/metrics/_classification.py:1327: UndefinedMetricWarning: Recall and F-score are ill-defined and being set to 0.0 in labels with no true samples. Use `zero_division` parameter to control this behavior.\n",
|
|
" _warn_prf(average, modifier, msg_start, len(result))\n",
|
|
"/data/projects/great-ai/.env/lib/python3.10/site-packages/sklearn/metrics/_classification.py:1327: UndefinedMetricWarning: Precision and F-score are ill-defined and being set to 0.0 in labels with no predicted samples. Use `zero_division` parameter to control this behavior.\n",
|
|
" _warn_prf(average, modifier, msg_start, len(result))\n",
|
|
"/data/projects/great-ai/.env/lib/python3.10/site-packages/sklearn/metrics/_classification.py:1327: UndefinedMetricWarning: Recall and F-score are ill-defined and being set to 0.0 in labels with no true samples. Use `zero_division` parameter to control this behavior.\n",
|
|
" _warn_prf(average, modifier, msg_start, len(result))\n"
|
|
]
|
|
},
|
|
{
|
|
"name": "stdout",
|
|
"output_type": "stream",
|
|
"text": [
|
|
" precision recall f1-score support\n",
|
|
"\n",
|
|
" Biology 1.00 1.00 1.00 1\n",
|
|
" Computer Science 1.00 0.67 0.80 3\n",
|
|
"Materials Science 0.00 0.00 0.00 1\n",
|
|
" Mathematics 0.00 0.00 0.00 0\n",
|
|
" Medicine 1.00 1.00 1.00 3\n",
|
|
" Physics 0.50 1.00 0.67 1\n",
|
|
" Psychology 1.00 1.00 1.00 1\n",
|
|
"\n",
|
|
" accuracy 0.80 10\n",
|
|
" macro avg 0.64 0.67 0.64 10\n",
|
|
" weighted avg 0.85 0.80 0.81 10\n",
|
|
"\n"
|
|
]
|
|
},
|
|
{
|
|
"data": {
|
|
"image/png": "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whXwjzrXNGSPDy3K9d8emBXLqjPtkbr86dc98oHDWibS9j18QW6/qm/mv9gpr77UMbf/sG/2PXztb3h2fnd9qquLueNHW2T1qqpMvKZvCoVkl/cs3diXtNkT08oinpVHTCuLeFYeMYX2Q6KljXTp0iWHHXZYnnjiiSTJ8ccfn3POOafp+I9+9KNss8026d27dw466KDMnTt3nedZtGhRjj322PTt2zdDhw7NRRddlMbGtdnmhoaGfOELX8gWW2yR4cOH5/LLL0+hUMiaNWty2223Zdddd212ru9+97v56Ec/uoGueNMxa3qXjNjhjfLIETssz2vzOmbxgurMmt4lA7Zala51jc2Oz3qqS1tMdbM2eOuVaWhI5jzbuem1mU90ydDtVrYYO3Tkijz7xBsxenZaTYZut6Lp2Mwna5J/yH6vPU/L3/6wYYlpZRHPyiOmlUU8K4+YQvsh0dJGli1blp/+9KfZfffdWxz77W9/m7POOiu33nprXnzxxQwdOjRHHnnkOs/z2c9+NosWLcqzzz6b3//+97nhhhty7bXXJlmbrLn77rszZcqU/OUvf8mdd97Z9L6DDjooM2fOzJNPPtn02oQJE3LssceW90I3QSvqq1LbvaHp+es/L6uvzvI3HXv9+PJ6rUMbW03Xxixb0vx7r19cnZrahhZju9Q2H1u/pPrvybJiamobU//m8yypTk2d8tiNTUwri3hWHjGtLOJZecSUjaWxWGjXj/ZAomUjO/jgg9OzZ8/06NEjkyZNype+9KUWY2666aaccMIJefvb357OnTvnm9/8Zv70pz/lueeeazauoaEht9xyS775zW+mW7duGTZsWL7whS9kwoQJSZJbb701p59+egYPHpxevXrlzDPPbHpv586dc8QRR+TGG29MkkybNi3PPfdcPvzhD69z3uPHj8/YsWMzduzYzHu15R/WleTNf/G8/nPX2obU1Lb8C2zZknX/BcaGtXxZVbp2a/69d+227qTXivqqZlVIXesasmxpVZJCltdXpWvdm8/TmOVL/fG4sYlpZRHPyiOmlUU8K4+YQvvhbtnI7rzzzixcuDArVqzI5Zdfnr322isvvfRSszFz587N0KFDm57X1dWlT58+mTNnTrNx8+fPz+rVq5uNHTp0aNO4uXPnZsiQIU3H/vHnJDnuuONy8803p1gsZsKECTn88MPTuXPn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AADKRKIFAAAAoEy0DgEAAAAlFZM0FtVrlOIbAgAAACgTiRYAAACAMpFoAQAAACgTa7QAAAAArVBIQwptPYl2T0ULAAAAQJlItAAAAACUidYhAAAAoCTbO7eObwgAAACgTCRaAAAAAMpE6xAAAADQKnYdKk1FCwAAAECZSLQAAAAAlInWIQAAAKCkYrFg16FW8A0BAAAAlIlECwAAAECZaB0CAAAAWqVB61BJviEAAACAMpFoAQAAACgTiRYAAACAMrFGCwAAAFBSMUljCm09jXZPRQsAAABAmUi0AAAAAJSJRAsAAADQCoU0FKva9aM1FixYkEMOOSS1tbUZOnRobr755nWOW7lyZU455ZT0798/vXv3zkc+8pHMmTOn5PklWgAAAIDNxqmnnppOnTrl5Zdfzk033ZTPfOYzmTZtWotx3//+9/OnP/0pf/3rXzN37tz06tUrn/3sZ0ueX6IFAAAA2CzU19fn9ttvz4UXXpi6urrsscceOeiggzJhwoQWY2fOnJn9998//fv3T5cuXXLEEUesMyHzZhItAAAAQEnFJI3FQrt+lDJ9+vR06NAhI0eObHptzJgx60ygnHjiiXnwwQczd+7cLFu2LDfddFMOOOCAkp9he2cAAACgIsybNy9jx45ten7yySfn5JNPbnq+dOnSdO/evdl7evTokSVLlrQ417bbbpshQ4Zk0KBBqa6uzk477ZTLL7+85BwkWgAAAICK0Ldv30yePPktj9fV1WXx4sXNXlu8eHG6devWYuypp56alStX5tVXX01tbW2+/e1v54ADDsjDDz+83jloHQIAAABapSFV7fpRysiRI7NmzZo8/fTTTa899thjGT16dIuxU6ZMyfHHH5/evXunc+fO+exnP5tHHnkk8+fPX+9nSLQAAAAAm4Xa2toceuihOffcc1NfX58HH3wwEydOzLhx41qM3W233XLDDTdk0aJFWb16da644opsueWW2WKLLdb7GRItAAAAwGbjiiuuyPLly9OvX78cddRRufLKKzN69Ojcf//9qauraxr3ne98J126dMm2226bvn375q677sodd9xR8vzWaAEAAABKKqZ1O/u0d717986dd97Z4vU999wzS5cubXrep0+f3HTTTf/0+VW0sFnp1nNNzr1mZibOeDw3PPJE9j7ktbcYWcyJX52b26ZOzW1Tp+bEr87N2s3M1hoxenkuv2d6Jj7z11x+z/SMGL18o8yf5ib+eIuc9sGR+fCwnfOdz2+13rE/H983R44ZnUNG7pT/OmNIVq184y+Il2Z3ypcO2zoHjdg5J+65ff7yh7r1nIkNyT1aWdyjlcc9WlnEs/KIKbQPEi3t1P3335/tttuuradRcU69eE7WrC7kiJ13yLdO2yqf/eYLGTpyRYtxHzpmQd71wcX5zL4jc8o+2+Wd+y7OgeNeTZJ06NiY86+dmftu75XDRu2YSbf1yvnXzkyHjo0b+3I2e30GrM7Rp7+c/Y5csN5xk3/XLT+9vF8uufWZ3PDIE3np+c6Z8J0BTccv+Y+h2WbH5blt2uM5/swXc9HJw7Pw1eoNPX3WwT1aWdyjlcc9WlnEs/KIKbQPGy3RcvPNN2fs2LGpq6vLwIEDc8ABB+SBBx7YWB/fKr/73e8yePDgsp/34osvzvDhw1NXV5fBgwfniCOOKPmePffcM0899VTZ57I561zTkD0+tCjXf3tgViyrzrRH6vKnX/fIBw5r+R8A+x6+ILdf1TfzX+yUV1/qmNt/2Df7Hr72NwI7v7s+1dXF3PGjLbJ6VVUmXtM3hUKyy3uWtjgPG9YeH1qUdx+wKN17rVnvuEm39s7+Ry3IsO1WpFvPhhz9+Zcy6dbeSZIXnumcGY/XZNwXX0rnmmL2PHBRhm2/PA/8qudGuAL+kXu08rhHK4t7tLKIZ+URU2g/Nkqi5bvf/W4+//nP5+yzz87LL7+c559/Pv/xH/+RiRMnboyP32jWrGn5D8nrr78+EyZMyG9+85ssXbo0kydPzgc+8IE2mB2Dt16ZhoZkzrOdm16b+USXDN1uZYuxQ0euyLNPdGl6/uy0mgzdbkXTsZlP1iR5o6x97Xla/raA9mHW9C4ZscMbJa8jdlie1+Z1zOIF1Zk1vUsGbLUqXesamx2f9VSXdZ2KDcg9uvlyj24a3KOVRTwrj5iysTSmql0/2oMNPotFixbl3HPPzf/8z//k0EMPTW1tbTp27JiPfOQjufTSS5MkK1euzOc///lsueWW2XLLLfP5z38+K1eu/QPh9SqTb3/72+nXr18GDhyYO++8M3fddVdGjhyZ3r175+KLL276vPPPPz+HHXZYjjjiiHTr1i1vf/vb89hjjzUdLxQKmTFjRtPz448/Puecc07q6+tzwAEHZO7cuamrq0tdXV3mzp2bxsbGXHLJJdl6663Tp0+fHH744VmwYG1W+LnnnkuhUMg111yTrbbaKu9///tbXP+jjz6a/fffP1tvvXWSZMCAATn55JObji9YsCCf/OQns+WWW6ZXr145+OCDm1336+bOnZuPfexj6du3b4YPH57//u//bnbNhx9+eI499th069Yto0ePzuTJk5uOz549O4ceemj69u2bPn365LTTTms69uMf/zijRo1Kr169sv/++2fWrFn/RHQ3LTVdG7NsSfNS8/rF1ampbWgxtktt87H1S6r//o/8YmpqG1P/5vMsqU5NnXLK9mpFfVVqu78R59d/XlZfneVvOvb68eX12hI2Nvfo5ss9umlwj1YW8aw8YgrtxwZPtPzpT3/KihUrcsghh7zlmG984xt56KGHMmXKlDz22GN55JFHctFFFzUdf+mll7JixYrMmTMnX//613PSSSflxhtvzJ///Ofcf//9ufDCCzNz5sym8RMnTszHP/7xLFiwIEcffXQOPvjgrF69er3zrK2tzd13350tt9wyS5cuzdKlS7PlllvmBz/4Qe688878/ve/z9y5c9OrV6+ceuqpzd77+9//Pk8++WTuvffeFufdfffdc8MNN+TSSy/N5MmT09DQ/A+6cePGZdmyZZk2bVpeeeWVnHHGGS3O0djYmI985CMZM2ZM5syZk/vuuy+XXXZZs8/73//93xx55JFZuHBhDjrooKZkSkNDQz784Q9n6NChee655zJnzpwceeSRTd/TxRdfnJ///OeZN29e9txzzxx11FHr/H7Gjx+fsWPHZuzYsVmdllnxTcHyZVXp2q3599+127r/sb6ivqrZb0+71jVk2dKqJIUsr69K17o3n6cxy5e2j+wpLb35HxOv/9y1tiE1tS3/UbJsybr/UcKG5R7dfLlHNw3u0coinpVHTKH92OB3y6uvvpotttgiHTq89U7SN910U84999z069cvffv2zXnnnZcJEyY0He/YsWO++tWvpmPHjjnyyCMzf/78nH766U3VGzvssEOzqpVdd901hx12WDp27Jj//M//zIoVK/LQQw/9S/O/6qqr8o1vfCODBw9O586dc/755+dnP/tZszah888/P7W1tampqWnx/mOOOSY/+MEPcu+992avvfZKv3798q1vfStJ8uKLL+buu+/OVVddlV69eqVjx47Za6+9Wpzj0Ucfzbx583LuueemU6dOGTFiRE466aTccsstTWP22GOPfOhDH0p1dXXGjRvX9H088sgjmTt3bi699NLU1tamS5cu2WOPPZqu7ayzzsqoUaPSoUOHnH322ZkyZco6q1pOPvnkTJ48OZMnT07HdG5xfFPwwjOdU12dbDn8jUTRiB1WZNZTLa+nRRn76DfK1GdN75Lho1bkH1dmHz5KGXt71qI89oma9Oq7Ot17N2ToyBV58flOf//HxRvHlcdufO7RzZd7dNPgHq0s4ll5xJSNoVhMGoqFdv1oDzZ4oqVPnz6ZP3/+Otcved3cuXMzdOjQpudDhw7N3Llzm52junptJvb1ZEb//v2bjtfU1DTb63rIkCFNP1dVVWXw4MHNzvfPmDVrVg455JD07NkzPXv2zKhRo1JdXZ2XX355nZ+3Lp/4xCfym9/8JgsXLsxVV12Vr33ta7n33nsze/bs9O7dO7169So5h7lz5zbNoWfPnrn44oubzWHAgDd2Z+jatWtWrFiRNWvWZPbs2Rk6dOg6E12zZs3K6aef3nTO3r17p1gsZs6cOa39ejYpK5dX58G7e+TYL72UzjUN2WG3+rxr/0W572e9W4z9zW29cuin56XPgNXp3X91Dvv0vEy6dW2c/vrH2jQ2JgefOD8dOzXmoE/OT5JMedB2oxtbw5pk1YpCGhsKaWxY+3PDOv6o2efjC3LvT/pk1vTOWbqoOjd/v3/2PXxtC+DgrVdm69HLc+N/DciqFYU8eHePzHyyJnscuHDjXgzu0QrkHq0s7tHKIp6VR0yh/djgiZZ3vetd6dy5c+688863HLPllls2q6J4/vnns+WWW/7Lnzl79uymnxsbG/PCCy80na9r165ZtmxZ0/GXXnqp6edCoWX2a8iQIbn77ruzcOHCpseKFSsyaNCg9b5vXTp27JiPf/zj2XnnnTN16tQMGTIkCxYsyMKFC9f7viFDhmT48OHN5rBkyZLcddddJT9zyJAhef7559eZ6BoyZEh++MMfNjvv8uXL8+53v7tV17MpuvysQencpTG3Pv5EzrpiVn5w1uDMmt4lO75jae58+vGmcb+a0CcPTeqeH973VMb/9qk8fF/3/GpCnyTJmtVVueCEYdnn46/l9ienZr8jF+SCE4ZlzWrllBvbzZcNyEdGjMlPL++f+27vnY+MGJObLxuQV17omI9us1NeeaFjkmS3vZfk4//xSr582DYZt9sO6TdoVcZ98Y17/6wrZ+Xpv3bNx3bYKT/+xsCcM35mevbRltAW3KOVxT1aedyjlUU8K4+YQvtQKBaLxdLD/j3/9V//lW9/+9v54Q9/mP322y8dO3bMb37zm/zf//1fvv3tb+ecc87Jb3/720ycODGFQiEHH3xw3ve+9+Wiiy7K7373uxxzzDF54YUXkqzd2adjx46ZOXNmhg0blmRt28wpp5ySY445Jueff36+8Y1v5Kc//WkOOuig/Pd//3f++7//O08//XQ6duyY97znPdlzzz3zjW98I5MmTcohhxySL3zhC7nooovyt7/9LW9729vy0ksvpUePHkmS733ve5k4cWKuv/76DB06NPPmzcsf//jHfPSjH81zzz2X4cOHZ/Xq1W/ZGnXdddelb9++ee9735va2trce++9OfTQQzNp0qTsscceOfDAA9OjR4/8z//8T+rq6vKnP/0p733ve5tdd0NDQ3bbbbccccQR+dznPpdOnTrlySefzPLly7Pbbrvl/PPPz4wZM3LjjTcmSbN5FQqFvP3tb8++++6bCy64INXV1fnzn/+c97znPbnjjjvyta99LT/96U8zevToLFq0KL/+9a/z8Y9/fL3x7F7onXcW7JxUSe6dO6Wtp0AZ7b/lLm09BcrMPVpZ3KMAG8/DxfuyuNhyi2v+Nf136J0jb9q/raexXg+e9HSzzWHawkZJS37hC1/Id7/73Vx00UXp27dvhgwZkssvv7xph51zzjknY8eOzc4775yddtopb3/723POOef8y5/30Y9+ND/96U/Tq1evTJgwIT//+c/TsePa35p9//vfzy9+8Yv07NkzN910U9MckmT77bfPUUcdlREjRqRnz56ZO3duTj/99Bx00EHZb7/90q1bt+y+++55+OGHWz2X7t275+KLL85WW22Vnj175stf/nKuvPLKpnVSJkyYkI4dO2b77bdPv379ctlll7U4R3V1dX75y19mypQpGT58eLbYYot86lOfyqJFi0p+fnV1dX7xi19kxowZ2WqrrTJ48OD89Kc/TZIccsgh+cpXvpIjjzwy3bt3z4477pi777671dcGAAAANLdRKlo2pjdXd1B+Kloqj9+WVxa/La887tHK4h4F2HhUtJSXipbWeeutgAAAAAD+rphCGovW6ynFNwQAAABQJhVX0XL+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qaqqyvbbb5/DDjus6fi0adOy7777pnfv3unfv38uvvjiJMn555+fY445pmncQw89lHe/+93p2bNnxowZk9/97ndNx973vvfla1/7Wt7znvekW7du2W+//ZpVCz3wwANN7x0yZEiuu+66JMnKlSvzxS9+MVtttVX69++fU045JcuXV25Z4OCtV6ahIZnzbOem12Y+0SVDt1vZYuzQkSvy7BNdmp4/O60mQ7db0XRs5pM1Sd5YbXvteVr+toANRzwrj5hWFvGsPGJaWTrOW5FiVSGr+9U0vbZqUNd0emndv/jsOu21DP/qoxlyyWPp/uBLTa93eml5Vg7smhTeiOeqLd/6PGw47lE2lmKx0K4f7UGbJVp23333LF68OE8++WQaGhpyyy23NEssJEltbW1uuOGGLFy4ML/61a9y5ZVX5s4770yS/OEPf0iytjVn6dKlede73pWJEyfm4osvzs9//vPMmzcve+65Z4466qhm57zzzjvz8MMP54knnmgxp/V93j+qr6/P5z73udx9991ZsmRJ/vjHP2aXXXZ5y+v86le/mmuvvTZPP/10s2NLlizJPvvskw9+8IOZO3duZsyYkQ984AMtzjFnzpwceOCBOeecc7JgwYJ85zvfycc+9rHMmzevaczNN9+ca6+9Nq+88kpWrVqV73znO0mSWbNm5YADDshnP/vZzJs3L1OmTGma65lnnpnp06dnypQpmTFjRubMmZOvf/3r67yOSlDTtTHLllQ3e61+cXVqahtajO1S23xs/ZLqdK1rTFJMTW1j6t98niXVqalTTrkxiWflEdPKIp6VR0wrS9XKhjR2aR6Hxi7VqVrZMp5LdumT588ck5kXjs28I0ak971zUveXtb/Uq1rVkMaaDq06DxuWexTajzZdDPf1qpZJkyZl1KhRGTRoULPj73vf+7LTTjulqqoqO++8c4466qj8/ve/f8vzXXXVVTnrrLMyatSodOjQIWeffXamTJnSrKrlrLPOSu/evVNTU9Pi/f/M51VVVWXq1KlZvnx5Bg4cmNGjR69z3A9+8IN84hOfyOWXX54ddtgh22yzTe6+++4kyS9/+csMGDAgX/jCF9KlS5d069Yt73znO1uc48Ybb8yHPvShfOhDH0pVVVX23XffjB07NnfddVfTmE9+8pMZOXJkampqcvjhh2fKlClJ1iZg9tlnnxx11FHp2LFj+vTpk1122SXFYjHjx4/P9773vfTu3TvdunXL2WefnVtuuWWd1zF+/PiMHTs2Y8eOzeq0zIpvCpYvq0rXbs3/ounarSHL66tbjF1RX/X3v2z+Pq6uIcuWViUpZHl9VbrWvfk8jVm+dLNfW3qjEs/KI6aVRTwrj5hWlsbO1ala0TwOVSsa0ti5ZTxXD+iahh6dkqpCVgzvloXvHZC6x9a2ozR2av152LDco9B+tHmi5eabb851113Xom0oSR5++OHsvffe6du3b3r06JGrrrqqxQK6/2jWrFk5/fTT07Nnz/Ts2TO9e/dOsVjMnDlzmsYMGTLkLd/f2s+rra3NT3/601x11VUZOHBgDjzwwPztb39b5zlrampy9tln589//nNeffXVHH744fn4xz+eBQsWZPbs2dl6663X9xU1Xddtt93WdF09e/bMAw88kBdffLFpzIABA5p+7tq1a5YuXdtD+VafMW/evCxbtiy77rpr0zk/+MEPNquS+Ucnn3xyJk+enMmTJ6djOq9zTHv3wjOdU12dbDn8jUTRiB1WZNZTLa9n1vQuGbHDG21UI0Yvz6ynujQdGz5qRf5xZfbho944zsYhnpVHTCuLeFYeMa0sq/t2SaGxmI7z3ohTp7nLsmpA19JvLqRpa49VA2rSee6yZlt9dHqxleehrNyj0H60aaJl6NChGT58eO66664ceuihLY4fffTROeiggzJ79uwsWrQop5xySop//0O8UGjZezVkyJD88Ic/zMKFC5sey5cvz7vf/e6mMet6X2s+783233//TJo0KS+++GK23377nHTSSSWvt3v37jn77LNTX1+fmTNnZsiQIa3aWnrIkCEZN25cs+uqr6/PmWee2ar3PvPMMy1e32KLLVJTU5Np06Y1nXPRokVNCZpKtHJ5dR68u0eO/dJL6VzTkB12q8+79l+U+37Wu8XY39zWK4d+el76DFid3v1X57BPz8ukW3slSf76x9o0NiYHnzg/HTs15qBPrk3GTXmwbqNez+ZOPCuPmFYW8aw8YlpZip2rs3Tn3ul99wsprGxIl2eXpHbqa1kydosWY2sfX5CqZWuSYjGdZy1Nz/tfSv2Oa+O+fJvuKVYlPf7wUrKmMT3uX7t+y7Jtu2/U68E9ysaxdgvltl+HxRotJVxzzTX57W9/m9ra2hbHlixZkt69e6dLly555JFHcvPNNzcd69u3b6qqqpolKk455ZR885vfzLRp05IkixYtym233dbquazv8/7Ryy+/nIkTJ6a+vj6dO3dOXV1dqqrW/VVeeOGFefTRR7Nq1aqsWLEi3//+99OzZ89st912+fCHP5wXX3wxl112WVauXJklS5bk4YcfbnGOY445Jr/4xS9y7733pqGhIStWrMjvfve7vPDCCyWv6ROf+ER+85vf5NZbb82aNWvy6quvZsqUKamqqspJJ52UM844I6+88kqStWvB3Hvvva3+vjZFl581KJ27NObWx5/IWVfMyg/OGpxZ07tkx3cszZ1PP9407lcT+uShSd3zw/ueyvjfPpWH7+ueX03okyRZs7oqF5wwLPt8/LXc/uTU7HfkglxwwrCsWd3mt9NmRzwrj5hWFvGsPGJaWeZ9bHgKqxsz/Nw/p/+EpzPvsOFZNbBrujyzOCO+8kjTuLr/92qGfmNKRpz5aPrfPCOvvX/LLHlH37UHO1TlxRO2S7fJ8zPi7EfT7eFX8uIJ2yUdxLMtuEehfSgU36pkYwMaNmxYrr766uyzzz7NXl+zZk06duyYmTNnZtiwYfnZz36WL3zhC1mwYEH22muvDBs2LAsXLsyNN96YJDn33HNz5ZVXZvXq1bnnnnuy++67Z8KECfn2t7+dWbNmpUePHtl3333z4x//eO3FFgp5+umnm22v/I+vre/znnvuuQwfPjyrV6/OvHnzcuSRR2bKlCkpFArZZZddcsUVV2SHHXZoca0XXXRRbrnlljz//PPp0KFDdt5551x88cVNVTZTp07N6aefnr/85S/p3LlzPv/5z+fMM8/M+eefnxkzZjRd68MPP5wvf/nLefzxx1NdXZ13vOMdufLKK7PVVlvlfe97X4455ph86lOfSrJ2R6Srr746DzzwQJLk/vvvzxe/+MU8+eST6dGjRy666KIcd9xxWbFiRb7+9a/nlltuyfz58zNo0KB85jOfyec+97n1xq97oXfeWWi5aC8AwOZoxvd2b+spUEbbnPFQW0+BMnq4eF8WF1tucc2/pmabLbPNd0t3c7Slzl//VSZPntymc2iTRAubNokWAIA3SLRUFomWyiLRUl4122yZEf91cltPY71qLvxlmyda1H8BAAAAlIlECwAAAECZdGjrCQAAAACbBouPlKaiBQAAAKBMJFoAAAAAykTrEAAAANAqxWKhrafQ7qloAQAAACgTiRYAAACAMtE6BAAAAJRUTEHrUCuoaAEAAAAoE4kWAAAAgDLROgQAAAC0SrGtJ7AJUNECAAAAUCYSLQAAAABlItECAAAAUCbWaAEAAABKK8b2zq2gogUAAACgTCRaAAAAAMpE6xAAAADQOvZ3LklFCwAAAECZSLQAAAAAlInWIQAAAKBV7DpUmooWAAAAgDKRaAEAAAAoE61DAAAAQKsU7TpUkooWAAAAYLOxYMGCHHLIIamtrc3QoUNz8803v+XYv/zlL3nve9+burq69O/fP9///vdLnl9FCwAAALDZOPXUU9OpU6e8/PLLmTJlSg488MCMGTMmo0ePbjZu/vz5+eAHP5jvfe97Oeyww7Jq1aq88MILJc8v0QIAAACUVMymv+tQfX19br/99kydOjV1dXXZY489ctBBB2XChAm55JJLmo397ne/m/333z+f+MQnkiSdO3fOqFGjSn6G1iEAAABgszB9+vR06NAhI0eObHptzJgxmTZtWouxDz30UHr37p13v/vd6devXz7ykY/k+eefL/kZEi0AAABARZg3b17Gjh3b9Bg/fnyz40uXLk337t2bvdajR48sWbKkxbleeOGFXH/99fn+97+f559/PsOHD89RRx1Vcg5ahwAAAICK0Ldv30yePPktj9fV1WXx4sXNXlu8eHG6devWYmxNTU0OOeSQ7LbbbkmS8847L1tssUUWLVqUHj16vOVnqGgBAAAASismKRba96OEkSNHZs2aNXn66aebXnvsscdaLISbJDvvvHMKhTfO+Y8/r49ECwAAALBZqK2tzaGHHppzzz039fX1efDBBzNx4sSMGzeuxdhPfvKTueOOOzJlypSsXr06F154YfbYY4/1VrMkEi0AAADAZuSKK67I8uXL069fvxx11FG58sorM3r06Nx///2pq6trGvf+978/F198cQ488MD069cvM2bMyM0331zy/NZoAQAAAFqlWGzrGfz7evfunTvvvLPF63vuuWeWLl3a7LXPfOYz+cxnPvNPnV9FCwAAAECZSLQAAAAAlInWIQAAAKB1KqB1aENT0QIAAABQJhItAAAAAGWidQgAAABohUKKxUJbT6LdU9ECAAAAUCYSLQAAAABlonUIAAAAaB27DpWkogUAAACgTCRaAAAAAMpEogUAAACgTKzRAgAAAJRWjO2dW0FFCwAAAECZSLQAAAAAlInWIQAAAKB1bO9ckkQLAAD8G7Y546G2ngIA7YjWIQAAAIAyUdECAAAAtJJdh0pR0QIAAABQJhItAAAAAGWidQgAAABoHbsOlaSiBQAAAKBMJFoAAAAAykTrEAAAANA6WodKUtECAAAAUCYSLQAAAABlonUIAAAAKK2YpFho61m0eypaAAAAAMpEogUAAACgTCRaAAAAAMrEGi0AAABAqxRt71ySihYAAACAMpFoAQAAACgTrUMAAABA62gdKklFCwAAAECZSLQAAAAAlInWIQAAAKB1ioW2nkG7p6IFAAAAoEwkWgAAAADKROsQAAAA0CoFuw6VpKIFAAAAoEwkWgAAAADKROsQAAAAUFrx7w/WS0ULAAAAQJlItAAAAACUiUQLAAAAQJlYowUAAABohUJSLLT1JNq9t0y0jBs3LoVC6S/whhtuKOuEAAAAADZVb5lo2WabbTbmPAAAAAA2eW+ZaDnvvPM25jwAAACA9s72ziW1ejHcSZMm5cQTT8xHPvKRJMnkyZPz29/+doNNDAAAAGBT06pEyw9+8IN85jOfybbbbps//OEPSZKampqcc845G3RyAAAAAJuSViVaLrvssvzmN7/JmWeemaqqtW/Zfvvt89RTT23QyQEAAADtSLGdP9qBViValixZkiFDhiRJ005Eq1evTqdOnTbczAAAAAA2Ma1KtLz3ve/NJZdc0uy1//7v/87ee++9QSYFAAAAsCl6y12H/tEPfvCDfOQjH8mPfvSjLFmyJNttt126deuWX/7ylxt6fgAAAEB70U7ac9qzViVaBg4cmEcffTSPPvpoZs2alSFDhuQd73hH03otAAAAAPwT2zs3NjZm9erVSZKGhoYUi9JYAAAAAP+oVRUtf/3rX3PwwQdn5cqVGTRoUF544YV06dIld9xxR8aMGbOh5wgAAAC0tWKSYqGtZ9Hutaqi5YQTTsipp56aF154IY888kjmzJmT0047LSeccMKGnh8AAADAJqNViZbp06fn85//fNPWzoVCIaeffnqefvrpDTo5AAAAgE1JqxItH/rQh/K///u/zV77xS9+kQMPPHCDTAoAAABofwrF9v1oD95yjZZx48Y1VbA0NDTkyCOPzK677pohQ4Zk9uzZ+fOf/5yPfvSjG22iAAAAAO3dWyZattlmm2bPd9xxx6afd9hhh+y///4bblYAAAAAm6C3TLScd955G3MeAAAAAJu8Vm3vnCSrVq3KU089lfnz56dYfKPx6f3vf/8GmRgAAADQzrSTdVDas1YlWh544IF8/OMfz8qVK7N48eJ07949S5YsyZAhQ/Lss89u6DkCAAAAbBJatevQGWeckS9/+ctZsGBBunXrlgULFuRrX/ta/uM//mNDzw8AAABgk9GqRMv06dNz+umnN3vtzDPPzPe+970NMikAAACATVGrEi09evTI4sWLkyQDBw7ME088kddeey1Lly7doJODcuvWc03OvWZmJs54PDc88kT2PuS1txhZzIlfnZvbpk7NbVOn5sSvzs0/NiOOGL08l98zPROf+Wsuv2d6RoxevlHmT3PiWXnEtLKIZ+UR08oinpVHTKF9aFWi5dBDD81dd92VJDnhhBOy9957Z9ddd81hhx22QSfXnl133XXZY4892noa63TTTTdlv/32a+tptEunXjwna1YXcsTOO+Rbp22Vz37zhQwduaLFuA8dsyDv+uDifGbfkTlln+3yzn0X58BxryZJOnRszPnXzsx9t/fKYaN2zKTbeuX8a2emQ8fGjX05mz3xrDxiWlnEs/KIaWURz8ojptA+tCrRctlll+Xoo49Oknzxi1/Mz372s/zoRz/Kj370ow06uXIZNmxYOnXqlPnz5zd7/W1ve1sKhUKee+659b7/ueeeS6FQyJo1azbgLP8165rbJz7xifz6179uw1m1T51rGrLHhxbl+m8PzIpl1Zn2SF3+9Ose+cBhC1qM3ffwBbn9qr6Z/2KnvPpSx9z+w77Z9/C1vxHY+d31qa4u5o4fbZHVq6oy8Zq+KRSSXd6jwmtjEs/KI6aVRTwrj5hWFvGsPGLKxlIotu9He9CqRMub7bnnnjnggANSVfUvvb1NDB8+PD/5yU+anj/++ONZtmxZG86IjW3w1ivT0JDMebZz02szn+iSodutbDF26MgVefaJLk3Pn51Wk6HbrWg6NvPJmiSFN52n5W8L2HDEs/KIaWURz8ojppVFPCuPmEL78ZaZkj333DPvfe97Sz42FePGjcsNN9zQ9Pz666/Pscce2/T8V7/6Vd72trele/fuGTJkSM4///ymY69fZ8+ePVNXV5c//elPTce++MUvplevXhk+fHjuvvvuptcXLVqUE088MQMHDsygQYNyzjnnpKGhIcnatqP3vOc9OeOMM9KzZ8+MGDEif/zjH3PddddlyJAh6devX66//vp/eW5vbmuaNm1a9t133/Tu3Tv9+/fPxRdfnCR55JFHMnbs2HTv3j39+/fPf/7nf/47X3G7V9O1McuWVDd7rX5xdWpqG1qM7VLbfGz9kup0rWtMUkxNbWPq33yeJdWpqVNOuTGJZ+UR08oinpVHTCuLeFYeMYX2o8NbHfjUpz61Meexwe2+++6ZMGFCnnzyyYwcOTK33HJLHnzwwZxzzjlJktra2txwww0ZPXp0pk6dmn333Te77LJLDj744PzhD3/I8OHDs3DhwnTosPYre+qpp/Lwww/nuOOOy/z58zN+/PiceOKJmTNnTgqFQo4//vj069cvM2bMSH19fT784Q9nyJAh+fSnP50kefjhh/OpT30qr776as4777wceeSR+chHPpIZM2bk97//fT72sY/lYx/7WOrq6v6lub1uyZIl2WefffLFL34xv/jFL7J69eo88cQTSZLTTz89p59+esaNG5elS5dm6tSpb/n9jR8/PuPHj0+SrE7LrPimYPmyqnTt1vwvmq7dGrK8vrrF2BX1VX//y+bv4+oasmxpVZJCltdXpWvdm8/TmOVLN50Kr0ognpVHTCuLeFYeMa0s4ll5xJSNplgoPWYz95Z3y3HHHdeqx6bk9aqWSZMmZdSoURk0aFDTsfe9733ZaaedUlVVlZ133jlHHXVUfv/736/3fEOHDs1JJ52U6urqHHfccXnxxRfz8ssv5+WXX85dd92Vyy67LLW1tenXr1/OOOOM3HLLLU3vHT58eD75yU+muro6RxxxRGbPnp1zzz03nTt3zn777ZdOnTplxowZ//LcXvfLX/4yAwYMyBe+8IV06dIl3bp1yzvf+c4kSceOHTNjxozMnz8/dXV12X333d/yPCeffHImT56cyZMnp2M6v+W49uyFZzqnujrZcvgbiaIRO6zIrKdaXs+s6V0yYoc3VlcfMXp5Zj3VpenY8FEr8o8rsw8f9cZxNg7xrDxiWlnEs/KIaWURz8ojptB+bFZpyXHjxuXmm2/Odddd16xtKFlbYbL33nunb9++6dGjR6666qoWi+e+2YABA5p+7tq1a5Jk6dKlmTVrVlavXp2BAwemZ8+e6dmzZz796U/nlVdeaRrfv3//pp9ramrW+drr22f/K3N73ezZs7P11luv89g1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XH7WoHTu0phbH38iZ10xKz84a3BmTe+SHd+xNHc+/XjTuF9N6JOHJnXPD+97KuN/+1Qevq97fjVhbVvWmtVVueCEYdnn46/l9ienZr8jF+SCE4ZlzWq308YmnpVHTCuLeFYeMa0s8z42PIXVjRl+7p/Tf8LTmXfY8Kwa2DVdnlmcEV95pGlc3f97NUO/MSUjznw0/W+ekdfev2WWvKPv2oMdqvLiCdul2+T5GXH2o+n28Ct58YTtkg7i2Rbco2wMbb2r0Kaw61ChWGwnTUybgWHDhuXqq6/OPvvs0+z1973vfTnmmGPyqU99KsnaBWqvvvrqPPDAA01jRo4cmS5duuSwww7LueeemyR59NFH09jYmLe//e1ZtWpVPvaxj+Wd73xnLrjgghx//PEZPHhwLrroojzyyCPZb7/9cvvtt2fvvffOiy++mCVLlqRXr1556KGHss8++6SmpiYXXHBBfve73+X3v//9eq+je6F33ln4QJm/HQCATdOM7+3e1lOgjLY546G2ngJl9HDxviwuttzimn9Ntx6DM3b3z7b1NNZryau3ZfLkyW06B2nJTcSxxx6bxx9/PMccc0zTa4sXL85JJ52UXr16ZejQoenTp0++9KUvtXjvO97xjlx77bU544wz0qNHj+y1116ZNWtWGhsb893vfjdbbrllevfund///ve58sorN+ZlAQAAQEVR0bKJuOGGGzJ+/PhmVS5tRUULAMAbVLRUFhUtlUVFS3l1674JVLQsUNFCKyxbtixXXHFFTj755LaeCgAAALAeEi3t3L333pu+ffumf//+Ofroo9t6OgAAAMB6SLS0c/vvv3/q6+szceLEdOjQoa2nAwAAwGaqkKRQLLbrR2ssWLAghxxySGprazN06NDcfPPN6xx36aWXZscdd0y3bt0yfPjwde7yuy7+yx0AAADYbJx66qnp1KlTXn755UyZMiUHHnhgxowZk9GjRzcbVywWc8MNN2TnnXfOM888k/322y9DhgzJkUceud7zq2gBAAAANgv19fW5/fbbc+GFF6auri577LFHDjrooEyYMKHF2C9/+ct5+9vfng4dOmS77bbLRz/60Tz44IMlP0OiBQAAAGidxvb9mDdvXsaOHdv0GD9+fLPpT58+PR06dMjIkSObXhszZkymTZu23ssuFou5//77W1S9rIvWIQAAAKAi9O3bd73b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84wZMyZJ0tDQkIsvvjhbb711unXrll133TWzZ89uGvub3/wm2267bXr27JlTTz01xb//n6KxsTEXXXRRhg4dmn79+uXYY4/NokWL1jnHuXPn5qCDDkrv3r2zzTbb5Ec/+lHTseXLl+e4445Lr169MmrUqHz729/O4MGDkySXXnppPvaxjzU71+c+97mcfvrp5fny2qHBW69MQ0My59nOTa/NfKJLhm63ssXYoSNX5NknujQ9f3ZaTYZut6Lp2Mwna5K8UWK59jwtfwPEhiOelUdMK4t4Vh4xrSziufmaNb1LRuzwRnvXiB2W57V5HbN4QXVmTe+SAVutSte6xmbHZz3VZV2nAt6CRMt6zJ49O3fddVcWLFiQP/zhD5k+fXoWLVqUW2+9NX369Mluu+2WPn365Ne//nXTeyZMmJBjjz02SfLd7343P/nJT3LXXXdl8eLF+fGPf5yuXbs2jf3lL3+ZRx99NH/9619z66235t57702SXHfddbnuuuvyf//3f3n22WezdOnSnHbaaeuc45FHHpnBgwdn7ty5+dnPfpazzz47v/3tb5MkF1xwQZ577rk8++yzmTRpUm688cam9x1zzDG55557snDhwiTJmjVrcssttzTNvRLVdG3MsiXNyx7rF1enprahxdgutc3H1i+p/vtfOMXU1Dam/s3nWVKdmjolshuTeFYeMa0s4ll5xLSyiOfma0V9VWq7vxHn139eVl+d5W869vrx5fVah+CfIdGyDgcffHB69uyZPfbYI3vttVfOOeecLFmyJH/7299SLBYzatSoDBw4MEly3HHHNSUwFixYkHvvvTdHH310kuTqq6/ORRddlO222y6FQiFjxoxJnz59mj7nzDPPTM+ePbPVVltl7733zpQpU5IkN910U/7zP/8zI0aMSF1dXb75zW/mlltuabEA7uzZs/Pggw/mW9/6Vrp06ZJddtkln/rUp3LDDTckSW699dacffbZ6dWrVwYPHpzPfe5zTe8dOHBg3vve9+a2225Lktxzzz3ZYostsuuuu67zOxk/fnzGjh2bsWPHZnVa/qZjU7B8WVW6dmv+F0fXbuv+i2NFfVWzTH7XuoYsW1qVpJDl9VXpWvfm8zRm+VK308YknpVHTCuLeFYeMa0s4rn5enPi7PWfu9Y2pKa2ZQJu2ZJ1J+CAt+ZPwHW48847s3DhwsyaNStX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MJslPj5etWrV0rRp0zR16lQdPHjQ6JjAP9qxY8cUFBRk+yAH55SUlKThw4fL09NTH3/8sWJiYrRgwQKtXr1aCQkJRseDHQYPHixPT09NmTJFISEhOn78uEaMGKHi4mJNmzbN6Hi4THPmzNGTTz4pd3d3ffrpp+rYsaOWL1+ut99+W+vXrzc6HuyUm5urJUuWaP78+UpOTtb999+v/v37KyIiQpMnT9a6deuUnJxsdEzAqVFoAc5xww036NChQ+rRo4f69eunVq1aVTgnOjqaQosT+Ne//qWePXvqpptuso399NNPWrx4sd555x3jgsFu8+bN03XXXWdrsClJ27ZtU3JysuLj4w1MBuCs3Nxc9e/fX6tWrVJJSYm8vLx0xx13aN68eapRo4bR8WCHwsJCSVK1atUkSUePHpXFYlGdOnWMjAU7PfDAA1qzZo3atWunfv36qVu3bqpatartuMVikZ+fn/Ly8gxMCTg/Ci3AOT777DPdc8898vT0NDoKKqlWrVpKT08vdy1Pnz4ts9mso0ePGpgM9oqMjNTWrVvl7+9vG8vOztb111+vlJQUA5PBXq+//rpuv/123XjjjbaxpKQkrV+/Xs8++6yByVBZR48eVUpKisxmMx/IndjatWsVFRWl2NhY29ju3buVmppqW+4H5/LWW2+pb9++f/m6LCwstBXWANiHQgtwDovFct7xs1vJwnnUrl1bqamp8vLyso0VFhYqIiJCWVlZBiaDvfz9/ZWVlSV3d3fbWFlZmQICAti220mFhIRo3759ql69um0sPz9fsbGxysjIMDAZKuvo0aPKz88vN1a3bl2D0sBe9evX18aNGxUSEmIby8jI0G233aY9e/YYmAwArm58egTOUaVKFXl4eFS4Va1aVdHR0XrqqacqvHHE1alt27Z64YUXbMUzi8Wil19+WW3btjU4GezVuHFjLV26tNzY559/rkaNGhmUCJVVXFwsDw+PcmOenp4qKioyKBEqa/Xq1QoLC1OdOnVUr149261+/fpGR4Mdjh49Wq7IIsm2+xCck9lsVkRERIVb/fr11b59e02dOlWlpaVGxwScHoUW4BxTp05VXFyc1q5dq127dmnNmjW6/fbb9eabb+qDDz7QTz/9pOHDhxsdE5fg3//+t7755huFhISoZcuWCg0NVWJioqZOnWp0NNjpjTfe0ODBg3X//ffr2WefVffu3TVo0CBNnjzZ6GiwU4sWLSo0SJ0+fbqaN29uUCJU1hNPPKEXX3xRBQUFslgstltZWZnR0WCHunXrat26deXG1q9fr+joaIMSobL+9a9/yd/fXy+99JJmzpypsWPHKjAwUAMGDFCPHj307rvvavTo0UbHBJweS4eAc8TExOjXX3+Vn5+fbSwnJ0ctWrTQ/v37lZ6erhYtWvCXHCdhsVi0efNmHT58WGazWS1btmQZmJNLSUnRokWLlJaWJrPZrD59+shsNhsdC3basWOHOnbsqJCQEMXExGj//v3KzMxUYmKiGjdubHQ82CEgIEDHjx9nRzAX8eWXX6p///4aNGiQ7TU6e/ZszZ49W/fee6/R8WCHJk2aKDExUaGhobax9PR03XHHHdqxY4d2796tDh06KC0tzcCUgPOj0AKco1atWkpOTq6wFvnaa69VVlYW/SCc1J9771BsAa4e+fn5Wrlypa14dvfdd8vHx8foWLDTM888o0aNGmngwIFGR4GDJCUladasWbbX6KBBg8o1sIZzCQgI0KFDh+Tr62sby8nJUXR0tE6cOCGr1SpfX192HQIqqYrRAYCrSb9+/dSxY0c9+eSTMpvNOnz4sP7973+rf//+ks5032/QoIHBKXEpfv31Vz3xxBNKTk629XuwWq0ymUxMYXdS2dnZeuutt7R169YKvZI2btxoUCpUlo+Pj3r27Gl0DDjIpk2b9O677+r111+vsKsJr1Pn1LJlS7Vs2dLoGHCQrl276t5779WYMWMUHh6uw4cPa+LEieratask6eeff1ZUVJSxIQEXwIwW4BwWi0UffvihlixZooyMDIWEhOihhx7SI488Ind3dxUVFclqtcrb29voqLiIa665Rl27dlV8fHyFLQojIyMNSoXKuPPOO3X69Gk99NBDFa7p2WIorn533nmnVq9eLelM0+oLLTHhQ7lzmjt37gWP8Tp1Dq+++qrGjBkjSRo7duwFzxs/fvyVigQHKioq0ssvv1zhve7YsWNVrVo1ZWZmqri4WBEREUZHBZwahRYALsnX11cnT56kT4AL8fX11bFjx1S1alWjo6ASFi5cqN69e0viQzlwNXrsscf0wQcfSJIGDBhwwfNmz559pSIBgNOh0AL8yezZs5WQkKD09HSFhYUpPj7+L99o4OrUv39/9e7dW506dTI6Chzklltu0dy5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",
|
|
"text/plain": [
|
|
"<Figure size 2160x1080 with 2 Axes>"
|
|
]
|
|
},
|
|
"metadata": {},
|
|
"output_type": "display_data"
|
|
}
|
|
],
|
|
"source": [
|
|
"if __name__ == \"__main__\":\n",
|
|
" from great_ai import query_ground_truth\n",
|
|
" from sklearn import metrics\n",
|
|
"\n",
|
|
" data = query_ground_truth(\"test\", return_max_count=10)\n",
|
|
"\n",
|
|
" X = [d.input for d in data]\n",
|
|
" y_actual = [d.feedback for d in data]\n",
|
|
"\n",
|
|
" y_predicted = [d.output.labels[0].label for d in predict_domain.process_batch(X)]\n",
|
|
" y_actual_aligned = [p if p in a else a[0] for p, a in zip(y_predicted, y_actual)]\n",
|
|
"\n",
|
|
" import matplotlib.pyplot as plt\n",
|
|
"\n",
|
|
" # Configure matplotlib to have nice, high-resolution charts.\n",
|
|
"\n",
|
|
" %matplotlib inline\n",
|
|
"\n",
|
|
" plt.rcParams[\"figure.figsize\"] = (30, 15)\n",
|
|
" plt.rcParams[\"figure.facecolor\"] = \"white\"\n",
|
|
" plt.rcParams[\"font.size\"] = 12\n",
|
|
" plt.rcParams[\"axes.xmargin\"] = 0\n",
|
|
"\n",
|
|
" print(metrics.classification_report(y_actual_aligned, y_predicted))\n",
|
|
" metrics.ConfusionMatrixDisplay.from_predictions(\n",
|
|
" y_true=y_actual_aligned,\n",
|
|
" y_pred=y_predicted,\n",
|
|
" xticks_rotation=\"vertical\",\n",
|
|
" normalize=\"pred\",\n",
|
|
" values_format=\".2f\",\n",
|
|
" )"
|
|
]
|
|
}
|
|
],
|
|
"metadata": {
|
|
"kernelspec": {
|
|
"display_name": "Python 3.10.4 ('.env': venv)",
|
|
"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.10.4"
|
|
},
|
|
"orig_nbformat": 4,
|
|
"vscode": {
|
|
"interpreter": {
|
|
"hash": "02dd6d3afbfa9fbbe1037d64ad9014965528a1ccad21929d6e72f466389a68ad"
|
|
}
|
|
}
|
|
},
|
|
"nbformat": 4,
|
|
"nbformat_minor": 2
|
|
}
|