(Бұл мақалада біз Arc тілін сынақтан өткізу үшін жасаған спамнан қорғалған веб-пошта бағдарламасында қолданылған спам-сүзгілеу әдістері сипатталады. Жақсартылған алгоритм Жақсартылған Байес сүзгілеуі мақаласында баяндалған.)
Мен спамды тоқтатуға болатынына және бұған қол жеткізудің жолы мазмұнға негізделген сүзгілер екеніне сенімдімін. Спамерлердің әлсіз тұсы — олардың хабарламасы. Олар сіз орнатқан кез келген басқа кедергіні айналып өте алады. Әзірге солай болып келді. Бірақ олар өз хабарламасын, ол қандай болса да, жеткізуге мәжбүр. Егер біз олардың хабарламаларын тани алатын бағдарламалық жасақтама жаза алсақ, олардың оны айналып өтуіне еш мүмкіндік қалмайды.
_ _ _
Алушы үшін спам оңай танылады. Егер сіз поштаңызды оқып, спамды сұрыптап тастау үшін біреуді жалдасаңыз, ол мұны еш қиындықсыз орындар еді. Бұл процесті автоматтандыру үшін, жасанды интеллектке жетпей-ақ, қаншалықты көп нәрсе істеуіміз керек?
Менің ойымша, біз бұл мәселені өте қарапайым алгоритмдермен шеше аламыз. Шын мәнінде, жекелеген сөздердің спам ықтималдықтарының Байес комбинациясынан басқа ештеңені қолданбай-ақ, бүгінгі спамды айтарлықтай жақсы сүзуге болатынын байқадым. Сәл бейімделген (төменде сипатталғандай) Байес сүзгісін пайдалана отырып, қазір біз 0 жалған оң нәтижемен (false positive), әр 1000 спамның 5-еуінен де азын ғана өткізіп аламыз.
Статистикалық тәсіл — әдетте адамдар спам-сүзгілерді жазғанда ең бірінші кезекте қолданып көретін әдіс емес. Көптеген хакерлердің бірінші түйсігі — спамның жекелеген қасиеттерін танитын бағдарламалық жасақтама жазуға тырысу. Сіз спамға қарайсыз да, мыналардың маған «Dear Friend» деп басталатын немесе тақырыбы тек бас әріптермен жазылып, соңында сегіз леп белгісі тұратын хат жіберуге дәті қалай барады деп ойлайсыз. Мен бұл нәрсені шамамен бір ғана код жолымен сүзіп тастай аламын.
Сөйтіп, сіз солай істейсіз және бастапқыда бұл жұмыс істейді. Бірнеше қарапайым ережелер кіріс спамыңыздың едәуір бөлігін қысқартады. Жай ғана «click» сөзін іздеудің өзі менің спам корпусымдағы электрондық хаттардың 79.7%-ын небәрі 1.2% жалған оң нәтижемен ұстап қалады.
Мен статистикалық тәсілді қолданып көрмес бұрын, спамның жекелеген белгілерін іздейтін бағдарламалық жасақтама жазуға шамамен алты ай жұмсадым. Менің байқағаным — спамның соңғы бірнеше пайызын тану өте қиынға соқты және сүзгілерді қатаңдатқан сайын, жалған оң нәтижелер көбейе түсті.
Жалған оң нәтижелер — қателікпен спам ретінде анықталған кәдімгі, таза хаттар. Көптеген пайдаланушылар үшін заңды хатты өткізіп алу спам алудан әлдеқайда (шамамен бір ретке) нашар, сондықтан жалған оң нәтиже беретін сүзгі — емделушінің өміріне қауіп төндіретін безеуді емдеу дәрісі сияқты.
Пайдаланушы спамды неғұрлым көп алса, оның спам қалтасында жатқан бір таза хатты байқау ықтималдығы соғұрлым аз болады. Және таңқаларлығы, спам-сүзгілеріңіз жақсарған сайын жалған оң нәтижелер соғұрлым қауіпті бола түседі, өйткені сүзгілер шынымен жақсы жұмыс істегенде, пайдаланушылар олар ұстағанның бәріне көз жұма қарауға бейім болады.
Статистикалық тәсілді неліктен соншалықты ұзақ уақыт бойы сынап көрмей келгенімді білмеймін. Меніңше, спам белгілерін өзім анықтауға тырысуға тым құмартып кеттім, бейнебір спамерлермен қандай да бір жарыс ойынын ойнап жүргендей болдым. (Хакер еместер мұны жиі байқай бермейді, бірақ көптеген хакерлер өте бәсекеге қабілетті келеді.) Ал статистикалық талдауды қолданып көрген кезімде, оның менен әлдеқайда ақылдырақ екенін бірден түсіндім. Ол, әрине, «virtumundo» және «teens» сияқты сөздердің спамның жақсы көрсеткіштері екенін анықтады. Бірақ ол сонымен қатар «per», «FL» және «ff0000» да спамның жақсы көрсеткіштері екенін анықтады. Шындығында, «ff0000» (html тілінде ашық қызыл түс) кез келген порнографиялық сөз сияқты спамның керемет көрсеткіші болып шықты.
_ _ _
Мұнда менің статистикалық сүзгілеуді қалай жасайтынымның қысқаша нобайы берілген. Мен біреуі спам, біреуі спам емес хаттардан тұратын екі корпустан бастаймын. Қазіргі уақытта олардың әрқайсысында шамамен 4000 хабарлама бар. Мен әр корпустағы әрбір хабарламаның бүкіл мәтінін, соның ішінде тақырыптамаларын және кірістірілген html мен javascript-ті сканерлеймін. Қазіргі уақытта мен әріптік-сандық таңбаларды, сызықшаларды, апострофтарды және доллар белгілерін токендердің бөлігі, ал қалғанының бәрін токен бөлгіштер деп есептеймін. (Мұнда әлі де жетілдіруге болатын тұстар бар шығар.) Мен толығымен сандардан тұратын токендерді ескермеймін және html түсініктемелерін де ескермеймін, тіпті оларды токен бөлгіштер ретінде де қарастырмаймын.
Мен әр корпуста әрбір токеннің неше рет кездесетінін (қазірше регистрді ескермей) санаймын. Бұл кезеңде менде токендерді олардың пайда болу санына сәйкестендіретін әр корпус үшін бір-бірден, екі үлкен хэш-кесте пайда болады.
Әрі қарай мен үшінші хэш-кестені жасаймын, бұл жолы әрбір токенді оны қамтитын электрондық хаттың спам болу ықтималдығына сәйкестендіремін, оны былайша есептеймін [1]: (let ((g (* 2 (or (gethash word good) 0))) (b (or (gethash word bad) 0))) (unless (< (+ g b) 5) (max .01 (min .99 (float (/ (min 1 (/ b nbad)) (+ (min 1 (/ g ngood)) (min 1 (/ b nbad))))))))) мұндағы word — ықтималдығын есептеп жатқан токеніміз, good және bad — мен бірінші қадамда жасаған хэш-кестелер, ал ngood пен nbad — сәйкесінше спам емес және спам хабарламалардың саны.
Мен бірнеше маңызды бөлшектерді көрсету үшін мұны код түрінде түсіндірдім. Жалған оң нәтижелерді болдырмау үшін ықтималдықтарды сәл ауытқытқым келеді және сынап көру мен қателесу арқылы бұған қол жеткізудің жақсы жолы — good ішіндегі барлық сандарды екі есеге көбейту екенін таптым. Бұл заңды хаттарда анда-санда кездесетін сөздер мен іс жүзінде ешқашан кездеспейтін сөздерді ажыратуға көмектеседі. Мен тек жалпы саны бес реттен артық кездесетін сөздерді ғана қарастырамын (шындығында, екі еселеудің арқасында, спам емес хаттарда үш рет кездесуі жеткілікті болар еді). Сосын бір корпуста бар, бірақ екіншісінде жоқ сөздерге қандай ықтималдық тағайындау керек деген сұрақ туындайды. Тағы да сынап көру және қателесу арқылы мен .01 және .99 мәндерін таңдадым. Мұнда дәлірек реттеуге орын болуы мүмкін, бірақ корпус ұлғайған сайын мұндай реттеу бәрібір автоматты түрде орын алады.
Әсіресе зейінді адамдар мынаны байқайды: кездесу санын санау мақсатында әрбір корпусты бір ұзын мәтін ағыны ретінде қарастырғаныммен, спам ықтималдығын есептеу кезінде бөлгіш ретінде олардың жалпы ұзындығын емес, әрқайсысындағы электрондық хаттардың санын пайдаланамын. Бұл жалған оң нәтижелерден қорғау үшін тағы бір шамалы ауытқуды қосады.
Жаңа хат келгенде, ол токендерге сканерленеді және спам ықтималдығы бейтарап .5 мәнінен қаншалықты қашық екендігімен өлшенетін ең қызықты он бес токен хаттың спам болу ықтималдығын есептеу үшін пайдаланылады. Егер probs — он бес жекелеген ықтималдықтың тізімі болса, біріктірілген ықтималдықты былай есептейсіз: (let ((prod (apply #'* probs))) (/ prod (+ prod (apply #'* (mapcar #'(lambda (x) (- 1 x)) probs))))) Іс жүзінде туындайтын бір сұрақ — сіз бұрын-соңды көрмеген, яғни сөз ықтималдықтарының хэш-кестесінде жоқ сөзге қандай ықтималдық тағайындау керек. Тағы да сынап көру және қателесу арқылы мен .4 мәнін пайдалануға жақсы сан екенін байқадым. Егер сіз сөзді бұрын ешқашан көрмеген болсаңыз, ол әдетте айтарлықтай таза; спам сөздері тым жақсы таныс болып келеді.
Бұл алгоритмнің нақты хаттарға қолданылуының мысалдары соңындағы қосымшада берілген.
Егер жоғарыдағы алгоритм хатқа оның спам болу ықтималдығын .9-дан жоғары деп берсе, мен оны спам деп қарастырамын. Бірақ іс жүзінде бұл шекті қай жерге қоятыным аса маңызды болмас еді, өйткені диапазонның ортасына түсетін ықтималдықтар өте аз.
_ _ _
Статистикалық тәсілдің бір үлкен артықшылығы — соншалықты көп спамды оқудың қажеті жоқтығы. Соңғы алты айда мен сөзбе-сөз мыңдаған спам оқыдым және бұл шынымен де адамның рухын түсіреді. Норберт Винер егер сіз құлдармен бәсекелессеңіз, құлға айналасыз деген еді, спамерлермен бәсекелесуде де осыған ұқсас төмендететін бір нәрсе бар. Спамның жекелеген белгілерін тану үшін сіз спамердің ой-санасына енуге тырысуыңыз керек, ал ашығын айтқанда, мен спамерлердің санасында мүмкіндігінше аз уақыт өткізгім келеді.
Бірақ Байес тәсілінің нағыз артықшылығы, әрине, сіз нені өлшеп жатқаныңызды нақты білесіз. SpamAssassin сияқты белгілерді танитын сүзгілер хатқа спам «ұпайын» тағайындайды. Ал Байес тәсілі нақты ықтималдықты тағайындайды. «Ұпайдың» мәселесі мынада — оның нені білдіретінін ешкім білмейді. Мұны пайдаланушы білмейді, бірақ одан да сорақысы, сүзгіні жасаушының өзі де білмейді. Хатта «sex» сөзі болғаны үшін оған қанша ұпай берілуі керек? Ықтималдық, әрине, қателесуі мүмкін, бірақ оның нені білдіретінінде немесе оны есептеу үшін дәлелдерді қалай біріктіру керектігінде ешқандай екіұштылық жоқ. Менің корпусым бойынша, «sex» сөзі оны қамтитын хаттың спам болуының .97 ықтималдығын, ал «sexy» сөзі .99 ықтималдығын көрсетеді. Және тура сондай екіұштылықсыз Байес ережесі бойынша, екі сөзді де қамтитын хат басқа дәлелдер (екіталай жағдайда) болмаған кезде, спам болуының 99.97% мүмкіндігіне ие болады.
Ол ықтималдықтарды өлшейтіндіктен, Байес тәсілі хаттағы жақсы да, жаман да барлық дәлелдерді ескереді. Спамда сирек кездесетін сөздер («though» немесе «tonight» немесе «apparently» сияқты) ықтималдықты төмендетуге, «unsubscribe» және «opt-in» сияқты жаман сөздердің оны арттыруына қаншалықты әсер етсе, соншалықты үлес қосады. Сондықтан кездейсоқ «sex» сөзі кездесіп қалған әдеттегі таза хат спам деп белгіленбейді.
Әрине, ең дұрысы — ықтималдықтарды әрбір пайдаланушы үшін жеке есептеу. Мен құрамында «Lisp» сөзі бар көптеген электрондық хаттар аламын және (әзірге) бұл сөз кездесетін бірде-бір спам алған емеспін. Сондықтан мұндай сөз іс жүзінде маған хат жіберудің бір түрі құпиясөзі болып табылады. Менің бұрынғы спам-сүзгі бағдарламамда пайдаланушы осындай сөздердің тізімін жасай алатын және оларды қамтитын хаттар сүзгілерден автоматты түрде өтіп кететін. Мен өз тізіміме «Lisp» сияқты сөздерді, сондай-ақ пошталық индексімді қостым, осылайша онлайн-тапсырыстардың (әйтпесе өте спам сияқты көрінетін) түбіртектері өтіп тұрды. Мен өзімді өте ақылдымын деп ойладым, бірақ Байес сүзгісі дәл осы нәрсені мен үшін істеп бергенін және оның үстіне мен ойламаған көптеген сөздерді тапқанын байқадым.
Бастапқыда біздің сүзгілер 0 жалған оң нәтижемен әр 1000 спамның 5-еуінен азын ғана өткізеді деп айтқанымда, мен өз поштамның корпусына негізделген хаттарымды сүзу туралы айтып отырмын. Бірақ бұл сандар жаңылыстырмайды, өйткені мен ұсынатын тәсіл дәл осы: әрбір пайдаланушының хатын өзі алатын спам және спам емес хаттарға негіздеп сүзу. Негізінде, әрбір пайдаланушыда екі жою батырмасы болуы керек: кәдімгі жою және спам ретінде жою. Спам ретінде жойылғанның бәрі спам корпусына, ал қалғанының бәрі спам емес корпусқа өтеді.
Сіз пайдаланушыларды бастапқы (seed) сүзгімен бастауыңызға болады, бірақ сайып келгенде әрбір пайдаланушының нақты алатын поштасына негізделген өзіндік әр сөз бойынша ықтималдықтары болуы керек. Бұл (a) сүзгілерді тиімдірек етеді, (b) әрбір пайдаланушыға спамның өзіндік нақты анықтамасын таңдауға мүмкіндік береді және (c) бәлкім, ең бастысы, спамерлердің сүзгілерден өту үшін хаттарды бейімдеуін қиындатады. Егер сүзгі «миының» көп бөлігі жекелеген дерекқорларда жатса, онда спамдарды жай ғана бастапқы сүзгілерден өтетіндей етіп реттеу олардың жеке пайдаланушылардың әртүрлі әрі әлдеқайда жақсы оқытылған сүзгілерінен қаншалықты жақсы өтетініне ешқандай кепілдік бермейді.
Мазмұнға негізделген спамды сүзгілеу жиі ақ тізіммен (whitelist) біріктіріледі, бұл хаттары ешқандай сүзгілеусіз қабылданатын жіберушілердің тізімі. Мұндай ақ тізімді жасаудың бір оңай жолы — пайдаланушы бұрын-соңды хат жіберген әрбір мекенжайдың тізімін сақтау. Егер пошта бағдарламасында «спам ретінде жою» батырмасы болса, онда пайдаланушы кәдімгі қоқыс ретінде жойған әрбір электрондық хаттың from мекенжайын да қосуға болады.
Мен ақ тізімдерді қолдаймын, бірақ сүзгілеуді жақсарту тәсілі ретінде емес, есептеу ресурстарын үнемдеу тәсілі ретінде көбірек қолдаймын. Бұрын мен ақ тізімдер сүзгілеуді жеңілдетеді деп ойлайтынмын, өйткені тек бұрын ешқашан хат алмаған адамдардың электрондық поштасын сүзуге тура келеді және сізге бірінші рет хат жіберіп отырған адам сізге не айта алатыны жағынан әдеп нормаларымен шектеледі. Сіз бұрыннан танитын біреу сізге жыныстық қатынас туралы хат жіберуі мүмкін, бірақ сізге бірінші рет хат жіберген адамның бұлай істеуі екіталай. Мәселе мынада, адамдарда бірнеше электрондық пошта мекенжайы болуы мүмкін, сондықтан жаңа from-мекенжай жіберушінің сізге бірінші рет жазып отырғанына кепілдік бермейді. Ескі досыңыздың (әсіресе ол хакер болса) кенеттен сізге жаңа from-мекенжайынан хат жіберуі сирек құбылыс емес, сондықтан сіз белгісіз мекенжайлардан келген хаттарды тым қатаң сүзу арқылы жалған оң нәтижелер қаупіне бас тіге алмайсыз.
Алайда, белгілі бір мағынада, менің сүзгілерімнің өздері ақ тізімнің (және қара тізімнің) бір түрін қамтиды, өйткені олар хабарламалардың толық мәтініне, соның ішінде тақырыптамаларына негізделген. Сондықтан олар сенімді жіберушілердің электрондық пошта мекенжайларын, тіпті хаттың олардан маған келетін бағыттарын да белгілі бір дәрежеде «біледі». Және олар спам туралы да, соның ішінде сервер атауларын, пошта бағдарламаларының нұсқалары мен хаттамаларын да тура солай біледі.
_ _ _
Егер спамды сүзудің қазіргі қарқынын сақтап қала аламын деп ойласам, мен бұл мәселені шешілді деп есептер едім. Бірақ бүгінгі спамның көп бөлігін сүзе білу көп нәрсені білдірмейді, өйткені спам дамиды. Шынында да, осы уақытқа дейінгі спамға қарсы әдістердің көбі зиянкестердің жаңа, төзімді түрін жасаудан басқа ештеңе бітірмейтін пестицидтер сияқты болды.
Байес сүзгілеріне көбірек үміт артамын, себебі олар спаммен бірге дамиды. Спамерлер жеке сөздерге негізделген қарапайым сүзгілерді алдап өту үшін «cock» сөзінің орнына «c0ck» қолдана бастаған кезде, Байес сүзгілері мұны автоматты түрде байқайды. Шын мәнінде, «c0ck» сөзі «cock» сөзіне қарағанда әлдеқайда бұлтартпас айғақ және Байес сүзгілері оның қаншалықты артық екенін дәл біледі.
Дегенмен, спамды сүзгілеу жоспарын ұсынатын кез келген адам мына сұраққа жауап бере алуы керек: егер спамерлер сіздің не істеп жатқаныңызды нақты білсе, олар сізді қаншалықты оңай айналып өте алар еді? Мысалы, егер тексеру қосындысына (checksum) негізделген спам-сүзгілеу елеулі кедергіге айналса, спамерлер хабарлама мәтінін жасау үшін жай ғана mad-lib әдістеріне ауысады деп ойлаймын.
Байес сүзгілерін жеңу үшін спамерлерге хаттарын бірегей ету немесе жекелеген былапыт сөздерді қолдануды тоқтату жеткіліксіз болар еді. Олар өз хаттарын сіздің қарапайым хаттарыңыздан ажырағысыз етуге мәжбүр болар еді. Ал бұл, меніңше, оларды қатты шектейтін болады. Спам — көбінесе сату ұсыныстары, сондықтан егер сіздің кәдімгі хаттарыңыз тек сату ұсыныстарынан тұрмаса, спамдар сөзсіз басқаша сипатқа ие болады. Және спамерлер, әрине, өздерінің бүкіл инфрақұрылымын да өзгертуге (және үнемі өзгертіп отыруға) мәжбүр болады, өйткені әйтпесе олар хабарлама мәтініне не істесе де, тақырыптамалар Байес сүзгілері үшін бұрынғыдай күдікті көріне береді. Мен спамерлер пайдаланатын инфрақұрылым туралы тақырыптамаларды күдіксіз ету қаншалықты қиын болатынын білетіндей көп білмеймін, бірақ менің болжамым бойынша, бұл хабарламаны күдіксіз етуден де қиын болады.
Олар тақырыптамалар мәселесін шеше алды делік, болашақтың спамы шамамен мынадай болатын шығар: Сәлем. Мынаны қарап көруіңіз керек деп ойладым: http://www.27meg.com/foo өйткені мазмұнға негізделген сүзгілеу спамерге жарнамалық ұсыныс жасау үшін қалдыратын орын шамамен осы ғана. (Шындығында, мұны да сүзгілерден өткізу қиын болады, өйткені электрондық хаттағы қалған барлық нәрсе бейтарап болса, спам ықтималдығы url-ге байланысты болады және оны бейтарап етіп көрсету біршама күш-жігерді қажет етеді.)
Спамерлер өздерінің жеке басын жасыруға тіпті тырыспайтын, келісімге негізделген (opt-in) тізімдерді жүргізетін бизнестерден бастап, порно сайттарды жарнамалайтын спам тарату үшін пошта серверлерін басып алатын адамдарға дейін қамтиды. Егер біз сүзгілеуді пайдаланып, олардың таңдауын жоғарыдағыдай хаттарға дейін қысқартсақ, бұл осы спектрдің «заңды» жағындағы спамерлерді түгел дерлік бизнестен шығаруы керек; олар түрлі штат заңдары бойынша өздерінің спамдары неге спам емес екендігі және «жазылудан» қалай бас тартуға болатындығы туралы дайын шаблондық мәтінді қосуға мәжбүр, ал мәтіннің бұл түрін тану өте оңай.
(Бұрын мен неғұрлым қатаң заңдар спамды азайтады деп сенуді аңғалдық деп ойлайтынмын. Енді мен қатаң заңдар спамерлердің жіберетін спам көлемін азайтпауы мүмкін болса да, олар алушылардың нақты көретін спам көлемін азайту үшін сүзгілерге сөзсіз көмектесе алады деп ойлаймын.)
Спектрдің барлық тұсында, егер сіз спамерлер жасай алатын жарнамалық ұсыныстарды шектесеңіз, сіз сөзсіз оларды бизнестен шығаруға бейім боласыз. Осы бизнес сөзін есте ұстаған маңызды. Спамерлер — кәсіпкерлер. Олар спамды жібереді, өйткені ол нәтиже береді. Ол нәтиже береді, себебі жауап беру деңгейі сұмдық төмен болса да (ең жақсы жағдайда миллионға 15, ал каталогтарды тарату кезінде миллионға 3000), олар үшін шығын іс жүзінде нөлге тең. Алушылар үшін шығын орасан зор — спамды өшіруге бір секунд жұмсайтын әрбір миллион алушы үшін шамамен 5 адам-апта кетеді, бірақ спамер оны төлеуге міндетті емес.
Дегенмен, спам жіберу спамерге де белгілі бір шығын әкеледі. [2] Сондықтан жауап беру деңгейін неғұрлым төмендете алсақ — мейлі сүзгілеу арқылы, мейлі сүзгілерді пайдаланып спамерлерді өз ұсыныстарын сұйылтуға мәжбүрлеу арқылы болсын — спам жіберуді тиімді деп санайтын бизнестер соғұрлым аз болады.
Спамерлердің дәл осындай жарнамалық ұсыныстарды пайдалану себебі — жауап беру деңгейін арттыру. Бұл спамердің ой-санасына енуден де жиіркенішті болуы мүмкін, бірақ спамға жауап беретін адамның ой-санасына бір сәт көз жүгіртейік. Бұл адам не таңқаларлықтай аңғал, не өзінің жыныстық қызығушылықтарын қатты жоққа шығарушы. Қай жағдайда да, спам бізге қаншалықты жиіркенішті немесе ақымақ болып көрінсе де, ол олар үшін қызықты. Спамерлер егер қызықты естілмесе, бұл сөздерді айтпас еді. Ал «мынаны қарап көруіңіз керек деп ойладым» спам алушыға спамерлердің қазір айтып жүрген сөздері сияқты тартымды болмайды. Нәтижесінде: егер ол қызықты сату ұсыныстарын қамти алмаса, спам маркетинг құралы ретінде тиімсіз болады және оны пайдаланғысы келетін бизнестер азаяды.
Түпкі үлкен жеңіс осында. Мен спам-сүзгі бағдарламасын жазуды бұл сұмдықты енді көргім келмегендіктен бастадым. Бірақ егер біз спамды сүзуді жеткілікті деңгейде жақсы меңгерсек, ол нәтиже беруін тоқтатады және спамерлер оны жіберуді шынымен тоқтатады.
_ _ _
Бағдарламалық жасақтамадан бастап заңдарға дейінгі спаммен күресудің барлық тәсілдерінің ішінде Байес сүзгілеуі ең тиімді жалғыз әдіс болады деп сенемін. Бірақ мен сонымен қатар спамға қарсы неғұрлым әртүрлі шаралар қолдансақ, соғұрлым жақсы деп ойлаймын, өйткені спамерлерді шектейтін кез келген шара сүзгілеуді жеңілдетуге бейім болады. Және тіпті мазмұнға негізделген сүзгілеу әлемінің өзінде, егер бір мезгілде көптеген әртүрлі бағдарламалық жасақтамалар қолданылса, бұл жақсы болар еді деп есептеймін. Сүзгілер неғұрлым көп және әртүрлі болса, спамерлердің олардан өту үшін спамдарды бейімдеуі соғұрлым қиынға соғады.
Қосымша: Сүзгілеу мысалдары
Мен осы мақаланы жазып жатқан кезде келген спамның мысалы мұнда. Бұл спамдағы ең қызықты он бес сөз: qvp0045 indira mx-05 intimail $7500 freeyankeedom cdo bluefoxmedia jpg unsecured platinum 3d0 qves 7c5 7c266675 Бұл сөздер тақырыптамалардан және хабарлама мәтінінен алынған нәрселердің қоспасы, бұл спамға тән құбылыс. Сондай-ақ спамға тән нәрсе — менің дерекқорымда бұл сөздердің әрқайсысының спам ықтималдығы .99 құрайды. Шын мәнінде, ықтималдығы .99 болатын он бестен көп сөз бар, ал бұлар — кездескен алғашқы он бес сөз ғана.
Өкінішке қарай, бұл аталған хатты Байес ережесін қолданудың қызықсыз мысалына айналдырады. Ықтималдықтардың қызықты алуан түрлілігін көру үшін біз шын мәнінде өте типтік емес мына спамға қарауымыз керек.
Бұл спамдағы ең қызықты он бес сөз, олардың ықтималдықтарымен бірге мынадай: madam 0.99 promotion 0.99 republic 0.99 shortest 0.047225013 mandatory 0.047225013 standardization 0.07347802 sorry 0.08221981 supported 0.09019077 people's 0.09019077 enter 0.9075001 quality 0.8921298 organization 0.12454646 investment 0.8568143 very 0.14758544 valuable 0.82347786 Бұл жолы дәлелдер жақсы мен жаманның қосындысынан тұрады. «Shortest» сияқты сөз «madam» немесе «promotion» сөздерінің кінәні көрсететініндей, кінәсіздіктің дәлелі болып табылады. Бірақ бәрібір кінә дәлелі күштірек. Егер бұл сандарды Байес ережесіне сәйкес біріктірсеңіз, нәтижесінде пайда болатын ықтималдық .9027 болады.
«Madam» сөзі, әрине, «Dear Sir or Madam» деп басталатын спамдардан алынған. Олар өте жиі кездеспейді, бірақ «madam» сөзі менің заңды хаттарымда ешқашан кездеспейді және бәрі арақатынасқа байланысты.
«Republic» сөзі жоғары ұпай алады, өйткені ол нигериялық алаяқтық хаттарда жиі пайда болады, сонымен қатар Корея мен Оңтүстік Африкаға сілтеме жасайтын спамдарда бір немесе екі рет кездеседі. Сіз оның бұл спамды анықтауға көмектесуі кездейсоқтық деп айтуыңыз мүмкін. Бірақ спам ықтималдықтарын зерттеген кезде осындай кездейсоқтықтардың көп екенін және олардың жағдайды бұрыс бағытқа емес, дұрыс бағытқа итермелейтін таңғажайып үрдісі бар екенін байқадым. Бұл жағдайда «Republic» сөзінің нигериялық алаяқтық хаттарда және осы спамда кездесуі толықтай кездейсоқтық емес. Дамуы төмен елдермен байланысты күмәнді бизнес ұсыныстардың тұтас бір тобы бар, ал бұлар өз кезегінде (шын мәнінде олай болмағандықтан) республика екенін ашық көрсететін атауларға ие болуы ықтималырақ.[3]
Екінші жағынан, «enter» — нағыз жаңылысу. Ол көбінесе жазылудан бас тарту нұсқауларында кездеседі, бірақ мұнда ол мүлдем таза мағынада қолданылған. Бақытымызға орай, статистикалық тәсіл өте төзімді және нәтижелер бұзыла бастағанға дейін біршама көп жаңылысуларға шыдай алады.
Салыстыру үшін, сүзгілерден өтіп кеткен, сирек кездесетін спамның мысалы мұнда. Неліктен? Өйткені таза кездейсоқтықпен оған менің нақты хаттарымда кездесетін сөздер толып кеткен: perl 0.01 python 0.01 tcl 0.01 scripting 0.01 morris 0.01 graham 0.01491078 guarantee 0.9762507 cgi 0.9734398 paul 0.027040077 quite 0.030676773 pop3 0.042199217 various 0.06080265 prices 0.9359873 managed 0.06451222 difficult 0.071706355 Мұнда бірнеше жақсы жаңалық бар. Біріншіден, бұл хат бағдарламалау тілдеріне маманданбаған және Morris есімді жақсы досы жоқ адамның сүзгілерінен өтпес еді. Қарапайым пайдаланушы үшін мұндағы алғашқы бес сөздің бәрі бейтарап болар еді және спам ықтималдығына әсер етпес еді.
Екіншіден, менің ойымша, сөз тіркестеріне негізделген сүзгілеу (төменде қараңыз) мұны оңай ұстап алуы мүмкін: «cost effective», «setup fee», «money back» — айтарлықтай айыптайтын нәрселер. Және, әрине, егер олар маған (немесе мен мүшесі болған желіге) спам жіберуді жалғастырса, «Hostex» сөзінің өзі де спам термині ретінде танылар еді.
Соңында, таза электрондық хат мұнда берілген. Оның ең қызықты он бес сөзі мынадай: continuation 0.01 describe 0.01 continuations 0.01 example 0.033600237 programming 0.05214485 i'm 0.055427782 examples 0.07972858 color 0.9189189 localhost 0.09883721 hi 0.116539136 california 0.84421706 same 0.15981844 spot 0.1654587 us-ascii 0.16804294 what 0.19212411 Мұндағы сөздердің көпшілігі хаттың таза екенін көрсетеді. Жаман иіс шығаратын екі сөз бар, «color» (спамерлер түрлі-түсті қаріптерді жақсы көреді) және «California» (ол пікірлерде және пішіндердегі мәзірлерде кездеседі), бірақ олар «continuation» және «example» сияқты анық таза сөздерді басып тастауға жеткіліксіз.
«Describe» сөзінің соншалықты таза деп бағалануы қызық. Ол менің 4000 спамымның бірде-бірінде кездеспеген. Деректер осындай тосын сыйларға толы болып шығады. Спам мәтіндерін талдағанда үйренетін нәрселердің бірі — спамерлер тілдің қаншалықты тар ішкі жиынында әрекет ететіндігі. Дәл осы факт, кез келген жеке пайдаланушы поштасының тура сондай сипаттамалық сөздік қорымен бірге, Байес сүзгілеуін тамаша таңдау етеді.
Қосымша: Басқа да идеялар
Мен әлі сынап көрмеген идеялардың бірі — жеке сөздердің орнына сөз тіркестері немесе тіпті үш сөзден тұратын тіркестер негізінде сүзу. Бұл ықтималдықты әлдеқайда дәлірек бағалауға мүмкіндік беруі тиіс. Мысалы, менің қазіргі дерекқорымда "offers" сөзінің ықтималдығы 0.96-ға тең. Егер ықтималдықты сөз жұптарына негіздесеңіз, "special offers" және "valuable offers" тіркестерінің ықтималдығы 0.99 болар еді, ал мәселен, "approach offers" ("this approach offers" дегендегідей) тіркесінің ықтималдығы 0.1 немесе одан да аз болар еді.
Мұны жасамаған себебім — жеке сөздерге негізделген сүзудің өзі қазір өте жақсы жұмыс істейді. Бірақ бұл спамды анықтау қиындай түскен жағдайда сүзгілерді қатайтуға әлі де мүмкіндік бар дегенді білдіреді. (Бір қызығы, сөз жұптарына негізделген сүзгі іс жүзінде керісінше бағытта жұмыс істейтін Марков тізбегіне негізделген мәтін генераторы болып шығады.)
Спамға тән ерекше белгілер (мысалы, to: өрісінде алушының мекенжайының болмауы), әрине, спамды тануда маңызды рөл атқарады. Оларды осы алгоритмде виртуалды сөздер ретінде қарастыруға болады. Мұны болашақ нұсқаларда, кем дегенде ең айқын спам индикаторларының бірнешеуі үшін енгізетін шығармын. Белгілерді танитын спам-сүзгілер көптеген ұсақ-түйекте дұрыс; оларға жетіспейтіні — айғақтарды біріктірудің жалпы жүйелі тәртібі.
Спам емес белгілерді тану спам белгілерін танудан да маңыздырақ болуы мүмкін. Жалған қателіктер (false positives) сондай үлкен алаңдаушылық туғызады, сондықтан олар төтенше шараларды талап етеді. Болашақ нұсқаларда мен, бәлкім, арнайы жалған қателіктерден аулақ болуға арналған тексерудің екінші деңгейін қосатын шығармын. Егер хат сүзгілердің осы екінші деңгейінен өтсе, оның спам ықтималдығы белгіленген шектен жоғары болса да, ол қабылданады.
Бұл сүзудің екінші деңгейі Байестік болады деп күтпеймін. Ол сөзсіз тек ad hoc болып қана қоймай, болжамдарға негізделеді, себебі заңдылықтарды байқайтындай жалған қателіктердің саны жеткілікті деңгейде көп болмайды. (Қалай болғанда да, резервтік жүйенің негізгі жүйемен бірдей технологияға сүйенбегені дұрыс қой.)
Болашақта байқап көруім мүмкін тағы бір нәрсе — электрондық хаттың белгілі бір бөліктеріне ерекше назар аудару. Мысалы, қазіргі спамның шамамен 95%-ында олар сіздің кіруіңізді қалайтын сайттың url сілтемесі болады. (Қалған 5%-ы телефон нөміріне қоңырау шалуды, электрондық пошта немесе АҚШ пошта мекенжайы арқылы жауап беруді, не болмаса кейбір жағдайларда белгілі бір акцияны сатып алуды сұрайды.) Мұндай жағдайларда хаттың спам екенін анықтау үшін url-дің өзі жеткілікті дерлік болады.
Домен атаулары (неміс тілінде емес) электрондық хаттағы қалған мәтіннен бір-біріне жабысқан бірнеше сөзден тұратынымен ерекшеленеді. Жалпы жағдайда есептеу тұрғысынан қымбатқа түссе де, оларды бөлшектеп көруге тұрарлық. Егер сүзгі бұған дейін "xxxporn" токенін ешқашан көрмеген болса, оның жеке спам ықтималдығы 0.4 болады, ал "xxx" және "porn" жеке-жеке (менің корпусымда) сәйкесінше 0.9889 және 0.99 ықтималдыққа ие, ал біріккендегі ықтималдығы 0.9998 болады.
Спам таратушылар хабарламаларының мәтінінде әшкерелейтін сөздерді пайдалануды біртіндеп тоқтатуға мәжбүр болған сайын, домендік атауларды бөлшектеу маңыздырақ бола түседі деп күтемін. (ip-мекенжайы бар url, әрине, бірнеше жүйелік әкімшілердің хаттарын қоспағанда, өте күдікті белгі болып табылады.)
Спам таратушылар жарнамалайтын url сілтемелерінің бірлесіп жүргізілетін тізімі болғаны жақсы идея болар еді. Қаскүнемдік немесе біліксіз ұсыныстардың алдын алу үшін Раф Левиен зерттеген сенім метрикасына ұқсас нәрсе қажет болар еді, бірақ егер бізде сондай нәрсе болса, ол кез келген сүзгі бағдарламасына үлкен көмек болар еді. Бұл сонымен қатар бойкот жариялау үшін де ыңғайлы негіз болар еді.
Күмәнді url-дерді тексерудің тағы бір жолы — пайдаланушы оны атап өткен хатты оқымас бұрын, сайтты тексеру үшін краулер (crawler) жіберу болар еді. Сіз сайтты электрондық хатты бағалағандай Байес сүзгісі арқылы бағалай аласыз және сайттан табылған кез келген нәрсені хаттың спам болу ықтималдығын есептеуге қосуға болады. Басқа бетке бағыттайтын (redirect) url, әрине, әсіресе күдікті көрінер еді.
Менің ойымша, өте жақсы идея болатын бірлескен жобалардың бірі — спамның алып корпусын жинақтау болар еді. Үлкен әрі таза корпус — Байестік сүзудің жақсы жұмыс істеуінің кепілі. Байестік сүзгілер бұл корпусты кіріс дерегі ретінде тікелей пайдалана алар еді. Сонымен қатар, мұндай корпус сүзгілердің басқа түрлері үшін де пайдалы болар еді, өйткені оны сынақтан өткізу үшін қолдануға болады.
Мұндай корпусты жасау кейбір техникалық мәселелер тудырады. Әрине, қаскүнемдік немесе біліксіз жіберулердің алдын алу үшін бізге сенім метрикалары қажет болады. Сонымен қатар, корпустағы хаттардан жеке ақпаратты (тек to-мекенжайлары мен көшірмелерін ғана емес, сонымен бірге, мысалы, көбінесе to-мекенжайын кодтайтын жазылымнан бас тартуға арналған url аргументтерін де) өшіру жолдары қажет болады. Егер біреу осы жобаны қолға алғысы келсе, бұл бүкіл әлем үшін игі іс болар еді.
Қосымша: Спамның анықтамасы
Спамның не екендігі туралы жалпы ортақ түсінік бар деп ойлаймын, бірақ нақты анықтаманың болғаны пайдалы болар еді. Егер біз спамның орталық корпусын құрғымыз келсе немесе тіпті спамды сүзу көрсеткіштерін мәнді түрде салыстырғымыз келсе, мұны істеуіміз керек.
Бастапқыдан айтқанда, спам — бұл сұралмаған коммерциялық электрондық хат емес. Егер менің көршілерімнің бірі менің жақсы күйдегі ескі үш жылдамдықты Raleigh іздеп жүргенімді естіп, маған біреуін сатуды ұсынып хат жіберсе, мен қуанар едім, дегенмен бұл хат коммерциялық та, сұралмаған да болар еді. Спамның басты сипаты (шын мәнінде, оның болу себебі) оның сұралмағанында емес, оның автоматтандырылғанында.
Сондай-ақ спамның әдетте коммерциялық сипатта болуы — жай ғана кездейсоқ сәйкестік. Егер біреу, мысалы, қандай да бір саяси бастаманы қолдау үшін жаппай электрондық хат жібере бастаса, бұл порно сайтты жарнамалайтын хатпен бірдей спам болар еді.
Мен спамды сұралмаған автоматтандырылған электрондық хат деп анықтауды ұсынамын. Осылайша, бұл анықтама спамның көптеген заңдық анықтамалары қамтымайтын кейбір хаттарды қамтиды. Заңдық анықтамалар, шамасы лоббистердің ықпалымен, алушымен «бұрыннан қалыптасқан байланысы» бар компаниялар жіберген хаттарды алып тастауға бейім. Бірақ бір компаниядан бірдеңе сатып алу, мысалы, олардан үнемі хат алып тұруды сұрадыңыз дегенді білдірмейді. Егер мен интернет-дүкеннен бірдеңеге тапсырыс берсем және олар кейіннен маған тоқтаусыз спам ағынын жіберсе, бұл бәрібір спам.
Спам тарататын компаниялар көбінесе «жазылымнан бас тартудың» жолын ұсынады немесе спам алуды тоқтатқыңыз келсе, олардың сайтына кіріп, «аккаунт баптауларын» өзгертуді сұрайды. Бұл хаттың спам болмауы үшін жеткіліксіз. Бас тартпау (not opting out) келісім берумен (opting in) бірдей емес. Егер алушы электрондық хаттарды алғысы келетінін анық көрсететін құсбелгіні (әдепкі күйі «жоқ» болып тұрған) өз еркімен белгілемесе, демек, бұл — спам.
Кейбір іскерлік қатынастарда сіз хаттардың белгілі бір түрлерін жанама түрде сұрайсыз. Интернет арқылы тапсырыс берген кезде, сіз чек пен тапсырыс жөнелтілгені туралы хабарламаны жанама түрде сұрайсыз деп ойлаймын. Verisign маған домендік атаудың мерзімі аяқталуға жақын екенін ескертетін хат жібергенде, мен қарсы емеспін (кем дегенде, олар оның нақты тіркеушісі болса). Бірақ Verisign маған электрондық коммерция веб-сайтын құру бойынша ТЕГІН нұсқаулықты ұсынатын хат жібергенде, бұл — спам.
Ескертпелер:
[1] Осы мақаладағы мысалдар түсініктірек болуы үшін, сенесіз бе, жоқ па, Common Lisp тіліне аударылған. Мұнда сипатталған қолданба әлі шығарылмаған Arc деп аталатын жаңа Lisp диалектісін сынау мақсатында біз жазған жүйе болып табылады.
[2] Қазіргі уақытта ең төменгі тариф бір миллион спам жіберу үшін шамамен $200 құрайтын көрінеді. Бұл өте арзан, бір спам үшін центтің 1/50 бөлігі. Бірақ, мысалы, спамның 95%-ын сүзіп тастау спам таратушылардың белгілі бір аудиторияға қол жеткізу шығындарын 20 есеге арттырады. Оны өтей алатындай маржасы барлар өте аз.
[3] Тәжірибелік ереже ретінде, ел атауының алдында анықтауыштар неғұрлым көп болса, билеушілер соғұрлым жемқор келеді. «Х Социалистік Халық Демократиялық Республикасы» деп аталатын ел, сірә, әлемде өмір сүргіңіз келетін ең соңғы орын болар еді.
Осының нобайларын оқып шыққаны үшін Сара Харлинге; сүзу туралы бірнеше жақсы идеялары мен пошта инфрақұрылымымызды жасағаны үшін Дэниел Гиффинге (ол сондай-ақ жұмыс бабындағы Arc интерпретаторын жазып жатыр); спам туралы көптеген талқылаулар үшін Роберт Морриске, Тревор Блэквеллге және Эранн Гатқа; сенім метрикалары бойынша кеңестері үшін Раф Левиенге; және статистика бойынша кеңестері үшін Чип Колдвелл мен Сэм Стейнголдқа алғыс айтамын.
Қосымша ақпарат: