A Plan for Spam | Explicando de forma simples como Paul Graham revolucionou o filtro de e-mails usando matemática
A Plan for Spam é um artigo escrito por Paul Graham, em 2002, que revolucionou o combate a spam usando conceitos matemáticos. Ele introduziu uma abordagem baseada em probabilidade, utilizando a teoria bayesiana. O objetivo é ajudar um programa de e-mail a identificar se uma mensagem é spam ou não com base em palavras e padrões encontrados no texto.
Neste artigo, explicarei de forma simples como funciona essa teoria e mostrarei exemplos práticos.
O que é Spam e Como o Reconhecemos?
Spam são aquelas mensagens de e-mail indesejadas, geralmente propagandas ou até golpes. Paul Graham percebeu que é possível prever se um e-mail é spam observando as palavras nele. Por exemplo:
- Palavras como "desconto", "grátis" e "clique aqui" aparecem muito em spams.
- Palavras como "projeto", "trabalho" e "anexo" são mais comuns em e-mails normais.
Mas como o computador "aprende" a diferenciar essas palavras? É aí que entra a matemática!
A Matemática por Trás do Combate ao Spam
Graham usou a teoria de Bayes, que calcula a probabilidade de algo acontecer com base em eventos anteriores. Aqui está a fórmula:
$$ P(S|W) = \frac{P(W|S) \cdot P(S)}{P(W|S) \cdot P(S) + P(W|H) \cdot P(H)} $$
O que cada parte significa:
- (P(S|W)): A probabilidade de um e-mail ser spam dado que contém uma palavra (W).
- (P(W|S)): A probabilidade de a palavra (W) aparecer em e-mails de spam.
- (P(S)): A probabilidade de qualquer e-mail ser spam.
- (P(W|H)): A probabilidade de a palavra (W) aparecer em e-mails legítimos (não spam).
- (P(H)): A probabilidade de qualquer e-mail ser legítimo.
Como funciona?
- O programa analisa um grande número de e-mails anteriores para calcular (P(W|S)) e (P(W|H)).
- Com esses dados, ele aplica a fórmula para calcular (P(S|W)), ou seja, quão provável é que um e-mail com a palavra (W) seja spam.
Exemplo Prático
Imagine que estamos treinando o programa com o seguinte conjunto de e-mails:
- 100 e-mails, sendo 60 spams e 40 legítimos.
- A palavra "desconto" aparece em 30 e-mails de spam e 5 e-mails legítimos.
Agora vamos calcular:
- Probabilidade da palavra em spams ((P(W|S))):
$$ P(W|S) = \frac{\text{Nº de spams com “desconto”}}{\text{Total de spams}} = \frac{30}{60} = 0,5 $$
- Probabilidade da palavra em e-mails legítimos ((P(W|H))):
$$ P(W|H) = \frac{\text{Nº de legítimos com “desconto”}}{\text{Total de legítimos}} = \frac{5}{40} = 0,125 $$
- Probabilidade de ser spam ((P(S))) e legítimo ((P(H))):
$$ P(S) = \frac{\text{Total de spams}}{\text{Total de e-mails}} = \frac{60}{100} = 0,6 $$
$$ P(H) = \frac{\text{Total de legítimos}}{\text{Total de e-mails}} = \frac{40}{100} = 0,4 $$
Agora aplicamos à fórmula de Bayes:
$$ P(S|W) = \frac{P(W|S) \cdot P(S)}{P(W|S) \cdot P(S) + P(W|H) \cdot P(H)} $$
Substituímos os valores:
$$ P(S|W) = \frac{0,5 \cdot 0,6}{0,5 \cdot 0,6 + 0,125 \cdot 0,4} $$
Calculando o denominador:
$$ 0,5 \cdot 0,6 = 0,3 \quad \text{e} \quad 0,125 \cdot 0,4 = 0,05 $$
Logo:
$$ P(S|W) = \frac{0,3}{0,3 + 0,05} = \frac{0,3}{0,35} \approx 0,857 $$
Resultado:
A probabilidade de um e-mail contendo a palavra "desconto" ser spam é 85,7%.
Como Isso é Usado na Prática?
Os filtros de spam analisam cada palavra do e-mail e fazem esse cálculo para várias palavras. Eles combinam as probabilidades para decidir se o e-mail é spam ou não.
- Se a probabilidade combinada for alta (ex.: acima de 90%), o e-mail é marcado como spam.
- Se for baixa, o e-mail é considerado legítimo.
Conclusão
Paul Graham mostrou como usar a matemática para resolver um problema prático. Hoje, quase todos os filtros de e-mail usam alguma versão dessa ideia para proteger você de spams. Entender isso não é só útil para aprender sobre probabilidade, mas também para ver como a matemática pode fazer parte do nosso dia a dia.
Uma dica, no tabnews temos suporte a formatação mathjax (que é um subconjunto do latex) para expressar fórmulas.
Se tu colocar assim:
$$P(A \mid B) = \frac{P(B \mid A) \, P(A)}{P(B)}$$
Você consegue representar o teorema de bayes
$$P(A \mid B) = \frac{P(B \mid A) , P(A)}{P(B)}$$
PS: Uma outra curiosidade sobre a implementação de Graham e o Teorema de Bayes é que ele é auto-alimentado. Ou seja você sempre pode inferir novas informações a partir de informações antigas aumentando a confiabilidade no sistema conforme o tempo passa