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:
Nom | Type | Description |
---|---|---|
category | string | MEDICATION |
designation | string | Chaîne détectée comme quantité |
entity_type | string | FORM |
codings | Codings | Objet contenant 2 tableaux d'objets : FORM and BASE_FORM |
Codings
Nom | Type | Description |
---|---|---|
FORM | array | Tableau d'objets NELEntity |
BASE_FORM | array | Tableau d'objets NELEntity |
NELEntity
Nom | Type | Description |
---|---|---|
code | string | Code de la forme galénique |
label | string | L'attribut à utiliser pour matcher dans la base de données |
terminology | string | FORM ou BASE_FORM |
cosine_similarity | number | 1 (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 :
Attribut | Type | Description |
---|---|---|
as_needed | NERLAsNeeded | Facultative. |
category | string | Always MEDICATION (these quantities are always related to the use of a medication). |
designation | string | Detected string as quantity. |
entity_type | string | Always QUANTITY . |
begin_offset | int | Position of the first character in the original string. |
end_offset | int | Position of the last character. |
quantity_and_rate | QuantityOrRate | |
timing | Timing | For entities of subtype DOSE. |
NERLAsNeeded
Attribut | Type | Description |
---|---|---|
as_needed | bool | If a text starts with "si" (if needed, if in pain, etc.). |
as_needed_for | string | The corresponding text. |
QuantityOrRate
Attribut | Type | Description |
---|---|---|
value | float | Detected quantity of units. |
unit | string | Normalized unit (among a list of entities). |
type | string | "QUANTITY" , "DOSE" , or "STRENGTH" . |
code | string | Value of the detected code in the system |
system | string | Terminology used |
rate | Rate | When 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 rate
est 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
Attribut | Type | Description |
---|---|---|
numerator | float | Numerator of the fraction. |
denominator | float | Denominator of the fraction. |
numerator_unit | string | Normalized unit of the numerator |
denominator_unit | string | Normalized unit of the denominator |
numerator_system | string | System of the numerator |
denominator_system | string | System of the denominator |
numerator_unit_code | string | Code of the numerator |
denominator_unit_code | string | Code 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.
Attribut | Type | Description |
---|---|---|
frequency | int | Fréquence de prise du médicament (si frequency_max existe, frequency correspond à la fréquence minimale). |
frequency_max | int | Fréquence maximale. |
period | int | Correspond à la période pendant laquelle frequency prises ont lieu. |
period_unit | string | Unité de la période. |
period_max | int | Correspond à la période maximale. |
bounds_duration | BoundsDuration | Durée du traitement. |
time_of_day | string[] | Heures de la journée où le traitement doit être pris (8h, 12h30, ...). |
day_of_week | string[] | Jours de la semaine où le traitement doit être pris (mon, tue, wed, thu, fri, sat, sun). |
when | string[] | 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)). |
offset | int | Intervalle de temps entre la prise et when, en minutes. |
sequence | int | Chiffre commençant à 0 indiquant la succession des posologies (2 cpr pendant une semaine puis 1 cpr pendant 1 mois). |
frequency_texts | string[] | Liste des différents textes correspondant aux fréquences. |
bounds_duration_text | string | Texte 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
Attribut | Type | Description |
---|---|---|
unit | string | Unité de la durée du traitement. |
value | float | Durée (minimale) du traitement. |
max_value | float | Duré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 :
Attribut | Type | Description |
---|---|---|
category | string | MEDICATION (les durées sont toujours liées à l’utilisation d’un médicament) |
designation | string | chaîne détectée comme durée |
entity_type | string | DURATION |
begin_offset | int | position du 1er caractère dans la chaîne d’origine |
end_offset | int | position du dernier caractère |
description | object | objet contenant la description de la durée |
duration | object | objet contenant la durée de la prise (durée minimale si value_max existe), et l'unité de la durée |
value | float | durée de la prise |
value_max | float | durée maximale de la prise |
unit | string | unité 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 bruteformatted_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’observationunit
: 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.