CMG University Class
Module Multimedia
Practicum 3:
Text retrieval
Jeroen Kuiper, Arjan Salomons, Josine de Wilde i.s.m. Mike Lew
Januari 2000
Assistentie
maandag 17 januari |
vrijdag 21 januari |
Arjan |
Arjan |
Alex |
Jeroen |
Jeroen |
Josine |
Josine |
Urso |
Inleiding
In deze opdracht ga je een text search engine maken in C++. Voor deze engine maken we gebruik van inverted index search. Bij deze zoekmethode wordt een lijst (index) gemaakt van alle woorden die voorkomen in de te onderzoeken bestanden. Van elk woord wordt bijgehouden in welke tekstbestanden het te vinden is. Voor een zoekopdracht wordt dan gekeken of het woord in de index staat en zo ja, in welke bestanden het voorkomt.
Voorbereiding
Je kunt als je wilt thuis van te voren de opdracht en de meegeleverde code doornemen, zodat je meteen aan de slag kunt. Dit is niet nodig, je kunt dit ook op de practicumdag zelf doen, daar is genoeg tijd voor.
Benodigde voorkennis
Als voorkennis wordt beschouwd alle kennis uit het college.
In te leveren
Wat?
De door jou aangepaste C++ bestanden:
Hoe?
De bovengenoemde bestanden op papier en per mail naar cmgmail@liacs.nl.
Tijdsschema
Dit zijn de richttijden, je hoeft alles pas om 17:30 in te leveren.
Tijdstip |
Actie |
11:40 |
Start, begin opgave 1 (doorlezen code, diagrammen, etc.) |
12:30-13:00 |
Lunch |
13:00 |
opgave 1: main() aanvullen |
13:30 |
Begin opgave 2 |
14:45-15:00 |
Pauze |
16:15-16:30 |
Pauze |
16:30 |
Begin opgave 3 |
17:30 |
Alles inleveren en naar huis |
1. Implementatie van een text search engine
Een groot gedeelte van de benodigde code is reeds voor je geïmplementeerd. Je kunt deze bestanden vinden in P:\cmg multimedia\opdracht3. Kopieer de hele directory naar je eigen account (Z:\).
Het doel van het programma is om één woord in een aantal bestanden (gegroepeerd in één map) op te zoeken. Eerst even een korte herhaling hoe inverted index search werkt.
Het programma maakt eerst een index. In de index staan entries. In een entry staan een woord en een lijstje van bestandsnamen waarin het woord voorkomt. Je kunt dit je schematisch zo voorstellen (we kijken naar de entry van ‘which’):
Woord |
Bestandsnamenlijst |
... |
... |
which |
test_texts\text1.txt, test_texts\text2.txt |
... |
... |
Vervolgens kan de gebruiker één woord invoeren om te laten zoeken. Het programma levert dan het lijstje met bestandsnamen waarin het woord voorkomt, of meldt dat het woord niet in de bestanden voorkomt—als toepasselijk. Dit zoeken kan de gebruiker meerdere malen doen, waarbij telkens slechts in de index gezocht wordt. Het maken van index bespaart dus een hoop werk wanneer we meerdere malen een woord willen opzoeken.
Standard Template Library
Het programma maakt gebruik van de Standard Template Library (STL). De STL is een bibliotheek met handige standaardklassen voor C/C++, zoals string en vector die je reeds in eerdere opdrachten bent tegen gekomen. De klasse string is een handige klasse ter vervanging van char*-constructies. Je kunt string dan gebruiken als elke andere klasse, dus vergelijken met ==, >, <, etc.. Deze klasse zul je in deze opdracht ook zelf moeten gebruiken. De klasse vector daarentegen niet, maar deze wordt wel gebruikt in de implementatie. Een vector is een array met variabele lengte, je kunt er elementen aan toevoegen of verwijderen.
Op een indruk te krijgen van de beschikbare code, vind je hier een use case diagram en een klassediagram.
Fig. 1 Use case diagram
Fig. 2 Klassediagram
In de beschikbare code is het de bedoeling om drie essentiële functies te implementeren:
Tips
1.3 Opgave 1: main()
Kijk eerst goed de code door (vooral de headerfiles van de klassen) om een beeld te krijgen hoe deze geïmplementeerd is. Bedenk welke functies je nodig zult hebben of handig zullen zijn.
Vul de functie main()aan, doe net alsof CreateIndex::create() en SearchWord::search() reeds bestaan (we programmeren dus "top-down").
Implementeer de functie CreateIndex::create(). In die functie loop je door alle teksten (m.b.v. Directory) . Per tekst vraag je telkens een volgend woord op. Wanneer een woord nog niet in de index zit, voeg je het toe. Zit het wel al in index, dan zoek je de entry of en kijk je of de bestandsnaam van de huidige tekst al in de bestandsnamenlijst van de entry voorkomt. Zo nee, dan voeg je die toe; anders doe je niets.
Implementeer de functie SearchWord::search(). Je vraagt aan de index of het woord ook voorkomt. Zo ja, haal de entry dan op en retourneer de bestandsnamenlijst als string. Zo nee, dan geef je een lege string terug.
Je kunt je programma nu testen. In de folders test_texts2 staan hele korte files voor korter testjes en in texts staan lange (echte) teksten om te testen.
In deze opgave moet je zoeken op twee woorden implementeren. Je moet nu zelf enkele memberfuncties implementeren. Je zult dus ook de headerfiles moeten aanpassen.
1.5.1 Opgave 4.1: Of
Pas je implementatie zo aan, dat je op twee woorden kunt zoeken. Je wilt dus alle teksten waar of het ene woord of het andere woord in voorkomt. Bijvoorbeeld ‘which’ of ‘you’.
1.5.2 Opgave 4.1: En
Pas je implementatie zo aan, dat je op twee woorden kunt zoeken. Je wilt dus alle teksten waar beide woorden voorkomen. Bijvoorbeeld ‘which’ én ‘you’.