/spln1415-spam-catcher

Terceiro Trabalho Prático de SPLN, Mestrado em Engenharia Informática @ Universidade do Minho

Primary LanguagePerl

Nome

SpamCatcher - Identificador de emails de SPAM

SINOPSE

use SpamCatcher;

my @hams = glob('app/ham/*');
my @spams = glob('app/spam/*');

my $spam;

# Inicializar e registar os ficheiros passados como argumento
$spam = SpamCatcher->new(\@hams,\@spams);

# OU

# Inicializar, mostrar grau de confiança e registar os ficheiros passados como argumento
#$spam = SpamCatcher->new(\@hams,\@spams, 1);

# teria como output algo semelhante a:
# Confiabilidade (4): 0.977551020408163 (1916 em 1960)
# Confiabilidade (3): 0.98265306122449 (1926 em 1960)
# Confiabilidade (2): 0.977040816326531 (1915 em 1960)
# Confiabilidade (1): 0.976020408163265 (1913 em 1960)
# Confiabilidade (0): 0.971938775510204 (1905 em 1960)

# Construir a base de dados com os ficheiros passados ao inicializador
$spam->learn_dataset();

# Verificar se um email é SPAM
if($spam->is_spam('app/ham/00027.c9e76a75d21f9221d65d4d577a2cfb75')){
  print "is spam\n"
}else{
  print "is not spam\n"
}

DESCRIÇÃO

O Spam Catcher permite identificar se um email é SPAM.

O módulo necessita que lhe sejam fornecidos vários emails previamente reconhecidos como SPAM ou HAM (não-SPAM). Esses emails são usados para conseguir prever se um email é SPAM.

Ao observar a taxa de sucesso do módulo usando o algoritmo K-Fold, o módulo reconheceu emails de HAM e SPAM com uma taxa de sucesso superior a 97%.

SUBROTINAS

EXPORT

Nada é exportado de forma implícita/predefinida.

EXPORT_OK

file_to_normalized_string

Recebe como argumento um nome de ficheiro.

Abre o ficheiro cujo nome foi passado como argumento, normaliza o seu conteúdo e devolve-o na forma de uma string.

word_frequency

Recebe um texto (string) como argumento. Este texto deve ter sido previamente normalizado usando file_to_normalized_string.

Devolve uma hash cujas chaves são as palavras encontradas no texto e os valores são as correspondentes frequências absolutas.

debug_normalize_file

Recebe uma referência para um array com nomes de ficheiro e uma directoria (string) (sem / no fim).

Cria uma versão normalizada do ficheiro original, com o mesmo nome, na directoria indicada.

SUBROTINAS DE INSTÂNCIA

new

Recebe como argumentos:

1. Referêcia para uma lista com os nomes de ficheiro dos emails pre-identificados como HAM;
2. Referêcia para uma lista com os nomes de ficheiro dos emails pre-identificados como SPAM;
3. (opcional, falso por predefinição) Valor de verdade que indica se deve ser executada a subrotina de verificação do grau de confiança do SpamCatcher.

Cria uma nova instância de SpamCatcher que usará os ficheiros designados para aprender a identificar emails.

Caso o terceiro argumento tenha um valor verdadeiro, é executada a subrotina de verificação do grau de confiança do SpamCatcher.

learn_dataset

Recebe um argumento (opcional e falso por predefinição) que indica se o ficheiro temporário do Naive Bayes deverá ser ignorado.

Se o ficheiro temporário existir e puder ser usado, é carregado esse ficheiro, ficando a instância rapidamente pronta a reconhecer emails.

Se o ficheiro temporário não existir ou não puder ser usado, todos os ficheiros são normalizados e as suas frequências absolutas adicionadas à instância de Algorithm::NaiveBayes. Depois disso as frequências são preparadas para serem utilizadas na classificação de emails. Por fim o estado do Algorithm::NaiveBayes é guardado num ficheiro temporário para poder ser directamente recuperado e acelerar as próximas execuções desta subrotina.

confidence_level

Não recebe argumentos.

Executa o método K-Fold com 5 blocos (a distribuição dos emails pelos blocos é aleatória para instâncias diferentes de SpamCatcher):

1. Aprende a identificar emails usando os blocos 1 a 4 e verifica a percentagem de emails do 5.º bloco que classificou com sucesso.
2. Aprende a identificar emails usando os blocos 1, 2, 3 e 5 e verifica a percentagem de emails do 4.º bloco que classificou com sucesso.
3. Aprende a identificar emails usando os blocos 1, 2, 4 e 5 e verifica a percentagem de emails do 3.º bloco que classificou com sucesso.
4. Aprende a identificar emails usando os blocos 1, 3, 4 e 5 e verifica a percentagem de emails do 2.º bloco que classificou com sucesso.
5. Aprende a identificar emails usando os blocos 2, 3, 4 e 5 e verifica a percentagem de emails do 1.º bloco que classificou com sucesso.

A informação sobre confiança é mostrada no ecrã.

A subrotina devolve undef.

is_spam

Recebe como argumento um nome de ficheiro.

Computa as frequências absolutas das palavras contidas no ficheiro cujo nome foi passado como argumento, questiona a instância de Algorithm::NaiveBayes sobre a probabilidade de o email ser de SPAM.

Um email é de SPAM quando o Algorithm::NaiveBayes devolve uma probabilidade de ser SPAM de mais de 50% e o valor da probabilidade de ser SPAM é maior que o valor da probabilidade de ser HAM.

REGRAS DA MAKEFILE

Existem algumas regras adicionais na makefile do projecto:

  • application: executa a aplicação de exemplo (é necessário extrair o tar.bz2 com os datasets)

  • alldoc: gera o ficheiro README.pod e uma versão do relatório perldoc em HTML (com índice)

  • cleandoc: remove os ficheiros gerados pela regra htmlreport

DEPENDÊNCIAS EXTERNAS

  • Lingua::Jspell com o dicionário Português ("port") instalado;

  • Text::RewriteRules.

  • Lingua::EN::StopWords tem palavras que não contribuem para decisão entre HAM e SPAM;

  • Lingua::Stem é uma dependência do Lingua::EN::StopWords;

  • Algorithm::NaiveBayes implementa o algoritmo Naive Bayes, permite inserir as frequências absolutas das palavras e obter valores de previsão para classificar emails;

  • HTML::Strip Remove tags HTML dos emails;

  • Mail::Internet Remove cabeçalhos dos emails.

AUTORES

B. Ferreira E<lt>chalkos@chalkos.netE<gt>
M. Pinto E<lt>mcpinto98@gmail.comE<gt>

COPYRIGHT AND LICENSE

Copyright (C) 2015 by B. Ferreira and M. Pinto

This program is free software; licensed under GPL.