{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "536b11d7",
   "metadata": {},
   "outputs": [],
   "source": [
    "#Installations des bibliothèques d'OCR utilisées:\n",
    "!pip install pytesseract\n",
    "!sudo apt install tesseract-ocr\n",
    "#Décompression de l'archive :\n",
    "!unzip data.zip"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "17ef3a6a",
   "metadata": {},
   "source": [
    "**Nous allons ouvrir un des fichiers du dossier ``data`` pour pouvoir le manipuler**"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "85c902fa",
   "metadata": {},
   "outputs": [],
   "source": [
    "#On importe les outils d'OCR pour pouvoir les utiliser\n",
    "import cv2\n",
    "import pytesseract\n",
    "\n",
    "img = cv2.imread(\"data/Moreau3087_GALL0001-06.png\")\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "72f25000",
   "metadata": {},
   "outputs": [],
   "source": [
    "import matplotlib.pyplot as plt\n",
    "plt.imshow(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "9a447718",
   "metadata": {},
   "outputs": [],
   "source": [
    "texte = pytesseract.image_to_string(img)\n",
    "print(texte)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "35c5af0e",
   "metadata": {},
   "source": [
    "Question 1: **Quels grands traits peuvent expliquer les erreurs dans la sortie texte ci-dessus ?**"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "20059622",
   "metadata": {},
   "source": [
    "Question 2 : **Observez ci-dessous le rendu obtenu par un autre OCR (Kraken) qui est spécialisé sur le 17ème siècle. Que remarquez vous ?**"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "b17e12bb",
   "metadata": {},
   "outputs": [],
   "source": [
    "#Ouverture ligne par ligne du fichier \"data/Moreau3087_GALL0001-06_kraken.txt\"\n",
    "with open(\"data/Moreau3087_GALL0001-06_kraken.txt\", \"r\") as fichier:\n",
    "    lignes = fichier.readlines()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "6224e094",
   "metadata": {},
   "outputs": [],
   "source": [
    "for ligne in lignes:\n",
    "    print(ligne)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "12af38b8",
   "metadata": {},
   "source": [
    "Nous n'allons pas corriger à la main (en tout cas pas maintenant). Nous allons traiter toutes les pages de notre document et enregistrer ce résultat automatiquement. Pour ce faire, nous reprenons les lignes principales du code précédent en enregistrant (``write``) le résultat de l'OCR plutôt qu'en affichant (``print``)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "df7fee72",
   "metadata": {},
   "outputs": [],
   "source": [
    "#La libraire glob aide à traiter à la chaîne une série de fichiers en énumérant leurs noms :\n",
    "import glob\n",
    "print(glob.glob(\"data/Doc2/*.png\"))"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "cb176713",
   "metadata": {},
   "source": [
    "La recette c'était : (1) je lis l'image avec ``imread`` et (2) je récupère le texte avec ``image_to_string`` :\n",
    "\n",
    "img = cv2.imread(\"data/Doc1/Moreau3087_GALL0001-06.png\")\n",
    "\n",
    "texte = pytesseract.image_to_string(img)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "869dc761",
   "metadata": {},
   "source": [
    "On pourrait **copier-coller** ce code en changeant juste les noms :\n",
    "\n",
    "img = cv2.imread(\"data/Doc1/Moreau3087_GALL0001-**07**.png\")\n",
    "\n",
    "texte = pytesseract.image_to_string(img)\n",
    "\n",
    "...\n",
    "\n",
    "img = cv2.imread(\"data/Doc1/Moreau3087_GALL0001-**08**.png\")\n",
    "\n",
    "texte = pytesseract.image_to_string(img)\n",
    "\n",
    "...\n",
    "\n",
    "Mais c'est **pénible** et **répétitif**, on va donc simplifier en disant que **pour** chaque image, on va répéter le processus et pour garder le résultat on va enregistrer (voir partie avec ``write``)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "ce8a1a41",
   "metadata": {},
   "outputs": [],
   "source": [
    "liste_image = glob.glob(\"data/Doc2/*.png\")\n",
    "print(liste_image)\n",
    "for image in liste_image:\n",
    "    print(\"On traite :\", image)\n",
    "    img = cv2.imread(image)\n",
    "    texte = pytesseract.image_to_string(img)\n",
    "    print(\"  On enregistre ...\")\n",
    "    with open(image+\".txt\", \"w\") as w:\n",
    "        w.write(texte)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "ef9e5993",
   "metadata": {},
   "source": [
    "Exercice : **réutilisez ce code pour passer l'OCR sur les fichiers contenus dans ``data/Doc1/``**"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "f2ba2efa",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "markdown",
   "id": "e4173195",
   "metadata": {},
   "source": [
    "Exercice : **affichez le contenu de la retranscription OCR du fichier ``data/Doc1/Moreau3087_GALL0001-10.png``**"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "4d9f7f2c",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "markdown",
   "id": "48211287",
   "metadata": {},
   "source": [
    "# Entités Nommées\n",
    "\n",
    "Passons maintenant à l'utilisation de ces données textuelles, via la Reconnaissance d'Entités Nommées"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "1d6097c6",
   "metadata": {},
   "outputs": [],
   "source": [
    "liste_txt = glob.glob(\"data/Doc2/*.txt\")\n",
    "print(liste_txt)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "6b6492ed",
   "metadata": {},
   "outputs": [],
   "source": [
    "with open(\"data/Doc2/Suitte_et_troisieme_arrivee_du_covrier0001-10.png.txt\") as fichier:\n",
    "    texte = fichier.read()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "bd70c825",
   "metadata": {},
   "outputs": [],
   "source": [
    "print(texte)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "7c7b1814",
   "metadata": {},
   "source": [
    "Ce n'est pas exceptionnel, mais pas si mal non plus. Allons regarder les ``entités nommées`` avec le code ci-dessous"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "d488ffc6",
   "metadata": {},
   "outputs": [],
   "source": [
    "import spacy\n",
    "!python -m spacy download fr_core_news_lg\n",
    "\n",
    "nlp = spacy.load(\"fr_core_news_lg\")\n",
    "doc = nlp(texte)\n",
    "for ent in doc.ents:\n",
    "  print(ent.label_, \"\\t:\", ent.text)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "2a75d3a7",
   "metadata": {},
   "source": [
    "On voit que l'on a du bon et du mauvais, et que toutes les erreurs ne viennent pas de l'OCR. \n",
    "\n",
    "Regardons un peu la fréquence des entités dans cette page"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "ed9c4b21",
   "metadata": {},
   "outputs": [],
   "source": [
    "#Au lieu de faire print, on va compter la fréquence dans ce que l'on appelle un dictionnaire\n",
    "dic_entites = {}\n",
    "doc = nlp(texte)\n",
    "for ent in doc.ents:\n",
    "  if str(ent.text) not in dic_entites:#On n'a jamais vu cette entité, on crée une entrée pour elle\n",
    "    dic_entites[str(ent.text)] = 0\n",
    "  dic_entites[str(ent.text)]+=1 #on ajoute 1"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "3c0c841b",
   "metadata": {},
   "outputs": [],
   "source": [
    "print(dic_entites)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "b03bab13",
   "metadata": {},
   "outputs": [],
   "source": [
    "#Regardons celles que l'on a plus d'une fois :\n",
    "for entite, frequence in dic_entites.items():\n",
    "    if frequence>1:\n",
    "        print(entite, frequence)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "d897430d",
   "metadata": {},
   "outputs": [],
   "source": [
    "#Faisons ce test sur l'ensemble des pages\n",
    "#On repart de la liste des fichiers texte :\n",
    "liste_txt = glob.glob(\"data/Doc2/*.txt\")\n",
    "\n",
    "#On remet à zéro le dictionnaire où on stocke les entités\n",
    "dic_entites = {}\n",
    "\n",
    "#on va lire les fichiers l'un après l'autre\n",
    "for nom_txt in liste_txt:\n",
    "    print(\"On traite\", nom_txt)\n",
    "    with open(nom_txt) as fichier:\n",
    "        texte = fichier.read()\n",
    "    # On reprend le code qui traite les entités\n",
    "    doc = nlp(texte)\n",
    "    for ent in doc.ents:\n",
    "      if str(ent.text) not in dic_entites:#On n'a jamais vu cette entité, on crée une entrée pour elle\n",
    "        dic_entites[str(ent.text)] = 0\n",
    "      dic_entites[str(ent.text)]+=1 #on ajoute 1"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "8fc6a6e1",
   "metadata": {},
   "outputs": [],
   "source": [
    "#Regardons celles que l'on a plus d'une fois :\n",
    "for entite, frequence in dic_entites.items():\n",
    "    if frequence>1:\n",
    "        print(entite, frequence)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "de087500",
   "metadata": {},
   "source": [
    "Exercice : **Faites la même opération pour les fichiers textuels de l'autre dossier**"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "86d358eb",
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.10.12"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
