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

    1. Start
    2. 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.

    3. Beschrijving van de beschikbare code

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").

    1. Opgave 2: maken van een index
    2. 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.

    3. Opgave 3: zoeken van één woord in de index
    4. 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.

    5. Extra opgave 4 (bonus van maximaal 1 pnt.): zoeken van woordencombinatie in de index

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’.