Trénování

Přibalený model funguje hned po instalaci. Model natrénovaný na vaší vlastní poště funguje lépe, protože se naučí, jak vypadá váš hamŽádoucí pošta: opak spamu.: vaše newslettery, styl psaní vašich kolegů, jazyky, ve kterých poštu dostáváte.

Natrénování modelu#

Nasměrujte train na složky se spamem a hamem:

Shell
spamscanner train --spam ~/Maildir/.Junk --ham ~/Maildir/cur --ham ~/Maildir/.Archive --out my-model.json

Zdrojem mohou být:

  • soubory mbox, i komprimované gzipem (.mbox.gz),
  • Maildir (čtou se jeho složky cur a new, tmp se přeskakuje),
  • složka souborů .eml, čtená rekurzivně,
  • datová sada: soubor CSV nebo JSON Lines se sloupcem textu a sloupcem štítku (--dataset). Sloupce pojmenované text, message, body, email nebo content a label, category, class, spam nebo is_spam se najdou samy; jinak použijte --text-column a --label-column. Rozumí štítkům jako spam, 1, phishing a ham, 0, not_spam, legitimate.

Duplicitní zprávy se počítají jednou. Chcete-li stavět na přibaleném modelu místo začátku od nuly, přidejte --merge.

Použití modelu:

Shell
spamscanner scan message.eml --model my-model.json
SPAMSCANNER_MODEL=/var/lib/spamscanner/model.json spamscanner milter
JavaScript
const scanner = new SpamScanner({classifier: '/var/lib/spamscanner/model.json'});

Kolik pošty stačí: několik set zpráv každého druhu dá použitelný model, několik tisíc dobrý. Udržujte oba druhy přibližně vyvážené a poštu, kterou nechcete filtrovat (obnovení hesla, faktury od vašich vlastních dodavatelů), mějte v hamu.

Změření#

Část pošty vynechte z trénování a měřte na ní:

Shell
spamscanner eval --model my-model.json --spam held-out/spam --ham held-out/ham

Přibalený model na zprávách SMS ve 21 jazycích, které nikdy neviděl, většinou v jazycích, které skoro nezná:

Text
Messages: 13028 spam, 92406 ham
Precision: 89.72%   Recall: 11.18%   F1: 19.89%
False positives: 167 (0.18% of ham)   False negatives: 132
Unsure: 91247 (86.54%)

Přesnost (precision) udává, jaká část toho, co označí za spam, je skutečně spam; úplnost (recall), jakou část spamu zachytí. Nejisté zprávy se zde počítají jako nezachycený spam, i když při kontrole je ještě mohou zachytit ostatní kontroly a jazykový model. Sledovat je třeba falešně pozitivní výsledky: ham označený jako spam. Ve výše uvedeném běhu si model u většiny těchto zpráv není jistý, místo aby se v nich mýlil, což je zamýšlené chování u jazyků, ve kterých má málo pošty.

--json dává stejná čísla pro skripty.

Učení z hlášení#

Když uživatelé přesouvají poštu do složky Junk nebo z ní, učte model po jedné zprávě:

Shell
spamscanner learn spam message.eml --model /var/lib/spamscanner/model.json
spamscanner learn ham message.eml --model /var/lib/spamscanner/model.json

První learn vytvoří soubor z přibaleného modelu. Přes HTTP dělají totéž POST /learn/spam a /learn/ham v HTTP API a spamc -L spam funguje proti serveru spamd s --allow-tell. IMAPSieve v Dovecotu může při přesunu zprávy zavolat kterýkoli z nich.

Z Node.js:

JavaScript
await scanner.learn(raw, 'spam');
await scanner.unlearn(raw, 'spam'); // undo, before learning it as ham
scanner.saveModel('/var/lib/spamscanner/model.json');

Zprávu nahlášenou jako chybně zařazenou je třeba, pokud už byla naučena, nejprve odnaučit ze špatné třídy a teprve pak naučit ve správné.

Přibalený model#

model/classifier.json sestavuje npm run model:train z těchto veřejných datových sad na Hugging Face, všech pod otevřenými licencemi:

Datová sadaLicenceObsah
FredZhang7/all-scam-spamApache-2.0Zprávy a e-maily ve 43 jazycích
SetFit/enron_spamVeřejný výzkumný korpusKorpus Enron-Spam
alt-gnome/telegram-spamCC0-1.0Ruské zprávy z Telegramu
tanaos/synthetic-spam-detection-dataset-german, -italian, -spanishMITSyntetické zprávy

Učil se z 62 480 spamových a 76 489 hamových zpráv. Skript odloží každou desátou zprávu, natrénuje model na zbytku a změří samotný klasifikátor bez ostatních kontrol:

Odložený testZprávyPřesnostÚplnostFalešně pozitivníNejisté
Angličtina6 564100,0 %97,0 %0,0 %2,4 %
Ruština1 682100,0 %97,4 %0,0 %2,2 %
Italština1 38998,1 %85,3 %1,8 %10,9 %
Němčina1 30997,7 %76,1 %2,2 %20,7 %
Španělština1 28197,5 %82,5 %2,6 %16,8 %
Enron-Spam2 888100,0 %93,1 %0,0 %4,5 %
all-scam-spam4 236100,0 %88,8 %0,0 %11,2 %
Vše13 84099,2 %85,1 %0,5 %12,4 %

Spam zde znamená pravděpodobnost podle klasifikátoru 99 % nebo více, tedy bod, ve kterém samotný klasifikátor dosáhne prahu spamu. Při kontrole dostane body i spam, kterým si je méně jistý, a ostatní kontroly přidají své.

Výsledky pro němčinu, španělštinu a italštinu pocházejí ze syntetických datových sad, které obsahují téměř totožné zprávy označené jako spam i jako ham: část této chyby je ve štítcích, ne v modelu. Nejlepší nápravou je pošta ve vašich vlastních jazycích. Čísla pro všechny jazyky a datové sady jsou v metadata.metrics modelu.

Další jazyky#

npm run model:train -- --with multilingual-sms přidá SMS Spam Multilingual Collection: SMS Spam Collection strojově přeloženou do 21 jazyků. V přibaleném modelu chybí, protože její karta uvádí licenci GPL; ověřte, že vyhovuje způsobu, jakým model sdílíte. Po natrénování s ní byly odložené výsledky pro jazyky, které přibalený model skoro nezná, tyto:

JazykZprávyPřesnostÚplnostFalešně pozitivní
Čínština430100,0 %82,3 %0,0 %
Arabština430100,0 %84,6 %0,0 %
Korejština412100,0 %80,4 %0,0 %
Japonština48696,0 %85,7 %0,5 %
Hindština412100,0 %63,9 %0,0 %
Francouzština48098,6 %94,2 %0,6 %
Turečtina220100,0 %73,1 %0,0 %

Přetrénování#

Shell
npm run model:train                       # downloads the datasets into data/ the first time
npm run model:train -- --no-download      # reuse data/
npm run model:train -- --out /tmp/model.json --max-features 200000

Soubor modelu#

Model je soubor JSON: počet naučených spamových a hamových zpráv a pro každý zahešovaný příznak počet spamových a hamových zpráv, které ho obsahovaly, seřazené a zakódované v base64. Neobsahuje žádná slova ani text zpráv. --max-features ponechá jen nejčastější příznaky a --min-count vypustí vzácné, čímž vyměníte přesnost za velikost; přibalený model uchovává 400 000 příznaků v zhruba 6 MB.

Modely ze Spam Scanneru 6 a starších nelze načíst: hešovaly jiné příznaky. Natrénujte nový ze stejné pošty.

Upravit tuto stránku na GitHubu · Markdown ·