Aamupäivästä kaksi ja puoli tuntia meni kouluhommissa. Tajusin viikonloppuna että minulla on noin kaksi viikkoa aikaa ennen kesän toista kirjatenttiä (informaatiotutkimuksen So1c eli Tiedonhaun matemaattiset menetelmät – ensimmäinen kurssini pääaineen syventäviä). Niinpä lukuaikataulu on melko kiivas, pari lukua päivässä pitäisi selvittää.
Tänään urakka alkoi Robert M. Loseen kirjalla Text Retrieval And Filtering, jossa käsitellään erilaisia analyyttisiä malleja tekstin hakuun ja suodattamiseen liittyen. Tänään käsittelemieni lukujen aiheena olivat kvantitatiiviset järkeilymallit ja samankaltaisuuden vaikutus hakupäätöksiin. Igh. Aihe oli yllättävänkin mielenkiintoista. POPFileä jo jonkun aikaa hyvällä menestyksellä käyttäneenä oli kiinnostavaa tutustua Bayeslaisiin metodeihin. Samankaltaisuusosastolla on tuttua vektorimallia ja Boolen logiikkaa, mutta myös hieman syvällisempää juttua.
Bayesistä vielä. Kyse on siis siitä, että voidaan tehdä arvauksia dokumenttien relevanssista eli hyödyllisyydestä. Tiedonhaussa siis siitä, onko joku dokumentti hyödyllinen ja POPFileä käytettäessä siitä, mihin sankoon viesti pitäisi lajitella. Bayesin metodeja käyttäen voidaan laskea, mikä on todennäköisyys, että dokumentti on relevantti, jos siinä esiintyy termi x. Menetelmä on itse asiassa varsin yksinkertainen.
P(x) tarkoittaa tapahtuman x todennäköisyyttä. P(x|y) tarkoittaa tapahtuman x todennäköisyyttä, jos ehto y on voimassa. P(relevantti|termi x) on siis todennäköisyys, jolla dokumentti on relevantti, jos termi x esiintyy dokumentissa. Jos tiedettäisiin kaikkien tietokannassa olevien dokumenttien relevanssi, mitään ongelmaa ei olisi. Koska tällaista tietoa ei kuitenkaan ole, joudutaan turvautumaan arvioihin aikaisemman tiedon pohjalta. Lähdeaineistona käytetään siis aikaisemmin haettujen dokumenttien relevanssia. POPFile esimerkiksi pitää kirjaa siitä, mitä sanoja eri sankoihin kuuluvissa dokumenteissa on käytetty. Mitä enemmän tietoa kertyy, sitä tarkempia arvioita voidaan tehdä.
Mutta, kaava peliin: P(relevantti|termi x) = P(termi x|relevantti) P(relevantti) / P(termi x). P(termi x|relevantti) on siis todennäköisyys, jolla termi x esiintyy, jos dokumentti on relevantti. Tämä on helppo laskea. Samoin todennäköisyydet P(relevantti) (relevanttien dokumenttien osuus kaikista) ja P(termi x) (termi X:n esiintyminen dokumenteissa).
Selvennän asiaa esimerkillä. Käytettäköön esimerkkinä vaikkapa spämmiä lajittelevaa järjestelmää. Tietokannassa on 100 viestiä, joista 20 ei ole spämmiä (negatiivinen, mutta totuudenmukainen lähtökohta). Termi x (sanotaan nyt vaikka sana "viagra") esiintyy 43 kaikista 80 spämmiviestissä ja kahdessa muussa viestissä. Järjestelmään saapuu nyt viesti, jossa sana "viagra" esiintyy. Voidaan siis laskea tämän tiedon pohjalta todennäköisyys, jolla kyseinen viesti on spämmiä.
P(spämmiä|"viagra") = P("viagra"|spämmiä) P(spämmiä) / P("viagra") = (43/80 * 80/100) / (45/100) = 0,96 eli sanan "viagra" esiintyminen leimaa viestin 96% todennäköisyydellä spämmiksi. Tietysti oikea järjestelmä summaisi todennäköisyyksiä hieman useamman sanan perusteella ja tekisi johtopäätöksensä siitä, mutta periaate on kuitenkin tämä.
Tarkoituksenani olisi kehitellä jossain vaiheessa huvin ja hyödyn vuoksi järjestelmä, joka lajittelisi OOOOO-postituslistalle saapuvat viestit kiinnostaviin ja epäkiinnostaviin. En nykyään jaksa lukea ko. listaa, mutta jos joku järjestelmä suodattaisi listaviesteistä kiinnostavat, voisin viestejä lukeakin. Onnistuisihan tuo POPFilellä, vaan en viitsi sotkea hyvin toimivaa järjestelmää uusilla luokitteluilla. Ja käyhän tuo koodausharjoituksesta, se kai lienee yhtä olennaista.
Saas nähdä, jos joku päivä innostun selittämään vektorimallia. Siitäkin pitäisi kehitellä oma käytännön toteutus joku päivä…
Lopuksi vielä päivän ohjelma: kirjastoon palauttamaan kirja, etsimään uusia ja lainaamaan Linux Journalin taannoinen numero, jossa oli artikkeli Bayesilaisesta suodattamisesta. Tiskausta, ruokailua, esseen kirjoittamista – sain Peltirummun vihdoin luettua ja Nuoren tytön päiväkirja on niin ikään melkein luettu.