UM PLANO PARA O SPAM
OriginalAgosto de 2002
(Este artigo descreve as técnicas de filtragem de spam usadas no leitor de e-mail baseado na web à prova de spam que construímos para exercitar o Arc. Um algoritmo aprimorado é descrito em Melhor Filtragem Bayesiana.)
Acho que é possível parar o spam e que os filtros baseados em conteúdo são o caminho a seguir. O calcanhar de Aquiles dos spammers é sua mensagem. Eles podem contornar qualquer outra barreira que você configurar. Eles fizeram isso até agora, pelo menos. Mas eles têm que entregar sua mensagem, seja qual for. Se pudermos escrever um software que reconheça suas mensagens, não há como eles contornarem isso.
Para o destinatário, o spam é facilmente reconhecível. Se você contratasse alguém para ler seu e-mail e descartar o spam, ele teria pouca dificuldade em fazer isso. O quanto temos que fazer, sem IA, para automatizar esse processo?
Acho que seremos capazes de resolver o problema com algoritmos bastante simples. Na verdade, descobri que você pode filtrar o spam atual de forma aceitável usando apenas uma combinação bayesiana das probabilidades de spam de palavras individuais. Usando um filtro bayesiano ligeiramente ajustado (como descrito abaixo), agora perdemos menos de 5 em 1000 spams, com 0 falsos positivos.
A abordagem estatística geralmente não é a primeira que as pessoas tentam quando escrevem filtros de spam. O primeiro instinto da maioria dos hackers é tentar escrever um software que reconheça propriedades individuais do spam. Você olha para os spams e pensa, a ousadia desses caras de tentar me enviar um e-mail que começa com "Caro amigo" ou tem uma linha de assunto que é toda em maiúsculas e termina com oito pontos de exclamação. Posso filtrar essa coisa com cerca de uma linha de código.
E você faz, e no início funciona. Algumas regras simples darão uma grande mordida no seu spam recebido. Meramente procurar a palavra "clique" capturará 79,7% dos e-mails no meu corpus de spam, com apenas 1,2% de falsos positivos.
Passei cerca de seis meses escrevendo software que procurava por recursos de spam individuais antes de tentar a abordagem estatística. O que descobri foi que reconhecer aquele último por cento de spams ficou muito difícil e que, à medida que tornava os filtros mais rigorosos, obtinha mais falsos positivos.
Falsos positivos são e-mails inocentes que são erroneamente identificados como spams. Para a maioria dos usuários, perder e-mails legítimos é uma ordem de magnitude pior do que receber spam, então um filtro que gera falsos positivos é como uma cura para a acne que carrega um risco de morte para o paciente.
Quanto mais spam um usuário recebe, menor a probabilidade de ele notar um e-mail inocente sentado em sua pasta de spam. E, estranhamente, quanto melhores seus filtros de spam ficam, mais perigosos os falsos positivos se tornam, porque quando os filtros são realmente bons, os usuários terão maior probabilidade de ignorar tudo o que eles capturam.
Não sei por que evitei tentar a abordagem estatística por tanto tempo. Acho que foi porque fiquei viciado em tentar identificar recursos de spam sozinho, como se estivesse jogando algum tipo de jogo competitivo com os spammers. (Os não hackers não percebem isso com frequência, mas a maioria dos hackers é muito competitiva.) Quando tentei a análise estatística, descobri imediatamente que era muito mais inteligente do que eu havia sido. Ele descobriu, é claro, que termos como "virtumundo" e "adolescentes" eram bons indicadores de spam. Mas também descobriu que "por" e "FL" e "ff0000" são bons indicadores de spam. Na verdade, "ff0000" (html para vermelho brilhante) acaba sendo um indicador de spam tão bom quanto qualquer termo pornográfico.
Aqui está um esboço de como faço a filtragem estatística. Começo com um corpus de spam e um de e-mail não spam. No momento, cada um tem cerca de 4000 mensagens. Digitalizo todo o texto, incluindo cabeçalhos e html e javascript incorporados, de cada mensagem em cada corpus. Atualmente, considero caracteres alfanuméricos, hífens, apóstrofos e sinais de dólar como parte dos tokens e tudo o mais como um separador de tokens. (Provavelmente há espaço para melhorias aqui.) Ignoro tokens que são todos dígitos e também ignoro comentários html, nem mesmo os considerando como separadores de tokens.
Conto o número de vezes que cada token (ignorando maiúsculas, atualmente) ocorre em cada corpus. Nesta etapa, acabo com duas grandes tabelas hash, uma para cada corpus, mapeando tokens para o número de ocorrências.
Em seguida, crio uma terceira tabela hash, desta vez mapeando cada token para a probabilidade de um e-mail contendo-o ser um spam, que calculo da seguinte forma [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)))))))))
onde word é o token cuja probabilidade estamos calculando, good e bad são as tabelas hash que criei na primeira etapa, e ngood e nbad são o número de mensagens não spam e spam, respectivamente.
Expliquei isso como código para mostrar alguns detalhes importantes. Quero enviesar ligeiramente as probabilidades para evitar falsos positivos e, por tentativa e erro, descobri que uma boa maneira de fazer isso é dobrar todos os números em good. Isso ajuda a distinguir entre palavras que ocasionalmente ocorrem em e-mails legítimos e palavras que quase nunca ocorrem. Só considero palavras que ocorrem mais de cinco vezes no total (na verdade, devido à duplicação, ocorrer três vezes em e-mails não spam seria suficiente). E então há a questão de qual probabilidade atribuir a palavras que ocorrem em um corpus, mas não no outro. Novamente, por tentativa e erro, escolhi .01 e .99. Pode haver espaço para ajuste aqui, mas à medida que o corpus cresce, esse ajuste acontecerá automaticamente de qualquer maneira.
Os especialmente observadores notarão que, embora eu considere cada corpus como um único fluxo longo de texto para fins de contagem de ocorrências, uso o número de e-mails em cada um, em vez de seu comprimento combinado, como divisor no cálculo das probabilidades de spam. Isso adiciona outro leve viés para proteger contra falsos positivos.
Quando um novo e-mail chega, ele é digitalizado em tokens e os quinze tokens mais interessantes, onde interessante é medido por quanto sua probabilidade de spam está longe de um .5 neutro, são usados para calcular a probabilidade de o e-mail ser spam. Se probs é uma lista das quinze probabilidades individuais, você calcula o combinado probabilidade assim:
(let ((prod (apply #'* probs))) (/ prod (+ prod (apply #'* (mapcar #'(lambda (x) (- 1 x)) probs)))))
Uma questão que surge na prática é qual probabilidade atribuir a uma palavra que você nunca viu, ou seja, uma que não ocorre na tabela hash de probabilidades de palavras. Descobri, novamente por tentativa e erro, que .4 é um bom número a ser usado. Se você nunca viu uma palavra antes, ela provavelmente é bastante inocente; palavras de spam tendem a ser muito familiares.
Existem exemplos desse algoritmo sendo aplicado a e-mails reais em um apêndice no final.
Trato o e-mail como spam se o algoritmo acima lhe der uma probabilidade de mais de .9 de ser spam. Mas na prática, não importaria muito onde eu colocasse esse limite, porque poucas probabilidades acabam no meio do intervalo.
Uma grande vantagem da abordagem estatística é que você não precisa ler tantos spams. Nos últimos seis meses, li literalmente milhares de spams e é realmente meio desmoralizante. Norbert Wiener disse que se você competir com escravos, você se torna um escravo, e há algo igualmente degradante em competir com spammers. Para reconhecer recursos de spam individuais, você tem que tentar entrar na mente do spammer e, francamente, quero passar o mínimo de tempo possível dentro das mentes dos spammers.
Mas a verdadeira vantagem da abordagem bayesiana, é claro, é que você sabe o que está medindo. Filtros de reconhecimento de recursos como SpamAssassin atribuem uma "pontuação" de spam ao e-mail. A abordagem bayesiana atribui uma probabilidade real. O problema com uma "pontuação" é que ninguém sabe o que ela significa. O usuário não sabe o que significa, mas pior ainda, o desenvolvedor do filtro também não. Quantos pontos um e-mail deve receber por ter a palavra "sexo" nele? Uma probabilidade pode, é claro, estar errada, mas há pouca ambiguidade sobre o que ela significa ou como as evidências devem ser combinadas para calculá-la. Com base no meu corpus, "sexo" indica uma probabilidade de .97 de o e-mail contê-lo ser um spam, enquanto "sexy" indica uma probabilidade de .99. E a Regra de Bayes, igualmente não ambígua, diz que um e-mail contendo ambas as palavras teria, na (improvável) ausência de qualquer outra evidência, uma chance de 99,97% de ser um spam.
Como está medindo probabilidades, a abordagem bayesiana considera todas as evidências no e-mail, tanto boas quanto ruins. Palavras que ocorrem desproporcionalmente raramente em spam (como "embora" ou "hoje à noite" ou "aparentemente") contribuem tanto para diminuir a probabilidade quanto palavras ruins como "cancelar assinatura" e "opt-in" fazem para aumentar. Então, um e-mail inocente que acontece de incluir a palavra "sexo" não será marcado como spam.
Idealmente, é claro, as probabilidades devem ser calculadas individualmente para cada usuário. Recebo muitos e-mails contendo a palavra "Lisp" e (até agora) nenhum spam que faz isso. Então, uma palavra como essa é efetivamente um tipo de senha para me enviar e-mail. No meu software de filtragem de spam anterior, o usuário podia configurar uma lista de tais palavras e o e-mail contendo-as passaria automaticamente pelos filtros. Na minha lista, coloquei palavras como "Lisp" e também meu CEP, para que (de outra forma receitas bastante parecidas com spam) de pedidos online passassem. Achei que estava sendo muito esperto, mas descobri que o filtro bayesiano fez a mesma coisa para mim e, além disso, descobri muitas palavras em que não havia pensado.
Quando disse no início que nossos filtros deixam passar menos de 5 spams por 1000 com 0 falsos positivos, estou falando sobre filtrar meu e-mail com base em um corpus do meu e-mail. Mas esses números não são enganosos, porque essa é a abordagem que estou defendendo: filtrar o e-mail de cada usuário com base no spam e no não spam e-mail que ele recebe. Essencialmente, cada usuário deve ter dois botões de exclusão, exclusão comum e exclusão como spam. Tudo excluído como spam vai para o spam corpus, e tudo o mais vai para o corpus não spam.
Você pode iniciar os usuários com um filtro inicial, mas, em última análise, cada usuário deve ter suas próprias probabilidades por palavra com base no e-mail real que ele recebe. Isso (a) torna os filtros mais eficazes, (b) permite que cada usuário decida sua própria definição precisa de spam e (c) talvez o melhor de tudo, torna difícil para os spammers ajustar os e-mails para passar pelos filtros. Se uma grande parte do cérebro do filtro estiver nos bancos de dados individuais, então simplesmente ajustar os spams para passar pelos filtros iniciais não garantirá nada sobre o quão bem eles passarão pelos filtros variáveis e muito mais treinados de cada usuário.
A filtragem de spam baseada em conteúdo é frequentemente combinada com uma lista branca, uma lista de remetentes cujo e-mail pode ser aceito sem filtragem. Uma maneira fácil de construir tal lista branca é manter uma lista de todos os endereços para os quais o usuário já enviou e-mail. Se um leitor de e-mail tiver um botão de exclusão como spam, você também pode adicionar o endereço de remetente de cada e-mail que o usuário excluiu como lixo comum.
Sou um defensor de listas brancas, mas mais como uma forma de economizar computação do que como uma forma de melhorar a filtragem. Eu costumava pensar que as listas brancas tornariam a filtragem mais fácil, porque você só teria que filtrar e-mails de pessoas de quem você nunca ouviu falar, e alguém que está te enviando e-mail pela primeira vez é restringido por convenção no que pode dizer a você. Alguém que você já conhece pode enviar um e-mail falando sobre sexo, mas alguém que está te enviando e-mail pela primeira vez não seria provável. O problema é que as pessoas podem ter mais de um endereço de e-mail, então um novo endereço de remetente não garante que o remetente esteja escrevendo para você pela primeira vez. Não é incomum que um velho amigo (especialmente se ele for um hacker) de repente te envie um e-mail com um novo endereço de remetente, então você não pode correr o risco de falsos positivos filtrando e-mails de endereços desconhecidos de forma especialmente rigorosa.
Em certo sentido, porém, meus filtros incorporam em si mesmos um tipo de lista branca (e lista negra) porque são baseados em mensagens inteiras, incluindo os cabeçalhos. Então nessa medida, eles "conhecem" os endereços de e-mail dos remetentes confiáveis e até mesmo as rotas pelas quais o e-mail chega deles até mim. E eles sabem o mesmo sobre spam, incluindo os nomes dos servidores, versões do remetente e protocolos.
Se eu achasse que poderia manter as taxas atuais de filtragem de spam, consideraria esse problema resolvido. Mas não significa muito ser capaz de filtrar a maioria dos spams atuais, porque o spam evolui. Na verdade, a maioria técnicas antispam até agora foram como pesticidas que não fazem nada além de criar uma nova cepa resistente de insetos.
Estou mais esperançoso com os filtros bayesianos, porque eles evoluem com o spam. Então, à medida que os spammers começam a usar "c0ck" em vez de "cock" para evadir filtros de spam simples baseados em palavras individuais, os filtros bayesianos notam automaticamente. Na verdade, "c0ck" é uma evidência muito mais condenatória do que "cock", e os filtros bayesianos sabem precisamente o quanto mais.
Ainda assim, qualquer pessoa que propõe um plano para filtrar spam tem que ser capaz de responder à pergunta: se os spammers soubessem exatamente o que você estava fazendo, quão bem eles poderiam passar por você? Por exemplo, acho que se a filtragem de spam baseada em checksum se tornar um obstáculo sério, os spammers simplesmente mudarão para técnicas de mad-lib para gerar corpos de mensagens.
Para vencer os filtros bayesianos, não seria suficiente para os spammers tornar seus e-mails exclusivos ou parar de usar palavras maliciosas individuais. Eles teriam que fazer seus e-mails indistinguíveis do seu e-mail comum. E acho que isso os restringiria severamente. O spam é principalmente propaganda de vendas, então, a menos que seu e-mail regular seja todo propaganda de vendas, os spams inevitavelmente terão um caráter diferente. E os spammers também teriam que, é claro, mudar (e continuar mudando) toda sua infraestrutura, porque, caso contrário, os cabeçalhos pareceriam tão ruins para os filtros bayesianos quanto sempre, não importa o que eles fizessem com o corpo da mensagem. Eu não sei o suficiente sobre a infraestrutura que os spammers usam para saber o quão difícil seria fazer os cabeçalhos parecerem inocentes, mas meu palpite é que seria ainda mais difícil do que fazer a mensagem parecer inocente.
Supondo que eles pudessem resolver o problema dos cabeçalhos, o spam do futuro provavelmente se parecerá com isso:
Olá. Achei que você deveria conferir o seguinte: http://www.27meg.com/foo
porque isso é mais ou menos tanta propaganda de vendas quanto a filtragem baseada em conteúdo deixará o spammer espaço para fazer. (Na verdade, será difícil até mesmo passar isso pelos filtros, porque se tudo o mais no e-mail for neutro, a probabilidade de spam dependerá do url e será preciso algum esforço para fazer isso parecer neutro.)
Os spammers variam de empresas que executam as chamadas listas de opt-in que nem sequer tentam esconder suas identidades, a caras que sequestram servidores de e-mail para enviar spams promovendo sites pornográficos. Se usarmos a filtragem para reduzir suas opções a e-mails como o acima, isso deve basicamente colocar os spammers no lado "legítimo" do espectro fora do negócio; eles se sentem obrigados por várias leis estaduais a incluir informações padrão sobre por que seu spam não é spam e como cancelar sua "assinatura", e esse tipo de texto é fácil de reconhecer.
(Eu costumava pensar que era ingênuo acreditar que leis mais rigorosas diminuiriam o spam. Agora acho que, embora leis mais rigorosas possam não diminuir a quantidade de spam que os spammers enviam, eles certamente podem ajudar os filtros a diminuir a quantidade de spam que os destinatários realmente veem.)
Em todo o espectro, se você restringir as propagandas de vendas que os spammers podem fazer, você inevitavelmente tenderá a colocá-los fora do negócio. Essa palavra negócio é importante lembrar. Os spammers são homens de negócios. Eles enviam spam porque funciona. Funciona porque, embora a taxa de resposta seja abominavelmente baixa (no máximo 15 por milhão, versus 3000 por milhão para uma mala direta), o custo, para eles, é praticamente zero. O custo é enorme para os destinatários, cerca de 5 semanas-homem para cada milhão de destinatários que gastam um segundo para excluir o spam, mas o spammer não precisa pagar isso.
Enviar spam custa algo ao spammer, porém. [2] Então, quanto mais baixo pudermos obter a taxa de resposta - seja por filtragem ou usando filtros para forçar os spammers a diluírem suas propagandas - menos empresas acharão que vale a pena enviar spam.
A razão pela qual os spammers usam os tipos de propagandas de vendas que eles fazem é para aumentar as taxas de resposta. Isso é possivelmente ainda mais repugnante do que entrar na mente de um spammer, mas vamos dar uma olhada rápida dentro da mente de alguém que responde a um spam. Essa pessoa é ou assombrosamente crédula ou profundamente em negação sobre seus interesses sexuais. Em qualquer caso, repugnante ou idiota como o spam parece para nós, é emocionante para eles. Os spammers não diriam essas coisas se elas não soassem emocionantes. E "achei que você deveria conferir o seguinte" simplesmente não terá quase o mesmo poder de atração para o destinatário do spam como os tipos de coisas que os spammers dizem agora. Resultado: se não puder conter propagandas de vendas emocionantes, o spam se torna menos eficaz como veículo de marketing e menos empresas querem usá-lo.
Essa é a grande vitória no final. Comecei a escrever software de filtragem de spam porque não queria mais ter que olhar para essa coisa. Mas se ficarmos bons o suficiente em filtrar spam, ele deixará de funcionar e os spammers realmente pararão de enviá-lo.
De todas as abordagens para combater o spam, de softwares a leis, acredito que a filtragem bayesiana será a mais eficaz. Mas também acho que quanto mais tipos diferentes de esforços antispam empreendermos, melhor, porque qualquer medida que restrinja os spammers tenderá a tornar a filtragem mais fácil. E até mesmo dentro do mundo da filtragem baseada em conteúdo, acho que será uma boa coisa se houver muitos tipos diferentes de softwares sendo usados simultaneamente. Quanto mais filtros diferentes houver, mais difícil será para os spammers ajustar os spams para passar por eles.
Apêndice: Exemplos de Filtragem
Aqui é um exemplo de um spam que chegou enquanto eu estava escrevendo este artigo. As quinze palavras mais interessantes neste spam são:
qvp0045 indira mx-05 intimail $7500 freeyankeedom cdo bluefoxmedia jpg unsecured platinum 3d0 qves 7c5 7c266675
As palavras são uma mistura de coisas dos cabeçalhos e do corpo da mensagem, o que é típico de spam. Também típico de spam é que cada uma dessas palavras tem uma probabilidade de spam, no meu banco de dados, de .99. Na verdade, existem mais de quinze palavras com probabilidades de .99, e essas são apenas as primeiras quinze vistas.
Infelizmente, isso torna este e-mail um exemplo chato do uso da Regra de Bayes. Para ver uma variedade interessante de probabilidades, temos que olhar para isso spam realmente bastante atípico.
As quinze palavras mais interessantes neste spam, com suas probabilidades, são:
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
Desta vez, a evidência é uma mistura de bom e ruim. Uma palavra como "mais curto" é quase tanta evidência de inocência quanto uma palavra como "senhora" ou "promoção" é para culpa. Mas ainda assim, o caso para culpa é mais forte. Se você combinar esses números de acordo com a Regra de Bayes, a probabilidade resultante é .9027.
"Senhora" é obviamente de spams que começam com "Caro Senhor ou Senhora". Eles não são muito comuns, mas a palavra "senhora" nunca ocorre no meu e-mail legítimo e é tudo sobre a proporção.
"República" tem uma pontuação alta porque costuma aparecer em e-mails de golpes nigerianos e também ocorre uma ou duas vezes em spams que se referem à Coreia e à África do Sul. Você pode dizer que é um acidente que isso ajuda a identificar esse spam. Mas descobri ao examinar as probabilidades de spam que há muitos desses acidentes, e eles têm uma tendência estranha de empurrar as coisas na direção certa em vez da errada. Neste caso, não é totalmente uma coincidência que a palavra "República" ocorra em e-mails de golpes nigerianos e neste spam. Existe toda uma classe de propostas comerciais duvidosas envolvendo países menos desenvolvidos e estes, por sua vez, têm maior probabilidade de ter nomes que especificam explicitamente (porque não são) que são repúblicas. [3]
Por outro lado, "entrar" é um erro genuíno. Ele ocorre principalmente em instruções de cancelamento de assinatura, mas aqui é usado de uma forma completamente inocente. Felizmente, a abordagem estatística é bastante robusta e pode tolerar muitos erros antes que os resultados comecem a ser prejudicados.
Para comparação, aqui é um exemplo daquele pássaro raro, um spam que passa pelos filtros. Por quê? Porque, por pura coincidência, acontece de estar cheio de palavras que ocorrem no meu e-mail real:
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
Há algumas boas notícias aqui. Primeiro, este e-mail provavelmente não passaria pelos filtros de alguém que não se especializasse em linguagens de programação e não tivesse um bom amigo chamado Morris. Para o usuário médio, todas as cinco primeiras palavras aqui seriam neutras e não contribuiriam para a probabilidade de spam.
Segundo, acho que a filtragem com base em pares de palavras (veja abaixo) pode muito bem pegar este: "custo-benefício", "taxa de configuração", "dinheiro de volta" - coisas bastante incriminadoras. E, é claro, se eles continuassem a me enviar spam (ou para uma rede da qual eu fazia parte), "Hostex" em si seria reconhecido como um termo de spam.
Finalmente, aqui é um e-mail inocente. Suas quinze palavras mais interessantes são as seguintes:
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
A maioria das palavras aqui indica que o e-mail é inocente. Existem duas palavras com cheiro ruim, "cor" (os spammers adoram fontes coloridas) e "Califórnia" (que ocorre em depoimentos e também em menus em formulários), mas elas não são suficientes para superar palavras obviamente inocentes como "continuação" e "exemplo".
É interessante que "descrever" seja classificado como tão completamente inocente. Ele não ocorreu em nenhum dos meus 4000 spams. Os dados acabam sendo cheios de tais surpresas. Uma das coisas que você aprende quando analisa textos de spam é quão estreito é o subconjunto da linguagem em que os spammers operam. É esse fato, junto com o vocabulário igualmente característico do e-mail de qualquer usuário individual, que torna a filtragem bayesiana uma boa aposta.
Apêndice: Mais Ideias
Uma ideia que ainda não tentei é filtrar com base em pares de palavras ou até mesmo triplos, em vez de palavras individuais. Isso deve gerar uma estimativa muito mais precisa da probabilidade. Por exemplo, no meu banco de dados atual, a palavra "ofertas" tem uma probabilidade de .96. Se você baseasse as probabilidades em pares de palavras, você acabaria com "ofertas especiais" e "ofertas valiosas" tendo probabilidades de .99 e, digamos, "ofertas de abordagem" (como em "esta abordagem oferece") tendo uma probabilidade de .1 ou menos.
A razão pela qual não fiz isso é que a filtragem com base em palavras individuais já funciona muito bem. Mas isso significa que há espaço para apertar os filtros se o spam ficar mais difícil de detectar. (Curiosamente, um filtro baseado em pares de palavras seria, na verdade, um gerador de texto de cadeia de Markov funcionando ao contrário.)
Recursos de spam específicos (por exemplo, não ver o endereço do destinatário no campo para:) têm, é claro, valor no reconhecimento de spam. Eles podem ser considerados neste algoritmo tratando-os como palavras virtuais. Provavelmente farei isso em versões futuras, pelo menos para alguns dos indicadores de spam mais flagrantes. Filtros de spam de reconhecimento de recursos estão certos em muitos detalhes; o que lhes falta é uma disciplina geral para combinar evidências.
Reconhecer recursos não spam pode ser mais importante do que reconhecer recursos de spam. Falsos positivos são uma preocupação tão grande que exigem medidas extraordinárias. Provavelmente, em versões futuras, adicionarei um segundo nível de teste projetado especificamente para evitar falsos positivos. Se um e-mail acionar esse segundo nível de filtros, ele será aceito mesmo que sua probabilidade de spam esteja acima do limite.
Não espero que esse segundo nível de filtragem seja bayesiano. Inevitavelmente, será não apenas ad hoc, mas baseado em suposições, porque o número de falsos positivos não tenderá a ser grande o suficiente para notar padrões. (É bom também, de qualquer maneira, se um sistema de backup não depender da mesma tecnologia que o sistema primário.)
Outra coisa que posso tentar no futuro é focar atenção extra em partes específicas do e-mail. Por exemplo, cerca de 95% do spam atual inclui o url de um site que eles querem que você visite. (Os 5% restantes querem que você ligue para um número de telefone, responda por e-mail ou para um endereço de correio dos EUA ou, em alguns casos, compre uma determinada ação.) O url é, nesses casos, praticamente suficiente por si só para determinar se o e-mail é spam.
Os nomes de domínio diferem do resto do texto em um e-mail (não alemão) no sentido de que geralmente consistem em várias palavras coladas. Embora computacionalmente caro no caso geral, pode valer a pena tentar decompô-los. Se um filtro nunca viu o token "xxxporn" antes, ele terá uma probabilidade de spam individual de .4, enquanto "xxx" e "porn" individualmente têm probabilidades (no meu corpus) de .9889 e .99, respectivamente, e uma probabilidade combinada de .9998.
Espero que a decomposição de nomes de domínio se torne mais importante à medida que os spammers são gradualmente forçados a parar de usar palavras incriminadoras no texto de suas mensagens. (Um url com um endereço ip é, é claro, um sinal extremamente incriminador, exceto no e-mail de alguns administradores de sistema.)
Pode ser uma boa ideia ter uma lista mantida cooperativamente de urls promovidos por spammers. Precisaríamos de uma métrica de confiança do tipo estudado por Raph Levien para impedir envios maliciosos ou incompetentes, mas se tivéssemos algo assim, isso forneceria um impulso a qualquer software de filtragem. Também seria uma base conveniente para boicotes.
Outra forma de testar urls duvidosos seria enviar um rastreador para olhar o site antes que o usuário olhasse para o e-mail que o menciona. Você pode usar um filtro bayesiano para classificar o site da mesma forma que faria com um e-mail, e tudo o que foi encontrado no site pode ser incluído no cálculo da probabilidade de o e-mail ser um spam. Um url que levasse a um redirecionamento seria, é claro, especialmente suspeito.
Um projeto cooperativo que acho que realmente seria uma boa ideia seria acumular um corpus gigante de spam. Um corpus grande e limpo é a chave para fazer a filtragem bayesiana funcionar bem. Os filtros bayesianos poderiam realmente usar o corpus como entrada. Mas tal corpus seria útil para outros tipos de filtros também, porque poderia ser usado para testá-los.
Criar tal corpus apresenta alguns problemas técnicos. Precisaríamos de métricas de confiança para evitar envios maliciosos ou incompetentes, é claro. Também precisaríamos de maneiras de apagar informações pessoais (não apenas endereços para e ccs, mas também, por exemplo, os argumentos para urls de cancelamento de assinatura, que geralmente codificam o endereço para) de e-mails no corpus. Se alguém quiser assumir este projeto, seria uma boa coisa para o mundo.
Apêndice: Definindo Spam
Acho que há um consenso geral sobre o que é spam, mas seria útil ter uma definição explícita. Precisaremos fazer isso se quisermos estabelecer um corpus central de spam ou mesmo comparar as taxas de filtragem de spam de forma significativa.
Para começar, spam não é e-mail comercial não solicitado. Se alguém na minha vizinhança ouvisse que eu estava procurando uma antiga Raleigh de três marchas em bom estado, e me enviasse um e-mail oferecendo para me vender uma, eu ficaria encantado, e ainda assim este e-mail seria comercial e não solicitado. A característica definidora de spam (na verdade, sua raison d'etre) não é que seja não solicitado, mas que é automatizado.
É apenas incidental também que o spam geralmente seja comercial. Se alguém começasse a enviar e-mails em massa para apoiar alguma causa política, por exemplo, seria tão spam quanto um e-mail promovendo um site pornográfico.
Proponho que definamos spam como e-mail automatizado não solicitado. Esta definição, portanto, inclui alguns e-mails que muitas definições legais de spam não incluem. Definições legais de spam, influenciadas provavelmente por lobistas, tendem a excluir e-mails enviados por empresas que têm um "relacionamento existente" com o destinatário. Mas comprar algo de uma empresa, por exemplo, não implica que você tenha solicitado e-mails contínuos deles. Se eu pedir algo em uma loja online e eles então me enviarem uma enxurrada de spam, ainda é spam.
As empresas que enviam spam geralmente te dão uma maneira de "cancelar a assinatura" ou pedem que você vá ao site delas e altere suas "preferências de conta" se quiser parar de receber spam. Isso não é suficiente para impedir que o e-mail seja spam. Não optar por sair não é o mesmo que optar por entrar. A menos que o destinatário tenha marcado explicitamente uma caixa claramente rotulada (cujo padrão era não) pedindo para receber o e-mail, então é spam.
Em alguns relacionamentos comerciais, você implicitamente solicita certos tipos de e-mails. Quando você pede online, acho que você implicitamente solicita um recibo e notificação quando o pedido é enviado. Não me importo quando a Verisign me envia e-mails avisando que um nome de domínio está prestes a expirar (pelo menos, se eles forem o registrador real para isso). Mas quando a Verisign me envia e-mails oferecendo um GUIA GRÁTIS para Construir meu site de comércio eletrônico, isso é spam.
Notas:
[1] Os exemplos neste artigo são traduzidos para Common Lisp para, acredite