APIs
Format de données
Modèle de posologie

Modèle de posologie structurée

Introduction

La posologie structurée s'inspire des terminologies FHIR décrites ici : https://www.hl7.org/fhir/ (opens in a new tab)

Formes galéniques

Comportement

Deux terminologies existent pour la forme galénique : FORM et BASE_FORM

La terminologie FORM provient d’une liste fournie par la direction européenne de la qualité du médicament (EDQM). Ces formes galéniques complexes sont généralement détectées par le scan d’ordonnance, ainsi que les BASE_FORM correspondantes, dont la liste provient aussi de l’EDQM.

Les attributs spécifiques à ces entités sont de la forme:

NomTypeDescription
categorystringMEDICATION
designationstringChaîne détectée comme quantité
entity_typestringFORM
codingsCodingsObjet contenant 2 tableaux d'objets : FORM and BASE_FORM

Codings

NomTypeDescription
FORMarrayTableau d'objets NELEntity
BASE_FORMarrayTableau d'objets NELEntity

NELEntity

NomTypeDescription
codestringCode de la forme galénique
labelstringL'attribut à utiliser pour matcher dans la base de données
terminologystringFORM ou BASE_FORM
cosine_similaritynumber1 (car uniquement des matchs exacts)

Response

{
  "begin_offset": 2,
  "category": "MEDICATION",
  "codings": {
    "FORM": [
      {
        "code": "comprimé",
        "cosine_similarity": 1,
        "label": "comprimé",
        "terminology": "FORM"
      }
    ],
    "BASE_FORM": [
      {
        "code": "Comprimé",
        "cosine_similarity": 1,
        "label": "Comprimé",
        "terminology": "BASE_FORM"
      }
    ]
  },
  "designation": "cpr",
  "end_offset": 5,
  "entity_type": "FORM"
}

Quantités

De manière générale, un générale, un nombre, lié ou non à une unité, est appelé une quantité (quantity).

Lorsque cette quantité se réfère à la quantité :

  • d’une molécule dans un comprimé, gélule, etc de médicament, elle est appelée la force (strength).
  • de médicament par prise, elle est appelée la dose (aussi dose).

Comportement

Si la quantité est une dose ou une quantity, lorsque détectée, elle est renvoyé avec les attributs :

AttributTypeDescription
as_neededNERLAsNeededFacultative.
categorystringAlways MEDICATION (these quantities are always related to the use of a medication).
designationstringDetected string as quantity.
entity_typestringAlways QUANTITY.
begin_offsetintPosition of the first character in the original string.
end_offsetintPosition of the last character.
quantity_and_rateQuantityOrRate
timingTimingFor entities of subtype DOSE.

NERLAsNeeded

AttributTypeDescription
as_neededboolIf a text starts with "si" (if needed, if in pain, etc.).
as_needed_forstringThe corresponding text.

QuantityOrRate

AttributTypeDescription
valuefloatDetected quantity of units.
unitstringNormalized unit (among a list of entities).
typestring"QUANTITY", "DOSE", or "STRENGTH".
codestringValue of the detected code in the system
systemstringTerminology used
rateRateWhen a fraction is detected, the rate attribute is added to the value attribute with the values and units of the numerator and denominator.

Les attributs value et unit sont non-vides uniquement dans le cas où la valeur ne correspond pas à un ratio (comme une concentration (mg/L) etc). Dans le cas contraire, ces deux attributs sont vides, et l’attribut rateest utilisé à la place.

Les unités peuvent venir à la fois du système international ou bien d’unités de la SNOMED (dont la version UK) telles que “comprimé”, “ampoule”. Des unités manquantes ont par ailleurs été ajoutées avec le préfixe 94329990001. La liste complète des unités utilisées est disponible sur la route https://api.preprod.posos.co/nerl/dose_units?lang=fr (opens in a new tab) organisées par système.

Exemple

{
  "query": "2 comprimés",
  "preprocessed_query": "2 comprimes",
  "entities": [
    {
      "category": "MEDICATION",
      "designation": "2 comprimes",
      "begin_offset": 0,
      "end_offset": 11,
      "entity_type": "QUANTITY",
      "quantity_and_rate": {
        "value": 2.0,
        "unit": "comprimé(s)",
        "type": "DOSE",
        "code": "428673006",
        "system": "http://snomed.info/sct"
      }
    }
  ]
}

Lorsqu’une chaîne de caractère est composée d’un nombre et d’une unité du système international mais ne suit pas directement un médicament, elle est détectée en tant que QUANTITY (on ne sait pas a priori si c’est une STRENGTH ou DOSE) :

{
  "query": "500 mg",
  "preprocessed_query": "500 mg",
  "posology_string": "500 mg",
  "entities": [
    {
      "begin_offset": 0,
      "category": "MEDICATION",
      "designation": "500 mg",
      "end_offset": 6,
      "entity_type": "QUANTITY",
      "quantity_and_rate": {
        "unit": "mg",
        "code": "mg",
        "system": "https://ucum.org",
        "value": 500.0,
        "type": "QUANTITY"
      }
    }
  ]
}

Lorsqu’une fraction est détectée, l’attribut rate est ajouté à l’attribut value avec les valeurs et unités des numérateur et dénominateur.

Exemple

{
  "query": "50 mg/20 mL",
  "preprocessed_query": "50 mg / 20 ml",
  "posology_string": "50 mg / 20 ml",
  "entities": [
    {
      "begin_offset": 0,
      "category": "MEDICATION",
      "designation": "50 mg / 20 ml",
      "end_offset": 13,
      "entity_type": "QUANTITY",
      "quantity_and_rate": {
        "rate": {
          "numerator": 50.0,
          "denominator": 20.0,
          "numerator_unit": "mg",
          "numerator_unit_code": "mg",
          "denominator_unit": "mL",
          "denominator_unit_code": "mL",
          "numerator_system": "https://ucum.org",
          "denominator_system": "https://ucum.org"
        },
        "type": "QUANTITY"
      }
    }
  ]
}

Lorsqu’une chaîne de caractère reconnue comme un médicament est suivie d’un nombre (avec ou sans unité) et que ce nombre correspond à une force connue du médicament, un attribut strength est ajouté à l’entité médicament correspondante. Cet attribut est une liste de QuantityOrRate.

Exemple

{
  "query": "ENTRESTO 24/26 mg",
  "preprocessed_query": "entresto 24 / 26 mg",
  "posology_string": "",
  "entities": [
    {
      "begin_offset": 0,
      "category": "MEDICATION",
      "codings": {},
      "designation": "entresto",
      "end_offset": 8,
      "entity_type": "DRUG",
      "strength": [
        {
          "unit": "mg",
          "code": "mg",
          "system": "https://ucum.org",
          "value": 24.0,
          "type": "STRENGTH"
        },
        {
          "unit": "mg",
          "code": "mg",
          "system": "https://ucum.org",
          "value": 26.0,
          "type": "STRENGTH"
        }
      ],
      "strength_designation": "24 / 26 mg",
      "selected_strength": "24 mg/26 mg",
      "prescripted_drug": true
    }
  ]
},
 
// Lorsque les unités sont différentes, on considère qu'il n'y a qu'un seul ingrédient
// On remplit alors l'attribut rate de strength
{
  "query": "ACUPAN 20 mg/2 mL",
  "preprocessed_query": "acupan 20 mg / 2 ml",
  "posology_string": "",
  "entities": [
    {
      "begin_offset": 0,
      "category": "MEDICATION",
      "designation": "acupan",
      "end_offset": 6,
      "entity_type": "DRUG",
      "strength": [
        {
          "rate": {
            "numerator": 20.0,
            "denominator": 2.0,
            "numerator_unit": "mg",
            "numerator_unit_code": "mg",
            "denominator_unit": "mL",
            "denominator_unit_code": "mL",
            "numerator_system": "https://ucum.org",
            "denominator_system": "https://ucum.org"
          },
          "type": "STRENGTH"
        }
      ],
      "strength_designation": "20 mg / 2 ml",
      "selected_strength": "20 mg/2 ml",
      "prescripted_drug": true
    }
  ]
}
 

Rate

AttributTypeDescription
numeratorfloatNumerator of the fraction.
denominatorfloatDenominator of the fraction.
numerator_unitstringNormalized unit of the numerator
denominator_unitstringNormalized unit of the denominator
numerator_systemstringSystem of the numerator
denominator_systemstringSystem of the denominator
numerator_unit_codestringCode of the numerator
denominator_unit_codestringCode of the denominator

Timing

Comportement

Les entités de type QUANTITY et de sous-type DOSE ont nécessairement un attribut timing dont les valeurs sont les suivantes. Les entités de type FREQUENCY sont dépréciées.

AttributTypeDescription
frequencyintFréquence de prise du médicament (si frequency_max existe, frequency correspond à la fréquence minimale).
frequency_maxintFréquence maximale.
periodintCorrespond à la période pendant laquelle frequency prises ont lieu.
period_unitstringUnité de la période.
period_maxintCorrespond à la période maximale.
bounds_durationBoundsDurationDurée du traitement.
time_of_daystring[]Heures de la journée où le traitement doit être pris (8h, 12h30, ...).
day_of_weekstring[]Jours de la semaine où le traitement doit être pris (mon, tue, wed, thu, fri, sat, sun).
whenstring[]Moments de la journée auxquels ont lieu le traitement (les significations des codes sont expliquées dans ce site https://www.hl7.org/fhir/valueset-event-timing.html#definition (opens in a new tab)).
offsetintIntervalle de temps entre la prise et when, en minutes.
sequenceintChiffre commençant à 0 indiquant la succession des posologies (2 cpr pendant une semaine puis 1 cpr pendant 1 mois).
frequency_textsstring[]Liste des différents textes correspondant aux fréquences.
bounds_duration_textstringTexte correspondant à la durée du traitement.

Exemple

{
  "query": "1 cpr 3 à 4 fois toutes les 6 heures pendant 2 à 3 semaines",
  "preprocessed_query": "1 cpr 3 a 4 fois toutes les 6 heures pendant 2 a 3 semaines",
  "posology_string": "1 cpr 3 à 4 fois toutes les 6 heures pendant 2 à 3 semaines",
  "entities": [
    {
      "begin_offset": 0,
      "category": "MEDICATION",
      "designation": "1 cpr",
      "end_offset": 5,
      "entity_type": "QUANTITY",
      "quantity_and_rate": {
        "unit": "comprimé(s)",
        "code": "428673006",
        "system": "http://snomed.info/sct",
        "value": 1,
        "type": "DOSE"
      },
      "timing": {
        "frequency": 3,
        "frequency_max": 4,
        "period": 6,
        "period_unit": "hour",
        "bounds_duration": {
          "unit": "week",
          "value": 2,
          "max_value": 3
        },
        "frequency_texts": ["3 a 4 fois toutes les 6 heures"],
        "bounds_duration_text": "pendant 2 a 3 semaines"
      }
    },
    {
      "begin_offset": 2,
      "category": "MEDICATION",
      "codings": {},
      "designation": "cpr",
      "end_offset": 5,
      "entity_type": "FORM"
    }
  ]
}

BoundsDuration

AttributTypeDescription
unitstringUnité de la durée du traitement.
valuefloatDurée (minimale) du traitement.
max_valuefloatDurée maximale du traitement.

Duration

Comportement

Les durées d’application d’un traitement sont codées par des objets dont l’ entity_type est DURATION. Les entités de fréquence sont donc codées par les attributs suivants :

AttributTypeDescription
categorystringMEDICATION (les durées sont toujours liées à l’utilisation d’un médicament)
designationstringchaîne détectée comme durée
entity_typestringDURATION
begin_offsetintposition du 1er caractère dans la chaîne d’origine
end_offsetintposition du dernier caractère
descriptionobjectobjet contenant la description de la durée
durationobjectobjet contenant la durée de la prise (durée minimale si value_max existe), et l'unité de la durée
valuefloatdurée de la prise
value_maxfloatdurée maximale de la prise
unitstringunité de la durée
{
  "query": "appliquer pendant 3 minutes sur la plaie",
  "preprocessed_query": "appliquer pendant 3 minutes sur la plaie",
  "posology_string": "pendant 3 minutes la plaie",
  "entities": [
    {
      "begin_offset": 35,
      "category": "CONDITION",
      "codings": {
        "MEDDRA": [
          {
            "code": "10052428",
            "cosine_similarity": 1,
            "label": "Plaie",
            "terminology": "MEDDRA",
            "level": "PT"
          }
        ]
      },
      "designation": "plaie",
      "end_offset": 40,
      "entity_type": "CONDITION"
    }
  ]
}

Informations administratives sur l’ordonnance

Le RPPS et la date de prescription sont détectées dans un champ administrative (à la fin des outputs du NERL, hors de entities) qui a le format suivant :

  • recorder :
    • identifier : le numéro RPPS
  • authoredOn :
    • date : la date brute
    • formatted_date : la date en format YYYY/mm/dd

Observations sur le patient

Les informations physiologiques sur le patient sont détectées par le NERL et regroupées dans un champ observations qui en contient la liste. Les observations sont des NERLEntity avec tous les paramètres qui leur sont associés. Elles ont un champ observation supplémentaire qui contient les détails de l’observation :

  • code : code LOINC de l’observation en question (Body weight, Body height, Body Mass Index (BMI), Age)
  • value : valeur de l’observation
  • unit : unité
{
  "begin_offset": 10,
  "category": "PATIENT_INFORMATION",
  "designation": "34 kg",
  "end_offset": 15,
  "entity_type": "OBSERVATION",
  "observation": {
    "code": "Body weight",
    "value": 34.0,
    "unit": "kg"
  }
}

NB : La taille n’est détectée qu’en cm, les âges qu’en années. Si une taille et un IMC sont indiqués, le poids est calculé à partir de ces deux informations.