Filtros Bayesianos – parte 2

Este post é continuação de outro, onde apresento a teoria sobre os filtros bayesianos. Se você não leu, pode faze-lo através do link parte 1.

Sei que demorou para dar continuidade, mas finalmente pude fazer essa segunda parte do artigo e espero que tenha sido valida a espera para aqueles que se interessaram pela matéria.

Na primeira parte vimos que um filtro bayesiano é uma maneira inteligente(não perfeita) de categorizar documentos, ou, como queira, categorizar conteúdo textual, seja ele e-mail, livros, posts de blogs ou bulas de remédio.

E dessa vez vamos dar uma olhada em um código que foi produzido para cobrir o que foi apresentado pela parte 1.

Só para adiantar alguma coisa, o que no final, o programador vai usar de codigo para poder categorizar um conteúdo esta coberto pelas linhas abaixo:

require_once "bootstrap.php";
$bom = new bcategory("email-good");
$ruim = new bcategory("email-bad");
$content = "Uma frase qualquer aqui  e ela depois sera avaliada pelo sistema";
$Filter = bFilter::getInstance($bom, $ruim);
$Filter->setPreferable($bom);
var_dump($Filter->Analyze($content));

Ao menos ninguem vai poder dizer que é muita linha de código por que é só ajeitar um pouco pra ficar mais conciso, talvez como:

require_once "bootstrap.php";
$content = " Ivo, O Santo Graal do Spam das venda compre viagra do Batman compre compre compre";
$Filter = bFilter::getInstance(new bcategory("email-good"), new bcategory("email-bad"));
$Filter->setPreferable($bom)->Analyze($content);

O código acima carrega primeiro o bootstrap, setando algumas coisas(poderia ter um config.php, mas não vi necessidade), como se pode ver aqui:

define('APP_PATH',            $_SERVER['DOCUMENT_ROOT']);
define("BAYES_PATH",APP_PATH."class/");
define("BAYES_CAT_PATH",APP_PATH."categories/");
define("FILTER_EXPRESSION", '/[^a-zA-Z *]/');
define("IGNOREWORDEQUALSORLESSTHEN", 2);
define("BASICPROBABILITY", 0.1);
spl_autoload_extensions('.class.php');
function bautoload($name){
if ( file_exists(  BAYES_PATH. strtolower($name).".class.php") ){
require_once BAYES_PATH.strtolower($name).".class.php";
return;
}
}
spl_autoload_register('bautoload');

Nesse bootstrap as coisas mais importantes para o sistema são FILTER_EXPRESSION que define a expressao regular que sera utilizada para “sanitize” o texto, ou seja, para deixar no texto somente o que achamos que deva ficar, nesse caso, no conteúdo a ser analisado não haverá nada além de letras maiúsculas e minúsculas e espaços entre as palavras. Todo o resto será ignorado.

A constante IGNOREWORDEQUALSORLESSTHEN foi usada para definir um tamanho mínimo para uma palavra, de forma a ignorar algumas coisas como os artigos, conjunções e etc(sim, foi uma forma simples de fazer o codigo ignorar de, e, o, a, mas isso implica que coisas como Eu foram ignoradas tambem). A ideia era tirar algumas coisas que eu sabia que estariam em qualquer texto em nossa lingua portuguesa e se concentrar nas palavras mesmo, mas se não quiser ignorar nada, advinha, basta IGNOREWORDEQUALSORLESSTHEN=0 e pronto.

E BASICPROBABILITY, que foi setado para 0.1, isso significa que caso uma palavra não tenha ainda sua probabilidade calculada, ou seja, ainda não apareceu em nenhum conteúdo usado para treinamento daquela categoria, seu valor de probabilidade sera 10%. Isso ajuda a avaliar todas as palavras, mesmo que elas não existam no dicionário da categoria ainda.

Se você quiser colocar a aplicação para rodar, a primeira coisa a fazer é ir em http://code.google.com/p/bayesphp/ e pegar o codigo la. Va para a sessão de source(a aba, se preferir ;]) e vai encontrar a seguinte instrução.

# Non-members may check out a read-only working copy anonymously over HTTP.
svn checkout http://bayesphp.googlecode.com/svn/trunk/ bayesphp-read-only
Ai voce escolhe, ou é um feliz usuario de alguma interface de subversion como o Cornerstone(para Mac, que eu recomendo) ou vai pro terminar, escolhe sua pasta de projetos e manda bala no comando que esta ai de checkout mesmo. De qualquer forma, ai pegar o código, não precisa alterar nada, precisa somente confirmar se o usuário que roda o apache ou php(depende de como você vai executar o programa) tem direito de escrita na BAYES_CAT_PAT.
Pelo terminal mesmo já pode rodar um “php index.php” e ver o resultado.
Agora, vamos começar a ver o código da  index
Primeiro – O Treinamento(sem o Denzel Washington )
// the training demo $bonsemails = new bcategory("email-bad",true); $treinamento = new bTrain($bonsemails); $treinamento->addContent("to vendendo a alma"); $treinamento->addContent("to nem ai, eu gosto de axé mesmo alma"); $treinamento->addContent("o batman tambem toma viagra... compre aqui o seu"); $treinamento->Exec();
Para treinar uma categoria, primeiro voce precisa criar a instância da categoria e informar que ela esta em treinamento(segundo parametro).
Depois crie uma instancia da classe de treinamento baseada na categoria que esta treinando new bTrain($bonsemails) e ai va adicionando os textos/conteúdos para depois Exec() o treinamento.
Segundo – Categorizando um conteudo
$bom = new bcategory("email-good"); $ruim = new bcategory("email-bad"); $content = "Uma frase qualquer aqui  e ela depois sera avaliada pelo sistema"; $Filter = bFilter::getInstance($bom, $ruim); $Filter->setPreferable($bom); var_dump($Filter->Analyze($content));
O formato  da resposta esta de uma forma para que seja visto o resultado e não na forma que considero melhor, que seria somente devolver a Categoria na qual o conteudo foi categorizado. Na resposta estão a pontuação final de cada uma das categorias e o nome da categoria de maior pontuação.
Bem, por enquanto é isso.
Um abraço pessoal.
Advertisements

One thought on “Filtros Bayesianos – parte 2

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Google photo

You are commenting using your Google account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s