Kovács Gábor
qh6dr3
BME-VIK mérnök informatikus szak, Intelligens rendszerek szakirány BSc önálló laboratórium beszámoló
Webes felületű orvosi kódolás támogató rendszer fejlesztése Konzulens: Héja Gergely Készítette: Kovács Gábor
2013 tavasz 1
Kovács Gábor
qh6dr3
Tartalomjegyzék A feladatról .......................................................................................................................... 3 A felhasznált rendszer ......................................................................................................... 4 Meglévő funkciók ...................................................................................................... 4 Meglévő grafikus felület ............................................................................................ 5 A Grafikus felület változásai ............................................................................................... 5 Új funkciók .......................................................................................................................... 7 Elő feldolgozás tervek ......................................................................................................... 8 Kitekintés .......................................................................................................................... 9
2
Kovács Gábor
qh6dr3
A feladatról Betegségek Nemzetközi Osztályozása a BNO. Magyarországon ezt a kódrendszert használják a betegségek osztályozására. A BNO szerint kódolt adatoknak két alapvető felhasználása van: finanszírozás és epidemiológia. Az utóbbi lehet primer (pl. KSH által végzett haláloki kódolás), vagy másodlagos (a finanszírozási célú kódok másodlagos felhasználása). Tehát fontos, hogy ezek a statisztikák pontosak legyenek, így adható valós kép a lakosság egészségi állapotáról. A BNO kódrendszer hierarchikus, 22 főcsoporttal rendelkezik (melyből kettő csak kiegészítő kódként használható). A főcsoportok egy része anatómiai (pl. légző rendszer, szívérrendszer), míg más részük a betegség jellege (pl. fertőző betegségek, daganatok) alapján szerveződik. A rendszer használatának egy nehézsége hogy mivel monohierarchikus a kódrendszer, ezért egy adott kód csak egy főcsoportban szerepelhet, ez megnehezíti a kódoló munkáját, mert pl. az influenza nem a fertőző betegségek, hanem a légúti betegségek főcsoportban szerepel. A BNO jelenleg fejlesztett következő revíziója (BNO11) megoldja ezt a problémát, mert lehetővé teszi a többszörös öröklést. A fa struktúrába rendezett kódrendszernek több mint 10 000 csomópontja van. A finanszírozási jelentésekben használt, az OEP által karbantartott BNO kódtörzs ezt a hierarchiát osztja tovább ötödik karakteren, az esetek egy kis részében hibásan (azaz a hierarchia nem megfelelő helyén elhelyezett kódokkal). A kódtörzs körülbelül 11 500 elemű. A levelek egy-egy kódot reprezentálnak, melyekbe besorolhatóak a betegségek. A kódrendszer kis mértékben inkonzisztens, tehát egyes betegségek akár több kódhoz is sorolhatók. Az inkonzisztencia a tanuló rendszerek hatékonyságát nagyban csökkenti. A nagy mennyiség miatt a diagnózisok megfelelő elhelyezése nehéz feladat, főleg egy orvos számára, akinek nem ez a munkája, nem erre kellene figyelnie, hanem a beteg gyógyítására. Bizonyos kórházakban ezért professzionális kódolókat alkalmaznak, de ez plusz embert, időt és költséget igényel. Ennek a folyamatnak a segítésére készült el egy program Sárándi István által 2011 és 2012 között, amely egy diagnózisra válaszul megadja a legvalószínűbb néhány kódot, amelyek közül már könnyen kilehet választani a megfelelőt. A feladat kifejezetten nehéz, mivel természetes nyelvű adatokról van szó, ami együtt jár rövidítésekkel, helyesírási hibákkal és ragozásokkal, melyek mind szaporítják a tanuló algoritmus bemenő vektorjának méretét. A rövidítések használata és helyesírási hibák gyakrabban fordulnak elő orvosi szövegekben (a diagnózisokban különösen), mint az átlagos szövegekben. Továbbá az orvosi szöveg miatt ezek nem csak a magyar szavakra igazak, hanem a latin szavakra is és felmerül annak a lehetősége is, hogy a latin szavak magyarul legyenek ragozva (pl. tonsillák) vagy latin szavak részben magyarul írjanak (pl. cochleáris) az orvosok a diagnózisokban.
3
Kovács Gábor
qh6dr3
A felhasznált rendszer A rendelkezésemre áll Sárándi István által írt program, az általa készített dokumentációk és minták melyekkel dolgozott. A források melyekből dolgoztam: [1] Sáránd István BSc önálló labor 2011 tavasz [2] Sárándi István BSc szakdolgozat 2011 ősz [3] Sárándi István MSc önálló labor 2012 tavasz István egy keretrendszert készített, melynek több elemét cserélni lehet attól függően, hogy mit szeretnénk elérni. A cél természetesen mindig egy modell megtanítása, majd annak használatával az újabb diagnózisok kiértékelése. Fontos, hogy az, hogy a modell milyen algoritmust használ, ezt egy xml fájlból tudja meg, a kapott anyagban több ilyen konfigurációs állomány volt így ezekkel dolgoztam tovább. Egy ilyen fájlban beállítható az algoritmus, az algoritmus paraméterei továbbá lehetőség van több modell elkészítésére és azok súlyozott átlagát véve (MOE – mixture of expert) válaszolni a kapott diagnózisra. A tanuló rész kódját nem tanulmányoztam részletesen, mert István dokumentációja alapján, ezeken sok javítani való már nincs, természetesen ennek ellenére felmerültek továbbfejlesztési lehetőségek, melyeket a kitekintésben ismertetek. A munka kezdetén a kódok és a dokumentáció alapos ismerete volt a cél. Hosszas kódelemzés után, azonban kiderült, hogy a kód teljes ismeretére nincs szükség és ennek elsajátítása irreálisan sok időt emésztene fel a megszerzett ismeret hasznosságával szemben. Tehát végül csak azokra a kódrészekre koncentráltam a figyelmem, melyekkel a funkciókat szolgálja ki a program így megismertem a funkciókat és a lehetőségeket a programban, továbbá valamelyest ezekhez a funkciókhoz hozzá is tudok nyúlni, ha szükséges.
Meglévő funkciók Training mode (tanítás) o Bemenő XML fájl alapján elkészül a modell o Bemenő tanítóminták alapján tanul a modell o A kimenet az elmentett modell (CSV kiterjesztésű fájl) Testing mode (tesztelés) o A bemenet az elmentett modell o Bemenő minták, amik szerint tesztelünk, ezeket értékeli ki a modell o A kimenet megadja, hogy hány százalékban értékelte ki jól a modell a mintákat, attól függően, hogy 1, 5, 10 illetve 20 választ kérünk-e le Egy válasz akkor helyes, ha a megadott számú válasz között szerepel a várt kimenet Training and testing mode (tanítás és tesztelés) o A training mode és a testing mode értelemszerűen a tanítómintán tesztel 4
Kovács Gábor
qh6dr3
Server mode (szerver mód) o A bemenet az elmentett modell o Továbbá egy port szám melyen keresztül kommunikál a klienssel Cross-validation mode (keresztkiértékelés) o Bemenő XML fájl alapján elkészül a modell o Bemenő tanítóminták egy része alapján tanul a modell o Hány részre ossza a mintát o Hányszor tanuljon o Egy kimeneti fájl, amely a tesztek eredményei írja le, ez opcionális Fontos volt, hogy ezeket alaposan megismerjem, mert mindegyiket fel fogom használni a jövőben. Eme ismeretek alapján a jövőben a saját magam által fejlesztett funkciókban fel tudom használni ezeket a kódokat így segítve a saját munkámat.
Meglévő grafikus felület A kódoló program szerverként is képes működni, ezért készült is hozzá egy kliens, amit bárki elérhet, ha fut a szerver így online használható lesz a program és a tesztelést is megkönnyíti, hogy rendelkezésre áll ez a felület. A szerver és a kliens komponensek xml üzenetekben kommunikálnak egymással. A rendszer kezdetben annyit tudott, hogy a diagnózisra 5 válasz kódot küldött vissza, melyet a kliens meg is jelenített az ablakban. A grafikus felület régi kinézete látható a jobb oldali képen.
A grafikus felület változásai Beépítettem egy új opciót mellyel a visszatérő válaszok számát lehet állítani, egy combobox segítségével. Embere válogatja, hogy hány kódot szeretne átnézni mielőtt, meghozza a végleges döntését. Természetesen a combobox miatt csak néhány lehetőség közül lehet választani, de ez valószínűleg megfelel a legtöbb felhasználó számára és egyben csökkenti a felesleges lekérdezések számát. Az eredmény táblázat is több információval szolgál, mint elődje. A kód és a bizonyosság mellett megjelent 3 új oszlop és a kódok mellett egy-egy radio button is. A ShortKód nevezetű oszlop a WHO által definiált BNO kódot tartalmazza, ezt a kódot vagy generálással, vagy ha ez nem lehetséges, akkor egy a kivételeket tartalmazó fájlból olvasom ki. A generálás az alábbi példában látottak alapján könnyen megérthető: R4560-ből R45.6 lesz, a lényeg, hogy a kód végéről levesszük az utolsó karaktert és a negyedik karakter elé beteszünk egy pontot.
5
Kovács Gábor
qh6dr3
R55H0-ból R55 lesz, ha a kód H0-al végződik, akkor ezt egyszerűen elhagyhatjuk. A kivételeket egy tömbben tárolom, és azok közül választom ki, amelyikre szükségem van, ezekből nincs sok ezért szimpla lineáris keresést használok. A leírás oszlop a visszaadott BNO kódokhoz tartozó OEP szerinti leírást tartalmazza. Ezeket egy tömbben tárolom a hozzájuk tartozó BNO kóddal együtt. Itt szembesültem a nagy mennyiségekkel, mivel minden BNO kódhoz rendelünk egy leírást így közel 10.000. elemet tartalmaz, a tömb melyben később minden kiértékelt diagnózisnál annyiszor kell keresni ahány eredményt vissza, kell adnunk. Figyelembe véve, hogy később akár többen is használhatják egyszerre a programot ezért ezt bináris kereséssel oldottam, meg így sokkal gyorsabb lett a keresés. Az utolsó oszlop egy link, amely egyelőre a WHO által publikált angol nyelvű BNO oldalra mutat és ott megtalálhatóak angolul a BNO kódhoz tartozó leírások és a környező kódok leírásai is, így lehet, hogy a kódolás támogató rendszer eredménye nem tökéletes, de ha a felhasználó tudja, hogy melyik kód környékén keressen, így könnyen megtalálhatja a helyes kódot, így nincs szükség a BNO-t leíró könyv használatára. A jövőben a WHO által üzemeltett oldalra mutató linkek lecserélhetők a BNO magyar fordítására mutatóra. Konfigurálható lesz a link prefixuma egy konfigurációs fájlon keresztül. Fontos újításnak számít az „Eredmény küldése” gomb. A megadott diagnózist és a radio button-nal kiválasztott BNO kódot el lehet küldeni a szervernek, ezáltal a rendszer számára további tanító mintákat lehet gyűjteni. A mintával felhasználó egyedi azonosítóját is rögzíti a rendszer. Minden felhasználót megkülönböztetünk egy cookie segítségével, melyet javascript nyelven írtam a kliens kódjába. Reményeim szerint ez hasznos lesz, mert így meg lehet különböztetni az általában helyes és helytelen kódokat visszaküldő felhasználókat. Egyes szakterületek szakértőit is megtalálhatjuk ezzel a módszerrel, így olyan mintákhoz juthatunk, melyeket nem kell javítgatni, így egységnyi idő alatt több mintával egészíthetjük a tanító halmazunkat. Nem kifejezetten a grafikus felülethez kapcsolódik, de most már a szerver képes hogy jelezze, ha egy diagnózist egyáltalán nem képes kódolni, ami akkor következik be, ha a kódolandó diagnózis összes szava ismeretlen. Így ezt a választ meg tudjuk különböztetni a többitől, ekkor nem adunk téves választ és el tudja kérni a rendszer a helyes BNO kódot, így gyűjtve olyan várt BNO-t tartalmazó mintákat, melyekkel eddig nem rendelkeztünk A kliensben kijavítottam egy hibát: most már nem lehet üres diagnózist elküldeni, ami korábban null pointer exception-t okozott. Alább látható az új megjelenése a grafikus felületnek:
6
Kovács Gábor
qh6dr3
Új funkciók Felmerült az igény, hogy a meglévő mintáinkon konzisztencia vizsgálatot végezzünk gépi eszközök segítségével. Ezért leellenőrizzük, hogy ha a tanítóhalmazzal tesztelünk, akkor minden mintára már az első helyen jó választ ad-e meg. Ha nem tudja a választ mindegyik mintapontra, akkor kiderülhet, hogy inkonzisztens valahol a mintahalmazunk, aminek kiküszöbölésével nagyon sokat javíthatunk a modell hatékonyságán. A feladat úgy, szólt, hogy tanítsak meg egy modellt a mintahalmazzal, majd ezt értékeltessem ki vele, úgy, hogy az adott számú választ adjon vissza és jelezze, hogy ezek közt meg van-e a jó válasz vagy nincs. A feladat megoldására egy új funkciót, az „Inkonzisztencia vizsgálat” elnevezésű funkciót hoztam létre, mivel ez az alapvető célunk. A modell kiválasztása és tanítása természetesen itt is az XML-ben leírt séma alapján történik. A tanított modell elmentése itt opcionálisan mivel nem ez a lényeg, hanem az ellenőrzés. Az inkonzisztencia vizsgálat eredményét egy megadott fájlba menti el, amely lehet xls vagy xlsx formátumú. Annyi különbséget tesz a program a két formátum között, hogy xls esetén egy sorba írja ki őket (mivel a sorok száma limitált), míg xlsx esetén ezeket mind külön sorban helyezi el. Az eredményeket az excel fájlban két fülön helyezi el, attól függően, hogy az adott diagnózishoz megtalálta-e a helyes választ vagy nem. Egy mintakép, egy meglévő xlsx fájlból, hogy érthetőbbek legyenek az eddig leírtak:
7
Kovács Gábor
qh6dr3
A funkció kipróbálás után kiderült, hogy az előfeldolgozott(szótövezés és rövidítés feloldás) minta számos potenciális konzisztencia hibát tartalmaz, melyek vizsgálata folyamatban van, mely után a konzisztencia hibákat (amennyiben lehetséges) ki kell javítani. További két változata is elkészült a funkciónak. Az egyik annyiban különbözik az előbb felvázolttól, hogy nem ugyanazzal a mintahalmazzal értékeli ki a modellt, hanem megadható egy másik, amivel az ellenőrzést végezze el. A másiknál pedig tanító halmaz helyett egy modellt kér a felhasználótól, így már meglévő modelleket is lehet tesztelni akár más-más mintahalmazon. A feladat végzése közben megismerkedtem az Apache POI projektjével, mely keretein belül, elérhetővé tettek olyan jar fájlokat melyekkel Microsoft dokumentumokat tudok kezelni Java-ban így vált lehetővé, hogy xls és xlsx fájlokat készítsek egyszerűen.
Előfeldolgozási tervek Az elő feldolgozás témájával Sárándi István is foglalkozott az MSc önálló labor során. Az ő dokumentációi alapján kezdtem bele a snowball nyelven írt szótövezők használatába és vizsgálatába. Több nyelvhez találtam algoritmust, de ezek közül nekem csak a latinra és a magyarra volt szükségem. Ezeket lefordítottam java nyelvre, majd jar fájlt csináltam belőlük, hogy használhassam őket. A magyar működött leszámítva, hogy nem tökéletes a szótövező algoritmus, mivel nem különbözteti meg a szófajokat, így hibás csonk szavakat is generálhat. Ellenben a latin szótövező egyáltalán nem működött, ezért java osztályként beépítettem a programba, hogy debugolhassam. Hosszas próbálgatásokat követően konzulensemmel közösen arra jutottunk, hogy fölösleges erre időt fordítani, ezért más megoldás után néztünk. Az új ötlet az volt, hogy felhasználjuk a rendelkezésünkre álló latin anatómiai szótárt. Ezeken kívül főként csak a betegségek latin nevei fordulhatnak elő (melyeket egy másik szótárból át lehet venni). Mivel az anatómia szótár tartalmazza az szavak ragozását leíró információt, így ésszerűnek tűnik, hogy legeneráljuk az össze lehetséges latin szót, mely előfordulhat a diagnózisainkban. Így a latin szótövezőt elvethetjük, és csak azokat tekintjük latin szónak melyek ebben benne vannak, vagy minimális az eltérés egy esetleges elgépelés/helyesírási hiba miatt.
8
Kovács Gábor
qh6dr3
A magyar szavak helyességét és szótövezettségét egy a google chrome-ba vagy a mozilla firefox-ba épített open source helyesírás ellenőrzővel tervezem megoldani. A tervek szerint egy ilyen programot alakítanék át úgy, hogy a helyesírás ellenőrzést megelőzően lefuttatok a szavakon egy keresést, hogy azok benne vannak-e az előző bekezdésben taglalt latin szavak gyűjteményében, ha igen akkor azt magyarul már nem is ellenőrizném, ha nincs, akkor lehet a magyar helyesírás ellenőrzésről beszélni. Továbbá nagy reményt fűzők hozzá, hogy a helyesírás ellenőrzőt szótövezésre is lehet egyben használni. További lehetőség, hogy a tanuló modell bemenő vektorait még tovább rövidítsem, azáltal hogy a több szavas kifejezéseket egy összetett szóként kezelem. Mivel ha a kifejezésből hiányzik egy szó, akkor a modell nem képes megtalálni a hasonló diagnózisokhoz tartozó kódokat, ezért önmagában valószínűleg nem lenne hatékony a modell, de lehetséges, hogy az eredeti modellel kombinálva további javuláshoz érhető el.
Kitekintés Fontos, hogy az előfeldolgozást befejezzem és lehetővé tegyem, hogy a grafikus felületen valós időben lehessen helyesírást ellenőrizni, hogy annyival is kevesebb dolga legyen a szervernek. Valamint, ha sikerül a böngészőkben használt helyesírás ellenőrzőt átvenni, akkor remélhetőleg a szótárunk bővítését is megoldhatjuk így új latin és magyar szavakat tanulhatna a rendszer, természetesen ellenőrzött formában. Reményeim szerint az alkalmazás elindítását követően a felhasználó visszajelzések alapján további előre nem látott funkciók is belekerülhetnek a programba. Valamint az önálló laborom eredményeinek bemutatásán az előadást követően hasznos tippekkel gazdagodtam, melyekre biztosan fogok időt szakítani. Ezek közül a legfontosabb, hogy a kliens oldalon lehetne egy cache, ami azokat a diagnózisokat és a rá adott válaszokat tárolná melyeket az adott felhasználó a leggyakrabban vagy a legutóbb tárolt így tehermentesítve a szervert. Mivel fennáll annak a veszélye, hogy a felhasználó egyszer hibásan döntött, így nem csak ezt a kódot kapná meg, hanem a rendszer által visszaadottakat is. A modell újratanítása után szükség lehet a cache frissítésére.
9