Systembeskrivning Projekt Intelligent Indexering Uppdragsgivare: Harald Kjellin, Institutionen för Data och Systemvetenskap, KTH Deltagare i projektgruppen: Biörklund, Mathias webside ansvarig Erneholm, Mattias vice projektledare Gustrin, Mattias projektledare Mankert, Lotta sekreterare Pettersson, Ove dokumentansvarig Widén, Jacob dokumentansvarig www-dokumentation: http://www.nada.kth.se/projects/proj01/intdex/ Kungliga Tekniska Högskolan Programutvecklingsprojekt 2D1954 Systembeskrivning 2001-05-06 INNEHÅLLSFÖRTECKNING 1 2 SYSTEMSKISS ................................................................................................................ 3 1.1 FAS 1 ........................................................................................................................... 3 1.2 FAS 2 ........................................................................................................................... 7 1.3 FAS 3 ......................................................................................................................... 10 1.3.1 Steg 1 ................................................................................................................ 11 1.3.2 Steg 2 ................................................................................................................ 14 1.4 COMMON ................................................................................................................... 16 1.5 SETTINGS .................................................................................................................. 17 1.6 SKISS AV ANVÄNDARGRÄNSSNITT ............................................................................. 18 REFERENSER ............................................................................................................... 19 2 (19) Kungliga Tekniska Högskolan Programutvecklingsprojekt 2D1954 1 Systembeskrivning 2001-05-06 Systemskiss Vi har delat in applikationen i tre faser som alla bygger på den föregående fasen. Detta gör vi för att få en mer överskådlig och lätthanterlig struktur. Användargränssnitt Fas 1 Fas 2 Fas 3 Indexfil HTMLparser Figur 1 1.1 Fas 1 I denna fas sker insamlingen av URLer till de dokument som kommer att indexeras, även kallat crawling. Användaren anger en URL varifrån sökningen av URLer skall utgå. Denna URL läggs till den tomma vektorn av URLer som skall besökas samt till hashtabellen över URLer som skall besökas. Vidare anger användaren inom vilken domän som sökningen skall ske. Sökningen går till på följande sätt: Så länge vektorn med URLer som skall besökas inte är tom. Hämta dokumentet som den första URLen i vektorn refererar till, ta bort URLen från vektorn över URLer som skall besökas, lägg till URLen till vektorn över URLer som är besökta samt till hashtabellen över URLer som är besökta. Så länge man finner nya URLer i det befintliga dokumentet. Man kontrollerar så att det är en giltig URL, att det är säkert att söka igenom sidan som URLen hänvisar till, att URLen inte redan finns i hashtabellerna över de besökta URLerna eller bland de URLer som skall besökas, att det inte är fråga om ett relativhopp inom samma dokument, samt att URLen tillhör den domän som sökningen skall ske inom. Om URLen uppfyller dessa krav så läggs den sist i vektorn över de URLer som skall besökas samt till hashtabellen över URLer som skall besökas. Den läggs även till vektorn över funna URLer och till hashtabellen över funna URLer. Returnera vektorn över funna URLer. 3 (19) Kungliga Tekniska Högskolan Programutvecklingsprojekt 2D1954 Systembeskrivning 2001-05-06 Det blir alltså frågan om en breddenförstsökning efter nya URLer. Den ovan beskrivna sökningen utförs av 50 trådar, nedan kallad söktrådar. Crawlingen övervakas av en tråd i klassen SupervisorThread. Den avbryter crawlingen om alla söktrådar är döda, vilket inträffar när det inte går att hitta några mer URLer. Söktrådar kan även dö av andra anledningar, detta registreras dock och crawlingen fortsätter med de fortfarande levande söktrådarna. Eftersom man aldrig vet hur en webbsida man läser ser ut så kan det säkert finnas fall där crawlern stannar upp. Detta löses genom att crawlern har fått en boolesk variabel per loop, vilken ändras beroende på om en söktråd påbörjar eller avslutar en loop. Om varken de booleska variablerna, antalet levande söktrådar, antalet sovande söktrådar, antalet döda söktrådar eller antalet funna URLer har ändrats under 3 minuter kommer crawlern att avbrytas. När crawlern avbryts kommer fas 1 att avslutas, vilket innebär att de funna URLerna skrivs till filen som finns angiven i Settings. Det skapas även en fil som heter faulty_URLs.txt som innehåller alla felaktiga URLer som har påträffats. Om användaren väljer att avbryta insamlingen av URLer innan vektorn över URLer som skall besökas är tom returneras de hittills funna URLerna. 4 (19) Kungliga Tekniska Högskolan Programutvecklingsprojekt 2D1954 Systembeskrivning 2001-05-06 Start URL och sökdomän Initiering Tom lista över URLer som skall besökas Nej Nej Läs in dokumentet som den första URLen hänvisar till och ta bort första URLen från listan över URLer som skall besökas samt lägg till URLen till listan och hashtabellen över URLer som är besökta Ja Skanna igenom dokumentet efter nya URLer Hittar ny URL i dokumentet Ja Nej Giltig och säker URL, URLen finns inte i hashtabellerna över URLer som är besökta eller skall besökas, URLen gör ej ett relativhopp inom dokumentet samt att URLen tillhör sökdomänen Ja Lägg URLen sist i listan över URLer som skall besökas samt till hashtabellen över URLer som skall besökas Returnerar listan med besökta URLer Figur 2 Klasser public class WebCrawler Det grafiska gränssnittet samt insamlingen av URLer sköts av denna klass. class RunThread Inre klass i WebCrawler för söktrådexekvering. 5 (19) Kungliga Tekniska Högskolan Programutvecklingsprojekt 2D1954 Systembeskrivning 2001-05-06 class RunPhase2 Inre klass i WebCrawler för metodanrop mot fas 2. public class SupervisorThread Här sköter en tråd övervakningen av crawlern. Metoder i WebCrawler void init() Här skapas det grafiska gränssnittet samt initieras datastrukturerna för lagring av URLerna. synchronized String popFirstToSearch() Hämtar nästa URL som skall undersökas. void start() Anropas när användaren startar insamlingen av URLer. void stop() Anropas om användaren vill avbryta insamlingen av URLer innan den sista sidan är lokaliserad. void startPhase2() Startar exekveringen av fas 2. void saveURLs() Sparar alla funna URLer. boolean robotSafe(URL url) Kontrollerar om det är säkert för crawlern att besöka en viss URL. void help() Visar ett hjälpfönster. void setStatus(String status) Uppdaterar statusen i det grafiska gränssnittet om något inträffar. void settings() Visar Settings fönstret. void actionPerformed(ActionEvent event) Känner av om användaren vill påverka crawlern. void activateStartButton Aktiverar Start knappen. Metod i RunThread void run() Det är den här metoden alla söktrådar exekverar. Här sker insamlingen av URLer. Metod i RunPhase2 void run() Innehåller metodanrop mot fas 2. 6 (19) Kungliga Tekniska Högskolan Programutvecklingsprojekt 2D1954 Systembeskrivning 2001-05-06 Metod i SupervisorThread void run() Kontrollerar om crawlern är klar eller står still. Datastrukturer Hashtabell över besökta URLer. Hashtabell över URLer som skall besökas. Hashtabell över felaktiga URLer. Hashtabell över funna URLer, både besökta och obesökta Vektor över besökta URLer. Vektor över URLer som skall besökas. Vektor över felaktiga URLer. Vektor över funna URLer, både besökta och obesökta. 1.2 Fas 2 Fas 2 skall gå igenom de dokument som fas 1 hittat och räkna totala antalet förekomster av varje ord. Därefter räknas medelfrekvensen fram enligt formeln: Medelfrekvensen totala _ antalet _ ord _ i _ domänen antalet _ olika _ ord _ i _ domänen Medelfrekvensen anger alltså hur många gånger ett ord förekommer i snitt. Därefter kan den generella frekvensen för varje enskilt ord beräknas enligt: GenerellaF rekvensen antalet _ förekomster _ av _ or det Medelfrekvensen Om ett ord förekommer fler gånger än medelfrekvensen kommer Generella frekvensen att var större än ett. Exempel på detta är alla ”skräpord” t.ex. är, till, som mm. 7 (19) Kungliga Tekniska Högskolan Programutvecklingsprojekt 2D1954 Systembeskrivning 2001-05-06 Gränsen för medelfrekvensen kan justeras med hjälp av parametern General factor i användargränssnittet. Normalt är detta värde 1.0 men kan ändras om annan karakteristik önskas. Om ordet har en generell frekvens över gränsvärdet anses ordet vara för generellt och kommer inte behandlas, annars sparas generella frekvensen tillsammans med den relativa frekvensen för ordet. Resultatet sparas i en hashtabell som är indata till fas 3. URL-adresserna till de genomgångna dokumenten sparas i en fil. Fas 2 skall gå igenom de dokument som fas 1 hittat och räkna totala antalet förekomster av varje ord. Resultatet sparas i en hashtabell som är indata till fas 3. URL-adresserna till de genomgångna dokumenten sparas i en fil. Figur 3 visar en schematisk bild över fas 2. 1. Sätt totalräknare till noll. Skapa hashtabellen för räknarvärden. Öppna infil. Skapa utfil. 2. Läs nästa dokument-URL från infil. Om EOF gå till punkt 7. 3. Koppla upp mot dokument. Om fel gå till punkt 2. 4. Skapa parserinstans. 5. Läs nästa token från parsern. Om token är en ”tag” eller en kommentar, läs nästa token. Om EOF i dokumentet, skriv dokument-URL till utfil och gå till punkt 2. 6. Stega totalräknaren. Läs ordet. Om ordet finns i räknar-hashtabellen, stega ordräknaren med 1, annars lägg till ordet och sätt ordräknaren till 1. Gå till punkt 5. 7. Stäng utfil och infil. Räkna ut medelfrekvensen. Skapa ny hashtabell för ord. 8. Läs nästa ord från räknar-hashtabellen Om tabellen slut gå till punkt 10. 9. Räkna ut generella frekvensen för ordet. Om generella frekvensen är mindre än gränsvärdet (General factor), spara generella och relativa frekvensen i ord-hashtabellen. Gå till punkt 8. 10. Returnera ord-hashtabellen. 8 (19) Kungliga Tekniska Högskolan Programutvecklingsprojekt 2D1954 Systembeskrivning 2001-05-06 Infil 1. Initiering 2. Läs URL Fel 3. Koppla upp mot dokument Skriv URL till utfil 4. Skapa parserinstans EOF i infil . 5. Läs nästa token EOF i dokument. Ord 6. Läs ordet, stega räknare 7. Stäng filer, räkna ut medelfrekvensen 8. Läs nästa ord från tabellen Tabellen slut 9. Räkna ut generella frekvensen generell frekvens < gränsvärde Spara i hashtabellen 10. Returnera hashtabellen Figur 3 Klasser public class Phase2 All hantering av fas 2 sker i denna klass. public class HtmlStreamTokenizer HTML-parser som tar fram ord ur HTMLdokument. 9 (19) Kungliga Tekniska Högskolan Programutvecklingsprojekt 2D1954 Systembeskrivning 2001-05-06 Metoder i Phase2 public Hashtable startPhase2() Metod som startar fas 2. Metoder i HtmlStreamTokenizer public final Stringbuffer getStringValue() Returnerar ordet. public int nextToken() Returnerar nästa token. Datastrukturer Hashtabell med alla förekommande ord med frekvenser, samt värdet för totala antalet ord. 1.3 Fas 3 Ett dokument i taget behandlas dvs. filen med URLer stegas igenom. För varje dokument ska ett diskriminerande värde, Disc(w,doc), för varje ord beräknas. Resultatet lagras i en för dokumentet temporär hashtabell. Se formler nedan. Disc ( w, doc) Rf ( w, doc) 1 Rf ( w, domain) där Rf ( w, doc) antal ( w, doc) antal (ord , doc) är den relativa frekvensen av ordet w i ett dokument och Rf ( w, domain) antal ( w, domain) antal (ord , domain) är den relativa frekvensen av ordet w i alla dokument i domänen. Om ordet w är lika vanligt i dokumentet som det är i alla andra dokument blir det diskriminerande värdet Disc(w,doc) = 0 och om det förekommer 10 gånger mer så blir Disc(x,doc) = 9. Efter att alla ords individuella diskriminerande värde beräknats för ett dokument, börjar sökningen efter ord med starka relationer, dvs. parbildningen. 10 (19) Kungliga Tekniska Högskolan Programutvecklingsprojekt 2D1954 Systembeskrivning 2001-05-06 För att hitta dessa par kommer man att stega igenom hela dokumentet en gång. För varje mening kommer det första diskriminerande ordet, Da (med dess diskriminerande värde Disc(Da,doc)) paras ihop med det andra, Db (med dess diskriminerande värde Disc(Db,doc)). Detta förlopp fortsätter med det andra och tredje ordet, tredje och fjärde o.s.v. ända tills meningen är slut och sedan vidare med alla meningar i dokumentet. Diskriminerande ord är bara ord med ett diskriminerande värde större än den förutbestämda Diskrimineringskonstanten. Varje par sätts in i hashtabellen ”ParTabell” med nyckeln ”Da + Db” (där ordet Da är mindre än Db). För att undvika att samma parkombination fast i omvänd ordning (”Db + Da”) läggs in i hashtabellen, en annan nyckel på en annan plats, skapas alltid nyckeln med ordet Da före ordet Db. Om parkombinationen redan finns räknas parametern antal för parkombinationen upp med 1 (i ”ParTabell” för gällande par). När hela dokumentet stegats igenom kan det diskriminerande värdet, Disc(Da,Db), för varje parkombination beräknas. Eftersom vi känner till förekomsten av varje par, Kab, kan det pardiskriminerande värdet, Disc(Da,Db), nu beräknas (se formler nedan). K ab 0 kombination( Da , Db ), n antalmeningar n Disc ( Da , Db ) ( Disc ( Da , doc) Disc ( Db , doc)) Kab Det diskriminerande värdet, Disc(Da,Db), sparas undan tillsammans med ordparet och URLen i en för dokumentet temporär hashtabell, ”ParTabell”. Den temporära hashtabellen, ”ParTabell” överförs sedan till en globala hashtabell, ”GlobalParTabell” och URLen för dokumentet. När alla dokument har behandlats i domänen, skrivs ”GlobalParTabell” ned på en utfil. Vi har delat upp detta förlopp i två steg för att göra det lättare, vilka vi redovisar här nedan, se figur 4 och 5. 1.3.1 Steg 1 Steg 1 skall gå igenom de dokument som finns på filen från fas 2. Steg 1 räknar det totala antalet förekomster av varje ord i varje dokument. Efter att varje dokument stegats igenom, beräknas det diskriminerande värdet för varje ord i dokumentet. Därefter går man till steg 2. När steg 2 är avslutat har diskriminerande par av ord i dokumentet hittats, ett pardiskriminerande värde för varje par beräknats och resultatet har lagrats i en temporär hashtabell (ParTabell). När steg 2 genomförts uppdateras den globala hashtabellen (GlobalParTabell). När samtliga dokument stegats igenom skrivs den globala hashtabellen (GlobalParTabell) som innehåller alla diskriminerande par i domänen till fil. Figur 4 visar ett schema över steg 1. 11 (19) Kungliga Tekniska Högskolan Programutvecklingsprojekt 2D1954 Systembeskrivning 2001-05-06 1. Sätt totalräknare till noll. Skapa hashtabeller (OrdTabell, ParTabell och GlobalParTabell). Öppna infil. Skapa utfil. 2. Läs nästa dokument, dvs. URL från infil. Om EOF gå till punkt 10. 3. Koppla upp mot dokument. Om fel gå till punkt 2. 4. Skapa parserinstans. 5. Läs nästa token från parsern. Om token är en ”tag”, ”.”, ”,”, ”<” eller en kommentar, läs nästa token. Om EOF i dokumentet gå till punkt 7. 6. Stega totalräknaren. Läs ordet. Om ordet finns i hashtabellen ”OrdTabell”, stega ordräknaren med 1, annars lägg till ordet och sätt ordräknaren till 1. Gå till punkt 5. 7. Beräkna det diskriminerande värdet för alla ord i dokumentet dvs. ord i ”OrdTabell”, gå till punkt 8. 8. Gå till fas 3 steg 2. 9. Steg 2 har slutförts och returnerat ”ParTabell”. Uppdatera ”GlobalParTabell” med ”ParTabell” dvs. Ord1, Ord2 och det diskriminerande värdet för paret och även med gällande URL. 10. Skriv ”GlobalParTabell” till utfil. 11. Stäng utfil och infil. 12 (19) Kungliga Tekniska Högskolan Programutvecklingsprojekt 2D1954 Systembeskrivning 2001-05-06 Infil 1. Initiering 2. Läs URL Fel 9. Uppdatera GlobalPartabell med Partabell och URL'en. 3. Koppla upp mot dokument 8. Gå till Steg 2 i Fas 3 4. Skapa parserinstans EOF infil 5. Läs nästa token EOF dokument Ord 6. Läs ordet, stega räknare, uppdatera Ordtabell 10. Skriv GlobalPartabell till utfil 11. Stäng filer Figur 4 Klasser public class Phase3Step1 13 (19) 7. Beräknar Ord.diskrim för alla ord i dok Kungliga Tekniska Högskolan Programutvecklingsprojekt 2D1954 Systembeskrivning 2001-05-06 Metoder i Phase3Step1 public void startPhase3(WebCrawler crawler, Hashtable phase2Table) Genererar en fil med ordpar, dess gemensamma diskriminerade värde och URL. void writeToFile(PrintWriter outFile, Hashtable table) Skriver ordpar, dikrimineringsvärde och URL till fil. int getNumUrls() Returnerar antal URLer I filen ‘PHASE2_FILE’ Datastrukturer Hashtabell med alla par av ord, gemensamma diskriminerings värden och samt ordparens URLer. 1.3.2 Steg 2 Steg 2 skall läsa igenom gällande dokument och hitta diskriminerande par i varje mening. Kombinationer av ord sparas i en hashtabell ”ParTabell”. Om ett par förekommer flera gånger dvs. i flera meningar uppdateras parametern antal i ”ParTabell”. Därefter beräknas det diskriminerande värdet för varje par i dokumentet. I figur 5 visas en schematisk bild över steg 2. 1. Nollställ hashtabellen ”ParTabell”. Läs från början av parserinstansen. 2. Läs nästa token från parsern. Om token är en ”tag” eller en kommentar, läs nästa token. Om token är ett ord med för litet diskriminerande värde, läs nästa token. Om token är en ”punkt”, ”kommatecken” eller ”<”, gå till punkt 10. Om EOF i dokumentet gå till punkt 11. 3. Om variabeln Ord1 är tom gå till punkt 4 4. Sätt Ord1 till token, gå till punkt 2. 5. Sätt Ord2 till token. 6. Om kombination Ord1 + Ord2 finns i ”ParTabell”, gå till punkt 8. 7. Sätt in kombination Ord1 + Ord2 i ”ParTabell” och gå till punkt 9. 8. Räkna upp antal med 1 för kombinationen Ord1 + Ord2. 9. Sätt Ord1 till Ord2. Sätt Ord2 till ” ”. Gå till punkt 2. 10. Sätt Ord1 och Ord2 till ” ”, gå till punkt 2. 11. Beräkna det diskriminerande värdet för varje par i hashtabellen ”ParTabell”. 12. Tillbaka till steg1, punkt 9. 14 (19) Kungliga Tekniska Högskolan Programutvecklingsprojekt 2D1954 Systembeskrivning 2001-05-06 Från Fas 3 Steg 1 1. Nollställ ParTabell. Läs från början av dokument 2. Läsa nästa token ".", "," el. "<" 3. Är variabeln Ord1 tom Ja/tom 10. Ord1 = " " Ord2 = " " 4. Ord1= Ord Nej 9. Ord1 = Ord2 Ord2 = " " 5. Ord2 = Ord EOF 6. Finns Ord1+ Ord2 i Partabell? Ja Nej. 7. Sätt in Ord1+ Ord2 i Partabell. 11. Beräknar Par.diskrim för ParTabell för alla par i dokumentet Tillbaka till Fas 3 Steg 1 Figur 5 Klasser public class Phase3Step2 15 (19) 8. Räknar upp Par.antal med 1 i Partabell Kungliga Tekniska Högskolan Programutvecklingsprojekt 2D1954 Systembeskrivning 2001-05-06 Metoder i Phase3Step2 Public Hashtable startPhas3Step2(Hashtable phase2Table Hashtable wordTable, Hashtable globalPairTable, int docCounter, String urlName) Gör ordparsberäkningar för ett dokument. boolean endOfPhrase(String word) Testar om ordet är i slutet av en mening. public Hashtable calcDiscPair(Hashtable pairTable, Hashtable wordTable, Hashtable globalPairTable, String urlName) Beräknar diskriminerande värden för alla par. Datastrukturer Hashtabell över lokala ordpar. Hashtabell över globala ordpar. 1.4 Common Common består av fyra klasser som är gemensamma för de andra modulerna. Klasser public class CommonVars Innehåller globala variabler och konstanter som används av de andra modulerna. public class Word Datastruktur som innehåller datavärden för ett ord. public class Pair Datastruktur som innehåller datavärden för ett ordpar. public class HtmlStreamTokenizer HTML-parser som tar fram ord ur HTMLdokument. 16 (19) Kungliga Tekniska Högskolan Programutvecklingsprojekt 2D1954 Systembeskrivning 2001-05-06 Metoder i HtmlStreamTokenizer public final Stringbuffer getStringValue() Returnerar ordet. public int nextToken() Returnerar nästa token. Metoder i Word public float relFreq() Returnerar relativa frekvensen för ordet. public float generalFreq() Returnerar generella frekvensen för ordet. Metoder i Pair public String word1() Returnerar första ordet. public String word2() Returnerar andra ordet. public int numberOfPair Returnerar räknare numberOfPair public Vector discValues() Returnerar en vektor med diskrimineringsvärden. public Vector docUrls() Returnerar en vektor med URL-dokument. public void incPairCounter() Ökar parräknaren. public void addDiscUrl(float discVal, String url) Lägger in värden i vektorerna. 1.5 Settings Settings är en del av gränssnittet. I settingsfönstret anges inställningar för applikationen. Klasser public class Settings Bygger upp gränssnittet för inställningarna. public class ButtonListener Tar hand om knapptryckningar. public class RadioButtonListener Tar hand om markeringar av Radioknappar. public classCheckBoxListener Tar hand om markeringar av Checkboxknappar. 17 (19) Kungliga Tekniska Högskolan Programutvecklingsprojekt 2D1954 1.6 Systembeskrivning 2001-05-06 Skiss av användargränssnitt Figur 6. Figur 7 18 (19) Kungliga Tekniska Högskolan Programutvecklingsprojekt 2D1954 2 Systembeskrivning 2001-05-06 Referenser Arthur Do Consulting; http://www.do.org/products/parser/; 010505 Javas hemsida; http://www.java.sun.com; 010505 The Web Robots Pages; http://www.robotstxt.org/wc/robots.html; 010505 Kjellin, Harald; Institutionen för data- och systemvetenskap, Stockholms universitet; regelbundet under tiden: 010208 - 010507 19 (19)