{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "be3c1872",
   "metadata": {},
   "source": [
    "# AI-based OCR Benchmark Notebook\n",
    "\n",
    "This notebook benchmarks **AI-based OCR models** on scanned PDF documents/images in Spanish.\n",
    "It excludes traditional OCR engines like Tesseract that require external installations."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "id": "6a1e98fe",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Looking in indexes: https://pypi.org/simple, https://pypi.ngc.nvidia.com\n",
      "Requirement already satisfied: pip in c:\\users\\sji\\desktop\\mastersthesis\\.venv\\lib\\site-packages (25.3)\n",
      "Note: you may need to restart the kernel to use updated packages.\n",
      "Looking in indexes: https://pypi.org/simple, https://pypi.ngc.nvidia.com\n",
      "Requirement already satisfied: jupyter in c:\\users\\sji\\desktop\\mastersthesis\\.venv\\lib\\site-packages (1.1.1)\n",
      "Requirement already satisfied: notebook in c:\\users\\sji\\desktop\\mastersthesis\\.venv\\lib\\site-packages (from jupyter) (7.4.7)\n",
      "Requirement already satisfied: jupyter-console in c:\\users\\sji\\desktop\\mastersthesis\\.venv\\lib\\site-packages (from jupyter) (6.6.3)\n",
      "Requirement already satisfied: nbconvert in c:\\users\\sji\\desktop\\mastersthesis\\.venv\\lib\\site-packages (from jupyter) (7.16.6)\n",
      "Requirement already satisfied: ipykernel in c:\\users\\sji\\desktop\\mastersthesis\\.venv\\lib\\site-packages (from jupyter) (7.1.0)\n",
      "Requirement already satisfied: ipywidgets in c:\\users\\sji\\desktop\\mastersthesis\\.venv\\lib\\site-packages (from jupyter) (8.1.8)\n",
      "Requirement already satisfied: jupyterlab in c:\\users\\sji\\desktop\\mastersthesis\\.venv\\lib\\site-packages (from jupyter) (4.4.9)\n",
      "Requirement already satisfied: comm>=0.1.1 in c:\\users\\sji\\desktop\\mastersthesis\\.venv\\lib\\site-packages (from ipykernel->jupyter) (0.2.3)\n",
      "Requirement already satisfied: debugpy>=1.6.5 in c:\\users\\sji\\desktop\\mastersthesis\\.venv\\lib\\site-packages (from ipykernel->jupyter) (1.8.17)\n",
      "Requirement already satisfied: ipython>=7.23.1 in c:\\users\\sji\\desktop\\mastersthesis\\.venv\\lib\\site-packages (from ipykernel->jupyter) (9.6.0)\n",
      "Requirement already satisfied: jupyter-client>=8.0.0 in c:\\users\\sji\\desktop\\mastersthesis\\.venv\\lib\\site-packages (from ipykernel->jupyter) (8.6.3)\n",
      "Requirement already satisfied: jupyter-core!=5.0.*,>=4.12 in c:\\users\\sji\\desktop\\mastersthesis\\.venv\\lib\\site-packages (from ipykernel->jupyter) (5.8.1)\n",
      "Requirement already satisfied: matplotlib-inline>=0.1 in c:\\users\\sji\\desktop\\mastersthesis\\.venv\\lib\\site-packages (from ipykernel->jupyter) (0.1.7)\n",
      "Requirement already satisfied: nest-asyncio>=1.4 in c:\\users\\sji\\desktop\\mastersthesis\\.venv\\lib\\site-packages (from ipykernel->jupyter) (1.6.0)\n",
      "Requirement already satisfied: packaging>=22 in c:\\users\\sji\\desktop\\mastersthesis\\.venv\\lib\\site-packages (from ipykernel->jupyter) (25.0)\n",
      "Requirement already satisfied: psutil>=5.7 in c:\\users\\sji\\desktop\\mastersthesis\\.venv\\lib\\site-packages (from ipykernel->jupyter) (7.1.0)\n",
      "Requirement already satisfied: pyzmq>=25 in c:\\users\\sji\\desktop\\mastersthesis\\.venv\\lib\\site-packages (from ipykernel->jupyter) (27.1.0)\n",
      "Requirement already satisfied: tornado>=6.2 in c:\\users\\sji\\desktop\\mastersthesis\\.venv\\lib\\site-packages (from ipykernel->jupyter) (6.5.2)\n",
      "Requirement already satisfied: traitlets>=5.4.0 in c:\\users\\sji\\desktop\\mastersthesis\\.venv\\lib\\site-packages (from ipykernel->jupyter) (5.14.3)\n",
      "Requirement already satisfied: colorama in c:\\users\\sji\\desktop\\mastersthesis\\.venv\\lib\\site-packages (from ipython>=7.23.1->ipykernel->jupyter) (0.4.6)\n",
      "Requirement already satisfied: decorator in c:\\users\\sji\\desktop\\mastersthesis\\.venv\\lib\\site-packages (from ipython>=7.23.1->ipykernel->jupyter) (5.2.1)\n",
      "Requirement already satisfied: ipython-pygments-lexers in c:\\users\\sji\\desktop\\mastersthesis\\.venv\\lib\\site-packages (from ipython>=7.23.1->ipykernel->jupyter) (1.1.1)\n",
      "Requirement already satisfied: jedi>=0.16 in c:\\users\\sji\\desktop\\mastersthesis\\.venv\\lib\\site-packages (from ipython>=7.23.1->ipykernel->jupyter) (0.19.2)\n",
      "Requirement already satisfied: prompt_toolkit<3.1.0,>=3.0.41 in c:\\users\\sji\\desktop\\mastersthesis\\.venv\\lib\\site-packages (from ipython>=7.23.1->ipykernel->jupyter) (3.0.52)\n",
      "Requirement already satisfied: pygments>=2.4.0 in c:\\users\\sji\\desktop\\mastersthesis\\.venv\\lib\\site-packages (from ipython>=7.23.1->ipykernel->jupyter) (2.19.2)\n",
      "Requirement already satisfied: stack_data in c:\\users\\sji\\desktop\\mastersthesis\\.venv\\lib\\site-packages (from ipython>=7.23.1->ipykernel->jupyter) (0.6.3)\n",
      "Requirement already satisfied: wcwidth in c:\\users\\sji\\desktop\\mastersthesis\\.venv\\lib\\site-packages (from prompt_toolkit<3.1.0,>=3.0.41->ipython>=7.23.1->ipykernel->jupyter) (0.2.14)\n",
      "Requirement already satisfied: parso<0.9.0,>=0.8.4 in c:\\users\\sji\\desktop\\mastersthesis\\.venv\\lib\\site-packages (from jedi>=0.16->ipython>=7.23.1->ipykernel->jupyter) (0.8.5)\n",
      "Requirement already satisfied: python-dateutil>=2.8.2 in c:\\users\\sji\\desktop\\mastersthesis\\.venv\\lib\\site-packages (from jupyter-client>=8.0.0->ipykernel->jupyter) (2.9.0.post0)\n",
      "Requirement already satisfied: platformdirs>=2.5 in c:\\users\\sji\\desktop\\mastersthesis\\.venv\\lib\\site-packages (from jupyter-core!=5.0.*,>=4.12->ipykernel->jupyter) (4.4.0)\n",
      "Requirement already satisfied: pywin32>=300 in c:\\users\\sji\\desktop\\mastersthesis\\.venv\\lib\\site-packages (from jupyter-core!=5.0.*,>=4.12->ipykernel->jupyter) (311)\n",
      "Requirement already satisfied: six>=1.5 in c:\\users\\sji\\desktop\\mastersthesis\\.venv\\lib\\site-packages (from python-dateutil>=2.8.2->jupyter-client>=8.0.0->ipykernel->jupyter) (1.17.0)\n",
      "Requirement already satisfied: widgetsnbextension~=4.0.14 in c:\\users\\sji\\desktop\\mastersthesis\\.venv\\lib\\site-packages (from ipywidgets->jupyter) (4.0.14)\n",
      "Requirement already satisfied: jupyterlab_widgets~=3.0.15 in c:\\users\\sji\\desktop\\mastersthesis\\.venv\\lib\\site-packages (from ipywidgets->jupyter) (3.0.15)\n",
      "Requirement already satisfied: async-lru>=1.0.0 in c:\\users\\sji\\desktop\\mastersthesis\\.venv\\lib\\site-packages (from jupyterlab->jupyter) (2.0.5)\n",
      "Requirement already satisfied: httpx<1,>=0.25.0 in c:\\users\\sji\\desktop\\mastersthesis\\.venv\\lib\\site-packages (from jupyterlab->jupyter) (0.28.1)\n",
      "Requirement already satisfied: jinja2>=3.0.3 in c:\\users\\sji\\desktop\\mastersthesis\\.venv\\lib\\site-packages (from jupyterlab->jupyter) (3.1.6)\n",
      "Requirement already satisfied: jupyter-lsp>=2.0.0 in c:\\users\\sji\\desktop\\mastersthesis\\.venv\\lib\\site-packages (from jupyterlab->jupyter) (2.3.0)\n",
      "Requirement already satisfied: jupyter-server<3,>=2.4.0 in c:\\users\\sji\\desktop\\mastersthesis\\.venv\\lib\\site-packages (from jupyterlab->jupyter) (2.17.0)\n",
      "Requirement already satisfied: jupyterlab-server<3,>=2.27.1 in c:\\users\\sji\\desktop\\mastersthesis\\.venv\\lib\\site-packages (from jupyterlab->jupyter) (2.27.3)\n",
      "Requirement already satisfied: notebook-shim>=0.2 in c:\\users\\sji\\desktop\\mastersthesis\\.venv\\lib\\site-packages (from jupyterlab->jupyter) (0.2.4)\n",
      "Requirement already satisfied: setuptools>=41.1.0 in c:\\users\\sji\\desktop\\mastersthesis\\.venv\\lib\\site-packages (from jupyterlab->jupyter) (80.9.0)\n",
      "Requirement already satisfied: anyio in c:\\users\\sji\\desktop\\mastersthesis\\.venv\\lib\\site-packages (from httpx<1,>=0.25.0->jupyterlab->jupyter) (4.11.0)\n",
      "Requirement already satisfied: certifi in c:\\users\\sji\\desktop\\mastersthesis\\.venv\\lib\\site-packages (from httpx<1,>=0.25.0->jupyterlab->jupyter) (2025.10.5)\n",
      "Requirement already satisfied: httpcore==1.* in c:\\users\\sji\\desktop\\mastersthesis\\.venv\\lib\\site-packages (from httpx<1,>=0.25.0->jupyterlab->jupyter) (1.0.9)\n",
      "Requirement already satisfied: idna in c:\\users\\sji\\desktop\\mastersthesis\\.venv\\lib\\site-packages (from httpx<1,>=0.25.0->jupyterlab->jupyter) (3.10)\n",
      "Requirement already satisfied: h11>=0.16 in c:\\users\\sji\\desktop\\mastersthesis\\.venv\\lib\\site-packages (from httpcore==1.*->httpx<1,>=0.25.0->jupyterlab->jupyter) (0.16.0)\n",
      "Requirement already satisfied: argon2-cffi>=21.1 in c:\\users\\sji\\desktop\\mastersthesis\\.venv\\lib\\site-packages (from jupyter-server<3,>=2.4.0->jupyterlab->jupyter) (25.1.0)\n",
      "Requirement already satisfied: jupyter-events>=0.11.0 in c:\\users\\sji\\desktop\\mastersthesis\\.venv\\lib\\site-packages (from jupyter-server<3,>=2.4.0->jupyterlab->jupyter) (0.12.0)\n",
      "Requirement already satisfied: jupyter-server-terminals>=0.4.4 in c:\\users\\sji\\desktop\\mastersthesis\\.venv\\lib\\site-packages (from jupyter-server<3,>=2.4.0->jupyterlab->jupyter) (0.5.3)\n",
      "Requirement already satisfied: nbformat>=5.3.0 in c:\\users\\sji\\desktop\\mastersthesis\\.venv\\lib\\site-packages (from jupyter-server<3,>=2.4.0->jupyterlab->jupyter) (5.10.4)\n",
      "Requirement already satisfied: prometheus-client>=0.9 in c:\\users\\sji\\desktop\\mastersthesis\\.venv\\lib\\site-packages (from jupyter-server<3,>=2.4.0->jupyterlab->jupyter) (0.23.1)\n",
      "Requirement already satisfied: pywinpty>=2.0.1 in c:\\users\\sji\\desktop\\mastersthesis\\.venv\\lib\\site-packages (from jupyter-server<3,>=2.4.0->jupyterlab->jupyter) (3.0.2)\n",
      "Requirement already satisfied: send2trash>=1.8.2 in c:\\users\\sji\\desktop\\mastersthesis\\.venv\\lib\\site-packages (from jupyter-server<3,>=2.4.0->jupyterlab->jupyter) (1.8.3)\n",
      "Requirement already satisfied: terminado>=0.8.3 in c:\\users\\sji\\desktop\\mastersthesis\\.venv\\lib\\site-packages (from jupyter-server<3,>=2.4.0->jupyterlab->jupyter) (0.18.1)\n",
      "Requirement already satisfied: websocket-client>=1.7 in c:\\users\\sji\\desktop\\mastersthesis\\.venv\\lib\\site-packages (from jupyter-server<3,>=2.4.0->jupyterlab->jupyter) (1.9.0)\n",
      "Requirement already satisfied: babel>=2.10 in c:\\users\\sji\\desktop\\mastersthesis\\.venv\\lib\\site-packages (from jupyterlab-server<3,>=2.27.1->jupyterlab->jupyter) (2.17.0)\n",
      "Requirement already satisfied: json5>=0.9.0 in c:\\users\\sji\\desktop\\mastersthesis\\.venv\\lib\\site-packages (from jupyterlab-server<3,>=2.27.1->jupyterlab->jupyter) (0.12.1)\n",
      "Requirement already satisfied: jsonschema>=4.18.0 in c:\\users\\sji\\desktop\\mastersthesis\\.venv\\lib\\site-packages (from jupyterlab-server<3,>=2.27.1->jupyterlab->jupyter) (4.25.1)\n",
      "Requirement already satisfied: requests>=2.31 in c:\\users\\sji\\desktop\\mastersthesis\\.venv\\lib\\site-packages (from jupyterlab-server<3,>=2.27.1->jupyterlab->jupyter) (2.32.5)\n",
      "Requirement already satisfied: sniffio>=1.1 in c:\\users\\sji\\desktop\\mastersthesis\\.venv\\lib\\site-packages (from anyio->httpx<1,>=0.25.0->jupyterlab->jupyter) (1.3.1)\n",
      "Requirement already satisfied: argon2-cffi-bindings in c:\\users\\sji\\desktop\\mastersthesis\\.venv\\lib\\site-packages (from argon2-cffi>=21.1->jupyter-server<3,>=2.4.0->jupyterlab->jupyter) (25.1.0)\n",
      "Requirement already satisfied: MarkupSafe>=2.0 in c:\\users\\sji\\desktop\\mastersthesis\\.venv\\lib\\site-packages (from jinja2>=3.0.3->jupyterlab->jupyter) (3.0.3)\n",
      "Requirement already satisfied: attrs>=22.2.0 in c:\\users\\sji\\desktop\\mastersthesis\\.venv\\lib\\site-packages (from jsonschema>=4.18.0->jupyterlab-server<3,>=2.27.1->jupyterlab->jupyter) (25.4.0)\n",
      "Requirement already satisfied: jsonschema-specifications>=2023.03.6 in c:\\users\\sji\\desktop\\mastersthesis\\.venv\\lib\\site-packages (from jsonschema>=4.18.0->jupyterlab-server<3,>=2.27.1->jupyterlab->jupyter) (2025.9.1)\n",
      "Requirement already satisfied: referencing>=0.28.4 in c:\\users\\sji\\desktop\\mastersthesis\\.venv\\lib\\site-packages (from jsonschema>=4.18.0->jupyterlab-server<3,>=2.27.1->jupyterlab->jupyter) (0.36.2)\n",
      "Requirement already satisfied: rpds-py>=0.7.1 in c:\\users\\sji\\desktop\\mastersthesis\\.venv\\lib\\site-packages (from jsonschema>=4.18.0->jupyterlab-server<3,>=2.27.1->jupyterlab->jupyter) (0.27.1)\n",
      "Requirement already satisfied: python-json-logger>=2.0.4 in c:\\users\\sji\\desktop\\mastersthesis\\.venv\\lib\\site-packages (from jupyter-events>=0.11.0->jupyter-server<3,>=2.4.0->jupyterlab->jupyter) (4.0.0)\n",
      "Requirement already satisfied: pyyaml>=5.3 in c:\\users\\sji\\desktop\\mastersthesis\\.venv\\lib\\site-packages (from jupyter-events>=0.11.0->jupyter-server<3,>=2.4.0->jupyterlab->jupyter) (6.0.2)\n",
      "Requirement already satisfied: rfc3339-validator in c:\\users\\sji\\desktop\\mastersthesis\\.venv\\lib\\site-packages (from jupyter-events>=0.11.0->jupyter-server<3,>=2.4.0->jupyterlab->jupyter) (0.1.4)\n",
      "Requirement already satisfied: rfc3986-validator>=0.1.1 in c:\\users\\sji\\desktop\\mastersthesis\\.venv\\lib\\site-packages (from jupyter-events>=0.11.0->jupyter-server<3,>=2.4.0->jupyterlab->jupyter) (0.1.1)\n",
      "Requirement already satisfied: fqdn in c:\\users\\sji\\desktop\\mastersthesis\\.venv\\lib\\site-packages (from jsonschema[format-nongpl]>=4.18.0->jupyter-events>=0.11.0->jupyter-server<3,>=2.4.0->jupyterlab->jupyter) (1.5.1)\n",
      "Requirement already satisfied: isoduration in c:\\users\\sji\\desktop\\mastersthesis\\.venv\\lib\\site-packages (from jsonschema[format-nongpl]>=4.18.0->jupyter-events>=0.11.0->jupyter-server<3,>=2.4.0->jupyterlab->jupyter) (20.11.0)\n",
      "Requirement already satisfied: jsonpointer>1.13 in c:\\users\\sji\\desktop\\mastersthesis\\.venv\\lib\\site-packages (from jsonschema[format-nongpl]>=4.18.0->jupyter-events>=0.11.0->jupyter-server<3,>=2.4.0->jupyterlab->jupyter) (3.0.0)\n",
      "Requirement already satisfied: rfc3987-syntax>=1.1.0 in c:\\users\\sji\\desktop\\mastersthesis\\.venv\\lib\\site-packages (from jsonschema[format-nongpl]>=4.18.0->jupyter-events>=0.11.0->jupyter-server<3,>=2.4.0->jupyterlab->jupyter) (1.1.0)\n",
      "Requirement already satisfied: uri-template in c:\\users\\sji\\desktop\\mastersthesis\\.venv\\lib\\site-packages (from jsonschema[format-nongpl]>=4.18.0->jupyter-events>=0.11.0->jupyter-server<3,>=2.4.0->jupyterlab->jupyter) (1.3.0)\n",
      "Requirement already satisfied: webcolors>=24.6.0 in c:\\users\\sji\\desktop\\mastersthesis\\.venv\\lib\\site-packages (from jsonschema[format-nongpl]>=4.18.0->jupyter-events>=0.11.0->jupyter-server<3,>=2.4.0->jupyterlab->jupyter) (24.11.1)\n",
      "Requirement already satisfied: beautifulsoup4 in c:\\users\\sji\\desktop\\mastersthesis\\.venv\\lib\\site-packages (from nbconvert->jupyter) (4.14.2)\n",
      "Requirement already satisfied: bleach!=5.0.0 in c:\\users\\sji\\desktop\\mastersthesis\\.venv\\lib\\site-packages (from bleach[css]!=5.0.0->nbconvert->jupyter) (6.2.0)\n",
      "Requirement already satisfied: defusedxml in c:\\users\\sji\\desktop\\mastersthesis\\.venv\\lib\\site-packages (from nbconvert->jupyter) (0.7.1)\n",
      "Requirement already satisfied: jupyterlab-pygments in c:\\users\\sji\\desktop\\mastersthesis\\.venv\\lib\\site-packages (from nbconvert->jupyter) (0.3.0)\n",
      "Requirement already satisfied: mistune<4,>=2.0.3 in c:\\users\\sji\\desktop\\mastersthesis\\.venv\\lib\\site-packages (from nbconvert->jupyter) (3.1.4)\n",
      "Requirement already satisfied: nbclient>=0.5.0 in c:\\users\\sji\\desktop\\mastersthesis\\.venv\\lib\\site-packages (from nbconvert->jupyter) (0.10.2)\n",
      "Requirement already satisfied: pandocfilters>=1.4.1 in c:\\users\\sji\\desktop\\mastersthesis\\.venv\\lib\\site-packages (from nbconvert->jupyter) (1.5.1)\n",
      "Requirement already satisfied: webencodings in c:\\users\\sji\\desktop\\mastersthesis\\.venv\\lib\\site-packages (from bleach!=5.0.0->bleach[css]!=5.0.0->nbconvert->jupyter) (0.5.1)\n",
      "Requirement already satisfied: tinycss2<1.5,>=1.1.0 in c:\\users\\sji\\desktop\\mastersthesis\\.venv\\lib\\site-packages (from bleach[css]!=5.0.0->nbconvert->jupyter) (1.4.0)\n",
      "Requirement already satisfied: fastjsonschema>=2.15 in c:\\users\\sji\\desktop\\mastersthesis\\.venv\\lib\\site-packages (from nbformat>=5.3.0->jupyter-server<3,>=2.4.0->jupyterlab->jupyter) (2.21.2)\n",
      "Requirement already satisfied: charset_normalizer<4,>=2 in c:\\users\\sji\\desktop\\mastersthesis\\.venv\\lib\\site-packages (from requests>=2.31->jupyterlab-server<3,>=2.27.1->jupyterlab->jupyter) (3.4.3)\n",
      "Requirement already satisfied: urllib3<3,>=1.21.1 in c:\\users\\sji\\desktop\\mastersthesis\\.venv\\lib\\site-packages (from requests>=2.31->jupyterlab-server<3,>=2.27.1->jupyterlab->jupyter) (2.5.0)\n",
      "Requirement already satisfied: lark>=1.2.2 in c:\\users\\sji\\desktop\\mastersthesis\\.venv\\lib\\site-packages (from rfc3987-syntax>=1.1.0->jsonschema[format-nongpl]>=4.18.0->jupyter-events>=0.11.0->jupyter-server<3,>=2.4.0->jupyterlab->jupyter) (1.3.0)\n",
      "Requirement already satisfied: cffi>=1.0.1 in c:\\users\\sji\\desktop\\mastersthesis\\.venv\\lib\\site-packages (from argon2-cffi-bindings->argon2-cffi>=21.1->jupyter-server<3,>=2.4.0->jupyterlab->jupyter) (2.0.0)\n",
      "Requirement already satisfied: pycparser in c:\\users\\sji\\desktop\\mastersthesis\\.venv\\lib\\site-packages (from cffi>=1.0.1->argon2-cffi-bindings->argon2-cffi>=21.1->jupyter-server<3,>=2.4.0->jupyterlab->jupyter) (2.23)\n",
      "Requirement already satisfied: soupsieve>1.2 in c:\\users\\sji\\desktop\\mastersthesis\\.venv\\lib\\site-packages (from beautifulsoup4->nbconvert->jupyter) (2.8)\n",
      "Requirement already satisfied: typing-extensions>=4.0.0 in c:\\users\\sji\\desktop\\mastersthesis\\.venv\\lib\\site-packages (from beautifulsoup4->nbconvert->jupyter) (4.15.0)\n",
      "Requirement already satisfied: arrow>=0.15.0 in c:\\users\\sji\\desktop\\mastersthesis\\.venv\\lib\\site-packages (from isoduration->jsonschema[format-nongpl]>=4.18.0->jupyter-events>=0.11.0->jupyter-server<3,>=2.4.0->jupyterlab->jupyter) (1.3.0)\n",
      "Requirement already satisfied: types-python-dateutil>=2.8.10 in c:\\users\\sji\\desktop\\mastersthesis\\.venv\\lib\\site-packages (from arrow>=0.15.0->isoduration->jsonschema[format-nongpl]>=4.18.0->jupyter-events>=0.11.0->jupyter-server<3,>=2.4.0->jupyterlab->jupyter) (2.9.0.20251008)\n",
      "Requirement already satisfied: executing>=1.2.0 in c:\\users\\sji\\desktop\\mastersthesis\\.venv\\lib\\site-packages (from stack_data->ipython>=7.23.1->ipykernel->jupyter) (2.2.1)\n",
      "Requirement already satisfied: asttokens>=2.1.0 in c:\\users\\sji\\desktop\\mastersthesis\\.venv\\lib\\site-packages (from stack_data->ipython>=7.23.1->ipykernel->jupyter) (3.0.0)\n",
      "Requirement already satisfied: pure-eval in c:\\users\\sji\\desktop\\mastersthesis\\.venv\\lib\\site-packages (from stack_data->ipython>=7.23.1->ipykernel->jupyter) (0.2.3)\n",
      "Note: you may need to restart the kernel to use updated packages.\n",
      "Looking in indexes: https://pypi.org/simple, https://pypi.ngc.nvidia.com\n",
      "Requirement already satisfied: ipywidgets in c:\\users\\sji\\desktop\\mastersthesis\\.venv\\lib\\site-packages (8.1.8)\n",
      "Requirement already satisfied: comm>=0.1.3 in c:\\users\\sji\\desktop\\mastersthesis\\.venv\\lib\\site-packages (from ipywidgets) (0.2.3)\n",
      "Requirement already satisfied: ipython>=6.1.0 in c:\\users\\sji\\desktop\\mastersthesis\\.venv\\lib\\site-packages (from ipywidgets) (9.6.0)\n",
      "Requirement already satisfied: traitlets>=4.3.1 in c:\\users\\sji\\desktop\\mastersthesis\\.venv\\lib\\site-packages (from ipywidgets) (5.14.3)\n",
      "Requirement already satisfied: widgetsnbextension~=4.0.14 in c:\\users\\sji\\desktop\\mastersthesis\\.venv\\lib\\site-packages (from ipywidgets) (4.0.14)\n",
      "Requirement already satisfied: jupyterlab_widgets~=3.0.15 in c:\\users\\sji\\desktop\\mastersthesis\\.venv\\lib\\site-packages (from ipywidgets) (3.0.15)\n",
      "Requirement already satisfied: colorama in c:\\users\\sji\\desktop\\mastersthesis\\.venv\\lib\\site-packages (from ipython>=6.1.0->ipywidgets) (0.4.6)\n",
      "Requirement already satisfied: decorator in c:\\users\\sji\\desktop\\mastersthesis\\.venv\\lib\\site-packages (from ipython>=6.1.0->ipywidgets) (5.2.1)\n",
      "Requirement already satisfied: ipython-pygments-lexers in c:\\users\\sji\\desktop\\mastersthesis\\.venv\\lib\\site-packages (from ipython>=6.1.0->ipywidgets) (1.1.1)\n",
      "Requirement already satisfied: jedi>=0.16 in c:\\users\\sji\\desktop\\mastersthesis\\.venv\\lib\\site-packages (from ipython>=6.1.0->ipywidgets) (0.19.2)\n",
      "Requirement already satisfied: matplotlib-inline in c:\\users\\sji\\desktop\\mastersthesis\\.venv\\lib\\site-packages (from ipython>=6.1.0->ipywidgets) (0.1.7)\n",
      "Requirement already satisfied: prompt_toolkit<3.1.0,>=3.0.41 in c:\\users\\sji\\desktop\\mastersthesis\\.venv\\lib\\site-packages (from ipython>=6.1.0->ipywidgets) (3.0.52)\n",
      "Requirement already satisfied: pygments>=2.4.0 in c:\\users\\sji\\desktop\\mastersthesis\\.venv\\lib\\site-packages (from ipython>=6.1.0->ipywidgets) (2.19.2)\n",
      "Requirement already satisfied: stack_data in c:\\users\\sji\\desktop\\mastersthesis\\.venv\\lib\\site-packages (from ipython>=6.1.0->ipywidgets) (0.6.3)\n",
      "Requirement already satisfied: wcwidth in c:\\users\\sji\\desktop\\mastersthesis\\.venv\\lib\\site-packages (from prompt_toolkit<3.1.0,>=3.0.41->ipython>=6.1.0->ipywidgets) (0.2.14)\n",
      "Requirement already satisfied: parso<0.9.0,>=0.8.4 in c:\\users\\sji\\desktop\\mastersthesis\\.venv\\lib\\site-packages (from jedi>=0.16->ipython>=6.1.0->ipywidgets) (0.8.5)\n",
      "Requirement already satisfied: executing>=1.2.0 in c:\\users\\sji\\desktop\\mastersthesis\\.venv\\lib\\site-packages (from stack_data->ipython>=6.1.0->ipywidgets) (2.2.1)\n",
      "Requirement already satisfied: asttokens>=2.1.0 in c:\\users\\sji\\desktop\\mastersthesis\\.venv\\lib\\site-packages (from stack_data->ipython>=6.1.0->ipywidgets) (3.0.0)\n",
      "Requirement already satisfied: pure-eval in c:\\users\\sji\\desktop\\mastersthesis\\.venv\\lib\\site-packages (from stack_data->ipython>=6.1.0->ipywidgets) (0.2.3)\n",
      "Note: you may need to restart the kernel to use updated packages.\n",
      "Looking in indexes: https://pypi.org/simple, https://pypi.ngc.nvidia.com\n",
      "Requirement already satisfied: ipykernel in c:\\users\\sji\\desktop\\mastersthesis\\.venv\\lib\\site-packages (7.1.0)\n",
      "Requirement already satisfied: comm>=0.1.1 in c:\\users\\sji\\desktop\\mastersthesis\\.venv\\lib\\site-packages (from ipykernel) (0.2.3)\n",
      "Requirement already satisfied: debugpy>=1.6.5 in c:\\users\\sji\\desktop\\mastersthesis\\.venv\\lib\\site-packages (from ipykernel) (1.8.17)\n",
      "Requirement already satisfied: ipython>=7.23.1 in c:\\users\\sji\\desktop\\mastersthesis\\.venv\\lib\\site-packages (from ipykernel) (9.6.0)\n",
      "Requirement already satisfied: jupyter-client>=8.0.0 in c:\\users\\sji\\desktop\\mastersthesis\\.venv\\lib\\site-packages (from ipykernel) (8.6.3)\n",
      "Requirement already satisfied: jupyter-core!=5.0.*,>=4.12 in c:\\users\\sji\\desktop\\mastersthesis\\.venv\\lib\\site-packages (from ipykernel) (5.8.1)\n",
      "Requirement already satisfied: matplotlib-inline>=0.1 in c:\\users\\sji\\desktop\\mastersthesis\\.venv\\lib\\site-packages (from ipykernel) (0.1.7)\n",
      "Requirement already satisfied: nest-asyncio>=1.4 in c:\\users\\sji\\desktop\\mastersthesis\\.venv\\lib\\site-packages (from ipykernel) (1.6.0)\n",
      "Requirement already satisfied: packaging>=22 in c:\\users\\sji\\desktop\\mastersthesis\\.venv\\lib\\site-packages (from ipykernel) (25.0)\n",
      "Requirement already satisfied: psutil>=5.7 in c:\\users\\sji\\desktop\\mastersthesis\\.venv\\lib\\site-packages (from ipykernel) (7.1.0)\n",
      "Requirement already satisfied: pyzmq>=25 in c:\\users\\sji\\desktop\\mastersthesis\\.venv\\lib\\site-packages (from ipykernel) (27.1.0)\n",
      "Requirement already satisfied: tornado>=6.2 in c:\\users\\sji\\desktop\\mastersthesis\\.venv\\lib\\site-packages (from ipykernel) (6.5.2)\n",
      "Requirement already satisfied: traitlets>=5.4.0 in c:\\users\\sji\\desktop\\mastersthesis\\.venv\\lib\\site-packages (from ipykernel) (5.14.3)\n",
      "Requirement already satisfied: colorama in c:\\users\\sji\\desktop\\mastersthesis\\.venv\\lib\\site-packages (from ipython>=7.23.1->ipykernel) (0.4.6)\n",
      "Requirement already satisfied: decorator in c:\\users\\sji\\desktop\\mastersthesis\\.venv\\lib\\site-packages (from ipython>=7.23.1->ipykernel) (5.2.1)\n",
      "Requirement already satisfied: ipython-pygments-lexers in c:\\users\\sji\\desktop\\mastersthesis\\.venv\\lib\\site-packages (from ipython>=7.23.1->ipykernel) (1.1.1)\n",
      "Requirement already satisfied: jedi>=0.16 in c:\\users\\sji\\desktop\\mastersthesis\\.venv\\lib\\site-packages (from ipython>=7.23.1->ipykernel) (0.19.2)\n",
      "Requirement already satisfied: prompt_toolkit<3.1.0,>=3.0.41 in c:\\users\\sji\\desktop\\mastersthesis\\.venv\\lib\\site-packages (from ipython>=7.23.1->ipykernel) (3.0.52)\n",
      "Requirement already satisfied: pygments>=2.4.0 in c:\\users\\sji\\desktop\\mastersthesis\\.venv\\lib\\site-packages (from ipython>=7.23.1->ipykernel) (2.19.2)\n",
      "Requirement already satisfied: stack_data in c:\\users\\sji\\desktop\\mastersthesis\\.venv\\lib\\site-packages (from ipython>=7.23.1->ipykernel) (0.6.3)\n",
      "Requirement already satisfied: wcwidth in c:\\users\\sji\\desktop\\mastersthesis\\.venv\\lib\\site-packages (from prompt_toolkit<3.1.0,>=3.0.41->ipython>=7.23.1->ipykernel) (0.2.14)\n",
      "Requirement already satisfied: parso<0.9.0,>=0.8.4 in c:\\users\\sji\\desktop\\mastersthesis\\.venv\\lib\\site-packages (from jedi>=0.16->ipython>=7.23.1->ipykernel) (0.8.5)\n",
      "Requirement already satisfied: python-dateutil>=2.8.2 in c:\\users\\sji\\desktop\\mastersthesis\\.venv\\lib\\site-packages (from jupyter-client>=8.0.0->ipykernel) (2.9.0.post0)\n",
      "Requirement already satisfied: platformdirs>=2.5 in c:\\users\\sji\\desktop\\mastersthesis\\.venv\\lib\\site-packages (from jupyter-core!=5.0.*,>=4.12->ipykernel) (4.4.0)\n",
      "Requirement already satisfied: pywin32>=300 in c:\\users\\sji\\desktop\\mastersthesis\\.venv\\lib\\site-packages (from jupyter-core!=5.0.*,>=4.12->ipykernel) (311)\n",
      "Requirement already satisfied: six>=1.5 in c:\\users\\sji\\desktop\\mastersthesis\\.venv\\lib\\site-packages (from python-dateutil>=2.8.2->jupyter-client>=8.0.0->ipykernel) (1.17.0)\n",
      "Requirement already satisfied: executing>=1.2.0 in c:\\users\\sji\\desktop\\mastersthesis\\.venv\\lib\\site-packages (from stack_data->ipython>=7.23.1->ipykernel) (2.2.1)\n",
      "Requirement already satisfied: asttokens>=2.1.0 in c:\\users\\sji\\desktop\\mastersthesis\\.venv\\lib\\site-packages (from stack_data->ipython>=7.23.1->ipykernel) (3.0.0)\n",
      "Requirement already satisfied: pure-eval in c:\\users\\sji\\desktop\\mastersthesis\\.venv\\lib\\site-packages (from stack_data->ipython>=7.23.1->ipykernel) (0.2.3)\n",
      "Note: you may need to restart the kernel to use updated packages.\n",
      "Looking in indexes: https://pypi.org/simple, https://pypi.ngc.nvidia.com\n",
      "Requirement already satisfied: easyocr in c:\\users\\sji\\desktop\\mastersthesis\\.venv\\lib\\site-packages (1.7.2)\n",
      "Requirement already satisfied: transformers in c:\\users\\sji\\desktop\\mastersthesis\\.venv\\lib\\site-packages (4.57.0)\n",
      "Requirement already satisfied: torch in c:\\users\\sji\\desktop\\mastersthesis\\.venv\\lib\\site-packages (2.8.0+cpu)\n",
      "Requirement already satisfied: pdf2image in c:\\users\\sji\\desktop\\mastersthesis\\.venv\\lib\\site-packages (1.17.0)\n",
      "Requirement already satisfied: pillow in c:\\users\\sji\\desktop\\mastersthesis\\.venv\\lib\\site-packages (11.3.0)\n",
      "Requirement already satisfied: jiwer in c:\\users\\sji\\desktop\\mastersthesis\\.venv\\lib\\site-packages (4.0.0)\n",
      "Requirement already satisfied: paddleocr in c:\\users\\sji\\desktop\\mastersthesis\\.venv\\lib\\site-packages (3.2.0)\n",
      "Requirement already satisfied: hf_xet in c:\\users\\sji\\desktop\\mastersthesis\\.venv\\lib\\site-packages (1.1.10)\n",
      "Requirement already satisfied: paddlepaddle in c:\\users\\sji\\desktop\\mastersthesis\\.venv\\lib\\site-packages (3.2.0)\n",
      "Requirement already satisfied: python-doctr in c:\\users\\sji\\desktop\\mastersthesis\\.venv\\lib\\site-packages (1.0.0)\n",
      "Requirement already satisfied: torchvision>=0.5 in c:\\users\\sji\\desktop\\mastersthesis\\.venv\\lib\\site-packages (from easyocr) (0.23.0+cpu)\n",
      "Requirement already satisfied: opencv-python-headless in c:\\users\\sji\\desktop\\mastersthesis\\.venv\\lib\\site-packages (from easyocr) (4.12.0.88)\n",
      "Requirement already satisfied: scipy in c:\\users\\sji\\desktop\\mastersthesis\\.venv\\lib\\site-packages (from easyocr) (1.16.2)\n",
      "Requirement already satisfied: numpy in c:\\users\\sji\\desktop\\mastersthesis\\.venv\\lib\\site-packages (from easyocr) (2.1.2)\n",
      "Requirement already satisfied: scikit-image in c:\\users\\sji\\desktop\\mastersthesis\\.venv\\lib\\site-packages (from easyocr) (0.25.2)\n",
      "Requirement already satisfied: python-bidi in c:\\users\\sji\\desktop\\mastersthesis\\.venv\\lib\\site-packages (from easyocr) (0.6.6)\n",
      "Requirement already satisfied: PyYAML in c:\\users\\sji\\desktop\\mastersthesis\\.venv\\lib\\site-packages (from easyocr) (6.0.2)\n",
      "Requirement already satisfied: Shapely in c:\\users\\sji\\desktop\\mastersthesis\\.venv\\lib\\site-packages (from easyocr) (2.1.2)\n",
      "Requirement already satisfied: pyclipper in c:\\users\\sji\\desktop\\mastersthesis\\.venv\\lib\\site-packages (from easyocr) (1.3.0.post6)\n",
      "Requirement already satisfied: ninja in c:\\users\\sji\\desktop\\mastersthesis\\.venv\\lib\\site-packages (from easyocr) (1.13.0)\n",
      "Requirement already satisfied: filelock in c:\\users\\sji\\desktop\\mastersthesis\\.venv\\lib\\site-packages (from transformers) (3.13.1)\n",
      "Requirement already satisfied: huggingface-hub<1.0,>=0.34.0 in c:\\users\\sji\\desktop\\mastersthesis\\.venv\\lib\\site-packages (from transformers) (0.35.3)\n",
      "Requirement already satisfied: packaging>=20.0 in c:\\users\\sji\\desktop\\mastersthesis\\.venv\\lib\\site-packages (from transformers) (25.0)\n",
      "Requirement already satisfied: regex!=2019.12.17 in c:\\users\\sji\\desktop\\mastersthesis\\.venv\\lib\\site-packages (from transformers) (2025.9.18)\n",
      "Requirement already satisfied: requests in c:\\users\\sji\\desktop\\mastersthesis\\.venv\\lib\\site-packages (from transformers) (2.32.5)\n",
      "Requirement already satisfied: tokenizers<=0.23.0,>=0.22.0 in c:\\users\\sji\\desktop\\mastersthesis\\.venv\\lib\\site-packages (from transformers) (0.22.1)\n",
      "Requirement already satisfied: safetensors>=0.4.3 in c:\\users\\sji\\desktop\\mastersthesis\\.venv\\lib\\site-packages (from transformers) (0.6.2)\n",
      "Requirement already satisfied: tqdm>=4.27 in c:\\users\\sji\\desktop\\mastersthesis\\.venv\\lib\\site-packages (from transformers) (4.67.1)\n",
      "Requirement already satisfied: fsspec>=2023.5.0 in c:\\users\\sji\\desktop\\mastersthesis\\.venv\\lib\\site-packages (from huggingface-hub<1.0,>=0.34.0->transformers) (2024.6.1)\n",
      "Requirement already satisfied: typing-extensions>=3.7.4.3 in c:\\users\\sji\\desktop\\mastersthesis\\.venv\\lib\\site-packages (from huggingface-hub<1.0,>=0.34.0->transformers) (4.15.0)\n",
      "Requirement already satisfied: sympy>=1.13.3 in c:\\users\\sji\\desktop\\mastersthesis\\.venv\\lib\\site-packages (from torch) (1.13.3)\n",
      "Requirement already satisfied: networkx in c:\\users\\sji\\desktop\\mastersthesis\\.venv\\lib\\site-packages (from torch) (3.3)\n",
      "Requirement already satisfied: jinja2 in c:\\users\\sji\\desktop\\mastersthesis\\.venv\\lib\\site-packages (from torch) (3.1.6)\n",
      "Requirement already satisfied: setuptools in c:\\users\\sji\\desktop\\mastersthesis\\.venv\\lib\\site-packages (from torch) (80.9.0)\n",
      "Requirement already satisfied: click>=8.1.8 in c:\\users\\sji\\desktop\\mastersthesis\\.venv\\lib\\site-packages (from jiwer) (8.3.0)\n",
      "Requirement already satisfied: rapidfuzz>=3.9.7 in c:\\users\\sji\\desktop\\mastersthesis\\.venv\\lib\\site-packages (from jiwer) (3.14.1)\n",
      "Requirement already satisfied: paddlex<3.3.0,>=3.2.0 in c:\\users\\sji\\desktop\\mastersthesis\\.venv\\lib\\site-packages (from paddlex[ocr-core]<3.3.0,>=3.2.0->paddleocr) (3.2.1)\n",
      "Requirement already satisfied: aistudio_sdk>=0.3.5 in c:\\users\\sji\\desktop\\mastersthesis\\.venv\\lib\\site-packages (from paddlex<3.3.0,>=3.2.0->paddlex[ocr-core]<3.3.0,>=3.2.0->paddleocr) (0.3.8)\n",
      "Requirement already satisfied: chardet in c:\\users\\sji\\desktop\\mastersthesis\\.venv\\lib\\site-packages (from paddlex<3.3.0,>=3.2.0->paddlex[ocr-core]<3.3.0,>=3.2.0->paddleocr) (5.2.0)\n",
      "Requirement already satisfied: colorlog in c:\\users\\sji\\desktop\\mastersthesis\\.venv\\lib\\site-packages (from paddlex<3.3.0,>=3.2.0->paddlex[ocr-core]<3.3.0,>=3.2.0->paddleocr) (6.9.0)\n",
      "Requirement already satisfied: modelscope>=1.28.0 in c:\\users\\sji\\desktop\\mastersthesis\\.venv\\lib\\site-packages (from paddlex<3.3.0,>=3.2.0->paddlex[ocr-core]<3.3.0,>=3.2.0->paddleocr) (1.30.0)\n",
      "Requirement already satisfied: pandas>=1.3 in c:\\users\\sji\\desktop\\mastersthesis\\.venv\\lib\\site-packages (from paddlex<3.3.0,>=3.2.0->paddlex[ocr-core]<3.3.0,>=3.2.0->paddleocr) (2.3.3)\n",
      "Requirement already satisfied: prettytable in c:\\users\\sji\\desktop\\mastersthesis\\.venv\\lib\\site-packages (from paddlex<3.3.0,>=3.2.0->paddlex[ocr-core]<3.3.0,>=3.2.0->paddleocr) (3.16.0)\n",
      "Requirement already satisfied: py-cpuinfo in c:\\users\\sji\\desktop\\mastersthesis\\.venv\\lib\\site-packages (from paddlex<3.3.0,>=3.2.0->paddlex[ocr-core]<3.3.0,>=3.2.0->paddleocr) (9.0.0)\n",
      "Requirement already satisfied: pydantic>=2 in c:\\users\\sji\\desktop\\mastersthesis\\.venv\\lib\\site-packages (from paddlex<3.3.0,>=3.2.0->paddlex[ocr-core]<3.3.0,>=3.2.0->paddleocr) (2.12.0)\n",
      "Requirement already satisfied: ruamel.yaml in c:\\users\\sji\\desktop\\mastersthesis\\.venv\\lib\\site-packages (from paddlex<3.3.0,>=3.2.0->paddlex[ocr-core]<3.3.0,>=3.2.0->paddleocr) (0.18.15)\n",
      "Requirement already satisfied: ujson in c:\\users\\sji\\desktop\\mastersthesis\\.venv\\lib\\site-packages (from paddlex<3.3.0,>=3.2.0->paddlex[ocr-core]<3.3.0,>=3.2.0->paddleocr) (5.11.0)\n",
      "Requirement already satisfied: imagesize in c:\\users\\sji\\desktop\\mastersthesis\\.venv\\lib\\site-packages (from paddlex[ocr-core]<3.3.0,>=3.2.0->paddleocr) (1.4.1)\n",
      "Requirement already satisfied: opencv-contrib-python==4.10.0.84 in c:\\users\\sji\\desktop\\mastersthesis\\.venv\\lib\\site-packages (from paddlex[ocr-core]<3.3.0,>=3.2.0->paddleocr) (4.10.0.84)\n",
      "Requirement already satisfied: pypdfium2>=4 in c:\\users\\sji\\desktop\\mastersthesis\\.venv\\lib\\site-packages (from paddlex[ocr-core]<3.3.0,>=3.2.0->paddleocr) (4.30.0)\n",
      "Requirement already satisfied: httpx in c:\\users\\sji\\desktop\\mastersthesis\\.venv\\lib\\site-packages (from paddlepaddle) (0.28.1)\n",
      "Requirement already satisfied: protobuf>=3.20.2 in c:\\users\\sji\\desktop\\mastersthesis\\.venv\\lib\\site-packages (from paddlepaddle) (6.32.1)\n",
      "Requirement already satisfied: opt-einsum==3.3.0 in c:\\users\\sji\\desktop\\mastersthesis\\.venv\\lib\\site-packages (from paddlepaddle) (3.3.0)\n",
      "Requirement already satisfied: onnx<3.0.0,>=1.12.0 in c:\\users\\sji\\desktop\\mastersthesis\\.venv\\lib\\site-packages (from python-doctr) (1.19.1)\n",
      "Requirement already satisfied: h5py<4.0.0,>=3.1.0 in c:\\users\\sji\\desktop\\mastersthesis\\.venv\\lib\\site-packages (from python-doctr) (3.14.0)\n",
      "Requirement already satisfied: opencv-python<5.0.0,>=4.5.0 in c:\\users\\sji\\desktop\\mastersthesis\\.venv\\lib\\site-packages (from python-doctr) (4.12.0.88)\n",
      "Requirement already satisfied: langdetect<2.0.0,>=1.0.9 in c:\\users\\sji\\desktop\\mastersthesis\\.venv\\lib\\site-packages (from python-doctr) (1.0.9)\n",
      "Requirement already satisfied: defusedxml>=0.7.0 in c:\\users\\sji\\desktop\\mastersthesis\\.venv\\lib\\site-packages (from python-doctr) (0.7.1)\n",
      "Requirement already satisfied: anyascii>=0.3.2 in c:\\users\\sji\\desktop\\mastersthesis\\.venv\\lib\\site-packages (from python-doctr) (0.3.3)\n",
      "Requirement already satisfied: validators>=0.18.0 in c:\\users\\sji\\desktop\\mastersthesis\\.venv\\lib\\site-packages (from python-doctr) (0.35.0)\n",
      "Requirement already satisfied: six in c:\\users\\sji\\desktop\\mastersthesis\\.venv\\lib\\site-packages (from langdetect<2.0.0,>=1.0.9->python-doctr) (1.17.0)\n",
      "Requirement already satisfied: ml_dtypes>=0.5.0 in c:\\users\\sji\\desktop\\mastersthesis\\.venv\\lib\\site-packages (from onnx<3.0.0,>=1.12.0->python-doctr) (0.5.3)\n",
      "Requirement already satisfied: psutil in c:\\users\\sji\\desktop\\mastersthesis\\.venv\\lib\\site-packages (from aistudio_sdk>=0.3.5->paddlex<3.3.0,>=3.2.0->paddlex[ocr-core]<3.3.0,>=3.2.0->paddleocr) (7.1.0)\n",
      "Requirement already satisfied: bce-python-sdk in c:\\users\\sji\\desktop\\mastersthesis\\.venv\\lib\\site-packages (from aistudio_sdk>=0.3.5->paddlex<3.3.0,>=3.2.0->paddlex[ocr-core]<3.3.0,>=3.2.0->paddleocr) (0.9.46)\n",
      "Requirement already satisfied: colorama in c:\\users\\sji\\desktop\\mastersthesis\\.venv\\lib\\site-packages (from click>=8.1.8->jiwer) (0.4.6)\n",
      "Requirement already satisfied: urllib3>=1.26 in c:\\users\\sji\\desktop\\mastersthesis\\.venv\\lib\\site-packages (from modelscope>=1.28.0->paddlex<3.3.0,>=3.2.0->paddlex[ocr-core]<3.3.0,>=3.2.0->paddleocr) (2.5.0)\n",
      "Requirement already satisfied: python-dateutil>=2.8.2 in c:\\users\\sji\\desktop\\mastersthesis\\.venv\\lib\\site-packages (from pandas>=1.3->paddlex<3.3.0,>=3.2.0->paddlex[ocr-core]<3.3.0,>=3.2.0->paddleocr) (2.9.0.post0)\n",
      "Requirement already satisfied: pytz>=2020.1 in c:\\users\\sji\\desktop\\mastersthesis\\.venv\\lib\\site-packages (from pandas>=1.3->paddlex<3.3.0,>=3.2.0->paddlex[ocr-core]<3.3.0,>=3.2.0->paddleocr) (2025.2)\n",
      "Requirement already satisfied: tzdata>=2022.7 in c:\\users\\sji\\desktop\\mastersthesis\\.venv\\lib\\site-packages (from pandas>=1.3->paddlex<3.3.0,>=3.2.0->paddlex[ocr-core]<3.3.0,>=3.2.0->paddleocr) (2025.2)\n",
      "Requirement already satisfied: annotated-types>=0.6.0 in c:\\users\\sji\\desktop\\mastersthesis\\.venv\\lib\\site-packages (from pydantic>=2->paddlex<3.3.0,>=3.2.0->paddlex[ocr-core]<3.3.0,>=3.2.0->paddleocr) (0.7.0)\n",
      "Requirement already satisfied: pydantic-core==2.41.1 in c:\\users\\sji\\desktop\\mastersthesis\\.venv\\lib\\site-packages (from pydantic>=2->paddlex<3.3.0,>=3.2.0->paddlex[ocr-core]<3.3.0,>=3.2.0->paddleocr) (2.41.1)\n",
      "Requirement already satisfied: typing-inspection>=0.4.2 in c:\\users\\sji\\desktop\\mastersthesis\\.venv\\lib\\site-packages (from pydantic>=2->paddlex<3.3.0,>=3.2.0->paddlex[ocr-core]<3.3.0,>=3.2.0->paddleocr) (0.4.2)\n",
      "Requirement already satisfied: charset_normalizer<4,>=2 in c:\\users\\sji\\desktop\\mastersthesis\\.venv\\lib\\site-packages (from requests->transformers) (3.4.3)\n",
      "Requirement already satisfied: idna<4,>=2.5 in c:\\users\\sji\\desktop\\mastersthesis\\.venv\\lib\\site-packages (from requests->transformers) (3.10)\n",
      "Requirement already satisfied: certifi>=2017.4.17 in c:\\users\\sji\\desktop\\mastersthesis\\.venv\\lib\\site-packages (from requests->transformers) (2025.10.5)\n",
      "Requirement already satisfied: mpmath<1.4,>=1.1.0 in c:\\users\\sji\\desktop\\mastersthesis\\.venv\\lib\\site-packages (from sympy>=1.13.3->torch) (1.3.0)\n",
      "Requirement already satisfied: pycryptodome>=3.8.0 in c:\\users\\sji\\desktop\\mastersthesis\\.venv\\lib\\site-packages (from bce-python-sdk->aistudio_sdk>=0.3.5->paddlex<3.3.0,>=3.2.0->paddlex[ocr-core]<3.3.0,>=3.2.0->paddleocr) (3.23.0)\n",
      "Requirement already satisfied: future>=0.6.0 in c:\\users\\sji\\desktop\\mastersthesis\\.venv\\lib\\site-packages (from bce-python-sdk->aistudio_sdk>=0.3.5->paddlex<3.3.0,>=3.2.0->paddlex[ocr-core]<3.3.0,>=3.2.0->paddleocr) (1.0.0)\n",
      "Requirement already satisfied: anyio in c:\\users\\sji\\desktop\\mastersthesis\\.venv\\lib\\site-packages (from httpx->paddlepaddle) (4.11.0)\n",
      "Requirement already satisfied: httpcore==1.* in c:\\users\\sji\\desktop\\mastersthesis\\.venv\\lib\\site-packages (from httpx->paddlepaddle) (1.0.9)\n",
      "Requirement already satisfied: h11>=0.16 in c:\\users\\sji\\desktop\\mastersthesis\\.venv\\lib\\site-packages (from httpcore==1.*->httpx->paddlepaddle) (0.16.0)\n",
      "Requirement already satisfied: sniffio>=1.1 in c:\\users\\sji\\desktop\\mastersthesis\\.venv\\lib\\site-packages (from anyio->httpx->paddlepaddle) (1.3.1)\n",
      "Requirement already satisfied: MarkupSafe>=2.0 in c:\\users\\sji\\desktop\\mastersthesis\\.venv\\lib\\site-packages (from jinja2->torch) (3.0.3)\n",
      "Requirement already satisfied: wcwidth in c:\\users\\sji\\desktop\\mastersthesis\\.venv\\lib\\site-packages (from prettytable->paddlex<3.3.0,>=3.2.0->paddlex[ocr-core]<3.3.0,>=3.2.0->paddleocr) (0.2.14)\n",
      "Requirement already satisfied: ruamel.yaml.clib>=0.2.7 in c:\\users\\sji\\desktop\\mastersthesis\\.venv\\lib\\site-packages (from ruamel.yaml->paddlex<3.3.0,>=3.2.0->paddlex[ocr-core]<3.3.0,>=3.2.0->paddleocr) (0.2.14)\n",
      "Requirement already satisfied: imageio!=2.35.0,>=2.33 in c:\\users\\sji\\desktop\\mastersthesis\\.venv\\lib\\site-packages (from scikit-image->easyocr) (2.37.0)\n",
      "Requirement already satisfied: tifffile>=2022.8.12 in c:\\users\\sji\\desktop\\mastersthesis\\.venv\\lib\\site-packages (from scikit-image->easyocr) (2025.10.4)\n",
      "Requirement already satisfied: lazy-loader>=0.4 in c:\\users\\sji\\desktop\\mastersthesis\\.venv\\lib\\site-packages (from scikit-image->easyocr) (0.4)\n",
      "Note: you may need to restart the kernel to use updated packages.\n",
      "Looking in indexes: https://pypi.org/simple, https://pypi.ngc.nvidia.com\n",
      "Requirement already satisfied: PyMuPDF in c:\\users\\sji\\desktop\\mastersthesis\\.venv\\lib\\site-packages (1.26.4)\n",
      "Note: you may need to restart the kernel to use updated packages.\n",
      "Looking in indexes: https://pypi.org/simple, https://pypi.ngc.nvidia.com\n",
      "Requirement already satisfied: pandas in c:\\users\\sji\\desktop\\mastersthesis\\.venv\\lib\\site-packages (2.3.3)\n",
      "Requirement already satisfied: numpy>=1.26.0 in c:\\users\\sji\\desktop\\mastersthesis\\.venv\\lib\\site-packages (from pandas) (2.1.2)\n",
      "Requirement already satisfied: python-dateutil>=2.8.2 in c:\\users\\sji\\desktop\\mastersthesis\\.venv\\lib\\site-packages (from pandas) (2.9.0.post0)\n",
      "Requirement already satisfied: pytz>=2020.1 in c:\\users\\sji\\desktop\\mastersthesis\\.venv\\lib\\site-packages (from pandas) (2025.2)\n",
      "Requirement already satisfied: tzdata>=2022.7 in c:\\users\\sji\\desktop\\mastersthesis\\.venv\\lib\\site-packages (from pandas) (2025.2)\n",
      "Requirement already satisfied: six>=1.5 in c:\\users\\sji\\desktop\\mastersthesis\\.venv\\lib\\site-packages (from python-dateutil>=2.8.2->pandas) (1.17.0)\n",
      "Note: you may need to restart the kernel to use updated packages.\n",
      "Looking in indexes: https://pypi.org/simple, https://pypi.ngc.nvidia.com\n",
      "Requirement already satisfied: matplotlib in c:\\users\\sji\\desktop\\mastersthesis\\.venv\\lib\\site-packages (3.10.6)\n",
      "Requirement already satisfied: contourpy>=1.0.1 in c:\\users\\sji\\desktop\\mastersthesis\\.venv\\lib\\site-packages (from matplotlib) (1.3.3)\n",
      "Requirement already satisfied: cycler>=0.10 in c:\\users\\sji\\desktop\\mastersthesis\\.venv\\lib\\site-packages (from matplotlib) (0.12.1)\n",
      "Requirement already satisfied: fonttools>=4.22.0 in c:\\users\\sji\\desktop\\mastersthesis\\.venv\\lib\\site-packages (from matplotlib) (4.60.1)\n",
      "Requirement already satisfied: kiwisolver>=1.3.1 in c:\\users\\sji\\desktop\\mastersthesis\\.venv\\lib\\site-packages (from matplotlib) (1.4.9)\n",
      "Requirement already satisfied: numpy>=1.23 in c:\\users\\sji\\desktop\\mastersthesis\\.venv\\lib\\site-packages (from matplotlib) (2.1.2)\n",
      "Requirement already satisfied: packaging>=20.0 in c:\\users\\sji\\desktop\\mastersthesis\\.venv\\lib\\site-packages (from matplotlib) (25.0)\n",
      "Requirement already satisfied: pillow>=8 in c:\\users\\sji\\desktop\\mastersthesis\\.venv\\lib\\site-packages (from matplotlib) (11.3.0)\n",
      "Requirement already satisfied: pyparsing>=2.3.1 in c:\\users\\sji\\desktop\\mastersthesis\\.venv\\lib\\site-packages (from matplotlib) (3.2.5)\n",
      "Requirement already satisfied: python-dateutil>=2.7 in c:\\users\\sji\\desktop\\mastersthesis\\.venv\\lib\\site-packages (from matplotlib) (2.9.0.post0)\n",
      "Requirement already satisfied: six>=1.5 in c:\\users\\sji\\desktop\\mastersthesis\\.venv\\lib\\site-packages (from python-dateutil>=2.7->matplotlib) (1.17.0)\n",
      "Note: you may need to restart the kernel to use updated packages.\n",
      "Looking in indexes: https://pypi.org/simple, https://pypi.ngc.nvidia.com\n",
      "Requirement already satisfied: seaborn in c:\\users\\sji\\desktop\\mastersthesis\\.venv\\lib\\site-packages (0.13.2)\n",
      "Requirement already satisfied: numpy!=1.24.0,>=1.20 in c:\\users\\sji\\desktop\\mastersthesis\\.venv\\lib\\site-packages (from seaborn) (2.1.2)\n",
      "Requirement already satisfied: pandas>=1.2 in c:\\users\\sji\\desktop\\mastersthesis\\.venv\\lib\\site-packages (from seaborn) (2.3.3)\n",
      "Requirement already satisfied: matplotlib!=3.6.1,>=3.4 in c:\\users\\sji\\desktop\\mastersthesis\\.venv\\lib\\site-packages (from seaborn) (3.10.6)\n",
      "Requirement already satisfied: contourpy>=1.0.1 in c:\\users\\sji\\desktop\\mastersthesis\\.venv\\lib\\site-packages (from matplotlib!=3.6.1,>=3.4->seaborn) (1.3.3)\n",
      "Requirement already satisfied: cycler>=0.10 in c:\\users\\sji\\desktop\\mastersthesis\\.venv\\lib\\site-packages (from matplotlib!=3.6.1,>=3.4->seaborn) (0.12.1)\n",
      "Requirement already satisfied: fonttools>=4.22.0 in c:\\users\\sji\\desktop\\mastersthesis\\.venv\\lib\\site-packages (from matplotlib!=3.6.1,>=3.4->seaborn) (4.60.1)\n",
      "Requirement already satisfied: kiwisolver>=1.3.1 in c:\\users\\sji\\desktop\\mastersthesis\\.venv\\lib\\site-packages (from matplotlib!=3.6.1,>=3.4->seaborn) (1.4.9)\n",
      "Requirement already satisfied: packaging>=20.0 in c:\\users\\sji\\desktop\\mastersthesis\\.venv\\lib\\site-packages (from matplotlib!=3.6.1,>=3.4->seaborn) (25.0)\n",
      "Requirement already satisfied: pillow>=8 in c:\\users\\sji\\desktop\\mastersthesis\\.venv\\lib\\site-packages (from matplotlib!=3.6.1,>=3.4->seaborn) (11.3.0)\n",
      "Requirement already satisfied: pyparsing>=2.3.1 in c:\\users\\sji\\desktop\\mastersthesis\\.venv\\lib\\site-packages (from matplotlib!=3.6.1,>=3.4->seaborn) (3.2.5)\n",
      "Requirement already satisfied: python-dateutil>=2.7 in c:\\users\\sji\\desktop\\mastersthesis\\.venv\\lib\\site-packages (from matplotlib!=3.6.1,>=3.4->seaborn) (2.9.0.post0)\n",
      "Requirement already satisfied: pytz>=2020.1 in c:\\users\\sji\\desktop\\mastersthesis\\.venv\\lib\\site-packages (from pandas>=1.2->seaborn) (2025.2)\n",
      "Requirement already satisfied: tzdata>=2022.7 in c:\\users\\sji\\desktop\\mastersthesis\\.venv\\lib\\site-packages (from pandas>=1.2->seaborn) (2025.2)\n",
      "Requirement already satisfied: six>=1.5 in c:\\users\\sji\\desktop\\mastersthesis\\.venv\\lib\\site-packages (from python-dateutil>=2.7->matplotlib!=3.6.1,>=3.4->seaborn) (1.17.0)\n",
      "Note: you may need to restart the kernel to use updated packages.\n"
     ]
    }
   ],
   "source": [
    "%pip install --upgrade pip\n",
    "%pip install --upgrade jupyter\n",
    "%pip install --upgrade ipywidgets\n",
    "%pip install --upgrade ipykernel\n",
    "\n",
    "# Install necessary packages\n",
    "%pip install easyocr transformers torch pdf2image pillow jiwer paddleocr hf_xet paddlepaddle python-doctr\n",
    "# pdf reading\n",
    "%pip install PyMuPDF\n",
    "\n",
    "# Data analysis and visualization\n",
    "%pip install pandas\n",
    "%pip install matplotlib\n",
    "%pip install seaborn"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "id": "ae33632a",
   "metadata": {},
   "outputs": [],
   "source": [
    "# Imports\n",
    "import os\n",
    "import numpy as np\n",
    "import pandas as pd\n",
    "import matplotlib.pyplot as plt\n",
    "from pdf2image import convert_from_path\n",
    "from PIL import Image, ImageOps\n",
    "import easyocr\n",
    "from transformers import TrOCRProcessor, VisionEncoderDecoderModel\n",
    "import torch\n",
    "from jiwer import wer, cer\n",
    "from paddleocr import PaddleOCR\n",
    "import fitz  # PyMuPDF\n",
    "from doctr.models import ocr_predictor\n",
    "import re"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "0e00f1b0",
   "metadata": {},
   "source": [
    "## 1 Configuration"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "metadata": {},
   "outputs": [],
   "source": [
    "PDF_FOLDER = './instructions'  # Folder containing PDF files\n",
    "OUTPUT_FOLDER = 'results'\n",
    "os.makedirs(OUTPUT_FOLDER, exist_ok=True)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "id": "dcefbebc",
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "[2025-11-10 16:39:09,601] [ WARNING] easyocr.py:80 - Neither CUDA nor MPS are available - defaulting to CPU. Note: This module is much faster with a GPU.\n"
     ]
    }
   ],
   "source": [
    "# 1. EasyOCR \n",
    "import easyocr\n",
    "easyocr_reader = easyocr.Reader(['es', 'en'])  # Spanish and English"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "id": "243849b9",
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "\u001b[32mCreating model: ('PP-LCNet_x1_0_textline_ori', None)\u001b[0m\n",
      "\u001b[32mModel files already exist. Using cached files. To redownload, please delete the directory manually: `C:\\Users\\sji\\.paddlex\\official_models\\PP-LCNet_x1_0_textline_ori`.\u001b[0m\n",
      "\u001b[32mCreating model: ('PP-OCRv5_server_det', None)\u001b[0m\n",
      "\u001b[32mModel files already exist. Using cached files. To redownload, please delete the directory manually: `C:\\Users\\sji\\.paddlex\\official_models\\PP-OCRv5_server_det`.\u001b[0m\n",
      "\u001b[32mCreating model: ('PP-OCRv5_server_rec', None)\u001b[0m\n",
      "\u001b[32mModel files already exist. Using cached files. To redownload, please delete the directory manually: `C:\\Users\\sji\\.paddlex\\official_models\\PP-OCRv5_server_rec`.\u001b[0m\n"
     ]
    }
   ],
   "source": [
    "# 3. PaddleOCR \n",
    "# https://www.paddleocr.ai/v3.0.0/en/version3.x/pipeline_usage/OCR.html?utm_source=chatgpt.com#21-command-line\n",
    "from paddleocr import PaddleOCR\n",
    "\n",
    "# Initialize with better settings for Spanish/Latin text\n",
    "# https://www.paddleocr.ai/main/en/version3.x/algorithm/PP-OCRv5/PP-OCRv5_multi_languages.html?utm_source=chatgpt.com#5-models-and-their-supported-languages\n",
    "paddleocr_model = PaddleOCR(\n",
    "    text_detection_model_name=\"PP-OCRv5_server_det\",\n",
    "    text_recognition_model_name=\"PP-OCRv5_server_rec\",\n",
    "    use_doc_orientation_classify=False,\n",
    "    use_doc_unwarping=False,\n",
    "    use_textline_orientation=True,\n",
    ")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 29,
   "id": "329da34a",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "3.2.0\n"
     ]
    }
   ],
   "source": [
    "import paddleocr\n",
    "\n",
    "print(paddleocr.__version__)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 30,
   "id": "f5b30d2f",
   "metadata": {},
   "outputs": [],
   "source": [
    "# doctr\n",
    "doctr_model = ocr_predictor(det_arch=\"db_resnet50\", reco_arch=\"sar_resnet31\", pretrained=True)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "84c999e2",
   "metadata": {},
   "source": [
    "## 2 Helper Functions"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 31,
   "id": "9596c7df",
   "metadata": {},
   "outputs": [],
   "source": [
    "from typing import List, Optional\n",
    "\n",
    "def show_page(img: Image.Image, text: str,  scale: float = 0.15):\n",
    "    \"\"\"\n",
    "    Displays a smaller version of the image with text as a footer.\n",
    "    \"\"\"\n",
    "    # Compute plot size based on image dimensions (but without resizing the image)\n",
    "    w, h = img.size\n",
    "    figsize = (w * scale / 100, h * scale / 100)  # convert pixels to inches approx\n",
    "\n",
    "    fig, ax = plt.subplots(figsize=figsize)\n",
    "    ax.imshow(img)\n",
    "    ax.axis(\"off\")\n",
    "\n",
    "\n",
    "    # Add OCR text below the image (footer)\n",
    "    plt.figtext(0.5, 0.02, text.strip(), wrap=True, ha='center', va='bottom', fontsize=10)\n",
    "    plt.tight_layout()\n",
    "    plt.show()\n",
    "\n",
    "def pdf_to_images(pdf_path: str, dpi: int = 300, pages: List[int] = None) -> List[Image.Image]:\n",
    "    \"\"\"Render a PDF into a list of PIL Images using PyMuPDF or pdf2image.\"\"\"\n",
    "    images = []\n",
    "    if fitz is not None:\n",
    "        doc = fitz.open(pdf_path)\n",
    "        page_indices = pages if pages is not None else list(range(len(doc)))\n",
    "        for i in page_indices:\n",
    "            page = doc.load_page(i)\n",
    "            mat = fitz.Matrix(dpi/72.0, dpi/72.0)\n",
    "            pix = page.get_pixmap(matrix=mat, alpha=False)\n",
    "            img = Image.frombytes('RGB', [pix.width, pix.height], pix.samples)\n",
    "            images.append(img)\n",
    "        doc.close()\n",
    "    elif convert_from_path is not None:\n",
    "        if pages is None:\n",
    "            images = convert_from_path(pdf_path, dpi=dpi)\n",
    "        else:\n",
    "            # pdf2image supports first_page/last_page; render a slice if contiguous\n",
    "            images = [convert_from_path(pdf_path, dpi=dpi)[i] for i in pages]\n",
    "    else:\n",
    "        raise RuntimeError('Install PyMuPDF or pdf2image to convert PDFs.')\n",
    "    return images\n",
    "\n",
    "def pdf_extract_text(pdf_path, page_num, line_tolerance=15) -> str:\n",
    "    \"\"\"\n",
    "    Extracts text from a specific PDF page in proper reading order.\n",
    "    Adds '\\n' when blocks are vertically separated more than line_tolerance.\n",
    "    Removes bullet-like characters (, •, ▪, etc.).\n",
    "    \"\"\"\n",
    "    doc = fitz.open(pdf_path)\n",
    "\n",
    "    if page_num < 1 or page_num > len(doc):\n",
    "        return \"\"\n",
    "\n",
    "    page = doc[page_num - 1]\n",
    "    blocks = page.get_text(\"blocks\")  # (x0, y0, x1, y1, text, block_no, block_type)\n",
    "\n",
    "    # Sort blocks: top-to-bottom, left-to-right\n",
    "    blocks_sorted = sorted(blocks, key=lambda b: (b[1], b[0]))\n",
    "\n",
    "    text_lines = []\n",
    "    last_y = None\n",
    "\n",
    "    for b in blocks_sorted:\n",
    "        y0 = b[1]\n",
    "        text_block = b[4].strip()\n",
    "\n",
    "        # Remove bullet-like characters\n",
    "        text_block = re.sub(r\"[•▪◦●❖▶■]\", \"\", text_block)\n",
    "\n",
    "        # If new line (based on vertical gap)\n",
    "        if last_y is not None and abs(y0 - last_y) > line_tolerance:\n",
    "            text_lines.append(\"\")  # blank line for spacing\n",
    "\n",
    "        text_lines.append(text_block.strip())\n",
    "        last_y = y0\n",
    "\n",
    "    # Join all lines with real newlines\n",
    "    text = \" \".join(text_lines)\n",
    "    # Normalize spaces\n",
    "    text = re.sub(r\"\\s*\\n\\s*\", \"\\n\", text).strip()   # remove spaces around newlines\n",
    "    text = re.sub(r\" +\", \" \", text).strip()          # collapse multiple spaces to one\n",
    "    text = re.sub(r\"\\n{3,}\", \"\\n\\n\", text).strip()   # avoid triple blank lines\n",
    "    text = text.replace(\"\\n\", \" \").strip()\n",
    "    doc.close()\n",
    "    return text\n",
    "\n",
    "def evaluate_text(reference, prediction):\n",
    "    return {'WER': wer(reference, prediction), 'CER': cer(reference, prediction)}"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "a79cc4bf",
   "metadata": {},
   "source": [
    "## 3 Model wrapers"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 32,
   "id": "e30d5b3f",
   "metadata": {},
   "outputs": [],
   "source": [
    "def ocr_easyocr(img, image_array):\n",
    "    result = easyocr_reader.readtext(image_array)\n",
    "    res = ' '.join([r[1] for r in result])    \n",
    "    return res"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 33,
   "id": "c56f3de2",
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "import re\n",
    "\n",
    "def _normalize_box_xyxy(box):\n",
    "    \"\"\"\n",
    "    Accepts:\n",
    "      - [[x,y],[x,y],[x,y],[x,y]]   (quad)\n",
    "      - [x0, y0, x1, y1]            (flat)\n",
    "      - [x0, y0, x1, y1, x2, y2, x3, y3] (flat quad)\n",
    "    Returns (x0, y0, x1, y1)\n",
    "    \"\"\"\n",
    "    # Quad as list of points?\n",
    "    if isinstance(box, (list, tuple)) and box and isinstance(box[0], (list, tuple)):\n",
    "        xs = [p[0] for p in box]\n",
    "        ys = [p[1] for p in box]\n",
    "        return min(xs), min(ys), max(xs), max(ys)\n",
    "\n",
    "    # Flat list\n",
    "    if isinstance(box, (list, tuple)):\n",
    "        if len(box) == 4:\n",
    "            x0, y0, x1, y1 = box\n",
    "            # ensure order\n",
    "            return min(x0, x1), min(y0, y1), max(x0, x1), max(y0, y1)\n",
    "        if len(box) == 8:\n",
    "            xs = box[0::2]\n",
    "            ys = box[1::2]\n",
    "            return min(xs), min(ys), max(xs), max(ys)\n",
    "\n",
    "    # Fallback\n",
    "    raise ValueError(f\"Unrecognized box format: {box!r}\")\n",
    "\n",
    "def ocr_paddle(img, image_array, min_score=0.0, line_tol_factor=0.6):\n",
    "    \"\"\"\n",
    "    Robust line grouping for PaddleOCR outputs:\n",
    "    - normalizes boxes to (x0,y0,x1,y1)\n",
    "    - adaptive line tolerance based on median box height\n",
    "    - optional confidence filter\n",
    "    - inserts '\\n' between lines and preserves left→right order\n",
    "    \"\"\"\n",
    "    result = paddleocr_model.predict(image_array)\n",
    "\n",
    "    boxes_all = []  # (x0, y0, x1, y1, y_mid, text, score)\n",
    "    for item in result:\n",
    "        res = item.json.get(\"res\", {})\n",
    "        boxes = res.get(\"rec_boxes\", []) or []       # be defensive\n",
    "        texts = res.get(\"rec_texts\", []) or []\n",
    "        scores = res.get(\"rec_scores\", None)\n",
    "\n",
    "        for i, (box, text) in enumerate(zip(boxes, texts)):\n",
    "            try:\n",
    "                x0, y0, x1, y1 = _normalize_box_xyxy(box)\n",
    "            except Exception:\n",
    "                # Skip weird boxes gracefully\n",
    "                continue\n",
    "\n",
    "            y_mid = 0.5 * (y0 + y1)\n",
    "            score = float(scores[i]) if (scores is not None and i < len(scores)) else 1.0\n",
    "\n",
    "            t = re.sub(r\"\\s+\", \" \", str(text)).strip()\n",
    "            if not t:\n",
    "                continue\n",
    "\n",
    "            boxes_all.append((x0, y0, x1, y1, y_mid, t, score))\n",
    "\n",
    "    if min_score > 0:\n",
    "        boxes_all = [b for b in boxes_all if b[6] >= min_score]\n",
    "\n",
    "    if not boxes_all:\n",
    "        return \"\"\n",
    "\n",
    "    # Adaptive line tolerance\n",
    "    heights = [b[3] - b[1] for b in boxes_all]\n",
    "    median_h = float(np.median(heights)) if heights else 20.0\n",
    "    line_tol = max(8.0, line_tol_factor * median_h)\n",
    "\n",
    "    # Sort by vertical mid, then x0\n",
    "    boxes_all.sort(key=lambda b: (b[4], b[0]))\n",
    "\n",
    "    # Group into lines\n",
    "    lines, cur, last_y = [], [], None\n",
    "    for x0, y0, x1, y1, y_mid, text, score in boxes_all:\n",
    "        if last_y is None or abs(y_mid - last_y) <= line_tol:\n",
    "            cur.append((x0, text))\n",
    "        else:\n",
    "            cur.sort(key=lambda t: t[0])\n",
    "            lines.append(\" \".join(t[1] for t in cur))\n",
    "            cur = [(x0, text)]\n",
    "        last_y = y_mid\n",
    "\n",
    "    if cur:\n",
    "        cur.sort(key=lambda t: t[0])\n",
    "        lines.append(\" \".join(t[1] for t in cur))\n",
    "\n",
    "    res = \" \".join(lines)\n",
    "    res = re.sub(r\"\\s+\\n\", \"\\n\", res).strip()\n",
    "    return res\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 34,
   "id": "4273c645",
   "metadata": {},
   "outputs": [],
   "source": [
    "def doctr_blocks_to_text(doctr_result):\n",
    "    \"\"\"\n",
    "    Convierte la salida estructurada de DocTR en texto plano preservando el orden de lectura.\n",
    "    Estructura: Document -> pages -> blocks -> lines -> words\n",
    "    \"\"\"\n",
    "    out_lines = []\n",
    "    for page in doctr_result.pages:\n",
    "        for block in page.blocks:\n",
    "            for line in block.lines:\n",
    "                out_lines.append(\" \".join([w.value for w in line.words]))\n",
    "        out_lines.append(\"\")  # separador de párrafos\n",
    "    return \" \".join([l for l in out_lines if l is not None]).strip()\n",
    "\n",
    "def ocr_doctr(img, image_array):\n",
    "    doc = [image_array]\n",
    "    result = doctr_model(doc)  # inferencia\n",
    "    text = doctr_blocks_to_text(result)    \n",
    "    return text"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "e42cae29",
   "metadata": {},
   "source": [
    "## 4 Run AI OCR Benchmark"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 35,
   "id": "9b55c154",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "[encoded data, 21300 characters]",
      "text/plain": [
       "<Figure size 372.15x526.2 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "ref:\n",
      "Instrucciones para la redacción y elaboración del TFE Máster Universitario en Inteligencia Artificial\n",
      "easy_text:\n",
      "Instrucciones para la redacción y elaboración del TFE Máster Universitario en Inteligencia Artificial\n",
      "docTR_text:\n",
      "Instrucciones para la redaccion y elaboracion del TFE Master Universitario en Inteligencia Artificial\n",
      "paddle_text:\n",
      "Instrucciones para la redacción y elaboración del TFE Máster Universitario en Inteligencia Artificial\n"
     ]
    },
    {
     "data": {
      "image/png": "[encoded data, 36632 characters]",
      "text/plain": [
       "<Figure size 372.15x526.2 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "ref:\n",
      "Índice 1. Indicaciones generales 3 1.1. Línea de discurso 3 1.2. Estructura general y extensión del TFE 4 1.3. Formatos y plantilla de trabajo 5 1.4. Estética y estilo de redacción 7 1.5. Normativa de citas 8 2. Estructura del documento 9 2.1. Resumen 10 2.2. Organización del trabajo en grupo 11 2.3. Introducción 11 2.4. Contexto y estado del arte 13 © Universidad Internacional de La Rioja (UNIR) 2.5. Objetivos concretos y metodología de trabajo 14 2.6. Desarrollo específico de la contribución 17 2.7. Conclusiones y trabajo futuro 20 2.8. Referencias bibliográficas 21 2.8.1. Herramientas para buscar bibliografía 22 2.9. Anexos 23 2.10. Índice de acrónimos 24\n",
      "easy_text:\n",
      "Indice 1. Indicaciones generales 3 1.1. Línea de discurso 3 1.2. Estructura general y extensión del TFE 1.3. Formatos y plantilla de trabajo ; 1.4. Estética y estilo de redacción 1.5. Normativa de citas 8 2. Estructura del documento 9 2.1. Resumen 10 2.2. Organización del trabajo en grupo 11 2.3. Introducción 11 2.4. Contexto y estado del arte 13 2 2.5. Objetivos concretos y metodología de trabajo 14 ; 2.6. Desarrollo específico de la contribución 17 9 2.7. Conclusiones y trabajo futuro 20 g 2.8. Referencias bibliográficas 21 1 2.8.1 Herramientas para buscar bibliografía 22 2.9. Anexos 23 1 2.10 Indice de acrónimos 24 0\n",
      "docTR_text:\n",
      "Indice 1. Indicaciones generales 3 1.1. Linea de discurso 3 1.2. Estructura general y extension del TFE 4 1.3. Formatos y plantilla de trabajo 5 1.4. Estética y estilo de redaccion 7 1.5. Normativa de citas 8 2. Estructura del documento 9 2.1. Resumen 10 2.2. Organizacion del trabajo en grupo 11 2.3. Introduccion 11 2.4. Contexto y estado del arte 13 = 2.5. Objetivos concretos y metodologia de trabajo 14 2.6. Desarrollo especifico de la contribucion 17 2.7. Conclusiones y trabajo futuro 20 2.8. Referencias bibliograficas 21 2.8.1. Herramientas para buscar bibliografia 22 2.9. Anexos 23 2.10. Indice de acronimos 24\n",
      "paddle_text:\n",
      "índice 1. Indicaciones generales 3 1.1. Línea de discurso 3 1.2. Estructura general y extensión del TfE 4 1.3. Formatos y plantilla de trabajo 5 1.4. Estética y estilo de redacción 7 1.5. Normativa de citas 8 2. Estructura del documento 9 2.1. Resumen 10 2.2. Organización del trabajo en grupo 11 2.3. Introducción 11 2.4. Contexto y estado del arte 13 2.5. Objetivos concretos y metodologia de trabajo 14 2.6. Desarrollo especifico de la contribucion 17 2.7. Conclusiones y trabajo futuro 20 © Universidad Internacional de La Rioja (UNiR) 2.8. Referencias bibliográficas 21 2.8.1. Herramientas para buscar bibliografía 22 2.9. Anexos 23 2.10. índice de acrónimos 24\n"
     ]
    },
    {
     "data": {
      "image/png": "[encoded data, 79584 characters]",
      "text/plain": [
       "<Figure size 372.15x526.2 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "ref:\n",
      "1. Indicaciones generales Este documento ofrece indicaciones para la elaboración de tu TFE. Como cualquier documento académico sigue una estructura bastante formal y una línea de discurso que debe facilitar su lectura y reflejar el trabajo que has venido realizando durante estos meses, correspondiente con una carga de 12 ECTS. Para su preparación dispones en el aula virtual de una plantilla individual si se realiza el TFE individualmente o de una plantilla grupal si se realiza el TFE en grupo, que deberás descargar y utilizar desde el primer momento. Es la base para las entregas de todos los borradores, respetando su estructura general y los estilos predefinidos que también se explican en este documento. Un TFE es una obra literaria de carácter académico. Recoge algún tipo de contribución en un ámbito del saber que demuestra los conocimientos adquiridos en la materia. Es importante por los siguientes motivos: Su estructura demuestra tu capacidad para presentar el contenido de manera organizada, ajustándote a las directrices de la titulación y facilitando su lectura. Su contenido recoge los resultados de tu trabajo, y refleja la adquisición de competencias en el resto de las asignaturas de la titulación. Es el documento final que calificarán, empleando la rúbrica de evaluación, tu director y el profesor evaluador (en el caso del TFG) o la comisión evaluadora (en el caso de TFM). 1.1. Línea de discurso © Universidad Internacional de La Rioja (UNIR) La línea de discurso parte en general de una necesidad o un problema claramente identificado. A partir de ese problema se revisa la literatura y otras evidencias disponibles con un doble objetivo: Instrucciones para la redacción y elaboración del TFE 3 Máster Universitario en Inteligencia Artificial\n",
      "easy_text:\n",
      "1. Indicaciones generales Este documento ofrece indicaciones para la elaboración de tu TFE. Como cualquier documento académico sigue una estructura bastante formal y una línea de discurso que debe facilitar su lectura y reflejar el trabajo que has venido realizando durante estos meses , correspondiente con una carga de 12 ECTS. Para su preparación dispones en el aula virtual de una plantilla individual si se realiza el TFE individualmente 0 de una plantilla grupal si se realiza el TFE en grupo, que deberás descargar y utilizar desde el primer momento. Es la base para las entregas de todos los borradores, respetando su estructura general y los estilos predefinidos que también se explican en este documento. Un TFE es una obra literaria de carácter académico. Recoge algún tipo de contribución en un ámbito del saber que demuestra los conocimientos adquiridos en la materia. Es importante por los siguientes motivos: Su estructura demuestra tu capacidad para presentar el contenido de manera organizada; ajustándote a las directrices de la titulación y facilitando su lectura. Su contenido recoge los resultados de tu trabajo, Y refleja la adquisición de competencias en el resto de las asignaturas de la titulación. Es el documento final que calificarán, empleando la rúbrica de evaluación, tu director Y el profesor evaluador (en el caso del TFG) 0 la comisión evaluadora (en el caso de TFM) 2 1.1. Línea de discurso ; 9 g La línea de discurso parte en general de una necesidad 0 un problema claramente 1 identificado. A de ese problema se revisa la literatura Y otras evidencias disponibles con un doble objetivo: 1 Instrucciones para la redacción y elaboración del TFE 3 0 Máster Universitario en Inteligencia Artificial partir\n",
      "docTR_text:\n",
      "1. Indicaciones generales Este documento ofrece indicaciones para la elaboracion de tu TFE. Como cualquier documento académico sigue una estructura bastante formal y una linea de discurso que debe facilitar su lectura y reflejar el trabajo que has venido realizando durante estos meses, correspondiente con una carga de 12 ECTS. Para su preparacion dispones en el aula virtual de una plantilla individual si se realiza el TFE individualmente O de una plantilla grupal si se realiza el TFE en grupo, que deberas descargar y utilizar desde el primer momento. Es la base para las entregas de todos los borradores, respetando su estructura general y los estilos predefinidos que también se explican en este documento. Un TFE es una obra literaria de caracter académico. Recoge algun tipo de contribucion en un ambito del saber que demuestra los conocimientos adquiridos en la materia. Es importante por los siguientes motivos: Su estructura demuestra tu capacidad para presentar el contenido de manera organizada, ajustandote a las directrices de la titulacion y facilitando su lectura. Su contenido recoge los resultados de tu trabajo, y refleja la adquisicion de competencias en el resto de las asignaturas de la titulacion. Es el documento final que calificaran, empleando la rubrica de evaluacion, tu director y el profesor evaluador (en el caso del TFG) O la comision evaluadora (en el caso de TFM). 1.1. Linea de discurso La linea de discurso parte en general de una necesidad O un problema claramente identificado. A partir de ese problema se revisa la literatura y otras evidencias disponibles con un doble objetivo: Instrucciones para la redaccion y elaboracion del TFE 3 Master Universitario en Inteligencia Artificial\n",
      "paddle_text:\n",
      "1. Indicaciones generales Este documento ofrece indicaciones para la elaboración de tu TFe. Como cualquier documento académico sigue una estructura bastante formal y una línea de discurso que debe facilitar su lectura y reflejar el trabajo que has venido realizando durante estos meses, correspondiente con una carga de 12 ECTS. Para su preparación dispones en el aula virtual de una plantilla individual si se realiza el TFE individualmente o de una plantilla grupal si se realiza el TFE en grupo, que deberás descargar y utilizar desde el primer momento. Es la base para las entregas de todos los borradores, respetando su estructura general y los estilos predefinidos que también se explican en este documento. Un TFE es una obra literaria de carácter académico. Recoge algún tipo de contribución en un ámbito del saber que demuestra los conocimientos adquiridos en la materia. Es importante por los siguientes motivos: Su estructura demuestra tu capacidad para presentar el contenido de manera organizada, ajustándote a las directrices de la titulación y facilitando su lectura. Su contenido recoge los resultados de tu trabajo,y refleja la adquisición de competencias en el resto de las asignaturas de la titulación. Es el documento final que calificarán, empleando la rúbrica de evaluación, tu director y el profesor evaluador (en el caso del TfG) o la comisión evaluadora (en el caso de TFM). 1.1. Linea de discurso La línea de discurso parte en general de una necesidad o un problema claramente © Universidad Internacional de La Rioja (UNiR) identificado. A partir de ese problema se revisa la literatura y otras evidencias disponibles con un doble objetivo: Instrucciones para la redacción y elaboración del TFE 3 Máster Universitario en Inteligencia Artificial\n"
     ]
    },
    {
     "data": {
      "image/png": "[encoded data, 79968 characters]",
      "text/plain": [
       "<Figure size 372.15x526.2 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "ref:\n",
      "1. Analizar el problema o necesidad profundizando en su comprensión. Se trata de demostrar su relevancia y un cierto nivel de conocimiento sobre el mismo. 2. Conocer diferentes alternativas para solucionar esa necesidad, demostrando que entiendes de qué manera han abordado otras personas este problema u otros similares. Sobre este análisis de la literatura, informes, datos estadísticos o estudios de mercado, dependiendo de la temática del TFE, podrás fundamentar sólidamente la contribución de tu trabajo. Esta contribución se apoya generalmente en una serie de objetivos o hipótesis de investigación. Finalmente, el trabajo debería presentar algún tipo de evaluación o justificación de viabilidad o validez de la solución propuesta. 1.2. Estructura general y extensión del TFE El TFE sigue una estructura general fija, definida para reflejar lo explicado en el apartado anterior y homogeneizar los diferentes trabajos facilitando su lectura e interpretación. Los principales apartados son los siguientes: Portada. Respeta el formato y estructura definidos en la plantilla. Resumen breve / abstract: al principio del trabajo debes incluir un breve resumen de 150 palabras. Indicarás además de 3 a 5 descriptores (palabras clave o keywords) que permitan catalogar el trabajo adecuadamente. Índices numerados: Separando “Índice de contenidos”, “Índice de figuras” e “Índice de tablas”, según proceda. Cada índice debe comenzar en una nueva página del documento. © Universidad Internacional de La Rioja (UNIR) Organización del trabajo en grupo: Únicamente en el caso de TFE grupal. Desarrollo en capítulos: el contenido del TFE se estructura en capítulos numerados que comienzan en una nueva página. Instrucciones para la redacción y elaboración del TFE 4 Máster Universitario en Inteligencia Artificial\n",
      "easy_text:\n",
      "1 Analizar el problema 0 necesidad profundizando en su comprensión. Se trata de demostrar su relevancia y un cierto nivel de conocimiento sobre el mismo. 2. Conocer diferentes alternativas para solucionar esa necesidad, demostrando que entiendes de manera han abordado otras personas este problema u otros similares. Sobre este análisis de la literatura, informes, datos estadísticos 0 estudios de mercado; dependiendo de la temática del TFE, podrás fundamentar sólidamente la contribución de tu trabajo. Esta contribución se apoya generalmente en una serie de objetivos 0 hipótesis de investigación. Finalmente, el trabajo debería presentar algún tipo de evaluación 0 justificación de viabilidad 0 validez de la solución propuesta. 1.2. Estructura general y extensión del TFE El TFE sigue una estructura general fija, definida para reflejar lo explicado en el apartado anterior Y homogeneizar los diferentes trabajos facilitando su lectura e interpretación. Los principales apartados son los siguientes: Portada. Respeta el formato y estructura definidos en la plantilla . Resumen breve abstract: al principio del trabajo debes incluir un breve resumen de 150 palabras. Indicarás además de 3 a 5 descriptores (palabras clave 0 keywords) que permitan catalogar el trabajo adecuadamente. Indices numerados: Separando \"Indice de contenidos\" \"Indice de figuras\" e \"Indice de tablas\" proceda. Cada índice debe comenzar en una nueva página del documento. 2 Organización del trabajo en grupo: Únicamente en el caso de TFE grupal. ; Desarrollo en capítulos: el contenido del TFE se estructura en capítulos 9 g numerados que comienzan en una nueva página. 1 1 Instrucciones para la redacción y elaboración del TFE 0 Máster Universitario en Inteligencia Artificial qué según\n",
      "docTR_text:\n",
      "1. Analizar el problema O necesidad profundizando en su comprension. Se trata de demostrar su relevancia y un cierto nivel de conocimiento sobre el mismo. 2. Conocer diferentes alternativas para solucionar esa necesidad, demostrando que entiendes de qué manera han abordado otras personas este problema u otros similares. Sobre este analisis de la literatura, informes, datos estadisticos O estudios de mercado, dependiendo de la tematica del TFE, podras fundamentar solidamente la contribucion de tu trabajo. Esta contribucion se apoya generalmente en una serie de objetivos O hipotesis de investigacion. Finalmente, el trabajo deberia presentar algun tipo de evaluacion O justificacion de viabilidad O validez de la solucion propuesta. 1.2. Estructura general y extension del TFE El TFE sigue una estructura general fija, definida para reflejar lo explicado en el apartado anterior y homogeneizar los diferentes trabajos facilitando su lectura e interpretacion. Los principales apartados son los siguientes: Portada. Respeta el formato y estructura definidos en la plantilla. Resumen breve / abstract: al principio del trabajo debes incluir un breve resumen de 150 palabras. Indicaras ademas de 3 a 5 descriptores (palabras clave O keywords) que permitan catalogar el trabajo adecuadamente. N indices numerados: Separando \"indice de contenidos\", \"indice de figuras\" e \"Indice de tablas\", segun proceda. Cada indice debe comenzar en una nueva pagina del documento. Organizacion del trabajo en grupo: Unicamente en el caso de TFE grupal. Desarrollo en capitulos: el contenido del TFE se estructura en capitulos numerados que comienzan en una nueva pagina. Instrucciones para la redaccion y elaboracion del TFE 4 Master Universitario en Inteligencia Artificial\n",
      "paddle_text:\n",
      "1. Analizar el problema o necesidad profundizando en su comprensión. Se trata de demostrar su relevancia y un cierto nivel de conocimiento sobre el mismo. 2. Conocer diferentes alternativas para solucionar esa necesidad, demostrando que entiendes de qué manera han abordado otras personas este problema u otros similares. Sobre este analisis de la literatura, informes,datos estadisticos o estudios de mercado, dependiendo de la temática del TfE, podrás fundamentar solidamente la contribución de tu trabajo. Esta contribución se apoya generalmente en una serie de objetivos o hipótesis de investigación. Finalmente, el trabajo debería presentar algún tipo de evaluación o justificación de viabilidad o validez de la solución propuesta. 1.2.E Estructura general y extensión del tFE El TFE sigue una estructura general fija, definida para reflejar lo explicado en el apartado anterior y homogeneizar los diferentes trabajos facilitando su lectura e interpretación. Los principales apartados son los siguientes: Portada. Respeta el formato y estructura definidos en la plantilla. Resumen breve / abstract: al principio del trabajo debes incluir un breve resumen de 150 palabras. Indicarás además de 3 a 5 descriptores (palabras clave o keywords) que permitan catalogar el trabajo adecuadamente. indices numerados: Separando \"índice de contenidos\",\"índice de figuras\"e \"índice de tablas\", según proceda. Cada indice debe comenzar en una nueva página del documento. Organización del trabajo en grupo: Unicamente en el caso de TFE grupal. Desarrollo en capítulos: el contenido del TFE se estructura en capítulos numerados que comienzan en una nueva página. © Universidad Internacional de La Rioja (UNiR) Instrucciones para la redacción y elaboración del Tfe Máster Universitario en Inteligencia Artificial 4\n"
     ]
    },
    {
     "data": {
      "image/png": "[encoded data, 79444 characters]",
      "text/plain": [
       "<Figure size 372.15x526.2 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "ref:\n",
      "Referencias bibliográficas: el trabajo debe incluir una sección de bibliografía, en la que aparezcan en formato APA los detalles de todos los documentos a los que se haga referencia en el TFE. Anexos: estos son apartados opcionales que contienen cuestionarios, encuestas, resultados de pilotos, documentos adicionales, capturas de pantalla, y otros elementos que complementan o amplían la información del trabajo. Los anexos se diferencian empleando una letra (Anexo A, Anexo B…). En el punto 2 se describen con mayor detalle cada uno de los apartados del TFE. La extensión mínima en un TFE individual es de 50 páginas y la máxima de 90 páginas, sin contar portada, índices y anexos. En el caso de un TFE grupal, la extensión del TFE debe garantizar que cada uno de los integrantes del equipo ha dedicado a la elaboración y defensa del trabajo las competencias previstas en la memoria. A modo orientativo, y para garantizar la calidad y dedicación que requiere un TFE grupal, la extensión mínima ha de ser un 50% superior a lo previsto para un TFE individual. Por lo tanto, la extensión mínima en un TFE grupal es de 75 páginas. 1.3. Formatos y plantilla de trabajo Para la elaboración del TFE, ya sea individual o grupal, debes utilizar la plantilla disponible en el aula virtual. No modifiques los estilos definidos en esta plantilla: márgenes, interlineado, tipos de letra, etc. Para cualquier duda que pueda surgirte, puedes consultar esos formatos a continuación. © Universidad Internacional de La Rioja (UNIR) El trabajo deberá estar escrito en tamaño de página A4 con los siguientes márgenes: Izquierdo: 3,0 cm. Derecho: 2,0 cm. Instrucciones para la redacción y elaboración del TFE 5 Máster Universitario en Inteligencia Artificial\n",
      "easy_text:\n",
      "Referencias bibliográficas: el trabajo debe incluir una sección de bibliografía, en la que aparezcan en formato APA los detalles de todos los documentos a los que se haga referencia en el TFE. Anexos: estos son apartados opcionales que contienen cuestionarios, encuestas, resultados de pilotos, documentos adicionales, capturas de pantalla; Y otros elementos que complementan 0 amplían la información del trabajo. Los anexos se diferencian empleando una letra (Anexo A, Anexo B.). En el punto 2 se describen con mayor detalle cada uno de los apartados del TFE La extensión mínima en un TFE individual es de 50 páginas y la máxima de 90 páginas, sin contar portada, índices y anexos. En el caso de un TFE grupal, la extensión del TFE debe garantizar que cada uno de los integrantes del   equipo ha dedicado a la elaboración Y defensa del trabajo las competencias previstas en la memoria. A modo orientativo; Y para garantizar la calidad y dedicación que requiere un TFE grupal; la extensión mínima ha de ser un 50% superior a lo previsto para un TFE individual. Por lo tanto; la extensión mínima en un TFE grupal es de 75 páginas. 1.3. Formatos y plantilla de trabajo Para la elaboración del TFE, ya sea individual 0 grupal, debes utilizar la plantilla disponible en el aula virtual. No modifiques los estilos definidos en esta plantilla: márgenes, interlineado; tipos de letra, etc. Para cualquier duda que pueda surgirte, puedes consultar esos formatos a continuación. 2 ; 9 El trabajo deberá estar escrito en tamaño de página A4 con los siguientes g márgenes: 1 Izquierdo: 3,0 cm. Derecho: 2,0 cm 1 Instrucciones para la redacción y elaboración del TFE 5 0 Máster Universitario en Inteligencia Artificial\n",
      "docTR_text:\n",
      "Referencias bibliograficas: el trabajo debe incluir una seccion de bibliografia, en la que aparezcan en formato APA los detalles de todos los documentos a los que se haga referencia en el TFE. Anexos: estos son apartados opcionales que contienen cuestionarios, encuestas, resultados de pilotos, documentos adicionales, capturas de pantalla, y otros elementos que complementan O amplian la informacion del trabajo. Los anexos se diferencian empleando una letra (Anexo A, Anexo B...). En el punto 2 se describen con mayor detalle cada uno de los apartados del TFE. La extension minima en un TFE individual es de 50 paginas y la maxima de 90 paginas, sin contar portada, indices y anexos. En el caso de un TFE grupal, la extension del TFE debe garantizar que cada uno de los integrantes del equipo ha dedicado a la elaboracion y defensa del trabajo las competencias previstas en la memoria. A modo orientativo, y para garantizar la calidad y dedicacion que requiere un TFE grupal, la extension minima ha de ser un 50% superior a lo previsto para un TFE individual. Por lo tanto, la extension minima en un TFE grupal es de 75 paginas. 1.3. Formatos y plantilla de trabajo Para la elaboracion del TFE, ya sea individual O grupal, debes utilizar la plantilla disponible en el aula virtual. No modifiques los estilos definidos en esta plantilla: margenes, interlineado, tipos de letra, etc. Para cualquier duda que pueda surgirte, puedes consultar esos formatos a continuacion. El trabajo debera estar escrito en tamano de pagina A4 con los siguientes margenes: Izquierdo: 3,0 cm. Derecho: 2,0 cm. Instrucciones para la redaccion y elaboracion del TFE 5 Master Universitario en Inteligencia Artificial\n",
      "paddle_text:\n",
      "Referencias bibliográficas: el trabajo debe incluir una sección de bibliografía, en la que aparezcan en formato APA los detalles de todos los documentos a los que se haga referencia en el TFE. Anexos: estos son apartados opcionales que contienen cuestionarios, encuestas, resultados de pilotos, documentos adicionales, capturas de pantalla,y otros elementos que complementan o amplían la información del trabajo. Los anexos se diferencian empleando una letra (Anexo A, Anexo B.….). En el punto 2 se describen con mayor detalle cada uno de los apartados del TfE. La extensión mínima en un TfE individual es de 50 páginas y la máxima de 90 páginas, sin contar portada,índices y anexos. En el caso de e un TFE grupal, la extensión del TFE debe garantizar que cada uno de los integrantes del equipo ha dedicado a I la elaboración y defensa del trabajo las competencias previstas en la memoria. A modo orientativo,y para garantizar la calidad y dedicación que requiere un TFE grupal, la extensión mínima ha de ser un 50% superior a lo previsto para un TFE individual. Por lo tanto, la extensión mínima en un TFE grupal es de 75 páginas. 1.3. Formatos y plantilla de trabajo Para la elaboración del TFE,ya sea individual o grupal, debes utilizar la plantilla disponible en el aula virtual. No modifiques los estilos definidos en esta plantilla: margenes, interlineado, tipos de letra, etc. Para cualquier duda que pueda surgirte, puedes consultar esos formatos a continuacion. El trabajo deberá estar escrito en tamaño de página A4 con los siguientes márgenes: © Universidad Internacional de La Rioja (UNiR) Izquierdo: 3,0 cm. Derecho: 2,0 cm. Instrucciones para la redacción y elaboración del TfE 5 Máster Universitario en Inteligencia Artificial\n"
     ]
    },
    {
     "data": {
      "image/png": "[encoded data, 68672 characters]",
      "text/plain": [
       "<Figure size 372.15x526.2 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "ref:\n",
      "Superior e inferior: 2,5 cm. Formato de párrafo en texto principal (estilo de la plantilla “Normal”): Calibri 12, justificado, interlineado 1,5, espacio entre párrafos 6 puntos anterior y 6 puntos posterior, sin sangría. Títulos: Primer nivel (estilo de la plantilla “Título 1”): Calibri Light 18, azul, justificado, interlineado 1,5, espacio entre párrafos 6 puntos anterior y 6 puntos posterior, sin sangría. Segundo nivel (estilo de la plantilla “Título 2”): Calibri Light 14, azul, justificado, interlineado 1,5, espacio entre párrafos 6 puntos anterior y 6 puntos posterior, sin sangría. Tercer nivel (estilo de la plantilla “Título 3”: Calibri Light 12, justificado, interlineado 1,5, espacio entre párrafos 6 puntos anterior y 6 puntos posterior, sin sangría. Notas al pie: Calibri 10, justificado, interlineado sencillo, espacio entre párrafos 0 puntos anterior y 0 puntos posterior, sin sangría. Tablas y figuras: Título en la parte superior de la tabla o figura. Numeración tabla o figura (Tabla 1/ Figura1): Calibri 12, negrita, justificado. Nombre tabla o figura: Calibri 12, cursiva, justificado. Cuerpo: la tipografía de las tablas o figuras se pueden reducir hasta los 9 puntos si estas contienen mucha información. Si la tabla o figura es muy grande, también se puede colocar en apaisado dentro de la hoja. Fuente de la tabla o figura en la parte inferior. Calibri 9,5, centrado. © Universidad Internacional de La Rioja (UNIR) Encabezado y pie de página: Todas las páginas llevarán un encabezado con el nombre completo del estudiante y el título del TFE. Todas las páginas llevarán también un pie de página con el número de página. Instrucciones para la redacción y elaboración del TFE 6 Máster Universitario en Inteligencia Artificial\n",
      "easy_text:\n",
      "Superior e inferior: 2,5 cm_ Formato de párrafo en texto principal (estilo de la plantilla \"Normal\"): Calibri  12, justificado, interlineado 1,5, espacio entre párrafos 6 puntos anterior y 6 puntos posterior, sin sangría. Títulos: Primer nivel (estilo de la plantilla \"Título 1\"): Calibri Light 18, azul, justificado; interlineado 1,5, espacio entre párrafos 6 puntos anterior y 6 puntos posterior, sin sangría. Segundo nivel   (estilo de la plantilla \"Título 2\"): Calibri Light 14, azul, justificado, interlineado 1,5, espacio entre párrafos 6 puntos anterior y 6 puntos posterior, sin sangría. Tercer nivel (estilo de la plantilla \"Título 3\" = Calibri Light 12, justificado, interlineado 1,5, espacio entre párrafos 6 puntos anterior y 6 puntos posterior, sin sangría. Notas al pie: Calibri 10, justificado; interlineado sencillo; espacio entre párrafos 0 puntos anterior y 0 puntos posterior, sin sangría. Tablas y figuras: Título en la parte superior de la tabla 0 figura. Numeración tabla 0 figura (Tabla 1/ Figural): Calibri negrita; justificado. Nombre tabla 0 figura: Calibri 12, cursiva, justificado. Cuerpo: la tipografía de las tablas 0 figuras se pueden reducir hasta los 9 puntos si estas contienen mucha información. Si la tabla 0 figura es muy grande, también se puede colocar en apaisado dentro de la hoja. Fuente de la tabla 0 figura en la parte inferior. Calibri 9,5, centrado. 2 ; Encabezado y pie de página: 9 Todas las páginas Ilevarán un encabezado con el nombre completo del g estudiante y el título del TFE. 1 Todas las páginas llevarán también un pie de página con el número de página. 1 Instrucciones para la redacción y elaboración del TFE 0 Máster Universitario en Inteligencia Artificial 12,\n",
      "docTR_text:\n",
      "Superior e inferior: 2,5 cm. Formato de parrafo en texto principal (estilo de la plantilla \"Normal\"): Calibri 12, justificado, interlineado 1,5, espacio entre parrafos 6 puntos anterior y 6 puntos posterior, sin sangria. Titulos: Primer nivel (estilo de la plantilla \"Titulo 1\"): Calibri Light 18, azul, justificado, interlineado 1,5, espacio entre parrafos 6 puntos anterior y 6 puntos posterior, sin sangria. Segundo nivel (estilo de la plantilla \"Titulo 2\"): Calibri Light 14, azul, justificado, interlineado 1,5, espacio entre parrafos 6 puntos anterior y 6 puntos posterior, sin sangria. Tercer nivel (estilo de la plantilla \"Titulo 3\": Calibri Light 12, justificado, interlineado 1,5, espacio entre parrafos 6 puntos anterior y 6 puntos posterior, sin sangria. Notas al pie: Calibri 10, justificado, interlineado sencillo, espacio entre parrafos 0 puntos anterior y 0 puntos posterior, sin sangria. Tablas y figuras: Titulo en la parte superior de la tabla O figura. Numeracion tabla O figura (Tabla 1/ Figural): Calibri 12, negrita, justificado. Nombre tabla O figura: Calibri 12, cursiva, justificado. Cuerpo: la tipografia de las tablas O figuras se pueden reducir hasta los 9 puntos si estas contienen mucha informacion. Si la tabla O figura es muy grande, también se puede colocar en apaisado dentro de la hoja. Fuente de la tabla O figura en la parte inferior. Calibri 9,5, centrado. Encabezado y pie de pagina: Todas las paginas llevaran un encabezado con el nombre completo del estudiante y el titulo del TFE. Todas las paginas llevaran también un pie de pagina con el numero de pagina. Instrucciones para la redaccion y elaboracion del TFE 6 Master Universitario en Inteligencia Artificial\n",
      "paddle_text:\n",
      "Superior e inferior: 2,5 cm. Formato de párrafo en texto principal (estilo de la plantilla “Normal\"): Calibri 12, justificado, interlineado 1,5, espacio entre párrafos 6 puntos anterior y 6 puntos posterior, sin sangría. Títulos: Primer nivel (estilo de la plantillaTítulo 1\"): Calibri Light 18, azul, justificado, interlineado 1,5,espacio entre párrafos 6 puntos anterior y 6 puntos posterior, sin sangría. Segundo nivel (estilo de la plantilla Titulo 2\"): Calibri Light 14, azul, justificado, interlineado 1,5, espacio entre párrafos 6 puntos anterior y 6 puntos posterior, sin sangría. Tercer nivel (estilo de la plantilla Título 3\": Calibri Light 12, justificado, interlineado 1,5,espacio entre párrafos 6 puntos anterior y 6 puntos posterior, sin sangría. Notas al pie: Calibri 10, justificado, interlineado sencillo, espacio entre párrafos O puntos anterior y O puntos posterior, sin sangra. Tablas y figuras: Título en la parte superior de la tabla o figura. Numeración tabla o figura (Tabla 1/ Figura1): Calibri 12, negrita, justificado. Nombre tabla o figura: Calibri 12, cursiva, justificado. Cuerpo: la tipografía de las tablas o figuras se pueden reducir hasta los 9 puntos si estas contienen mucha información. Si la tabla o figura es muy grande, también se puede colocar en apaisado dentro de la hoja. Fuente de la tabla o figura en la parte inferior. Calibri 9,5, centrado. Encabezado y pie de página: Todas las páginas llevarán un encabezado con el nombre completo del estudiante y el título del TFE. © Universidad Internacional de La Rioja (UNiR) Todas las páginas llevarán también un pie de página con el número de página. Instrucciones para la redacción y elaboración del TFE Máster Universitario en Inteligencia Artificial 9\n"
     ]
    },
    {
     "data": {
      "image/png": "[encoded data, 77260 characters]",
      "text/plain": [
       "<Figure size 372.15x526.2 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "ref:\n",
      "Los borradores intermedios deberán entregarse en formato Word. El documento final deberá depositarse en formato PDF. 1.4. Estética y estilo de redacción Es fundamental que el TFE presente un aspecto elegante y correcto. Se trata de un trabajo académico y debe reflejar la madurez y el nivel formativo de una persona que ha finalizado un estudio de grado o postgrado. Ten en cuenta las siguientes recomendaciones en todas y cada una de las entregas que realices y, en especial, en el depósito final del documento: Verifica la originalidad del documento, asegurándote de que citas todas las fuentes consultadas y no existen textos de autoría ajena sin referenciar correctamente. Cuida la presentación del trabajo. Comprueba que formatos como tipo y tamaño de letra, número de páginas, encabezados, justificación de párrafos, interlineado, etc., son correctos. Revisa la ortografía y la redacción. Utiliza el corrector de Word para asegurarte de que no has dejado ninguna errata. Una lectura detenida del documento también te ayudará a detectar erratas, omisiones o redundancias. Si es posible, pide a alguien cercano que lo lea y te dé su opinión sobre la redacción. Presta especial atención a los siguientes aspectos: - Que los párrafos sigan un orden o hilo argumental lógico. - Que la información se presente de una manera que facilite su © Universidad Internacional de La Rioja (UNIR) comprensión, definiendo los conceptos necesarios e incluyendo las citas bibliográficas pertinentes. - Elimina párrafos demasiado cortos. Cada párrafo debería tener al menos tres oraciones. - Elimina frases superfluas y repeticiones de ideas. Instrucciones para la redacción y elaboración del TFE 7 Máster Universitario en Inteligencia Artificial\n",
      "easy_text:\n",
      "Los borradores intermedios deberán entregarse en formato Word. El documento final deberá depositarse en formato PDF. 1.4. Estética y estilo de redacción Es fundamental que el TFE presente un aspecto elegante y correcto. Se trata de un trabajo académico y debe reflejar la madurez y el nivel formativo de una persona que ha finalizado un estudio de grado 0 postgrado. Ten en cuenta las   siguientes recomendaciones en todas y cada una de las entregas que realices Y, en especial, en el depósito final del documento: Verifica la   originalidad del documento, asegurándote de que citas todas las fuentes consultadas y no existen textos de autoría ajena sin referenciar correctamente Cuida la presentación del trabajo. Comprueba que formatos como tipo y tamaño de letra, número de páginas, encabezados, justificación de párrafos, interlineado; etc., son correctos. Revisa la ortografía y la redacción. Utiliza el corrector de Word para asegurarte de que no has dejado ninguna errata. Una lectura detenida del documento también te ayudará a detectar erratas, omisiones 0 redundancias. Si es posible; a alguien cercano que lo lea y te dé su opinión sobre la redacción. Presta especial atención a los siguientes aspectos: Que los párrafos sigan un orden 0 hilo argumental lógico. Que la información se presente de una manera que facilite su 2 comprensión; definiendo los conceptos necesarios e incluyendo las citas ; 9 bibliográficas pertinentes. g Elimina párrafos demasiado cortos. Cada párrafo debería tener al menos 1 tres oraciones. Elimina frases superfluas y repeticiones de ideas. 1 Instrucciones para la redacción y elaboración del TFE 0 Máster Universitario en Inteligencia Artificial pide\n",
      "docTR_text:\n",
      "Los borradores intermedios deberan entregarse en formato Word. El documento final debera depositarse en formato PDF. 1.4. Estética y estilo de redaccion Es fundamental que el TFE presente un aspecto elegante y correcto. Se trata de un trabajo académico y debe reflejar la madurez y el nivel formativo de una persona que ha finalizado un estudio de grado O postgrado. Ten en cuenta las siguientes recomendaciones en todas y cada una de las entregas que realices Y, en especial, en el deposito final del documento: Verifica la originalidad del documento, asegurandote de que citas todas las fuentes consultadas y no existen textos de autoria ajena sin referenciar correctamente. Cuida la presentacion del trabajo. Comprueba que formatos como tipo y tamano de letra, numero de paginas, encabezados, justificacion de parrafos, interlineado, etc., son correctos. Revisa la ortografia y la redaccion. Utiliza el corrector de Word para asegurarte de que no has dejado ninguna errata. Una lectura detenida del documento también te ayudara a detectar erratas, omisiones O redundancias. Si es posible, pide a alguien cercano que lo lea y te dé su opinion sobre la redaccion. Presta especial atencion a los siguientes aspectos: Que los parrafos sigan un orden O hilo argumental logico. Que la informacion se presente de una manera que facilite su comprension, definiendo los conceptos necesarios e incluyendo las citas bibliograficas pertinentes. Elimina parrafos demasiado cortos. Cada parrafo deberia tener al menos tres oraciones. Elimina frases superfluas y repeticiones de ideas. Instrucciones para la redaccion y elaboracion del TFE 7 Master Universitario en Inteligencia Artificial\n",
      "paddle_text:\n",
      "Los borradores intermedios deberán entregarse en formato Word. El documento final deberá depositarse en formato PDf. 1.4. Estética y estilo de redacción Es fundamental que el TFE presente un aspecto elegante y correcto. Se trata de un trabajo académico y debe reflejar la madurez y el nivel formativo de una persona que ha finalizado un estudio de grado o postgrado. Ten en cuenta las siguientes recomendaciones en todas y cada una de las entregas que realices y, en especial, en el deposito final del documento: Verifica la originalidad del documento,asegurándote de que citas todas las fuentes consultadas y no existen textos de autoría ajena sin referenciar correctamente. Cuida la presentación del trabajo. Comprueba que formatos como tipo y tamaño de letra, número de páginas, encabezados, justificación de párrafos, interlineado, etc., son correctos. Revisa la ortografía y la redacción. Utiliza el corrector de Word para asegurarte de que no has dejado ninguna errata. Una lectura detenida del documento también te ayudará a detectar erratas, omisiones o redundancias. Si es posible, pide a alguien cercano que lo lea y te dé su opinión sobre la redacción. Presta especial atención a los siguientes aspectos: Que los párrafos sigan un orden o hilo argumental lógico. Que la información se presente de una manera que facilite su comprensión, definiendo los conceptos necesarios e incluyendo las citas bibliograficas pertinentes. Elimina párrafos demasiado cortos. Cada párrafo debería tener al menos © Universidad Internacional de La Rioja (UNiR) tres oraciones. Elimina frases superfluas y repeticiones de ideas. Instrucciones para la redacción y elaboración del TfE 7 Máster Universitario en Inteligencia Artificial\n"
     ]
    },
    {
     "data": {
      "image/png": "[encoded data, 45356 characters]",
      "text/plain": [
       "<Figure size 372.15x526.2 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "ref:\n",
      "- Escribe siempre al menos un párrafo de introducción en cada capítulo o apartado, explicando de qué vas a tratar en esa sección. Evita que aparezcan dos encabezados de nivel consecutivos sin ningún texto entre medias. Repasa las citas bibliográficas. Comprueba que todas ellas son correctas y siguen la normativa que exige la titulación. Asegúrate de que las figuras y las tablas se ven clara y correctamente, e incluyen número y título, así como su procedencia o fuente. Comprueba que los índices se generan correctamente. 1.5. Normativa de citas En esta titulación se cita de acuerdo con la normativa APA. Recuerda que tienes una guía con explicaciones y ejemplos en el apartado Citas y bibliografía del aula virtual: https://bibliografiaycitas.unir.net/ © Universidad Internacional de La Rioja (UNIR) Instrucciones para la redacción y elaboración del TFE 8 Máster Universitario en Inteligencia Artificial\n",
      "easy_text:\n",
      "Escribe siempre al menos un párrafo de introducción en cada capítulo 0 apartado;  explicando de vas a tratar en esa sección. Evita que aparezcan dos encabezados de nivel consecutivos sin ningún texto entre medias. Repasa las citas bibliográficas. Comprueba que todas ellas son correctas Y siguen la normativa que exige la titulación. Asegúrate de que las figuras y las tablas se ven clara Y correctamente, e incluyen número y título, así como su procedencia 0 fuente. Comprueba que los índices se generan correctamente. 1.5. Normativa de citas En esta titulación se cita de acuerdo con la normativa APA. Recuerda que tienes una guía con explicaciones y ejemplos en el apartado Citas y bibliografía del aula virtual: https:Lbibliografiaycitas unir netL 2 ; 9 g 1 1 Instrucciones para la redacción y elaboración del TFE 8 0 Máster Universitario en Inteligencia Artificial qué\n",
      "docTR_text:\n",
      "Escribe siempre al menos un parrafo de introduccion en cada capitulo O apartado, explicando de qué vas a tratar en esa seccion. Evita que aparezcan dos encabezados de nivel consecutivos sin ningun texto entre medias. Repasa las citas bibliograficas. Comprueba que todas ellas son correctas y siguen la normativa que exige la titulacion. Asegurate de que las figuras y las tablas se ven clara y correctamente, e incluyen numero y titulo, asi como su procedencia O fuente. Comprueba que los indices se generan correctamente. 1.5. Normativa de citas En esta titulacion se cita de acuerdo con la normativa APA. Recuerda que tienes una guia con explicaciones y ejemplos en el apartado Citas y bibliografia del aula virtual: https://bibliografiaycitas.unir.net/ = Instrucciones para la redaccion y elaboracion del TFE 8 Master Universitario en Inteligencia Artificial\n",
      "paddle_text:\n",
      "Escribe siempre al menos un párrafo de introducción en cada capítulo o apartado,explicando de qué vas a tratar en esa sección. Evita que aparezcan dos encabezados de nivel consecutivos sin ningún texto entre medias. Repasa las citas bibliográficas. Comprueba que todas ellas son correctas y siguen la normativa que exige la titulación. Asegúrate de que las figuras y las tablas se ven clara y correctamente, e incluyen número y título, así como su procedencia o fuente. Comprueba que los índices se generan correctamente. 1.5. Normativa adecitas En esta titulacióon se cita de acuerdo con la normativa Apa. Recuerda que tienes una guía con explicaciones y ejemplos en el apartado Citas y bibliografía del aula virtual: https://bibliografiaycitas.unir.net/ © Universidad Internacional de La Rioja (UNIR) Instrucciones para la redacción y elaboración del TfE Máster Universitario en lnteligencia Artificial ∞\n"
     ]
    },
    {
     "data": {
      "image/png": "[encoded data, 85460 characters]",
      "text/plain": [
       "<Figure size 372.15x526.2 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "ref:\n",
      "2. Estructura del documento En esta sección se describe con mayor profundidad la estructura y los contenidos esperados en cada apartado de tu TFE. Léela con detenimiento y compárala con la programación semanal que encontrarás en el aula virtual, pues en cada borrador deberás entregar completados diferentes apartados que se explican a continuación, y que se elaboran de una manera no necesariamente lineal. Como ya se ha mencionado, la memoria debe estar estructurada en capítulos. Por norma general, la estructura de capítulos suele reflejar la línea de discurso del trabajo, empezando por una introducción donde se plantea el problema, seguida de un estudio de la literatura donde se estudia y describe el contexto. Posteriormente se establecen claramente la hipótesis de trabajo y los objetivos concretos de investigación, así como la descripción de la metodología seguida para alcanzar los objetivos. Posteriormente se describe la contribución del trabajo, seguida de una evaluación de la misma. La evaluación da pie a la elaboración de las conclusiones, que deben relacionar los resultados obtenidos con los objetivos planteados inicialmente. Finalmente, se describen las líneas de trabajo futuro necesarias para seguir avanzando hacia la consecución de los objetivos. A continuación, te dejamos algunos consejos generales sobre cómo organizar los capítulos, pero ten en cuenta que cada trabajo es único y esta organización es una guía general adaptable. El director específico de tu TFE podrá aportarte consejos sobre cómo organizar la memoria adaptándote al contexto de tu trabajo concreto. © Universidad Internacional de La Rioja (UNIR) Como recomendación general, la estructura de capítulos de tu memoria debería ser similar a la siguiente propuesta: Organización del trabajo en grupo (solo en trabajos grupales) Capítulo 1 – Introducción Instrucciones para la redacción y elaboración del TFE 9 Máster Universitario en Inteligencia Artificial\n",
      "easy_text:\n",
      "2. Estructura del documento En esta sección se describe con mayor profundidad la estructura y los contenidos esperados en cada apartado de tu TFE. Léela con detenimiento y compárala con la programación semanal que encontrarás en el aula virtual, pues en cada borrador deberás entregar completados diferentes apartados que se explican a continuación, Y que se elaboran de una manera no necesariamente lineal. Como ya se ha mencionado, la memoria debe estar estructurada en capítulos. Por norma general, la estructura de capítulos suele reflejar la línea de discurso del trabajo; empezando por una introducción donde se plantea el problema; seguida de un estudio de la literatura donde se estudia Y describe el contexto. Posteriormente se establecen claramente la hipótesis de trabajo Y los objetivos concretos de investigación; así como la descripción de la metodología seguida para alcanzar los objetivos. Posteriormente se describe la contribución del trabajo, seguida de una evaluación de la misma. La evaluación da pie a la elaboración de las conclusiones, que deben relacionar los resultados obtenidos con los objetivos   planteados inicialmente. Finalmente, se describen las líneas de trabajo futuro necesarias para seguir avanzando hacia la consecución de los objetivos. 4 continuación, te dejamos algunos consejos generales sobre cómo organizar los capítulos, pero ten en cuenta que cada trabajo es único y esta organización es una guía general adaptable. El director específico de tu TFE podrá aportarte consejos sobre cómo organizar la memoria adaptándote al contexto de tu trabajo concreto. 2 Como recomendación general; la estructura de capítulos de tu memoria debería ser ; 9 similar a la siguiente propuesta: g 1 Organización del trabajo en grupo (solo en trabajos grupales) Capítulo 1 ~ Introducción 1 Instrucciones para la redacción y elaboración del TFE 0 Máster Universitario en Inteligencia Artificial\n",
      "docTR_text:\n",
      "2. Estructura del documento En esta seccion se describe con mayor protundidad la estructura y los contenidos esperados en cada apartado de tu TFE. Léela con detenimiento y comparala con la programacion semanal que encontraras en el aula virtual, pues en cada borrador deberas entregar completados diferentes apartados que se explican a continuacion, y que se elaboran de una manera no necesariamente lineal. Como ya se ha mencionado, la memoria debe estar estructurada en capitulos. Por norma general, la estructura de capitulos suele reflejar la linea de discurso del trabajo, empezando por una introduccion donde se plantea el problema, seguida de un estudio de la literatura donde se estudia y describe el contexto. Posteriormente se establecen claramente la hipotesis de trabajo y los objetivos concretos de investigacion, asi como la descripcion de la metodologia seguida para alcanzar los objetivos. Posteriormente se describe la contribucion del trabajo, seguida de una evaluacion de la misma. La evaluacion da pie a la elaboracion de las conclusiones, que deben relacionar los resultados obtenidos con los objetivos planteados inicialmente. Finalmente, se describen las lineas de trabajo futuro necesarias para seguir avanzando hacia la consecucion de los objetivos. A continuacion, te dejamos algunos consejos generales sobre como organizar los capitulos, pero ten en cuenta que cada trabajo es unico y esta organizacion es una guia general adaptable. El director especifico de tu TFE podra aportarte consejos sobre como organizar la memoria adaptandote al contexto de tu trabajo concreto. Como recomendacion general, la estructura de capitulos de tu memoria deberia ser similar a la siguiente propuesta: Organizacion del trabajo en grupo (solo en trabajos grupales) Capitulo 1 IN Introduccion Instrucciones para la redaccion y elaboracion del TFE 9 Master Universitario en Inteligencia Artificial\n",
      "paddle_text:\n",
      "2.E Estructura del documento En esta sección se describe con mayor profundidad la estructura y los contenidos esperados en cada apartado de tu Tfe. Léela con detenimiento y compárala con la programación semanal que encontraras en el aula virtual, pues en cada borrador deberás entregar completados diferentes apartados que se explican a continuación,y que se elaboran de una manera no necesariamente lineal. Como ya se ha mencionado, la memoria debe estar estructurada en capítulos. Por norma general, la estructura de capitulos suele reflejar la linea de discurso del trabajo, empezando por una introducción donde se plantea el problema, seguida de un estudio de la literatura donde se estudia y describe el contexto. Posteriormente se establecen claramente la hipótesis de trabajo y los objetivos concretos de investigación, así como la descripción de la metodología seguida para alcanzar los objetivos. Posteriormente se describe la contribución del trabajo, seguida de una evaluación de la misma. La evaluación da pie a la elaboración de las conclusiones, que deben relacionar los resultados obtenidos con los objetivos planteados inicialmente. Finalmente, se describen las líneas de trabajo futuro necesarias para seguir avanzando hacia la consecución de los objetivos. A continuación, te dejamos algunos consejos generales sobre cómo organizar los capítulos, pero ten en cuenta que cada trabajo es único y esta organización es una guía general adaptable. El director especifico de tu TFE podrá aportarte consejos sobre cómo organizar la memoria adaptándote al contexto de tu trabajo concreto. Como recomendación general, la estructura de capítulos de tu memoria debería ser similar a la siguiente propuesta: © Universidad Internacional de La Rioja (UNiR) Organización del trabajo en grupo (solo en trabajos grupales) Capítulo1–Introducción Instrucciones para la redacción y elaboración del TFE Máster Universitario en Inteligencia Artificial 6\n"
     ]
    },
    {
     "data": {
      "image/png": "[encoded data, 62308 characters]",
      "text/plain": [
       "<Figure size 372.15x526.2 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "ref:\n",
      "Capítulo 2 – Contexto y estado del arte Capítulo 3 – Objetivos y metodología de trabajo Capítulo 4 – capítulo de desarrollo de la contribución, título del capítulo dependiendo de la tipología del trabajo Capítulo 5 – capítulo de desarrollo de la contribución, título del capítulo dependiendo de la tipología del trabajo Capítulo 6 – capítulo de desarrollo de la contribución, título del capítulo dependiendo de la tipología del trabajo Capítulo 7 – Conclusiones y trabajo futuro 2.1. Resumen El resumen se redacta en último lugar ya que recoge las contribuciones más importantes del trabajo. Es necesario tener muy clara y completa del documento para poder resumirlo correctamente. Tendrá una extensión de 150 a 300 palabras y deberá ofrecer una visión global de lo que el lector encontrará en el trabajo, destacando sus aspectos fundamentales. Deberás indicar claramente cuál es el objetivo principal del trabajo, la metodología seguida para alcanzarlo, los resultados obtenidos y la principal conclusión alcanzada. A continuación, indicarás de 3 a 5 palabras clave o keywords como descriptores del trabajo que lo enmarcan en unas temáticas determinadas. Serán los utilizados para localizar tu trabajo si llega a ser publicado. © Universidad Internacional de La Rioja (UNIR) Instrucciones para la redacción y elaboración del TFE 10 Máster Universitario en Inteligencia Artificial\n",
      "easy_text:\n",
      "Capítulo 2 = Contexto y estado del arte Capítulo 3 - Objetivos y metodología de trabajo Capítulo 4  capítulo de desarrollo de la contribución, título del capítulo dependiendo de la tipología del trabajo Capítulo 5  capítulo de desarrollo de la contribución, título del capítulo dependiendo de la tipología del trabajo Capítulo 6  capítulo de desarrollo de la contribución, título del capítulo dependiendo de la tipología del trabajo Capítulo 7 ~ Conclusiones Y trabajo futuro 2.1. Resumen EI resumen se redacta en último lugar ya que recoge las contribuciones más importantes del trabajo. Es necesario tener muy clara y completa del documento para poder resumirlo correctamente. Tendrá una extensión de 150 a 300 palabras y deberá ofrecer una visión global de lo que el lector encontrará en el trabajo, destacando sUS aspectos fundamentales. Deberás indicar claramente cuál es el objetivo principal del trabajo; la metodología seguida para alcanzarlo, los resultados obtenidos y la principal conclusión alcanzada. continuación, indicarás de 3 a 5 palabras clave 0 keywords como descriptores del trabajo que lo enmarcan en unas temáticas determinadas. Serán los utilizados para localizar tu trabajo si Ilega a ser publicado. 2 ; 9 g 1 1 Instrucciones para la redacción y elaboración del TFE 10 0 Máster Universitario en Inteligencia Artificial\n",
      "docTR_text:\n",
      "Capitulo 2 IN Contexto y estado del arte Capitulo 3 I- Objetivos y metodologia de trabajo Capitulo 4 IN capitulo de desarrollo de la contribucion, titulo del capitulo dependiendo de la tipologia del trabajo Capitulo 5 il capitulo de desarrollo de la contribucion, titulo del capitulo dependiendo de la tipologia del trabajo Capitulo 6 il capitulo de desarrollo de la contribucion, titulo del capitulo dependiendo de la tipologia del trabajo Capitulo 7 = Conclusiones y trabajo futuro 2.1. Resumen El resumen se redacta en ultimo lugar ya que recoge las contribuciones mas importantes deltrabajo. Es necesario tener muy clara y completa del documento para poder resumirlo correctamente. Tendra una extension de 150 a 300 palabras y debera ofrecer una vision global de lo que el lector encontrara en el trabajo, destacando sus aspectos fundamentales. Deberas indicar claramente cual es el objetivo principal del trabajo, la metodologia seguida para alcanzarlo, los resultados obtenidos y la principal conclusion alcanzada. A continuacion, indicaras de 3 a 5 palabras clave O keywords como descriptores del trabajo que lo enmarcan en unas tematicas determinadas. Seran los utilizados para localizar tu trabajo si llega a ser publicado. Instrucciones para la redaccion y elaboracion del TFE 10 Master Universitario en Inteligencia Artificial\n",
      "paddle_text:\n",
      "Capitulo 2 – Contexto y estado del arte Capítulo 3 – Objetivos y metodología de trabajo Capítulo 4 – capítulo de desarrollo de la contribución, título del capítulo dependiendo de la tipología del trabajo Capítulo 5 – capítulo de desarrollo de la contribución, título del capítulo dependiendo de la tipología del trabajo Capítulo 6 – capítulo de desarrollo de la contribución, título del capítulo dependiendo de la tipología del trabajo Capítulo 7 – Conclusiones y trabajo futuro 2.1. Resumen El resumen se redacta en último lugar ya que recoge las contribuciones más importantes del trabajo. Es necesario tener muy clara y completa del documento para poder resumirlo correctamente. Tendrá una extensión de 150 a 300 palabras y deberá ofrecer una visión global de lo que el lector encontrará en el trabajo,destacando sus aspectos fundamentales. Deberás indicar claramente cuál es el objetivo principal del trabajo, la metodología seguida para alcanzarlo, los resultados obtenidos y la principal conclusión alcanzada. A continuación, indicarás de 3 a 5 palabras clave o keywords como descriptores del trabajo que lo enmarcan en unas temáticas determinadas. Serán los utilizados para localizar tu trabajo si llega a ser publicado. © Universidad Internacional de La Rioja (UNIR) Instrucciones para la redacción y elaboración del TFE 10 Máster Universitario en lnteligencia Artificial\n"
     ]
    }
   ],
   "source": [
    "\n",
    "\n",
    "results = []\n",
    "\n",
    "for pdf_file in os.listdir(PDF_FOLDER):\n",
    "    if not pdf_file.lower().endswith('.pdf'):\n",
    "        continue\n",
    "    pdf_path = os.path.join(PDF_FOLDER, pdf_file)\n",
    "    images = pdf_to_images(pdf_path)\n",
    "    \n",
    "    for i, img in enumerate(images):\n",
    "        if i == 5:\n",
    "            break\n",
    "        page_num = i+1\n",
    "        ref = pdf_extract_text(pdf_path, page_num=page_num)\n",
    "        show_page(img, f\"page: {page_num}\")\n",
    "        print(f\"ref:\\n{ref}\")\n",
    "        \n",
    "        # Convert PIL image to numpy array\n",
    "        image_array = np.array(img)\n",
    "        # EasyOCR\n",
    "        easy_text = ocr_easyocr(img, image_array)\n",
    "        print(f\"easy_text:\\n{easy_text}\")\n",
    "        results.append({'PDF': pdf_file, 'Page': page_num, 'Model': 'EasyOCR', 'Prediction': easy_text, **evaluate_text(ref, easy_text)})\n",
    "        \n",
    "        # TrOCR\n",
    "        doctr_text = ocr_doctr(img, image_array)\n",
    "        print(f\"docTR_text:\\n{doctr_text}\")\n",
    "        results.append({'PDF': pdf_file, 'Page': page_num, 'Model': 'docTR', 'Prediction': doctr_text, **evaluate_text(ref, doctr_text)})\n",
    "        \n",
    "        # PaddleOCR\n",
    "        paddle_text = ocr_paddle(img, image_array)\n",
    "        print(f\"paddle_text:\\n{paddle_text}\")\n",
    "        results.append({'PDF': pdf_file, 'Page': page_num, 'Model': 'PaddleOCR', 'Prediction': paddle_text, **evaluate_text(ref, paddle_text)})\n",
    "        "
   ]
  },
  {
   "cell_type": "markdown",
   "id": "0db6dc74",
   "metadata": {},
   "source": [
    "## 5 Save and Analyze Results"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 36,
   "id": "da3155e3",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Benchmark results saved!\n",
      "                WER       CER\n",
      "Model                        \n",
      "EasyOCR    0.101418  0.048243\n",
      "PaddleOCR  0.088599  0.053441\n",
      "docTR      0.182897  0.055500\n"
     ]
    },
    {
     "data": {
      "image/png": "[encoded data, 28200 characters]",
      "text/plain": [
       "<Figure size 800x500 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "df_results = pd.DataFrame(results)\n",
    "df_results.to_csv(os.path.join(OUTPUT_FOLDER, 'ai_ocr_benchmark_results.csv'), index=False)\n",
    "print('Benchmark results saved!')\n",
    "\n",
    "# Summary by model\n",
    "summary = df_results.groupby('Model')[['WER', 'CER']].mean()\n",
    "print(summary)\n",
    "\n",
    "# Plot\n",
    "summary.plot(kind='bar', figsize=(8,5), title='AI OCR Benchmark (WER & CER)')\n",
    "plt.ylabel('Error Rate')\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "3e0f00c0",
   "metadata": {},
   "source": [
    "### How to read this chart:\n",
    "- CER (Character Error Rate) focus on raw transcription quality\n",
    "- WER (Word Error Rate) penalizes incorrect tokenization or missing spaces\n",
    "- CER and WER are error metrics, which means:\n",
    "    - Higher values = worse performance\n",
    "    - Lower values = better accuracy"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "41b427d4",
   "metadata": {},
   "source": [
    "### Compared solutions\n",
    "| Model                  | Type                         | Components                   | Key Strengths                                              | Why It Matters                                           |\n",
    "| :--------------------- | :--------------------------- | :--------------------------- | :--------------------------------------------------------- | :------------------------------------------------------- |\n",
    "| **EasyOCR**            | End-to-end (det + rec)       | DB + CRNN/Transformer        | Lightweight, easy to run, multilingual                     | Serves as *baseline neuronal* (fast & reproducible).     |\n",
    "| **PaddleOCR (PP-OCR)** | End-to-end (det + rec + cls) | DB + SRN/CRNN                | Strong multilingual support, configurable pipeline         | Industrial reference; widely benchmarked.                |\n",
    "| **DocTR**              | End-to-end (det + rec)       | DB/LinkNet + CRNN/SAR/VitSTR | Research-oriented, clean API, high-level structured output | Represents the latest *PyTorch*-based academic approach. |\n",
    "\n",
    "\n",
    "These cover the three major open-source paradigms for deep OCR:\n",
    "\n",
    "EasyOCR: compact CRNN-based recognizer.\n",
    "\n",
    "PaddleOCR: large industrial model (PP-OCR family).\n",
    "\n",
    "DocTR: modular research library from Mindee, built for experimentation.\n",
    "\n",
    "Together they already let you analyse:\n",
    "\n",
    "accuracy (CER/WER),\n",
    "\n",
    "inference latency,\n",
    "\n",
    "model architecture trade-offs."
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": ".venv (3.11.9)",
   "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.11.9"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
