Faltam seis coisas no relatório: 1. Resultados obtidos (motivos óbvios) 2. Listagem do código fonte (para manter o arquivo pequeno) 3. Figuras (para manter o arquivo pequeno - já estão prontas!) 4. Formatação (índice, numeração de páginas etc.) 5. Organizar e completar a bibliografia (tá uma zona!) 6. Escolher um nome para a danada da ferramenta! Todos esses itens podem ser facilmente “consertados”. O principal é que parte escrita esteja boa. Se esse for o caso, podemos complementar o relatório e entregar uma versão definitiva segunda-feira ou terça-feira, fazendo as alterações necessárias e enchendo de fru-fru... QUANTO VALE O SHOW?! RESUMO Atualmente a Internet é um dos meios mais rápidos, práticos e baratos de disseminação de conhecimento. Pessoas do mundo inteiro usam o computador para se comunicar e pesquisar sobre assuntos de seu interesse. Pensando nessas pessoas, desenvolvemos nosso projeto, que consiste de dois módulos fundamentais. O primeiro módulo tem a finalidade de auxiliar em pesquisas comuns usando a Internet. Ele atua como um filtro que elimina referências a páginas não existentes ou que o conteúdo não seja adequado aos objetivos do usuário. Serve para que ele poupe o seu tempo, e obtenha mais sucesso do que se fizesse uma busca usando ferramentas de busca num browser qualquer. Ele possui ainda um recurso auxiliar, que lhe permite criar automaticamente novas listas de palavras relacionadas com qualquer assunto e dessa forma auxilia o usuário, que precisará usar menos do seu bom senso na hora de escolher palavras para uma nova busca. O segundo módulo facilita a vida do usuário de programas de e-mail, pois permite que este organize suas mensagens numa hierarquia de pastas, através da análise do conteúdo de cada mensagem. Isto é muito útil devido ao grande aumento de mensagens eletrônicas que circulam pela rede diariamente (muitas delas conhecidas como spam ou então por mala direta). O usuário comum é bombardeado por mensagens que não são de seu interesse, algumas delas possuindo conteúdo impróprio e às vezes até mesmo pornográfico. Através deste módulo, o usuário terá um maior controle sobre as mensagens que recebe. 1. Introdução 1.1. Motivação 1.2. Objetivos 1.3. Resumo do trabalho 1.4. Contribuições 1.5. Organização 2. Revisão bibliográfica 2.1. Terminologia utilizada 2.2. Abordagens possíveis 2.3. O problema e a solução adotada 3. A ferramenta XXX 3.1. Módulo de busca na Internet 3.2. Módulo de e-mails 3.3. Escolha dos parâmetros utilizados 3.4. Decisões de projeto 3.5. Método de codificação 3.6. Linguagem utilizada 3.7. Implementação 4. Utilização da ferramenta 5. Resultados obtidos 6. Conclusão e trabalhos futuros 7. Referências bibliográficas 8. Apêndice 1. Introdução 1.1. Motivação A Internet foi criada inicialmente pelo exército americano, que na época estava interessado em criar uma rede que fosse capaz de continuar operando mesmo que parte de suas conexões deixassem de funcionar (chamada na época pelo nome de Arpanet). Com o passar dos anos, universidades americanas tiveram interesse em integrar a rede. Mais tarde ainda, foi a vez da iniciativa privada. Atualmente, bilhões de pessoas têm acesso a rede, totalizando uma quase infinidade de páginas de conteúdo disponíveis para seus usuários. Esse crescimento justificou o aparecimento de ferramentas de busca para facilitar a vida do usuário comum, interessado apenas em fazer uma procura por determinado assunto. Essas ferramentas são na verdade sites que possuem grandes bancos de dados, contendo referências para inúmeras páginas, que vão sendo cadastradas com o passar do tempo. Cada página cadastrada possui um conjunto de palavras-chaves, que serão usadas para retornar o endereço (URL) da mesma, quando um usuário fizer uma busca usando uma destas palavras. Uma vez cadastrada, a referência da página pode permanecer no banco de dados por um longo tempo, dependendo da política adotada pelo banco. Esse cadastro é na maior parte das vezes feito pelo usuário que está interessado em disponibilizar o conteúdo de sua página na rede. Passado algum tempo, a página é reeditada por seu dono, e seu conteúdo é modificado. O conjunto de palavras-chaves que foi cadastrado na ferramenta na ocasião fica desatualizado. Dessa forma, buscas futuras que forem feitas usando estas palavras retornarão um endereço a mais na relação de páginas encontradas, sendo que esta página não é mais interessante para a pessoa que faz a pesquisa na ferramenta. Isto também acontece quando a página não se encontra mais no endereço ao qual foi cadastrada, caracterizando um “broken link”. Apesar do surgimento de mecanismos como as ferramentas de busca, cada vez mais a Internet cresce de tamanho. O usuário comum, perde cada vez mais do seu curto tempo livre, para pesquisar algum assunto. Ele acaba por ser sobrecarregado com informações que não lhe interessam. Isso hoje em dia é quase inadmissível, pois no corre-corre do dia-a-dia e na pressão e concorrência do mundo contemporâneo, fica mais difícil arranjar tempo para esse tipo de pesquisa, geralmente longa e em muitos casos infrutífera. Em conseqüência disso, a sociedade científica é cada vez mais pressionada a inventar novos meios e métodos para restringir buscas na rede. Algumas promessas têm sido técnicas de Data Mining [x1], o desenvolvimento de agentes inteligentes (Intelligent Agents) usando técnicas de aprendizagem de contextos [x2], ambos atuando em uma base de dados textual. Enquanto algumas dessas opções não se tornam comercialmente disponíveis, outros esforços vão sendo feitos para obter uma solução para este grande problema. Uma das principais motivações de nosso projeto final é disponibilizar ao usuário comum uma interface que lhe permita fazer uma pesquisa na Internet, rodando em “background”. Dessa forma, o usuário destinaria seu tempo a tarefas mais úteis, enquanto o programa faz a filtragem de inúmeras páginas que não seriam de seu interesse. Mais tarde, com a pesquisa terminada, ele só teria o trabalho de observar um menor número de páginas, não perdendo horas e horas do seu precioso tempo. 1.2. Objetivos Tornar a busca de informações na grande rede mundial de computadores mais dinâmica e eficiente, poupando principalmente o tempo do usuário, que atualmente é tão precioso. Além disso, reduzir a frustração gerada por buscas infrutíferas, repletas de contextos inadequados à intenção inicial do usuário. Devido ao grande volume de mensagens eletrônicas que um usuário recebe, que tende só a aumentar com o passar do tempo, surge a necessidade de um mecanismo mais inteligente para gerência e controle de e-mails. 1.3. Resumo do trabalho Durante a nossa vida como usuários de microcomputadores e em especial da Internet, sentíamos falta de uma ferramenta de busca que pudesse nos retornar um número menor e mais interessante de páginas quando executávamos uma busca. Precisávamos de um filtro mais inteligente, que pudesse refinar os resultados da busca. O mesmo podemos dizer dos diversos programas de e-mail que conhecemos. Ficávamos profundamente incomodados ao receber diversos e-mails que não nos interessavam e não ter como verificar tal fato sem lê-los, ou simplesmente não ter como dividir melhor as mensagens em diversas pastas por um meio mais eficiente do que meramente baseados no endereço eletrônico de quem nos enviou a mensagem. Por isso resolvemos abordar em nosso projeto final justamente esses dois temas, uma ferramenta de busca e um gerenciador de e-mails que sejam capazes de gerar melhores resultados para os muitos usuários da grande rede mundial de computadores. Temas simples, mas que confiamos que possam ser úteis para os diversos usuários comuns ou científicos da Internet, assim como o foi para nós a ponto de ser motivação para o nosso projeto final de curso. 1.4. Contribuições O nosso projeto apresenta uma ferramenta que se propõe a resolver os problemas mencionados anteriormente. No módulo de nossa ferramenta destinado a busca na Internet, criamos uma camada de software no cliente capaz de receber conteúdo de páginas que foram referenciadas por uma determinada ferramenta de busca, cujos parâmetros são alteráveis para gerar diferentes resultados de acordo com as necessidades. Além disso o programa é capaz de filtrar as páginas resultantes da busca, usando um método que criamos especificamente para este fim. O módulo de nossa ferramenta destinado ao gerenciamento de mensagens eletrônicas implementa uma forma bem simples e prática de manter uma hierarquia por intermédio de palavras-chaves que são buscadas nos diversos campos das mensagens. Para isso, compomos duas camadas: uma implementa um protocolo “pop” para recebimento de e-mails do servidor e a outra é o programa de e-mail em si. Em ambas tivemos que partir do zero. 1.5. Organização Os próximos capítulos do relatório estão divididos da seguinte forma: o capítulo 2 é uma revisão bibliográfica, onde pode-se ler a respeito da terminologia usada no relatório. Ainda no capítulo 2, são apresentadas as abordagens possíveis para se chegar aos objetivos do projeto, suas vantagens e desvantagens e a solução adotada no projeto. O capítulo 3 contém uma análise mais profunda da ferramenta desenvolvida, com a descrição detalhada de seus dois módulos, o motivo de cada parâmetro adotado e algumas decisões que tiveram que ser tomadas no decorrer do desenvolvimento do projeto. Além disso, o método de codificação adotado, a linguagem de programação utilizada e as estruturas usadas na implementação da ferramenta também são apresentados no capítulo 3. No capítulo 4 há uma descrição sucinta de como a ferramenta XXX deve ser utilizada. No capítulo 5 são apresentados os resultados obtidos através dos testes experimentais realizados com a ferramenta. As conclusões sobre o projeto e idéias para trabalhos futuros são apresentadas no capítulo 6. O capítulo 7 contém todas as referências bibliográficas utilizadas no projeto. Por fim, no apêndice, capítulo 8, está listado o código fonte do programa. 2. Revisão bibliográfica 2.1. Terminologia utilizada A linguagem de programação JAVA Terminologia usada tanto para referenciar a linguagem de programação quanto a plataforma de desenvolvimento. A linguagem de programação JAVA é uma linguagem de alto nível que pode ser caracterizada por ser simples, independente de arquitetura, orientada a objetos, portável, distribuída, interpretada, robusta, dinâmica, segura e que suporta threads [x9]. Um código fonte feito em JAVA é compilado uma única vez, quando ocorre a criação dos “bytecodes” JAVA. Esse código gerado é independente de plataforma, ou melhor, será interpretado (Figura x1) em plataformas diferentes por um programa chamado de máquina virtual (JVM), cuja implementação varia de plataforma para plataforma. Dessa forma, tais “bytecodes” podem ser interpretados em sistemas operacionais diferentes, o que caracteriza sua portabilidade, já que não é necessário recompilá-los de máquina para máquina (Figura x2). Figura x1 Figura x2 Por ser um ambiente independente de plataforma, um programa feito em JAVA tende a ser mais lento que um feito em código nativo, que é compilado unicamente para uma determinada plataforma. Entretanto, com a melhoria gradual dos compiladores, a performance do programa feito em JAVA está tendendo a ser cada vez mais parecida com a de um programa em código nativo, sem comprometer a portabilidade que se queria manter. Internet A Internet é uma coleção muito grande de documentos heterogêneos. Páginas da Internet são documentos típicos distintos em bancos de dados tradicionais. As páginas podem ser ativas (por exemplo, animações, JAVA), podem ser automaticamente geradas em tempo real (por exemplo, preços de estoque atual) e podem conter multimídia (por exemplo, som, vídeo). Os autores de páginas da Internet têm conhecimentos, culturas e objetivos bem diversos. A Internet cresceu rapidamente desde seu início em dezembro de 1969. A Internet representa um progresso significante na recuperação e disseminação de informações e para o avanço da educação. Com a introdução de ferramentas de busca, tais como “AltaVista” (www.altavista.com), (www.excite.com), “HotBot” “Infoseek” (www.hotbot.com), (www.infoseek.com), “Google” “Excite” (www.google.com), “Lycos” (www.lycos.com) e “Northern Light” (www.nlsearch.com), a Internet pode ser vista como uma enciclopédia de busca de 15 bilhões de palavras [x10]. Ferramentas de busca Serviço oferecido por servidores na Internet, que mantém um banco de dados de referências de inúmeras páginas que são cadastradas diariamente. Pode-se fazer uma pesquisa nesse banco de dados, através da entrada de palavras feita pelo usuário numa página hipertexto. As maiores companhias de ferramentas de busca freqüentemente clamam que podem indexar quase a Internet inteira, a medida que esta cresce. Entretanto, a Internet é uma fonte de informação distribuída, dinâmica e que cresce rapidamente, apresentando dificuldades para tecnologias tradicionais de recuperação de informação. Sistemas tradicionais de recuperação de informação foram projetados para diferentes ambientes e têm sido tipicamente usados para indexar uma coleção estática de documentos diretamente acessíveis. A figura 1 mostra a arquitetura de ferramentas de busca típicas. A informação desejada pelo usuário é transformada em uma consulta. A consulta é aplicada a um banco de dados local de páginas da Internet e os resultados são ordenados e mostrados ao usuário. FIGURA 1 As ferramentas de busca percorrem a Internet, baixando e indexando páginas para permitir a busca em textos inteiros. Existem muitas ferramentas de busca de propósito geral, infelizmente nenhuma delas chega perto de indexar toda a Internet. Existem também milhares de serviços de busca especializados que indexam conteúdo específico ou sites específicos. A grande variabilidade dos serviços de busca disponíveis levou ao surgimento de ferramentas de metabusca. Ferramentas de metabusca Uma ferramenta de metabusca provê uma interface única para múltiplas ferramentas de busca e combina os resultados em uma única lista unificada. Ferramentas de metabusca podem ter grande dificuldade em determinar documentos úteis, devido a variabilidade e carência de informação conhecida sobre as ferramentas de busca individualmente. Por exemplo, se uma ferramenta de busca retorna muitos resultados irrelevantes, uma ferramenta de metabusca pode não ter como evitar esses resultados. Algumas ferramentas de metabusca populares incluem MetaCrawler (www.metacrawler.com) e SavvySearch (www.savvysearch.com). A figura 2 mostra a arquitetura de uma ferramenta de metabusca típica. Uma ferramenta de metabusca não tem um banco de dados local e confia em outras fontes (outras ferramentas de busca), como é mostrado na figura. Os resultados retornados pelas outras fontes são combinados e então mostrados ao usuário. FIGURA 2 MODIFICADA Outras definições URL (Uniform Resource Locator): Localizador Uniforme de Recursos, denominação usada para representar um endereço de documento na Internet. Broken link: termo usado para uma URL que não é válida, ou seja, o documento não existe mais naquele endereço. HTML (HyperText Markup Language): código de linguagem para veicular textos e imagens na Internet (documento hipertexto), linguagem usada para escrever páginas na Internet. Tags: comandos de html. Home page: página pessoal na Internet, documento hipertexto na Internet dedicado a um certo tema, a uma empresa ou a uma certa pessoa. Bandwidth: largura de banda, quantidade máxima de informação que pode trafegar através de um canal de transmissão. API (Application Programming Interface): nome dado para uma coleção de componentes prontos para uso, ou seja, é uma biblioteca com várias classes. Time out: tempo onde o computador tenta se conectar a um dispositivo ou a um outro computador distante mas não consegue. Neste projeto é o tempo limite que nosso programa tem para receber uma página de um servidor qualquer, sendo que quando este limite é atingido, o programa desiste da página. Background: termo utilizado para indicar que determinado programa roda sem precisar da interação com o usuário, ou então roda em menor prioridade que outros programas. 2.2. Abordagens possíveis Dado a que a cobertura de qualquer uma das ferramentas de busca é limitada, o meio mais simples de melhorar a cobertura de ferramentas de busca na Internet é combinar os resultados de múltiplas ferramentas, como é feito com ferramentas de metabusca tais como “MetaCrawler” (www.metacrawler.com). Outra alternativa é combinar fontes de informação disponíveis tais como as ferramentas de busca maiores com busca “online” automatizada. Um exemplo é o Internet “softbot” [x11]. O “softbot” transforma consultas em metas e usa um algoritmo de “planning” [x12] para gerar uma seqüência de ações a fim de satisfazer a meta. O “planner” tem extenso conhecimento das fontes de informação que ele acessa. Um “softbot” de sucesso é o serviço AHOY! [x13], que localiza “home pages”. Em um estudo onde foram baixadas “home pages” de 582 pesquisadores, o AHOY! localizou mais páginas do que o “MetaCrawler” (que localizou mais “home pages” que o “HotBot” ou “AltaVista”), o que melhorou muito a precisão [x14]. Outra possibilidade para melhorar a busca para grupos específicos de usuários é a criação de uma ferramenta de busca projetada para manter atualizados os índices das páginas que são importantes para tais grupos. “Crawlers” focalizados [x15] auxiliam na busca e recuperação de dados somente no subconjunto da Internet que pertence a um específico tópico de relevância. O “crawler” focalizado ideal recupera o conjunto mínimo de páginas relevantes, enquanto simultaneamente atravessa o número mínimo de documentos irrelevantes na Internet. “Crawlers” focalizados são bem adequados para gerar eficientemente índices para ferramentas de busca especializadas, onde há “bandwidth” e espaço limitados. Devido aos recursos limitados usados por um bom “crawler” focalizado, usuários já usam implementações pessoais para PC. “Crawlers” focalizados simples podem se tornar o método de escolha para usuários fazerem buscas compreensíveis de assuntos na web. Embora promissor, a tecnologia que suporta “crawling” focalizado ainda está engatinhando. O maior problema em “crawling” focalizado é atribuir maior prioridade a rotas de busca que fornecem documentos altamente relevantes. Na ausência de uma estratégia de atribuição de prioridade confiável, “crawlers” focalizados sofrem com a habilidade limitada de sacrificar a recuperação de documentos menos importantes com o intuito de conseguir uma melhor performance geral. Em particular, os “crawlers” existentes ainda não possuem estratégias de aprendizado onde documentos relevantes são encontrados seguindo páginas irrelevantes. Usando ferramentas de busca, uma forma de aumentar o número de resultados relevantes a uma específica necessidade é fazer modificações na consulta. Existem três tipos de modificações na consulta usadas: utilização de opções específicas da ferramenta de busca, adicionar termos ao início da consulta ou adicionar termos ao final da consulta [x16]. Além disso, mais de uma consulta modificada pode ser feita a uma dada ferramenta de busca. 2.3. O problema e a solução adotada O tamanho da Internet publicamente indexável provavelmente já ultrapassou um bilhão de documentos [x17] e continua crescendo, não mostrando sinal de que irá se estabilizar. O conteúdo dinâmico na Internet está também crescendo, com assuntos sensíveis ao tempo, tais como notícias, dados financeiros, entretenimento e catálogos que se tornaram largamente disseminados através da rede. As ferramentas de busca estão aumentando cada vez mais seus esforços para tentar manter seus índices atualizados, mas até mesmo usando sistemas magníficos, tais como o “Scooter” do “AltaVista” [x18], que pesquisa dez milhões de páginas por dia, não se consegue sucesso nessa tarefa. É por isso que as ferramentas de busca podem retornar (e freqüentemente retornam) documentos que não contém os termos de consulta. Este comportamento pode ocorrer por vários motivos: A tecnologia de recuperação de informação usada pela ferramenta pode não requerer exatidão em relação aos termos da consulta, podendo retornar documentos com palavras relacionadas. Os documentos podem não existir mais. Os documentos podem ainda existir, mas podem ter mudado e não contém mais os termos da consulta. Como conseqüência disso, quando faz uma busca na Internet, um usuário pode ser afogado por milhares de resultados gerados por uma ferramenta de busca, pouco dos quais são úteis. Para sanar esse problema, desenvolvemos um filtro capaz de verificar a validade dos resultados obtidos, através da busca em cada página pelos termos da consulta e por palavras adicionais que ajudam a identificar o contexto associado. Uma vez que esse problema foi resolvido, voltamos nossa atenção para o problema da cobertura das ferramentas de busca. As coberturas das maiores ferramentas de busca da Internet foram analisadas, fornecendo alguns resultados surpreendentes. A cobertura de qualquer ferramenta é significantemente limitada: nenhuma ferramenta indexa mais que um terço da Internet indexável. A cobertura de seis ferramentas investigadas varia em ordem de magnitude e combinando os resultados das seis ferramentas forneceu cerca de 3,5 vezes mais documentos na média quando comparado com os resultados de uma única ferramenta [x18]. Sendo assim, decidimos implementar uma ferramenta de metabusca que se utilizasse de mais de uma ferramenta de busca para obter seus resultados. Foi então que nos deparamos com outro problema: quantas ferramentas de busca utilizar e, o que é mais importante, quais? O que se percebe usando a maioria das ferramentas de busca mais famosas é que elas indexam aproximadamente os mesmos documentos e que elas indexam uma porção relativamente grande da Internet. FIGURA (TABELA) Assumimos que as ferramentas de busca não obtêm amostras da Internet independentemente quando elas escolhem páginas para indexar. Cada ferramenta de busca permite que usuários registrem suas páginas na ferramenta e é razoável assumir que muitos usuários registram suas páginas em muitas das ferramentas. Portanto, as páginas indexadas por cada ferramenta serão parcialmente dependentes. Uma segunda fonte de dependência estatística entre a amostragem feita por cada ferramenta vem do fato de que ferramentas de busca são tipicamente induzidas a indexar as páginas mais populares. É razoável esperar que as ferramentas maiores tenham menor dependência porque elas podem indexar mais páginas além das que os usuários registram e podem indexar uma quantidade maior das páginas menos populares da web. Foi por causa dessa dependência existente entre as ferramentas de busca que optamos por utilizar apenas duas delas em nosso projeto: o AltaVista e o Google. A escolha do AltaVista foi feita baseada em seu tamanho, pois atualmente ela é uma das ferramentas de busca com maior cobertura da Internet. O Google foi escolhido devido ao fato de que é uma ferramenta de busca voltada em grande parte para o meio científico. Com relação à possibilidade de fazer mudanças na consulta do usuário, deixamos essa opção nas mãos do próprio usuário, que com nossa ferramenta pode gerar listas de palavras relacionas aos termos de sua consulta, podendo incrementar sua busca com uma ou mais palavras sugeridas, se assim desejar. Quanto aos problemas que o módulo de e-mail se propõe a solucionar, a definição de pastas e subpastas com palavras-chaves associadas a elas é a abordagem que parece mais simples e sensata, resolvendo os problemas de forma satisfatória. Uma das únicas coisas que tivemos que decidir foi o que seria feito caso uma mensagem contivesse palavras-chaves associadas a mais de uma pasta. Decidimos que a mensagem deveria ser replicada, para evitar que ela fosse encaminhada à pasta menos adequada. A possibilidade de realizar o processamento das mensagens no servidor foi cogitada. Isso evitaria o fluxo de mensagens inúteis para o cliente, mas implicaria em alterar o programa de redistribuição de e-mails que o servidor utiliza (impraticável de ser implementado). 3. A ferramenta XXX Implementamos nossa ferramenta em dois módulos. O primeiro módulo é utilizado para que o usuário possa fazer uma busca na Internet de forma mais eficiente e rápida e o segundo módulo permite que o usuário processe e-mails de forma mais eficiente, descartando mensagens indesejáveis. 3.1. Módulo de busca na Internet No momento em que for fazer uma busca, o usuário escolhe uma lista de palavras que representa um assunto do qual se trata a busca. Dessa lista de palavras seleciona-se um grupo de palavras obrigatórias e um grupo de palavras opcionais na busca. As palavras obrigatórias são palavras que devem necessariamente aparecer nas páginas resultantes da busca. As palavras opcionais podem aparecer no resultado da busca ou não, sendo que a quantidade de palavras opcionais que devem aparecer nas páginas resultantes é determinada por um parâmetro fornecido pelo usuário. Depois de determinadas as palavras obrigatórias, as palavras opcionais e a quantidade de palavras opcionais que devem aparecer no resultado, o apertar de um simples botão dá início ao processo de busca. Com as palavras obrigatórias, montam-se as URLs das páginas que seriam geradas pelas ferramentas de busca selecionadas, caso fossem usadas numa busca usando um browser. Tais páginas contêm as listas de endereços fornecidas pelas ferramentas de busca. Tendo essas páginas em mãos, elas devem ser analisadas a fim de se obter uma lista contendo apenas as URLs das páginas que supostamente são resultados da busca. Com cada uma das URLs dessa lista, baixa-se a página da Internet correspondente e então é feita uma busca pelas palavras obrigatórias e opcionais. Se a página contiver todas as palavras obrigatórias e pelo menos a quantidade especificada de palavras opcionais então ela é considerada boa e gravada em disco (uma versão contendo somente texto, sem imagens). Caso a página não atenda às condições ela é imediatamente descartada. Uma página também pode ser descartada por “time out”, ou se for um “broken link”, ou se seu tamanho exceder um determinado limite pré-estabelecido. O descarte por “broken link” é obviamente necessário, pois a página na realidade não existe mais. O descarte por “time out” é necessário para evitar que um servidor que não responde prenda o processamento eternamente, fazendo o programa travar. O descarte por tamanho da página existe para evitar que se perca tempo baixando uma página de tamanho exorbitante e que não tenha conteúdo que valha o sacrifício. Em geral, páginas de hipertexto não ocupam muito espaço, de modo que se alguma ocupar mais que um tamanho determinado, então provavelmente trata-se de um banco de informações e não tem especificidade sobre o assunto que se busca, tornando a página descartável. Tendo uma lista de páginas já processadas e aceitas, o programa cria uma página em hipertexto contendo todos os links para as páginas úteis e para suas cópias, que são mantidas localmente. Com essa página, o usuário pode acessar as cópias das páginas até mesmo off-line e se alguma delas contiver algum link para outro texto, arquivo ou figura que mereça ser verificado, o usuário pode se utilizar do endereço real da página. A vantagem de se utilizar este módulo é que numa pesquisa comum na Internet, o usuário precisaria estar o tempo todo interagindo com o browser, decidindo quais páginas são úteis a ele ou não. Usando o módulo de busca, essa tarefa é delegada ao computador que estiver executando o programa. Não é necessária a interação do usuário durante o processo. Cabe ao mesmo apenas definir os parâmetros da busca e esperar pelos resultados gerados. Para auxiliar na utilização do módulo de busca, foi desenvolvido um criador automático de assunto que tem como finalidade definir um conjunto de palavras que possam ter relação com assunto determinado pelo usuário. Para utilizar o criador automático de assunto, o usuário entra com as palavras determinantes de um novo assunto e aperta o botão “Criar Assunto”. Após alguns minutos, o programa exibe a lista de palavras associadas ao assunto. As palavras que na realidade não corresponderem ao assunto especificado podem ser retiradas do conjunto. As palavras que não definem nenhum tipo de assunto em especial (pronomes, conjunções, etc.) podem ser acrescentadas ao dicionário de palavras comuns, para que não apareçam mais em uma utilização posterior do programa. Então o usuário salva o assunto criado para que possa ser usado em uma busca. Após o usuário determinar uma ou mais palavras que definam o assunto, o programa gera uma lista de URLs de páginas relacionadas a essas palavras. Em seguida o conteúdo de cada uma das URLs é baixado. Como se tratam de documentos hipertexto (.html) é necessário que sejam extraídos os “tags” para que estes não influenciem na lista de palavras a ser gerado. Também são eliminados todos os caracteres não alfanuméricos, restando apenas uma seqüência de palavras separadas por espaço em branco. Essa seqüência de palavras é então quebrada, alimentando uma lista de palavras. Cada palavra é buscada no dicionário de palavras comuns. Caso seja encontrada, significa que se trata de uma palavra que não define nenhum tipo de assunto (preposições, artigos, etc.) e portanto não deve figurar entre as palavras resultantes. Caso contrário, se a palavra já apareceu antes em alguma outra página, sua freqüência anterior é incrementada, senão sua freqüência é igual a 1. Ao final do processamento de todas as palavras de todas as páginas, separam-se todas as palavras com freqüência maior ou igual a 50% do número de páginas analisadas. Tais palavras são apresentadas ao usuário como sugestões de palavras que possam fazer parte do assunto por ele definido. O criador automático de assunto tem a vantagem de retirar do usuário o encargo de pensar em palavras associadas a um assunto que possam ser usadas numa busca na Internet. 3.2. Módulo de e-mails Este módulo do programa tem como objetivo organizar os e-mails recebidos em pastas e subpastas de acordo com as palavras-chaves associadas a elas. Para receber mensagens e automaticamente armazená-las nas pastas adequadas basta apertar o botão “Receber e-mails”. Para se criar uma nova pasta deve ser escolhido um conjunto de palavras-chaves que a identifique. Cada uma das palavras-chaves não pode já estar associada a uma outra pasta e deve ser escolhida pelo menos uma palavra-chave. Para criar uma subpasta o procedimento é o mesmo, mas o conjunto de palavras-chaves escolhidas deve ser subconjunto do conjunto de palavras-chaves da pasta que contém a subpasta. As mensagens são copiadas do servidor de e-mail e depois cada uma delas é encaminhada à sua pasta correspondente. Para saber se uma mensagem deve entrar numa determinada pasta, pega-se o conjunto de palavras-chaves associado a pasta e faz-se uma busca na mensagem. Cada uma das palavras-chaves é procurada nos diversos campos da mensagem (“from”, “to”, “subject”, “date” e “body”). Caso pelo menos uma seja encontrada, a mensagem deve entrar na pasta (esquema “ou”). Se houver subpasta, deve-se verificar se a mensagem deve entrar em uma delas, caso contrário a mensagem permanece onde está. O método de busca utilizado para saber em que pasta a mensagem deve ser armazenada é o de busca em profundidade. Caso a mensagem não contenha nenhuma das palavras-chaves de nenhuma pasta, ela é armazenada na pasta “Inbox”. As vantagens deste módulo da ferramenta são: Facilita a priorização na leitura dos e-mails. Permite que se tenha um melhor controle das mensagens. Permite que se crie uma pasta “lixo” que, com um conjunto de palavras-chaves adequado, separa as mensagens indesejáveis das demais. Permite que se criem pastas para um ou mais remetentes específicos. Permite que se criem pastas sobre assuntos e subpastas sobre tópicos determinados. Permite que se criem pastas para mensagem recebidas numa determinada data. Elimina a necessidade de várias contas de e-mail com finalidades diferentes. 3.3. Escolha dos parâmetros utilizados No módulo de busca, na criação automática de um novo assunto, um dos parâmetros utilizados é a quantidade de vezes que uma palavra deve aparecer para ser considerada parte do assunto que está sendo criado. A princípio essa quantidade foi definida com valor de 50% do número de páginas analisadas (valor experimental com resultados satisfatórios), considerando-se que se uma palavra aparece em mais da metade das páginas em uma busca, provavelmente ela tem relação com o assunto do qual se trata a busca. Outro parâmetro importante é o número de links por ferramenta, que determina a quantidade limite de links úteis (processados e validados) que uma ferramenta pode guardar. Houve necessidade de adicionar outros parâmetros de corte. Um deles, que é o número de caracteres por página html, foi necessário devido ao excessivo tamanho de determinadas páginas. Outro parâmetro criado foi o limite de tempo para transmissão de determinada página html. Em alguns casos o módulo ficava esperando o servidor retornar uma página, travando o processo. Um dos motivos que nos forçou a não utilizar “threads” independentes para cada página a ser transmitida foi que a estrutura de dados compartilhada entre as “threads” só podia ser acessada por uma única “thread” em determinado momento. Dessa forma as “threads” entrariam numa fila de espera tendo quase a mesma performance caso fosse um processo único, senão pior devido a troca de contextos entre as “threads”. O número mínimo de palavras opcionais que uma página deve ter é um parâmetro escolhido pelo usuário na criação de uma lista de assunto. Uma página é considerada válida e útil caso ela tenha um número de palavras opcionais presentes no texto maior ou igual ao parâmetro pré-estabelecido. 3.4. Decisões de projeto Escolha dos algoritmos: No módulo de e-mail foi implementado o método de busca em profundidade para facilitar o encaminhamento das mensagens, uma vez que o conjunto de palavras-chaves de uma subpasta é subconjunto do conjunto de palavras-chaves da pasta que a contém. No módulo de busca fizemos uma pesquisa em algumas bibliotecas de classes do JAVA, e descobrimos que uma delas implementa o algoritmo Boyer-Moore para busca de palavras em texto [x4]. Sua performance era rápida o suficiente e ficamos satisfeitos com a escolha. Na criação automática de assunto o algoritmo para buscar uma palavra no dicionário de palavras comuns foi a busca binária, tendo como chave o valor comparativo entre caracteres alfanuméricos (string). Optamos porque era rápida a sua implementação e obtivemos resultados satisfatórios. Necessidade de uso de ferramentas de busca como base: Havia limitações de projeto. Tendo em vista, que não dispúnhamos de um banco de dados textual, muito menos de referências para páginas, assim como as ferramentas de busca o possuem, fomos obrigados a adicionar uma camada a mais de processamento. Não era possível para nós termos acesso direto ao banco, e acabamos, por falta de recursos, tendo que adotar essa escolha de projeto. De qualquer maneira, outras abordagens na literatura se utilizam de métodos baseados em metabusca como o nosso, para tornar buscas mais eficientes. Escolha das ferramentas de busca (AltaVista e Google): Em nossa opinião porque são as ferramentas de busca mais usadas da Internet, uma pelos usuários comuns e outra pelo meio científico. Dessa forma optamos por elas para criarmos um protótipo do módulo de busca. A idéia em si é simples e pode ser aplicada futuramente para outras ferramentas. Decisão de não implementar técnicas de “data mining” no cliente: Toda e qualquer técnica de “data mining” deve ser feita na base de origem dos dados ou melhor, quando feita, é feita no servidor. Além disso, essas técnicas são usadas para grande volume de dados e não é interessante para o cliente manter dados depois de suas buscas, já que seria um banco muito pequeno para ser usado como base em buscas futuras, sem falar que o usuário teria que manter esses dados em disco, o que seria inviável na prática, sem falar que se o servidor já faz o “data mining”, porque fazer isso no cliente de novo, se a diferença de um para outro será mínima, retornando praticamente o mesmo número de páginas. 3.5. Método de codificação A única política por nós utilizada de relevante importância foi o uso da Orientação a Objetos como metodologia de modelagem do projeto. O encapsulamento permitiu uma maior abstração e uma melhor visão do problema, e também permitiu que programadores diferentes trabalhassem em códigos distintos, evitando possíveis dependências entre os módulos, já que um podia contar com o serviço de uma classe que outro estava fazendo sem precisar necessariamente saber como ela estava sendo implementada. A programação orientada a objetos difere da programação estruturada tradicional principalmente porque ela coloca os dados e operações pertinentes a eles em uma simples estrutura de dados. Em programação estruturada, os dados e operações nos dados são separados e essa metodologia requer que sejam enviadas estruturas de dados a procedimentos e funções para operar nelas. A programação orientada a objetos resolve muitos dos problemas inerentes a esse projeto porque os atributos e operações são parte da mesma entidade. Isso modela melhor o mundo real, onde todos os objetos tem ambos, atributos e atividades, associados a eles. 3.6. Linguagem utilizada Por ser uma linguagem totalmente orientada a objetos (não permite programação estruturada), a linguagem JAVA nos leva naturalmente a programar usando orientação a objetos. Dessa forma, o código fica modularizado, permitindo assim um reuso futuro. Essa peculiaridade reduziu em muito o tempo gasto para a codificação do programa, já que utilizamos as mesmas classes em diversas partes do programa. Isso nos permitiu uma maior concentração em outros pontos importantes do projeto. Nosso objetivo é que o nosso projeto final possa contribuir para o maior número de pessoas e com o crescimento do sistema operacional Unix no meio empresarial, e sua forte presença no meio acadêmico, sendo usadas quaisquer uma de seus variantes, por exemplo o Solaris da Sun e o Linux para arquitetura PC, resolvemos utilizar como linguagem de programação o JAVA para tirarmos proveito de uma das suas principais características, ou seja, a portabilidade, isto é, podemos rodar um programa em JAVA sob qualquer ambiente (Windows [x5], Linux [x6], Solaris [x7], MacOS [x8] etc.), usando uma máquina virtual (JVM- Java Virtual Machine) da própria plataforma sem precisar compilar código (afinal de contas JAVA é interpretado pela própria máquina virtual; não precisando ser compilado em uma nova arquitetura que venha a ser usado) atingindo assim o objetivo de que o nosso projeto possa ser útil para diversas pessoas, tanto no meio acadêmico, empresarial e até mesmo doméstico. 3.7. Implementação Classes utilizadas: HtmRipper.java classe que processa uma página html gerada por uma ferramenta de busca, retornando URLs de páginas referentes a busca executada. HTM.java classe que encapsula o protocolo HTTP (Hypertext Transfer Protocol). Responsável pela transmissão de uma página html, retornando seu conteúdo. PastaEmails.java classe que define uma pasta no módulo e-mail FerramentaString.java responsável pela geração de um conjunto de caracteres alfanumérico (mais conhecido como String) que será usado para chamar o programa CGI que roda no servidor da ferramenta de busca. O resultado será um objeto da classe HTM, contendo referências da busca que foi feita. GeradorListaHttp.java classe principal do módulo de busca. Ela coordena o processo de transmissão de todas as páginas geradas pela busca. Ao final de sua execução, ou melhor, ao final da busca, grava em disco todas as páginas que foram úteis e cria um arquivo de índice (index.html). StringBusca.java classe que implementa a busca de palavras em um texto. RemovedorTags.java Remove tags de um documento hipertexto. Usado pela instância da classe CriadorAssunto, para evitar que palavras contidas nesses tags influenciem no resultado, adicionando palavras inúteis (que fazem parte das tags). ListaAssunto.java classe que mantém um grupo de palavras , associadas a determinado assunto, que o usuário cria. Essas palavras podem estar guardadas como simples (não é usada na busca, mas permanece na lista para futuro uso), obrigatórias e opcionais. Principal.java classe de interface. Uma instância dela representa a tela principal do módulo de busca. IntVector.java classe que estende (herança de objetos) a classe Vector da biblioteca JAVA.UTIL. Usada para guardar inteiros. FrameEdLista.java classe de interface, que representa a tela de edição do assunto do módulo busca. OrderedVector.java classe que estende a classe Vector, que mantém seus objetos (cada uma das células guarda um objeto) ordenados pelo valor numérico de uma string, que foi o tipo de objeto que resolvemos usar para guardar nesse vetor. Usada para serialização do objeto ListaAssunto criado pelo usuário (processo de armazenamento, vulgarmente conhecido como persistência, onde se guarda um objeto em disco, para uso posterior.) CriadorAssunto.java classe que cria um assunto (grupo de palavras) através do resultado de uma busca qualquer, usando palavras que foram freqüentemente encontradas nas páginas html. Arvore.java classe que faz a representação da estrutura de pastas no módulo e-mail. Serializador.java classe cuja instância serializa objetos em disco. AvaliadorPagina.java responsável por definir se uma página hipertexto é útil ou não, em função das palavras obrigatórias, opcionais e o número mínimo e distinto (só conta uma aparição de palavra por página) de ocorrências das palavras opcionais, independendo da combinação. PalavrasComuns.java classe que implementa o dicionário de palavras comuns, no módulo e-mail. FrameEmails.java classe de interface. Sua instância é a tela principal do módulo e-mail. MensagemReceiver.java classe que encapsula o protocolo pop3, para recepção de e-mails de um servidor pop. ArvoreModel.java classe que define um modelo para estrutura de árvore. ArvoreCellRenderer.java classe que desenha a estrutura de árvore num contexto gráfico. FrameNovaPasta.java classe de interface, para criação de nova pasta de e-mail. FrameAssuntoMagico.java classe de interface. Tela principal do criador de assunto. Email.java classe que define uma estrutura a ser utilizada para guardar e-mails. FrameNovaSubpasta.java classe de interface, para criação de nova subpasta de e-mail. DialogMelhorado.java classe de interface, que herda da classe Dialog, da biblioteca AWT (Abstract Window Toolkit, API de classes de interface gráficas, reconhecidas por sua portabilidade, podendo ser interpretadas em todas as máquinas virtuais Java que rodam em diferentes plataformas ou sistemas operacionais). Na verdade, esta classe serve para gerar mensagens para o usuário, numa janela, retornando o resultado para o programa, o que a classe pai não fazia. Celula.java classe cuja instância é uma única palavra de uma lista de assunto. Pode ser simples, obrigatória ou opcional. 4. Utilização da ferramenta Módulo de busca na Internet No menu principal, selecione “Lista de Assunto” e depois selecione “Nova”, “Editar” ou “Criação Automática”. FIGURA P1 Selecionando “Nova” no submenu, o usuário entra com um grupo de palavras que deseja buscar e tem a opção de escolher quais dessas palavras ele quer como obrigatórias, ou seja, que vão ter que estar presentes numa página para que essa seja retornada como resultado para o usuário e as opcionais, que como o próprio nome diz não precisam estar obrigatoriamente presentes na página, apenas uma quantidade delas, também estabelecida pelo usuário. O usuário também pode determinar em quais ferramentas de busca (AltaVista, Google, ou até mesmo as duas) a nossa ferramenta deve se basear para executar a busca. O usuário agora pode gravar as opções por ele escolhidas, o que é feito através do clique no botão “ok”, que abre uma janela para que seja escolhido o local e nome do arquivo a ser gravado. Ou pode ainda iniciar a busca, o que é feito pelo botão “Gerar HTML’s”. FIGURA P2 Após isso a busca é iniciada por uma das ferramentas escolhidas pelo usuário (ou até mesmo pelas duas, se for essa a escolha) usando como base aquelas palavras que o usuário selecionou como obrigatórias. Então a nossa ferramenta de busca pega os resultados retornados por essas outras ferramentas e utiliza as palavras opcionais como se fossem um filtro para essas páginas que foram geradas como resultado, da seguinte maneira: a nossa ferramenta busca a quantidade mínima de palavras opcionais que foi anteriormente definida pelo usuário nas páginas que foram retornadas como resultado pelas ferramentas de busca já utilizadas (AltaVista, Google ou ambas). Para que isso fique claro, vamos a um exemplo: suponhamos que o usuário definiu quatro palavras como opcionais e escolheu dois para o número mínimo de palavras opcionais que uma página útil deve conter. Isto quer dizer que, para que a página seja retornada para o usuário, ela tem que conter além das duas palavras obrigatórias outras duas palavras opcionais, que podem ser duas palavras opcionais quaisquer, dentre as quatro escolhidas pelo usuário. Só após isso ela retorna a página como resultado para o usuário, caso esta seja validada. Ao final do processo, nossa ferramenta cria um arquivo chamado index.html com todas as páginas encontradas. Esse arquivo pode ser facilmente aberto pelo usuário no seu browser. Todas as páginas que foram geradas como resultado estão guardadas na pasta HTML e o usuário pode consultar essas páginas sem figuras, só texto, ou se quiser visualizar a página como um todo basta usar o endereço da mesma que está no index.html e acessar a página. Este armazenamento das páginas ocorre durante o processo de filtragem e portanto é possível verificar as páginas retornadas individualmente, antes do final do processo. O usuário também pode alterar as palavras obrigatórias e opcionais, assim como a quantidade mínima de palavras opcionais que devem estar presentes no documento e qual ferramenta de busca que deve servir como base, bastando para isso abrir o arquivo por ele anteriormente gravado, usando a opção “Editar” no submenu de “Lista de Assunto” na tela principal. FIGURA P3 Para utilizar a criação automática de assunto, selecione “Criação Automática” no submenu de “Lista de Assunto”. Entre com uma ou mais palavras que definam o assunto que se quer criar e então pressione o botão “criar assunto”. Isso dá início ao processo, que em geral demora alguns minutos e quando termina exibe o resultado na forma de uma lista de palavras que provavelmente têm relação com aquelas escolhidas pelo usuário. Palavras que por acaso tenham não estejam de acordo com o contexto desejado podem ser retiradas usando-se o botão “remover palavra”. Palavras que não especificam nenhum contexto em especial podem ser adicionadas ao dicionário de palavras comuns pressionando-se o botão “incluir no dicionário de palavras comuns”. O dicionário de palavras comuns já conta com uma série de palavras da língua inglesa (artigos, pronomes etc.). Com a lista de palavras refinada, pressione o botão “salvar” para gravar o assunto criado. Para utilizar o assunto criado automaticamente, selecione “Editar” no submenu de “Lista de Assunto” na tela principal, e escolha o arquivo no qual foi gravado. FIGURA P4 Utilizamos como base o AltaVista e o Google pois são ferramentas muito usadas para busca na Internet, o AltaVista por usuários comuns e o Google pelo meio científico. Também utilizamos essas ferramentas como base pois não tínhamos acesso aos seus respectivos banco de dados. Além de não termos condições, não era nosso objetivo criar um banco de dados, mas sim criar uma ferramenta de metabusca que tornasse a busca na Internet mais eficiente. Módulo de e-mails Selecione “E-mails” no menu principal, sub-item “Iniciar”. Em nosso programa de gerenciamento de e-mails, o usuário pode criar pastas (com o botão “Nova pasta”) e relacionar a elas palavras que servirão para que o programa direcione os e-mails para essas respectivas pastas. Pode também criar subpastas (com o botão “Nova subpasta”) e associar a elas uma ou mais palavras relacionadas à pasta a qual esta pertence. Obviamente o usuário também pode apagar a qualquer momento uma pasta ou subpasta que não mais lhe interessar, através do botão “Remover pasta”. Vamos ver agora como se dá o funcionamento do nosso programa: o usuário, já conectado a Internet, clica no botão “Receber e-mails”. Então, a partir desse momento, o programa começa a “baixar” os seus e-mails e conforme os vai “baixando” procura no e-mail as palavras relacionadas com cada pasta. Quando encontra alguma dessas palavras, direciona o e-mail para a pasta adequada. Se por um acaso não encontrar nenhuma dessas palavras ele então direciona os e-mails para a pasta “Inbox”. FIGURA P5 A grande vantagem do nosso programa de e-mail é que ele faz a busca em todos os campos do e-mail, inclusive no corpo do mesmo. É possível, por exemplo, definir como palavra relacionada o endereço eletrônico de alguém, que pode ser útil para agrupar todas as mensagens enviadas por essa pessoa. O usuário pode também criar uma pasta lixo e colocar como palavras relacionadas palavras que são comuns em diversos e-mails indesejáveis que ele recebe e perde tempo lendo-os para ter certeza disso. Depois ele só precisa apagar os e-mails presentes na pasta lixo e pronto: não precisará mais perder tempo lendo ou até mesmo procurando esses e-mails. Ou então melhor ainda, pode criar uma pasta urgente, por exemplo, e relacionar a esta diversas palavras que sejam comuns aos e-mails que ele precisa ler com mais urgência e não mais precisará perder o seu precioso tempo procurando quais e-mails precisa responder com mais urgência, pois agora basta ir na pasta urgente e ler os e-mails que lá estiverem relacionados. 5. Resultados obtidos (INCLUIR) 6. Conclusão e trabalhos futuros Embora esse projeto final possa parecer a princípio muito simples, internamente sua implementação foi trabalhosa e demorada. A fim de fazer um programa portável tivemos que aprender uma nova linguagem de programação, no caso, JAVA. Como o JAVA é uma linguagem relativamente recente, a quantidade e qualidade de componentes disponíveis é muito pequena, o que torna a programação mais trabalhosa, principalmente no que se refere a interface com o usuário. Como o programa é portável, fomos obrigados a optar por APIs que pudessem ser interpretadas por diferentes plataformas. No futuro pretendemos aumentar o número de ferramentas de busca utilizadas, adicionar mais funcionalidades ao módulo de e-mail e especializar mais ainda o criador automático de assunto, refinando ainda mais o nosso projeto. Acreditamos que seria um bom tema para um outro projeto final dar continuidade a nossa ferramenta. Uma vez que a camada principal básica já foi implementada, aquele que fosse continuar nosso trabalho poderia lançar mão do reuso das classes já implementada por nós, podendo focalizar seus esforços em novos objetivos e idéias. 7. Referências bibliográficas LINDEN, P. van der, 1997, Just Java, tradução Betina de Oliveira, revisão técnica Alvaro Antunes, São Paulo, Makron Books. INSTITUTO BRASILEIRO DE PESQUISA EM INFORMÁTICA, 1993, Dominando a Linguagem C, Rio de Janeiro, IBPI Press. MLADENIC, D., 1999, Text-learning and related intelligent agents , Ljubljana, Slovenia, revised version in IEEE Expert special issue on Applications of Intelligent Information Retrieval. MILLER, A.R., 1988, “O Conjunto de Caracteres ASCII”. In: Assembly IBM PC: Técnicas de Programação, São Paulo, EBRAS Ltda., pp. 259-261. ALLSOP, J., 1987, Cassell's Students' English Grammar, Liverpool, Cassell Publishers Limited. GAMMA, E., 2000, Design Patterns, .... ECKEL, B. , 2000, Thinking in Java (html version), .... JAVA 2 SDK, Standard Edition Documentation, Version 1.3 JAVA.SUN website. JAVA SUN Tutorial. A practical guide for programmers. Science, Volume 280, Number 5360, pp. 98-100, 1998. Copyright © AAAS Searching the World Wide Web Steve Lawrence and C. Lee Giles NEC Research Institute Os papers livro OrgDados2 (Boyer-Moore) livro SO (threads) livro IA (planning) (NECESSITA COMPLEMENTAÇÃO E ORGANIZAÇÃO 8. Apêndice Listagem do Código Fonte (INCLUIR)