Обучение спам-фильтра и утилита find
Второй день сижу и пытаюсь понять почему это не работает. Разворачиваю понятие “это” – скрипт который очень активно скармливает нехорошие письма нашему спам-фильтру. Надо обучить на немного не мало порядка 5К письмах. А потом ещё 2.5К хороших, так сказать, для закрепления пройденного материала.
Пробуем отдельно командную строку:
mail02# cat /home/dronga/test/1274282843.M942069P44358.mail01.hat.ru,S=2504,W=2562:2,|/usr/local/bin/dspam –mode=teft –user odmin@hat.ru –class=spam –source=corpus –deliver=summary
X-DSPAM-Result: odmin@hat.ru; result=”Spam”;; probability=1.0000; confidence=1.00; signature=4bf4035b443567520620249
Отлично! Оборачиваем это дело в find примерно вот таким образом:
find . -type f -print – exec cat {}|/usr/local/bin/dspam –mode=teft –user odmin@hate.ru –class=spam –source=corpus –deliver=summary
Пробуем:
mail02# ./spam_learn.sh
/home/dronga/test/1274282843.M942069P44358.mail01.hat.ru,S=2504,W=2562:2,
find: cat /home/dronga/test/1274282843.M942069P44358.mail01.hat.ru,S=2504,W=2562:2,|/usr/local/bin/dspam –mode=teft –user odmin@hat.ru –class=spam –source=corpus –deliver=summary: No such file or directory
/home/dronga/test/1274288609.M452672P55446.mail01.hat.ru,S=1434,W=1476:2,
find: cat /home/dronga/test/1274288609.M452672P55446.mail01.hat.ru,S=1434,W=1476:2,|/usr/local/bin/dspam –mode=teft –user odmin@hat.ru –class=spam –source=corpus –deliver=summary: No such file or directory
/home/dronga/test/1274294629.M623575P66746.mail01.hat.ru,S=2356,W=2414:2,
find: cat /home/dronga/test/1274294629.M623575P66746.mail01.hat.ru,S=2356,W=2414:2,|/usr/local/bin/dspam –mode=teft –user odmin@hat.ru –class=spam –source=corpus –deliver=summary: No such file or directory
/home/dronga/test/1274301779.M6738P79179.mail01.hat.ru,S=9142,W=9327:2,
find: cat /home/dronga/test/1274301779.M6738P79179.mail01.hat.ru,S=9142,W=9327:2,|/usr/local/bin/dspam –mode=teft –user odmin@hat.ru –class=spam –source=corpus –deliver=summary: No such file or directory
И как это понимать?? Очевидно, что find отрабатывает, print есть, а вот по каким канонам разворачивается или не разворачивается exec непонятно. Попробуем модифицировать:
/usr/local/bin/dspam –mode=teft –user odmin@hate.ru –class=spam –source=corpus –deliver=summary < {} \;
Тоже не работает. Аналогично и другие составные вариации. Между делом man find стал раздражать достаточно туманным пояснением работы опции exec в 2 вариантах (у меня FreeBSD 8). На тематичных форумах тоже решения не нашли, вроде как в самом find косяк. И exec_dir крутил и пути 100 раз проверил, с NFS тома выносил, кавычки, плюсики.. всё бесполезно, не работает. В общем, плюнул я на такое положение дел и сегодня на свежую голову пошел по “каноническому” пути.
-exec utility [argument ...] ;
Быстренько накидал sh-скрипт:
#!/bin/sh
/usr/local/bin/dspam –mode=teft –user odmin@hat.ru –class=$1 –source=corpus –deliver=summary < $2 ;
Следовательно, скрипт spam_learn.sh принял вид:
find /home/dronga/SPAM -type f -print -exec /home/dronga/learn.sh spam {} \;
Вот так заработало. Сейчас время буду засекать, имхо, секунд 30 займет. Но очень обидно, что не разворачиваются |, >, <. Вчерашний световой день вникуда, а сегодня за 10 минут вопрос решился. Бывают в жизни огорчения. Больше не наступайте на эти грабли! А штука получилась полезная, можно в короткие сроки обучить антиспам!