Nada

Laboration 7 - Snuskfilter

Du tänker starta webbcommunityn Lugnarstorm där svenska barn får tjattra med varandra under strängt kontrollerade former. Din affärsidé är att föräldrarna får betala för att ladda ner ett snuskfilter som inte släpper igenom några fula ord.

En mycket olämplig metod är att låta programmet ha en fil med alla förbjudna ord. Den filen skulle naturligtvis sjuåringarna kasta sej över för att berika sitt ordförråd. Ditt program måste därför klara sej utan ordlista och du minns från grudatkursen att Viggo Kann på Nada har skapat programmet Stava, som gör stavningskontroll utan ordlista. Det programmet ska du efterlikna!

Din demoversion ska fungera så här på indatafilen grov.txt (vars grova innehåll vi inte gärna kan skriva ut i labbpeket).

   python filter.py <grov.txt

   - Vad i @£$% gör du? Ge @£$% i det där!
   - Sköt dej själv och @£$% i andra, din @£$%!
   - Moskit! Jag som var med i din @£$% club...

Programmet läser igenom filen och filtrerar hela fula ord, men ord som moskit och fantom lämnas i fred. Eftersom programmet ska ligga på barnets dator får det inte finnas en fil med alla fula ord. Inspirerad av Viggos program Stava tänker du tillverka en bitvektor vars ettor motsvarar hashade fula ord. Bitvektorns storlek bör vara en tvåpotens, till exempel 1024. Antalet hashfunktioner får du bestämma så att risken för felaktigt filtrerade ord blir mindre än en procent. Gör gärna en liten uträkning som uppskattar denna risk!

Bitvektorer hanteras enkelt med modulen BitVector.py på följande sätt.

from BitVector import *
N=2**10
table=BitVector(size=N)  # Alla bitar blir nollor.
table[17]=1              
 - - -
ut=open('bloom','w')     # Skriv bitvektorn på fil 
table.write_to_file(ut)
ut.close()
 - - -                   # Läs bitvektorn från fil
table=BitVector(filename='bloom').read_bits_from_file(N)
För att dela upp textrader i ord kan man använda modulen för reguljära uttryck (se föreläsningsanteckningar!) så här.
import re
 - - -                   # Textraden rad läses.
q="([\W]+)"              # Reguljärt uttryck för nonletter.
parts=re.split(q,rad)    # Raden splittras i ord och annat.




Löst av ............................................tror...................................den................................


Sidansvarig: <henrik@nada.kth.se>
Senast ändrad 7 februari 2009
Tekniskt stöd: <webmaster@nada.kth.se>