Skip to content

Instantly share code, notes, and snippets.

@AstraBert
Created December 5, 2024 02:23
Show Gist options
  • Select an option

  • Save AstraBert/d4c32e9c6e45986700eb38a70268e435 to your computer and use it in GitHub Desktop.

Select an option

Save AstraBert/d4c32e9c6e45986700eb38a70268e435 to your computer and use it in GitHub Desktop.
SenTrEv_Practical_Showcase.ipynb
Display the source blob
Display the rendered blob
Raw
{
"nbformat": 4,
"nbformat_minor": 0,
"metadata": {
"colab": {
"provenance": [],
"gpuType": "T4",
"authorship_tag": "ABX9TyOGsy5L0AvxdyBR+IifDWUJ",
"include_colab_link": true
},
"kernelspec": {
"name": "python3",
"display_name": "Python 3"
},
"language_info": {
"name": "python"
},
"accelerator": "GPU"
},
"cells": [
{
"cell_type": "markdown",
"metadata": {
"id": "view-in-github",
"colab_type": "text"
},
"source": [
"<a href=\"https://colab.research.google.com/gist/AstraBert/d4c32e9c6e45986700eb38a70268e435/sentrev_practical_showcase.ipynb\" target=\"_parent\"><img src=\"https://colab.research.google.com/assets/colab-badge.svg\" alt=\"Open In Colab\"/></a>"
]
},
{
"cell_type": "markdown",
"source": [
"## What is SenTrEv?\n",
"\n",
"<div align=\"center\">\n",
" <img src=\"https://raw.githubusercontent.com/AstraBert/SenTrEv/main/logo.png\" alt=\"SenTrEv Logo\">\n",
"</div>\n",
"\n",
"**SenTrEv** (**Sen**tence **Tr**ansformers **Ev**aluator) is a python package that is aimed at running simple evaluation tests to help you choose the best embedding model for Retrieval Augmented Generation (RAG) with your PDF documents."
],
"metadata": {
"id": "04pjNncbFpwI"
}
},
{
"cell_type": "markdown",
"source": [
"## Applicability\n",
"\n",
"- Text encoders/embedders loaded through the class `SentenceTransformer` in the python package [`sentence_transformers`](https://sbert.net/)\n",
"- PDF documents (single and multiple uploads supported)\n",
"- [Qdrant](https://qdrant.tech) vector databases (both local and on cloud)"
],
"metadata": {
"id": "Mcpmdg0FGxJV"
}
},
{
"cell_type": "markdown",
"source": [
"## Installation\n",
"\n",
"You can install the package using `pip`:"
],
"metadata": {
"id": "UPFLES7nG9hp"
}
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"id": "knuoPKVdFlW9"
},
"outputs": [],
"source": [
"! python3 -m pip install --quiet sentrev"
]
},
{
"cell_type": "markdown",
"source": [],
"metadata": {
"id": "7kLuCytkHqkj"
}
},
{
"cell_type": "markdown",
"source": [
"## Evaluation workflow\n",
"\n",
"1. The PDFs text is extracted via a [PyPDF](https://pypdf.readthedocs.io/en/stable/) wrapper offered by [LangChain](https://langchain.com).\n",
"2. The extracted text is chunked according to an (optionally) user-specified chunking size (default is 1000)\n",
"3. After the PDF text extraction and chunking phase, the chunks are reduced according to an (optionally) user-defined percentage (default is 25%), which is randomly extracted at any point of each chunk.\n",
"4. The reduced chunks are mapped to their original ones in a dictionary\n",
"5. Each model encodes the original chunks and uploads the vectors to the Qdrant vector storage\n",
"6. The reduced chunks are then used as queries for retrieval\n",
"7. Starting from retrieval results, accuracy, time and carbon emissions statistics are calculated and plotted.\n",
"\n",
"![workflow](https://raw.githubusercontent.com/AstraBert/SenTrEv-case-study/main/imgs/SenTrEv_Eval_Workflow.png)\n",
"\n",
"## Evaluation metrics\n",
"\n",
"- **Success rate**: defined as the number retrieval operation in which the correct context was retrieved ranking top among all the retrieved contexts, out of the total retrieval operations:\n",
"\n",
" $SR = \\frac{Ncorrect}{Ntot}$\n",
"\n",
"- **Mean Reciprocal Ranking (MRR)**: MRR defines how high in ranking the correct context is placed among the retrieved results. MRR@10 will be used, meaning that for each retrieval operation 10 items are returned and an evaluation is carried out for the ranking of the correct context, which will be then normalized between 0 and 1 (already implemented in SenTrEv). An MRR of 1 means that the correct context was ranked first, whereas an MRR of 0 means that it wasn't retrieved. MRR is calculated with the following general equation:\n",
"\n",
" $MRR = 1 - \\frac{ranking - 1}{Nretrieved}$\n",
"\n",
" > _Keep in mind that **ranking is 1-based** (meaning that the first position is 1, the second is 2 and so on...)_\n",
"\n",
" When the correct context is not retrieved, MRR is automatically set to 0. MRR is calculated for each retrieval operation, then the average and standard deviation are calculated and reported.\n",
"- **Time performance**: for each retrieval operation the time performance in seconds is calculated: the average and standard deviation are then reported.\n",
"- **Carbon emissions**: Carbon emissions are calculated in gCO2eq (grams of CO2 equivalent) through the Python library [`codecarbon`](https://codecarbon.io/) and were evaluated for the Austrian region. They are reported for the global computational load of all the retrieval operations."
],
"metadata": {
"id": "9XQ10f61HXpz"
}
},
{
"cell_type": "markdown",
"source": [
"## Let's get our hands dirty with some code!🚀"
],
"metadata": {
"id": "BSmdRj89Jh-W"
}
},
{
"cell_type": "code",
"source": [
"# IMPORT NECESSARY LIBRARIES\n",
"from sentence_transformers import SentenceTransformer\n",
"from qdrant_client import QdrantClient\n",
"from sentrev.evaluator import evaluate_rag"
],
"metadata": {
"id": "lsvFvDWeJgyR"
},
"execution_count": null,
"outputs": []
},
{
"cell_type": "code",
"source": [
"# CREATE QDRANT CLIENT\n",
"\n",
"## Local option (uncomment if you are running Qdrant locally)\n",
"## client = QdrantClient(\"http://localhost:6333\")\n",
"\n",
"## On-cloud option:\n",
"from google.colab import userdata\n",
"qdrant_url = userdata.get(\"iuss_QDRANT_URL\")\n",
"qdrant_api = userdata.get(\"iuss_QDRANT_API_KEY\")\n",
"client = QdrantClient(url=qdrant_url, api_key=qdrant_api)"
],
"metadata": {
"id": "ECyGL4bwJV3b"
},
"execution_count": null,
"outputs": []
},
{
"cell_type": "code",
"source": [
"# LOAD SENTENCE-TRANSFORMERS TEXT ENCODERS\n",
"\n",
"encoder1 = SentenceTransformer('sentence-transformers/all-mpnet-base-v2', device=\"cuda\")\n",
"encoder2 = SentenceTransformer('sentence-transformers/all-MiniLM-L12-v2', device=\"cuda\")\n",
"encoder3 = SentenceTransformer('sentence-transformers/LaBSE', device=\"cuda\")\n",
"\n",
"## Create a list of the encoders\n",
"encoders = [encoder1, encoder2, encoder3]\n",
"\n",
"## Create a dictionary that maps each encoder to its name\n",
"\n",
"encoder_to_names = {\n",
" encoder1: 'all-mpnet-base-v2',\n",
" encoder2: 'all-MiniLM-L12-v2',\n",
" encoder3: 'LaBSE',\n",
"}"
],
"metadata": {
"id": "gAM5I3rHLtDY"
},
"execution_count": null,
"outputs": []
},
{
"cell_type": "markdown",
"source": [
"### WHAT ARE THESE MODELS?\n",
"\n",
"| Model | Base Model | Number of Parameters | Reference |\n",
"| ----------------- | ------------------------------------ | ------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------- |\n",
"| all-MiniLM-L12-v2 | MiniLM-L12-H384-uncased by Microsoft | 1B | **HuggingFace**: https://huggingface.co/sentence-transformers/all-MiniLM-L12-v2; **Paper**: Wang et al., 2020 |\n",
"| all-mpnet-base-v2 | mpnet-base by Microsoft | 1B | **HuggingFace**: https://huggingface.co/sentence-transformers/all-mpnet-base-v2; **Paper**: Song et al., 2020 |\n",
"| LaBSE | LaBSE by Google | 17B English sentence pairs + 6B Multi-Lingual Sentence Pairs | **HuggingFace**: https://huggingface.co/sentence-transformers/LaBSE; **Paper**: Feng et al., 2020 |"
],
"metadata": {
"id": "PiSdWNdYM0Z9"
}
},
{
"cell_type": "code",
"source": [
"# GET THE DATA\n",
"! wget https://raw.githubusercontent.com/AstraBert/SenTrEv-case-study/main/data/attention_is_all_you_need.pdf\n",
"! wget https://raw.githubusercontent.com/AstraBert/SenTrEv-case-study/main/data/generative_adversaria_nets.pdf\n",
"! mkdir data\n",
"! mv *.pdf data"
],
"metadata": {
"id": "cS40VlqGM-EM"
},
"execution_count": null,
"outputs": []
},
{
"cell_type": "code",
"source": [
"# LIST YOUR PDFs\n",
"pdfs = [\"data/attention_is_all_you_need.pdf\", \"data/generative_adversaria_nets.pdf\"]"
],
"metadata": {
"id": "AaPVRrkQNx8U"
},
"execution_count": null,
"outputs": []
},
{
"cell_type": "code",
"source": [
"# KILL RUNNING CODECARBON INSTANCES TO AVOID ERRORS\n",
"\n",
"! rm -rf /tmp/.codecarbon.lock"
],
"metadata": {
"id": "JFVliUvHOjsi"
},
"execution_count": null,
"outputs": []
},
{
"cell_type": "code",
"source": [
"# EVALUATE RETRIEVAL\n",
"\n",
"evaluate_rag(pdfs, encoders, encoder_to_names, client, csv_path = \"output.csv\", chunking_size = 1500, text_percentage=0.6, distance=\"euclid\", mrr=10, carbon_tracking=\"AUT\", plot=True)"
],
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 1000
},
"id": "-iR7qEDKOGHU",
"outputId": "e74517fd-b531-43ce-b251-8b988b755075"
},
"execution_count": null,
"outputs": [
{
"output_type": "stream",
"name": "stderr",
"text": [
"/usr/local/lib/python3.10/dist-packages/codecarbon/output_methods/file.py:52: FutureWarning: The behavior of DataFrame concatenation with empty or all-NA entries is deprecated. In a future version, this will no longer exclude empty or all-NA columns when determining the result dtypes. To retain the old behavior, exclude the relevant entries before the concat operation.\n",
" df = pd.concat([df, pd.DataFrame.from_records([dict(total.values)])])\n"
]
},
{
"output_type": "display_data",
"data": {
"text/plain": [
"<Figure size 1000x500 with 1 Axes>"
],
"image/png": "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\n"
},
"metadata": {}
},
{
"output_type": "display_data",
"data": {
"text/plain": [
"<Figure size 1000x500 with 1 Axes>"
],
"image/png": "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ffLJJ5KkYcOGKT4+Xn/605/UoEED9enTRzt37jzvXF9//XXl5eUpJydH3bt3d7ls0Bij6dOnq1WrVqpbt678/f2VlJR0wZ/loUOH9Nprr7nsw8yZM5WZmXne9QDAdkQOANQQPj4+mjt3rr799lvn5UyBgYG6//77lZeX53wUFBS4XELmcDgq3V6tWuf/K/5ith0bG6uUlBTt379fCxYs0MiRI53bnT17ttasWaM1a9YoNzdXeXl56tOnz6++acC1116rkSNHqk2bNvrqq6+cP5NfviPzix9++MH557CwMOXm5urEiROVbjMsLEypqann3P8uXbq47H9+fr5Onz6txo0bS5JGjRqlzZs36/jx4xo4cKD69eunwsJCeXh4aPz48frnP/+p77//Xi1btnR+7+lCGjRooDfffFOrVq3SqlWrJEnvvfeeXn31Vb399ts6ceKE8vLyFB8f7/KzrOyfZ2BgoCZMmOCyD4WFhc7LGAHgSkXkAEAN4uXlpSlTpuiFF15Qfn6+Hn30US1btkxLly5VSUmJysrKlJaWpnXr1jnXCQwM/FXfZ7mYbV933XXq06ePnnnmGX3++ecaNWqU87X8/Hx5eXmpYcOGKi8v19KlS7V+/fqLfv9vvvlGL774og4ePKjS0lKdOXNGf//737Vv3z517dpVktS+fXvt3btX27ZtU1lZmZYuXaotW7Y4t9G+fXt16tRJI0eO1LFjxySdPXtz4MABSdITTzyhWbNmaePGjSorK1NhYaHzznUjR47Url279D//8z/66aefZIxRRkaGPvjgA0nSjh07tGXLFv3888+qXbu2fHx85HA45OHhoY0bNyolJUUlJSXOW0N7eHhc9L43bNhQ48aN04QJE1RWVqb8/Hx5enoqICBADodDn332mRYvXuyyTmBgYIVge+KJJ/S3v/1NGzZsUGlpqUpLS7Vv3z6XnxEAXImIHACoYR588EHVr19fs2bNUkxMjD755BPNnz9fjRs3Vv369XXvvffqu+++c45PTEzUrFmz5O/vr759+170+1zMtqWzNyD48MMP1aNHD4WFhTmXjx8/XsHBwQoNDdV1112nDRs2aODAgRf9/j4+Pvrmm2/Up08f+fv7KyAgQLNmzdLcuXN17733SpK6deumSZMmadCgQWrYsKE2bdqkwYMHO7fhcDi0atUqBQUFqWPHjvLx8dFd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PQUAqBRncgAAAABYhcgBAAAAYBUiBwAAAIBV3I6cQ4cOqVOnToqIiFBMTIz2799f6bi9e/eqe/fuatmypVq2bKkVK1b85skCAAAAwIW4feOB+Ph4jR49WrGxsVq2bJliY2P15Zdfuoz56aefNGDAAL399tvq0qWLysrKdPLkySqbNAAAAACci1tncnJycpSSkqJhw4ZJkgYPHqyMjAylpaW5jFuyZIluueUWdenSRZLk4eGhhg0bXnD7xcXFKigocHkAAAAAgDvcipyMjAwFBQXJ0/PsCSCHw6GQkBClp6e7jPvXv/4lLy8v9e3bV9HR0Ro+fLiOHz9+we0nJibKz8/P+QgODnZnegAAAABwaW48UFpaqk8//VRJSUnatWuXGjdurDFjxlxwvYkTJyo/P9/5yMjIuBTTAwAAAGAxtyInODhYmZmZKi0tlSQZY5Senq6QkBCXcSEhIbrtttvUuHFjORwODRs2TF988cUFt+/l5SVfX1+XB64sc+fOVVhYmLy9vdWhQwft2LHjnGPffPNNORwOl4e3t3eFcQcOHFD//v3l5+ena6+9VjExMRXOPgIAAMAebkVOQECAbrrpJi1evFiStHz5cjVp0kTh4eEu4+677z59+eWXzu/UrF27VlFRUVU0Zdjq/fffV0JCgqZOnaqvvvpKUVFR6tWrl3Jycs65jq+vrzIzM52P7777zuX1w4cPq0uXLmrRooU2bdqkr7/+Ws8991ylMQQAAAA7uH13taSkJMXGxmrGjBny9fVVcnKyJCkuLk79+/dX//79FRISokmTJqlTp06qVauWGjdurDfeeKPKJw+7zJ49Ww8//LBGjhwpSZo3b54+/PBDLVq0SBMmTKh0HYfDocDAwHNu89lnn9Vdd92lv/zlL85lzZo1q9qJAwAAoEZx+zs5kZGR2r59u1JTU5WSkqLWrVtLkhYsWKD+/fs7xz344IPat2+fvv76a3300UfcRADnVVJSop07d6pnz57OZbVq1VLPnj21ffv2c6536tQphYaGKjg4WAMGDHD5vU3l5eX68MMPFRERoV69eikgIEAdOnTQBx98cCl3BQAAANXsktx4AHDXiRMnVFZWpkaNGrksb9SokbKysipdJzIyUosWLdKqVau0ePFilZeXq1OnTjp27Jiks7c8P3XqlGbOnKnevXtr/fr1uueeezRo0CBt3rz5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VrVq1dLAgQMlSSkpKRoyZMhFvXd0dLQKCwud2/7ggw8qjHn++eflcDi0cuVK5zJjjJo2beoy7/8WFham3bt3V1i+aNEitW7dWp6enhX+jqiKY3Tv3r3q2rWrWrRooRtvvFGjRo3Szz//7PZ2gN+rcx1759K9e3c1bdpU0dHRatWqle666y5lZ2dLkvLy8jRs2DDdeOONatOmjW688UYtWbJEkrRp0yZdffXVio6Odj7uueeeS7FL+B0icvC7NW3atPNGTk106623ateuXdqzZ48WLlyo++67T0VFRdU9LcAtbdq00TvvvON8vmjRIrVr1875vH379nr//fcvalu7d++Wj4/PBce1a9dOixYtcj7fsGGDGjRo4MasXbf197//Xffff3+F16riGPX29tacOXP0zTffaM+ePSoqKtKsWbN+1VyBK8Urr7yi3bt3a//+/QoNDdXLL78sSZo8ebIaNmyovXv36uuvv9b27dsVExPjXC8yMlK7d+92Pv7zwxBc2YicK9gDDzyg9u3bq02bNrr77ruVlZXl1vphYWGaPHmyOnXqpODgYM2bN0/Jycnq2LGjwsLC9N577znHOhwOTZ48WW3btlVERITeffddl9dmzJihm2++WU2bNlVycrLztUOHDunuu+9WTEyM2rRpozlz5kiSHnnkEUln/4ckOjra5VPl//T111+rU6dOioiI0IgRI5yfpi5ZskQdOnRQ27ZtFRUVpTVr1jjXefHFF9WyZUvnp0LfffedJOnLL7/U7bffrvbt26tt27ZaunRppe8ZERGhlJQU5/M333zT+clSnz59dPXVV0uSWrduLWOMjh8/fpE/ceC3+63HvSSNGDFCb731liSpvLxc77//vkswbNq0SdHR0ZL+fZZo6tSpateuncLDw7V27Vrn2Is9W9ylSxcdPnzYOd9FixZp1KhRbs9dkqKiotSyZUvVqlXxP4EXe4y+++676tu3r/O5MUbXX3+99uzZo+bNm6tNmzaSJA8PD8XExOjo0aO/aq6ALWbPnq2YmBhFR0crJiZG27dvr3RcaWmpTp06pbp160qSjh07pqCgIDkcDkmSj4+Pmjdvftnmjd8xgytWTk6O88+JiYkmPj7eHDlyxPj5+TmXSzK5ubmVrh8aGmrGjRtnjDHm0KFDxtvb27zwwgvGGGN27NhhGjRo4LKdyZMnG2OMOXz4sKlbt645cuSI87WXX37ZGGPMgQMHTJ06dcyZM2dMaWmpadeunTlw4IAxxpiioiLTunVrs2PHjgvOzRhjRowYYW644QZTUFBgSktLTd++fc306dONMcacOHHClJeXG2OMOXLkiGnUqJE5ffq0OXnypPHz8zM//fST8z1//vlnk5uba6Kjo80PP/xgjDHm+PHjJjg42Bw7dqzC+06fPt2MHTvW+bxr165m9erVFcYtWLDAREVFOecBXA6/9bjv1q2bWblypbnjjjvMF198YT766CMzdOhQk5ycbAYMGGCMMeazzz4zUVFRxpizx5cks2zZMmOMMR999JGJiIio9L1+2fZ/mzp1qnniiSfM9OnTzcyZM01ubq4JDw83hw8fdpn3fwsNDTW7du065+sjRowwr7zyyjlfP98x+tNPP5n69eubzMxMY4wxGzduNDfddFOFcadOnTKRkZFmxYoV53wfwDaVHXv/+XfP9u3bTWRkpPN5t27dTFhYmImKijINGjQwrVu3Nnl5ecaYs8dWvXr1zE033WTGjh1r1qxZ41zvs88+M97e3iYqKsr5GD9+/KXdOfxueFZjX6GaLVmyRO+8845Onz6t06dP/6pLP3657j48PFze3t669957JZ29XOXkyZPKy8tzXjMfFxcnSbr++uvVtWtXbdmyRWFhYZLOfrosSS1atJCnp6eysrJUUFCg/fv3a+jQoc73Kyws1L/+9S+XU9Xnc9999zkvhXnooYf0+uuva9KkSTpy5IgeeOABHTt2TJ6enjp58qSOHDmi5s2bq3nz5ho2bJjuvPNO3X333WrSpIk2btyob7/9Vn369HHZ/sGDB9W4cWOXZcOHD1fbtm3117/+Vd9//71SU1MrrLdhwwZNmzZNn3zyifPTKeByqIrjXpJGjRqlhQsXKjc3V6NHj9b3339/zrHe3t4aNGiQJKljx446fPjwr3rPESNG6I477lCdOnV03333VXompqpc6Bi9+uqrNXjwYL3zzjv605/+pDfffFMjR450GVNSUqIhQ4bozjvv5HsCuOLt2rVL06dP148//ihPT08dPHhQP//8s/PM6SuvvKKBAwfKGKPnn39eo0aN0vLly3XbbbcpPT1dmzdv1ueff674+HgNHDhQc+fOlfTvy9WA/8blaleobdu26fXXX9fatWu1b98+zZ49+7zfb/n000+dl29Nnz7dudzb29v5Zw8PD+dzh8Mhh8Oh0tLSc27zP//H4b+3U1paKmOM6tWr53Kt7ZEjRzRixIgK28rLy7uoLx3+8p5Dhw5VXFyc9u3bp927d6tOnTo6ffq0PDw89MUXX2jcuHHKycnRLbfcoq1bt8oYo1atWrnMJT09XbfffrtmzpzpfO+PP/5YTZo0Ufv27bVq1Sq99dZbGjZsmDw9//15wubNmzVy5EitWbNGkZGR55wrUNWq6riXpIEDB+rjjz/Wnj171KNHj/O+r5eXl/PY8/DwUFlZ2a+af+PGjRUaGqpp06ZVCIq3337bOdf/vOT116jsGK3s75hRo0YpOTlZp06d0j/+8Q+XS/bOnDmjIUOGKCgoSK+99tpvmg/we1dSUqJBgwbp5Zdf1r59+7RlyxZJUnFxcYWxDodDQ4YM0bp165zLrr32Wt1111168cUXtXz5cpfvBALnwpmcK1Rubq58fHxUv359lZSUKCkp6bzje/bs+Zs/KUlOTtbzzz+vo0ePauvWrRe881lkZKR8fX2VnJzs/B+atLQ01atXT/Xq1ZOPj4/y8/Pl7+8vf3//Sue3bNkyPfXUU7r66quVnJysnj17Sjq7/02bNpUkLV68WLm5uZLOnikqLCzUrbfeqltvvVX79+/Xrl279OCDD+rIkSP69NNPndvYvXu3brjhBk2YMEETJkxwed+RI0dq0aJFOnjwoMv3D7Zs2aIHH3xQq1atUlRU1K/6OQK/VlUe997e3nrllVd0zTXXXNIzKv/thRde0FdffaXw8HCX77kMHz5cw4cP/83bP9cxWtnfMR06dJAkjR8/Xj179lS9evUknf1OwdChQ1WvXj298cYbnK3FFe/06dMqKSlRSEiIJOlvf/vbecdv2LDB+QHD+vXrFRMT4/yOzs6dO9WsWbNLO2FYgci5QvXu3VuLFy9WZGSk6tevr549e573cpOqUFZWprZt26qoqEivv/6681K1c/H09NQ//vEPjRs3Tq+88orKysrUoEED560jn3rqKd1xxx265pprtH79egUEBFTYRkxMjHr16qXjx4+rY8eOGjdunCTptdde07333it/f3/dfvvtzr948/Pzde+996qoqEgOh0PNmzfXiBEj5Ofnpw8//FDjx4/XU089pTNnzigkJKTS291K0oABAzRmzBg1b95cLVu2dC5/6KGHVFxc7PIp9DvvvKPWrVu78ZMEfp2qPu5/uQStKsXFxemxxx5zPv/vG3y0b99e7du3v+jt9erVS1dddZXz+RdffKFPP/1UkydPVm5urj744AO9/PLLWrNmjdq2bev2MTpy5Eg9/fTT+uijj5zL3n//fa1YsUJt2rRR27ZtJUmdO3d2Xl4DXAn++9ibPHmybr75ZjVo0MDlMvRfPPnkk3r++edVXl6uunXrOm9usnfvXj311FMyxqhWrVoKCgrS4sWLnesdPHjQeaMT6eyNCbZu3Xrpdgy/Gw5jjKnuScB+DodDubm55/2dFgAAAEBV4Ds5AAAAAKzC5Wq4LDhhCAAAgMuFMzkAAAAArELkAAAAALAKkQMAAADAKkQOAAAAAKsQOQAAAACsQuQAAAAAsAqRAwAAAMAqRA4AAAAAq/x/nhgbNEWAMV0AAAAASUVORK5CYII=\n"
},
"metadata": {}
},
{
"output_type": "display_data",
"data": {
"text/plain": [
"<Figure size 1000x500 with 1 Axes>"
],
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAzkAAAG9CAYAAAA2rLj+AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguMCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy81sbWrAAAACXBIWXMAAA9hAAAPYQGoP6dpAAA4JUlEQVR4nO3deXxN1/7/8fchleRWEiTGDIJIzEkQKjqYWh0MbbW4qgQpWr0dUFPTomro4+uL9va2gkpLqvxKFaU6aKvcaovSGlpzJNRYkRgTkfX7w6Pn29MkOCTC8no+HufxcPZee+3PPrHD+6y193YYY4wAAAAAwBIlirsAAAAAAChMhBwAAAAAViHkAAAAALAKIQcAAACAVQg5AAAAAKxCyAEAAABgFUIOAAAAAKsQcgAAAABYhZADAAAAwCqEHACAi7p16+q9994r7jIu6t1331VQUFBxl6EWLVooISGhwPU3wmcJADYi5ADAX7Ro0UIOh0OJiYkuy0+cOCEfHx85HA7t3LmzmKq7wOFwyNvbW6VLl1a5cuV0++2365tvvim0/rds2aKePXsWWn/F4d1331WJEiVUunRplS5dWoGBgerVq5eOHTt2Teu4lp/l3r17NXjwYNWvX1/lypVTYGCg7rvvPr3//vvKzc296LZnzpzRo48+qpo1a6pEiRL5BjdjjEaOHKkqVaro1ltv1Z133qnNmzcX1eEAwFUh5ADA39SpUydPyJk9e7aqVq1aTBXltWTJEp08eVL79+9XTEyMOnbsqBMnThR3WZKk7Ozs4i5BklSlShWdPHlSJ0+e1OrVq/XDDz9o0KBBxV1WkZg9e7Zat26tSpUqadGiRTp8+LB27typIUOGaO7cuWrRooWOHz9e4PYOh0OxsbGaNm2amjRpkm+biRMnaubMmfrss8909OhRNW/eXG3bttXJkyeL6KgA4MoRcgDgb9q3b69Dhw7phx9+cC57++231a9fvzxtf/jhB7Vo0UL+/v6qWrWqXnrpJeXk5DjX9+3bV6GhoSpdurSqVaumkSNHunyr3qJFCz377LPq1q2b/Pz8FBwcrLfffvuya/X29lafPn2UmZmpbdu2OZfPmjVLkZGR8vPzU926dTV37lyX7dasWaNWrVopICBA5cqVU8uWLXXmzBlJUmhoqGbMmCFJSklJkcPh0PTp01WnTh35+vqqdevW2rVrl7OvuLg4de7cWU8++aTKly+vjh07SpKWLl2qRo0ayc/PT+Hh4Zo4caLLse/bt0+PPfaYgoKC5Ovrq6ioKP3000+SpA8//FCNGjVS2bJlFRAQoA4dOmjPnj2X/bn8XbVq1XT//fdr7dq1zmXffPONYmNj5e/vr7Jly6pVq1bauHGjy3qHw6H58+crPDxcPj4+uvvuu7V///4C9zNmzBhVr17dOcKR32f53nvvKTIyUj4+Prrtttu0detW5/YnTpxQXFyc/P39FRQUpNdff11BQUF69913C9zn559/rsmTJ2vNmjUaPHiwqlevLg8PD3l7e6tly5ZasmSJmjdvru7duxfYh5eXl55//nm1bNlSXl5e+bZ56623nCNF3t7eGjNmjLKzs7Vw4cIC+wWA4kLIAYC/8fDwUHx8vKZOnSpJWr16tTIzM/XAAw+4tNu2bZtat26t/v3769ChQ/r222+1ePFivfbaa842TZo00Q8//KATJ07ogw8+0Jtvvqnp06e79PPuu+8qPj5e6enpmjJlip5++unLnhJ36tQpTZs2TV5eXgoNDXX2l5CQoHfeeUfp6elKTExU3759tXr1akkXplC1atVKnTp1Umpqqg4ePKiRI0eqRImC/0mYPn26PvvsMx08eFDVqlVT+/btXcLcwoULFRMTo99//10LFizQ2rVr9dBDD2no0KH6448/9MEHH2jSpEl64403JF2YHtWqVSuVKlVKGzdu1PHjxzVnzhz5+/tLknx8fDRz5kwdPXpUv/32m4wx6tat22V9JvnZsWOHlixZotq1azuX3XLLLZo4caIOHDig1NRUhYWFqWPHjnlGohYuXKi1a9dq3759On36tEaMGJGn/7Nnz+qxxx7TsmXL9P3336tevXoF1jJ79mwtX75cR44cUVBQkJ588knnumeffVZbt27Vpk2btH37dm3atEmHDh266LENHjxY77//vsqXL6/169erWbNm8vf317333qu4uDjNnj1br776qn799Vdt2rTpcj8yFxkZGUpJSXEZ5fHw8FB0dLQ2bNhwRX0CQJEyAACnu+66y7z44osmLS3N+Pj4mPT0dNOtWzczZswYs2fPHiPJ7NixwxhjzL/+9S/TtWtXl+2Tk5NNjRo1Cuz/mWeeMQ8//LDL/nr16uXSJiAgwMydO7fAPiSZW2+91fj6+hpJJiAgwHz66afO9fXr1zdTp0512SY+Pt706dPHGGPMgAEDzAMPPFBg/1WrVjXTp083xhjnMS9evNi5PjMz05QsWdJ8++23xhhjevbsaW677TaXPvr27WsefPBBl2WTJk0yERERxhhjPvzwQ1OuXDlz9uzZAuv4q59++slIMpmZmcYYY5KSkkxgYGCB7ZOSkozD4TB+fn7G29vbSDKtW7c2hw4dKnCbY8eOGUnml19+McYY8/XXXxtJZu/evc42b775pqlVq5bz/V133WXi4+PNbbfdZrp06WLOnDnj0md+n+XKlSud6z/55BPj7e1tjDEmJyfHlCpVyixdutS5PiMjw5QoUcIkJSXlW/Pu3btNs2bNjDHG5ObmmpCQEDN37lyTk5Nj1q9fb/z9/Z3bPvLII2bOnDkFHv9fj+nFF190WZaammokma1bt7os79y5s/PvFQBcTxjJAYB8BAUFqWXLlpo4caIWLVqkPn365GmzY8cOLVy4UGXKlHG+nnzySR08eFDShQu1x44dq7p166ps2bIqU6aMEhMTdfjwYZd+qlSp4vL+1ltvveT1NR9//LEyMjK0d+9ehYaGas2aNS51DRo0yKWuDz74QL///rskac+ePYqIiHDr86hWrZrzzz4+PgoICFBaWlq+6yUpLS1NNWrUcFkWFham1NRUZw2hoaHy9PTMd38rV65U69atVblyZfn6+uquu+6SpDyf3cVUqVJFx48f18mTJ7Vo0SL98ssvOnDggHP9L7/8ovbt2yswMFC+vr7OY7jYzye/n80nn3yizZs3a+zYsQVO9bpYf2fOnFFOTo6OHj2q7Oxsl2u/fH19VbZs2QL7OnDggLP90aNHdfr0aXXp0kUlS5ZUw4YN1aJFC2fbvXv3qnLlypesLz++vr6SlOe6nvT0dOc6ALieEHIAoABPPvmkxo0bp/vuuy/f/xxWqlRJ3bp10/Hjx52vzMxM54XYc+fO1ZQpUzRr1iwdPXpUx48fV79+/WSMKbQaQ0JCNGvWLE2YMME5bahSpUp66623XOo6efKkli1bJunCdSLbt293az8pKSnOP588eVJHjx51uYXz36e6BQcHu1y3I0m7du1SSEiIs4aUlJR8b1KQnZ2tdu3a6d5779X27duVmZmplStXStIVfXYlSpRQhw4d9MQTT6h3797OPh599FHVqFFDmzdvVmZmpvOaH3f30adPHw0ZMkR33HHHFU8Hk6SAgACVKlVKe/fudS7LzMxUenp6gdtUrFhR+/btc25/6623at68eTp//rw2bdqkb7/9VqdPn9aECRNkjNEdd9xxRbX5+fkpNDTU5ZqmnJwcbdy4UdHR0VfUJwAUJUIOABSgbdu2+uKLLzR58uR81z/11FOaP3++PvzwQ2VnZ+v8+fPauXOnli9fLunCdQweHh6qUKGCHA6Hvv76ayUnJxd6nbVr19Y///lPDRkyRJL03HPPacyYMVq7dq1yc3OVlZWltWvXav369ZIuhLcvvvhCU6dO1ZkzZ3Tu3DmtXLlSWVlZBe7j1VdfdV6TMmjQIIWFhSk2NrbA9r1799bSpUu1YMECnT9/Xhs2bND//M//qG/fvpKkdu3aqWzZsnrqqad09OhRGWO0detW7d27V9nZ2Tpz5ozKli0rHx8f/f777xd9Fs3leuGFF7R7927NmTNH0oWfj6+vr/z8/HTs2LGruvPaSy+9pJdfflktW7bUf//73yvqo2TJkurWrZteeeUVHThwQKdPn9YLL7xw0WulatSooWPHjmnbtm1yOBxasGCBJk+erCpVqmjYsGHq2LGj3nrrLWVmZmrFihUqWbJkgX1lZWXp7Nmzys3N1fnz53X27FmXEPrUU09p4sSJ2rx5s86cOaORI0fqlltu0UMPPXRFxwsARYmQAwAFcDgcat26dYEPnYyJidEXX3yh6dOnKzAwUP7+/nrkkUec38THxcWpdevWql+/vgICAjR16tSL3uHqarz88sv65ptv9Pnnn+vZZ5/VqFGj1L9/f+fzUl544QWdOnVKklSvXj19+eWX+uCDD1SlShVVrFhRr7zyykWfpdKnTx/dfffdqlixorZv364lS5bIw8OjwPZNmzbV/PnzNXbsWJUtW1aPPvqonnnmGT377LOSLtwV7quvvtLJkydVv359+fn56bHHHtOxY8dUunRpzZgxQ6+++qpKly6t++67T48++uhVf0ZlypTRwIEDlZCQoOzsbM2cOVMffvih8y5n991331X1379/f7399ttq166dc9TMXa+//rrCw8NVt25d1axZU3Xq1FG5cuUuOg1uwoQJ6tq1q/744w81atRI33//vQ4dOqSlS5dq+vTp2rhxo8aNG3fJaWURERHy9vbWqlWrNGHCBHl7e+uee+5xrh88eLDi4uLUpk0b+fv7a9Wq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R1805FyP7rjjDm3YsEE///yz3nnnHXXu3FmnTp0q7rIAtzRo0ECzZ892vp85c6YaNWrkfN+4cWPNmzfvsvrauHGjfHx8LtmuUaNGmjlzpvP9ihUrFBAQ4EbVrn39v//3/9StW7c86wrjHPXy8tKbb76p3377TT///LNOnTql11577YpqBW4WkydP1saNG7VlyxZVrVpVEydOlCQlJCSofPny2rRpk3755RetWbNGMTExzu0iIiK0ceNG5+uvX4bg5kbIuYk99thjaty4sRo0aKAHHnhABw8edGv70NBQJSQkKDY2VsHBwZo6daqSkpLUrFkzhYaGau7cuc62DodDCQkJio6OVnh4uN5//32XdePGjVOTJk1UrVo1JSUlOdft2LFDDzzwgGJiYtSgQQO9+eabkqT+/ftLuvAfkqioKJdvlf/ql19+UWxsrMLDw9WzZ0/nt6lz5sxR06ZNFR0drcjISC1ZssS5zauvvqratWs7vxXau3evJGnt2rVq1aqVGjdurOjoaH344Yf57jM8PFzr1q1zvn/33Xed3yzdd9998vb2liTVr19fxhgdOXLkMj9x4Opd7XkvST179tR7770nScrNzdW8efNcAsM333yjqKgoSf83SjRy5Eg1atRIYWFhWrZsmbPt5Y4W33777dq1a5ez3pkzZ6p3795u1y5JkZGRql27tkqUyPtP4OWeo++//77atWvnfG+MUfXq1fXzzz+rZs2aatCggSSpZMmSiomJUUpKyhXVCthi0qRJiomJUVRUlGJiYrRmzZp82+Xk5OjkyZMqW7asJGnfvn2qXLmyHA6HJMnHx0c1a9a8ZnXjBmZw0zp8+LDzz+PHjzf9+vUze/bsMX5+fs7lkkx6enq+21etWtU899xzxhhjduzYYby8vMyYMWOMMcb8+OOPJiAgwKWfhIQEY4wxu3btMmXLljV79uxxrps4caIxxphff/3VlC5d2pw7d87k5OSYRo0amV9//dUYY8ypU6dM/fr1zY8//njJ2owxpmfPnqZOnTomMzPT5OTkmHbt2pmxY8caY4w5evSoyc3NNcYYs2fPHlOxYkVz9uxZc+zYMePn52dOnz7t3OeZM2dMenq6iYqKMr///rsxxpgjR46Y4OBgs2/fvjz7HTt2rBkwYIDz/Z133mkWL16cp92MGTNMZGSksw7gWrja8/6uu+4yCxcuNHfffbf5/vvvzaeffmq6du1qkpKSTMeOHY0xxnz99dcmMjLSGHPh/JJk5s+fb4wx5tNPPzXh4eH57uvPvv9u5MiR5tlnnzVjx441EyZMMOnp6SYsLMzs2rXLpe6/q1q1qtmwYUOB63v27GkmT55c4PqLnaOnT582/v7+5sCBA8YYY7766ivTsGHDPO1OnjxpIiIizEcffVTgfgDb5Hfu/fV3z5o1a0xERITz/V133WVCQ0NNZGSkCQgIMPXr1zfHjx83xlw4t8qVK2caNmxoBgwYYJYsWeLc7uuvvzZeXl4mMjLS+Ro8eHDRHhxuGB7FmK9QzObMmaPZs2fr7NmzOnv27BVN/fhz3n1YWJi8vLz0yCOPSLowXeXYsWM6fvy4c858fHy8JKl69eq688479e233yo0NFTShW+XJalWrVry8PDQwYMHlZmZqS1btqhr167O/Z04cUJbt251Gaq+mM6dOzunwvTp00dvvPGGRowYoT179uixxx7Tvn375OHhoWPHjmnPnj2qWbOmatasqe7du+uee+7RAw88oKCgIH311VfavXu37rvvPpf+t23bpsDAQJdlPXr0UHR0tP73f/9X+/fv1/bt2/Nst2LFCo0ePVpffPGF89sp4FoojPNeknr37q133nlH6enp6tu3r/bv319gWy8vLz388MOSpGbNmmnXrl1XtM+ePXvq7rvvVunSpdW5c+d8R2IKy6XOUW9vb3Xq1EmzZ8/WCy+8oHfffVe9evVyaZOdna0uXbronnvu4ToB3PQ2bNigsWPH6o8//pCHh4e2bdumM2fOOEdOJ0+erAcffFDGGI0aNUq9e/fWggUL1LJlS6WmpmrlypX67rvv1K9fPz344IP6z3/+I+n/pqsBf8d0tZvU6tWr9cYbb2jZsmXavHmzJk2adNHrW7788kvn9K2xY8c6l3t5eTn/XLJkSed7h8Mhh8OhnJycAvv8638c/t5PTk6OjDEqV66cy1zbPXv2qGfPnnn6On78+GVddPjnPrt27ar4+Hht3rxZGzduVOnSpXX27FmVLFlS33//vZ577jkdPnxYt912m1atWiVjjOrWretSS2pqqlq1aqUJEyY49/3ZZ58pKChIjRs31qJFi/Tee++pe/fu8vD4v+8TVq5cqV69emnJkiWKiIgosFagsBXWeS9JDz74oD777DP9/PPPat269UX36+np6Tz3SpYsqfPnz19R/YGBgapatapGjx6dJ1DMmjXLWetfp7xeifzO0fx+x/Tu3VtJSUk6efKkPvnkE5cpe+fOnVOXLl1UuXJlvf7661dVD3Cjy87O1sMPP6yJEydq8+bN+vbbbyVJWVlZedo6HA516dJFy5cvdy679dZbdf/99+vVV1/VggULXK4JBArCSM5NKj09XT4+PvL391d2drYSExMv2r5NmzZX/U1JUlKSRo0apZSUFK1ateqSdz6LiIiQr6+vkpKSnP+h2blzp8qVK6dy5crJx8dHGRkZKlOmjMqUKZNvffPnz9egQYPk7e2tpKQktWnTRtKF469WrZokKTk5Wenp6ZIujBSdOHFCd9xxh+644w5t2bJFGzZs0OOPP649e/boyy+/dPaxceNG1alTR8OGDdOwYcNc9turVy/NnDlT27Ztc7n+4Ntvv9Xjjz+uRYsWKTIy8oo+R+BKFeZ57+XlpcmTJ+sf//hHkY6o/N2YMWP0008/KSwszOU6lx49eqhHjx5X3X9B52h+v2OaNm0qSRo8eLDatGmjcuXKSbpwTUHXrl1Vrlw5TZs2jdFa3PTOnj2r7OxshYSESJL+/e9/X7T9ihUrnF8wfP7554qJiXFeo7N+/XrVqFGjaAuGFQg5N6l7771XycnJioiIkL+/v9q0aXPR6SaF4fz584qOjtapU6f0xhtvOKeqFcTDw0OffPKJnnvuOU2ePFnnz59XQECA89aRgwYN0t13361//OMf+vzzz1WhQoU8fcTExKht27Y6cuSImjVrpueee06S9Prrr+uRRx5RmTJl1KpVK+cv3oyMDD3yyCM6deqUHA6HatasqZ49e8rPz09Lly7V4MGDNWjQIJ07d04hISH53u5Wkjp27Kgnn3xSNWvWVO3atZ3L+/Tpo6ysLJdvoWfPnq369eu78UkCV6awz/s/p6AVpvj4eD399NPO93+/wUfjxo3VuHHjy+6vbdu2uuWWW5zvv//+e3355ZdKSEhQenq6Pv74Y02cOFFLlixRdHS02+dor169NGTIEH366afOZfPmzdNHH32kBg0aKDo6WpLUvHlz5/Qa4Gbw93MvISFBTZo0UUBAgMs09D89//zzGjVqlHJzc1W2bFnnzU02bdqkQYMGyRijEiVKqHLlykpOTnZut23bNueNTqQLNyZYtWpV0R0YbhgOY4wp7iJgP4fDofT09Is+0wIAAAAoDFyTAwAAAMAqTFfDNcGAIQAAAK4VRnIAAAAAWIWQAwAAAMAqhBwAAAAAViHkAAAAALAKIQcAAACAVQg5AAAAAKxCyAEAAABgFUIOAAAAAKv8f2t6EtmmblrhAAAAAElFTkSuQmCC\n"
},
"metadata": {}
},
{
"output_type": "display_data",
"data": {
"text/plain": [
"<Figure size 1000x500 with 1 Axes>"
],
"image/png": "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QAkSFRWlyMhIvfPOO5KkgoICBQUF6d///reGDh16xfinn35ae/fu1Zo1a6zLBg8erB9//FEbNmyQJA0dOlT/+9//tH79+qI5CDiVvd2A0/AAAABw08rLy9PWrVvVtm1b67JSpUqpbdu22rRpk+lnYmJitHXrVuuper/++quWL1+u++67zzpmyZIlioiIULdu3VSlShU1atRIH3zwQeEeDIocp+EBAADgpnX69GldunRJVatWtVletWpV/fLLL6afeeSRR3T69GndeeedMgxD+fn5evzxxzV8+HDrmF9//VXvvfee4uPjNXz4cP3000965plnVKZMGfXp06dQjwlFh5klAAAA4E++++47TZw4Ue+++662bdumzz//XF999ZXGjRtnHVNQUKDGjRtr4sSJatSokQYOHKgBAwZoxowZLkwOZ2NmCQAAADetypUry83NTSdOnLBZfuLECVWrVs30My+//LIeffRR9e/fX5LUoEEDZWdna+DAgRoxYoRKlSolPz8/1atXz+ZzdevW1aJFiwrnQOASzCwBAADgplWmTBk1adLE5mYNBQUFWrNmjaKjo00/c/78eZUqZfvPZDc3N0nSH/dGa9asmfbt22czJjk5WdWrV3dmfLgYM0sAAAC4qcXHx6tPnz6KiIhQ06ZNNW3aNGVnZysuLk6S1Lt3bwUEBGjSpEmSpI4dO2rq1Klq1KiRoqKidODAAb388svq2LGjtTQ9//zziomJ0cSJE/Xwww9r8+bNev/99/X++++77DjhfJQlAAAA3NRiY2N16tQpjRo1SmlpaQoPD9fKlSutN31ISUmxmUkaOXKkLBaLRo4cqaNHj+rWW29Vx44dNWHCBOuYyMhILV68WMOGDdMrr7yimjVratq0aerZs2eRHx8KD89ZAgAAAFCi8JwlAAAAALgOnIYHAADgBCP8Wrk6AlDsTTj+rasjOISZJQAAAAAwQVkCAAAAABOUJQAAAAAwQVkCAAAAABOUJQAAAAAwQVkCAAAAABOUJQAAAAAwQVkCAAAAABOUJQAAAAAwQVkCAAAAABOUJQAAAAAwQVkCAAAAABOUJQAAAAAwQVkCAAAAABOUJQAAAAAwQVkCAAAAABOUJQAAAAAwQVkCAAAAABOUJQAAAAAwQVkCAAAAABOUJQAAAAAw4bKytH//fsXExCg0NFSRkZFKSkq6YkxBQYHi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6giSLncDHx+fv+0GDs0spaamavHixUpOTr5i3aeffurQdvz8/Kx307NYLAoODlZKSorNuJ9//lkeHh66//77FR4ert69e+vUqVN27WPSpEny8fGxvnhwLgDgr6ZPn64aNWqobNmyf3tn148++kgWi8XmVbZsWZsxf13/x+vVV18t7EMBABQCu8vSN998o3r16mnkyJEKCwvTv//9bxUUFFjXDxo0yOnh8vPztXr1as2cOVPbt29XQECAnnjiCbs+O2zYMGVkZFhfqampTs8HALhxzZ8/X/Hx8Ro9erS2bdumhg0bqn379jp58uRVP+Pt7a3jx49bX7/99pvN+j+vO378uBISEmSxWNS1a9fCPhwAQCGwuyyNGDFCs2fPVlJSkn799Vft2LFD3bt3txYmR87mCwoK0vHjx5Wfn2/9bEpKioKDg23GBQcHq1WrVgoICJDFYlGvXr30ww8/2LUPDw8PeXt727wAAPjD1KlTNWDAAMXFxalevXqaMWOGypUrp4SEhKt+xmKxqFq1atZX1apVbdb/eV21atX05ZdfqlWrVrrtttsK+3AAAIXA7rKUnJysLl26SJL8/f21evVqZWdnq2vXrrp48aJDO61SpYoaN26suXPnSpIWLVqkwMBAm+uVJOnhhx/WTz/9pMzMTEnS8uXL1bBhQ4f2BQDAX+Xl5Wnr1q1q27atdVmpUqXUtm3bKx6P8WdZWVmqXr26goKC1KlTp6veyVWSTpw4oa+++kqPPfaYU7MDAIqO3WWpfPnySktLs7738PDQF198IcMw1KlTJ4dmliRp5syZmjlzpkJDQzV58mQlJiZKkvr3768lS5ZIujyzNHz4cMXExCgsLExr167VjBkzHNoPAAB/dfr0aV26dOmKmaGqVava/L/uz2rXrq2EhAR9+eWXmjt3rgoKChQTE6MjR46Yjv/444/l5eWlBx980On5AQBFw93egS1atNC8efMUHx9vXVa6dGktWLBA3bp104ULFxzace3atU1/e/fhhx/avH/00Uf16KOPOrRtAACcLTo6WtHR0db3MTExqlu3rmbOnGn6rMGEhAT17NnziptAAABuHHaXpWnTpikrK+uK5aVLl9bChQu1ceNGpwYDAKCwVK5cWW5ubjpx4oTN8hMnTqhatWp2baN06dJq1KiRDhw4cMW69evXa9++fZo/f75T8gIAXMPu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AAAAUKQcvsFDQEAA5QgAAADATc/h5ywBAAAAQElAWQIAAAAAE5QlAAAAADBx3WXpwoULV9xOHAAAAABudA6XpSFDhuinn36SJH311VeqWLGiKlSooOXLlzs9HAAAAAC4isNlac6cOapfv74k6ZVXXlFCQoIWLFigYcOGOT0cAAAAALiKw7cOz8rKUrly5fT7779r//796t69uywWi3r06FEY+QAAAADAJRwuSzVq1NC8efO0f/9+tWrVShaLRWfPnlXp0qULIx8AAAAAuITDZWnKlCnq16+fPDw8tHjxYknSsmXL1LRpU6eHAwAAAABXcbgs3XPPPTp27JjNstjYWMXGxjotFAAAAAC4msNlSbp83VJycrKysrJsljdv3twpoQAAAADA1RwuS/PmzdOgQYNUqlQplStXzrrcYrFcMeMEAAAAADcqh8vSkCFDNHv2bHXp0qUw8gAAAABAseDwc5YuXLigTp06FUYWAAAAACg2HC5Ljz/+uGbMmFEYWQAAAACg2HD4NLw1a9Zo69ateu2111StWjWbdRs3bnRaMAAAAABwJYfL0uOPP14YOQAAAACgWHG4LPXp06cwcgAAAABAsfKPnrO0du1affzxxzp69KgCAgLUu3dvtWnTxtnZAAAAAMBlHL7BQ0JCgmJjY+Xv769u3brJ399fPXr00KxZswojHwAAAAC4hMMzS1OmTNHKlSvVpEkT67Ju3bqpR48eeuyxx5waDgAAAABcxeGZpZMnT6phw4Y2yxo0aKCTJ086LRQAAAAAuJrDZSkiIkITJkyQYRiSJMMwNGnSJJuZJgAAAAC40Tl8Gt706dN1//33691331VgYKCOHDkiX19fLV26tDDyAQAAAIBLOFyWatWqpaSkJP3www86duyYAgICFBUVJXd3xza1f/9+9enTR6dPn5aPj48++ugj1a9f33SsYRhq06aNtm3bprNnzzoaGQAAAAAc9o9uHe7u7q4777zzunY8aNAgDRw4UH379tXChQvVt29f/fTTT6Zj33jjDd1+++3atm3bde0TAAAAAOxl1zVLtWrVsv7s5+cnf39/05e9Tp48qS1btqhXr16SpK5duyo1NVUHDhy4YmxSUpK++OILDR061O7tAwAAAMD1smtmKTEx0frzZ599dt07TU1NlZ+fn/XUPYvFouDgYKWkpCgkJMQ67uLFixowYIBm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9fXCCy8U7sHhhuDuwp6Gm8i8efM0Z84c5eTkKCcn5x+d1vLHtQkhISEqW7asHnroIUmXT8U5c+aMzp49a72uoH///pKk2267Tc2bN9f333+vGjVqSLr8G29JqlOnjtzd3ZWWlqbMzEwlJSWpe/fu1v2dO3dOP//8s80U/LU8/PDD1tN8HnvsMb311lsaPny4Dh06pJ49e+rIkSNyd3fXmTNndOjQIdWqVUu1atVSr169dPfdd6tDhw4KDAzU2rVr9euvv+ree++12f6+ffsUEBBgs6x3795q1KiRXn/9dR09elTJyclXfG7NmjUaO3asvvnmG+tvy4DC5ozvvCT169dPs2bNUnp6ugYOHKijR49edWzZsmX14IMPSpKio6N18ODBf7TPPn36qF27dipfvrwefvhh05khZ/m776enp6e6du2qOXPm6MUXX9RHH32kuLg4mzF5eXmKjY3V3XffzTUUgKTt27drwoQJ+v333+Xu7q59+/bpwoUL1tncN954Q507d5ZhGBozZoz69eunRYsWqVWrVkpJSdG6deu0ceNGDRo0SJ07d9b06dMl/f9peMCfcRoertuGDRv01ltvafny5dqzZ4+mTp16zet/Vq9ebT0tbcKECdblZcuWtf7s5uZmfW+xWGSxWJSfn3/Vbf75HyF/3U5+fr4Mw1DFihVtzkU+dOiQ+vTpc8W2zp49a9fFnX/ss3v37urfv7/27NmjHTt2qHz58srJyZGbm5t++OEHPffcczp58qT+9a9/af369TIMQ/Xr17fJkpKSotatW2vy5MnWfX/99dcKDAxURESEvvzyS3388cfq1auX3N3//3cc69atU1xcnJYuXaratWtfNSvgTM76zktS586d9fXXX2vnzp1q06bNNffr4eFh/d65ubnp0qVL/yh/QECAqlevrrFjx15RTGbPnm3N+ufTeP8Js++n2d8v/fr1U2JiorKysrRs2TKbUxEvXryo2NhY+fn56c0337yuPMDNIC8vTw8++KBee+017dmzR99//70kKTc394qxFotFsbGxWrlypXXZLbfcovvuu0/jx4/XokWLbK6bBMwws4Trlp6eLi8vL1WqVEl5eXmaOXPmNce3bdv2un9zk5iYqDFjxujw4cNav379396prnbt2vL29lZiYqL1H0cHDhxQxYoVVbFiRXl5eSkjI0O+vr7y9fU1zbdw4UINHjxYnp6eSkxMVNu2bSVdPv6aNWtKkubOnav09HRJl2euzp07p7vuukt33XWXkpKStH37dj366KM6dOiQVq9ebd3Gjh07VK9ePQ0dOlRDhw612W9cXJwSEhK0b98+m2s0vv/+ez366KP68ssv1bBhw3/05wj8E878zpctW1ZvvPGGypUrV6gzPH81btw4bdu2TSEhITbXAfXu3Vu9e/e+7u1f7ftp9vdLVFSUJOmFF15Q27ZtVbFiRUmXr7fo3r27KlasqPfff5+ZY0BSTk6O8vLyFBwcLEl6++23rzl+zZo11l9WrFq1SpGRkdZrmLZu3arbb7+9cAPjhkdZwnW75557NHfuXNWuXVuVKlVS27Ztr3kqjTNcunRJjRo1UnZ2tt566y3rKXhX4+7urmXLlum5557TG2+8oUuXLqly5crWW4YOHjxY7dq1U7ly5bRq1SpVqVLlim1ERkaqffv2OnXqlKKjo/Xcc89Jkt5880099NBD8vX1VevWra1/gWdkZOihhx5Sdna2LBaLatWqpT59+sjHx0dfffWVXnjhBQ0ePFgXL15UcHCw6a2OJalTp0564oknVKtWLdWtW9e6/LHHHlNubq7Nb8bnzJmjBg0aOPAnCTjO2d/5P06tc6b+/fvr6aeftr7/601UIiIiFBERYff22rdvr9KlS1vf//DDD1q9erVGjhyp9PR0ffHFF3rttde0dOlSNWrUyOHvZ1xcnF566SWtWLHCumz+/Pn6/PPPFRYWpkaNGkmSmjVrZj1lCCgp/vr9GzlypJo2barKlSvbnF7/h+eff15jxoxRQUGBKlSoYL2RzO7duzV48GAZhqFSpUrJz89Pc+fOtX5u37591pvKSJdvALF+/frCOzDcECyGYRiuDgE4wmKxKD09/ZrPRQEAAACuF9csAQAAAIAJTsPDDYfJUAAAABQFZpYAAAAAwARlCQAAAABMUJYAAAAAwARlCQAAAABMUJYAAAAAwARlCQAAAABMUJYAAAAAwARlCQAAAABM/B9AT9bUyzJOPQAAAABJRU5ErkJggg==\n"
},
"metadata": {}
}
]
},
{
"cell_type": "code",
"source": [
"import pandas\n",
"\n",
"df = pandas.read_csv(\"output.csv\")\n",
"df"
],
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 143
},
"id": "s1oMfJTISTiu",
"outputId": "2874dcb6-bf82-4ed2-ae48-6a159b452454"
},
"execution_count": null,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
" encoder average_time stdev_time success_rate average_mrr \\\n",
"0 all-mpnet-base-v2 0.088780 0.008858 0.563910 0.863963 \n",
"1 all-MiniLM-L12-v2 0.084532 0.006249 0.618779 0.899888 \n",
"2 LaBSE 0.084858 0.007063 0.788931 0.922809 \n",
"\n",
" stdev_mrr carbon_emissions(g_CO2eq) \n",
"0 0.247843 0.300420 \n",
"1 0.204298 0.573104 \n",
"2 0.203723 0.858473 "
],
"text/html": [
"\n",
" <div id=\"df-ad879b3b-a134-457a-a0c7-7ee8d7be502f\" class=\"colab-df-container\">\n",
" <div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>encoder</th>\n",
" <th>average_time</th>\n",
" <th>stdev_time</th>\n",
" <th>success_rate</th>\n",
" <th>average_mrr</th>\n",
" <th>stdev_mrr</th>\n",
" <th>carbon_emissions(g_CO2eq)</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>all-mpnet-base-v2</td>\n",
" <td>0.088780</td>\n",
" <td>0.008858</td>\n",
" <td>0.563910</td>\n",
" <td>0.863963</td>\n",
" <td>0.247843</td>\n",
" <td>0.300420</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>all-MiniLM-L12-v2</td>\n",
" <td>0.084532</td>\n",
" <td>0.006249</td>\n",
" <td>0.618779</td>\n",
" <td>0.899888</td>\n",
" <td>0.204298</td>\n",
" <td>0.573104</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>LaBSE</td>\n",
" <td>0.084858</td>\n",
" <td>0.007063</td>\n",
" <td>0.788931</td>\n",
" <td>0.922809</td>\n",
" <td>0.203723</td>\n",
" <td>0.858473</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>\n",
" <div class=\"colab-df-buttons\">\n",
"\n",
" <div class=\"colab-df-container\">\n",
" <button class=\"colab-df-convert\" onclick=\"convertToInteractive('df-ad879b3b-a134-457a-a0c7-7ee8d7be502f')\"\n",
" title=\"Convert this dataframe to an interactive table.\"\n",
" style=\"display:none;\">\n",
"\n",
" <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\">\n",
" <path d=\"M120-120v-720h720v720H120Zm60-500h600v-160H180v160Zm220 220h160v-160H400v160Zm0 220h160v-160H400v160ZM180-400h160v-160H180v160Zm440 0h160v-160H620v160ZM180-180h160v-160H180v160Zm440 0h160v-160H620v160Z\"/>\n",
" </svg>\n",
" </button>\n",
"\n",
" <style>\n",
" .colab-df-container {\n",
" display:flex;\n",
" gap: 12px;\n",
" }\n",
"\n",
" .colab-df-convert {\n",
" background-color: #E8F0FE;\n",
" border: none;\n",
" border-radius: 50%;\n",
" cursor: pointer;\n",
" display: none;\n",
" fill: #1967D2;\n",
" height: 32px;\n",
" padding: 0 0 0 0;\n",
" width: 32px;\n",
" }\n",
"\n",
" .colab-df-convert:hover {\n",
" background-color: #E2EBFA;\n",
" box-shadow: 0px 1px 2px rgba(60, 64, 67, 0.3), 0px 1px 3px 1px rgba(60, 64, 67, 0.15);\n",
" fill: #174EA6;\n",
" }\n",
"\n",
" .colab-df-buttons div {\n",
" margin-bottom: 4px;\n",
" }\n",
"\n",
" [theme=dark] .colab-df-convert {\n",
" background-color: #3B4455;\n",
" fill: #D2E3FC;\n",
" }\n",
"\n",
" [theme=dark] .colab-df-convert:hover {\n",
" background-color: #434B5C;\n",
" box-shadow: 0px 1px 3px 1px rgba(0, 0, 0, 0.15);\n",
" filter: drop-shadow(0px 1px 2px rgba(0, 0, 0, 0.3));\n",
" fill: #FFFFFF;\n",
" }\n",
" </style>\n",
"\n",
" <script>\n",
" const buttonEl =\n",
" document.querySelector('#df-ad879b3b-a134-457a-a0c7-7ee8d7be502f button.colab-df-convert');\n",
" buttonEl.style.display =\n",
" google.colab.kernel.accessAllowed ? 'block' : 'none';\n",
"\n",
" async function convertToInteractive(key) {\n",
" const element = document.querySelector('#df-ad879b3b-a134-457a-a0c7-7ee8d7be502f');\n",
" const dataTable =\n",
" await google.colab.kernel.invokeFunction('convertToInteractive',\n",
" [key], {});\n",
" if (!dataTable) return;\n",
"\n",
" const docLinkHtml = 'Like what you see? Visit the ' +\n",
" '<a target=\"_blank\" href=https://colab.research.google.com/notebooks/data_table.ipynb>data table notebook</a>'\n",
" + ' to learn more about interactive tables.';\n",
" element.innerHTML = '';\n",
" dataTable['output_type'] = 'display_data';\n",
" await google.colab.output.renderOutput(dataTable, element);\n",
" const docLink = document.createElement('div');\n",
" docLink.innerHTML = docLinkHtml;\n",
" element.appendChild(docLink);\n",
" }\n",
" </script>\n",
" </div>\n",
"\n",
"\n",
"<div id=\"df-15a429d4-99ce-4a6b-8bb6-524d449b5228\">\n",
" <button class=\"colab-df-quickchart\" onclick=\"quickchart('df-15a429d4-99ce-4a6b-8bb6-524d449b5228')\"\n",
" title=\"Suggest charts\"\n",
" style=\"display:none;\">\n",
"\n",
"<svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\"viewBox=\"0 0 24 24\"\n",
" width=\"24px\">\n",
" <g>\n",
" <path d=\"M19 3H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zM9 17H7v-7h2v7zm4 0h-2V7h2v10zm4 0h-2v-4h2v4z\"/>\n",
" </g>\n",
"</svg>\n",
" </button>\n",
"\n",
"<style>\n",
" .colab-df-quickchart {\n",
" --bg-color: #E8F0FE;\n",
" --fill-color: #1967D2;\n",
" --hover-bg-color: #E2EBFA;\n",
" --hover-fill-color: #174EA6;\n",
" --disabled-fill-color: #AAA;\n",
" --disabled-bg-color: #DDD;\n",
" }\n",
"\n",
" [theme=dark] .colab-df-quickchart {\n",
" --bg-color: #3B4455;\n",
" --fill-color: #D2E3FC;\n",
" --hover-bg-color: #434B5C;\n",
" --hover-fill-color: #FFFFFF;\n",
" --disabled-bg-color: #3B4455;\n",
" --disabled-fill-color: #666;\n",
" }\n",
"\n",
" .colab-df-quickchart {\n",
" background-color: var(--bg-color);\n",
" border: none;\n",
" border-radius: 50%;\n",
" cursor: pointer;\n",
" display: none;\n",
" fill: var(--fill-color);\n",
" height: 32px;\n",
" padding: 0;\n",
" width: 32px;\n",
" }\n",
"\n",
" .colab-df-quickchart:hover {\n",
" background-color: var(--hover-bg-color);\n",
" box-shadow: 0 1px 2px rgba(60, 64, 67, 0.3), 0 1px 3px 1px rgba(60, 64, 67, 0.15);\n",
" fill: var(--button-hover-fill-color);\n",
" }\n",
"\n",
" .colab-df-quickchart-complete:disabled,\n",
" .colab-df-quickchart-complete:disabled:hover {\n",
" background-color: var(--disabled-bg-color);\n",
" fill: var(--disabled-fill-color);\n",
" box-shadow: none;\n",
" }\n",
"\n",
" .colab-df-spinner {\n",
" border: 2px solid var(--fill-color);\n",
" border-color: transparent;\n",
" border-bottom-color: var(--fill-color);\n",
" animation:\n",
" spin 1s steps(1) infinite;\n",
" }\n",
"\n",
" @keyframes spin {\n",
" 0% {\n",
" border-color: transparent;\n",
" border-bottom-color: var(--fill-color);\n",
" border-left-color: var(--fill-color);\n",
" }\n",
" 20% {\n",
" border-color: transparent;\n",
" border-left-color: var(--fill-color);\n",
" border-top-color: var(--fill-color);\n",
" }\n",
" 30% {\n",
" border-color: transparent;\n",
" border-left-color: var(--fill-color);\n",
" border-top-color: var(--fill-color);\n",
" border-right-color: var(--fill-color);\n",
" }\n",
" 40% {\n",
" border-color: transparent;\n",
" border-right-color: var(--fill-color);\n",
" border-top-color: var(--fill-color);\n",
" }\n",
" 60% {\n",
" border-color: transparent;\n",
" border-right-color: var(--fill-color);\n",
" }\n",
" 80% {\n",
" border-color: transparent;\n",
" border-right-color: var(--fill-color);\n",
" border-bottom-color: var(--fill-color);\n",
" }\n",
" 90% {\n",
" border-color: transparent;\n",
" border-bottom-color: var(--fill-color);\n",
" }\n",
" }\n",
"</style>\n",
"\n",
" <script>\n",
" async function quickchart(key) {\n",
" const quickchartButtonEl =\n",
" document.querySelector('#' + key + ' button');\n",
" quickchartButtonEl.disabled = true; // To prevent multiple clicks.\n",
" quickchartButtonEl.classList.add('colab-df-spinner');\n",
" try {\n",
" const charts = await google.colab.kernel.invokeFunction(\n",
" 'suggestCharts', [key], {});\n",
" } catch (error) {\n",
" console.error('Error during call to suggestCharts:', error);\n",
" }\n",
" quickchartButtonEl.classList.remove('colab-df-spinner');\n",
" quickchartButtonEl.classList.add('colab-df-quickchart-complete');\n",
" }\n",
" (() => {\n",
" let quickchartButtonEl =\n",
" document.querySelector('#df-15a429d4-99ce-4a6b-8bb6-524d449b5228 button');\n",
" quickchartButtonEl.style.display =\n",
" google.colab.kernel.accessAllowed ? 'block' : 'none';\n",
" })();\n",
" </script>\n",
"</div>\n",
"\n",
" <div id=\"id_07774427-35a9-45fa-9ec5-f9aa1833d372\">\n",
" <style>\n",
" .colab-df-generate {\n",
" background-color: #E8F0FE;\n",
" border: none;\n",
" border-radius: 50%;\n",
" cursor: pointer;\n",
" display: none;\n",
" fill: #1967D2;\n",
" height: 32px;\n",
" padding: 0 0 0 0;\n",
" width: 32px;\n",
" }\n",
"\n",
" .colab-df-generate:hover {\n",
" background-color: #E2EBFA;\n",
" box-shadow: 0px 1px 2px rgba(60, 64, 67, 0.3), 0px 1px 3px 1px rgba(60, 64, 67, 0.15);\n",
" fill: #174EA6;\n",
" }\n",
"\n",
" [theme=dark] .colab-df-generate {\n",
" background-color: #3B4455;\n",
" fill: #D2E3FC;\n",
" }\n",
"\n",
" [theme=dark] .colab-df-generate:hover {\n",
" background-color: #434B5C;\n",
" box-shadow: 0px 1px 3px 1px rgba(0, 0, 0, 0.15);\n",
" filter: drop-shadow(0px 1px 2px rgba(0, 0, 0, 0.3));\n",
" fill: #FFFFFF;\n",
" }\n",
" </style>\n",
" <button class=\"colab-df-generate\" onclick=\"generateWithVariable('df')\"\n",
" title=\"Generate code using this dataframe.\"\n",
" style=\"display:none;\">\n",
"\n",
" <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\"viewBox=\"0 0 24 24\"\n",
" width=\"24px\">\n",
" <path d=\"M7,19H8.4L18.45,9,17,7.55,7,17.6ZM5,21V16.75L18.45,3.32a2,2,0,0,1,2.83,0l1.4,1.43a1.91,1.91,0,0,1,.58,1.4,1.91,1.91,0,0,1-.58,1.4L9.25,21ZM18.45,9,17,7.55Zm-12,3A5.31,5.31,0,0,0,4.9,8.1,5.31,5.31,0,0,0,1,6.5,5.31,5.31,0,0,0,4.9,4.9,5.31,5.31,0,0,0,6.5,1,5.31,5.31,0,0,0,8.1,4.9,5.31,5.31,0,0,0,12,6.5,5.46,5.46,0,0,0,6.5,12Z\"/>\n",
" </svg>\n",
" </button>\n",
" <script>\n",
" (() => {\n",
" const buttonEl =\n",
" document.querySelector('#id_07774427-35a9-45fa-9ec5-f9aa1833d372 button.colab-df-generate');\n",
" buttonEl.style.display =\n",
" google.colab.kernel.accessAllowed ? 'block' : 'none';\n",
"\n",
" buttonEl.onclick = () => {\n",
" google.colab.notebook.generateWithVariable('df');\n",
" }\n",
" })();\n",
" </script>\n",
" </div>\n",
"\n",
" </div>\n",
" </div>\n"
],
"application/vnd.google.colaboratory.intrinsic+json": {
"type": "dataframe",
"variable_name": "df",
"summary": "{\n \"name\": \"df\",\n \"rows\": 3,\n \"fields\": [\n {\n \"column\": \"encoder\",\n \"properties\": {\n \"dtype\": \"string\",\n \"num_unique_values\": 3,\n \"samples\": [\n \"all-mpnet-base-v2\",\n \"all-MiniLM-L12-v2\",\n \"LaBSE\"\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"average_time\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 0.0023638000490553636,\n \"min\": 0.0845320963523757,\n \"max\": 0.0887795502978159,\n \"num_unique_values\": 3,\n \"samples\": [\n 0.0887795502978159,\n 0.0845320963523757,\n 0.084858046016371\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"stdev_time\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 0.001334747383517496,\n \"min\": 0.0062489901557313,\n \"max\": 0.0088576465265527,\n \"num_unique_values\": 3,\n \"samples\": [\n 0.0088576465265527,\n 0.0062489901557313,\n 0.007062568213633\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"success_rate\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 0.11732893738172075,\n \"min\": 0.5639097744360902,\n \"max\": 0.7889305816135085,\n \"num_unique_values\": 3,\n \"samples\": [\n 0.5639097744360902,\n 0.6187793427230047,\n 0.7889305816135085\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"average_mrr\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 0.02966144175636733,\n \"min\": 0.8639629200463499,\n \"max\": 0.922808764940239,\n \"num_unique_values\": 3,\n \"samples\": [\n 0.8639629200463499,\n 0.8998880179171332,\n 0.922808764940239\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"stdev_mrr\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 0.02530814109952007,\n \"min\": 0.2037232676292717,\n \"max\": 0.2478427735214869,\n \"num_unique_values\": 3,\n \"samples\": [\n 0.2478427735214869,\n 0.2042979579129214,\n 0.2037232676292717\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"carbon_emissions(g_CO2eq)\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 0.2790506155520329,\n \"min\": 0.3004195612948157,\n \"max\": 0.8584727451612353,\n \"num_unique_values\": 3,\n \"samples\": [\n 0.3004195612948157,\n 0.5731041423229954,\n 0.8584727451612353\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n }\n ]\n}"
}
},
"metadata": {},
"execution_count": 9
}
]
},
{
"cell_type": "markdown",
"source": [
"## Other use cases for SenTrEv\n",
"\n",
"### 1. Upload PDFs to Qdrant\n",
"\n",
"You can use SenTrEv to chunk, vectorize and upload your PDFs to a Qdrant database.\n",
"\n",
"You can also play around with the `chunking_size` argument (default is 1000) and with the `distance` argument (default is `cosine`).\n"
],
"metadata": {
"id": "HThUNcMGSd7N"
}
},
{
"cell_type": "code",
"source": [
"from sentrev.evaluator import upload_pdfs\n",
"\n",
"pdfs.reverse()\n",
"\n",
"data, collection_name = upload_pdfs(pdfs=pdfs, encoder=encoder1, client=client)"
],
"metadata": {
"id": "ehL4IlecS1Ox"
},
"execution_count": null,
"outputs": []
},
{
"cell_type": "markdown",
"source": [
"#### 2. Implement semantic search on a Qdrant collection\n",
"\n",
"You can also search already-existent collections in a Qdrant database with SenTrEv.\n",
"\n",
"The results will be returned as a list of payloads (the metadata you uploaded to the Qdrant collection along with the vector points).\n",
"\n",
"If you used SenTrEv `upload_pdfs` function, you should be able to access the results in this way:\n",
"\n",
"```python\n",
"text = res[0][\"text\"]\n",
"source = res[0][\"source\"]\n",
"page = res[0][\"page\"]\n",
"```\n"
],
"metadata": {
"id": "c20ATJ8JUNF1"
}
},
{
"cell_type": "code",
"source": [
"from sentrev.utils import NeuralSearcher\n",
"text = \"\"\" Encoder: The encoder is composed of a stack of N = 6 identical layers. Each layer has two\n",
"sub-layers. The first is a multi-head self-attention mechanism, and the second is a simple, position-wise fully connected feed-forward network\"\"\"\n",
"searcher = NeuralSearcher(client=client, model=encoder1, collection_name=collection_name)\n",
"res = searcher.search(text, limit=5)"
],
"metadata": {
"id": "n43He0u5ULQo"
},
"execution_count": null,
"outputs": []
},
{
"cell_type": "code",
"source": [
"text = res[0][\"text\"]\n",
"source = res[0][\"source\"]\n",
"page = res[0][\"page\"]"
],
"metadata": {
"id": "T1VCARZQU8Lv"
},
"execution_count": null,
"outputs": []
},
{
"cell_type": "code",
"source": [
"print(\"TEXT: \"+text+\"\\nSOURCE: \"+source+\"\\nPAGE: \"+page)"
],
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "_B3uvhFiVDXB",
"outputId": "a8491b86-af0f-485c-f2ec-bdb6526ebceb"
},
"execution_count": null,
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": [
"TEXT: Encoder: The encoder is composed of a stack of N= 6 identical layers. Each layer has two\n",
"SOURCE: data/generative_adversaria_nets_results.pdf\n",
"PAGE: 2\n"
]
}
]
},
{
"cell_type": "markdown",
"source": [
"### And that's all: Thanks for your attention!😊"
],
"metadata": {
"id": "mpEm2aitTXXb"
}
}
]
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment