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