Skip to content

Analyser text och ord

Vi har i Marvin byggt ett program bestående av två moduler och ett antal funktioner som samverkar för att Marvin kan svara på frågor. Vi har även bekantat oss med dictionary där vi kan spara nyckel-värde par. Vi ska i denna uppgift skapa ett Marvin liknande program som tar emot inmatning och kan analysera en text.

Du har en bra förståelse för dictionary och har jobbat igenom Dictionaries och tupler i Python och Att läsa filer till en lista i Python.

I kursrepot finns en del av “Phil, the Fiddler”, phil.txt. Du skall använda den texten och låta ditt CLI-program analysera den.

Vill du lära dig mer om vad textanalys kan innebära “på riktigt” så läser du lite om text analys och text mining på Wikipedia.

Du kommer göra en övning med ordfrekvens, läs gärna om det på Wikipedia Letter Frequency och studera bilden som visar bokstävernas procentuella förekomst i det engelska språket.

För samtliga uppgifter gäller att ett ord består av bokstäverna [A-z]. Ett tips är att konvertera alla ord till enbart små bokstäver [a-z], det kan göra uppgiften enklare.

Googla “online word counter” eller “online letter counter” så hittar du verktyg som gör precis det du skall göra. Testa att köra in texten i ett av dem och se hur det ser ut. Då får du en referens och mental bild som kan hjälpa dig att se om du är på rätt väg eller ej.

Du ska i uppgiften göra ett program som analyserar en text från en fil. Det kan se ut på detta sättet när vi kör programmet:

Skriv DRY kod, funktioner som kan återanvändas för mer än 1 menyval.

Lösningar som använder konstruktionerna list/dict comprehension eller lambda funktioner godkänns inte i denna kurs.

Varje uppgift ska lösas med grundläggande Python konstruktioner som vi går igenom i kursen.

Börja med att kopiera text-filen phil.txt och lorum.txt.

Se till att din katalog analyzer innehåller filen phil.txt och lorum.txt. phil.txt ska vara FÖRVALT i programmet när man startar det.

  1. Ni får inte använda externa moduler för att göra analyzen. T.ex. får ni inte använda collections modulen. Ni ska skriva koden själva. Däremot får ni använda t.ex. itemgetter för att sortera er data.

  2. Ditt program ska bestå av två moduler: main.py och analyzer.py.

  3. Du skall skapa funktioner för textanalysering i modulen analyzer.py.

  4. Filen main.py skall enbart innehålla kommandoloopen, tänk while-loopen i marvin, och använda sig av modulen analyzer för att lösa uppgiften. Koden ska ligga i en funktion som heter main. Glöm inte if __name__ == "__main__" i main.py för att starta programmet.

  5. Analysera antal rader (ej tomma), ord och bokstäver med menyvalen lines, words och letters. Skriv minst en funktion för varje kommando i analyzer.py.

    input: "lines" output: "17"
    input: "words" output: "199"
    input: "letters" output: "907"
    • Tags: count (gemensam för alla tre), words, lines, letters.
  6. Analysera även ord- och bokstavsfrekvensen och skriv ut de sju mest förekommande orden och bokstäverna. Använd menyvalen word_frequency och letter_frequency. Ange frekvensen i % av totala mängden ord eller bokstäver. Avrunda till en (1) decimal. Använd strukturen "<bokstav/ord>: <antal> | <procent>%" i utskriften. Utskriften ska vara sorterad i storleks ordning och bokstavsordning sjunkande. Om två ord har 5 ska orden sorteras i bokstavsordning sjunkande. Skriv minst en funktion för varje kommando i analyzer.py.

    input: "word_frequency" output: "the: 12 | 6.0%
    to: 8 | 4.0%
    and: 7 | 3.5%
    of: 6 | 3.0%
    street: 5 | 2.5%
    him: 5 | 2.5%
    he: 5 | 2.5%"
    input: "letter_frequency" output: "e: 108 | 11.9%
    t: 91 | 10.0%
    o: 77 | 8.5%
    h: 67 | 7.4%
    n: 66 | 7.3%
    i: 64 | 7.1%
    a: 64 | 7.1%"
    • Tags: freq (gemensam för alla båda), word_frequency, letter_frequency.
  7. Ditt program skall klara av menyvalet all som kör alla analyserings funktioner i följd och skriver ut resultatet. Utskriften ska vara sorterad i storleks ordning och bokstavsordning sjunkande. Om två ord har 5 ska orden sorteras i bokstavsordning sjunkande tips (använd er av en lista och tupler för att göra sorteringen).

    input: "all" output: "17
    199
    907
    the: 12 | 6.0%
    to: 8 | 4.0%
    and: 7 | 3.5%
    of: 6 | 3.0%
    street: 5 | 2.5%
    him: 5 | 2.5%
    he: 5 | 2.5%"
    e: 108 | 11.9%
    t: 91 | 10.0%
    o: 77 | 8.5%
    h: 67 | 7.4%
    n: 66 | 7.3%
    i: 64 | 7.1%
    a: 64 | 7.1%"
    • Tags: freq (gemensam för alla båda), word_frequency, letter_frequency.
  8. Ditt program ska klara av menyvalet change. Det ska användas för att byta ut vilken fil som används vid övriga menyval. Använd ett input anrop för att fråga användaren om vad den nya filen heter som ska användas. Ni kan testa byta mellan phil.txt och lorum.txt för att kolla att det fungerar.

    • Tags: change.

    PS. följande är rätt svar för all med lorum.txtfilen:

    input: "all" output: "3
    25
    140
    dolor: 2 | 8.0%
    vivamus: 1 | 4.0%
    vitae: 1 | 4.0%
    varius: 1 | 4.0%
    urna: 1 | 4.0%
    sit: 1 | 4.0%
    pellentesque: 1 | 4.0%
    i: 18 | 12.9%
    e: 16 | 11.4%
    u: 12 | 8.6%
    a: 12 | 8.6%
    t: 10 | 7.1%
    l: 10 | 7.1%
    s: 9 | 6.4%"
  9. Gör menyvalet q som avslutar programmet.

  10. Bedömning

    • Programmet fungerar enligt specifikationen (alla menyval fungerar).
    • Koden ska vara DRY (don’t repeat yourself).
    • Felhantering och edge cases hanteras korrekt.
    • Onödigt komplicerade lösningar kan ge komplettering.
  11. Testa, validera och publicera din kod.

  1. Bygg ut ditt program så att det även kan skriva ned resultatet i en fil. Lägg till menyvalet write [choice] där [choice] är något av de andra menyvalen. Ditt program ska skriva ner resultatet i en fil som heter output.txt. Om filen redan innehåller ett värde ska det skrivas över med det nya värdet.

    input: "write lines" file content: "17"
    input: "write words" file content: "199"