Scroll to navigation

PROCMAILSC(5) File Formats Manual PROCMAILSC(5)

NUME

procmailsc - tehnică de punctare ponderată procmail

SINOPSIS

[*] w^x condiție

DESCRIERE

Pe lângă condițiile tradiționale de tip adevărat sau fals pe care le puteți specifica pentru o rețetă, puteți utiliza o tehnică de punctare ponderată pentru a decide dacă o anumită rețetă se potrivește sau nu. Atunci când se utilizează punctarea ponderată într-o rețetă, atunci punctajul final pentru acea rețetă trebuie să fie pozitiv pentru ca aceasta să se potrivească.

O anumită condiție poate contribui la punctaj dacă i se alocă o „pondere” (w) și un „exponent” (x). Acest lucru se face precedând condiția (pe aceeași linie) cu:

w^x

Întrucât atât w, cât și x sunt
  numere reale cuprinse între -2147483647,0 și 2147483647,0
  inclusiv.

Condiții de expresie regulată ponderată

Prima dată când expresia regulată este găsită, se va adăuga w la punctaj. A doua oară când este găsită, se va adăuga w*x. A treia oară când este găsită, se va adăuga w*x*x. A patra oară se va adăuga w*x*x*x*x. Și așa mai departe.

Acest lucru poate fi descris prin următoarea formulă concisă:


n
n k-1 x - 1 w * Sum x = w * -------
k=1 x - 1

Reprezintă punctajul total adăugat pentru această condiție în cazul în care se găsesc n potriviri.

Rețineți că se pot face următoarele distincții între cazuri:

Doar prima potrivire va contribui cu w la punctaj. Orice potriviri ulterioare sunt ignorate.
Fiecare potrivire va contribui cu același w la scor. Punctajul crește liniar cu numărul de potriviri găsite.
0<x<1
Fiecare potrivire va contribui mai puțin la punctaj decât cea precedentă. Punctajul se va apropia asimptotic de o anumită valoare (a se vedea secțiunea NOTE de mai jos).
1<x
Fiecare potrivire va contribui mai mult la punctaj decât cea precedentă. Punctajul va crește exponențial.
Poate fi utilizată pentru a favoriza un număr par sau impar de meciuri.

În cazul în care expresia regulată este negată (adică se potrivește dacă nu este găsită), atunci n poate fi, evident, fie zero, fie unu.

Condiții de program ponderate

Dacă programul returnează un cod de ieșire de EXIT_SUCCESS (=0), atunci scorul total adăugat va fi w. Dacă returnează orice alt cod de ieșire (care indică un eșec), punctajul total adăugat va fi x.

În cazul în care codul de ieșire al programului este negat, atunci codul de ieșire va fi considerat ca și cum ar fi un număr virtual de potriviri. Calcularea punctajului adăugat se face ca și cum ar fi fost o expresie regulată normală cu n=„cod-de-ieșire” potriviri.

Condiții de lungime ponderată

Dacă lungimea corespondenței actuale este M, atunci:

* w^x > L

va genera un punctaj suplimentar de:


x
/ M \ w * | --- |
\ L /

Și:

* w^x < L

va genera un punctaj suplimentar de:


x
/ L \ w * | --- |
\ M /

În ambele cazuri, dacă L=M, acest lucru va adăuga w la punctaj. Cu toate acestea, în primul caz, vor fi favorizate mesajele mai mari, iar în cel de-al doilea caz vor fi favorizate mesajele mai mici. Cu toate că x poate fi modificat pentru a regla cu exactitate gradul de abatere al funcției, în mod obișnuit, x este stabilit la 1.

DIVERSE

Puteți interoga punctajul final al tuturor condițiilor unei rețete din variabila de mediu $=. Această variabilă este definită întotdeauna imediat după ce procmail a analizat toate condițiile unei rețete (chiar dacă rețeta nu este în curs de execuție).

EXEMPLE

Următoarea rețetă va elimina toate mesajele care au mai mult de 150 de rânduri în corp. Prima condiție conține o expresie regulată goală care, deoarece se potrivește întotdeauna, este utilizată pentru a da punctajului nostru un decalaj negativ. A doua condiție se potrivește apoi cu fiecare linie din mesaj și consumă decalajul negativ anterior pe care l-am dat (un punct pe linie). În cele din urmă, punctajul va fi pozitiv numai dacă mesajul conține mai mult de 150 de linii.

:0 Bh * -150^0 * 1^1 ^.*$ /dev/null

Să presupunem că aveți un dosar prioritar pe care îl citiți întotdeauna primul. Următoarea rețetă selectează corespondența prioritară și o arhivează în acest dosar special. Prima condiție este una obișnuită, adică nu contribuie la punctaj, ci pur și simplu trebuie să fie îndeplinită. Celelalte condiții descriu lucruri precum: John și Claire au de obicei ceva important de spus, întâlnirile sunt de obicei importante, răspunsurile sunt puțin favorizate, mesajele despre Elvis (acesta este doar un exemplu : -) sunt favorizate (cu cât este mai mult menționat, cu atât mai mult este favorizat mesajul, dar punctajul maxim suplimentar datorat lui Elvis va fi de 4000, indiferent de cât de des este menționat), multe rânduri citate nu sunt apreciate, emoticoanele „smileys” sunt apreciate (punctajul pentru acestea va ajunge la un maxim de 3500), aceste trei persoane nu trimit de obicei mesaje interesante, mesajele trebuie să fie de preferință mici (de exemplu, mesajele cu o lungime de 2000 de octeți vor avea un punctaj de -100, cele cu o lungime de 4000 de octeți fac -800). După cum vedeți, dacă unele dintre persoanele neinteresante trimit mesaje, acestea au totuși o șansă de a ajunge în dosarul prioritar, de exemplu, dacă este vorba despre o întâlnire sau dacă conțin cel puțin două emoticoane.

:0 HB * !^Precedence:.*(junk|bulk)  * 2000^0 ^From:.*(john@home|claire@work)
* 2000^0 ^Subject:.*meeting * 300^0 ^Subject:.*Re: * 1000^.75 elvis|presley
* -100^1 ^> * 350^.9 :-\)  * -500^0 ^From:.*(boss|jane|henry)@work *
-100^3 > 2000 dosar_prioritar

Dacă sunteți abonați la o listă de discuții și doriți doar să citiți mesajele de calitate, atunci următoarele rețete ar putea fi de folos. Mai întâi ne asigurăm că mesajul provine de la lista de discuții. Apoi verificăm dacă este de la anumite persoane a căror opinie o apreciem sau despre un subiect despre care vrem neapărat să știm totul. Dacă este așa, îl arhivăm. În caz contrar, verificăm dacă raportul dintre liniile citate și liniile originale este de cel mult 1:2. Dacă depășește această valoare, renunțați la mesaj. Tot ceea ce a supraviețuit testului anterior, este clasat.

:0
^From mailinglist-request@some.where
{

:0:
* ^(From:.*(paula|bill)|Subject:.*skiing)
mailinglist
:0 Bh
* 20^1 ^>
* -10^1 ^[^>]
/dev/null
:0:
mailinglist }

Pentru alte exemple, consultați pagina de manual procmailex(5).

AVERTISMENTE

Deoarece acest lucru accelerează căutarea cu un ordin de mărime, egrep-ul intern procmail va căuta întotdeauna cea mai din stânga cea mai scurtă potrivire, cu excepția cazului în care determină ce să atribuie la MATCH, caz în care va căuta cea mai din stânga cea mai lungă potrivire. De exemplu, pentru cea mai din stânga potrivire cea mai scurtă, de la sine, expresia regulată:

.*
se va potrivi întotdeauna cu un șir de lungime zero în același loc.
.+
se va potrivi întotdeauna cu un singur caracter (cu excepția liniilor noi, bineînțeles).

CONSULTAȚI ȘI

procmail(1), procmailrc(5), procmailex(5), sh(1), csh(1), egrep(1), grep(1),

ERORI

În cazul în care, într-o condiție de lungime, specificați un x care provoacă o depășire, procmail este la mila funcției pow(3) din biblioteca dvs. de matematică.

Numerele cu virgulă mobilă în format „ingineresc” (de exemplu, 12e5) nu sunt acceptate.

DIVERSE

De îndată ce se atinge „plus infinit” (2147483647), toate condițiile ponderate ulterioare vor fi pur și simplu ignorate.

De îndată ce se atinge "minus infinit" (-2147483647), condiția va fi considerată ca fiind „fără corespondență” și rețeta se va încheia mai devreme.

NOTE

Dacă într-o expresie regulată formula ponderată 0<x<1, punctajul total adăugat pentru această condiție se va apropia asimptotic:


w -------
1 - x

Pentru a ajunge la jumătate din valoarea maximă, aveți nevoie de


- ln 2 n = --------
ln x

potriviri.

AUTORI

Stephen R. van den Berg

<srb@cuci.nl>

Philip A. Guenther

<guenther@sendmail.com>

TRADUCERE

Traducerea în limba română a acestui manual a fost făcută de Remus-Gabriel Chelu <remusgabriel.chelu@disroot.org>

Această traducere este documentație gratuită; citiți Licența publică generală GNU Versiunea 3 sau o versiune ulterioară cu privire la condiții privind drepturile de autor. NU se asumă NICIO RESPONSABILITATE.

Dacă găsiți erori în traducerea acestui manual, vă rugăm să trimiteți un e-mail la translation-team-ro@lists.sourceforge.net.

2001/08/04 BuGless