Einleitung
Den Ärzten wird es möglich sein, direkt von ihren Smartphones aus eine Anordnung zu erstellen. Dazu werden ihnen zunächst ein Diktatfeld sowie eine Anleitung zum richtigen Diktieren gezeigt. Das Diktieren soll mit dem Nuance Dragon Medical SpeechKit erfolgen. Nach dem Diktat wird dem Nutzer ein strukturiertes Interface angezeigt. Das Diktat wird dabei an die Information Extraction weitergeleitet, die ein JSON mit erkannten Feldern zurückliefert, womit die Textfelder im strukturierten Interface befüllt werden. Diese Textfelder sind von der Größe an den zu erwartenden Text angepasst. Bei Bedarf erweitern sich diese Felder automatisch. Unter den Textfeldern werden Auswahlmöglichkeiten für Risikofaktoren gezeigt. Diese werden abhängig der gewählten Modalität ein- oder ausgeblendet – für ein CT wird beispielsweise nur die Schwangerschaft (bei weiblichen Patienten ab einem bestimmten Alter) und die Kontrastmittelallergie angezeigt. Diese werden abhängig von der JSON auf „Nein“, „Unklar“, „Ja“, oder – falls nichts angegeben wurde – nicht gesetzt. Eine Anordnung kann nur abgeschickt werden, wenn diese Pflichtfelder ausgefüllt sind.
Unter dem Feld für die Untersuchungen befindet sich ein Button namens „Leistungen auswählen“. Dieser leitet einen bei Klick auf den Leistungsbaum weiter. Dieser enthält den Leistungsbaum ohne Kinderklinik und Speicherfolie. Tiefer gehende Ebenen sind mit farbigen Balken an der linken Seite gekennzeichnet. Wählt ein Arzt hier eine oder mehrere Leistungen aus, werden diese zunächst mit einem Haken markiert, und beim Klick auf Speichern an die strukturierte Eingabe übergeben, wo diese in das Feld für die Angeordneten Untersuchungen eingetragen werden.
Beim Absenden werden die Daten in der JSON aktualisiert und per POST zurück an eine vorher spezifizierte URL geschickt.
Input
Beim Aufruf des Webservices sind folgende Daten über die Websiteparameter mitzusenden:
Name | Typ | Beschreibung | Optionen / Beispiel |
---|---|---|---|
targeturl | String (URL) | Die Ziel-URL inklusive aller benötigten Parameter. | |
sex | String (Enum) | Das biologische Geschlecht des Patienten. | “m”,”w” |
age | String (Int) | Das Alter des Patienten. | “78”, “45”, “2” |
userid | String | Die userid für Nuance. |
Kommunikation mit der Information Extraction
In einem Zwischenschritt wird das erkannte Diktat an den Webservice zur Information Extraction geschickt, die wiederum eine JSON mit den extrahierten Daten zurückschickt. Diese Information Extraction ist im Dokument „Webservice zur Extraktion von Feldern des klinischen Auftrags aus diktierten Anordnungen“ genauer beschrieben.
Input
Folgende JSON wird per POST als Input an die Information Extraction geschickt:
Name | Typ | Beschreibung | Optionen / Beispiel |
---|---|---|---|
docid | String | Eindeutige ID der Anordnung | „0000000012345“ |
doctime | String (DateTime) | Erstellungszeitpunkt der Anordnung | „20201116150000“ |
doctext | String | Der Text der Anordnung | „Schulter in 2 Ebe…“ |
Output
Folgende JSON wird als Rückmeldung von der Information Extraction erwartet:
Name | Typ | Beschreibung | Optionen / Beispiel |
---|---|---|---|
docid | String | s.o. | „0000000012345“ |
doctime | String (DateTime) | s.o. | „20201116150000“ |
modality | String | die ermittelte Modalität | „konv. Röntgen“ |
anamnesis | String | die ermittelte (Kurz)anamnese | „nach Sturz von …“ |
diagnosis | String | die ermittelte Diagnose | „V.a. Fraktur des …“ |
question | String | die ermittelte Fragestellung | „Rippenserienfraktur?“ |
notice | String | Bemerkungen | |
pregnancy | String (Enum) | Schwangerschaft vorhanden? | „nicht erhoben“ / „ja“ / „nein“ / „nicht bekannt“ |
pregnancy_week | String (Int) | Schwangerschaftswoche | „0“, „1“, „2“, … |
infection | String (Enum) | Infektionsgrad | „IRG-0“ / „IRG-1“ / „IRG-2“/ „IRG-3“/ „UNBEKANNT“ |
implantate | String (Enum) | Metallimplantate? | „nicht erhoben“ / „ja“ / „nein“ / „nicht bekannt“ |
pacemaker | String (Enum) | Herzschrittmacher? | „nicht erhoben“ / „ja“ / „nein“ / „nicht bekannt“ |
allergy | String (Enum) | Kontrastmittelallergie? | „nicht erhoben“ / „ja“ / „nein“ / „nicht bekannt“ |
allergy_type_iodine | String (Enum) | auf Jod-haltige? | „ja“ / „nein“ |
allergy_type_other | String (Enum) | auf andere als Jod-haltige? | „ja“ / „nein“ |
preferred_date | String | der Wunschtermin als Text wie er diktiert wurde | z.B. „am 3. Juni 23“ |
preferred_date_cycle | String (Int) | Zyklus | „1“, „2“, „3“, … |
long_text | String | Textbasierte Auflistung der Extrakte zur Anzeige im SAP Formular „Anordnung“ |
„Modalität: MRT Anamnese: … Fragestellung: …“ |
services | List<service> | Liste von Leistungen | s.u. |
services_top10 | List<raw_service> | Liste der Top 10 Leistungscodes aus dem Transformer Modell | s.u. |
tokens | List<String> | Liste von Tokens aus dem Anamnesis Extractor | [„Knie“, „links“, „in“, „2“, „Ebenen“,…] |
probs | List<List<Double>> | Wahrscheinlichkeit für jedes Token, dass es ein bestimmtes Label hat. | [[1.0,0.0],[0.7,0.3]] |
label_dict | Map<String, String> | Dictionary das sagt, welche Stelle in „props“ welches Label bedeutet | {„0“: „PAD“, „1“: „0“, „2“: „B-A“, …} |
Definition des Objekts „service“:
Name | Typ | Beschreibung | Optionen / Beispiel |
---|---|---|---|
code | String | Leistungscode aus dem Katalog des UKW | „RKK2EBSL“ |
description | String | Leistungsbezeichnung | „Röntgen Schulter in zwei Ebenen“ |
number | String (Int) | Menge der Leistung | „1“, „2“, „3“, … |
localisation | String (Enum) | Lokalisation der Leistung | „B“ / „L“ / „R“ / „NB“ / „NR“ / „empty” |
Definition des Objekts „raw_service“:
Name | Typ | Beschreibung | Optionen / Beispiel |
---|---|---|---|
code | String | Leistungscode aus dem Katalog des UKW | „RKK2EBSL“ |
description | String | wörtliche Beschreibung der Leistung aus dem Katalog des UKW | „Schulter in zwei Ebenen“ |
P | Double | Wahrscheinlichkeit des Codes | 0.9979548454 |
Output
Nach der Verarbeitung und Korrektur durch den Nutzer wird folgende JSON per POST an die im Input übergebene targeturl geschickt:
Name | Typ | Beschreibung | Optionen / Beispiel |
---|---|---|---|
anamnesis | String | die ermittelte (Kurz)anamnese | „nach Sturz von …“ |
question | String | die ermittelte Fragestellung | „Rippenserienfraktur?“ |
notice | String | Bemerkungen | |
pregnancy | String (Enum) | Schwangerschaft vorhanden? | „ja“ / „nein“ / „unklar“ |
pregnancy_week | String (Int) | Schwangerschaftswoche | „0“, „1“, „2“, … |
implantate | String (Enum) | Metallimplantate? | „ja“ / „nein“ / „unklar“ |
pacemaker | String (Enum) | Herzschrittmacher? | „ja“ / „nein“ / „unklar“ |
allergy | String (Enum) | Kontrastmittelallergie? | „ja“ / „nein“ / „unklar“ |
allergy_type_iodine | String (Enum) | auf Jod-haltige? | „ja“ / „nein“ |
allergy_type_other | String (Enum) | auf andere als Jod-haltige? | „ja“ / „nein“ |
preferred_date | String | der Wunschtermin als Text wie er diktiert wurde | z.B. „am 3. Juni 23“ |
services | List<service> | Liste von Leistungen | s.u. |
infections | List <String> | Vorliegende Infektionen. | "keine", "unbekannt", ... |
doctext | String | Der ursprünglich diktierte Text. | „Schulter in 2 Ebenen...“ |
Definition des Objekts „service“:
Name | Typ | Beschreibung | Optionen / Beispiel |
---|---|---|---|
code | String | Leistungscode aus dem Katalog des UKW | „RKK2EBSL“ |
description | String | Leistungsbezeichnung | „Röntgen Schulter in zwei Ebenen“ |
number | String (Int) | Menge der Leistung | „1“, „2“, „3“, … |
localisation | String (Enum) | Lokalisation der Leistung | „B“ / „L“ / „R“ / „NB“ / „NR“ / „empty” |
modality | String | Die ermittelte Modalität | „konv. Röntgen“ |
Ist der HTTP Request an die targeturl einschließlich JSON gültig und vollständig, wird dieser mit einem HTTP Status 200 beantwortet. Im SAP wird gleichzeitig ein strukturiertes Anordnungsdokument angelegt und mit den übergebenen Daten befüllt. Jeder gültige HTTP Request legt ein neues Anordnungsdokument an.
Bei ungültigem oder unvollständigem Request wird ein HTTP Status 400 generiert, zusammen mit einem das Problem beschreibenden Fehlertext. Im Fehlerfall wird kein Anordnungsdokument im SAP angelegt.
Requirements und Start
Der Webservice ist auf allen Betriebssystemen lauffähig. Zum Kompilieren benötigt er Node (mit den packages connect & serve-static), Ionic, Angular, und Typescript. Der Webservice selbst benötigt nur HTML und Javascript.
Bei dem Aufruf müssen die oben beschriebenen Felder als Parameter übergeben werden. Die Website schickt die überarbeitete JSON per POST an die in den Parametern beschriebene targeturl.
Betrieb am UKW
Der Server läuft auf einem Windows 10 Server und wird von einem Windows IIS server verwaltet. Der Service trägt den Namen „Anforderungserstellung" und kann über Windows IIS gestartet oder gestoppt werden. Er ist unter https://vukwm01.klinik.uni-wuerzburg.de per HTTPS erreichbar. Um den Service zu updaten, müssen lediglich die Dateien in "C:\inetpub\wwwroot" durch die neuen Dateien ersetzt und der Server neu gestartet werden.