{
  "fetched_at": "2026-10-24T13:31:02Z",
  "source_url": "https://www.kaggle.com/competitions/epita-nlp-medical/data",
  "pages": [
    {
      "name": "data-description",
      "content": "Les données sont disponibles sous forme d'un CSV de 4906 lignes (`data_all.csv`) contenant une entité par ligne, ainsi que d'un CSV contenant les snippets correspondants (`data_all.csv`) \n\n# Colonnes de `data_all.csv`\n## `entity_id`\nIdentifiant unique de l'entité extraite\n\n## `text_id`\nIdentifiant unique du *snippet*: Il est possible que plusieurs entités aient été extraites dans un même snippet de texte. Ainsi, plusieurs `entity_id` peuvent partager un même `text_id`.  \n**Clé de jointure avec le fichier `data_texts.csv`**\n\n## `offset_begin` et `offset_end`\nDébut et fin (en nombre de charactères) de l'entité extraite\n\n## `lexical variant`\nTexte de l'entité (correspond à `text[offset_begin: offset_end]`)\n\n## `label`\nLabel de l'entité (quelle maladie est annotée ?)\n\n## `label_value`\nValeur de l'entité: Correspond à la **sévérité**. La majorité des maladies no vont prendre ici que les valeurs:\n- `0`: Absence de la maladie. Par exemple dans le snippet '... Tabagisme: absent ...', `label_value` vaut `0`\n- `1`: Présence de la maladie.\n\nCertaines maladies sont annotées plus finement et peuvent prendre une troisième valeur `2`. Voir l'annexe pour plus de détails\n\n## `negation`\nColonne booléenne mentionnant si l'entité extraite est niée ou non\n> *Le patient est diabétique* -> `False`\n> *Le patient n'est pas diabétique* -> `True`\n\n## `hypothesis`\nColonne booléenne mentionnant si l'entité extraite est hypothétique ou non\n> *Le patient est diabétique* -> `False`\n> *Le patient est sûrement diabétique* -> `True`\n\n## `family`\nColonne booléenne mentionnant si l'entité extraite a trait au patient ou bien à sa famille\n> *Le patient est diabétique* -> `False`\n> *Le père du patient est diabétique* -> `True`\n\n# Colonnes de `data_texts.csv`\n## `text_id`\nIdentifiant unique du *snippet*.\n**Clé de jointure avec le fichier `data_all.csv`**\n\n## `note_text`\nContenu du snippet de texte",
      "isPublished": false,
      "hasIsPublished": false,
      "postTitle": "",
      "hasPostTitle": false,
      "mimeType": "",
      "hasMimeType": false
    },
    {
      "name": "Description",
      "content": "Des médecins ont annoté près de **5000 morceaux (snippets) de documents médicaux**. Dans chaque snippet, une mention de maladie a été extraite et classée dans une des 18 familles de maladies présentées en annexe. Par exemple:\n> Motif\nConsultation cardiologique avant chirurgie d'une récidive de carcinome épidermoïde vulvaire.\nRésumé clinique - Histoire de la maladie\n\nChaque snippet contient\n- Un **span** indiquant où se trouve l’entité extraite dans le snippet.\n- Un **label** indiquant la maladie annotée\n- Des qualificateurs d’entités, à savoir:\n   - La **négation** (la maladie est-elle niée ?)\n   - La **parenté** (la maladie est-elle associée au patient ou à un membre de sa famille ?)\n   - **L’hypothèse** (la maladie est-elle mentionnée comme hypothétique ?)  \n\nLe but est de créer un algorithme de NLP permettant l’extraction de ces maladies dans le texte, associées à leurs qualificateurs, afin d’utiliser cet algorithme dans un but de recherche: celui-ci va permettre de classifier les patients présents dans l’Entrepôt de Données de Santé de l’AP-HP, cette classification étant ensuite utilisée au sein de projets de recherche.\n\n> **Remarque**  \nL'ensemble des données présentées ont été préalablement pseudonymisées via un algorithme dédié, puis une double vérification manuelle a été effectuée afin d'obtenir un dataset anonymisé.\n\nL'extraction des entités se fera au travers d'algorithmes à base de règles. Pour la qualification, une approche à base de règles est également disponible, toutefois il s'agira ici d'implémenter une approche à base de Deep Learning\n\n# Le projet\n\nLe projet se découpe en 4 parties (la dernière étape en bonus), chaque partie étant détaillée dans son onglet dédié. Par groupes de 3 personnes, suivez les indications présentées dans ces onglets, ainsi que dans les éventuels notebooks associées. L'onglet **3 - Visualisation** peut être appliqué pour les parties 1 et 2. La partie 4 est volontairement très ouverte.\n\nChaque onglet contient un paragraphe **proposition de travail** mentionnant une approche possible. Il est conseillé de suivre cette approche mais vous pouvez vous en écarter si vous le jugez nécessaire et le justifiez.\n\n## Rendu\n\n- Un support (rapport, notebooks, HTML ...) présentant et argumentant le code et les développements effectués.\n- Une soutenance orale avec PPT.\n\n## Déroulement\n\n- **Lundi 16 janvier, 10h -> 12h** Présentation et lancement du projet\n- **Mercredi 18 janvier, TBD** Session d'échange et de réponse aux éventuelles questions\n- **Vendredi 20 janvier après-midi** Soutenance orale (~ 15 minutes)\n\n### Remarques sur Kaggle\n\n- Après inscription sur kaggle puis vérification de votre téléphone, vous disposerez de 38h de GPU. Utilisez ces GPU lors de vos  entraînements de modèles afin de réduire (drastiquement) les temps d'entraînement. Suivant vos modèles, vous devriez pouvoir effectuer un fine-tuning en une dizaine de minutes en utilisant **GPU T4 x2**\n- Sur vos notebooks kaggle , pensez à activer internet (pour le téléchargement de modules / modèles) et la persistance des données.\n- **⚠️ bien que Kaggle serve traditionellement à héberger des compétitions, aucune soumission n'est a effectuer dans le cadre de ce projet ! Kaggle ne sert qu'à partager les données et ressources**\n- Si besoin, utilisez l'onglet **Discussion** pour discuter entre vous ou poser des questions\n\n\n#### Bon courage !",
      "isPublished": false,
      "hasIsPublished": false,
      "postTitle": "",
      "hasPostTitle": false,
      "mimeType": "",
      "hasMimeType": false
    },
    {
      "name": "rules",
      "content": "",
      "isPublished": false,
      "hasIsPublished": false,
      "postTitle": "",
      "hasPostTitle": false,
      "mimeType": "",
      "hasMimeType": false
    },
    {
      "name": "1 – Algorithmes À Base De Règles",
      "content": "## Présentation\n\nLa tâche d'extraction passe par la construction de terminologies propres à chaque maladie. Ces terminologies ont été générées à l'aide de médecins et sont rendues disponibles dans une librairie Open-Source développée à l'AP-HP : [EDS-NLP](https://github.com/aphp/edsnlp)\n\n### La librairie EDS-NLP\n\nLa librairie est construite autour de spaCy, un framework populaire de NLP. Vous trouverez un guide basique [ici](https://aphp.github.io/edsnlp/latest/tutorials/spacy101/).  \nDans le cadre de ce cours, une version dédiée est disponible:\n- Lien [GitHub](https://github.com/aphp/edsnlp/tree/epita)\n- Lien vers la [documentation](https://aphp.github.io/edsnlp/epita/)\n\n### Les algorithmes de NER\n\nL'extraction d'entité se fait à l'aide des terminologies mentionnées ci-dessous ainsi qu'un certain nombre de règles ad-hoc permettant d'afiner l'extraction et/ou d'exclurer des faux-positifs.\n\n### Les algorithmes de qualification\n\nDe même, des algorithmes de qualification (négation, parenté, hypothèse) se basent sur un ensemble de règles pour qualifier une entité.\n\n### Notebook\nLe [notebook d'exemple](https://www.kaggle.com/thomzoy/1-ner-et-qualification-base-de-r-gles) vous montre comment instancier une pipeline spaCy contenant les différents algorithmes de NER et de qualification. Vous pouvez partir de ce notebook pour la suite:\n\n>## **Proposition de travail**\n>\n>**- Se familiariser avec spaCy et EDS-NLP**\n>**- Construire la pipeline complète d'extraction d'entité + qualification à base de règles**\n>**- Calculer des métriques sur les données disponibles (NER seul, NER + Qualification / Qualification seule)**\n\n\n\n## Liens utiles\n\n- Classe de base utilisée pour créer les pipelines de NER : https://aphp.github.io/edsnlp/epita/pipelines/core/contextual-matcher/\n- Exécuter une pipeline spaCy sur de nombreux textes: https://aphp.github.io/edsnlp/epita/tutorials/multiple-texts/\n- Documentation sur les qualificateurs à base de règles: https://aphp.github.io/edsnlp/epita/pipelines/qualifiers/#available-pipeline\n",
      "isPublished": false,
      "hasIsPublished": false,
      "postTitle": "",
      "hasPostTitle": false,
      "mimeType": "",
      "hasMimeType": false
    },
    {
      "name": "2 – Qualification D'entité Par ML",
      "content": "## Présentation\n\nLa qualification à base de régles permet d'établir une baseline. Toutefois, il  est possible d'obtenir de meilleurs performances en développant un modèle de Deep Learning et en l'entraînant sur cette tâche. Vu la quantité limitée de données d'entraînement disponible, il est judicieux d'adopter une logique de **fine-tuning**: partir d'un modèle pré-entraîner et le fine-tuner sur un tâche annexe.\n\n### BERT\n\n**BERT** est un modèle de NLP basé sur des *Transformers*. Très populaire, il a servi de base à de nombreux modèles par la suite. Utilisé comme couche pré-entraînée, il permet d’obtenir de bien meilleurs résultats tout en limitant drastiquement le temps d’entraînement. Un dérivé de BERT, CamemBERT, a été entraîné sur un corpus français. Il est donc plus adapté à la tâche présentée ici.  \nCamemBERT va nous servir a générer des *embeddings* pour chaque token constituant la phrase d'entrée. Ensuite, une tête de classification complètera le modèle\n\n### Les approches possibles\n\nDans le cadre de ce projet, il y a 2 grandes approches possibles:\n\n- **Classification globale**: on effectue une classification au niveau du texte complet, sans uiliser l'information de **position** de l'entité\n- **Classification avec focus sur l'entité**: similaire à la classification globale, mais avec une couche supplémentaire entre la couche d'embeddings et la tête de classification afin d'utiliser l'information de position -> L'idée est de donner à la tête de classification uniquement les embeddings des tokens de l'entité initiale.\n\n### Notebook\nLe [notebook d'exemple](https://www.kaggle.com/code/thomzoy/2-qualification-par-ml) va vous servir de trame. Vous pouvez le suivre dans l'ordre, il contient des informations, du code complet ou a compléter ainsi que des pistes de travail.\n\n>## **Proposition de travail**\n>\n>**- Se familiariser avec les bibliotèques de DL (datasets, pytorch, transformers, pytorch-lightning)**\n>**- Suivre les instructions du notebook et implémenter les fonctionnalités manquantes**\n>**- Rendre compte des performances**\n\n## Workflow:\n\nLe workflow décrit dans le notebook est le suivant\n\n- Création d'un [Dataset](https://huggingface.co/docs/datasets/installation) à partir des données d'entrée\n- Création d'un [DataModule](https://pytorch-lightning.readthedocs.io/en/stable/data/datamodule.html)\n- Création du modèle [PyTorch](https://pytorch.org/docs/stable/generated/torch.nn.Module.html),  wrappé autour d'un [Module PyTorch-Lightning](https://pytorch-lightning.readthedocs.io/en/latest/common/lightning_module.html)\n- Entraînement à l'aide d'un [Trainer](https://pytorch-lightning.readthedocs.io/en/latest/common/trainer.html)\n\nDans ce workflow, différentes libraires sont utilisées, entre autres:\n- `datasets` : permet de gérer le préprocessing des données\n- `pytorch` : librairie de base permettant la création de modèles de ML/DL\n- `transformers` : contient les modèles de Transformers (notamment BERT) ainsi que leur tokenizer associé.\n- `pytorch-lightning` : wrapper autour de `pytorch` permettant un développement plus simple et rapide\n\nN'hésitez pas à parcourir leur documentation pour vous familiariser avec les fonctionnalités utilisées dans le notebook",
      "isPublished": false,
      "hasIsPublished": false,
      "postTitle": "",
      "hasPostTitle": false,
      "mimeType": "",
      "hasMimeType": false
    },
    {
      "name": "3 – Visualisation",
      "content": "## Présentation\n\nAu delà du développement d’algorithmes, il s’agit également de savoir présenter à une audience technique (chercheurs, data-scientists) et non technique (i.e. les médecins et cliniciens) l’intérêt et les performances de celui-ci. \n\nLa présentation des résultats peut aller de simples tableaux et graphes à de véritables dashboards interactifs.\n\n>## **Proposition de travail**\n>\n>**- Présenter vos résultas (étapes de NER et/ou de qualification) de manière judicieuse**\n>**- Présenter des résultats et statistiques susceptibles de parler à une audience plutôt médicale que technique (par exemple, étudier la  prévalence des maladies)**\n>**- 💥 BONUS 💥 Ajouter de l'intéraction (par exemple via des graphs interactifs ou à travers une démo de votre modèle)**\n\nPour ce dernier point, un outil intéressant est [Streamlit](https://streamlit.io/), utilisé dans EDS-NLP justement dans le but de mettre en ligne une [démo interactive](https://aphp.github.io/edsnlp/demo/).  \nDans la même veine, on peut également citer Dash.  \nConcernant les graphiques interactifs, deux possibilités sont [Altair](https://altair-viz.github.io/) et [Plotly](https://plotly.com/python/).",
      "isPublished": false,
      "hasIsPublished": false,
      "postTitle": "",
      "hasPostTitle": false,
      "mimeType": "",
      "hasMimeType": false
    },
    {
      "name": "4 – 💥 BONUS 💥 Pseudonymisation",
      "content": "## Présentation\n\nComme mentionné dans le descriptif du projet, les données auxquelles vous avec accès ont été anonymisées via une double annotation manuelle: les traits identifiants (prénom, noms, téléphone, adresse, etc) ont été annotés et remplacés par d'autres valeurs.\n\n>## **Proposition de travail**\n>\n> Si vous aviez à automatiser cette étape (comme c'est le cas dans tout EDS), comment vous y prendriez-vous ?\n>**- Approche par règles ?**\n>**- Approche par ML ?**\n>**- Comment choisir ?**\n>**- Quels sont les challenges liés à cette tâche ?**\n>**- ...**\n\n",
      "isPublished": false,
      "hasIsPublished": false,
      "postTitle": "",
      "hasPostTitle": false,
      "mimeType": "",
      "hasMimeType": false
    },
    {
      "name": "Annexe",
      "content": "# Liste des maladies\n\nEn dehors de l'alcool et le tabagisme, ces maladies font parties de [l'index de comorbidités Charlson.](https://strokengine.ca/en/assessments/charlson-comorbidity-index-cci/)\n\n| Maladie                                                      | Nom dans EDS-NLP            | Valeurs possibles                                                       |\n| ------------------------------------------------------------ | --------------------------- | ----------------------------------------------------------------------- |\n| Infarctus du Myocarde                                        | myocardial_infarction       | Présent (1), Absence (0)                                                |\n| Insuffisance Cardiaque Congestive + Fibrillation Auriculaire | CKD                         | Présent (1), Absence (0)                                                |\n| Maladies Vasculaires Periphériques + HTA                     | peripheral_vascular_disease | Présent (1), Absence (0)                                                |\n| Maladies Cérébro-Vasculaires                                 | cerebrovascular_accident    | Présent (1), Absence (0)                                                |\n| Démence                                                      | dementia                    | Présent (1), Absence (0)                                                |\n| Maladies Pulmonaires Chroniques                              | COPD                        | Présent (1), Absence (0)                                                |\n| Maladies des Tissus Conjonctifs                              | connective_tissue_disease   | Présent (1), Absence (0)                                                |\n| Ulcères gastriques                                           | peptic_ulcer_disease        | Présent (1), Absence (0)                                                |\n| Maladies du Rein                                             | CKD                         | Présent (1), Absence (0)                                                |\n| SIDA                                                         | AIDS                        | Présent (1), Absence (0)                                                |\n| Hémiplégie                                                   | hemiplegia                  | Présent (1), Absence (0)                                                |\n| Diabète                                                      | diabetes                    | Avec atteintes d'organes (2), Sans atteintes d'organes (1), Absence (0) |\n| Maladies du Foie                                             | liver_disease               | Modérée/Sévère (2), Faible (1), Absence (0)                             |\n| Cancer                                                    | solid_tumor                 | Métastasé (2), Solide (1),  Absence (0)                                 |\n| Leucémie                                                     | leukemia                    | Présent (1), Absence (0)                                                |\n| Lymphome                                                     | lymphoma                    | Présent (1), Absence (0)                                                |\n| Alcool                                                       | alcohol                     | Sevré (2), Présent (1), Absence (0)                                     |\n| Tabagisme                                                    | tobacco                     | Sevré (2), Présent (1), Absence (0)                                     |",
      "isPublished": false,
      "hasIsPublished": false,
      "postTitle": "",
      "hasPostTitle": false,
      "mimeType": "",
      "hasMimeType": false
    }
  ]
}