Labb 1: Konkordans
Om du redovisar labben senast den 16 februari får du en bonuspoäng på tentan.
På övningen den 1 februari har du dessutom möjlighet att redogöra för lösningen på teoriuppgifterna nedan. Korrekt lösning av dessa ger en bonuspoäng på tentan. Sen redovisning ger ingen bonus för labb eller teoriuppgifter. En konkordans är en databas där man kan slå upp ord och då få se alla förekomster av ordet tillsammans med orden närmast före och närmast efter i texten. Detta är ett stort hjälpmedel för lingvister som vill undersöka hur olika ord används i språket. I denna uppgift ska du skriva ett program som givet en text skapar en konkordansdatabas och ett program som frågar användaren efter ord, slår upp ordet och presenterar alla förekomster av ordet i sitt sammanhang. Det är viktigt att varje sökning går mycket snabbt så det gäller att det första programmet lagrar konkordansen på ett sådant sätt att det går snabbt att göra en sökning. Exempel på körning av sökprogrammet: orange51$ java Konkordans bevisen Det finns 4 förekomster av ordet. e mest eftersökta matematiska bevisen - det för Fermats stora sats. som tvingar andra att ljuga. Bevisen för att snus inte orsakar can de och därmed de enda dyrbara bevisen på romantiska känslor före ro jat samarbete med polisen har bevisen strömmat in. De New Yorks guv orange51$ KravFöljande krav ställs på din lösning:
TipsTexten, som ligger på/info/adk07/labb1/korpus , är en stor
fil och ska inte i sin helhet läsas in i internminnet under
sökningen. Istället bör sökprogrammet öppna filen och hoppa till dom
avsnitt som ska presenteras med seek (använd till exempel
fseek i stdio.h i C eller
seek i java.io.RandomAccessFile i Java).
Ta ingen kopia av textfilen utan låt sökprogrammet använda ursprungstextfilen på kurskatalogen. Konstruktionsprogrammet måste skapa något slags index som talar om för varje ord på vilka positioner i texten det förekommer. Detta index blir av samma storleksordning som texten och sökprogrammet ska därför inte heller läsa in hela indexet. Låt det ligga på en fil (eller flera filer) och positionera med hjälp av seek även i denna fil.
Indexfilerna blir stora och får nog inte plats på din skivminnesarea, så
skapa dom istället på temporärarean
Använd gärna
färdiga Unixverktyg som sort vid konstruktionen. En enkel tokeniserare
(ett program som läser en text och plockar ut dom enskilda orden samt
deras position i texten) finns på Java är numera ganska snabbt, ofta bara 3-5 gånger långsammare än C, men just vid filhantering är det viktigt att man är noggrann när man använder Java. När du skapar konkordansen kommer du troligen att vilja skriva många gånger på en eller flera filer. Se till att de strömmar du konstruerar för skrivning (och läsning) är buffrade (läsning och skrivning på en RandomAccessFile kan inte buffras). Teoriuppgifter
|