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
// 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();
$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));
1 Pingback