procmailsc - a procmail súlyozott pontozási
módszere
[
*]
w^x feltétel
A szűrési feltételekben megadott hagyományos igaz/hamis
vizsgálat mellett a súlyozott pontozási módszert is lehet
használni a feltételek helyességének
megállapítására. A szűrési feltételben
használt pontozási módszereknél a pozitív
értékek az igaz állításnak felelnek meg.
A feltételek az alábbi módon kapnak pontokat, `fontosság'
(
w) és `kitevő' (
x). A feltétel előtt
(ugyanabban a sorban) lehet megadni ezt a következőképen:
w^x
Ahol, mind
w és
x pozitív valós számok
-2147483647.0 és 2147483647.0 között.
A feltétlenek való első megfeleléskor
w -vel nő
a pontszám. A következő megfeleléskor már
w*x
-el. Harmadik találat esetén
w*x*x -el. Negyedik
megfeleléskor
w*x*x*x -el. És így tovább.
Ezt a következő képlettel lehet kifejezni:
n
n k-1 x - 1
w * Sum x = w * -------
k=1 x - 1
A képlet megadja a feltétel
n számú
megfelelésekor az összpontszámot.
A következő eseteket lehet
x -től függően
megkülönböztetni:
x=0 Csak az első találat esetén növekszik a pontszám
w-vel. Minden más találat figyelmen kívül lesz hagyva.
x=1 Minden egyes találat w-vel növeli a pontszámot. Az
összpontszám a találatok számával egyenes
arányban növekszik.
0<x<1 Minden újabb találattal kevesebb pontot adunk az
összpontszámhoz, mint előtte. Ekkor az összpontszám
egyoldalról (aszimptotikusan) közelít egy
határértékhez. (Lásd
MEGJEGYZÉS részt
később).
1<x Minden újabb találattal egyre több pontot adunk az
összeghez, mint előtte. Az összpontszám
exponenciálisan növekszik.
x<0 Segítségével megkülönböztethetjük az
egész- vagy páratlan számú találatokat.
Ha a feltételnek való megfelelést megfordítjuk
[negáljuk] (pl. találat, ha nincs egyezés a feltétellel),
akkor az
n értéke természetesen nulla vagy egy lehet.
Ha a program EXIT_SUCCESS (=0) -vel fejezi be működését,
akkor az összpontszám
w lesz. Bármely más
kilépési kód (hibás működés) esetén az
összpontszám
x lesz.
A program kilépési kódjának megfordításakor
(negálásakor) kapott pontszámot a lehetséges
találatok számával ('virtual number of matches')
azonosítja a program. Az összpontszám
kiszámítása ugyanúgy történik, mint ahogy
hagyományos kifejezéssel való egyezéskor
történne, vagyis mintha
n=`exitcode' számú
találat lett volna.
Ha a levél mérete
M akkor:
* w^x > L
esetén a megfelelő pontszám a következőképen
számolható:
x
/ M \
w * | --- |
\ L /
És:
* w^x < L
esetén a pontszám a következőként adódik:
x
/ L \
w * | --- |
\ M /
Mindkét esetben, ha L=M, akkor az összpontszámhoz csupán w
adódik. Az előző példa azonban hosszabb levelekre,
míg az utóbbi a rövidebb levelekre használandó. Az x
változtatásával a függvény pontosságát
lehet 'finomhangolni', de az x=1 többnyire megfelelő.
A szűrési feltételben (recipe) szereplő összes
pontszámot a
$= környezeti változó
segítségével lehet kiolvasni. Ezt a változó
minden szűrés után ellenőrzésre kerül
(még ha a szűrés nem is hajtódik végre).
A következő példával minden a olyan levelet
töröltethetünk, amely a törzsében 150 sornál
többet tartalmaz. Az első sorban egy üres feltétel
talalható, amely minden levélre igaz, ezzel a pontszámnak egy
kezdeti (negatív) értéket adtunk meg. A következő
feltétel segítségével minden egyes új sor esetén
növeltetjük az összpontszámot (soronként egy
ponttal). A feltétel pozitív pontszámmal zárul, ha a
levél 150 sornál többet tartalmazott.
:0 Bh
* -150^0
* 1^1 ^.*$
/dev/null
Ha van egy külön levelesmappánk, amelyet mindig először
olvasunk el, akkor a következő szűrési feltétellel a
fontosabb leveleket átirányíthatjuk ebbe a mappába. Az
első feltétel nem használ pontozást, mindössze
figyeli, hogy a levelek nem tartalmazzák-e a megadott feltételeket.
A következő feltételek pedig a következőt fejezik ki:
józsi és kati általában hasznos dolgokról írnak;
a megbeszélésekről szóló levelek fontosak a
számunkra; válaszleveleket is szívesen olvasunk; Elvis-ről
szóló leveleket (hátha megtudunk valami újat) mindig
elolvassuk (minél többször említik a levélben Elvist,
annál több pontot kap a levél, de maximum 4000 pontot);
túl sok idézett sort tartalmazó levelet el szeretnénk
kerülni; ha smiley-t küldenek nekünk, akkor azt szívesen
megnézzük (erre maximum 3500 pontot adunk); három embertől
(főnők, timi, péter) általában unalmas leveleket
szoktunk kapni; és végül nem szeretjük a hosszú
leveleket, jobb, ha a levél csak 2000 bájt hosszú, ha
ennél hosszabb, akkor 100 pontot, ha 4000 bájtnál hosszabb
akkor pedig 800 pontot vonunk le az összes pontszámából. A
pontozási módszer segítségével azonban, még ha
egy unalmas levelet is kapunk három emberünk
valamelyikétől a levél még bekerülhet a
külön mappánkba, ha pl. megbeszélésről
szól, vagy tartalmaz legalább 2 darab smileyt.
:0 HB
* !^Precedence:.*(junk|bulk)
* 2000^0 ^From:.*(jozsi@otthon|kati@munkahely)
* 2000^0 ^Subject:.*megbeszeles
* 300^0 ^Subject:.*Re:
* 1000^.75 elvis|presley
* -100^1 ^>
* 350^.9 :-\)
* -500^0 ^From:.*(fonok|timi|peter)@munkahely
* -100^3 > 2000
kulon_mappa
Ha a levelezőlistákról érkező levelek közül
csak a hasznos leveleket szeretnénk elolvasni, akkor a
következő szűrési feltételt használhatjuk. Az
első feltétel ellenőrzi, hogy a levél a megadott
levelezőlistáról jött-e. Aztán a leveleket
ellenőrizzük, hogy olyan személytől jött-e akinek
adunk a szavára, vagy olyan témáról szól,
amelyről mindent El szeretnénk olvasni. Ha ezeknek megfelel, akkor
marad a levél. A többi levélnél megvizsgáljuk, hogy
az idézett és az új sorok aránya eléri-e az
1:2-hözt. Ha ennél több, akkor töröljük a
levelet. Minden olyan levél, amely átment az előző
vizsgálaton mentésre kerül.
:0
^From levelezőlista@vhol
{
:0:
* ^(From:.*(piroska|bandi)|Subject:.*sieles)
levlista
:0 Bh
* 20^1 ^>
* -10^1 ^[^>]
/dev/null
:0:
levlista
}
További mintapéldák a
procmailex(5) súgóban
lehet találni.
A procmail a gyors keresés érdekében mindig csak a balelső
(leftmost)
legrövidebb egyezésig keres, ha csak nem a
MATCH -be értéket kell átadni, ebben az esetben a
balelso
leghosszabb találatig keres. Pl. A balelső
legrövidebb találat a következő kifejezésre:
.* mindig nullahosszúságú találatot eredményez.
.+ pedig mindig csak egy karaktert (sortörést persze nem)
eredményez.
procmail(1),
procmailrc(5),
procmailex(5),
sh(1),
csh(1),
egrep(1),
grep(1),
Ha az
x értéke túlcsorduláshoz vezet, akkor a
matematikai függvénytárban lévő
pow(3)
függvénytől függ a végső eredmény.
Lebegő pontos számok mérnöki formátumban (pl. 12e5) nem
adhatók meg.
A `pozitív végtelen' (2147483647) elérésekor minden
további súlyozás át lesz ugorva.
A `negatív végtelen' (-2147483647) elérésekor a
szűrés megfelelés hiányában befejeződik.
0<x<1 esetén a hagyományos feltétel pontszáma a
következő számhoz közelít egyoldalról:
w
-------
1 - x
A maximális érték felének eléréséhez
- ln 2
n = --------
ln x
számú találatra van szükség.
Stephen R. van den Berg
<srb@cuci.nl>
Vizi Szilárd <vizisz@freemail.hu>