diff --git a/examples/aop_categorization/__init__.py b/examples/aop_categorization/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/examples/aop_categorization/aop_wiki_organs.ipynb b/examples/aop_categorization/aop_wiki_organs.ipynb new file mode 100644 index 00000000..66278571 --- /dev/null +++ b/examples/aop_categorization/aop_wiki_organs.ipynb @@ -0,0 +1,124 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 17, + "id": "6fae9188", + "metadata": {}, + "outputs": [], + "source": [ + "from aoptk.literature.databases.aop_wiki import AOPWiki\n", + "\n", + "abstracts = AOPWiki().get_abstracts()" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "id": "40cbd6ed", + "metadata": {}, + "outputs": [], + "source": [ + "from pathlib import Path\n", + "from aoptk.text_generation_api import TextGenerationAPI\n", + "\n", + "organ_list = [\n", + " \"Cardiovascular\",\n", + " \"Dermal\",\n", + " \"Development\",\n", + " \"Endocrine\",\n", + " \"Gastrointestinal\",\n", + " \"Hematologic\",\n", + " \"Hepatic\",\n", + " \"Immune\",\n", + " \"Musculoskeletal\",\n", + " \"Nervous\",\n", + " \"Ocular\",\n", + " \"Other\",\n", + " \"Reproductive\",\n", + " \"Respiratory\",\n", + " \"Urinary\",\n", + "]\n", + "\n", + "TextGenerationAPI().specification_categorization_prompt = Path(\n", + " \"prompt_specification.txt\",\n", + ").read_text(encoding=\"utf-8\")\n", + "\n", + "results = []\n", + "for abstract in abstracts:\n", + " abstract_id = abstract.id\n", + " category = TextGenerationAPI().categorize_text(abstract, organ_list)\n", + " results.append((abstract_id, abstract, category))" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "id": "3b169801", + "metadata": {}, + "outputs": [], + "source": [ + "import pandas as pd\n", + "\n", + "df = pd.DataFrame(results, columns=[\"abstract_id\", \"abstract\", \"category\"])\n", + "df.to_excel(\"aop_organs.xlsx\", index=False)" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "id": "d5cd55e3", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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JUl2dnbKnTu3qlSpor59+8rZ2dnG0QEAAABA6p76pDssLEwODg7KkyfPQ+nv/PnzcnJyUu7cuTPVPjY2ViEhISpRooTs7a17ocGj3JY1ZcmSRT169DCXz58/rxkzZmjWrFnatWuX3N3dbRgdAAAAAKQuQ0n3xYsXFRkZqTx58ihHjhwW66KiohQeHi5XV1cVKFDgYcb4QAYPHiwvLy/Nnj37ofTXp08f1ahRQ1OnTs1U+6NHj6pq1aq6dOlSun8IiImJ0dmzZzOcPGdmW48je3t7de3a1aKsS5cuKly4sBYvXqzhw4fbKDIAAAAASFuGhj/ffPNNlSpVSv3790+2bsyYMSpVqpT69ev30ILDHYcPH1apUqUUGRlp61AeG4UKFZKHh4dCQ0NtHQoAAAAApCrD1xyXLVtWv/76qy5evGiW3bp1SytWrFD58uUt6p49e1bXr1+3KAsPD9elS5csyhITE3XhwgXFxcWluM3Y2FidO3dOhmFkqv+UREZG6uzZs0pISEhx/f1iultoaKjOnj2bLI57Y7uflNrEx8ebieXp06d18uRJhYeHKyEhQSdPntTJkyd15syZVPfjabV582Zdv35drVu3tnUoAAAAAJCqDCfdRYoUUcOGDfXtt9+aZStXrpS3t7eqVKliUfe5557T119/bVE2fPhwjR8/3lz+6quvlCdPHlWvXl158uTRK6+8olu3bkmSbt++rSFDhsjDw0NVq1aVp6enli9fnqH+73X9+nV17txZefLkUZUqVeTp6anFixdb1EkrpnvNnj1bFStWVFBQkCTp77//VtmyZVWmTBkVL15clStX1v79+1ON535twsPDNWzYMEl3Lqlu3bq1pkyZomvXrql169Zq3bq1GjRooOzZs2vIkCGKj49Pc1tPsjVr1qhr165q2LChevTooe+//17NmjWzdVgAAAAAkKpMza41YMAALVq0yFz++uuvNWDAgAz3c+3aNQ0ePFjfffedzp8/rytXrqhOnTo6c+aMJGnYsGH67bfftHfvXl28eFEBAQHmusx64403FBQUpLNnz+rKlSuaOXOmXn75ZR08eDBdMd1t0qRJev/997VlyxY1btxYp06d0nPPPad33nlH165d09WrV/XCCy+oU6dOunnzZorx3K9NoUKFtHr1aknS/v37dfLkSc2cOVN58uQxR7pDQkJ07Ngx/f77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7dpydHS0dSiPHcMw1K9fP/n5+alBgwa2DgcAAADAM8rmSXdmJCQk6H//+59OnjypxMREi3VRUVHatWuXDMPQjRs3dOjQIUVERJjrw8PDdejQIUVHR1u0i4uL065du7Rr1y7t27dPV69etVgfExOjI0eOSJL27t2rXbt2WYzCR0dH6+DBgzp16lS69yM9ba5cuaLDhw8rOjravCogNjZWklSoUCHNnDlTrq6uFm0SExN17NgxnT59Ot2xPG1mzZqlkydPaurUqbYOBQAAAMAz7IlLutetWycvLy916tRJrVu3VrFixfTXX3+Z6//77z/VrVtXL730knx8fNS1a1flz59fy5cv14ABA1S9enU9//zzKlKkiP7991+zXVRUlEaMGKERI0Zo4MCBKly4sF544QXFxMRIkq5evapPP/1UkjR+/HiNGDFCS5YskSQtWLBA+fLlU7du3VS9enXVqFFDISEhae5HetpMmTJFBQsWVLdu3VSoUCENGzZMdevWNe9NTuny8rVr18rLy0uNGzdW8+bNVa9ePZ07dy7zB/wJdPz4cY0fP14LFixQ9uzZbR0OAAAAgGfYY5N0Hz161BxpTnrde593QECA/Pz8tGTJEp04cUInT57UW2+9pe7duyermy1bNoWGhiowMFB9+/ZV79695erqqrNnz+rkyZNq06aNJkyYYNbPlSuXud39+/crJCRER48e1axZsyRJBQoU0OLFiyVJmzdv1q5duzR58mQdOXJEQ4YM0cKFC3XixAmdP39ebm5uGjhwYKr7mp42Bw4c0FtvvaXVq1fr2LFjCg4O1oEDB9I8hocPH1a3bt00evRohYWFKSgoSJ999pnOnj2bYv2YmBhFRkZavJ50iYmJevHFF9W9e3e1bt3a1uEAAAAAeMY52DqAJLNnz5a7u7tF2fHjx1WiRAlz+auvvlK5cuWUK1cu7dmzR4ZhqEqVKoqMjNS///6r5s2bm3UnTJgge/s7vym0bdtW8+fP19tvvy07OztJUps2bTRixIhkcVy9elVnz55VdHS06tSpo23btmnMmDGpxr148WJVq1ZN3bt3l3Qn2X///ffVsGFDhYaGysvLK1Ntvv32W/n6+qpt27aSJHd3d40dO1bdunVLNZavv/5aZcuW1ciRI82yOnXqpFp/ypQpmjRpUqrrn0SRkZHas2eP4uPj1bhxY0nS7du3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AAAAAEgfRroBAAAAALASkm4AAAAAAKyEpBsAAAAAACsh6QYAAAAAwEpIugEAAAAAsBJmL0cynadtkoOzi63DsLpNE9vZOgQAAAAATzlGugEAAAAAsBKSbgAAAAAArISkGwAAAAAAKyHpBgAAAADASki68cybPXu28ufPn+y1YcMGW4cGAAAA4AnH7OWPuatXr2rdunXq2bOnnJycbB3OU+nGjRtydHTUnj17LMpz5sxpo4gAAAAAPC1Iuh/A8ePHdfjwYRmGoYoVK6pMmTIPfRshISHq16+f2rdvT9JtRVmyZFH+/PltHQYAAACApwyXl2fCxYsX1apVK9WuXVvLli3TihUrVK9ePbVq1UoXL160dXgAAAAAgMcEI90ZFB8frzZt2sjOzk5BQUHKnTu3JOn69etq27at2rRpo927d8vB4f8f2vDwcP3zzz9ycnJSgwYNlD17dkl3RrG3b98uPz8/s25ERIRWr16t7t27y8XFJdn2o6Oj9cMPP0iSHB0dVbx4cdWuXVtZsmQx61y8eFG//vqrevfurV27dik4OFjNmzdnJDcN4eHhKlu2rBISEuTj46Phw4erRYsWtg4LAAAAwBOOke4M+umnn7R//37NnTvXTLglKUeOHJo7d64OHDiglStXmuWfffaZihUrppkzZ2r27NmqVauWAgICJEn79+/XoEGDLPq/cOGC+vXrp6tXr6a4/djYWG3btk3btm3TL7/8oj59+qhmzZq6du2aWScwMFD9+vVTmzZtNHr0aG3evFnXr19/iEfh6eLq6qp33nlH33//vX766SdVqFBBLVu21IwZM2wdGgAAAIAnHCPdGfTHH3+oQIECqlWrVrJ1VapUUdGiRbV582b16tVLf/31l0aPHq1169apffv2kqSzZ88qKioq09v38PDQN998Yy4nJCSoadOm+vjjj/XRRx9Z1K1WrZqmTZuWal8xMTGKiYkxlyMjIzMd15Ns6NChsrOzM5crVaqksLAwvffeexo6dKgcHR1tGB0AAACAJxlJdwaFh4erSJEiqa4vUqSIwsPDJUnfffed6tWrZybcklS4cOEHjsEwDO3evVtnzpxRdHS08uTJk2zmbUkaPHhwmv1MmTJFkyZNeuB4nnR3J9xJ6tevryVLligsLOyhnDMAAAAAzyaS7gxyc3PT0aNHU11/6dIlFShQQJIUGhoqb2/v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ubP27t2r6tWrZ3hj8+fP18cff6ygoCBJ0tq1azVw4ECdP39eDg53Bt3//fdf1ahRQ/b29vLy8tIHH3xgcSlvnjx55OPjo7///tts8+uvv6pjx47677//VK5cOUnSK6+8In9/fx0+fFhZsmRJdn+zv7+/GjRooFmzZmnYsGGSpPXr16tz5866fv26smfPrr1796pmzZq6du2acuTIIUn6448/1L17dx0+fFiFChWSJO3atUuNGzdWUFCQChUqpH79+kmSFi9eLEkyDEP//vuvateunWKfmYktJW3atFG5cuX06aefptjvvWJiYhQTE2MuR0ZGqnDhwtzTnYKke7p//fVXtWvXToMGDdL8+fPN9VOnTtWECRN048YNbhMAAAAAngHpvac7Q5eXJ43SJiWbknTjxg2L5KNu3bry9fU1l3fv3q0jR47o+vXrCg8P16lTpxQZGSl3d3fly5dPERERZiKTJUsW1apV675x9OzZ00y4pTsJaePGjc2EW5Jef/11ffXVV+al2al54YUXzL9r1KihhIQEhYSEWPR1t++//14FCxbUjz/+KMMwzJck7du3T4UKFVK+fPm0ceNGHT16VOXKlZOdnZ1q16593/3KaGwxMTHavHmzzpw5o+joaNnZ2engwYPp7n/KlCmaNGlShuN6lpUoUUKSVKZMGYvy0qVLyzAMnTlzRmXLlrVFaAAAAAAeQxm6vDxpZDYsLMwsu/sy5w8//FC//fabJCkxMVGdO3dWp06dtG3bNoWGhurq1auSZD7PuG7duvrss880ZswY5cqVSx06dNDGjRvvG0fevHktlkNDQ+Xl5WVRlnTveGhoaJp93f2LhKOjo6Q795mn5ty5c7Kzs1NoaKjOnTun8+fP68KFCxo6dKgKFiwoSXrrrbdUt25d1a9fX0WLFtWgQYN0+vTp++5XRmILCQmRt7e33nnnHf33338KCwvTrVu3zGOcHuPHj1dERIT5Onv2bIZjfNaULl1aRYoU0YkTJyzKT548KXt7e4vbKwAAAAAgQyPddevWlb29vf7++29VqVJFkuTh4aFPPvlE0p3Lz5Ps3r1b69ev17lz5+Tp6SlJ8vf318KFC3X3Fe1DhgzRkCFDFBoaquXLl6tdu3batWuXatasme64ChQooHPnzlmUJf0wUKBAgYzs4n3lzp1bt27dMvc5Je7u7po/f77mzZungwcPavLkyWrUqJHOnDnz0OKYM2eOihcvrr///tssGz16tP7444909+Hk5PTQHoX2rLCzs9N7772nIUOGqFWrVmrZsqX27NmjTz75RK+99hqXlgMAAACwkKGR7oIFC+qll17SBx98oICAgDTrRkZGytHR0WK0dtGiRRZ1Tp48aU4e5uXlpTFjxsjd3V3Hjx+XdCd5TVqflhYtWmjLli0Wo9rffPONihUrJm9v73Tv372SYr87hk6dOsnf31///POPRd3AwEDdvn1b0p0ZrqU7CVrVqlU1bNgwhYaG6saNGyn2mRmRkZHKmTOnuXzjxg2tXLnygfpE+vTr108zZszQyJEj5ebmppdeekmvvfaaeS89AAAAACTJ8CPD5syZo+joaFWtWlWdOnVSmTJllJiYqP379ysiIkKVK1eWJNWvX18FCxZU8+bN1apVK+3atUuHDx+26CsoKEht2rRR06ZNVaRIEW3btk0eHh5q1aqVJKlhw4aaNWuWIiIi5OLiohEjRqQYU9euXbV48WL5+vrKz89PISEh+vHHH7Vq1SrzsuzMKF68uLy8vPTaa6+pfv36Klu2rLp27aqBAweqWbNmevHFF1WgQAEdPnxYgYGB2rVrlyRp6dKlevnll9WkSRM5Oztr2bJl6tmzp9zc3OTs7Jysz3svjU8PPz8/NWnSRP369ZOXl5d5jzkejUGDBmnQoEG2DgMAAADAYy5DI92SlC1bNq1YsUJ79+5V3bp1FRsbKw8PDw0YMEBnzpxRt27dJEmurq7au3evXnjhBd2+fVsvvPCC/vnnH40aNUoeHh6SpFatWsnf31/Vq1dXTEyM/Pz8dOTIEfOe7c8//1zjx4/XzZs3zUdhDRkyJNkkVnZ2dtqwYYNmzJghe3t7VaxYUYcPH1a7du3MOvny5dOoUaPMy3+9vLw0atQoiwnZXFxcNGrUKPP53o6Ojtq5c6caNWqkS5cumY+Lmj9/vrZu3aqiRYvKzs5Offr00cGDB+Xq6ipJ+uSTT/Tll18qb968ypo1q+bMmWM+nzulPjMTW/369bVv3z55e3srS5Ys5jZeeumlVPcZAAAAAPBoZeiRYXi6JU15zyPDkkt6ZBgAAAAASOl/ZFiGR7oBAAAAAED6kHQDAAAAAGAlJN0AAAAAAFgJSTcAAAAAAFZC0g0AAAAAgJVk+DndePqtHtsqzdn3AAAAAADpw0g3AAAAAABWQtINAAAAAICVkHQDAAAAAGAlJN0AAAAAAFgJSTcAAAAAAFZC0g0AAAAAgJXwyDAk03naJjk4u9g6DKRh08R2tg4BAAAAQDow0g0AAAAAgJWQdAMAAAAAYCUk3QAAAAAAWAlJN/CUuHnzpq1DAAAAAHAPkm7gCXbp0iX16dNHHh4eyp07t4oVK6bvv//e1mEBAAAA+D/MXg48oRITE/X888/rxo0bOnz4sLy8vPTTTz+pV69eyp07t1q0aGHrEAEAAIBn3jM/0h0WFqb69evrwIEDtg4FyJADBw7I399fkydPVpEiRWRvb6/u3burVatW+vDDD20dHgAAAACRdOv27dvasWOHIiIibB0KkCEhISGSpGLFilmUFytWTP7+/oqJibFBVAAAAADu9swn3fc6fPiw6tevr927d+u1115Ty5Yt9frrr+vKlSvav3+/XnrpJbVs2VLvvvuuRVKT2Xbbt29Xy5YtLWIICQlR/fr1denSJYu+jx49qiFDhqh169Z6/fXXdfHiRYt2t27d0vTp09WmTRt16tRJM2bMUFxcnBWPFmzJ29tb0p33x90OHz6shIQEhYaG2iIsAAAAAHfhnu57REREaMeOHerTp4/eeusttW7dWmPGjNFff/2lhIQEjRs3Tq6urho5cqRu3rypTz755IHaXblyRTt37rSI4datW9qxY4eZnCf13blzZ40bN07t2rXTRx99pM6dO2vHjh2SpJiYGDVt2lS5c+fW4MGDZRiGpk2bpr///lurV69+hEcQj0rFihXVunVrjR07Vnny5JG3t7e+++47/fvvv5LuXMUBAAAAwLZIulMxb948NW3aVJJ07do19e3bVzt27FC9evUkSefPn9fMmTPN5PlB26XH3Llz1axZM0mSp6enatSoofDwcHl6emrx4sW6fv26/P395eBw57TWr19fnp6eOnTokCpVqpSsv5iYGItR98jIyAzHBNv66aefNHnyZI0ZM0ZXrlxRo0aNNH36dA0fPlw5c+a0dXgAAADAM4+kOxU1a9Y0/y5YsGCKZWFhYQ+tXXrUqlXL/LtIkSKS7kwE5+npqa1bt+rq1atq3ry5DMMwX1myZNHRo0dTTLqnTJmiSZMmZSoWPB5cXV01depUTZ061SwbPXq0PD09zfcfAAAAANsh6U6Fo6Oj+bednV2KZYZhPLR2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uFCdOnVSq1atNGnSJN28eVOSdOjQIdWpU0f79+/Xyy+/rKZNm2rYsGG6fPmy2fbcuXMaMWJEsjb//fefevfurfr162v//v26evWqOTLfoEED9enTRzt27DD7uXDhgvr16ydJatGiherUqaOJEydKksLDwzVq1Cg1btxYHTp00HfffWcRf0rb3Lt3r9q0aaO1a9da1A0LC1PdunV15MiRBz38AGA1169f1/Tp0+Xr6ytPT0+zPCEhQX369JGfn58aN25suwABAAAy6YkZ6U5Jvnz5FB0drZs3b8rNzU23b99WkyZNVKBAAY0YMUKGYWjKlCnavn271q1bJ0maN2+e3n//fX3yySfKnz+/du7cqWHDhmnRokWKjIzU7t271a5dO02ePFmdOnXSlClT1LJlS+3du1f29vbJLi9PavP8889r4sSJKl26tLy9vZUtWzbNnDlTkhQbG6udO3eqWbNm+vPPP1WvXj3lypVLo0aNUr9+/TRlyhRlz55defLk0e3bt+Xr66vixYtrzJgxCgkJ0auvvqoLFy5ozJgxqW7Tx8dHJUuW1KxZs9SxY0fzGH377be6cOGCypcv/2hPDgCkU1xcnF544QVFRkZq0aJFFuumTZums2fPauPGjTaKDgAA4ME8sUl3dHS0fvjhB1WuXFlubm6SpMWLF+vGjRtavXq1smTJIkmqW7euPD09dfDgQVWpUkU7duzQ888/Lz8/P0lSs2bNFB0dbdH3lClT1LdvX0lSnTp1VKRIEa1Zs0bPP/98qvHMnDlTzz33nEVZnTp1zL8bNmyoc+fOac6cOapXr56cnJxUoUIFSVKNGjXMy9VnzZqliIgIrVu3zryM0s7OTm+++aZee+018/7HlLY5cOBAVa1aVcHBwSpWrJh5TPr16yc7O7tkMcfExCgmJsZcjoyMTHX/AMAaEhMT9eKLL2rHjh36/fff5ePjY66Li4vTpEmT9PLLL5uzlV+/fl2StH//fuXNm1ft2rWzRdgAAADp9kQl3RcuXFCdOnWUmJiokydPqlixYvrpp5/M9Vu3btXly5fVqFEjGYZhvuzs7HTs2DFVqVJFTZo00ciRI+Xp6ak2bdqoevXqye4RbN68ufl3njx5VLVqVe3duzfNpDul+xO3bdumb775RmfOnFF0dLQuXLigggULprmPe/bsUcOGDS1iatu2rV599VUdP35c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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "import matplotlib.pyplot as plt\n", + "\n", + "category_counts = df[\"category\"].value_counts()\n", + "\n", + "fig, ax = plt.subplots(figsize=(10, 6))\n", + "ax.barh(range(len(category_counts)), category_counts.values, color=\"steelblue\")\n", + "ax.set_yticks(range(len(category_counts)))\n", + "ax.set_yticklabels([c.capitalize() for c in category_counts.index])\n", + "ax.set_xlabel(\"Number of AOPs\")\n", + "ax.set_title(\"AOPs categorized by organ/system target\", fontsize=14, fontweight=\"bold\")\n", + "for i, (_cat, count) in enumerate(category_counts.items()):\n", + " ax.text(count + 0.1, i, str(count), va=\"center\", fontsize=11)\n", + "\n", + "plt.tight_layout()\n", + "plt.show()" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "aoptk-dev", + "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.12.12" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/examples/aop_categorization/prompt_specification.txt b/examples/aop_categorization/prompt_specification.txt new file mode 100644 index 00000000..bc0dc1e2 --- /dev/null +++ b/examples/aop_categorization/prompt_specification.txt @@ -0,0 +1,3 @@ +The text describes an Adverse Outcome Pathway (AOP). Classify the AOP according to its target organ / system. + +Category other includes AOPs not associated with a specific organ system, including changes in body weight, decreased survival, and other nonspecific toxicity. \ No newline at end of file diff --git a/pyproject.toml b/pyproject.toml index 043a918d..1696c6e7 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -33,6 +33,7 @@ dependencies = [ "tenacity", "boto3>=1.43.2", "pillow", + "sparqlwrapper", ] description = "Tools to support data mining for the development of (q)AOPs" keywords = ["AOP"," toxicology"," data mining"," ai"," machine learning"," data analysis"] diff --git a/src/aoptk/literature/categorize_text.py b/src/aoptk/literature/categorize_text.py new file mode 100644 index 00000000..ce59020a --- /dev/null +++ b/src/aoptk/literature/categorize_text.py @@ -0,0 +1,20 @@ +from __future__ import annotations +from abc import ABC +from abc import abstractmethod + + +class CategorizeText(ABC): + """Abstract base class for categorizing text.""" + + @abstractmethod + def categorize_text(self, text: str, categories: list[str]) -> str | None: + """Categorize the given text into one of the specified categories. + + Args: + text (str): The text to categorize. + categories (list[str]): The list of available categories. + + Returns: + str | None: The categorized label or None if no match is found. + """ + ... diff --git a/src/aoptk/literature/databases/aop_wiki.py b/src/aoptk/literature/databases/aop_wiki.py new file mode 100644 index 00000000..2cb63bf5 --- /dev/null +++ b/src/aoptk/literature/databases/aop_wiki.py @@ -0,0 +1,54 @@ +from SPARQLWrapper import JSON +from SPARQLWrapper import SPARQLWrapper +from aoptk.literature.abstract import Abstract +from aoptk.literature.get_abstract import GetAbstract +from aoptk.literature.id import ID + + +class AOPWiki(GetAbstract): + """Class to extract data from AOP-Wiki.""" + + endpoint_url = "https://aopwiki.rdf.bigcat-bioinformatics.org/sparql" + prefix = """PREFIX aop: +PREFIX dc: +PREFIX dcterms: """ + abstract_query = ( + prefix + + """ + +SELECT ?AOP ?AOPTitle ?abstract + +WHERE { + ?AOP a aop:AdverseOutcomePathway ; + dc:title ?AOPTitle . + OPTIONAL { ?AOP dcterms:abstract ?abstract. } +} +""" + ) + + def __init__( + self, + ): + self.sparql = SPARQLWrapper(self.endpoint_url) + self.sparql.setReturnFormat(JSON) + + def get_abstracts(self) -> list[Abstract]: + """Get abstracts of AOPs from AOP-Wiki. + + Returns: + list[Abstract]: List of abstracts. + """ + self.sparql.setQuery(self.abstract_query) + results = self.sparql.query().convert() + + abstracts: list[Abstract] = [] + for result in results["results"]["bindings"]: + aop_id = result.get("AOP", {}).get("value") + title = result.get("AOPTitle", {}).get("value", "") + abstract = result.get("abstract", {}).get("value", "") + if abstract == "": + continue + text = f"{title}\n\n{abstract}".strip() + abstracts.append(Abstract(id=ID(aop_id), text=text)) + + return abstracts diff --git a/src/aoptk/prompts/categorize_text_prompt.txt b/src/aoptk/prompts/categorize_text_prompt.txt new file mode 100644 index 00000000..21647bd2 --- /dev/null +++ b/src/aoptk/prompts/categorize_text_prompt.txt @@ -0,0 +1,14 @@ +Task: +Categorize the provided text into exactly one category from the following list: +{{ categories }} + +{{ specification_categorization_prompt }} + +Output requirements: +1. Return exactly one category label. Treat all category names as fixed labels, not words. Do not modify, stem, normalize, correct, interpret, paraphrase, or transform labels in any way. Output the label exactly as provided, character-for-character. +2. Do not include explanations, labels, punctuation, or additional text. +3. If there is no fitting category, return exactly: +"none" + +Text: +{{ text }} \ No newline at end of file diff --git a/src/aoptk/text_generation_api.py b/src/aoptk/text_generation_api.py index 4e9c4da4..a8423145 100644 --- a/src/aoptk/text_generation_api.py +++ b/src/aoptk/text_generation_api.py @@ -57,8 +57,10 @@ class TextGenerationAPI( convert_pdf_scan_prompt_template: str = "convert_pdf_scan_prompt.txt" convert_image_prompt_template: str = "convert_image_prompt.txt" find_relevant_publications_prompt_template: str = "find_relevant_publications_prompt.txt" + categorize_text_prompt_template: str = "categorize_text_prompt.txt" specification_relationship_text_prompt: str = "" + specification_categorization_prompt: str = "" def __init__( self, @@ -465,3 +467,21 @@ def find_relevant_publications(self, question: str, text: str) -> bool | None: if response == "no": return False return None + + def categorize_text(self, text: str, categories: list[str]) -> str | None: + """Categorize the given text into one of the specified categories. + + Args: + text (str): The text to categorize. + categories (list[str]): The list of available categories. + + Returns: + str | None: The categorized label or None if no match is found. + """ + if response := self._prompt( + self._render_prompt(self.categorize_text_prompt_template, text=text, categories=", ".join(categories)), + ).lower(): + if response == "none": + return None + return response + return None diff --git a/tests/test_aop_wiki.py b/tests/test_aop_wiki.py new file mode 100644 index 00000000..f8f884dc --- /dev/null +++ b/tests/test_aop_wiki.py @@ -0,0 +1,26 @@ +from __future__ import annotations +from aoptk.literature.databases.aop_wiki import AOPWiki +from aoptk.literature.get_abstract import GetAbstract +from aoptk.literature.id import ID + + +def test_can_create(): + """Test that AOPWiki can be instantiated.""" + actual = AOPWiki() + assert actual is not None + + +def test_implements_interface(): + """Test that AOPWiki implements GetAbstract interface.""" + assert issubclass(AOPWiki, GetAbstract) + + +def test_get_abstracts(): + """Test that AOP 38 has the correct title.""" + abstracts = AOPWiki().get_abstracts() + aop_38 = next(abstract for abstract in abstracts if abstract.id == ID("https://identifiers.org/aop/38")) + min_length_of_abstract = 2000 + min_number_of_abstracts = 300 + assert aop_38.text.startswith("Protein Alkylation leading to Liver Fibrosis") + assert len(aop_38.text) > min_length_of_abstract + assert len(abstracts) > min_number_of_abstracts diff --git a/tests/test_text_generation.py b/tests/test_text_generation.py index caf80fc4..47695fe4 100644 --- a/tests/test_text_generation.py +++ b/tests/test_text_generation.py @@ -277,3 +277,25 @@ def test_find_relevant_publications(question: str, text: str, expected: bool): """Test that find_relevant_publications method finds relevant publications.""" actual = TextGenerationAPI().find_relevant_publications(question=question, text=text) assert actual == expected + + +@pytest.mark.openai +@pytest.mark.parametrize( + ("text", "categories", "expected"), + [ + ( + "This text is about liver.", + ["Liver", "Heart", "Kidney"], + "liver", + ), + ( + "This text is not about any organ.", + ["Liver", "Heart", "Kidney"], + None, + ), + ], +) +def test_categorize_text(text: str, categories: list[str], expected: str | None): + """Test that categorize_text method categorizes text correctly.""" + actual = TextGenerationAPI().categorize_text(text=text, categories=categories) + assert actual == expected