Sisällön automaattinen moniluokittelu Toteutusdokumentti v0.6

Samankaltaiset tiedostot
Sisällön automaattinen moniluokittelu

Sisällön automaattinen moniluokittelu. Testausdokumentti versio

Sisällön automaattinen moniluokittelu Suunnitteludokumentti v1.01

Sisällön automaattinen moniluokittelu. Määrittelydokumentti Versio 1.2

Olio-ohjelmointi Javalla

Sisällys. Yleistä attribuuteista. Näkyvyys luokan sisällä. Tiedonkätkentä. Aksessorit. 4.2

Sisällys. 14. Poikkeukset. Johdanto. Johdanto

Javan perusteita. Janne Käki

JAVA-PERUSTEET. JAVA-OHJELMOINTI 3op A JAVAN PERUSTEET LYHYT KERTAUS JAVAN OMINAISUUKSISTA JAVAN OMINAISUUKSIA. Java vs. C++?

14. Poikkeukset 14.1

Ohjelmoinnin jatkokurssi, kurssikoe

812341A Olio-ohjelmointi Peruskäsitteet jatkoa

Kääreluokat (oppikirjan luku 9.4) (Wrapper-classes)

Ohjelmassa henkilön etunimi ja sukunimi luetaan kahteen muuttujaan seuraavasti:

Sisällys. 18. Abstraktit tietotyypit. Johdanto. Johdanto

Operaattoreiden ylikuormitus. Operaattoreiden kuormitus. Operaattoreiden kuormitus. Operaattoreista. Kuormituksesta

Sisältö. 2. Taulukot. Yleistä. Yleistä

Sisällys. 14. Poikkeukset. Johdanto. Johdanto

Java-API, rajapinnat, poikkeukset, UML,...

Sisältö. 22. Taulukot. Yleistä. Yleistä

16. Javan omat luokat 16.1

18. Abstraktit tietotyypit 18.1

Metodit. Metodien määrittely. Metodin parametrit ja paluuarvo. Metodien suorittaminen eli kutsuminen. Metodien kuormittaminen

9. Periytyminen Javassa 9.1

Luokka Murtoluku uudelleen. Kirjoitetaan luokka Murtoluku uudelleen niin, että murtolukujen sieventäminen on mahdollista.

14. Poikkeukset 14.1

Yleistä. Nyt käsitellään vain taulukko (array), joka on saman tyyppisten muuttujien eli alkioiden (element) kokoelma.

Rajapinta (interface)

Rajapinnasta ei voida muodostaa olioita. Voidaan käyttää tunnuksen tyyppinä. Rajapinta on kuitenkin abstraktia luokkaa selvästi abstraktimpi tyyppi.

Tehtävä 1. Tehtävä 2. Arvosteluperusteet Koherentti selitys Koherentti esimerkki

on ohjelmoijan itse tekemä tietotyyppi, joka kuvaa käsitettä

Sisällys. Yleistä attribuuteista. Näkyvyys luokan sisällä ja ulkopuolelta. Attribuuttien arvojen käsittely aksessoreilla. 4.2

Tietokannat II -kurssin harjoitustyö

Tietokannat II -kurssin harjoitustyö

Sisällys. 11. Rajapinnat. Johdanto. Johdanto

15. Ohjelmoinnin tekniikkaa 15.1

Opintojakso TT00AA11 Ohjelmoinnin jatko (Java): 3 op Taulukot & Periytyminen

Testausraportti. Orava. Helsinki Ohjelmistotuotantoprojekti HELSINGIN YLIOPISTO Tietojenkäsittelytieteen laitos

Java kahdessa tunnissa. Jyry Suvilehto

Sisällys. JAVA-OHJELMOINTI Osa 7: Abstrakti luokka ja rajapinta. Abstraktin luokan idea. Abstrakti luokka ja metodi. Esimerkki

A TIETORAKENTEET JA ALGORITMIT

Java-kielen perusteet

Harjoitus Olkoon olemassa luokat Lintu ja Pelikaani seuraavasti:

7. Näytölle tulostaminen 7.1

20. Javan omat luokat 20.1

Tietorakenteet. JAVA-OHJELMOINTI Osa 5: Tietorakenteita. Sisällys. Merkkijonot (String) Luokka String. Metodeja (public)

Sisällys. 20. Javan omat luokat. Java API. Pakkaukset. java\lang

Ylläpitodokumentti. Ohjelmistotuotantoprojektin tietojärjestelmä OhtuTie

A) on käytännöllinen ohjelmointitekniikka. = laajennetaan aikaisemmin tehtyjä luokkia (uudelleenkäytettävyys)

Sisällys. JAVA-OHJELMOINTI Osa 6: Periytyminen ja näkyvyys. Luokkahierarkia. Periytyminen (inheritance)

Taulukot. Jukka Harju, Jukka Juslin

Ohjelmointi 2 / 2010 Välikoe / 26.3

XML kielioppi. Elementtien ja attribuuttien määrittely. Ctl230: Luentokalvot Miro Lehtonen

Mikä yhteyssuhde on?

Linkitetystä listasta perittyä omaa listaa käytetään muun muassa viestiin liittyvien vastausten säilömiseen.

Java ja tietokannan käsittely (JDBC)

Kompositio. Mikä komposition on? Kompositio vs. yhteyssuhde Kompositio Javalla Konstruktorit set-ja get-metodit tostring-metodi Pääohjelma

Ohjelmointitaito (ict1td002, 12 op) Kevät Java-ohjelmoinnin alkeita. Tietokoneohjelma. Raine Kauppinen

9. Periytyminen Javassa 9.1

13. Loogiset operaatiot 13.1

Luokan sisällä on lista

Tässä tehtävässä käsittelet metodeja, listoja sekä alkulukuja (englanniksi prime ).

Listarakenne (ArrayList-luokka)

Informaatioteknologian laitos Olio-ohjelmoinnin perusteet / Salo

5. HelloWorld-ohjelma 5.1

Metodit Arvotyyppi. Metodit Arvotyyppi. Metodit Parametrit. Metodit Parametrit. Metodit Kuormittaminen. Metodit Kuormittaminen. Javan perusteet

Sisällys. 9. Periytyminen Javassa. Periytymismekanismi Java-kielessä. Periytymismekanismi Java-kielessä

Käyttöohje. Boa Open Access. Helsinki Ohjelmistotuotantoprojekti HELSINGIN YLIOPISTO Tietojenkäsittelytieteen laitos

Pakkauksen kokoaminen

Sisällys. 1. Omat operaatiot. Yleistä operaatioista. Yleistä operaatioista

15. Ohjelmoinnin tekniikkaa 15.1

Vertailulauseet. Ehtolausekkeet. Vertailulauseet. Vertailulauseet. if-lauseke. if-lauseke. Javan perusteet 2004

Lohtu-projekti. Testaussuunnitelma

List-luokan soveltamista. Listaan lisääminen Listan läpikäynti Listasta etsiminen Listan sisällön muuttaminen Listasta poistaminen Listan kopioiminen

Osio 4: Tietovirrat. Properties- eli ominaisuustiedostot Logger: lokitietojen käsittely

Olion elinikä. Olion luominen. Olion tuhoutuminen. Olion tuhoutuminen. Kissa rontti = null; rontti = new Kissa();

TIETORAKENTEET JA ALGORITMIT

Opintojakso TT00AA11 Ohjelmoinnin jatko (Java): 3 op. Poikkeukset ja tietovirrat: Virhetilanteiden ja syötevirtojen käsittely

Sisällys. 9. Periytyminen Javassa. Periytymismekanismi Java-kielessä. Periytymismekanismi Java-kielessä

1. Omat operaatiot 1.1

Poikkeustenkäsittely

OutputStream ja InputStream. Tietovirrat ja niiden suunnat. Tietovirtojen käyttö. FileInputStream esimerkki. DataOutputStream ja DataInputStream

Tietokanta.java Luokka tarjoaa välineet tietokannan lukemiseen. Haetuista tiedoista muodostetaan kurssi- ja opetus-olioita.

Metodien tekeminen Javalla

4. Luokan testaus ja käyttö olion kautta 4.1

CINAHL(EBSCO) käyttöohjeita (10/2010)

Hakemistojen sisällöt säilötään linkitetyille listalle.

Opintojakso TT00AA11 Ohjelmoinnin jatko (Java): 3 op. Tietorakenneluokkia 2: HashMap, TreeMap

Poikkeusinfo XML-rajapinnan kuvaus, rajapinnan versio 2 Seasam Group

17. Javan omat luokat 17.1

Ohjelmointikielet ja -paradigmat 5op. Markus Norrena

Pino S on abstrakti tietotyyppi, jolla on ainakin perusmetodit:

Rinnakkaisohjelmointi kurssi. Opintopiiri työskentelyn raportti

TIETOKANTA MERIKOTKIEN SEURANTAAN Toteutusdokumentti. Versiohistoria:

Sisällys. 12. Näppäimistöltä lukeminen. Yleistä. Yleistä

Ohjelmointi 2 / 2008 Välikoe / Pöytätestaa seuraava ohjelma.

Ylläpitodokumentti. Boa Open Access. Helsinki Ohjelmistotuotantoprojekti HELSINGIN YLIOPISTO Tietojenkäsittelytieteen laitos

812341A Olio-ohjelmointi, IX Olioiden välisistä yhteyksistä

Ohjelmointitaito (ict1td002, 12 op) Kevät Java-ohjelmoinnin alkeita. Tietokoneohjelma. Raine Kauppinen

Ohjelmistojen mallintamisen ja tietokantojen perusteiden yhteys

Transkriptio:

Sisällön automaattinen moniluokittelu Toteutusdokumentti v0.6 Helsinki 29. marraskuuta 2002 HELSINGIN YLIOPISTO Tietojenkäsittelytieteen laitos Ohjelmistotuotantoprojekti Samo Marko Konttinen Tarmo Pellikka Pia Rantalahti Kari Silén Markku Vahter Pirkko Wahlström

i VERSIOHISTORIA Versio Pvm Kommentti Tekijä(t) 0.1 18.11.2002Ensimmäinen raakaversio Marko Konttinen, Kari Silén 0.2 27.11.2002Supistettu ja lisätty osioita Marko Konttinen, Kari Silén 0.3 27.11.02 Lisätty liite configsystem.dtd Marko Konttinen 0.4 28.11.02 Korjattiin samo.utils paketin ja Marko Konttinen indekserin osalta. 0.5 29.11.02 Korjattiin samo.utils paketin ja Marko Konttinen indekserin osalta. 0.6 29.11.2002 Lisätty viittaukset suunnitteludokumenttiin ym. Kari Silén

ii SISÄLTÖ Versiohistoria...i Sisältö... ii 1 Johdanto...1 1.1 Ohjelmiston kuvaus...1 1.2 Tärkeimmät vaatimukset...1 1.3 Muutokset...1 2 Osajärjestelmien toteutuspoikkeamat...2 2.1 samo.utils paketti (uusi)...2 2.1.1 Config ( 3.4.1 )...2 2.1.2 DOMHelper (uusi)...3 2.1.3 StreamStringTokenizer (uusi)...4 2.2 Indekseri ( 3 )...4 2.2.1 Tietokanta ( 3.2 )...5 2.2.2 Indexer ( 3.4.5 )...5 2.2.3 IndexDataImpl implements IndexData ( uusi )...6 2.2.4 DocumentRef ( 3.4.2 )...6 2.2.5 Index ( 3.4.3 )...7 2.2.6 IndexMain ( 3.4.7 )...7 2.2.7 RDFIndexer ( 3.4.10 )...8 2.3 Fdg ( 4 )...9 2.3.1 Sentence ( 4.3.3 )...9 2.3.2 Interface SentenceParser ( 4.3.6 )...9 2.3.3 SocketFdg ( 4.3.7 )...9 2.4 Hakukone ( 5 )...10 2.4.1 Node ( 5.4.1 )...10 2.4.2 NodeAnd ( 5.4.2 )...11 2.4.3 NodeNot ( 5.4.3 )...11 2.4.4 NodeOr ( 5.4.4 )...11 2.4.5 NodeTerm ( 5.4.5 )...11 2.4.6 Ontology ( 5.4.6 )...12 2.4.7 Parser ( 5.4.7 )...13 2.4.8 Processer ( 5.4.8 )...14 2.4.9 SearchEngine ( 5.4.9 )...15 2.4.10 SearchException extends Exception (uusi)...16 2.4.11 Term ( 5.4.11 )...16 2.5 Käyttöliittymä ( 6 )...17 2.5.1 HTML-sivut ( 6.3 )...17 2.5.2 SearchServlet ( 6.4.2)...17 2.5.3 SearchGui ( 6.4.2)...18 Liite: configsystem.dtd...19

_ Järjestelmä 1 1 JOHDANTO Tässä dokumentissa kuvataan Helsingin yliopiston tietojenkäsittelytieteen laitoksen (TKTL) ohjelmistotuotantoprojektissa 28.8.2002-05.12.2002. Samo-ryhmän tekemän ohjelmiston toteutus niiltä osin, kun on poikettu suunnitteludokumentista. Samo-ryhmän jäsenet ovat Tarmo Pellikka, Marko Konttinen, Pia Rantalahti, Kari Silén, Markku Vahter ja Pirkko Wahlström. Ryhmän ohjaajana toimii Jenni Valorinta. Ryhmän asiakas on Eero Hyvönen. 1.1 Ohjelmiston kuvaus Samo-järjestelmä muodostuu kahdesta kokonaisuudesta: Indexer ja Hakukone. Indexer muodostaa museotietokannasta Fdg-morfologia-analysaattorin avulla hakemiston. Hakukone (SearchEngine) tekee hakemistosta hakuja laventaen niitä Ontologian avulla. Käyttöliittymässä käyttäjä antaa hakusanan tai hakusanojen yhdistelmän ja haun syvyyden ja Hakukone palauttaa löydettyjen viitteiden painoarvon mukaan järjestetyn listan. Järjestelmä on tarkoitettu Finnish Museum Online (FMO) projektin käyttöön. Järjestelmä on toteutettu Java-kielellä (1.3.0) ja se käyttää apuna Connexor Oy:n morfologista analysaattoria Fdg3 sekä HP Labs:n Jena-API:a RDF-mallien käsittelyyn. Toteutuksessa on käytetty CVS-versionhallintatyökalua. Ohjelmisto sisältää paketit samo.indexer, samo.fdg, samo.searchengine, samo.searchgui, samo.utils (jar) ja erikseen SearchServletin (class) ja HTML-sivut. 1.2 Tärkeimmät vaatimukset Järjestelmän tärkeimmät vaatimukset ovat seuraavat: pystyy tuottamaan indeksin annetuista RDF-muotoisista museokorteista. Järjestelmä pystyy suorittamaan käyttäjän antaman hakulauseen muotoisen haun indeksistä samalla hyödyntäen ontologian tarjoamaa tietoa käsitteiden välisistä suhteista. 1.3 Muutokset Muutoksiin on merkitty viittaus suunnitteludokumentin vastaaviin kohtiin tai jos on tehty kokonaan uusi paketti, luokka tai metodi, viittauksessa on merkintä uusi.

2 2 OSAJÄRJESTELMIEN TOTEUTUSPOIKKEAMAT Järjestelmä on organisoitu neljäksi osajärjestelmäksi: indekseri, fdg, hakukone ja käyttöliittymä. Paketti samo.utils lisättiin osaksi järjestelmää suunnittelun jälkeen. Tähän pakettiin on koottu luokkia, jotka ovat luonteeltaan aputyökaluja. Pakettiin kuuluvat luokat eivät muodosta varsinaisesti omaa osajärjestelmäänsä Synonyymien käsittelyä ei toteutettu tässä projektissa. Asiasta sovittiin asiakkaan kanssa projektiryhmän kokouksessa 11.11. 2.1 samo.utils paketti (uusi) Luokka Config siirrettiin Indekseri osajärjestelmästä osaksi samo.utils pakettia, koska sekä hakukone, että indekseri käyttävät sitä ja kummankin toiminta riippuu oleellisesti siitä. 2.1.1 Config ( 3.4.1 ) Luokan Config tehtävä on edelleen oleellisesti sama, joksi se suunnitteludokumentissa kuvattiin. Pieniä muutoksia tosin tehtiin. Konfiguraatiotiedoston configsystem, josta Config lukee systeemin asetukset, dtd-määrittelyä muutettiin hiukan vapaammaksi laskemalla jotkin sen elementit valinnaisiksi johtuen hakukoneen ja indekseri hieman toisistaan eroavista käyttötavoista. public java.lang.string getfdglocation() Kertoo käytettävän morfologisen analysaattorin Fdg3:n osoitteen Stringinä. getfdglocation Metodin getfdghostname nimi muutettiin getfdglocation:ksi yhdenmukaisuuden vuoksi. Metodia muutettiin myös niin, että se palauttaa URL:n sijasta Stringin, sillä fdg ei edellytä osoitteen osana protokollaa. public java.lang.string getindexlocation() Palauttaa käytettävän tietokannan osoitteen Stringinä. Metodia muutettiin siten, että se palauttaa URL:n sijasta Stringin, sillä tietokanta käyttää protokollaa, jota URL ei hyväksy.

3 public StreamStringTokenizer getstopwordlist() Metodia muutettiin s.e. se palauttaa hukkasanalistan StreamStringTokenizeroliona ei List:ana. configsystem.dtd (Liite 2) Konfiguraatiotiedoston dtd-määrittelyyn (liite) tehtiin seuraavat muutokset: OntologyLocation Ontologian sijainti - ei ole pakollinen, koska indekseri ei käytä ontologiaa. Hakukone sen sijaan edellyttää ontologiaa, joten hakukoneen konfiguraatiotiedostossa tulee ontologia luonnollisesti antaa. Indekserin ja hakukoneen ei siis tarvitse käyttää samaa konfiguraatiotiedostoa vaikka se onkin kätevää. user Lisättiin elementti, jossa annetaan indeksin käyttämän tietokannan asetukset ja jolla on attribuutit name ja password. stoplistlocation Lisättiin elementti, jossa annetaan käytettävän hukkasanalistan sijainti URLmuodossa. properties Elementin suhteen määrittelyä muutettiin niin, ettei se ole pakollinen. Tällöin indekseri indeksoi materiaalista kaikki ominaisuudet. 2.1.2 DOMHelper (uusi) DOMHelper on apuluokka DOM-muotoisen xml-dokumentin käsittelyyn. Konstruktorit: public DOMHelper() Luo uuden DOMHelper olion. public static java.lang.string gettextcontent(org.w3c.dom.node parent)

4 Palauttaa annetun solmun tai sen välittömien lapsien tekstisisällön. Jos solmulla on useampia TEXT_NODE lapsia, niiden sisältö katenoidaan palautettavaan tulokseen siinä järjestyksessä, kuin ne lapset esiintyvvät dokumentissa. Lapsenlapsia ei käsitellä. public org.w3c.dom.document getdocument(java.io.reader data) Luo tietovirrasta xml-dokumentin (DOM), jos tietovirta sisältää hyvin muodostunutta xml:ää. 2.1.3 StreamStringTokenizer (uusi) Paloittelee tietovirran paloihin joita erottavat 'white space' merkit: välilyönti, rivinvaihto, tabulaattori jne... Konstruktorit: public StreamStringTokenizer(java.io.Reader reader) Paloitellaan parametrina annettu tietovirta. public static void main(java.lang.string[] args) Käyttää sisääntulovirtana oletussyötettä Tulostaa oletus-tulostus kanavaan Esim. tiedoston käsittely komentoriviltä: java.samo.utils.streamstringtokenizer < teksti.txt public boolean hasmoretokens() Palauttaa true niin kauan kuin tietovirrasta löytyy kamaa. public java.lang.string nexttoken() Antaa tietovirrasta aina palasen kerrallaan. 1. kerralla antaa ensimmäisen palasen ja tämän jälkeen aina seuraavan niin kauan kuin tietovirtaa riittää. 2.2 Indekseri ( 3 ) Suunitteludokumentissa normalisoidun TF*IDF painon laskemiseen käytettävässä kaavassa oli virhe: nimittäjästä puuttui neliöjuuri.

5 Oikea kaava on: tfidf t k, d j / s= 1toT tfidf t s, d j 2 (teknisistä syistä laatikko neliöjuuren alla nimittäjässä edustaa summamerkkiä - iso sigma. ) Eli normalisoitu tf*idf arvo saadaan siis kun jaetaan tf*idf-arvo ko. dokumenttivektorin euklidisella pituudella, jolloin normalisoitu paino saa reaalilukuarvon väliltä [0,1]. 2.2.1 Tietokanta ( 3.2 ) Tietokantaan on määritelyt kaksi eri käyttäjää, samo_indexer ja samo_searcher - toinen hakukonetta ja toinen indekseriä varten. Hakukoneen käyttäjä tarvitsee tietokantaan vain lukuoikeuden ( SELECT ). Indekserin käyttäjä tarvitsee lukuoikeuden lisäksi muokkaus- ( UPDATE, INSERT ) ja poisto-oikeudet (DELETE). Taulujen luoja saa nämä oikeudet oletusarvoisesti, joten oli luontevaa luoda nämä taulut samo_indexer:n nimissä. Hakukonetta varten samo_searcherille myönnettin lukuoikeudet: GRANT SELECT ON TABLE term TO samo_searcher; GRANT SELECT ON TABLE about TO samo_searcher; GRANT SELECT ON TABLE docref TO samo_searcher; GRANT SELECT ON TABLE property TO samo_searcher; Taulun docref tietueiden pääavain (primary key) on juokseva numero, jota varten määriteltiin sekvenssi: CREATE SEQUENCE docref_id_sequence START 0; 2.2.2 Indexer ( 3.4.5 ) public void index(string text, Map result) throws IndexException Pseudokoodiin tehtiin pieni lisäys. Metodin päätyttyä täytyy tyhjentää virkkeet, jotta niitä ei indeksoida uudestaan.

6 public void addtostoplist(string token) Pieni täsmennys suunnitteludokumenttiin: Estolistalle lisättävä sana(t) on oltava perusmuodossa. private void findterms(sentence s,map result) Tehtiin lisäys pseudokoodiin. Useat eri termihahmot voivat löytää täsmälleen saman termin, siksi jo löydetyt termit lisätään joukkoon set, jotta samaa termiä ei lisättäisi useaan kertaan tulokseen. 2.2.3 IndexDataImpl implements IndexData ( uusi ) add() Lisättiin metodi, joka kasvattaa löytyneiden termien määrää yhdellä. 2.2.4 DocumentRef ( 3.4.2 ) Attribuutit: keyterm DocumentRef:lle lisättiin attribuutti ja tälle aksessori keyterm, joka palauttaa attribuutin keyterm arvon. Attribuutti annetaan konstruktorin parametrina, joten myös konstruktoria muutettiin tältä osin. Konstruktorit: Konstruktori: DocumentRef(String about, String keyterm) Lisättiin parametri keyterm, joka asettaa samannimisen attribuutin arvon. public boolean equals(object object)

7 Kertoo onko parametrina annettu objekti yhdenmukainen tämän kanssa. Parametrina annettu objekti on yhdenmukainen, jos se on tyyppiä DocumentRef, viittaa samaan resurssiin ja sillä on sama hakutermi. public boolean targetequals(object object) Palauttaa true, jos parametrina annettu objekti on tyyppiä DocumentRef ja viittaa samaan kohteeseen kuin tämä. public java.lang.string keyterm() Kertoo viitteen hakusanan. 2.2.5 Index ( 3.4.3 ) Attribuutit: String username String userpasswor Indeksin konstruktoriin lisättiin kaksi uutta attribuuttia, jotka se saa konstruktorin attribuutteina: Konstruktorit: public Index( java.lang.string dbhostname, int dbport, java.lang.string username, java.lang.string userpassword) 2.2.6 IndexMain ( 3.4.7 ) IndexMain Toimintaa muutettiin hieman suunnitteludokumentissa spesifioidusta joustavamman käytettävyyden saavuttamiseksi: Tietokantaa ei automaattisesti tyhjennetä ennen annetun materiaalin indeksoimista, vaan tyhjentäminen (alustus) täytyy määrätä antamalla komentoriviparametrin reset arvoksi 'YES'. Tämä mahdollistaa materiaalin indeksoimisen useammassa erässä.

8 Indeksointi edellyttää käyttäjältä oikeuksia indeksinä käytettävän tietokannan taulujen päivittämiseen ja poistamiseen. Käyttäjän tunnus ja salasana voidaan antaa konfiguraatiotiedostossa tai komentoriviparametreina. IndexMain voidaan käynnistää indeksoinnin lisäksi myös erikseen tietokannan alustusta tai painojen laskemista varten. Mikäli toinen tai molemmat näistä toiminnoista halutaan suorittaa eri ajokerralla kuin indeksointi, tulee sourceconfig komentoriviparametri jättää pois ja määrittää suoritettava toiminto parametrilla reset tai updateweights. Nämä parametrit saavat arvokseen joko YES tai NO. Indekserin käyttö on tarkemmin selitetty käyttöohjeessa. Indekseri voi siis saada seuraavat komentoriviparametrit, joista systemconfig on pakollinen. NIMI SystemConfig SourceConfig UserName UserPassword Reset UpdateWeights ARVO url osoite systeemikonfiguraatiotiedostoon. url osoite lähdekonfiguraatiotiedostoon. Anna tämä parametri, jos haluat indeksoida jotain. Anna käyttäjänimi, jos tietokanta edellyttää sitä, eikä sitä ole annettu systemconfig -tiedostossa. Anna salasana, jos tietokanta edellyttää sitä, eikä sitä ole annettu systemconfig -tiedostossa. YES tai NO. Oletusarvo on NO. Suoritetaan ennen indeksointia. YES tai NO. Oletusarvo on YES. Suoritetaan inedksoinnin jälkeen. 2.2.7 RDFIndexer ( 3.4.10 ) Indeksoinnin toimintaa muutettiin siten, että jos ominaisuuksien nimiä ei anneta, haetaan kaikki ominaisuudet, jotka löytyvät RDQL-tripletillä (?about,?predicate,?object). Metodia index muutettiin siten, että se saa URL:n sijasta parametrikseen Reader:n, joka sisältää käsiteltävän tiedoston sisällön: public void index(reader rdfdata) Parametri muutettu URL:sta Reader:ksi

9 2.3 Fdg ( 4 ) Fdg osajärjestelmän tehtävänä on tarjota rajapinta Connexorin (www.connexor.com) luonnollisen kielen analysaattoriin Fdg3. Analysaattori pätkii sille tuotetun tekstin virkkeiksi. Se tuottaa virkkeen sanoille sekä morfologista informaatiota, että informaatiota sanojen suhteesta toisiinsa. 2.3.1 Sentence ( 4.3.3 ) tostring() Lisättiin metodi, joka palauttaa virkkeen samaan tapaan kuin Fdg3:n tekstimuotoinen output. 2.3.2 Interface SentenceParser ( 4.3.6 ) Sentence analyse(string onesentence) throws SentenceParseException Rajapintaan lisättiin yksi metodi testaamisen helpottamiseksi. Metodi ottaa parametrinaan yhden virkkeen ja palauttaa sen analysoituna. 2.3.3 SocketFdg ( 4.3.7 ) SocketFdg tarjoaa pistokeyhteyden Connexorin Fdg3 palvelimeen. Atribuutit: host Lisättiin atribuutti palvelimen nimi. port Lisättiin atribuutti palvelimen portti

10 Konstruktorit: Token(int position) Luo uuden sanan. Paramertinaan konstruktori saa position virkkeessä. Sentence analyse(string onesentence) throws SentenceParseException Lisättiin metodi, koska se lisättiin SentenceParser rajapintaan. tostring() Lisättiin metodi testauksen helpottamiseksi. Metodi palauttaa sanan samassa muodossa kuin Fdg3:n tekstimuotoinen tulostus. 2.4 Hakukone ( 5 ) SearchException Hakukoneseen lisättiin toteutusvaiheessa oma poikkeusluokka. Hakukoneeseen kuuluvat luokat muodostavat paketin samo.searchengine. 2.4.1 Node ( 5.4.1 ) Attribuutit: Poistettiin turha Set-tyyppinen muuttuja references. public Set processnode (Processer p) throws SearchException Laitettiin metodi heittämään SearchException-poikkeus. public void preprocess (Processer p, int ontologylevel) throws SearchException Laitettiin metodi heittämään SearchException-poikkeus.

11 2.4.2 NodeAnd ( 5.4.2 ) private Set cut(set leftchild, Set rightchild) Cut-metodi suorittaa matemaattisen leikkausoperaation kahdelle joukolle. Metodin toimintaa tarkennettu eli etsitään palautettavaan joukkoon ne viitteet, jotka löytyvät sekä solmuun liittyvästä vasemmasta että oikeasta lapsesta ja näistä kahdesta viitteestä palautettavaan joukkoon otetaan se, jonka paino on suurempi. 2.4.3 NodeNot ( 5.4.3 ) public void preprocess (Processer p, int ontologylevel) throws SearchException NodeNot-luokan preprocess metodi toimii niin, että oikeanpuoleisten lapsisolmujen termejä ei laajenneta eli oikean lapsen preprocess-metodin kutsussa määritetään laajennustasoksi 0. NodeAnd- ja NodeOr luokka käyttää Node-yläluokassa toteutettua preprocess-metodia. 2.4.4 NodeOr ( 5.4.4 ) private Set union(set leftchild, Set rightchild) Union-metodi suorittaa matemaattisen yhdisteoperaation kahdelle joukolle. Metodi ottaa mukaan palautettavaan joukkoon viitteet, jotka löytyvät solmun vasemmasta tai oikeasta lapsesta. Tarkennettu painojen käsittelyä eli jos viite löytyy molemmista joukoista, otetaan paluujoukkoon mukaan se viite, jonka paino on suurempi. 2.4.5 NodeTerm ( 5.4.5 ) Attribuutit: term Lisättiin attribuutti kuvaamaan alkuperäistä termiä.

12 public void preprocess(processer p, int level) throws SearchException Laitettiin metodi heittämään SearchException-poikkeus. Muutos pseudokoodiin siten, että metodi ei enää selvitä termin synonyymejä ja termien lisäämiseen käytetään addterms-metodia. public Set processnode(processer p) throws SearchException Laitettiin metodi heittämään SearchException-poikkeus. Lisäksi Processerluokan findreferences-metodin kutsu laitettiin try..catch-rakenteen sisään. private void addterms(processer p, List newterms, int type, int depth) throws SearchException Lisättiin kokonaan uusi metodi addterms, joka suorittaa termien lisäämisen terms-listaan. Metodi lisättiin sen vuoksi ettei samoja asioita olisi tarvinnut laittaa useampaan kertaan preprocess-metodiin. 2.4.6 Ontology ( 5.4.6 ) Attribuutit: malli Luokaan on lisätty attribuutti (private Model model), johon Jenan kyselyt kohdistetaan. Konstruktorit: Luodaan konstruktori, jota ei kuormiteta (public Ontology()) eli konstruktorille ei anneta osoitetta käytettävään ontologiaan. ontologytobeused (Reader reader) Muutettiin metodin public Model parsefromrdfs(string uri) nimi. Alustaessaan hakukoneen SearchGui-luokka kutsuu metodia ontologytobeused, jolla asetetaan käytettävä ontologia. change2basic.

13 Toinen muutos alkuperäiseen on se, että käyttöön otetaan ontologia, jossa termit on muutettu perusmuotoon utils-luokan metodilla public List getsynonyms(string hakusana) Metodia ei toteutettu, koska haut tehdään ontologiaan, joka on rdfsmuotoinen. rdfs-tiedosto ei sisällä propertyä synonyymi. Synonyymi-haun voi toteuttaa rdf-muotoiseen tiedostoon, kun tiedetään, miten synonyymi-property on rdf:ään merkitty. public List getsubclasses (String hakusana) Metodi kutsuu kyselyn suoritukseen metodia executequery. public List gethomonyms(string hakusana) Metodi kutsuu kyselyn suoritukseen metodia executequery. private Vector executequery(string querystring) Lisätty edellä mainittu metodi, joka suorittaa parametrinä saamansa Jenakyselyn malliin. Metodi palauttaa kyselyn tuloksen sitä kutsuneelle metodille, jotka tässä tapauksessa ovat getsubclasses ja gethomonymes. 2.4.7 Parser ( 5.4.7 ) Kaikki Parser-luokan metodit heittävät nyt Exceptionin sijaan SearchExceptionin. Rajoitukset ja parannusehdotukset Parseri ei käsittele järkevästi hakulauseita, joissa ei käytetä sulkeita ryhmittelyyn. Tällaiset hakulauseet parsitaan mielivaltaisesti, eikä lopputulos välttämättä ole se, mitä käyttäjä on alunperin tarkoittanut. Parseri ei myöskään ymmärrä operaattorilla alkavia hakulauseita eli esimerkiksi hakulause EI kissa ei ole sen mielestä oikeanmuotoinen hakulause. Parseri luo uuden searchstring-olion kulloinkin käsittelyssä olevasta hakulauseen osasta. Parserin tehokkuutta voisi parantaa niin, että pidettäisiin kirjaa hakulauseen käsittelyn vaiheesta index-muuttujan avulla.

14 Attribuutit: boolean debug Parser-luokkaan on lisätty testausta varten uusi muuttuja. Sen arvo on oletusarvoisesti false, mutta jos arvoksi asettaa true, voi tulostaa tietoa hakulauseesta muodostuneesta binääripuusta. public Node parsetree(string searchstring) throws SearchException Laitettiin metodi heittämään SearchException-poikkeus. private Node parseoperator(node left) throws SearchException Laitettiin metodi heittämään SearchException-poikkeus. private Node parsesentence() throws SearchException Laitettiin metodi heittämään SearchException-poikkeus. private Node getoperator(string word) throws SearchException Laitettiin metodi heittämään SearchException-poikkeus. private void nexttoken() Metodia muutettiin niin, että se tulkitsee oikein myös sellaiset hakulauseet, joissa ei ole välilyöntiä sulkumerkkien ympärillä eli esimerkiksi hakulause koira(hevonen tai heppa) tulkitaan virheelliseksi hakulauseeksi eikä kahdeksi TAI-operaattorilla erotetuksi hakusanaksi. Samoin metodia korjattiin niin, että se löytää ylimääräisen sulkumerkin myös hakulauseen lopusta. 2.4.8 Processer ( 5.4.8 ) public float countweight(float weight, Set predicates, int level) throws SearchException

15 Laitettiin metodi heittämään SearchException-poikkeus. public boolean findhomonyms(string term) throws SearchException Laitettiin metodi heittämään SearchException-poikkeus. Lisäksi Ontologialuokan metodi olikin nimeltään gethomonymes, ei gethomonyms. public String term2basic(string term) Parser-luokan getlemma-metodin kutsu laitetttiin try..catch-rakenteen sisään. public List findhyponyms(string term) throws SearchException. Laitettiin metodi heittämään SearchException-poikkeus. Ontology-olion metodi jota kutsutaan olikin nimeltään getsubclasses, ei gethyponyms. public Set findreferences(list terms) throws SearchException Metodi muutettiin palauttamaan joukko void:n sijaan. Tämäkin metodi laitettiin heittämään SearchException-poikkeus. Palautettavan joukon nimeksi muutettiin ret, sillä sana final olikin ns. varattu sana. Index-olion getreferences-metodin kutsu laitettiin try..catch-rakenteen sisään. public List sortreferences(set references) Muutettiin asiat toisin päin eli ensin muunnetaan joukko listaksi joka seuraavaksi järjestetään. Lisäksi generoidaan lista, johon tallennetaan DocumentRef-olioista ainoastaan URI string-tyyppisenä ja tämä lista palautetaan. 2.4.9 SearchEngine ( 5.4.9 ) Attribuutit: Tässä ei ole muuta muutosta kuin, että private-muuttujista tehtiin protected. Protected-muuttujat ovat muiden saman paketin luokkien käytettävissä. Ajatus oli, että Processer-luokka olisi voinut käyttää näitä muuttujia SearchEngineluokasta, mutta ne annetaankin Processerille jo kutsussa (mikä oli ihan alkuperäisen suunnitelman mukaista). public void setweight (String field, float weight) throws SearchException

16 Laitettiin metodi heittämään SearchException-poikkeus. public abstract List search (String searchstring, int level) throws Exception Laitettiin metodi heittämään SearchException-poikkeus. public void setontology (Ontology ontology) Hashtable weights luodaan nyt tässä metodissa. Alunperin se tehtiin luokan konstruktorissa, mutta se ei onnistu, koska SearchEngine on abstrakti luokka, josta ei luoda oliota. 2.4.10 SearchException extends Exception (uusi) Lisättiin kokonaan uusi luokka kuvaamaan haussa tapahtuvia poikkeuksia. Parser-luokan heittämät poikkekset on kuvattu taulukossa xxx.. Taulukko xxx Parser-luokan heittämät poikkeukset ja niiden merkitys. VIRHEILMOITUS "Virheellinen hakulause" "Sulku hukassa" "Boolen operaattoria ei löydy" "Parse error" SELITYS Virhe hakulauseessa. Hakulauseessa ei ole esimerkiksi hakutermiä operaattorin oikealla puolella. Hakulauseessa ei ole toisiaan vastaavaa määrää vasemman ja oikeanpuoleisia sulkumerkkejä. Hakulauseesta puuttuu Boolen operaattori tai se on väärässä paikassa. Jotain muuta kuin muiden poikkeusten kohdalla mainittua vikaa hakulauseessa. 2.4.11 Term ( 5.4.11 ) Attribuutit: Poistettiin turhana references-attribuutti, jonka oli tarkoitus sisältää termiin liittyviä DocumentRef-olioita. Konstruktorit: public Term(String term, int type) Lisättiin toinen konstruktori ilman level-parametria.

17 2.5 Käyttöliittymä ( 6 ) Käyttöliittymä on vaatimusten mukaan tehty hyvin yksinkertaiseksi, mutta poikkeaa suunnitteludokumentin määrittelystä. 2.5.1 HTML-sivut ( 6.3 ) Aloitussivun syvyys-valinta muutettiin numeeriseksi. Hakulauseen pituutta ei ole rajattu mitenkään. 2.5.2 SearchServlet ( 6.4.2) public void dopost(httpservletrequest req, HttpServletResponse res) Lisättiin metodi, jotta servlettiä voidaan ajaa myös post-metodilla

18 2.5.3 SearchGui ( 6.4.2) config Ei toteutettu config-metodia, koska SearchGui-luokka käyttää Config-luokkaa konfigurointitiedoston lukemiseen. public static void main (String[] args) Lisättiin metodi, koska haluttiin ajaa myös komentoriviltä. public List callengine (String hakulause, int syvyys) Metodin search nimi muutettiin, koska SearchEngine-luokassa on metodi search. public void readparameters () Lisättiin metodi, koodin selventämiseksi

19 Liite: configsystem.dtd <!ELEMENT config (system, (properties)?)> <!-- systeemin asetukset --> <!ELEMENT system (db, fdg, (ontologylocation)?, (stoplistlocation)?)> <!ELEMENT db (user?, location)> <!ELEMENT fdg (location)> <!ELEMENT ontologylocation #PCDATA)> <!-- ei ole pakollinen --> <!ELEMENT stoplistlocation #PCDATA)> <!-- ei ole pakollinen --> <!ELEMENT location (#PCDATA)> <!ATTLIST location port CDATA #REQUIRED> <!-- indeksin käyttäjän tiedot - ei pakolliset --> <!ELEMENT user EMPTY> <!ATTLIST user name CDATA #REQUIRED password CDATA #IMPLIED> <!-- suodatin - ei pakollinen --> <!-- käsiteltävät ominaisuudet --> <!ELEMENT properties (namespace+)> <!ELEMENT namespace (property+)> <!ELEMENT property (#PCDATA)> <!ATTLIST namespace name CDATA #REQUIRED> <!ATTLIST property weight CDATA #REQUIRED>