Apotti-osaamista muutamilla marko(v)illa

koska Suomessahan hommat osataan

Posted by Janne Cederberg on September 9, 2015
Categories: politiikka, programming
Tags: markov chains, python

(This article is available only in Finnish, sorry)

Apotti-hanke on saanut itselleen logon. Hyvä! Nyt voi paremmin markkinoida järjestelmää vaikka ulkomaillekin. Erityisosaamistakin ilmeisesti löytyy, aivan kuin logon suunnittelussa:

Apotti-hanke on 10 vuoden puolella. Apotti-hanke on alojen erityisosaamista Kuntien ja niiden perusteella tietojärjestelmän toimittaja valitaan näiden perusteella. Hankintarenkaan jäsenet päättävät valittavasta toimittajasta elo–syyskuun aikana. Neuvotteluihin ehdotettavat toimittajat ovat 335–430 miljoonaa euroa kymmenessä vuodessa. Hankinnasta aiheutuvat kustannukset jaetaan hankinnan valmistelusta vastaavien kesken siten, että hankkeen ohjausryhmä päätti esittää elokuussa 2014 jatkoneuvotteluihin keväällä tehtyjen tuotevertailujen perusteella.

Asiakastietojen reaaliaikaisuus palvelu- ja toimintaa kehitetään:

Kevään 2013 ja terveydenhuollon palveluja ja siten asiakastietojen reaaliaikaisuus palvelu- ja toimintaa kehitetään. Viron järjestelmä on 10 vuoden kustannukset vähenevät Hanketoimiston teettämän kustannushyötyanalyysin mukaan sosiaalihuollon, perusterveydenhuollon ja HUSilla on vaatinut muun muassa järjestelmien kulut ovat kuitenkin välttämättömiä muun muassa vastuu hankkeen muutosjohtamisesta sekä sosiaalihuollon ja niiden hyödyntäminen hoitoketjujen ohjailussa eivät siirry järjestelmien välillä riittävästi, jotta takaamme parhaan mahdollisen laadullisen ja arkistointipalvelu. ”Virossakin terveydenhuollon palveluja ja paikallisiin järjestelmiin, aloitetaan toteutusprojekti, jonka aikana internet-osoitteessa asiakas- ja hoitopaikasta riippumatta.

Kustannusrakenne on tiedossa:

Apotin nykyinen kustannusrakenne. ”Investoinnin arvioidaan olevan noin 350‒450 miljoonaa euroa 10 vuodessa” Iivanainen jatkaa. Päällekkäiset kustannukset jaetaan hankinnan laajuus muuttuu ja potilastietojärjestelmä vaan esimerkiksi käyttäjämäärän perusteella. Tällä hetkellä käytössä olevaa erillistä järjestelmää käytössä. Asiakas- ja kohdelleet tarjoajia yhdenvertaisesti.

Mutta ilmeisesti kaikki eivät silti ole tyytyväisiä:

Valitukset ovat muodostaneet hankintarenkaan. Hankintarenkaaseen kuuluu muun muassa vastuu hankkeen ohjausryhmä esittää, että kansainvälisissä hankkeissa. Tehtävään hän tulee tarjouspyynnön lisäksi varsinaisen potilastietojärjestelmän”, Iivanainen ”Kyseessä on alojen erityisosaamista Kuntien ja terveydenhuollon palveluja ja HUS päättävät tarjousten jättämisen jälkeen hankkeen muutosjohtamisesta sekä KL-Kuntahankinnat Oy omien päätöksentekomekanismiensa mukaisesti joulukuun aikana.

Mutta onhan juridiikan ammattilaisia sentään mukana:

Mikäli päätöskierros sujuu ongelmitta, sopimus tulevan toimittajan kanssa käydään syksyllä toinen neuvottelukierros sekä HUS edustaa sosiaalitoimen ja potilaiden palvelujen parantua. Siihen kuuluu myös asiakas- ja Epic Systems Corporation sekä juridiikan ammattilaisia. Hankkeen johtoon tulee erityisesti laadullisista tekijöistä kuten paremmasta asiakas- ja Epicin tekemää muutosta teknologiavalintaansa sekä sopimuksen viimeistelyn jälkeen.

Ja näin joitakin toimijoita “hyllytettiin”:

Markkinaoikeus hylkäsi CGI:n Apotti-hankintaan liittyvät valitukset, jotka Apotin syksyn 2014 alkaviin neuvotteluihin valitaan vuoden 2013 ja kokoluokaltaan vastaavista asiakas- ja sopimuksen viimeistelyn jälkeen. Lopullinen päätös hankinnasta tehdään sen ohjauksen. Siihen kuuluu myös niiltä osin, että olemme toimineet hankintamenettelyn aikana ja huhtikuussa 2015. Tarjouspyyntö liitteineen sisältää hieman vajaat 2000 sivua käsittävän asiakirja-aineiston ja potilastietojärjestelmä Viro on vaatinut muun muassa hankintamenettelyn aikana.

Selvästi otsan kirkkaudella havaitaan, että hyvähän tästä tulee, ja säästöjäkin:

Apotti-hankintarenkaan jäsenet Helsinki, Vantaa, Kauniainen, Kirkkonummi ja terveyslautakunnassa 24.3., Vantaan apulaiskaupunginjohtaja Laura Räty. Apotti-hankkeen ohjausryhmä ehdottaa, että myös niiltä osin, että se mahdollistaa nykyistä alhaisemmat. Aiemmin esillä ollut 1,2‒1,8 miljardin euron hanke, jonka osapuolina ovat aakkosjärjestyksessä: Atos IT Solutions and Services Oy, Epic Systems Corporation jättivät molemmat tarjouksensa määräaikaan 22. kesäkuuta klo 12.00 mennessä. Hyvin laajoja tarjousdokumentteja aletaan nyt jatkamaan hankintaa sekä vuosittaisista käyttö- ja potilaiden palvelujen parantua. Siihen kuuluu myös toimivat sähköisen asioinnin palvelut ja HUSin tietojen kanssa. Muut kunnat ja HUSin kesken. Kunkin kunnan osuus lasketaan asukaslukunsa mukaisessa suhteessa ja kustannustehokkaamman sosiaalihuollon, perusterveydenhuollon ja hinnan perusteella.

Lopullisen tarjouspyynnön hyväksyminen:

Kevään 2013 loppuun Hankinta tehdään muun muassa hankintamenettelyn ulkopuolelle suljetun Tieto Healthcare & Welfare Oy. Osallistumishakemuksen jättänyt Indra Sistemas S.A ja HUSin yhteinen tietojärjestelmä. Se kattaa n. 1,6 miljoonan asukkaan väestön. Järjestelmä korvaa noin 350‒450 miljoonaa euroa 10 eri järjestelmää ja Sitra. Siinä arvioitiin modernin potilastietojärjestelmän toimittajiksi. Neuvotteluihin ehdotettavat toimittajat ovat 49 miljoonaa euroa vuodelta eli Apotti-hankinnan lopullisen tarjouspyynnön hyväksyminen käsitellään hankintarenkaan päätöksentekoelimissä seuraavasti: HUS:n ja käyttöönottovaiheeseen suunnitellusti”, toteaa Apotin hankejohtaja Hannu Välimäki. Hankintaa valmistelemaan on yhteistyösopimuksella perustettu.

Kyllä, tämä artikkeli on vitsi

Luin eilen Lilja Tammisen artikkelin Apotti-järjestelmään liittyen. Olen seurannut aihetta väljästi sen pari vuotta kun se on ajoittain ollut pinnalla. Vilkaise esim. agile.fi:n artikkeli Apotti-järjestelmästä.

Tämän artikkelin tarkoituksena on viestittää Apotti-hankkeeseen liittyvää absurdiutta. Artikkelin lainaukset eivät ole todellisia lainauksia mistään; ne on luotu käyttämällä Markovin ketjuja (Markov chain), joiden avulla annetusta tekstiaineistosta voi tuottaa päällisin puolin järkevän näköistä tekstiä, jossa ei kuitenkaan käytännössä ole juurikaan järkevää sisältöä…samoin kuin vaikuttaisi olevan Apotti-järjestelmän suhteen.

Kuinka lainaukset on sitten luotu

Markovin ketjujen ideana on tuottaa input-aineistosta output-aineistoa suhteellisen yksinkertaisen logiikan perusteella: valitaan tarkasteluyksiköt ja “muisti” (engl. (Markov) order/memory) eli kuinka monen tarkasteluyksikön halutaan vaikuttavan output-aineistoon. Jos tarkasteluyksiköinä ovat sanat (kuten tämän artikkelin lainausten generoinnissa) ja muistina (order) on 1 niin prosessi on seuraava:

  1. Valmistelu: kerää haluttu lähdeaineisto (engl. corpus) (tässä artikkelissa: Apotti-tiedotteet)
  2. Käy aineisto (ohjelmallisesti) läpi niin, että aloitetaan lähdeaineiston ensimmäisestä tarkasteluyksiköstä (tässä: sanasta) X ja katsotaan eteenpäin yhden sanan verran (Y) ja taulukoidaan mitä sanoja (Y) sanan X jälkeen esiintyy lähdeaineistossa. Tämän jälkeen tehdään sama tarkastelu niin, että X:nä on lähdeaineiston järjestyksessä toinen sana ja Y:nä kolmas, jne.
  3. Kun aineisto on käyty läpi ja esiintyvyydet taulukoitu, valitaan lähdeaineistosta joku satunnainen sana (Z) ja aloitetaan uuden tekstin generointi: seuraava sana generoidaan katsomalla vaiheessa 2 laaditusta taulukosta mitä sanoja sanan Z jälkeen on lähdeaineistossa esiintynyt ja mikäli vaihtoehtoja on useita, valitaan niistä satunnaisesti joku.
  4. Vaiheen 3 prosessia jatketaan kunnes on saatu aikaan halutun mittainen teksti.

Lähdeaineisto (corpus)

Kuten edellä välillisesti jo viitattu, käytin lähdeaineistona Apotti-hankeryhmän virallisia tiedotteita aikaväliltä 6.9.2012-23.6.2015. Lataa tiedoteaineisto yhdessä tiedostossa tekstimuodossa.

Ohjelmakoodia

Generointiin käytetty ohjelmakoodi on esitetty alla. Koodipätkä on muokattu Shabda Raaj‘n artikkelissa esitetystä muuttamalla ohjelman Markov-muisti kahdesta sanasta yhteen. Näin siksi, että Suomen kielen sijapäätteistä johtuen Apotti-tiedoteaineisto ei olisi riittävän laaja, jotta kahden sanan muistilla saataisiin aikaan muuta kuin jokseenkin alkuperäisen tekstin mukaisia virkkeitä.

Markov-moduuli

Mikäli haluat kokeilla ohjelmaa, tallenna tämä listaus nimellä markovgen.py

#!/usr/bin/python3
# -*- coding: utf8 -*-

import random

class Markov(object):
	
	def __init__(self, open_file):
		self.cache = {}
		self.open_file = open_file
		self.words = self.file_to_words()
		self.word_size = len(self.words)
		self.database()
		
	
	def file_to_words(self):
		self.open_file.seek(0)
		data = self.open_file.read()
		words = data.split()
		return words
		
	
	def doubles(self):
		if len(self.words) < 2:
			return
		
		for i in range(len(self.words) - 1):
			yield (self.words[i], self.words[i+1])
			
	def database(self):
		for w1, w2 in self.doubles():
			key = (w1)
			if key in self.cache:
				self.cache[key].append(w2)
			else:
				self.cache[key] = [w2]
				
	def generate_markov_text(self, size=25):
		seed = random.randint(0, self.word_size-2)
		seed_word = self.words[seed]
		w1 = seed_word
		gen_words = []
		for i in range(size):
			gen_words.append(w1)
			w1 = random.choice(self.cache[(w1)])
		gen_words.append(w1)
		return ' '.join(gen_words)

Pääohjelma

Ja tallenna tämä pääohjelma vaikkapa nimellä apotti-markov.py

#!/usr/bin/python3
# -*- coding: utf8 -*-

import markovgen as mg

f = open('apotti-tiedotteet_20120906-20150623.txt', 'r')
m = mg.Markov(f)
m.generate_markov_text(500)

Ohjelman suorittaminen

Tarvitset koneen, jossa on Python3-tulkki asennettuna. Mac-koneista löytynee valmiiksi, samoin Linux-koneista. Windows-koneisiin Python täytyy asentaa erikseen.

Suorita ohjelma seuraavasti:

  1. Avaa komentorivi-ikkuna siinä kansiossa, johon tallensit tiedostot (tiedotteet.txt, markovgen.py ja apotti-markov.py)
  2. Suorita seuraava komento: python3 apotti-markov.py

Muuttelemalla ohjelmakoodin riviä m.generate_markov_text(500) saat generoitua eri suuruisia määriä tekstiä.

Huomioita

Generoituani “sitaattitekstin” tätä artikkelia varten, poistin siitä tekstin alkuun ja loppuun tyypillisesti jäävät vaillinaiset/keskeneräiset virkkeet. Kappalejaon lisäsin myös käsin ja jonkun yksittäisen kappaleen loppun tulevan pisteen. Muuten teksti on “sitaateissa” suoraan Markov-ketjun lähdeaineistosta generoimaa.

Mikäli suoritat edellä listatun ohjelmakoodin samalla lähtöaineistolla, et silti saa samaa lopputulosta jonka itse sain. Tämä johtuu siitä, että prosessi ajetaan satunnaisilla lähtöarvoilla ja jokaista sanaa valitessa tehdään valinta seuraavasta sanasta (näennäis)satunnaisesti mahdollisten sanavaihtoehtojen joukosta.

Lopetussanat

Apotti-järjestelmän kehittäminen 1960-luvulla kehitetyn tietojärjestelmän päälle tuntuu absurdille. Päälle päin näyttää ihan koherentilta, mutta kun alkaa sisältöä lukemaan, ei se loppupeleissä olekaan ehkä niin koherenttia kuin aluksi näytti. Vähän kuin tämän artikkelin “sitaatit”.

Credits



Comments