ZOEKMACHINES DE EVOLUTIE EN DE TECHNIEK LÜKE VAN DEN WITTENBOER ZOEKMACHINES DE EVOLUTIE EN DE TECHNIEK LÜKE VAN DEN WITTENBOER Profiel Natuur en Techniek Vak Wiskunde Klas 6V School Bataafs Lyceum, Hengelo Begeleider Mirjam van Buuren Datum 25 februari 2017 Samenvatting Dit verslag is het resultaat van een onderzoek naar zoekmachines. Ik onderzocht de evolutie van de zoekmachine en stelde daarbij de volgende onderzoeksvragen: 1. Hoe is de evolutie van de zoekmachine verlopen? 1a. Waarom zijn zoekmachines pas zo laat ontstaan? 1b. In welke mate verschillen zoekmachines van elkaar en zijn ze in de loop van de tijd werkelijk verbeterd? 2. Hoe werkt een zoekmachine precies? Het onderzoek bestaat uit twee delen: Deel I behandelt de geschiedenis van het internet en die van de zoekmachines. Beide ontwikkelingen zijn onlosmakelijk met elkaar verbonden. Deel II behandelt de algoritmes en de technieken waarop zoekmachines zijn gebaseerd. Ik illustreer verschillende van die technieken met behulp van een drietal zelf geprogrammeerde zoekmachines. De geschiedenis van het internet en de zoekmachines De ontwikkeling van het internet en die van de zoekmachine zijn nauw met elkaar verbonden. Die geschiedenis begint met een toekomstvisioen van de Amerikaanse ingenieur Vannevar Bush, die, in 1945 in een artikel voor het tijdschrift Atlantic Monthly, een wereld beschrijft vol apparaten waarmee iedereen altijd en overal alle informatie kan raadplegen. In dit artikel legt hij de basis voor onder andere de wijze waarop die informatie te benaderen is, namelijk op een manier die lijkt op hoe het menselijk brein dat doet. Begin jaren ‘60 van de vorige eeuw werkte de Amerikaanse socioloog/filosoof Ted Nelson dit idee verder uit. Hij legt de basis voor Hypertext, een manier om informatie aan elkaar te koppelen via links. In ongeveer diezelfde periode lanceren de Russen hun eerste satelliet, de Spoetnik. Dit is voor de Amerikanen het startsein om technologische ontwikkelingen tot een topprioriteit te maken. Dit resulteert onder andere in netwerk van computers, het ARPANET. Dit netwerk zal de basis vormen voor wat nu het internet heet. Het ARPANET/internet was lange tijd het domein van leger en wetenschappers. Begin jaren ‘90 kwam daar langzaam verandering in. Steeds meer organisaties kregen een verbinding met het netwerk. Daardoor groeide ook de behoefte om informatie uit te wisselen. Tim Berners-Lee, die in Zwitserland werkzaam was als onderzoeker bij CERN, ontwikkelde daarom HTML (HyperText Markup Language), een eenvoudige taal om informatie te koppelen die gebaseerd is op de ideeën van Vannevar Bush en Ted Nelson. Informatie koppelen en uitwisselen werd nu zo eenvoudig en handig, dat het internet aan steeds meer populariteit won. Midden jaren ‘90 waren er dan ook al veel particulieren met een eigen internetverbinding, en vaak ook een eigen webpagina. Door de groei aan informatie ontstond een behoefte aan ordening. Deze behoefte werd beantwoord door twee studenten van Stanford University: David Filo en Jerry Yang. Zij ontwikkelden een website met een gerubriceerde verzameling websites en noemden deze site Yahoo! Het aantal websites werd zo groot, dat een extra zoekmogelijkheid wenselijk werd. Die kwam er in de vorm van een zoekbalkje, waarin een zoekterm kon worden opgeven. Hiermee kon razendsnel in de verzameling links van Yahoo! worden gezocht. Yahoo! was ook de eerste site die met succes advertenties op het internet plaatste. De combinatie van zoeken en commercie bleek een interessante, want niet veel later verschenen er tal van andere zoekmachines, waaronder Lycos en AltaVista, eveneens voorzien van advertenties. 1 Deze zoekmachines verzamelden hun links niet handmatig, zoals dat gebeurde bij Yahoo!, maar maakten gebruik van een webcrawler: een volledig geautomatiseerd proces dat het web afstruint op zoek naar nieuwe webpagina’s. Hierdoor konden deze zoekmachines veel meer zoekresultaten leveren op een zoekterm dan voordien mogelijk was. Als onderdeel van mijn werkstuk heb ik zelf ook zo’n webcrawler gebouwd. De concurrentie tussen de verschillende zoekmachines was erg groot. Ze probeerden zich te onderscheiden in omvang en functionaliteit. Om bezoekers aan zich te binden, boden deze zoekmachines ook allerlei gratis diensten aan, zoals een e-mailadres of ruimte om je eigen website te plaatsen. Langzaam maar zeker verschoof hierdoor de focus van die sites, met als gevolg dat eind jaren ‘90 de meeste van die zoekmachines meer een soort van infotainment-kanaal geworden waren, waarbij de zoekfunctie slechts bijzaak was. Commerciële belangen hadden een hogere prioriteit dan het bewaken en verbeteren van de gebruikerservaring. Hierdoor raakten de zoekresultaten steeds meer vervuild met niet-relevante informatie. Google bracht hier rond 2000 verandering in met een zoekmachine met een eenvoudige, reclameloze interface. Maar dat was niet de enige vernieuwing. Google introduceerde ook een algoritme, PageRank, dat in staat was om op een objectieve manier webpagina’s op ‘belangrijkheid’ te beoordelen, door te kijken naar door wie en hoe vaak er naar een website werd gelinkt. De techniek achter de zoekmachine Om het verschil in zoekresultaten tussen zoekmachines als Yahoo!, AltaVista en Google te onderzoeken, heb ik modellen van deze zoekmachines geprogrammeerd. Deze zoekmachines maken, bij het bepalen van de (volgorde van de) zoekresultaten, gebruik van drie verschillende technieken. De eerste zoekmachine kijkt of een zoekterm voorkomt in de naam of URL van de pagina. De tweede zoekmachine maakt gebruik van een woordenlijst en een zogenaamde inverted index. Hierdoor kan de zoekmachine pagina’s sorteren op basis van relevantie. De derde zoekmachine maakt eveneens gebruik van een inverted index, maar daarnaast ook van extra score die geïnspireerd is op Google’s PageRank. Op deze wijze wordt, naast relevantie, ook gekeken naar de belangrijkheid van de webpagina. Pagina’s waar veel naar gelinkt wordt, krijgen extra ‘punten’ toegekend, zodat ze hoger in de zoekresultaten verschijnen dan pagina’s waarnaar minder wordt gelinkt. De zoekresultaten van deze drie zoekmachines verschillen duidelijk van elkaar. In paragraaf 10.6 leg ik aan de hand van een aantal voorbeelden uit, hoe de resultaten tot stand zijn gekomen. De belangrijkste conclusies 1. Ontwikkelingen hangen samen met vraag en aanbod Veel technologieën zijn soms al tientallen jaren eerder bedacht en beschreven, voordat er pogingen gedaan werden om ze in realiteit om te zetten. Een goed voorbeeld is de ontwikkeling van hypertekst, waar begin jaren ‘60 al een aanzet toe werd gedaan. Toch duurde het nog bijna 30 jaar voor hypertext echt geïmplementeerd werd. Dit was niet vanwege de technologische onmogelijkheid, maar ook omdat de vraag naar de oplossing er eerder nog niet echt was. Ook zonder deze technologie redde men zich nog prima. Dit is een patroon dat we vaker zien: pas als het bijna noodzakelijk wordt om een oplossing te vinden, verschijnt die er plots – en blijkt de aanzet hiervoor al tientallen jaren ergens op een plank te liggen. 2. Ontwikkelingen zoekmachines hangen sterk samen met wat er mogelijk is op technisch gebied Niet alleen technische mogelijkheden en kennis spelen een rol, maar ook technologische tekortkomingen. Vooral de beperkte mogelijkheden met betrekking tot het opslaan van informatie was bij de ontwikkelingen van de eerste zoekmachines een beperkende factor. Ze sloegen daarom relatief weinig gegevens op. Dat we nu zoveel meer informatie kunnen benaderen via het internet, heeft voor een belangrijk deel te maken met de sterk gedaalde prijzen van opslagmedia. 2 3. Zoekmachines hebben daadwerkelijk een evolutie doorgemaakt Midden jaren ‘90 concurreerden zoekmachines met elkaar door te pronken met allerlei innovatieve zoekmogelijkheden. Deze mogelijkheden waren technisch vaak weinig vernieuwend en eigenlijk vooral een vorm van marketing. Dat heeft – in ieder geval bij mij – aanvankelijk het beeld opgeroepen dat er in de zoekmachinetechniek in de loop van de tijd fundamenteel weinig veranderd was. Dat beeld bleek onjuist. Er zijn er wel degelijk echt belangrijke innovaties gedaan op dit gebied, zoals het gebruik van een inverted index en het Google-algoritme PageRank. Deze toepassingen waren écht nieuw, radicaal anders dan voorgaande benaderingen en ze hebben de vindbaarheid van informatie op het net enorm verbeterd. 4. Het vertrouwen in zoekresultaten staat op gespannen voet met commerciële overwegingen Vanwege hoge kosten hebben de initiatiefnemers van zoekmachines altijd gezocht naar manieren om geld te verdienen. Keer op keer leidde dat ertoe, dat het geld verdienen een hogere prioriteit had dan het verschaffen van een manier om informatie op een objectieve, eerlijke en ongekleurde manier te vinden. Ook de huidige zoekmachines zijn gebaseerd op een commercieel verdienmodel. In plaats van advertenties, wordt nu geld verdient met behulp van het analyseren van persoonlijke informatie van en over de gebruikers. Dit schaadt de privacy van de gebruiker en ondermijnt daarnaast het vertrouwen van de gebruiker in het gezag en objectiviteit van de zoekmachine. Eigenlijk zou je kunnen stellen dat de gebruiker het meest gebaad zou zijn bij een zoekmachine die beheerd wordt door een non-profitorganisatie, één die de rechten en de privacy van de gebruiker respecteert. Een zoekmachine is misschien wel té belangrijk om beheerd te worden door een commerciële partij. Eigenlijk is het vreemd dat we iets belangrijks als het verzamelen en presenteren van ‘alle kennis van de wereld’ uit handen geven aan een bedrijven met een winstoogmerk. De vraag is echter, of de gebruiker ook bereid zou zijn om voor een dergelijke dienst te betalen, in bijvoorbeeld de vorm van belasting (als het een overheidsdienst zou zijn) of contributie of abonnement. Wellicht is dit een interessante vraag voor een vervolgstudie. 3 Inhoudsopgave Samenvatting .......................................................................................................................................................... 1 Inhoudsopgave........................................................................................................................................................ 4 Inleiding .................................................................................................................................................................. 6 Deel I - De geschiedenis van de zoekmachine 1. De geschiedenis van het internet ....................................................................................................................... 8 1.1 As We May Think – Een toekomstvisioen ..................................................................................................... 8 1.2 Hypertext ...................................................................................................................................................... 8 1.4 ARPANET ...................................................................................................................................................... 9 1.5 FTP ................................................................................................................................................................ 9 1.6 WWW, HTTP, URL en HTML ...................................................................................................................... 10 1.7 Gopher ........................................................................................................................................................ 11 1.8 Mosaic......................................................................................................................................................... 11 1.9 Explosieve groei .......................................................................................................................................... 12 1.9.1 Browser-wars ....................................................................................................................................... 12 1.9.2 Opkomst van de commercie ............................................................................................................... 13 1.9.3 Internet Bubble ................................................................................................................................... 13 1.10 Social Media.............................................................................................................................................. 13 1.11 Het web nu en in de toekomst ................................................................................................................. 13 2. De eerste zoekmachines ................................................................................................................................... 15 2.1 Archie .......................................................................................................................................................... 15 2.2 Veronica en Jughead ................................................................................................................................... 15 2.3 The World Wide Web Wanderer .................................................................................................................. 16 2.4 Zoeken op het WWW: ALIWEB................................................................................................................... 16 2.5 W3Catalog .................................................................................................................................................. 17 3. Search wordt volwassen .................................................................................................................................... 18 3.1 De eerste moderne zoekmachines ............................................................................................................. 18 3.1 Yahoo! ......................................................................................................................................................... 18 3.2 WebCrawler................................................................................................................................................. 19 4. The Clone Wars ................................................................................................................................................. 20 4.1 Lycos ........................................................................................................................................................... 20 4.3 AltaVista ...................................................................................................................................................... 20 4.3 InfoSeek ...................................................................................................................................................... 21 4.4 Excite........................................................................................................................................................... 21 4.5 Hotbot......................................................................................................................................................... 21 4.6 Van zoekmachine naar portal ..................................................................................................................... 22 4.7 Irritatie ........................................................................................................................................................ 22 5. Google ............................................................................................................................................................... 23 5.1 PageRank: de basis ..................................................................................................................................... 24 4 5.2 Op zoek naar kopers ................................................................................................................................... 24 5.3 Online ......................................................................................................................................................... 24 5.4 Google Inc. ................................................................................................................................................. 25 5.5 Don’t Be Evil ............................................................................................................................................... 25 5.6 AdWords en AdSense: de oplossing van het advertentieprobleem ............................................................ 26 5.7 Google nu ................................................................................................................................................... 27 Deel II - De techniek achter de zoekmachine 6. De techniek achter de zoekmachine ................................................................................................................. 30 6.1 Een infrastructuur....................................................................................................................................... 30 6.2 De drie processen van een zoekmachine ................................................................................................... 31 7. Verzamelen van informatie ............................................................................................................................... 32 7.1 Stappen die doorlopen worden .................................................................................................................. 33 7.2 De stappen verwerkt in code ...................................................................................................................... 35 8. Het bepalen van relevantie ............................................................................................................................... 40 8.1 De inverted index........................................................................................................................................ 40 8.2 De inverted index in code ........................................................................................................................... 41 8.3 PageRank en andere populariteitsscores .................................................................................................... 43 9. Het weergeven van informatie .......................................................................................................................... 47 9.1 Het opgeven van de zoekterm .................................................................................................................... 47 9.2 Analyseren en verwerken van de zoekterm................................................................................................. 48 9.3 Het presenteren van de zoekresultaten ...................................................................................................... 49 10. De evolutie van het zoeken in drie zoekmachines .......................................................................................... 50 10.1 Zoekmachine I: zoeken met één tabel ...................................................................................................... 50 10.2 Zoekmachine II: zoeken met inverted index ............................................................................................ 51 10.3 Zoekmachine III: zoeken met PageRank .................................................................................................. 53 10.4 Testpagina’s ............................................................................................................................................... 54 10.5 Zoekresultaten in de verschillende zoekmachines ................................................................................... 57 10.6 Verklaring van de verschillende zoekresultaten........................................................................................ 59 11. Conclusies ....................................................................................................................................................... 61 12. Nabeschouwing .............................................................................................................................................. 63 Bibliografie ............................................................................................................................................................ 64 Bijlagen ................................................................................................................................................................. 66 5 Inleiding Dit verslag is het resultaat van een onderzoek naar zoekmachines dat ik heb gedaan in het kader van het Profielwerkstuk voor 6 VWO. In dit verslag onderzoek ik de evolutie van en de techniek achter zoekmachines. Hierbij heb ik de volgende onderzoeksvragen gesteld: 1. Hoe is de evolutie van de zoekmachine verlopen? Tijdens mijn vooronderzoek ontdekte ik al snel dat de basis voor het internet en de wijze waarop je daar zou moeten kunnen zoeken, al was gelegd in jaren ‘40 tot ‘60 van de vorige eeuw, maar ook dat de eerste zoekmachines pas verschenen rond 1990. Een vanzelfsprekende deelvraag is dan ook: 1a. Waarom zijn zoekmachines pas zo laat ontstaan? Ook ontdekte ik tijdens mijn vooronderzoek dat er midden jaren ‘90 een grote concurrentieslag is geweest tussen verschillende belangrijke zoekmachines. Elk van die zoekmachines pretendeerde beter te zijn dan de andere. Gaat het hier om marketing of om werkelijke technologische innovaties? Zo kom ik bij de volgende deelvraag: 1b. In welke mate verschillen zoekmachines van elkaar en zijn ze in de loop van de tijd werkelijk verbeterd? Om écht goed inzicht te krijgen in deze materie, leek het me een goed idee om zelf een zoekmachine te bouwen. Ik hoop op deze wijze meer inzicht te krijgen in de achterliggende technieken waarop zoekmachines zijn gebaseerd. Mijn volgende onderzoeksvraag is dan ook: 2. Hoe werkt een zoekmachine precies? Het verslag is opgezet in twee delen: Deel I behandelt de geschiedenis van het internet en die van de zoekmachines. Beide ontwikkelingen zijn onlosmakelijk met elkaar verbonden. Dit deel is voornamelijk gebaseerd op literatuuronderzoek. Deel II behandelt de algoritmes en de technieken waarop zoekmachines zijn gebaseerd. Ik illustreer verschillende van die technieken met behulp van een drietal zelf geprogrammeerde zoekmachines. Dit deel is deels gebaseerd op literatuuronderzoek en deels op een praktische uitwerking ervan. 6 DEEL I DE GESCHIEDENIS VAN DE ZOEKMACHINE 1. De geschiedenis van het internet De ontwikkeling van het internet en die van de zoekmachine zijn nauw met elkaar verbonden. Om de ontwikkeling van de zoekmachine beter in haar context te kunnen plaatsen, is het daarom ook belangrijk om te kijken naar de geschiedenis van het internet zelf. Die geschiedenis begint met een toekomstvisioen in een populair Amerikaans magazine en eindigt in het hier en nu. 1.1 As We May Think – Een toekomstvisioen In 1945 schreef de Amerikaanse ingenieur Vannevar Bush een artikel voor een tijdschrift, Atlantic Monthly, dat achteraf gezien revolutionair genoemd kan worden. In dit artikel behandelt Vannevar Bush de problemen met betrekking tot de steeds maar groeiende hoeveelheid (wetenschappelijke) informatie en de problemen die dat met zich meebrengt. Bush zag drie uitdagingen: De verspreiding van informatie: In de tijd dat Bush zijn artikel schreef, werd informatie opgeslagen als boek, tijdschrift, rapport of ander papieren medium. Dat medium kon zich bevinden in een huis, een bibliotheek, in een ander land. Veel informatie was dus niet voor iedereen bereikbaar, en had daardoor ook geen waarde. De hoeveelheid informatie: Door de alsmaar toenemende hoeveelheid informatie werd het steeds moeilijker om relevante informatie terug te vinden. Het probleem van ‘door de bomen het bos niet meer zien’. De wijze waarop we informatie kunnen vinden: Je kunt naar bepaalde informatie zoeken via allerlei indexen, maar dat is een tijdrovende en inefficiënte methode. Het menselijke brein slaat kennis immers ook niet op alfabetische volgorde op. Naast deze problemen gaf Bush ook een visie van een wereld waarin dergelijke problemen opgelost waren. Om de verspreiding van informatie tegen te gaan pleitte hij voor één groot informatiesysteem, dat hij ‘Memex’ noemde. De Memex zag hij als een geautomatiseerd systeem, waarin alle informatie ondergebracht kon worden. Het systeem zou ook draagbaar moeten zijn, zodat je het makkelijk mee kunt nemen en overal kunt gebruiken. Daarnaast zou de informatie in dit systeem heel gemakkelijk te benaderen moeten zijn, op een intuïtieve manier. Vergelijkbaar met hoe de menselijke hersenen dat doen: op basis van associatie (Bush, 1945). 1.2 Hypertext Begin jaren ‘60 van de vorige eeuw raakt de Amerikaanse socioloog/filosoof Ted Nelson geïnteresseerd in de concepten van Vannevar Bush (Zeltser, 2015). Nelson gaat er mee aan de slag en schrijft er enkele boeken over. Hij startte een project genaamd Xanadu om enkele van deze concepten te realiseren. Eén ervan was het opzetten van een netwerk van aan elkaar gekoppelde computers. Daarnaast experimenteerde hij met manieren om informatie op een associatieve manier aan elkaar te koppelen. Het systeem dat hij hiervoor ontwikkelde, noemde hij ‘hypertext’. In hypertext worden informatiebronnen direct aan elkaar gekoppeld door in de tekst woorden en begrippen te voorzien van directe verbindingen (links) naar andere informatie (Eijk, sd). 8 1.4 ARPANET Op 4 oktober 1957 lanceerde de Sovjet Unie zijn eerste satelliet, de Spoetnik I. De satelliet was vanaf de hele aarde te zien én te volgen, want hij zond doorlopend een signaal van toonpulsen uit, dat zelfs door ‘gewone mensen’ met een gewone radio te ontvangen was. In één klap liet de Sovjet Unie zien dat zij technologisch superieur was aan het Westen. Deze gebeurtenis zette de Amerikaanse Defensie op zijn kop. De toenmalige president Eisenhower verklaarde dat de Verenigde Staten nooit meer verrast zou worden door zo’n onverwachte actie van de USSR en wetenschappers werden bij elkaar geroepen om na te denken over nieuwe technologieën die ervoor zouden zorgen dat Amerika altijd één stap voor zou liggen. Er werd een team in het leven geroepen dat dit doel zou moeten realiseren: Het Advanced Research Project Agency (ARPA) (Gillies & Cailliau, 2000). ARPA stond natuurlijk onder hoge druk en zocht naar manieren om deze doelstelling zo snel mogelijk – en met de minste kosten – te behalen. Er werd daarom ook vooral gekeken naar de technologie die al beschikbaar was en hoe deze beter ingezet kon worden. Daarbij viel het oog op de computersystemen die inmiddels beschikbaar waren bij het Amerikaanse leger. Deze waren vaak gepositioneerd bij universiteiten waar het leger wetenschappelijk onderzoek liet uitvoeren. Het plan ontstond om deze computers aan elkaar te koppelen, zodat daarmee een netwerk van computers kon worden opgezet. Verschillende partijen zouden zo elektronisch met elkaar kunnen communiceren. Dit zou wetenschappelijke ontwikkelingen kunnen versnellen. In 1969 introduceerde ARPA het ARPANET: een netwerk van zogenoemde ‘hostcomputers’ waaraan verschillende, kleinere en goedkopere minicomputers waren aangesloten. Dit netwerk werd ingezet om onderzoeksinstituten, werkend voor militaire doeleinden, dezelfde apparatuur te laten gebruiken. Dit was niet alleen communicatief gezien een handige opstelling, maar ook economisch, gezien er nu kosten bespaart konden worden omdat er minder ‘hostcomputers’ hoefden worden aangeschaft. De eerste verbinding tussen twee hostcomputers werd door de University of California in Los Angeles aangelegd tussen de UCLA en de Stanford University in september van dat jaar en een maand later werd het eerste bericht tussen de twee computers verstuurd (Griffiths, 2002). Het ARPANET werkte op basis van packet-switching, een systeem waarbij een bepaalde boodschap (bijvoorbeeld een document) word opgedeeld in kleine pakketjes die na elkaar worden verstuurd. Zo kunnen er meerdere pakketjes tegelijkertijd worden verstuurd op hetzelfde netwerk. Deze pakketjes worden dan, als ze eenmaal hun eindbestemming hebben bereikt, weer aan elkaar gezet tot een geheel. Steeds meer netwerken, van verschillende universiteiten en bedrijven, sloten zich aan op het ARPANET. Eind 1971 waren 23 hostcomputers op het netwerk aangesloten. Langzaam maar zeker werd het ARPANET steeds minder gebruikt voor militaire doeleinden. In 1983 werd de link met het leger definitief verbroken en was het internet geboren. Dat bestond in 1983 uit 100 hostcomputers, verspreid over de hele (westerse) wereld. 1.5 FTP Om informatie over een netwerk te versturen van de ene naar de andere computer, is een protocol nodig. Een protocol is een systeem van handelingen die op een bepaalde manier uitgevoerd moeten worden om een connectie tussen twee computers te maken en informatie te verzenden. Eén van de eerste en veel gebruikte protocollen werd geschreven door de Indiër Abhay Bhushan. Hij noemde het FTP, het ‘File Transfer Protocol’. Het werd het standaardprotocol om bestanden te versturen via het ARPANET. 9 1.6 WWW, HTTP, URL en HTML Informatie op het internet was echter nog steeds niet gemakkelijk bereikbaar. Dat vond ook Tim Berners-Lee, die in Zwitserland werkzaam was als onderzoeker bij de Europese Raad voor Kernonderzoek, ook wel bekend als CERN. Bij CERN kwamen wetenschappers van over de hele wereld samen om experimenten uit te voeren met de beroemde deeltjesversneller. Berners-Lee zag dat al deze wetenschappers moeite hadden met het delen van informatie. Om een bestand van een ander te kunnen bekijken, moesten de onderzoekers beschikken over de inlogcode van de computer waarop het desbetreffende bestand was opgeslagen. Dit was erg omslachtig en had nauwelijks voordeel boven het delen van informatie op papier. Er ontstond dan ook de behoefte aan een veilig openbaar systeem, waarbij informatie gemakkelijk gedeeld kon worden zonder wachtwoorden. Berners-Lee deed een voorstel om dit op te lossen met behulp van een systeem dat gebaseerd was op hypertext. In maart 1989 legde Tim Berners-Lee zijn eerste visie van wat later het Web genoemd zou worden voor aan zijn baas in een verslag genaamd ‘Information Management: A Proposal’. Zijn originele voorstel werd echter niet meteen geaccepteerd. Zijn baas schreef op de voorkant van het verslag de woorden ‘vaag maar spannend’ en gaf hem buiten zijn werk bij CERN om toch de tijd om aan het project te werken. Dat deed hij (Berners-Lee, 1989). In oktober van 1990 had Tim de drie fundamentele technologieën beschreven de basis vormen van een systeem dat hij het World Wide Web noemde: HTML: HyperText Markup Language. Een taal waarin wordt beschreven hoe een webpagina moet worden weergegeven. URL: Uniform Resource Locator. Een uniek adres om een afzonderlijk stukje data, bijvoorbeeld een webpagina of een bestand, op het web te kunnen identificeren. HTTP: HyperText Transfer Protocol. Dit protocol geeft aan hoe gelinkte bronnen van het web moeten worden ontvangen. HTML Met HTML introduceerde Tim Berners-Lee een opmaaktaal voor het web. Het is een inzichtelijke en eenvoudige taal die voor iedereen te leren en begrijpen is. Tekstuele informatie kan door middel van codes worden opgemaakt, zodat de informatie inzichtelijker gepresenteerd kan worden. Denk bijvoorbeeld aan vette of schuine letters, koppen en subkoppen en letters in verschillende kleuren. Daarnaast biedt HTML ook de mogelijkheid om een plaatje toe te voegen. URL Elk stuk informatie op het Web krijgt een uniek adres: de URL. Hierdoor is deze informatie afzonderlijk te benaderen. De URL kan in HTML gemakkelijk vastgemaakt worden aan een woord of korte zin. Zo kan via dat woord of die zin een koppeling gemaakt worden naar een andere informatiebron, die meer/andere informatie bevat over het betreffende woord. Die koppeling noemt Berners-Lee een ‘link’. De links zijn in HTML makkelijk te herkennen, want ze hebben een afwijkende kleur en zijn onderstreept. HTTP Voor het opvragen en weergeven van HTML was een nieuw protocol nodig. Ook dit werd door Tim BernersLee ontwikkeld: het HyperText Transfer Protocol of HTTP. Via dit protocol kan informatie in HTML-formaat worden verstuurd en uitgelezen. 10 Browser Om de binnengekomen informatie ook grafisch weer te geven, was een nieuw programma nodig. Het programma om de HTML-pagina’s te laten zien doopte hij ‘WorldWideWeb’: de eerste grafische webbrowser. De naam World Wide Web werd al gauw een synoniem voor het hele internet. Om verwarring tussen het Web en de browser te voorkomen, hernoemde Berners-Lee zijn browser daarom ‘Nexus’. Webserver Om webpagina’s die op een computer staan, ook aan anderen te kunnen laten zien, is een server-programma nodig. Ook dit werd door Berners-Lee ontwikkeld. Aan het eind van 1990 werd de eerste webpagina op het internet geplaatst. In 1991 werden de eerste mensen buiten CERN toegelaten tot deze nieuwe webgemeenschap (CERN, sd). 1.7 Gopher Op ongeveer hetzelfde moment werkte een team van de University of Minnesota aan een soortgelijke oplossing. Ook hier was het doel om informatie toegankelijker te maken. De insteek was echter wat anders. Dit team koos voor een hiërarchische interface waarmee menu’s en submenu’s weergegeven konden worden, vergelijkbaar met de inhoudsopgave van een boek in hoofdstukken en paragrafen. De interface was niet grafisch, maar tekstueel, en werd Gopher genoemd. Gopher werd iets eerder gepubliceerd dan het World Wide Web van Tim Berners-Lee en kreeg daardoor een flinke voorsprong met betrekking tot het aantal gebruikers en de populariteit. Veel wetenschappers vonden de strenge, gestructureerde regels waaraan Gopher-pagina’s moesten voldoen te verkiezen boven de – in hun ogen wel erg vrije – mogelijkheden van HTML (Kozierok, 2005, pp. 1431-1433). Toen de University of Minnesota in 1993 echter geld ging vragen voor het gebruik van de Gopher-software, daalde de populariteit zienderogen. Dit vooral ook, omdat CERN in reactie hierop de onderliggende code van zijn WWW kosteloos openbaar stelde (Connolly, 2000). 1.8 Mosaic Hoewel Berners-Lee een zeer indrukwekkende prestatie heeft neergezet met zijn internet-totaalpakket, moet zijn werk misschien toch meer gezien worden als ‘proof-of-concept’. Zo was de browser die hij programmeerde zeer gelimiteerd en primitief. Ondermeer door het vrijkomen van de broncode konden ook anderen zich richten op de verdere ontwikkeling van het web. Eén van degenen die zich hierop richtte en voor grote veranderingen heeft gezorgd is Marc Andreessen. In 1992 studeerde Marc Andreessen computerwetenschappen en was werkzaam bij het NCSA (National Center for Supercomputing Applications). Via NCSA kon hij veel gebruik maken van het internet en het Web. Er waren al een aantal webbrowsers beschikbaar, maar de meesten waren voor Unix-systemen, die vrij duur waren. Dit betekent dat het Web vooral gebruikt werd door wetenschappers en engineers die toegang hadden tot zulke machines. De interface van deze browsers zou je daarnaast ook niet bepaald gebruiksvriendelijk kunnen noemen. Dit verhinderde de uitbereiding van het aantal gebruikers van het WWW. Daarom besloot Marc een webbrowser te maken die makkelijker te gebruiken was. Samen met een vriend en medestudent schreef hij het script voor de browser die zij Mosaic noemden. Het was een browser die op grafisch gebied veel uitgebreider was dan andere browsers uit de tijd. Zo konden in deze browser afbeeldingen weergegeven worden op de webpagina zelf (eerdere browsers stonden alleen de weergave van plaatjes in een nieuw venster toe). Daarnaast was de gebruiksvriendelijkheid van Mosaic een verlichting 11 in vergelijking met voorgaande browsers. In begin 1993 kon Mosaic gratis gedownload worden via NCSA’s servers. De browser werd een succes met meer dan 5000 downloads per maand. De originele versie was alleen beschikbaar op Unix, maar al snel maakte Andreessen, samen met een team van studenten, een versie die ook gebruikt kon worden op PC en Mac. Mosaic werd beschikbaar voor het grote publiek. Dit gaf weer een boost in het aantal downloads. Begin 1994 werd Mosaic zelfs genoemd op de voorpagina van de New York Times. Mosaic was niet de eerste webbrowser, maar wel de browser die het Web populair heeft gemaakt bij het grote publiek (Dalakov, sd). 1.9 Explosieve groei Met de komst van Mosaic kwamen de ontwikkelingen in een stroomversnelling. Het internet werd in zeer korte tijd heel populair en dat bleef niet onopgemerkt. Grote partijen, waaronder software-reus Microsoft, werden wakker en gingen zich actief richten op het internet. Ook zagen verschillende partijen mogelijkheden om geld te verdienen met het web. Dit alles resulteerde in de browser-wars, opkomst van nieuwe multinationals en uiteindelijk in de internet-bubble. 1.9.1 Browser-wars Marc Andreessen, de ontwikkelaar van de Mosaic-browser, werd door een investeerder benaderd om een commerciële versie te maken van zijn browser. Andreessen zag dit wel zitten en ontwikkelde, samen met een flink team, Netscape Navigator. Eén van de grote verbeteringen ten opzichte van Mosaic was, dat Netscape al delen van de pagina kon weergeven, ook al was (nog) niet de gehele inhoud van de pagina opgehaald. In de beginjaren van het internet waren de verbindingen nog erg traag, en het laden van bijvoorbeeld een plaatje kon behoorlijk lang duren. Deze verbetering maakte dat het surfen op het internet veel sneller kon. Gebruikers ruilden hun Mosaic-browser dan ook al gauw om, vooral ook omdat Netscape voor niet-commerciële gebruikers gratis was. Bedrijven en instellingen moesten wel een bedrag betalen voor het gebruik van Netscape. Niet veel later kwam ook Microsoft met een eigen browser: Internet Explorer. Qua functionaliteit was Internet Explorer vergelijkbaar met Netscape Navigator. Het grote verschil was echter, dat Internet Explorer voor iedereen gratis was, ook voor commerciële bedrijven. Beide browsers voerden een felle strijd om de gebruiker. Deze strijd werd in het voordeel van Microsoft beslist toen het bedrijf zijn Internet Explorer tot een geïntegreerd onderdeel maakte van zijn nieuwe besturingssysteem Windows 98 en later ook van Windows XP. Voor gebruikers van Windows-PC’s was het nu niet meer nodig een browser te installeren, waarmee Netscape in korte tijd vrijwel al haar gebruikers verloor. In 2002 gebruikte 96% van alle internetters Internet Explorer om het web te bezoeken (Beattie, 2014). Verschillende partijen, waaronder de Europese Commissie, vonden dat Microsoft hiermee zijn boekje als monopolist te buiten ging. Microsoft werd verplicht een browser-keuze aan te bieden in zijn besturingssysteem. Dit ook omdat de ontwikkelingen en verbeteringen met betrekking tot de browser vrijwel stilstonden wegens gebrek aan concurrentie. Het besluit van de EU leidde ertoe dat verschillende partijen weer brood zagen in de ontwikkeling en verbetering van browsers. Het team achter Netscape begon opnieuw als Mozilla en lanceerde de Firefox-browser. Apple kwam met Safari en Google later met Chrome. Inmiddels is dit de meest gebruikte browser, al houden de andere browsers een stabiele groep gebruikers. 12 1.9.2 Opkomst van de commercie Niet alleen browserontwikkelaars zagen de commerciële potentie van het internet. Verschillende mensen zagen dat internet de ideale manier was om oude en nieuwe producten in de markt te zetten. Eén van de eerste grote internetwinkels is Amazon. Al in 1994 ging de eerste website online. Het enorme aanbod en de makkelijke manier van zoeken – hét voordeel van een geautomatiseerd systeem – zorgden ervoor dat het bedrijf snel kon groeien. Een jaar later, in 1995, volgde eBay: een online marktplaats in allerhande tweedehands spullen. Het gratis plaatsen van advertenties en de mogelijkheid om wereldwijd kopers te vinden maakten dat deze site al gauw enorm populair werd. In Nederland waren vergelijkbare websites als Wehkamp (1995), Marktplaats en bol.com (beide 1999) er ook vroeg bij. Duizenden commerciële initiatieven volgden, de één met meer succes dan de ander. 1.9.3 Internet Bubble De razendsnelle ontwikkelingen mondden al gauw uit in een hype. Investeerders die nog niet op internet actief waren, waren bang iets mis te lopen. Hierdoor waren veel investeerders wel erg happig om te investeren in online bedrijven, zonder echt kritisch te zijn naar het ondernemingsplan. Bedrijven die succesvol waren, zoals Amazon, maakten grote verliezen, omdat ze vooral investeerden in groei en de winstgevendheid als ‘voorlopig nog niet belangrijk’ bestempelden. Alle investeringen waren gericht op het verwerven van een plek op de markt en nieuwe klanten. De investeerders vonden het echter allemaal geweldig, en aandelenkoersen bleven, ondanks de verliezen, alsmaar stijgen (Beattie, sd). Dat dit niet lang goed kon gaan, bleek begin 2000. In april 2000 verloor Microsoft de rechtszaak die Netscape bij de EU had aangespannen. Daardoor verloor Microsoft ook een flink deel van zijn marktwaarde op de beurs. Tegelijkertijd speelden er ook enkele financiële schandalen, waaronder die met internetprovider WordCom en energiegigant Enron, die het vertrouwen geen goed deden. In Nederland voltrok zich een soortgelijk drama rond internetprovider World Online. Het gevolg was, dat investeerders plots kritisch gingen kijken naar hun investeringen en zich terugtrokken uit technologiefondsen. De aandelenkoersen van internetgerelateerde bedrijven kelderden. Zo kostte een aandeel Yahoo! op 3 jan. 2000 nog $118,75; anderhalf jaar later, op 26 september 2001, betaalde je voor ditzelfde aandeel nog slechts $8,11 (Wikipedia, 2017). 1.10 Social Media De periode na de internet bubble betekende niet dat de ontwikkelingen op het internet tot stilstand kwamen. De populariteit van internet als informatiebron, catalogus en entertainmentkanaal bleef alleen maar toenemen. Voor bedrijven die actief waren in de infrastructuur van het internet, zoals glasvezel- en kabelbedrijven en internetproviders was er dan ook geen reden om te stoppen met het verbeteren van hun services en te werken aan een beter, sneller en betrouwbaarder internet. Verschillende opkomende bedrijven hebben hiervan kunnen profiteren. De belangrijkste hiervan kennen we nu als ‘Social Media’, websites als Youtube en Facebook. Hoewel er altijd sociale netwerken geweest op het internet, zelfs al in de tijd van ARPANET, nam de hype rond Social Media pas echt serieuze vormen aan toen het mogelijk werd om makkelijk en snel foto’s en video’s te delen. 1.11 Het web nu en in de toekomst Nog steeds groeit het internet en daarmee het aantal gebruikers en diensten. Nieuwe initiatieven als AirBNB, Netflix en Uber groeien als kool. In de top 5 van de meest waardevolle bedrijven ter wereld (Forbes) zitten maar liefst 4 die direct internetgerelateerd zijn: Apple, Google, Microsoft en Facebook. 13 Het web heeft zich ondertussen ook verplaatst van de huiskamercomputer naar de mobiele telefoon en tablet en begint nu met een opmars naar andere apparaten: de Smart-TV en slimme apparaten als thermostaten en koelkasten. Het internet speelt ondertussen een haast cruciale rol in het leven van de moderne mens. In Duitsland heeft de rechter in 2012 bepaald dat het zelfs een ‘Elementaire Levensbehoefte’ is geworden. Dat betekent dat we ondertussen ook echt afhankelijk zijn geworden van het internet. Zo is het aangifte doen van belasting zonder internet niet eens meer mogelijk. Die afhankelijkheid roept ook allerlei vragen op. Vooral ook, omdat die vaak gepaard gaan met vragen rondom uitwisseling van gegevens en de daarmee samenhangende privacy. Ondertussen is duidelijk dat er regelgeving nodig is om de privacy van de internetgebruikers te beschermen. Of dit inderdaad gaat lukken, is de vraag . Waarschijnlijk staat ons op dit gebied nog wel het één en ander te wachten. Het volgende hoofdstuk in de geschiedenis van het Web zo heel goed de ‘Privacy Wars’ kunnen heten. 14 2. De eerste zoekmachines Hoewel de basis van het internet al in 1969 met het ARPANET werd gelegd, was het anno 1990 nog steeds niet mogelijk om op dit netwerk makkelijk informatie te vinden. Er waren ondertussen enkele honderden systemen aangesloten op het internet. Het internet werd vooral gebruikt om informatie onderling uit te wisselen. Zo kon onderzoeker A van universiteit X via e-mail contact opnemen met onderzoeker B van Universiteit Y en hem vragen om bepaalde informatie. Onderzoeker B gaf dan aan onderzoeker A de exacte locatie van deze informatie door. Onderzoeker A kon deze informatie dan via FTP downloaden naar het systeem van zijn universiteit. De mogelijkheid om informatie elektronisch uit te wisselen was natuurlijk een enorme vooruitgang vergeleken met de oude situatie, waarbij informatie alleen per post verzonden kon worden, maar was nog ver verwijderd van een situatie waarin je als zoeker zelfstandig naar informatie op zoek kunt gaan en deze ook kunt vinden. Wel circuleerden er tussen gebruikers van internet enkele lange lijsten met daarop de locaties en bestandsnamen van populaire bestanden. Deze lijsten waren echter vaak niet up-to-date, en ook lang niet alle op internet beschikbare bestanden stonden op zo’n lijst. 2.1 Archie Peter Deutsch, Alan Emtage en Bill Heelan van de McGill University in Montreal kwamen in 1990 met een handige ‘tool’. Ze verzamelden de gegevens van FTP-servers en vroegen van elke server maandelijks een lijst op van alle op de servers beschikbare bestanden. Vervolgens werd eens per maand een lijst van alle bestandsnamen op de verschillende ftp-servers naar de server van McGill University gekopieerd en in één lange lijst gezet. Op deze manier ontstond er een complete, maar vooral ook up-to-date lijst van alle via het internet beschikbare FTP-bestanden. Daarnaast ontwikkelden ze een UNIX-commando waarmee deze lijst doorzocht konden worden. Door een zoekterm in te voeren, kon een bestand met de bijbehorende locatie in de lijst gelokaliseerd worden. Dit commando noemden ze Archie. Het wordt gezien als de eerste zoekmachine op internet. Het is belangrijk om je te realiseren, dat met Archie alleen op bestandsnamen gezocht kon worden. Je moest dus weten wat de exacte bestandsnaam was om deze te kunnen vinden. Archie is dus eigenlijk niets meer dan een soort telefoonboek-met-zoekfunctie voor bestanden. Archie gaf verder geen informatie over de aard of de inhoud van de bestanden. Archie gaf ook alleen de locatie van het bestand. Met deze informatie kon je vervolgens met behulp van andere commando’s het bestand binnenhalen (Gaffin & Heitkötter, 1994). 2.2 Veronica en Jughead Archie was niet alleen een verkorting van het woord ‘archives’, maar ook het hoofdpersonage in de stripboekenserie Archie Comics. Twee andere karakters uit de serie: Veronica Lodge en Jughead Jones vormen dan ook de inspiratie voor de namen van twee opvolgers van Archie. De zoekmachines Veronica (1992) en Jughead (1993) werkten vrijwel identiek als Archie, maar met één groot verschil: ze maakten gebruik van het inmiddels zeer populaire Gopher-protocol. Met Gopher was het mogelijk om een gebruikersinterface met menu’s en indexen te creëren. Hierdoor kon ook gezocht worden met behulp van mappenstructuren. Door informatie onder te brengen in een mappenstructuur, kon de informatie gecategoriseerd worden. In plaats van te zoeken op een bestandsnaam, kon je met Veronica en Jughead zoeken op 15 mapnaam. De zoekterm ‘Afrika’ levert dan als resultaat de map ‘Afrika’, met daarin documenten over Afrika, maar ook nieuwe mappen, met namen als Angola, Egypte en Benin, die de zoekrichting verder kunnen verfijnen. 2.3 The World Wide Web Wanderer In 1993 waren zowel Gopher als het World Wide Web flink aan het groeien. MIT-student Matthew Grey was benieuwd hoe groot de omvang van het WWW inmiddels was. Om dat te achterhalen schreef hij een klein programmaatje dat automatisch webpagina’s bezocht en indexeerde. Het programmaatje was ook in staat om URL’s uit de webpagina’s te filteren. Deze URL’s werden geplaatst in een lijst van nog te bezoeken webpagina’s, om op een later moment ook geïndexeerd te worden. Matthew Grey noemde het programmaatje The World Wide Web Wanderer. Zonder het te weten had Grey in één klap een fundamentele techniek ontwikkeld, die een belangrijke rol zou spelen in de toekomst van de zoekmachine en het web, namelijk die van de webcrawler: een programma dat volstrekt automatisch links van het web kan verzamelen. Deze webcrawler was ook de eerste ‘bot’: een programma dat zich voordoet als een gebruiker en automatisch gebruikershandelingen verricht. In dit geval het klikken op links. Bij het ontwerp van The World Wide Web Wanderer had Matthew Grey gekozen voor een algoritme dat DepthFirst heet (zie Hoofdstuk 7). Depth-First is een manier om informatie in een netwerk te indexeren. Deze keuze bleek achteraf niet zo verstandig. Het genereerde een enorme hoeveelheid dataverkeer, waardoor webservers vastliepen en webpagina’s crashten. Deze problemen zorgden voor een slechte reputatie van webcrawlers bij zowel websitehouders als bij andere gebruikers. Ook al paste Grey zijn software snel aan om van zijn crawler een Breadth-First crawler te maken, veel mensen hielden hun aversie tegen de bots (Kuyoro, Okolie, Kanu, & Awodele, 2012). The World Wide Web Wanderer had alle potentie om uit te groeien tot een echte zoekmachine, maar dat is nooit gebeurd. Het enige doel van Matthew Grey was het meten van de omvang van het WWW. Hij had niet de ambitie om zijn crawler uit te breiden tot zoekmachine. 2.4 Zoeken op het WWW: ALIWEB Kort na de verschijning van de Wanderer maakte ALIWEB zijn debuut. ALIWEB, gemaakt door de Nederlander Martijn Koster in 1993 was de eerste zoekmachine voor het web van Tim Berners-Lee. De naam ALIWEB stond voor Archie-Like Indexing of the WEB (Robbins, 2014). ALIWEB maakte gebruik van een handmatig aanlegde index (verzameling websites). Dit was een bewuste keuze die direct het gevolg was van de ellende die de The World Wide Web Wanderer veroorzaakt had. Websitehouders konden hun site, aangevuld met een omschrijving, aanmelden bij ALIWEB. Vervolgens werd deze pagina toegevoegd aan de zoekindex. Het grote nadeel van ALIWEB was de beperkte omvang van de index. Er werden maar heel weinig webpagina’s aangemeld. Dit had als voornaamste oorzaak dat mensen niet door hadden dat ze hun website moesten aanmelden om in de index te komen. En als ze al wisten dat ze dat moesten doen, hadden velen moeite met het vinden van de manier om dat te doen. Door al deze verwarring bleef de index erg beperkt en werd ALIWEB nooit veel gebruikt. Martijn Koster was ook de initiatiefnemer van de Robot Exclusion Standard. Het is een afspraak met de grote zoekmachines en biedt websitehouders de mogelijkheid om de toegang tot (delen van) hun site te blokkeren voor hun robots en crawlers. De afgeschermde webpagina’s worden dan niet geïndexeerd in zoekmachines (Schwartz, 2014). 16 2.5 W3Catalog ALIWEB probeerde zelf een index te maken van sites, maar een zoekmachine die net iets later uitkwam met de naam W3Catalog besloot het anders aan te pakken. De maker van W3Catalog Oscar Nierstrasz wist dat er al vele lijsten met geïndexeerde webpagina’s bestonden en besloot daar gebruik van te maken. Door die al bestaande lijsten in een database te zetten, had W3Catalog al snel een relatief uitgebreide index van webpagina’s. 17 3. Search wordt volwassen Terwijl het web alsmaar bleef groeien en steeds meer gebruikers kreeg, was het nog steeds lastig voor gebruikers om daadwerkelijk de informatie te vinden die ze zochten. Er is dan ook een grote behoefte aan enige vorm van ordening of bepaling van relevantie om meer van de informatie op het web te kunnen profiteren. Individuele gebruikers maakten lijstjes met links naar relevante informatie of favoriete websites, die ze deelden met andere gebruikers. Anderen probeerden met geautomatiseerde tools (webcrawlers) het totale web bereikbaar te maken. Er ontstond in deze periode dan ook een scheiding in inzichten, een strijd tussen kwantiteit en kwaliteit: het automatisch indexeren van alle informatie op het web versus het handmatig indelen en rubriceren van een beperkte hoeveelheid relevante goede informatie. 3.1 De eerste moderne zoekmachines Eind 1993 en begin 1994 ontstonden de eerste zoekmachines die we ‘moderne zoekmachines’ zouden kunnen noemen: JumpStation, de World Wide Web Worm en de Repository-Based Software Engineering (RBSE)-spider. Ze beschikken alle over de kenmerken die nu nog steeds gelden voor een zoekmachine: Een database met locaties van webpagina’s en bestanden; Een crawler om webpagina’s te indexeren; Een gebruikersinterface die gebruikmaakt met HTML; Hoewel ze al wel alle kenmerken hadden van een moderne zoekmachine, was er één punt waarop deze zoekmachines het toch lieten afweten: het presenteren van de zoekresultaten. Van een volgorde op basis van relevantie was nog geen sprake. Bovendien werden bij het indexeren alleen de URL’s en de titel van een webpagina opgeslagen, wat te weinig informatie is om überhaupt de relevantie van een pagina te kunnen bepalen. 3.1 Yahoo! Twee studenten van Stanford University, David Filo en Jerry Yang, waren niet geïnteresseerd in irrelevante informatie. Zij wilden het internet gebruiken om een in de Verenigde Staten zeer populair spel, Fantasy basketbal, te winnen. Om dit te kunnen doen, was up-to-date relevante informatie over basketbalwedstrijden, teams en -spelers een absolute must. Het verzamelen van die informatie was een flinke klus, vooral ook omdat er geen websites waren met verzamelingen gerelateerde links die hierin konden helpen. De beide studenten realiseerden zich dat dit gold voor vrijwel alle informatie op het web. Ze besloten daarom om op Jerry’s computer een lijst te plaatsen met de webpagina’s die ze leuk of interessant vonden om ze later gemakkelijk terug te vinden – net als zoveel andere studenten en wetenschappers deden. En net als zoveel anderen, deelden ze hun lijst, ‘Jerry and David’s Guide to the World Wide Web’, met vrienden en collega’s. Deze vrienden en collega’s kwamen al gauw met suggesties voor nieuwe links, waardoor de lijst al snel groeide en er een behoefte ontstond aan een zekere ordening. Een systeem van rubrieken en subrubrieken lag voor de hand. Jerry en David lieten zich hierbij inspireren door het Dewey-systeem, dat in Amerika in bibliotheken wordt gebruikt om boeken te classificeren. Ze verdeelden hun links in onder rubrieken zoals ‘Science’, ‘Recreation and Sports’ en ‘Entertainment’ zodat bepaalde links over een bepaald onderwerp gemakkelijker terug te vinden waren. Deze gerubriceerde verzameling links, de eerste webdirectory, werd ontzettend populair gezien het de enige van zijn soort was. Het was voor mensen de enige manier om gemakkelijk op het web te kunnen surfen. Een 18 maand na de openbaarmaking van hun ‘Guide to the World Wide Web’ hadden David en Jerry al gebruikers van over de hele wereld. Ze besloten het zelfde jaar nog hun naam te veranderen naar iets simpelers en vlotters: het werd ‘Yahoo!’ de naam stond voor Yet Another Hierarchical Officious Oracle. Met de term ‘hierarchical’ wordt de opbouw van de database beschreven: namelijk in lagen van categorieën en subcategorieën. Met het woord ‘oracle’ wordt een ‘bron van waarheid en wijsheid’ bedoeld. De naam was echter vooral gekozen vanwege de betekenis van het woord ‘yahoo’ namelijk ‘rude, unsophisticated, uncouth’. De naam Yahoo! was al in gebruik door een bedrijf dat barbecuesauzen produceerde. Om toch een trademark te krijgen op de naam hebben ze een uitroepteken toegevoegd. Toch was het indelen in categorieën niet helemaal het Ei van Columbus. Met een alsmaar groeiende webdirectory en met steeds meer rubrieken en subrubrieken, werd het vinden van een link toch steeds lastiger. Om bij een bepaalde URL te komen moest je subcategorie na subcategorie door. Yahoo! voegde daarom een zoekfunctie toe waarmee alle sites in de database te vinden waren. Steeds meer webpagina’s werden aangemeld bij Yahoo!, maar omdat het categoriseren met de hand werd gedaan, verscheen niet elke webpagina direct in de directory. Wel werden deze pagina’s in de index geplaatst, zodat ze door middel van de zoekfunctie al te vinden waren. In plaats van gebruik te maken van de webdirectory gingen dus steeds meer mensen de zoekfunctie gebruiken, omdat er via die weg veel meer informatie werd aangeboden. Het succes van Yahoo! had ook een keerzijde. Om de grote hoeveelheid bezoekers aan te kunnen, waren flinke investeringen in nieuwe en dure apparatuur nodig. Ze moesten dus op zoek naar investeerders. Daarbij liepen ze op tegen een probleem: nog niemand had een manier gevonden om geld te verdienen met het internet. Door het open karakter van het web, heerste er ook een mentaliteit van vrijheid en anarchie, en was ‘geld’ een vies woord. In het begin van de jaren ’90 werden debatten over het toelaten van de commercie op het internet vrij hevig. Aan de ene kant zaten de durfkapitalisten die adverteren als dé manier zagen om gebruik te maken van de grote getalen mensen die naar het internet getrokken werden. Aan de andere kant zaten mensen die het internet zagen als een non-commercieel utopiaanse omgeving die toegankelijk was voor iedereen. Er zat voor David Filo en Jerry Yang dus een zeker risico in het aangaan van banden met investeerders. Investeerders eisten dat ze advertenties zouden toestaan op hun platform. David en Jerry waren bang dat dit hun bezoekers flink zou afschrikken. Maar tegelijkertijd hadden ze het geld wel nodig om hun site online te kunnen houden. Uiteindelijk zijn ze toch overstag gegaan en lieten ze het plaatsen van advertenties toe op Yahoo! In tegenstelling tot hun verwachting bleven de negatieve effecten uit. Sterkere nog: het aantal gebruikers van hun dienst bleef stijgen. Dit opende de ogen van ondernemers en adverteerders. Het bleek plots mogelijk om met internet geld te verdienen. 3.2 WebCrawler Terwijl Yahoo! aan zijn opmars bezig was, werkte Brian Pinkerton van de universiteit van Washington aan een programma genaamd WebCrawler. WebCrawler was de eerste spider die de volledige inhoud van een webpagina indexeerde. Door de volledige inhoud van een pagina te indexeren, leverde een vraag aan de zoekmachine niet alleen resultaten op waarin de zoekterm in de titel of de URL van de pagina voorkwam, maar ook pagina’s waar de zoekterm in de tekst van de pagina stond. Dit was een enorme sprong voorwaarts in het specifiek zoeken. Vooral ook, omdat veel pagina’s titels en URL’s hadden die de lading van de inhoud niet (goed) dekten. WebCrawler werd al gauw zo populair, dat de zoekmachine overdag niet gebruikt kon worden. 19 4. The Clone Wars Het succes van Yahoo! en WebCrawler bleef niet onopgemerkt. Ontwikkelaars en investeerders zagen nieuwe kansen en mogelijkheden om ‘iets’ met ‘search’ te doen. Er werd plotseling massaal geïnvesteerd in nieuwe zoekmachines. Al gauw kreeg Yahoo! concurrentie van zoekmachines zoals AltaVista, Lycos en Excite. De zoekmachines onderscheidden zich op verschillende manieren. Sommige experimenteerden met een prettigere lay-out, anderen met een andere volgorde van zoekresultaten of een krachtigere crawler. De onderlinge concurrentie en subtiele aanpassingen van de zoekmachines hadden als gevolg dat gebruikers met enige regelmaat van favoriete zoekmachine wisselden. De belangrijkste zoekmachines uit deze periode zijn Lycos, AltaVista, InfoSeek, Excite en HotBot. Het wetenschappelijke tijdschrift Science besteedde in 1997 aandacht aan de deze concurrenten, maar laat daarbij relevante informatie achterwege (Peters & Sikorski, 1997). 4.1 Lycos ‘Lycos (Grieks voor spin) is een hybride tussen een zoekmachine (met een index van 100 miljoen pagina’s) en een directory. Deze zoekmachine bied echter niet de geavanceerde zoekopties zoals die wel aangeboden worden door HotBot. Aan de andere kant geeft het wel een door mensen samengestelde directory bestaande uit 18 categorieën (met onder andere wetenschap, educatie en gezondheid). Het bevat de 5% meest bezochte webpagina’s en wordt per week met 100 nieuwe pagina’s uitgebreid.’ (Peters & Sikorski, 1997). Lycos had de grootste database met webpagina’s in die tijd. Dat maakte deze zoekmachine enige tijd de meest bezochte website ter wereld. Lycos had wel het grootste aantal geïndexeerde pagina’s, maar het indexeerde niet de gehele pagina. Dit was om (kostbare) opslagruimte te besparen. Het was dus een keuze van kwantiteit boven kwaliteit. 4.3 AltaVista ‘AltaVista is een project van Digital Equipement om de kracht van hun Alpha Web server te laten zien. Het is een van de snelste zoekmachines die momenteel beschikbaar is en heeft een index van meer dan 30 miljoen pagina’s. De zoekmachine stelt de gebruiker in staat om op het web te zoeken in verschillende talen. Van Chinees tot Zweeds. De geavanceerde zoekoptie staat Boolean Operaters toe zoals AND, OR en NEAR (wat ervoor zorg dat de twee woorden in de zoekquery binnen 10 woorden van elkaar staan).’ (Peters & Sikorski, 1997). Zoeken op internet vergde midden jaren ‘90 toch wel enige basiskennis over de werking van zoekalgoritmes. Belangrijk was vooral het besef dat elk woord dat je opgaf op de pagina voor moest komen om tussen de zoekresultaten te verschijnen – en dat je irrelevante woorden vooral weg moest laten. Niet iedereen had dat door. AltaVista maakte het de gebruikers die niet over deze kennis beschikten makkelijker om te zoeken door ‘natuurlijke vragen’ toe te staan. Woorden uit de natuurlijke taal die voor de zoekopdracht niet relevant waren, en dat zijn simpelweg de meest gebruikte woorden in een taal, werden door de zoekmachine uit de zoekopdracht gefilterd. Zo wordt ‘Wat is de hoofdstad van Nederland’ omgezet tot ‘hoofdstad Nederland’. AltaVista kon dit relatief simpele trucje uitvoeren in verschillende talen. Daarnaast indexeerde AltaVista, in tegenstelling tot Lycos en een aantal andere zoekmachines, de volledige tekst van de door de crawler bezochte pagina’s. De zoekresultaten van AltaVista bevatten dus ook relevante webpagina’s die niet via andere zoekmachines gevonden konden worden. 20 4.3 InfoSeek ‘Deze zoekmachine (met wel 50 miljoen geïndexeerde documenten) heeft vier variaties: Ultrasmart, een simpele zoekmachine die de basis geeft voor het zoeken op het web; UltraSeek geeft een reeks geavanceerde zoekopties zoals de mogelijkheid om op hele zinnen te zoeken, woordvariaties ook mee te rekenen (bij de zoekterm ‘poes’ worden ook resultaten met ‘poezen’ weergegeven), hoofdlettergevoeligheid en het kunnen opgeven van een bepaald zoekveld (waarmee alleen in de URL of in de titel gezocht kan worden). NewsCenter geeft de laatste nieuwsberichten weer, georganiseerd in categorieën, en SmartInfo is een collectie van tools die je laten zoeken naar bijvoorbeeld emailadressen, telefoonnummers en bedrijven.’ (Peters & Sikorski, 1997). InfoSeek was niet innovatief. Het combineerde technologieën van zowel Yahoo! als Lycos. Maar originaliteit is niet altijd het belangrijkst. InfoSeek had een gebruiksvriendelijke interface. De toevoeging van extra diensten, waaronder een Track&Trace-functie voor UPS en het weergeven van nieuwsberichten, maakten dat InfoSeek door veel gebruikers als een prettige en handige zoekmachine werd ervaren. InfoSeek werd pas echt populair na een deal in 1995 met Netscape. InfoSeek verkreeg door die deal de positie van default search engine van de populairste browser van dat moment. Het resultaat was, dat vrijwel alle internetgebruikers bij het opstarten van hun browser de zoekmachine van InfoSeek te zien kregen. 4.4 Excite ‘Een andere hybride zoekmachine. Excite heeft een index van 50 miljoen webpagina’s en een directory met 150.000 website verdeeld in 14 categorieën zoals banen, educatie en gezondheid. Je kunt ook emailadressen opzoeken en de aandelenkoers en het weer bekijken. De Powersearch optie van Excite stelt de gebruiker in staat om woorden of zinnen te zoeken maar dat stelt niet zo veel voor in vergelijking met de andere zoekmachines. Excite heeft wel een gratis email adres aangeboden aan al zijn gebruikers.’ (Peters & Sikorski, 1997). Excite bood naast zoekresultaten ook allerlei andere informatie aan, zoals aandelenkoersen, nieuws, informatie over showbusiness en sport. Gebruikers konden gratis een e-mailadres aanmaken, wat zorgde voor een zekere mate van klantenbinding. 4.5 Hotbot ‘Hotbot is een zoekmachine van de makers van Wired. Deze snelle zoekmachine heeft een index van 53 miljoen webdocumenten. Met een query kunnen er zowel exact als bijna exact overeenkomende zoekresultaten worden weergegeven. Boolean operators worden ook toegestaan. Zoekresultaten kunnen worden toegespitst op geografische locaties, specifieke data en zelfs op type medium (afbeelding, geluid, etc.) Gebruikers kunnen de interface aanpassen naar hun eigen wensen en deze instellingen opslaan voor later gebruik.’ (Peters & Sikorski, 1997). Wired, de maker van HotBot, is een Amerikaans/Brits tijdschrift over technologie wat de ontwikkeling van zoekmachines op de voet gevolgd heeft. Wat HotBot wezenlijk bijzonder maakt, is dat het een metazoekmachine is. Een meta-zoekmachine maakt niet gebruik van één index, maar combineert de zoekresultaten van meerdere zoekmachines. De positie van het zoekresultaat wordt bepaald door de posities in de verschillende zoekmachines te vergelijken en combineren. 21 4.6 Van zoekmachine naar portal Een zoekmachine is in essentie een hulpmiddel om snel en gemakkelijk naar andere webpagina’s te komen. Het is dus ook geen site waar mensen lang blijven rondsurfen. Dat maakt, dat een zoekmachine niet de meest slimme plek is om advertenties te plaatsen. Een bezoeker is immers niet geïnteresseerd in een zoekmachine, maar in een zoekresultaat. Yahoo! was één van de eerste zoekmachines die dat ondervond. De zoekmachine had al snel adverteerders, maar omdat bezoekers niet bleven hangen op de website, was het rendement van die advertenties zeer beperkt. Yahoo! zocht daarom naar manieren om de gebruiker langer op zijn site te houden – en andere zoekmachines deden exact hetzelfde. We zien dat zoekmachines in de late jaren ‘90 steeds meer veranderen naar een soort van entertainmentkanaal met shownieuwsberichten, horoscopen en sportuitslagen. De mogelijkheid om websites op te zoeken is nog steeds een essentieel onderdeel van de sites, maar raakt wel steeds meer op de achtergrond. Zoekmachines worden ‘Portals’: websites die het begin zijn van de ‘webexperience’. Door middel van gratis e-mailadressen, chatrooms en webspace, waarop gebruikers hun eigen webpagina’s kunnen plaatsen, concurreerden de zoekmachines (en andere Portals) om de positie van ‘startpagina van de browser’: de pagina waar je naar toe gaat als je de browser opent. Ze zagen daarin ook een ‘hoger doel’: de gebruiker beschermen voor de ‘chaos van het web’ door belangrijke informatie op één site aan te reiken (Tatnall, 2005). 4.7 Irritatie De metamorfose van zoekmachine naar portal werd niet door iedereen omarmt. Sterker nog: er waren veel gebruikers die zich irriteerden aan al deze extra services en die juist wilden dat de zoekfunctie verbeterde. Maar dat gebeurde niet. Veel zoekmachines boden zelfs de mogelijkheid om een zoekmachinepositie te kopen. Hierdoor ging de kwaliteit van zoekresultaten achteruit. Voor de gebruiker was het onduidelijk of een zoekresultaat nou heel relevant was, of dat de eigenaar van de pagina had betaald om bovenaan te staan. Daarnaast verschenen er ook steeds meer websites die de zoekalgoritmen van de zoekfuncties probeerden te saboteren. De meeste zoekmachines bepaalden de relevantie van een webpagina aan de hand van factoren als de woorddichtheid van een bepaald trefwoord en of het woord voorkomt in de titel. Deze factoren waren heel gemakkelijk te beïnvloeden. Door bijvoorbeeld honderden keren het woord ‘kat’ in witte letters op een witte achtergrond op je site te zetten, kon je gemakkelijk de woorddichtheid van ‘kat’ op jouw pagina verhogen, zodat je op een relatief simpele manier een hogere positie in de zoekresultaten kon bemachtigen. Zoekresultaten werden dus steeds onbetrouwbaarder. Er verschenen meer advertenties en saboterende sites tussen relevante resultaten. Het onderscheid was moeilijk te maken. Gok- en pornosites begonnen zich voor te doen als andere sites en kregen met behulp van een paar simpele trucs gemakkelijk een hoge relevantiescore op allerhande zoektermen die niets met hun daadwerkelijke handel van doen had. Aan het eind van de jaren ‘90 was de zoekende internetter eigenlijk weer terug bij af: als zoeker naar bepaalde informatie wist je dat er een enorme hoeveelheid relevante informatie binnen handbereik lag, maar je had geen idee hoe je deze kon bemachtigen. 22 5. Google Terwijl de doorsnee internetgebruiker liep te vloeken op de zoekmachines, was de student Larry Page op zoek naar een interessant onderwerp voor zijn masterscriptie. Verschillende onderwerpen waren de revue al gepasseerd. Page bleef hangen op ‘de structuur van het wereldwijde web’. Hij zag het web als één grote graaf (een wiskundige structuur bestaande uit punten of knopen die onderling verbonden zijn door lijnen). Hierbij stelde hij zich elke computer/webpagina voor als knoop (eng: node) en elke weblink als lijn (eng: edge) tussen twee knopen. Het web was waarschijnlijk de grootste graaf die ooit door mensen was gemaakt – en dat intrigeerde Page mateloos. Het moest wel zo zijn dat er allerhande nieuwe inzichten verborgen lagen in deze graaf, wachtend op een enthousiaste student om er een interessante scriptie over te schrijven. Page wist zijn begeleider te overtuigen en ging voortvarend mee aan de slag. Om de graaf van het WWW in beeld te krijgen, wilde Page gebruik gaan maken van een crawler – net als Matthew Grey dat enkele jaren eerder deed met zijn World Wide Web Wanderer om de omvang van het net te bepalen. Page zag in de publicatie van webpagina’s en gebruik van links om naar andere webpagina’s te verwijzen een overeenkomst met hoe wetenschappelijke verslagen gepubliceerd en geciteerd worden. Conclusies in wetenschappelijke verslagen berusten grotendeels op eerdere onderzoeken en conclusies getrokken door andere wetenschappers. Deze onderbouwingen worden aangegeven door middel van een citaat. Page zag een symmetrie tussen het citeren van andere verslagen in de wetenschap en het citeren van andere pagina’s door middel van links op het web. Net als dat het voor een wetenschapper leuk of interessant zal zijn om te weten door wie hij geciteerd wordt, leek het Page ook leuk om dit te doen voor webpagina’s: ‘It seemed kind of cool to gather all the links on the web and reverse them.’ (Battelle, 2011). Page redeneerde dat een webpagina met veel inkomende links waarschijnlijk een belangrijkere pagina was dan een webpagina met weinig inkomende links. En dat een pagina waarnaar werd gelinkt door een belangrijke webpagina, waarschijnlijk ook belangrijk zou zijn. Ietwat naïef begon Page met het bouwen van een crawler die elke webpagina op het internet af zou gaan en alle inkomende links van elke pagina zou noteren: BackRub. Maar al gauw liep hij tegen allerlei problemen aan. Hulp kwam in de vorm van Sergey Brin, een getalenteerde PhD-student die van het ene naar het andere project liep, maar iedere keer al snel verveeld raakte. Brin raakte zeer gefascineerd door het project van Page. Daarnaast konden beide studenten het goed met elkaar vinden. Samen met Sergey Brin ontwikkelde Page een algoritme dat met behulp van het aantal inkomende links van een pagina een soort ‘score van belangrijkheid’ aan een pagina zou geven. Dit algoritme noemden ze PageRank – naar de achternaam van Larry Page en dus niet, zoals ook wel wordt beweerd, naar het Engelse woord voor ‘pagina’. Helemaal toeval zal de dubbele betekenis van Page in de naam ‘PageRank’ natuurlijk ook niet zijn (Battelle, 2011). 23 5.1 PageRank De gedachte achter en het algoritme van PageRank is essentieel om het succes van Google als zoekmachine te begrijpen. Larry Page en Sergey Brin hebben niet alleen maar een alternatief algoritme geschreven om zoekresultaten een volgorde te geven, maar hebben met hun algoritme het probleem van ‘hoe bepaal je op een objectieve manier welke pagina belangrijk is en welke niet’ opgelost. ‘De reden waarom PageRank interessant is, is dat er verschillende situaties zijn waarin het simpel tellen van het aantal citaten niet overeenkomt met het gezonde verstand van wat belangrijk is en wat niet. Een voorbeeld: als een webpagina wordt gelinkt vanaf de homepage van Yahoo!, dan is het misschien maar één link, maar het is wel een hele belangrijke. Deze pagina zou dan ook een hogere rang moeten krijgen dan een pagina die vaker wordt gelinkt vanuit obscuurdere plaatsen.’ (Page, 1998). Page zegt hierin eigenlijk het volgende: (1) een webpagina waar vaak naar wordt gelinkt is belangrijk en (2) een webpagina waarnaar gelinkt wordt door een belangrijke pagina is belangrijk. PageRank is simpel gezegd gebaseerd op deze twee principes. De werking van het algoritme van PageRank komt uitgebreid aan bod in paragraaf 8.3. In 1997 vragen Page en Brin in de Verenigde Staten patent aan op deze manier van waardebepaling van een pagina. Het patent wordt in 2001 aan hen toegekend. 5.2 Op zoek naar kopers Page en Brin zagen meteen dat dit algoritme, toegepast in een zoekmachine, aanzienlijk betere en relevantere resultaten zou opleveren dan die van de zoekmachines die in die tijd werden gebruikt. Ook beseften ze, dat als één van de bedrijven die achter de grote zoekmachines zaten, geïnteresseerd zou zijn in het kopen van hun technologie, ze er veel geld mee zouden kunnen verdienen. Om hun algoritme aan potentiele kopers te kunnen demonstreren, bouwden ze hun algoritme om in een kleine zoekmachine. Vervolgens bezochten ze verschillende grote tech-bedrijven in de Valley. Hoewel het achteraf gezien bijna onbegrijpelijk lijkt, hadden Sergey en Larry erg veel moeite met het verkopen van hun idee. De grote ondernemingen zagen hun algoritme enkel als ‘weer een zoekmachine’. Daarnaast waren de eigenaren zoekmachine-sites als Yahoo! en Excite juist bezig om hun site om te bouwen tot portal. Ze vonden het idee van Google niet zo interessant, achterhaald en waren al helemaal niet bereid om er een flink geldbedrag voor neer te leggen (Brin en Page vroegen 1 miljoen dollar). Brin en Page verlieten bespreking na bespreking telkens weer met lege handen. 5.3 Online Ondanks de tegenslagen bij het zoeken naar een koper voor hun technologie, werkten Brin en Page verder aan hun zoekmachine. Ook plaatsten ze hun zoekmachine online op de website van de universiteit, zodat ook anderen er gebruik van konden maken. Ze doopten hun zoekmachine ‘Google’ (een misspelling van het woord ‘googol’ – 10^100) als verwijzing naar de enorme hoeveelheid informatie die de zoekmachine probeerde te waarderen. De zoekmachine werd als snel populair onder studenten en collega’s. Naarmate er meer mensen gebruik gingen maken van de zoekmachine, probeerden Page en Brin nieuwe functionaliteiten toe te voegen. Zo maakten ze een webcrawler die niet alleen de URL van de pagina indexeerde, maar de hele tekst. 24 De crawler zorgde voor wat bezorgdheid onder website-eigenaren. Sommigen schreven e-mails naar de universiteit en eisten een verklaring waarom een programma hun hele site had gedownload. Andere eigenaren waren bang dat Page en Brin hun content wilden stelen. Ook waren er eigenaren van websites die het niet eens waren met de manier waarop ze werden gerankt. Eén boze eigenaar van een site over de Amerikaanse Burgeroorlog vond het belachelijk dat zijn site niet als eerste zoekresultaat werd gegeven terwijl het toch overduidelijk was dat zijn site de beste was? (Battelle, 2011). Deze gemixte gevoelens over Google en de manier van het verzamelen en weergeven van informatie kwamen vooral doordat Google totaal anders was dan de zoekmachines die toen de tijd op de markt waren. 5.4 Google Inc. Hoewel het aantal enthousiaste gebruikers van hun zoekmachine alleen maar toenam, lukte het Page en Brin nog steeds niet om een koper voor hun algoritme te vinden. Ondertussen ontstond er rond hun zoekmachine ook nog een ander probleem: door de populariteit ervan nam de hoeveelheid dataverkeer flink toe. Op een gegeven moment was de zoekmachine verantwoordelijk voor bijna de helft van de totale bandbreedte van het netwerk van Stanford. En dat terwijl Stanford op dat moment het meest geavanceerde netwerk ter wereld had. Stanford verzocht Page en Brin vriendelijk doch dringend om hun zoekmachine ‘off-campus’ te plaatsen omdat de universiteit niet in langer staat was om de voor hun benodigde middelen te faciliteren. Het werd een noodzaak dat ze voor hun eigen apparatuur gingen zorgen. Maar daar was geld voor nodig, veel geld. En zonder geïnteresseerde kopers moesten ze daarom op zoek naar een investeerder. Ze vonden die in de vorm van Andy Bechtolsheim. Bechtolsheim was zelf ook een ‘techie’ van Stanford en medeoprichter van het succesvolle computerbedrijf SUN Microsystems. Hij zag gelijk de enorme potentie van Google en schreef bij de eerste meeting gelijk een cheque uit van 100.000 dollar, te betalen aan ‘Google Inc’, dat toen nog niet officieel bestond. Het eerste kantoor van Google was de garage van Susan Wojcicki, de zus van Sergey’s vriendin. Google groeide als kool. Op een gegeven moment kreeg Google meer dan tienduizend zoekqueries per dag. De lokale media begonnen zich ook af te vragen wat Google nou precies was. De aandacht die ze kregen in de media gaf een boost van bezoekers. Niet veel later was het aantal dagelijkse zoekopdrachten gegroeid tot een half miljoen (Battelle, 2011). Ondanks de toenemende belangstelling voor de zoekmachine, was het in de markt zetten van Google vooral een achterhoedegevecht. Google moest de strijd aangaan met rijke bedrijven die al jaren daarvoor groot waren geworden met zoekmachines als Yahoo!, AltaVista en Lycos. Gelukkig kreeg Google veel positieve aandacht in de media vanwege het innovatieve karakter van hun techniek. Bovendien waren veel websurfers de andere zoekmachines en hun commerciële benadering meer dan zat. Voor Google was dit een duidelijk signaal: er werden geen advertenties of commerciële mededelingen geplaatst – in ieder geval niet zolang er nog geen manier gevonden was om dat op een gebruiksvriendelijke manier te doen. 5.5 Don’t Be Evil ‘Vriendelijk zijn voor je gebruikers’ was een prioriteit voor Google. Het motto van het bedrijf was jarenlang Don’t Be Evil. Dit motto was vooral bedoeld richting de eigen medewerkers; maak geen dingen die slecht zijn voor de gebruikers van onze diensten. Naast gebruikers werden ook websitebouwers en -eigenaren vriendelijk verzocht zich naar dit motto te voegen. Vrijwel alle zoekmachines hadden last van websites die de zoekresultaten verstoorden op een oneerlijke manier, bijvoorbeeld door onzichtbare inhoud op hun pagina te plaatsen, met een betere zoekmachinepositie als enige 25 doel. Google keurde dit af, maar ging ook verder: je kon als bezoeker een foute site ‘aangeven’. Als Google inderdaad misleidende praktijken constateerde, werd de eigenaar gewaarschuwd of de hele site uit de Googleindex verwijderd. Je kunt je voorstellen dat dat een enorme straf is: als je als site niet te vinden bent in de grootste en meest bezochte zoekmachine ter wereld, loop je heel veel bezoekers mis. Zorgen dat je je als websitebouwer/eigenaar netjes aan de regels houdt, werd een noodzaak. Tegelijkertijd bleef natuurlijk het verlangen bestaan om zo hoog mogelijk te scoren in de zoekmachines – en dan met name Google. Dit streven heeft een hele nieuwe branche in het leven geroepen, die van de Search Engine Optimization (SEO): het zo netjes en correct mogelijk bouwen en programmeren van websites, en deze proberen van zoveel mogelijk inkomende links te voorzien. 5.6 AdWords en AdSense: de oplossing van het advertentieprobleem Terwijl Brin en Page zochten naar een manier om met Google geld te verdienen, was Bill Gross, de eigenaar van de start-up Idealab, bezig met het ontwikkelen van een soort Gouden Gids voor internet. Zijn gedachte was zeer simpel: als iemand op een zoekmachine zocht naar ‘camera’, dan zou een fabrikant als Nikon wellicht geinteresseerd zijn om hoog tussen de zoekresultaten van die gids te belanden. Nikon zou achter de schermen kunnen een bedrag kunnen bieden voor kliks die gegenereerd worden door de zoekterm ‘camera’. En andere camerafabrikanten, fotowinkels etc. zouden met deze bieding mee kunnen doen en zo met elkaar kunnen concurreren om de beste plek tussen de zoekresultaten. Gross combineerde dit advertentie-biedingssysteemmet de zoekresultaten van een grote zoekmachine en noemde het GoTo.com. Op deze website stonden advertenties en zoekresultaten door elkaar. De website werd een groot succes. De site trok de aandacht van Larry Page en Sergey Brin. De twee studenten brachten een bezoek aan Bill om te kijken of het mogelijk was om dit advertentieplatform en Google’s zoekmachine te combineren. Hoe het gesprek precies is gelopen, is niet bekend. Feit is wel dat er nooit een deal werd gesloten. In 2000 kwam Google met AdWords, een dienst die behoorlijk wat overeenkomsten vertoonde met die van Gross. Net als bij Gross konden adverteerders bieden op zoektermen. Advertenties werden echter niet tussen de zoekresultaten geplaatst, maar in duidelijke kaders rechts naast de zoekresultaten. Voor bezoekers was het heel duidelijk: de zoekresultaten staan links, de advertenties rechts. En ze hadden hier geen problemen mee. Gross echter wel. Die zag zijn grootste concurrent er met zijn idee vandoor gaan. Hij dreigde naar de rechter te stappen, maar de twee partijen kwamen er uiteindelijk samen uit. Gross kreeg een groot aantal aandelen in Google. Google bouwde het AdWordssysteem uit tot inmiddels het meest gebruikte advertentiesysteem op internet. De kracht van het systeem is, dat het heel toegankelijk is. Iedere ondernemer kan vrij gemakkelijk een account aanmaken en meebieden op zoektermen. Een kleine zelfstandige ondernemer kan bieden op dezelfde zoektermen als grote multinationals en zo direct met hen concurreren. Wat adverteerders ook erg prettig vinden, is dat ze alleen betalen als een bezoeker daadwerkelijk op hun advertentie klikt. Dat is een hele verbetering vergeleken met adverteren in de traditionele media, zoals krant, radio en TV, waarbij je als adverteerder een grote som geld moet investeren en vooraf nauwelijks kunt voorspellen wat het rendement zal zijn. De beste advertentieposities werden niet alleen gegeven aan de hoogste bieders, maar ook aan de beste adverteerders. Op de advertenties werd een variant van het PageRank-algoritme losgelaten. De advertenties waarop het meest werd geklikt of die het beste aansloten bij de zoekterm krijgen een hogere positie dan de minder goede of minder populaire advertenties. De eerste adverteerder die wordt weergegeven naast de zoekresultaten 26 is dus niet per definitie ook degene die het meeste betaalt. Bovendien heb je als adverteerder de mogelijkheid om te adverteren in een bepaald geografisch gebied. Een bloemist uit Hengelo hoeft dus alleen maar te adverteren in Hengelo, en hoeft daardoor niet te concurreren met bloemisten in Rotterdam of New York. Naast AdWords bracht Google ook AdSense uit. Websitehouders kunnen een bepaalde ruimte op hun website beschikbaar stellen waar Google zijn AdWords-advertenties op kan plaatsen. In eerste instantie werden advertenties vooral gelinkt aan de content van de site: op een site over Portugal stonden vooral reisaanbieders, op een site over showbusiness advertenties van kledingmerken, parfums en sieraden. Tegenwoordig maakt Google profielen aan van websitebezoekers en worden vooral advertenties weergegeven die gekoppeld zijn aan eerdere zoekopdrachten of websites die de bezoeker al eerder bezocht heeft. De eigenaar van de website kan kiezen voor verschillende formaten en stijlen, en zelf aangeven waar op zijn website advertenties worden geplaatst. De eigenaar kan ook zelf bepalen of advertenties van bv. concurrenten wel of niet geplaatst worden. Voor elke klik op een advertentie ontvangt de website-eigenaar een vergoeding. Als je een drukbezochte site had, kon hier een goed inkomen uit halen. Google heeft nu een advertentienetwerk dat zich wereldwijd uitstrekt en dat zowel hobbypagina’s bevat als gerenommeerde media. 5.7 Google nu Het bedrijf Google Inc. heeft in de loop der jaren allerlei nieuwe innovaties voortgebracht. De bekendste zijn Google Earth, een project om de hele wereld letterlijk in kaart te brengen; Google Streetview, een uitbreiding op Google Earth, waarmee je daadwerkelijk in iedere straat rond kunt kijken; Google Android, een besturingssysteem voor mobiele apparaten; Google Chrome, ondertussen één van de populairste browsers en Google Analytics, een programma waarmee bezoekersstatistieken van websites geanalyseerd kunnen worden. Daarnaast heeft Google verschillende bedrijven opgekocht, waaronder Picasa, een fotobewerkingsprogramma en YouTube, de grootste videosite ter wereld. Ook investeert Google flink in allerlei nieuwe technieken, varierend van zelfrijdende auto’s tot Kunstmatige Intelligentie. Veel van die ondernemingen zijn nogal risicovol, omdat totaal onduidelijk is of een bepaald p[project zal leiden tot een winstgevend product of dat het een stille dood zal sterven. Om investeerders gerust te stellen heeft Google een moedermaatschappij opgericht met de naam Alphabet. Google Inc. Is daar nu een dochteronderneming van. Alphabet heeft op het moment van schrijven Apple ingehaald als het meest winstgevende bedrijf ter wereld. Het bedrijf maakte in 2015 een winst van 6,7 miljard dollar en had een beurswaarde van 568 miljard dollar. Wat betreft de zoekmachine is er ook veel veranderd: het algoritme is in de loop der jaren flink aangepast. Deels is dat om extra functionaliteit toe te voegen. Zo kun je met Google nu ook zoeken op afbeeldingen of vragen stellen als ‘hoe is het weer morgen’, ‘hoeveel is 20 graden Celsius in Fahrenheit?’ of ‘7539 + 6278’ en worden er actuele nieuwsberichten getoond bij zoektermen die betrekking hebben op de actualiteit. Toch zijn er ook wat ontwikkelingen die wat meer zorgen baren. Google manifesteert zich ondertussen op zoveel terreinen, en slaagt er zo goed in om ontwikkelingen aan elkaar te koppelen, dat er een voor de gebruikers een privacy probleem ontstaat. Door het koppelen van allerlei diensten, waaronder Google’s mailprogramma Gmail, de advertentieprogramma’s Adsense en AdWords en de zoekmachine Google zelf, kunnen de handelingen van de bezoekers op vrijwel elke plek op het internet gevolgd worden. Dat doet Google ook en daar maken ze geen geheim van. De data die verzameld wordt, wordt gebruikt om profielen van te maken, die weer worden ingezet voor het aanbieden van passende advertenties. 27 Dit gaat veel gebruikers veel te ver. Het probleem is echter, dat Google ondertussen zo dominant is op het web, dat het vrijwel onmogelijk is om hieraan te ontkomen. ‘”Het is bijna onmogelijk om op internet niet van Google-diensten gebruik te maken", aldus de toezichthouder die daarbij verwijst naar de zoekmachine, Gmail en YouTube. ''Google spint een onzichtbaar web van onze persoonsgegevens, zonder onze toestemming. En dat is bij wet verboden", stelt CBP-voorzitter Jacob Kohnstamm.’ (Hoek, 2013). Google verschuilt zich bij dit soort issues vaak achter Amerikaanse wet- en regelgeving, die veel ruimer is en bedrijven veel meer vrijheid geeft. Ondertussen is het voor gebruikers al jaren volstrekt onduidelijk welke en hoeveel informatie Google ondertussen over elke gebruiker heeft verzameld. Ook is totaal onbekend of en in welke mate bijvoorbeeld de Amerikaanse overheid en eventuele andere partijen meekijken in die data. En wat er met die data gebeurt. Het oude motto van het bedrijf, ‘Don’t be Evil’, begint lijkt zich ondertussen tegen Google zelf te keren. Misschien heeft Google daarom wel het motto ondertussen vervangen door ‘Do The Right Thing’. En nu maar hopen, dat dat daadwerkelijk is wat ze gaan doen. 28 DEEL II DE TECHNIEK ACHTER DE ZOEKMACHINE 6. De techniek achter de zoekmachine In dit deel van mijn onderzoek naar zoekmachines ga ik dieper in op de achterliggende techniek van de zoekmachines. Hoe werkt zo’n zoekmachine nu precies en hoe komt het dat de zoekresultaten tussen zoekmachines zo verschillend kunnen zijn? Om die vragen te kunnen beantwoorden, leek het mij interessant om zelf een zoekmachine te programmeren. Door dit te doen, hoop ik in aanraking te komen met dezelfde problemen en uitdagingen als waarmee eerdere gebruikers en ontwikkelaars bij het zoeken van informatie en bij het bedenken van oplossingen voor het beter ontsluiten van informatie, geconfronteerd werden. 6.1 Een infrastructuur Om zelf een zoekmachine te kunnen bouwen, moet eerst een soort infrastructuur worden aangelegd. Die infrastructuur bestaat uit: Een databasesysteem waarmee een database kan worden gecreëerd. De database gebruik ik om informatie (zoals webpagina’s) op te slaan; Een programmeertaal waarmee ik informatie kan opvragen uit de database, opdrachten en berekeningen kan uitvoeren en resultaten kan weergeven; Een webserver die de opdrachten van de programmeertaal kan uitvoeren, de communicatie tussen de database en de programmeertaal verzorgt en die informatie verstuurt naar de browser van de bezoeker; Een computer waarop dit allemaal geïnstalleerd is; Deze onderdelen zijn nodig om een infrastructuur te creëren waarin uitwisseling van informatie kan plaatsvinden op de volgende manier: 30 De pagina’s met code bevatten instructies voor de webserver. Deze kan de code lezen, berekeningen uitvoeren en de database raadplegen. De resultaten worden omgezet naar html, dat door de browser van de gebruiker wordt weergegeven als een webpagina. Er verschillende leveranciers van databases, webservers en programmeertalen die geschikt zijn voor het web. Ik koos voor de combinatie van een Windows-computer, een Apache webserver, een MySQL-database en PHP als programmeertaal. Dit is een veelgebruikte combinatie. Het wordt dan ook als een soort van alles-in-een-pakket aangeboden onder de naam WAMP. Het hele pakket is (met uitzondering van de computer) ‘open-source’ en gratis te downloaden (WAMP, sd). 6.2 De drie processen van een zoekmachine Een zoekmachine kent drie processen: het verzamelen van (informatie over) webpagina’s, het analyseren van die informatie om relevantie te bepalen en het bieden van een platform om in deze informatie te zoeken. Verzamelen van informatie Het eerste proces, het verzamelen van informatie, gebeurd volledig achter de schermen, zonder interactie met de gebruiker. Dit proces verzamelt volledig automatisch (informatie over) alle pagina’s op het web en slaat deze op. Het bepalen van relevantie In dit proces wordt de verzamelde informatie data geanalyseerd om de relevantie van een pagina met betrekking tot de zoekterm te bepalen. Ook dit proces is onzichtbaar voor de gebruiker. Toegang verschaffen tot de informatie Het derde proces, het platform, betreft het interactieve gedeelte van de zoekmachine. Via een invulveld kan een gebruiker een zoekterm opgeven. Deze wordt verstuurd naar de webserver. Code op de webserver ‘leest’ de zoekterm, raadpleegt de database, maakt een lijst van relevante webpagina’s, sorteert deze, en stuurt deze lijst naar de browser van de gebruiker. In de volgende hoofdstukken worden deze processen nader bekeken. 31 7. Verzamelen van informatie Voor het verzamelen van informatie maakt een zoekmachine gebruik van een crawler. Een crawler is een programma dat volledig geautomatiseerd het web afstruint, op zoek naar nieuwe of veranderde webpagina’s. De crawler gedraagt zich als een bezoeker die op alle links van een webpagina klikt, deze bezoekt, enkele notities maakt en vervolgens ook hier weer op alle links klikt. De crawler maakt natuurlijk geen notities, maar zet specifieke informatie in een database. Zo’n geautomatiseerd proces dat net doet alsof het een gebruiker is, wordt ook wel ‘bot’ (afgeleid van ‘robot’) genoemd. Daarnaast kom je ook van de term ‘spider’ tegen. Vaak worden de termen ‘crawler’, ‘spider’ en ‘bot’ door elkaar gebruikt. Een crawler en spider zijn echt synoniemen van elkaar, en omvatten alleen processen die webpagina’s verzamelen en indexeren. ‘Bot’ is een wat breder begrip, dat staat voor alle geautomatiseerde processen die zich gedragen als een gebruiker (Franklin , 2000). De manier waarop websites aan elkaar gelinkt zijn, kan worden weergegeven als een graaf van een bijzonder type: de boom. De webpagina’s 1 t/m 6 zijn de nodes van de graaf. Deze nodes zijn verbonden door edges, in dit geval dus de links naar andere webpagina’s. Daarnaast wordt in de boom een onderscheid gemaakt tussen parents en children. In ons geval is een parent een webpagina die linkt naar andere pagina’s, en een child een webpagina die links ontvangt. Elke node (pagina) heeft dus een parent, behalve de eerste node. Deze wordt daarom ook wel de root genoemd. In ons geval is dat de website waarmee de crawl begint. Een pad in een boomstructuur heet een branch. Nodes van eenzelfde ‘generatie’ worden een level genoemd (Miller & Ranum, sd). Nu zijn er in de grafentheorie twee manieren om zo’n boom te benaderen: de diepte in of verkennen via de breedte, ofwel depth-first of breadth-first (Eppstein, 1996). In het schema hierboven is het verschil tussen de twee methoden duidelijk weergegeven. Hoewel in theorie beide methoden gelijkwaardig zijn, werken de meeste zoekmachines in de praktijk met een breadth-first crawler. De reden hiervoor is van technische aard: een depth-first crawler moet alle voorgaande 32 pagina’s waar hij is geweest opslaan in zijn werkgeheugen om, als hij in een bepaalde branche niet verder kan, door te kunnen in een andere, niet eerder verkende branche. Het werkgeheugen van de crawler is echter niet oneindig en kan op een gegeven moment vol zitten. Als de crawler niet terug kan kijken naar zijn voorgaande stappen, dan is hij niet meer in staat te achterhalen of een bepaalde branche al is gecrawld. Hij is dan ‘verdwaald’ en kan twee dingen doen: ofwel stoppen met crawlen (foutmelding) ofwel een pad inlopen dat al gecrawld is, om vervolgens binnen de kortste keren weer te verdwalen (eindeloze loop). Dit was ook precies het probleem waar de eerste crawler, de World Wide Web Wonderer (zie 2.3) tegen aanliep. De breath-first methode heeft dit technische probleem niet. In plaats van het hele pad te onthouden, maakt een breath-first algoritme gebruik van een rij waarin de nodes opeenvolgend geplaatst worden. Het algoritme hoeft alleen maar de volgorde van de rij af te gaan om de informatie te verzamelen, zonder voorgaande stappen te onthouden. De stappen die een breadth-first algoritme doorloopt om webpagina’s te indexeren, worden weergegeven in onderstaand stroomdiagram. 33 7.1 Stappen die doorlopen worden Het algoritme doorloopt de volgende stappen: Stap 1 Eerst wordt er (handmatig) één URL in de database geplaatst. Dit noem ik de start-URL. Stap 2 Het algoritme scant vervolgens de inhoud van de pagina die hoort bij de URL. Welke informatie van de pagina de crawler precies opslaat in de database, verschilt per zoekmachine. De eerste zoekmachines indexeerden alleen de titel van de pagina. Latere zoekmachines indexeerden steeds meer informatie. Met name de zogenaamde ‘metatags’ waren lange tijd belangrijk. Metatags zijn extra gegevens over een pagina, die de maker van de pagina zelf aan de code van de pagina toe kan voegen. In deze metatags staan dan bv. een omschrijving (meta description) en/of trefwoorden (meta keywords) (Franklin , 2000). Nu werden de metatags in het verleden vaak misbruikt. Daarom worden ze door veel zoekmachines nu niet langer als relevant gezien. In plaats daarvan indexeren moderne zoekmachines vrijwel allemaal de inhoud van de hele webpagina. Dat dat nu wel gedaan wordt en eerder niet, heeft te maken met het steeds ruimer en goedkoper worden van opslagmedia. Stap 3 De volgende stap is het verzamelen van de uitgaande links op de betreffende webpagina. Links zijn in de HTML-code te herkennen aan bepaalde tags (stukjes code). Door handig zoek, knip- en plakwerk kan de crawler de links uit de pagina filteren. De links worden in een tijdelijke lijst in het werkgeheugen van de webserver opgeslagen. Stap 4 De uitgaande links worden nu één voor één gecontroleerd. De crawler kijkt of de betreffende link al in de database voorkomt of niet. Is de link nieuw, dan wordt deze toegevoegd aan de database en zal deze link op een later moment worden bezocht en geïndexeerd. Bevindt de link zich al wel in de database, dan doet de crawler ofwel niets, ofwel hij maakt hiervan bij de link een notitie. Zo kan later aan de hand van bijvoorbeeld het aantal keer dat een pagina ergens gelinkt wordt, een waarde aan de pagina toegekend worden. Onder andere Google maakt gebruik van deze waarde als een variabele in hun sorteeralgoritme. Stap 5 Als alle uitgaande links zijn geanalyseerd en geplaatst in de database, en een pagina dus geen resterende uitgaande links meer heeft, is dat een signaal voor het algoritme dat de cyclus met betrekking tot het indexeren van de informatie van deze pagina is doorlopen. De crawler kan nu de tijdelijke lijst met uitgaande links uit zijn werkgeheugen wissen. Hij vraagt nu aan de database welke URL in de database volgt op de zojuist geïndexeerde pagina. In plaats van één URL staan er in de database nu meerdere, namelijk al de URL’s die de crawler in Stap 4 uit de pagina heeft gefilterd. De crawler kiest de eerstvolgende link en verwijst vervolgens naar Stap 2. 34 7.2 De stappen verwerkt in code Bij het programmeren van de code voor de crawler probeer ik zo dicht mogelijk bij de stappen te blijven die beschreven staan in het stroomschema en de vorige paragraaf: Stap 1: Start-URL plaatsen in de database (start.php en stap-01.php) De spider heeft een start-URL nodig vanwaar hij de crawl kan starten. Ik had deze URL natuurlijk handmatig in de database kunnen zetten, maar het is makkelijker om in HTML een kort invulformulier te maken waar ik de URL in kan voeren en een programmaatje wat de ingevoerde URL in de database zet: <form action="stap-01.php" method="GET"> <input class="text" type="text" name="url" value="http://"> <input class="button" type="submit" value="Spider!"> </form> De code hierboven geeft een invulvlak waar ik de start-URL kan invoeren: Deze URL geeft de code door aan een pagina met de naam stap-01.php. Pagina stap-01.php is het programma wat de ingevoerde start-URL in de database zet. De eerste stap is het opvragen van de gegeven URL: $url = $_GET["url"]; Nu de pagina de ingevoerde URL kent, kan hij deze in de database plaatsen. Een database is eigenlijk niets anders dan een grote tabel met waarden die je kunt invoeren en opvragen in je code. Om die waarden te plaatsen of te verkrijgen moet je eerst contact maken met de database. Je kunt het vergelijken met een telefoongesprek: je belt de database op, zegt wat je nodig hebt en hangt vervolgens weer op. De eerste stap is dan ook het ‘opbellen’ van de database. $db = new mysqli('localhost', 'root', 'xxxx', 'spider01'); De naam van de database is spider01 en localhost is de naam van de server op mijn computer. De gebruikersnaam van de database is root en xxxx staat voor het wachtwoord. In de database heb ik al eerder een tabel met de naam ‘links’ aangemaakt. Deze is nu nog leeg. Om de URL in de database te plaatsen, maak ik gebruik van SQL. SQL staat voor ‘Standard Query Language’ en wordt gebruikt om te communiceren met databases. Met deze taal kun je informatie opvragen, toevoegen, wijzigen of verwijderen uit databases. $sql = "INSERT INTO links (url) VALUES ('$url')"; Het SQL-commando wordt pas uitgevoerd als deze door middel van een commando aan de database wordt doorgegeven: $result = mysqli_query($db, $sql); Nu het commando is uitgevoerd, is ook de eerste URL in de database geplaatst. Met het volgende commando sluit ik de verbinding met de database: 35 $db -> close(); Stap 1 is nu afgerond. De crawler kan nu verder naar Stap 2. Omdat Stap 2 een URL nodig heeft om een pagina te kunnen indexeren, geef ik de (start-) URL mee aan de volgende PHP-pagina: header('Location: stap-02.php?url='.$url); Om er helemaal zeker van te zijn dat er na het doorsturen van de URL naar stap-02.php geen processen meer lopen en er geen verbindingen meer zijn met de database, kun je de pagina een soort van zelfmoord-opdracht geven, waarmee alles processen en verbindingen verbroken worden: die(); Stap 2: Scan de webpagina en plaats informatie in de database (stap-02.php) De eerste stap is dus weer het ophalen van de URL. $url = $_GET["url"]; Deze stap is echter niet alleen een vervolg op Stap 1, maar ook op Stap 5. Alle URL’s die geïndexeerd worden door de crawler, komen langs deze stap. Nu bevatten sommige URL’s lettertekens die kunnen conflicteren met mijn PHP of SQL-code. Om problemen te voorkomen, vervang ik deze tekens door een duidelijk herkenbaar alternatief. Zo wordt het &-teken vervangen door //AMP//. Waar nodig kan ik de oorspronkelijke tekens weer terughalen door op bepaalde plekken in de code //AMP// weer te vervangen door het &-teken. $url = str_replace("//AMP//", "&",$url); $url = str_replace("//Q//", "?",$url); $url = str_replace("//S//", "'",$url); De volgende stap is het ophalen van de pagina die behoort bij de URL. Met onderstaand commando haal ik de hele HTML-code op en plaats deze onder de naam $content in het werkgeheugen van de webserver. $dom = new DOMDocument('1.0'); @$dom->loadHTMLFile($url); $content = $dom->saveHTML(); Ook in de content kunnen tekens zitten die problemen geven. Heel vervelend is de apostrof. Die conflicteert met zowel PHP als SQL. Daarom vervang ik alle apostroffen in de content door het erop lijkende maar onschadelijke ` -teken (een accent-grave zonder letter): $content = str_replace("'", "`", $content); Eerst ga ik de titel en de metatags uit de code van de pagina filteren. De metatags zijn heel gemakkelijk via PHP op te vragen: $tags $keywords $description = get_meta_tags($url); = $tags['keywords']; = $tags['description']; 36 De titel is vreemd genoeg een stuk lastiger. De titel van een pagina is in de HTML-code te vinden tussen de <title> en </title> -tags. Ik vond een scriptje op internet dat deze tags in de HTML-code opspoort en de titel ertussenuit knipt: preg_match('/<title>([^>]*)<\/title>/si', $content, $match ); if (isset($match) && is_array($match) && count($match) > 0) { $title = strip_tags($match[1]); } De informatie over de URL kan nu worden aangevuld met de gefilterde informatie: de title en de metatags description en keywords. Ook plaats ik in één veld de gehele content van de pagina, zodat deze later ook doorzocht kan worden: $sql ="UPDATE links SET title = '$title', description = '$description', keywords = '$keywords', content = '$content' WHERE url = '$url'"; Vervolgens open ik de database, voer het commando uit en sluit de database: $db = new mysqli('localhost', 'root', '1234', 'spider01'); $result = mysqli_query($db, $sql); $db -> close(); Stap 3: Het filteren van de links op de pagina (stap-03-04.php) Er is geen standaard commando voor het filteren van links op de pagina. Net als bij de title in de vorige stap, moet er gezocht worden naar een patroon. Omdat ik zelf niet precies wist hoe ik dit aan moest pakken, heb ik dit stuk code van het internet. Hoewel ik de stappen die worden doorlopen niet helemaal tot op de komma begrijp, is de functie wel duidelijk: de verschillende links op de pagina worden uit de pagina gehaald en in een tijdelijke lijst in het werkgeheugen van de webserver geplaatst. De HTML-aanduiding voor een link (hypertext reference) is ‘href ’, dus vandaar het gebruik van de variabele $href. $anchors = $dom->getElementsByTagName('a'); foreach ($anchors as $element) { $href = $element->getAttribute('href'); if (0 !== strpos($href, 'http')) { $path = '/' . ltrim($href, '/'); if (extension_loaded('http')) { $href = http_build_url($url, array('path' => $path)); } else { $parts = parse_url($url); $href = $parts['scheme'] . '://'; if (isset($parts['user']) && isset($parts['pass'])) { $href .= $parts['user'] . ':' . $parts['pass'] . '@'; } $href .= $parts['host']; if (isset($parts['port'])) { $href .= ':' . $parts['port']; } $href .= $path; } } Sommige links bevatten codes voor speciale tekens. Deze moeten worden omgezet. Rawurldecode is een commando dat codes zoals %C3%AB in de URL omzet in wat ze betekenen. In dit geval dus ‘ë’. $href= rawurldecode($href); 37 Ook staat er soms een apostrof in een link. Zoals ik al eerder had aangegeven zijn die erg vervelend. Ik vervang deze daarom door //S//: $href = str_replace("'", "//S//",$href); Stap 4: Selecteer de eerstvolgende link in de tijdelijke lijst met links (stap-03-04.php) Stap 3 en Stap 4 worden op dezelfde PHP-pagina geprogrammeerd. Dit is omdat de tijdelijke lijst die wordt aangemaakt in Stap 3 niet overgedragen kan worden naar een andere PHP-pagina, omdat bij het wisselen van PHP-pagina het werkgeheugen van de webserver wordt gewist. En de tijdelijke lijst is wel nodig om Stap 4 uit te voeren. Eén voor één worden de links uit de tijdelijke lijst vergeleken met de links in de database. Alleen als een link nog niet voorkomt ($result → num_rows = 0) wordt de link met een SQL-commando in de database geplaatst: $db = new mysqli('localhost', 'root', '1234', 'spider01'); $sql = "SELECT url FROM links where url='".$href."'"; $result = mysqli_query($db, $sql); if($result -> num_rows = 0){ $sql = "INSERT INTO links (url) VALUES ('$href')"; } else { $sql = "";} $result = mysqli_query($db, $sql); $db -> close(); Stap 4 is nu afgerond. Vervolgens worden bepaalde tekens in de URL omgezet, zodat deze zonder problemen kan worden doorgestuurd naar de volgende PHP-pagina: $url = str_replace("&", "//AMP//",$url); $url = str_replace("?", "//Q//",$url); $url = str_replace("'", "//S//",$url); header('Location: stap-05.php?url='.$url); die(); Stap 5: Ga naar d eerstvolgende URL in de database (stap-05.php) Wat er in Stap 5 gebeurt, is niet zo spannend. Eigenlijk geeft stap-05.php slechts de opdracht om de volgende URL in de database te kiezen en deze URL door te sturen naar Stap 2 (stap-02.php). Eerst wordt de URL opgevraagd en de ‘lastige tekens’ teruggeplaatst. $url=""; $url = $_GET["url"]; $url = str_replace("//AMP//", "&",$url); $url = str_replace("//Q//", "?",$url); $url = str_replace("//S//", "'",$url); De URL is nu weer terug in zijn originele vorm. 38 In de database kijk ik op welke positie (ID) deze URL staat: $db = new mysqli('localhost', 'root', 'xxxx', 'spider01'); $sql= "SELECT id, url FROM links WHERE url='".$url."' ORDER BY id"; $result = mysqli_query($db, $sql); $row = $result -> fetch_assoc(); $id = $row['id']; Nu het ID van de zojuist geïndexeerde URL bekend is, kan de URL die er op volgt, worden opgevraagd: $sql= "SELECT url FROM links WHERE ID>".$id." order by ID"; $result = mysqli_query($db, $sql); $row = $result -> fetch_assoc(); $newurl = $row['url']; $db -> close(); Nu de volgende URL bekend is, kunnen de lastige tekens uit de URL vervangen worden, waarna de URL wordt doorgestuurd naar Stap 2 (stap-02.php): $url = str_replace("&", "//AMP//",$url); $url = str_replace("?", "//Q//",$url); $url = str_replace("'", "//S//",$url); header('Location: spider-02.php?url='.$newurl); die(); Hier zal stap-02.php de URL ophalen en weer helemaal overnieuw beginnen. Dit proces zal doorgaan tot alle webpagina’s die op de één of andere manier gelinkt zijn aan de start-URL zijn geïndexeerd (en dat is mogelijk het hele World Wide Web) of totdat ik het proces handmatig stop. 39 8. Het bepalen van relevantie Het resultaat van het eerste proces, het verzamelen van informatie, is niets meer dan één grote tabel met daarin alle gevonden URL’s en informatie over die URL’s, zoals de paginatitel, metatags en inhoud: ID URL 1. 2. 3. TITLE DESCRIPTION KEYWORDS CONTENT http://blog.xs4all.nl/me Astrids Blog Het blog van… astrid, vries, blog, <HTML> http://www.dierenarts... Dierenkliniek Hans Dierenkliniek… dierenkliniek, hans, <HTML> http://www.kattenasie... Kattenasiel MIAUW Kattenasiel... kat, katten, poes, <HTML> Zo’n tabel is in principe al genoeg om als basis te dienen voor een zoekmachine. De afzonderlijke velden kunnen doorzocht worden op het al dan niet voorkomen van een zoekterm. Dit is ook precies hoe de eerste zoekmachines tot hun zoekresultaten kwamen. Een zoekmachine als Yahoo! keek lange tijd alleen maar of een zoekterm voorkwam in de URL of titel van een webpagina. Latere zoekmachines keken ook naar de metatags keywords en description. Zoekmachine Webcrawler was in 1994 de eerste zoekmachine die ook het zoeken in de volledige content mogelijk maakte. Het zoeken en vinden van een zoekwoord in een veld is vrij eenvoudig. Met een simpele query kun je alle pagina’s waarin het woord ‘kat’ voorkomt, uit de database halen. Het punt is wel, dat je dan slechts een lijst hebt van webpagina’s die het woord ‘kat’ bevatten. Deze lijst is op geen enkele wijze geordend. Dit is ook lange tijd de situatie geweest waar zoekers het mee moesten doen. Toch werden er ook pogingen gedaan om enige vorm van rangschikking te verkrijgen. Dat kan ook nog relatief eenvoudig, door te kijken of een zoekterm voorkomt in bijvoorbeeld de URL én de TITLE én de DESCRIPTION én de CONTENT. Zo’n zoekresultaat kun je hoger positioneren dan een zoekresultaat waarbij de zoekterm enkel in de CONTENT voorkomt. Hoewel dit een flinke verbetering is ten opzichte van de situatie waarin geen enkele rangschikking plaatsvind, heeft deze vorm van rangschikken toch behoorlijke tekortkomingen. Zo is het onmogelijk om twee sites, die beide voldoen aan dezelfde criteria, met elkaar te vergelijken, en op basis van die vergelijking hun onderlinge positie te bepalen. Om dat wel te kunnen doen, maken zoekmachines gebruik van een inverted index. 8.1 De inverted index Een inverted index is een tabel die vergelijkbaar is met een register of index in een boek: achter bepaalde belangrijke termen staan pagina’s vermeld waarop deze term voorkomt (Langville & Meyer, 2006). In een database betekent dit het volgende: er wordt een extra tabel aangemaakt met daarin alle (belangrijke) woorden in een taal. Vervolgens worden naast die woorden de ID’s van de webpagina’s genoteerd waarop deze woorden te vinden zijn. Dat ziet er dan als volgt uit: Aardappel {3, 6, 98, 692, 944} Bloem {107, 453, 478,} Kattenvoer {6, 453} Zetmeel {2, 3, 692, 725} In bovenstaand voorbeeld is de informatie die zoektermen eigenlijk identiek aan de situatie zonder inverted index: je kunt slechts zien dat een zoekterm voorkomt op een bepaalde pagina. Eén voordeel is er al wel: je 40 kunt veel sneller zoeken. In plaats van alle webpagina’s te scannen op het al dan niet voorkomen van een zoekterm, hoef je alleen maar de zoekterm op te zoeken in de inverted index. De zoekresultaten staan er gelijk achter. Door de inverted index van nog wat extra informatie te voorzien, kan meer gezegd worden over de relevantie van een pagina met betrekking tot een zoekwoord. Zo zou je kunnen zeggen, dat een pagina waarin het zoekwoord vaker voorkomt, relevanter is dan een pagina waarin het zoekwoord maar enkele keren genoemd wordt. Je kunt in de inverted index, naast alleen de pagina, ook aangeven hoe vaak het woord op de pagina voorkomt: Aardappel {3 [5], 6[9], 98[7], 692[11], 944[8]} Bloem {107[3], 453[7], 478[2]} Kattenvoer {6[1], 453[3]} Zetmeel {2[2], 3[4], 692[3], 725[8]} In dit voorbeeld kun je zien dat het woord ‘kattenvoer’ op pagina 6 één keer voorkomt en op pagina 453 drie keer. Je zou dus kunnen stellen dat pagina 453 relevanter is dan pagina 6 – als het om kattenvoer gaat, tenminste. Op deze wijze kan nog veel meer informatie aan de inverted index worden toegevoegd. Zo kan daarnaast ook genoteerd worden hoe vaak een zoekwoord voorkomt in de titel, URL, kopjes, metatags vetgedrukte woorden, etc. De record voor ‘kattenvoer’ ziet er dan bijvoorbeeld als volgt uit: Kattenvoer {6[1,0,0,0], 453[0,0,0,3]} Nu is te zien dat het woord ‘kattenvoer’ slechts één keer op pagina 6 staat, maar wél in de titel, en drie keer op pagina 453, maar slechts in de content, en niet in titel, URL of koppen. Dat maakt pagina 6 toch wel wat relevanter dan je uit alleen een word-count zou kunnen afleiden. Door een wegingsfactor toe te kennen aan de verschillende posities van zoekwoorden op een pagina, kan door middel van een formule een waarde voor de pagina met betrekking tot het zoekwoord worden berekend. Bijvoorbeeld zo: PaginaWaarde = (8 * inTitel) + (4 * inURL) + (3 * inKop) + (1*inContent) In ons voorbeeld betekent dit met betrekking tot zoekwoord ‘kattenvoer’ het volgende: Score Pagina 6 Score Pagina 453 : 8*1 + 0 +0 +0 = 8 :0+0+0+3=3 Waarmee pagina 6 een hogere waarde toegekend krijgt, dus relevanter is, als het gaat om dit zoekwoord. 8.2 De inverted index in code Voor het bepalen van de relevantie van een website, heb ik een beknopte woordenlijst aangelegd en een programma geschreven dat kan tellen hoe vaak die woorden voorkomen op een webpagina, en in welk onderdeel van de webpagina (de titel, de URL, kopjes, etc.). De resultaten worden geplaatst in een inverted index. De eerste stap is het opvragen van een URL. Het invoeren van de URL gaat door middel van een formulier, zoals ik dat ook al eerder heb gebruikt: $url = $_GET["url"]; 41 Daarna vraag ik de database om de gegevens die al bekend zijn van de URL: $db = new mysqli('localhost', 'root', 'xxxx', 'spider01'); $sql = "SELECT ID FROM links WHERE url='$url'"; $result = mysqli_query($db, $sql); $row = $result -> fetch_assoc(); $id = $row['ID']; $title = $row['TITLE']; $description = $row['DESCRIPTION']; $keywords = $row['KEYWORDS']; $content = $row['CONTENT']; $db -> close(); De ID wordt in de inverted index gebruikt om naar de webpagina te verwijzen. Nu wil ik niet alleen trefwoorden gaan zoeken in de title, description, keywords en in de hele tekst, maar ook nog apart in de header van de pagina, de <h1>-tag. Deze bevindt zich ergens in de content van de pagina, maar moet er nog wel eerst ‘uitgesloopt’ worden. Dat kan met behulp van het volgende stukje code: preg_match('/<h1>([^>]*)<\/h1>/si', $content, $match ); if (isset($match) && is_array($match) && count($match) > 0){$h1 = strip_tags($match[1]);} Om trefwoorden in de tekst van de pagina te kunnen vinden, moet deze eerst opgeschoond worden. In $content bevinden zich nl. ook nog steeds de links en allerlei andere HTML-codes, die niet mogen meetellen. Dat opschonen doe ik door middel van onderstaande code: $content $content $content $content = = = = strip_tags($content); str_replace("\n", " ", $content); str_replace(chr(13), " ", $content); preg_replace('/[^a-z]+/i', ' ', $content); Nu ik beschik over alle gegevens die ik in mijn inverted index wil plaatsen, hoef ik alleen nog maar te tellen hoe vaak het trefwoord voorkomt in de betreffende onderdelen. Maar daarvoor moet ik eerst de betreffende velden omzetten naar kleine letters, omdat anders het woord ‘Kat’ gezien wordt als een ander woord dan ‘kat’. Het omzetten naar kleine letters kan via dit commando: $title = strtolower($title); Dit gebeurt voor alle variabelen. Nu kan voor elke variabele gekeken worden hoe vaak het trefwoord er in voorkomt. $titlecount $descriptioncount $keywordcount $h1count $contentcount = = = = = substr_count($title, $trefwoord); substr_count($description, $trefwoord); substr_count($keywords, $trefwoord); substr_count($h1, $trefwoord); substr_count($content, $trefwoord); Ik kan nu de informatie die ik over deze pagina in de inverted index wil plaatsen, noteren: $inv = $ID . "(" . $titlecount ."|".$descriptioncount."|".$h1count."|".$contentcount."|".$pagerank.")"; Vervolgens open ik opnieuw de database om de inverted index die hoort bij het trefwoord op te halen: $db = new mysqli('localhost', 'root', 'xxxx', 'spider01'); $sql = "SELECT * FROM keyword WHERE word='$trefwoord'"; $result = mysqli_query($db, $sql); 42 $row = $result -> fetch_assoc(); $invindex = $row['invindex']; Het is natuurlijk mogelijk dat de pagina al voorkomt in de inverted index van dit trefwoord. Dit is te controleren via: $pos = strpos($invindex, $ID."("); Als de pagina al voorkomt in de inverted index ($pos>0), moet de reeds aanwezige informatie worden bijgewerkt. Als de pagina nog niet in de inverted index vermeld wordt, wordt de informatie over de pagina achteraan de bestaande inverted index toegevoegd. if ($pos>0){ $oldinvindex $oldinvindex $newinvindex } else { $newinvindex } = get_string_between($invindex, $ID."(", ")"); = $ID."(".$oldhash.")"; = str_replace($oldinvindex , $inv , $invindex); = $invindex . "," . $inv; Vervolgens wordt de database geüpdatet met de bijgewerkte inverted index: $sql = "UPDATE keyword SET hash='$newinvindex' WHERE word='$trefwoord'"; $result = mysqli_query($db, $sql); Dit proces herhaalt zich voor alle zoektermen en alle websites in de database. 8.3 PageRank en andere populariteitsscores Het gebruiken van een wegingsfactor voor de verschillend posities van trefwoorden op een webpagina is een goede methode om te achterhalen in welke mate een webpagina een bepaald onderwerp behandeld. Een webpagina waarop vele keren het woord ‘kat’ voorkomt, in zowel URL, titel als koppen, gaat zeer waarschijnlijk over katten. Een dergelijke website krijgt via de voorgenoemde berekening dan ook een hoge score toegekend. Deze berekening is echter alleen gebaseerd op de kwantiteit van het trefwoord in relatie tot de webpagina. Het zegt helemaal niets over de kwaliteit van de betreffende webpagina. Sterker nog: als bekend is hoe een zoekmachine een dergelijke waardebepaling uitvoert, is het kinderspel om daar misbruik van te maken. Een verkoper van kattenvoer kan flink wat webpagina’s (laten) maken met daarop heel vaak het woord ‘kat’, ‘katten’ of ‘kattenvoer’, en zo gemakkelijk hoge posities bemachtigen op deze zoektermen. Om tot echt goede zoekresultaten te komen, is het noodzakelijk om, naast de waardebepaling van een pagina met betrekking tot een zoekterm, ook tot een waardebepaling van de pagina zèlf te komen. Larry Page en Sergey Brin, de oprichters van Google, hebben daarvoor het algoritme PageRank ontwikkeld. De gedachte achter PageRank is eigenlijk heel eenvoudig. De waarde van een webpagina is afhankelijk van hoe vaak en door welke pagina’s er naar de webpagina gelinkt wordt. Daarbij geldt: (1) Een webpagina waar vaak naar wordt gelinkt is belangrijk en (2) een webpagina waarnaar gelinkt wordt door een belangrijke pagina is belangrijk. 43 Probleem is echter, dat het web een complexe structuur heeft waar pagina’s naar elkaar linken en soms door dezelfde pagina’s weer teruggelinkt worden. Om de waarde van een pagina te kunnen bepalen, moet dus eerst het hele netwerk van pagina’s en links in kaart gebracht worden, voordat er iets gezegd kan worden over de waarde van één van die pagina’s. Om dat te illustreren, volgt hieronder een voorbeeld dat uitgaat van een sterk vereenvoudigde weergave van het web. In onderstaande tekening zijn cirkels de webpagina’s (of nodes in de graaf ) en de pijlen de links (of edges in de graaf ). Om van dit netwerkje de individuele PageRank van de webpagina’s te bepalen, maakten Page en Brin gebruik van de volgende redenering: Om de PageRank (R) van een pagina (Pi) te bepalen, moeten de volgende gegevens bekend zijn: Het aantal pagina’s dat linkt naar Pi (Bi) Wat de PageRank is van elk van deze pagina’s: R(Pj) Het aantal uitgaande links van elk van deze pagina’s: Lj. De PageRank kan dan met de volgende formule berekend worden: . R Pi = Pj ∈Bi R Pj Lj Voor de eerder genoemde pagina’s kan het volgende worden uitgeschreven: w= z 3 w z x= + 2 3 w x z y= + + 2 2 3 44 x z= +y 2 Zoals je ziet is de PageRank van een pagina afhankelijk van de PageRanks van andere pagina’s en naar hoeveel andere pagina’s deze verwijzen. Om het makkelijker te maken om de PageRank van de verschillende webpagina’s te kunnen berekenen is het handig om alle formules om te schrijven naar een functie van één van de variabelen. In dit geval z. w= z 3 z z z z z 3 x= + = + = 2 3 6 3 2 z x z 3z y=z- =z- 2 =z- = 2 2 4 4 Hieruit volgen de volgende vergelijkingen: w= z 3 x= z 2 y= 3z 4 z=z Page en Brin hadden ervoor kunnen kiezen om Pagina z de waarde ‘10’ toe te kennen, en de PageRank van de andere pagina’s daarop te baseren. Dat hebben ze echter niet gedaan. In plaats daarvan kozen ze voor het volgende uitgangspunten: PageRank is het percentage bezoekers van een pagina op een bepaald moment; De som van alle bezoekers van alle pagina’s op een bepaald moment in het netwerk bedraagt 100%. Dat betekent dus: w + x + y + z = 100% Met dit gegeven is vervolgens de waarde van z makkelijk te berekenen: z= 12 = 0.387 = 38.7% 31 Vervolgens zijn ook de andere PageRanks van w, x en y te berekenen: w= x= 4 = 0.129 = 12.9% 31 6 = 0.258 = 25.8% 31 45 y= 9 = 0.290 = 29.0% 31 De PageRank bepaalt samen met de score die berekend wordt met behulp van de data uit de inverted index de positie van een webpagina in de zoekresultaten. De positie is dus afhankelijk van zowel de relevantie van de pagina als de populariteit van de pagina. Vrijwel alle huidige zoekmachines maken gebruik van zo’n populariteitsscore – en doen dat (waarschijnlijk) op een vergelijkbare manier. 46 9. Het weergeven van informatie Om de gebruiker toegang te geven tot de informatie die door de crawler is verzameld en later is geanalyseerd, is een platform nodig waarop de gebruiker een zoekterm kan opgeven en de bijbehorende zoekresultaten te zien krijgt. De communicatie tussen de gebruiker en de zoekmachine is op te splitsen in drie processen: Het opgeven van de zoekterm door de gebruiker; Het analyseren van de zoekterm en deze verwerken tot een query voor de database; Het weergeven van de zoekresultaten; 9.1 Het opgeven van de zoekterm De gebruiker van de zoekmachine kan via een invulveld een zoekterm opgeven. Deze zoekterm kan uit één of meerdere woorden bestaan. Om specifiek te zoeken, kon een zoeker in het verleden gebruikmaken van zogenaamde Boolean Operators: AND - Alle termen die worden samengevoegd door het woord AND moeten voorkomen in het document. OR - Minstens één van de termen die worden samengevoegd door het woord OR moeten voorkomen in het document. NOT - De term die volgt na het woord NOT mag niet voorkomen in de webpagina. FOLLOWED BY - De eerste term moet direct gevolgd worden door andere. NEAR - De ene term moet binnen een bepaald aantal woorden van de andere term gebruikt worden. Quotation Marks - De specifieke termen tussen aanhalingstekens worden gezien als een exact citaat. De volgorde van de woorden is dus ook bepalend. Stel je voor dat je op zoek bent naar routes om te fietsen in de buurt van Deurningen, maar je komt steeds op de website van ‘Snellers Tweewielers’ terecht als je zoekt op ‘fietsen deurningen’, dan kun je de zoekterm verbeteren door hem als volgt te plaatsen: fietsen AND deurningen NOT snellers. Je krijgt dan alle pagina’s die zowel het woord fietsen als deurningen bevatten, behalve de pagina’s waar ook het woord snellers op genoemd wordt. Nog steeds is het mogelijk op deze manier te zoeken. In Bing kun je op deze manier nog steeds zoeken, maar de Boolean Operators moeten dan wel in hoofdletters geschreven worden. In Google kun je in plaats van AND het plusteken gebruiken, en in plaats van NOT het minteken. De Boolean OR werkt in beide nog steeds, evenals het gebruik van aanhalingstekens. De Booleans FOLLOWED BY en NEAR worden niet langer ondersteund. Zoeken met behulp van Boolean Operators is echter wel een vorm van letterlijk zoeken. Je zult alleen resultaten vinden die exact overeen komen met de zoekopdracht. Er wordt geen rekening gehouden met synonymie – verschillende woorden met dezelfde betekenis zoals bijvoorbeeld ‘auto’ en ‘wagen’– en polysemie – een woord met verschillende betekenissen zoals ‘knoop’ (Franklin , 2000). Juist op het punt van synonymie en polysemie zijn de laatste jaren flinke verbeteringen geboekt. Daarnaast kunnen ook vragen gesteld worden in ‘natuurlijke’ taal, zoals bijvoorbeeld hoe laat is het nu? 47 Een andere functionaliteit die relatief nieuw is, is het geven van zoeksuggesties tijdens het invoeren van de zoekterm. Zoekmachines proberen de zoekterm te voorspellen op basis van het gedrag van andere bezoekers. 9.2 Analyseren en verwerken van de zoekterm De door de gebruiker opgegeven zoekterm wordt na verzending gelezen door de zoekmachine. Woorden en tekens die niet relevant zijn voor het beantwoorden van de zoekvraag, zoals lidwoorden, hulpwerkwoorden, vragende voornaamwoorden en leestekens, worden uit de zoekopdracht gefilterd. Van een vraag als Wie is de huidige President van de Verenigde Staten? blijft na filtering niet veel meer over dan huidige President Verenigde Staten. Elk van de overgebleven zoektermen wordt opgezocht in de inverted index van de zoekmachine (zie paragraaf 8.1). De verwijzingen uit de inverted index worden met elkaar vergeleken, zodat alleen pagina’s die alle termen uit de zoekopdracht bevatten, overblijven: Huidige {3 [0, 0, 3], 8 [1, 0, 4]} President {3 [1, 1, 10], 8 [1, 0, 27]} Verenigde {3 [1, 1, 10], 8 [1, 0, 7]} Staten {3 [1, 1, 10], 8 [1, 0, 7]} Om nu de relevantie van de pagina’s te bepalen, worden de eerst de waarden uit de inverted index vermenigvuldigd met hun wegingsfactor (in dit geval 8, 4 en 1), om tot een paginascore per woord te komen. Huidige {3 [3], 8 [12]} President {3 [22], 8 [35]} Verenigde {3 [22], 8 [15]} Staten {3 [22], 8 [15]} Om de scores voor de pagina’s voor alle termen te berekenen, worden de paginascores van elk woord met elkaar vermenigvuldigd: Pagina 3: 3 * 22 * 22 * 22 = 31944 Pagina 7: 12 * 35 * 15 * 15 = 94500 De pagina met de hoogste score geldt dan als beste zoekresultaat. Zoekmachines die gebruikmaken van PageRank of een populariteitsscore, vermenigvuldigen deze waarden nog eens met de waarde die door hun algoritme wordt toegekend aan de pagina, waardoor grote en belangrijke sites extra punten krijgen in vergelijking met minder belangrijke sites (Langville & Meyer, 2006). 48 9.3 Het presenteren van de zoekresultaten De zoekmachine beschikt nu over een lijst van pagina-ID’s en hun scores met betrekking tot een zoekterm. De lijst wordt gerangschikt op score, in aflopende volgorde. Vervolgens wordt voor elke ID de bijbehorende paginatitel en URL opgevraagd, en eventueel ook de description of een deel van de content. Deze informatie wordt opgemaakt en naar de gebruiker gestuurd. Deze krijgt vervolgens een overzichtelijke lijst met paginanamen en (stukjes van) pagina-omschrijvingen te zien, waarbij elke paginanaam is voorzien van een hyperlink naar de betreffende pagina. Daarnaast worden specifieke zoekresultaten, zoals bijvoorbeeld informatie over bekende personen, plaatsen, gebouwen etc. tegenwoordig voorzien van een apart venster met afbeeldingen, video’s en/of beknopte informatie. Hieronder een voorbeeld. 49 10. De evolutie van het zoeken in drie zoekmachines In plaats van de zoekresultaten van één zoekmachine weer te geven, wil ik met dit project graag het verschil laten zien in zoekresultaten van verschillende zoekmachines door de jaren heen. Ik kan daarvoor gebruikmaken van dezelfde database, omdat de verschillen tussen de zoekmachines vooral zitten in de wijze waarop met de informatie in de database wordt omgegaan. Om dat te illustreren, heb ik drie interfaces en algoritmes voor het rangschikken en weergeven van zoekresultaten gemaakt: Zoekmachine I: Een zoekmachine op basis van één tabel De eerste zoekmachine haalt zijn gegevens slechts uit één tabel en controleert of de zoekterm voorkomt in ofwel de URL ofwel de paginatitel. De resultaten worden gerangschikt op basis van alfabetische volgorde. Deze zoekmachinetechniek is vergelijkbaar met die die van de eerste zoekmachines op het internet. Bijvoorbeeld Yahoo! gebruikte in 1995 nog een soortgelijke strategie. Zoekmachine II: Een zoekmachine met inverted index Bij deze zoekmachine wordt naast een tabel met links ook gebruik gemaakt van een tabel met ‘alle mogelijke zoekwoorden’. Van elk zoekwoord zijn de pagina’s die het zoekwoord bevatten, bekend. Ook is de positie van de zoekwoorden op de pagina bekend. Deze staan naast het zoekwoord geregistreerd in de inverted index. Als het zoekwoord voorkomt in de titel of in een kop, dan telt dat zwaarder mee. Op basis hiervan kan een relevantiescore worden berekend, zodat de zoekresultaten op relevantie gerangschikt kunnen worden. Deze techniek werd gebruikt door de tweede generatie zoekmachines aan het eind van de jaren ‘90, zoals AltaVista en Lycos. Zoekmachine III: Een zoekmachine met PageRank Het algoritme van PageRank meet het aantal in- en uitgaande links van een website en berekent op basis daarvan een score, die indicatief is voor de ‘belangrijkheid’ van de pagina. De zoekmachine maakt daarnaast ook gebruik van een inverted index. De PageRank-score en de relevantiescore worden met elkaar vermenigvuldigd, zodat de waarde van een pagina een combinatie is van relevantie en belangrijkheid. Deze waarde is bepalend voor de volgorde van de pagina’s in de zoekresultaten. Deze techniek is rond 2000 ontwikkeld door Google en wordt nu nog steeds gebruikt. Het doel van deze zoekmachines is puur demonstratief. Daarom zijn er enkele beperkingen met betrekking tot ‘echte ’ zoekmachines. Zo kunnen deze zoekmachines maar overweg met één zoekterm tegelijkertijd. Daarnaast maak ik, om de werking van en de verschillen tussen de zoekmachines te kunnen demonstreren, gebruik van een zeer kleine database van webpagina’s, zodat de verschillen in resultaten ook goed uitgelegd en vergeleken kunnen worden, omdat steeds dezelfde pagina’s in de zoekresultaten verschijnen, maar telkens op een andere positie. 10.1 Zoekmachine I: zoeken met één tabel De database van deze zoekmachine bestaat uit slechts één tabel met daarin de velden ‘ID’, ‘URL’ en ‘TITLE’. In de code wordt eerst de zoekquery ($q) opgevraagd. Vervolgens wordt de database geopend en de resultaten opgehaald. De resultaten moeten voldoen aan de volgende criteria: de zoekquery moet ofwel in de titel of in de URL voorkomen (title like '%$q%' or url like '%$q%'). $q = $_GET["q"]; if ($q>""){ 50 $db = new mysqli('localhost', 'root', 'xxxx', 'spider01'); $sql = "Select DISTINCT * from links where (title like '%$q%' or url like '%$q%') order by Title"; $result = mysqli_query($db,$sql); Vervolgens worden de resultaten die aan deze criteria voldoen, via een ‘loop’ weergegeven op de pagina. Een teller houdt het aantal gevonden resultaten bij. while($row = $result -> fetch_assoc()) { echo "<p>"; echo '<a href="'. $row["url"]. '" target="_blank">'; echo $row["title"]; echo "</a>"; echo "<br>"; echo $row["url"]; echo "<br>"; echo $row["description"]; echo "</p>"; $teller++; } $db -> close(); } ?> Totaal: <?=$teller;?> resultaten voor '<?=$q;?>' 10.2 Zoekmachine II: zoeken met inverted index De zoekmachine met de inverted index is een stuk complexer. Na het opgeven van de zoekterm wordt eerst bepaald of de zoekterm voorkomt in de inverted index: $q = $_GET["q"]; $teller = 0; $n=0; if ($q>""){ $db = new mysqli('localhost', 'root', 'xxxx', 'spider01'); $sql = "Select * from keyword where word='$q'"; $result = mysqli_query($db,$sql); $rowcount = mysqli_num_rows($result); $row = $result -> fetch_assoc(); $invindex = $row["invindex"]; De inverted index bij het trefwoord ziet er bijvoorbeeld zo uit: 2 (1|1|1|17), 7 (1|0|1|9), 11 (0|1|0|3) Het getal voor het ( is de ID van de pagina; de getallen tussen de haakjes achtereenvolgens het aantal keer dat het trefwoord voorkomt in de titel, description, header en content van de pagina. Om de informatie over de afzonderlijke pagina’s te kunnen gebruiken, moet de inverted index eerst worden ‘opgebroken’ in afzonderlijke stukjes informatie per pagina. Die informatie wordt in een tijdelijke tabel (array) geplaatst. Het opbreken en plaatsen in een array is heel eenvoudig. Alle pagina’s zijn namelijk van elkaar gescheiden door 51 een komma. Deze komma dient als indicator voor het commando ‘explode’, dat met behulp van een scheidingteken een array kan creëren uit een lange reeks tekens: $invarray = explode(',', $invindex); In de van elke pagina staan nu de gegevens over de aantallen en positie van de zoekwoorden. Deze staan als volgt weergegeven: 2 7 11 (1|1|1|17) (1|0|1|9) (0|1|0|3) Ik herhaal deze ‘truc’ voor het losbreken van de paginagegevens, door ook hier een array, maar dan per pagina, van te maken. Dit keer is het scheidingsteken het |-teken. while ($n<count($invarray)) { $siteid = substr($invarray[$n],0,strpos($invarray[$n], "(")); $siteid=intval($siteid); $right = substr($invarray[$n],(strpos($invarray[$n], "(")+1), (strpos($invarray[$n], ")")-2)); $right = str_replace(")", "",$right); $waarde = explode("|", $right); Nu de waarden van de posities van de zoekterm op de pagina vrijgemaakt zijn, kan daarmee gerekend worden. Ik maak daarbij gebruik van de volgende wegingsfactoren: Een pagina scoort 20 punten wanneer het trefwoord voorkomt in de titel; Een pagina scoort 10 punten als het trefwoord voorkomt in de description van de pagina; Een pagina scoort 10 punten als het woord in de header van de pagina zit; Een pagina scoort 1 punt per keer dat het woord voorkomt op de pagina. $woordscore = (20*$waarde[0]) + (10*$waarde[1]) + (10*$waarde[2]) + $waarde[3]; Vervolgens wordt elke pagina met bijbehorende scorende score in (weer) een nieuwe array geplaatst: } if ($woordscore>0) { $resultaten[] = array('siteid'=>$siteid, 'woordscore'=>$woordscore, $waarde[0],$waarde[1],$waarde[2],$waarde[3]); } $n++; Deze array kan nu in aflopende volgorde worden gesorteerd: usort($resultaten, function($a, $b) { if($a['woordscore']==$b['woordscore']) return 0; return $a['woordscore'] < $b['woordscore']?1:-1; }); Hiermee is een op relevantie gesorteerde lijst met pagina- ID’s beschikbaar gekomen. Maar om deze lijst als zoekresultaten weer te kunnen geven, moet voor elke pagina-ID ook informatie over de pagina, zoals de URL, title en description, worden opgezocht. Deze informatie wordt uit in de volgende stap uit de tabel ‘links’ van 52 de database gehaald en als lijst met zoekresultaten weergegeven: while ($n<count($resultaten)) { $db = new mysqli('localhost', 'root', 'xxxx', 'kat'); $sql2 = "Select * from links where id=".$resultaten[$n]['siteid']; $result2 = mysqli_query($db, $sql2); $row2 = $result2 -> fetch_assoc(); echo echo echo echo echo } '<a href="'. $row2["url"]. '" target="_blank">'; $row2["title"]; "</a> - "; $row2["description"]; "<br>"; $n++; } 10.3 Zoekmachine III: zoeken met PageRank Een zoekmachine met PageRank lijkt, zoals ik al eerder aangaf, voor een groot deel op de vorige zoekmachine, maar met één groot verschil: er wordt vooraf door middel van een algoritme een waardebepaling van de pagina gemaakt op basis van ‘belangrijkheid’ of ‘populariteit’. Het exacte algoritme dat Google gebruikt(e) is geheim, maar, zoals ik al beschreef in hoofdstuk 5, de basis is wel bekend. Voor het berekenen van de PageRank van de pagina’s in mijn voorbeeld heb ik niet zelf een script geschreven, maar gebruikgemaakt van code die ik op internet vond geschreven door Pascal Landau. Deze code kan de PageRank-berekening simuleren voor een beperkt aantal websites (Landau, 2015). De zoekmachine zal, na tijdens de uitvoering van het PageRank-algoritme, de PageRank noteren als een extra veld bij de website-gegevens. Daarmee is de PageRank van een pagina direct opvraagbaar en hoeft niet verder berekend te worden. $pagerank = $row2["PageRank"]; De enige andere extra bewerking die – vergeleken met de zoekmachine uit 9.2 – nog hoeft plaats te vinden, is het vermenigvuldigen van de PageRank van de Pagina met de relevantiescore van de pagina voordat de lijst gesorteerd wordt: $paginascore = $woordscore * $pagerank; Dat resulteert in een andere positionering van pagina’s in zoekresultaten, omdat nu ook de belangrijkheid van de pagina meegewogen wordt. Het resultaat is een lijst waarin de hoogste posities worden ingenomen door pagina’s die zowel relevant als belangrijk zijn. 53 10.4 Testpagina’s Om de zoekresultaten van de verschillende zoekmachines met elkaar te vergelijken, heb ik 11 webpagina’s gemaakt. De testpagina’s hebben een overkoepelend thema: ‘katten’. De pagina’s verwijzen onderling naar elkaar, waarbij sommige veel inkomende links krijgen en andere weinig. Ook zijn niet alle pagina’s gelijkwaardig: zo maakt de één wel gebruik van de mogelijkheid om bijvoorbeeld een description of keywords toe te voegen en de ander niet. Alle sites zijn geïnspireerd op bestaande sites over dit onderwerp. De stijl en tekst zijn grotendeels overgenomen, inclusief stijl- en spelfouten. Hieronder een toelichting voor elke webpagina: Kattenasiel MIAUW (A) http://www.kattenasiel-miauw.nl/ Opvang van katten. Op de site staat een lijst met katten die op zoek zijn naar een nieuw baasje. Astrids Blog (B) http://blog.xs4all.nl/members/~astrid001/ Astrid werkt bij dierenarts Hans als praktijkassistente. Zelf is ze een enorme kattenliefhebber. Ze deelt haar kennis en ervaringen via haar blog. Het blog is erg populair onder kattenbezitters. Er wordt dan ook flink naar gelinkt. Dierenkliniek Hans (C) http://www.dierenarts-hans.nl/ Dierenarts Hans is een deskundige als het gaat om het welzijn van huisdieren. De website wordt niet vaak gelinkt, maar bevat wel relevante informatie. Het Grote Poezen en Katten Forum (D) http://katten.gratisforums.nl/ Een forum voor bezitters van katten. Het er vooral gezellig en niet direct informatief. Er wordt niet veel naar gelinkt. De Leukste Poezen- en Kattenfoto’s (E) http://www.angelfire.lycos.com/poezen-katten-fotos/ De naam spreekt voor zich. Op deze pagina verschijnen dagelijks leuke plaatjes. De site is erg populair en er wordt dan ook flink naar deze site gelinkt. 54 Peters Kattenencyclopedie (F) http://www.wikikat.nl/ Peter probeert een kattenencyclopedie op te zetten. De website is nog maar net online en wordt daarom niet vaak gelinkt. Sonja’s Poezen Pagina (G) http://www.blogspot.nl/~poezebeest Sonja heeft twee katten, die ze consequent ‘poes’ noemt. Op haar site schrijft ze erover. Homepage van de familie Jansen (H) http://members.home.nl/~famjansen/ De familie Jansen heeft een website over de familie met daarop een aantal links naar pagina’s die ze leuk vinden. Jolanda’s Dagboek (I) http://diary-online.com/nl/~jolandaaatjuh/ Jolanda schrijft over haar dagelijkse beslommeringen in haar online dagboek. Jolanda heeft een aantal katten. Hermans Honden- en Kattenvoer BV ( J) http://www.hondenvoer-kattenvoer.com/ Herman heeft een winkel in dierenvoer. Hij verkoopt dat via internet. Om een hoge zoekmachine-positie te krijgen, speelt hij vals door heel veel trefwoorden onzichtbaar op zijn site te zetten, zodat zijn pagina hele hoge relevantiescores krijgt. Geen van de andere pagina’s linkt naar Hermans site. Kinderspeeltuin De Kattenbak (K) http://www.den-haag.nl/speeltuin/kattenbak/ Een kinderspeeltuin die, behalve haar naam, weinig met katten van doen heeft. 55 De pagina’s zijn onderling met elkaar verbonden op de volgende manier: De pijlen geven aan welke pagina naar welke andere pagina linkt. De pagina’s zijn overduidelijk niet gelijkwaardig. De ene pagina is beter opgezet dan de ander en maakt bijvoorbeeld gebruik van metatags of kopjes. Ook de mate waarin de pagina’s het onderwerp ‘katten’ behandelen, verschilt enorm: van een complete kattenencyclopedie tot een familiepagina waar één keer het woord ‘kat’ genoemd wordt. Een belangrijk verschil is ook de mate waarin naar pagina’s gelinkt wordt. Sommige pagina’s ontvangen helemaal geen links (G t/m K), andere juist flink veel (B en E). Deze factor werd pas meegenomen sinds Google het PageRank-algoritme introduceerde. Hierdoor leggen pagina’s met veel inkomende links een groter gewicht in de schaal dan pagina’s met weinig of geen inkomende links. Dat is goed te zien als we die PageRank visualiseren: 56 De grootte van de verschillende nodes corresponderen met de ‘belangrijkheid’ van de site, op basis van slechts hun in- en uitgaande links. De grootte van de nodes heeft dus niets te maken met de grootte van de webpagina’s of het aantal keer dan ‘kat’-gerelateerde woorden op de pagina voorkomen. 10.5 Zoekresultaten in de verschillende zoekmachines Om de verschillen in zoekresultaten tussen de drie zoekmachines te illustreren, voer ik een viertal verschillende queries uit: ik zoek naar ‘kat’, ‘katten’, ‘poes’ en ‘poezen’. De resultaten staan vermeld in de volgende tabellen. De cijfers geven de zoekmachineposities aan. Zoekresultaten voor ‘’kat’ Zoekmachine I 1. De Leukste Poezen- en Kattenfoto’s 2. Hermans Honden- en Kattenvoer BV 3. Het Grote Poezen en Katten Forum 4. Kattenasiel MIAUW 5. Kinderspeeltuin De Kattenbak 6. Peters Katten Encyclopedie Zoekmachine II 1. Hermans Honden- en Kattenvoer BV 2. Het Grote Poezen en Katten Forum 3. Astrids Blog 4. Peters Katten Encyclopedie 5. Kattenasiel MIAUW 6. Dierenkliniek Hans 7. Sonja’s Poezen Pagina 8. De Leukste Poezen- en Kattenfoto’s 9. Jolanda’s Dagboek 10. Homepage van de familie Jansen Zoekmachine III 1. Astrids Blog 2. Hermans Honden- en Kattenvoer BV 3. Dierenkliniek Hans 4. Het Grote Poezen en Katten Forum 5. Peters Katten Encyclopedie 6. Kattenasiel MIAUW 7. De Leukste Poezen- en Kattenfoto’s 8. Sonja’s Poezen Pagina 9. Jolanda’s Dagboek 10. Homepage van de familie Jansen 57 Zoekresultaat voor ‘katten’ Zoekmachine I 1. De Leukste Poezen- en Kattenfoto’s 2. Hermans Honden- en Kattenvoer BV 3. Het Grote Poezen en Katten Forum 4. Kattenasiel MIAUW 5. Kinderspeeltuin De Kattenbak 6. Peters Katten Encyclopedie Zoekmachine II 1. Hermans Honden- en Kattenvoer BV 2. Het Grote Poezen en Katten Forum 3. Peters Katten Encyclopedie 4. De Leukste Poezen- en Kattenfoto’s 5. Kattenasiel MIAUW 6. Astrids Blog 7. Dierenkliniek Hans 8. Jolanda’s Dagboek 9. Sonja’s Poezen Pagina 10. Kinderspeeltuin De Kattenbak Zoekmachine III 1. Astrids Blog 2. De Leukste Poezen- en Kattenfoto’s 3. Het Grote Poezen en Katten Forum 4. Peters Katten Encyclopedie 5. Hermans Honden- en Kattenvoer BV 6. Dierenkliniek Hans 7. Kattenasiel MIAUW 8. Jolanda’s Dagboek 9. Sonja’s Poezen Pagina 10. Kinderspeeltuin De Kattenbak Zoekresultaten voor ‘poes’ Zoekmachine I Zoekmachine II 1. Hermans Honden- en Kattenvoer BV 2. Sonja’s Poezen Pagina 3. De Leukste Poezen- en Kattenfoto’s 4. Dierenkliniek Hans Zoekmachine III 1. Hermans Honden- en Kattenvoer BV 2. Dierenkliniek Hans 3. Sonja’s Poezen Pagina 4. De Leukste Poezen- en Kattenfoto’s Zoekresultaten voor ‘poezen’ Zoekmachine I 1. De Leukste Poezen- en Kattenfoto’s 2. Het Grote Poezen en Katten Forum 3. Sonja’s Poezen Pagina Zoekmachine II 1. Hermans Honden- en Kattenvoer BV 2. Sonja’s Poezen Pagina 3. De Leukste Poezen- en Kattenfoto’s 4. Het Grote Poezen en Katten Forum 5. Jolanda’s Dagboek 6. Homepage van de familie Jansen 7. Kinderspeeltuin De Kattenbak 8. Peters Katten Encyclopedie Zoekmachine III 1. De Leukste Poezen- en Kattenfoto’s 2. Hermans Honden- en Kattenvoer BV 3. Het Grote Poezen en Katten Forum 4. Sonja’s Poezen Pagina 5. Peters Katten Encyclopedie 6. Jolanda’s Dagboek 7. Homepage van de familie Jansen 8. Kinderspeeltuin De Kattenbak 58 10.6 Verklaring van de verschillende zoekresultaten Zoekmachine I De eerste zoekmachine kijkt alleen naar de titel en de URL van een webpagina. Pagina’s waarin deze niet voorkomen, verschijnen dus ook niet als zoekresultaten. Dat geldt bijvoorbeeld voor het woord ‘poes’. Het meervoud, ‘poezen’ levert wel een aantal resultaten op, en de termen ‘kat’ en ‘katten ’ geven nog meer resultaten. Het loont dus om te zoeken naar variaties op de zoekterm, zoals enkel- of meervouden of synoniemen. Pagina’s die wel over het onderwerp ‘katten’ of ‘poezen’ gaan, zoals bijvoorbeeld Astrids Blog (B) en die van Dierenarts Hans (C), verschijnen nergens tussen de zoekresultaten, omdat de betreffende zoektermen niet voorkomen in de titels en URL’s van deze pagina’s. Ondanks de grote hoeveelheid relevante informatie, zijn deze pagina’s dus onvindbaar in deze zoekmachine. De volgorde van de resultaten is nietszeggend: ze staan op alfabetische volgorde. Het zou dus goed kunnen dat de interessante pagina onderaan staat, zoals Peters Kattencyclopedie (F) bij de zoekterm ‘kat’ of ‘katten’. Zoekmachine II Deze zoekmachine komt met veel meer resultaten dan de Zoekmachine I, omdat nu de hele inhoud van de pagina’s gescand wordt. De volgorde van de zoekresultaten is afhankelijk van hoe vaak de zoekterm op de pagina verschijnt en op welke plek deze staat. Sonja (G) gebruikt consequent het woord ‘poes’ in plaats van ‘kat’. Haar pagina haalt hierdoor hoge resultaten op de zoektermen ‘poes’ en ‘poezen’. De webwinkel van Herman (J) speelt vals en plaatst – onzichtbaar, maar wel meetbaar - verschillende synoniemen van de zoekterm tientallen tot honderden keren op de site. Zo haalt de webwinkel hoge relevantiescores en verschijnt daarom bij elke zoekterm bovenaan. Zoekmachine III Bij deze zoekmachine weegt ook de mate waarin de sites onderling gelinkt zijn mee. Sites die vaker gelinkt worden, tellen zwaarder mee. Hierdoor krijgt een veel gelinkte site zoals Astrids Blog (B) op de zoekterm ‘kat’ een hogere positie toegekend dan die van de valsspelende pagina van Hermans webwinkel. Het valsspelen van Herman (J) beïnvloedt echter nog steeds de zoekresultaten. Daarom wordt hier bij zoekmachines als Google extra naar gekeken en worden dergelijks sites bij ontdekking als straf uit de index verwijderd. Astrid (B) gebruikt echter nergens de woorden ‘poes’ of ‘poezen’. Ze wordt dan ook helemaal niet vermeld bij de zoekresultaten voor deze termen. Zou zij deze woorden slechts enkele keren op haar pagina noemen, dan zou dat, gezien haar hoge PageRank-score – al voldoende zijn voor een toppositie bij vrijwel elk zoekwoord. Dat laatste is goed te zien aan de pagina van Dierenarts Hans (C). Deze pagina noemt slechts één keer het woord ‘poes’, maar wordt, vanwege de veel hogere PageRank, gepositioneerd boven de pagina van Sonja (G), waarop het woord maar liefst 14 keer voorkomt. 59 CONCLUSIES EN NABESCHOUWING 11. Conclusies Naar aanleiding van mijn onderzoek naar de geschiedenis van de zoekmachine en de techniek waarvan deze zoekmachines gebruikmaken, kom ik tot de volgende conclusies: 1. Ontwikkelingen hangen samen met vraag en aanbod Dit klinkt misschien als een open deur, maar het verklaart wel heel goed waarom bepaalde ontwikkelingen zo lang op zich hebben laten wachten. Het lijkt vreemd dat Vannevar Bush in 1945 al droomde van een apparaat waarmee je alle beschikbare informatie kon raadplegen, en zelfs aanwijzingen gaf hoe dit moest gebeuren, en dat tegelijkertijd tot begin jaren ‘90 duurde voordat er ook maar iets van deze ideeën in de praktijk werd gebracht. En dat terwijl er al vanaf begin jaren ‘70 een soort van internet was. De eerste zoekmachines ontstonden pas op het moment dat het aantal gebruikers flink groeide, evenals de hoeveelheid beschikbare bronnen op het internet. Pas toen het echt onhandig werd om via traditionelere weg informatie uit te wisselen (iemand persoonlijk benaderen en vragen hem om de locatie van bestanden) ontstond de eerste zoekmachine. Die was helemaal niet zo complex om te bouwen – dus die had er al veel eerder kunnen zijn. De reden was vooral, dat de vraag er gewoonweg nog niet was. Eenzelfde vergelijking gaat op voor het ontstaan van HTML. Het hypertext-idee was al begin jaren ‘60 uitgeschreven door Red Nelson. Pas in 1989 wordt dit idee door Tim Berners-Lee technisch verder uitgewerkt. Hij heeft in een hele korte tijd – slechts een paar maanden – zowel de taal, de webserver als de eerste browser ontwikkeld. Dat laatste duidt erop, dat de technische voorwaarden voor het uitwerken van Nelsons idee al gedurende enige tijd geen belemmering meer waren. De reden waarom het toch bij 30 jaar heeft geduurd, is, omdat toen pas de vraag ontstond naar een dergelijk systeem. Desalniettemin is de stand van de techniek ook soms de beperkende factor. Daarom is mijn volgende conclusie: 2. Ontwikkeling van zoekmachines hangt sterk samen met wat er mogelijk is op technisch gebied Vrijwel alle zoekmachines zijn gedurende hun bestaan geconfronteerd met technische beperkingen. Eén van de belangrijkste is die van de (kosten van) opslagcapaciteit. De eerste zoekmachines, waaronder Yahoo!, indexeerden niet voor niets alleen maar een titel of een URL. Het opslaan van meer informatie betekende de noodzaak voor meer opslagcapaciteit. De kosten daarvoor nemen al gauw exponentieel toe: van een extra harde schrijf (die nog betaalbaar is), naar een extra computer, naar een server, naar een serverpark (met personeel, koeling en een torenhoge elektriciteitsrekening). Dergelijke kosten zaten met name de eerste zoekmachines erg in de weg. Naarmate de tijd vorderde, daalden de prijzen voor opslag alsmaar, waardoor ook steeds meer informatie opgeslagen kon worden. Enkele jaren na Yahoo! waren er al zoekmachines die hele pagina’s indexeerden. Tegenwoordig worden ook afbeeldingen en video’s geïndexeerd. 3. Zoekmachines hebben daadwerkelijk een evolutie doorgemaakt Het feit dat je in deze tijd veel meer en makkelijker informatie kunt vinden dan in begin- of midden jaren ‘90 is niet alleen een kwestie van toename van aanbod, maar zeker ook het gevolg van verbeteringen van zoekalgoritmes. Nu probeerden de zoekmachines zich midden jaren ‘90 van elkaar te onderscheiden door allerlei 61 ‘innovaties’. Vaak stelden die verbeteringen technisch weinig voor en was het pronken met zogenaamd nieuwe technieken vooral een vorm van marketing. Dat heeft – in ieder geval bij mij – aanvankelijk het beeld opgeroepen dat er in de zoekmachinetechniek in de loop van de tijd fundamenteel weinig veranderd was. Dat beeld blijkt onjuist. Er zijn er wel degelijk echt belangrijke innovaties gedaan op dit gebied. Het gebruik van een inverted index om pagina’s op relevantie te kunnen sorteren was een enorme verbetering ten opzichte van de vorige situatie, waarbij er geen nuttige rangschikking plaatsvond. Het PageRank-algoritme van Google heeft op zijn beurt voor weer een flinke verbeteringsslag gezorgd, door bij het beoordelen van een bron niet alleen te kijken naar relevantie, maar ook de mate waarin naar de bron verwezen wordt. Deze gedachten waren echt nieuw, radicaal anders dan voorgaande benaderingen en hebben de vindbaarheid van informatie op het net enorm verbeterd. 4. Vertrouwen in zoekresultaten staat op gespannen voet met commerciële overwegingen Een zoekmachine heeft inkomsten nodig om zijn dienst aan te kunnen bieden. De meest voor de hand liggende manier is om iets te doen met adverteren. Toch besmetten advertenties al meteen het gevoel van vertrouwen in de objectiviteit en juistheid van de zoekresultaten, net als dat een logo van een grote farmaceut op de jas van een arts het gezag en de integriteit van die arts ondermijnt. Zoekmachines hebben in het verleden zaken toegelaten (valsspelen bij relevantiebepaling) of zelfs aangemoedigd (het betalen voor zoekmachineposities) die het vertrouwen van de gebruiker hebben geschaad. Google leek dat vertrouwen weer terug te winnen, door zijn advertentieloze interface en het objectieve beoordelingssysteem voor websiteposities. Dat herstelde vertrouwen bleek zo groot, dat gebruikers Google als betrouwbaar bleven beschouwen, ook nadat ook Google adverteerders toeliet op haar platform. Sinds enkele jaren is echter bekend dat Google flink inzet op het verzamelen van persoonlijke gegevens van de gebruiker (onder andere via door de gebruiker opgegeven zoektermen) om het voor adverteerders mogelijk te maken deze gebruiker individueel te benaderen. Dit roept allerlei privacy-vragen op. Dit ondermijnt opnieuw het vertrouwen van de gebruiker in het gezag en objectiviteit van de zoekmachine. Eigenlijk zou de gebruiker het meest gebaad zijn bij een zoekmachine die beheerd wordt door een nonprofitorganisatie, één die de privacy van de gebruiker respecteert. Een objectieve, betrouwbare zoekmachine is misschien wel te belangrijk om beheerd te worden door een commerciële partij. We vinden het vanzelfsprekend dat een burger toegang heeft tot objectieve gezondheidszorg, educatie en informatie, en daarom wordt er door de overheid in scholen, universiteiten, ziekenhuizen en bibliotheken voorzien. In dat opzicht is het vreemd dat we iets belangrijks als het verzamelen en presenteren van ‘alle kennis van de wereld’ uit handen geven aan een bedrijf met winstoogmerk. De vraag is echter, of de gebruiker ook bereid zou zijn om voor een dergelijke dienst te betalen, in bijvoorbeeld de vorm van belasting (als het een overheidsdienst zou zijn) of contributie of abonnement. Wellicht is dit een interessante vraag voor een vervolgstudie. 62 12. Nabeschouwing Aanvankelijk dacht ik dat mijn keuze voor het thema van mijn profielwerkstuk, zelf een zoekmachine bouwen, misschien wel wat te beperkt zou zijn om een heel profielwerkstuk over te schrijven. Het leek me daarom goed, om het onderwerp een beetje breder te maken. Ik kwam uiteindelijk met het idee om een werkstuk te maken over ‘De geschiedenis van het zoeken’ met daarbij, als kers op taart, een eigen zoekmachine. Hiermee ben ik in eerste instantie dan ook aan de slag gegaan, maar ik kwam er op een gegeven moment, ergens rond het de uitvinding van de boekdrukkunst, achter dat ‘de geschiedenis van het zoeken’ toch wel erg breed en veelomvattend was. Ik moest het onderwerp toch wel meer afbakenen, ook al zou dat betekenen dat al het voorgaande werk voor niets was. Ik koos vervolgens voor ‘De geschiedenis van de zoekmachine’. Maar bij het schrijven van dit verhaal merkte ik al snel, dat deze geschiedenis niet los te zien was van de ontwikkeling van het internet. Beide zijn onlosmakelijk met elkaar verbonden. Tegelijkertijd zijn er op het internet meer ontwikkelingen aan de gang dan alleen die van zoekmachines. Die ontwikkelingen hebben echter wel een duidelijke invloed op die van de zoekmachines. Om de ontwikkelingen van de zoekmachines in de juiste context te kunnen plaatsen, achtte ik het nodig eerst een hoofdstuk te wijden aan een beknopte geschiedenis van het internet – die iets minder beknopt werd dan de bedoeling was. Wat het beschrijven van al deze ontwikkelingen erg lastig maakte, was, dat vanaf begin jaren ‘90 de ontwikkelingen razendsnel verlopen. Bovendien lopen veel ontwikkelingen parallel en beslaan ze een relatief korte periode. Daarnaast beïnvloeden de verschillende ontwikkelingen elkaar ook nog eens flink. Ik vond het moeilijk om hier een gestructureerd verhaal van te schrijven. Ik hoop dat dat toch gelukt is. Naast het schrijven van dit verslag was ik ondertussen ook bezig met het programmeren van mijn zoekmachines. Hierbij kwam ik er gaandeweg achter, dat de werking van de zoekmachines en hoe je er zelf één bouwt aanmerkelijk minder eenvoudig was, dan ik in eerste instantie gedacht had. Sommige algoritmes, waaronder die van de crawler en de inverted index, kostten me in eerste instantie wat moeite om goed te begrijpen en zelf om te zetten in code. De complexiteit van de verschillende algoritmes lieten zich daarnaast ook niet in een paar regels laat uitleggen. Dit alles verklaart enigszins hoe het komt dat mijn profielwerkstuk is uitgegroeid tot een verslag van deze omvang. Voor mij heeft dit profielwerkstuk, ondanks veel tegenslagen en veel werk, wel heel veel gebracht. Voor ik aan dit project begon, twijfelde ik met betrekking tot mijn studiekeuze heel erg tussen alfastudies en bètastudies. Ik wist al langer dat ik iets wilde doen op het gebied van ‘het denken’. Er waren verschillende richtingen die hiervoor in aanmerking kwamen, van Filosofie en Psychologie tot Biologie, Geneeskunde en Kunstmatige Intelligentie. De laatste studie is een vrij technische, en ik wist dat er bij deze studie veel geprogrammeerd zou moeten worden. Voor mij was de onderwerpkeuze voor dit profielwerkstuk dan ook een soort test: ik wilde weten of ik programmeren leuk en interessant genoeg vond om daarmee verder te gaan. De conclusie is van dit zelfonderzoek is me nu duidelijk: ja, ik vind programmeren erg leuk en ga, zoals het er nu voorstaat, in september beginnen met de studie Artificial Intelligence in Groningen. 63 Bibliografie Battelle, J. (2011). The Search: How Google and Its Rivals Rewrote the Rules of Business and Transformed Our Culture. Nicholas Brealey Publishing. Beattie, A. (2014). What were the "browser wars"? Opgehaald van Investopedia: http://www.investopedia.com/ask/answers/09/browser-wars-netscape-internet-explorer.asp Beattie, A. (sd). Market Crashes: The Dotcom Crash. Opgehaald van Investopedia: http://www.investopedia.com/features/crashes/crashes8.asp Berners-Lee, T. (1989). Information Management: A Proposal. Opgehaald van https://www.w3.org/History/1989/proposal.html Bush, V. (1945). As We May Think. The Atlantic. Opgehaald van http://www.theatlantic.com/magazine/archive/1945/07/as-we-may-think/303881/ CERN. (sd). The birth of the World Wide Web. Opgehaald van Website van CERN: https://timeline.web.cern.ch/timelines/The-birth-of-the-World-Wide-Web Connolly, D. (2000). A Little History of the World Wide Web. Opgehaald van W3C: https://www.w3.org/History.html Dalakov, G. (sd). NCSA Mosaic of Marc Andreessen and Eric Bina. Opgehaald van Computer History: http://history-computer.com/Internet/Conquering/Mosaic.html Eijk, D. v. (sd). Ted Nelson en Xanadu. Opgehaald van Dick van Eijk: http://www.dickvaneijk.nl/wetenschap/gelinkte-pioniers/4-ted-nelson-en-xanadu/ Eppstein, D. (1996). Breadth first search and depth first search. Opgehaald van Design and Analysis of Algorithms: https://www.ics.uci.edu/~eppstein/161/960215.html Franklin, C. (2000). How Internet Search Engines Work. Opgehaald van How Stuff Works: http://computer.howstuffworks.com/internet/basics/search-engine1.htm Gaffin, A., & Heitkötter, J. (1994). Your Friend Archie. Opgehaald van Big Dummy's Guide to the Internet:A round trip through Global Networks, Life in Cyberspace, and Everything...: http://web.archive.org/web/20080405133316/http://www.nectec.or.th:80/net-guide/bigdummy/bdg_134.html Gillies, J., & Cailliau, R. (2000). How the Web was Born: The Story of the World Wide Web. Oxford: Oxford University Press. Griffiths, R. (2002). From ARPANET to World Wide Web. Opgehaald van Universiteit Leiden: http://www.let.leidenuniv.nl/history/ivh/chap2.htm Hoek, C. v. (2013). Google schendt Nederlandse wet met privacyvoorwaarden. Opgehaald van NU: Google schendt Nederlandse wet met privacyvoorwaarden Kozierok, C. M. (2005). The TCP/IP Guide: A Comprehensive, Illustrated Internet Protocols Reference. No Starch Press. 64 Kunder, M. d. (2016). The size of the World Wide Web. Opgehaald van WorldWideWebSize: http://www.worldwidewebsize.com/ Kuyoro, S. O., Okolie, S. O., Kanu, R. U., & Awodele, O. (2012). Trends in Web-Based Search Engine. Landau, Pascal (2015). PHP implementation of the PageRank algorithm. Opgehaald van GitHub: https://github.com/paslandau/pagerank Langville, A. N., & Meyer, C. D. (2006). Google's PageRank and Beyond: The Science of Search Engine Rank- ing. Miller, B., & Ranum, D. (sd). Vocabulary and Definitions. Opgehaald van Problem Solving with Algorithms and Data Structures using Python: http://interactivepython.org/courselib/static/pythonds/Trees/VocabularyandDefinitions.html Page, L. (1998). The PageRank Citation Ranking: Bringing Order to the Web. Peters, R., & Sikorski, R. (1997). Search Engines. Science, p. 977. Robbins, C. (2014). World's First Internet Search Engine. Opgehaald van Cyber Matters: https://cybermatters.info/2014/08/07/aliweb/ Schwartz, B. (2014). Robots.txt Celebrates 20 Years Of Blocking Search Engines. Opgehaald van Search Engine Land: http://searchengineland.com/robots-txt-celebrates-20-years-blocking-search-engines-195479 Tatnall, A. (2005). Web Portals: The New Gateways to Internet Information and Services. Idea Group Inc (IGI). WampServer (sd). WampServer, a Windows web development environment. Opgehaald van WampServer: http://www.wampserver.com/en/ Wikipedia (2017). Yahoo! Opgehaald van Wikipedia: https://en.wikipedia.org/wiki/Yahoo! Zeltser, L. (2015). Early History of the World-Wide Web: Origins and Beyond. Opgehaald van https://zeltser.com/web-history/ 65 BIJLAGEN BIJLAGE I : CODE WEBCRAWLER De code is inmiddels wat aangepast en verbeterd. In de aangepaste versie worden de stappen 2, 3 en 4 uitgevoerd door één script: spider02-php. De in het verslag genoemde code is als volgt terug te vinden: Stap Pagina verslag Nieuwe code Start-URL opgeven Start.php Index.htm Stap 1 Stap-01.php Spider-01.php Stap 2 Stap-02.php Spider-02.php Stap 3 Stat-03.php Spider-02.php Stap 4 Stap-04.php Spider-02.php Stap 5 Stap-05.php Spider-03.php Lijst van geindexeerde pagina's - List.php Top 10 van meest verwezen sites - Top10.php Index.htm <html> <head> <title>Spider</title> </head> <body> <form action="stap-01.php" method="GET" target="indexer"> <input class="text" type="text" name="url" value="http://"> <input class="button" type="submit" value="Spider!"> </form> <br> <iframe class="left" id="indexer" name="indexer"></iframe> <iframe class="right" id="list" name="list" src="list.php"></iframe> <iframe class="left" id="site" name="site" src=""></iframe> <iframe class="right" id="top10" name="top10" src="top10.php"></iframe> </body> </html> Spider01.php <?php //VRAAG URL OP $url=""; $url = $_GET["url"]; //OPEN DATABASE $db = new mysqli('localhost', 'root', '1234', 'spider01'); //LEEG VORIGE DATABASE $sql = "Delete from links where id>0"; $result = mysqli_query($db, $sql); // PLAATS EERSTE LINK $sql = "INSERT INTO links (url, title, description, keywords, content, inlinks) VALUES ('".$url."', 'title', 'description', 'keywords', 'content', 0)"; $result = mysqli_query($db, $sql); //SLUIT DATABASE $db -> close(); //GA NAAR VOLGENDE STAP: HET INDEXEREN header('Location: spider-02.php?url='.$url); die(); ?> Spider02.php <?php // GEEN TIJDSLIMIET set_time_limit (0); //VRAAG URL OP $url=""; $url = $_GET["url"]; //ZET tekens weer in de URL $url = str_replace("//AMP//", "&",$url); $url = str_replace("//Q//", "?",$url); $url = str_replace("//S//", "'",$url); //LAAD HTML in DOMDOCUMENT $dom = new DOMDocument('1.0'); @$dom->loadHTMLFile($url); //BEWERK HTML-content $content = "content"; $content = $dom->saveHTML(); $content = str_replace("'", "", $content); //RIP TITLE $title = "Untitled"; preg_match('/<title>([^>]*)<\/title>/si', $content, $match ); if (isset($match) && is_array($match) && count($match) > 0){$title = strip_tags($match[1]);} $title = str_replace("'", "",$title); //RIP METATAGS $description = $keywords $errorLevel $tags = $keywords $description = $errorLevel = "No description."; = "none"; = error_reporting(0); get_meta_tags($url); = str_replace("'", "", $tags['keywords']); str_replace("'", "", $tags['description']); error_reporting(1); //PLAATS TITEL, METATAGS EN CONTENT IN DATABASE $db = new mysqli('localhost', 'root', '1234', 'spider01'); $sql = "UPDATE links SET title='".$title."', description='".$description."', keywords='".$keywords."', content='".$content."' WHERE url='".$url."' OR url='".$url."/' OR url='".rtrim($url,"/")."'"; $result = mysqli_query($db, $sql); $db -> close(); //HAAL ALLE LINKS UIT DE HTML-CODE EN PLAATS DEZE IN DE DATABASE $anchors = $dom->getElementsByTagName('a'); foreach ($anchors as $element) { $href = $element->getAttribute('href'); if (0 !== strpos($href, 'http')) { $path = '/' . ltrim($href, '/'); if (extension_loaded('http')) { $href = http_build_url($url, array('path' => $path)); } else { $parts = parse_url($url); $href = $parts['scheme'] . '://'; if (isset($parts['user']) && isset($parts['pass'])) { $href .= $parts['user'] . ':' . $parts['pass'] . '@'; } $href .= $parts['host']; if (isset($parts['port'])) { $href .= ':' . $parts['port']; } $href .= $path; } } $href= rawurldecode($href); $href = str_replace("'", "//S//",$href); //CHECK OF LINK AL AANWEZIG IS $db = new mysqli('localhost', 'root', '1234', 'spider01'); $sql = "SELECT url FROM links where url='".$href."' OR url='". $href."/' OR url='".rtrim($href,"/")."'"; $result = mysqli_query($db, $sql); if($result -> num_rows > 0){ $sql = "UPDATE links SET inlinks=inlinks+1 WHERE url='". $href."' OR url='".$href."/' OR url='".rtrim($href,"/")."'"; } else { $pos = strpos($href, "?"); if ($pos === false) { $sql = "INSERT INTO links (url, title, description, keywords, content, inlinks) VALUES ('".$href."', 'title', 'description', 'keywords', 'content', 0)"; } }; $db -> close(); if (strpos($href, ".")>0 and strpos($href, "#")<1 and strpos($href, "pdf")<1) { $db = new mysqli('localhost', 'root', '1234', 'spider01'); $retval = mysqli_query($db,$sql); if(! $retval ){ die($sql .' Could not update data: ' . mysqli_error($db)); } $db -> close(); }; } //HAAL $url = $url = $url = ? en &-tekens uit de URL str_replace("&", "//AMP//",$url); str_replace("?", "//Q//",$url); str_replace("'", "//S//",$url); ?> <html> <head> <title>Indexing <?php echo $title;?></title> <meta http-equiv="refresh" content="1; url=spider-03.php?url=<?php echo $url; ?>"> <style> html{background-color:#fff; font-family: Calibri;} h2 {color:#0099ff;} table {smargin:10px; width:90%;} .index {font-weight:bold; width:100px;vertical-align: text-top;} .title {} .description {} .keywords {} </style> <script type="text/javascript"> function openPage() { var url='<?php echo $url; ?>'; window.open(url, 'site'); } </script> </head> <body> <h2>Indexing content</h2> <table> <tr> <td class="index">Title</td> <td class="title"><?php echo $title;?></td> </tr> <tr> <td class="index">URL</td> <td class="title"><?php echo $url;?></td> </tr> <tr> </tr> <tr> <td class="index">Description</td> <td class="description"><?php echo $description;?></td> <td class="index">Keywords</td> <td class="keywords"><?php echo $keywords;?></td> </tr> </table> <script type="text/javascript"> setTimeout('openPage()', 0); </script> </body> </html> Spider03.php <?php //STAP 03: VOLGENDE URL KIEZEN // GEEN TIJDSLIMIET set_time_limit (0); //ERROR HANDLING function shutDownFunction() { $error = error_get_last(); // fatal error, E_ERROR === 1 if ($error['type'] === E_ERROR) { echo "FATAL ERROR"; $url = $_GET["url"]; echo $url; } } register_shutdown_function('shutDownFunction'); //VRAAG URL OP $url=""; $url = $_GET["url"]; //ZET &-tekens weer in de URL $url = str_replace("//AMP//", "&",$url); $url = str_replace("//Q//", "?",$url); $url = str_replace("//S//", "'",$url); $db = new mysqli('localhost', 'root', '1234', 'spider01'); //OPVRAGEN ID LAATSTE URL $sql= "SELECT id,url from links WHERE url='".$url."' OR url='".$url."/' OR url='".rtrim($url,"/")."' order by ID"; $result = mysqli_query($db, $sql); $row = $result -> fetch_assoc(); $id = $row['id']; echo $row['id']; //NIEUWE URL IS VOLGENDE RECORD IN DE DATABASE $sql= "SELECT id,url from links WHERE ID>".$id." order by ID"; $result = mysqli_query($db, $sql); $row = $result -> fetch_assoc(); $newurl = $row['url']; $db -> close(); //HAAL $url = $url = $url = &-tekens uit de URL str_replace("&", "//AMP//",$url); str_replace("?", "//Q//",$url); str_replace("'", "//S//",$url); header('Location: spider-02.php?url='.$newurl); die(); ?> List.php <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title>List</title> <meta http-equiv="refresh" content="10"> </head> <body> <h2 class="loading">Crawling</h2> <?php $counter = 1; $indexcounter=0; $db = new mysqli('localhost', 'root', '1234', 'spider01'); $sql = "Select DISTINCT * from links order by ID DESC"; $result = mysqli_query($db,$sql); $rowcount = mysqli_num_rows($result); echo "<b>". $rowcount. " URL's in database</b><br><br>"; if(!$result = $db -> query($sql)) { die('There was an error running the query [' . $db->error . ']');} while($row = $result -> fetch_assoc()) { if (strlen($row['content'])>10) { echo "<b>INDEXED</b>: "; $indexcounter++; }; echo $row['url']; echo "<br>"; $counter++ ;} $db -> close(); echo "<br><br>"; echo $indexcounter; echo " pagina's geindexeerd." ?> </body> </html> Top10.php <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title>Top 10</title> <meta http-equiv="refresh" content="10"> <style> html{background-color:#fff; font-family: Calibri;} h2 {color:#0099ff;} </style> </head> <body> <h2>Verwijzingen Top 10</h2> <?php $counter = 1; $sql = "Select DISTINCT * from links order by inlinks DESC LIMIT 10"; $db = new mysqli('localhost', 'root', '1234', 'spider01'); $retval = mysqli_query($db,$sql); if(!$result = $db -> query($sql)) { die('There was an error running the query [' . $db->error . ']');} while($row = $result -> fetch_assoc()) { echo $counter . ". "; echo str_replace("//S//","'",$row['url']); echo " (". $row['inlinks'] .")"; echo "<br>"; $counter++ ;} $db -> close(); ?> </body> </html> BIJLAGE II : Code Inverted Index wordcount.php <?php //VRAAG URL OP $url = $_GET["url"]; //HAAL ID EN PAGERANK OP VAN URL $db = new mysqli('localhost', 'root', '****', 'kat'); $sql = "SELECT * FROM links WHERE url='$url'"; $result = mysqli_query($db, $sql); $row = $result -> fetch_assoc(); $ID = $row['id']; $pagerank = $row['pagerank']; $db -> close(); function get_string_between($string, $start, $end){ $string = ' ' . $string; $ini = strpos($string, $start); if ($ini == 0) return ''; $ini += strlen($start); $len = strpos($string, $end, $ini) - $ini; return substr($string, $ini, $len); } function WordCount($trefwoord) { global $ID, $title, $description, $keywords, $h1, $content, $pagerank, $db; $trefwoord = strtolower(" " . $trefwoord . " "); //Woorden tellen $titlecount $descriptioncount $keywordscount $h1count $contentcount = substr_count($title, $trefwoord); = substr_count($description, $trefwoord); = substr_count($keywords, $trefwoord); = substr_count($h1, $trefwoord); = substr_count($content, $trefwoord); //Verfijning: Bij titel, description, keywords en h1 alleen aangeven òf ze erin zitten. if ($titlecount>0){$titlecount = 1;} else {$titlecount = 0;}; if ($descriptioncount>0){$descriptioncount = 1;} else {$descriptioncount = 0;}; if ($keywordscount>0){$keywordscount = 1;} else {$keywordscount = 0;}; if ($h1count>0){$h1count = 1;} else {$h1count = 0;}; $hash = $ID . "(" . $titlecount ."|".$descriptioncount."|". $h1count."|".$contentcount."|".$pagerank.")"; $trefwoord = str_replace(" ", "", $trefwoord); //Open tabel Keywords $sql = "SELECT * FROM keyword WHERE word='$trefwoord'"; $result = mysqli_query($db, $sql); $row = $result -> fetch_assoc(); //Haal hastabel op van betreffende keyword $hashstring = $row['hash']; //CHECK OF DEZE SITE ER AL IN VOORKOMT $pos = strpos($hashstring, ",".$ID."("); if ($pos>0){ //VERVANG BESTAANDE HASH $oldhash = get_string_between($hashstring, $ID."(", ")"); $oldhash = $ID."(".$oldhash.")"; $newhash = str_replace($oldhash , $hash , $hashstring); } else { //Voeg hash van deze SITE-ID toe aan eind van hashtabel $newhash = $hashstring . "," . $hash; } if ($contentcount>0) { //Zet nieuwe HASH in DB $sql = "UPDATE keyword SET hash='$newhash' WHERE word='$trefwoord'"; $result = mysqli_query($db, $sql); } //SLUIT DATABASE $db -> close(); } //LAAD HTML in DOMDOCUMENT $dom = new DOMDocument('1.0'); @$dom->loadHTMLFile($url); //BEWERK $content $content $content HTML-content = "content"; = $dom->saveHTML(); = strtolower($content); // ZET ALLES IN LOWER CASE //RIP TITLE $title = "Untitled"; preg_match('/<title>([^>]*)<\/title>/si', $content, $match ); if (isset($match) && is_array($match) && count($match) > 0){$title = strip_tags($match[1]);} // TEL $title $title $title ZOEKWOORD IN TITEL = strtolower($title); = " " . $title . " "; = preg_replace('/[^a-z0-9]+/i', ' ', $title); // HAAL ALLE LEESTEKENS UIT DE TITEL //RIP METATAGS $description = $keywords = $tags = $keywords = $description = "No description."; "none"; get_meta_tags($url); preg_replace('/[^a-z0-9]+/i', ' ', $tags['keywords']); preg_replace('/[^a-z0-9]+/i', ' ', $tags['description']); //KEYWORDS $keywords = str_replace(" ", " ", $keywords); $keywords = " " . $keywords . " "; //DESCRIPTION $description = str_replace(" ", " ", $description); $description = " " . $description . " "; //h1 $h1 = "None"; preg_match('/<h1>([^>]*)<\/h1>/si', $content, $match ); if (isset($match) && is_array($match) && count($match) > 0){$h1 = strip_tags($match[1]);} $h1 = " " . $h1 . " "; // COMPLETE CONTENT $content = strip_tags($content); // STRIP ALLE TAGS $content = str_replace("\n", " ", $content); // NIEUWE REGEL WORDT SPATIE $content = str_replace(chr(13), " ", $content); // ENTER WORDT SPATIE $content = preg_replace('/[^a-z]+/i', ' ', $content); $totaal = str_word_count($content); // Open zoektermentabel en zet nieuw gevonden resultaten in de inverted index $row=""; $result =""; $rowcount=""; $sql = "Select * from keyword order by id"; $result = mysqli_query($db,$sql); $rowcount = mysqli_num_rows($result); while($row = $result -> fetch_assoc()) { WordCount($row['word']); } $db -> close(); ?> BIJLAGE III : CODE ZOEKMACHINES Zoekmachine I – engine01.php <?php $q = $_GET["q"]; $teller = 0; ?> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title>Zoekmachine I</title> <style> a {color:blue;font-weight:bold;} </style> </head> <body> <h1>Zoekmachine I</h1> <h2>Zoekresultaten voor '<?= $q;?>'</h2> <?php if ($q>""){ $db = new mysqli('localhost', 'root', '****', 'kat'); $sql = "Select DISTINCT * from links where (title like '%$q%' or nepurl like '%$q %') order by Title"; $result = mysqli_query($db,$sql); $rowcount = mysqli_num_rows($result); while($row = $result -> fetch_assoc()) { echo "<p>"; echo '<a href="'. $row["url"]. '" target="_blank">'; echo $row["title"]; echo "</a>"; echo "<br>"; echo $row["nepurl"]; echo "<br>"; echo $row["description"]; echo "</p>"; $teller++; } $db -> close(); } ?> Totaal: <?=$teller;?> resultaten voor '<?=$q;?>' </body> </html> Zoekmachine II – engine02.php <?php $q = $_GET["q"]; $teller = 0; ?> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title>Zoekmachine II</title> <style> body {font-family: Arial, Helvetica;} a {color:blue;} .link {color:#777;font-size:11px;} .smalltekst {color:#ccc;font-size:11px;} </style> </head> <body> <h1>Zoekmachine II</h1> <h2>Zoekresultaten voor '<?= $q;?>'</h2> <?php $n=0; if ($q>""){ $db = new mysqli('localhost', 'root', '****', 'kat'); $sql = "Select * from keyword where word='$q'"; $result = mysqli_query($db,$sql); $rowcount = mysqli_num_rows($result); $row = $result -> fetch_assoc(); $hash = $row["hash"]; // Zet inverted index in array $hasharray = explode( ',', $hash); $resultaten=array(); $n=1; while ($n<count($hasharray)) { $siteid = substr($hasharray[$n],0,strpos($hasharray[$n], "(")); $siteid=intval($siteid); $right = substr($hasharray[$n],(strpos($hasharray[$n], "(")+1), (strpos($hasharray[$n], ")")-2)); $right = str_replace(")", "",$right); $soorten = explode("|", $right); $woordscore = (20*$soorten[0]) + (10*$soorten[1]) + (10*$soorten[2]) + $soorten[3]; if ($woordscore>0) { $resultaten[] = array('siteid'=>$siteid, 'woordscore'=>$woordscore, $soorten[0],$soorten[1],$soorten[2],$soorten[3]); } $n++; } // Sorteren op score (aflopend) usort($resultaten, function($a, $b) { if($a['woordscore']==$b['woordscore']) return 0; return $a['woordscore'] < $b['woordscore']?1:-1; }); $n=0; echo "<ol>"; while ($n<count($resultaten)) { $sql2 = "Select * from links where id=".$resultaten[$n]['siteid']; $result2 = mysqli_query($db, $sql2); $row2 = $result2 -> fetch_assoc(); echo "<li>"; echo "<p>"; echo '<a href="'. $row2["url"]. '" target="_blank">'; echo $row2["title"]; echo "</a>"; echo " - "; echo $row2["description"]; echo "<br>"; echo '<span class="link">'; echo $row2["nepurl"]; echo "</span>"; echo '<span class="smalltekst"> - '; echo "WoordScore: "; echo $resultaten[$n]['woordscore']; echo " ("; echo "titel: "; echo $resultaten[$n][0]; echo "; description: "; echo $resultaten[$n][1]; echo "; h1: "; echo $resultaten[$n][2]; echo "; content: "; echo $resultaten[$n][3]; echo ")</span>"; echo "</p>"; echo "</li>"; $n++; } } echo "</ol>"; ?> Totaal: <?=$n;?> resultaten voor '<?=$q;?>' </body> </html> Zoekmachine III – engine03.php <?php $q = $_GET["q"]; $teller = 0; ?> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title>Zoekmachine III</title> <style> body {font-family: Arial, Helvetica;} a {color:#1a39c5;; font-size:16px;font-weight:bold;text-decoration:none;} .resultaat {width:500px;} .description {font-size: 13px;color:#444;font-weight:normal;} .link {color:green;font-size:13px;font-weight:normal;} .smalltekst {color:#aaa;font-size:11px;font-weight:normal;} #totaal {color:#333;font-weight:normal;} #res {} </style> </head> <body> <h1>Zoekmachine III</h1> <h2>Zoekresultaten voor '<?= $q;?>'</h2> <?php $n=0; if ($q>""){ $db = new mysqli('localhost', 'root', '****', 'kat'); $sql = "Select * from keyword where word='$q'"; $result = mysqli_query($db,$sql); $rowcount = mysqli_num_rows($result); $row = $result -> fetch_assoc(); $hash = $row["hash"]; //echo $hash; // Zet hash in array $hasharray = explode( ',', $hash); //var_dump($hasharray); $resultaten=array(); $n=1; while ($n<count($hasharray)) { $siteid = substr($hasharray[$n],0,strpos($hasharray[$n], "(")); $siteid=intval($siteid); $right = substr($hasharray[$n],(strpos($hasharray[$n], "(")+1), (strpos($hasharray[$n], ")")-2)); $right = str_replace(")", "",$right); $soorten = explode("|", $right); $woordscore = (20*$soorten[0]) + (10*$soorten[1]) + (10*$soorten[2]) + $soorten[3]; $pagerank = $soorten[4]; $paginascore = $woordscore * $pagerank; if ($paginascore>0) { $resultaten[] = array('siteid'=>$siteid, 'pagerank'=>$pagerank, 'woordscore'=>$woordscore, 'paginascore'=>$paginascore, $soorten[0], $soorten[1],$soorten[2],$soorten[3]); } $n++; } echo '<div class="smalltekst">' . ($n-1) . ' resultaten</div>'; // Sorteren op score (aflopend) usort($resultaten, function($a, $b) { if($a['paginascore']==$b['paginascore']) return 0; return $a['paginascore'] < $b['paginascore']?1:-1; }); $n=0; while ($n<count($resultaten)) { $db = new mysqli('localhost', 'root', '****', 'kat'); $sql2 = "Select * from links where id=".$resultaten[$n]['siteid']; $result2 = mysqli_query($db, $sql2); $row2 = $result2 -> fetch_assoc(); echo '<p class="resultaat">'; echo '<a href="'. $row2["url"]. '" target="_blank">'; echo $row2["title"]; echo "</a>"; echo "<br>"; echo '<span class="link">'; echo $row2["nepurl"]; echo "</span>"; echo "<br>"; echo '<span class="description">'; // Als trefwoord in de description voorkomt, wordt deze vet afgedrukt if (strlen($row2["description"])>150) { echo str_replace($q,"<b>".$q."</b>",substr($row2["description"], 0, 150)); echo "..."; } else { echo str_replace($q,"<b>".$q."</b>",$row2["description"]); } echo '</span>'; echo "<br>"; echo '<span class="smalltekst">'; echo "WoordScore: "; echo $resultaten[$n]['woordscore']; echo " ("; echo "titel: "; echo $resultaten[$n][0]; echo "; description: "; echo $resultaten[$n][1]; echo "; h1: "; echo $resultaten[$n][2]; echo "; content: "; echo $resultaten[$n][3]; echo ")"; echo "; PageRank: "; echo $resultaten[$n]['pagerank']; echo "; PaginaScore: "; echo $resultaten[$n]['paginascore']; echo "</p>"; echo "</span>"; $n++; } } ?> <div id="totaal">Totaal: <?=$n;?> resultaten voor '<?=$q;?>'</div> </body> </html>