). Dit zorgt bij het construeren van een query vaak voor proberen omdat deze paragraaf-tags niet afgesloten worden en er geen eenduidige structuur aanwezig is. Er moeten meerdere queries geschreven worden voor de extractie van dezelfde data in dezelfde dataset. Ik pleit voor een betere structuur in de Wikipedia XML-structuur door onder andere tags om geboortedata, sterftedata, tijden, plaatsen en personen heen te zetten. De structuur kan een extra dimensie krijgen door RDF of OWL-tags op te nemen tussen de reeds bestaande tags. Dit zorgt ervoor dat er eenvoudiger een antwoord gevonden kan worden op ingewikkelde vragen.
3.4 3.4.1
Queries Query 1: Lijsten
Hieronder zal ik de methode beschrijven die ik gebruik heb voor de extractie van lijsten uit de Wikipedia XML-structuur. De Wikipedia XML-files zijn genummerd van ´e´en tot en met 380.000, verdeeld over 125.000 bestanden. Elk bestand bevat ´e´en artikel uit de Nederlandse Wikipedia. Dit artikel heeft als onderwerp datgene wat er tussen de tag
3.4
Queries
27
for $m in collection(“docs.xml”)/article where contains(data($m/name), “lijst van”) or contains(data($m/name), “Lijst van”) return $m/name[@id] Allereerst wordt een xml-bestand aangeroepen waarin de locatie staat van alle documenten in de testset. Als de name-tag de tekenreeks “lijst van” of “Lijst van” bevat, dan wordt de naam naar het scherm geschreven. Ook heb ik de output naar een bestand weggeschreven zodat er vervolgens beter gezocht kon worden binnen de lijsten. Als iemand op zoek is naar een lijst van hoofdsteden is het niet wenselijk dat de gehele testset of dataset doorzocht wordt als er al een bestand aanwezig is met hierin de namen van alle lijsten en hun onderwerpen. De query die ervoor zorgt dat er binnen de lijsten gezocht kan worden, ziet er als volgt uit: for $m in doc(“lijsten.xml”)/article let $keyword := “landen” return for $i in 1 to count($m/name) where contains(data($m/name[$i]), $keyword) return $m/name[$i] Deze query is een geneste query. Er wordt in het document ‘lijsten.xml’ gezocht naar lijsten waarin het woord ‘landen’ voorkomt. De nesting is nodig omdat wederom gebruik wordt gemaakt van de contains-functie. Deze functie werkt alleen als er maar ´e´en unieke tag doorzocht wordt. In de vorige query was de name-tag uniek in elk document. In het bestand ‘lijsten.xml’ komen echter allemaal name-tags voor. Deze moeten op een speciale wijze benaderd worden. Een goede manier om dit te doen is om gebruik te maken van een teller. Deze teller ($i) loopt van 1 tot het aantal keer dat de name-tag in het document voor komt. Als het keyword aanwezig is in de name-tag, dan wordt deze naar het scherm geschreven. Ik heb gezocht naar het keyword ‘hoofdsteden’. De resultaten die ik terugkreeg waren:
3.4
Queries
28
Uit deze resultaten blijkt dat er twee lijsten te vinden zijn met hoofdsteden. Het tweede resultaat is het meest waardevol en zal ik gebruiken voor een query die hoofdsteden van landen extraheert.
3.4
3.4.2
Queries
29
Query 2: Hoofdsteden
Voor het extraheren van hoofdsteden is het belangrijk dat er gebruik gemaakt gaat worden van de lijst waarin de landen en de hoofdsteden bij elkaar staan. De lijst met hoofdsteden is hiervoor uitstekend geschikt. De structuur van de lijst die te vinden is in het bestand ‘79974.xml’, is als volgt:
3.4
Queries
3.4.3
30
Query 3: Valuta
Vragen over de munteenheid van een land moeten door een Question Answeringsysteem te beantwoorden zijn. De extractie van deze data uit de Wikipedia XML-bestanden heeft wat meer voeten in de aarde dan de vorige queries. De bovenstaande queries maakten gebruik van lijsten. De query voor het extraheren van valuta van een land maakt ook gebruik van een lijst. Deze lijst is echter zelf gemaakt en is niet te vinden in de Wikipedia XML-bestanden. De valuta van een land is op twee manieren te extraheren uit de Wikipedia XML-bestanden. 1. Er kan gezocht worden op een lijst waar ’valuta’ een keyword is. Dit levert geen resultaat op. Het keyword ‘munteenheden’ geeft w´el een lijst terug namelijk bestand ‘18562.xml’. In dit bestand staat eerst de munteenheid en vervolgens alle landen die deze munteenheid als valuta gebruiken. 2. De Wikipedia XML-bestanden kunnen doorzocht worden op land. Als eenmaal het gewenste land gevonden is, kan de valutacode van dit land opgezocht worden. Deze valutacode wordt vervolgens gematched aan een zelfgemaakte lijst met hierin de vertaling van valutacode in de daadwerkelijke munteenheid. De eerste manier lijkt eenvoudig te realiseren. Het probleem is echter dat de xml-structuur van het document ’18562.xml’ op zodanige wijze is opgebouwd dat een simpele XQuery niet losgelaten kan worden op dit document om de juiste informatie te extraheren. Het probleem zit in de naamgeving van de tags. Bij sommige valuta staat de link naar het bijbehorende artikel over de valuta. Dit is onder andere bij de Euro en de Frank het geval. De tag die verwijst naar het artikel over de Euro, ziet er als volgt uit:
3.4
Queries
31
Dit verschil zorgt ervoor dat er if-then-else clauses ingebouwd moeten worden en de XQuery ingewikkelder wordt dan de tweede manier. Als gebruik gemaakt wordt van de tweede manier dan kan er worden gezocht op de tag . Als deze tag gevonden is, kan de valutacode worden ge¨extraheerd. Vervolgens kan de valutacode vergeleken worden met een lijst met valutacodes en de daarbij behorende naam die bij deze valutacode hoort. Deze naam wordt naar het scherm geschreven. De lijst met valutacodes is van Wikipedia gehaald en omgezet in XML-formaat. De titel van het document in Wikipedia is ‘iso-4217’. Het XML-bestand dat hiervan gemaakt is, heet logischerwijs ‘iso-4217.xml’. De query die de valutacodes extraheert en als resultaat alle landen met hun valuta weergeeft, ziet er als volgt uit: for $e in collection(“docs.xml”)/article where exists($e//template valutacode) return for $m in doc(“iso-4217.xml”) where $m/article/valuta[@code=$e//template valutacode] return
Query 4: Geboortedata
De extractie van geboortedata uit teksten is vaak erg lastig. De problemen zitten hem in de vele manieren waarop de geboortedata in een tekst kunnen voorkomen. In sommige teksten wordt de maand voluit geschreven, zijn de koppeltekens slashes (/) of, als de tekst in het Amerikaans Engels geschreven is, is de notatie van maand en dag omgedraaid. Deze vele verschillen maken een eenvoudige reguliere expressie op een tekst niet mogelijk. Er moeten vele opties ingebouwd worden om alle verschillende notaties te kunnen extraheren. In de Wikipedia XML-bestanden komen deze problemen gelukkig niet voor. Er zijn echter wel veel andere problemen die opgelost moeten worden voordat de geboortedatum van een persoon gevonden kan worden. Het eerste probleem is het ontbreken van een tag die geboortedata aanduidt. Dit is een gemis omdat er nu gezocht moet worden met reguliere expressies om de geboortedata te extraheren. Het tweede probleem is de opbouw van de teksten zelf. Omdat de teksten geschreven zijn door verschillende schrijvers, verschilt de ene tekst qua
3.4
Queries
32
opbouw met een andere tekst. De ene keer staat de geboortedatum in de eerste regel, de andere keer achter de naam van de persoon. Bovenstaande problemen zorgden ervoor dat het niet mogelijk was om een XQuery te schrijven die allereerst artikelen over personen opzocht en vervolgens hun geboortedatum uit de tekst haalde. Dit was veel te ingewikkeld en duurde veel te lang. De oplossing zat in de Wikipedia-artikelen over jaartallen. Deze artikelen bevatten alle bijzondere gebeurtenissen in een bepaald jaar. In deze artikelen staan ook geboortedata en sterftedata van bepaalde personen. Na gezocht te hebben in de dataset, bleek dat de artikelen over jaartallen geordend waren en stonden in de documenten ‘1982.xml’ tot ‘2629.xml’. Vervolgens heb ik gekeken of ik alle geboortedata uit deze artikelen kon halen. Dit bleek mogelijk omdat de tekst opgedeeld was in secties. Een van de secties had als titeltag:
3.4
Queries
33
twaalf (het aantal maanden). De gegevens worden vervolgens gestructureerd weggeschreven. Op bovenstaande manier ontstond een XML-bestand met alle geboortedata die aanwezig waren in de artikelen over jaartallen. Dit XML-bestand kon verder doorzocht worden om ook de geboortedag van een persoon te extraheren. De query die hiervoor zorgt, ziet er als volgt uit: for $m in doc(“geboortedata.xml”)/data//item let $person := “Harry Mulisch” where data($m//collectionlink) = $person return
4
De constructie van het QA-systeem
Het meest bekende QA-systeem, Ask19 (tegenwoordig een normale zoekmachine zoals Google), heeft een belangrijke eigenschap namelijk dat deze online te bereiken is. Dit heeft als voordeel dat er een grotere gebruikersgroep kan worden bediend. Als Ask alleen offline beschikbaar zou zijn, zal de gebruikersgroep kleiner zijn. Er zal een programma aangeschaft moeten worden en deze moet ge¨ınstalleerd worden op de computer van de gebruiker. Indien er voldoende goede alternatieven online aanwezig zijn, stappen veel gebruikers over op deze online alternatieven. Er hoeft hiervoor namelijk niets ge¨ınstalleerd te worden en het programma toont dezelfde resultaten. In dit hoofdstuk zal ik bespreken op welke manieren het QA-systeem op basis van Wikipedia ontwikkeld kan worden zodat internetgebruikers dit systeem kunnen gaan gebruiken. Enkele van deze methoden zal ik verder uitwerken tot een eenvoudig QA-systeem.
4.1 4.1.1
Online QA-systemen Online informatie-extractie
De eerste manier voor de ontwikkeling van een online QA-systeem die besproken wordt, is een methode die geen gebruik maakt van de Wikipedia XML-bestanden. De informatie wordt direct uit direct de html-source van de Wikipedia bladzijde gehaald in plaats van uit deze bestanden. In dit systeem voert de gebruiker een query in, bijvoorbeeld: “Wat is de munteenheid van Nederland?”. Deze query wordt doorgestuurd vanuit HTML naar een scripttaal, bijvoorbeeld PHP of Perl, die op zijn beurt de query op basis van eenvoudige stringmatching analyseert. Het resultaat van deze stringmatching geeft het onderwerp weer waar de gebruiker informatie over zou willen hebben. Als resultaat van bovenstaande query zou uit deze analyse moeten komen dat de munteenheid van Nederland teruggegeven moet worden aan de gebruiker. Vervolgens gaat de scripttaal bezig met de extractie van de informatie die voldoet aan de eisen van het verwachte antwoord. De informatieextractie wordt gedaan door in Wikipedia te zoeken naar de onderwerpen munteenheid en/of Nederland. Om de Wikipedia-artikelen te vinden die overeenkomsten vertonen met het onderwerp, kan gebruik worden gemaakt van de interne zoekmachine van Wikipedia. De zoekmachine levert als resultaat de URL’s naar de artikelen die het meest overeenkomsten bevatten met de onderwerpen. Een snellere maar minder nauwkeurige stap is om de URL 19
http://www.ask.com
34
4.1
Online QA-systemen
35
van het artikel te “gokken”. Dit gebeurt door de URL te benaderen waarop het artikel met informatie over bijvoorbeeld Nederland verwacht wordt. Omdat de URL’s van Wikipedia-artikelen gestandaardiseerd zijn, is het mogelijk om een URL te raden. Alle Nederlandse artikelen zijn te vinden op de URL: “http://nl.wikipedia.org/wiki/”. Door hierachter de naam van het onderwerp te zetten, wordt de verwachte URL verkregen. Voor het onderwerp Nederland wordt de URL: “http://nl.wikipedia.org/wiki/Nederland”. Deze URL geeft inderdaad het artikel met hierin informatie over het onderwerp Nederland weer. Risico van het gokken van de juiste URL is dat een fout gegokte URL geen artikel teruggeeft waarin het antwoord op de ingevoerde query kan worden gevonden. Na het vinden van de artikelen waar een antwoord in gevonden kan worden, is het tijd dit antwoord ook daadwerkelijk te gaan extraheren. De scripttaal zorgt ervoor dat de HTML-code van de artikelen wordt binnengehaald. Deze code wordt vervolgens doorzocht op woorden als “munteenheid” en “valuta”. In het huidige artikel over Nederland20 , komt het woord “valuta” geen enkele keer voor, het woord “munteenheid” komt vier maal voor in vier zinnen. In drie van deze zinnen staat het uiteindelijke antwoord “euro”. Door de frequentie van elk woord te tellen in de vier zinnen, is het mogelijk om het woord “euro” te koppelen aan het woord “munteenheid”. Een andere manier om het juiste antwoord te vinden is om gebruik te maken van de structuur die de webtaal HTML kent. Als er een tabelrij gevonden wordt met in de eerste cel het woord “munteenheid”, dan is de mogelijkheid aanwezig dat in de tweede cel van dezelfde rij het antwoord staat, namelijk “euro”. In het artikel over Nederland is dit inderdaad het geval. Bovenstaand systeem van informatie-extractie heeft voordelen en nadelen. Een voordeel van dit systeem is dat er geen databases aangelegd hoeven te worden die de informatie van Wikipedia bewaren. In plaats hiervan wordt er direct gezocht op Wikipedia. Deze directe benadering zorgt ervoor dat altijd up-to-date informatie gevonden wordt omdat er gelijk in de bron gezocht wordt. Nadeel van deze directe methode is de methode van het “gokken” van de URL. Als deze URL niet bestaat, dan wordt er geen antwoord gevonden. Een ander nadeel van het systeem is dat er gebruik gemaakt wordt van de structuur van de HTML. Omdat de HTML-code in Wikipedia per artikel verschilt en er geen offici¨ele standaard is voor de opbouw van een artikel, moeten er vele scripts geschreven worden die ieder een andere opbouw van een artikel kunnen doorzoeken. Het schrijven van deze scripts is geen probleem, het vinden van alle verschillende paginastructuren binnen Wikipedia 20
http://nl.wikipedia.org/wiki/Nederland (bezocht op: 21-11-2006)
4.1
Online QA-systemen
36
en het linken van deze structuren aan de juiste zoekwoorden gaat echter w´el veel tijd kosten. Bovenstaande methode voor informatie-extractie uit Wikipedia voor een QA-systeem is alleen wenselijk als er gefocust wordt op een klein aantal typen vragen. Voor mijn onderzoek zou een QA-systeem op basis van bovenstaande methode kunnen werken. Ik kies er echter niet voor om deze methode toe te passen omdat ik een systeem voor ogen heb dat op uniforme wijze antwoorden extraheert uit de informatiebron. De bovenstaande methode voldoet hier niet aan. 4.1.2
De XSL-methode
De tweede manier om een online QA-systeem te ontwikkelen is op basis van XSL in samenwerking met de scripttaal PHP of Perl. Deze methode maakt, in tegenstelling tot de eerste methode, w´el gebruik van de informatie uit de Wikipedia XML-bestanden. De query van de gebruiker wordt, net als in de eerste methode, doorgestuurd naar een scripttaal PHP of Perl. De scripttaal analyseert de query op bepaalde sleutelwoorden. Deze sleutelwoorden zijn in het systeem dat ik geconstrueerd heb: geboortedatum, sterftedatum, munteenheid, hoofdstad. Als ´e´en van deze woorden gevonden wordt, wordt de rest van de query geanalyseerd. Stel dat de gebruiker de vraag stelt: “Wat is de hoofdstad van Nederland?”. Hierin wordt het woord “hoofdstad” herkend. Op basis van dit woord, wordt gekeken welk land of welke provincienaam ingegeven is. In het bovenstaande voorbeeld is dit woord te vinden door met behulp van reguliere expressies te zoeken naar de constructie van het woord “van” gevolgd door ´e´en of meerdere woorden die beginnen met een hoofdletter. Als ´e´en of meerdere woorden met een hoofdletter gevonden zijn, kan er vanuit gegaan worden dat dit het land of de provincie is waar de gebruiker de hoofdstad van wil hebben. Dezelfde reguliere expressies kunnen ook toegepast worden op vragen waar gevraagd wordt naar de geboortedata en sterftedata van personen of munteenheden van landen. Als eenmaal de persoon of het land gevonden is, kan een XSL-bestand worden aangemaakt. Dit bestand wordt niet fysiek aangemaakt omdat dit, als het QA-systeem vele bezoekers krijgt, veel ruimte kost op de server en het op deze manier mogelijk is dat meerdere gebruikers die op hetzelfde moment een vraag stellen, eenzelfde antwoord krijgen op andere vragen. Om dit te voorkomen wordt het XSL-bestand per gebruiker opgebouwd en in het geheugen geladen. Het XSL-bestand wordt opgebouwd met hierin de XPath-query die de juiste gegevens uit een vooropgezet XML-bestand moet halen. Dit XML-bestand is geen standaard XML-bestand dat aanwezig is in het Wikipedia XML-corpus. Door middel
4.1
Online QA-systemen
37
van de XQueries die geconstrueerd zijn in hoofdstuk drie, zijn vier grote XML-bestanden ontstaan. In deze bestanden zijn alle geboortedata, sterfedata, valuta en hoofdsteden te vinden die in Wikipedia aanwezig zijn. Op basis van de XPath-query die is gecre¨eerd, wordt ´e´en van deze XMLbestanden doorzocht. Het is ook mogelijk om de gehele collectie Wikipedia XML-bestanden te doorzoeken met de XPath-query maar hier is niet voor gekozen omdat de gebruiker erg lang moet wachten totdat een eventueel antwoord getoond wordt. Met behulp van de vier gecre¨eerde XML-bestanden gaat het zoeken vele malen sneller. Het antwoord dat de gebruiker wil hebben, verschijnt in HTML-vorm op het beeldscherm van de gebruiker na een succesvolle parsing van het XSL-bestand met het XML-bestand. De structuur van een QA-systeem op basis van de XSL-methode, is op de volgende pagina weergegeven. De bijbehorende code voor het XSL-systeem is te vinden in bijlage I. Een QA-systeem op basis van XSL heeft, net als andere QA-systemen, voor en nadelen. Het eerste voordeel van bovenstaand systeem is dat het systeem op gestandaardiseerde wijze informatie extraheert uit een gestructureerde Knowledge Base. In tegenstelling tot het systeem van onlineinformatie-extractie is het niet mogelijk dat de structuur waaruit de informatie moet worden gehaald, veranderd. De creatie van de Knowledge Bases is echter een probleem. Het systeem maakt namelijk gebruik van Knowledge Bases die offline zijn aangemaakt. De Knowledge Bases zijn ontstaan door bijvoorbeeld alle geboortedata uit het gehele Wikipedia XML-corpus te halen met behulp van de eerder ontwikkelde XQueries. Het voordeel van de methode van offline-Knowledge Base-creatie is dat de gebruiker die een query invoert in het online-systeem, geen last heeft van lange wachttijden. Alle informatie is namelijk al door de XQueries in ´e´en bestand gezet dat van toepassing is op het query-onderwerp van de gebruiker. Nadeel van deze offline-creatie van Knowledge Bases is dat er veel extra tijd gaat zitten in het cre¨eeren van XQueries voor elk mogelijk te bedenken onderwerp. Een ander nadeel dat het XSL-systeem heeft ten opzichte van het eerder genoemde online-informatie-extractie-systeem is de kwaliteit van de gegevens. De Wikipedia XML-bestanden worden niet direct vervangen als een gebruiker in Wikipedia een artikel gewijzigd heeft. Dit heeft als gevolg dat nieuwe geboorte en sterftedata niet in het systeem te vinden zijn. De Wikipedia XML-bestanden zijn niet up-to-date.
4.1
Online QA-systemen
Figuur 1: QA-systeem op basis van XSL
38
4.2
De eXist-methode
4.2
De eXist-methode
4.2.1
39
Benodigdheden
Een database is als systeem een goede manier om data gestructureerd te bewaren. In de vorige twee systemen werd geen gebruik gemaakt van een database. De eXist-methode maakt w´el gebruik van een database om data in op te slaan en maakt gebruik van XQuery om relevante data uit de database te halen en terug te geven aan de gebruiker. Er zijn vele soorten databases te vinden die gebruikt kunnen worden om data in op te slaan. Voor het eXist-systeem is gekozen voor de XMLdatabase eXist21 . Deze open-source database is gespecialiseerd in het opslaan van XML-bestanden. De Wikipedia XML-bestanden staan in het XML-formaat en het is daarom een logische keuze om te kiezen voor de eXist-database. De database moet voor de gebruiker online te benaderen zijn en om dit te kunnen realiseren is er een webserver nodig. Er is keuze uit vele webservers waaronder Apache, Zope, Domino en Sun ONE. Apache en Zope zijn open-source webservers en voor gebruik van deze webservers hoeft niet betaald te worden. Bij Domino22 , een product van IBM, en Sun ONE23 moet w´el betaald worden om gebruik te kunnen maken van deze webservers. Op de website van de eXist-database is informatie te vinden over het gebruik van eXist in combinatie met de Apache Tomcat webserver24 . Vanwege deze aanwezige informatie, is gekozen om Apache Tomcat te gebruiken voor de constructie van het QA-systeem. Apache Tomcat is een uitbreiding op de Apache webserver die ervoor zorgt dat Java Server Pages(JSP) en Java Servlets benaderd kunnen worden via het web. Dit betekent dat programma’s geschreven in de programmeertaal Java benaderd en uitgevoerd kunnen worden via een website. Voor het eXist-systeem zal geen gebruik worden gemaakt van servlets of JSP-pagina’s maar van XQuery-scripts. Deze scripts kunnen door middel van Tomcat en eXist online uitgevoerd worden. 4.2.2
De werking van het eXist-systeem
De elementen waaruit het eXist-syteem bestaat zijn redelijk eenvoudig met elkaar te verbinden. Hieronder staat grafisch uitgelegd hoe het systeem werkt. 21
http://exist.sourceforge.net/ http://www-306.ibm.com/software/lotus/sw-atoz/ 23 http://www.sun.com/software/sunone/ 24 http://tomcat.apache.org/ 22
4.2
De eXist-methode
Figuur 2: De werking van het eXist-systeem
40
4.2
De eXist-methode
41
In het systeem wordt door de gebruiker een query ingevuld. Deze query wordt vervolgens geanalyseerd met behulp van reguliere expressies. Deze expressies zorgen ervoor dat stopwoorden en vraagwoorden worden verwijderd en dat alleen de sleutelwoorden (keywords) overblijven. Met behulp van deze sleutelwoorden wordt een XQuery opgebouwd die het juiste antwoord moet extraheren uit een eXist-database. De XQuery wordt uitgevoerd op de eXist-database. De gegevens die uit de database terugkomen worden aan de gebruiker getoond als antwoord. Het systeem dat hierboven beschreven staat, is erg compact en kan gezien worden als het basissysteem. Dit systeem kan uitgebreid worden met meer functies zoals het ranken van antwoorden. 4.2.3
Het eXist-systeem en Wikipedia-XML
In de vorige subparagraaf is de werking van het eXist-systeem uitgelegd. Deze paragraaf gaat over het eXist-systeem in combinatie met XQuery en de Wikipedia XML-bestanden. Alle programmeercode is te vinden in bijlage II. Het QA-systeem op basis van eXist werkt zoals bijna elk QA-systeem. De gebruiker typt een vraag in en krijgt het antwoord terug. De gegevens worden gehaald uit een eXist-database. Deze eXist-database bestaat uit de Wikipedia XML-bestanden. In het systeem dat ontwikkeld is, is gebruik gemaakt van een eXist-database met daarin een collectie van ongeveer 4000 Wikipedia XML-bestanden. De collectie bestaat uit willekeurige Wikipediaartikelen, artikelen met geboortedata, sterftedata, hoofdsteden, valuta en artikelen over bands. De artikelen over geboortedata, sterftedata, valuta en hoofdsteden zijn verkregen met behulp van de XQueries uit het vorige hoofdstuk De artikelen over bands zijn verkregen met behulp van een nieuwere Wikipedia XML-collectie. Het verschil tussen de “oude” en “nieuwe” Wikipedia XML-bestanden is dat in de “nieuwe” bestanden niet elke zin meer getagged is met de <s id=“”>-tag. Ook wordt er een document bij de collectie geleverd met hierin de categorie¨en waar het artikel in geplaatst kan worden. Het begin van dit document ziet er als volgt uit: 1,4885 1,5870 1,6654 De betekenis van deze getallen kan als volgt worden ge¨ınterpreteerd: Het eerste getal is de naam van het XML-bestand, in dit geval “1.xml”. Het getal achter de komma is het getal van de categorie waarin dit document thuis hoort. In het document “categoriename.csv” is vervolgens de naam op te
4.2
De eXist-methode
42
zoeken van de categorie. Met behulp van een Perl-script is een nieuw document gemaakt met een opmaak die eenvoudiger te lezen is. Dit document laat het documentnummer zien en de naam van de bijbehorende categorie. De opmaak van dit document is als volgt: 1,duits architect 1,duits persoon in de tweede wereldoorlog 1,nazi Een ander Perlscript zorgt ervoor dat de gebruiker een woord in kan typen en dat alle documenten die het ingetypte woord in de categorienaam bevatten, gekopie¨erd worden naar een aparte directory. Op deze manier is het eenvoudiger om bijvoorbeeld alle Wikipedia XML-bestanden met in de categorie het woord “zanger”, gegroepeerd te krijgen in ´e´en directory. Deze directory kan vervolgens toegevoegd worden aan een eXist-database. Deze methode is gebruikt om documenten die de categorienaam “band” bevatten, toe te voegen aan de eXist-database. De documenten in de eXist-database moeten kunnen worden doorzocht. Dit gebeurt met behulp van XQuery. De queries uit hoofdstuk drie zijn niet voldoende om de juiste antwoorden uit de Wikipedia XML-bestanden te extraheren. Met behulp van ´e´en XQuery-script is geprobeerd om de antwoorden uit de eXist-database te halen. Hoe werkt dit XQuery-script? Allereerst wordt de query van de gebruiker ingelezen vanuit HTML. De voorbeeldquery die gebruikt wordt om de werking van het XQuery-script uit te leggen is: “Wie is de zanger van Coldplay?”. Het juiste antwoord op deze vraag is: “Chris Martin”. Nadat de query is ingelezen, wordt geprobeerd het onderwerp uit de query te halen. Als eerste worden de woorden verwijderd die niet kunnen dienen als onderwerp of sleutelwoord. Lidwoorden en de woorden ’hoe’, ’wanneer’, ’wat’, ’wie’, ’is’, ’van’ en het vraagteken worden verwijderd uit de query. De woorden die uit de oorspronkelijke query overblijven, zijn ’zanger’ en ’Coldplay’. E´en van deze twee sleutelwoorden moet het onderwerp van de zin zijn. Er wordt op een eenvoudige wijze gekozen tussen de overgebleven woorden door te kijken welk woord met een hoofdletter begint, ’Coldplay’ dus. De overgebleven sleutelwoorden worden in een array gezet en zullen later gebruikt worden. Het gebouwde QA-systeem op basis van eXist gaat er vanuit dat er enkel queries ingevoerd worden waarin het subject begint met een hoofdletter en dit woord aan het einde van de query staat. Nadat het onderwerp en de sleutelwoorden in de query gevonden zijn, worden de sleutelwoorden bekeken. Door middel van stringmatching wordt
4.2
De eXist-methode
43
gekeken of de array van sleutelwoorden ´e´en van de woorden “geboortedatum”, “sterftedatum”,“stierf”, “valuta”, “munteenheid” of “hoofdstad” bevat. Als ´e´en van deze woorden gevonden is, wordt het Wikipedia XMLbestand doorzocht met behulp van XQuery. Indien er een antwoord gevonden wordt, wordt deze aan de gebruiker getoond. Is er geen antwoord gevonden dan krijgt de gebruiker te zien dat er geen antwoord gevonden is. Deze methode is geschikt voor vragen die te maken hebben met geboortedata, sterftedata, valuta en hoofdsteden. Maar hoe wordt de vraag over “Coldplay” beantwoord? Nadat het onderwerp in de query gevonden is, kan de eXist-database benaderd worden met behulp van een “brede” benadering. Deze “brede” benadering houdt in dat er wordt gezocht in ´alle documenten in de eXist-database op de sleutelwoorden en het onderwerp. Alle artikelen die de sleutelwoorden en het onderwerp bevatten, worden als ´e´en artikel beschouwd en alle zinnen in dit artikel worden in een array gezet. Vervolgens wordt deze array met zinnen opnieuw doorzocht op de sleutelwoorden en het onderwerp. Indien er zinnen aanwezig zijn in de array met zowel de sleutelwoorden als het onderwerp dan worden deze zinnen als antwoord beschouwd en teruggegeven aan de gebruiker. Indien er geen matches gevonden worden in de brede benadering, wordt er nauwer gezocht. Elk Wikipedia XML-bestand in de eXist-database heeft als eigenschap dat het onderwerp van het artikel getagged is met de tag
5
Testen en verbeteren van de QA-systemen
In dit hoofdstuk zullen het XSL-systeem en het eXist-systeem getest worden. Bij de testen zal er gekeken worden naar het aantal resultaten dat teruggegeven wordt en het aantal juist beantwoorde vragen dat als resultaat getoond wordt.
5.1
CLEF-vragen
Een QA-systeem kan het beste getest worden met behulp van vragen omdat het systeem gemaakt is om vragen als input te krijgen van gebruikers. Vragen die geschikt zijn voor het testen van de gebouwde QA-systemen zijn de zogeheten CLEF-vragen. CLEF staat voor Cross-Language Evaluation Forum. Deze conferentie wordt elk jaar gehouden en heeft als doel: “to assist and stimulate the development of European cross-language retrieval systems in order to guarantee their competitiveness on the global marketplace 25 .” Het onderdeel Question Answering is in 2003 voor het eerst op de conferentie toegevoegd. Deelnemers van het Question Answering-onderdeel krijgen een lijst vragen die beantwoord moeten worden met behulp van een vast corpus. Voor het testen van de beide geconstrueerde QA-systemen wordt gebruik gemaakt van de CLEF-vragen van 2003 en 2006. Omdat niet alle vragen door de geconstueerde systemen beantwoord kunnen worden, is er een selectie gemaakt van vragen waarvan verwacht wordt dat zowel het XSL-systeem als het eXist-systeem deze vragen kunnen beantwoorden. Dit zijn vragen op het gebied van geboortedata, sterftedata, hoofdsteden en valuta. Vragen op het gebied van bands zijn alleen aan het eXist-systeem gesteld. Alle vragen die gesteld zijn aan de systemen kunnen worden teruggevonden in bijlage III.
25
http://www.clef-campaign.org/ (op 19-12-2006)
44
5.2
Resultaten van beide systemen
5.2
Resultaten van beide systemen
5.2.1
45
CLEF 2003
Van de CLEF-vragen uit 2003 zijn in totaal twaalf vragen gesteld aan beide systemen. De resultaten zijn:
XSL-systeem eXist-systeem
Aantal Teruggegeven Resultaten 7 11
Aantal Juiste Resultaten 7 10
Tabel 1: Resultaten CLEF 2003 vragen De resultaten van het XSL-systeem op de CLEF-vragen zijn niet indrukwekkend. Het aantal resultaten valt tegen vanwege de trema’s die voorkomen in de gestelde vraag. De trema’s in deze vragen worden niet herkend door het XSL-systeem en dit heeft als resultaat dat landen als Maleisi¨e en Kroati¨e vertaald worden naar Maleisie en Kroatie. Deze landen staan m`et trema’s wel in de Knowledge Base maar zonder trema’s niet. Dit kan echter met een verandering van het type encoding worden opgelost. Het eXist-systeem werkt beter dan het XSL-systeem als de CLEF-vragen uit 2003 gesteld worden. De twee vragen die niet beantwoord konden worden door het eXist-systeem waren de vraag van de Chinese munteenheid en de vraag in welk land Bosni¨e ligt (een vreemde vraag aangezien Bosni¨e zelf een land is). De vraag van de Chinese munteenheid kan echter w´el beantwoord worden door de vraag anders te stellen namelijk als: “Wat is de munteenheid van China?”. Het antwoord dat teruggegeven werd op de vraag over Bosni¨e was het artikel over Bosni¨e. De gebruiker moest in dit artikel zelf het antwoord vinden (dit is echter onmogelijk vanwege de onjuistheid van de vraag). 5.2.2
CLEF 2006
Uit de CLEF-vragen uit 2006 is, net als de CLEF-vragen uit 2003, een selectie gemaakt van vragen die van toepassing zijn op de gebieden geboortedata, sterftedata, hoofdsteden en valuta / munteenheden. Na de selectie zijn er van de 200 vragen maar zeven vragen die betrekking hebben op ´e´en van de genoemde gebieden. De vraagstelling is aangepast om de kans op een juist resultaat te vergroten. Vragen als “Wanneer leefde....” zijn opgesplitst in twee deelvragen namelijk “Wat is de geboortedatum van ...?” en “Wat is de
5.2
Resultaten van beide systemen
46
sterftedatum van.....?”. Het totaal aantal gestelde vragen aan elk systeem is hiermee op tien.
5.2
Resultaten van beide systemen
47
De resultaten zijn:
XSL-systeem eXist-systeem
Aantal Teruggegeven Resultaten 3 3
Aantal Juiste Resultaten 3 3
Tabel 2: Resultaten CLEF 2006 vragen Beide systemen beantwoorden maar drie van de tien vragen correct namelijk de vraag over het sterftejaar van Glenn Gould en de vraag over de sterftedatum van Martin Luther King. Dit komt overeen met een recall van dertig procent. Als reden voor deze lage recall van beide systemen kan het aantal documenten in de testset genoemd worden. In de testset is geen informatie te vinden over bijvoorbeeld Gottlob Frege. Een vraag over de geboortedatum of sterftedatum van Gottlob Frege is door het systeem daarom niet te beantwoorden. De recall van het systeem zal vergroot moeten worden.
5.3
Een grotere vragenlijst
5.3
Een grotere vragenlijst
48
De relevantie van de resultaten die behaald zijn met CLEF 2003 en CLEF 2006 vragen is gering vanwege het kleine aantal vragen dat gesteld werd aan het ontwikkelde QA-systeem. Om die reden is een vragenlijst met 101 vragen ontwikkeld. Deze vragen zijn van verschillende internetpagina’s gehaald of zelf bedacht. De vragen zijn persoonsvragen, hoofdstedelijke vragen en muziekvragen. De gehele vragenlijst is te vinden in de bijlage (bijlage III) van deze scriptie. Er is besloten om alleen te testen in het eXist-systeem omdat dit systeem als het belangrijkste QA-systeem beschouwd kan worden en omdat eventuele verbeteringen van het QA-systeem niet in twee systemen doorgevoerd hoeven te worden maar in ´e´en enkel systeem. De resultaten van de geconstrueerde vragen: Vraagtype Hoofstedelijk Geboortedata Sterftedata Muziek Totaal
Juist Resultaat 29 7 1 6 43
Fout Resultaat 2 0 0 1 4
Geen Resultaat 11 14 17 13 55
Totaal 42 21 18 20 101
Tabel 3: Resultaten zelfgeconstrueerde vragenlijst Met ’Juist resultaat’ wordt een resultaat bedoeld dat het juiste antwoord op de query gevonden is, met ’Fout resultaat’ wordt een antwoord bedoeld dat wordt teruggegeven maar niet correct is en met ’Geen resultaat’ wordt bedoeld dat er geen antwoord teruggegeven is (’Geen antwoord gevonden’). 5.3.1
De recall en precisionwaarde
Om het QA-systeem goed te kunnen beoordelen is het nodig dat de precision (de fractie van het aantal opgehaalde documenten dat relevant is) en de recall (het percentage van de set relevante documenten die is gevonden) van het QA-systeem worden uitgerekend. Met behulp van de benodigde formule’s26 zijn de precision en recall van het systeem te berekenen:
26 Baeza-Yates Berthier Ribeiro-Neto, ’Modern Information Retrieval’, pp 75, Londen 1999.
5.4
Verbeteringen
49
Figuur 3: Precision-formule De berekening voor precision is: 43 / 46 = 0,935
Figuur 4: Recall-formule De berekening voor de recall is: 43 / 101 = 0,426. Uit deze berekeningen blijkt dat het systeem een precision van 93,5% en een recallwaarde van 42,6% heeft. Er moet bij dit resultaat wel in ogenschouw genomen worden dat het aantal juiste antwoorden gedeeld zijn door het totaal aantal vragen van 101 in plaats van het aantal teruggegeven antwoorden (“juist” + “fout resultaat”) van 46. Een hogere recallwaarde van 91% zou het resultaat zijn als dit laatste gebeurd zou zijn. Dit geeft echter een vertekend beeld van de recall van het QA-systeem. De precisionwaarden van het systeem zijn hoger dan de recallwaarden omdat de antwoorden d´ıe teruggegeven werden bijna altijd het juiste antwoord bevatten.
5.4
Verbeteringen
Een QA-systeem met een recallwaarde van 42,6% is nauwelijks te gebruiken. Van elke tien vragen zijn er maar vier antwoorden correct. Het systeem moet verbeterd worden met als einddoel de recallwaarde te verhogen. Het probleem van het gebouwde QA-systeem is de beperkte testset. De set is te klein om antwoorden te vinden op alle mogelijke vragen. Een mogelijke manier om de recallwaarde te verhogen is om de testset uit te breiden door alle Wikipedia-XML-artikelen in de eXist-database te zetten.
5.4
Verbeteringen
50
Dit is echter makkelijker gezegd dan gedaan. De grote hoeveelheid artikelen die opgenomen moeten worden in de database zorgen ervoor dat de snelheid van de antwoordretrieval afneemt. Ook de hoeveelheid computergeheugen die ingezet moet worden om aan een query-request te voldoen, groeit. Het resultaat van een grotere testset is dat de algehele snelheid van het systeem drastisch zal dalen. De gebruiksvriendelijkheid van het systeem daalt hiermee ook. Een gebruiker die vijf minuten moet wachten op een goed antwoord is minder tevreden dan een gebruiker die na ´e´en seconde een fout antwoord krijgt op zijn/haar gestelde vraag. Het uitbreiden van de testset door Wikipedia-XML-bestanden toe te voegen aan de eXist-database is geen optie. Dit alles toont aan dat een eXist-systeem voor grote testsets niet geschikt is. Er zullen in de toekomst verbeteringen in eXist moeten worden aangebracht of er moet een ander systeem ontwikkeld worden die wel geschikt is om grote XML-datasets in op te slaan. Een andere manier om de recallwaarde te vergroten is door de testset te vergroten met behulp van online documenten. Omdat Wikipedia-bestanden online beschikbaar zijn, kan de testset worden uitgebreid door binnen het online Wikipedia-domein te zoeken naar het juiste antwoord. Deze online-retrievalmethode is in paragraaf 4.1 uitgelegd. Het nadeel van deze online-retrievalmethode was dat de URL van het artikel ’geraden’ werd. Het voorstel is om het QA-systeem aan te passen door de online-retrievalmethode in te bouwen in het bestaande QA-systeem op basis van eXist. De online-retrieval wordt alleen gebruikt als het eXist-systeem geen antwoord teruggegeven heeft. Het nadeel van de online-retrievalmethode wordt op deze manier verkleind omdat de kans op een teruggegeven antwoord wordt vergroot. 5.4.1
Het verbeterde eXist-systeem
Het bestaande QA-systeem werkt op basis van eXist en XQuery. Bij deze twee elementen zou de scripttaal PHP gevoegd kunnen worden om er op deze manier voor te zorgen dat informatie uit het online Wikipedia-domein gehaald kan worden. Het probleem is echter dat de XQuery-taal nog lang niet “volwassen” is. Hiermee wordt bedoeld dat de functies die aangeroepen kunnen worden in XQuery beperkt zijn. Een samenwerking tussen PHP en XQuery is op het moment van schrijven nog niet beschikbaar vandaar dat er een andere manier gevonden moet worden. Deze manier is echter eenvoudiger dan gedacht. Het is voor XQuery namelijk mogelijk om de informatie van een URL uit te lezen met behulp van de FLOWR-syntax. Als voorbeeld is het artikel over de maan genomen. De
5.4
Verbeteringen
51
URL voor dit artikel in Wikipedia is: http://nl.wikipedia.org/wiki/Maan. De FLOWR-syntax die de informatie van de URL uitleest, is: $subject := “Maan” $adress := concat(“http://nl.wikipedia.org/wiki/”,$subject) for $text in doc($adress) return $text De teruggegeven HTML-code kan worden geanalyseerd op de aanwezigheid van de opgegeven keywords en het onderwerp. Hieruit kan vervolgens een mogelijk antwoord worden gehaald. Het is overigens wel nodig om de HTML-namespace bovenin het XQuery-document te declareren zodat de HTML gezien wordt als geldige, werkbare, code. De bovenstaande methode werkt uitsluitend voor onderwerpen die niet ambigu zijn. Een goed voorbeeld die het probleem van ambigue onderwerpen dekt, is de query: “Wat is de hoofdstad van Groningen?”. In de testset is geen artikel te vinden met als titel/onderwerp “Groningen”. Als er vervolgens gezocht wordt in het online Wikipedia-domein met behulp van de URL “http://nl.wikipedia.org/wiki/Groningen”, verschijnt er een zogenaamde doorverwijspagina. Op deze pagina staan alle mogelijke onderwerpen die te maken hebben met het woord “Groningen”. Het antwoord op de gestelde query is op deze pagina echter niet te vinden. Een oplossing voor dit probleem is een zogenaamde deepsearch-methode. Met behulp van deze deepsearch-methode wordt het eerste artikel waarnaar wordt verwezen op de doorverwijspagina doorzocht op een mogelijk antwoord. De rest van de artikelen waarnaar wordt doorverwezen wordt niet doorzocht. Een gevonden antwoord wordt aan de gebruiker teruggegeven. Indien er geen antwoord gevonden wordt in het eerst gegeven artikel, krijgt de gebruiker te zien dat er geen antwoord op zijn vraag is gevonden. 5.4.2
Recall van het verbeterde systeem
Het doel van de verbeteringen, die aangebracht zijn in het “oude” eXistsysteem, was om de recallwaarde te verhogen. In deze paragraaf wordt met behulp van de vragenlijst van 101 vragen deze recallwaarde opnieuw uitgerekend. De syntax van de vragen die gesteld zijn, is niet veranderd. (de vragen dienen nog steeds te eindigen met het onderwerp, beginnend met een hoofdletter). De vragen die in de vorige recalltest juist beantwoord waren, zijn niet opnieuw aan het systeem gesteld omdat deze vragen immers al het juiste antwoord teruggaven.
5.4
Verbeteringen
52
De resultaten van het verbeterde systeem: Vraagtype Hoofstedelijk Geboortedata Sterftedata Muziek Totaal
Juist Resultaat 38 14 9 8 69
Fout Resultaat 3 7 8 3 21
Geen Resultaat 1 0 1 9 11
Totaal 42 21 18 20 101
Tabel 4: Resultaten verbeterde eXist-systeem Zoals te zien is in de bovenstaande tabel is het aantal juist teruggegeven antwoorden gestegen van 43 naar 69. Het totaal aantal foute antwoorden is gestegen van 3 naar 21. Dit betekent dat de precision van het systeem gedaald is van 43/46 = 93% naar 69/90 = 77%. Er moet een kanttekening worden gemaakt bij het aantal foute antwoorden dat teruggegeven is. Het Nederlandstalige Wikipedia-domein is veel kleiner dan het Engelstalige domein. Vanwege het ontbreken van artikelen over bepaalde onderwerpen, is de kans dat het antwoord op een vraag gevonden kan worden in het Nederlandstalige domein kleiner dan wanneer er wordt gezocht in het Engelstalige domein. Er zijn in totaal 13 vragen gesteld over een onderwerp waarvan (op moment van schrijven) geen artikel in het Nederlandse domein bestaat. Deze dertien vragen geven een enigszins vertekenend beeld van de behaalde resultaten. De recall van het verbeterde systeem in het geheel is: 69/101 = 0,68 = 68% Na het verbeteren van het systeem is inderdaad de recall van het systeem gegroeid van 42,6% naar 68%. Interessanter is het echter om de recallstijging per vraagtype te bekijken. In de onderstaande tabel is duidelijk te zien dat de recallstijging aanzienlijk is: De percentuele toename van de recall bij de sterftedata is aanzienlijk. Als in ogenschouw wordt genomen dat acht vragen van het type ‘sterftedata’ geen artikel in het Nederlandstalige Wikipedia-domein bevatten, wordt de stijging nog groter. Het totaal aantal vragen wordt teruggebracht van 18 naar 10 en de oude en nieuwe recall worden respectievelijk 10% en 90%. Dit houdt een stijging van maar liefst 80% in.
5.4
Verbeteringen
Vraagtype Hoofstedelijk Geboortedata Sterftedata Muziek
53
Oude recall 29/42=69% 7/21=33% 1/18=6% 6/20=30%
Nieuwe recall 38/42=90% 14/21=66% 9/18=50% 8/20=40%
Verschil +21% +33% +44% +10%
Tabel 5: Recall veranderingen De recall van het QA-systeem kan verder omhoog geschroefd worden. Om een hoge recall te krijgen van meer dan 90% moeten er echter drastische veranderingen in de structuur van de Wikipedia-XML-bestanden worden aangebracht. Omdat deze veranderingen buiten de scope van dit onderzoek vallen, zal hier verder geen aandacht aan besteed worden. W´el zal in het volgende hoofdstuk uitgelegd worden wat punten van verbetering zijn en wat interessante onderwerpen zijn voor vervolgonderzoek op het gebied van Question Answering en Wikipedia.
6
Toekomstig onderzoek
Na de constructie van het QA-systeem op basis van eXist, is duidelijk geworden dat er op het gebied van Question Answering nog veel mogelijkheden zijn voor toekomstig onderzoek. Ook op het gebied van XQuery zijn veel verbeteringen door te voeren. In dit hoofdstuk zal ik toelichten welke verbeteringen nodig zijn op zowel het gebied van de Question Answering als de XQuery-taal.
6.1
XQuery-verbeteringen
De XQuery-taal is een taal die nog in de kinderschoenen staat. Veel functies die in een “normale” programmeertaal aanwezig zijn, moeten op moment van schrijven, zelf worden geconstrueerd. Dit maakt XQuery erg onvriendelijk in het gebruik. Bij een Question Answering-systeem is tekstanalyse / vraaganalyse een belangrijk onderdeel. De XQuery-taal heeft de mogelijkheid om reguliere expressies op teksten los te laten maar het aantal standaard functies op het gebied van reguliere expressies is klein. Er zijn drie functies aanwezig op dit vlak, namelijk matches(), replace() en tokenize(). Met behulp van deze functies is het mogelijk om goede tekstanalyse toe te passen op queries. Bij de ontwikkeling van het eXist-systeem, heb ik echter gebruik gemaakt van zelfgeconstueerde functies die ik graag al standaard ge¨ımplementeerd gezien had in de XQuery-taal. Ik denk dat door het ontbreken van uitgebreide functies de gebruiksvriendelijkheid van het algehele Question Answering-systeem achteruit is gegaan. Een goed voorbeeld hiervan is te zien in het eXist-systeem op het gebied van de query. Deze query moet eindigen op het onderwerp en dit onderwerp moet ook nog met een hoofdletter beginnen. De gebruiksvriendelijkheid van het gehele systeem gaat door een vaste syntax van de query achteruit. Het aantal teruggegeven resultaten is door een vaste syntax echter niet achteruit gegaan omdat het onderwerp in alle gevallen is ge¨extraheerd uit de query. Omdat mijn onderzoek vooral een proof-of-concept-onderzoek was, heb ik weinig te maken gehad met usability maar voor toekomstig onderzoek is het verstandig om andere querytalen in ogenschouw te nemen en de ontwikkeling van de uitbreiding van de XQuery-functionaliteit op de voet te volgen.
6.2
Onderzoeksgebieden
Onderzoek op het gebied van Question Answering en/of Wikipedia zal de komende jaren blijven bestaan. Ik denk dat met dit proof-of-concept-onderzoek
54
6.2
Onderzoeksgebieden
55
een basis is gelegd om uitgebreider onderzoek te ondersteunen. Er zijn nog vele gebieden binnen de Question Answering die onderzocht kunnen worden. Ik deze paragraaf zal ik toelichten wat belangrijke punten zijn op dit onderzoeksgebied. 6.2.1
Usability
In mijn onderzoek is geen aandacht besteed aan de usability van het ontwikkelde QA-systeem. Vervolgonderzoek op het gebied van usability houdt in dat de gebruiksvriendelijkheid van het systeem en alle onderdelen hiervan worden getest op punten als werkbaarheid, snelheid, layout en feedback. De QA-systemen die op dit moment populair zijn, zoals START, geven vele antwoorden terug. Onderzoeksvragen van usabilitystudies kunnen ingaan op de weergave van deze vele antwoorden. Is het voor de gebruiker niet beter om ´e´en enkel antwoord te zien? Op het vlak van snelheid kan het ontwikkelde systeem getest worden ten opzichte van andere QA-systemen. Dit kan echter alleen gebeuren mits het eXist-systeem een hogere precision krijgt en een grotere dataset (bij voorkeur alle Wikipedia-XML-bestanden) bevat. Zoals eerder is besproken in dit onderzoek zal de snelheid van het eXist-systeem achteruit gaan wanneer er grotere datasets gebruikt worden. 6.2.2
Infrastructuur
De infrastructuur van het eXist-systeem bestaat uit een Tomcat-webserver die werkt in combinatie met een eXist-database en gegevens worden ge¨extraheerd middels XQuery. Er zijn nog veel meer infrastructuren mogelijk waarmee een QA-systeem kan worden geconstrueerd. Een vervolgonderzoek kan verschillende infrastructuren maken, testen en vergelijken. Op deze manier zal er een beter beeld ontstaan over de onderdelen waaruit een goedwerkend QA-systeem zal moeten bestaan. Een onderdeel waar weinig tot geen aandacht aan is besteed in dit onderzoek, is de RDF27 -structuur. Met behulp van het RDF-datamodel is het mogelijk om ontologi¨en te ontwikkelen. Met een ontologie wordt bedoeld: “an ontology is an explicit and formal specification of a conceptualization” 28 27
RDF: Resource Description Framework T. R. Gruber, ’A translation approach to portable ontologies’, ’Knowledge Acquisition’ 5(2):199-220, 1993 28
6.2
Onderzoeksgebieden
56
Een belangrijk kenmerk van een ontologie is dat relaties kunnen worden weergegeven. Deze relaties kunnen in het RDF-datamodel worden ge¨ımplementeerd. V¨olkel e.a29 hebben leggen in het artikel ’Semantic Wikipedia’ uit hoe dit het beste gebeuren kan. Ze stellen voor een extensie op Wikipedia te implementeren zodat het linksysteem makkelijk uitgebreid kan worden. Het resultaat van deze implementatie is dat, wanneer toegepast op de Wikipedia-XML-bestanden, er veel complexere queries gesteld kunnen worden aan het QA-systeem op basis van eXist. Ik pleit voor een vervolgonderzoek dat gericht is op de conversie van de huidige Wikipedia-XMLbestanden naar bestanden met hierin de RDF-structuur. Op deze manier kunnen steden getagged worden met een
Bedrijfskundige gebieden
Naast onderzoeksgebied op technisch vlak is het ook mogelijk om de bedrijfskundige kant van een QA-systeem te onderzoeken. De impact van een zoekmachine als Google op de wereldmarkt is enorm. Omdat QA-systemen anno 2007 nog geen grote markt bezetten, kan in vervolgonderzoek gekeken worden op welke manier de nichemarkt30 van de QA-systemen kan worden veroverd. Vragen als: “Welke strategie kan ervoor zorgen dat een ontwikkeld QA-systeem een groot marktaandeel verovert?” en “Wat is de overlevingskans van een QA-systeem in de markt van internetzoekmachines?” zijn goede vragen die door toekomstig onderzoek kunnen worden beantwoord.
29
Max V¨ olkel e.a, ’Semantic Wikipedia’, Karlsruhe, Germany 2006. Nichemarkt / niche: een specifiek, afgebakend, bewerkbaar deel van een markt met minder concurrentie dan de hoofdmarkt. 30
Conclusie Na het maken van twee verschillende QA-systemen met behulp van XSL, XQuery en eXist, is het mogelijk om antwoord te geven op de onderzoeksvraag: Op welke wijze kan een Question-Answeringsysteem ontwikkeld worden, met Wikipedia (XML-bestanden) als Knowledge Base, die de juiste antwoorden teruggeeft op vragen die betrekking hebben op onder andere geboortedata, sterftedata en geografische plaatsen? Het antwoord op deze vraag kan niet ´e´enduidig beantwoord worden. Van de geteste systemen gaven namelijk zowel het XSL QA-systeem als het eXist QA-systeem juiste antwoorden terug. Beide systemen zijn dus geschikt om juiste antwoorden terug te geven op het gebied van geboortedata, sterftedata en geografische locaties. Als er echter een keuze gemaakt moet worden bij de ontwikkeling van een QA-systeem, dan pleit ik voor de keuze van het eXist-systeem op basis van de volgende punten: 1. Het eXist QA-systeem maakt gebruik van database en heeft hierdoor meer structuur. 2. Een eXist-database is makkelijker uit te breiden met nieuwe XMLbestanden. Willen de bovengenoemde punten zeggen dat een QA-systeem op basis van eXist de beste keuze is voor de ontwikkeling van een QA-systeem? Nee. Er zijn vele alternatieven aanwezig die net zo goed of zelfs beter werken dan een QA-systeem op basis van eXist. De eXist-database heeft een performance-drop als er in de database meer dan 2000 documenten voorkomen. Het is daarom belangrijk om in het ontwikkeling van een nieuw QA-systeem na te gaan of deze meer of minder dan 2000 documenten zal gaan bevatten. Een uitgebreid QA-systeem op basis van Wikipedia XMLbestanden zal de grens van 2000 documenten ruim overschreiden en het is daarom beter om, wanneer alle Wikipedia XML-bestanden in de dataset worden opgenomen, geen gebruik te maken van de eXist-database. Alternatieve databases die gebruikt kunnen worden zijn PostgreSQL, MySQL, Oracle DB. Deze databases zijn echter niet gespecialiseerd in XML-datasets. Op moment van schrijven is de Universiteit van Amsterdam bezig met de ontwikkeling van een database die w´el gemaakt is voor XML-bestanden. De performance van dit systeem is echter nog niet bekend. 57
Conclusie
58
Een ander punt voor het niet gebruiken van XSL of XQuery, zijn het aantal standaard functies voor reguliere expressies die aanwezig zijn in de XPath 2.0 taal. Er zijn drie functies die gebruikt kunnen worden in XPath om tekstelementen te herkennen. Dit zijn de functies matches, replace en tokenize. Drie functies voor tekstanalyse is weinig maar in dit onderzoek was het voldoende omdat de query aan een vaste syntax voldeed en de (syntactische) analyse van de query in dit onderzoek niet voorop stond. Hoewel de XML-bestanden, die als Knowledge Base dienden voor zowel het XSL-systeem als het eXist-systeem, in het XML-formaat stonden, waren deze verre van goed te noemen. Ik raad het gebruik van deze XMLbestanden bij de ontwikkeling van een volledig QA-systeem op basis van Wikipedia XML-bestanden daarom af. Een RDF-structuur binnen de artikelen van Wikipedia lijkt mij een betere Knowledge Base voor een Wikipediabased QA-systeem. Een QA-systeem met een kleine XML-dataset kan met eXist prima functioneren. Is er echter een grote XML-dataset aanwezig dan moet de keuze gemaakt worden of de gebruiker langer moet wachten op een antwoord of dat er een alternatief systeem gebruikt wordt dat niet gespecialiseerd is in het opslaan van XML-bestanden.
Referenties Artikelen [1] David Ahn e.a, ’Using Wikipedia at the TREC QA Track’, Amsterdam 2004. [2] Ellen M. Voorhees, ’Overview of the TREC 2004 Question Answering Track’, Gaithersburg 2004. [3] Indra Seher, ’Query Expansion in Personal Queries”, Sydney 2006 [4] B¨orkur Sigurbjørnsson, Jaap Kamps, Maarten de Rijke, ’Focused Access to Wikipedia’, ’6th Dutch-Belgian Information Retrieval Workshop (DIR 2006)’, pp 73-80, Amsterdam, Nederland 2006. [5] Lucian Vlad Lita, Warren A. Hunt, Eric Nyberg, ’Resource Analysis for Question Answering’, ’Proceedings of the 42nd annual meeting of the Association of Computational Linguistics’, Barcelona 2004. [6] Frederico Mora, Jesse Louis-Rosenberg, Gregory Marton e.a, ’Using structured , knowledge-rich corpora in Question Answering’, ’Proceedings of the CSAIL Student Workshop’, Cambridge, Verenigde Staten 2005. [7] Baeza-Yates, Berthier Ribeiro-Neto, ’Modern Information Retrieval’, pp 75, Londen 1999. [8] Max V¨olkel e.a, ’Semantic Wikipedia’, Karlsruhe, Germany 2006. [9] T. R. Gruber, ’A translation approach to portable ontologies’, ’Knowledge Acquisition’, 5(2):199-220, 1993.
Websites [10] http://trec.nist.gov/overview.html [11] http://start.csail.mit.edu/ [12] http://www.ask.com [13] http://www.uva.nl [14] http://www.cis.nctu.edu.tw/~is89018/project/QASystem/
REFERENTIES
60
[15] http://www10.org/cdrom/papers/120/index.html [16] http://www.google.nl [17] http://www.altavista.com [18] http://www.wikipedia.org [19] http://slashdot.org [20] http://chronicle.com/wiredcampus/article/1328/ wikipedia-founder-discourages-academic-use-of-his-creation [21] http://ilps.science.uva.nl/WiQA/index.html [22] http://ilps.science.uva.nl/WikiXML/ [23] http://ilps.science.uva.nl/~qa/cgi-bin/qademo.cgi [24] http://nl.wikipedia.org/wiki/Nederland [25] http://exist.sourceforge.net [26] http://www-306.ibm.com/software/lotus/sw-atoz/ [27] http://www.sun.com/software/sunone [28] http://tomcat.apache.org/ [29] http://www.clef-campaign.org/
Bijlagen Bijlage I: Broncode XSL-systeem Niet alle bestanden met bijbehorende broncode is geplaatst. Er is gekozen om de belangrijkste broncode in deze bijlage te plaatsen.
parse.php
Bijlagen
62
$handle = fopen("valuta/18562.xml","r"); $content = fread($handle,100000); fclose($handle); $keyfound = 1; } } include("index2.php"); echo "
"; if($keyfound == 0) { echo "Hier kan ik nog niet op antwoorden"; } else{ // XML string $xml = $content; // XSL string $xsl = ’ <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output method="html" encoding="ISO-8859-1" indent="no" omit-xml-declaration="yes" media-type="text/html"/> <xsl:param name="land"/> <xsl:param name="geboortedatum"/> <xsl:param name="sterftedatum"/> <xsl:param name="valuta"/> <xsl:template match="/"> <xsl:if test="$land != not(string(.)) "> <xsl:for-each select="article/body//item"> <xsl:if test="collectionlink[1] = $land"> De hoofdstad van <xsl:value-of select="$land"/> is : <xsl:value-of select="collectionlink[2]"/> <xsl:if test="$geboortedatum != not(string(.)) "> <xsl:for-each select="data//item"> <xsl:if test="collectionlink[2] = $geboortedatum"> De geboortedatum van <xsl:value-of select="$geboortedatum"/> is : <xsl:value-of select="collectionlink[1]"/><xsl:text>- <xsl:value-of select="../@id"/><xsl:text>- <xsl:value-of select="../../@id"/> <xsl:if test="$sterftedatum != not(string(.)) "> <xsl:for-each select="data//item"> <xsl:if test="collectionlink[2] = $sterftedatum"> De sterftedatum van <xsl:value-of select="$sterftedatum"/> is : <xsl:value-of select="collectionlink[1]"/><xsl:text>- <xsl:value-of select="../@id"/><xsl:text>- <xsl:value-of select="../../@id"/>
Bijlagen
63
<xsl:if test="$valuta != not(string(.)) "> <xsl:for-each select="article/body//table//row//cell"> <xsl:if test="collectionlink = $valuta"> De munteenheid van <xsl:value-of select="$valuta"/> is : <xsl:value-of select="../cell/collectionlink"/> ’; $xh = xslt_create(); // the second parameter will be interpreted as a string $parameters = array ( ’land’ => $land, ’geboortedatum’ => $geboorte, ’sterftedatum’ => $sterfte, ’valuta’ => $valuta ); $arguments = array ( ’/_xml’ => $xml, ’/_xsl’ => $xsl ); $result = xslt_process($xh, ’arg:/_xml’, ’arg:/_xsl’, NULL, $arguments, $parameters); if($result == "") { echo "Hier kan ik nog niet op antwoorden"; } else { echo $result; } } ?>
Bijlagen
64
Bijlage II: Broncode eXist-systeem verbeter.xql xquery version "1.0"; declare declare declare declare
namespace namespace namespace namespace
request="http://exist-db.org/xquery/request"; util="http://exist-db.org/xquery/util"; xqf="http://www.xqueryfunctions.com"; html= "http://www.w3.org/1999/xhtml";
declare function local:do-query() as xs:string* { let $query := local:remove-words() let $subject := local:get-subject($query) let $keywords := local:get-keywords($query) let $answer := local:answer($subject,$keywords) let $adress := concat("http://nl.wikipedia.org/wiki/",$subject)
let $noanswer := "Geen antwoord gevonden!" return if(empty($keywords)) then let $output := local:name($subject) let $final := local:subjectinfo($output,$subject) return if(empty($final)) then local:wikiperson($adress, $subject, $keywords) else $final else if(contains($keywords, "geboortedatum")) then let $geboortedatum := local:geboorte($subject) return if(empty($geboortedatum)) then local:wikisearch($subject, $keywords) else $geboortedatum else if(contains($keywords, "sterftedatum") or contains($keywords, "stierf")) then let $sterftedatum := local:sterfte($subject) return if(empty($sterftedatum)) then local:wikisearch($subject, $keywords) else $sterftedatum else if(contains($keywords, "hoofdstad")) then let $hoofdstad := local:hoofdstad($subject) return if(empty($hoofdstad)) then local:wikisearch($subject, $keywords) else $hoofdstad else if(contains($keywords, "munteenheid") or contains($keywords, "valuta")) then
Bijlagen
65
let $valuta := local:valuta($subject) return if(empty($valuta)) then local:wikisearch($subject, $keywords) else $valuta else if(empty($answer)) then let $titlename := local:name($subject) return if(empty($titlename)) then local:wikisearch($subject, $keywords) else let $sentencetitle := local:sentence-keyword($titlename, $keywords) return if(empty($sentencetitle)) then local:wikisearch($subject, $keywords) else $sentencetitle else $answer }; declare function xqf:index-of-match-first ( $arg as xs:string? , $pattern as xs:string ) as xs:integer? { if (fn:matches($arg,$pattern)) then fn:string-length(fn:tokenize($arg, $pattern)[1]) + 1 else () }; declare function xqf:trim ( $arg as xs:string? ) as xs:string { fn:replace(fn:replace($arg,’\s+$’,’’),’^\s+’,’’) }; declare function local:remove-words() as xs:string* { let $oldquery := request:get-parameter("query", "") let $newquery := replace($oldquery,"hoe |Hoe |wanneer |Wanneer |wat |Wat |wie |Wie |Waar |waar|is |Is |zijn |Zijn |de |De |het |Het |een |Een |\?| \?| van ","") return $newquery }; declare function local:get-keywords($query as xs:string*) as xs:string* { let $subject := xqf:index-of-match-first($query,’[A-Z]’) let $subject := substring($query,1,$subject - 1) let $keywords := tokenize($subject,"\s+") return $keywords };
Bijlagen
66
declare function local:get-subject($query as xs:string*) as xs:string* { let $length := string-length($query) let $subject := xqf:index-of-match-first($query,’[A-Z]’) let $subject := substring($query,$subject,$length) return $subject }; declare function local:answer($subject as xs:string*, $keywords as xs:string*) as xs:string* { for $m in collection("/db/WikiLarge")/article where contains(data($m), $keywords) and contains(data($m),$subject) return let $alldocs := tokenize($m,"article") let $sentences := tokenize($alldocs,"\.") for $k in $sentences where contains($k, $keywords[1]) and contains($k, $subject) return $k }; declare function local:name($subject as xs:string*) as xs:string* { for $m in collection("/db/WikiLarge")/article where contains($m/name, $subject) return $m }; declare function local:sentence-keyword($data as xs:string*, $keywords as xs:string*) as xs:string* { let $sentences := tokenize($data,"\.") for $l in $sentences where contains($l, $keywords[1]) return $l }; declare function local:geboorte($subject as xs:string*) as xs:string* { for $case in collection("/db/WikiLarge/geboorte")/article/item where contains($case,$subject) return
Bijlagen
67
declare function local:hoofdstad($subject as xs:string*) as xs:string* { for $case in collection("/db/WikiLarge/hoofdsteden")/article//item where contains($case,$subject) return
declare function local:wikideepsearch($adress as xs:string*, $subject as xs:string*, $keywords as xs:string*) as xs:string* { let $newadress := concat("http://nl.wikipedia.org",doc($adress)//html:body//html:li[1]/html:a/@href) for $k in doc($newadress) let $title := doc($newadress)//html:body//html:div/html:p return let $data := tokenize($title,"\.") for $l in $data return concat($l,".") };
Bijlagen
68
declare function local:wikiperson($adress as xs:string*, $subject as xs:string*, $keywords as xs:string*) as xs:string* { let $subjectnew := replace($subject," ","_") let $adress := concat("http://nl.wikipedia.org/wiki/",$subjectnew) for $test in doc($adress) let $title := doc($adress)//html:body//html:div/html:p return let $data := tokenize($title,"\. ") for $k in $data where contains($k,$subject) or contains($k, $keywords) return $k };
{local:do-query()}
Bijlagen
69
Bijlage III: Vragenlijst x = juiste antwoord gevonden - = geen antwoord gevonden x- = fout antwoord gevonden xx- = geen artikel in Wikipedia aanwezig Muziekvragen Wie Wie Wie Wie Wie Wie Wie Wie Wie Wie Wie Wie Wie Wie Wie Wie Wie Wie Wie Wie
is de zanger van The Kooks? is de zanger van Pink Floyd? is de zanger van The Golden Earring? is de zanger van The Four Tops? is de zanger van Boney M? zijn de zangers van Earth Wind and Fire? is de zanger van The Smiths? is de zanger van Madness? is de zanger van Faith No More? is de zanger van The Smashing Pumpkins? is de drummer van Muse? is de drummer van Foo Fighters? is de drummer van Saybia? is de drummer van The Rolling Stones? is de drummer van Pearl Jam? is de bassist van Radiohead? is de bassist van U2? is de bassist van Fear Factory? is de bassist van Bad Religion? is de bassist van Tool?
1e test
2e test
x xx x x x x
xx xx x x xx x x x
Bijlagen
70
Hoofdstedelijke vragen Wat Wat Wat Wat Wat Wat Wat Wat Wat Wat Wat Wat Wat Wat Wat Wat Wat Wat Wat Wat Wat Wat Wat Wat Wat Wat Wat Wat Wat Wat Wat Wat Wat Wat Wat Wat Wat Wat Wat Wat Wat Wat
is is is is is is is is is is is is is is is is is is is is is is is is is is is is is is is is is is is is is is is is is is
de de de de de de de de de de de de de de de de de de de de de de de de de de de de de de de de de de de de de de de de de de
hoofdstad hoofdstad hoofdstad hoofdstad hoofdstad hoofdstad hoofdstad hoofdstad hoofdstad hoofdstad hoofdstad hoofdstad hoofdstad hoofdstad hoofdstad hoofdstad hoofdstad hoofdstad hoofdstad hoofdstad hoofdstad hoofdstad hoofdstad hoofdstad hoofdstad hoofdstad hoofdstad hoofdstad hoofdstad hoofdstad hoofdstad hoofdstad hoofdstad hoofdstad hoofdstad hoofdstad hoofdstad hoofdstad hoofdstad hoofdstad hoofdstad hoofdstad
van van van van van van van van van van van van van van van van van van van van van van van van van van van van van van van van van van van van van van van van van van
Nederland? Duitsland? Ecuador? de Verenigde Staten van Amerika? Indonesi¨e? China? Japan? Mongoli¨e? Utrecht? Zweden? Ijsland? Groenland? Alaska? Canada? Spanje? Nigeria? Zuid-Afrika? Mozambique? Mexico? Jamaica? Ha¨’iti? Uganda? Congo? Saoudi-Arabi¨e? Alberta? Suriname? Aruba? Nedersaksen? Guyenne? Artesi¨e? Itali¨e? Marokko? Portugal? Rusland? India? Australi¨e? Zuid-Korea? Taiwan? Peru? Frans-Guyana? Californi¨e? Queensland?
1e test
2e test
x x x x x x x x x x x x x x x x x x x x x x x x x xxx x x x -
x x x x x x x x x x x x x x x x x x x x xx x x x xx x x x x x x x x x x x x xx
Bijlagen
71
Geboorte en sterftedata-vragen Wat Wat Wat Wat Wat Wat Wat Wat Wat Wat Wat Wat Wat Wat Wat Wat Wat Wat Wat Wat Wat Wat Wat Wat Wat Wat Wat Wat Wat Wat Wat Wat Wat Wat Wat Wat Wat Wat Wat
is is is is is is is is is is is is is is is is is is is is is is is is is is is is is is is is is is is is is is is
de de de de de de de de de de de de de de de de de de de de de de de de de de de de de de de de de de de de de de de
geboortedatum van Jimi Hendrix? geboortedatum van Madonna? geboortedatum van Jan Peter Balkenende? geboortedatum van Prins Claus? geboortedatum van Herman Brood? geboortedatum van Adolf Hitler? geboortedatum van Winston Churchill? geboortedatum van Anthony Kiedis? geboortedatum van Martin Luther King? geboortedatum van Sophocles? geboortedatum van Philip Sydney? geboortedatum van Johannes Kepler? geboortedatum van Baltasar Gracian? geboortedatum van John Wilmot? geboortedatum van Immanuel Kant? geboortedatum van Daniel Boone? geboortedatum van Germaine de Stael? geboortedatum van William Blake? geboortedatum van Jeremy Bentham? geboortedatum van James Monroe? geboortedatum van Sren Aabye Kierkegaard? sterftedatum van John F. Kennedy? sterftedatum van Yasser Arafat? sterftedatum van Anna Nicole Smith? sterftedatum van Marten Toonder? sterftedatum van Pablo Eskobar? sterftedatum van Walter Matthau? sterftedatum van Robert Runcie? sterftedatum van Henry Lewis Stimson? sterftedatum van Ivor Novello? sterftedatum van John Ruskin? sterftedatum van Frank Norris? sterftedatum van Kate Chopin? sterftedatum van William Penn? sterftedatum van Antony van Leeuwenhoek? sterftedatum van George Farquhar? sterftedatum van David Hume? sterftedatum van Aristoteles? sterftedatum van Giovanni Boccaccio?
1e test
2e test
x x x x x x x x -
x xx x x x x x x xxxx xxxxx xxxxx x x x x x x x xxx xxxxxxx xxxxxxxxx x x