SlideShare uma empresa Scribd logo
1 de 3
Baixar para ler offline
Universidade Federal do Rio Grande do Sul - UFRGS
Programa de Pós-Graduação em Computação
Mestrado em Ciência da Computação
Disciplina: Aprendizagem de Máquina
Professor: Paulo Engel
Aluno: Mauricio Volkweis Astiazara
Classificador de Documentos Naïve Bayes
Este trabalho irá aplicar o método estatístico de classificador bayesiano ingênuo (naïve bayes)
na classificação de documentos por assunto. O objetivo é verificar a eficácia do método através da
prática, embora ele possua relaxamentos em relação ao classificador bayesiano ótimo. Os
documentos serão páginas web, focadas em determinado assunto. As páginas são lidas on-line e
sumarizadas pelos totais de ocorrências de cada palavra única no texto. Os documento podem ou
não ser classificadas pelo usuário. Os documentos classificados pelo usuário serão utilizados para
treinamento da aplicação. Depois do treinamento, a aplicação poderá classificar automaticamente
novos documentos adquiridos.
Devido à necessidade de realização de contagens, totalizações e outros dados estatísticos, foi
adotado o uso de um banco de dados relacionais para armazenar os dados da aplicação, como por
exemplo, os dados dos documento adquiridos. Os bancos de dados relacionais são baseados na
teoria dos conjuntos e geram facilmente este tipo de informação. Além disso são mais escalonáveis
e robustos em relação ao uso de arquivos texto. O banco de dados utilizado foi o MySQL da Sun
Microsystems. Optou-se pela implementação na linguagem de programação C-Sharp. Ela possui
uma sintaxe semelhante às linguagens Java e C++.
Inicialmente foi realizada uma modelagem conceitual da aplicação com o objetivo de levantar
quais a entidades necessárias para a implementação. O diagrama de classes abaixo o resultado desta
modelagem. A notação utilizada é a UML.
A tarefa de treinamento foi implementada utilizando-se parte do processamento no banco de
dados e parte no programa. Abaixo está o código-fonte que calcula a probabilidade a priori e a
verossimilhança para uma determinada classe.
private void CalcularProbabilidadeAPriori()
{
string sql;
sql = "select "
+ "(select count(*) from documento where classificacao = ?p1)"
+ " / (select count(*) from documento)";
_probabilidadeAPriori = Convert.ToDouble(
Sistema.Instancia.Conexao.ExecutarScalar(sql, _id));
sql = "update classificacao set probabilidade_a_priori = ?p1 where id = ?p2";
Sistema.Instancia.Conexao.ExecutarSemRetorno(sql,
_probabilidadeAPriori,
_id);
}
private void CalcularProbabilidadeDasPalavras()
{
string sql;
sql = "delete from palavra_de_classificacao where classificacao = ?p1";
Sistema.Instancia.Conexao.ExecutarSemRetorno(sql, _id);
double n;
sql = "select count(palavra) "
+ "from v_palavra_por_classificacao "
+ "where classificacao = ?p1";
n = Convert.ToDouble(
Sistema.Instancia.Conexao.ExecutarScalar(sql, _id));
double vocabulary;
sql = "select count(*) from v_palavra_classificada";
vocabulary = Convert.ToDouble(
Sistema.Instancia.Conexao.ExecutarScalar(sql));
double total = n + vocabulary;
sql = "insert into palavra_de_classificacao "
+ "(classificacao, palavra, ocorrencias, verossimilhanca) "
+ "select classificacao.id, v_palavra_classificada.palavra, "
+ "coalesce(v_palavra_por_classificacao.ocorrencias, 0) as ocorrencias, "
+ "coalesce(v_palavra_por_classificacao.ocorrencias, 1) / ?p1 "
+ "from v_palavra_classificada "
+ "inner join classificacao "
+ "left outer join v_palavra_por_classificacao "
+ "on v_palavra_por_classificacao.palavra =
v_palavra_classificada.palavra "
+ "and v_palavra_por_classificacao.classificacao = classificacao.id "
+ "where classificacao.id = ?p2";
Sistema.Instancia.Conexao.ExecutarSemRetorno(sql, total, _id);
}
A função que classifica um documento não faz uso intenso do banco de dados, sendo a maior
parte do processamento realizado no programa. Na primeira versão ocorreu um problema devido a
representação de números muito próximos a zero, que a partir de determinado valor eram
transformados em zero, levando a resultados errôneos. Posteriormente isto foi solucionado pela
substituição das multiplicações das probabilidades pela soma dos logaritmos das probabilidades.
Abaixo está o código-fonte da função que indica “o quanto” um documento pertence a determinada
classe.
public double Classificar(Documento pDocumento)
{
double probabilidade = 0;
PalavraDeClassificacao palavraDeClassificacao =
new PalavraDeClassificacao(this);
foreach (PalavraDeDocumento palavraDeDocumento in pDocumento.Palavras)
{
if (palavraDeClassificacao.Buscar(palavraDeDocumento.Palavra))
{
probabilidade = probabilidade +
Math.Log(palavraDeClassificacao.Verossimilhanca);
}
}
probabilidade = Math.Log(this.ProbabilidadeAPriori) + probabilidade;
return probabilidade;
}
Para utilização da aplicação foram cadastradas duas classificações alvo: “Algoritmos
Genéticos” e “Redes Neurais Artificiais”. Também foi cadastrada uma classificação “Outros” para
ser aplicada a qualquer documento que não fosse das classificações alvo. Adquiriu-se então da
Internet, 20 documentos cujo assunto é Algoritmos Genéticos e 20 sobre Redes Neurais Artificiais e
30 de outros assuntos. Todos estes 70 documentos foram classificados manualmente para então
serem usados como dados de treinamento.
Após essa tarefa, foi executada a rotina de treinamento. Para testar a classificação automática
da aplicação, mais cinco documentos foram adquiridos, mas não receberam classificação manual.
Destes documentos, dois eram sobre Algoritmos Genéticos e dois sobre Redes Neurais Artificiais.
Também foi adquirido um documento que é uma notícia do canal de TV BBC. O objetivo era
verificar se a aplicação além de classificar corretamente os documentos das classes alvo, perceberia
que um documento não é de nenhuma das classes de interesse. O método funcionou corretamente
em todos os dados de teste, verificando que apesar dos relaxamentos que o naïve bayes utiliza,
ainda assim possui uma boa eficácia.

Mais conteúdo relacionado

Semelhante a Classificador de Documentos Naïve Bayes

Uso de Anotações Semânticas para Exploração de Paralelismo em Workflows Inten...
Uso de Anotações Semânticas para Exploração de Paralelismo em Workflows Inten...Uso de Anotações Semânticas para Exploração de Paralelismo em Workflows Inten...
Uso de Anotações Semânticas para Exploração de Paralelismo em Workflows Inten...Elaine Naomi
 
Spring framework 2.5
Spring framework 2.5Spring framework 2.5
Spring framework 2.5Diego Pacheco
 
Conectando seu banco de dados usando jdbc
Conectando seu banco de dados usando jdbcConectando seu banco de dados usando jdbc
Conectando seu banco de dados usando jdbcJeison Barros
 
Desenvolvimento de Aplicações para o Google App Engine (CPBR5)
Desenvolvimento de Aplicações para o Google App Engine (CPBR5)Desenvolvimento de Aplicações para o Google App Engine (CPBR5)
Desenvolvimento de Aplicações para o Google App Engine (CPBR5)Carlos Duarte do Nascimento
 
Desenvolvimento de aplicações para o Google App Engine
Desenvolvimento de aplicações para o Google App EngineDesenvolvimento de aplicações para o Google App Engine
Desenvolvimento de aplicações para o Google App EngineCampus Party Brasil
 
[TDC2016] Apache SparkMLlib: Machine Learning na Prática
[TDC2016] Apache SparkMLlib:  Machine Learning na Prática[TDC2016] Apache SparkMLlib:  Machine Learning na Prática
[TDC2016] Apache SparkMLlib: Machine Learning na PráticaEiti Kimura
 
Introdução ao MongoDB: conceitos e práticas
Introdução ao MongoDB: conceitos e práticasIntrodução ao MongoDB: conceitos e práticas
Introdução ao MongoDB: conceitos e práticasBruno Barreto Carvalho
 
Fundamentos da Programação PHP OO - Aula 1
Fundamentos da Programação PHP OO - Aula 1Fundamentos da Programação PHP OO - Aula 1
Fundamentos da Programação PHP OO - Aula 1Thyago Maia
 
Algoritmos de Estimação de Distribuição Aplicados à Estimativa de Software
Algoritmos de Estimação de Distribuição Aplicados à Estimativa de SoftwareAlgoritmos de Estimação de Distribuição Aplicados à Estimativa de Software
Algoritmos de Estimação de Distribuição Aplicados à Estimativa de SoftwareJosé Corrêa Viana
 
Merlinferramentassbc2006 Revisado Em6paginas
Merlinferramentassbc2006 Revisado Em6paginasMerlinferramentassbc2006 Revisado Em6paginas
Merlinferramentassbc2006 Revisado Em6paginasMarcelo Mrack
 
Persistência com JPA usando o NetBeans 7
Persistência com JPA usando o NetBeans 7Persistência com JPA usando o NetBeans 7
Persistência com JPA usando o NetBeans 7Claudio Martins
 
Apostila php avancado
Apostila php avancadoApostila php avancado
Apostila php avancadoTiago Pereira
 
Machine learning java ce conference 2012 - fortaleza ce
Machine learning java ce conference 2012 - fortaleza ceMachine learning java ce conference 2012 - fortaleza ce
Machine learning java ce conference 2012 - fortaleza ceLuca Bastos
 
Python x R: mas e o Weka?
Python x R: mas e o Weka? Python x R: mas e o Weka?
Python x R: mas e o Weka? pichiliani
 
TDC2016SP - Python x R: mas e o Weka?
TDC2016SP - Python x R: mas e o Weka?TDC2016SP - Python x R: mas e o Weka?
TDC2016SP - Python x R: mas e o Weka?tdc-globalcode
 

Semelhante a Classificador de Documentos Naïve Bayes (20)

Doctrine for dummies
Doctrine for dummiesDoctrine for dummies
Doctrine for dummies
 
ID3 Algorithm
ID3 AlgorithmID3 Algorithm
ID3 Algorithm
 
Uso de Anotações Semânticas para Exploração de Paralelismo em Workflows Inten...
Uso de Anotações Semânticas para Exploração de Paralelismo em Workflows Inten...Uso de Anotações Semânticas para Exploração de Paralelismo em Workflows Inten...
Uso de Anotações Semânticas para Exploração de Paralelismo em Workflows Inten...
 
Spring framework 2.5
Spring framework 2.5Spring framework 2.5
Spring framework 2.5
 
Conectando seu banco de dados usando jdbc
Conectando seu banco de dados usando jdbcConectando seu banco de dados usando jdbc
Conectando seu banco de dados usando jdbc
 
Desenvolvimento de Aplicações para o Google App Engine (CPBR5)
Desenvolvimento de Aplicações para o Google App Engine (CPBR5)Desenvolvimento de Aplicações para o Google App Engine (CPBR5)
Desenvolvimento de Aplicações para o Google App Engine (CPBR5)
 
Desenvolvimento de aplicações para o Google App Engine
Desenvolvimento de aplicações para o Google App EngineDesenvolvimento de aplicações para o Google App Engine
Desenvolvimento de aplicações para o Google App Engine
 
[TDC2016] Apache SparkMLlib: Machine Learning na Prática
[TDC2016] Apache SparkMLlib:  Machine Learning na Prática[TDC2016] Apache SparkMLlib:  Machine Learning na Prática
[TDC2016] Apache SparkMLlib: Machine Learning na Prática
 
Introdução ao MongoDB: conceitos e práticas
Introdução ao MongoDB: conceitos e práticasIntrodução ao MongoDB: conceitos e práticas
Introdução ao MongoDB: conceitos e práticas
 
Fundamentos da Programação PHP OO - Aula 1
Fundamentos da Programação PHP OO - Aula 1Fundamentos da Programação PHP OO - Aula 1
Fundamentos da Programação PHP OO - Aula 1
 
DDD > Experiências
DDD > ExperiênciasDDD > Experiências
DDD > Experiências
 
Algoritmos de Estimação de Distribuição Aplicados à Estimativa de Software
Algoritmos de Estimação de Distribuição Aplicados à Estimativa de SoftwareAlgoritmos de Estimação de Distribuição Aplicados à Estimativa de Software
Algoritmos de Estimação de Distribuição Aplicados à Estimativa de Software
 
Merlinferramentassbc2006 Revisado Em6paginas
Merlinferramentassbc2006 Revisado Em6paginasMerlinferramentassbc2006 Revisado Em6paginas
Merlinferramentassbc2006 Revisado Em6paginas
 
Persistência com JPA usando o NetBeans 7
Persistência com JPA usando o NetBeans 7Persistência com JPA usando o NetBeans 7
Persistência com JPA usando o NetBeans 7
 
Apostila php avancado
Apostila php avancadoApostila php avancado
Apostila php avancado
 
Apostila php avancado
Apostila php avancadoApostila php avancado
Apostila php avancado
 
Bancos de Dados no Azure - Arquiteturas
Bancos de Dados no Azure - ArquiteturasBancos de Dados no Azure - Arquiteturas
Bancos de Dados no Azure - Arquiteturas
 
Machine learning java ce conference 2012 - fortaleza ce
Machine learning java ce conference 2012 - fortaleza ceMachine learning java ce conference 2012 - fortaleza ce
Machine learning java ce conference 2012 - fortaleza ce
 
Python x R: mas e o Weka?
Python x R: mas e o Weka? Python x R: mas e o Weka?
Python x R: mas e o Weka?
 
TDC2016SP - Python x R: mas e o Weka?
TDC2016SP - Python x R: mas e o Weka?TDC2016SP - Python x R: mas e o Weka?
TDC2016SP - Python x R: mas e o Weka?
 

Mais de Mauricio Volkweis Astiazara

Sistema Imunológico Artificial para Predição de Fraudes e Furtos de Energia E...
Sistema Imunológico Artificial para Predição de Fraudes e Furtos de Energia E...Sistema Imunológico Artificial para Predição de Fraudes e Furtos de Energia E...
Sistema Imunológico Artificial para Predição de Fraudes e Furtos de Energia E...Mauricio Volkweis Astiazara
 
Sistema Imunológico Artificial para Predição de Fraudes e Furtos de Energia E...
Sistema Imunológico Artificial para Predição de Fraudes e Furtos de Energia E...Sistema Imunológico Artificial para Predição de Fraudes e Furtos de Energia E...
Sistema Imunológico Artificial para Predição de Fraudes e Furtos de Energia E...Mauricio Volkweis Astiazara
 
Comparação de Algoritmos Baseados em Q-Learning
Comparação de Algoritmos Baseados em Q-LearningComparação de Algoritmos Baseados em Q-Learning
Comparação de Algoritmos Baseados em Q-LearningMauricio Volkweis Astiazara
 
Sistema de Recomendação de Páginas sobre Saúde
Sistema de Recomendação de Páginas sobre SaúdeSistema de Recomendação de Páginas sobre Saúde
Sistema de Recomendação de Páginas sobre SaúdeMauricio Volkweis Astiazara
 
Sistema de Recomendação de Páginas sobre Saúde
Sistema de Recomendação de Páginas sobre SaúdeSistema de Recomendação de Páginas sobre Saúde
Sistema de Recomendação de Páginas sobre SaúdeMauricio Volkweis Astiazara
 

Mais de Mauricio Volkweis Astiazara (20)

Como Programar Melhor em Java
Como Programar Melhor em JavaComo Programar Melhor em Java
Como Programar Melhor em Java
 
Sistemas Imunológicos Artificiais
Sistemas Imunológicos ArtificiaisSistemas Imunológicos Artificiais
Sistemas Imunológicos Artificiais
 
Sistema Imunológico Artificial para Predição de Fraudes e Furtos de Energia E...
Sistema Imunológico Artificial para Predição de Fraudes e Furtos de Energia E...Sistema Imunológico Artificial para Predição de Fraudes e Furtos de Energia E...
Sistema Imunológico Artificial para Predição de Fraudes e Furtos de Energia E...
 
Sistema Imunológico Artificial para Predição de Fraudes e Furtos de Energia E...
Sistema Imunológico Artificial para Predição de Fraudes e Furtos de Energia E...Sistema Imunológico Artificial para Predição de Fraudes e Furtos de Energia E...
Sistema Imunológico Artificial para Predição de Fraudes e Furtos de Energia E...
 
Comparação de Algoritmos Baseados em Q-Learning
Comparação de Algoritmos Baseados em Q-LearningComparação de Algoritmos Baseados em Q-Learning
Comparação de Algoritmos Baseados em Q-Learning
 
Visão Computacional
Visão ComputacionalVisão Computacional
Visão Computacional
 
Sistema de Recomendação de Páginas sobre Saúde
Sistema de Recomendação de Páginas sobre SaúdeSistema de Recomendação de Páginas sobre Saúde
Sistema de Recomendação de Páginas sobre Saúde
 
Sistema de Recomendação de Páginas sobre Saúde
Sistema de Recomendação de Páginas sobre SaúdeSistema de Recomendação de Páginas sobre Saúde
Sistema de Recomendação de Páginas sobre Saúde
 
Processamento de Imagens
Processamento de ImagensProcessamento de Imagens
Processamento de Imagens
 
Percepção, Movimento e Ação
Percepção, Movimento e AçãoPercepção, Movimento e Ação
Percepção, Movimento e Ação
 
Memória e Aprendizagem
Memória e AprendizagemMemória e Aprendizagem
Memória e Aprendizagem
 
Gerência de Requisitos
Gerência de RequisitosGerência de Requisitos
Gerência de Requisitos
 
Testes de Sistema
Testes de SistemaTestes de Sistema
Testes de Sistema
 
Telefonia Móvel
Telefonia MóvelTelefonia Móvel
Telefonia Móvel
 
Telefonia Móvel
Telefonia MóvelTelefonia Móvel
Telefonia Móvel
 
Realidade Virtual
Realidade VirtualRealidade Virtual
Realidade Virtual
 
Protótipo de Simulador de Elevadores
Protótipo de Simulador de ElevadoresProtótipo de Simulador de Elevadores
Protótipo de Simulador de Elevadores
 
Protótipo de Simulador de Elevadores
Protótipo de Simulador de ElevadoresProtótipo de Simulador de Elevadores
Protótipo de Simulador de Elevadores
 
Planejamento de Informática
Planejamento de InformáticaPlanejamento de Informática
Planejamento de Informática
 
Planejamento de Informática
Planejamento de InformáticaPlanejamento de Informática
Planejamento de Informática
 

Classificador de Documentos Naïve Bayes

  • 1. Universidade Federal do Rio Grande do Sul - UFRGS Programa de Pós-Graduação em Computação Mestrado em Ciência da Computação Disciplina: Aprendizagem de Máquina Professor: Paulo Engel Aluno: Mauricio Volkweis Astiazara Classificador de Documentos Naïve Bayes Este trabalho irá aplicar o método estatístico de classificador bayesiano ingênuo (naïve bayes) na classificação de documentos por assunto. O objetivo é verificar a eficácia do método através da prática, embora ele possua relaxamentos em relação ao classificador bayesiano ótimo. Os documentos serão páginas web, focadas em determinado assunto. As páginas são lidas on-line e sumarizadas pelos totais de ocorrências de cada palavra única no texto. Os documento podem ou não ser classificadas pelo usuário. Os documentos classificados pelo usuário serão utilizados para treinamento da aplicação. Depois do treinamento, a aplicação poderá classificar automaticamente novos documentos adquiridos. Devido à necessidade de realização de contagens, totalizações e outros dados estatísticos, foi adotado o uso de um banco de dados relacionais para armazenar os dados da aplicação, como por exemplo, os dados dos documento adquiridos. Os bancos de dados relacionais são baseados na teoria dos conjuntos e geram facilmente este tipo de informação. Além disso são mais escalonáveis e robustos em relação ao uso de arquivos texto. O banco de dados utilizado foi o MySQL da Sun Microsystems. Optou-se pela implementação na linguagem de programação C-Sharp. Ela possui uma sintaxe semelhante às linguagens Java e C++. Inicialmente foi realizada uma modelagem conceitual da aplicação com o objetivo de levantar quais a entidades necessárias para a implementação. O diagrama de classes abaixo o resultado desta modelagem. A notação utilizada é a UML.
  • 2. A tarefa de treinamento foi implementada utilizando-se parte do processamento no banco de dados e parte no programa. Abaixo está o código-fonte que calcula a probabilidade a priori e a verossimilhança para uma determinada classe. private void CalcularProbabilidadeAPriori() { string sql; sql = "select " + "(select count(*) from documento where classificacao = ?p1)" + " / (select count(*) from documento)"; _probabilidadeAPriori = Convert.ToDouble( Sistema.Instancia.Conexao.ExecutarScalar(sql, _id)); sql = "update classificacao set probabilidade_a_priori = ?p1 where id = ?p2"; Sistema.Instancia.Conexao.ExecutarSemRetorno(sql, _probabilidadeAPriori, _id); } private void CalcularProbabilidadeDasPalavras() { string sql; sql = "delete from palavra_de_classificacao where classificacao = ?p1"; Sistema.Instancia.Conexao.ExecutarSemRetorno(sql, _id); double n; sql = "select count(palavra) " + "from v_palavra_por_classificacao " + "where classificacao = ?p1"; n = Convert.ToDouble( Sistema.Instancia.Conexao.ExecutarScalar(sql, _id)); double vocabulary; sql = "select count(*) from v_palavra_classificada"; vocabulary = Convert.ToDouble( Sistema.Instancia.Conexao.ExecutarScalar(sql)); double total = n + vocabulary; sql = "insert into palavra_de_classificacao " + "(classificacao, palavra, ocorrencias, verossimilhanca) " + "select classificacao.id, v_palavra_classificada.palavra, " + "coalesce(v_palavra_por_classificacao.ocorrencias, 0) as ocorrencias, " + "coalesce(v_palavra_por_classificacao.ocorrencias, 1) / ?p1 " + "from v_palavra_classificada " + "inner join classificacao " + "left outer join v_palavra_por_classificacao " + "on v_palavra_por_classificacao.palavra = v_palavra_classificada.palavra " + "and v_palavra_por_classificacao.classificacao = classificacao.id " + "where classificacao.id = ?p2"; Sistema.Instancia.Conexao.ExecutarSemRetorno(sql, total, _id); } A função que classifica um documento não faz uso intenso do banco de dados, sendo a maior parte do processamento realizado no programa. Na primeira versão ocorreu um problema devido a representação de números muito próximos a zero, que a partir de determinado valor eram transformados em zero, levando a resultados errôneos. Posteriormente isto foi solucionado pela substituição das multiplicações das probabilidades pela soma dos logaritmos das probabilidades. Abaixo está o código-fonte da função que indica “o quanto” um documento pertence a determinada classe.
  • 3. public double Classificar(Documento pDocumento) { double probabilidade = 0; PalavraDeClassificacao palavraDeClassificacao = new PalavraDeClassificacao(this); foreach (PalavraDeDocumento palavraDeDocumento in pDocumento.Palavras) { if (palavraDeClassificacao.Buscar(palavraDeDocumento.Palavra)) { probabilidade = probabilidade + Math.Log(palavraDeClassificacao.Verossimilhanca); } } probabilidade = Math.Log(this.ProbabilidadeAPriori) + probabilidade; return probabilidade; } Para utilização da aplicação foram cadastradas duas classificações alvo: “Algoritmos Genéticos” e “Redes Neurais Artificiais”. Também foi cadastrada uma classificação “Outros” para ser aplicada a qualquer documento que não fosse das classificações alvo. Adquiriu-se então da Internet, 20 documentos cujo assunto é Algoritmos Genéticos e 20 sobre Redes Neurais Artificiais e 30 de outros assuntos. Todos estes 70 documentos foram classificados manualmente para então serem usados como dados de treinamento. Após essa tarefa, foi executada a rotina de treinamento. Para testar a classificação automática da aplicação, mais cinco documentos foram adquiridos, mas não receberam classificação manual. Destes documentos, dois eram sobre Algoritmos Genéticos e dois sobre Redes Neurais Artificiais. Também foi adquirido um documento que é uma notícia do canal de TV BBC. O objetivo era verificar se a aplicação além de classificar corretamente os documentos das classes alvo, perceberia que um documento não é de nenhuma das classes de interesse. O método funcionou corretamente em todos os dados de teste, verificando que apesar dos relaxamentos que o naïve bayes utiliza, ainda assim possui uma boa eficácia.