Kmom10: Projekt och examination

By . Latest revision .

Detta kursmoment avslutar och examinerar kursen.

Upplägget är enligt följande:

  • Projektet och redovisning (20-80h)

Totalt omfattar kursmomentet (07/10) ca 20+20+20+20 studietimmar.

#Projektidé och upplägg

Du ska utveckla ett rättstavningsprogram till terminalen som använder en Trie för att lagra en ordlista.

Börja med att kopiera filer med rättstavade engelska ord från exempel mappen.

# Stå i kursrepo mappen
cp example/dictionary/*.txt me/kmom10/spellchecker
cd me/kmom10/SpellChecker

Du kopierade fyra filer, alla innehåller ett ord per rad. dictionary.txt innehåller 349900 rättstavade ord och tiny_dictionary.txt innehåller 177. dictionary.txt kan ta lång tid att ladda och jobba med så när ni börjar med uppgiften använd tiny_dictionary.txt eller skapa en egen ännu mindre fil. Frequency filerna är för krav 5.

Innan du börjar med programmeringen ska du göra en analys av programmet du ska bygga och dokumentera det med klassdiagram.

Fråga i discord om du känner dig osäker.

Andreas visar hur SpellChecker kan se ut när det är klart.

#Bedömning och betygsättning

När du lämnat in projektet bedöms det tillsammans med dina tidigare redovisade kursmoment och du får ett slutbetyg på kursen. Läs om grunderna för bedömning och betygsättning.

#Projektspecifikation

Utveckla och leverera programmet enligt följande specifikation. Saknas info i specen kan du själv välja väg, dokumentera dina val i redovisningstexten.

De tre första kraven är obligatoriska och måste lösas för att få godkänt på uppgiften. De tre sista kraven är optionella krav. Lös de optionella kraven för att samla poäng och därmed nå högre betyg.

Varje krav ger max 10 poäng, totalt är det 60 poäng.

#Krav 1: Grunden

Skriv din kod i katalogen me/kmom10/spellchecker. Filen som startar programmet skall heta spellchecker.py och ska innehålla klassen SpellChecker.

Implementera en Trie datastruktur, i filen trie.py, som använder Node objekt, node.py. Varje Node objekt behöver innehålla vilken bokstav noden representerar, en dictionary eller lista som ska hålla barn noderna och en boolean för att markera om det är en slut nod. Om du gör krav fyra måste du använda dictionary, annars kan du välja själv mellan dictionary och lista. I Trie:n ska det gå att lägga till nya ord, kolla om ett ord finns i datastrukturen och få ut alla ord baserat på ett prefix.

När man exekverar spellchecker.py ska ett SpellChecker objekt skapas som läser in en fil med rättstavade engelska ord (välj själv vilken fil som ska läsas upp vid start). Lägg in alla orden i ett Trie objekt. Starta sen ett klassiskt while-loop terminal program (Marvin meny). Följande menyval ska finnas:

  1. Ta ett ord som input och kolla om det finns i ordlistan (Trie objektet). Om ordet inte finns lyft felet SearchMiss, ni behöver också skapa det Exception själva. Det ska inte krasha programmet! Fånga felet i meny koden.

  2. En prefix sökning (auto-complete), användaren skriver in de tre första bokstäverna av ett ord. Programmet ska då skriva ut ord från ordlistan som har de bokstäverna som prefix, användaren ska kunna fortsätta att skriva in en bokstav åt gången och få ut orden som finns baserat på det prefixet. Du kan begränsa utskriften av ord till max 10 åt gången. Se video ovan för exempel.

  3. Byta ut ordlistan, användaren ska skriva in ett filnamn. Programmet ska då skapa ett nytt Trie objekt och läsa in orden från den nya filen.

  4. Skriv ut alla ord som finns i ordlistan, i bokstavsordning. Ett tips, för att göra denna metoden testbar kan ni skapa en som letar upp alla orden, lägger dem i en lista och returnerar listan. Sen låter ni en annan metod skriva ut orden.

  5. Ta bort ett ord, programmet ska be användaren om ett ord som input och ta bort bort det ordet från Trien. Om ordet inte finns ska SearchMiss lyftas som error. Det ska inte krasha programmet! Det ärcker inte med att bara avmarkera noder när du tar bort ett ord. Om noderna i ordet inte används till ett annat ord ska du ta bort dem från datastrukturen.

  6. Exit

I SpellChecker klassen, lägg inte all kod i while-loopen, dela upp koden i metoder. T.ex. en metod/menyval åtminstone.

#Krav 2: Klassdiagram

Innan du börjar programmera ska du analyser och planera vad du ska koda. Dokumentera med klassdiagram vilka klasser, attribut, metoder och relationer som du tror att du kommer skapa när du utvecklar programmet.

Klassdiagrammet ska lämnas in före du börjar koda projektet. Det finns en separat inlämning på Canvas för klassdiagrammet. Du behöver inte vänta på att få godkänt innan du fortsätter med att programmera, det viktiga är att du har lämnat in det före.

Så gör ett klassdiagram, lämna in det och sen börjar du koda projektet.

Det gör inget om koden skiljer sig från diagrammen när du är klar med projektet. Det blir inte alltid som man tänker sig.

När du har kodat klart projektet, jämför hur din kod faktiskt blev med hur du tänkte dig att det skulle fungera. I redovisningstexten skriver du hur din kod förhåller sig till diagrammet.

Spara som classdiagrams.png. Ladda upp filen på Canvas inlämningsuppgiften.

#Krav 3: Testning

Skriv enhetstester för dina klasser. Spara testerna i filen test.py.

Minst 6 tester för Trie klassen. Testa inte bara positiva utfall, försök även göra så att något går fel och testa hur det hanteras. Ni behöver också testa att SearchMiss exception:et lyfts.

Se till att din kod validerar.

# Ställ dig i kurskatalogen
dbwebb publish kmom10

#Krav 4: Sortera utskriften (optionell)

För menyval 4 sortera alla orden innan de skrivs ut. Implementera en Merge Sort algoritm som metod i SpellChecker klassen. Hämta ut alla ord från Trie objektet, lägg dem i en lista, sortera listan med Merge sort och skriv ut listan. Om du gör detta kravet ska du använda en dictionary för att hålla barn noderna i Node klassen. Lägg till tester för din merge sort.

#Krav 5: Baser utskrift för menyval 2 på word frequency (optionell)

I detta kravet ska du använda filerna frequency.txt och tiny_frequency.txt för ordlistan. De filerna innehåller rättstavade engelska ord och hur vanliga de är. Varje rad innehåller ett ord och hur vanligt ordet är (ett float tal), separat med space. Ju högre siffra desto vanligare är ordet. Bygg ut din Node klass med ett attribut för frequency. I din metod för att lägga till ord, när du markera en slut nod behöver du också lägga in frekvensen för ordet som noden marker.

Nu för menyval 2, när programmet skriver ut 10 ord som finns baserat på prefixet ska programmet sortera alla orden baserat på frekvens och begränsa utskriften till att max skriva ut de 10 med högst frekvens.

#Krav 6: Grafiskt gränssnitt på webben (optionell)

Gör ett grafiskt gränssnitt för att kolla om ett ord är rättstavat. Skapa en webbsida med Flask som innehåller två undersidor, en sida för att kolla om ett ord finns i ordlistan och en sida som skriver ut alla orden som finns i ordlistan. Webbsidan ska även fungera på studentservern!

Koden som finns i app.py, som har med Flask att göra, behöver inte vara i en klass.

#Vad är en Trie

Här kan ni hitta lite mer material om vad Trie är och hur den ska fungera.

#Redovisning

  1. På din redovisningssida, skriv följande:

    1. För varje krav du implementerat, dvs 1-6, skriver du ett textstycke om ca 5-10 meningar där du beskriver vad du gjort och hur du tänkt. Poängsättningen tar sin start i din text så se till att skriva väl för att undvika poängavdrag. Missar du att skriva/dokumentera din lösning så blir det 0 poäng. Du kan inte komplettera en inlämning för att få högre betyg.

    2. Skriv ett allmänt stycke om hur projektet gick att genomföra. Problem/lösningar/strul/enkelt/svårt/snabbt/lång tid, etc. Var projektet lätt eller svårt? Tog det lång tid? Vad var svårt och vad gick lätt? Var det ett bra och rimligt projekt för denna kursen?

    3. Avsluta med ett sista stycke med dina tankar om kursen och vad du anser om materialet och handledningen (ca 5-10 meningar). Ge feedback till lärarna och förslå eventuella förbättringsförslag till kommande kurstillfällen. Är du nöjd/missnöjd? Kommer du att rekommendera kursen till dina vänner/kollegor? På en skala 1-10, vilket betyg ger du kursen?

  2. Ta en kopia av texten på din redovisningssida och kopiera in den på Canvas. Glöm inte länka till din me-sida och projektet.

  3. Kompletterar redovisningstexten med att spela in en kort video där de visar kod och berättar om de tekniska implementationerna de gjorde i projektet. Lägg till en länk till videon i redovisningstexten på inlämningen på Canvas. Visa ditt ansikte och en giltig ID handling, t.ex. körkot eller pass, i videon.

# Ställ dig i kurskatalogen
dbwebb publish me

#Revision history

  • 2021-03-10: (E, aar) La till referensmaterial om Trie.
  • 2020-03-10: (D, aar) La till i krav att spela in video som distans.
  • 2020-02-28: (C, aar) La till i krav att ta bort ord och skriva ut i bokstavsordning.
  • 2019-02-29: (B, aar) Bytt projekt för att passa till algoritmer och datastrukturer. Förra projektet finns under [kmom10-2018](oopython-v2/kmom10-2018).
  • 2018-02-21: (A, aar) Först utgåva till V2.

Document source.